-
0app/assets/documents/Doxyfile
-
0app/assets/documents/Makefile
-
0app/assets/documents/fdl.texi
-
0app/assets/documents/movim.png
-
0app/assets/documents/movim.texi
-
0app/assets/documents/texi.css
-
0app/assets/documents/texi2htmlrc
-
0app/assets/js/events.js
-
0app/assets/js/hash.js
-
0app/assets/js/images/marker-icon.png
-
0app/assets/js/leaflet.css
-
0app/assets/js/leaflet.js
-
0app/assets/js/movim.js
-
0app/assets/js/movimrpc.js
-
18build.sh
-
145image.php
-
2jajax.php
-
0lib/Markdown.php
-
0lib/XMPPtoForm.php
-
57loader.php
-
0locales/ar.po
-
0locales/be.po
-
0locales/br.po
-
0locales/da.po
-
0locales/de.po
-
0locales/el.po
-
0locales/eo.po
-
0locales/es.po
-
0locales/fi.po
-
0locales/fr.po
-
0locales/gl.po
-
0locales/he.po
-
0locales/it.po
-
0locales/ja.po
-
0locales/messages.pot
-
0locales/nl.po
-
0locales/no.po
-
0locales/oc.po
-
0locales/pt.po
-
0locales/ro.po
-
0locales/ru.po
-
0locales/uk.po
-
0locales/update_po.sh
-
0locales/update_trans.sh
-
0locales/zh.po
-
71system/Controller/ControllerAjax.php
-
147system/Controller/ControllerBase.php
-
392system/Controller/ControllerMain.php
-
165system/LGPLv3
-
1system/RPC.php
-
1system/Route.php
-
2system/Tpl/TplPageBuilder.php
-
70system/Utils.php
-
227system/Widget/WidgetBase.php
-
585system/Widget/WidgetCommon.php
-
228system/Widget/WidgetWrapper.php
-
4system/Widget/widgets/.dir-locals.el
-
123system/Widget/widgets/About/About.php
-
466system/Widget/widgets/Account/Account.php
-
10system/Widget/widgets/Account/account.css
-
3system/Widget/widgets/Account/account.js
-
246system/Widget/widgets/Account/server-vcards.xml
-
484system/Widget/widgets/Admin/Admin.php
-
29system/Widget/widgets/Blog/Blog.php
-
280system/Widget/widgets/Bookmark/Bookmark.php
-
7system/Widget/widgets/Bookmark/bookmark.css
-
438system/Widget/widgets/Chat/Chat.php
-
192system/Widget/widgets/Chat/chat.css
-
102system/Widget/widgets/Chat/chat.js
-
BINsystem/Widget/widgets/Chat/img/arrow.png
-
BINsystem/Widget/widgets/Chat/img/cross.png
-
BINsystem/Widget/widgets/Chat/sound/notif.ogg
-
150system/Widget/widgets/ChatExt/ChatExt.php
-
0system/Widget/widgets/ChatExt/chatext.css
-
31system/Widget/widgets/ChatExt/chatext.js
-
45system/Widget/widgets/ChatPop/ChatPop.php
-
161system/Widget/widgets/ChatPop/chatpop.css
-
46system/Widget/widgets/ChatPop/chatpop.js
-
BINsystem/Widget/widgets/ChatPop/img/cross.png
-
196system/Widget/widgets/Config/Config.php
-
BINsystem/Widget/widgets/Config/color/arrow.gif
-
BINsystem/Widget/widgets/Config/color/cross.gif
-
12system/Widget/widgets/Config/color/demo.html
-
BINsystem/Widget/widgets/Config/color/hs.png
-
BINsystem/Widget/widgets/Config/color/hv.png
-
953system/Widget/widgets/Config/color/jscolor.js
-
0system/Widget/widgets/Config/config.css
-
104system/Widget/widgets/ConfigData/ConfigData.php
-
0system/Widget/widgets/ConfigData/configdata.css
-
143system/Widget/widgets/ContactCard/ContactCard.php
-
8system/Widget/widgets/ContactCard/contactcard.css
-
212system/Widget/widgets/ContactInfo/ContactInfo.php
-
83system/Widget/widgets/ContactManage/ContactManage.php
-
75system/Widget/widgets/ContactPubsubSubscription/ContactPubsubSubscription.php
-
121system/Widget/widgets/ContactSummary/ContactSummary.php
-
1system/Widget/widgets/ContactSummary/contactsummary.css
-
160system/Widget/widgets/Explore/Explore.php
-
4system/Widget/widgets/Explore/explore.css
-
213system/Widget/widgets/Feed/Feed.php
-
1system/Widget/widgets/Feed/feed.css
Before Width: 650 | Height: 650 | Size: 51 KiB After Width: 650 | Height: 650 | Size: 51 KiB |
Before Width: 25 | Height: 41 | Size: 1.7 KiB After Width: 25 | Height: 41 | Size: 1.7 KiB |
@ -1,145 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @file images.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief The movim's images handler. |
|||
* |
|||
* @author Edhelas <edhelas@gmail.com> |
|||
* |
|||
* @version 1.0 |
|||
* @date 22 November 2011 |
|||
* |
|||
* Copyright (C)2010 MOVIM team |
|||
* |
|||
* See the file `COPYING' for licensing information. |
|||
*/ |
|||
/* |
|||
ini_set('log_errors', 1); |
|||
ini_set('display_errors', 0); |
|||
ini_set('error_reporting', E_ALL ^ E_DEPRECATED ^ E_NOTICE); |
|||
ini_set('error_log', 'log/php.log'); |
|||
|
|||
require("init.php"); |
|||
|
|||
global $sdb; |
|||
|
|||
function display_image($hash, $type) { |
|||
ob_clean(); |
|||
ob_start(); |
|||
header("ETag: \"{$hash}\""); |
|||
header("Accept-Ranges: bytes"); |
|||
header("Content-type: ".$type); |
|||
//header("Cache-Control: max-age=".rand(1, 5)*3600);
|
|||
header('Date: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT'); |
|||
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+24*60*60) . ' GMT'); |
|||
} |
|||
|
|||
function display_default() { |
|||
ob_clean(); |
|||
ob_start(); |
|||
$content = file_get_contents('themes/movim/img/default.svg'); |
|||
|
|||
display_image($hash, "image/svg+xml"); |
|||
echo $content; |
|||
exit; |
|||
} |
|||
|
|||
if (!function_exists('getallheaders')) { |
|||
function getallheaders() { |
|||
foreach($_SERVER as $key=>$value) { |
|||
if (substr($key,0,5)=="HTTP_") { |
|||
$key=str_replace(" ","-",ucwords(strtolower(str_replace("_"," ",substr($key,5))))); |
|||
$out[$key]=$value; |
|||
}else{ |
|||
$out[$key]=$value; |
|||
} |
|||
} |
|||
return $out; |
|||
} |
|||
} |
|||
|
|||
// We load the avatar from the database and we display it
|
|||
$hash = md5($_GET['c'].$_GET['size']); |
|||
$headers = getallheaders(); |
|||
|
|||
ob_clean(); |
|||
ob_start(); |
|||
if (ereg($hash, $headers['If-None-Match'])) |
|||
{ |
|||
header('HTTP/1.1 304 Not Modified'); |
|||
exit; |
|||
} elseif($_GET['c'] == '' || $_GET['c'] == 'default') { |
|||
display_default(); |
|||
} else { |
|||
$user = new User(); |
|||
if($user->isLogged()) |
|||
$where = array('jid' => $_GET['c']); |
|||
else |
|||
$where = array('jid' => $_GET['c']); |
|||
|
|||
$c = new Contact(); |
|||
|
|||
$query = Contact::query()->select() |
|||
->where($where); |
|||
$contact = Contact::run_query($query); |
|||
|
|||
if(isset($contact[0]) && |
|||
$contact[0]->getData('phototype') != '' && |
|||
$contact[0]->getData('photobin') != '' && |
|||
$contact[0]->getData('phototype') != 'f' && |
|||
$contact[0]->getData('photobin') != 'f') { |
|||
if(isset($_GET['size']) && $_GET['size'] != 'normal') { |
|||
switch ($_GET['size']) { |
|||
case 'l': |
|||
$size = 150; |
|||
break; |
|||
case 'm': |
|||
$size = 120; |
|||
break; |
|||
case 's': |
|||
$size = 50; |
|||
break; |
|||
case 'xs': |
|||
$size = 24; |
|||
break; |
|||
} |
|||
|
|||
$thumb = imagecreatetruecolor($size, $size); |
|||
$white = imagecolorallocate($thumb, 255, 255, 255); |
|||
imagefill($thumb, 0, 0, $white); |
|||
|
|||
$source = imagecreatefromstring(base64_decode($contact[0]->getData('photobin'))); |
|||
|
|||
$width = imagesx($source); |
|||
$height = imagesy($source); |
|||
|
|||
if($width >= $height) { |
|||
// For landscape images
|
|||
$x_offset = ($width - $height) / 2; |
|||
$y_offset = 0; |
|||
$square_size = $width - ($x_offset * 2); |
|||
} else { |
|||
// For portrait and square images
|
|||
$x_offset = 0; |
|||
$y_offset = ($height - $width) / 2; |
|||
$square_size = $height - ($y_offset * 2); |
|||
} |
|||
|
|||
if($source) { |
|||
imagecopyresampled($thumb, $source, 0, 0, $x_offset, $y_offset, $size, $size, $square_size, $square_size); |
|||
|
|||
display_image($hash, "image/jpeg"); |
|||
imagejpeg($thumb, NULL, 95); |
|||
} |
|||
|
|||
} elseif(isset($_GET['size']) && $_GET['size'] == 'normal') { // The original picture
|
|||
display_image($hash, $contact[0]->getData('phototype')); |
|||
echo base64_decode($contact[0]->getData('photobin')); |
|||
} |
|||
} else { |
|||
display_default(); |
|||
} |
|||
} |
|||
*/ |
@ -1,71 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @file ControllerAjax.php |
|||
* This file is part of PROJECT. |
|||
* |
|||
* @brief Description |
|||
* |
|||
* @author Guillaume Pasquet <email@addre.ss> |
|||
* |
|||
* @version 1.0 |
|||
* @date 8 November 2010 |
|||
* |
|||
* Copyright (C)2010 PROPRIETOR |
|||
* |
|||
* OTHER T&C IF ANY |
|||
*/ |
|||
|
|||
class ControllerAjax extends ControllerBase |
|||
{ |
|||
protected $funclist = array(); |
|||
protected static $instance; |
|||
|
|||
public function __construct() |
|||
{ |
|||
parent::__construct(); |
|||
} |
|||
|
|||
public static function getInstance() |
|||
{ |
|||
if(!is_object(self::$instance)) { |
|||
self::$instance = new ControllerAjax(); |
|||
} |
|||
return self::$instance; |
|||
} |
|||
|
|||
/** |
|||
* Generates the javascript part of the ajax. |
|||
*/ |
|||
public function genJs() |
|||
{ |
|||
if(empty($this->funclist)) { |
|||
return ''; |
|||
} |
|||
|
|||
$buffer = '<script type="text/javascript">'; |
|||
foreach($this->funclist as $funcdef) { |
|||
$parlist = implode(', ', $funcdef['params']); |
|||
|
|||
$buffer .= "function " . $funcdef['object'] . '_' |
|||
. $funcdef['funcname'] . "(${parlist}) {"; |
|||
$buffer .= "movim_ajaxSend('".$funcdef['object']."', '".$funcdef['funcname']."', [${parlist}]);}\n"; |
|||
|
|||
} |
|||
return $buffer . "</script>\n"; |
|||
} |
|||
|
|||
/** |
|||
* Defines a new function. |
|||
*/ |
|||
public function defun($widget, $funcname, array $params) |
|||
{ |
|||
$this->funclist[] = array( |
|||
'object' => $widget, |
|||
'funcname' => $funcname, |
|||
'params' => $params, |
|||
); |
|||
} |
|||
} |
|||
|
|||
?>
|
@ -1,147 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @file Controller.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief Implements a request handler that ensures application worklfow. |
|||
* |
|||
* @author Movim Project <movim@movim.eu> |
|||
* |
|||
* @version 1.0 |
|||
* @date 13 October 2010 |
|||
* |
|||
* Copyright (C)2010 Movim Project |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU Affero General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU Affero General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Affero General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
* |
|||
*/ |
|||
|
|||
class ControllerBase |
|||
{ |
|||
protected $default_handler = 'index'; |
|||
protected $token; |
|||
|
|||
public function __construct($token = 'q') |
|||
{ |
|||
$this->load_language(); |
|||
$this->token = $token; |
|||
} |
|||
|
|||
public function handle() |
|||
{ |
|||
|
|||
$r = new Route(); |
|||
// Note that the request is always specified by 'q'.
|
|||
$request; |
|||
if($request = $this->fetch_get('q')) { |
|||
$this->run_req($request); |
|||
} else { |
|||
$this->run_req($this->default_handler); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Loads up the language, either from the User or default. |
|||
*/ |
|||
function load_language() { |
|||
$user = new user(); |
|||
if($user->isLogged()) { |
|||
try{ |
|||
$lang = $user->getConfig('language'); |
|||
load_language($lang); |
|||
} |
|||
catch(MovimException $e) { |
|||
// Load default language.
|
|||
load_language(Conf::getServerConfElement('defLang')); |
|||
} |
|||
} |
|||
else if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { |
|||
load_language_auto(); |
|||
} |
|||
else { |
|||
load_language(Conf::getServerConfElement('defLang')); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Attempts to call back the given function. |
|||
*/ |
|||
protected function run_req($request) |
|||
{ |
|||
if(is_callable(array($this, $request))) { |
|||
call_user_func(array($this, $request)); |
|||
} else { |
|||
$this->error404(); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Returns the value of a $_GET variable. Mainly used to avoid getting |
|||
* notices from PHP when attempting to fetch an empty variable. |
|||
* @param name is the desired variable's name. |
|||
* @return the value of the requested variable, or FALSE. |
|||
*/ |
|||
protected function fetch_get($name) |
|||
{ |
|||
if(isset($_GET[$name])) { |
|||
return htmlentities($_GET[$name]); |
|||
} else { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Returns the value of a $_POST variable. Mainly used to avoid getting |
|||
* notices from PHP when attempting to fetch an empty variable. |
|||
* @param name is the desired variable's name. |
|||
* @return the value of the requested variable, or FALSE. |
|||
*/ |
|||
protected function fetch_post($name) |
|||
{ |
|||
if(isset($_POST[$name])) { |
|||
return htmlentities($_POST[$name]); |
|||
} else { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Return a basic auth page for the administration area |
|||
*/ |
|||
protected function authenticate(){ |
|||
header('WWW-Authenticate: Basic realm="Enter admin username/password"'); |
|||
header('HTTP/1.0 401 Unauthorized'); |
|||
echo 'Why are you hitting cancel?'; |
|||
exit; |
|||
} |
|||
|
|||
/** |
|||
* Makes an error 404 page. |
|||
*/ |
|||
protected function error404() |
|||
{ |
|||
//echo 'Error 404 - Page not found';
|
|||
$page = new TplPageBuilder(); |
|||
|
|||
$page->setTitle(t('%s - 404', APP_TITLE)); |
|||
$page->menuAddLink(t('Home'), 'main', true); |
|||
|
|||
$content = new TplPageBuilder(); |
|||
$page->setContent($content->build('404.tpl')); |
|||
echo $page->build('page.tpl'); |
|||
} |
|||
} |
|||
|
|||
?>
|
@ -1,392 +0,0 @@ |
|||
<?php |
|||
/** |
|||
* @file ControllerMain.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief Handles incoming static pages requests. |
|||
* |
|||
* @author Etenil <etenil@etenilsrealm.nl> |
|||
* |
|||
* @version 1.0 |
|||
* @date 21 October 2010 |
|||
* |
|||
* Copyright (C)2010 MOVIM Project |
|||
* |
|||
* See COPYING for licensing deatils. |
|||
*/ |
|||
|
|||
class ControllerMain extends ControllerBase |
|||
{ |
|||
protected $default_handler = 'main'; |
|||
private $page; |
|||
|
|||
function __construct() |
|||
{ |
|||
parent::__construct(); |
|||
|
|||
$this->page = new TplPageBuilder(); |
|||
$this->page->addScript('movim.js'); |
|||
$this->page->addScript('hash.js'); |
|||
$this->page->addScript('movimrpc.js'); |
|||
} |
|||
|
|||
function main() |
|||
{ |
|||
$user = new User(); |
|||
|
|||
if(!$user->isLogged()) { |
|||
$this->login(); |
|||
} else { |
|||
$this->page->setTitle(t('%s - Welcome to Movim', APP_TITLE)); |
|||
$this->page->menuAddLink(t('Home'), 'main', true); |
|||
$this->page->menuAddLink(t('Explore'), 'explore'); |
|||
$this->page->menuAddLink(t('Profile'), 'profile'); |
|||
$this->page->menuAddLink(t('Media'), 'media'); |
|||
$this->page->menuAddLink(t('Configuration'), 'conf'); |
|||
$this->page->menuAddLink(t('Help'), 'help'); |
|||
$this->page->menuAddLink(t('Logout'), 'disconnect'); |
|||
|
|||
$content = new TplPageBuilder($user); |
|||
|
|||
$this->page->setContent($content->build('main.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
} |
|||
|
|||
function friend() |
|||
{ |
|||
$user = new User(); |
|||
|
|||
$cd = new \modl\ContactDAO(); |
|||
$contact = $cd->get($_GET['f']); |
|||
|
|||
if(isset($contact)) |
|||
$name = $contact->getTrueName(); |
|||
else |
|||
$name = $_GET['f']; |
|||
|
|||
if(!$user->isLogged()) { |
|||
$this->login(); |
|||
} else { |
|||
if(isset($_GET['f']) && $_GET['f'] != "" ) { |
|||
$this->page->setTitle(APP_TITLE.' - '.$name); |
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('Explore'), 'explore'); |
|||
$this->page->menuAddLink(t('Profile'), 'profile'); |
|||
$this->page->menuAddLink(t('Media'), 'media'); |
|||
$this->page->menuAddLink(t('Configuration'), 'conf'); |
|||
$this->page->menuAddLink(t('Help'), 'help'); |
|||
$this->page->menuAddLink(t('Logout'), 'disconnect'); |
|||
|
|||
$content = new TplPageBuilder($user); |
|||
|
|||
$this->page->setContent($content->build('friend.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
else |
|||
$this->main(); |
|||
} |
|||
} |
|||
|
|||
function server() |
|||
{ |
|||
$user = new User(); |
|||
|
|||
if(!$user->isLogged()) { |
|||
$this->login(); |
|||
} else { |
|||
if(isset($_GET['s']) && $_GET['s'] != "" ) { |
|||
$this->page->setTitle(APP_TITLE.' - Server'); |
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('Explore'), 'explore'); |
|||
$this->page->menuAddLink(t('Profile'), 'profile'); |
|||
$this->page->menuAddLink(t('Media'), 'media'); |
|||
$this->page->menuAddLink(t('Configuration'), 'conf'); |
|||
$this->page->menuAddLink(t('Help'), 'help'); |
|||
$this->page->menuAddLink(t('Logout'), 'disconnect'); |
|||
|
|||
$content = new TplPageBuilder($user); |
|||
|
|||
$this->page->setContent($content->build('server.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
else |
|||
$this->main(); |
|||
} |
|||
} |
|||
|
|||
function node() |
|||
{ |
|||
$user = new User(); |
|||
|
|||
if(!$user->isLogged()) { |
|||
$this->login(); |
|||
} else { |
|||
if(isset($_GET['n']) && $_GET['n'] != "" ) { |
|||
$this->page->setTitle(APP_TITLE.' - Node'); |
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('Explore'), 'explore'); |
|||
$this->page->menuAddLink(t('Profile'), 'profile'); |
|||
$this->page->menuAddLink(t('Media'), 'media'); |
|||
$this->page->menuAddLink(t('Configuration'), 'conf'); |
|||
$this->page->menuAddLink(t('Help'), 'help'); |
|||
$this->page->menuAddLink(t('Logout'), 'disconnect'); |
|||
|
|||
$content = new TplPageBuilder($user); |
|||
|
|||
$this->page->setContent($content->build('node.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
else |
|||
$this->main(); |
|||
} |
|||
} |
|||
|
|||
function media() |
|||
{ |
|||
$user = new User(); |
|||
|
|||
if(!$user->isLogged()) { |
|||
$this->login(); |
|||
} else { |
|||
$this->page->setTitle(APP_TITLE.' - Node'); |
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('Explore'), 'explore'); |
|||
$this->page->menuAddLink(t('Profile'), 'profile'); |
|||
$this->page->menuAddLink(t('Media'), 'media', true); |
|||
$this->page->menuAddLink(t('Configuration'), 'conf'); |
|||
$this->page->menuAddLink(t('Help'), 'help'); |
|||
$this->page->menuAddLink(t('Logout'), 'disconnect'); |
|||
|
|||
$content = new TplPageBuilder($user); |
|||
|
|||
$this->page->setContent($content->build('media.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
} |
|||
|
|||
function conf() |
|||
{ |
|||
$user = new User(); |
|||
|
|||
if(!$user->isLogged()) { |
|||
$this->login(); |
|||
} else { |
|||
$this->page->setTitle(t('%s - Configuration', APP_TITLE)); |
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('Explore'), 'explore'); |
|||
$this->page->menuAddLink(t('Profile'), 'profile'); |
|||
$this->page->menuAddLink(t('Media'), 'media'); |
|||
$this->page->menuAddLink(t('Configuration'), 'conf', true); |
|||
$this->page->menuAddLink(t('Help'), 'help'); |
|||
$this->page->menuAddLink(t('Logout'), 'disconnect'); |
|||
|
|||
$content = new TplPageBuilder($user); |
|||
|
|||
$this->page->setContent($content->build('conf.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
} |
|||
|
|||
function profile() |
|||
{ |
|||
$user = new User(); |
|||
|
|||
if(!$user->isLogged()) { |
|||
$this->login(); |
|||
} else { |
|||
$this->page->setTitle(t('%s - Profile', APP_TITLE)); |
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('Explore'), 'explore'); |
|||
$this->page->menuAddLink(t('Profile'), 'profile', true); |
|||
$this->page->menuAddLink(t('Media'), 'media'); |
|||
$this->page->menuAddLink(t('Configuration'), 'conf'); |
|||
$this->page->menuAddLink(t('Help'), 'help'); |
|||
$this->page->menuAddLink(t('Logout'), 'disconnect'); |
|||
|
|||
$content = new TplPageBuilder($user); |
|||
|
|||
$this->page->setContent($content->build('profile.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
} |
|||
|
|||
function account() |
|||
{ |
|||
$this->page->setTitle(t('%s - Account', APP_TITLE)); |
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('Account Creation'), 'account', true); |
|||
$content = new TplPageBuilder(); |
|||
|
|||
$this->page->setContent($content->build('account.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
|
|||
function blog() |
|||
{ |
|||
$this->page->setTitle(t('%s - Account', APP_TITLE)); |
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('Blog'), 'blog', true); |
|||
$content = new TplPageBuilder(); |
|||
|
|||
$this->page->setContent($content->build('blog.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
|
|||
function about() |
|||
{ |
|||
$this->page->setTitle(t('%s - About', APP_TITLE)); |
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('About'), 'about', true); |
|||
$content = new TplPageBuilder(); |
|||
|
|||
$this->page->setContent($content->build('about.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
|
|||
function chatpop() |
|||
{ |
|||
$user = new User(); |
|||
|
|||
if(!$user->isLogged()) { |
|||
$this->login(); |
|||
} else { |
|||
echo $this->page->build('chatpop.tpl'); |
|||
} |
|||
} |
|||
|
|||
function post() |
|||
{ |
|||
$user = new User(); |
|||
|
|||
if(!$user->isLogged()) { |
|||
$this->login(); |
|||
} else { |
|||
$this->page->setTitle(t('%s - Post View', APP_TITLE)); |
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('Explore'), 'explore'); |
|||
$this->page->menuAddLink(t('Profile'), 'profile'); |
|||
$this->page->menuAddLink(t('Configuration'), 'conf'); |
|||
$this->page->menuAddLink(t('Help'), 'help'); |
|||
$this->page->menuAddLink(t('Logout'), 'disconnect'); |
|||
|
|||
$content = new TplPageBuilder($user); |
|||
|
|||
$this->page->setContent($content->build('post.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Show login interface |
|||
*/ |
|||
function login() |
|||
{ |
|||
$this->page->setTitle(t('%s - Login to Movim', APP_TITLE)); |
|||
$this->page->menuAddLink(t('Home'), 'main', true); |
|||
$this->page->menuAddLink(t('About'), 'about'); |
|||
|
|||
$content = new TplPageBuilder($user); |
|||
$this->page->setContent($content->build('login.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
|
|||
/** |
|||
* Create the Atom feed of a user |
|||
*/ |
|||
function feed() |
|||
{ |
|||
$content = new TplPageBuilder(); |
|||
echo $content->build('feed.tpl'); |
|||
} |
|||
|
|||
/** |
|||
* Explore the XMPP network |
|||
*/ |
|||
function explore() |
|||
{ |
|||
$user = new User(); |
|||
|
|||
$this->page->setTitle(t('%s - Explore', APP_TITLE)); |
|||
|
|||
if(!$user->isLogged()) { |
|||
$this->login(); |
|||
} else { |
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('Explore'), 'explore', true); |
|||
$this->page->menuAddLink(t('Profile'), 'profile'); |
|||
$this->page->menuAddLink(t('Media'), 'media'); |
|||
$this->page->menuAddLink(t('Configuration'), 'conf'); |
|||
$this->page->menuAddLink(t('Help'), 'help'); |
|||
$this->page->menuAddLink(t('Logout'), 'disconnect'); |
|||
} |
|||
|
|||
$content = new TplPageBuilder($user); |
|||
$this->page->setContent($content->build('explore.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} |
|||
|
|||
|
|||
/* |
|||
* Show help page |
|||
*/ |
|||
function help() |
|||
{ |
|||
$user = new User(); |
|||
|
|||
|
|||
$this->page->setTitle(t('%s - Help Page', APP_TITLE)); |
|||
|
|||
if(!$user->isLogged()) { |
|||
$this->login(); |
|||
} else { |
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('Explore'), 'explore'); |
|||
$this->page->menuAddLink(t('Profile'), 'profile'); |
|||
$this->page->menuAddLink(t('Media'), 'media'); |
|||
$this->page->menuAddLink(t('Configuration'), 'conf'); |
|||
$this->page->menuAddLink(t('Help'), 'help', true); |
|||
$this->page->menuAddLink(t('Logout'), 'disconnect'); |
|||
} |
|||
|
|||
$content = new TplPageBuilder($user); |
|||
$this->page->setContent($content->build('help.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
|
|||
} |
|||
|
|||
/* |
|||
* Show admin page |
|||
*/ |
|||
function admin() |
|||
{ |
|||
error_reporting(0); |
|||
|
|||
if(!isset($_SERVER['PHP_AUTH_USER'])) { |
|||
$this->authenticate(); |
|||
} else { |
|||
$conf = Conf::getServerConf(); |
|||
|
|||
if($_SERVER['PHP_AUTH_USER'] == (string)$conf['user'] && sha1($_SERVER['PHP_AUTH_PW']) == (string)$conf['pass']){ |
|||
$this->page->setTitle(t('%s - Administration Panel', APP_TITLE)); |
|||
|
|||
$this->page->menuAddLink(t('Home'), 'main'); |
|||
$this->page->menuAddLink(t('Administration'), 'admin', true); |
|||
|
|||
$content = new TplPageBuilder(); |
|||
$this->page->setContent($content->build('admin.tpl')); |
|||
echo $this->page->build('page.tpl'); |
|||
} else { |
|||
$this->authenticate(); |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
function disconnect() |
|||
{ |
|||
$user = new User(); |
|||
$user->desauth(); |
|||
$this->login(); |
|||
} |
|||
} |
@ -1,165 +0,0 @@ |
|||
GNU LESSER GENERAL PUBLIC LICENSE |
|||
Version 3, 29 June 2007 |
|||
|
|||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> |
|||
Everyone is permitted to copy and distribute verbatim copies |
|||
of this license document, but changing it is not allowed. |
|||
|
|||
|
|||
This version of the GNU Lesser General Public License incorporates |
|||
the terms and conditions of version 3 of the GNU General Public |
|||
License, supplemented by the additional permissions listed below. |
|||
|
|||
0. Additional Definitions. |
|||
|
|||
As used herein, "this License" refers to version 3 of the GNU Lesser |
|||
General Public License, and the "GNU GPL" refers to version 3 of the GNU |
|||
General Public License. |
|||
|
|||
"The Library" refers to a covered work governed by this License, |
|||
other than an Application or a Combined Work as defined below. |
|||
|
|||
An "Application" is any work that makes use of an interface provided |
|||
by the Library, but which is not otherwise based on the Library. |
|||
Defining a subclass of a class defined by the Library is deemed a mode |
|||
of using an interface provided by the Library. |
|||
|
|||
A "Combined Work" is a work produced by combining or linking an |
|||
Application with the Library. The particular version of the Library |
|||
with which the Combined Work was made is also called the "Linked |
|||
Version". |
|||
|
|||
The "Minimal Corresponding Source" for a Combined Work means the |
|||
Corresponding Source for the Combined Work, excluding any source code |
|||
for portions of the Combined Work that, considered in isolation, are |
|||
based on the Application, and not on the Linked Version. |
|||
|
|||
The "Corresponding Application Code" for a Combined Work means the |
|||
object code and/or source code for the Application, including any data |
|||
and utility programs needed for reproducing the Combined Work from the |
|||
Application, but excluding the System Libraries of the Combined Work. |
|||
|
|||
1. Exception to Section 3 of the GNU GPL. |
|||
|
|||
You may convey a covered work under sections 3 and 4 of this License |
|||
without being bound by section 3 of the GNU GPL. |
|||
|
|||
2. Conveying Modified Versions. |
|||
|
|||
If you modify a copy of the Library, and, in your modifications, a |
|||
facility refers to a function or data to be supplied by an Application |
|||
that uses the facility (other than as an argument passed when the |
|||
facility is invoked), then you may convey a copy of the modified |
|||
version: |
|||
|
|||
a) under this License, provided that you make a good faith effort to |
|||
ensure that, in the event an Application does not supply the |
|||
function or data, the facility still operates, and performs |
|||
whatever part of its purpose remains meaningful, or |
|||
|
|||
b) under the GNU GPL, with none of the additional permissions of |
|||
this License applicable to that copy. |
|||
|
|||
3. Object Code Incorporating Material from Library Header Files. |
|||
|
|||
The object code form of an Application may incorporate material from |
|||
a header file that is part of the Library. You may convey such object |
|||
code under terms of your choice, provided that, if the incorporated |
|||
material is not limited to numerical parameters, data structure |
|||
layouts and accessors, or small macros, inline functions and templates |
|||
(ten or fewer lines in length), you do both of the following: |
|||
|
|||
a) Give prominent notice with each copy of the object code that the |
|||
Library is used in it and that the Library and its use are |
|||
covered by this License. |
|||
|
|||
b) Accompany the object code with a copy of the GNU GPL and this license |
|||
document. |
|||
|
|||
4. Combined Works. |
|||
|
|||
You may convey a Combined Work under terms of your choice that, |
|||
taken together, effectively do not restrict modification of the |
|||
portions of the Library contained in the Combined Work and reverse |
|||
engineering for debugging such modifications, if you also do each of |
|||
the following: |
|||
|
|||
a) Give prominent notice with each copy of the Combined Work that |
|||
the Library is used in it and that the Library and its use are |
|||
covered by this License. |
|||
|
|||
b) Accompany the Combined Work with a copy of the GNU GPL and this license |
|||
document. |
|||
|
|||
c) For a Combined Work that displays copyright notices during |
|||
execution, include the copyright notice for the Library among |
|||
these notices, as well as a reference directing the user to the |
|||
copies of the GNU GPL and this license document. |
|||
|
|||
d) Do one of the following: |
|||
|
|||
0) Convey the Minimal Corresponding Source under the terms of this |
|||
License, and the Corresponding Application Code in a form |
|||
suitable for, and under terms that permit, the user to |
|||
recombine or relink the Application with a modified version of |
|||
the Linked Version to produce a modified Combined Work, in the |
|||
manner specified by section 6 of the GNU GPL for conveying |
|||
Corresponding Source. |
|||
|
|||
1) Use a suitable shared library mechanism for linking with the |
|||
Library. A suitable mechanism is one that (a) uses at run time |
|||
a copy of the Library already present on the user's computer |
|||
system, and (b) will operate properly with a modified version |
|||
of the Library that is interface-compatible with the Linked |
|||
Version. |
|||
|
|||
e) Provide Installation Information, but only if you would otherwise |
|||
be required to provide such information under section 6 of the |
|||
GNU GPL, and only to the extent that such information is |
|||
necessary to install and execute a modified version of the |
|||
Combined Work produced by recombining or relinking the |
|||
Application with a modified version of the Linked Version. (If |
|||
you use option 4d0, the Installation Information must accompany |
|||
the Minimal Corresponding Source and Corresponding Application |
|||
Code. If you use option 4d1, you must provide the Installation |
|||
Information in the manner specified by section 6 of the GNU GPL |
|||
for conveying Corresponding Source.) |
|||
|
|||
5. Combined Libraries. |
|||
|
|||
You may place library facilities that are a work based on the |
|||
Library side by side in a single library together with other library |
|||
facilities that are not Applications and are not covered by this |
|||
License, and convey such a combined library under terms of your |
|||
choice, if you do both of the following: |
|||
|
|||
a) Accompany the combined library with a copy of the same work based |
|||
on the Library, uncombined with any other library facilities, |
|||
conveyed under the terms of this License. |
|||
|
|||
b) Give prominent notice with the combined library that part of it |
|||
is a work based on the Library, and explaining where to find the |
|||
accompanying uncombined form of the same work. |
|||
|
|||
6. Revised Versions of the GNU Lesser General Public License. |
|||
|
|||
The Free Software Foundation may publish revised and/or new versions |
|||
of the GNU Lesser General Public License from time to time. Such new |
|||
versions will be similar in spirit to the present version, but may |
|||
differ in detail to address new problems or concerns. |
|||
|
|||
Each version is given a distinguishing version number. If the |
|||
Library as you received it specifies that a certain numbered version |
|||
of the GNU Lesser General Public License "or any later version" |
|||
applies to it, you have the option of following the terms and |
|||
conditions either of that published version or of any later version |
|||
published by the Free Software Foundation. If the Library as you |
|||
received it does not specify a version number of the GNU Lesser |
|||
General Public License, you may choose any version of the GNU Lesser |
|||
General Public License ever published by the Free Software Foundation. |
|||
|
|||
If the Library as you received it specifies that a proxy can decide |
|||
whether future versions of the GNU Lesser General Public License shall |
|||
apply, that proxy's public statement of acceptance of any version is |
|||
permanent authorization for you to choose that version for the |
|||
Library. |
@ -1,227 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @file Widget.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief A widget interface. |
|||
* |
|||
* @author Guillaume Pasquet <etenil@etenilsrealm.nl> |
|||
* |
|||
* @version 1.0 |
|||
* @date 20 October 2010 |
|||
* |
|||
* Copyright (C)2010 MOVIM Project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class WidgetBase |
|||
{ |
|||
protected $js = array(); /*< Contains javascripts. */ |
|||
protected $css = array(); /*< Contains CSS files. */ |
|||
protected $external; /*< Boolean: TRUE if not a system widget. */ |
|||
protected $ajax; /*< Contains ajax client code. */ |
|||
protected $xmpp; /*< Jabber instance. */ |
|||
protected $user; |
|||
protected $name; |
|||
protected $events; |
|||
|
|||
protected $cached; |
|||
|
|||
/** |
|||
* Initialises Widget stuff. |
|||
* @param external is optional, true if the widget is external (an add-on) to Movim. |
|||
*/ |
|||
function __construct($external = true) |
|||
{ |
|||
// Put default widget init here.
|
|||
$this->external = $external; |
|||
|
|||
$this->ajax = ControllerAjax::getInstance(); |
|||
|
|||
$this->user = new User(); |
|||
|
|||
$db = modl\Modl::getInstance(); |
|||
$db->setUser(new User()); |
|||
|
|||
// Generating ajax calls.
|
|||
$refl = new ReflectionClass(get_class($this)); |
|||
$meths = $refl->getMethods(); |
|||
|
|||
foreach($meths as $method) { |
|||
if(preg_match('#^ajax#', $method->name)) { |
|||
$pars = $method->getParameters(); |
|||
$params = array(); |
|||
foreach($pars as $param) { |
|||
$params[] = $param->name; |
|||
} |
|||
|
|||
$this->ajax->defun(get_class($this), $method->name, $params); |
|||
} |
|||
} |
|||
|
|||
$this->name = get_class($this); |
|||
|
|||
$this->WidgetLoad(); |
|||
} |
|||
|
|||
function WidgetLoad() |
|||
{ |
|||
} |
|||
|
|||
/** |
|||
* Generates the widget's HTML code. |
|||
*/ |
|||
function build() |
|||
{ |
|||
} |
|||
|
|||
/** |
|||
* Returns the path to the specified widget file. |
|||
* @param file is the file's name to make up the path for. |
|||
* @param fspath is optional, returns the OS path if true, the URL by default. |
|||
*/ |
|||
protected function respath($file, $fspath = false) |
|||
{ |
|||
$path = ""; |
|||
if(!$this->external) { |
|||
$path = 'system/'; |
|||
} |
|||
$path .= 'Widget/widgets/' . get_class($this) . '/' . $file; |
|||
|
|||
if($fspath) { |
|||
$path = BASE_PATH . $path; |
|||
} else { |
|||
$path = BASE_URI . $path; |
|||
} |
|||
|
|||
return $path; |
|||
} |
|||
|
|||
public function getName() |
|||
{ |
|||
return $this->name; |
|||
} |
|||
|
|||
/** |
|||
* Generates and print an ajax call. |
|||
*/ |
|||
protected function callAjax($funcname) |
|||
{ |
|||
echo $this->makeCallAjax(func_get_args()); |
|||
} |
|||
|
|||
/** |
|||
* Calls an the ajax function of another widget. |
|||
*/ |
|||
protected function callWidget($widgetname, $funcname) |
|||
{ |
|||
$params = func_get_args(); |
|||
echo $this->makeCallAjax(array_slice($params, 1), $widgetname); |
|||
} |
|||
|
|||
/** |
|||
* Returns the javascript ajax call. |
|||
*/ |
|||
protected function genCallAjax($funcname) |
|||
{ |
|||
return $this->makeCallAjax(func_get_args()); |
|||
} |
|||
|
|||
/** |
|||
* Returns the javascript call to another widget's ajax function. |
|||
*/ |
|||
protected function genCallWidget($widgetname, $funcname) |
|||
{ |
|||
$params = func_get_args(); |
|||
return $this->makeCallAjax(array_slice($params, 1), $widgetname); |
|||
} |
|||
|
|||
protected function makeCallAjax($params, $widget=false) |
|||
{ |
|||
if(!$widget) { |
|||
$widget = get_class($this); |
|||
} |
|||
|
|||
$funcname = array_shift($params); |
|||
$args = implode(', ', $params); |
|||
|
|||
return $widget . '_' . $funcname . "(" . $args . ");"; |
|||
} |
|||
|
|||
/** |
|||
* Adds a javascript file to this widget. |
|||
*/ |
|||
protected function addjs($filename) |
|||
{ |
|||
$this->js[] = $this->respath($filename); |
|||
} |
|||
|
|||
/** |
|||
* returns the list of javascript files to be loaded for the widget. |
|||
*/ |
|||
public function loadjs() |
|||
{ |
|||
return $this->js; |
|||
} |
|||
|
|||
/** |
|||
* Adds a javascript file to this widget. |
|||
*/ |
|||
protected function addcss($filename) |
|||
{ |
|||
$this->css[] = $this->respath($filename); |
|||
} |
|||
|
|||
/** |
|||
* Registers an event handler. |
|||
*/ |
|||
protected function registerEvent($type, $function) |
|||
{ |
|||
if(!is_array($this->events) |
|||
|| !array_key_exists($type, $this->events)) { |
|||
$this->events[$type] = array($function); |
|||
} else { |
|||
$this->events[$type][] = $function; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Runs all events of a given type. |
|||
*/ |
|||
public function runEvents($proto) |
|||
{ |
|||
|
|||
if(is_array($this->events) && array_key_exists($proto['type'], $this->events)) { |
|||
// If a new event came to the widget, we update the cache
|
|||
//$this->setCacheCall();
|
|||
$returns = array(); |
|||
|
|||
foreach($this->events[$proto['type']] as $handler) { |
|||
$returns[] = call_user_func(array($this, $handler), $proto['data']); |
|||
} |
|||
|
|||
return $returns; |
|||
} |
|||
} |
|||
|
|||
public function isEvents($proto) |
|||
{ |
|||
if(is_array($this->events) && |
|||
array_key_exists($proto['type'], $this->events) && |
|||
$this->cached == true) { |
|||
return true; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* returns the list of javascript files to be loaded for the widget. |
|||
*/ |
|||
public function loadcss() |
|||
{ |
|||
return $this->css; |
|||
} |
|||
} |
|||
|
|||
?>
|
@ -1,585 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @file WidgetCommon.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief The widgets commons methods. |
|||
* |
|||
* @author Timothée Jaussoin <edhelas@gmail.com> |
|||
* |
|||
* @date 08 march 2012 |
|||
* |
|||
* Copyright (C)2010 MOVIM Project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class WidgetCommon extends WidgetBase { |
|||
protected function printPost($post, $comments = false, $public = false) { |
|||
if($post->title) |
|||
$title = ' |
|||
<span> |
|||
'.$post->title.' |
|||
</span><br />'; |
|||
|
|||
if($this->user->getLogin() == $post->jid) { |
|||
$class = 'me '; |
|||
|
|||
if($post->privacy == 1) |
|||
$access .= 'protect black'; |
|||
else |
|||
$access .= 'protect orange'; |
|||
|
|||
$avatar = $post->getContact()->getPhoto('s'); |
|||
} elseif($post->public == 2) |
|||
$avatar = $post->getContact()->getPhoto('xs'); |
|||
else |
|||
$avatar = $post->getContact()->getPhoto('s'); |
|||
|
|||
if(!filter_var($post->from, FILTER_VALIDATE_EMAIL) && $post->node != '') |
|||
$group = ' |
|||
<span class="group"> |
|||
<a href="'.Route::urlize('node', array($post->from, $post->node)).'">'.$post->node.' ('.$post->from.')</a> |
|||
</span>'; |
|||
elseif($post->from != $post->aid) |
|||
$recycle .= ' |
|||
<span class="recycle"> |
|||
<a href="'.Route::urlize('friend', $post->from).'">'.$post->from.'</a> |
|||
</span>'; |
|||
|
|||
if($post->getPlace() != false) |
|||
$place .= ' |
|||
<span class="place"> |
|||
<a |
|||
target="_blank" |
|||
href="http://www.openstreetmap.org/?lat='.$post->lat.'&lon='.$post->lon.'&zoom=10" |
|||
>'.t('Place').'</a> |
|||
</span>'; |
|||
|
|||
if($post->jid != '') |
|||
$c = ' |
|||
<span> |
|||
<a href="'.Route::urlize('friend', $post->jid).'">'.$post->getContact()->getTrueName().'</a> |
|||
</span>'; |
|||
elseif($post->aid != '') |
|||
$c = ' |
|||
<span> |
|||
<a href="'.Route::urlize('friend', $post->aid).'">'.$post->aid.'</a> |
|||
</span>'; |
|||
|
|||
if($post->links) |
|||
$enc = $this->printEnclosures($post->links); |
|||
|
|||
if($enc) |
|||
$enc = ' |
|||
<div class="enclosure">'. |
|||
$enc. |
|||
'</div>'; |
|||
|
|||
$content = prepareString(html_entity_decode($post->content)); |
|||
|
|||
if($post->node == 'urn:xmpp:microblog:0') |
|||
$comments = $this->printComments($post, $comments, $public); |
|||
else |
|||
$comments = ''; |
|||
|
|||
if($this->user->getLogin() == $post->jid) |
|||
$toolbox = $this->getToolbox($post); |
|||
|
|||
$html = ' |
|||
<div class="post '.$class.'" id="'.$post->nodeid.'"> |
|||
<a href="'.Route::urlize('friend', $post->jid).'"> |
|||
<img class="avatar" src="'.$avatar.'"> |
|||
</a> |
|||
|
|||
<div id="'.$post->nodeid.'bubble" class="postbubble '.$access.'"> |
|||
<div class="header"> |
|||
<span class="title">'.$title.'</span> |
|||
'.$c.' |
|||
<span class="date"> |
|||
'.prepareDate(strtotime($post->published)).' |
|||
</span> |
|||
</div> |
|||
<div class="content"> |
|||
'.$content.' |
|||
</div> |
|||
'.$toolbox.' |
|||
'.$enc.' |
|||
'.$comments.' |
|||
'.$place.' |
|||
'.$recycle.' |
|||
'.$group.' |
|||
</div> |
|||
<div class="clear"></div> |
|||
|
|||
</div> |
|||
'; |
|||
return $html; |
|||
} |
|||
|
|||
private function printEnclosures($links) { |
|||
$enc = ''; |
|||
$links = unserialize($links); |
|||
|
|||
foreach($links as $l) { |
|||
if($l['rel'] == 'enclosure') { |
|||
if(isset($l['thumb'])) |
|||
$enc .= ' |
|||
<a href="'.$l['href'].'" class="imglink" target="_blank"> |
|||
<img src="'.$l['thumb']['href'].'"/> |
|||
</a> |
|||
'; |
|||
else |
|||
$enc .= ' |
|||
<a href="'.$l['href'].'" class="imglink" target="_blank"> |
|||
<img src="'.$l['href'].'"/> |
|||
</a>'; |
|||
} elseif($l['rel'] == 'alternate' && isset($l['title'])) { |
|||
$enc .= ' |
|||
<a href="'.$l['href'].'" class="imglink" target="_blank"> |
|||
'.$l['title'].' |
|||
</a>'; |
|||
} |
|||
} |
|||
|
|||
return $enc; |
|||
} |
|||
|
|||
private function getToolbox($post) { |
|||
$html = ' |
|||
<div class="tools"> |
|||
'.t("Share with").' : |
|||
<a |
|||
title="'.t("your post will appear in your Movim public feed").'" |
|||
onclick="'.
|
|||
$this->genCallAjax( |
|||
'ajaxPrivacyPost', |
|||
"'".$post->nodeid."'", |
|||
"'black'"). |
|||
'" >
|
|||
'.t("Everyone").'</a>, |
|||
<a |
|||
onclick="'.
|
|||
$this->genCallAjax( |
|||
'ajaxPrivacyPost', |
|||
"'".$post->nodeid."'", |
|||
"'orange'"). |
|||
'" >
|
|||
'.t("Your contacts").'</a><br /> |
|||
<a |
|||
style="padding-right: 1em;"; |
|||
onclick="
|
|||
this.parentNode.querySelector(\'#deleteyes\').style.display = \'inline\';
|
|||
this.parentNode.querySelector(\'#deleteno\').style.display = \'inline\';
|
|||
"
|
|||
title="'.t("Delete this post").'"> |
|||
'.t("Delete this post").' |
|||
</a> |
|||
<a |
|||
style="padding-right: 1em; display: none;"; |
|||
id="deleteyes" |
|||
onclick="'.
|
|||
$this->genCallAjax( |
|||
'ajaxDeletePost', |
|||
"'".$this->user->getLogin()."'", |
|||
"'".$post->node."'", |
|||
"'".$post->nodeid."'").'" >
|
|||
✔ '.t("Yes").' |
|||
</a> |
|||
<a |
|||
style="display: none;"; |
|||
id="deleteno" |
|||
onclick="
|
|||
this.parentNode.querySelector(\'#deleteyes\').style.display = \'none\';
|
|||
this.style.display = \'none\'; |
|||
"
|
|||
onclick=""> |
|||
✘ '.t("No").' |
|||
</a> |
|||
</div>'; |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
protected function printComments($post, $comments, $public = false) { |
|||
$tmp .= ' |
|||
<div class="comments" id="'.$post->nodeid.'comments">'; |
|||
|
|||
$commentshtml = $this->prepareComments($comments); |
|||
|
|||
if($commentshtml != false) |
|||
$tmp .= $commentshtml; |
|||
|
|||
if($public == false) { |
|||
$tmp .= ' |
|||
<div class="comment"> |
|||
<a |
|||
class="getcomments icon bubble" |
|||
style="margin-left: 0px;" |
|||
onclick="'.$this->genCallAjax('ajaxGetComments', "'".$post->commentplace."'", "'".$post->nodeid."'").'; this.innerHTML = \''.t('Loading comments ...').'\'">'. |
|||
t('Get the comments').' |
|||
</a> |
|||
</div></div>'; |
|||
$tmp .= '<div class="comments"> |
|||
<div |
|||
class="comment" |
|||
style="border-bottom: none;" |
|||
onclick="this.parentNode.querySelector(\'#commentsubmit\').style.display = \'table\'; this.style.display =\'none\'"> |
|||
<a class="getcomments icon bubbleadd">'.t('Add a comment').'</a> |
|||
</div> |
|||
<table id="commentsubmit"> |
|||
<tr> |
|||
<td> |
|||
<textarea id="'.$post->nodeid.'commentcontent" onkeyup="movim_textarea_autoheight(this);"></textarea> |
|||
</td> |
|||
</tr> |
|||
<tr class="commentsubmitrow"> |
|||
<td style="width: 100%;"></td> |
|||
<td> |
|||
<a |
|||
onclick="
|
|||
if(document.getElementById(\''.$post->nodeid.'commentcontent\').value != \'\') { |
|||
'.$this->genCallAjax( |
|||
'ajaxPublishComment', |
|||
"'".$post->commentplace."'", |
|||
"'".$post->nodeid."'", |
|||
"encodeURIComponent(document.getElementById('".$post->nodeid."commentcontent').value)"). |
|||
'document.getElementById(\''.$post->nodeid.'commentcontent\').value = \'\'; |
|||
}"
|
|||
class="button tiny icon submit" |
|||
style="padding-left: 28px;" |
|||
>'. |
|||
t("Submit").' |
|||
</a> |
|||
</td> |
|||
</tr> |
|||
</table>'; |
|||
} |
|||
$tmp .= '</div>'; |
|||
return $tmp; |
|||
|
|||
} |
|||
|
|||
/* |
|||
* @desc Prepare a group of messages |
|||
* @param array of messages |
|||
* @return generated HTML |
|||
*/ |
|||
protected function preparePosts($posts, $public = false) { |
|||
if($posts == false || empty($posts)) { |
|||
$html = '<div style="padding: 1.5em; text-align: center;">Ain\'t Nobody Here But Us Chickens...</div>'; |
|||
} else { |
|||
$html = ''; |
|||
|
|||
$pd = new \modl\PostnDAO(); |
|||
$comments = $pd->getComments($posts); |
|||
|
|||
foreach($posts as $post) { |
|||
// We split the interesting comments for each messages
|
|||
$i = 0; |
|||
|
|||
$messagecomment = array(); |
|||
foreach($comments as $comment) { |
|||
if('urn:xmpp:microblog:0:comments/'.$post->nodeid == $comments[$i]->node) { |
|||
array_push($messagecomment, $comment); |
|||
unset($comment); |
|||
} |
|||
$i++; |
|||
} |
|||
|
|||
$html .= $this->printPost($post, $messagecomment, $public); |
|||
} |
|||
|
|||
} |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
protected function testIsSet($element) |
|||
{ |
|||
if(isset($element) && $element != '') |
|||
return true; |
|||
else |
|||
return false; |
|||
} |
|||
|
|||
protected function prepareComments($comments) { |
|||
$tmp = false; |
|||
|
|||
$size = sizeof($comments); |
|||
|
|||
$i = 0; |
|||
while($i < $size-1) { |
|||
if($comments[$i]->nodeid == $comments[$i+1]->nodeid) |
|||
unset($comments[$i]); |
|||
$i++; |
|||
} |
|||
|
|||
$size = sizeof($comments); |
|||
|
|||
$comcounter = 0; |
|||
|
|||
if($size > 3) { |
|||
$tmp = '<div |
|||
class="comment" |
|||
onclick="
|
|||
com = this.parentNode.querySelectorAll(\'.comment\'); |
|||
for(i = 0; i < com.length; i++) { com.item(i).style.display = \'block\';}; |
|||
this.style.display = \'none\';">
|
|||
<a class="getcomments icon bubbleold">'.t('Show the older comments').'</a> |
|||
</div>'; |
|||
$comcounter = $size - 3; |
|||
} |
|||
|
|||
if($comments) { |
|||
foreach($comments as $comment) { |
|||
$photo = $comment->getContact()->getPhoto('xs'); |
|||
$name = $comment->getContact()->getTrueName(); |
|||
|
|||
$tmp .= ' |
|||
<div class="comment" '; |
|||
if($comcounter > 0) { |
|||
$tmp .= 'style="display:none;"'; |
|||
$comcounter--; |
|||
} |
|||
|
|||
$tmp .='> |
|||
<img class="avatar tiny" src="'.$photo.'"> |
|||
<span><a href="'.Route::urlize('friend', $comment->jid).'">'.$name.'</a></span> |
|||
<span class="date">'.prepareDate(strtotime($comment->published)).'</span><br /> |
|||
<div class="content tiny">'.prepareString($comment->content).'</div> |
|||
</div>'; |
|||
} |
|||
} |
|||
return $tmp; |
|||
} |
|||
|
|||
protected function prepareSubmitForm($server = '', $node = '') { |
|||
$html = ' |
|||
<script type="text/javascript"> |
|||
function showPosition(poss) { |
|||
'.$this->genCallAjax('ajaxShowPosition', "poss").' |
|||
} |
|||
</script> |
|||
|
|||
<div class="popup post" id="postpreview"> |
|||
<h2>'.t('Preview').'</h2> |
|||
<div class="content" id="postpreviewcontent"> |
|||
|
|||
</div> |
|||
<a |
|||
class="button tiny black" |
|||
onclick="
|
|||
movim_toggle_display(\'#postpreview\');"
|
|||
>'.t('Close').'</a> |
|||
</div> |
|||
<table id="feedsubmitform"> |
|||
<tbody> |
|||
<form name="postpublish" id="postpublish"> |
|||
<tr> |
|||
<td> |
|||
<textarea |
|||
name="content" |
|||
id="postpublishcontent" |
|||
onkeyup="movim_textarea_autoheight(this);" |
|||
placeholder="'.t("What's new ?").'" ></textarea>
|
|||
</td> |
|||
</tr> |
|||
<tr id="feedsubmitrow"> |
|||
<td> |
|||
<input type="hidden" id="latlonpos" name="latlonpos"/> |
|||
<a |
|||
title="'.t("Submit").'" |
|||
href="#" |
|||
id="feedmessagesubmit" |
|||
onclick="'.$this->genCallAjax('ajaxPublishItem', "'".$server."'", "'".$node."'","movim_parse_form('postpublish')").';
|
|||
document.querySelector(\'#postpublish\').reset();
|
|||
movim_textarea_autoheight(document.querySelector(\'#postpublishcontent\'));"
|
|||
class="button tiny icon yes">'. |
|||
t("Submit").' |
|||
</a> |
|||
<a |
|||
class="button tiny icon alone merged left preview" |
|||
style="float: left;" |
|||
title="'.t('Preview').'" |
|||
onclick="
|
|||
movim_toggle_display(\'#postpreview\');
|
|||
'.$this->genCallAjax('ajaxPostPreview', "document.querySelector('#postpublishcontent').value").'"
|
|||
></a> |
|||
|
|||
<a |
|||
title="Plus" |
|||
href="#" |
|||
id="postpublishsize" |
|||
onclick="frameHeight(this, document.querySelector(\'#postpublishcontent\'));" |
|||
style="float: left;" |
|||
class="button tiny icon alone add merged"></a><a |
|||
class="button tiny icon alone help merged" |
|||
style="float: left;" |
|||
href="http://daringfireball.net/projects/markdown/basics" |
|||
target="_blank" |
|||
></a><a title="'.t("Geolocalisation").'" |
|||
onclick="setPosition(document.querySelector(\'#latlonpos\'));" |
|||
style="float: left;" |
|||
class="button tiny icon alone geo merged right"></a> |
|||
<span id="postpublishlocation"></span> |
|||
|
|||
</td> |
|||
</tr> |
|||
</form> |
|||
</tbody> |
|||
</table>'; |
|||
|
|||
|
|||
return $html; |
|||
} |
|||
|
|||
function ajaxShowPosition($pos) |
|||
{ |
|||
list($lat,$lon) = explode(',', $pos); |
|||
|
|||
$pos = json_decode( |
|||
file_get_contents('http://nominatim.openstreetmap.org/reverse?format=json&lat='.$lat.'&lon='.$lon.'&zoom=27&addressdetails=1') |
|||
); |
|||
|
|||
RPC::call('movim_fill', 'postpublishlocation' , (string)$pos->display_name); |
|||
RPC::commit(); |
|||
} |
|||
|
|||
function ajaxPostPreview($content) |
|||
{ |
|||
if($content != '') { |
|||
$content = Michelf\Markdown::defaultTransform($content); |
|||
RPC::call('movim_fill', 'postpreviewcontent' , $content); |
|||
} else |
|||
RPC::call('movim_fill', 'postpreviewcontent' , t('No content')); |
|||
|
|||
RPC::commit(); |
|||
} |
|||
|
|||
function ajaxPublishItem($server, $node, $form) |
|||
{ |
|||
$content = $form['content']; |
|||
|
|||
list($lat,$lon) = explode(',', $form['latlonpos']); |
|||
|
|||
$pos = json_decode( |
|||
file_get_contents('http://nominatim.openstreetmap.org/reverse?format=json&lat='.$lat.'&lon='.$lon.'&zoom=27&addressdetails=1') |
|||
); |
|||
|
|||
$geo = array( |
|||
'latitude' => (string)$pos->lat, |
|||
'longitude' => (string)$pos->lon, |
|||
'altitude' => (string)$pos->alt, |
|||
'country' => (string)$pos->address->country, |
|||
'countrycode' => (string)$pos->address->country_code, |
|||
'region' => (string)$pos->address->county, |
|||
'postalcode' => (string)$pos->address->postcode, |
|||
'locality' => (string)$pos->address->city, |
|||
'street' => (string)$pos->address->path, |
|||
'building' => (string)$pos->address->building, |
|||
'text' => (string)$pos->display_name, |
|||
'uri' => ''//'http://www.openstreetmap.org/'.urlencode('?lat='.(string)$pos->lat.'&lon='.(string)$pos->lon.'&zoom=10')
|
|||
); |
|||
|
|||
if($content != '') { |
|||
$content = Michelf\Markdown::defaultTransform($content); |
|||
|
|||
$p = new moxl\PubsubPostPublish(); |
|||
$p->setFrom($this->user->getLogin()) |
|||
->setTo($server) |
|||
->setNode($node) |
|||
->setLocation($geo) |
|||
->setContentHtml(rawurldecode($content)) |
|||
->enableComments() |
|||
->request(); |
|||
} |
|||
} |
|||
|
|||
function onComment($parent) { |
|||
$p = new \modl\ContactPostn(); |
|||
$p->nodeid = $parent; |
|||
|
|||
$pd = new \modl\PostnDAO(); |
|||
$comments = $pd->getComments($p); |
|||
|
|||
$html = $this->prepareComments($comments); |
|||
RPC::call('movim_fill', $parent.'comments', $html); |
|||
} |
|||
|
|||
function onNoComment($parent) { |
|||
$html = ' |
|||
<div class="comment"> |
|||
<a |
|||
class="getcomments icon bubble" |
|||
style="margin-left: 0px;">'. |
|||
t('No comments'). |
|||
'</a> |
|||
</div>'; |
|||
RPC::call('movim_fill', $parent.'comments', $html); |
|||
} |
|||
|
|||
function onNoCommentStream($parent) { |
|||
$html = ' |
|||
<div class="comment"> |
|||
<a |
|||
class="getcomments icon bubble" |
|||
style="margin-left: 0px;">'. |
|||
t('No comments stream'). |
|||
'</a> |
|||
</div>'; |
|||
RPC::call('movim_fill', $parent.'comments', $html); |
|||
} |
|||
|
|||
function ajaxGetComments($jid, $id) { |
|||
$c = new moxl\MicroblogCommentsGet(); |
|||
$c->setTo($jid) |
|||
->setId($id) |
|||
->request(); |
|||
} |
|||
|
|||
function ajaxPublishComment($to, $id, $content) { |
|||
if($content != '') { |
|||
$p = new moxl\MicroblogCommentPublish(); |
|||
$p->setTo($to) |
|||
->setFrom($this->user->getLogin()) |
|||
->setParentId($id) |
|||
->setContent(htmlspecialchars(rawurldecode($content))) |
|||
->request(); |
|||
} |
|||
} |
|||
|
|||
function ajaxDeletePost($to, $node, $id) { |
|||
$p = new moxl\PubsubPostDelete(); |
|||
$p->setTo($to) |
|||
->setNode($node) |
|||
->setId($id) |
|||
->request(); |
|||
} |
|||
|
|||
function ajaxPrivacyPost($nodeid, $privacy) { |
|||
$pd = new \modl\PrivacyDAO(); |
|||
|
|||
$p = $pd->get($nodeid); |
|||
|
|||
if($privacy == 'orange') { |
|||
\modl\Privacy::set($nodeid, 0); |
|||
} elseif($privacy == 'black') { |
|||
\modl\Privacy::set($nodeid, 1); |
|||
} |
|||
|
|||
RPC::call('movim_change_class', $nodeid.'bubble' , 'postbubble me protect '.$privacy); |
|||
RPC::commit(); |
|||
} |
|||
|
|||
/*function onPostDelete($id) { |
|||
RPC::call('movim_delete', $id); |
|||
} |
|||
|
|||
function onPostDeleteError($params) { |
|||
$html .= |
|||
'<div class="message error">'.t('An error occured : ').$params[1].'</div>'; |
|||
RPC::call('movim_fill', $params[0] , $html); |
|||
}*/ |
|||
} |
@ -1,228 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @file WidgetWrapper.php |
|||
* This file is part of PROJECT. |
|||
* |
|||
* @brief Description |
|||
* |
|||
* @author Guillaume Pasquet <gpasquet@lewisday.co.uk> |
|||
* |
|||
* @version 1.0 |
|||
* @date 20 January 2011 |
|||
* |
|||
* Copyright (C)2011 Lewis Day Transport Plc. |
|||
* |
|||
* All rights reserved. |
|||
*/ |
|||
|
|||
/** |
|||
* A container that abstracts the communication between |
|||
* widgets and the core of Movim. |
|||
*/ |
|||
class WidgetWrapper |
|||
{ |
|||
private $register_widgets; |
|||
private $all_widgets = array(); |
|||
private $loaded_widgets = array(); |
|||
private $loaded_widgets_old; |
|||
|
|||
private static $instance; |
|||
|
|||
private $css = array(); // All the css loaded by the widgets so far.
|
|||
private $js = array(); // All the js loaded by the widgets so far.
|
|||
|
|||
/** |
|||
* Constructor. The parameter instructs the wrapper about whether |
|||
* it should save $_SESSION or not. |
|||
* @param $register set to false not to save the widgets in SESSION. |
|||
*/ |
|||
private function __construct($register) |
|||
{ |
|||
$this->register_widgets = $register; |
|||
$sess = Session::start(APP_NAME); |
|||
$widgets = $sess->get('loaded_widgets'); |
|||
if(is_array($widgets)) { |
|||
$this->loaded_widgets_old = $widgets; |
|||
} |
|||
|
|||
$this->all_widgets = array(); |
|||
|
|||
$widgets_dir = scandir(LIB_PATH ."Widget/widgets/"); |
|||
foreach($widgets_dir as $widget_dir) { |
|||
if(is_dir(LIB_PATH ."Widget/widgets/".$widget_dir) && |
|||
$widget_dir != '..' && |
|||
$widget_dir != '.') |
|||
array_push($this->all_widgets, $widget_dir); |
|||
} |
|||
} |
|||
|
|||
static function getInstance($register = true) |
|||
{ |
|||
if(!is_object(self::$instance)) { |
|||
self::$instance = new WidgetWrapper($register); |
|||
} |
|||
return self::$instance; |
|||
} |
|||
|
|||
static function destroyInstance() |
|||
{ |
|||
if(isset(self::$instance)) { |
|||
self::$instance->destroy(); |
|||
self::$instance = null; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Saves the list of loaded widgets if necessary. |
|||
*/ |
|||
function __destruct() |
|||
{ |
|||
$this->destroy(); |
|||
} |
|||
|
|||
protected function destroy() |
|||
{ |
|||
if($this->register_widgets) { |
|||
$sess = Session::start(APP_NAME); |
|||
$sess->set('loaded_widgets', $this->loaded_widgets); |
|||
$this->register_widgets = false; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Retrieves the list of loaded widgets. |
|||
*/ |
|||
function get_loaded_widgets() |
|||
{ |
|||
if(count($this->loaded_widgets) > 0) { |
|||
return $this->loaded_widgets; |
|||
} else { |
|||
return $this->loaded_widgets_old; |
|||
} |
|||
} |
|||
|
|||
function get_all_widgets() |
|||
{ |
|||
return $this->all_widgets; |
|||
} |
|||
|
|||
/*function get_cached_widgets() |
|||
{ |
|||
return $this->cached_widgets; |
|||
}*/ |
|||
|
|||
/** |
|||
* Loads a widget and returns it. |
|||
*/ |
|||
public function load_widget($widget_name) |
|||
{ |
|||
// Attempting to load the user's widgets in priority
|
|||
$widget_path = ""; |
|||
$extern = null; |
|||
if(file_exists(BASE_PATH . "Widget/widgets/$widget_name/$widget_name.php")) { |
|||
$widget_path = BASE_PATH . "Widget/widgets/$widget_name/$widget_name.php"; |
|||
// Custom widgets have their own translations.
|
|||
load_extra_lang(BASE_PATH . 'Widget/widgets/$widget_name/i18n'); |
|||
$extern = true; |
|||
} |
|||
else if(file_exists(LIB_PATH . "Widget/widgets/$widget_name/$widget_name.php")) { |
|||
$widget_path = LIB_PATH . "Widget/widgets/$widget_name/$widget_name.php"; |
|||
$extern = false; |
|||
} |
|||
else { |
|||
throw new MovimException( |
|||
t("Requested widget '%s' doesn't exist.", $widget_name)); |
|||
} |
|||
|
|||
require_once($widget_path); |
|||
$widget = new $widget_name($extern); |
|||
return $widget; |
|||
} |
|||
|
|||
/** |
|||
* Loads a widget and runs a particular function on it. |
|||
* |
|||
* @param $widget_name is the name of the widget. |
|||
* @param $method is the function to be run. |
|||
* @param $params is an array containing the parameters to |
|||
* be passed along to the method. |
|||
* @return what the widget's method returns. |
|||
*/ |
|||
function run_widget($widget_name, $method, array $params = NULL) |
|||
{ |
|||
if($this->register_widgets && |
|||
!in_array($widget_name, $this->loaded_widgets)) { |
|||
$this->loaded_widgets[] = $widget_name; |
|||
} |
|||
|
|||
$widget = $this->load_widget($widget_name); |
|||
|
|||
if(!is_array($params)) { |
|||
$params = array(); |
|||
} |
|||
|
|||
$result = call_user_func_array(array($widget, $method), $params); |
|||
// Collecting stuff generated by the widgets.
|
|||
$this->css = array_merge($this->css, $widget->loadcss()); |
|||
$this->js = array_merge($this->js, $widget->loadjs()); |
|||
|
|||
return $result; |
|||
} |
|||
|
|||
/** |
|||
* Calls a particular function with the given parameters on |
|||
* all loaded widgets. |
|||
* |
|||
* @param $method is the method to be called on all widgets. |
|||
* @param $params is an array of parameters passed to the method. |
|||
*/ |
|||
function iterate($method, array $params = NULL) |
|||
{ |
|||
$buff = array(); |
|||
$widgets = $this->get_loaded_widgets(); |
|||
foreach($widgets as $widget) { |
|||
$buff[] = $this->run_widget($widget, $method, $params); |
|||
} |
|||
|
|||
return $buff; |
|||
} |
|||
|
|||
function iterateAll($method, array $params = NULL) { |
|||
$widgets = $this->get_all_widgets(); |
|||
$isevent = array(); |
|||
foreach($widgets as $widget) { |
|||
if($this->run_widget($widget, $method, $params)) |
|||
$isevent[$widget] = true; |
|||
} |
|||
|
|||
if(!empty($isevent)) |
|||
$this->cached_widgets = $isevent; |
|||
|
|||
return $isevent; |
|||
} |
|||
|
|||
/** |
|||
* Returns the list of loaded CSS. |
|||
*/ |
|||
function loadcss() |
|||
{ |
|||
if(!is_array($this->css)) // Just being prudent
|
|||
return array(); |
|||
else |
|||
return $this->css; |
|||
} |
|||
|
|||
/** |
|||
* Returns the list of loaded javascripts. |
|||
*/ |
|||
function loadjs() |
|||
{ |
|||
if(!is_array($this->js)) // Avoids annoying errors.
|
|||
return array(); |
|||
else |
|||
return $this->js; |
|||
} |
|||
} |
|||
|
|||
?>
|
@ -1,4 +0,0 @@ |
|||
((nil . ((indent-tabs-mode . nil) |
|||
(tab-width . 4) |
|||
(fill-column . 80))) |
|||
(c-mode . ((c-file-style . "stroustrup")))) |
@ -1,123 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file Vcard.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief A widget which display some help |
|||
* |
|||
* @author Timothée Jaussoin <edhelas_at_gmail_dot_com> |
|||
* |
|||
* @version 1.0 |
|||
* @date 3 may 2012 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class About extends WidgetBase |
|||
{ |
|||
function WidgetLoad() { |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
?>
|
|||
<div class="tabelem padded" title="<?php echo t('About'); ?>" id="about"> |
|||
<p>Movim is an XMPP-based communication platform. All the project, except the following software and resources, is under |
|||
<a href="http://www.gnu.org/licenses/agpl-3.0.html">GNU Affero General Public License v3</a>. |
|||
</p> |
|||
<h2><?php echo t('Thanks'); ?></h2>
|
|||
<dl> |
|||
<dt>Developers</dt><dd><a href="http://edhelas.mov.im/">Jaussoin Timothée aka edhelas</a></dd> |
|||
<dt></dt><dd><a href="https://launchpad.net/~nodpounod">Ho Christine aka nodpounod</a></dd> |
|||
<dt></dt><dd><a href="https://etenil.net/">Pasquet Guillaume aka Etenil</a></dd> |
|||
<dt>Translators</dt><dd>Arabic - <a href="https://launchpad.net/~gharbeia">Ahmad Gharbeia أحمد غربية</a></dd> |
|||
<dt></dt><dd>Brazilian - <a href="https://launchpad.net/~dnieper650">millemiglia</a></dd> |
|||
<dt></dt><dd>Chinese - <a href="https://launchpad.net/~dudumomo">dudumomo</a></dd> |
|||
<dt></dt><dd>Danish - <a href="https://launchpad.net/~ole-carlsen-web">Ole Carlsen</a></dd> |
|||
<dt></dt><dd>Dutch - <a href="https://launchpad.net/~laurens-debackere">Laurens Debackere</a></dd> |
|||
<dt></dt><dd>English UK - <a href="https://launchpad.net/~kevinbeynon">Kevin Beynon</a>, <a href="https://launchpad.net/~influence-pc">Vincent</a></dd> |
|||
<dt></dt><dd>Esperanto - <a href="https://launchpad.net/~eliovir">Eliovir</a></dd> |
|||
<dt></dt><dd>Finish - <a href="https://launchpad.net/~e1484180">Timo</a></dd> |
|||
<dt></dt><dd>French - |
|||
<a href="https://launchpad.net/~hyogapag">Hyogapag</a>, |
|||
<a href="https://launchpad.net/~e1484180">Hélion du Mas des Bourboux</a>, |
|||
<a href="https://launchpad.net/~jonathanmm">JonathanMM</a>, |
|||
<a href="https://launchpad.net/~grossard-o">Ludovic Grossard</a>, |
|||
<a href="https://launchpad.net/~schoewilliam">Schoewilliam</a>, |
|||
<a href="https://launchpad.net/~influence-pc">Vincent</a>, |
|||
<a href="https://launchpad.net/~edhelas">edhelas</a>, |
|||
<a href="https://launchpad.net/~nodpounod">pou</a> |
|||
</dd> |
|||
<dt></dt><dd>German - |
|||
<a href="https://launchpad.net/~q-d">Daniel Winzen</a>, |
|||
<a href="https://launchpad.net/~jonas-ehrhard">Jonas Ehrhard</a>, |
|||
<a href="https://launchpad.net/~jonatan-zeidler-gmx">Jonatan Zeidler</a>, |
|||
<a href="https://launchpad.net/~kili4n">Kilian Holzinger</a>, |
|||
</dd> |
|||
<dt></dt><dd>Greek - |
|||
<a href="https://launchpad.net/~d-rotarou">Rotaru Dorin</a>, |
|||
<a href="https://launchpad.net/~yang-hellug">aitolos</a> |
|||
</dd> |
|||
<dt></dt><dd>Hebrew - <a href="https://launchpad.net/~genghiskhan">GenghisKhan</a></dd> |
|||
<dt></dt><dd>Hungarian - <a href="https://launchpad.net/~batisteo">Baptiste Darthenay</a></dd> |
|||
<dt></dt><dd>Italian - |
|||
<a href="https://launchpad.net/~andrea-caratti-phys">Andrea Caratti</a>, |
|||
<a href="https://launchpad.net/~giacomo-alzetta">Giacomo Alzetta</a>, |
|||
<a href="https://launchpad.net/~emailadhoc">kimj</a> |
|||
</dd> |
|||
<dt></dt><dd>Japanese - <a href="https://launchpad.net/~fdelbrayelle">Franky</a></dd> |
|||
<dt></dt><dd>Occitan (post 1500) - |
|||
<a href="https://launchpad.net/~cvalmary">Cédric VALMARY (Tot en òc)</a>, |
|||
<a href="https://launchpad.net/~caillonm">Maime</a> |
|||
</dd> |
|||
<dt></dt><dd>Portuguese - |
|||
<a href="https://launchpad.net/~jonathanmm">JonathanMM</a>, |
|||
<a href="https://launchpad.net/~dnieper650">millemiglia</a> |
|||
</dd> |
|||
<dt></dt><dd>Russian - |
|||
<a href="https://launchpad.net/~ak099">Aleksey Kabanov</a>, |
|||
<a href="https://launchpad.net/~vsharmanov">Vyacheslav Sharmanov</a>, |
|||
<a href="https://launchpad.net/~hailaga">hailaga</a>, |
|||
<a href="https://launchpad.net/~salnsg">Сергей Сальников</a>, |
|||
<a href="https://launchpad.net/~mr-filinkov">DeforaD</a> |
|||
</dd> |
|||
<dt></dt><dd>Spanish - |
|||
<a href="https://launchpad.net/~alejandrosg">Alejandro Serrano González</a>, |
|||
<a href="https://launchpad.net/~edu5800">Eduardo Alberto Calvo</a>, |
|||
<a href="https://launchpad.net/~estebanmainieri">Esteban Mainieri</a>, |
|||
<a href="https://launchpad.net/~victormezio">Oizem Mushroom</a>, |
|||
<a href="https://launchpad.net/~kaiser-715-deactivatedaccount">Ricardo Sánchez Baamonde</a>, |
|||
<a href="https://launchpad.net/~invrom">Ubuntu</a>, |
|||
<a href="https://launchpad.net/~orochiforja">orochiforja</a> |
|||
</dd> |
|||
<dt></dt><dd>Turkish - |
|||
<a href="https://launchpad.net/~basaran-caner">Caner Başaran</a>, |
|||
<a href="https://launchpad.net/~emreakca">emre akça</a> |
|||
</dd> |
|||
</dl> |
|||
|
|||
<h2><?php echo t('Software'); ?></h2>
|
|||
<dl> |
|||
<dt>Database Library</dt><dd>Modl - Movim DB Layer <a href="https://launchpad.net/modl">launchpad.net/modl</a> under AGPLv3</dd> |
|||
<dt>XMPP Library</dt><dd>Moxl - Movim XMPP Library <a href="https://launchpad.net/moxl">launchpad.net/moxl</a> under AGPLv3</dd> |
|||
</dl> |
|||
<br /> |
|||
<dl> |
|||
<dt>Map Library</dt><dd>Leaflet <a href="http://leafletjs.com/">leafletjs.com</a> under BSD</dd> |
|||
<dt>Markdown</dt><dd>Michel Fortin <a href="http://michelf.ca/projects/php-markdown/">michelf.ca</a> ©Michel Fortin</dd> |
|||
<dt>HTML Fixer</dt><dd> Giulio Pons <a href="http://www.barattalo.it">barattalo.it</a></dd> |
|||
</dl> |
|||
<h2><?php echo t('Ressources'); ?></h2>
|
|||
<dl> |
|||
<dt>Icons</dt><dd>Famfamfam <a href="http://www.famfamfam.com/">www.famfamfam.com</a> under CC BY 3.0</dd> |
|||
<dt></dt><dd>Icomoon <a href="http://keyamoon.com/">by Keyamoon</a> under CC BY 3.0</dd> |
|||
</dl> |
|||
</div> |
|||
<?php |
|||
} |
|||
} |
@ -1,466 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file Account.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief The account creation widget. |
|||
* |
|||
* @author Timothée Jaussoin <edhelas@gmail.com> |
|||
* |
|||
* @version 1.0 |
|||
* @date 25 November 2011 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class Account extends WidgetBase { |
|||
|
|||
function WidgetLoad() |
|||
{ |
|||
$this->addcss('account.css'); |
|||
$this->addjs('account.js'); |
|||
} |
|||
|
|||
function ajaxDiscoverServer($ndd) { |
|||
if($ndd['ndd'] == '') { |
|||
RPC::call('movim_reload', BASE_URI."index.php?q=account&err=datamissing"); |
|||
RPC::commit(); |
|||
exit; |
|||
} |
|||
|
|||
|
|||
try { |
|||
$dns = dns_get_record('_xmpp-client._tcp.'.$ndd['ndd']); |
|||
|
|||
if(isset($dns[0]['target']) && $dns[0]['target'] != null) |
|||
$domain = $dns[0]['target']; |
|||
|
|||
$f = fsockopen($domain, 5222, $errno, $errstr, 10); |
|||
|
|||
if(!$f) { |
|||
RPC::call('movim_reload', BASE_URI."index.php?q=account&err=xmppconnect"); |
|||
RPC::commit(); |
|||
exit; |
|||
} |
|||
|
|||
$stream = simplexml_load_string('<?xml version="1.0"?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" version="1.0"><iq type="get" id="reg1"><query xmlns="jabber:iq:register"/></iq></stream:stream>'); |
|||
$stream->addAttribute('to', $ndd['ndd']); |
|||
fwrite($f, $stream->asXML()); |
|||
|
|||
unset($stream); |
|||
|
|||
$response = stream_get_contents($f); |
|||
|
|||
if(!$response) { |
|||
RPC::call('movim_reload', BASE_URI."index.php?q=account&err=xmppcomm"); |
|||
RPC::commit(); |
|||
exit; |
|||
} |
|||
|
|||
fclose($f); unset($f); |
|||
|
|||
$response = simplexml_load_string($response); |
|||
|
|||
$id = (string)$response->attributes()->id; |
|||
|
|||
$elements = (array)$response->iq->query; |
|||
|
|||
if(!empty($elements)) { |
|||
$html .= ' |
|||
<form name="data"> |
|||
<fieldset> |
|||
<legend>'.t('Step 2 - Fill in your informations').'</legend><br /><br /><br />'; |
|||
|
|||
if($response->iq->query->instructions && $response->iq->query->x) { |
|||
$instr = ' |
|||
<div class="element simple large"> |
|||
<label>'.(string)$response->iq->query->instructions.'</label>'; |
|||
if($response->iq->query->x->url) |
|||
$instr .= ' |
|||
<a href="'.(string)$response->iq->query->x->url.'" target="_blank">'. |
|||
(string)$response->iq->query->x->url.' |
|||
</a>'; |
|||
|
|||
$instr .= ' |
|||
</div>'; |
|||
|
|||
} |
|||
|
|||
$form = new XMPPtoForm(); |
|||
if(!empty($response->iq->query->x)){ |
|||
$formh .= $form->getHTML($response->iq->query->x->asXML()); |
|||
} |
|||
else{/*no <x> element in the XML*/ |
|||
$formh .= $form->getHTML($response->iq->query->asXML()); |
|||
} |
|||
|
|||
if($formh == '') |
|||
$html .= $instr; |
|||
else |
|||
$html .= $formh; |
|||
|
|||
$html .= ' |
|||
<input |
|||
type="hidden" |
|||
value="'.$domain.'" |
|||
name="ndd" |
|||
id="ndd" |
|||
/> |
|||
'; |
|||
|
|||
$html .= ' |
|||
<input |
|||
type="hidden" |
|||
value="'.$ndd['ndd'].'" |
|||
name="to" |
|||
id="to" |
|||
/> |
|||
'; |
|||
|
|||
$html .= ' |
|||
<input |
|||
type="hidden" |
|||
value="'.$id.'" |
|||
name="id" |
|||
id="id" |
|||
/> |
|||
'; |
|||
|
|||
if(isset($elements['data'])) { |
|||
$html .= '<img src="data:image/jpg;base64,'.$elements['data'].'"/>'; |
|||
} |
|||
|
|||
$submit = $this->genCallAjax('ajaxSubmitData', "movim_parse_form('data')"); |
|||
|
|||
$html .= ' |
|||
<a |
|||
class="button icon yes" |
|||
style="float: right;" |
|||
onclick="'.$submit.'" |
|||
> |
|||
'.t('Validate').' |
|||
</a>'; |
|||
|
|||
$html .= ' |
|||
</fieldset> |
|||
</form>'; |
|||
|
|||
RPC::call('movim_fill', 'fillform', $html); |
|||
RPC::commit(); |
|||
|
|||
} |
|||
else { |
|||
$html = ' |
|||
<div class="message warning"> |
|||
'.t('No account creation form founded on the server').' |
|||
</div>'; |
|||
|
|||
RPC::call('movim_fill', 'fillform', $html); |
|||
RPC::commit(); |
|||
} |
|||
|
|||
} catch(Exception $e) { |
|||
header(sprintf('HTTP/1.1 %d %s', $e->getCode(), $e->getMessage())); |
|||
header('Content-Type: text/plain; charset=utf-8'); |
|||
echo $e->getMessage(),"\n"; |
|||
} |
|||
} |
|||
|
|||
function ajaxSubmitData($datas) { |
|||
|
|||
define(XMPP_HOST, $datas['to']); |
|||
define(XMPP_CONN, $datas['ndd']); |
|||
define(XMPP_PORT, 5222); |
|||
|
|||
try { |
|||
// We try to connect to the XMPP Server
|
|||
$f = fsockopen(XMPP_CONN, XMPP_PORT, $errno, $errstr, 10); |
|||
|
|||
if(!$f) { |
|||
RPC::call('movim_reload', BASE_URI."index.php?q=account&err=xmppconnect"); |
|||
RPC::commit(); |
|||
exit; |
|||
} |
|||
|
|||
// We create the XML Stanza
|
|||
$stream = simplexml_load_string('<?xml version="1.0"?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" version="1.0"><iq id="register" type="set"><query xmlns="jabber:iq:register"></query></iq></stream:stream>'); |
|||
|
|||
$stream->addAttribute('to', XMPP_HOST); |
|||
|
|||
$xmpp = new FormtoXMPP(); |
|||
$stream = $xmpp->getXMPP($stream->asXML(), $datas); |
|||
|
|||
fwrite($f, $stream->asXML()); |
|||
unset($stream); |
|||
|
|||
$response = stream_get_contents($f); |
|||
|
|||
if(!$response) { |
|||
RPC::call('movim_reload', BASE_URI."index.php?q=account&err=xmppcomm"); |
|||
RPC::commit(); |
|||
exit; |
|||
} |
|||
|
|||
fclose($f); unset($f); |
|||
|
|||
$response = simplexml_load_string($response); |
|||
|
|||
if(!$response) throw new Exception('The XMPP server sent an invalid response', 500); |
|||
|
|||
if($stream_error = $response->xpath('/stream:stream/stream:error')) { |
|||
list($stream_error) = $stream_error; |
|||
list($cond) = $stream_error->children(); |
|||
|
|||
throw new Exception($stream_error->text ? $stream_error->text : $cond->getName(), 500); |
|||
} |
|||
|
|||
$iq = $response->iq; |
|||
|
|||
if($iq->error) { |
|||
list($cond) = $iq->error->children(); |
|||
if($cond->getName() == 'conflict') { |
|||
RPC::call('movim_reload', BASE_URI."index.php?q=account&err=userconflict"); |
|||
RPC::commit(); |
|||
exit; |
|||
} |
|||
throw new Exception($iq->error->text ? $iq->error->text : $cond->getName(), 400); |
|||
} |
|||
|
|||
if($iq = $response->iq and $iq->attributes()->type == 'result') { |
|||
RPC::call('movim_reload', BASE_URI."index.php?q=login&err=acccreated"); |
|||
RPC::commit(); |
|||
exit; |
|||
} else { |
|||
RPC::call('movim_reload', BASE_URI."index.php?q=account&err=unknown"); |
|||
RPC::commit(); |
|||
exit; |
|||
} |
|||
} catch(Exception $e) { |
|||
header(sprintf('HTTP/1.1 %d %s', $e->getCode(), $e->getMessage())); |
|||
header('Content-Type: text/plain; charset=utf-8'); |
|||
echo $e->getMessage(),"\n"; |
|||
} |
|||
} |
|||
|
|||
function printServerList() { |
|||
$file = dirname(__FILE__).DIRECTORY_SEPARATOR.'server-vcards.xml'; |
|||
|
|||
$html = ''; |
|||
|
|||
if(file_exists($file)) { |
|||
$vcards = simplexml_load_file($file); |
|||
|
|||
$html .= ' |
|||
<div class="clear"></div> |
|||
<table id="list"> |
|||
<thead> |
|||
<tr> |
|||
<td> |
|||
'.t('Name').' |
|||
</td> |
|||
<td> |
|||
'.t('Description').' |
|||
</td> |
|||
<td> |
|||
'.t('URL').' |
|||
</td> |
|||
<td> |
|||
'.t('Software').' |
|||
</td> |
|||
<td> |
|||
</td> |
|||
</tr> |
|||
</thead> |
|||
<tbody>'; |
|||
|
|||
$markers = array(); |
|||
foreach($vcards as $vcard) { |
|||
$name = (string)$vcard->fn->text; |
|||
$html .=' |
|||
<tr onclick="selectServer(\''.$name.'\');"> |
|||
<td> |
|||
<a href="#nddlink">'.$name.'</a> |
|||
</td> |
|||
<td> |
|||
'.(string)$vcard->note->text.' |
|||
</td> |
|||
<td> |
|||
<a target="_blank" href="'.(string)$vcard->url->uri.'"> |
|||
'.(string)$vcard->url->uri.' |
|||
</a> |
|||
</td> |
|||
<td> |
|||
'.(string)$vcard->name.' |
|||
</td> |
|||
<td> |
|||
<img |
|||
title="'.(string)$vcard->adr->country.'" |
|||
alt="'.(string)$vcard->adr->country.'" |
|||
src="'.BASE_URI.'themes/movim/img/flags/'.strtolower((string)$vcard->adr->country).'.png"/> |
|||
</td> |
|||
</tr> |
|||
'; |
|||
$coord = explode("geo:", $vcard->geo->uri); |
|||
if(isset($coord[1])){ |
|||
$split = explode(",", $coord[1]); |
|||
$newkey = round(floatval($split[0]),1).",".round(floatval($split[1]),1); |
|||
if(!isset($markers[$newkey])){ |
|||
$markers[$newkey] = array($name); |
|||
} |
|||
else{ |
|||
array_push($markers[$newkey], $name); |
|||
} |
|||
} |
|||
} |
|||
|
|||
$html .= ' |
|||
</tbody> |
|||
</table>'; |
|||
|
|||
$javascript = '<script type="text/javascript"> |
|||
var map = L.map("map").setView([40,0], 2); |
|||
|
|||
L.tileLayer("http://tile.openstreetmap.org/{z}/{x}/{y}.png", { |
|||
attribution: "Map data © <a href=\"http://openstreetmap.org\">OpenStreetMap</a> contributors, <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">CC-BY-SA</a>, Mapnik ©", |
|||
maxZoom: 18 |
|||
}).addTo(map);'; |
|||
|
|||
$id = 0; |
|||
|
|||
foreach($markers as $coord => $arrayOfNames){ |
|||
$javascript .= "
|
|||
var marker".$id." = L.marker([".$coord."]).addTo(map); |
|||
marker".$id.".bindPopup('";
|
|||
foreach($arrayOfNames as $name){ |
|||
$action = 'selectServer("'.$name.'");'; |
|||
$javascript .= "<span onclick=\'".$action."\' ><a href=\'#nddlink\'>".$name."</a></span><br />"; |
|||
} |
|||
$javascript .= "');
|
|||
";
|
|||
$id++; |
|||
} |
|||
|
|||
$javascript .= '</script>'; |
|||
} |
|||
|
|||
return $javascript.$html; |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
switch ($_GET['err']) { |
|||
case 'datamissing': |
|||
$warning = ' |
|||
<div class="message error"> |
|||
'.t('Some data are missing !').' |
|||
</div> '; |
|||
break; |
|||
case 'jiderror': |
|||
$warning = ' |
|||
<div class="message error"> |
|||
'.t('Wrong ID').' |
|||
</div> '; |
|||
break; |
|||
case 'passworddiff': |
|||
$warning = ' |
|||
<div class="message error"> |
|||
'.t('You entered different passwords').' |
|||
</div> '; |
|||
break; |
|||
case 'nameerr': |
|||
$warning = ' |
|||
<div class="message error"> |
|||
'.t('Invalid name').' |
|||
</div> '; |
|||
break; |
|||
case 'userconflict': |
|||
$warning = ' |
|||
<div class="message error"> |
|||
'.t('Username already taken').' |
|||
</div> '; |
|||
break; |
|||
case 'xmppconnect': |
|||
$warning = ' |
|||
<div class="message error"> |
|||
'.t('Could not connect to the XMPP server').' |
|||
</div> '; |
|||
break; |
|||
case 'xmppcomm': |
|||
$warning = ' |
|||
<div class="message error"> |
|||
'.t('Could not communicate with the XMPP server').' |
|||
</div> '; |
|||
break; |
|||
case 'unknown': |
|||
$warning = ' |
|||
<div class="message error"> |
|||
'.t('Unknown error').' |
|||
</div> '; |
|||
break; |
|||
} |
|||
|
|||
$submit = $this->genCallAjax('ajaxDiscoverServer', "movim_parse_form('account')"); |
|||
?>
|
|||
<div id="main"> |
|||
<div id="left"> |
|||
<?php echo $warning; ?>
|
|||
</div> |
|||
<div id="center"> |
|||
<h1><?php echo t('Create a new account'); ?></h1>
|
|||
<div style="margin: 15px 20px;"> |
|||
<p> |
|||
<?php echo t('Movim is a decentralized social network, before creating a new account you need to choose a server to register.'); ?>
|
|||
<?php echo t('Keep in mind that this server will handle all your personnal data.'); ?>
|
|||
</p> |
|||
<br /> |
|||
<form name="account"> |
|||
<fieldset> |
|||
<legend><?php echo t('Step 1 - Search the server'); ?></legend>
|
|||
<div class="clear"></div> |
|||
<p> |
|||
<?php echo t('You can%s enter your server domain name%s. ', '<a href="#nddlink">', '</a>'); |
|||
echo t('Or you can choose a server from this list.'); ?>
|
|||
</p> |
|||
<br /> |
|||
|
|||
<div style="height: 300px;" id="map"></div> |
|||
|
|||
<br /> |
|||
<?php echo $this->printServerList(); ?>
|
|||
|
|||
<br /> |
|||
<div class="element"> |
|||
<label for="ndd"><?php echo t("Server"); ?></label>
|
|||
<input |
|||
pattern="^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$" |
|||
placeholder="<?php echo t("Enter the server domain (ex: movim.eu)"); ?>" |
|||
name="ndd" |
|||
id="ndd" |
|||
/> |
|||
</div> |
|||
|
|||
<div class="clear"></div> |
|||
|
|||
<a |
|||
name="nddlink" |
|||
class="button icon next" |
|||
style="float: right;" |
|||
onclick="<?php echo $submit;?>; document.getElementById('fillform').innerHTML ='<?php echo t('Searching...');?>'" |
|||
> |
|||
<?php echo t('Search'); ?>
|
|||
</a> |
|||
</form> |
|||
|
|||
<div class="clear"></div> |
|||
<div id="fillform"></div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<?php |
|||
} |
|||
} |
@ -1,10 +0,0 @@ |
|||
#nav .menu li:last-child { |
|||
background-image: none; |
|||
padding-right: 0px; |
|||
position: relative; |
|||
} |
|||
|
|||
table#list { |
|||
border-spacing:0; |
|||
border-collapse:collapse; |
|||
} |
@ -1,3 +0,0 @@ |
|||
function selectServer(ndd) { |
|||
document.querySelector('input[name="ndd"]').value = ndd; |
|||
} |
@ -1,246 +0,0 @@ |
|||
<vcards> |
|||
<vcard> |
|||
<fn> |
|||
<text>movim.eu</text> |
|||
</fn> |
|||
<kind> |
|||
<text>application</text> |
|||
</kind> |
|||
<url> |
|||
<uri>http://movim.eu/</uri> |
|||
</url> |
|||
<note> |
|||
<text>The Movim XMPP service.</text> |
|||
</note> |
|||
<registration xmlns="urn:xmpp:vcard:registration:1"> |
|||
<uri>xmpp:movim.eu</uri> |
|||
</registration> |
|||
<bday> |
|||
<date>2013</date> |
|||
</bday> |
|||
<adr> |
|||
<country>IE</country> |
|||
</adr> |
|||
<ca xmlns="urn:xmpp:vcard:ca:0"> |
|||
<name>CAcert</name> |
|||
<uri>http://www.cacert.org/</uri> |
|||
</ca> |
|||
<name xmlns="jabber:iq:version">Metronome</name> |
|||
<impp> |
|||
<uri>xmpp:edhelas@movim.eu</uri> |
|||
</impp> |
|||
<geo> |
|||
<uri>geo:53.06,-7.29</uri> |
|||
</geo> |
|||
</vcard> |
|||
<vcard> |
|||
<fn> |
|||
<text>jappix.com</text> |
|||
</fn> |
|||
<kind> |
|||
<text>application</text> |
|||
</kind> |
|||
<url> |
|||
<uri>http://jappix.com/</uri> |
|||
</url> |
|||
<note> |
|||
<text>The Jappix XMPP service.</text> |
|||
</note> |
|||
<registration xmlns="urn:xmpp:vcard:registration:1"> |
|||
<uri>xmpp:jappix.com</uri> |
|||
</registration> |
|||
<bday> |
|||
<date>2010</date> |
|||
</bday> |
|||
<adr> |
|||
<country>FR</country> |
|||
</adr> |
|||
<ca xmlns="urn:xmpp:vcard:ca:0"> |
|||
<name>CAcert</name> |
|||
<uri>http://www.cacert.org/</uri> |
|||
</ca> |
|||
<name xmlns="jabber:iq:version">Metronome</name> |
|||
<impp> |
|||
<uri>xmpp:vanaryon@jappix.com</uri> |
|||
</impp> |
|||
<geo> |
|||
<uri>geo:50.67,3.19</uri> |
|||
</geo> |
|||
</vcard> |
|||
<vcard> |
|||
<fn> |
|||
<text>tigase.im</text> |
|||
</fn> |
|||
<kind> |
|||
<text>application</text> |
|||
</kind> |
|||
<url> |
|||
<uri>http://www.tigase.im/</uri> |
|||
</url> |
|||
<note> |
|||
<text>The public Tigase service. - Also supports IPv6!</text> |
|||
</note> |
|||
<registration xmlns="urn:xmpp:vcard:registration:1"> |
|||
<uri>xmpp:tigase.im</uri> |
|||
</registration> |
|||
<bday> |
|||
<date>2010</date> |
|||
</bday> |
|||
<adr> |
|||
<country>EU</country> |
|||
</adr> |
|||
<ca xmlns="urn:xmpp:vcard:ca:0"> |
|||
<name>StartSSL</name> |
|||
<uri>http://www.startssl.com/</uri> |
|||
</ca> |
|||
<name xmlns="jabber:iq:version">Tigase</name> |
|||
<impp> |
|||
<uri>xmpp:admin@im.flosoft.biz</uri> |
|||
</impp> |
|||
<geo> |
|||
<uri>geo:50.69,3.19</uri> |
|||
</geo> |
|||
</vcard> |
|||
<vcard> |
|||
<fn> |
|||
<text>lightwitch.org</text> |
|||
</fn> |
|||
<kind> |
|||
<text>application</text> |
|||
</kind> |
|||
<url> |
|||
<uri>http://www.lightwitch.org/</uri> |
|||
</url> |
|||
<note> |
|||
<text>LW.Org XMPP Public Service.</text> |
|||
</note> |
|||
<registration> |
|||
<uri>xmpp:lightwitch.org</uri> |
|||
</registration> |
|||
<bday> |
|||
<date>2009</date> |
|||
</bday> |
|||
<adr> |
|||
<country>USA</country> |
|||
</adr> |
|||
<ca> |
|||
<name>StartSSL</name> |
|||
<uri>http://www.startssl.com/</uri> |
|||
</ca> |
|||
<name>Metronome</name> |
|||
<impp> |
|||
<uri>xmpp:maranda@lightwitch.org</uri> |
|||
</impp> |
|||
<geo> |
|||
<uri>geo:40.73,-74.17</uri> |
|||
</geo> |
|||
</vcard> |
|||
<vcard> |
|||
<fn> |
|||
<text>jabber.me</text> |
|||
</fn> |
|||
<kind> |
|||
<text>application</text> |
|||
</kind> |
|||
<url> |
|||
<uri>http://www.jabber.me/</uri> |
|||
</url> |
|||
<note> |
|||
<text>Just Jabber Me! - Also supports IPv6!</text> |
|||
</note> |
|||
<registration xmlns="urn:xmpp:vcard:registration:1"> |
|||
<uri>xmpp:jabber.me</uri> |
|||
</registration> |
|||
<bday> |
|||
<date>2010</date> |
|||
</bday> |
|||
<adr> |
|||
<country>EU</country> |
|||
</adr> |
|||
<ca xmlns="urn:xmpp:vcard:ca:0"> |
|||
<name>StartSSL</name> |
|||
<uri>http://www.startssl.com/</uri> |
|||
</ca> |
|||
<name xmlns="jabber:iq:version">Tigase</name> |
|||
<impp> |
|||
<uri>xmpp:admin@im.flosoft.biz</uri> |
|||
</impp> |
|||
<geo> |
|||
<uri>geo:50.69,3.19</uri> |
|||
</geo> |
|||
</vcard> |
|||
<vcard> |
|||
<fn> |
|||
<text>sure.im</text> |
|||
</fn> |
|||
<kind> |
|||
<text>application</text> |
|||
</kind> |
|||
<url> |
|||
<uri>http://www.sure.im/</uri> |
|||
</url> |
|||
<note> |
|||
<text>Just Sure Im! - Also supports IPv6!</text> |
|||
</note> |
|||
<registration xmlns="urn:xmpp:vcard:registration:1"> |
|||
<uri>xmpp:sure.im</uri> |
|||
</registration> |
|||
<bday> |
|||
<date>2010</date> |
|||
</bday> |
|||
<adr> |
|||
<country>EU</country> |
|||
</adr> |
|||
<ca xmlns="urn:xmpp:vcard:ca:0"> |
|||
<name>StartSSL</name> |
|||
<uri>http://www.startssl.com/</uri> |
|||
</ca> |
|||
<name xmlns="jabber:iq:version">Tigase</name> |
|||
<impp> |
|||
<uri>xmpp:admin@im.flosoft.biz</uri> |
|||
</impp> |
|||
<geo> |
|||
<uri>geo:50.69,3.19</uri> |
|||
</geo> |
|||
</vcard> |
|||
<vcard> |
|||
<fn> |
|||
<text>jabbim.cz</text> |
|||
</fn> |
|||
<kind> |
|||
<text>application</text> |
|||
</kind> |
|||
<url> |
|||
<uri>http://www.jabbim.cz/</uri> |
|||
</url> |
|||
<note> |
|||
<text>Stable ejabberd clustered server with good support and many transports and services: ICQ, AIM, MSN, Facebook, Weather, Yahoo, Notes, bots, MUCs, proxy65, STUN server for voice support, and more</text> |
|||
</note> |
|||
<registration xmlns="urn:xmpp:vcard:registration:1"> |
|||
<uri>xmpp:jabbim.cz</uri> |
|||
</registration> |
|||
<bday> |
|||
<date>2005</date> |
|||
</bday> |
|||
<adr> |
|||
<country>CZ</country> |
|||
</adr> |
|||
<ca xmlns="urn:xmpp:vcard:ca:0"> |
|||
<name>CAcert</name> |
|||
<uri>http://www.cacert.org/</uri> |
|||
</ca> |
|||
<name xmlns="jabber:iq:version">ejabberd</name> |
|||
<impp> |
|||
<uri>xmpp:pinky@njs.netlab.cz</uri> |
|||
</impp> |
|||
</vcard> |
|||
<vcard><fn><text>njs.netlab.cz</text></fn><kind><text>application</text></kind><url><uri>http://www.jabbim.cz/</uri></url><note><text>Public service hosted by jabbim.cz</text></note><registration xmlns="urn:xmpp:vcard:registration:1"><uri>xmpp:njs.netlab.cz</uri></registration><bday><date>2001</date></bday><adr><country>CZ</country></adr><ca xmlns="urn:xmpp:vcard:ca:0"><name>CAcert</name><uri>http://www.cacert.org/</uri></ca><name xmlns="jabber:iq:version">ejabberd</name><impp><uri>xmpp:pinky@njs.netlab.cz</uri></impp></vcard> |
|||
<vcard><fn><text>jabbim.pl</text></fn><kind><text>application</text></kind><url><uri>http://www.jabbim.cz/</uri></url><note><text>Public service hosted by jabbim.cz</text></note><registration xmlns="urn:xmpp:vcard:registration:1"><uri>xmpp:jabbim.pl</uri></registration><bday><date>2005</date></bday><adr><country>CZ</country></adr><ca xmlns="urn:xmpp:vcard:ca:0"><name>CAcert</name><uri>http://www.cacert.org/</uri></ca><name xmlns="jabber:iq:version">ejabberd</name><impp><uri>xmpp:pinky@njs.netlab.cz</uri></impp></vcard> |
|||
<vcard><fn><text>jabbim.sk</text></fn><kind><text>application</text></kind><url><uri>http://www.jabbim.cz/</uri></url><note><text>Public service hosted by jabbim.cz</text></note><registration xmlns="urn:xmpp:vcard:registration:1"><uri>xmpp:jabbim.sk</uri></registration><bday><date>2005</date></bday><adr><country>CZ</country></adr><ca xmlns="urn:xmpp:vcard:ca:0"><name>CAcert</name><uri>http://www.cacert.org/</uri></ca><name xmlns="jabber:iq:version">ejabberd</name><impp><uri>xmpp:pinky@njs.netlab.cz</uri></impp></vcard> |
|||
<vcard><fn><text>jabbim.com</text></fn><kind><text>application</text></kind><url><uri>http://www.jabbim.cz/</uri></url><note><text>Public service hosted by jabbim.cz</text></note><registration xmlns="urn:xmpp:vcard:registration:1"><uri>xmpp:jabbim.com</uri></registration><bday><date>2005</date></bday><adr><country>CZ</country></adr><ca xmlns="urn:xmpp:vcard:ca:0"><name>CAcert</name><uri>http://www.cacert.org/</uri></ca><name xmlns="jabber:iq:version">ejabberd</name><impp><uri>xmpp:pinky@njs.netlab.cz</uri></impp></vcard> |
|||
<vcard><fn><text>forumanalogue.fr</text></fn><kind><text>application</text></kind><url><uri>http://www.forumanalogue.fr/</uri></url><note><text>A public self-hosted Jabber server located in France.</text></note><registration xmlns="urn:xmpp:vcard:registration:1"><uri>xmpp:forumanalogue.fr</uri></registration><bday><date>2010</date></bday><adr><country>FR</country></adr><ca xmlns="urn:xmpp:vcard:ca:0"><name>StartSSL</name><uri>http://www.startssl.com/</uri></ca><name xmlns="jabber:iq:version">Openfire</name><impp><uri>xmpp:clement@forumanalogue.fr</uri></impp><geo><uri>geo:45.8,4.84</uri></geo><lang><parameters><pref>1</pref></parameters><language-tag>fr</language-tag></lang></vcard> |
|||
|
|||
</vcards> |
|||
|
|||
|
|||
|
@ -1,484 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file Admin.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief The administration widget. |
|||
* |
|||
* @author Timothée Jaussoin <edhelas@gmail.com> |
|||
* |
|||
* @version 1.0 |
|||
* @date 25 November 2011 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class Admin extends WidgetBase { |
|||
private $_conf; |
|||
|
|||
function WidgetLoad() |
|||
{ |
|||
$this->_conf = Conf::getServerConf(); |
|||
} |
|||
|
|||
private function isValid($what) |
|||
{ |
|||
if($what) |
|||
return "message success"; |
|||
else |
|||
return "message error"; |
|||
} |
|||
|
|||
private function testDir($dir){ |
|||
return (file_exists($dir) && is_dir($dir) && is_writable($dir)); |
|||
} |
|||
|
|||
private function testFile($file) { |
|||
return (file_exists($file) && is_writable($file)); |
|||
} |
|||
|
|||
/* |
|||
* Create the dirs |
|||
*/ |
|||
function createDirs(){ |
|||
if(!file_exists(BASE_PATH.'cache') && !@mkdir(BASE_PATH.'cache')) { |
|||
echo t("Couldn't create directory '%s'.", 'cache'); |
|||
return false; |
|||
} |
|||
|
|||
if(!file_exists(BASE_PATH.'log') && !@mkdir(BASE_PATH.'log')) { |
|||
echo t("Couldn't create directory '%s'.", 'log'); |
|||
return false; |
|||
} |
|||
|
|||
if(!file_exists(BASE_PATH.'config') && !@mkdir(BASE_PATH.'config')) { |
|||
echo t("Couldn't create directory '%s'.", 'config'); |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
private function listThemes() |
|||
{ |
|||
$dir = opendir(BASE_PATH.'themes'); |
|||
$themes = array(); |
|||
|
|||
while($theme = readdir($dir)) { |
|||
if(preg_match('/^\.+$/', $theme) |
|||
|| !is_dir(BASE_PATH.'themes/'.$theme)) { |
|||
continue; |
|||
} |
|||
|
|||
$themes[$theme] = $theme; |
|||
} |
|||
|
|||
return $themes; |
|||
} |
|||
|
|||
private function listLangs() |
|||
{ |
|||
$dir = opendir(BASE_PATH.'i18n'); |
|||
$langs = array('en' => 'English'); |
|||
$languages = get_lang_list(); |
|||
|
|||
while($lang = readdir($dir)) { |
|||
if(!preg_match('/\.po$/', $lang)) { |
|||
continue; |
|||
} |
|||
|
|||
$lang = substr($lang, 0, strlen($lang) - 3); |
|||
$langs[$lang] = $languages[$lang]; |
|||
} |
|||
|
|||
return $langs; |
|||
} |
|||
|
|||
function testBosh($url) { |
|||
$ch = curl_init($url); |
|||
|
|||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
|||
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); |
|||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); |
|||
|
|||
// Fire !
|
|||
$rs = array(); |
|||
|
|||
$rs['content'] = curl_exec($ch); |
|||
$rs['errno'] = curl_errno($ch); |
|||
$rs['errmsg'] = curl_error($ch); |
|||
$rs['header'] = curl_getinfo($ch); |
|||
|
|||
if($rs['content'] != false && $rs['content'] != '') { |
|||
return true; |
|||
} |
|||
|
|||
elseif($rs['errno'] != 0 || $rs['content'] == '') { |
|||
return false; |
|||
} |
|||
curl_close($ch); |
|||
} |
|||
|
|||
public function ajaxAdminSubmit($form) |
|||
{ |
|||
unset($form['']); |
|||
|
|||
$empty = false; |
|||
|
|||
if($form['pass'] == '' || !isset($form['pass'])) { |
|||
$form['pass'] = $this->_conf['pass']; |
|||
$form['repass'] = $this->_conf['pass']; |
|||
|
|||
$empty = true; |
|||
} |
|||
|
|||
if($form['pass'] == $form['repass']) { |
|||
unset($form['repass']); |
|||
|
|||
if(!$empty) |
|||
$form['pass'] = sha1($form['pass']); |
|||
|
|||
foreach($this->_conf as $key => $value) { |
|||
if(isset($form[$key])) |
|||
$this->_conf[$key] = $form[$key]; |
|||
} |
|||
|
|||
Conf::saveConfFile($this->_conf); |
|||
} |
|||
} |
|||
|
|||
public function ajaxRecreateDatabase() |
|||
{ |
|||
$pd = new \modl\PostnDAO(); |
|||
$pd->create(); |
|||
|
|||
$nd = new \modl\NodeDAO(); |
|||
$nd->create(); |
|||
|
|||
$cd = new \modl\ContactDAO(); |
|||
$cd->create(); |
|||
|
|||
$cad = new \modl\CapsDAO(); |
|||
$cad->create(); |
|||
|
|||
$prd = new \modl\PresenceDAO(); |
|||
$prd->create(); |
|||
|
|||
$rd = new \modl\RosterLinkDAO(); |
|||
$rd->create(); |
|||
|
|||
$sd = new \modl\SessionDAO(); |
|||
$sd->create(); |
|||
|
|||
$cd = new \modl\CacheDAO(); |
|||
$cd->create(); |
|||
|
|||
$md = new \modl\MessageDAO(); |
|||
$md->create(); |
|||
|
|||
$cd = new \modl\SubscriptionDAO(); |
|||
$cd->create(); |
|||
|
|||
$pr = new \modl\PrivacyDAO(); |
|||
$pr->create(); |
|||
} |
|||
|
|||
private function prepareAdmin() |
|||
{ |
|||
$submit = $this->genCallAjax('ajaxAdminSubmit', "movim_parse_form('admin')") |
|||
."this.className='button icon loading'; setTimeout(function() {location.reload(false)}, 2000);"; |
|||
|
|||
if($this->testDir(BASE_PATH)) |
|||
$this->createDirs(); |
|||
|
|||
$html = ' |
|||
<form name="admin" id="adminform">'; |
|||
|
|||
/*$html .= ' |
|||
<fieldset> |
|||
<legend>'.t('General Informations').'</legend>'; |
|||
|
|||
$file = BASE_PATH.'VERSION'; |
|||
if($f = fopen($file, 'r')){ |
|||
$html .= ' |
|||
<div class="element simple"> |
|||
<label for="fn">'.t('Version').'</label> |
|||
<span>'.trim(fgets($f)).'</span> |
|||
</div>'; |
|||
} |
|||
|
|||
$html .= ' |
|||
</fieldset>';*/ |
|||
|
|||
$html .= ' |
|||
<fieldset> |
|||
<legend>'.t("Compatibility Check").'</legend> |
|||
<div class="clear"></div>'; |
|||
|
|||
$html .= |
|||
'<p>'. |
|||
t('Movim requires certain external components. Please install them before you can succeed:'). |
|||
'</p><br />'; |
|||
|
|||
$html .= ' |
|||
<div class="'.$this->isValid((version_compare(PHP_VERSION, '5.3.0') >= 0)).'"> |
|||
'.t('Your PHP-Version: %s <br>Required: 5.3.0', PHP_VERSION).' |
|||
</div> |
|||
<div class="'.$this->isValid(extension_loaded('curl')).'"> |
|||
'.t('CURL-Library').' |
|||
</div> |
|||
<div class="'.$this->isValid(extension_loaded('gd')).'"> |
|||
'.t('GD').' |
|||
</div> |
|||
<div class="'.$this->isValid(extension_loaded('SimpleXml')).'"> |
|||
'.t('SimpleXML').' |
|||
</div> |
|||
<div class="'.$this->isValid($this->testDir(BASE_PATH)).'"> |
|||
'.t('Read and write rights for the webserver in Movim\'s root directory').' |
|||
</div> |
|||
<div class="'.$this->isValid($_SERVER['HTTP_MOD_REWRITE']).'"> |
|||
'.t('URL Rewriting support').' |
|||
</div>'; |
|||
|
|||
$html .= ' |
|||
</fieldset>'; |
|||
|
|||
$html .= ' |
|||
<fieldset> |
|||
<legend>'.t('General Settings').'</legend> |
|||
<div class="element"> |
|||
<label for="movim" >'.t('Theme').'</label> |
|||
<div class="select"> |
|||
<select id="theme" name="theme">'; |
|||
|
|||
foreach($this->listThemes() as $key => $value) { |
|||
if((string)$this->_conf['theme'] == $key) |
|||
$sel = 'selected="selected"'; |
|||
else |
|||
$sel = ''; |
|||
|
|||
$html .= ' |
|||
<option value="'.$key.'" '.$sel.'>'.$value.'</option>'; |
|||
} |
|||
|
|||
$html .= ' </select> |
|||
</div> |
|||
</div>'; |
|||
|
|||
$html .= ' |
|||
<div class="element"> |
|||
<label for="da">'.t('Default language').'</label> |
|||
<div class="select"> |
|||
<select id="defLang" name="defLang">'; |
|||
|
|||
foreach($this->listLangs() as $key => $value) { |
|||
if((string)$this->_conf['defLang'] == $key) |
|||
$sel = 'selected="selected"'; |
|||
else |
|||
$sel = ''; |
|||
|
|||
$html .= ' |
|||
<option value="'.$key.'" '.$sel.'>'.$value.'</option>'; |
|||
} |
|||
|
|||
$html .= ' </select> |
|||
</div> |
|||
</div>'; |
|||
|
|||
$html .= ' |
|||
<div class="element"> |
|||
<label for="maxUsers">'.t('Maximum population').'</label> |
|||
<input type="text" name="maxUsers" id="maxUsers" value="'.$this->_conf['maxUsers'].'" /> |
|||
</div>'; |
|||
|
|||
$html .= ' |
|||
<div class="element"> |
|||
<label for="sizeLimit">'.t('User folder size limit (in bytes)').'</label> |
|||
<input type="text" name="sizeLimit" id="sizeLimit" value="'.$this->_conf['sizeLimit'].'" /> |
|||
</div>'; |
|||
|
|||
$logopts = array( |
|||
0 => t('empty'), |
|||
2 => t('terse'), |
|||
4 => t('normal'), |
|||
6 => t('talkative'), |
|||
7 => t('ultimate'), |
|||
); |
|||
|
|||
$default_log = 4; |
|||
|
|||
$html .= ' |
|||
<div class="element"> |
|||
<label for="7">'.t("Log verbosity").'</label> |
|||
<div class="select"> |
|||
<select id="logLevel" name="logLevel">'; |
|||
foreach($logopts as $lognum => $text) { |
|||
if($this->_conf['logLevel'] == $lognum) |
|||
$sel = 'selected="selected"'; |
|||
|
|||
$html .= ' |
|||
<option value="'.$lognum.'" '.$sel.'>'. |
|||
$text.' |
|||
</option>'; |
|||
} |
|||
$html .= ' </select> |
|||
</div> |
|||
</div>'; |
|||
|
|||
$html .= ' |
|||
<div class="clear"></div> |
|||
<a class="button icon submit" style="float: right;" onclick="'.$submit.'">'.t('Submit').'</a>'; |
|||
|
|||
$html .= ' |
|||
</fieldset>'; |
|||
|
|||
$html .= ' |
|||
<fieldset> |
|||
<legend>'.t("Database Settings").'</legend> |
|||
<div class="clear"></div>'; |
|||
|
|||
$md = new \modl\ModlDAO(); |
|||
if(isset($md->_dao->_error)) { |
|||
$html .= ' |
|||
<div class="message error">'. |
|||
t("Modl wasn't able to connect to the database").'<br /> |
|||
'.$md->_dao->_error.' |
|||
</div> |
|||
'; |
|||
} else { |
|||
$dbrecreate = $this->genCallAjax('ajaxRecreateDatabase'); |
|||
|
|||
$html .= ' |
|||
<div class="element"> |
|||
<label for="db">'.t('Recreate the database').'</label> |
|||
<a class="button icon yes" onclick="'.$dbrecreate.'">'.t('Recreate').'</a> |
|||
</div> |
|||
|
|||
<div class="message warning"> |
|||
'.t('This button will clear and recreate the Movim database.').' |
|||
</div> |
|||
'; |
|||
} |
|||
|
|||
$html .= ' |
|||
<div class="element large"> |
|||
<label for="db">'.t('Dabase String').'</label> |
|||
<input type="text" name="db" id="db" value="'.$this->_conf['db'].'" /> |
|||
</div>'; |
|||
|
|||
$html .= ' |
|||
<div class="clear"></div> |
|||
<a class="button icon submit" style="float: right;" onclick="'.$submit.'">'.t('Submit').'</a>'; |
|||
|
|||
$html .= ' |
|||
</fieldset>'; |
|||
|
|||
$html .= ' |
|||
<fieldset> |
|||
<legend>'.t("Bosh Configuration").'</legend> |
|||
<div class="clear"></div>'; |
|||
|
|||
$html .= '<p>'. |
|||
t("Enter here the BOSH-URL in the form: http(s)://domain:port/path.").' '. |
|||
t('If you enter an open BOSH-Server, you can connect to many XMPP-Servers.').' '. |
|||
t('If it is closed, you have to specify the corresponding Server on the next page.').' '. |
|||
t('If you are unsure about this config option visit the wiki'); |
|||
'</p>'; |
|||
|
|||
if(!$this->testBosh($this->_conf['boshUrl'])) { |
|||
$html .= ' |
|||
<div class="message error">'. |
|||
t('Your Bosh URL is not reachable').' |
|||
</div>'; |
|||
} |
|||
|
|||
$html .= ' |
|||
<div class="element"> |
|||
<label for="boshUrl">'.t("Bosh URL").'</label> |
|||
<input type="text" id="boshUrl" name="boshUrl" value="'.$this->_conf['boshUrl'].'"/> |
|||
</div>'; |
|||
|
|||
$html .= ' |
|||
<div class="clear"></div> |
|||
<a class="button icon submit" style="float: right;" onclick="'.$submit.'">'.t('Submit').'</a>'; |
|||
|
|||
$html .= ' |
|||
</fieldset>'; |
|||
|
|||
$html .= ' |
|||
<fieldset> |
|||
<legend>'.t("Whitelist - XMPP Server").'</legend> |
|||
<div class="clear"></div>'; |
|||
|
|||
$html .= '<p>'. |
|||
t("If you want to specify a list of authorized XMPP servers on your Movim pod and forbid the connection on all the others please put their domain name here, with comma (ex: movim.eu,jabber.fr)"). |
|||
'</p>'. |
|||
'<p>'. |
|||
t("Leave this field blank if you allow the access to all the XMPP accounts."). |
|||
'</p>'; |
|||
|
|||
$html .= ' |
|||
<div class="element large"> |
|||
<label for="xmppWhiteList">'.t("List of whitelisted XMPP servers").'</label> |
|||
<input type="text" name="xmppWhiteList" id="xmppWhiteList" value="'.$this->_conf['xmppWhiteList'].'" /> |
|||
</div>'; |
|||
|
|||
$html .= ' |
|||
<div class="clear"></div> |
|||
<a class="button icon submit" style="float: right;" onclick="'.$submit.'">'.t('Submit').'</a>'; |
|||
|
|||
$html .= ' |
|||
</fieldset>'; |
|||
|
|||
$html .= ' |
|||
<fieldset> |
|||
<legend>'.t("Administration Credential").'</legend>'; |
|||
|
|||
if($this->_conf['user'] == 'admin' && $this->_conf['pass'] == sha1('password')) { |
|||
$html .= ' |
|||
<div class="message error">'. |
|||
t('Change the default username/password').' |
|||
</div>'; |
|||
} |
|||
|
|||
$html .= ' |
|||
<div class="element" > |
|||
<label for="username">'.t("Username").'</label> |
|||
<input type="text" id="user" name="user" value="'.$this->_conf['user'].'"/> |
|||
</div> |
|||
<div class="clear"></div> |
|||
|
|||
<div class="element"> |
|||
<label for="pass">'.t("Password").'</label> |
|||
<input type="password" id="pass" name="pass" value=""/> |
|||
</div> |
|||
<div class="element"> |
|||
<label for="repass">'.t("Retype password").'</label> |
|||
<input type="password" id="repass" name="repass" value=""/> |
|||
</div> '; |
|||
|
|||
$html .= ' |
|||
<div class="clear"></div> |
|||
<a class="button icon submit" style="float: right;" onclick="'.$submit.'">'.t('Submit').'</a>'; |
|||
|
|||
$html .= ' |
|||
</fieldset>'; |
|||
|
|||
$html .= ' |
|||
</form>'; |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
?>
|
|||
<div id="admin" style="margin: 1.5em;"> |
|||
<?php echo $this->prepareAdmin(); ?>
|
|||
</div> |
|||
<?php |
|||
} |
|||
} |
@ -1,29 +0,0 @@ |
|||
<?php |
|||
|
|||
class Blog extends WidgetCommon { |
|||
function WidgetLoad() |
|||
{ |
|||
|
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
$from = $_GET['f']; |
|||
|
|||
$pd = new \modl\PostnDAO(); |
|||
$messages = $pd->getPublic($from); |
|||
|
|||
echo ' |
|||
<div class="posthead" style="border-top: 0px;"> |
|||
<a |
|||
class="button tiny icon feed merged left" |
|||
href="'.Route::urlize('feed',$from).'" |
|||
target="_blank" |
|||
> |
|||
'.t('Feed').' (Atom) |
|||
</a> |
|||
</div>'; |
|||
|
|||
echo $this->preparePosts($messages, true); |
|||
} |
|||
} |
@ -1,280 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file Wall.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief The configuration form |
|||
* |
|||
* @author Timothée Jaussoin <edhelas_at_gmail_dot_com> |
|||
* |
|||
* @version 1.0 |
|||
* @date 28 October 2010 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class Bookmark extends WidgetBase |
|||
{ |
|||
function WidgetLoad() |
|||
{ |
|||
$this->addcss('bookmark.css'); |
|||
$this->registerEvent('bookmark', 'onBookmark'); |
|||
$this->registerEvent('bookmarkerror', 'onBookmarkError'); |
|||
$this->registerEvent('groupsubscribed', 'onGroupSubscribed'); |
|||
$this->registerEvent('groupunsubscribed', 'onGroupUnsubscribed'); |
|||
} |
|||
|
|||
function onGroupSubscribed() |
|||
{ |
|||
$arr = Cache::c('bookmark'); |
|||
|
|||
$html = $this->prepareBookmark($arr); |
|||
RPC::call('movim_fill', 'bookmarks', $html); |
|||
RPC::call('setBookmark'); |
|||
} |
|||
|
|||
function onGroupUnsubscribed() |
|||
{ |
|||
$arr = Cache::c('bookmark'); |
|||
|
|||
$html = $this->prepareBookmark($arr); |
|||
RPC::call('movim_fill', 'bookmarks', $html); |
|||
RPC::call('setBookmark'); |
|||
} |
|||
|
|||
function onBookmark($arr) |
|||
{ |
|||
$i = 0; |
|||
foreach($arr as $b) { |
|||
if($b['type'] == 'subscription') { |
|||
$su = new \modl\Subscription(); |
|||
$su->jid = $this->user->getLogin(); |
|||
$su->server = $b['server']; |
|||
$su->node = $b['node']; |
|||
$su->subscription = 'subscribed'; |
|||
$su->subid = $b['subid']; |
|||
$su->timestamp = date('Y-m-d H:i:s', rand(1111111111, 8888888888)); |
|||
|
|||
$sd = new \modl\SubscriptionDAO(); |
|||
$sd->set($su); |
|||
|
|||
unset($arr[$i]); |
|||
} |
|||
$i++; |
|||
} |
|||
|
|||
Cache::c('bookmark', $arr); |
|||
$html = $this->prepareBookmark($arr); |
|||
RPC::call('movim_fill', 'bookmarks', $html); |
|||
Notification::appendNotification(t('Bookmarks updated'), 'info'); |
|||
} |
|||
|
|||
function onBookmarkError($error) |
|||
{ |
|||
Notification::appendNotification(t('An error occured : ').$error, 'error'); |
|||
} |
|||
|
|||
function ajaxGetBookmark() |
|||
{ |
|||
$b = new moxl\BookmarkGet(); |
|||
$b->request(); |
|||
} |
|||
|
|||
function ajaxSetBookmark($arr = null) |
|||
{ |
|||
if($arr == null || $arr == '') |
|||
$arr = Cache::c('bookmark'); |
|||
if($arr == null) |
|||
$arr = array(); |
|||
|
|||
$sd = new \modl\SubscriptionDAO(); |
|||
|
|||
if($sd != null) { |
|||
foreach($sd->getSubscribed() as $s) { |
|||
array_push($arr, |
|||
array( |
|||
'type' => 'subscription', |
|||
'server' => $s->server, |
|||
'title' => $s->title, |
|||
'subid' => $s->subid, |
|||
'node' => $s->node)); |
|||
} |
|||
} |
|||
|
|||
$b = new moxl\BookmarkSet(); |
|||
$b->setArr($arr) |
|||
->request(); |
|||
} |
|||
|
|||
function ajaxBookmarkAdd($form) |
|||
{ |
|||
if(!filter_var($form['url'], FILTER_VALIDATE_URL)) { |
|||
$html = '<div class="message error">'.t('Bad URL').'</div>' ; |
|||
RPC::call('movim_fill', 'bookmarkadderror', $html); |
|||
RPC::commit(); |
|||
} elseif(trim($form['name']) == '') { |
|||
$html = '<div class="message error">'.t('Empty name').'</div>' ; |
|||
RPC::call('movim_fill', 'bookmarkadderror', $html); |
|||
RPC::commit(); |
|||
} else { |
|||
|
|||
$bookmarks = Cache::c('bookmark'); |
|||
|
|||
if($bookmarks == null) |
|||
$bookmarks = array(); |
|||
|
|||
array_push($bookmarks, |
|||
array( |
|||
'type' => 'url', |
|||
'name' => $form['name'], |
|||
'url' => $form['url'])); |
|||
|
|||
$this->ajaxSetBookmark($bookmarks); |
|||
} |
|||
} |
|||
|
|||
function ajaxBookmarkUrlRemove($url) |
|||
{ |
|||
$arr = Cache::c('bookmark'); |
|||
foreach($arr as $key => $b) { |
|||
if($b['type'] == 'url' && $b['url'] == $url) |
|||
unset($arr[$key]); |
|||
} |
|||
|
|||
$b = new moxl\BookmarkSet(); |
|||
$b->setArr($arr) |
|||
->request(); |
|||
} |
|||
|
|||
function prepareBookmark($bookmarks) |
|||
{ |
|||
$html = ''; |
|||
$url = ''; |
|||
$conference = ''; |
|||
$subscription = ''; |
|||
|
|||
$sd = new \modl\SubscriptionDAO(); |
|||
|
|||
if($sd != null) { |
|||
|
|||
foreach($sd->getSubscribed() as $s) { |
|||
$subscription .= ' |
|||
<li> |
|||
<a href="'.Route::urlize('node', array($s->server, $s->node)).'">'. |
|||
$s->node.' ('.$s->server.') |
|||
</a> |
|||
</li>'; |
|||
} |
|||
} |
|||
|
|||
if($bookmarks == null) |
|||
$bookmarks = array(); |
|||
|
|||
foreach($bookmarks as $b) { |
|||
switch ($b['type']) { |
|||
case 'conference': |
|||
$conference .= ' |
|||
<li>'.$b['name'].'</li>'; |
|||
break; |
|||
case 'url': |
|||
$remove = $this->genCallAjax('ajaxBookmarkUrlRemove', "'".$b['url']."'"); |
|||
$url .= ' |
|||
<li> |
|||
<a target="_blank" href="'.$b['url'].'">'. |
|||
$b['name'].' |
|||
</a> |
|||
<a href="#" onclick="'.$remove.'">X</a> |
|||
</li>'; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
if($subscription != '') { |
|||
$html .= ' |
|||
<h3>'.t('Groups').'</h3> |
|||
<ul>'. |
|||
$subscription.' |
|||
</ul>'; |
|||
} |
|||
|
|||
if($url != '') { |
|||
$html .= ' |
|||
<h3>'.t('Links').'</h3> |
|||
<ul>'. |
|||
$url.' |
|||
</ul>'; |
|||
} |
|||
|
|||
if($conference != '') { |
|||
$html .= ' |
|||
<h3>'.t('Conferences').'</h3> |
|||
<ul>'. |
|||
$conference.' |
|||
</ul>'; |
|||
} |
|||
|
|||
$submit = $this->genCallAjax('ajaxBookmarkAdd', "movim_parse_form('bookmarkadd')"); |
|||
|
|||
$html .= ' |
|||
<div class="popup" id="bookmarkadd"> |
|||
<form name="bookmarkadd"> |
|||
<fieldset> |
|||
<legend>'.t('Add a new URL').'</legend> |
|||
|
|||
<div id="bookmarkadderror"></div> |
|||
<div class="element large mini"> |
|||
<input name="url" placeholder="'.t('URL').'"/> |
|||
</div> |
|||
<div class="element large mini"> |
|||
<input name="name" placeholder="'.t('Name').'"/> |
|||
</div> |
|||
</fieldset> |
|||
<a |
|||
class="button tiny icon yes black merged left" |
|||
onclick="'.$submit.'" |
|||
>'. |
|||
t('Add').' |
|||
</a><a |
|||
class="button tiny icon black merged right" |
|||
onclick="movim_toggle_display(\'#bookmarkadd\')" |
|||
>'. |
|||
t('Close').' |
|||
</a> |
|||
</form> |
|||
</div> |
|||
'; |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
$getbookmark = $this->genCallAjax("ajaxGetBookmark"); |
|||
$setbookmark = $this->genCallAjax("ajaxSetBookmark", "''"); |
|||
?>
|
|||
<script type="text/javascript"> |
|||
function setBookmark() { |
|||
<?php echo $setbookmark; ?>
|
|||
} |
|||
</script> |
|||
<?php |
|||
?>
|
|||
<h2><?php echo t('Bookmarks'); ?></h2>
|
|||
|
|||
<div id="bookmarks"> |
|||
<?php echo $this->prepareBookmark(Cache::c('bookmark')); ?>
|
|||
</div> |
|||
<br /> |
|||
<a class="button icon add tiny merged right" style="float: right;" |
|||
onclick="movim_toggle_display('#bookmarkadd')"><?php echo('Add'); ?></a>
|
|||
<a class="button icon refresh alone tiny merged left" style="float: right;" |
|||
onclick="<?php echo $getbookmark; ?>"></a> |
|||
<br /> |
|||
<?php |
|||
} |
|||
} |
@ -1,7 +0,0 @@ |
|||
#bookmarks li { |
|||
white-space: nowrap; |
|||
width: auto; |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
line-height: 1.5em; |
|||
} |
@ -1,438 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file Chat.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief A jabber chat widget. |
|||
* |
|||
* @author Guillaume Pasquet <etenil@etenilsrealm.nl> |
|||
* |
|||
* @version 1.0 |
|||
* @date 20 October 2010 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class Chat extends WidgetBase |
|||
{ |
|||
function WidgetLoad() |
|||
{ |
|||
$this->addcss('chat.css'); |
|||
$this->addjs('chat.js'); |
|||
$this->registerEvent('message', 'onMessage'); |
|||
$this->registerEvent('messagepublished', 'onMessagePublished'); |
|||
$this->registerEvent('composing', 'onComposing'); |
|||
$this->registerEvent('paused', 'onPaused'); |
|||
$this->registerEvent('attention', 'onAttention'); |
|||
$this->registerEvent('presence', 'onPresence'); |
|||
} |
|||
|
|||
function onPresence($presence) |
|||
{ |
|||
$arr = $presence->getPresence(); |
|||
|
|||
$rc = new \modl\ContactDAO(); |
|||
$contact = $rc->getRosterItem(echapJid($jid)); |
|||
|
|||
if(isset($contact) && $contact->chaton == 1) { |
|||
$txt = array( |
|||
1 => t('Online'), |
|||
2 => t('Away'), |
|||
3 => t('Do Not Disturb'), |
|||
4 => t('Extended Away'), |
|||
5 => t('Offline'), |
|||
); |
|||
|
|||
|
|||
$html = ' |
|||
<div class="message presence"> |
|||
<span class="date">'.date('G:i', time()).'</span>'. |
|||
prepareString(htmlentities($txt[$arr['presence']], ENT_COMPAT, "UTF-8")).' |
|||
</div>'; |
|||
|
|||
RPC::call('movim_append', |
|||
'messages'.$arr['jid'], |
|||
$html); |
|||
|
|||
RPC::call('scrollTalk', |
|||
'messages'.$arr['jid']); |
|||
} |
|||
} |
|||
|
|||
function onMessage($message) |
|||
{ |
|||
if($message->key == $message->from) { |
|||
$key = $message->from; |
|||
$jid = $message->to; |
|||
} else { |
|||
$key = $message->to; |
|||
$jid = $message->from; |
|||
} |
|||
|
|||
if($message->key != $message->from) |
|||
RPC::call('notify'); |
|||
|
|||
$rd = new \modl\RosterLinkDAO(); |
|||
|
|||
$rc = new \modl\ContactDAO(); |
|||
$contact = $rc->getRosterItem(echapJid($jid)); |
|||
|
|||
if(isset($contact) && $contact->chaton == 0) { |
|||
$contact->chaton = 2; |
|||
$rd->setChat($jid, 2); |
|||
|
|||
$evt = new Event(); |
|||
$evt->runEvent('openchat'); |
|||
|
|||
RPC::call('movim_prepend', |
|||
'chats', |
|||
$this->prepareChat($contact)); |
|||
RPC::call('scrollAllTalks'); |
|||
} else if(isset($contact) && $message->body != '') { |
|||
$html = $this->prepareMessage($message); |
|||
|
|||
if($contact->chaton == 1) { |
|||
RPC::call('colorTalk', |
|||
'messages'.$contact->jid); |
|||
} |
|||
|
|||
RPC::call('movim_append', |
|||
'messages'.$contact->jid, |
|||
$html); |
|||
|
|||
RPC::call('hideComposing', |
|||
$contact->jid); |
|||
|
|||
RPC::call('hidePaused', |
|||
$contact->jid); |
|||
|
|||
RPC::call('scrollTalk', |
|||
'messages'.$contact->jid); |
|||
} |
|||
} |
|||
|
|||
function onMessagePublished($jid) |
|||
{ |
|||
Notification::appendNotification(t('Message Published'), 'success'); |
|||
} |
|||
|
|||
function onComposing($jid) |
|||
{ |
|||
$rd = new \modl\RosterLinkDAO(); |
|||
$contact = $rd->get(echapJid($jid)); |
|||
|
|||
if(in_array($contact->chaton, array(1, 2))) { |
|||
RPC::call('showComposing', |
|||
$contact->jid); |
|||
|
|||
RPC::call('scrollTalk', |
|||
'messages'.$contact->jid); |
|||
} |
|||
} |
|||
|
|||
function onPaused($jid) |
|||
{ |
|||
$rd = new \modl\RosterLinkDAO(); |
|||
$contact = $rd->get(echapJid($jid)); |
|||
|
|||
if(in_array($contact->chaton, array(1, 2))) { |
|||
RPC::call('showPaused', |
|||
$contact->jid); |
|||
|
|||
RPC::call('scrollTalk', |
|||
'messages'.$contact->jid); |
|||
} |
|||
} |
|||
|
|||
function onAttention($jid) |
|||
{ |
|||
$rc = new \modl\ContactDAO(); |
|||
$contact = $rc->getRosterItem(echapJid($jid)); |
|||
|
|||
$html = ' |
|||
<div style="font-weight: bold; color: black;" class="message" > |
|||
<span class="date">'.date('G:i', time()).'</span>'. |
|||
t('%s needs your attention', $contact->getTrueName()).' |
|||
</div>'; |
|||
|
|||
RPC::call('movim_append', |
|||
'messages'.$jid, |
|||
$html); |
|||
|
|||
RPC::call('scrollTalk', |
|||
'messages'.$jid); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* Open a new talk |
|||
* |
|||
* @param string $jid |
|||
* @return void |
|||
*/ |
|||
function ajaxOpenTalk($jid) |
|||
{ |
|||
$rc = new \modl\ContactDAO(); |
|||
$contact = $rc->getRosterItem(echapJid($jid)); |
|||
|
|||
if( |
|||
isset($contact) |
|||
&& $contact->chaton == 0 |
|||
&& !in_array($contact->presence, array(5, 6))) { |
|||
|
|||
$contact->chaton = 2; |
|||
|
|||
$rd = new \modl\RosterLinkDAO(); |
|||
$rd->setChat($jid, 2); |
|||
|
|||
RPC::call('movim_prepend', |
|||
'chats', |
|||
$this->prepareChat($contact)); |
|||
|
|||
RPC::call('scrollAllTalks'); |
|||
|
|||
RPC::commit(); |
|||
} |
|||
|
|||
$evt = new Event(); |
|||
$evt->runEvent('openchat'); |
|||
} |
|||
|
|||
/** |
|||
* Send a message |
|||
* |
|||
* @param string $to |
|||
* @param string $message |
|||
* @return void |
|||
*/ |
|||
function ajaxSendMessage($to, $message) |
|||
{ |
|||
$m = new \modl\Message(); |
|||
|
|||
$m->key = $this->user->getLogin(); |
|||
$m->to = echapJid($to); |
|||
$m->from = $this->user->getLogin(); |
|||
|
|||
$m->type = 'chat'; |
|||
|
|||
$m->body = rawurldecode($message); |
|||
|
|||
$m->published = date('Y-m-d H:i:s'); |
|||
$m->delivered = date('Y-m-d H:i:s'); |
|||
|
|||
$md = new \modl\MessageDAO(); |
|||
$md->set($m); |
|||
|
|||
$evt = new Event(); |
|||
$evt->runEvent('message', $m); |
|||
|
|||
// We decode URL codes to send the correct message to the XMPP server
|
|||
$m = new \moxl\MessagePublish(); |
|||
$m->setTo($to) |
|||
->setContent(htmlspecialchars(rawurldecode($message))) |
|||
->request(); |
|||
} |
|||
|
|||
/** |
|||
* Send a "composing" message |
|||
* |
|||
* @param string $to |
|||
* @return void |
|||
*/ |
|||
function ajaxSendComposing($to) |
|||
{ |
|||
$mc = new \moxl\MessageComposing(); |
|||
$mc->setTo($to) |
|||
->request(); |
|||
} |
|||
|
|||
/** |
|||
* Send a "paused" message |
|||
* |
|||
* @param string $to |
|||
* @return void |
|||
*/ |
|||
function ajaxSendPaused($to) |
|||
{ |
|||
$mp = new \moxl\MessagePaused(); |
|||
$mp->setTo($to) |
|||
->request(); |
|||
} |
|||
|
|||
/** |
|||
* Close a talk |
|||
* |
|||
* @param string $jid |
|||
* @return void |
|||
*/ |
|||
function ajaxCloseTalk($jid) |
|||
{ |
|||
$rd = new \modl\RosterLinkDAO(); |
|||
$contacts = $rd->getChats(); |
|||
|
|||
foreach($contacts as $contact) { |
|||
if( |
|||
$contact->jid == $jid |
|||
&& ( |
|||
(int)$contact->chaton == 1 |
|||
|| (int)$contact->chaton == 2) |
|||
) { |
|||
$contact->chaton = 0; |
|||
$rd->setNow($contact); |
|||
} |
|||
} |
|||
|
|||
RPC::call('movim_delete', |
|||
'chat'.$jid); |
|||
|
|||
$evt = new Event(); |
|||
$evt->runEvent('closechat'); |
|||
} |
|||
|
|||
function ajaxHideTalk($jid) |
|||
{ |
|||
$rd = new \modl\RosterLinkDAO(); |
|||
$contact = $rd->get(echapJid($jid)); |
|||
|
|||
if($contact->chaton == 1) |
|||
$contact->chaton = 2; |
|||
else |
|||
$contact->chaton = 1; |
|||
$rd->setNow($contact); |
|||
|
|||
RPC::call('scrollTalk', |
|||
'messages'.$contact->jid); |
|||
RPC::commit(); |
|||
} |
|||
|
|||
function prepareMessage($message) { |
|||
if($message->body != '') { |
|||
$html = '<div class="message '; |
|||
if($message->key == $message->from) |
|||
$html.= 'me'; |
|||
|
|||
$content = $message->body; |
|||
|
|||
if(preg_match("#^/me#", $message->body)) { |
|||
$html .= " own "; |
|||
$content = "** ".substr($message->body, 4); |
|||
} |
|||
|
|||
$html .= '"><span class="date">'.date('H:i', strtotime($message->published)).'</span>'; |
|||
$html.= prepareString(htmlentities($content, ENT_COMPAT, "UTF-8")).'</div>'; |
|||
return $html; |
|||
} else { |
|||
return ''; |
|||
} |
|||
} |
|||
|
|||
function prepareChats() |
|||
{ |
|||
$rc = new \modl\ContactDAO(); |
|||
$contacts = $rc->getRosterChat(); |
|||
|
|||
if(isset($contacts)) { |
|||
foreach($contacts as $contact) { |
|||
$html .= trim($this->prepareChat($contact)); |
|||
} |
|||
} |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
function prepareChat($contact) |
|||
{ |
|||
$md = new \modl\MessageDAO(); |
|||
$messages = $md->getContact($contact->jid, 0, 10); |
|||
|
|||
if(!empty($messages)) { |
|||
$day = ''; |
|||
foreach($messages as $m) { |
|||
if($day != date('d',strtotime($m->published))) { |
|||
$messageshtml .= '<div class="message presence">'.prepareDate(strtotime($m->published), false).'</div>'; |
|||
$day = date('d',strtotime($m->published)); |
|||
} |
|||
$messageshtml .= $this->prepareMessage($m); |
|||
} |
|||
} |
|||
|
|||
$style = ''; |
|||
if($contact->chaton == 2) { |
|||
$tabstyle = ' style="display: none;" '; |
|||
$panelstyle = ' style="display: block;" '; |
|||
} |
|||
|
|||
$html = ' |
|||
<div class="chat" |
|||
onclick="this.querySelector(\'textarea\').focus()" |
|||
id="chat'.$contact->jid.'"> |
|||
<div class="panel" '.$panelstyle.'> |
|||
<div class="head" > |
|||
<span class="chatbutton cross" onclick="'.$this->genCallAjax("ajaxCloseTalk", "'".$contact->jid."'").'"></span> |
|||
<span class="chatbutton arrow" onclick="'.$this->genCallAjax("ajaxHideTalk", "'".$contact->jid."'").' hideTalk(this)"></span> |
|||
<img class="avatar" src="'.$contact->getPhoto('xs').'" /> |
|||
<a class="name" href="'.Route::urlize('friend',$contact->jid).'"> |
|||
'.$contact->getTrueName().' |
|||
</a> |
|||
<div class="clear"></div> |
|||
</div> |
|||
<div class="messages" id="messages'.$contact->jid.'"> |
|||
'.$messageshtml.' |
|||
<div style="display: none;" class="message" id="composing'.$contact->jid.'">'.t('Composing...').'</div> |
|||
<div style="display: none;" class="message" id="paused'.$contact->jid.'">'.t('Paused...').'</div> |
|||
</div> |
|||
|
|||
<div class="text"> |
|||
<textarea |
|||
rows="1" |
|||
id="textarea'.$contact->jid.'" |
|||
onkeypress="
|
|||
if(event.keyCode == 13) { |
|||
'.$this->genCallAjax('ajaxSendMessage', "'".$contact->jid."'", "sendMessage(this, '".$contact->jid."')").' |
|||
lastkeypress = new Date().getTime()+1000; |
|||
return false; |
|||
} |
|||
|
|||
if(lastkeypress < new Date().getTime()) |
|||
'.$this->genCallAjax('ajaxSendComposing', "'".$contact->jid."'").' |
|||
|
|||
lastkeypress = new Date().getTime()+1000; |
|||
"
|
|||
onkeyup="
|
|||
movim_textarea_autoheight(this); |
|||
var val = this.value; |
|||
setTimeout(function() |
|||
{ |
|||
if(lastkeypress < new Date().getTime() && val != \'\') { |
|||
'.$this->genCallAjax('ajaxSendPaused', "'".$contact->jid."'").' |
|||
lastkeypress = new Date().getTime()+1000; |
|||
} |
|||
},1100); // Listen for 2 seconds of silence
|
|||
"
|
|||
></textarea> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="tab '.$tabclass.'" '.$tabstyle.' onclick="'.$this->genCallAjax("ajaxHideTalk", "'".$contact->jid."'").' showTalk(this);"> |
|||
<div class="name"> |
|||
<img class="avatar" src="'.$contact->getPhoto('xs').'" />'.$contact->getTrueName().' |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
'; |
|||
return $html; |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
echo '<div id="chats">'; |
|||
echo $this->prepareChats(); |
|||
echo '</div>'; |
|||
} |
|||
} |
@ -1,192 +0,0 @@ |
|||
#chats { |
|||
position: fixed; |
|||
bottom: -4px; |
|||
right: 210px; |
|||
z-index: 3; |
|||
} |
|||
|
|||
#chats .chat { |
|||
display: inline-block; |
|||
position: relative; |
|||
bottom: 0; |
|||
overflow: hidden; |
|||
box-shadow: 0px 5px 10px rgba(0,0,0,0.3); |
|||
margin-left: 0.5em; |
|||
} |
|||
|
|||
#chats .chat .panel { |
|||
display: none; |
|||
} |
|||
|
|||
#chats .chat .tab { |
|||
background-color: #DDD; |
|||
border: 1px solid #888; |
|||
border-top: 1px solid #AAA; |
|||
border-bottom: 0px; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
#chats .chat .tab.alert .name { |
|||
display: relative; |
|||
} |
|||
|
|||
#chats .chat .tab.alert .name:after { |
|||
content: "+1"; |
|||
color: white; |
|||
font-size: 10px; |
|||
padding: 0px; |
|||
line-height: 1.7em; |
|||
float: right; |
|||
background-color: #C5371E; |
|||
margin-top: 3px; |
|||
padding: 0px 8px; |
|||
margin-left: 10px; |
|||
} |
|||
|
|||
#chats .chat .tab:hover { |
|||
background-color: #EEE; |
|||
border: 1px solid #AAA; |
|||
border-bottom: none; |
|||
color: black; |
|||
} |
|||
|
|||
#chats .chat .tab .name { |
|||
padding-right: 5px ; |
|||
line-height: 24px; |
|||
} |
|||
|
|||
#chats .chat .tab .name img { |
|||
margin-right: 5px; |
|||
float: left; |
|||
width: 24px; |
|||
} |
|||
|
|||
#chats .chat .panel .head span.chatbutton { |
|||
width: 15px; |
|||
height: 15px; |
|||
background-repeat: no-repeat; |
|||
padding: 0px; |
|||
margin-top: 6px; |
|||
margin-right: 3px; |
|||
float: right; |
|||
} |
|||
|
|||
#chats .chat .panel .head span.chatbutton.cross { |
|||
background-image: url(img/cross.png); |
|||
} |
|||
|
|||
#chats .chat .panel .head span.chatbutton.arrow { |
|||
background-image: url(img/arrow.png); |
|||
} |
|||
|
|||
#chats .chat .panel .head a.name { |
|||
padding-right: 1em; |
|||
display: inline-block; |
|||
margin: 0px; |
|||
width: 62%; |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
margin-top: 3px; |
|||
font-size: 0.9em; |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
#chats .chat .tab:hover { |
|||
cursor: pointer; |
|||
} |
|||
|
|||
#chats .chat .panel { |
|||
background-color: white; |
|||
width: 225px; |
|||
} |
|||
|
|||
#chats .chat .panel .head { |
|||
background-color: #242424; |
|||
color: white; |
|||
line-height: 17px; |
|||
border: 1px solid #222; |
|||
border-bottom: 1px solid #242424; |
|||
} |
|||
|
|||
#chats .chat .panel .head:hover { |
|||
cursor: pointer; |
|||
} |
|||
|
|||
#chats .chat .panel .head > * { |
|||
color: white; |
|||
} |
|||
|
|||
#chats .chat .panel .head a:hover { |
|||
text-decoration: underline; |
|||
} |
|||
|
|||
#chats .chat .panel .head img { |
|||
margin-right: 5px; |
|||
float: left; |
|||
width: 24px; |
|||
} |
|||
|
|||
#chats .chat .panel .messages { |
|||
background-color: white; |
|||
color: gray; |
|||
max-height: 250px; |
|||
overflow: auto; |
|||
min-height: 3em; |
|||
border: 1px solid #888; |
|||
border-top: 0px; |
|||
border-bottom: 0px; |
|||
} |
|||
|
|||
#chats .chat .panel .text { |
|||
overflow: hidden; |
|||
border: 1px solid #888; |
|||
} |
|||
|
|||
#chats .chat .panel .text textarea { |
|||
width: 100%; |
|||
border: 0px; |
|||
padding: 0.2em; |
|||
overflow: auto; |
|||
background-color: white; |
|||
resize: none; |
|||
/*height: 1em; |
|||
line-height: 1em; |
|||
font-size: 1em;*/ |
|||
font-size: 1em; |
|||
height: 1.3em; |
|||
overflow-y: hidden; |
|||
} |
|||
|
|||
#chats .chat .panel .text textarea:focus { |
|||
border: 0px; |
|||
} |
|||
|
|||
#chats .chat .panel .messages .message { |
|||
padding: 5px; |
|||
word-wrap: break-word; |
|||
font-size: 12px; |
|||
} |
|||
|
|||
#chats .chat .panel .messages .message.me { |
|||
background-color: #FFC; |
|||
} |
|||
|
|||
#chats .chat .panel .messages .message.own { |
|||
color: blue; |
|||
} |
|||
|
|||
#chats .chat .panel .messages .message.presence { |
|||
color: black; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
#chats .chat .panel .messages .message span.date { |
|||
float: right; |
|||
color: #ccc; |
|||
padding: 2px; |
|||
line-height: 1em; |
|||
} |
|||
|
|||
#chats .chat .panel .messages .message.me span.date { |
|||
color: #444; |
|||
} |
@ -1,102 +0,0 @@ |
|||
function scrollAllTalks() { |
|||
var mes = document.querySelectorAll('.messages'); |
|||
for (var i=0; i<mes.length; i++){ |
|||
// We add 200px to prevent smiley loading
|
|||
mes.item(i).scrollTop = mes.item(i).scrollHeight + 200; |
|||
} |
|||
} |
|||
//Loads the Notification sound.
|
|||
var chatSoundNotif = document.createElement('audio'); |
|||
chatSoundNotif.setAttribute('src', './system/Widget/widgets/Chat/sound/notif.ogg'); |
|||
chatSoundNotif.load(); |
|||
chatSoundNotif.volume = 1; |
|||
|
|||
movim_add_onload(function() |
|||
{ |
|||
scrollAllTalks(); |
|||
}); |
|||
|
|||
function colorTalk(params) { |
|||
messages = document.getElementById(params); |
|||
tabstyle = messages.parentNode.parentNode.querySelector('.tab').className = 'tab alert'; |
|||
} |
|||
|
|||
function showTalk(n) { |
|||
panel = n.parentNode.querySelector('.panel'); |
|||
|
|||
panel.style.display = 'block'; |
|||
n.style.display = 'none'; |
|||
|
|||
n.className = 'tab'; |
|||
} |
|||
|
|||
function hideTalk(n) { |
|||
panel = n.parentNode.parentNode.parentNode.querySelector('.panel'); |
|||
tab = n.parentNode.parentNode.parentNode.querySelector('.tab'); |
|||
|
|||
panel.style.display = 'none'; |
|||
tab.style.display = 'block'; |
|||
} |
|||
|
|||
function scrollTalk(params) { |
|||
var messages = document.getElementById(params); |
|||
messages.scrollTop = messages.scrollHeight; |
|||
} |
|||
|
|||
function showComposing(jid) { |
|||
var box = document.getElementById('messages' + jid); |
|||
var composing = document.getElementById('composing' + jid); |
|||
|
|||
hidePaused(jid); |
|||
box.appendChild(composing); |
|||
|
|||
composing.style.display = 'block'; |
|||
} |
|||
|
|||
function showPaused(jid) { |
|||
var box = document.getElementById('messages' + jid); |
|||
var paused = document.getElementById('paused' + jid); |
|||
|
|||
hideComposing(jid); |
|||
box.appendChild(paused); |
|||
|
|||
paused.style.display = 'block'; |
|||
} |
|||
|
|||
function notify() { |
|||
if(document_focus == false) { |
|||
movim_title_inc(); |
|||
//play the notif sound
|
|||
chatSoundNotif.pause(); |
|||
chatSoundNotif.currentTime= 0; |
|||
chatSoundNotif.play(); |
|||
} |
|||
|
|||
} |
|||
|
|||
function hideComposing(jid) { |
|||
var composing = document.getElementById('composing' + jid); |
|||
composing.style.display = 'none'; |
|||
} |
|||
|
|||
function hidePaused(jid) { |
|||
var paused = document.getElementById('paused' + jid); |
|||
paused.style.display = 'none'; |
|||
} |
|||
|
|||
function sendMessage(n, jid) |
|||
{ |
|||
var text = n.value; |
|||
|
|||
n.value = ""; |
|||
|
|||
n.focus(); |
|||
|
|||
// We escape the text to prevent XML errors
|
|||
return encodeURIComponent(text); |
|||
|
|||
} |
|||
|
|||
function disableSound(){ |
|||
chatSoundNotif.volume = 0; |
|||
} |
Before Width: 11 | Height: 11 | Size: 263 B |
Before Width: 11 | Height: 11 | Size: 376 B |
@ -1,150 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file ChatExt.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief A jabber chat widget. |
|||
* |
|||
* @author Guillaume Pasquet <etenil@etenilsrealm.nl> |
|||
* |
|||
* @version 1.0 |
|||
* @date 20 October 2010 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
require_once(LIB_PATH . "Widget/widgets/Chat/Chat.php"); |
|||
|
|||
class ChatExt extends WidgetBase |
|||
{ |
|||
function WidgetLoad() |
|||
{ |
|||
$this->addcss('chatext.css'); |
|||
$this->addjs('chatext.js'); |
|||
$this->registerEvent('message', 'onMessage'); |
|||
$this->registerEvent('openchat', 'onEvent'); |
|||
$this->registerEvent('closechat', 'onEvent'); |
|||
} |
|||
|
|||
function prepareChat($contact) |
|||
{ |
|||
$md = new \modl\MessageDAO(); |
|||
$messages = $md->getContact($contact->jid, 0, 10); |
|||
|
|||
if(!empty($messages)) { |
|||
$day = ''; |
|||
foreach($messages as $m) { |
|||
if($day != date('d',strtotime($m->published))) { |
|||
$messageshtml .= '<div class="message presence">'.prepareDate(strtotime($m->published), false).'</div>'; |
|||
$day = date('d',strtotime($m->published)); |
|||
} |
|||
$chat = new Chat(); |
|||
$messageshtml .= $chat->prepareMessage($m); |
|||
} |
|||
} |
|||
|
|||
$style = ''; |
|||
if($contact->chaton == 2) { |
|||
$tabstyle = ' style="display: none;" '; |
|||
$panelstyle = ' style="display: block;" '; |
|||
} |
|||
|
|||
$html = ' |
|||
<div class="chat" onclick="this.querySelector(\'textarea\').focus()"> |
|||
<div class="messages" id="messages'.$contact->jid.'"> |
|||
'.$messageshtml.' |
|||
<div style="display: none;" class="message" id="composing'.$contact->jid.'">'.t('Composing...').'</div> |
|||
<div style="display: none;" class="message" id="paused'.$contact->jid.'">'.t('Paused...').'</div> |
|||
</div> |
|||
|
|||
<div class="text"> |
|||
<textarea |
|||
rows="1" |
|||
onkeyup="movim_textarea_autoheight(this);" |
|||
onkeypress="if(event.keyCode == 13) { self.opener.'.$this->genCallWidget('Chat','ajaxSendMessage', "'".$contact->jid."'", "sendMessage(this, '".$contact->jid."')").' return false; }" |
|||
></textarea> |
|||
</div> |
|||
|
|||
</div> |
|||
'; |
|||
return $html; |
|||
} |
|||
|
|||
function prepareList($contact, $first = false) |
|||
{ |
|||
if($first) |
|||
$checked = ' checked '; |
|||
$html .= ' |
|||
<li> |
|||
<input type="radio" name="contact" id="contact'.$contact->jid.'" '.$checked.'/> |
|||
<label class="tab" for="contact'.$contact->jid.'" onclick="setTimeout(function() {scrollAllTalks()}, 100);"> |
|||
<img class="avatar" src="'.$contact->getPhoto('xs').'" />'. |
|||
$contact->getTrueName().' |
|||
</label> |
|||
<div class="content">'.trim($this->prepareChat($contact)).' |
|||
<span |
|||
class="chatbutton cross" |
|||
onclick="self.opener.'.$this->genCallWidget('Chat','ajaxCloseTalk', "'".$contact->jid."'").'"></span> |
|||
</div> |
|||
</li>'; |
|||
return $html; |
|||
} |
|||
|
|||
function onEvent() |
|||
{ |
|||
if(!Cache::c('chatpop')) { |
|||
$html = $this->preparePop(); |
|||
RPC::call('popUpEvent', 'movim_fill', 'chatpop', $html); |
|||
RPC::call('popUpEvent', 'scrollAllTalks'); |
|||
} |
|||
} |
|||
|
|||
function preparePop() |
|||
{ |
|||
$rc = new \modl\ContactDAO(); |
|||
$contacts = $rc->getRosterChat(); |
|||
|
|||
$list = ''; |
|||
|
|||
if(isset($contacts)) { |
|||
$first = true; |
|||
|
|||
foreach($contacts as $contact) { |
|||
$list .= $this->prepareList($contact, $first); |
|||
$first = false; |
|||
} |
|||
$html = '<ul id="chatpoplist">'.$list.'</ul>'; |
|||
} |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
function onMessage($message) |
|||
{ |
|||
if($message->key == $message->from) { |
|||
$key = $message->from; |
|||
$jid = $message->to; |
|||
} else { |
|||
$key = $message->to; |
|||
$jid = $message->from; |
|||
} |
|||
|
|||
$chatpop = Cache::c('chatpop'); |
|||
if(!$chatpop) { |
|||
$chat = new Chat(); |
|||
RPC::call('popUpEvent', 'movim_append', 'messages'.$jid, $chat->prepareMessage($message)); |
|||
RPC::call('popUpEvent', 'scrollAllTalks'); |
|||
} |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
|
|||
} |
|||
|
|||
} |
@ -1,31 +0,0 @@ |
|||
// Initialise popup pointer
|
|||
var popupWin = null; |
|||
|
|||
function openPopup() { |
|||
var url = "?q=chatpop" |
|||
if( !popupWin || popupWin.closed ) { |
|||
popupWin = window.open( url, "popupWin", "height=400,width=600,directories=0,titlebar=0,toolbar=0,location=0,status=0,menubar=0,resizable=no" ); |
|||
} else popupWin.focus(); |
|||
} |
|||
|
|||
function closePopup() { |
|||
popupWin.close(); |
|||
} |
|||
|
|||
function focusPopup() { |
|||
popupWin.focus(); |
|||
} |
|||
|
|||
function popUpEvent(args) { |
|||
if( popupWin && !popupWin.closed ) { |
|||
// The popup is open so call it
|
|||
var func = args[0]; |
|||
args.shift(); |
|||
var params = args; |
|||
|
|||
window['popupWin'][func](params); |
|||
} else { |
|||
// The popup is closed so open it
|
|||
openPopup(); |
|||
} |
|||
} |
@ -1,45 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file ChatExt.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief A jabber chat widget. |
|||
* |
|||
* @author Guillaume Pasquet <etenil@etenilsrealm.nl> |
|||
* |
|||
* @version 1.0 |
|||
* @date 20 October 2010 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
require_once(LIB_PATH . "Widget/widgets/ChatExt/ChatExt.php"); |
|||
|
|||
class ChatPop extends WidgetBase |
|||
{ |
|||
function WidgetLoad() |
|||
{ |
|||
$this->addcss('chatpop.css'); |
|||
$this->addjs('chatpop.js'); |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
$chatext = new ChatExt(); |
|||
|
|||
echo '<div id="chatpop">'; |
|||
echo $chatext->preparePop(); |
|||
echo '</div>'; |
|||
?>
|
|||
<div id="connection"> |
|||
<?php echo t('Connection').'...'; ?>
|
|||
</div> |
|||
<?php |
|||
} |
|||
|
|||
} |
@ -1,161 +0,0 @@ |
|||
body { |
|||
margin: 0px; |
|||
background-color: #333; |
|||
font-family: sans-serif; |
|||
} |
|||
|
|||
#connection { |
|||
width: 100%; |
|||
height: 100%; |
|||
position: absolute; |
|||
top: 0px; |
|||
left: 0px; |
|||
background-color: rgba(0, 0, 0, 0.6); |
|||
display: none; |
|||
color: white; |
|||
font-size: 1.5em; |
|||
text-align: center; |
|||
line-height: 5em; |
|||
} |
|||
|
|||
#chatpop { |
|||
height: 100%; |
|||
width: 100%; |
|||
position: fixed; |
|||
top: 0px; |
|||
left: 0px; |
|||
} |
|||
|
|||
#chatpop #chatpoplist label { |
|||
display: block; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li input[type=radio] { |
|||
display: none; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li input[type=radio]:checked ~ .content { |
|||
display: block; |
|||
} |
|||
|
|||
#chatpop #chatpoplist input[type=radio]:checked ~ label { |
|||
background-color: #111; |
|||
} |
|||
|
|||
#chatpop #chatpoplist { |
|||
width: 25%; |
|||
height: 100%; |
|||
list-style-type: none; |
|||
margin: 0px; |
|||
overflow-y: auto; |
|||
display: block; |
|||
padding: 0px; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li { |
|||
margin: 0px; |
|||
padding: 0px; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li .tab { |
|||
white-space: nowrap; |
|||
width: auto; |
|||
overflow: hidden; |
|||
color: #BBB; |
|||
line-height: 30px; |
|||
font-size: 13px; |
|||
text-overflow: ellipsis; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li:hover .tab { |
|||
background-color: #222; |
|||
cursor: pointer; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li .tab img.avatar { |
|||
float: left; |
|||
margin-right: 5px; |
|||
width: 30px; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li .content { |
|||
position: fixed; |
|||
top: 0px; |
|||
right: 0px; |
|||
height: 90%; |
|||
width: 75%; |
|||
display: none; |
|||
background-color: white; |
|||
overflow-y: auto; |
|||
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5); |
|||
} |
|||
|
|||
#chatpop #chatpoplist li .content .text { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
right: 0px; |
|||
width: 75%; |
|||
background-color: red; |
|||
min-height: 10%; |
|||
border-top: 1px solid #333; |
|||
background-color: white; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li .content .text textarea { |
|||
width: 100%; |
|||
margin: 0px; |
|||
padding: 0px; |
|||
border: 0px; |
|||
height: auto; |
|||
background-color: white; |
|||
resize: none; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li .content .messages { |
|||
font-size: 13px; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li .content .messages .message { |
|||
margin: 10px; |
|||
margin-right: 30px; |
|||
background-color: #FFE8CC; |
|||
padding: 5px; |
|||
min-height: 25px; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li .content .messages .message.me { |
|||
margin-left: 30px; |
|||
margin-right: 10px; |
|||
background-color: #FFFFCC; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li .content .messages .message .date { |
|||
float: right; |
|||
color: #888; |
|||
font-size: 11px; |
|||
padding-left: 10px; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li .content .messages .message.presence { |
|||
background-color: transparent; |
|||
font-weight: bold; |
|||
min-height: 0px; |
|||
} |
|||
|
|||
#chatpop #chatpoplist span.chatbutton { |
|||
width: 28px; |
|||
height: 28px; |
|||
background-repeat: no-repeat; |
|||
background-position: center center; |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
} |
|||
|
|||
#chatpop #chatpoplist span.chatbutton:hover { |
|||
cursor: pointer; |
|||
} |
|||
|
|||
#chatpop #chatpoplist li span.chatbutton.cross { |
|||
background-image: url(img/cross.png); |
|||
} |
@ -1,46 +0,0 @@ |
|||
function notifyOpener() { |
|||
document.querySelector('#connection').style.display = 'none'; |
|||
if(self.opener || !self.opener.popupWin) |
|||
self.opener.popupWin = self; |
|||
} |
|||
|
|||
setInterval( notifyOpener, 200 ); |
|||
|
|||
self.focus(); |
|||
|
|||
function doSomething() { |
|||
alert("I'm doing something"); |
|||
} |
|||
|
|||
function handleError() { |
|||
document.querySelector('#connection').style.display = 'block'; |
|||
} |
|||
|
|||
window.onerror = handleError; |
|||
|
|||
window.onunload = function() { |
|||
self.opener.Roster_ajaxToggleChat(); |
|||
}; |
|||
|
|||
function scrollAllTalks() { |
|||
var mes = document.querySelectorAll('.content'); |
|||
for (var i=0; i<mes.length; i++){ |
|||
// We add 200px to prevent smiley loading
|
|||
mes.item(i).scrollTop = mes.item(i).scrollHeight + 200; |
|||
} |
|||
} |
|||
|
|||
function sendMessage(n, jid) |
|||
{ |
|||
var text = n.value; |
|||
|
|||
n.value = ""; |
|||
n.focus(); |
|||
|
|||
// We escape the text to prevent XML errors
|
|||
return encodeURIComponent(text); |
|||
|
|||
} |
|||
|
|||
|
|||
//setInterval( scrollAllTalks, 200 );
|
Before Width: 11 | Height: 11 | Size: 376 B |
@ -1,196 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file Wall.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief The configuration form |
|||
* |
|||
* @author Timothée Jaussoin <edhelas_at_gmail_dot_com> |
|||
* |
|||
* @version 1.0 |
|||
* @date 28 October 2010 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class Config extends WidgetBase |
|||
{ |
|||
function WidgetLoad() |
|||
{ |
|||
$this->addcss('config.css'); |
|||
$this->addjs('color/jscolor.js'); |
|||
$this->registerEvent('config', 'onConfig'); |
|||
} |
|||
|
|||
function onConfig(array $data) |
|||
{ |
|||
$this->user->setConfig($data); |
|||
Notification::appendNotification(t('Configuration updated')); |
|||
} |
|||
|
|||
function ajaxSubmit($data) { |
|||
$config = $this->user->getConfig(); |
|||
if(isset($config)) |
|||
$data = array_merge($config, $data); |
|||
|
|||
$s = new moxl\StorageSet(); |
|||
$s->setXmlns('movim:prefs') |
|||
->setData(serialize($data)) |
|||
->request(); |
|||
} |
|||
|
|||
function ajaxGet() { |
|||
$s = new moxl\StorageGet(); |
|||
$s->setXmlns('movim:prefs') |
|||
->request(); |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
$languages = load_lang_array(); |
|||
/* We load the user configuration */ |
|||
$conf = $this->user->getConfig('language'); |
|||
$color = $this->user->getConfig('color'); |
|||
|
|||
$submit = $this->genCallAjax('ajaxSubmit', "movim_parse_form('general')") |
|||
. "this.className='button icon loading'; setTimeout(function() {location.reload(false)}, 2000); this.onclick=null;"; |
|||
?>
|
|||
<div class="tabelem padded" title="<?php echo t('Configuration'); ?>" id="config" > |
|||
<form enctype="multipart/form-data" method="post" action="index.php" name="general"> |
|||
<fieldset> |
|||
<legend><?php echo t('General'); ?></legend>
|
|||
<div class="element"> |
|||
<label for="language"><?php echo t('Language'); ?></label>
|
|||
<div class="select"> |
|||
<select name="language" id="language"> |
|||
<option value="en">English (default)</option> |
|||
<?php |
|||
foreach($languages as $key => $value ) { |
|||
if($key == $conf) { ?>
|
|||
<option value="<?php echo $key; ?>" selected="selected"><?php echo $value; ?></option>
|
|||
<?php } else {?>
|
|||
<option value="<?php echo $key; ?>"><?php echo $value; ?></option>
|
|||
<?php } |
|||
} ?>
|
|||
</select> |
|||
</div> |
|||
</div> |
|||
</fieldset> |
|||
|
|||
<fieldset> |
|||
<legend><?php echo t('Apparence'); ?></legend>
|
|||
<div class="element"> |
|||
<label for="color"><?php echo t('Background color'); ?></label>
|
|||
<a |
|||
type="button" |
|||
onclick="
|
|||
document.querySelector('input[name=color]').value = '082D50'; |
|||
document.body.style.backgroundColor = '#082D50';"
|
|||
style="width: 45%; float: right;" |
|||
class="button icon back"> |
|||
<?php echo t('Reset');?>
|
|||
</a> |
|||
<input |
|||
style="box-shadow: none; width: 50%; float: left;" |
|||
name="color" |
|||
class="color" |
|||
onchange="document.body.style.backgroundColor = '#'+this.value;" |
|||
value="
|
|||
<?php |
|||
if(isset($color)) |
|||
echo $color; |
|||
else |
|||
echo "082D50"; |
|||
?>
|
|||
">
|
|||
</div> |
|||
|
|||
<div class="element large"> |
|||
<label for="pattern"><?php echo t('Pattern'); ?></label>
|
|||
|
|||
<input type="radio" name="pattern" id="argyle" value="argyle"/> |
|||
<label for="argyle"><span></span> |
|||
<div class="preview argyle" |
|||
style="background-color: #6d695c;"></div> |
|||
</label> |
|||
|
|||
<input type="radio" name="pattern" id="default" value="default"/> |
|||
<label for="default"><span></span> |
|||
<div class="preview default" |
|||
style="background-color: #082D50;;"></div> |
|||
</label> |
|||
|
|||
<input type="radio" name="pattern" id="tableclothe" value="tableclothe"/> |
|||
<label for="tableclothe"><span></span> |
|||
<div class="preview tableclothe" |
|||
style="background-color: rgba(200, 0, 0, 1);"></div> |
|||
</label> |
|||
|
|||
<input type="radio" name="pattern" id="blueprint" value="blueprint"/> |
|||
<label for="blueprint"><span></span> |
|||
<div class="preview blueprint" |
|||
style="background-color:#269;"></div> |
|||
</label> |
|||
|
|||
<input type="radio" name="pattern" id="cicada" value="cicada"/> |
|||
<label for="cicada"><span></span> |
|||
<div class="preview cicada" |
|||
style="background-color: #026873;"></div> |
|||
</label> |
|||
|
|||
<input type="radio" name="pattern" id="stripes" value="stripes"/> |
|||
<label for="stripes"><span></span> |
|||
<div class="preview stripes" |
|||
style="background-color: orange;"></div> |
|||
</label> |
|||
|
|||
<input type="radio" name="pattern" id="stars" value="stars"/> |
|||
<label for="stars"><span></span> |
|||
<div class="preview stars" |
|||
style="background-color:black; background-size: 100px 100px;"></div> |
|||
</label> |
|||
|
|||
<input type="radio" name="pattern" id="paper" value="paper"/> |
|||
<label for="paper"><span></span> |
|||
<div class="preview paper" |
|||
style="background-color: #23343E;"></div> |
|||
</label> |
|||
|
|||
<input type="radio" name="pattern" id="tartan" value="tartan"/> |
|||
<label for="tartan"><span></span> |
|||
<div class="preview tartan" |
|||
style="background-color: hsl(2, 57%, 40%);"></div> |
|||
</label> |
|||
|
|||
<input type="radio" name="pattern" id="empty" value=""/> |
|||
<label for="empty"><span></span> |
|||
<div class="preview empty" |
|||
style="background-color: white;"></div> |
|||
</label> |
|||
</div> |
|||
</fieldset> |
|||
<br /> |
|||
|
|||
<hr /> |
|||
<!--<label id="lock" for="soundnotif"><?php echo t('Enable Sound Notification:'); ?></label>
|
|||
<input type="checkbox" name="soundnotif" value="soundnotif" checked="checked" /><br /> --> |
|||
<!--<input value="<?php echo t('Submit'); ?>" onclick="<?php echo $submit; ?>" type="button" class="button icon yes merged right" style="float: right;"> |
|||
<input type="reset" value="<?php echo t('Reset'); ?>" class="button icon no merged left" style="float: right;">--> |
|||
|
|||
<br /> |
|||
<a onclick="<?php echo $submit; ?>" type="button" class="button icon yes" style="float: right;"><?php echo t('Submit'); ?></a>
|
|||
<!--<a type="reset" value="<?php echo t('Reset'); ?>" class="button icon no merged left" style="float: right;">--> |
|||
</p> |
|||
</form> |
|||
<br /><br /> |
|||
<div class="message info"><?php echo t("This configuration is shared wherever you are connected !");?></div>
|
|||
</div> |
|||
<?php |
|||
} |
|||
|
|||
} |
Before Width: 7 | Height: 11 | Size: 66 B |
Before Width: 15 | Height: 15 | Size: 83 B |
@ -1,12 +0,0 @@ |
|||
<html> |
|||
<head> |
|||
<title>jscolor demo</title> |
|||
</head> |
|||
<body> |
|||
|
|||
<script type="text/javascript" src="jscolor.js"></script> |
|||
|
|||
Click here: <input class="color" value="66ff00"> |
|||
|
|||
</body> |
|||
</html> |
Before Width: 181 | Height: 101 | Size: 2.6 KiB |
Before Width: 181 | Height: 101 | Size: 2.8 KiB |
@ -1,953 +0,0 @@ |
|||
/** |
|||
* jscolor, JavaScript Color Picker |
|||
* |
|||
* @version 1.4.0 |
|||
* @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html
|
|||
* @author Jan Odvarko, http://odvarko.cz
|
|||
* @created 2008-06-15 |
|||
* @updated 2012-07-06 |
|||
* @link http://jscolor.com
|
|||
*/ |
|||
|
|||
|
|||
var jscolor = { |
|||
|
|||
|
|||
dir : '', // location of jscolor directory (leave empty to autodetect)
|
|||
bindClass : 'color', // class name
|
|||
binding : true, // automatic binding via <input class="...">
|
|||
preloading : true, // use image preloading?
|
|||
|
|||
|
|||
install : function() { |
|||
jscolor.addEvent(window, 'load', jscolor.init); |
|||
}, |
|||
|
|||
|
|||
init : function() { |
|||
if(jscolor.binding) { |
|||
jscolor.bind(); |
|||
} |
|||
if(jscolor.preloading) { |
|||
jscolor.preload(); |
|||
} |
|||
}, |
|||
|
|||
|
|||
getDir : function() { |
|||
if(!jscolor.dir) { |
|||
var detected = jscolor.detectDir(); |
|||
jscolor.dir = detected!==false ? detected : 'jscolor/'; |
|||
} |
|||
return jscolor.dir; |
|||
}, |
|||
|
|||
|
|||
detectDir : function() { |
|||
var base = location.href; |
|||
|
|||
var e = document.getElementsByTagName('base'); |
|||
for(var i=0; i<e.length; i+=1) { |
|||
if(e[i].href) { base = e[i].href; } |
|||
} |
|||
|
|||
var e = document.getElementsByTagName('script'); |
|||
for(var i=0; i<e.length; i+=1) { |
|||
if(e[i].src && /(^|\/)jscolor\.js([?#].*)?$/i.test(e[i].src)) { |
|||
var src = new jscolor.URI(e[i].src); |
|||
var srcAbs = src.toAbsolute(base); |
|||
srcAbs.path = srcAbs.path.replace(/[^\/]+$/, ''); // remove filename
|
|||
srcAbs.query = null; |
|||
srcAbs.fragment = null; |
|||
return srcAbs.toString(); |
|||
} |
|||
} |
|||
return false; |
|||
}, |
|||
|
|||
|
|||
bind : function() { |
|||
var matchClass = new RegExp('(^|\\s)('+jscolor.bindClass+')\\s*(\\{[^}]*\\})?', 'i'); |
|||
var e = document.getElementsByTagName('input'); |
|||
for(var i=0; i<e.length; i+=1) { |
|||
var m; |
|||
if(!e[i].color && e[i].className && (m = e[i].className.match(matchClass))) { |
|||
var prop = {}; |
|||
if(m[3]) { |
|||
try { |
|||
prop = (new Function ('return (' + m[3] + ')'))(); |
|||
} catch(eInvalidProp) {} |
|||
} |
|||
e[i].color = new jscolor.color(e[i], prop); |
|||
} |
|||
} |
|||
}, |
|||
|
|||
|
|||
preload : function() { |
|||
for(var fn in jscolor.imgRequire) { |
|||
if(jscolor.imgRequire.hasOwnProperty(fn)) { |
|||
jscolor.loadImage(fn); |
|||
} |
|||
} |
|||
}, |
|||
|
|||
|
|||
images : { |
|||
pad : [ 181, 101 ], |
|||
sld : [ 16, 101 ], |
|||
cross : [ 15, 15 ], |
|||
arrow : [ 7, 11 ] |
|||
}, |
|||
|
|||
|
|||
imgRequire : {}, |
|||
imgLoaded : {}, |
|||
|
|||
|
|||
requireImage : function(filename) { |
|||
jscolor.imgRequire[filename] = true; |
|||
}, |
|||
|
|||
|
|||
loadImage : function(filename) { |
|||
if(!jscolor.imgLoaded[filename]) { |
|||
jscolor.imgLoaded[filename] = new Image(); |
|||
jscolor.imgLoaded[filename].src = jscolor.getDir()+filename; |
|||
} |
|||
}, |
|||
|
|||
|
|||
fetchElement : function(mixed) { |
|||
return typeof mixed === 'string' ? document.getElementById(mixed) : mixed; |
|||
}, |
|||
|
|||
|
|||
addEvent : function(el, evnt, func) { |
|||
if(el.addEventListener) { |
|||
el.addEventListener(evnt, func, false); |
|||
} else if(el.attachEvent) { |
|||
el.attachEvent('on'+evnt, func); |
|||
} |
|||
}, |
|||
|
|||
|
|||
fireEvent : function(el, evnt) { |
|||
if(!el) { |
|||
return; |
|||
} |
|||
if(document.createEvent) { |
|||
var ev = document.createEvent('HTMLEvents'); |
|||
ev.initEvent(evnt, true, true); |
|||
el.dispatchEvent(ev); |
|||
} else if(document.createEventObject) { |
|||
var ev = document.createEventObject(); |
|||
el.fireEvent('on'+evnt, ev); |
|||
} else if(el['on'+evnt]) { // alternatively use the traditional event model (IE5)
|
|||
el['on'+evnt](); |
|||
} |
|||
}, |
|||
|
|||
|
|||
getElementPos : function(e) { |
|||
var e1=e, e2=e; |
|||
var x=0, y=0; |
|||
if(e1.offsetParent) { |
|||
do { |
|||
x += e1.offsetLeft; |
|||
y += e1.offsetTop; |
|||
} while(e1 = e1.offsetParent); |
|||
} |
|||
while((e2 = e2.parentNode) && e2.nodeName.toUpperCase() !== 'BODY') { |
|||
x -= e2.scrollLeft; |
|||
y -= e2.scrollTop; |
|||
} |
|||
return [x, y]; |
|||
}, |
|||
|
|||
|
|||
getElementSize : function(e) { |
|||
return [e.offsetWidth, e.offsetHeight]; |
|||
}, |
|||
|
|||
|
|||
getRelMousePos : function(e) { |
|||
var x = 0, y = 0; |
|||
if (!e) { e = window.event; } |
|||
if (typeof e.offsetX === 'number') { |
|||
x = e.offsetX; |
|||
y = e.offsetY; |
|||
} else if (typeof e.layerX === 'number') { |
|||
x = e.layerX; |
|||
y = e.layerY; |
|||
} |
|||
return { x: x, y: y }; |
|||
}, |
|||
|
|||
|
|||
getViewPos : function() { |
|||
if(typeof window.pageYOffset === 'number') { |
|||
return [window.pageXOffset, window.pageYOffset]; |
|||
} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) { |
|||
return [document.body.scrollLeft, document.body.scrollTop]; |
|||
} else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) { |
|||
return [document.documentElement.scrollLeft, document.documentElement.scrollTop]; |
|||
} else { |
|||
return [0, 0]; |
|||
} |
|||
}, |
|||
|
|||
|
|||
getViewSize : function() { |
|||
if(typeof window.innerWidth === 'number') { |
|||
return [window.innerWidth, window.innerHeight]; |
|||
} else if(document.body && (document.body.clientWidth || document.body.clientHeight)) { |
|||
return [document.body.clientWidth, document.body.clientHeight]; |
|||
} else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) { |
|||
return [document.documentElement.clientWidth, document.documentElement.clientHeight]; |
|||
} else { |
|||
return [0, 0]; |
|||
} |
|||
}, |
|||
|
|||
|
|||
URI : function(uri) { // See RFC3986
|
|||
|
|||
this.scheme = null; |
|||
this.authority = null; |
|||
this.path = ''; |
|||
this.query = null; |
|||
this.fragment = null; |
|||
|
|||
this.parse = function(uri) { |
|||
var m = uri.match(/^(([A-Za-z][0-9A-Za-z+.-]*)(:))?((\/\/)([^\/?#]*))?([^?#]*)((\?)([^#]*))?((#)(.*))?/); |
|||
this.scheme = m[3] ? m[2] : null; |
|||
this.authority = m[5] ? m[6] : null; |
|||
this.path = m[7]; |
|||
this.query = m[9] ? m[10] : null; |
|||
this.fragment = m[12] ? m[13] : null; |
|||
return this; |
|||
}; |
|||
|
|||
this.toString = function() { |
|||
var result = ''; |
|||
if(this.scheme !== null) { result = result + this.scheme + ':'; } |
|||
if(this.authority !== null) { result = result + '//' + this.authority; } |
|||
if(this.path !== null) { result = result + this.path; } |
|||
if(this.query !== null) { result = result + '?' + this.query; } |
|||
if(this.fragment !== null) { result = result + '#' + this.fragment; } |
|||
return result; |
|||
}; |
|||
|
|||
this.toAbsolute = function(base) { |
|||
var base = new jscolor.URI(base); |
|||
var r = this; |
|||
var t = new jscolor.URI; |
|||
|
|||
if(base.scheme === null) { return false; } |
|||
|
|||
if(r.scheme !== null && r.scheme.toLowerCase() === base.scheme.toLowerCase()) { |
|||
r.scheme = null; |
|||
} |
|||
|
|||
if(r.scheme !== null) { |
|||
t.scheme = r.scheme; |
|||
t.authority = r.authority; |
|||
t.path = removeDotSegments(r.path); |
|||
t.query = r.query; |
|||
} else { |
|||
if(r.authority !== null) { |
|||
t.authority = r.authority; |
|||
t.path = removeDotSegments(r.path); |
|||
t.query = r.query; |
|||
} else { |
|||
if(r.path === '') { |
|||
t.path = base.path; |
|||
if(r.query !== null) { |
|||
t.query = r.query; |
|||
} else { |
|||
t.query = base.query; |
|||
} |
|||
} else { |
|||
if(r.path.substr(0,1) === '/') { |
|||
t.path = removeDotSegments(r.path); |
|||
} else { |
|||
if(base.authority !== null && base.path === '') { |
|||
t.path = '/'+r.path; |
|||
} else { |
|||
t.path = base.path.replace(/[^\/]+$/,'')+r.path; |
|||
} |
|||
t.path = removeDotSegments(t.path); |
|||
} |
|||
t.query = r.query; |
|||
} |
|||
t.authority = base.authority; |
|||
} |
|||
t.scheme = base.scheme; |
|||
} |
|||
t.fragment = r.fragment; |
|||
|
|||
return t; |
|||
}; |
|||
|
|||
function removeDotSegments(path) { |
|||
var out = ''; |
|||
while(path) { |
|||
if(path.substr(0,3)==='../' || path.substr(0,2)==='./') { |
|||
path = path.replace(/^\.+/,'').substr(1); |
|||
} else if(path.substr(0,3)==='/./' || path==='/.') { |
|||
path = '/'+path.substr(3); |
|||
} else if(path.substr(0,4)==='/../' || path==='/..') { |
|||
path = '/'+path.substr(4); |
|||
out = out.replace(/\/?[^\/]*$/, ''); |
|||
} else if(path==='.' || path==='..') { |
|||
path = ''; |
|||
} else { |
|||
var rm = path.match(/^\/?[^\/]*/)[0]; |
|||
path = path.substr(rm.length); |
|||
out = out + rm; |
|||
} |
|||
} |
|||
return out; |
|||
} |
|||
|
|||
if(uri) { |
|||
this.parse(uri); |
|||
} |
|||
|
|||
}, |
|||
|
|||
|
|||
/* |
|||
* Usage example: |
|||
* var myColor = new jscolor.color(myInputElement) |
|||
*/ |
|||
|
|||
color : function(target, prop) { |
|||
|
|||
|
|||
this.required = true; // refuse empty values?
|
|||
this.adjust = true; // adjust value to uniform notation?
|
|||
this.hash = false; // prefix color with # symbol?
|
|||
this.caps = true; // uppercase?
|
|||
this.slider = true; // show the value/saturation slider?
|
|||
this.valueElement = target; // value holder
|
|||
this.styleElement = target; // where to reflect current color
|
|||
this.onImmediateChange = null; // onchange callback (can be either string or function)
|
|||
this.hsv = [0, 0, 1]; // read-only 0-6, 0-1, 0-1
|
|||
this.rgb = [1, 1, 1]; // read-only 0-1, 0-1, 0-1
|
|||
this.minH = 0; // read-only 0-6
|
|||
this.maxH = 6; // read-only 0-6
|
|||
this.minS = 0; // read-only 0-1
|
|||
this.maxS = 1; // read-only 0-1
|
|||
this.minV = 0; // read-only 0-1
|
|||
this.maxV = 1; // read-only 0-1
|
|||
|
|||
this.pickerOnfocus = true; // display picker on focus?
|
|||
this.pickerMode = 'HSV'; // HSV | HVS
|
|||
this.pickerPosition = 'bottom'; // left | right | top | bottom
|
|||
this.pickerSmartPosition = true; // automatically adjust picker position when necessary
|
|||
this.pickerButtonHeight = 20; // px
|
|||
this.pickerClosable = false; |
|||
this.pickerCloseText = 'Close'; |
|||
this.pickerButtonColor = 'ButtonText'; // px
|
|||
this.pickerFace = 10; // px
|
|||
this.pickerFaceColor = 'ThreeDFace'; // CSS color
|
|||
this.pickerBorder = 1; // px
|
|||
this.pickerBorderColor = 'ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight'; // CSS color
|
|||
this.pickerInset = 1; // px
|
|||
this.pickerInsetColor = 'ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow'; // CSS color
|
|||
this.pickerZIndex = 10000; |
|||
|
|||
|
|||
for(var p in prop) { |
|||
if(prop.hasOwnProperty(p)) { |
|||
this[p] = prop[p]; |
|||
} |
|||
} |
|||
|
|||
|
|||
this.hidePicker = function() { |
|||
if(isPickerOwner()) { |
|||
removePicker(); |
|||
} |
|||
}; |
|||
|
|||
|
|||
this.showPicker = function() { |
|||
if(!isPickerOwner()) { |
|||
var tp = jscolor.getElementPos(target); // target pos
|
|||
var ts = jscolor.getElementSize(target); // target size
|
|||
var vp = jscolor.getViewPos(); // view pos
|
|||
var vs = jscolor.getViewSize(); // view size
|
|||
var ps = getPickerDims(this); // picker size
|
|||
var a, b, c; |
|||
switch(this.pickerPosition.toLowerCase()) { |
|||
case 'left': a=1; b=0; c=-1; break; |
|||
case 'right':a=1; b=0; c=1; break; |
|||
case 'top': a=0; b=1; c=-1; break; |
|||
default: a=0; b=1; c=1; break; |
|||
} |
|||
var l = (ts[b]+ps[b])/2; |
|||
|
|||
// picker pos
|
|||
if (!this.pickerSmartPosition) { |
|||
var pp = [ |
|||
tp[a], |
|||
tp[b]+ts[b]-l+l*c |
|||
]; |
|||
} else { |
|||
var pp = [ |
|||
-vp[a]+tp[a]+ps[a] > vs[a] ? |
|||
(-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) : |
|||
tp[a], |
|||
-vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ? |
|||
(-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) : |
|||
(tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c) |
|||
]; |
|||
} |
|||
drawPicker(pp[a], pp[b]); |
|||
} |
|||
}; |
|||
|
|||
|
|||
this.importColor = function() { |
|||
if(!valueElement) { |
|||
this.exportColor(); |
|||
} else { |
|||
if(!this.adjust) { |
|||
if(!this.fromString(valueElement.value, leaveValue)) { |
|||
styleElement.style.backgroundImage = styleElement.jscStyle.backgroundImage; |
|||
styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor; |
|||
styleElement.style.color = styleElement.jscStyle.color; |
|||
this.exportColor(leaveValue | leaveStyle); |
|||
} |
|||
} else if(!this.required && /^\s*$/.test(valueElement.value)) { |
|||
valueElement.value = ''; |
|||
styleElement.style.backgroundImage = styleElement.jscStyle.backgroundImage; |
|||
styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor; |
|||
styleElement.style.color = styleElement.jscStyle.color; |
|||
this.exportColor(leaveValue | leaveStyle); |
|||
|
|||
} else if(this.fromString(valueElement.value)) { |
|||
// OK
|
|||
} else { |
|||
this.exportColor(); |
|||
} |
|||
} |
|||
}; |
|||
|
|||
|
|||
this.exportColor = function(flags) { |
|||
if(!(flags & leaveValue) && valueElement) { |
|||
var value = this.toString(); |
|||
if(this.caps) { value = value.toUpperCase(); } |
|||
if(this.hash) { value = '#'+value; } |
|||
valueElement.value = value; |
|||
} |
|||
if(!(flags & leaveStyle) && styleElement) { |
|||
styleElement.style.backgroundImage = "none"; |
|||
styleElement.style.backgroundColor = |
|||
'#'+this.toString(); |
|||
styleElement.style.color = |
|||
0.213 * this.rgb[0] + |
|||
0.715 * this.rgb[1] + |
|||
0.072 * this.rgb[2] |
|||
< 0.5 ? '#FFF' : '#000'; |
|||
} |
|||
if(!(flags & leavePad) && isPickerOwner()) { |
|||
redrawPad(); |
|||
} |
|||
if(!(flags & leaveSld) && isPickerOwner()) { |
|||
redrawSld(); |
|||
} |
|||
}; |
|||
|
|||
|
|||
this.fromHSV = function(h, s, v, flags) { // null = don't change
|
|||
if(h !== null) { h = Math.max(0.0, this.minH, Math.min(6.0, this.maxH, h)); } |
|||
if(s !== null) { s = Math.max(0.0, this.minS, Math.min(1.0, this.maxS, s)); } |
|||
if(v !== null) { v = Math.max(0.0, this.minV, Math.min(1.0, this.maxV, v)); } |
|||
|
|||
this.rgb = HSV_RGB( |
|||
h===null ? this.hsv[0] : (this.hsv[0]=h), |
|||
s===null ? this.hsv[1] : (this.hsv[1]=s), |
|||
v===null ? this.hsv[2] : (this.hsv[2]=v) |
|||
); |
|||
|
|||
this.exportColor(flags); |
|||
}; |
|||
|
|||
|
|||
this.fromRGB = function(r, g, b, flags) { // null = don't change
|
|||
if(r !== null) { r = Math.max(0.0, Math.min(1.0, r)); } |
|||
if(g !== null) { g = Math.max(0.0, Math.min(1.0, g)); } |
|||
if(b !== null) { b = Math.max(0.0, Math.min(1.0, b)); } |
|||
|
|||
var hsv = RGB_HSV( |
|||
r===null ? this.rgb[0] : r, |
|||
g===null ? this.rgb[1] : g, |
|||
b===null ? this.rgb[2] : b |
|||
); |
|||
if(hsv[0] !== null) { |
|||
this.hsv[0] = Math.max(0.0, this.minH, Math.min(6.0, this.maxH, hsv[0])); |
|||
} |
|||
if(hsv[2] !== 0) { |
|||
this.hsv[1] = hsv[1]===null ? null : Math.max(0.0, this.minS, Math.min(1.0, this.maxS, hsv[1])); |
|||
} |
|||
this.hsv[2] = hsv[2]===null ? null : Math.max(0.0, this.minV, Math.min(1.0, this.maxV, hsv[2])); |
|||
|
|||
// update RGB according to final HSV, as some values might be trimmed
|
|||
var rgb = HSV_RGB(this.hsv[0], this.hsv[1], this.hsv[2]); |
|||
this.rgb[0] = rgb[0]; |
|||
this.rgb[1] = rgb[1]; |
|||
this.rgb[2] = rgb[2]; |
|||
|
|||
this.exportColor(flags); |
|||
}; |
|||
|
|||
|
|||
this.fromString = function(hex, flags) { |
|||
var m = hex.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i); |
|||
if(!m) { |
|||
return false; |
|||
} else { |
|||
if(m[1].length === 6) { // 6-char notation
|
|||
this.fromRGB( |
|||
parseInt(m[1].substr(0,2),16) / 255, |
|||
parseInt(m[1].substr(2,2),16) / 255, |
|||
parseInt(m[1].substr(4,2),16) / 255, |
|||
flags |
|||
); |
|||
} else { // 3-char notation
|
|||
this.fromRGB( |
|||
parseInt(m[1].charAt(0)+m[1].charAt(0),16) / 255, |
|||
parseInt(m[1].charAt(1)+m[1].charAt(1),16) / 255, |
|||
parseInt(m[1].charAt(2)+m[1].charAt(2),16) / 255, |
|||
flags |
|||
); |
|||
} |
|||
return true; |
|||
} |
|||
}; |
|||
|
|||
|
|||
this.toString = function() { |
|||
return ( |
|||
(0x100 | Math.round(255*this.rgb[0])).toString(16).substr(1) + |
|||
(0x100 | Math.round(255*this.rgb[1])).toString(16).substr(1) + |
|||
(0x100 | Math.round(255*this.rgb[2])).toString(16).substr(1) |
|||
); |
|||
}; |
|||
|
|||
|
|||
function RGB_HSV(r, g, b) { |
|||
var n = Math.min(Math.min(r,g),b); |
|||
var v = Math.max(Math.max(r,g),b); |
|||
var m = v - n; |
|||
if(m === 0) { return [ null, 0, v ]; } |
|||
var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m); |
|||
return [ h===6?0:h, m/v, v ]; |
|||
} |
|||
|
|||
|
|||
function HSV_RGB(h, s, v) { |
|||
if(h === null) { return [ v, v, v ]; } |
|||
var i = Math.floor(h); |
|||
var f = i%2 ? h-i : 1-(h-i); |
|||
var m = v * (1 - s); |
|||
var n = v * (1 - s*f); |
|||
switch(i) { |
|||
case 6: |
|||
case 0: return [v,n,m]; |
|||
case 1: return [n,v,m]; |
|||
case 2: return [m,v,n]; |
|||
case 3: return [m,n,v]; |
|||
case 4: return [n,m,v]; |
|||
case 5: return [v,m,n]; |
|||
} |
|||
} |
|||
|
|||
|
|||
function removePicker() { |
|||
delete jscolor.picker.owner; |
|||
document.getElementsByTagName('body')[0].removeChild(jscolor.picker.boxB); |
|||
} |
|||
|
|||
|
|||
function drawPicker(x, y) { |
|||
if(!jscolor.picker) { |
|||
jscolor.picker = { |
|||
box : document.createElement('div'), |
|||
boxB : document.createElement('div'), |
|||
pad : document.createElement('div'), |
|||
padB : document.createElement('div'), |
|||
padM : document.createElement('div'), |
|||
sld : document.createElement('div'), |
|||
sldB : document.createElement('div'), |
|||
sldM : document.createElement('div'), |
|||
btn : document.createElement('div'), |
|||
btnS : document.createElement('span'), |
|||
btnT : document.createTextNode(THIS.pickerCloseText) |
|||
}; |
|||
for(var i=0,segSize=4; i<jscolor.images.sld[1]; i+=segSize) { |
|||
var seg = document.createElement('div'); |
|||
seg.style.height = segSize+'px'; |
|||
seg.style.fontSize = '1px'; |
|||
seg.style.lineHeight = '0'; |
|||
jscolor.picker.sld.appendChild(seg); |
|||
} |
|||
jscolor.picker.sldB.appendChild(jscolor.picker.sld); |
|||
jscolor.picker.box.appendChild(jscolor.picker.sldB); |
|||
jscolor.picker.box.appendChild(jscolor.picker.sldM); |
|||
jscolor.picker.padB.appendChild(jscolor.picker.pad); |
|||
jscolor.picker.box.appendChild(jscolor.picker.padB); |
|||
jscolor.picker.box.appendChild(jscolor.picker.padM); |
|||
jscolor.picker.btnS.appendChild(jscolor.picker.btnT); |
|||
jscolor.picker.btn.appendChild(jscolor.picker.btnS); |
|||
jscolor.picker.box.appendChild(jscolor.picker.btn); |
|||
jscolor.picker.boxB.appendChild(jscolor.picker.box); |
|||
} |
|||
|
|||
var p = jscolor.picker; |
|||
|
|||
// controls interaction
|
|||
p.box.onmouseup = |
|||
p.box.onmouseout = function() { target.focus(); }; |
|||
p.box.onmousedown = function() { abortBlur=true; }; |
|||
p.box.onmousemove = function(e) { |
|||
if (holdPad || holdSld) { |
|||
holdPad && setPad(e); |
|||
holdSld && setSld(e); |
|||
if (document.selection) { |
|||
document.selection.empty(); |
|||
} else if (window.getSelection) { |
|||
window.getSelection().removeAllRanges(); |
|||
} |
|||
dispatchImmediateChange(); |
|||
} |
|||
}; |
|||
p.padM.onmouseup = |
|||
p.padM.onmouseout = function() { if(holdPad) { holdPad=false; jscolor.fireEvent(valueElement,'change'); } }; |
|||
p.padM.onmousedown = function(e) { |
|||
// if the slider is at the bottom, move it up
|
|||
switch(modeID) { |
|||
case 0: if (THIS.hsv[2] === 0) { THIS.fromHSV(null, null, 1.0); }; break; |
|||
case 1: if (THIS.hsv[1] === 0) { THIS.fromHSV(null, 1.0, null); }; break; |
|||
} |
|||
holdPad=true; |
|||
setPad(e); |
|||
dispatchImmediateChange(); |
|||
}; |
|||
p.sldM.onmouseup = |
|||
p.sldM.onmouseout = function() { if(holdSld) { holdSld=false; jscolor.fireEvent(valueElement,'change'); } }; |
|||
p.sldM.onmousedown = function(e) { |
|||
holdSld=true; |
|||
setSld(e); |
|||
dispatchImmediateChange(); |
|||
}; |
|||
|
|||
// picker
|
|||
var dims = getPickerDims(THIS); |
|||
p.box.style.width = dims[0] + 'px'; |
|||
p.box.style.height = dims[1] + 'px'; |
|||
|
|||
// picker border
|
|||
p.boxB.style.position = 'absolute'; |
|||
p.boxB.style.clear = 'both'; |
|||
p.boxB.style.left = x+'px'; |
|||
p.boxB.style.top = y+'px'; |
|||
p.boxB.style.zIndex = THIS.pickerZIndex; |
|||
p.boxB.style.border = THIS.pickerBorder+'px solid'; |
|||
p.boxB.style.borderColor = THIS.pickerBorderColor; |
|||
p.boxB.style.background = THIS.pickerFaceColor; |
|||
|
|||
// pad image
|
|||
p.pad.style.width = jscolor.images.pad[0]+'px'; |
|||
p.pad.style.height = jscolor.images.pad[1]+'px'; |
|||
|
|||
// pad border
|
|||
p.padB.style.position = 'absolute'; |
|||
p.padB.style.left = THIS.pickerFace+'px'; |
|||
p.padB.style.top = THIS.pickerFace+'px'; |
|||
p.padB.style.border = THIS.pickerInset+'px solid'; |
|||
p.padB.style.borderColor = THIS.pickerInsetColor; |
|||
|
|||
// pad mouse area
|
|||
p.padM.style.position = 'absolute'; |
|||
p.padM.style.left = '0'; |
|||
p.padM.style.top = '0'; |
|||
p.padM.style.width = THIS.pickerFace + 2*THIS.pickerInset + jscolor.images.pad[0] + jscolor.images.arrow[0] + 'px'; |
|||
p.padM.style.height = p.box.style.height; |
|||
p.padM.style.cursor = 'crosshair'; |
|||
|
|||
// slider image
|
|||
p.sld.style.overflow = 'hidden'; |
|||
p.sld.style.width = jscolor.images.sld[0]+'px'; |
|||
p.sld.style.height = jscolor.images.sld[1]+'px'; |
|||
|
|||
// slider border
|
|||
p.sldB.style.display = THIS.slider ? 'block' : 'none'; |
|||
p.sldB.style.position = 'absolute'; |
|||
p.sldB.style.right = THIS.pickerFace+'px'; |
|||
p.sldB.style.top = THIS.pickerFace+'px'; |
|||
p.sldB.style.border = THIS.pickerInset+'px solid'; |
|||
p.sldB.style.borderColor = THIS.pickerInsetColor; |
|||
|
|||
// slider mouse area
|
|||
p.sldM.style.display = THIS.slider ? 'block' : 'none'; |
|||
p.sldM.style.position = 'absolute'; |
|||
p.sldM.style.right = '0'; |
|||
p.sldM.style.top = '0'; |
|||
p.sldM.style.width = jscolor.images.sld[0] + jscolor.images.arrow[0] + THIS.pickerFace + 2*THIS.pickerInset + 'px'; |
|||
p.sldM.style.height = p.box.style.height; |
|||
try { |
|||
p.sldM.style.cursor = 'pointer'; |
|||
} catch(eOldIE) { |
|||
p.sldM.style.cursor = 'hand'; |
|||
} |
|||
|
|||
// "close" button
|
|||
function setBtnBorder() { |
|||
var insetColors = THIS.pickerInsetColor.split(/\s+/); |
|||
var pickerOutsetColor = insetColors.length < 2 ? insetColors[0] : insetColors[1] + ' ' + insetColors[0] + ' ' + insetColors[0] + ' ' + insetColors[1]; |
|||
p.btn.style.borderColor = pickerOutsetColor; |
|||
} |
|||
p.btn.style.display = THIS.pickerClosable ? 'block' : 'none'; |
|||
p.btn.style.position = 'absolute'; |
|||
p.btn.style.left = THIS.pickerFace + 'px'; |
|||
p.btn.style.bottom = THIS.pickerFace + 'px'; |
|||
p.btn.style.padding = '0 15px'; |
|||
p.btn.style.height = '18px'; |
|||
p.btn.style.border = THIS.pickerInset + 'px solid'; |
|||
setBtnBorder(); |
|||
p.btn.style.color = THIS.pickerButtonColor; |
|||
p.btn.style.font = '12px sans-serif'; |
|||
p.btn.style.textAlign = 'center'; |
|||
try { |
|||
p.btn.style.cursor = 'pointer'; |
|||
} catch(eOldIE) { |
|||
p.btn.style.cursor = 'hand'; |
|||
} |
|||
p.btn.onmousedown = function () { |
|||
THIS.hidePicker(); |
|||
}; |
|||
p.btnS.style.lineHeight = p.btn.style.height; |
|||
|
|||
// load images in optimal order
|
|||
switch(modeID) { |
|||
case 0: var padImg = 'hs.png'; break; |
|||
case 1: var padImg = 'hv.png'; break; |
|||
} |
|||
p.padM.style.backgroundImage = "url('"+jscolor.getDir()+"cross.gif')"; |
|||
p.padM.style.backgroundRepeat = "no-repeat"; |
|||
p.sldM.style.backgroundImage = "url('"+jscolor.getDir()+"arrow.gif')"; |
|||
p.sldM.style.backgroundRepeat = "no-repeat"; |
|||
p.pad.style.backgroundImage = "url('"+jscolor.getDir()+padImg+"')"; |
|||
p.pad.style.backgroundRepeat = "no-repeat"; |
|||
p.pad.style.backgroundPosition = "0 0"; |
|||
|
|||
// place pointers
|
|||
redrawPad(); |
|||
redrawSld(); |
|||
|
|||
jscolor.picker.owner = THIS; |
|||
document.getElementsByTagName('body')[0].appendChild(p.boxB); |
|||
} |
|||
|
|||
|
|||
function getPickerDims(o) { |
|||
var dims = [ |
|||
2*o.pickerInset + 2*o.pickerFace + jscolor.images.pad[0] + |
|||
(o.slider ? 2*o.pickerInset + 2*jscolor.images.arrow[0] + jscolor.images.sld[0] : 0), |
|||
o.pickerClosable ? |
|||
4*o.pickerInset + 3*o.pickerFace + jscolor.images.pad[1] + o.pickerButtonHeight : |
|||
2*o.pickerInset + 2*o.pickerFace + jscolor.images.pad[1] |
|||
]; |
|||
return dims; |
|||
} |
|||
|
|||
|
|||
function redrawPad() { |
|||
// redraw the pad pointer
|
|||
switch(modeID) { |
|||
case 0: var yComponent = 1; break; |
|||
case 1: var yComponent = 2; break; |
|||
} |
|||
var x = Math.round((THIS.hsv[0]/6) * (jscolor.images.pad[0]-1)); |
|||
var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.pad[1]-1)); |
|||
jscolor.picker.padM.style.backgroundPosition = |
|||
(THIS.pickerFace+THIS.pickerInset+x - Math.floor(jscolor.images.cross[0]/2)) + 'px ' + |
|||
(THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.cross[1]/2)) + 'px'; |
|||
|
|||
// redraw the slider image
|
|||
var seg = jscolor.picker.sld.childNodes; |
|||
|
|||
switch(modeID) { |
|||
case 0: |
|||
var rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 1); |
|||
for(var i=0; i<seg.length; i+=1) { |
|||
seg[i].style.backgroundColor = 'rgb('+ |
|||
(rgb[0]*(1-i/seg.length)*100)+'%,'+ |
|||
(rgb[1]*(1-i/seg.length)*100)+'%,'+ |
|||
(rgb[2]*(1-i/seg.length)*100)+'%)'; |
|||
} |
|||
break; |
|||
case 1: |
|||
var rgb, s, c = [ THIS.hsv[2], 0, 0 ]; |
|||
var i = Math.floor(THIS.hsv[0]); |
|||
var f = i%2 ? THIS.hsv[0]-i : 1-(THIS.hsv[0]-i); |
|||
switch(i) { |
|||
case 6: |
|||
case 0: rgb=[0,1,2]; break; |
|||
case 1: rgb=[1,0,2]; break; |
|||
case 2: rgb=[2,0,1]; break; |
|||
case 3: rgb=[2,1,0]; break; |
|||
case 4: rgb=[1,2,0]; break; |
|||
case 5: rgb=[0,2,1]; break; |
|||
} |
|||
for(var i=0; i<seg.length; i+=1) { |
|||
s = 1 - 1/(seg.length-1)*i; |
|||
c[1] = c[0] * (1 - s*f); |
|||
c[2] = c[0] * (1 - s); |
|||
seg[i].style.backgroundColor = 'rgb('+ |
|||
(c[rgb[0]]*100)+'%,'+ |
|||
(c[rgb[1]]*100)+'%,'+ |
|||
(c[rgb[2]]*100)+'%)'; |
|||
} |
|||
break; |
|||
} |
|||
} |
|||
|
|||
|
|||
function redrawSld() { |
|||
// redraw the slider pointer
|
|||
switch(modeID) { |
|||
case 0: var yComponent = 2; break; |
|||
case 1: var yComponent = 1; break; |
|||
} |
|||
var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.sld[1]-1)); |
|||
jscolor.picker.sldM.style.backgroundPosition = |
|||
'0 ' + (THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.arrow[1]/2)) + 'px'; |
|||
} |
|||
|
|||
|
|||
function isPickerOwner() { |
|||
return jscolor.picker && jscolor.picker.owner === THIS; |
|||
} |
|||
|
|||
|
|||
function blurTarget() { |
|||
if(valueElement === target) { |
|||
THIS.importColor(); |
|||
} |
|||
if(THIS.pickerOnfocus) { |
|||
THIS.hidePicker(); |
|||
} |
|||
} |
|||
|
|||
|
|||
function blurValue() { |
|||
if(valueElement !== target) { |
|||
THIS.importColor(); |
|||
} |
|||
} |
|||
|
|||
|
|||
function setPad(e) { |
|||
var mpos = jscolor.getRelMousePos(e); |
|||
var x = mpos.x - THIS.pickerFace - THIS.pickerInset; |
|||
var y = mpos.y - THIS.pickerFace - THIS.pickerInset; |
|||
switch(modeID) { |
|||
case 0: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), 1 - y/(jscolor.images.pad[1]-1), null, leaveSld); break; |
|||
case 1: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), null, 1 - y/(jscolor.images.pad[1]-1), leaveSld); break; |
|||
} |
|||
} |
|||
|
|||
|
|||
function setSld(e) { |
|||
var mpos = jscolor.getRelMousePos(e); |
|||
var y = mpos.y - THIS.pickerFace - THIS.pickerInset; |
|||
switch(modeID) { |
|||
case 0: THIS.fromHSV(null, null, 1 - y/(jscolor.images.sld[1]-1), leavePad); break; |
|||
case 1: THIS.fromHSV(null, 1 - y/(jscolor.images.sld[1]-1), null, leavePad); break; |
|||
} |
|||
} |
|||
|
|||
|
|||
function dispatchImmediateChange() { |
|||
if (THIS.onImmediateChange) { |
|||
var callback; |
|||
if (typeof THIS.onImmediateChange === 'string') { |
|||
callback = new Function (THIS.onImmediateChange); |
|||
} else { |
|||
callback = THIS.onImmediateChange; |
|||
} |
|||
callback.call(THIS); |
|||
} |
|||
} |
|||
|
|||
|
|||
var THIS = this; |
|||
var modeID = this.pickerMode.toLowerCase()==='hvs' ? 1 : 0; |
|||
var abortBlur = false; |
|||
var |
|||
valueElement = jscolor.fetchElement(this.valueElement), |
|||
styleElement = jscolor.fetchElement(this.styleElement); |
|||
var |
|||
holdPad = false, |
|||
holdSld = false; |
|||
var |
|||
leaveValue = 1<<0, |
|||
leaveStyle = 1<<1, |
|||
leavePad = 1<<2, |
|||
leaveSld = 1<<3; |
|||
|
|||
// target
|
|||
jscolor.addEvent(target, 'focus', function() { |
|||
if(THIS.pickerOnfocus) { THIS.showPicker(); } |
|||
}); |
|||
jscolor.addEvent(target, 'blur', function() { |
|||
if(!abortBlur) { |
|||
window.setTimeout(function(){ abortBlur || blurTarget(); abortBlur=false; }, 0); |
|||
} else { |
|||
abortBlur = false; |
|||
} |
|||
}); |
|||
|
|||
// valueElement
|
|||
if(valueElement) { |
|||
var updateField = function() { |
|||
THIS.fromString(valueElement.value, leaveValue); |
|||
dispatchImmediateChange(); |
|||
}; |
|||
jscolor.addEvent(valueElement, 'keyup', updateField); |
|||
jscolor.addEvent(valueElement, 'input', updateField); |
|||
jscolor.addEvent(valueElement, 'blur', blurValue); |
|||
valueElement.setAttribute('autocomplete', 'off'); |
|||
} |
|||
|
|||
// styleElement
|
|||
if(styleElement) { |
|||
styleElement.jscStyle = { |
|||
backgroundImage : styleElement.style.backgroundImage, |
|||
backgroundColor : styleElement.style.backgroundColor, |
|||
color : styleElement.style.color |
|||
}; |
|||
} |
|||
|
|||
// require images
|
|||
switch(modeID) { |
|||
case 0: jscolor.requireImage('hs.png'); break; |
|||
case 1: jscolor.requireImage('hv.png'); break; |
|||
} |
|||
jscolor.requireImage('cross.gif'); |
|||
jscolor.requireImage('arrow.gif'); |
|||
|
|||
this.importColor(); |
|||
} |
|||
|
|||
}; |
|||
|
|||
|
|||
jscolor.install(); |
@ -1,104 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file Wall.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief The configuration form |
|||
* |
|||
* @author Timothée Jaussoin <edhelas_at_gmail_dot_com> |
|||
* |
|||
* @version 1.0 |
|||
* @date 28 October 2010 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class ConfigData extends WidgetBase |
|||
{ |
|||
function WidgetLoad() |
|||
{ |
|||
$this->addcss('configdata.css'); |
|||
} |
|||
|
|||
function ajaxClearRosterLink() { |
|||
$rd = new \modl\RosterLinkDAO(); |
|||
$rd->clearRosterLink(); |
|||
|
|||
$this->refresh(); |
|||
} |
|||
|
|||
function ajaxClearMessage() { |
|||
$md = new \modl\MessageDAO(); |
|||
$md->clearMessage(); |
|||
|
|||
$this->refresh(); |
|||
} |
|||
|
|||
function ajaxClearPost() { |
|||
$pd = new \modl\PostnDAO(); |
|||
$pd->clearPost(); |
|||
|
|||
$this->refresh(); |
|||
} |
|||
|
|||
function refresh() { |
|||
$html = $this->prepareConfigData(); |
|||
RPC::call('movim_fill', 'configdata', $html); |
|||
RPC::commit(); |
|||
} |
|||
|
|||
function prepareConfigData() { |
|||
$cd = new \modl\ContactDAO(); |
|||
$stats = $cd->getStatistics(); |
|||
|
|||
$clearrosterlink = $this->genCallAjax('ajaxClearRosterLink'); |
|||
$clearmessage = $this->genCallAjax('ajaxClearMessage'); |
|||
$clearpost = $this->genCallAjax('ajaxClearPost'); |
|||
|
|||
$html = ' |
|||
<form enctype="multipart/form-data" method="post" action="index.php" name="general"> |
|||
<fieldset> |
|||
<legend>'.t('Cache').'</legend> |
|||
<div class="clear"></div> |
|||
<div class="element thin"> |
|||
<label for="name">'.t('Post'). ' - '.$stats['Post'].'</label><br /> |
|||
<a |
|||
type="button" |
|||
name="email" |
|||
class="button icon back" |
|||
onclick="'.$clearpost.'">'.t('Clear').'</a> |
|||
</div> |
|||
<div class="element thin"> |
|||
<label for="name">'.t('Messages'). ' - '.$stats['Message'].'</label><br /> |
|||
<a |
|||
type="button" |
|||
name="email" |
|||
class="button icon back" |
|||
onclick="'.$clearmessage.'">'.t('Clear').'</a> |
|||
</div> |
|||
<div class="element thin"> |
|||
<label for="name">'.t('Contacts'). ' - '.$stats['RosterLink'].'</label><br /> |
|||
<a |
|||
type="button" |
|||
class="button icon back" |
|||
onclick="'.$clearrosterlink.'">'.t('Clear').'</a> |
|||
</div> |
|||
</fieldset> |
|||
</form>'; |
|||
return $html; |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
?>
|
|||
<div class="tabelem padded" title="<?php echo t('Data'); ?>" id="configdata" > |
|||
<?php echo $this->prepareConfigData(); ?>
|
|||
</div> |
|||
<?php |
|||
} |
|||
} |
@ -1,143 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file Roster.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief The Roster widget |
|||
* |
|||
* @author Jaussoin Timothée <edhelas@gmail.com> |
|||
* |
|||
* @version 1.0 |
|||
* @date 30 August 2010 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class ContactCard extends WidgetCommon |
|||
{ |
|||
|
|||
function WidgetLoad() |
|||
{ |
|||
$this->addcss('contactcard.css'); |
|||
$this->registerEvent('vcard', 'onVcard'); |
|||
} |
|||
|
|||
function onVcard($contact) |
|||
{ |
|||
$html = $this->prepareContactCard($contact); |
|||
RPC::call('movim_fill', 'contactcard', $html); |
|||
} |
|||
|
|||
function prepareContactCard($contact) |
|||
{ |
|||
$gender = getGender(); |
|||
$marital = getMarital(); |
|||
|
|||
$html .= ' |
|||
<form name="vcard" id="vcardform"><br /> |
|||
<h1>'.t('Profile').'</h1><br /> |
|||
<fieldset> |
|||
<legend>'.t('General Informations').'</legend>'; |
|||
|
|||
if($this->testIsSet($contact->fn)) |
|||
$html .= '<div class="element simple"> |
|||
<label for="fn">'.t('Name').'</label> |
|||
<span>'.$contact->fn.'</span> |
|||
</div>'; |
|||
|
|||
if($this->testIsSet($contact->name)) |
|||
$html .= '<div class="element simple"> |
|||
<label for="name">'.t('Nickname').'</label> |
|||
<span>'.$contact->name.'</span> |
|||
</div>'; |
|||
|
|||
if( |
|||
$contact->date != '0000-00-00' |
|||
&& $contact->date != '1970-01-01' |
|||
&& $this->testIsSet($contact->date)) |
|||
$html .= '<div class="element simple"> |
|||
<label for="day">'.t('Date of Birth').'</label> |
|||
<span>'.date('j M Y',strtotime($contact->date)).'</span> |
|||
</div>'; |
|||
|
|||
if($contact->gender != 'N' && $this->testIsSet($contact->gender)) |
|||
$html .= '<div class="element simple"> |
|||
<label for="gender">'.t('Gender').'</label> |
|||
<span>'.$gender[$contact->gender].'</span> |
|||
</div>'; |
|||
|
|||
if($contact->marital != 'none' && $this->testIsSet($contact->marital)) |
|||
$html .= '<div class="element simple"> |
|||
<label for="marital">'.t('Marital Status').'</label> |
|||
<span>'.$marital[$contact->marital].'</span> |
|||
</div>'; |
|||
|
|||
if($this->testIsSet($contact->email)) |
|||
$html .= '<div class="element simple"> |
|||
<label for="url">'.t('Email').'</label> |
|||
<a target="_blank" href="mailto:'.$contact->email.'">'.$contact->email.'</a> |
|||
</div>'; |
|||
if($this->testIsSet($contact->url)) |
|||
$html .= '<div class="element simple"> |
|||
<label for="url">'.t('Website').'</label> |
|||
<a target="_blank" href="'.$contact->url.'">'.$contact->url.'</a> |
|||
</div>'; |
|||
|
|||
if($this->testIsSet($contact->desc) && prepareString($contact->desc) != '') |
|||
$html .= '<div class="element large simple"> |
|||
<label for="desc">'.t('About Me').'</label> |
|||
<span>'.prepareString($contact->desc).'</span> |
|||
</div>'; |
|||
|
|||
if($this->testIsSet($contact->adrlocality) || |
|||
$this->testIsSet($contact->adrcountry)) { |
|||
$html .= '</fieldset> |
|||
<br /> |
|||
<fieldset> |
|||
<legend>'.t('Geographic Position').'</legend>'; |
|||
|
|||
if($this->testIsSet($contact->adrlocality)) { |
|||
$locality .= '<div class="element simple"> |
|||
<label for="desc">'.t('Locality').'</label> |
|||
<span>'.$contact->adrlocality; |
|||
if($contact->adrpostalcode != 0) |
|||
$locality .= ' ('.$contact->adrpostalcode.')'; |
|||
$locality .= '</span> |
|||
</div>'; |
|||
|
|||
$html .= $locality; |
|||
} |
|||
|
|||
if($this->testIsSet($contact->adrcountry)) |
|||
$html .= '<div class="element simple"> |
|||
<label for="desc">'.t('Country').'</label> |
|||
<span>'.$contact->adrcountry.'</span> |
|||
</div>'; |
|||
} |
|||
|
|||
$html .= '</fieldset> |
|||
<div class="config_button" onclick="'.$this->genCallWidget("ContactSummary","ajaxRefreshVcard", "'".$contact->jid."'").'"></div> |
|||
</form>'; |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
$cd = new modl\ContactDAO(); |
|||
$contact = $cd->get($_GET['f']); |
|||
?>
|
|||
<div class="tabelem protect red" title="<?php echo t('Profile'); ?>" id="contactcard" > |
|||
<?php |
|||
if(isset($contact)) |
|||
echo $this->prepareContactCard($contact); |
|||
?>
|
|||
</div> |
|||
<?php |
|||
} |
|||
} |
@ -1,8 +0,0 @@ |
|||
#contactcard { |
|||
padding: 0px 1.5em; |
|||
} |
|||
|
|||
#contactcard h1 { |
|||
padding: 0px; |
|||
padding-bottom: 20px; |
|||
} |
@ -1,212 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file Roster.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief The Roster widget |
|||
* |
|||
* @author Jaussoin Timothée <edhelas@gmail.com> |
|||
* |
|||
* @version 1.0 |
|||
* @date 30 August 2010 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class ContactInfo extends WidgetCommon |
|||
{ |
|||
function WidgetLoad() { |
|||
|
|||
} |
|||
|
|||
function ajaxRemoveContact($jid) { |
|||
$r = new moxl\RosterRemoveItem(); |
|||
$r->setTo($jid) |
|||
->request(); |
|||
|
|||
$p = new moxl\PresenceUnsubscribe(); |
|||
$p->setTo($jid) |
|||
->request(); |
|||
} |
|||
|
|||
|
|||
function prepareContactInfo() |
|||
{ |
|||
$cd = new \modl\ContactDAO(); |
|||
$c = $cd->getRosterItem($_GET['f']); |
|||
|
|||
$html = ''; |
|||
|
|||
if(isset($c)) { |
|||
// Mood
|
|||
if($c->mood) { |
|||
$moodarray = getMood(); |
|||
|
|||
$html .= '<h2>'.t('Mood').'</h2>'; |
|||
$mood = ''; |
|||
foreach(unserialize($c->mood) as $m) |
|||
$mood .= $moodarray[$m].','; |
|||
$html .= t("I'm ").substr($mood, 0, -1).'<br />'; |
|||
} |
|||
|
|||
if($c->tuneartist || $c->tunetitle) { |
|||
$html .= '<h2>'.t('Listening').'</h2>'; |
|||
if($c->tuneartist) |
|||
$artist = $c->tuneartist. ' - '; |
|||
if($c->tunetitle) |
|||
$title = $c->tunetitle; |
|||
if($c->tunesource) |
|||
$album = t('on').' '.$c->tunesource; |
|||
$html .= $artist.$title.' '.$album; |
|||
} |
|||
|
|||
// Last seen
|
|||
if($c->delay && $c->delay != '0000-00-00 00:00:00') { |
|||
$html .= '<h2>'.t('Last seen').'</h2>'; |
|||
$html .= prepareDate(strtotime($c->delay)).'<br />'; |
|||
} |
|||
|
|||
if($c->loclatitude != '' && $c->loclongitude != '' |
|||
|| $c->getPlace() != '') { |
|||
|
|||
$html .= ' |
|||
<h2>'.t('Location').'</h2>'; |
|||
|
|||
$html .= prepareDate(strtotime($c->loctimestamp)).'<br /><br />'; |
|||
if($c->getPlace() != '') |
|||
$html .= $c->getPlace().'<br /><br />'; |
|||
|
|||
if(isset($c->loclatitude) && isset($c->loclongitude)) |
|||
$html .= ' |
|||
<div style="height: 250px;" id="map"></div> |
|||
<script type="text/javascript"> |
|||
var map = L.map("map").setView(['.$c->loclatitude.' ,'.$c->loclongitude.'], 11); |
|||
|
|||
L.tileLayer("http://tile.openstreetmap.org/{z}/{x}/{y}.png", { |
|||
attribution: "", |
|||
maxZoom: 18 |
|||
}).addTo(map); |
|||
var marker = L.marker(['.$c->loclatitude.' ,'.$c->loclongitude.']).addTo(map) |
|||
</script>'; |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
// Client informations
|
|||
if($c->node && $c->ver) { |
|||
$node = $c->node.'#'.$c->ver; |
|||
|
|||
$cad = new \modl\CapsDAO(); |
|||
$caps = $cad->get($node); |
|||
|
|||
$clienttype = |
|||
array( |
|||
'bot' => t('Bot'), |
|||
'pc' => t('Desktop'), |
|||
'phone' => t('Phone'), |
|||
'handheld' => t('Phone'), |
|||
'web' => t('Web'), |
|||
); |
|||
|
|||
if(isset($caps) && $caps->name != '' && $caps->type != '' ) { |
|||
$cinfos = ''; |
|||
$cinfos .= $caps->name.' ('.$clienttype[$caps->type].')<br />'; |
|||
|
|||
$html .='<h2>'.t('Client Informations').'</h2>' . $cinfos; |
|||
} |
|||
} |
|||
|
|||
// Chat button
|
|||
if($c->jid != $this->user->getLogin()) { |
|||
|
|||
$presences = getPresences(); |
|||
|
|||
$html .='<h2>'.t('Actions').'</h2>'; |
|||
|
|||
if(isset($c->presence) && !in_array($c->presence, array(5, 6))) { |
|||
$html .= ' |
|||
<a |
|||
class="button tiny icon chat" |
|||
href="#" |
|||
style="float: left;" |
|||
id="friendchat" |
|||
onclick="'.$this->genCallWidget("Chat","ajaxOpenTalk", "'".$c->jid."'").'" |
|||
> |
|||
'.$presences[$c->presence].' - '.t('Chat').' |
|||
</a>'; |
|||
} |
|||
} |
|||
|
|||
$html .= '<div style="clear: both;"></div>'; |
|||
|
|||
$html .=' |
|||
<a |
|||
class="" |
|||
href="#" |
|||
style="margin: 10px 0px; display: block;" |
|||
id="friendremoveask" |
|||
onclick="
|
|||
document.querySelector(\'#friendremoveyes\').style.display = \'block\';
|
|||
document.querySelector(\'#friendremoveno\').style.display = \'block\';
|
|||
this.style.display = \'none\' |
|||
"
|
|||
> |
|||
'.t('Remove this contact').' |
|||
</a> |
|||
|
|||
<a |
|||
class="button tiny icon yes merged left';
|
|||
if(!isset($c->presence) || $c->presence == 5) |
|||
$html .=' left'; |
|||
$html .= '"
|
|||
href="#" |
|||
id="friendremoveyes" |
|||
style="float: left; display: none;" |
|||
onclick="'.$this->genCallAjax("ajaxRemoveContact", "'".$_GET['f']."'")
|
|||
. 'this.className=\'button tiny icon loading merged left\'; setTimeout(function() {location.reload(false)}, 2000);"
|
|||
> |
|||
'.t('Yes').' |
|||
</a> |
|||
|
|||
<a |
|||
class="button tiny icon no merged right" |
|||
href="#" |
|||
style="float: left; display: none;" |
|||
id="friendremoveno" |
|||
onclick="
|
|||
document.querySelector(\'#friendremoveask\').style.display = \'block\';
|
|||
document.querySelector(\'#friendremoveyes\').style.display = \'none\';
|
|||
this.style.display = \'none\' |
|||
"
|
|||
> |
|||
'.t('No').' |
|||
</a>'; |
|||
} elseif($_GET['f'] != $this->user->getLogin()) { |
|||
|
|||
$html .='<h2>'.t('Actions').'</h2>'; |
|||
|
|||
$html .=' |
|||
<a |
|||
class="button tiny icon add" |
|||
href="#" |
|||
onclick="'.$this->genCallWidget("Roster","ajaxAddContact", "'".$_GET['f']."'", "''")
|
|||
. 'this.className=\'button tiny icon loading merged left\'; setTimeout(function() {location.reload(false)}, 2000);"
|
|||
> |
|||
'.t('Invite this user').' |
|||
</a>'; |
|||
} |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
function build() { |
|||
echo $this->prepareContactInfo(); |
|||
} |
|||
} |
@ -1,83 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file ContactManage.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief A little widget which manage the current contact |
|||
* |
|||
* @author Jaussoin Timothée <edhelas@gmail.com> |
|||
* |
|||
* @version 1.0 |
|||
* @date 24 March 2013 |
|||
* |
|||
* Copyright (C)2013 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class ContactManage extends WidgetCommon |
|||
{ |
|||
function WidgetLoad() { |
|||
|
|||
} |
|||
|
|||
public function ajaxContactManage($form) { |
|||
$rd = new \moxl\RosterUpdateItem(); |
|||
$rd->setTo(echapJid($form['jid'])) |
|||
->setName(htmlspecialchars($form['alias'])) |
|||
->setGroup(htmlspecialchars($form['group'])) |
|||
->request(); |
|||
Notification::appendNotification(t('Contact updated')); |
|||
} |
|||
|
|||
private function prepareContactManage($jid) { |
|||
$rd = new \modl\RosterLinkDAO(); |
|||
|
|||
$groups = $rd->getGroups(); |
|||
$rl = $rd->get($jid); |
|||
|
|||
$submit = $this->genCallAjax('ajaxContactManage', "movim_parse_form('manage')"); |
|||
|
|||
$html = ''; |
|||
|
|||
$html .= '<h2>'.t('Manage').'</h2>'; |
|||
|
|||
$html .= ' |
|||
<form name="manage">'; |
|||
|
|||
$ghtml = ''; |
|||
foreach($groups as $g) |
|||
$ghtml .= '<option value="'.$g.'"/>'; |
|||
|
|||
$html .= ' |
|||
<input type="hidden" name="jid" value="'.$jid.'"/> |
|||
<div class="element large mini"> |
|||
<input name="alias" id="alias" class="tiny" placeholder="'.t('Alias').'" value="'.$rl->rostername.'"/> |
|||
</div> |
|||
<div class="element large mini"> |
|||
<datalist id="group" style="display: none;"> |
|||
'.$ghtml.' |
|||
</datalist> |
|||
<input name="group" list="group" id="alias" class="tiny" placeholder="'.t('Group').'" value="'.$rl->group.'"/> |
|||
</div> |
|||
|
|||
<a class="button tiny icon yes" onclick="'.$submit.'">'.t('Save').'</a>'; |
|||
|
|||
$html .= ' |
|||
</form>'; |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
function build() { |
|||
?>
|
|||
<div class="clear"></div> |
|||
<?php |
|||
if($_GET['f'] != $this->user->getLogin()) |
|||
echo $this->prepareContactManage($_GET['f']); |
|||
} |
|||
|
|||
} |
@ -1,75 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file ContactPubsubSubscription.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief The Group configuration widget |
|||
* |
|||
* @author Ho Christine <nodpounod@gmail.com> |
|||
* |
|||
* @version 1.0 |
|||
* @date 24 March 2013 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class ContactPubsubSubscription extends WidgetBase |
|||
{ |
|||
|
|||
function WidgetLoad() |
|||
{ |
|||
$this->registerEvent('groupsubscribedlist', 'onGroupSubscribedList'); |
|||
$this->registerEvent('groupsubscribedlisterror', 'onGroupSubscribedListError'); |
|||
} |
|||
|
|||
function prepareList($list) { |
|||
if(is_array($list[0])){ |
|||
$html = '<ul class="list">'; |
|||
|
|||
foreach($list as $item){ |
|||
$html .= '<li><a href="?q=node&s='.$item[1].'&n='.$item[0].'">'.$item[2].'</a></li>'; |
|||
} |
|||
|
|||
$html .= '</ul>'; |
|||
return $html; |
|||
} |
|||
|
|||
Notification::appendNotification(t('No public groups found'), 'info'); |
|||
} |
|||
|
|||
function onGroupSubscribedList($list) { |
|||
$html = $this->prepareList($list); |
|||
RPC::call('movim_fill', 'publicgroups', $html); |
|||
} |
|||
|
|||
function onGroupSubscribedListError($error) |
|||
{ |
|||
Notification::appendNotification($error, 'error'); |
|||
} |
|||
|
|||
function ajaxGetGroupSubscribedList($to){ |
|||
$r = new moxl\PubsubSubscriptionListGetFriends(); |
|||
$r->setTo($to)->request(); |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
?>
|
|||
<div class="tabelem padded protect red" title="<?php echo t('Public groups'); ?>" id="groupsubscribedlistfromfriend"> |
|||
<a |
|||
class="button icon yes" |
|||
onclick="<?php echo $this->genCallAjax('ajaxGetGroupSubscribedList', "'".$_GET['f']."'"); ?> this.style.display = 'none'"> |
|||
<?php echo t("Get public groups");?>
|
|||
</a> |
|||
<div id="publicgroups"></div> |
|||
</div> |
|||
<?php |
|||
} |
|||
} |
|||
|
|||
?>
|
@ -1,121 +0,0 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @package Widgets |
|||
* |
|||
* @file Roster.php |
|||
* This file is part of MOVIM. |
|||
* |
|||
* @brief The Roster widget |
|||
* |
|||
* @author Jaussoin Timothée <edhelas@gmail.com> |
|||
* |
|||
* @version 1.0 |
|||
* @date 30 August 2010 |
|||
* |
|||
* Copyright (C)2010 MOVIM project |
|||
* |
|||
* See COPYING for licensing information. |
|||
*/ |
|||
|
|||
class ContactSummary extends WidgetCommon |
|||
{ |
|||
|
|||
function WidgetLoad() |
|||
{ |
|||
$this->addcss('contactsummary.css'); |
|||
$this->registerEvent('vcard', 'onVcard'); |
|||
} |
|||
|
|||
function onVcard($contact) |
|||
{ |
|||
$html = $this->prepareContactSummary($contact); |
|||
RPC::call('movim_fill', 'contactsummary', $html); |
|||
} |
|||
|
|||
function ajaxRefreshVcard($jid) |
|||
{ |
|||
$r = new moxl\VcardGet(); |
|||
$r->setTo($jid)->request(); |
|||
} |
|||
|
|||
function prepareContactSummary($contact) |
|||
{ |
|||
$gender = getGender(); |
|||
$marital = getMarital(); |
|||
|
|||
// Contact avatar
|
|||
$html .= ' |
|||
<div class="block avatar"> |
|||
<img src="'.$contact->getPhoto('l').'"/> |
|||
</div>'; |
|||
|
|||
$presencetxt = getPresencesTxt(); |
|||
|
|||
// Contact general infos
|
|||
$html .= ' |
|||
<div class="block"> |
|||
<h1 class="'.$presencetxt[$contact->presence].'">'.$contact->getTrueName().'</h1><br />'; |
|||
|
|||
if($this->testIsSet($contact->name)) |
|||
$html .= $contact->name.' '; |
|||
else |
|||
$html .= $contact->getTrueName().' '; |
|||
|
|||
if($this->testIsSet($contact->url)) |
|||
$html .= '<br /><a target="_blank" href="'.$contact->url.'">'.$contact->url.'</a>'; |
|||
|
|||
$html .= '<br /><br /> |
|||
</div>'; |
|||
|
|||
if($this->testIsSet($contact->status)) { |
|||
$html .= ' |
|||
<div |
|||
class="block" |
|||
style="
|
|||
max-height: 7em; |
|||
margin: 1em; |
|||
min-height: auto; |
|||
overflow: hidden; |
|||
text-overflow: ellipsis;"
|
|||
>'; |
|||
$html .= ' |
|||
<div class="textbubble"> |
|||
'.prepareString($contact->status).' |
|||
</div>'; |
|||
$html .= ' |
|||
</div>'; |
|||
} |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
$cd = new modl\ContactDAO(); |
|||
|
|||
|
|||
if($_GET['f'] == $this->user->getLogin()) |
|||
$contact = $cd->get($this->user->getLogin()); |
|||
else |
|||
$contact = $cd->getRosterItem($_GET['f']); |
|||
|
|||
if(!isset($contact)) |
|||
$contact = $cd->get($_GET['f']); |
|||
?>
|
|||
<div id="contactsummary"> |
|||
<?php |
|||
if(isset($contact->photobin)) { |
|||
echo $this->prepareContactSummary($contact); |
|||
} |
|||
|
|||
else { |
|||
$contact = new modl\Contact(); |
|||
echo $this->prepareContactSummary($contact); |
|||
?>
|
|||
<script type="text/javascript">setTimeout("<?php $this->callAjax('ajaxRefreshVcard', "'".$_GET['f']."'");?>", 1000);</script> |
|||
<?php } ?>
|
|||
</div> |
|||
<?php |
|||
} |
|||
} |
@ -1 +0,0 @@ |
|||
|
@ -1,160 +0,0 @@ |
|||
<?php |
|||
|
|||
class Explore extends WidgetCommon { |
|||
function WidgetLoad() |
|||
{ |
|||
$this->addcss('explore.css'); |
|||
} |
|||
|
|||
function ajaxSearchContacts($form) { |
|||
$html = $this->prepareContacts($form); |
|||
|
|||
RPC::call('movim_fill', 'contactsresult', $html); |
|||
RPC::commit(); |
|||
} |
|||
|
|||
function colorSearch($search, $text) { |
|||
return str_replace( |
|||
$search, |
|||
'<span style="background-color: yellow;">'.$search.'</span>', |
|||
$text |
|||
); |
|||
} |
|||
|
|||
function prepareServers() { |
|||
$nd = new \modl\NodeDAO(); |
|||
|
|||
$servers = $nd->getServers(); |
|||
|
|||
$html = '<ul class="list">'; |
|||
|
|||
foreach($servers as $s) { |
|||
$html .= ' |
|||
<li> |
|||
<a href="'.Route::urlize('server', $s->serverid).'">'. |
|||
$s->serverid. ' |
|||
<span class="tag">'.$s->number.'</span> |
|||
</a> |
|||
</li>'; |
|||
} |
|||
|
|||
$html .= '</ul>'; |
|||
|
|||
return $html; |
|||
//var_dump($nd->getServers());
|
|||
} |
|||
|
|||
function prepareContacts($form = false) { |
|||
/*if(!$form){ |
|||
$where = array('public' => 1); |
|||
} |
|||
else{ |
|||
$where = array( |
|||
'public' => 1, |
|||
array( |
|||
'fn%' => '%'.$form['search'].'%', |
|||
'|jid%' => '%'.$form['search'].'%', |
|||
'|name%' => '%'.$form['search'].'%', |
|||
'|email%' => '%'.$form['search'].'%', |
|||
'|nickname%' => '%'.$form['search'].'%' |
|||
) |
|||
); |
|||
} |
|||
$users_limit = 20; |
|||
|
|||
$gender = getGender(); |
|||
$marital = getMarital(); |
|||
|
|||
$query = Contact::query()->select() |
|||
->where($where) |
|||
//s->orderby('id', true)
|
|||
->limit(0, $users_limit); |
|||
$users = Contact::run_query($query); |
|||
|
|||
$html = ' |
|||
<div class="posthead"> |
|||
<!--<ul class="filters"> |
|||
<li class="on">'.t('Last registered').'</li> |
|||
</ul>--> |
|||
|
|||
<div class="clear"></div> |
|||
</div>';*/ |
|||
$cd = new \modl\ContactDAO(); |
|||
$users = array_reverse($cd->getAllPublic()); |
|||
|
|||
$gender = getGender(); |
|||
$marital = getMarital(); |
|||
|
|||
foreach($users as $user) { |
|||
$html .= ' |
|||
<div class="post"> |
|||
<a href="?q=friend&f='.$user->jid.'"> |
|||
<img class="avatar" src="'.$user->getPhoto('m').'"/> |
|||
<div class="postbubble"> |
|||
<span class="name">'. |
|||
$user->getTrueName().' |
|||
</span> |
|||
<span class="asv">'. |
|||
$user->getAge().' '. |
|||
$gender[$user->gender].' '. |
|||
$marital[$user->marital].' |
|||
</span> |
|||
<div |
|||
class="content" |
|||
style="
|
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
white-space: nowrap; |
|||
height: 1.5em; |
|||
"
|
|||
>'.prepareString($user->desc).'</div> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
'; |
|||
} |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
?>
|
|||
<div id="explore"> |
|||
<!--<form name="searchform" style="margin: 1em 1.5em;" onsubmit="event.preventDefault();"> |
|||
<div class="element" style="min-height: 0em;"> |
|||
<input |
|||
id="addjid" |
|||
class="tiny" |
|||
name="search" |
|||
placeholder="<?php echo t('Search a contact'); ?>" |
|||
onkeypress="if(event.keyCode==13){<?php $this->callAjax("ajaxSearchContacts","movim_parse_form('searchform')"); ?>}" |
|||
/> |
|||
</div> |
|||
<div class="element" style="min-height: 0em; margin-top: 5px;"> |
|||
<a |
|||
class="button icon submit" |
|||
href="#" |
|||
onclick="<?php $this->callAjax("ajaxSearchContacts","movim_parse_form('searchform')"); ?> " |
|||
style=""> |
|||
<?php echo t('Search'); ?>
|
|||
</a> |
|||
</div> |
|||
</form>--> |
|||
|
|||
<div id="serverresult" class="paddedtop"> |
|||
<h2><?php echo t('Discussion Servers'); ?></h2>
|
|||
<?php echo $this->prepareServers(); ?>
|
|||
</div> |
|||
|
|||
<div class="paddedtopbottom"> |
|||
<h2><?php echo t('Last registered'); ?></h2>
|
|||
</div> |
|||
<div id="contactsresult"> |
|||
<?php echo $this->prepareContacts(); ?>
|
|||
</div> |
|||
</div> |
|||
<?php |
|||
|
|||
} |
|||
} |
@ -1,4 +0,0 @@ |
|||
#explore { |
|||
margin-bottom: 2em; |
|||
min-height: 600px; |
|||
} |
@ -1,213 +0,0 @@ |
|||
<?php |
|||
|
|||
class Feed extends WidgetCommon { |
|||
private $_feedsize = 10; |
|||
|
|||
function WidgetLoad() |
|||
{ |
|||
$this->addcss('feed.css'); |
|||
$this->addjs('feed.js'); |
|||
|
|||
$this->registerEvent('post', 'onStream'); |
|||
$this->registerEvent('postdeleted', 'onPostDelete'); |
|||
$this->registerEvent('postdeleteerror', 'onPostDeleteError'); |
|||
|
|||
$this->registerEvent('comment', 'onComment'); |
|||
$this->registerEvent('nocomment', 'onNoComment'); |
|||
$this->registerEvent('nocommentstream', 'onNoCommentStream'); |
|||
$this->registerEvent('commentpublisherror', 'onCommentPublishError'); |
|||
|
|||
$this->registerEvent('stream', 'onStream'); |
|||
$this->registerEvent('postpublished', 'onPostPublished'); |
|||
$this->registerEvent('postpublisherror', 'onPostPublishError'); |
|||
|
|||
$this->registerEvent('nodecreated', 'onNodeCreated'); |
|||
$this->registerEvent('nodecreationerror', 'onNodeCreationError'); |
|||
|
|||
$this->registerEvent('config', 'onConfig'); |
|||
|
|||
$this->cached = false; |
|||
} |
|||
|
|||
function onConfig(array $data) |
|||
{ |
|||
$this->user->setConfig($data); |
|||
RPC::call('movim_fill', 'feedhead', $this->prepareHead()); |
|||
} |
|||
|
|||
function onNodeCreated() { |
|||
$config = $this->user->getConfig(); |
|||
$config['feed'] = 'created'; |
|||
|
|||
$s = new moxl\StorageSet(); |
|||
$s->setXmlns('movim:prefs') |
|||
->setData(serialize($config)) |
|||
->request(); |
|||
} |
|||
|
|||
function onNodeCreationError() { |
|||
$config = $this->user->getConfig(); |
|||
$config['feed'] = 'error'; |
|||
|
|||
$s = new moxl\StorageSet(); |
|||
$s->setXmlns('movim:prefs') |
|||
->setData(serialize($config)) |
|||
->request(); |
|||
|
|||
Notification::appendNotification( |
|||
t("Your server doesn't support post publication, you can only read contact's feeds"), |
|||
'error'); |
|||
} |
|||
|
|||
function onCommentPublishError() { |
|||
$html = |
|||
'<div class="message error">'. |
|||
t("Comment publication error").' |
|||
</div>'; |
|||
RPC::call('movim_fill', 'feednotifs', $html); |
|||
} |
|||
|
|||
function onPostPublished($post) { |
|||
$pd = new \modl\PostnDAO(); |
|||
$pl = $pd->getFeed(-1, $this->_feedsize); |
|||
|
|||
$html = $this->preparePosts($pl); |
|||
|
|||
RPC::call('createCommentNode', $post->nodeid); |
|||
RPC::call('movim_fill', 'feedcontent', $html); |
|||
} |
|||
|
|||
function ajaxCreateCommentNode($parentid) { |
|||
$n = new moxl\MicroblogCommentCreateNode(); |
|||
$n->setTo($this->user->getLogin()) |
|||
->setParentId($parentid) |
|||
->request(); |
|||
} |
|||
|
|||
function onPostPublishError($error) { |
|||
Notification::appendNotification(t('An error occured : ').$error, 'error'); |
|||
} |
|||
|
|||
function prepareHead() { |
|||
$html = ''; |
|||
|
|||
global $session; |
|||
|
|||
if($session['config']['config'] == false) { |
|||
$html .= |
|||
'<div class="message warning" style="margin: 1.5em;">'. |
|||
t("Your server doesn't support post publication, you can only read contact's feeds"). |
|||
'</div>'; |
|||
} elseif(!isset($session['config']['feed'])) { |
|||
$html .= ' |
|||
<div id="feednotifs"> |
|||
<div class="message info">'. |
|||
t("Creating your feed..."). |
|||
'</div> |
|||
</div> |
|||
<script type="text/javascript">'. |
|||
$this->genCallAjax('ajaxCreateNode'). |
|||
'</script>'; |
|||
} else { |
|||
$html .= ' |
|||
<script type="text/javascript"> |
|||
function createCommentNode(parentid) {'. |
|||
$this->genCallAjax('ajaxCreateCommentNode', 'parentid[0]'). |
|||
'} |
|||
</script> |
|||
'.$this->prepareSubmitForm($this->user->getLogin(), 'urn:xmpp:microblog:0').' |
|||
<div id="feednotifs"></div>'; |
|||
} |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
function prepareFeed($start) { |
|||
$pd = new \modl\PostnDAO(); |
|||
$pl = $pd->getFeed($start+1, $this->_feedsize); |
|||
|
|||
|
|||
$html = $this->preparePosts($pl); |
|||
|
|||
// We ask for the HTML of all the posts
|
|||
|
|||
$next = $start + $this->_feedsize; |
|||
|
|||
if(sizeof($pl) > $this->_feedsize-1 && $html != '') { |
|||
$html .= ' |
|||
<div class="post"> |
|||
<div |
|||
class="older" |
|||
onclick="'.$this->genCallAjax('ajaxGetFeed', "'".$next."'").'; this.parentNode.style.display = \'none\'">'. |
|||
t('Get older posts').' |
|||
</div> |
|||
</div>'; |
|||
} |
|||
|
|||
return $html; |
|||
} |
|||
|
|||
function ajaxGetFeed($start) { |
|||
$html = $this->prepareFeed($start); |
|||
RPC::call('movim_append', 'feedcontent', $html); |
|||
RPC::commit(); |
|||
} |
|||
|
|||
function onStream($payload) { |
|||
$html = ''; |
|||
$html = $this->prepareFeed(-1); |
|||
|
|||
if($html == '') |
|||
$html = ' |
|||
<div class="message info" style="margin: 1.5em; margin-top: 0em;">'. |
|||
t("Your feed cannot be loaded.").' |
|||
</div>'; |
|||
RPC::call('movim_fill', 'feedcontent', $html); |
|||
|
|||
RPC::commit(); |
|||
} |
|||
|
|||
function ajaxCreateNode() |
|||
{ |
|||
$p = new moxl\MicroblogCreateNode(); |
|||
$p->setTo($this->user->getLogin()) |
|||
->request(); |
|||
} |
|||
|
|||
function build() |
|||
{ |
|||
?>
|
|||
<div class="tabelem" title="<?php echo t('Feed'); ?>" id="feed"> |
|||
<div id="feedhead"> |
|||
<?php |
|||
echo $this->prepareHead(); |
|||
?>
|
|||
</div> |
|||
|
|||
<div class="posthead"> |
|||
<a |
|||
class="button tiny icon blog merged left" |
|||
href="<?php echo Route::urlize('blog',$this->user->getLogin()); ?>" |
|||
target="_blank"> |
|||
<?php echo t('Blog'); ?>
|
|||
</a><a |
|||
class="button tiny icon feed merged right" |
|||
href="<?php echo Route::urlize('feed',$this->user->getLogin()); ?>" |
|||
target="_blank"> |
|||
<?php echo t('Feed'); ?> (Atom)
|
|||
</a> |
|||
<ul class="filters"> |
|||
<li class="on" onclick="showPosts(this, false);"><?php echo t('All');?></li>
|
|||
<li onclick="showPosts(this, true);"><?php echo t('My Posts');?></li>
|
|||
</ul> |
|||
</div> |
|||
|
|||
<div id="feedcontent"> |
|||
<?php |
|||
echo $this->prepareFeed(-1); |
|||
?>
|
|||
</div> |
|||
</div> |
|||
<?php |
|||
} |
|||
} |
@ -1 +0,0 @@ |
|||
|