v1.0.0 RC 1
52
.htaccess
@@ -8,53 +8,47 @@ RewriteEngine on
|
||||
#ErrorDocument 404 /databap/index.php?p=error&test=%{REQUEST_URI}
|
||||
#ErrorDocument 500 /databap/index.php?p=error
|
||||
|
||||
#reading procedure bytes (by id/phrase)
|
||||
RewriteRule ^(.*)(p|proc|procedure)\-([0-9]+)$ index.php?p=procedure&proc_id=$3 [L]
|
||||
#Read procedure (by id)
|
||||
RewriteRule ^(p|proc|procedure)\-([0-9]+)$ index.php?p=procedure&id=$2 [L]
|
||||
|
||||
#Article (by id)
|
||||
RewriteRule ^(.*)(a|art|article)\-(.+)$ index.php?a=art_redirect&id=$3 [L]
|
||||
#Add procedure
|
||||
RewriteRule ^(add_proc|add_procedure|p\-|proc\-?|procedure\-?)$ index.php?p=procedure [L]
|
||||
|
||||
#Doc (by id)
|
||||
RewriteRule ^(.*)(d|doc|documentation)\-(.+)$ index.php?p=doc&doc_id=$3 [L]
|
||||
#Read doc (by id)
|
||||
RewriteRule ^(d|doc|documentation)\-([0-9]+)$ index.php?p=doc&id=$2 [L]
|
||||
|
||||
#reading code bytes (by id/phrase)
|
||||
RewriteRule ^(.*)(c|code)\-(.+)$ index.php?p=read_code&code=$3 [L]
|
||||
#Add doc
|
||||
RewriteRule ^(d|doc|documentation)$ index.php?p=doc [L]
|
||||
|
||||
#search (by phrase)
|
||||
RewriteRule ^(.*)(recherche|search)\-(.+)$ index.php?p=search&search_words=$3 [L]
|
||||
|
||||
#Add Procedure
|
||||
RewriteRule ^(.*)(add_proc|add_procedure|p\-|proc|proc\-|procedure|procedure\-)$ index.php?p=procedure [L]
|
||||
#Read code (by id/phrase)
|
||||
RewriteRule ^(c|code)\-(.+)$ index.php?p=code&id=$2 [L]
|
||||
|
||||
#Add Code
|
||||
RewriteRule ^(.*)(add_code|c\-|code|code\-)$ index.php?p=add_code [L]
|
||||
RewriteRule ^(c\-?|code\-?)$ index.php?p=code [L]
|
||||
|
||||
#Add Doc
|
||||
RewriteRule ^(.*)doc$ index.php?p=doc [L]
|
||||
#Read article (by id)
|
||||
RewriteRule ^(a|art|article)\-([0-9]+)$ index.php?a=art_redirect&id=$2 [L]
|
||||
|
||||
#search (by phrase)
|
||||
RewriteRule ^(recherche|search|r|s)\-(.+)$ index.php?p=search&search_words=$2 [L]
|
||||
|
||||
#Liste
|
||||
RewriteRule ^(.*)liste$ index.php?p=list [L]
|
||||
RewriteRule ^(liste?)$ index.php?p=list [L]
|
||||
|
||||
#Profile (by id)
|
||||
RewriteRule ^(.*)(p|profil)\-(.+)$ index.php?p=profile&profile_user=$3 [L]
|
||||
RewriteRule ^(u|user|profile?)\-(.+)$ index.php?p=profile&id=$2 [L]
|
||||
|
||||
#Profile (current user)
|
||||
RewriteRule ^(.*)(p\-|profil|profil\-)$ index.php?p=profile&profile_user= [L]
|
||||
RewriteRule ^(u\-?|user\-?|profile?\-?)$ index.php?p=profile&id= [L]
|
||||
|
||||
#Chat (by message id)
|
||||
RewriteRule ^(.*)chat\-(.+)$ index.php?p=chat&id=$2 [L]
|
||||
RewriteRule ^chat\-(.+)$ index.php?p=chat&id=$1 [L]
|
||||
|
||||
#Chat (current chat)
|
||||
RewriteRule ^(.*)(chat|chat\-)$ index.php?p=chat [L]
|
||||
RewriteRule ^(chat|chat\-)$ index.php?p=chat [L]
|
||||
|
||||
#Options
|
||||
RewriteRule ^(.*)options$ index.php?p=options [L]
|
||||
|
||||
#RSS Feed (by category)
|
||||
RewriteRule ^(.*)rss\-(.+)$ index.php?p=rss&cat=$2 [L]
|
||||
|
||||
#RSS Feed (all)
|
||||
RewriteRule ^(.*)rss$ index.php?p=rss [L]
|
||||
RewriteRule ^options$ index.php?p=options [L]
|
||||
|
||||
#Eg
|
||||
#prevent www.
|
||||
@@ -62,7 +56,7 @@ RewriteRule ^(.*)rss$ index.php?p=rss [L]
|
||||
#RewriteRule ^(.*)$ http://%1/$1 [R=301,NC,L]
|
||||
#E.g RewriteRule ^(.*)\.html $1.php
|
||||
#reading code bytes (by id)
|
||||
#RewriteRule ^(.*)code\-([0-9]+)$ index.php?p=read_code&id_code=$2 [L]
|
||||
#RewriteRule ^(.*)code\-([0-9]+)$ index.php?p=code&id_code=$2 [L]
|
||||
|
||||
# Jul - deny access to the .git directory
|
||||
RewriteRule \.git - [F,L]
|
||||
|
||||
234
classmanagement.php
Normal file
@@ -0,0 +1,234 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Manage includes
|
||||
* @author franzz
|
||||
* @version 1.0
|
||||
*/
|
||||
class ClassManagement extends PhpObject
|
||||
{
|
||||
const INC_FOLDER = 'inc/';
|
||||
const INC_EXT = '.php';
|
||||
const SETTINGS_FILE = 'settings.php';
|
||||
const TOOLBOX_CLASS = 'toolbox';
|
||||
|
||||
private $asIncFiles;
|
||||
|
||||
function __construct($sMainClass)
|
||||
{
|
||||
parent::__construct(__CLASS__, true);
|
||||
$this->asIncFiles = array();
|
||||
|
||||
//try to include default files
|
||||
$this->incFile(self::SETTINGS_FILE);
|
||||
$this->incClass(self::TOOLBOX_CLASS);
|
||||
|
||||
//Include main class
|
||||
$this->incClass($sMainClass);
|
||||
}
|
||||
|
||||
function __destruct()
|
||||
{
|
||||
parent::__destruct();
|
||||
}
|
||||
|
||||
public function incClass($sClassName)
|
||||
{
|
||||
return $this->incFile(self::INC_FOLDER.$sClassName.self::INC_EXT);
|
||||
}
|
||||
|
||||
public function incFile($sFilePath, $bMandatory=true)
|
||||
{
|
||||
$bIncluded = false;
|
||||
if(!in_array($sFilePath, $this->asIncFiles))
|
||||
{
|
||||
$sMissingFile = 'File "'.$sFilePath.'" missing.';
|
||||
if(file_exists($sFilePath))
|
||||
{
|
||||
$bIncluded = require_once($sFilePath);
|
||||
$this->asIncFiles[] = $sFilePath;
|
||||
}
|
||||
elseif($bMandatory)
|
||||
{
|
||||
die($sMissingFile.' Stopping process.');
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->addError($sMissingFile);
|
||||
}
|
||||
}
|
||||
return $bIncluded;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @author franzz
|
||||
* @version 1.0a
|
||||
*/
|
||||
class PhpObject
|
||||
{
|
||||
//Log file name
|
||||
const LOG_FILENAME = 'log.html';
|
||||
|
||||
//Message types
|
||||
const NOTICE_TAB = 'Notice';
|
||||
const WARNING_TAB = 'Warning';
|
||||
const ERROR_TAB = 'Error';
|
||||
const ALL_TAB = 'All';
|
||||
|
||||
//Extraction mode
|
||||
const MODE_ARRAY = 0;
|
||||
const MODE_TEXT = 1;
|
||||
const MODE_HTML = 2;
|
||||
const MODE_FILE = 3;
|
||||
|
||||
//Class variables
|
||||
private $asMessageStack;
|
||||
private $iExtractMode;
|
||||
private $sChildClass;
|
||||
protected $bDebug;
|
||||
|
||||
function __construct($sClass='', $bDebug=false, $iExtractMode=self::MODE_FILE)
|
||||
{
|
||||
$this->resetMessageStack();
|
||||
$this->iExtractMode = $iExtractMode;
|
||||
$this->sChildClass = $sClass;
|
||||
$this->bDebug = $bDebug;
|
||||
}
|
||||
|
||||
private static function getLogPath()
|
||||
{
|
||||
return dirname(__FILE__).'/'.self::LOG_FILENAME;
|
||||
}
|
||||
|
||||
private function resetMessageStack($sType=self::ALL_TAB)
|
||||
{
|
||||
if($sType==self::ALL_TAB)
|
||||
{
|
||||
$this->resetMessageStack(self::NOTICE_TAB);
|
||||
$this->resetMessageStack(self::WARNING_TAB);
|
||||
$this->resetMessageStack(self::ERROR_TAB);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->asMessageStack[$sType] = array();
|
||||
}
|
||||
}
|
||||
|
||||
protected function addNotice($sNotice)
|
||||
{
|
||||
$this->addMessage(self::NOTICE_TAB, $sNotice);
|
||||
}
|
||||
|
||||
protected function addWarning($sWarning)
|
||||
{
|
||||
$this->addMessage(self::WARNING_TAB, $sWarning);
|
||||
}
|
||||
|
||||
protected function addError($sError)
|
||||
{
|
||||
$this->addMessage(self::ERROR_TAB, $sError);
|
||||
}
|
||||
|
||||
private function addMessage($sType, $sMessage)
|
||||
{
|
||||
$this->asMessageStack[$sType][] = $sMessage;
|
||||
}
|
||||
|
||||
protected function getCleanMessageStack($sType=self::ALL_TAB)
|
||||
{
|
||||
$asMessages = ($sType==self::ALL_TAB)?$this->asMessageStack:$this->asMessageStack[$sType];
|
||||
$this->resetMessageStack($sType);
|
||||
|
||||
return $this->glueMessages($asMessages);
|
||||
}
|
||||
|
||||
protected function cleanMessageStack()
|
||||
{
|
||||
$sErrorStack = $this->getCleanMessageStack($this->bDebug?self::ALL_TAB:self::ERROR_TAB);
|
||||
if($sErrorStack!='')
|
||||
{
|
||||
switch($this->iExtractMode)
|
||||
{
|
||||
case self::MODE_TEXT:
|
||||
echo $sErrorStack;
|
||||
break;
|
||||
case self::MODE_HTML:
|
||||
echo $sErrorStack;
|
||||
break;
|
||||
case self::MODE_ARRAY:
|
||||
break;
|
||||
case self::MODE_FILE:
|
||||
@file_put_contents(self::getLogPath(), "\n\n".$this->sChildClass.' - '.date('r')."\n".$sErrorStack, FILE_APPEND);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function getCleanMessageStacks($aoExtsources, $sType=self::ALL_TAB)
|
||||
{
|
||||
$aoExtsources[] = $this;
|
||||
$aoMessages = array();
|
||||
foreach($aoExtsources as $oExtSource)
|
||||
{
|
||||
$oMessages = $oExtSource->getCleanMessageStack($sType);
|
||||
if($oMessages!='')
|
||||
{
|
||||
$aoMessages[get_class($oExtSource)] = $oMessages;
|
||||
}
|
||||
}
|
||||
return $this->glueMessages($aoMessages);
|
||||
}
|
||||
|
||||
private function glueMessages($asMessages)
|
||||
{
|
||||
switch($this->iExtractMode)
|
||||
{
|
||||
case self::MODE_TEXT:
|
||||
$oMessageStack = self::recursiveImplode("\n", $asMessages);
|
||||
break;
|
||||
case self::MODE_HTML:
|
||||
$oMessageStack = self::recursiveImplode('<br />', $asMessages);
|
||||
break;
|
||||
case self::MODE_ARRAY:
|
||||
$oMessageStack = $asMessages;
|
||||
break;
|
||||
case self::MODE_FILE:
|
||||
$oMessageStack = self::recursiveImplode("\n", $asMessages);
|
||||
break;
|
||||
}
|
||||
return $oMessageStack;
|
||||
}
|
||||
|
||||
private static function flattenMessageStack($asTab, $sGlobalKey='')
|
||||
{
|
||||
$asFlatTab = array();
|
||||
foreach($asTab as $oKey=>$oRow)
|
||||
{
|
||||
$sKey = is_numeric($oKey)?$sGlobalKey:$oKey.' - ';
|
||||
if(is_array($oRow))
|
||||
{
|
||||
$asFlatTab = array_merge($asFlatTab, self::flattenMessageStack($oRow, $sKey));
|
||||
}
|
||||
else
|
||||
{
|
||||
$asFlatTab[] = $sKey.$oRow;
|
||||
}
|
||||
}
|
||||
return $asFlatTab;
|
||||
}
|
||||
|
||||
private static function recursiveImplode($sGlue, $asTab)
|
||||
{
|
||||
$asTab = self::flattenMessageStack($asTab);
|
||||
return implode($sGlue, $asTab);
|
||||
}
|
||||
|
||||
function __destruct()
|
||||
{
|
||||
$this->cleanMessageStack();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
4581
config.php
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
BIN
images/afk.png
|
Before Width: | Height: | Size: 894 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 945 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 616 B |
|
Before Width: | Height: | Size: 611 B |
|
Before Width: | Height: | Size: 124 B |
|
Before Width: | Height: | Size: 108 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 876 B |
BIN
images/logo_pe_24.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
images/logo_pe_48.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
BIN
images/no_16.gif
|
Before Width: | Height: | Size: 1.0 KiB |
BIN
images/no_24.png
|
Before Width: | Height: | Size: 1.1 KiB |
BIN
images/ok_48.png
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 723 B |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 25 KiB |
BIN
images/sap_gold_200.jpg
Normal file
|
After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 329 B |
|
Before Width: | Height: | Size: 869 B |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
25
inc/auth.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Auth Class
|
||||
* TODO move all auth related topics here
|
||||
* @author lutranf
|
||||
*
|
||||
*/
|
||||
class Auth
|
||||
{
|
||||
const ALGO = PASSWORD_DEFAULT;
|
||||
const COST = 12;
|
||||
|
||||
public static function HashPassword($sPass)
|
||||
{
|
||||
return password_hash($sPass, self::ALGO, array('cost'=>self::COST));
|
||||
}
|
||||
|
||||
public static function CheckPassword($sPass, $sHash)
|
||||
{
|
||||
return password_verify($sPass, $sHash);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
2507
inc/databap.php
Normal file
158
inc/fileuploader.php
Normal file
@@ -0,0 +1,158 @@
|
||||
<?php
|
||||
|
||||
class fileUploader
|
||||
{
|
||||
const GET_NAME = 'qqfile';
|
||||
|
||||
private $asAllowedExtensions;
|
||||
private $iSizeLimit;
|
||||
private $sFolderPath;
|
||||
|
||||
function __construct($sFolderPath, $asAllowedExtensions = array()/*, $sizeLimit = 10485760*/)
|
||||
{
|
||||
$this->sFolderPath = $sFolderPath;
|
||||
$this->asAllowedExtensions = array_map("mb_strtolower", $asAllowedExtensions);
|
||||
//$this->iSizeLimit = $sizeLimit;
|
||||
//$this->checkServerSettings();
|
||||
$this->iSizeLimit = Databap::getMaxSize();
|
||||
|
||||
/*
|
||||
if(isset($_GET[self::GET_NAME]))
|
||||
{
|
||||
//$this->file = new qqUploadedFileXhr();
|
||||
}
|
||||
elseif(isset($_FILES[self::GET_NAME])) {
|
||||
$this->file = new qqUploadedFileForm();
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->file = false;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
private function checkServerSettings()
|
||||
{
|
||||
$postSize = $this->toBytes(ini_get('post_max_size'));
|
||||
$uploadSize = $this->toBytes(ini_get('upload_max_filesize'));
|
||||
|
||||
|
||||
if($postSize < $this->iSizeLimit || $uploadSize < $this->iSizeLimit){
|
||||
$size = max(1, $this->iSizeLimit / 1024 / 1024) . 'M';
|
||||
die("{'error':'increase post_max_size and upload_max_filesize to $size'}");
|
||||
}
|
||||
}
|
||||
|
||||
private function toBytes($str)
|
||||
{
|
||||
$val = trim($str);
|
||||
$last = mb_strtolower($str[mb_strlen($str)-1]);
|
||||
switch($last) {
|
||||
case 'g': $val *= 1024;
|
||||
case 'm': $val *= 1024;
|
||||
case 'k': $val *= 1024;
|
||||
}
|
||||
return $val;
|
||||
}
|
||||
*/
|
||||
|
||||
function save($sFileName)
|
||||
{
|
||||
$oInput = fopen("php://input", "r");
|
||||
$sTemp = tmpfile();
|
||||
$iRealSize = stream_copy_to_stream($oInput, $sTemp);
|
||||
fclose($oInput);
|
||||
|
||||
if($iRealSize != $this->getSize())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$sPath = $this->sFolderPath.$sFileName;
|
||||
$oTarget = fopen($sPath, "w");
|
||||
fseek($sTemp, 0, SEEK_SET);
|
||||
stream_copy_to_stream($sTemp, $oTarget);
|
||||
fclose($oTarget);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function getName()
|
||||
{
|
||||
return isset($_GET[self::GET_NAME])?$_GET[self::GET_NAME]:false;
|
||||
}
|
||||
|
||||
function getSize()
|
||||
{
|
||||
if(isset($_SERVER["CONTENT_LENGTH"]))
|
||||
{
|
||||
return (int)$_SERVER["CONTENT_LENGTH"];
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception('Getting content length is not supported.');
|
||||
}
|
||||
}
|
||||
|
||||
//Returns array('success'=>true) or array('error'=>'error message')
|
||||
function handleUpload(/*$sUploadDir, $replaceOldFile = false*/)
|
||||
{
|
||||
if(!is_writable($this->sFolderPath))
|
||||
{
|
||||
return array('error' => "Erreur serveur. Le dossier est protégé en écriture");
|
||||
}
|
||||
if(!$this->getName())
|
||||
{
|
||||
return array('error' => 'Aucun fichier téléchargé');
|
||||
}
|
||||
|
||||
$iSize = $this->getSize();
|
||||
if($iSize == 0)
|
||||
{
|
||||
return array('error' => 'Fichier vide');
|
||||
}
|
||||
if($iSize > $this->iSizeLimit)
|
||||
{
|
||||
return array('error' => 'Fichier trop volumineux');
|
||||
}
|
||||
|
||||
$asPathInfo = pathinfo($this->getName());
|
||||
$sExt = mb_strtolower($asPathInfo['extension']);
|
||||
$sExt = ($sExt=='jpg')?'jpeg':$sExt;
|
||||
if($this->asAllowedExtensions && !in_array($sExt, $this->asAllowedExtensions))
|
||||
{
|
||||
$sAuthorizedExts = implode(', ', $this->asAllowedExtensions);
|
||||
return array('error' => 'Le fichier a une extension invalide, les extensions autorisées sont : '.$sAuthorizedExts);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
|
||||
//$sFileName = $asPathInfo['filename'];
|
||||
$sFileName = md5(uniqid());
|
||||
/*
|
||||
if(!$replaceOldFile){
|
||||
// don't overwrite previous files that were uploaded
|
||||
//while (file_exists($sUploadDir . $sFileName . '.' . $sExt)) {
|
||||
// $sFileName .= rand(10, 99);
|
||||
//}
|
||||
if(file_exists($sUploadDir . $sFileName . '.' . $sExt))
|
||||
{
|
||||
$sFileName .= date(Databap::DATE_COMPACT_FORMAT);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if($this->save($sFileName.'.'.$sExt))
|
||||
{
|
||||
return array('success'=>true, 'file_name'=>$sFileName.'.'.$sExt);
|
||||
}
|
||||
else
|
||||
{
|
||||
return array('error'=> 'Erreur server. Impossible de sauvegarder le fichier.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
231
inc/mask.php
Normal file
@@ -0,0 +1,231 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Mask Reader
|
||||
* @author franzz
|
||||
* @version 1.0
|
||||
*/
|
||||
class Mask extends PhpObject
|
||||
{
|
||||
public $sMaskName;
|
||||
public $sFilePath;
|
||||
private $sMask;
|
||||
private $asTags;
|
||||
private $asPartsSource;
|
||||
private $aoInstances;
|
||||
|
||||
const MASK_FOLDER = 'masks/';
|
||||
const MASK_EXT = '.html';
|
||||
const START_TAG = 'START';
|
||||
const END_TAG = 'END';
|
||||
const TAG_MARK = '[#]';
|
||||
|
||||
public function __construct($sFileName='')
|
||||
{
|
||||
//init
|
||||
parent::__construct(__CLASS__, Settings::DEBUG);
|
||||
$this->sMaskName = '';
|
||||
$this->sFilePath = '';
|
||||
$this->sMask = '';
|
||||
$this->asTags = array();
|
||||
$this->asPartsSource = array();
|
||||
$this->aoInstances = array();
|
||||
$this->sFilePath = '';
|
||||
|
||||
//load file
|
||||
if($sFileName!='')
|
||||
{
|
||||
$this->initFile($sFileName);
|
||||
}
|
||||
}
|
||||
|
||||
public static function getMaskFile($sFileName)
|
||||
{
|
||||
return self::MASK_FOLDER.$sFileName.self::MASK_EXT;
|
||||
}
|
||||
|
||||
public function initFile($sFileName)
|
||||
{
|
||||
$sFilePath = self::getMaskFile(basename($sFileName));
|
||||
if(file_exists($sFilePath))
|
||||
{
|
||||
$this->sFilePath = $sFilePath;
|
||||
$sSource = file_get_contents($this->sFilePath);
|
||||
$this->initMask($sFileName, $sSource);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->addError('Fichier introuvable à l\'adresse : '.$sFilePath);
|
||||
}
|
||||
}
|
||||
|
||||
public function initFileFromString($sSource, $sPartName='', $iInstanceNb=0)
|
||||
{
|
||||
$this->initMask($sPartName.' (from row) '.$iInstanceNb, $sSource);
|
||||
}
|
||||
|
||||
private function initMask($sMaskName, $sSource)
|
||||
{
|
||||
$this->sMaskName = $sMaskName;
|
||||
$this->sMask = $sSource;
|
||||
$this->setParts();
|
||||
}
|
||||
|
||||
private function setParts()
|
||||
{
|
||||
while(preg_match('/\<\!-- \[PART\] (?P<part>\S+) \[START\] --\>/u', $this->sMask, $asMatch))
|
||||
{
|
||||
$sPartName = $asMatch['part'];
|
||||
|
||||
$this->asPartsSource[$sPartName] = $this->getCleanPart($sPartName);
|
||||
$this->aoInstances[$sPartName] = array();
|
||||
}
|
||||
}
|
||||
|
||||
private function getCleanPart($sPartName)
|
||||
{
|
||||
$iStartPos = $this->getPartStartPos($sPartName);
|
||||
$iEndPos = $this->getPartEndPos($sPartName);
|
||||
$sPart = mb_substr($this->sMask, $iStartPos, $iEndPos-$iStartPos);
|
||||
$sExtendedPart = $this->getPartPattern($sPartName, self::START_TAG).$sPart. $this->getPartPattern($sPartName, self::END_TAG);
|
||||
$this->sMask = str_replace($sExtendedPart, $this->getPartTagPattern($sPartName), $this->sMask);
|
||||
return $sPart;
|
||||
}
|
||||
|
||||
private function getPartStartPos($sPartName)
|
||||
{
|
||||
$sPartStartPattern = $this->getPartPattern($sPartName, self::START_TAG);
|
||||
return mb_strpos($this->sMask, $sPartStartPattern) + strlen($sPartStartPattern);
|
||||
}
|
||||
|
||||
private function getPartEndPos($sPartName)
|
||||
{
|
||||
$sPartEndPattern = $this->getPartPattern($sPartName, self::END_TAG);
|
||||
return mb_strpos($this->sMask, $sPartEndPattern);
|
||||
}
|
||||
|
||||
private function getPartPattern($sPartName, $sAction)
|
||||
{
|
||||
return '<!-- [PART] '.$sPartName.' ['.$sAction.'] -->';
|
||||
}
|
||||
|
||||
private function getPartTagPattern($sPartName, $bMark=true)
|
||||
{
|
||||
$sPartTag = 'PART '.$sPartName;
|
||||
return $bMark?$this->addTagMark($sPartTag):$sPartTag;
|
||||
}
|
||||
|
||||
public function addInstance($sPartName, $asTags)
|
||||
{
|
||||
$this->newInstance($sPartName);
|
||||
foreach($asTags as $sTagName=>$sTagValue)
|
||||
{
|
||||
$this->setInstanceTag($sPartName, $sTagName, $sTagValue);
|
||||
}
|
||||
}
|
||||
|
||||
public function newInstance($sPartName)
|
||||
{
|
||||
//Finding the part ($oMask is a pointer)
|
||||
$oMask = $this->findPart($this, $sPartName);
|
||||
if(!$oMask) $this->addError('No part found : '.$sPartName);
|
||||
|
||||
//Retrieving source html
|
||||
$sPartSource = $oMask->asPartsSource[$sPartName];
|
||||
|
||||
//Creating new instance
|
||||
$oInstance = new Mask();
|
||||
$oInstance->initFileFromString($sPartSource, $sPartName);
|
||||
$oMask->aoInstances[$sPartName][] = $oInstance;
|
||||
}
|
||||
|
||||
public function setInstanceTag($sPartName, $sTagName, $sTagValue)
|
||||
{
|
||||
$oMask = $this->findPart($this, $sPartName);
|
||||
if(!$oMask) $this->addError('No part found : '.$sPartName);
|
||||
|
||||
$oMask->getCurrentInstance($sPartName)->setTag($sTagName, $sTagValue);
|
||||
}
|
||||
|
||||
private function findPart($oMask, $sPartName)
|
||||
{
|
||||
if(array_key_exists($sPartName, $oMask->aoInstances))
|
||||
{
|
||||
return $oMask;
|
||||
}
|
||||
else //going deeper to find the part
|
||||
{
|
||||
foreach($oMask->aoInstances as $sLevelPartName=>$aoInstances)
|
||||
{
|
||||
if(!empty($aoInstances))
|
||||
{
|
||||
//take last instances
|
||||
$oTmpMask = $this->findPart($oMask->getCurrentInstance($sLevelPartName), $sPartName);
|
||||
if($oTmpMask) return $oTmpMask;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private function getCurrentInstance($sPartName)
|
||||
{
|
||||
if(!empty($this->aoInstances[$sPartName]))
|
||||
{
|
||||
return end($this->aoInstances[$sPartName]);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function getTags()
|
||||
{
|
||||
$sSafeTagMark = preg_quote(self::TAG_MARK);
|
||||
$sPattern = '/'.$sSafeTagMark.'(?P<tag>\w+)'.$sSafeTagMark.'/u';
|
||||
preg_match_all($sPattern, $this->sMask, $asMatches);
|
||||
return array_unique(array_filter($asMatches['tag']));
|
||||
}
|
||||
|
||||
public function setTag($sTagName, $sTagValue)
|
||||
{
|
||||
$this->asTags[$sTagName] = $sTagValue;
|
||||
}
|
||||
|
||||
public function setTags($asTags)
|
||||
{
|
||||
foreach($asTags as $sTagName=>$sTagValue) $this->setTag($sTagName, $sTagValue);
|
||||
}
|
||||
|
||||
public function getMask()
|
||||
{
|
||||
$sCompletedMask = $this->sMask;
|
||||
|
||||
//build parts
|
||||
foreach($this->aoInstances as $sPart=>$aoParts)
|
||||
{
|
||||
$sTagValue = '';
|
||||
foreach($aoParts as $oInstance)
|
||||
{
|
||||
$sTagValue .= $oInstance->getMask();
|
||||
}
|
||||
$this->setTag($this->getPartTagPattern($sPart, false), $sTagValue);
|
||||
}
|
||||
|
||||
//replace tags
|
||||
if(!empty($this->asTags))
|
||||
{
|
||||
$asTags = $this->addTagMark(array_keys($this->asTags));
|
||||
$sCompletedMask = str_replace($asTags, $this->asTags, $sCompletedMask);
|
||||
}
|
||||
return $sCompletedMask;
|
||||
}
|
||||
|
||||
private function addTagMark($oData)
|
||||
{
|
||||
return ToolBox::array_map_encapsulate($oData, self::TAG_MARK);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
601
inc/mysqlmanager.php
Normal file
@@ -0,0 +1,601 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* MySql query manager and generator
|
||||
* @author franzz
|
||||
* @version 1.0
|
||||
*/
|
||||
class MySqlManager extends PhpObject
|
||||
{
|
||||
const DB_NO_CONN = 'ERR_1';
|
||||
const DB_NO_DATA = 'ERR_2';
|
||||
const ID_TAG = 'id_';
|
||||
|
||||
public $sDbState;
|
||||
private $bTrace;
|
||||
|
||||
/**
|
||||
* SQL connection Handle
|
||||
* @var mysqli
|
||||
*/
|
||||
private $oConnection;
|
||||
private $sDatabase;
|
||||
private $asOptions;
|
||||
|
||||
/**
|
||||
* Tables & fields descriptions
|
||||
* array( 'tables'=>array('table_name1'=>array('table_field1', 'table_field2', ...), 'table_name2'=>array(...)),
|
||||
* 'types'=>array('field1'=>'field_type1', 'field2'=>'field_type2', ...)
|
||||
* 'constraints'=>array('table_name1'=>'table_contraint1', 'table_name2'=>'table_contraint2', ...),
|
||||
* 'cascading_delete'=>array('table_name1'=>array('linked_table1', 'linked_table2', ...), 'table_name2'=>...))
|
||||
* @var Array
|
||||
*/
|
||||
public function __construct($sDbServer, $sLogin, $sPass, $sDatabase, $asOptions, $sEncoding='utf8mb4')
|
||||
{
|
||||
parent::__construct(__CLASS__, Settings::DEBUG);
|
||||
$this->sDatabase = $sDatabase;
|
||||
$this->asOptions = $asOptions;
|
||||
//$this->oConnection = mysql_connect(self::DB_SERVER, self::DB_LOGIN, self::DB_PASS);
|
||||
$this->oConnection = new mysqli($sDbServer, $sLogin, $sPass);
|
||||
$this->syncPhpParams($sEncoding);
|
||||
|
||||
/*
|
||||
$dsn = 'mysql:dbname='.$this->sDatabase.';host='.self::DB_SERVER;
|
||||
try {$dbh = new PDO($dsn, self::DB_LOGIN, self::DB_PASS);}
|
||||
catch (PDOException $e) {$this->addError('Connexion échouée : ' . $e->getMessage());}
|
||||
*/
|
||||
|
||||
$this->setTrace(false);
|
||||
//if(!$this->oConnection)
|
||||
if($this->oConnection->connect_error)
|
||||
{
|
||||
//$this->addError('bug connection');
|
||||
$this->addError('bug connection : '.$this->oConnection->connect_error);
|
||||
$this->sDbState = self::DB_NO_CONN;
|
||||
}
|
||||
else
|
||||
{
|
||||
//if(!mysql_select_db($this->sDatabase, $this->oConnection))
|
||||
if(!$this->oConnection->select_db($this->sDatabase))
|
||||
{
|
||||
$this->addError('bug selecting database. Installing...');
|
||||
$this->sDbState = self::DB_NO_DATA;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function syncPhpParams($sEncoding)
|
||||
{
|
||||
//Characters encoding
|
||||
$this->oConnection->set_charset($sEncoding); //SET NAMES
|
||||
|
||||
//Time zone
|
||||
$oNow = new DateTime();
|
||||
$iMins = $oNow->getOffset() / 60;
|
||||
$iSign = ($iMins < 0)?-1:1;
|
||||
$iMins = abs($iMins);
|
||||
$iHours = floor($iMins / 60);
|
||||
$iMins -= $iHours * 60;
|
||||
$sOffset = sprintf('%+d:%02d', $iHours*$iSign, $iMins);
|
||||
$this->setQuery("SET time_zone='{$sOffset}';");
|
||||
}
|
||||
|
||||
public function __destruct()
|
||||
{
|
||||
parent::__destruct();
|
||||
//mysql_close($this->oConnection);
|
||||
$this->oConnection->close();
|
||||
}
|
||||
|
||||
public function setTrace($bAction)
|
||||
{
|
||||
$this->bTrace = $bAction;
|
||||
}
|
||||
|
||||
public function getTables()
|
||||
{
|
||||
/*
|
||||
$oReflect = new ReflectionClass(__CLASS__);
|
||||
$asConstants = $oReflect->getConstants();
|
||||
$sTableTag = '_TABLE';
|
||||
$asTables = array();
|
||||
foreach($asConstants as $sConstant=>$sConstantValue)
|
||||
{
|
||||
if(mb_strpos($sConstant, $sTableTag)!==false && mb_strpos($sConstant, $sTableTag)==(mb_strlen($sConstant) - mb_strlen($sTableTag)))
|
||||
{
|
||||
$asTables[] = $sConstantValue;
|
||||
}
|
||||
}
|
||||
return $asTables;
|
||||
*/
|
||||
return array_keys($this->asOptions['tables']);
|
||||
}
|
||||
|
||||
public function install()
|
||||
{
|
||||
//Create Database
|
||||
$this->setQuery("DROP DATABASE IF EXISTS ".$this->sDatabase);
|
||||
$this->setQuery("CREATE DATABASE ".$this->sDatabase." DEFAULT CHARACTER SET ".Settings::DB_ENC." DEFAULT COLLATE ".Settings::DB_ENC."_general_ci");
|
||||
//mysql_select_db($this->sDatabase, $this->oConnection);
|
||||
$this->oConnection->select_db($this->sDatabase);
|
||||
|
||||
//Create tables
|
||||
@array_walk($this->getInstallQueries(), array($this, 'setQuery'));
|
||||
}
|
||||
|
||||
//For debug purposes
|
||||
public function getFullInstallQuery()
|
||||
{
|
||||
$asInstallQueries = $this->getInstallQueries();
|
||||
return str_replace("\n", "<br />", implode(";\n\n", $asInstallQueries))."\n\n<!-- \n".implode(";\n\n", $asInstallQueries)."\n -->";
|
||||
}
|
||||
|
||||
private function getInstallQueries()
|
||||
{
|
||||
$asTables = $this->getTables();
|
||||
$asInstallQueries = array_map(array($this, 'getInstallQuery'), $asTables);
|
||||
$asAlterQueries = $this->getForeignKeyQueries($asTables);
|
||||
return array_merge($asInstallQueries, $asAlterQueries);
|
||||
}
|
||||
|
||||
private function getInstallQuery($sTableName)
|
||||
{
|
||||
$asTableColumns = $this->getTableColumns($sTableName);
|
||||
$sQuery = "\n".$this->implodeAll($asTableColumns, "` ", "\n", "`", ",")."\n".implode(", \n", $this->getTableConstraints($sTableName));
|
||||
return "CREATE TABLE `{$sTableName}` ({$sQuery})";
|
||||
}
|
||||
|
||||
private function getForeignKeyQueries($asTableNames)
|
||||
{
|
||||
$asForeignKeyQueries = array();
|
||||
foreach($asTableNames as $sTableName)
|
||||
{
|
||||
$asTableColumns = array_keys($this->getTablecolumns($sTableName));
|
||||
foreach($asTableColumns as $sColumnName)
|
||||
{
|
||||
if($this->isId($sColumnName) && $sColumnName!=self::getId($sTableName))
|
||||
{
|
||||
$asForeignKeyQueries[] = "ALTER TABLE ".$sTableName." ADD INDEX(`".$sColumnName."`)";
|
||||
$asForeignKeyQueries[] = "ALTER TABLE ".$sTableName." ADD FOREIGN KEY (`".$sColumnName."`) REFERENCES ".self::getTable($sColumnName)."(`".$sColumnName."`)";
|
||||
}
|
||||
}
|
||||
}
|
||||
return $asForeignKeyQueries;
|
||||
}
|
||||
|
||||
private function setQuery($sQuery, $sTypeQuery=__FUNCTION__)
|
||||
{
|
||||
$this->getQuery($sQuery, $sTypeQuery);
|
||||
//return (mysql_affected_rows()!=0);
|
||||
return ($this->oConnection->affected_rows!=0);
|
||||
}
|
||||
|
||||
private function getQuery($sQuery, $sTypeQuery=__FUNCTION__)
|
||||
{
|
||||
$sQuery = str_replace(array("\n", "\t"), array(" ", ""), $sQuery);
|
||||
//$oResult = mysql_query($sQuery, $this->oConnection);
|
||||
|
||||
if($this->bTrace)
|
||||
{
|
||||
$this->bDebug = true;
|
||||
$this->addNotice($sQuery);
|
||||
}
|
||||
|
||||
if(!($oResult = $this->oConnection->query($sQuery)))
|
||||
{
|
||||
$this->addError("\nErreur SQL : \n".str_replace("\t", "", $sQuery)."\n\n".str_replace(array("\t", "\n"), "", $this->oConnection->error));
|
||||
}
|
||||
return $oResult;
|
||||
}
|
||||
|
||||
public function getLastError()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function getArrayQuery($sQuery, $bStringOnly=false, $sGroupBy='', $sTypeQuery=__FUNCTION__)
|
||||
{
|
||||
$iIndex = 0;
|
||||
$iColumnCount = 0;
|
||||
$asResult = array();
|
||||
$oResult = $this->getQuery($sQuery, true, $sTypeQuery);
|
||||
if($oResult!==false)
|
||||
{
|
||||
//while($asCurrentRow = mysql_fetch_array($oResult))
|
||||
while($asCurrentRow = $oResult->fetch_array())
|
||||
{
|
||||
if($bStringOnly) $asCurrentRow = $this->arrayKeyFilter($asCurrentRow, 'is_string');
|
||||
|
||||
//Add table reel keys
|
||||
if($sGroupBy!='' && array_key_exists($sGroupBy, $asCurrentRow))
|
||||
{
|
||||
$iRowKey = $asCurrentRow[$sGroupBy];
|
||||
unset($asCurrentRow[$sGroupBy]);
|
||||
}
|
||||
else $iRowKey = $iIndex;
|
||||
|
||||
//For first loop, check table width
|
||||
if($iIndex==0) $iColumnCount = count($asCurrentRow);
|
||||
|
||||
//One column case : collapse a level
|
||||
if($iColumnCount==1) $asCurrentRow = array_shift($asCurrentRow);
|
||||
|
||||
$asResult[$iRowKey] = $asCurrentRow;
|
||||
$iIndex++;
|
||||
}
|
||||
}
|
||||
return $asResult;
|
||||
}
|
||||
|
||||
private function getMaxIncrementedValue($sTable)
|
||||
{
|
||||
return $this->selectValue($sTable, "MAX(".$this->getId($sTable).")");
|
||||
}
|
||||
|
||||
public static function getId($sTableName, $bFull=false)
|
||||
{
|
||||
$sColumnName = self::ID_TAG.self::getText($sTableName);
|
||||
return $bFull?self::getFullColumnName($sTableName, $sColumnName):$sColumnName;
|
||||
}
|
||||
|
||||
public static function getText($sTableName, $bFull=false)
|
||||
{
|
||||
$sColumnName = mb_substr(str_replace('`', '', $sTableName), 0, -1);
|
||||
$sColumnName = mb_substr($sColumnName, -2)=='ie'?mb_substr($sColumnName, 0, -2).'y':$sColumnName;
|
||||
return $bFull?self::getFullColumnName($sTableName, $sColumnName):$sColumnName;
|
||||
}
|
||||
|
||||
public static function getFullColumnName($sTableName, $sColumnName)
|
||||
{
|
||||
return $sTableName.".".$sColumnName;
|
||||
}
|
||||
|
||||
private function isId($sColumnName, $sTableName='')
|
||||
{
|
||||
$asTables = ($sTableName=='')?$this->getTables():array($sTableName);
|
||||
$asTableIds = array_map(array('self', 'getId'), $asTables);
|
||||
return in_array($sColumnName, $asTableIds);
|
||||
}
|
||||
|
||||
private function getTable($sTableId)
|
||||
{
|
||||
$asTables = $this->getTables();
|
||||
$asTableIds = array_map(array('self', 'getId'), $asTables);
|
||||
if(in_array($sTableId, $asTableIds)) return $asTables[array_search($sTableId, $asTableIds)];
|
||||
else
|
||||
{
|
||||
$this->addError('Id '.$sTableId.' présent dans aucune table');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function getTablecolumns($sTableName)
|
||||
{
|
||||
if(!array_key_exists($sTableName, $this->asOptions['tables'])) return false;
|
||||
|
||||
$asTableColumns = array(self::getId($sTableName));
|
||||
foreach($this->asOptions['tables'][$sTableName] as $sFieldName) $asTableColumns[] = $sFieldName;
|
||||
$asTableColumns[] = 'led';
|
||||
|
||||
$asTableName = array_fill(0, count($asTableColumns), $sTableName);
|
||||
return array_combine($asTableColumns, array_map(array('self', 'getColumnType'), $asTableColumns, $asTableName));
|
||||
}
|
||||
|
||||
private function getColumnType($sColumnName, $sTableName)
|
||||
{
|
||||
$sColumnType = '';
|
||||
switch($sColumnName)
|
||||
{
|
||||
case array_key_exists($sColumnName, $this->asOptions['types']):
|
||||
$sColumnType = $this->asOptions['types'][$sColumnName];
|
||||
break;
|
||||
case 'led':
|
||||
$sColumnType = "TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP";
|
||||
break;
|
||||
case $this->isId($sColumnName, $sTableName):
|
||||
$sColumnType = "int(10) UNSIGNED auto_increment";
|
||||
break;
|
||||
case $this->isId($sColumnName):
|
||||
$sColumnType = "int(10) UNSIGNED";
|
||||
break;
|
||||
}
|
||||
return $sColumnType;
|
||||
}
|
||||
|
||||
private function getTableConstraints($sTableName)
|
||||
{
|
||||
//Primary key
|
||||
$asTableConstraints = array('PRIMARY' => "PRIMARY KEY (`".self::getId($sTableName)."`)");
|
||||
|
||||
//Foreign keys: applied using ALTER TABLE syntax at the end to prevent scheduling CREATE TABLE queries
|
||||
|
||||
//Other constraints
|
||||
if(array_key_exists($sTableName, $this->asOptions['constraints'])) $asTableConstraints[] = $this->asOptions['constraints'][$sTableName];
|
||||
return $asTableConstraints;
|
||||
}
|
||||
|
||||
private function addQuotes($oData)
|
||||
{
|
||||
//TODO remake
|
||||
$asTrustedFunc = array('CURDATE()', 'NOW()');
|
||||
$sChar = "'";
|
||||
if(is_array($oData))
|
||||
{
|
||||
$asChar = array_fill(1, count($oData), $sChar);
|
||||
return array_combine(array_keys($oData), array_map(array($this, 'addQuotes'), $oData, $asChar));
|
||||
}
|
||||
else
|
||||
{
|
||||
if(in_array($oData, $asTrustedFunc)) return $oData;
|
||||
else return $sChar.$oData.$sChar;
|
||||
}
|
||||
}
|
||||
|
||||
private function getLastId()
|
||||
{
|
||||
return $this->oConnection->insert_id;
|
||||
}
|
||||
|
||||
public function insertRow($sTableName, $asData)
|
||||
{
|
||||
$this->cleanSql($sTableName);
|
||||
$this->cleanSql($asData);
|
||||
|
||||
$asQueryValues = $this->addQuotes($asData);
|
||||
$sQuery = "INSERT INTO ".$sTableName." (`".implode("`, `", array_keys($asQueryValues))."`) VALUES (".implode(", ", $asQueryValues).")";
|
||||
return $this->setQuery($sQuery)?$this->getLastId():0;
|
||||
}
|
||||
|
||||
public function updateRow($sTableName, $asConstraints, $asData)
|
||||
{
|
||||
return $this->updateRows($sTableName, $asConstraints, $asData, 1);
|
||||
}
|
||||
|
||||
public function updateRows($sTableName, $asConstraints, $asData, $iLimit=0)
|
||||
{
|
||||
if(!is_array($asConstraints))
|
||||
{
|
||||
$asConstraints = array($this->getId($sTableName)=>$asConstraints);
|
||||
}
|
||||
|
||||
$this->cleanSql($sTableName);
|
||||
$this->cleanSql($iTableId);
|
||||
$this->cleanSql($asData);
|
||||
$this->cleanSql($asConstraints);
|
||||
$asQueryValues = $this->addQuotes($asData);
|
||||
$asConstraintsValues = $this->addQuotes($asConstraints);
|
||||
$this->addColumnSelectors($asQueryValues);
|
||||
$this->addColumnSelectors($asConstraintsValues);
|
||||
|
||||
$sLimit = $iLimit>0?" LIMIT $iLimit":"";
|
||||
$sQuery = "UPDATE {$sTableName} ".
|
||||
"SET ".$this->implodeAll($asQueryValues, " = ", ", ")." ".
|
||||
"WHERE ".$this->implodeAll($asConstraintsValues, " = ", " AND ").$sLimit;
|
||||
|
||||
$iResult = false;
|
||||
if($this->setQuery($sQuery))
|
||||
{
|
||||
$iResult = ($iLimit==1)?$this->selectValue($sTableName, $this->getId($sTableName), $asConstraints):true;
|
||||
}
|
||||
return $iResult;
|
||||
}
|
||||
|
||||
public function insertUpdateRow($sTableName, $asData, $asKeys=array(), $bUpdate=true)
|
||||
{
|
||||
$sTableIdName = self::getId($sTableName);
|
||||
|
||||
//check for data in the db
|
||||
if($asKeys==array())
|
||||
{
|
||||
$asKeys[] = $sTableIdName;
|
||||
}
|
||||
$asValues = array_intersect_key($asData, array_flip($asKeys));
|
||||
$iTableId = $this->selectValue($sTableName, $sTableIdName, $asValues);
|
||||
|
||||
//insert
|
||||
if(!$iTableId)
|
||||
{
|
||||
$iTableId = $this->insertRow($sTableName, $asData);
|
||||
}
|
||||
//Update
|
||||
elseif($bUpdate)
|
||||
{
|
||||
if(array_key_exists($sTableIdName, $asData))
|
||||
{
|
||||
unset($asData[$sTableIdName]);
|
||||
}
|
||||
$iTableId = $this->updateRow($sTableName, $iTableId, $asData);
|
||||
}
|
||||
return $iTableId;
|
||||
}
|
||||
|
||||
public function selectInsert($sTableName, $asData, $asKeys=array())
|
||||
{
|
||||
return $this->insertUpdateRow($sTableName, $asData, $asKeys, false);
|
||||
}
|
||||
|
||||
public function deleteRow($sTableName, $iTableId)
|
||||
{
|
||||
$this->cleanSql($sTableName);
|
||||
$this->cleanSql($iTableId);
|
||||
|
||||
//linked tables
|
||||
switch($sTableName)
|
||||
{
|
||||
case array_key_exists($sTableName, $this->asOptions['cascading_delete']) :
|
||||
$asTables = array_filter(is_array($sTableName)?$sTableName:array($sTableName) + $this->asOptions['cascading_delete'][$sTableName]);
|
||||
break;
|
||||
case is_string($sTableName) :
|
||||
$asTables = array($sTableName);
|
||||
break;
|
||||
case is_array($sTableName):
|
||||
$asTables = $sTableName;
|
||||
break;
|
||||
default:
|
||||
$asTables = array();
|
||||
}
|
||||
foreach($asTables as $sTable)
|
||||
{
|
||||
$this->setQuery("DELETE FROM ".$sTable." WHERE ".$this->getId($sTableName)." = ".$iTableId);
|
||||
}
|
||||
}
|
||||
|
||||
public function emptyTable($sTableName)
|
||||
{
|
||||
$this->cleanSql($sTableName);
|
||||
return $this->setQuery("TRUNCATE ".$sTableName);
|
||||
}
|
||||
|
||||
public function selectRows($asInfo, $bStringOnly=true, $sGroupBy='')
|
||||
{
|
||||
$asAttributes = array('select'=>"SELECT", 'from'=>"FROM", 'join'=>"LEFT JOIN", 'joinOn'=>"LEFT JOIN", 'constraint'=>"WHERE", 'groupBy'=>"GROUP BY", 'orderBy'=>"ORDER BY", 'limit'=>'LIMIT');
|
||||
$asRowSeparators = array('select'=>", ", 'from'=>"", 'join'=>" LEFT JOIN ", 'joinOn'=>" LEFT JOIN ", 'constraint'=>" AND ", 'groupBy'=>", ", 'orderBy'=>", ", 'limit'=>"");
|
||||
$asOperators = array('constraint'=>" = ", 'orderBy'=>" ", 'join'=>" USING(", 'joinOn'=>" ON ");
|
||||
$asEndOfStatement = array('constraint'=>"", 'orderBy'=>"", 'join'=>")", 'joinOn'=>"");
|
||||
|
||||
$sQuery = "";
|
||||
foreach($asAttributes as $sStatement => $sKeyWord)
|
||||
{
|
||||
$asSelection = array_key_exists($sStatement, $asInfo)?$asInfo[$sStatement]:array();
|
||||
if(!is_array($asSelection))
|
||||
{
|
||||
$asSelection = array($asSelection);
|
||||
}
|
||||
|
||||
//if provided values
|
||||
if(!empty($asSelection))
|
||||
{
|
||||
$this->cleanSql($asSelection);
|
||||
|
||||
if($sStatement=='constraint' && !array_key_exists('constVar', $asInfo))
|
||||
{
|
||||
$asSelection = $this->addQuotes($asSelection);
|
||||
}
|
||||
$this->addColumnSelectors($asSelection);
|
||||
|
||||
$sQuery .= " ".$sKeyWord." ";
|
||||
|
||||
//in case of double value input
|
||||
if(array_key_exists($sStatement, $asOperators))
|
||||
{
|
||||
if($sStatement=='constraint' && array_key_exists('constOpe', $asInfo))
|
||||
{
|
||||
$asOperators[$sStatement] = $asInfo['constOpe'];
|
||||
}
|
||||
$sQuery .= $this->implodeAll($asSelection, $asOperators[$sStatement], $asRowSeparators[$sStatement], "", $asEndOfStatement[$sStatement]);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sQuery .= implode($asRowSeparators[$sStatement], $asSelection);
|
||||
}
|
||||
}
|
||||
//default value for select
|
||||
elseif($sStatement=='select')
|
||||
{
|
||||
$sQuery .= " ".$sKeyWord." * ";
|
||||
}
|
||||
}
|
||||
return $this->getArrayQuery($sQuery, $bStringOnly, $sGroupBy);
|
||||
}
|
||||
|
||||
private function addColumnSelectors(&$asSelection)
|
||||
{
|
||||
//FIXME get rid of this
|
||||
$sSqlWord = 'option';
|
||||
$sKey = array_search($sSqlWord, $asSelection);
|
||||
if($sKey!==false)
|
||||
{
|
||||
$asSelection[$sKey] = "`".$asSelection[$sKey]."`";
|
||||
}
|
||||
elseif(array_key_exists($sSqlWord, $asSelection))
|
||||
{
|
||||
$asSelection["`".$sSqlWord."`"] = $asSelection[$sSqlWord];
|
||||
unset($asSelection[$sSqlWord]);
|
||||
}
|
||||
}
|
||||
|
||||
public function selectRow($sTableName, $asConstraints=array(), $sColumnName='*')
|
||||
{
|
||||
if(!is_array($asConstraints))
|
||||
{
|
||||
$asConstraints = array($this->getId($sTableName)=>$asConstraints);
|
||||
}
|
||||
$asResult = $this->selectRows(array('select'=>$sColumnName, 'from'=>$sTableName, 'constraint'=>$asConstraints));
|
||||
$iCountNb = count($asResult);
|
||||
switch($iCountNb)
|
||||
{
|
||||
case 0 :
|
||||
return false;
|
||||
case $iCountNb > 1 :
|
||||
$this->addError('Trop de résultats pour un selectRow() : '.$iCountNb.' lignes. Table: '.$sTableName.', contrainte: '.self::implodeAll($asConstraints, '=', ' ').', colonne: '.$sColumnName);
|
||||
break;
|
||||
}
|
||||
return array_shift($asResult);
|
||||
}
|
||||
|
||||
public function selectValue($sTableName, $sColumnName, $oConstraints=array())
|
||||
{
|
||||
if(!is_array($oConstraints))
|
||||
{
|
||||
$oConstraints = array($this->getId($sTableName)=>$oConstraints);
|
||||
}
|
||||
return $this->selectRow($sTableName, $oConstraints, $sColumnName);
|
||||
}
|
||||
|
||||
public function pingValue($sTableName, $oConstraints)
|
||||
{
|
||||
return $this->selectValue($sTableName, 'COUNT(1)', $oConstraints);
|
||||
}
|
||||
|
||||
public function cleanSql(&$oData)
|
||||
{
|
||||
//self::cleanData($oData, 'mysql_real_escape_string');
|
||||
//$oData = self::cleanData($oData, 'mysql_real_escape_string');
|
||||
$this->cleanData($oData);
|
||||
$oData = $this->cleanData($oData);
|
||||
}
|
||||
|
||||
//TODO déplacer dans ToolBox::implodeALl
|
||||
public static function implodeAll($asText, $asKeyValueSeparator='', $sRowSeparator='', $sKeyPre='', $sValuePost=false)
|
||||
{
|
||||
if($sValuePost===false)
|
||||
{
|
||||
$sValuePost = $sKeyPre;
|
||||
}
|
||||
$asCombinedText = array();
|
||||
|
||||
//if unique value for key value separator
|
||||
if(!is_array($asKeyValueSeparator) && !empty($asText))
|
||||
{
|
||||
$asKeyValueSeparator = array_combine(array_keys($asText), array_fill(0, count($asText), $asKeyValueSeparator));
|
||||
}
|
||||
|
||||
foreach($asText as $sKey=>$sValue)
|
||||
{
|
||||
$asCombinedText[] = $sKeyPre.$sKey.$asKeyValueSeparator[$sKey].(is_array($sValue)?implode($sValue):$sValue).$sValuePost;
|
||||
}
|
||||
return implode($sRowSeparator, $asCombinedText);
|
||||
}
|
||||
|
||||
public static function arrayKeyFilter($asArray, $sCallBack)
|
||||
{
|
||||
$asValidKeys = array_flip(array_filter(array_keys($asArray), $sCallBack));
|
||||
return array_intersect_key($asArray, $asValidKeys);
|
||||
}
|
||||
|
||||
public function cleanData($oData)
|
||||
{
|
||||
if(!is_array($oData))
|
||||
{
|
||||
return $this->oConnection->real_escape_string($oData);
|
||||
}
|
||||
elseif(count($oData)>0)
|
||||
{
|
||||
$asKeys = array_map(array($this, 'cleanData'), array_keys($oData));
|
||||
$asValues = array_map(array($this, 'cleanData'), $oData);
|
||||
return array_combine($asKeys, $asValues);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
274
inc/procedure.php
Normal file
@@ -0,0 +1,274 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Procedure Manager
|
||||
* @author franzz
|
||||
*/
|
||||
class Procedure extends PhpObject
|
||||
{
|
||||
//Constants
|
||||
const THUMB_MAX_SIZE = 100;
|
||||
const IMAGE_FOLDER = Databap::DOC_FOLDER;
|
||||
const IMAGE_FOLDER_TMP = Databap::DOC_TMP_FOLDER;
|
||||
const IMAGE_FOLDER_THUMB = Databap::DOC_THUMB_FOLDER;
|
||||
|
||||
//Objects
|
||||
private $oMySql;
|
||||
|
||||
//Procedure Elements
|
||||
private $iProcId;
|
||||
private $iUserId;
|
||||
private $sTitle;
|
||||
private $sDescription;
|
||||
private $dLed;
|
||||
private $asSteps; // [id_step]=>text
|
||||
private $asImages; // [id_step][id_image]=>array('name'=>file name, 'desc'=> description)
|
||||
|
||||
function __construct($oMySql)
|
||||
{
|
||||
parent::__construct(__CLASS__, Settings::DEBUG);
|
||||
$this->oMySql = $oMySql;
|
||||
$this->iPrevProcId = 0;
|
||||
$this->setProcedureId(0);
|
||||
$this->sTitle = '';
|
||||
$this->sDescription = '';
|
||||
$this->dLed = '';
|
||||
$this->asSteps = array();
|
||||
$this->asImages = array();
|
||||
}
|
||||
|
||||
public function getProcedureId()
|
||||
{
|
||||
return $this->iProcId;
|
||||
}
|
||||
|
||||
public function getProcedureLed()
|
||||
{
|
||||
return $this->dLed;
|
||||
}
|
||||
|
||||
public function setProcedureId($iProcId)
|
||||
{
|
||||
$this->iProcId = $iProcId;
|
||||
}
|
||||
|
||||
public function inputForm($asPost)
|
||||
{
|
||||
//User
|
||||
$this->iUserId = $asPost['id_user'];
|
||||
|
||||
//Titles
|
||||
$this->sTitle = isset($asPost['title'])?$asPost['title']:'';
|
||||
$this->sDescription = isset($asPost['description'])?$asPost['description']:'';
|
||||
|
||||
//Steps
|
||||
$sStepPattern = '/c(?P<step_id>\d+)_step_text/u';
|
||||
$sImagePattern = '/c(?P<step_id>\d+)_(?P<image_id>\d+)_image_(?P<image_info>\w+)/u';
|
||||
foreach($asPost as $sFormId=>$sValue)
|
||||
{
|
||||
//Step Text
|
||||
preg_match($sStepPattern, $sFormId, $asMatches);
|
||||
if(isset($asMatches['step_id']))
|
||||
{
|
||||
$this->asSteps[$asMatches['step_id']] = $sValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
preg_match($sImagePattern, $sFormId, $asMatches);
|
||||
if
|
||||
(
|
||||
isset($asMatches['step_id'], $asMatches['image_id'], $asMatches['image_info']) &&
|
||||
($asMatches['image_info'] == 'name' || $asMatches['image_info']== 'desc')
|
||||
)
|
||||
{
|
||||
$this->asImages[$asMatches['step_id']][$asMatches['image_id']][$asMatches['image_info']] = $sValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function isImageSaved($sFileName, $bInTemp=false)
|
||||
{
|
||||
$sPath = $bInTemp?self::IMAGE_FOLDER_TMP:self::IMAGE_FOLDER;
|
||||
return file_exists($sPath.$sFileName);
|
||||
}
|
||||
|
||||
public function checkIntegrity()
|
||||
{
|
||||
$asErrors = array();
|
||||
|
||||
//Check title
|
||||
if($this->sTitle=='') $asErrors['title'] = 'Un titre est nécessaire';
|
||||
|
||||
//Check steps
|
||||
if(count($this->asSteps)==0)
|
||||
{
|
||||
$asErrors['step'] = 'Au moins une étape est nécessaire';
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach($this->asSteps as $iStepId=>$sText)
|
||||
{
|
||||
if($sText=='')
|
||||
{
|
||||
$asErrors['step_'.$iStepId] = 'Une étape ne possède pas de texte';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Check images
|
||||
foreach($this->asImages as $iStepId=>$asImages)
|
||||
{
|
||||
foreach($asImages as $iImageId=>$asFileInfo)
|
||||
{
|
||||
//file exists in temp or already stored
|
||||
if(!$this->isImageSaved($asFileInfo['name']) && !$this->isImageSaved($asFileInfo['name'], true))
|
||||
{
|
||||
$asErrors['image_'.$iStepId.'_'.$iImageId] = 'Une image n\'a pas été téléchargée';
|
||||
}
|
||||
if($asFileInfo['desc']=='')
|
||||
{
|
||||
$asErrors['image_'.$iStepId.'_'.$iImageId] = 'Une image n\'a pas de nom (description)';
|
||||
}
|
||||
}
|
||||
}
|
||||
return $asErrors;
|
||||
}
|
||||
|
||||
public function saveProcedure($iPrevProcId)
|
||||
{
|
||||
//Add new procedure
|
||||
$asData = array('title'=>$this->sTitle, 'description'=>$this->sDescription, MySqlManager::getId(Databap::USER_TABLE)=>$this->iUserId);
|
||||
$iDbProcId = $this->oMySql->insertRow(Databap::PROC_TABLE, $asData);
|
||||
|
||||
//Add new steps
|
||||
$asStepData = $asImgData = array(MySqlManager::getId(Databap::PROC_TABLE)=>$iDbProcId);
|
||||
foreach($this->asSteps as $iStepId=>$sStepDesc)
|
||||
{
|
||||
$asStepData['description'] = $sStepDesc;
|
||||
$iDbStepId = $this->oMySql->insertRow(Databap::STEP_TABLE, $asStepData);
|
||||
|
||||
//Add new images
|
||||
$asImgData[MySqlManager::getId(Databap::STEP_TABLE)] = $iDbStepId;
|
||||
foreach($this->asImages[$iStepId] as $asImageInfo)
|
||||
{
|
||||
$asImgData['description'] = $asImageInfo['desc'];
|
||||
$asImgData['file_name'] = $asImageInfo['name'];
|
||||
$iDbImageId = $this->oMySql->insertRow(Databap::IMG_TABLE, $asImgData);
|
||||
$this->saveImage($asImgData['file_name']);
|
||||
}
|
||||
}
|
||||
|
||||
//Add this procedure to the group
|
||||
$bCreation = ($iPrevProcId==0);
|
||||
//$this->oMySql->deleteRow(Databap::PROC_TABLE, $this->iPrevProcId);
|
||||
//$this->oMySql->updateRow(Databap::PROC_TABLE, $iPrevProcId, array('refer_id'=>$iDbProcId));
|
||||
$iReferId = $bCreation?$iDbProcId:$this->oMySql->selectValue(Databap::PROC_TABLE, 'refer_id', $iPrevProcId);
|
||||
$this->oMySql->updateRow(Databap::PROC_TABLE, $iDbProcId, array('refer_id'=>$iReferId));
|
||||
|
||||
//Update new Procedure Id
|
||||
//$this->setProcedureId($iDbProcId);
|
||||
|
||||
//Reload Procedure
|
||||
$this->loadProcedure($iDbProcId);
|
||||
|
||||
//return creation or edition
|
||||
return $bCreation;
|
||||
}
|
||||
|
||||
private function saveImage($sFileName)
|
||||
{
|
||||
if(!$this->isImageSaved($sFileName))
|
||||
{
|
||||
$sTempFilePath = self::IMAGE_FOLDER_TMP.$sFileName;
|
||||
$sFilePath = self::IMAGE_FOLDER.$sFileName;
|
||||
|
||||
//Real Size Image
|
||||
if(!rename($sTempFilePath, $sFilePath))
|
||||
{
|
||||
$this->addError('Unmoveable file : '.$sTempFilePath);
|
||||
}
|
||||
|
||||
//Thumbnail picture
|
||||
$asResult = ToolBox::createThumbnail($sFilePath, self::THUMB_MAX_SIZE, self::THUMB_MAX_SIZE, self::IMAGE_FOLDER_THUMB, false, Databap::$UPLOAD_IMG_EXTS);
|
||||
if($asResult['error']!='') $this->addError('Unable to create thumbnail : '.$asResult['out']. '('.$asResult['error'].')');
|
||||
}
|
||||
}
|
||||
|
||||
public function loadProcedure($iProcId)
|
||||
{
|
||||
//Column names
|
||||
$sProcIdCol = MySqlManager::getId(Databap::PROC_TABLE);
|
||||
$sStepIdCol = MySqlManager::getId(Databap::STEP_TABLE);
|
||||
$sImageIdCol = MySqlManager::getId(Databap::IMG_TABLE);
|
||||
|
||||
//Get last id available
|
||||
$this->setProcedureId($iProcId);
|
||||
$this->refreshProcId();
|
||||
$asInfo = array('from'=>Databap::PROC_TABLE, 'constraint'=>array($sProcIdCol=>$this->getProcedureId()));
|
||||
|
||||
//Load procedure info
|
||||
$asResult = $this->oMySql->selectRow(Databap::PROC_TABLE, $asInfo['constraint']);
|
||||
$this->sTitle = $asResult['title'];
|
||||
$this->sDescription = $asResult['description'];
|
||||
$this->iUserId = $asResult[MySqlManager::getId(Databap::USER_TABLE)];
|
||||
$this->dLed = $asResult['led'];
|
||||
|
||||
//Load steps info
|
||||
$asInfo['from'] = Databap::STEP_TABLE;
|
||||
$this->asSteps = $this->oMySql->selectRows($asInfo, true, $sStepIdCol);
|
||||
|
||||
//Load images info
|
||||
$asInfo['from'] = Databap::IMG_TABLE;
|
||||
foreach($this->oMySql->selectRows($asInfo) as $asRow)
|
||||
{
|
||||
$this->asImages[$asRow[$sStepIdCol]][$asRow[$sImageIdCol]]['name'] = $asRow['file_name'];
|
||||
$this->asImages[$asRow[$sStepIdCol]][$asRow[$sImageIdCol]]['desc'] = $asRow['description'];
|
||||
}
|
||||
}
|
||||
|
||||
public function getProcedure()
|
||||
{
|
||||
// [id_step]=>text
|
||||
// [id_step][id_image]=>array('name'=>file name, 'desc'=> description)
|
||||
/*
|
||||
$asSteps = $asImages = array();
|
||||
$iLocalStepId = 1;
|
||||
foreach($this->asSteps as $iStepId=>$sStepDesc)
|
||||
{
|
||||
$asSteps[$iLocalStepId] = $sStepDesc;
|
||||
if(array_key_exists($iStepId, $this->asImages))
|
||||
{
|
||||
$asImages[] =
|
||||
}
|
||||
$iLocalStepId++;
|
||||
}*/
|
||||
return array( 'proc_id'=>$this->iProcId,
|
||||
'id_user'=>$this->iUserId,
|
||||
'title'=>Databap::getDescriptionFormat($this->sTitle),
|
||||
'description'=>Databap::getDescriptionFormat($this->sDescription),
|
||||
'led'=>Databap::getDateFormat($this->dLed),
|
||||
'steps'=>$this->asSteps,
|
||||
'images'=>$this->asImages);
|
||||
}
|
||||
|
||||
private function refreshProcId()
|
||||
{
|
||||
/*
|
||||
$iReferId = $this->getProcedureId();
|
||||
do
|
||||
{
|
||||
$iProcId = $iReferId;
|
||||
$iReferId = $this->oMySql->selectValue(Databap::PROC_TABLE, 'refer_id', $iProcId);
|
||||
}
|
||||
while($iReferId!=0);
|
||||
$this->setProcedureId($iProcId);
|
||||
*/
|
||||
$iReferId = $this->oMySql->selectValue(Databap::PROC_TABLE, 'refer_id', $this->getProcedureId());
|
||||
$sSelect = "MAX(".MySqlManager::getId(Databap::PROC_TABLE).")";
|
||||
$iProcId = $this->oMySql->selectValue(Databap::PROC_TABLE, $sSelect, array('refer_id'=>$iReferId));
|
||||
$this->setProcedureId($iProcId);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
267
inc/reader.php
Normal file
@@ -0,0 +1,267 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Abap Reader
|
||||
* @author franzz
|
||||
*/
|
||||
class Reader
|
||||
{
|
||||
//objects
|
||||
//private $oMask;
|
||||
|
||||
//general
|
||||
private $sCode;
|
||||
private $bImprovedColoring;
|
||||
|
||||
//Special Wors / Chars
|
||||
private $asAbap;
|
||||
|
||||
//constants
|
||||
const CASE_SENSITIVE = false;
|
||||
const NOT_FOUND = '* Code introuvable...';
|
||||
|
||||
function __construct($sCode, $bImprovedColoring = false)
|
||||
{
|
||||
//settings
|
||||
$this->bImprovedColoring = $bImprovedColoring;
|
||||
|
||||
//get code in db
|
||||
$this->sCode = $sCode;
|
||||
if($this->sCode=='')
|
||||
{
|
||||
$this->sCode = self::NOT_FOUND;
|
||||
}
|
||||
|
||||
//ABAP key words and chars
|
||||
$this->asAbap = array
|
||||
(
|
||||
'word'=>array
|
||||
(
|
||||
'wCore'=>array( /*'<icon>','<itab>',*/'ABBREVIATED','ABSTRACT','ABSTRACTFINAL','ACCEPT','ACCEPTING','ACCORDING','ACTUAL','ADD',
|
||||
'ADD-CORRESPONDING','ADDITIONS','ADJACENT','ALIASES','ALL','ALLOCATE','ANALYZER', 'AND','APPEND','APPENDING','AS',
|
||||
'ASCENDING','ASCENDINGDESCENDING','AT','ATTRIBUTE','AUTHORITY-CHECK','BACKGOUND','BEFORE','BEGIN','BETWEEN',
|
||||
'BIGLITTLE','BINARY','BIT','BLANK','BLOCK','BREAK-POINT','BY','BYPASSING','BYTE','BYTECHARACTER','CASE',
|
||||
'CASERESPECTING','CASTING','CENTERED','CHAIN','CHANGE','CHANGING','CHARACTER','CHECK','CHECKBOX',
|
||||
'CHECKBOXSYMBOLICONLINE','CLASS','CLASS-DATA','CLASS-EVENTS','CLASS-METHODS','CLEANUP','CLEAR','CLIENT','CLOCK',
|
||||
'CODE','COL_BACKGROUND','COL_HEADING','COL_NORMAL','COL_TOTAL','COLLECT','COLOR','COLUMN','COMMENT','COMMIT',
|
||||
'COMMON','COMMUNICATION','COMPARING','COMPONENTS','COMPUTE','CONCATENATE','CONDENSE','CONSTANTS','CONTEXT',
|
||||
'CONTEXTS','CONTINUE','CONTROL','CONTROLS','CONVERSION','CONVERT','COUNTRY','COUNTY','CURRENT','CURSOR',
|
||||
'CUSTOMER-FUNCTION','DATA','DATABASE','DATASET','DATE','DEALLOCATE','DECIMALS','DEFAULT','DEFAULTUTF-8NON-UNICODE',
|
||||
'DEFERRED','DEFINE','DEFINING','DEFINITION','DELETE','DELETING','DEMAND','DESCENDING','DESCRIBE','DESTINATION',
|
||||
'DIALOG','DIRECTORY','DISTANCE','DISTINCT','DIVIDE-CORRESPONDING','DO','DUPLICATE','DUPLICATES','DURING','DYNAMIC',
|
||||
'EDIT','EDITOR-CALL','ELSE','ELSEIF','ENCODING','END','ENDAT','ENDCASE','ENDCATCH','ENDCHAIN','ENDCLASS','ENDDO',
|
||||
'ENDEXEC','ENDFORM','ENDFUNCTION','ENDIAN','ENDIF','ENDING','ENDINTERFACE','ENDLOOP','ENDMETHOD','ENDMODULE',
|
||||
'ENDON','ENDPROVIDE','ENDSELECT','ENDTRY','ENDWHILE','END-OF_FILE','END-OF-DEFINITION','END-OF-PAGE',
|
||||
'END-OF-SELECTION','ENTRIES','EQ','ERRORS','EVENT','EVENTS','EXCEPTION','EXCEPTIONS','EXCEPTION-TABLE','EXCLUDE',
|
||||
'EXCLUDING','EXEC','EXIT','EXIT-COMMAND','EXPORT','EXPORTING','EXTENDED','EXTRACT','FETCH','FIELD','FIELD-GROUPS',
|
||||
'FIELDSNO','FIELD-SYMBOLS','FILTER','FINAL','FIND','FIRST','FOR','FORM','FORMAT','FORWARDBACKWARD','FOUND','FRAME',
|
||||
'FREE','FRIENDS','FROM','FUNCTION','FUNCTION-POOL','GE','GET','GIVING','GROUP','GT','HANDLER','HASHED','HAVING',
|
||||
'HEADER','HEADING','HELP-ID','HIDE','HIGHLOW','HOLD','HOTSPOT','ID','IF','IGNORING','IMMEDIATELY','IMPLEMENTATION',
|
||||
'IMPORT','IMPORTING','IN','INCREMENT','INDEX','INDEX-LINE','INHERITING','INIT','INITIAL','INITIALIZATION','INNER',
|
||||
'INNERLEFT','INSERT','INSTANCES','INTENSIFIED','INTERFACE','INTERFACES','INTERVALS','INTO','INTOAPPENDING',
|
||||
'INVERTED-DATE','IS','ITAB','JOIN','KEEPING','KEY','KEYS','KIND','LANGUAGE','LAST','LE','LEAVE','LEFT',
|
||||
'LEFT-JUSTIFIED','LEFTRIGHT','LEFTRIGHTCIRCULAR','LEGACY','LENGTH','LIKE','LINE','LINE-COUNT','LINES','LINES',
|
||||
'LINE-SELECTION','LINE-SIZE','LIST','LIST-PROCESSING','LOAD','LOAD-OF-PROGRAM','LOCAL','LOCALE','LOOP','LT',
|
||||
'MARGIN','MARK','MASK','MATCH','MAXIMUM','MEMORY','MESSAGE','MESSAGE-ID','MESSAGES','METHOD','METHODS','MOD','MODE',
|
||||
'MODEIN','MODIF','MODIFIER','MODIFY','MODULE','MOVE','MOVE-CORRESPONDING','MULTIPLY-CORRESPONDING','NE','NEW',
|
||||
'NEW-LINE','NEW-PAGE','NEXT','NODES','NODETABLE','NO-DISPLAY','NO-EXTENSION','NO-GAP','NO-GAPS',
|
||||
'NO-HEADINGWITH-HEADING','NON','NO-SCROLLING','NO-SCROLLINGSCROLLING','NOT','NO-TITLEWITH-TITLE','NO-ZERO','NUMBER',
|
||||
'OBJECT','OBLIGATORY','OCCURENCE','OCCURENCES','OCCURS','OF','OFF','OFFSET','ON','ONLY','ONOFF','OPEN','OPTION',
|
||||
'OPTIONAL','OR','ORDER','OTHERS','OUTPUT-LENGTH','OVERLAY','PACK','PACKAGE','PAGE','PAGELAST','PAGEOF','PAGEPAGE',
|
||||
'PAGES','PARAMETER','PARAMETERS','PARAMETER-TABLE','PART','PERFORM','PERFORMING','PFN','PF-STATUS','PLACES',
|
||||
'POS_HIGH','POS_LOW','POSITION','POSITIONS','PRIMARY','PRINT','PRINT-CONTROL','PRIVATE','PROCESS','PROGRAM',
|
||||
'PROPERTY','PROTECTED','PROVIDE','PUBLIC','PUBLICPROTECTEDPRIVATE','PUSHBUTTON','PUT','QUICKINFO','RADIOBUTTON',
|
||||
'RAISE','RAISING','RANGE','RANGES','READ','RECEIVE','RECEIVING','REDEFINITION','REFERENCE','REFRESH','REJECT',
|
||||
'RENAMING','REPLACE','REPLACEMENT','REPORT','RESERVE','RESET','RESOLUTION','RESULTS','RETURN','RETURNING','RIGHT',
|
||||
'RIGHT-JUSTIFIED','ROLLBACK','ROWS','RUN','SCAN','SCREEN','SCREEN-GROUP1','SCREEN-GROUP2','SCREEN-GROUP3',
|
||||
'SCREEN-GROUP4','SCREEN-GROUP5','SCREEN-INPUT','SCREEN-INTENSIFIED','SCROLL','SCROLL-BOUNDARY','SEARCH','SECTION',
|
||||
'SELECT','SELECTION','SELECTIONS','SELECTION-SCREEN','SELECTION-SET','SELECTION-TABLE','SELECT-OPTIONS','SEND',
|
||||
'SEPARATED','SET','SHARED','SHIFT','SIGN','SINGLE','SINGLEDISTINCT','SIZE','SKIP','SORT','SORTABLE','SPACE',
|
||||
'SPECIFIED','SPLIT','SQL','STABLE','STAMP','STANDARD','START','STARTING','START-OF-SELECTION','STATICS','STEP-LOOP',
|
||||
'STOP','STRLEN','STRUCTURE','SUBMIT','SUBTRACT','SUBTRACT-CORRESPONDING','SUFFIX','SUPPLY','SUPPRESS','SYMBOLS',
|
||||
'SYSTEM-EXCEPTIONS','TABLE','TABLES','TABLEVIEW','TASK','TEXT','THEN','TIME','TIMES','TITLE','TITLEBAR','TO',
|
||||
'TOPIC','TOP-OF-PAGE','TRAILING','TRANSACTION','TRANSFER','TRANSLATE','TRY','TYPE','TYPELIKE','TYPE-POOL',
|
||||
'TYPE-POOLS','TYPES','ULINE','UNION','UNIQUE','UNTIL','UP','UPDATE','UPPERLOWER','USER-COMMAND','USING','VALUE',
|
||||
'VALUES','VARY','VARYING','VERSION','VIA','WAIT','WHEN','WHERE','WHILE','WINDOW','WITH','WORK','WRITE','ZONE','ADD',
|
||||
'ADD-CORRESPONDING','APPEND','BREAK-POINT','CORRESPONDING','FIELDS','ASSIGN','AVG','BACK','CALL','CATCH','CHANGE',
|
||||
'CHECK','CLEAR','CLOSE','COMMIT','COMPUTE','COUNT','CREATE','DATASET','DELETE','DESCRIBE','DIVIDE','DO','ELSE',
|
||||
'ELSEIF','EXIT','FIND','FOR','FORMAT','GET','IF','INCLUDE','LOOP','MAX','MESSAGE','METHOD','MIN','MODIFY','MOVE',
|
||||
'MULTIPLY','NEW-PAGE','OBJECT','OPEN','ORDER','READ','SORT','SUM','TRANSLATE','ULINE','WORK','WRITE','XSTRLEN',
|
||||
'ABS','ACOS','AFTER','ALL','AND','AS','ASIN','ASSIGNING','AT','ATAN','BEGIN','BUFFER','BY','CA','CEIL','CENTERED',
|
||||
'CN','CO','COLOR','COMPARING','COMPONENT','COS','COSH','CP','CS','DEFAULT','END','EQ','EXP','FLOOR','FRAC','GE',
|
||||
'GROUP','GT','ICON','IN','INDEX','INNER','INTENSIFIED','INTO','IS','JOIN','LE','LEADING','LEAVE','LEFT','LIKE',
|
||||
'LOG','LOG10','LOWER','LT','M','MOD','NA','NE','NOT','NP','NS','O','OF','OFF','ON','OR','OTHERS','OUTER','REF',
|
||||
'RIGHT','SIGN','SIN','SINH','SQRT','TABLE','TABLENAME','TAN','TANH','TITLE','TO','TRAILING','TRUNC','TYPE','UPPER',
|
||||
'USING','VALUE','WITH', 'TRANSPORTING', 'TYPE-POOLS'),
|
||||
'wBwCore'=>array('SOURCE_PACKAGE', 'RESULT_PACKAGE', '<SOURCE_FIELDS>', '<RESULT_FIELDS>'),
|
||||
'cOperator'=>array('(', ')', ',', '.', ':', '-', '~', '[', ']', '<', '>'),
|
||||
'cCalculation'=>array('+', '-', '*', '/', '=', '(', ')'),
|
||||
'cComment'=>array('*'),
|
||||
'cPartComment'=>array('"'),
|
||||
'cString'=>array('"', '''),
|
||||
'iNumber'=>array('1', '2', '3', '4', '5', '6', '7', '8', '9', '0'),
|
||||
'wExpand'=>array('loop'=>'endloop', 'if'=>'endif'),
|
||||
'wGlobal'=>array('SY'),
|
||||
'wCodePart'=>array('main', 'global', 'global2')
|
||||
),
|
||||
'color'=>array
|
||||
(
|
||||
'wCore'=>'core',
|
||||
'wBwCore'=>'core',
|
||||
'cOperator'=>'operator',
|
||||
'cCalculation'=>'operator',
|
||||
'cComment'=>'comment',
|
||||
'cPartComment'=>'comment',
|
||||
'cString'=>'string',
|
||||
'iNumber'=>'number',
|
||||
'wExpand'=>'expand',
|
||||
'wGlobal'=>'glogal',
|
||||
'wCodePart'=>'code_part'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private function getWords($sKey)
|
||||
{
|
||||
return $this->asAbap['word'][$sKey];
|
||||
}
|
||||
|
||||
private function getColor($sKey)
|
||||
{
|
||||
return $this->asAbap['color'][$sKey];
|
||||
}
|
||||
|
||||
private function addColoring()
|
||||
{
|
||||
//Safe characters
|
||||
$sCode = $this->convText2Html($this->sCode);
|
||||
$sServName = $_GET['serv_name'];
|
||||
$sSafeRexExServName = preg_quote(str_replace('http://', '', $sServName), '/');
|
||||
|
||||
$asLines = explode("\n", $sCode);
|
||||
$asLineClasses = array();
|
||||
$iOffSet = 0;
|
||||
|
||||
//building lines
|
||||
foreach($asLines as $iLineNb=>$sLine)
|
||||
{
|
||||
/* Code ref:
|
||||
* <li id="#line_nb#" class="#li_class#">
|
||||
* <span class="expand_line">
|
||||
* <span id="#expand_id#" class="#expand_class#">-</span>
|
||||
* </span>
|
||||
* <span class="#code_class#">#line#</span>
|
||||
* </li>
|
||||
*/
|
||||
$sLiClass = $sExpandSign = $sCodeClass = $sExpandHtml = $sExpandButton = '';
|
||||
$sFirstWord = $this->getFirstWord($sLine);
|
||||
$sFirstChar = $this->getFirstChar($sLine);
|
||||
|
||||
//Apply current classes
|
||||
$sLiClass = implode(' ', $asLineClasses);
|
||||
|
||||
//Expanding starting/ending point
|
||||
if(in_array($sFirstWord, array_keys($this->getWords('wExpand')))) //start
|
||||
{
|
||||
$iLoopId = count($asLineClasses)+$iOffSet;
|
||||
$asLineClasses[] = 'loop'.$iLoopId;
|
||||
$sExpandButton = '<input type="button" id="expand_loop'.$iLoopId.'" class="minus" value="" />';
|
||||
}
|
||||
elseif(in_array($sFirstWord, $this->getWords('wExpand'))) //end
|
||||
{
|
||||
array_pop($asLineClasses);
|
||||
$iOffSet++;
|
||||
$sExpandButton = '<span></span>';
|
||||
}
|
||||
|
||||
//Enlarge line
|
||||
//if(mb_strpos($sLine, $sServName) !== false) $sLiClass .= ' bigline';
|
||||
|
||||
//comments (entire line)
|
||||
$sCodeClass = (in_array($sFirstChar, $this->getWords('cComment')))?'comment':'code';
|
||||
|
||||
//Internal & external Urls
|
||||
$sLine = Toolbox::findReplaceLinks($sLine);
|
||||
|
||||
$asColoredLines[] = '<li id="'.($iLineNb+1).'" class="round_right '.$sLiClass.'"><span class="expand_line">'.$sExpandButton.'</span><span class="'.$sCodeClass.'">'.$sLine.'</span></li>';
|
||||
}
|
||||
$sCode = implode('', $asColoredLines);
|
||||
|
||||
//Strings
|
||||
foreach($this->getWords('cString') as $sStringWord)
|
||||
{
|
||||
$sPattern = '/>([^<]*?)'.$sStringWord.'([^<]*?)'.$sStringWord.'/u';
|
||||
$sCode = preg_replace($sPattern, '>$1<span class="string">'.$sStringWord.'$2'.$sStringWord.'</span>', $sCode);
|
||||
}
|
||||
|
||||
//Part comment
|
||||
$sPattern = '/>([^<]*)\"\;([^<]*)\<\/span\>\<\/li\>/u';
|
||||
$sCode = preg_replace($sPattern, '>$1<span class="comment">"$2</span>', $sCode);
|
||||
|
||||
//Global / Main
|
||||
$sPattern = '/>\*\ \[('.implode('|', $this->getWords('wCodePart')).')\]/u';
|
||||
$sCode = preg_replace($sPattern, '><span class="code_part">> $1</span>', $sCode);
|
||||
|
||||
//Core Words
|
||||
foreach($this->getWords('wCore') as $sCoreWord)
|
||||
{
|
||||
$sCoreWord = mb_strtolower($sCoreWord);
|
||||
$sPattern = '/>(([^<]*)([^\w&<]{1})|.{0})('.$sCoreWord.')([\W])/u';
|
||||
$sCode = preg_replace($sPattern, '>$1<span class="core">$4</span>$5', $sCode);
|
||||
}
|
||||
//$sCoreWords = str_replace(' ', '\ ', implode('|', array_map('mb_strtolower', $this->getWords('wCore'))));
|
||||
//$sPattern = '/>(([^<]*)([^\w<]{1})|.{0})('.$sCoreWords.')(?=[\W])/U';
|
||||
//$sCode = preg_replace($sPattern, '>$1<span class="core">$4</span>', $sCode);
|
||||
|
||||
//Operators
|
||||
//TODO distinguer operator / calculation
|
||||
$asOperators = array_unique(array_merge($this->getWords('cOperator'), $this->getWords('cCalculation')));
|
||||
foreach($asOperators as $sOpWord)
|
||||
{
|
||||
$sPattern = '/>([^<]*)\\'.$sOpWord.'/u';
|
||||
$sCode = preg_replace($sPattern, '>$1<span class="operator">'.$sOpWord.'</span>', $sCode);
|
||||
}
|
||||
//$sPattern = '/>([^<]*)['.implode(array_map('mb_strtolower', ($this->getWords('cOperator')))).']/';
|
||||
//echo $sPattern;
|
||||
//$sCode = preg_replace($sPattern, '>$1<span class="operator">$2$3</span>', $sCode);
|
||||
|
||||
//Numbers
|
||||
$sPreChar = '\\'.implode('\\', $this->getWords('cCalculation')).'\s';
|
||||
$sPattern = '/>((([^<]*)['.$sPreChar.']{1})|.{0})([0-9]+)([\W])/u';
|
||||
$sCode = preg_replace($sPattern, '>$1<span class="number">$4</span>$5', $sCode);
|
||||
|
||||
return $sCode;
|
||||
}
|
||||
|
||||
private static function getFirstWord($sText)
|
||||
{
|
||||
return mb_strstr(str_replace('.', ' ', trim($sText)), ' ', true);
|
||||
}
|
||||
|
||||
private static function getFirstChar($sText)
|
||||
{
|
||||
return mb_substr(str_replace('.', ' ', trim($sText)), 0, 1);
|
||||
}
|
||||
|
||||
private function addColor(&$sText, $sWord, $sClassColor)
|
||||
{
|
||||
$sText = str_replace($sWord, '<span class="'.$sClassColor.'">'.$sWord.'</span>', $sText);
|
||||
}
|
||||
|
||||
private static function getColoredWord($sWord, $sClass)
|
||||
{
|
||||
return '<span class="'.$sClass.'">'.$sWord.'</span>';
|
||||
}
|
||||
|
||||
public static function convText2Html($sCode)
|
||||
{
|
||||
return htmlspecialchars(mb_strtolower($sCode), ENT_QUOTES);
|
||||
}
|
||||
|
||||
public function getColoredCode()
|
||||
{
|
||||
return $this->addColoring();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -16,7 +16,7 @@ class Feed extends PhpObject {
|
||||
|
||||
public function __construct($asDesc, $asItems=array())
|
||||
{
|
||||
parent::__construct();
|
||||
parent::__construct(__CLASS__, Settings::DEBUG);
|
||||
if(!array_key_exists('link', $asDesc))
|
||||
{
|
||||
$asDesc['link'] = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME'].'/rss';
|
||||
|
||||
254
inc/searchengine.php
Normal file
@@ -0,0 +1,254 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Search Engine : Search through all types of databap documents
|
||||
*
|
||||
* Procedure to add a new type in the search
|
||||
* - Add type in Databap->getItemTables()
|
||||
* - Add type in the index builder : SearchEngine->buildIndex()
|
||||
* - Add type in item info : SearchEngine->setItemInfo()
|
||||
* - Add type in Databap->getItemList() and create a Databap->get<type>info()
|
||||
* - Add type text in Databap->getProfile()
|
||||
* - Consider the message types : add + edit in Databap->getMessages() and in chat.html
|
||||
*/
|
||||
class SearchEngine extends PhpObject
|
||||
{
|
||||
//Objects
|
||||
private $oMySql;
|
||||
|
||||
//variables
|
||||
private $asWords;
|
||||
private $iLevelMax;
|
||||
private $asItemRanks;
|
||||
private $asItemInfos;
|
||||
private $asUserInfos;
|
||||
|
||||
//Constants
|
||||
const RESULT_A_PAGE = 20;
|
||||
const KEYWORDS_SEPARATOR = ' ';
|
||||
|
||||
function __construct($oMySql)
|
||||
{
|
||||
parent::__construct(__CLASS__, Settings::DEBUG);
|
||||
$this->oMySql = $oMySql;
|
||||
$this->asWords = $this->setWords('');
|
||||
$this->asItemRanks = array();
|
||||
$this->asItemInfos = array();
|
||||
$this->asUserInfos = array();
|
||||
}
|
||||
|
||||
public function buildIndex($iItemId, $sType)
|
||||
{
|
||||
//Build keywords
|
||||
switch($sType)
|
||||
{
|
||||
case Databap::CODE_TYPE:
|
||||
$asItemData = $this->oMySql->selectRow(Databap::CODE_TABLE, $iItemId);
|
||||
$asWords = array($asItemData[MySqlManager::getText(Databap::CODE_TABLE)], $asItemData['description']);
|
||||
break;
|
||||
case Databap::PROC_TYPE:
|
||||
$sItemIdCol = MySqlManager::getId(Databap::PROC_TABLE);
|
||||
$asItemData = $this->oMySql->selectRow(Databap::PROC_TABLE, $iItemId);
|
||||
$asItemStepsData = $this->oMySql->selectRows(array('select'=>'description', 'from'=>Databap::STEP_TABLE, 'constraint'=>array($sItemIdCol=>$iItemId)));
|
||||
$asWords = array('desc'=>$asItemData['description'], 'title'=>$asItemData['title']) + $asItemStepsData;
|
||||
break;
|
||||
case Databap::ART_TYPE:
|
||||
$asItemData = $this->oMySql->selectRow(Databap::ART_TABLE, $iItemId);
|
||||
$asWords = array($asItemData['first_name'], $asItemData['last_name'], $asItemData['title']);
|
||||
break;
|
||||
case Databap::DOC_TYPE:
|
||||
$sItemIdCol = MySqlManager::getId(Databap::DOC_TABLE);
|
||||
$asItemData = $this->oMySql->selectRow(Databap::DOC_TABLE, $iItemId);
|
||||
$asItemFilesData = $this->oMySql->selectRows(array('select'=>'description', 'from'=>Databap::FILE_TABLE, 'constraint'=>array($sItemIdCol=>$iItemId)));
|
||||
$asWords = array('desc'=>$asItemData['description'], 'title'=>$asItemData['title']) + $asItemFilesData;
|
||||
break;
|
||||
case Databap::TABLE_TYPE:
|
||||
$asItemData = $this->oMySql->selectRow(Databap::TABL_TABLE, $iItemId);
|
||||
$asWords = array('desc'=>$asItemData['description'], 'title'=>$asItemData['title'], 'keywords'=>$asItemData['keywords'], 'system'=>$asItemData['system']);
|
||||
break;
|
||||
default:
|
||||
$this->addError('function '.__FUNCTION__.'(): Incorrect type "'.$sType.'"');
|
||||
break;
|
||||
}
|
||||
$sWords = implode(self::KEYWORDS_SEPARATOR, $asWords);
|
||||
$sWords = mb_strtolower(str_replace("\n", self::KEYWORDS_SEPARATOR, $sWords));
|
||||
$sWords = preg_replace('/(\W+)/u', self::KEYWORDS_SEPARATOR, $sWords); //remove all non-word characters
|
||||
|
||||
//Add / Modify search database
|
||||
$asData = array('id_item'=>$iItemId, 'type'=>$sType, 'refer_id'=>(array_key_exists('refer_id', $asItemData)?$asItemData['refer_id']:$iItemId), 'keywords'=>$sWords);
|
||||
$this->oMySql->insertUpdateRow(Databap::SEARCH_TABLE, $asData, array('id_item', 'type'));
|
||||
}
|
||||
|
||||
public function setWords($sSearchWords)
|
||||
{
|
||||
$this->asWords = $this->getParsedWords($sSearchWords);
|
||||
$this->iLevelMax = count($this->asWords);
|
||||
$this->setResults();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO Customized item preview
|
||||
$sCodeLines = implode("\n...\n", $this->getCodeInfo($iItemId, 'code'));
|
||||
$oCode = new Reader($sCodeLines);
|
||||
$sCodeLines = $oCode->getColoredCode();
|
||||
*/
|
||||
private function setItemInfo($iSearchId, $iItemType, $iItemId)
|
||||
{
|
||||
if(!array_key_exists($iSearchId, $this->asItemInfos))
|
||||
{
|
||||
switch($iItemType)
|
||||
{
|
||||
case Databap::CODE_TYPE:
|
||||
$sItemTable = Databap::CODE_TABLE;
|
||||
$asItemFields = array(MySqlManager::getId(Databap::USER_TABLE), 'description', 'led');
|
||||
break;
|
||||
case Databap::PROC_TYPE:
|
||||
$sItemTable = Databap::PROC_TABLE;
|
||||
$asItemFields = array(MySqlManager::getId(Databap::USER_TABLE), 'title AS description', 'led');
|
||||
break;
|
||||
case Databap::ART_TYPE:
|
||||
$sItemTable = Databap::ART_TABLE;
|
||||
$asItemFields = array('first_name', 'last_name', 'title AS description', 'led');
|
||||
break;
|
||||
case Databap::DOC_TYPE:
|
||||
$sItemTable = Databap::DOC_TABLE;
|
||||
$asItemFields = array(MySqlManager::getId(Databap::USER_TABLE), 'title AS description', 'led');
|
||||
break;
|
||||
case Databap::TABLE_TYPE:
|
||||
$sItemTable = Databap::TABL_TABLE;
|
||||
$asItemFields = array(MySqlManager::getId(Databap::USER_TABLE), 'title AS description', 'led');
|
||||
break;
|
||||
}
|
||||
$this->asItemInfos[$iSearchId] = $this->oMySql->selectRow($sItemTable, $iItemId, $asItemFields);
|
||||
$this->asItemInfos[$iSearchId]['type'] = $iItemType;
|
||||
$this->asItemInfos[$iSearchId]['id_item'] = $iItemId;
|
||||
}
|
||||
}
|
||||
|
||||
private function getItemInfo($iSearchId, $sInfoName)
|
||||
{
|
||||
if(array_key_exists($iSearchId, $this->asItemInfos) && array_key_exists($sInfoName, $this->asItemInfos[$iSearchId]))
|
||||
return $this->asItemInfos[$iSearchId][$sInfoName];
|
||||
else return false;
|
||||
}
|
||||
|
||||
private function setUserInfo($iUserId)
|
||||
{
|
||||
if($iUserId > 0 && !array_key_exists($iUserId, $this->asUserInfos))
|
||||
{
|
||||
$sCompanyIdCol = MySqlManager::getId(Databap::COMP_TABLE);
|
||||
$this->asUserInfos[$iUserId] = $this->oMySql->selectRow
|
||||
(
|
||||
Databap::USER_TABLE,
|
||||
$iUserId,
|
||||
array('first_name', 'last_name', $sCompanyIdCol)
|
||||
);
|
||||
|
||||
$this->asUserInfos[$iUserId]['company'] = $this->oMySql->selectValue(Databap::COMP_TABLE, MySqlManager::getText(Databap::COMP_TABLE), $this->asUserInfos[$iUserId][$sCompanyIdCol]);
|
||||
unset($this->asUserInfos[$iUserId][$sCompanyIdCol]);
|
||||
}
|
||||
}
|
||||
|
||||
private function getUserInfo($iUserId, $sInfoName)
|
||||
{
|
||||
if(array_key_exists($iUserId, $this->asUserInfos) && array_key_exists($sInfoName, $this->asUserInfos[$iUserId]))
|
||||
return $this->asUserInfos[$iUserId][$sInfoName];
|
||||
else return false;
|
||||
}
|
||||
|
||||
private function setResults()
|
||||
{
|
||||
if($this->iLevelMax > 0)
|
||||
{
|
||||
//set Results and Ranking
|
||||
$aiLevels = range(1, $this->iLevelMax);
|
||||
arsort($aiLevels);
|
||||
foreach($aiLevels as $iLevel)
|
||||
{
|
||||
//all possibilies at level $iLevel
|
||||
$iIndex = 0;
|
||||
while(($iIndex + $iLevel) <= $this->iLevelMax)
|
||||
{
|
||||
//building query
|
||||
$asSequence = array_slice($this->asWords, $iIndex, $iLevel);
|
||||
$this->oMySql->cleanSql($asSequence);
|
||||
|
||||
//$sRegExp = implode('(.{0,2})', $asSequence);
|
||||
$sRegExp = implode(self::KEYWORDS_SEPARATOR.'?', $asSequence);
|
||||
$sSequence = implode(self::KEYWORDS_SEPARATOR, $asSequence);
|
||||
|
||||
//TODO replace with selectRow()
|
||||
$sQuery = "SELECT id_search, MAX(id_item) AS id_item, type, keywords FROM searchs WHERE keywords REGEXP '{$sRegExp}' GROUP BY type, refer_id";
|
||||
|
||||
//search sequence
|
||||
$asItems = $this->oMySql->getArrayQuery($sQuery, true);
|
||||
foreach($asItems as $asItem)
|
||||
{
|
||||
$iSearchId = $asItem['id_search'];
|
||||
$iItemId = $asItem['id_item'];;
|
||||
$iItemType = $asItem['type'];
|
||||
$sWords = $asItem['keywords'];
|
||||
|
||||
//Calculate bonus points
|
||||
$sWords = str_replace(self::KEYWORDS_SEPARATOR.$sSequence.self::KEYWORDS_SEPARATOR, self::KEYWORDS_SEPARATOR, self::KEYWORDS_SEPARATOR.$sWords.self::KEYWORDS_SEPARATOR, $iSeqCount);
|
||||
$sWords = str_replace(self::KEYWORDS_SEPARATOR.$sSequence, self::KEYWORDS_SEPARATOR, self::KEYWORDS_SEPARATOR.$sWords.self::KEYWORDS_SEPARATOR, $iStaCount);
|
||||
$sWords = str_replace($sSequence.self::KEYWORDS_SEPARATOR, self::KEYWORDS_SEPARATOR, self::KEYWORDS_SEPARATOR.$sWords.self::KEYWORDS_SEPARATOR, $iEndCount);
|
||||
$iBonus = $iSeqCount*5 + $iStaCount*2 + $iEndCount;
|
||||
|
||||
$this->incItemRank($iSearchId, $iLevel*10+$iBonus);
|
||||
$this->setItemInfo($iSearchId, $iItemType, $iItemId);
|
||||
$this->setUserInfo($this->getItemInfo($iSearchId, MySqlManager::getId(Databap::USER_TABLE)));
|
||||
}
|
||||
$iIndex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function getResults()
|
||||
{
|
||||
$asResult = array();
|
||||
|
||||
//Mixing info
|
||||
arsort($this->asItemRanks);
|
||||
foreach($this->asItemRanks as $iSearchId=>$iRank)
|
||||
{
|
||||
$iUserId = $this->getItemInfo($iSearchId, MySqlManager::getId(Databap::USER_TABLE));
|
||||
$sFirstName = $this->getUserInfo($iUserId, 'first_name')?$this->getUserInfo($iUserId, 'first_name'):$this->getItemInfo($iSearchId, 'first_name');
|
||||
$sLastName = $this->getUserInfo($iUserId, 'last_name')?$this->getUserInfo($iUserId, 'last_name'):$this->getItemInfo($iSearchId, 'last_name');
|
||||
$sCompany = $this->getUserInfo($iUserId, 'company')?$this->getUserInfo($iUserId, 'company'):'SAP';
|
||||
$asResult[] = array('id_item'=>$this->getItemInfo($iSearchId, 'id_item'),
|
||||
'type'=>$this->getItemInfo($iSearchId, 'type'),
|
||||
'description'=>$this->getItemInfo($iSearchId, 'description'),
|
||||
'rank'=>$iRank,
|
||||
'name'=>Databap::getNameFormat($sFirstName, $sLastName),
|
||||
'company'=>Databap::getCompanyFormat($sCompany),
|
||||
'led'=>Databap::getDateFormat($this->getItemInfo($iSearchId, 'led')));
|
||||
}
|
||||
return $asResult;
|
||||
}
|
||||
|
||||
private function incItemRank($iSearchId, $iRank)
|
||||
{
|
||||
if(array_key_exists($iSearchId, $this->asItemRanks))
|
||||
{
|
||||
$this->asItemRanks[$iSearchId] += $iRank;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->asItemRanks[$iSearchId] = $iRank;
|
||||
}
|
||||
}
|
||||
|
||||
private function getParsedWords($sSearchWords)
|
||||
{
|
||||
return array_unique(array_filter(explode(' ', $sSearchWords), array($this, 'checkSearchedWords')));
|
||||
}
|
||||
|
||||
private function checkSearchedWords($sWord)
|
||||
{
|
||||
return (mb_strlen($sWord) >= 2);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
312
inc/toolbox.php
Normal file
@@ -0,0 +1,312 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* ToolBox - Only static functions missing from php librairy
|
||||
* @author franzz
|
||||
* @version 1.1a
|
||||
*/
|
||||
class ToolBox
|
||||
{
|
||||
const MAIL_SUCCESS = 2;
|
||||
|
||||
public static function cleanPost(&$asData)
|
||||
{
|
||||
//get rid of magic quotes
|
||||
if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())
|
||||
{
|
||||
$asData = self::cleanData($asData, 'stripslashes');
|
||||
}
|
||||
}
|
||||
|
||||
public static function cleanData($oData, $sCleaningFunc)
|
||||
{
|
||||
if(!is_array($oData))
|
||||
{
|
||||
return call_user_func($sCleaningFunc, $oData);
|
||||
}
|
||||
elseif(count($oData)>0)
|
||||
{
|
||||
$asCleaningFunc = array_fill(1, count($oData), $sCleaningFunc);
|
||||
$asKeys = array_map(array('self', 'cleanData'), array_keys($oData), $asCleaningFunc);
|
||||
$asValues = array_map(array('self', 'cleanData'), $oData, $asCleaningFunc);
|
||||
return array_combine($asKeys, $asValues);
|
||||
}
|
||||
}
|
||||
|
||||
public static function fixGlobalVars($argv)
|
||||
{
|
||||
//Add CLI arguments
|
||||
if(defined('STDIN')) mb_parse_str(implode('&', array_slice($argv, 1)), $_GET);
|
||||
|
||||
//Add Server Name
|
||||
$sServerName = array_key_exists('SERVER_NAME', $_SERVER)?$_SERVER['SERVER_NAME']:$_SERVER['PWD'];
|
||||
$sAppPath = 'http://'.str_replace('http://', '', $sServerName.dirname($_SERVER['SCRIPT_NAME']));
|
||||
$_GET['serv_name'] = $sAppPath.(mb_substr($sAppPath, -1)!='/'?'/':'');
|
||||
}
|
||||
|
||||
public static function array_map_encapsulate($oData, $sChar)
|
||||
{
|
||||
if(is_array($oData))
|
||||
{
|
||||
$asChar = array_fill(1, count($oData), $sChar);
|
||||
return array_combine(array_keys($oData), array_map(array('self', 'array_map_encapsulate'), $oData, $asChar));
|
||||
}
|
||||
else
|
||||
{
|
||||
return $sChar.$oData.$sChar;
|
||||
}
|
||||
}
|
||||
|
||||
public static function capitalizeWords($acText, $sCharList = '')
|
||||
{
|
||||
//Use ucwords if no delimiters are given
|
||||
if($sCharList=='')
|
||||
{
|
||||
return Toolbox::mb_ucwords($acText);
|
||||
}
|
||||
|
||||
// Go through all characters
|
||||
$capitalizeNext = true;
|
||||
$max = mb_strlen($acText);
|
||||
for ($i = 0; $i < $max; $i++)
|
||||
{
|
||||
if(mb_strpos($sCharList, $acText[$i]) !== false)
|
||||
{
|
||||
$capitalizeNext = true;
|
||||
}
|
||||
elseif($capitalizeNext)
|
||||
{
|
||||
$capitalizeNext = false;
|
||||
$acText[$i] = mb_strtoupper($acText[$i]);
|
||||
}
|
||||
}
|
||||
|
||||
return $acText;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param String $sFromName
|
||||
* @param String $sSubject
|
||||
* @param String $sMessage
|
||||
* @param String $sTo
|
||||
* @param Array $asCc array(name => email)
|
||||
* @param Boolean $bSelfMail
|
||||
* @return mixed
|
||||
*/
|
||||
public function sendMail($sFromName, $sSubject, $sMessage, $sTo, $asCc=array(), $bSelfMail=true)
|
||||
{
|
||||
$asForm = array('api_key'=>Settings::MAIL_API_KEY,
|
||||
'app'=>'Wedding',
|
||||
'from_name'=>$sFromName,
|
||||
'subject'=>$sSubject,
|
||||
'msg'=>$sMessage,
|
||||
'to_email'=>$sTo,
|
||||
'cc_email'=>self::jsonConvert($asCc),
|
||||
'self'=>$bSelfMail);
|
||||
|
||||
$oCurl = curl_init();
|
||||
curl_setopt($oCurl, CURLOPT_URL, Settings::MAIL_SCRIPT);
|
||||
curl_setopt($oCurl, CURLOPT_POST, true);
|
||||
curl_setopt($oCurl, CURLOPT_HEADER, false);
|
||||
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($oCurl, CURLOPT_POSTFIELDS, $asForm);
|
||||
$iResult = curl_exec($oCurl);
|
||||
curl_close($oCurl);
|
||||
|
||||
return $iResult;
|
||||
}
|
||||
|
||||
public static function jsonExport($asData)
|
||||
{
|
||||
header('Content-type: application/json');
|
||||
//return htmlspecialchars(json_encode($asData), ENT_NOQUOTES);
|
||||
return self::jsonConvert($asData);
|
||||
}
|
||||
|
||||
public static function jsonConvert($asData)
|
||||
{
|
||||
return json_encode($asData);
|
||||
}
|
||||
|
||||
public static function createThumbnail($sInPath, $iMaxWidth, $iMaxHeight, $sOutPath='', $bDeleteIn=false, $asImageExts=array('jpg', 'jpeg', 'gif', 'png'))
|
||||
{
|
||||
$asResult = array('error'=>'');
|
||||
|
||||
//Look up the extension to choose the image creator
|
||||
//TODO use MIME types
|
||||
$sInInfo = pathinfo($sInPath);
|
||||
$sInName = mb_strtolower($sInInfo['basename']);
|
||||
$sImageExt = mb_strtolower($sInInfo['extension']);
|
||||
$sImageExt = ($sImageExt=='jpg')?'jpeg':$sImageExt;
|
||||
|
||||
//New Destination folder
|
||||
if($sOutPath=='') $sOutPath = $sInPath;
|
||||
elseif(mb_substr($sOutPath, -1)=='/') $sOutPath .= $sInName;
|
||||
|
||||
//New sizes
|
||||
if(in_array($sImageExt, $asImageExts))
|
||||
{
|
||||
list($iWidth, $iHeight) = getimagesize($sInPath);
|
||||
if($iWidth > $iMaxWidth || $iHeight > $iMaxHeight)
|
||||
{
|
||||
$dResizeDeltaWidth = $iWidth - $iMaxWidth;
|
||||
$dResizeDeltaHeight = $iHeight - $iMaxHeight;
|
||||
if($dResizeDeltaWidth > $dResizeDeltaHeight)
|
||||
{
|
||||
$iResizedWidth = $iMaxWidth;
|
||||
$iResizedHeight = ($iResizedWidth / $iWidth) * $iHeight;
|
||||
}
|
||||
else
|
||||
{
|
||||
$iResizedHeight = $iMaxHeight;
|
||||
$iResizedWidth = ($iResizedHeight / $iHeight) * $iWidth;
|
||||
}
|
||||
|
||||
//create image from source
|
||||
$oSource = call_user_func('imagecreatefrom'.$sImageExt, $sInPath);
|
||||
|
||||
//Resize
|
||||
$oThumb = imagecreatetruecolor($iResizedWidth, $iResizedHeight);
|
||||
imagecopyresized($oThumb, $oSource, 0, 0, 0, 0, $iResizedWidth, $iResizedHeight, $iWidth, $iHeight);
|
||||
|
||||
//Save
|
||||
if(file_exists($sOutPath)) unlink($sOutPath);
|
||||
if(!call_user_func_array('image'.$sImageExt, array($oThumb, $sOutPath)))
|
||||
{
|
||||
$asResult['error'] = 'Unable to create thumbnail : '.$sOutPath;
|
||||
}
|
||||
}
|
||||
elseif($sInPath != $sOutPath)
|
||||
{
|
||||
$iResizedWidth = $iWidth;
|
||||
$iResizedHeight = $iHeight;
|
||||
if(!copy($sInPath, $sOutPath)) $asResult['error'] = 'Copy failed from '.$sInPath.' to '.$sOutPath;
|
||||
}
|
||||
$asResult['width'] = $iResizedWidth;
|
||||
$asResult['height'] = $iResizedHeight;
|
||||
$asResult['out'] = $sOutPath;
|
||||
}
|
||||
else $asResult['error'] = 'Wrong file type';
|
||||
|
||||
if($bDeleteIn && $asResult['error']=='' && $sInPath != $sOutPath) unlink($sInPath);
|
||||
|
||||
return $asResult;
|
||||
}
|
||||
|
||||
public static function utf8_compliant($sText)
|
||||
{
|
||||
if(strlen($sText) == 0) return true;
|
||||
return (preg_match('/^.{1}/us', $sText, $ar) == 1);
|
||||
}
|
||||
|
||||
public static function mb_ucwords($sText)
|
||||
{
|
||||
return mb_convert_case($sText, MB_CASE_TITLE, "UTF-8");
|
||||
}
|
||||
|
||||
public static function mb_ucfirst($sText)
|
||||
{
|
||||
$sLength = mb_strlen($sText);
|
||||
$sFirstChar = mb_substr($sText, 0, 1);
|
||||
$sThen = mb_substr($sText, 1, $sLength - 1);
|
||||
return mb_strtoupper($sFirstChar).$sThen;
|
||||
}
|
||||
|
||||
public static function file_get_contents_utf8($oFile)
|
||||
{
|
||||
$sContent = file_get_contents($oFile);
|
||||
return mb_convert_encoding($sContent, 'UTF-8', mb_detect_encoding($sContent, 'UTF-8, ISO-8859-1', true));
|
||||
}
|
||||
|
||||
public static function rgbToHex($R, $G, $B)
|
||||
{
|
||||
$R = dechex($R);
|
||||
if(strlen($R)<2) $R='0'.$R;
|
||||
|
||||
$G = dechex($G);
|
||||
if(strlen($G)<2) $G='0'.$G;
|
||||
|
||||
$B = dechex($B);
|
||||
if(strlen($B)<2) $B='0'.$B;
|
||||
|
||||
return $R.$G.$B;
|
||||
}
|
||||
|
||||
public static function setCookie($sCookieName, $sCookieValue, $iDays)
|
||||
{
|
||||
$iTimeLimit = time()+60*60*24*$iDays;
|
||||
setcookie($sCookieName, $sCookieValue, $iTimeLimit);
|
||||
}
|
||||
|
||||
//TODO implement link pattern
|
||||
public static function findReplaceLinks($sText, $sLinkPattern='')
|
||||
{
|
||||
$sServerPath = substr(str_replace(array('http://', 'https://'), '', $_GET['serv_name']), 0, -1);
|
||||
|
||||
//Phase 1 : Identify internal links : merge cases /#code-1 and code 1, destroy link.
|
||||
$asPatterns = array();
|
||||
foreach(Databap::$HASH_TO_PAGE as $sAlt=>$sFinal)
|
||||
{
|
||||
$asPatterns['`(^|\ )(https?://|)'.$sServerPath.'/?\#'.$sAlt.'\-([\d]+)`sui'] = '$1$4'.$sFinal.' $3';
|
||||
}
|
||||
$sText = preg_replace(array_keys($asPatterns), array_values($asPatterns), $sText);
|
||||
|
||||
//Phase 2 : Identify remaining links (external)
|
||||
$asPatterns = array('`((?:https?|ftp)://\S+[[:alnum:]]/?)`sui', '`((?<!//)(www\.\S+[[:alnum:]]/?))`sui');
|
||||
$asLinks = array('<a href="$1" class="external_link" target="_blank"><i class="fa fa-inline fa-c-share"></i>$1</a> ', '<a href="http://$1" class="external_link" target="_blank"><i class="fa fa-inline fa-c-share"></i>$1</a>');
|
||||
$sText = preg_replace($asPatterns, $asLinks, $sText);
|
||||
|
||||
//Phase 3: rebuild link
|
||||
$asPatterns = array();
|
||||
foreach(Databap::$HASH_TO_PAGE as $sAlt=>$sFinal)
|
||||
{
|
||||
$asPatterns['`(^|\ )'.$sAlt.'\ ([\d]+)(\ |)`sui'] = '$1<a href="#'.$sFinal.'-$2" target="_blank" class="internal_link round"><i class="fa fa-inline fa-c-'.$sFinal.'"></i>'.$sFinal.' $2</a>$3';
|
||||
}
|
||||
$sText = preg_replace(array_keys($asPatterns), array_values($asPatterns), $sText);
|
||||
|
||||
//@file_put_contents('log.html', "\n\n".date('r')."\n".$test, FILE_APPEND);
|
||||
|
||||
return $sText;
|
||||
}
|
||||
|
||||
public static function getDateTimeDesc($oTime)
|
||||
{
|
||||
$iTimeStamp = is_numeric($oTime)?$oTime:strtotime($oTime);
|
||||
$sCurTimeStamp = time();
|
||||
|
||||
$asWeekDays = array('lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche');
|
||||
$asMonths = array('janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre');
|
||||
$sSep = '|';
|
||||
$sFormat = 'Y'.$sSep.'n'.$sSep.'W'.$sSep.'N'.$sSep.'j'.$sSep.'G';
|
||||
list($sYear, $sMonth, $sWeek, $sWeekDay, $sDay, $sHour) = explode($sSep, date($sFormat, $iTimeStamp));
|
||||
list($sCurYear, $sCurMonth, $sCurWeek, $sCurWeekDay, $sCurDay, $sCurHour) = explode($sSep, date($sFormat, $sCurTimeStamp));
|
||||
|
||||
$sDesc = '';
|
||||
if($iTimeStamp>$sCurTimeStamp) $sDesc = 'dans le futur';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60) $sDesc = 'il y a quelques secondes';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*10) $sDesc = 'il y a quelques minutes';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*20) $sDesc = 'il y a un quart d\'heure';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*50) $sDesc = 'il y a une demi-heure';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*2) $sDesc = 'il y a une heure';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*24 && $sDay==$sCurDay) $sDesc = 'à '.$sHour.'h';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*24) $sDesc = 'hier';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*7 && $sWeek==$sCurWeek) $sDesc = $asWeekDays[$sWeekDay-1];
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*7) $sDesc = $asWeekDays[$sWeekDay-1].' dernier';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*9) $sDesc = 'il y a une semaine';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*12) $sDesc = 'il y a 10 jours';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*16) $sDesc = 'il y a 2 semaines';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*23) $sDesc = 'il y a 3 semaines';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*31 && $sMonth==$sCurMonth) $sDesc = 'le '.$sDay.' '.$asMonths[$sMonth-1];
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*30*2 && $sMonth==($sCurMonth-1)) $sDesc = 'le mois dernier';
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*365 && $sYear==$sCurYear) $sDesc = 'en '.$asMonths[$sMonth-1];
|
||||
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*365) $sDesc = 'en '.$asMonths[$sMonth-1].' '.$sYear;
|
||||
elseif($sYear==($sCurYear-1)) $sDesc = 'l\'année dernière';
|
||||
else $sDesc = 'en '.$sYear;
|
||||
|
||||
//return self::mb_ucfirst($sDesc);
|
||||
return $sDesc;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
99
index.php
@@ -1,11 +1,28 @@
|
||||
<?php
|
||||
|
||||
/* 1st page on load */
|
||||
/*
|
||||
Databap Project
|
||||
http://git.lutran.fr/databap.git
|
||||
Copyright (C) 2014 François Lutran
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see http://www.gnu.org/licenses
|
||||
*/
|
||||
|
||||
//load classes
|
||||
ob_start();
|
||||
require_once 'config.php';
|
||||
$oClassManagement = new ClassManagement();
|
||||
require_once 'classmanagement.php';
|
||||
$oClassManagement = new ClassManagement('databap');
|
||||
|
||||
//Global values
|
||||
ToolBox::cleanPost($_POST);
|
||||
@@ -16,30 +33,30 @@ ToolBox::fixGlobalVars(isset($argv)?$argv:array());
|
||||
//Global variables (reserved names) and default values
|
||||
$sPage = isset($_GET['p'])?$_GET['p']:'welcome';
|
||||
$sAction = isset($_GET['a'])?$_GET['a']:'';
|
||||
$oCode = isset($_REQUEST['code'])?$_REQUEST['code']:false;
|
||||
$oUser = isset($_REQUEST['user'])?$_REQUEST['user']:'';
|
||||
$sAuthName = isset($_POST['auth_name'])?$_POST['auth_name']:'';
|
||||
$sAuthCompany = isset($_POST['auth_company'])?$_POST['auth_company']:'';
|
||||
$sToken = isset($_GET['auth_token'])?$_GET['auth_token']:'';
|
||||
$sToken = isset($_REQUEST['auth_token'])?$_REQUEST['auth_token']:'';
|
||||
$sOldToken = isset($_POST['old_auth_token'])?$_POST['old_auth_token']:'';
|
||||
$sNewToken = isset($_POST['new_auth_token'])?$_POST['new_auth_token']:'';
|
||||
$sContent = isset($_POST['content'])?$_POST['content']:'';
|
||||
$sCategory = isset($_GET['cat'])?$_GET['cat']:'';
|
||||
$sTitle = isset($_POST['title'])?$_POST['title']:'';
|
||||
$sDescription = isset($_POST['description'])?$_POST['description']:'';
|
||||
$sLink = isset($_REQUEST['link_escaped'])?$_REQUEST['link_escaped']:'';
|
||||
$sSearchWords = isset($_GET['keywords'])?$_GET['keywords']:'';
|
||||
$sKeyWords = isset($_REQUEST['keywords'])?$_REQUEST['keywords']:'';
|
||||
$sMessage = isset($_POST['message'])?$_POST['message']:'';
|
||||
$sChan = isset($_REQUEST['chan'])?$_REQUEST['chan']:'';
|
||||
$asAttendees = isset($_REQUEST['attendees'])?$_REQUEST['attendees']:'';
|
||||
$bFirstConn = isset($_GET['first_conn'])?$_GET['first_conn']:false;
|
||||
$iMessageId = isset($_GET['message_id'])?$_GET['message_id']:0;
|
||||
$iProcId = isset($_GET['proc_id'])?$_GET['proc_id']:0;
|
||||
$iItemId = isset($_GET['id'])?$_GET['id']:0;
|
||||
$oItemId = isset($_REQUEST['id'])?$_REQUEST['id']:0;
|
||||
$sSystem = isset($_POST['id'])?$_POST['system']:0;
|
||||
$sResult = '';
|
||||
|
||||
//Launching application
|
||||
$oDatabap = new Databap($oClassManagement);
|
||||
|
||||
//Auth check
|
||||
$bUserOk = $oDatabap->logMeIn($sAuthName, $sAuthCompany, $sToken, $sAction);
|
||||
$bUserOk = $oDatabap->logMeIn($sToken, $sAction);
|
||||
|
||||
//if connected
|
||||
if($bUserOk && $sAction!=Databap::EXT_ACCESS)
|
||||
@@ -60,40 +77,49 @@ if($bUserOk && $sAction!=Databap::EXT_ACCESS)
|
||||
$sResult = $oDatabap->addCode(array('description'=>$sDescription, 'content'=>$sContent, 'link'=>$sLink));
|
||||
break;
|
||||
case 'edit_code':
|
||||
$sResult = $oDatabap->editCode($oCode, $sContent);
|
||||
$sResult = $oDatabap->editCode($oItemId, $sContent);
|
||||
break;
|
||||
case 'read_code':
|
||||
if($oCode!==false) $sResult = $oDatabap->getColoredCode($oCode);
|
||||
if($oItemId!==false) $sResult = $oDatabap->getColoredCode($oItemId);
|
||||
break;
|
||||
case 'nude_code':
|
||||
if($oCode!==false) $sResult = $oDatabap->getNudeCode($oCode);
|
||||
if($oItemId!==false) $sResult = $oDatabap->getNudeCode($oItemId);
|
||||
break;
|
||||
case 'raw_code':
|
||||
if($oCode!==false) $sResult = $oDatabap->getRawCode($oCode);
|
||||
if($oItemId!==false) $sResult = $oDatabap->getRawCode($oItemId);
|
||||
break;
|
||||
case 'dl_code':
|
||||
if($oCode!==false) $sResult = $oDatabap->getSavedCode($oCode);
|
||||
if($oItemId!==false) $sResult = $oDatabap->getSavedCode($oItemId);
|
||||
break;
|
||||
case 'dl_file':
|
||||
$sResult = $oDatabap->getFile($iItemId);
|
||||
$sResult = $oDatabap->getFile($oItemId);
|
||||
break;
|
||||
case 'print_code':
|
||||
if($oCode!==false) $sResult = $oDatabap->getPrintCode($oCode);
|
||||
if($oItemId!==false) $sResult = $oDatabap->getRawCode($oItemId, true);
|
||||
break;
|
||||
case 'add_procedure':
|
||||
$sResult = $oDatabap->addProcedure($_POST);
|
||||
break;
|
||||
case 'get_procedure':
|
||||
$sResult = $oDatabap->getProcedure($iProcId);
|
||||
$sResult = $oDatabap->getProcedure($oItemId);
|
||||
break;
|
||||
case 'add_doc':
|
||||
$sResult = $oDatabap->addDoc($_POST);
|
||||
break;
|
||||
case 'get_doc':
|
||||
$sResult = $oDatabap->getDoc($iItemId);
|
||||
$sResult = $oDatabap->getDoc($oItemId);
|
||||
break;
|
||||
case 'add_table':
|
||||
$sResult = $oDatabap->addTable($sSystem, $sTitle, $sDescription, $sKeyWords, $oItemId);
|
||||
break;
|
||||
case 'get_table':
|
||||
$sResult = $oDatabap->getTable($oItemId);
|
||||
break;
|
||||
case 'get_article':
|
||||
$sResult = $oDatabap->getArticle($oItemId);
|
||||
break;
|
||||
case 'art_redirect':
|
||||
$sResult = $oDatabap->redirectArticle($iItemId);
|
||||
$sResult = $oDatabap->redirectArticle($oItemId);
|
||||
break;
|
||||
case 'upload_image':
|
||||
$sResult = $oDatabap->uploadImage();
|
||||
@@ -102,16 +128,16 @@ if($bUserOk && $sAction!=Databap::EXT_ACCESS)
|
||||
$sResult = $oDatabap->uploadDoc();
|
||||
break;
|
||||
case 'url':
|
||||
$sResult = $oDatabap->checkValue(MySqlManager::URL_TABLE, array('phrase'=>$sLink));
|
||||
$sResult = $oDatabap->checkValue(Databap::URL_TABLE, array('phrase'=>$sLink));
|
||||
break;
|
||||
case 'user_info':
|
||||
$sResult = $oDatabap->getUserInfo($oDatabap->getUserId(), true);
|
||||
break;
|
||||
case 'profile':
|
||||
$sResult = $oDatabap->getProfile($oUser);
|
||||
$sResult = $oDatabap->getProfile($oItemId);
|
||||
break;
|
||||
case 'search':
|
||||
$sResult = $oDatabap->getResults($sSearchWords);
|
||||
$sResult = $oDatabap->getResults($sKeyWords);
|
||||
break;
|
||||
case 'code_block':
|
||||
$sResult = $oDatabap->getCodeBlock();
|
||||
@@ -131,6 +157,9 @@ if($bUserOk && $sAction!=Databap::EXT_ACCESS)
|
||||
case 'messages':
|
||||
$sResult = $oDatabap->getMessages($iMessageId);
|
||||
break;
|
||||
case 'news':
|
||||
$sResult = $oDatabap->getNews();
|
||||
break;
|
||||
case 'connected_users':
|
||||
$sResult = $oDatabap->getConnectedUsers(true);
|
||||
break;
|
||||
@@ -140,6 +169,9 @@ if($bUserOk && $sAction!=Databap::EXT_ACCESS)
|
||||
case 'set_options':
|
||||
$sResult = $oDatabap->setOptions($_POST, false);
|
||||
break;
|
||||
case 'set_pass':
|
||||
$sResult = $oDatabap->checkSetPass($sOldToken, $sNewToken);
|
||||
break;
|
||||
case 'list':
|
||||
$sResult = $oDatabap->getItemList();
|
||||
break;
|
||||
@@ -157,20 +189,20 @@ if($bUserOk && $sAction!=Databap::EXT_ACCESS)
|
||||
$asInfo = explode('-', strtolower($oUser));
|
||||
$sResult = 'User added. Id='.$oDatabap->addUser($asInfo[0], $asInfo[1], $asInfo[2]);
|
||||
break;
|
||||
case 'reset_token':
|
||||
$sResult = print_r($oDatabap->resetToken(), true);
|
||||
break;
|
||||
case 'build_index':
|
||||
$oDatabap->buildCompleteIndex();
|
||||
$sResult = 'Index ok';
|
||||
break;
|
||||
case 'install_queries':
|
||||
$oMySqlInstall = new MySqlManager();
|
||||
$oMySqlInstall = new MySqlManager(Settings::DB_SERVER, Settings::DB_LOGIN, Settings::DB_PASS, Settings::DB_NAME, Databap::getSqlOptions(), Settings::DB_ENC);
|
||||
$sResult = $oMySqlInstall->getFullInstallQuery();
|
||||
break;
|
||||
case 'reset_chan_safe_names':
|
||||
$sResult = $oDatabap->resetChanSafeNames();
|
||||
break;
|
||||
case 'init_pass': //TODO delete in v1.0.1
|
||||
$sResult = $oDatabap->resetAllPass();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -201,6 +233,7 @@ elseif($bUserOk && $sAction==Databap::EXT_ACCESS)
|
||||
break;
|
||||
}
|
||||
}
|
||||
elseif($sResult=='') $sResult = 'No Clearance';
|
||||
}
|
||||
elseif($sAction!='')
|
||||
{
|
||||
@@ -210,15 +243,13 @@ elseif($sAction!='')
|
||||
else
|
||||
{
|
||||
//$oDatabap->setExpectedPage($_SERVER['REQUEST_URI']);
|
||||
$oPage = new Mask('logon');
|
||||
$oPage->setTag('name', $sAuthName);
|
||||
$oPage->setTag('company', $sAuthCompany);
|
||||
$sResult = $oPage->getMask();
|
||||
$sResult = $oDatabap->getLogonPage($sToken=='');
|
||||
}
|
||||
|
||||
//clean unwanted error log
|
||||
ob_end_clean();
|
||||
//$sDebug = ob_get_clean();
|
||||
//TODO unify file name with PhpObject Class
|
||||
$sDebug = ob_get_clean();
|
||||
if(Settings::DEBUG && $sDebug!='') file_put_contents('log.html', print_r($sDebug, true)."\n\n", FILE_APPEND);
|
||||
|
||||
echo $sResult;
|
||||
//echo json_encode($sDebug);
|
||||
|
||||
791
jquery/common.js
vendored
Normal file
@@ -0,0 +1,791 @@
|
||||
/* jQuery functions */
|
||||
|
||||
(function($) {
|
||||
$.fn.getCursorPosition = function() {
|
||||
var input = this.get(0);
|
||||
if (!input) return; // No (input) element found
|
||||
if ('selectionStart' in input) {
|
||||
// Standard-compliant browsers
|
||||
return input.selectionStart;
|
||||
} else if (document.selection) {
|
||||
// IE
|
||||
input.focus();
|
||||
var sel = document.selection.createRange();
|
||||
var selLen = document.selection.createRange().text.length;
|
||||
sel.moveStart('character', -input.value.length);
|
||||
return sel.text.length - selLen;
|
||||
}
|
||||
};
|
||||
})(jQuery);
|
||||
|
||||
$.prototype.addButton = function(sType, sTitle, oClickLink, sId, sButtonClass, sTmpVar)
|
||||
{
|
||||
$This = $(this);
|
||||
var asAttributes = {id:(sId || ''), 'class':'button round'+(typeof sButtonClass != 'undefined'?' '+sButtonClass:'')};
|
||||
|
||||
//Link
|
||||
var bLink = (typeof oClickLink == 'string');
|
||||
if(bLink)
|
||||
{
|
||||
asAttributes.href = oClickLink;
|
||||
asAttributes.target = '_blank';
|
||||
}
|
||||
var $Button = $('<a>', asAttributes)
|
||||
.append($('<i>', {'class':'icon fa fa-c-'+sType}))
|
||||
.append($('<span>', {'class':'value'}).text(sTitle))
|
||||
.appendTo($This);
|
||||
|
||||
//Function
|
||||
if(!bLink) $Button.click(function(e){e.preventDefault();oClickLink();});
|
||||
|
||||
//TODO delete use of tmp out of databap class context
|
||||
if(typeof sTmpVar != 'undefined') databap.tmp(sTmpVar, $Button);
|
||||
|
||||
return $This;
|
||||
};
|
||||
|
||||
$.prototype.modifyButton = function(aoInfo)
|
||||
{
|
||||
$This = $(this);
|
||||
$.each(aoInfo, function(sKey, sValue)
|
||||
{
|
||||
switch(sKey)
|
||||
{
|
||||
case 'type': $This.find('i.icon').removeClass(function(index, css){return (css.match(/\bfa-c-\S+/g) || []).join(' ');}).addClass('fa-c-'+sValue); break;
|
||||
case 'title': $This.find('span.value').text(sValue); break;
|
||||
case 'link': $This.attr('href', sValue); break;
|
||||
case 'action': $This.off('click').click(function(e){e.preventDefault(); sValue();}); break;
|
||||
case 'id': $This.attr('id', sValue); break;
|
||||
case 'class': $This.attr('class', 'button round '+sValue); break;
|
||||
case 'var': databap.tmp(sValue, $This); break; //TODO delete use of tmp out of databap class context
|
||||
}
|
||||
});
|
||||
return $This;
|
||||
};
|
||||
|
||||
$.prototype.getEmptyHeight = function()
|
||||
{
|
||||
var $This = $(this), iTotalHeight = 0;
|
||||
$This.children(':visible').not('.scrollbar').each(function()
|
||||
{
|
||||
//debug('#'+$(this).attr('id')+'|.'+$(this).attr('class')+' gives '+$(this).outerHeight(true));
|
||||
iTotalHeight += $(this).outerHeight(true);
|
||||
});
|
||||
return $This.height() - iTotalHeight;
|
||||
};
|
||||
|
||||
$.prototype.getEmptyWidth = function()
|
||||
{
|
||||
var $This = $(this), iTotalWidth = 0;
|
||||
$This.children(':visible').not('.scrollbar').each(function()
|
||||
{
|
||||
iTotalWidth += $(this).outerWidth(true);
|
||||
});
|
||||
return $This.width() - iTotalWidth;
|
||||
};
|
||||
|
||||
$.prototype.addDefaultValue = function(sDefaultValue, sInitValue)
|
||||
{
|
||||
sInitValue = sInitValue || '';
|
||||
return $(this)
|
||||
.data('default_value', sDefaultValue)
|
||||
.val(sInitValue==''?sDefaultValue:sInitValue)
|
||||
.addClass(sInitValue==''?'default_text':'')
|
||||
.focus(function()
|
||||
{
|
||||
var $This = $(this);
|
||||
if($This.val() == $This.data('default_value')) $This.val('');
|
||||
$This.removeClass('default_text');
|
||||
})
|
||||
.blur(function()
|
||||
{
|
||||
var $This = $(this);
|
||||
if($This.val() == '') $This.val($This.data('default_value')).addClass('default_text');
|
||||
});
|
||||
};
|
||||
|
||||
$.prototype.checkForm = function(sSelector)
|
||||
{
|
||||
sSelector = sSelector || 'input[type="password"], input[type="text"], textarea';
|
||||
var $This = $(this);
|
||||
var bOk = true;
|
||||
$This.find(sSelector).each(function()
|
||||
{
|
||||
$This = $(this);
|
||||
bOk = bOk && $This.val()!='' && $This.val()!=$This.data('default_value');
|
||||
});
|
||||
return bOk;
|
||||
};
|
||||
|
||||
/* Common functions */
|
||||
|
||||
String.prototype.stripVowelAccent = function()
|
||||
{
|
||||
var sText = this;
|
||||
var rExps=
|
||||
[
|
||||
{re:/[\xC0-\xC6]/g, ch:'A'},
|
||||
{re:/[\xE0-\xE6]/g, ch:'a'},
|
||||
{re:/[\xC8-\xCB]/g, ch:'E'},
|
||||
{re:/[\xE8-\xEB]/g, ch:'e'},
|
||||
{re:/[\xCC-\xCF]/g, ch:'I'},
|
||||
{re:/[\xEC-\xEF]/g, ch:'i'},
|
||||
{re:/[\xD2-\xD6]/g, ch:'O'},
|
||||
{re:/[\xF2-\xF6]/g, ch:'o'},
|
||||
{re:/[\xD9-\xDC]/g, ch:'U'},
|
||||
{re:/[\xF9-\xFC]/g, ch:'u'},
|
||||
{re:/[\xD1]/g, ch:'N'},
|
||||
{re:/[\xF1]/g, ch:'n'}
|
||||
];
|
||||
for(var i=0, len=rExps.length; i<len; i++)
|
||||
{
|
||||
sText=sText.replace(rExps[i].re, rExps[i].ch);
|
||||
}
|
||||
return sText;
|
||||
};
|
||||
|
||||
String.prototype.replaceAll = function(regex, text)
|
||||
{
|
||||
return this.replace(new RegExp(regex, 'g'), text);
|
||||
};
|
||||
|
||||
function copyArray(asArray)
|
||||
{
|
||||
return asArray.slice(0); //trick to copy array
|
||||
}
|
||||
|
||||
function expand($eventElem)
|
||||
{
|
||||
var tag = '.'+$eventElem.attr('id').substr(7);
|
||||
if($eventElem.hasClass('minus'))
|
||||
{
|
||||
$eventElem.removeClass('minus');
|
||||
$eventElem.addClass('plus');
|
||||
$(tag).hide('fast');
|
||||
}
|
||||
else
|
||||
{
|
||||
$eventElem.removeClass('plus');
|
||||
$eventElem.addClass('minus');
|
||||
$(tag).show('fast');
|
||||
}
|
||||
}
|
||||
|
||||
function array_filter(arr, func)
|
||||
{
|
||||
var retObj = {};
|
||||
for(var k in arr)
|
||||
{
|
||||
if(func(arr[k]))
|
||||
{
|
||||
retObj[k] = arr[k];
|
||||
}
|
||||
}
|
||||
|
||||
return retObj;
|
||||
}
|
||||
|
||||
function isNumeric(input)
|
||||
{
|
||||
return (input - 0) == input && input.length > 0;
|
||||
}
|
||||
|
||||
function ucwords(text)
|
||||
{
|
||||
return (t = text + '').replace
|
||||
(
|
||||
/^([a-z])|\s+([a-z])/g,
|
||||
function($1)
|
||||
{
|
||||
return $1.toUpperCase();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function getTimeString()
|
||||
{
|
||||
var currentTime = new Date();
|
||||
var hours = currentTime.getHours();
|
||||
var minutes = currentTime.getMinutes();
|
||||
var secondes = currentTime.getSeconds();
|
||||
|
||||
hours = sprintf(hours, 2, '0');
|
||||
minutes = sprintf(minutes, 2, '0');
|
||||
secondes = sprintf(secondes, 2, '0');
|
||||
|
||||
return hours+':'+minutes+':'+secondes;
|
||||
}
|
||||
|
||||
function sprintf(value, length, char)
|
||||
{
|
||||
var buffer = '';
|
||||
missingCharsNb = Math.max(0, length - value.length);
|
||||
for(var i=0;i<=missingCharsNb;i++)
|
||||
{
|
||||
buffer += char;
|
||||
}
|
||||
|
||||
return buffer+value;
|
||||
}
|
||||
|
||||
function chr(codePt)
|
||||
{
|
||||
if (codePt > 0xFFFF)
|
||||
{
|
||||
return String.fromCharCode(0xD800 + (codePt >> 10), 0xDC00 + (codePt & 0x3FF));
|
||||
}
|
||||
return String.fromCharCode(codePt);
|
||||
}
|
||||
|
||||
function explode(delimiter, string, limit)
|
||||
{
|
||||
var emptyArray = {0:''};
|
||||
|
||||
if(arguments.length < 2 || typeof arguments[0] == 'undefined' || typeof arguments[1] == 'undefined') return null;
|
||||
|
||||
if(delimiter === '' || delimiter === false || delimiter === null) return false;
|
||||
|
||||
if(typeof delimiter == 'function' || typeof delimiter == 'object' || typeof string == 'function' || typeof string == 'object') return emptyArray;
|
||||
|
||||
if(delimiter === true) delimiter = '1';
|
||||
|
||||
if(!limit) return string.toString().split(delimiter.toString());
|
||||
else
|
||||
{
|
||||
// support for limit argument
|
||||
var splitted = string.toString().split(delimiter.toString());
|
||||
var partA = splitted.splice(0, limit - 1);
|
||||
var partB = splitted.join(delimiter.toString());
|
||||
partA.push(partB);
|
||||
return partA;
|
||||
}
|
||||
}
|
||||
|
||||
function implode(glue, pieces)
|
||||
{
|
||||
var i = '', retVal = '', tGlue = '';
|
||||
|
||||
if(arguments.length === 1)
|
||||
{
|
||||
pieces = glue;
|
||||
glue = '';
|
||||
}
|
||||
|
||||
if(typeof(pieces) === 'object')
|
||||
{
|
||||
if(pieces instanceof Array) return pieces.join(glue);
|
||||
else
|
||||
{
|
||||
for (i in pieces)
|
||||
{
|
||||
retVal += tGlue + pieces[i];
|
||||
tGlue = glue;
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
}
|
||||
else return pieces;
|
||||
}
|
||||
|
||||
function file_exists(url)
|
||||
{
|
||||
var req = this.window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
|
||||
if(!req)
|
||||
{
|
||||
throw new Error('XMLHttpRequest not supported');
|
||||
}
|
||||
|
||||
// HEAD Results are usually shorter (faster) than GET
|
||||
req.open('HEAD', url, false);
|
||||
req.send(null); if (req.status == 200)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function basename(path, suffix)
|
||||
{
|
||||
var b = path.replace(/^.*[\/\\]/g, '');
|
||||
if (typeof(suffix) == 'string' && b.substr(b.length - suffix.length) == suffix)
|
||||
{
|
||||
b = b.substr(0, b.length - suffix.length);
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
function getElem(aoAnchor, asPath)
|
||||
{
|
||||
return (typeof asPath == 'object' && asPath.length > 1)?getElem(aoAnchor[asPath.shift()], asPath):aoAnchor[(typeof asPath == 'object')?asPath.shift():asPath];
|
||||
}
|
||||
|
||||
function setElem(aoAnchor, asPath, oValue)
|
||||
{
|
||||
var asTypes = {boolean:false, string:'', integer:0, int:0, array:[], object:{}};
|
||||
if(typeof asPath == 'object' && asPath.length > 1)
|
||||
{
|
||||
var nextlevel = asPath.shift();
|
||||
if(!(nextlevel in aoAnchor)) aoAnchor[nextlevel] = {}; //Creating a new level
|
||||
if(typeof aoAnchor[nextlevel] !== 'object') debug('Error - setElem() : Already existing path at level "'+nextlevel+'". Cancelling setElem() action');
|
||||
return setElem(aoAnchor[nextlevel], asPath, oValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
var sKey = (typeof asPath == 'object')?asPath.shift():asPath;
|
||||
return aoAnchor[sKey] = (!(sKey in aoAnchor) && (oValue in asTypes))?asTypes[oValue]:oValue;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
//Queue element
|
||||
(
|
||||
function($)
|
||||
{
|
||||
$.fn.delaying = function(delay, reloadAction, minLength)
|
||||
{
|
||||
var options={delay:delay, reload_action:reloadAction, min_length:minLength};
|
||||
this.each
|
||||
(
|
||||
function()
|
||||
{
|
||||
$(this).data('tsb',new Delayer($(this), options));
|
||||
}
|
||||
);
|
||||
return this;
|
||||
};
|
||||
|
||||
function Delayer(elem, options)
|
||||
{
|
||||
var self = this;
|
||||
var delays, min_length, previous_values,
|
||||
temp_values, reload_action, processing_requests;
|
||||
|
||||
this.init = function()
|
||||
{
|
||||
delays = options.delay;
|
||||
min_length = options.min_length;
|
||||
previous_values = '';
|
||||
temp_values = '';
|
||||
reload_action = options.reload_action;
|
||||
processing_requests = false;
|
||||
};
|
||||
|
||||
this.request = function(val)
|
||||
{
|
||||
var requestOk = false;
|
||||
|
||||
//Prevent from loading request with too few elements or twice the same request
|
||||
if(val.length > queue.min_length[id] && val != queue.previous_values[id])
|
||||
{
|
||||
//Prevent from spamming server with requests and wait for value stabilization
|
||||
if(queue.processing_requests[id] == false && val == queue.temp_values[id])
|
||||
{
|
||||
queue.previous_values[id] = val;
|
||||
requestOk = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
queue.temp_values[id] = val;
|
||||
setTimeout(queue.reload_action[id], queue.delays[id]);
|
||||
}
|
||||
}
|
||||
return requestOk;
|
||||
};
|
||||
}
|
||||
}
|
||||
)
|
||||
(jQuery);
|
||||
*/
|
||||
|
||||
function debug(text, bQuery)
|
||||
{
|
||||
if(window.console) console.log(text);
|
||||
}
|
||||
|
||||
function getLoginToken(sPass)
|
||||
{
|
||||
return hex_md5(sPass+window.location.origin+window.location.pathname);
|
||||
}
|
||||
|
||||
/* md5 */
|
||||
|
||||
/*
|
||||
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
|
||||
* Digest Algorithm, as defined in RFC 1321.
|
||||
* Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
|
||||
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
|
||||
* Distributed under the BSD License
|
||||
* See http://pajhome.org.uk/crypt/md5 for more info.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Configurable variables. You may need to tweak these to be compatible with
|
||||
* the server-side, but the defaults work in most cases.
|
||||
*/
|
||||
var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
|
||||
var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
|
||||
|
||||
/*
|
||||
* These are the functions you'll usually want to call
|
||||
* They take string arguments and return either hex or base-64 encoded strings
|
||||
*/
|
||||
function hex_md5(s) { return rstr2hex(rstr_md5(str2rstr_utf8(s))); }
|
||||
function b64_md5(s) { return rstr2b64(rstr_md5(str2rstr_utf8(s))); }
|
||||
function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }
|
||||
function hex_hmac_md5(k, d)
|
||||
{ return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
|
||||
function b64_hmac_md5(k, d)
|
||||
{ return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
|
||||
function any_hmac_md5(k, d, e)
|
||||
{ return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }
|
||||
|
||||
/*
|
||||
* Perform a simple self-test to see if the VM is working
|
||||
*/
|
||||
function md5_vm_test()
|
||||
{
|
||||
return hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72";
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the MD5 of a raw string
|
||||
*/
|
||||
function rstr_md5(s)
|
||||
{
|
||||
return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the HMAC-MD5, of a key and some data (raw strings)
|
||||
*/
|
||||
function rstr_hmac_md5(key, data)
|
||||
{
|
||||
var bkey = rstr2binl(key);
|
||||
if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8);
|
||||
|
||||
var ipad = Array(16), opad = Array(16);
|
||||
for(var i = 0; i < 16; i++)
|
||||
{
|
||||
ipad[i] = bkey[i] ^ 0x36363636;
|
||||
opad[i] = bkey[i] ^ 0x5C5C5C5C;
|
||||
}
|
||||
|
||||
var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
|
||||
return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a raw string to a hex string
|
||||
*/
|
||||
function rstr2hex(input)
|
||||
{
|
||||
try { hexcase } catch(e) { hexcase=0; }
|
||||
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
|
||||
var output = "";
|
||||
var x;
|
||||
for(var i = 0; i < input.length; i++)
|
||||
{
|
||||
x = input.charCodeAt(i);
|
||||
output += hex_tab.charAt((x >>> 4) & 0x0F)
|
||||
+ hex_tab.charAt( x & 0x0F);
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a raw string to a base-64 string
|
||||
*/
|
||||
function rstr2b64(input)
|
||||
{
|
||||
try { b64pad } catch(e) { b64pad=''; }
|
||||
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
var output = "";
|
||||
var len = input.length;
|
||||
for(var i = 0; i < len; i += 3)
|
||||
{
|
||||
var triplet = (input.charCodeAt(i) << 16)
|
||||
| (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
|
||||
| (i + 2 < len ? input.charCodeAt(i+2) : 0);
|
||||
for(var j = 0; j < 4; j++)
|
||||
{
|
||||
if(i * 8 + j * 6 > input.length * 8) output += b64pad;
|
||||
else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
|
||||
}
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a raw string to an arbitrary string encoding
|
||||
*/
|
||||
function rstr2any(input, encoding)
|
||||
{
|
||||
var divisor = encoding.length;
|
||||
var i, j, q, x, quotient;
|
||||
|
||||
/* Convert to an array of 16-bit big-endian values, forming the dividend */
|
||||
var dividend = Array(Math.ceil(input.length / 2));
|
||||
for(i = 0; i < dividend.length; i++)
|
||||
{
|
||||
dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Repeatedly perform a long division. The binary array forms the dividend,
|
||||
* the length of the encoding is the divisor. Once computed, the quotient
|
||||
* forms the dividend for the next step. All remainders are stored for later
|
||||
* use.
|
||||
*/
|
||||
var full_length = Math.ceil(input.length * 8 /
|
||||
(Math.log(encoding.length) / Math.log(2)));
|
||||
var remainders = Array(full_length);
|
||||
for(j = 0; j < full_length; j++)
|
||||
{
|
||||
quotient = Array();
|
||||
x = 0;
|
||||
for(i = 0; i < dividend.length; i++)
|
||||
{
|
||||
x = (x << 16) + dividend[i];
|
||||
q = Math.floor(x / divisor);
|
||||
x -= q * divisor;
|
||||
if(quotient.length > 0 || q > 0)
|
||||
quotient[quotient.length] = q;
|
||||
}
|
||||
remainders[j] = x;
|
||||
dividend = quotient;
|
||||
}
|
||||
|
||||
/* Convert the remainders to the output string */
|
||||
var output = "";
|
||||
for(i = remainders.length - 1; i >= 0; i--)
|
||||
output += encoding.charAt(remainders[i]);
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
/*
|
||||
* Encode a string as utf-8.
|
||||
* For efficiency, this assumes the input is valid utf-16.
|
||||
*/
|
||||
function str2rstr_utf8(input)
|
||||
{
|
||||
var output = "";
|
||||
var i = -1;
|
||||
var x, y;
|
||||
|
||||
while(++i < input.length)
|
||||
{
|
||||
/* Decode utf-16 surrogate pairs */
|
||||
x = input.charCodeAt(i);
|
||||
y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
|
||||
if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
|
||||
{
|
||||
x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
|
||||
i++;
|
||||
}
|
||||
|
||||
/* Encode output as utf-8 */
|
||||
if(x <= 0x7F)
|
||||
output += String.fromCharCode(x);
|
||||
else if(x <= 0x7FF)
|
||||
output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
|
||||
0x80 | ( x & 0x3F));
|
||||
else if(x <= 0xFFFF)
|
||||
output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
|
||||
0x80 | ((x >>> 6 ) & 0x3F),
|
||||
0x80 | ( x & 0x3F));
|
||||
else if(x <= 0x1FFFFF)
|
||||
output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
|
||||
0x80 | ((x >>> 12) & 0x3F),
|
||||
0x80 | ((x >>> 6 ) & 0x3F),
|
||||
0x80 | ( x & 0x3F));
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
/*
|
||||
* Encode a string as utf-16
|
||||
*/
|
||||
function str2rstr_utf16le(input)
|
||||
{
|
||||
var output = "";
|
||||
for(var i = 0; i < input.length; i++)
|
||||
output += String.fromCharCode( input.charCodeAt(i) & 0xFF,
|
||||
(input.charCodeAt(i) >>> 8) & 0xFF);
|
||||
return output;
|
||||
}
|
||||
|
||||
function str2rstr_utf16be(input)
|
||||
{
|
||||
var output = "";
|
||||
for(var i = 0; i < input.length; i++)
|
||||
output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
|
||||
input.charCodeAt(i) & 0xFF);
|
||||
return output;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a raw string to an array of little-endian words
|
||||
* Characters >255 have their high-byte silently ignored.
|
||||
*/
|
||||
function rstr2binl(input)
|
||||
{
|
||||
var output = Array(input.length >> 2);
|
||||
for(var i = 0; i < output.length; i++)
|
||||
output[i] = 0;
|
||||
for(var i = 0; i < input.length * 8; i += 8)
|
||||
output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);
|
||||
return output;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert an array of little-endian words to a string
|
||||
*/
|
||||
function binl2rstr(input)
|
||||
{
|
||||
var output = "";
|
||||
for(var i = 0; i < input.length * 32; i += 8)
|
||||
output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);
|
||||
return output;
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the MD5 of an array of little-endian words, and a bit length.
|
||||
*/
|
||||
function binl_md5(x, len)
|
||||
{
|
||||
/* append padding */
|
||||
x[len >> 5] |= 0x80 << ((len) % 32);
|
||||
x[(((len + 64) >>> 9) << 4) + 14] = len;
|
||||
|
||||
var a = 1732584193;
|
||||
var b = -271733879;
|
||||
var c = -1732584194;
|
||||
var d = 271733878;
|
||||
|
||||
for(var i = 0; i < x.length; i += 16)
|
||||
{
|
||||
var olda = a;
|
||||
var oldb = b;
|
||||
var oldc = c;
|
||||
var oldd = d;
|
||||
|
||||
a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
|
||||
d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
|
||||
c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
|
||||
b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
|
||||
a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
|
||||
d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
|
||||
c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
|
||||
b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
|
||||
a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
|
||||
d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
|
||||
c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
|
||||
b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
|
||||
a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
|
||||
d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
|
||||
c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
|
||||
b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
|
||||
|
||||
a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
|
||||
d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
|
||||
c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
|
||||
b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
|
||||
a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
|
||||
d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
|
||||
c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
|
||||
b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
|
||||
a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
|
||||
d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
|
||||
c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
|
||||
b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
|
||||
a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
|
||||
d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
|
||||
c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
|
||||
b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
|
||||
|
||||
a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
|
||||
d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
|
||||
c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
|
||||
b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
|
||||
a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
|
||||
d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
|
||||
c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
|
||||
b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
|
||||
a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
|
||||
d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
|
||||
c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
|
||||
b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
|
||||
a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
|
||||
d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
|
||||
c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
|
||||
b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
|
||||
|
||||
a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
|
||||
d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
|
||||
c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
|
||||
b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
|
||||
a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
|
||||
d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
|
||||
c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
|
||||
b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
|
||||
a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
|
||||
d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
|
||||
c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
|
||||
b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
|
||||
a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
|
||||
d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
|
||||
c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
|
||||
b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
|
||||
|
||||
a = safe_add(a, olda);
|
||||
b = safe_add(b, oldb);
|
||||
c = safe_add(c, oldc);
|
||||
d = safe_add(d, oldd);
|
||||
}
|
||||
return Array(a, b, c, d);
|
||||
}
|
||||
|
||||
/*
|
||||
* These functions implement the four basic operations the algorithm uses.
|
||||
*/
|
||||
function md5_cmn(q, a, b, x, s, t)
|
||||
{
|
||||
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
|
||||
}
|
||||
function md5_ff(a, b, c, d, x, s, t)
|
||||
{
|
||||
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
|
||||
}
|
||||
function md5_gg(a, b, c, d, x, s, t)
|
||||
{
|
||||
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
|
||||
}
|
||||
function md5_hh(a, b, c, d, x, s, t)
|
||||
{
|
||||
return md5_cmn(b ^ c ^ d, a, b, x, s, t);
|
||||
}
|
||||
function md5_ii(a, b, c, d, x, s, t)
|
||||
{
|
||||
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
|
||||
}
|
||||
|
||||
/*
|
||||
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
|
||||
* to work around bugs in some JS interpreters.
|
||||
*/
|
||||
function safe_add(x, y)
|
||||
{
|
||||
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
|
||||
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
||||
return (msw << 16) | (lsw & 0xFFFF);
|
||||
}
|
||||
|
||||
/*
|
||||
* Bitwise rotate a 32-bit number to the left.
|
||||
*/
|
||||
function bit_rol(num, cnt)
|
||||
{
|
||||
return (num << cnt) | (num >>> (32 - cnt));
|
||||
}
|
||||
894
jquery/databap.js
vendored
Normal file
@@ -0,0 +1,894 @@
|
||||
/* Handling the communication between php processing server and local ajax engine */
|
||||
|
||||
/* Databap class */
|
||||
|
||||
function Databap()
|
||||
{
|
||||
self = this;
|
||||
|
||||
//on load init
|
||||
this.init = function()
|
||||
{
|
||||
//Global constants
|
||||
self.consts.default_hash = self.vars.page_to_hash[self.consts.default_page];
|
||||
self.consts.process_url = 'index.php';
|
||||
self.consts.app_image_folder = 'images/';
|
||||
self.consts.add_code_text = 'Copier le code ici.';
|
||||
self.consts.search_box_text = 'Recherche...';
|
||||
self.consts.maxHeight = $(window).height();
|
||||
self.consts.maxWidth = $(window).width();
|
||||
self.consts.time = (new Date()).getTime();
|
||||
self.consts.transTime = 200;
|
||||
|
||||
//Global variables
|
||||
self.vars2('tmp', 'object');
|
||||
self.vars2('loading', 'boolean');
|
||||
self.vars2('fade', false);
|
||||
self.vars2('page_cache', 'object');
|
||||
self.vars2('pageIcon', 'string');
|
||||
self.vars2('current_page', 'string');
|
||||
self.vars2('current_user', 'object');
|
||||
self.vars2('code', 'integer');
|
||||
self.vars2('id', 0);
|
||||
self.vars2('phrase', 'string');
|
||||
self.vars2('code_container', 'string');
|
||||
self.vars2('focus', true);
|
||||
self.vars2('disconnected', 'boolean');
|
||||
self.vars2('mode', 'string');
|
||||
self.vars2('search_words', 'string');
|
||||
self.vars2('initLoaded', 'boolean');
|
||||
self.vars2('chans_list', 'object');
|
||||
|
||||
//shortcuts
|
||||
self.$main = $('#main');
|
||||
self.$menu = $('#menu');
|
||||
self.$title = $('#page_title');
|
||||
self.consts.pageMaxHeight = self.$main.height();
|
||||
self.consts.pageMaxWidth = self.$main.width();
|
||||
|
||||
//Global Events Listeners
|
||||
self.initSearch();
|
||||
|
||||
//Left menu
|
||||
self.initMenu();
|
||||
|
||||
//Events handler
|
||||
self.resetEventHandlers();
|
||||
$(document).keyup(function(e){self.onKeyUp(e);});
|
||||
$(document).keydown(function(e){self.onKeyDown(e);});
|
||||
$(document).mouseenter(function(){self.onMouveEnter();});
|
||||
$(document).mouseleave(function(){self.onMouveLeave();});
|
||||
$(window).unload(function(){self.onQuit();});
|
||||
//window.onbeforeunload = self.onQuit;
|
||||
$(window).resize(self.resizeMain).resize();
|
||||
$(window).bind('hashchange', self.onHashChange);
|
||||
|
||||
//Init first page
|
||||
if(self.hash()=='') self.goToInternalLink(self.consts.default_hash);
|
||||
else self.onHashChange();
|
||||
|
||||
//Load cache
|
||||
self.loadCache();
|
||||
};
|
||||
|
||||
this.parseHash = function()
|
||||
{
|
||||
var sHash = self.hash();
|
||||
var asHash = sHash.split('-');
|
||||
var sPage = self.vars.hash_to_page[asHash[0]];
|
||||
|
||||
var iItemId = (typeof asHash[1] != 'undefined')?asHash[1]:0;
|
||||
//var iItemId = (typeof asHash[1] != 'undefined' && !isNaN(asHash[1]))?asHash[1]:0;
|
||||
//var sItemName = (typeof asHash[1] != 'undefined' && isNaN(asHash[1]))?asHash[1]:'';
|
||||
return {hash:sHash, page:sPage, id:iItemId/*, name:sItemName*/};
|
||||
};
|
||||
|
||||
this.onHashChange = function(aoOptions)
|
||||
{
|
||||
aoOptions = aoOptions || {noFade:false, force:false};
|
||||
var bNoFade = aoOptions.noFade || false;
|
||||
var bForce = aoOptions.force || false;
|
||||
|
||||
var sDefaultPage = self.vars.current_page==''?'welcome':'error';
|
||||
var asUrlVars = self.parseHash();
|
||||
self.switchPage((asUrlVars.hash!='' && typeof asUrlVars.page !== 'undefined')?asUrlVars.page:sDefaultPage, asUrlVars.id, bNoFade, bForce);
|
||||
};
|
||||
|
||||
this.hash = function(hash)
|
||||
{
|
||||
if(!hash) return window.location.hash.slice(1);
|
||||
else
|
||||
{
|
||||
window.location.hash = (hash.substr(0, 1)=='#'?'':'#')+hash;
|
||||
|
||||
//favicon, bug firefox
|
||||
var link = $('link[rel="shortcut icon"]').remove().attr("href");
|
||||
$('<link href="'+ link +'" rel="shortcut icon" type="image/x-icon" />').appendTo('head');
|
||||
}
|
||||
};
|
||||
|
||||
//TODO Add images, ...
|
||||
this.loadCache = function()
|
||||
{
|
||||
var iDelay = 1;
|
||||
for(var i in self.vars.page_to_hash)
|
||||
{
|
||||
setTimeout('self.addPageToCache("'+i+'", function(){});', iDelay*60*1000);
|
||||
iDelay += 1;
|
||||
}
|
||||
};
|
||||
|
||||
this.vars2 = function(oVarName, oValue)
|
||||
{
|
||||
var asVarName = (typeof oVarName == 'object')?oVarName:[oVarName];
|
||||
|
||||
//Set, name & type / default value (init)
|
||||
if(typeof oValue !== 'undefined') setElem(self.vars, copyArray(asVarName), oValue);
|
||||
|
||||
//Get, only name parameter
|
||||
return getElem(self.vars, asVarName);
|
||||
};
|
||||
|
||||
this.tmp = function(sVarName, oValue)
|
||||
{
|
||||
var asVarName = (typeof sVarName == 'object')?sVarName:[sVarName];
|
||||
asVarName.unshift('tmp');
|
||||
return self.vars2(asVarName, oValue);
|
||||
};
|
||||
|
||||
this.resetEventHandlers = function()
|
||||
{
|
||||
//Reset specific pages event catchers
|
||||
self.onResize = function(){};
|
||||
self.resetSize = function(){};
|
||||
self.onKeyUp = function(e){};
|
||||
self.onKeyDown = function(e){};
|
||||
self.onMouveEnter = function(){};
|
||||
self.onMouveLeave = function(){};
|
||||
self.onQuit = function(){return true;};
|
||||
};
|
||||
|
||||
this.initMenu = function()
|
||||
{
|
||||
//Hover Event: open/close
|
||||
self.$menu.hover
|
||||
(
|
||||
self.openMenu,
|
||||
function()
|
||||
{
|
||||
closeMenu = true;
|
||||
if(typeof oMenuTimer != "undefined") clearTimeout(oMenuTimer);
|
||||
oMenuTimer = setTimeout(self.closeMenu, 1000);
|
||||
}
|
||||
);
|
||||
|
||||
//Close on click
|
||||
self.$menu.find('a').click(self.instantCloseMenu);
|
||||
};
|
||||
|
||||
this.openMenu = function()
|
||||
{
|
||||
//Disable closing
|
||||
closeMenu = false;
|
||||
if(typeof oMenuTimer != "undefined") clearTimeout(oMenuTimer);
|
||||
|
||||
//If not already opened / about to open
|
||||
if(typeof openedMenu == 'undefined' || openedMenu != true)
|
||||
{
|
||||
openedMenu = true;
|
||||
self.$menu.find('#menu_title').hide();
|
||||
|
||||
//Main shadow
|
||||
self.$main.add(self.$title)
|
||||
.click(self.instantCloseMenu)
|
||||
.fadeTo('fast', 0.2);
|
||||
|
||||
//Switch useless button
|
||||
self.$menu.find('.useless_button').removeClass('round').addClass('tiny_top_right');
|
||||
|
||||
//Move menu items
|
||||
var iVPos = Math.max(0, $(window).scrollTop() - 46 - 46);
|
||||
self.$menu.find('#menu_items').css('margin-top', iVPos);
|
||||
|
||||
//Expand menu
|
||||
self.$menu
|
||||
.stop()
|
||||
.animate
|
||||
(
|
||||
{width:'300px'/*, borderWidth:'10px'*/},
|
||||
'fast',
|
||||
function()
|
||||
{
|
||||
self.$menu.find('#menu_box').show('fast');
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
this.instantCloseMenu = function()
|
||||
{
|
||||
closeMenu=true;
|
||||
if(typeof oMenuTimer != "undefined") clearTimeout(oMenuTimer);
|
||||
self.closeMenu();
|
||||
};
|
||||
|
||||
this.closeMenu = function()
|
||||
{
|
||||
if(closeMenu == true)
|
||||
{
|
||||
if(typeof oMenuTimer != "undefined") clearTimeout(oMenuTimer);
|
||||
|
||||
//Switch uselecc button
|
||||
self.$menu.find('.useless_button').removeClass('tiny_top_right').addClass('round');
|
||||
|
||||
//Main shadow
|
||||
self.$main.add(self.$title)
|
||||
.off('click')
|
||||
.fadeTo('fast', 1);
|
||||
|
||||
//Reduce menu
|
||||
self.$menu.find('#menu_box').hide();
|
||||
self.$menu
|
||||
.stop()
|
||||
.animate
|
||||
(
|
||||
{width:'20px'/*, borderWidth:'0'*/},
|
||||
'fast',
|
||||
function()
|
||||
{
|
||||
self.$menu.find('#menu_title').show('fast');
|
||||
}
|
||||
);
|
||||
openedMenu = false;
|
||||
closeMenu = false;
|
||||
}
|
||||
};
|
||||
|
||||
this.setInitEnd = function(bEnded, bAddScrollBar)
|
||||
{
|
||||
self.vars.initLoaded = bEnded;
|
||||
if(self.vars.initLoaded===true)
|
||||
{
|
||||
//self.resizeMain();
|
||||
self.onResize();
|
||||
//setTimeout(self.onResize, 500);
|
||||
}
|
||||
};
|
||||
|
||||
this.getMainElem = function(elem)
|
||||
{
|
||||
return self.$main.find(elem);
|
||||
};
|
||||
|
||||
//switch to a new page with animation, without processing image
|
||||
this.switchPage = function(sNextPage, iItemId, bNoFade, bforce)
|
||||
{
|
||||
iItemId = iItemId || 0;
|
||||
bforce = bforce || false;
|
||||
|
||||
//FIXME event object instead of string after cancelling page exit. bug ? channeling from parseHash
|
||||
if(bforce || typeof sNextPage == 'string' && (sNextPage != self.vars.current_page || iItemId!=self.vars.id))
|
||||
{
|
||||
//Officially quiting page
|
||||
var bExit = true;
|
||||
if(self.vars.current_page!='') bExit = self.onQuit();
|
||||
if(bExit==false) bExit = confirm('Voulez-vous vraiment quitter la page en cours ?');
|
||||
|
||||
if(bExit)
|
||||
{
|
||||
//Init's Start
|
||||
self.setInitEnd(false);
|
||||
|
||||
//Reset specific pages event catchers
|
||||
self.resetEventHandlers();
|
||||
|
||||
//Switching data
|
||||
self.vars.current_page = sNextPage;
|
||||
self.vars.id = iItemId;
|
||||
/*if(typeof self.vars.page_cache[sNextPage] == 'undefined')
|
||||
{
|
||||
self.vars.loading = true;
|
||||
$.get
|
||||
(
|
||||
self.getPagePath(sNextPage),
|
||||
function(data)
|
||||
{
|
||||
self.vars.loading = false;
|
||||
self.vars.page_cache[sNextPage] = data;
|
||||
self.transition(self.switchContent);
|
||||
}
|
||||
);
|
||||
}
|
||||
else self.transition(self.switchContent);
|
||||
*/
|
||||
self.addPageToCache(sNextPage, function(){self.transition(self.switchContent);});
|
||||
}
|
||||
//fix the hash
|
||||
else self.goToInternalLink(self.vars.current_page, self.vars.id);
|
||||
}
|
||||
};
|
||||
|
||||
this.addPageToCache = function(sPage, fOnSuccess)
|
||||
{
|
||||
if(typeof self.vars.page_cache[sPage] == 'undefined')
|
||||
{
|
||||
self.vars.loading = true;
|
||||
$.get
|
||||
(
|
||||
self.getPagePath(sPage),
|
||||
function(data)
|
||||
{
|
||||
self.vars.loading = false;
|
||||
self.vars.page_cache[sPage] = data;
|
||||
fOnSuccess();
|
||||
}
|
||||
);
|
||||
}
|
||||
else fOnSuccess();
|
||||
};
|
||||
|
||||
this.transition = function(fOnFinish)
|
||||
{
|
||||
if(self.vars2('fade')) fOnFinish();
|
||||
else $.when(self.$main.add(self.$title).stop().fadeTo(self.consts.transTime, 0)).done(fOnFinish);
|
||||
self.vars2('fade', false);
|
||||
};
|
||||
|
||||
this.switchContent = function()
|
||||
{
|
||||
//Add page Header
|
||||
self.$title
|
||||
.find('.h1_wrap').attr('id', self.vars.current_page+'_title')
|
||||
.find('#title_text').text(self.vars.page_titles[self.vars.current_page]);
|
||||
self.$title.fadeTo(self.consts.transTime, 1);
|
||||
self.vars.pageIcon = 'fa-c-'+self.vars.current_page;
|
||||
self.pageIcon(self.vars.pageIcon);
|
||||
|
||||
//Page replacement
|
||||
self.$main.empty().fadeTo(self.consts.transTime, 1).append(self.vars.page_cache[self.vars.current_page]);
|
||||
|
||||
//Browser tab title
|
||||
self.setTitle();
|
||||
|
||||
//Reset specific page variables
|
||||
self.vars2('tmp', {});
|
||||
|
||||
//Page specific Actions
|
||||
self.pageInit();
|
||||
};
|
||||
|
||||
this.pageIcon = function(pageIcon, comment)
|
||||
{
|
||||
var $Header = $('#'+self.vars.current_page+'_title');
|
||||
$Header.find('i')
|
||||
.attr('class', 'fa fa-fw fa-20')
|
||||
.addClass(pageIcon);
|
||||
$Header.find('h1').attr('title', comment || '');
|
||||
};
|
||||
|
||||
this.addBufferIcon = function()
|
||||
{
|
||||
self.pageIcon('fa-spin fa-c-loading', 'Processing...');
|
||||
};
|
||||
|
||||
this.addSuccessIcon = function()
|
||||
{
|
||||
self.pageIcon('fa-c-ok', 'Opération réussie');
|
||||
setTimeout(self.resetIcon, 2000);
|
||||
};
|
||||
|
||||
this.addFailIcon = function(sMsg)
|
||||
{
|
||||
if(!sMsg) sMsg = 'Echec de connexion. Essaie de refresh la page';
|
||||
self.pageIcon('fa-c-ko', sMsg);
|
||||
setTimeout(self.resetIcon, 5000);
|
||||
};
|
||||
|
||||
this.resetIcon = function()
|
||||
{
|
||||
self.pageIcon(self.vars.pageIcon, '');
|
||||
};
|
||||
|
||||
this.resizeMain = function()
|
||||
{
|
||||
//Maximize main div height to fill up the page
|
||||
var iPageHeight = $('body').outerHeight(true);
|
||||
var iWindowHeight = $(window).outerHeight(true);
|
||||
self.$main.height('+='+(iWindowHeight - iPageHeight));
|
||||
self.$menu.height($('#main_container').height());
|
||||
|
||||
//Update size
|
||||
self.consts.maxHeight = $(window).height();
|
||||
self.consts.maxWidth = $(window).width();
|
||||
self.consts.pageMaxHeight = self.$main.height();
|
||||
self.consts.pageMaxWidth = self.$main.width();
|
||||
|
||||
//Page event
|
||||
self.onResize();
|
||||
};
|
||||
|
||||
this.maximizeElem = function($Elem, bfitToElemContent, $Box)
|
||||
{
|
||||
$Box = $Box || self.$main;
|
||||
bfitToElemContent = bfitToElemContent || false;
|
||||
|
||||
//Maximize to box height
|
||||
var iDelta = $Box.getEmptyHeight();
|
||||
//debug('Giving empty '+iDelta+'px (in #'+$Box.attr('id')+') to #'+$Elem.attr('id')+' (originally : '+$Elem.height()+')');
|
||||
|
||||
if(iDelta != 0) $Elem.height('+='+iDelta);
|
||||
//debug('Now, #'+$Elem.attr('id')+' height is '+$Elem.height()+'px');
|
||||
|
||||
//Minimize to elem height
|
||||
if(bfitToElemContent)
|
||||
{
|
||||
iDelta = $Elem.getEmptyHeight();
|
||||
if(iDelta > 0) $Elem.height('-='+iDelta);
|
||||
//debug('Removing useless '+iDelta+'px from #'+$Elem.attr('id'));
|
||||
}
|
||||
};
|
||||
|
||||
this.saveForm = function(action, $form, fOnSuccess, bProcessIcon, dataType)
|
||||
{
|
||||
var sFormVars = $form.serialize();
|
||||
if(typeof bProcessIcon != 'undefined') self.addBufferIcon();
|
||||
if(!dataType) dataType = 'text';
|
||||
|
||||
self.vars.loading = true;
|
||||
$.ajax
|
||||
(
|
||||
{
|
||||
type: 'POST',
|
||||
url: self.getActionLink(action),
|
||||
data: sFormVars,
|
||||
success:function(result)
|
||||
{
|
||||
self.vars.loading = false;
|
||||
self.vars.disconnected = false;
|
||||
if(typeof bProcessIcon != 'undefined') self.resetIcon();
|
||||
fOnSuccess(result);
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
self.vars.loading = false;
|
||||
self.vars.disconnected = true;
|
||||
debug('Error databap.js 331');
|
||||
self.showError(textStatus);
|
||||
},
|
||||
dataType: dataType
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
this.getInfo = function(action, fOnSuccess, vars, type, fOnError, bProcessIcon)
|
||||
{
|
||||
if(!vars) vars = {};
|
||||
if(!type) type = 'html';
|
||||
if(typeof bProcessIcon != 'undefined') self.addBufferIcon();
|
||||
|
||||
vars['a'] = action;
|
||||
self.vars.loading = true;
|
||||
$.ajax
|
||||
(
|
||||
{
|
||||
url: self.consts.process_url,
|
||||
data: vars,
|
||||
success: function(result)
|
||||
{
|
||||
if(result==self.consts.disconnected) databap.refresh();
|
||||
else if((result==self.consts.error || typeof result.success != 'undefined' && result.success==self.consts.error) && typeof fOnError !== 'undefined') fOnError();
|
||||
else
|
||||
{
|
||||
self.vars.loading = false;
|
||||
self.vars.disconnected = false;
|
||||
if(typeof bProcessIcon != 'undefined') self.resetIcon();
|
||||
fOnSuccess(result);
|
||||
}
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
if(jqXHR.responseText==self.consts.disconnected) databap.refresh();
|
||||
|
||||
self.vars.loading = false;
|
||||
self.vars.disconnected = true;
|
||||
debug('Error databap.js 361');
|
||||
if(typeof bProcessIcon != 'undefined') self.resetIcon();
|
||||
if(!fOnError)
|
||||
{
|
||||
self.showError(textStatus);
|
||||
debug(textStatus+' '+errorThrown);
|
||||
}
|
||||
else fOnError(textStatus);
|
||||
},
|
||||
dataType: type
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
this.getSyncInfo = function(action, vars)
|
||||
{
|
||||
if(!vars) vars = {};
|
||||
vars['a'] = action;
|
||||
return $.ajax
|
||||
(
|
||||
{
|
||||
url: self.consts.process_url,
|
||||
type: "GET",
|
||||
data: vars,
|
||||
dataType: "html",
|
||||
async: false,
|
||||
success: function(r){/*debug('getSyncInfo: Ok');*/}
|
||||
}
|
||||
).responseText;
|
||||
};
|
||||
|
||||
this.showError = function(textStatus)
|
||||
{
|
||||
//debug('ERROR : '+textStatus);
|
||||
self.addFailIcon();
|
||||
};
|
||||
|
||||
this.getUserInfo = function(fOnSuccess)
|
||||
{
|
||||
if(typeof self.vars.current_user.name == 'undefined')
|
||||
{
|
||||
self.getInfo
|
||||
(
|
||||
'user_info',
|
||||
function(user)
|
||||
{
|
||||
self.vars.current_user = user;
|
||||
fOnSuccess(user);
|
||||
},
|
||||
{},
|
||||
'json'
|
||||
);
|
||||
}
|
||||
else fOnSuccess(self.vars.current_user);
|
||||
};
|
||||
|
||||
this.initSearch = function()
|
||||
{
|
||||
$('#form_header').submit(function(event){event.preventDefault();});
|
||||
|
||||
var bDirectSearch = (self.vars.current_page=='' && self.parseHash().page=='search' && self.parseHash().id!='');
|
||||
$('#query')
|
||||
.addDefaultValue(self.consts.search_box_text, bDirectSearch?self.parseHash().id:'')
|
||||
.keyup(function(e){if(e.which==13 || e.isTrigger) self.goToInternalLink('search', $('#query').val());});
|
||||
|
||||
$('#search_btn_submit').click(function(){$('#query').trigger('keyup');});
|
||||
};
|
||||
|
||||
this.search = function()
|
||||
{
|
||||
//search words
|
||||
var searchWords = $.trim($('#query').val());
|
||||
|
||||
//check already searched words
|
||||
if((self.tmp('searched_words')=='' || self.tmp('searched_words')!=searchWords) && searchWords.length > 2)
|
||||
{
|
||||
//filter requests to not flood the server
|
||||
if(/*window.tempWords !== undefined && tempWords == searchWords && */!self.vars.loading)
|
||||
{
|
||||
//saving searched words
|
||||
self.tmp('searched_words', searchWords);
|
||||
self.getInfo
|
||||
(
|
||||
'search',
|
||||
function(asItems)
|
||||
{
|
||||
$Container = self.$main.find('#list_container');
|
||||
$Container.empty();
|
||||
$('#search_words').text(searchWords);
|
||||
$('#search_count').text(asItems.length);
|
||||
$('#search_multi').text(asItems.length>1?'s':'');
|
||||
if(asItems.length==0) $Container.append('Aucun résultat trouvé.');
|
||||
else
|
||||
{
|
||||
for(iRankId in asItems) self.appendItem(asItems[iRankId], $Container, false);
|
||||
}
|
||||
self.addSuccessIcon();
|
||||
},
|
||||
{keywords:searchWords},
|
||||
'json',
|
||||
function(){},
|
||||
true
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
//tempWords = searchWords;
|
||||
setTimeout(self.search, 300);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.appendItem = function(asItemInfo, $Container, $bAnimation)
|
||||
{
|
||||
//Filling up the item line
|
||||
var $verHtml = $(self.consts.versionHtml);
|
||||
$verHtml.find('#description').html(asItemInfo.description);
|
||||
$verHtml.find('#author_name').html(asItemInfo.name);
|
||||
$verHtml.find('#author_company').html(asItemInfo.company);
|
||||
$verHtml.find('#led').html(asItemInfo.led);
|
||||
|
||||
//Rank (search)
|
||||
if(typeof asItemInfo.rank != 'undefined')
|
||||
{
|
||||
$verHtml.find('#description')
|
||||
.append(
|
||||
$('<span>', {style:'float:right;'})
|
||||
.append($('<i>', {'class':'fa fa-inline fa-c-kpi'}))
|
||||
.append(asItemInfo.rank)
|
||||
);
|
||||
}
|
||||
|
||||
//Icon
|
||||
$verHtml.find('.fa').addClass('fa-c-'+asItemInfo.type);
|
||||
|
||||
//Link
|
||||
var sItemLink = self.getInternalLink(asItemInfo.type, asItemInfo.id_item);
|
||||
$verHtml.find('#item_link').attr('href', sItemLink).attr('title', 'Lien vers '+sItemLink);
|
||||
$verHtml = self.setElemTags($verHtml, asItemInfo.id_item, false, asItemInfo.type);
|
||||
|
||||
//Display
|
||||
$bAnimation = (typeof $bAnimation != 'undefined')?$bAnimation:true;
|
||||
var $Container = self.getMainElem('#list_container');
|
||||
if($bAnimation) $verHtml.hide().appendTo($Container).slideDown('fast');
|
||||
else $verHtml.appendTo($Container);
|
||||
};
|
||||
|
||||
this.getActionLink = function(sAction, oVars)
|
||||
{
|
||||
if(!oVars) oVars = {};
|
||||
sVars = '';
|
||||
for(i in oVars)
|
||||
{
|
||||
sVars += '&'+i+'='+oVars[i];
|
||||
}
|
||||
return self.consts.process_url+'?a='+sAction+sVars;
|
||||
};
|
||||
|
||||
this.getInternalLink = function(sPage, iItemId, bAbsolute)
|
||||
{
|
||||
bAbsolute = bAbsolute || false;
|
||||
return (bAbsolute?self.vars.serv_name:'')+'#'+sPage+((iItemId>0 || iItemId!='')?'-'+escape($.trim(iItemId)):'');
|
||||
};
|
||||
|
||||
this.goToInternalLink = function(sPage, iItemId, bFade)
|
||||
{
|
||||
self.vars2('fade', bFade || false);
|
||||
|
||||
iItemId = iItemId || 0;
|
||||
var sHash = self.getInternalLink(sPage, iItemId).substr(1);
|
||||
if(sHash==self.hash()) self.onHashChange({force:true});
|
||||
else self.hash(sHash);
|
||||
};
|
||||
|
||||
this.refresh = function()
|
||||
{
|
||||
self.tmp("refresh", true);
|
||||
//self.goToInternalLink(databap.vars.current_page, databap.vars.id);
|
||||
location.reload(true);
|
||||
};
|
||||
|
||||
this.goToExternalLink = function(sUrl)
|
||||
{
|
||||
window.location = sUrl;
|
||||
};
|
||||
|
||||
this.appendCode = function(codeBox, info)
|
||||
{
|
||||
self.vars.id = info.id_code;
|
||||
self.vars.phrase = (!info.phrase)?info.id_code:info.phrase;
|
||||
//#code_reader
|
||||
$codeBox = self.setElemTags($(codeBox), [self.vars.id]);
|
||||
|
||||
//About code
|
||||
self.getMainElem('#'+self.getElemTag('code_lines', self.vars.id)).html(info.code);
|
||||
self.getMainElem('#'+self.getElemTag('description', self.vars.id)).html(info.description);
|
||||
|
||||
//About author
|
||||
self.getMainElem('#'+self.getElemTag('author_name', self.vars.id)).text(info.name);
|
||||
self.getMainElem('#'+self.getElemTag('author_company', self.vars.id)).text(info.company);
|
||||
self.getMainElem('#'+self.getElemTag('led', self.vars.id)).text(info.led);
|
||||
self.getMainElem('#'+self.getElemTag('item_link', self.vars.id))
|
||||
.prop('href', self.getInternalLink('code', info.id_code))
|
||||
.find('.fa').addClass('fa-c-code');
|
||||
};
|
||||
|
||||
this.setElemTags = function($CodeBox, aiIds, bUpdate, sType)
|
||||
{
|
||||
self.setElemTag($CodeBox, aiIds, bUpdate, sType);
|
||||
$CodeBox.find('[id]').each(function(){self.setElemTag($(this), aiIds, bUpdate, sType);});
|
||||
return $CodeBox;
|
||||
};
|
||||
|
||||
this.setElemTag = function($Tag, aiIds, bUpdate, sType)
|
||||
{
|
||||
var sCurTagId = $Tag.attr('id');
|
||||
|
||||
//Replace only ids existing in aiIds, keep the others
|
||||
if(bUpdate)
|
||||
{
|
||||
var aiCurTagIds = self.getElemIds(sCurTagId);
|
||||
for(i in aiIds)
|
||||
{
|
||||
aiCurTagIds[i] = aiIds[i];
|
||||
}
|
||||
aiIds = aiCurTagIds;
|
||||
}
|
||||
|
||||
var sNewTagId = self.getElemTag(self.stripElemIds(sCurTagId), aiIds, sType);
|
||||
|
||||
$Tag.attr('id', sNewTagId);
|
||||
if($Tag.attr('name') != undefined) $Tag.attr('name', sNewTagId);
|
||||
};
|
||||
|
||||
this.getElemTag = function(sTag, aiIds, sType)
|
||||
{
|
||||
if(!sType) sType = 'c';
|
||||
if(typeof aiIds != 'object') aiIds = [aiIds];
|
||||
return sType+implode(self.consts.id_sep, aiIds)+self.consts.id_sep+sTag;
|
||||
};
|
||||
|
||||
this.getFirstElemId = function(sTag)
|
||||
{
|
||||
var aiIds = self.getElemIds(sTag);
|
||||
return aiIds[0];
|
||||
};
|
||||
|
||||
this.getElemIds = function(sTag)
|
||||
{
|
||||
return array_filter(explode(self.consts.id_sep, sTag.substr(1)), isNumeric);
|
||||
};
|
||||
|
||||
this.stripElemIds = function(sTag)
|
||||
{
|
||||
//var sPattern = 'c\\d+'+self.consts.id_sep;
|
||||
var sType = sTag.substr(0, 1);
|
||||
var sPattern = self.getElemTag('', '\\d+', sType);
|
||||
if(self.checkRegExMatch(sPattern, sTag))
|
||||
{
|
||||
sTag = sTag.substr(self.getElemTag('', self.getElemIds(sTag), sType).length);
|
||||
}
|
||||
return sTag;
|
||||
};
|
||||
|
||||
this.checkRegExMatch = function(sPattern, sText)
|
||||
{
|
||||
var oRegEx = new RegExp(sPattern, 'i');
|
||||
return sText.match(oRegEx);
|
||||
};
|
||||
|
||||
this.setCodeContainer = function(fOnSuccess, containerId)
|
||||
{
|
||||
if(typeof self.vars.code_container === 'undefined' || self.vars.code_container == '')
|
||||
{
|
||||
self.getInfo
|
||||
(
|
||||
'code_block',
|
||||
function(code_block)
|
||||
{
|
||||
self.vars.code_container = code_block;
|
||||
if(containerId) self.appendContainer(containerId);
|
||||
fOnSuccess();
|
||||
}
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(containerId) self.appendContainer(containerId);
|
||||
fOnSuccess();
|
||||
}
|
||||
};
|
||||
|
||||
this.appendContainer = function(containerId, codeId)
|
||||
{
|
||||
if(containerId != '')
|
||||
{
|
||||
if(!codeId)
|
||||
{
|
||||
codeBoxId = 'code_reader';
|
||||
container = self.vars.code_container;
|
||||
}
|
||||
else
|
||||
{
|
||||
codeBoxId = self.getElemTag('code_reader', codeId);
|
||||
container = self.vars.code_container.replace('id="code_reader"', 'id="'+codeBoxId+'"');
|
||||
}
|
||||
self.getMainElem(containerId).append(container);
|
||||
return codeBoxId;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
this.getImagePath = function(imageName)
|
||||
{
|
||||
return 'url("'+self.consts.app_image_folder+imageName+'")';
|
||||
};
|
||||
|
||||
this.getPagePath = function(sPageName)
|
||||
{
|
||||
return self.consts.mask_folder+sPageName+'.html?'+self.consts.time;
|
||||
};
|
||||
|
||||
this.addErrorBefore = function(msg, elem)
|
||||
{
|
||||
msg = msg+'.';
|
||||
self.addMsgBefore(msg, 'error', elem);
|
||||
};
|
||||
|
||||
this.addWarningBefore = function(msg, elem)
|
||||
{
|
||||
msg = 'Attention : '+msg+'.';
|
||||
self.addMsgBefore(msg, 'warning', elem);
|
||||
};
|
||||
|
||||
this.addSuccessBefore = function(msg, elem)
|
||||
{
|
||||
msg = msg+'.';
|
||||
self.addMsgBefore(msg, 'success', elem);
|
||||
};
|
||||
|
||||
this.addMsgBefore = function(msg, msgClass, elem)
|
||||
{
|
||||
var $msg = $('<p>', {'class':msgClass}).append($('<i>', {'class':'fa fa-inline'})).append(msg);
|
||||
$msg.hide().insertBefore(elem).slideDown('fast', function(){databap.updateScrollBar('bottom');}).delay(5000).slideUp('fast', function(){$(this).remove();databap.updateScrollBar();});
|
||||
};
|
||||
|
||||
this.setTitle = function(extra)
|
||||
{
|
||||
if(!extra)
|
||||
{
|
||||
extra = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
extra = extra+' | ';
|
||||
}
|
||||
var page = self.vars.page_titles[self.vars.current_page];
|
||||
document.title = extra+'Databap '+chr('8226')+' '+page;
|
||||
};
|
||||
|
||||
this.initScrollBar = function(sBox, sSubBox, sContent)
|
||||
{
|
||||
self.tmp('scrollbar', {}); //TODO in page switch
|
||||
$(sSubBox)
|
||||
.before('<div class="scrollbar"><div class="track round"><div class="thumb round clickable"><div class="end round clickable"></div></div></div></div>')
|
||||
.addClass('scrollbar_box round');
|
||||
$(sContent).addClass('scrollbar_subbox');
|
||||
self.tmp('scrollbar', $(sBox).tinyscrollbar({viewport:sSubBox, overview:sContent}));
|
||||
};
|
||||
|
||||
this.setScrollBarSize = function(iBoxSize)
|
||||
{
|
||||
var $Box = self.tmp('scrollbar').find('.scrollbar_box');
|
||||
if(iBoxSize=='optimize') self.maximizeElem($Box, true);
|
||||
else if(iBoxSize=='maximize') self.maximizeElem($Box, false);
|
||||
else $Box.height(iBoxSize);
|
||||
self.updateScrollBar();
|
||||
};
|
||||
|
||||
this.updateScrollBar = function(sPos)
|
||||
{
|
||||
sPos = sPos || 'relative';
|
||||
self.tmp('scrollbar').tinyscrollbar_update(sPos);
|
||||
};
|
||||
|
||||
this.shareEvent = function(sType, iId)
|
||||
{
|
||||
if(iId!='')
|
||||
{
|
||||
$('#share')
|
||||
.hide()
|
||||
.text(self.getInternalLink(sType, iId, true))
|
||||
.addClass('addr')
|
||||
.slideDown('fast')
|
||||
.unbind('click');
|
||||
}
|
||||
};
|
||||
}
|
||||
73
jquery/fileuploader.js
vendored
@@ -498,19 +498,20 @@ qq.FileUploader = function(o){
|
||||
((typeof o.addSlideText !== 'undefined')?o.addSlideText:'Glisser les images ici') +
|
||||
'</span>' +
|
||||
'</div>' +
|
||||
'<span class="uploader_button button add round">'+
|
||||
((typeof o.addFileText !== 'undefined')?o.addFileText:'Ajouter une image') +
|
||||
'</span>' +
|
||||
'<a class="uploader_button button round"><i class="icon fa fa-c-add"></i>'+
|
||||
((typeof o.addFileText !== 'undefined')?o.addFileText:'Ajouter une image') +
|
||||
'</a>' +
|
||||
'<div class="uploader_buffer"></div>' +
|
||||
'<ul id="uploader_list" class="uploader_list"></ul>' +
|
||||
'</div>',
|
||||
|
||||
// template for one item in file list
|
||||
fileTemplate:'<li id="uploader_item">' +
|
||||
'<span class="uploader_item_loading"></span>' +
|
||||
'<i class="fa fa-inline fa-c-doc"></i>' +
|
||||
'<span class="uploader_item_loading"><i class="fa fa-spin fa-c-loading"></i></span>' +
|
||||
'<span class="uploader_item_file"></span>' +
|
||||
'<span class="uploader_item_size"></span>' +
|
||||
'<a class="uploader_item_cancel" href="#">Annuler</a>' +
|
||||
'<a class="uploader_item_cancel" href="#"><i class="fa fa-60 fa-c-delete"></i></a>' +
|
||||
'<span class="uploader_item_failed_notice">Echoué</span>' +
|
||||
'</li>',
|
||||
|
||||
@@ -853,7 +854,8 @@ qq.UploadButton.prototype = {
|
||||
// in Opera only 'browse' button
|
||||
// is clickable and it is located at
|
||||
// the right side of the input
|
||||
left: '-297px',
|
||||
//left: '-297px',
|
||||
left: '-2px',
|
||||
top: '-2px',
|
||||
width:'auto',
|
||||
fontFamily: 'Arial',
|
||||
@@ -1308,3 +1310,62 @@ qq.extend(qq.UploadHandlerXhr.prototype, {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function addImage(stepId, imageId, imageName, imageDesc)
|
||||
{
|
||||
//get image number
|
||||
var $ImageBox = databap.getMainElem('#'+databap.getElemTag('uploader_item', [stepId, imageId]));
|
||||
|
||||
//Create new image
|
||||
var $newImage = $([ '<span id="image_action" class="image_action">',
|
||||
'<input type="text" id="image_desc" name="image_desc" class="image_description round" />',
|
||||
'<input type="hidden" name="image_name" id="image_name" value="" />',
|
||||
'<span id="delete_image" class="clickable"><i class="fa fa-60 fa-c-delete"></i></span>',
|
||||
'</span>'].join('\n'));
|
||||
|
||||
//Update doc icon
|
||||
var sExt = imageName.slice(imageName.lastIndexOf('.') + 1);
|
||||
$ImageBox.find('.fa').eq(0).addClass('fa-c-file-'+sExt);
|
||||
|
||||
//Set image name
|
||||
$newImage.find('#image_name').val(imageName);
|
||||
|
||||
//Set image description
|
||||
$newImage.find('#image_desc').val(imageDesc);
|
||||
|
||||
//delete button for this image
|
||||
$newImage.find('#delete_image').click
|
||||
(
|
||||
function()
|
||||
{
|
||||
var stepIds = databap.getElemIds($(this).attr('id'));
|
||||
removeImage(stepIds[0], stepIds[1]);
|
||||
}
|
||||
);
|
||||
|
||||
//Add ids
|
||||
$newImage = databap.setElemTags($newImage, [stepId, imageId]);
|
||||
|
||||
//Add Image to the step
|
||||
$newImage.appendTo($ImageBox);
|
||||
|
||||
//Block exit
|
||||
databap.tmp('started', true);
|
||||
|
||||
databap.updateScrollBar();
|
||||
|
||||
return imageId;
|
||||
}
|
||||
|
||||
function removeImage(iStepId, iImageId)
|
||||
{
|
||||
var sImageTag = databap.getElemTag('uploader_item', [iStepId, iImageId]);
|
||||
databap.getMainElem('#'+sImageTag).hide
|
||||
(
|
||||
'fast',
|
||||
function()
|
||||
{
|
||||
$(this).remove();
|
||||
}
|
||||
);
|
||||
}
|
||||
1215
jquery/handler.js
vendored
167
jquery/jquery-1.4.4.min.js
vendored
@@ -1,167 +0,0 @@
|
||||
/*!
|
||||
* jQuery JavaScript Library v1.4.4
|
||||
* http://jquery.com/
|
||||
*
|
||||
* Copyright 2010, John Resig
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* Includes Sizzle.js
|
||||
* http://sizzlejs.com/
|
||||
* Copyright 2010, The Dojo Foundation
|
||||
* Released under the MIT, BSD, and GPL Licenses.
|
||||
*
|
||||
* Date: Thu Nov 11 19:04:53 2010 -0500
|
||||
*/
|
||||
(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
|
||||
h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
|
||||
h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
|
||||
"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
|
||||
e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
|
||||
"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
|
||||
a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
|
||||
C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
|
||||
s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
|
||||
j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
|
||||
toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
|
||||
-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
|
||||
if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
|
||||
if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
|
||||
b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
|
||||
!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
|
||||
l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
|
||||
z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
|
||||
s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
|
||||
s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
|
||||
[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
|
||||
false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
|
||||
k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
|
||||
scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
|
||||
false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
|
||||
1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
|
||||
"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
|
||||
c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
|
||||
else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
|
||||
a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
|
||||
c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
|
||||
a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
|
||||
colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
|
||||
1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
|
||||
l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
|
||||
"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
|
||||
if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
|
||||
a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
|
||||
attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
|
||||
b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
|
||||
c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
|
||||
arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
|
||||
d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
|
||||
c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
|
||||
w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
|
||||
8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
|
||||
"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
|
||||
d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
|
||||
fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
|
||||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
|
||||
Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
|
||||
c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
|
||||
var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
|
||||
"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
|
||||
xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
|
||||
B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
|
||||
"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
|
||||
0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
|
||||
a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
|
||||
1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
|
||||
"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
|
||||
c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
|
||||
(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
|
||||
[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
|
||||
break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
|
||||
q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
|
||||
l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
|
||||
return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
|
||||
B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
|
||||
POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
|
||||
i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
|
||||
i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
|
||||
"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
|
||||
m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
|
||||
true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
|
||||
g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
|
||||
0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
|
||||
"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
|
||||
i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
|
||||
if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
|
||||
g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
|
||||
for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
|
||||
i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
|
||||
n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
|
||||
function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
|
||||
p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
|
||||
t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
|
||||
function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
|
||||
c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
|
||||
not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
|
||||
h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
|
||||
c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
|
||||
2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
|
||||
b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
|
||||
e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
|
||||
"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
|
||||
c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
|
||||
wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
|
||||
prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
|
||||
this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
|
||||
return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
|
||||
else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
|
||||
c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
|
||||
b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
|
||||
this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
|
||||
prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
|
||||
b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
|
||||
1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
|
||||
d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
|
||||
jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
|
||||
zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
|
||||
h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
|
||||
if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
|
||||
d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
|
||||
e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
|
||||
ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
|
||||
"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
|
||||
!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
|
||||
getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
|
||||
script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
|
||||
!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
|
||||
false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
|
||||
A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
|
||||
b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
|
||||
c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
|
||||
c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
|
||||
encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
|
||||
[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
|
||||
e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
|
||||
if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
|
||||
3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
|
||||
d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
|
||||
d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
|
||||
"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
|
||||
1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
|
||||
d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
|
||||
Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
|
||||
var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
|
||||
this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
|
||||
this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
|
||||
c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
|
||||
b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
|
||||
h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
|
||||
for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
|
||||
parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
|
||||
height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
|
||||
f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
|
||||
"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
|
||||
e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
|
||||
c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
|
||||
c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
|
||||
b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
|
||||
18
jquery/jquery-1.6.1.min.js
vendored
5
jquery/jquery.min.js
vendored
145
jquery/jquery.mods.js
Normal file
7
jquery/tinyscrollbar.js
vendored
@@ -28,7 +28,12 @@
|
||||
this.update=function(sScroll)
|
||||
{
|
||||
oViewport[options.axis]=oViewport.obj[0]['offset'+sSize];
|
||||
oContent[options.axis]=oContent.obj[0]['scroll'+sSize];
|
||||
oContent[options.axis] = oContent.obj[0]['scroll'+sSize];
|
||||
|
||||
/* Adding border - Start */
|
||||
oContent[options.axis] += oViewport.obj.outerHeight() - oViewport.obj.innerHeight();
|
||||
/* Adding border - End */
|
||||
|
||||
oContent.ratio=oViewport[options.axis]/oContent[options.axis];
|
||||
oScrollbar.obj.toggleClass('disable',oContent.ratio>=1);
|
||||
oTrack[options.axis]=options.size=='auto'?oViewport[options.axis]:options.size;
|
||||
|
||||
@@ -1,206 +0,0 @@
|
||||
<div id="add_code_container">
|
||||
<form id="add_code" name="add_code">
|
||||
<div class="h1_wrap">
|
||||
<h1 class="round" id="add_code_title"><span>Ajouter du code</span></h1>
|
||||
<div id="loggued_name_container">
|
||||
<p id="logging_info" class="round_top">Vous êtes sur le point de poster sous le compte de <span id="loggued_name"></span> (<span id="loggued_company"></span>)</p>
|
||||
<p><input type="button" id="logout_btn" class="round" value="Ce n'est pas vous ?" /></p>
|
||||
</div>
|
||||
<textarea id="content" name="content" class="round"></textarea>
|
||||
</div>
|
||||
<table id="extra_data">
|
||||
<tr>
|
||||
<td>Description</td>
|
||||
<td><input type="text" name="description" id="description" class="round" maxlength="200" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lien (facultatif)</td>
|
||||
<td>
|
||||
<input type="text" name="link" id="link" class="round" maxlength="200" />
|
||||
<span id="available_phrase" class="round"></span>
|
||||
<span id="link_result" class="share round"></span>
|
||||
<input type="hidden" name="link_escaped" id="link_escaped" value="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="auth_name_container" style="display:none;">
|
||||
<td>Nom & prénom</td>
|
||||
<td><input type="text" name="auth_name" class="round" /></td>
|
||||
</tr>
|
||||
<tr id="auth_company_container" style="display:none;">
|
||||
<td>Société</td>
|
||||
<td><input type="text" name="auth_company" class="round" value="Micropole" /></td>
|
||||
</tr>
|
||||
<tr><td colspan="2" class="last"><input type="button" id="add_code_btn" name="add_code_btn" value="Envoyer" class="button heavy round" /></td></tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
databap.pageInit = function()
|
||||
{
|
||||
//Tmp
|
||||
databap.tmp('last_val', 'string');
|
||||
|
||||
//content
|
||||
databap.getMainElem('#content').text(databap.consts.add_code_text);
|
||||
databap.getMainElem('#content').click(function(){clearDefaultValue($(this), databap.consts.add_code_text);});
|
||||
|
||||
//link phrase
|
||||
databap.getMainElem('#link').bind
|
||||
(
|
||||
'keyup',
|
||||
function()
|
||||
{
|
||||
$link = databap.getMainElem('#link_result');
|
||||
var link = $.trim($(this).val());
|
||||
var escaped_link = link.replace(/ /g, '_');
|
||||
if(escaped_link!=databap.tmp('last_val'))
|
||||
{
|
||||
databap.tmp('last_val', escaped_link);
|
||||
$link.text(databap.getCodeLink(escaped_link));
|
||||
databap.getMainElem('#link_escaped').val(escaped_link);
|
||||
if(escaped_link!='')
|
||||
{
|
||||
//check availability
|
||||
checkUrlAvailability($.trim(escaped_link));
|
||||
}
|
||||
else
|
||||
{
|
||||
if($link.is(':visible')) $link.hide('fast');
|
||||
databap.getMainElem('#available_phrase').hide('fast');
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
//submit
|
||||
databap.getMainElem('#add_code').submit(function(event){event.preventDefault();});
|
||||
databap.getMainElem('#add_code_btn').click
|
||||
(
|
||||
function()
|
||||
{
|
||||
var code = databap.getMainElem('#content').val();
|
||||
|
||||
if
|
||||
(
|
||||
code!=databap.consts.add_code_text &&
|
||||
code!='' &&
|
||||
databap.getMainElem('#description').val()!='' &&
|
||||
databap.getMainElem('#auth_name').val()!='' &&
|
||||
databap.getMainElem('#auth_company').val()!=''
|
||||
)
|
||||
{
|
||||
databap.saveForm
|
||||
(
|
||||
'add_code',
|
||||
databap.getMainElem('#add_code'),
|
||||
function(iCodeId)
|
||||
{
|
||||
if(!iCodeId || iCodeId===null || iCodeId==0)
|
||||
{
|
||||
databap.addErrorBefore('Erreur d\'authentification', '#add_code_btn');
|
||||
databap.$main.find('#auth_name_container, #auth_company_container').show('fast');
|
||||
}
|
||||
else
|
||||
{
|
||||
var link = databap.getMainElem('#link_escaped').val();
|
||||
databap.vars.code = (link=='')?iCodeId:link;
|
||||
debug('returned : '+databap.vars.code);
|
||||
databap.switchPage(databap.pages.read_code);
|
||||
}
|
||||
},
|
||||
true
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
databap.addErrorBefore('Tous les champs ne sont pas remplis', '#add_code_btn');
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
//Add logged in warning
|
||||
/*databap.getUserInfo
|
||||
(
|
||||
function(user)
|
||||
{
|
||||
//hide logon fields
|
||||
databap.getMainElem('#auth_name_container, #auth_company_container').hide();
|
||||
|
||||
//show loggued user information
|
||||
databap.getMainElem('#loggued_name').text(user.name);
|
||||
databap.getMainElem('#loggued_company').text(user.company);
|
||||
databap.getMainElem('#loggued_name_container').show();
|
||||
}
|
||||
);
|
||||
|
||||
//post re-login
|
||||
databap.getMainElem('#logout_btn').click
|
||||
(
|
||||
function()
|
||||
{
|
||||
databap.getMainElem('#auth_name_container, #auth_company_container').show();
|
||||
databap.getMainElem('#loggued_name_container').hide('fast');
|
||||
}
|
||||
);*/
|
||||
|
||||
//On resize
|
||||
//databap.resetSize = function(){databap.getMainElem('#content').height('300');};
|
||||
databap.onResize = function()
|
||||
{
|
||||
//TODO : to be replaced by tinyscrollbar
|
||||
databap.$main.css('overflow', 'auto');
|
||||
|
||||
var iCodeContainerHeight = $('#add_code_container').height();
|
||||
if(iCodeContainerHeight != databap.consts.pageMaxHeight)
|
||||
{
|
||||
databap.getMainElem('#content').height('+='+(databap.consts.pageMaxHeight-iCodeContainerHeight));
|
||||
}
|
||||
};
|
||||
|
||||
//Init's end
|
||||
databap.setInitEnd(true);
|
||||
};
|
||||
|
||||
function checkUrlAvailability(phrase, bTriggered)
|
||||
{
|
||||
if(bTriggered == true)
|
||||
{
|
||||
databap.getInfo
|
||||
(
|
||||
'url',
|
||||
function(bExist)
|
||||
{
|
||||
var availabilityClass, availabilityText;
|
||||
var $link = databap.getMainElem('#link_result');
|
||||
if(bExist=='0')
|
||||
{
|
||||
availabilityClass = 'available';
|
||||
availabilityText = 'Disponible';
|
||||
if($link.is(':hidden')) $link.show('fast');
|
||||
}
|
||||
else
|
||||
{
|
||||
availabilityClass = 'unavailable';
|
||||
availabilityText = 'Indisponible';
|
||||
if($link.is(':visible')) $link.hide('fast');
|
||||
}
|
||||
databap.getMainElem('#available_phrase')
|
||||
.removeClass('available unavailable')
|
||||
.addClass(availabilityClass)
|
||||
.text(availabilityText)
|
||||
.show('fast');
|
||||
},
|
||||
{link_escaped:phrase},
|
||||
'html',
|
||||
function(){},
|
||||
true
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
databap.addBufferIcon();
|
||||
if(typeof oCheckLinkTimer != "undefined") clearTimeout(oCheckLinkTimer);
|
||||
oCheckLinkTimer = setTimeout(function(){checkUrlAvailability(phrase, true);}, 500);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
21
masks/article.html
Normal file
@@ -0,0 +1,21 @@
|
||||
<div id="article">
|
||||
<!-- <iframe id="art_frame"></iframe> -->
|
||||
<p class="loading_box step_box round"><i class="fa fa-60 fa-inline fa-spin fa-c-loading"></i>L'article est en cours de chargement...</p>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
databap.pageInit = function()
|
||||
{
|
||||
self.getInfo
|
||||
(
|
||||
'get_article',
|
||||
function(asArtInfo)
|
||||
{
|
||||
//$('#art_frame').attr('src', asArtInfo.link_art);
|
||||
self.goToExternalLink(asArtInfo.link_art);
|
||||
},
|
||||
{id:self.vars.id},
|
||||
'json',
|
||||
function(){}
|
||||
);
|
||||
}
|
||||
</script>
|
||||
337
masks/chat.html
@@ -1,44 +1,45 @@
|
||||
<div id="chat">
|
||||
<div class="h1_wrap" id="chat_title">
|
||||
<h1 class="round"><span>Chat</span></h1>
|
||||
</div>
|
||||
|
||||
<div id="chat_chan">
|
||||
<p class="tab_bar"><span id="join_chan" class="round_top clickable"></span></p>
|
||||
<p class="tab_bar"><span id="join_chan" class="chan round_top clickable"></span></p>
|
||||
</div>
|
||||
<div id="sidebar">
|
||||
<div class="sidebar_box round">
|
||||
<div id="connected_users_title" class="sidebar_box_title round_top clickable">Connectés</div>
|
||||
<div id="connected_users" class="sidebar_box_content"></div>
|
||||
<div class="sidebar_box_title round_top round clickable">Connectés</div>
|
||||
<div id="connected_users" class="sidebar_box_content hide"></div>
|
||||
</div>
|
||||
<div class="sidebar_box round">
|
||||
<div class="sidebar_box_title round_top clickable round">Aide</div>
|
||||
<div class="sidebar_box_title round_top round clickable">News</div>
|
||||
<div id="news" class="sidebar_box_content hide"><p class="loading"><i class="fa fa-spin fa-inline fa-c-loading"></i></p></div>
|
||||
</div>
|
||||
<div class="sidebar_box round">
|
||||
<div class="sidebar_box_title round_top round clickable">Aide</div>
|
||||
<div id="help_open" class="sidebar_box_content help_paperclip clickable hide"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="chat_room" class="round">
|
||||
<div id="chat_container">
|
||||
<div class="scrollbar"><div class="track round"><div class="thumb round clickable"><div class="end round clickable"></div></div></div></div>
|
||||
<div id="chat_messages_box">
|
||||
<div id="chat_messages"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="chat_input" class="tiny_round">
|
||||
<form id="chat_form" name="chat_form">
|
||||
<input type="text" id="message" name="message" value="" maxlength="500" />
|
||||
<i id="message_img" class="fa fa-fw fa-20 fa-c-comment"></i><input type="text" id="message" name="message" value="" maxlength="500" />
|
||||
<input type="hidden" id="chan" name="chan" value="" maxlength="50" />
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div id="template" class="hide">
|
||||
<div id="help" class="help tiny_round">
|
||||
<p class="title">Manuel d'utilisation<span id="close_help" class="clickable">x</span></p>
|
||||
<p class="title">Manuel d'utilisation</p>
|
||||
<p class="title righty"> <span id="close_help" class="clickable"><i class="fa fa-30 fa-c-close"></i></span></p>
|
||||
<p class="subtitle"><span>Message</span></p>
|
||||
<p class="item"><span class="key">Echap</span>Supprime le texte en cours de rédaction</p>
|
||||
<p class="item"><span class="key">Flèche haut</span>Répète dernier message envoyé</p>
|
||||
<p class="item"><span class="key">@X Y</span>Vous dites Y à X (pseudo de Y en rouge)</p>
|
||||
<p class="item"><span class="key">/me X</span>Votre_pseudo X. Utile lorsque vous voulez parler de vous à la 3ème personne. Par exemple : /me se touche la nouille au taff</p>
|
||||
<p class="item"><span class="key">/mail X Y</span>Vous envoyez à X un email contenant Y (adresse professionel)</p>
|
||||
<p class="item"><span class="key">/mail X Y</span>Vous envoyez à X un email contenant Y (adresse professionnelle)</p>
|
||||
<p class="item"><span class="key">/news X</span>Vous annoncez le message X (votre message est ajouté à la liste des news automatiquement)</p>
|
||||
<p class="item">
|
||||
<span class="key">Tab</span>
|
||||
Chaque hit pré-remplie le message en faisant défiler la liste des connectés.
|
||||
@@ -48,6 +49,7 @@
|
||||
<p class="subtitle"><span>Chans</span></p>
|
||||
<p class="item">Les chans sont divisés en trois catégories : les chans privés (PM, pour deux personnes seulement), les chans entreprise (pour toutes les personnes d'une même entreprise) et les autres (chans publiques)</p>
|
||||
<p class="item"><span class="key">/join #X</span>Vous rejoignez le chan X (si autorisé)</p>
|
||||
<p class="item"><span class="key">/invite X</span>Vous invitez X à rejoindre le chan (si autorisé)</p>
|
||||
<p class="item"><span class="key">/pm #X</span>Vous rejoignez le chan privé (vous et X)</p>
|
||||
<p class="item"><span class="key">/quit #X</span>Vous quittez le chan X</p>
|
||||
<p class="item"><span class="key">/chans</span>Liste des chans publiques disponibles (aussi accessible via /channels et /list)</p>
|
||||
@@ -77,7 +79,8 @@ databap.pageInit = function()
|
||||
//Page variables
|
||||
databap.tmp('sending_msg', 'boolean');
|
||||
databap.tmp('refresh', 'boolean');
|
||||
databap.initVar('unread_msg', 'object');
|
||||
self.vars2('unread_msg', 'object');
|
||||
databap.tmp('news_period', 10*60*1000);
|
||||
|
||||
//Main elements
|
||||
$MsgInput = databap.getMainElem('#message');
|
||||
@@ -90,7 +93,7 @@ databap.pageInit = function()
|
||||
|
||||
//Loading the chat
|
||||
databap.vars.last_message_id = '0';
|
||||
oScrollbar = $('#chat_container').tinyscrollbar({viewport:'#chat_messages_box', overview:'#chat_messages'});
|
||||
self.initScrollBar('#chat_container', '#chat_messages_box', '#chat_messages');
|
||||
|
||||
//Loading Chans
|
||||
setChanButton();
|
||||
@@ -99,67 +102,117 @@ databap.pageInit = function()
|
||||
joinChan(databap.consts.default_chan, true);
|
||||
|
||||
//window focus
|
||||
//databap.onMouveEnter = function(){if(databap.vars.inputFocus){onPageFocus();}else{$MsgInput.focus();}};
|
||||
//databap.onMouveLeave = function(){$MsgInput.focus();onPageBlur();};
|
||||
$(window).focus(onPageFocus);
|
||||
$(window).blur(onPageBlur);
|
||||
//$(window).focus(function(){debug('focus');}).blur(function(){debug('blur');});
|
||||
|
||||
//Message Input Focus
|
||||
//$MsgInput.focus(function(){onPageFocus();databap.vars.inputFocus=true;});
|
||||
//$MsgInput.blur(function(){onPageBlur();databap.vars.inputFocus=false;});
|
||||
$MsgInput.focus();
|
||||
//databap.onKeyDown = function(e){if(!databap.vars.inputFocus)$MsgInput.focus();};
|
||||
|
||||
//On resize
|
||||
//databap.resetSize = function(){databap.getMainElem('#chat_messages_box').height(databap.getMainElem('#sidebar').outerHeight());};
|
||||
databap.onResize = function()
|
||||
{
|
||||
databap.$main.css('overflow', 'hidden');
|
||||
|
||||
//debug('chat page resize triggered');
|
||||
var $cb = databap.getMainElem('#chat_messages_box');
|
||||
var iMaxHeight = databap.consts.pageMaxHeight - 15 - ($('#chat_title').outerHeight(true) + $('#chat_chan').outerHeight(true) + $('#chat_room').outerHeight(true) - $('#chat_messages_box').outerHeight(true));
|
||||
if($cb.height() != iMaxHeight)
|
||||
{
|
||||
//$cb.animate({height: maxHeight}, 400, function(){oScrollbar.tinyscrollbar_update('bottom');resizing=false;});
|
||||
$cb.height(iMaxHeight);
|
||||
oScrollbar.tinyscrollbar_update('bottom');
|
||||
}
|
||||
};
|
||||
|
||||
//Disconnect from the chat
|
||||
databap.onQuit = function()
|
||||
{
|
||||
if(databap.tmp('refresh') == false) databap.getSyncInfo('disconnect_chat');
|
||||
databap.vars.chans_list = {};
|
||||
if(typeof oChatTimer != "undefined") clearTimeout(oChatTimer);
|
||||
if(typeof oUserTimer != "undefined") clearTimeout(oUserTimer);
|
||||
};
|
||||
|
||||
databap.onKeyDown = function(e)
|
||||
{
|
||||
if(e.keyCode == 116) databap.tmp('refresh', true);
|
||||
else databap.tmp('refresh', false);
|
||||
};
|
||||
|
||||
//Sidebar
|
||||
databap.getMainElem('.sidebar_box_title').click
|
||||
(
|
||||
function()
|
||||
{
|
||||
$(this).toggleClass('round')
|
||||
.closest('.sidebar_box').find('.sidebar_box_content').toggle('fast', function(){databap.resizeMain('true');});
|
||||
}
|
||||
);
|
||||
|
||||
//Help
|
||||
databap.getMainElem('#help_open').click(displayHelp);
|
||||
//Init sidebar events
|
||||
initSideBar();
|
||||
|
||||
//Init's end
|
||||
databap.setInitEnd(true);
|
||||
};
|
||||
|
||||
//On resize
|
||||
databap.onResize = function()
|
||||
{
|
||||
self.setScrollBarSize('maximize');
|
||||
|
||||
//Message Input
|
||||
$('#message').width($('#chat_input').width() - $('#message_img').outerWidth(true)- 1);
|
||||
};
|
||||
|
||||
//Disconnect from the chat
|
||||
databap.onQuit = function()
|
||||
{
|
||||
if(databap.tmp('refresh') == false) databap.getSyncInfo('disconnect_chat');
|
||||
databap.vars.chans_list = {};
|
||||
if(typeof oChatTimer != "undefined") clearTimeout(oChatTimer);
|
||||
if(typeof oUserTimer != "undefined") clearTimeout(oUserTimer);
|
||||
return true;
|
||||
};
|
||||
|
||||
databap.onKeyDown = function(e)
|
||||
{
|
||||
if(e.keyCode == 116) databap.tmp('refresh', true);
|
||||
else databap.tmp('refresh', false);
|
||||
};
|
||||
|
||||
function initSideBar()
|
||||
{
|
||||
//Sidebar Events
|
||||
$('#sidebar').find('.sidebar_box_title').click
|
||||
(
|
||||
function()
|
||||
{
|
||||
$This = $(this);
|
||||
if(!$This.closest('.sidebar_box').find('.sidebar_box_content').is(":visible"))
|
||||
{
|
||||
$('#sidebar').find('.sidebar_box_title').not($This)
|
||||
.addClass('round')
|
||||
.closest('.sidebar_box').find('.sidebar_box_content')
|
||||
.hide('fast');
|
||||
|
||||
$This
|
||||
.toggleClass('round')
|
||||
.closest('.sidebar_box').find('.sidebar_box_content')
|
||||
.toggle('fast', function()
|
||||
{
|
||||
databap.resizeMain('true');
|
||||
switch($(this).attr('id'))
|
||||
{
|
||||
case 'help_open': $('#help_open').click(); break;
|
||||
case 'news': getNews(); break;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
$('#sidebar').find('.sidebar_box_title').eq(0).click();
|
||||
|
||||
//Help
|
||||
databap.getMainElem('#help_open').click(displayHelp);
|
||||
}
|
||||
|
||||
function getNews()
|
||||
{
|
||||
if(typeof databap.tmp('news_timer') != "undefined") clearTimeout(databap.tmp('news_timer'));
|
||||
var $NewsBox = $('#news');
|
||||
if($NewsBox.is(':visible'))
|
||||
{
|
||||
databap.getInfo
|
||||
(
|
||||
'news',
|
||||
function(asNews)
|
||||
{
|
||||
$.each(asNews.news, function(ikey, asNew)
|
||||
{
|
||||
$('<div>', {'class':'new'}).hide()
|
||||
.append($('<p>')
|
||||
.append($('<i>', {'class':'fa fa-inline fa-30 fa-c-news'}))
|
||||
.append($('<span>').text(asNew.message)))
|
||||
.append($('<p>', {'class':'signature'})
|
||||
.text('—'+asNew.nickname)
|
||||
.append('<br />')
|
||||
.append($('<span>', {'class':'news_time'}).text(asNew.time_desc)))
|
||||
.appendTo($NewsBox);
|
||||
});
|
||||
|
||||
$NewsBox.find('.loading').hide();
|
||||
$NewsBox.find('.new').toggle();
|
||||
$NewsBox.find('.new:hidden').remove();
|
||||
|
||||
//Request in 10mins
|
||||
databap.tmp('news_timer', setTimeout(getNews, databap.tmp('news_period')));
|
||||
},
|
||||
{},
|
||||
'json'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function onPageFocus()
|
||||
{
|
||||
databap.vars.focus=true;
|
||||
@@ -176,31 +229,47 @@ function onPageBlur()
|
||||
|
||||
function setChanButton()
|
||||
{
|
||||
var sAddChanText = '+';
|
||||
$JoinButton = $('#join_chan');
|
||||
if($JoinButton.text() == sAddChanText)
|
||||
{
|
||||
$JoinButton
|
||||
.addClass('active')
|
||||
.empty()
|
||||
.append($('<span>#<input type="text" id="input_chan" class="round" /></span>'))
|
||||
.find('#input_chan').focus().keyup
|
||||
(
|
||||
function(e)
|
||||
$('#join_chan')
|
||||
//.click(function(){$('#join_chan_button').click();})
|
||||
.append
|
||||
(
|
||||
$('<span>', {id:'join_chan_button'})
|
||||
.click(function()
|
||||
{
|
||||
if(e.keyCode == 13)
|
||||
{
|
||||
setChanButton();
|
||||
joinChan($(this).val());
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
else $JoinButton
|
||||
.empty()
|
||||
.text(sAddChanText)
|
||||
.removeClass('active')
|
||||
.click(function(){setChanButton();});
|
||||
$(this).hide();
|
||||
$('#join_chan_input').css('display', '');
|
||||
$('#join_chan').addClass('active').find('#input_chan').focus();
|
||||
})
|
||||
.append(' ')
|
||||
.append($('<i>', {'class':'fa fa-c-plus'}))
|
||||
.append(' ')
|
||||
)
|
||||
.append
|
||||
(
|
||||
$('<span>', {id:'join_chan_input'})
|
||||
.text('#')
|
||||
.append
|
||||
(
|
||||
$('<input>', {type:'text', id:'input_chan', 'class':'round'})
|
||||
.keyup(function(e)
|
||||
{
|
||||
if(e.keyCode == 13)
|
||||
{
|
||||
var $This = $(this);
|
||||
joinChan($This.val());
|
||||
$This.val('');
|
||||
|
||||
}
|
||||
if(typeof e.keyCode == 'undefined' || e.keyCode == 13)
|
||||
{
|
||||
$('#join_chan_input').css('display', 'none');
|
||||
$('#join_chan_button').show();
|
||||
$('#join_chan').removeClass('active');
|
||||
}
|
||||
})
|
||||
.blur(function(){$(this).keyup();})
|
||||
).hide()
|
||||
);
|
||||
}
|
||||
|
||||
function getChanKeyName(sChanName)
|
||||
@@ -306,7 +375,7 @@ function switchChan(sChanKeyName)
|
||||
//Show current channel messages
|
||||
databap.getMainElem('#chat_messages').find('p').hide();
|
||||
databap.getMainElem('#chat_messages').find('p.class_'+sChanKeyName+', p.class_'+databap.consts.all_chan_id).show();
|
||||
oScrollbar.tinyscrollbar_update('bottom');
|
||||
databap.updateScrollBar('bottom');
|
||||
|
||||
//Show Current channel members
|
||||
databap.getMainElem('#connected_users').find('p').hide();
|
||||
@@ -358,11 +427,11 @@ function addChanTab(sChanKeyName, sChanName, sChanTabName, bLightUp)
|
||||
//Prepare clickable chan button
|
||||
var sChanQuitId = databap.consts.chanQuitPrefix+sChanKeyName;
|
||||
var sChanUnreadId = databap.consts.chanUnreadPrefix+sChanKeyName;
|
||||
var $ChanButton = $('<span id="'+sChanId+'" class="chan clickable round_top'+(bLightUp?' light_up':'')+'">#</span>')
|
||||
var $ChanButton = $('<span id="'+sChanId+'" class="chan clickable inc_border round_top'+(bLightUp?' light_up':'')+'">#</span>')
|
||||
.click(function(){$(this).removeClass('light_up');joinChan(databap.vars.chans_list[$(this).attr('id').substr(databap.consts.chanPrefix.length)]);})
|
||||
.append('<span class="chan_title">'+sChanTabName+'</span>')
|
||||
.append('<span class="chan_unread" id="'+sChanUnreadId+'"></span>')
|
||||
.append($('<a id="'+sChanQuitId+'" class="quit_chan clickable">x</a>').click(function(e){e.stopPropagation();quitChan($(this).attr('id').substr(databap.consts.chanQuitPrefix.length));}));
|
||||
.append($('<a id="'+sChanQuitId+'" class="quit_chan clickable"><i class="fa fa-c-close"></i></a>').click(function(e){e.stopPropagation();quitChan($(this).attr('id').substr(databap.consts.chanQuitPrefix.length));}));
|
||||
|
||||
|
||||
//Add channel tab name and bind delete button
|
||||
@@ -418,7 +487,6 @@ function add_message(e)
|
||||
else if(chat_message != '' && databap.tmp('sending_msg') == false) //send
|
||||
{
|
||||
databap.tmp('sending_msg', true);
|
||||
//debug(databap.tmp('sending_msg'));
|
||||
databap.saveForm
|
||||
(
|
||||
'add_message',
|
||||
@@ -426,7 +494,6 @@ function add_message(e)
|
||||
function(id)
|
||||
{
|
||||
databap.tmp('sending_msg', false);
|
||||
//debug(databap.tmp('sending_msg'));
|
||||
refresh_chat();
|
||||
},
|
||||
true
|
||||
@@ -455,6 +522,11 @@ function add_message(e)
|
||||
}
|
||||
break;
|
||||
case 9 : //tab
|
||||
/* Action Plan
|
||||
- Detect current caret position : $this.getCursorPosition()
|
||||
- Find word wrapped around cursor : while loop until non alphanum char before and after caret position
|
||||
-
|
||||
*/
|
||||
//Init
|
||||
$this = databap.getMainElem('#message');
|
||||
var chat_message = $.trim($this.val());
|
||||
@@ -465,6 +537,7 @@ function add_message(e)
|
||||
|
||||
//Finding last word
|
||||
var last_word = (chat_message.lastIndexOf(" ")==-1)?chat_message:chat_message.substr(chat_message.lastIndexOf(" ") + 1);
|
||||
debug(last_word);
|
||||
if(last_word.substr(0, 1)=='@') last_word = last_word.substr(1);
|
||||
|
||||
var last_word_len = last_word.length;
|
||||
@@ -540,7 +613,7 @@ function refresh_chat(bReset)
|
||||
{
|
||||
var bReset = (typeof bReset != 'undefined' && bReset == true);
|
||||
if(typeof oChatTimer != "undefined") clearTimeout(oChatTimer);
|
||||
if(databap.vars.current_page == databap.pages.chat)
|
||||
if(databap.vars.current_page == 'chat')
|
||||
{
|
||||
if(!databap.vars.loading)
|
||||
{
|
||||
@@ -579,7 +652,7 @@ function refresh_chat(bReset)
|
||||
//Nicknames changes
|
||||
if(updateUsersList === true || prevLastMsgId == 0)
|
||||
{
|
||||
oScrollbar.tinyscrollbar_update('bottom');
|
||||
databap.updateScrollBar('bottom');
|
||||
refresh_users();
|
||||
updateUsersList = false;
|
||||
}
|
||||
@@ -605,27 +678,35 @@ function refresh_chat(bReset)
|
||||
|
||||
function addMessage(message_info, bReset)
|
||||
{
|
||||
message_info.nickname = message_info.nickname || '';
|
||||
|
||||
var sChanKeyName = message_info.id_chan;
|
||||
var sMsgPrefix = '<a class="user clickable" title="Ecrire un PM à '+message_info.nickname+'">'+message_info.nickname+'</a><span class="console">></span>';
|
||||
var msg_body = '';
|
||||
|
||||
switch(message_info.msg_class)
|
||||
{
|
||||
case 'U':
|
||||
msg_body = '<a class="user clickable" title="Ecrire un PM à '+message_info.nickname+'">'+message_info.nickname+'</a><span class="console">></span><span class="text">'+message_info.message+'</span>';
|
||||
msg_body = sMsgPrefix+'<span class="text">'+message_info.message+'</span>';
|
||||
break;
|
||||
case 'NW':
|
||||
if(!bReset) getNews();
|
||||
msg_body = '<span class="text action">'+message_info.nickname+' a une news : <span class="news"><i class="fa fa-30 fa-c-news"></i> '+message_info.message+' <i class="fa fa-30 fa-c-news"></i></span></span>';
|
||||
break;
|
||||
case 'A':
|
||||
var url = databap.getCodeLink(message_info.message);
|
||||
var url = databap.getInternalLink('code', message_info.message);
|
||||
msg_body = '<span class="text">'+message_info.nickname+' a ajouté un nouveau code : <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
|
||||
break;
|
||||
case 'E':
|
||||
var url = databap.getCodeLink(message_info.message);
|
||||
var url = databap.getInternalLink('code', message_info.message);
|
||||
msg_body = '<span class="text">'+message_info.nickname+' a modifié le code <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
|
||||
break;
|
||||
case 'PA':
|
||||
var url = databap.getProcLink(message_info.message);
|
||||
var url = databap.getInternalLink('proc', message_info.message);
|
||||
msg_body = '<span class="text">'+message_info.nickname+' a ajouté une nouvelle procédure : <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
|
||||
break;
|
||||
case 'PE':
|
||||
var url = databap.getProcLink(message_info.message);
|
||||
var url = databap.getInternalLink('proc', message_info.message);
|
||||
msg_body = '<span class="text">'+message_info.nickname+' a modifié la procédure <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
|
||||
break;
|
||||
case 'M':
|
||||
@@ -647,24 +728,25 @@ function addMessage(message_info, bReset)
|
||||
break;
|
||||
case 'I':
|
||||
var msg = '<a href="'+message_info.message[3]+'" target="_blank"><img src="'+message_info.message[0]+'" width="'+message_info.message[1]+'" height="'+message_info.message[2]+'" class="proxy"></a>';
|
||||
msg_body = '<a class="user clickable" title="Ecrire un PM à '+message_info.nickname+'">'+message_info.nickname+'</a><span class="console">></span><span class="text">'+msg+'</span>';
|
||||
msg_body = sMsgPrefix+'<span class="text">'+msg+'</span>';
|
||||
break;
|
||||
case '9':
|
||||
var msg = '<a href="'+message_info.message.url+'" target="_blank" title="'+message_info.message.title+'"><img src="'+message_info.message.url_img+'" width="'+message_info.message.width+'" height="'+message_info.message.height+'" class="proxy" /></a>';
|
||||
msg_body = '<a class="user clickable" title="Ecrire un PM à '+message_info.nickname+'">'+message_info.nickname+'</a><span class="console">></span><span class="text">'+msg+'</span>';
|
||||
msg_body = sMsgPrefix+'<span class="text">'+msg+'</span>';
|
||||
break;
|
||||
case 'R':
|
||||
if(!bReset)
|
||||
{
|
||||
msg_body = '<span class="text action">'+message_info.message+'</span>';
|
||||
setTimeout('databap.tmp(\'refresh\', true);databap.goTo(databap.vars.current_page);', databap.consts.reboot_delay*1000);
|
||||
setTimeout(databap.refresh, databap.consts.reboot_delay*1000);
|
||||
}
|
||||
break;
|
||||
case 'V':
|
||||
if(!bReset) joinChan(sChanKeyName, false, [], false);
|
||||
break;
|
||||
case 'B':
|
||||
msg_body = '<span class="text action">Nouvel article sur le blog BI de SAP : <a href="'+databap.getExternalLink('a', message_info.message)+'" target="_blank">'+message_info.art_title+'</a> ';
|
||||
var url = databap.getInternalLink('a', message_info.message);
|
||||
msg_body = '<span class="text action">Nouvel article sur le blog BI de SAP : <a href="'+url+'" target="_blank">'+message_info.art_title+'</a> ';
|
||||
msg_body+= 'par <a title="Lien vers la page de l\'auteur" href="'+message_info.link_auth+'" target="_blank">'+message_info.name+'</a> ('+message_info.art_date+')'+'</span>';
|
||||
break;
|
||||
case 'S':
|
||||
@@ -672,13 +754,21 @@ function addMessage(message_info, bReset)
|
||||
msg_body = '<span class="text action">'+message_info.nickname+' '+message_info.message+'</span>';
|
||||
break;
|
||||
case 'DA':
|
||||
var url = databap.getExternalLink('doc', message_info.message);
|
||||
var url = databap.getInternalLink('doc', message_info.message);
|
||||
msg_body = '<span class="text">'+message_info.nickname+' a ajouté une nouvelle documentation : <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
|
||||
break;
|
||||
case 'DE':
|
||||
var url = databap.getExternalLink('doc', message_info.message);
|
||||
var url = databap.getInternalLink('doc', message_info.message);
|
||||
msg_body = '<span class="text">'+message_info.nickname+' a modifié la documentation <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
|
||||
break;
|
||||
case 'TA':
|
||||
var url = databap.getInternalLink('table', message_info.message);
|
||||
msg_body = '<span class="text">'+message_info.nickname+' a ajouté une nouvelle table : <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
|
||||
break;
|
||||
case 'TE':
|
||||
var url = databap.getInternalLink('table', message_info.message);
|
||||
msg_body = '<span class="text">'+message_info.nickname+' a modifié la table <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
|
||||
break;
|
||||
}
|
||||
|
||||
if(msg_body != '')
|
||||
@@ -693,7 +783,7 @@ function addMessage(message_info, bReset)
|
||||
function refresh_users()
|
||||
{
|
||||
if(typeof oUserTimer != "undefined") clearTimeout(oUserTimer);
|
||||
if(databap.vars.current_page == databap.pages.chat)
|
||||
if(databap.vars.current_page == 'chat')
|
||||
{
|
||||
var delay = databap.consts.keep_alive / 10; //seconds
|
||||
databap.getInfo
|
||||
@@ -713,19 +803,20 @@ function refresh_users()
|
||||
$.each
|
||||
(
|
||||
chan_info,
|
||||
function(id_user, user_info)
|
||||
function(key, user_info)
|
||||
{
|
||||
var sNickName = user_info.nickname.replace('"', '\'');
|
||||
users_list.push(sNickName);
|
||||
var afk = (user_info.afk=='1')?'<img src="'+databap.consts.app_image_folder+'afk.png" class="afk" />':'';
|
||||
var profileLink = databap.getExternalLink('profil', user_info.id_user);
|
||||
var mission = 'Mission actuelle : '+user_info.status;
|
||||
var profileLink = databap.getInternalLink('profil', user_info.id_user);
|
||||
var mission = 'Mission actuelle : '+(user_info.status || 'Aucune');
|
||||
var pm = 'Cliquez pour lancer un channel privé avec '+user_info.name+' ('+user_info.company+')';
|
||||
var user = '<p class="class_'+sChankeyName+'">'
|
||||
+'<a href="'+profileLink+'" title="'+mission+'" target="_blank"><img src="'+databap.consts.app_image_folder+user_info.logo+'" style="vertical-align:middle" />'+afk+'</a>'
|
||||
+'<a class="connectedUser clickable '+sNickName+'" id="'+user_info.id_user+'" title="'+pm+'">'+sNickName+'</a>'
|
||||
+'</p>';
|
||||
$user = $(user).css("visibility", "hidden");
|
||||
var user = $('<p>', {'class':'connected_user class_'+sChankeyName})
|
||||
.append($('<a>', {'class':'connected_user_logo', href:profileLink, title:mission, target:'_blank'})
|
||||
.append($('<img>', {src:databap.consts.app_image_folder+user_info.logo}))
|
||||
.append((user_info.afk=='1')?$('<i>', {class:'fa fa-c-afk afk'}):''))
|
||||
.append($('<a>', {'class':'connected_user_name clickable '+sNickName, id:user_info.id_user, title:pm}).text(sNickName));
|
||||
|
||||
$user = $(user)/*.css("visibility", "hidden")*/;
|
||||
$user.find('.connectedUser').click(joinPmChan);
|
||||
databap.getMainElem('#connected_users').append($user);
|
||||
}
|
||||
@@ -734,7 +825,7 @@ function refresh_users()
|
||||
);
|
||||
|
||||
//Resize Nickname
|
||||
var iMaxSize = 126 - 24 - 5; //boxSize - imageSize - marginLeftSize
|
||||
/*var iMaxSize = 126 - 24 - 5; //boxSize - imageSize - marginLeftSize
|
||||
$.each
|
||||
(
|
||||
users_list,
|
||||
@@ -751,7 +842,7 @@ function refresh_users()
|
||||
$nick.parent().css("visibility", "visible");
|
||||
});
|
||||
}
|
||||
);
|
||||
);*/
|
||||
|
||||
switchChan();
|
||||
},
|
||||
@@ -793,9 +884,15 @@ function displayHelp()
|
||||
|
||||
//Visible on all channels
|
||||
$Help.find('p').addClass('class_'+databap.consts.all_chan_id);
|
||||
$Help.appendTo('#chat_messages').slideDown('fast', function(){oScrollbar.tinyscrollbar_update('bottom');});
|
||||
$Help.appendTo('#chat_messages').slideDown('fast', function()
|
||||
{
|
||||
databap.updateScrollBar('bottom');
|
||||
});
|
||||
|
||||
//Close button activation
|
||||
$Help.find('#close_help').click(function(){$(this).closest('.help').slideUp('fast', function(){oScrollbar.tinyscrollbar_update('bottom');});});
|
||||
$Help.find('#close_help').click(function(){$(this).closest('.help').slideUp('fast', function()
|
||||
{
|
||||
databap.updateScrollBar('bottom');
|
||||
});});
|
||||
}
|
||||
</script>
|
||||
330
masks/code.html
Normal file
@@ -0,0 +1,330 @@
|
||||
<div id="add_code_container">
|
||||
<form id="add_code" name="add_code">
|
||||
<div class="loggued">
|
||||
<textarea id="content" name="content" class="round"></textarea>
|
||||
</div>
|
||||
<table id="extra_data" style="display:none;">
|
||||
<tr>
|
||||
<td>Description</td>
|
||||
<td><input type="text" name="description" id="description" class="round" maxlength="200" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lien (facultatif)</td>
|
||||
<td>
|
||||
<input type="text" name="link" id="link" class="round" maxlength="200" />
|
||||
<span id="available_phrase" class="round"><i class="fa fa-30 fa-inline"></i><span id="available_phrase_text"></span></span>
|
||||
<span id="link_result" class="share round"><i class="fa fa-inline fa-30 fa-c-share"></i><span id="link_result_text"></span></span>
|
||||
<input type="hidden" name="link_escaped" id="link_escaped" value="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr><td colspan="2" class="last" id="button_box"></td></tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
<div id="reader">
|
||||
<div id="code_menu"></div>
|
||||
<div id="previous_versions" class="standalone"></div>
|
||||
<div id="reader_box"><div id="reader_subbox" style="margin-top:10px;"><div id="code_container"></div></div></div>
|
||||
<div id="next_versions" class="standalone"></div>
|
||||
<div id="edit_container" class="side_margins">
|
||||
<form name="edit_code" id="edit_code">
|
||||
<textarea id="content" name="content" class="round"></textarea>
|
||||
<input type="hidden" id="id" name="id" value="" />
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
databap.pageInit = function()
|
||||
{
|
||||
self.tmp('started', false);
|
||||
self.tmp('add', $('#add_code_container'));
|
||||
self.tmp('read', $('#reader'));
|
||||
|
||||
var bEdit = (self.vars.id > 0 || self.vars.id!='');
|
||||
self.tmp('add').toggle(!bEdit);
|
||||
self.tmp('read').toggle(bEdit);
|
||||
|
||||
var fOnFinish = function(){databap.setInitEnd(true);};
|
||||
bEdit?initReadCode(fOnFinish):initAddCode(fOnFinish);
|
||||
};
|
||||
|
||||
databap.onResize = function()
|
||||
{
|
||||
//Add Code
|
||||
self.maximizeElem(self.tmp('add').find('#content'));
|
||||
|
||||
//Read Code
|
||||
self.setScrollBarSize('optimize');
|
||||
};
|
||||
|
||||
databap.onQuit = function(){ return (self.tmp('started') === false); };
|
||||
|
||||
/* Add Code */
|
||||
|
||||
function initAddCode(fOnFinish)
|
||||
{
|
||||
//Tmp
|
||||
databap.tmp('last_val', 'string');
|
||||
|
||||
//content
|
||||
databap.tmp('add').find('#content')
|
||||
.addDefaultValue(databap.consts.add_code_text)
|
||||
.one('keydown', function()
|
||||
{
|
||||
//Block exit
|
||||
databap.tmp('started', true);
|
||||
|
||||
//Add other fields
|
||||
var $ExtraBox = databap.tmp('add').find('#extra_data');
|
||||
if($ExtraBox.is(':hidden')) $(this).animate({'height':'-='+$ExtraBox.show().outerHeight(true)});
|
||||
});
|
||||
|
||||
//Button
|
||||
databap.tmp('add').find('#button_box').addButton('ok', 'Envoyer', add_code, 'add_code_btn', 'heavy');
|
||||
|
||||
//link phrase
|
||||
databap.tmp('add').find('#link').bind
|
||||
(
|
||||
'keyup',
|
||||
function()
|
||||
{
|
||||
$link = databap.tmp('add').find('#link_result_text');
|
||||
var link = $.trim($(this).val());
|
||||
var escaped_link = link.replace(/ /g, '_');
|
||||
if(escaped_link!=databap.tmp('last_val'))
|
||||
{
|
||||
databap.tmp('last_val', escaped_link);
|
||||
$link.text(databap.getInternalLink('code', escaped_link, true));
|
||||
databap.tmp('add').find('#link_escaped').val(escaped_link);
|
||||
if(escaped_link!='') checkUrlAvailability($.trim(escaped_link));
|
||||
else databap.tmp('add').find('#link_result').add(databap.tmp('add').find('#available_phrase')).hide('fast');
|
||||
}
|
||||
}
|
||||
);
|
||||
fOnFinish();
|
||||
}
|
||||
|
||||
//submit
|
||||
function add_code()
|
||||
{
|
||||
var code = self.tmp('add').find('#content').val();
|
||||
|
||||
if
|
||||
(
|
||||
code!=databap.consts.add_code_text &&
|
||||
code!='' &&
|
||||
self.tmp('add').find('#description').val()!=''
|
||||
)
|
||||
{
|
||||
databap.saveForm
|
||||
(
|
||||
'add_code',
|
||||
self.tmp('add').find('#add_code'),
|
||||
function(iCodeId)
|
||||
{
|
||||
var link = self.tmp('add').find('#link_escaped').val();
|
||||
databap.tmp('started', false);
|
||||
databap.goToInternalLink('code', iCodeId);
|
||||
},
|
||||
true
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
databap.addErrorBefore('Tous les champs ne sont pas remplis', self.tmp('add').find('#add_code_btn'));
|
||||
}
|
||||
}
|
||||
|
||||
function checkUrlAvailability(phrase, bTriggered)
|
||||
{
|
||||
if(bTriggered == true)
|
||||
{
|
||||
databap.getInfo
|
||||
(
|
||||
'url',
|
||||
function(bExist)
|
||||
{
|
||||
var availabilityClass, availabilityText;
|
||||
var $link = databap.getMainElem('#link_result');
|
||||
if(bExist=='0')
|
||||
{
|
||||
availabilityClass = 'available';
|
||||
availabilityText = 'Disponible';
|
||||
if($link.is(':hidden')) $link.show('fast');
|
||||
}
|
||||
else
|
||||
{
|
||||
availabilityClass = 'unavailable';
|
||||
availabilityText = 'Indisponible';
|
||||
if($link.is(':visible')) $link.hide('fast');
|
||||
}
|
||||
var $AvailableBox = databap.getMainElem('#available_phrase');
|
||||
$AvailableBox
|
||||
.removeClass('available unavailable')
|
||||
.addClass(availabilityClass);
|
||||
$AvailableBox.find('#available_phrase_text').text(availabilityText);
|
||||
$AvailableBox.show('fast');
|
||||
},
|
||||
{link_escaped:phrase},
|
||||
'html',
|
||||
function(){},
|
||||
true
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
databap.addBufferIcon();
|
||||
if(typeof oCheckLinkTimer != "undefined") clearTimeout(oCheckLinkTimer);
|
||||
oCheckLinkTimer = setTimeout(function(){checkUrlAvailability(phrase, true);}, 500);
|
||||
}
|
||||
}
|
||||
|
||||
/* Read Code */
|
||||
|
||||
function initReadCode(fOnFinish)
|
||||
{
|
||||
databap.tmp('edit_btn', 'object');
|
||||
databap.initScrollBar('#reader_box', '#reader_subbox', '#code_container');
|
||||
databap.setCodeContainer
|
||||
(
|
||||
function()
|
||||
{
|
||||
databap.getInfo
|
||||
(
|
||||
'read_code',
|
||||
function(jContent)
|
||||
{
|
||||
//append code to main and refresh id
|
||||
databap.appendCode(databap.tmp('read').find('#code_reader'), jContent);
|
||||
|
||||
if(typeof jContent.other_versions !== 'undefined')
|
||||
{
|
||||
//Truncated versions
|
||||
if(jContent.truncated)
|
||||
{
|
||||
var $Truncated = $(databap.consts.versionHtml);
|
||||
$Truncated.find('#item_link')
|
||||
.text('...')
|
||||
.prop('href', databap.getInternalLink('code', jContent.truncated))
|
||||
.prop('title', 'Afficher les versions masquées');
|
||||
databap.tmp('read').find('#previous_versions').append($Truncated);
|
||||
}
|
||||
|
||||
//Display other versions
|
||||
$.each
|
||||
(
|
||||
jContent.other_versions,
|
||||
function(key, code_info)
|
||||
{
|
||||
$verHtml = $(databap.consts.versionHtml);
|
||||
$verHtml.find('#description').html(code_info.description);
|
||||
$verHtml.find('i.fa').addClass('fa-c-code');
|
||||
$verHtml.find('#author_name').html(code_info.name);
|
||||
$verHtml.find('#author_company').html(code_info.company);
|
||||
$verHtml.find('#led').html(code_info.led);
|
||||
$verHtml.find('#item_link').prop('href', databap.getInternalLink('code', code_info.id_code)).prop('title', 'Afficher cette version du code');
|
||||
|
||||
$verHtml = databap.setElemTags($verHtml, code_info.id_code);
|
||||
var anchor = '#'+((parseInt(code_info.id_code) < parseInt(databap.vars.id))?'previous':'next')+'_versions';
|
||||
databap.tmp('read').find(anchor).append($verHtml);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
//Buttons
|
||||
databap.tmp('read').find('#code_menu')
|
||||
.addButton('edit', 'Modifier', edit, 'edit', '', 'edit_btn')
|
||||
.addButton('raw', 'Fichier brut', databap.getActionLink('raw_code', {id:databap.vars.phrase}), 'raw')
|
||||
.addButton('save', 'Télécharger', databap.getActionLink('dl_code', {id:databap.vars.phrase}), 'save')
|
||||
.addButton('print', 'Imprimer', databap.getActionLink('print_code', {id:databap.vars.phrase}), 'edit')
|
||||
.addButton('share', 'Partager', function(){databap.shareEvent('code', databap.vars.phrase);}, 'share');
|
||||
|
||||
//expanding
|
||||
databap.tmp('read').find("input").click(function(){expand($(this));});
|
||||
databap.tmp('read').find("#code_container input[id^=expand_loop]").hover
|
||||
(
|
||||
function()
|
||||
{
|
||||
databap.tmp('read').find('.'+$(this).attr('id').substr(7)).toggleClass('code_hover');
|
||||
}
|
||||
);
|
||||
|
||||
//Edit Buttons
|
||||
databap.tmp('read').find('#edit_container').addButton('ok', 'Corriger', valid_edit, 'edit_btn');
|
||||
|
||||
fOnFinish();
|
||||
},
|
||||
{id:databap.vars.id},
|
||||
'json',
|
||||
function(){},
|
||||
true
|
||||
);
|
||||
},
|
||||
'#code_container'
|
||||
);
|
||||
}
|
||||
|
||||
//Button actions
|
||||
function edit()
|
||||
{
|
||||
if(databap.tmp('read').find('#content').val()=='')
|
||||
{
|
||||
//make space for edit box
|
||||
databap.tmp('read').find('#previous_versions, #next_versions, #reader_box').slideUp('fast');
|
||||
|
||||
databap.getInfo
|
||||
(
|
||||
'nude_code',
|
||||
function(data)
|
||||
{
|
||||
databap.vars.old_code = data;
|
||||
databap.tmp('read').find('#content').val(databap.vars.old_code);
|
||||
databap.tmp('read').find('#id').val(databap.vars.id);
|
||||
databap.tmp('read').find('#edit_container').show('fast', function(){databap.maximizeElem(databap.tmp('read').find('#content'));});
|
||||
databap.tmp('edit_btn').find('.icon').attr('class', 'icon fa fa-c-c'); //TODO add to standard code
|
||||
databap.tmp('edit_btn').find('.value').text('Afficher');
|
||||
},
|
||||
{id:databap.vars.id}
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
//display other versions
|
||||
databap.tmp('read').find('#previous_versions, #reader_box, #next_versions').slideDown('fast');
|
||||
databap.tmp('read').find('#'+databap.getElemTag('tab_left', databap.vars.id)).height('auto');
|
||||
databap.tmp('read').find('#content').add('#id').val('');
|
||||
databap.tmp('read').find('#edit_container').hide('fast');
|
||||
databap.tmp('edit_btn').find('.icon').attr('class', 'icon fa fa-c-edit');
|
||||
databap.tmp('edit_btn').find('.value').text('Modifier');
|
||||
}
|
||||
}
|
||||
function valid_edit()
|
||||
{
|
||||
code = databap.tmp('read').find('textarea#content').val();
|
||||
if(code !='')
|
||||
{
|
||||
if(code != databap.vars.old_code)
|
||||
{
|
||||
databap.saveForm
|
||||
(
|
||||
'edit_code',
|
||||
databap.tmp('read').find('#edit_code'),
|
||||
function(iCodeId)
|
||||
{
|
||||
databap.vars.old_code = '';
|
||||
databap.goToInternalLink('code', iCodeId);
|
||||
},
|
||||
true
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
databap.addWarningBefore('Aucune modification n\'a été effectuée', databap.tmp('edit_btn'));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
databap.addErrorBefore('Le champ code est vide', databap.tmp('edit_btn'));
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -1,5 +1,5 @@
|
||||
<div id="code_reader" class="code_reader round">
|
||||
<div id="author_box" class="author_box round_top"><span id="description"></span> • <span id="author_name"></span> (<span id="author_company"></span>) • <span id="led"></span></div>
|
||||
[#]item[#]
|
||||
<div id="tab_left" class="tab_left round_bottom">
|
||||
<form name="code_form" id="code_form">
|
||||
<pre><ol id="code_lines" class="code_lines round_right">Chargement du code...</ol></pre>
|
||||
|
||||
106
masks/doc.html
@@ -1,26 +1,26 @@
|
||||
<div id="doc">
|
||||
<div class="h1_wrap">
|
||||
<h1 class="round"><span>Documentation</span></h1>
|
||||
</div>
|
||||
<div id="doc_container">
|
||||
<div id="titles_edit" class="hide">
|
||||
<form id="doc_form" name="doc_form">
|
||||
<div id="title_edit" class="step_box round">
|
||||
<p class="step_nb_box">Titre</p>
|
||||
<input type="text" name="title" id="title" class="step_line_item round" maxlength="200" value="" />
|
||||
<input type="text" name="title" id="title" class="step_line_item inc_border round" maxlength="200" value="" />
|
||||
</div>
|
||||
<div id="desc_edit" class="step_box round">
|
||||
<p class="step_nb_box">Description</p>
|
||||
<input type="text" name="description" id="description" class="step_line_item round" maxlength="500" value="" />
|
||||
<input type="text" name="description" id="description" class="step_line_item inc_border round" maxlength="500" value="" />
|
||||
</div>
|
||||
<div id="attach_file"></div>
|
||||
<div id="doc_menu"><span id="submit_doc" class="button ok round">Valider</span></div>
|
||||
<div id="desc_edit" class="step_box round">
|
||||
<p class="step_nb_box">Fichiers</p>
|
||||
<div id="attach_file"></div>
|
||||
</div>
|
||||
<div id="doc_menu"><a id="submit_doc" class="button round"><i class="fa fa-c-ok"></i>Valider</a></div>
|
||||
</form>
|
||||
</div>
|
||||
<div id="titles_read" class="step_box round hide">
|
||||
<p class="read_title"><span id="titles_read_title"></span></p>
|
||||
<p class="read_details">Créé par <span id="titles_read_user"></span> (<span id="titles_read_company"></span>) le <span id="titles_read_led"></span></p>
|
||||
<p class="read_description"><span id="titles_read_description"></span></p>
|
||||
<p class="read_description"><i class="fa fa-c-desc"></i><span id="titles_read_description"></span></p>
|
||||
</div>
|
||||
<div id="docs_read" class="step_box round hide">
|
||||
<p class="step_nb_box">Documents</p>
|
||||
@@ -28,28 +28,11 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="image_model" class="hide">
|
||||
<span id="image_action">
|
||||
<input type="text" id="image_desc" name="image_desc" class="image_description round" />
|
||||
<input type="hidden" name="image_name" id="image_name" value="" />
|
||||
<input type="button" id="delete_image" class="button delete round" />
|
||||
</span>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
databap.pageInit = function()
|
||||
{
|
||||
//image
|
||||
databap.vars.imageHtml = databap.getMainElem('#image_model').html();
|
||||
|
||||
//On Resize Event
|
||||
databap.onResize = function()
|
||||
{
|
||||
//TODO : to be replaced by tinyscrollbar
|
||||
databap.$main.css('overflow', 'auto');
|
||||
|
||||
var maxWidth = databap.getMainElem('#desc_edit').find('p.step_nb_box').width();
|
||||
databap.getMainElem('#description').width(maxWidth-10);
|
||||
};
|
||||
self.tmp('started', false);
|
||||
self.initScrollBar('#main', '#doc', '#doc_container');
|
||||
|
||||
//load Uploader
|
||||
oUploader = new qq.FileUploader
|
||||
@@ -60,17 +43,17 @@ databap.pageInit = function()
|
||||
allowedExtensions: databap.consts.authorized_file_exts,
|
||||
sizeLimit: parseInt(databap.consts.max_size)*100,
|
||||
addSlideText: 'Glisser les fichier ici',
|
||||
addFileText: 'Ajouter un fichier',
|
||||
debug:true,
|
||||
stepId:1
|
||||
addFileText: 'Ajouter des fichiers',
|
||||
debug: true,
|
||||
stepId: 1
|
||||
}
|
||||
);
|
||||
|
||||
if(databap.vars.doc_id>0)
|
||||
if(databap.vars.id>0)
|
||||
{
|
||||
loadDoc
|
||||
(
|
||||
databap.vars.doc_id,
|
||||
databap.vars.id,
|
||||
function()
|
||||
{
|
||||
databap.setInitEnd(true);
|
||||
@@ -89,6 +72,15 @@ databap.pageInit = function()
|
||||
databap.getMainElem('#submit_doc').click(saveDoc);
|
||||
};
|
||||
|
||||
databap.onResize = function()
|
||||
{
|
||||
self.setScrollBarSize('maximize');
|
||||
//var maxWidth = databap.getMainElem('#desc_edit').find('p.step_nb_box').width();
|
||||
//databap.getMainElem('#description').width(maxWidth-10);
|
||||
};
|
||||
|
||||
databap.onQuit = function(){ return (self.tmp('started') === false); };
|
||||
|
||||
function loadDoc(iDocId, fOnSuccess)
|
||||
{
|
||||
databap.getInfo
|
||||
@@ -103,16 +95,13 @@ function loadDoc(iDocId, fOnSuccess)
|
||||
databap.getMainElem('#titles_read_description').html(doc_info.description);
|
||||
|
||||
//links
|
||||
for(i in doc_info.files)
|
||||
for(var i in doc_info.files)
|
||||
{
|
||||
databap.getMainElem('#doc_links')
|
||||
.append(
|
||||
$('<a>', {title:'Télécharger cette documentation', href:databap.getActionLink('dl_file&id='+i)})
|
||||
.addClass(doc_info.files[i].ext)
|
||||
.text(doc_info.files[i].description)
|
||||
)
|
||||
.append('<br />');
|
||||
|
||||
databap.getMainElem('#doc_links').addButton('file-'+doc_info.files[i].ext+' fa-30',
|
||||
doc_info.files[i].description,
|
||||
databap.getActionLink('dl_file', {id:i}),
|
||||
null,
|
||||
'inverse');
|
||||
}
|
||||
setDisplay('read');
|
||||
fOnSuccess();
|
||||
@@ -133,7 +122,7 @@ function saveDoc()
|
||||
databap.getMainElem('#doc_form'),
|
||||
function(data)
|
||||
{
|
||||
if(data.result == 'success') loadDoc(data.doc_id);
|
||||
if(data.result == 'success') databap.goToInternalLink('doc', data.doc_id);
|
||||
},
|
||||
true,
|
||||
'json'
|
||||
@@ -164,37 +153,4 @@ function setDisplay(sNewMode)
|
||||
}
|
||||
}
|
||||
|
||||
function addImage(stepId, imageId, imageName, imageDesc)
|
||||
{
|
||||
//get image number
|
||||
$ImageBox = databap.getMainElem('#'+databap.getElemTag('uploader_item', [stepId, imageId]));
|
||||
|
||||
//Create new image
|
||||
$newImage = $(databap.vars.imageHtml);
|
||||
|
||||
//Set image name
|
||||
$newImage.find('#image_name').val(imageName);
|
||||
|
||||
//Set image description
|
||||
$newImage.find('#image_desc').val(imageDesc);
|
||||
|
||||
//delete button for this image
|
||||
$newImage.find('#delete_image').click
|
||||
(
|
||||
function()
|
||||
{
|
||||
var stepIds = databap.getElemIds($(this).attr('id'));
|
||||
removeImage(stepIds[0], stepIds[1]);
|
||||
}
|
||||
);
|
||||
|
||||
//Add ids
|
||||
$newImage = databap.setElemTags($newImage, [stepId, imageId]);
|
||||
|
||||
//Add Image to the step
|
||||
$newImage.appendTo($ImageBox);
|
||||
|
||||
return imageId;
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -1,7 +1,4 @@
|
||||
<div id="err_404">
|
||||
<div class="h1_wrap" id="chat_title">
|
||||
<h1 class="round"><span>Page introuvable</span></h1>
|
||||
</div>
|
||||
<p>Sorry Bro!</p>
|
||||
<p><a id="back_to_main" class="button round" href="#">Revenir à la page d'accueil</a></p>
|
||||
</div>
|
||||
|
||||
@@ -1,29 +1,24 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=#text_enc#" />
|
||||
<meta name="author" content="Francois Lutran" />
|
||||
<meta http-equiv="content-type" content="text/html; charset=[#]text_enc[#]" />
|
||||
<meta name="author" content="François Lutran" />
|
||||
<meta name="description" content="Abap database for consultants" />
|
||||
<meta name="keywords" content="ABAP, SAP, BW, BI" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<link rel="shortcut icon" href="images/favicon_gc3.ico" />
|
||||
<link href="index.php?a=css&v=0.94" rel="stylesheet" type="text/css" />
|
||||
<script type="text/javascript" src="jquery/jquery.min.js?v0.94"></script>
|
||||
<!-- <script type="text/javascript" src="jquery/resize.js"></script> -->
|
||||
<script type="text/javascript" src="jquery/tinyscrollbar.js?v0.94"></script>
|
||||
<script type="text/javascript" src="jquery/fileuploader.js?v0.94"></script>
|
||||
<script type="text/javascript" src="jquery/handler.js?v0.94"></script>
|
||||
<link href="style/fa.css?v[#]version[#]" rel="stylesheet" type="text/css" />
|
||||
<link href="index.php?a=css&v=[#]version[#]" rel="stylesheet" type="text/css" />
|
||||
<script type="text/javascript" src="jquery/jquery.min.js?v[#]version[#]"></script>
|
||||
<script type="text/javascript" src="jquery/jquery.mods.js?v[#]version[#]"></script>
|
||||
<script type="text/javascript" src="jquery/fileuploader.js?v[#]version[#]"></script>
|
||||
<script type="text/javascript" src="jquery/common.js?v[#]version[#]"></script>
|
||||
<script type="text/javascript" src="jquery/databap.js?v[#]version[#]"></script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready
|
||||
(
|
||||
function()
|
||||
{
|
||||
//#line_break#databap.vars = {<!-- [PART] VARS [START] -->#var_name# : '#var_value#'#coma#<!-- [PART] VARS [END] -->};
|
||||
//#line_break#databap.pages = {<!-- [PART] PAGES [START] -->#page_name# : '#page_value#'#coma#<!-- [PART] PAGES [END] -->},
|
||||
//#line_break#databap.consts = #constants#;
|
||||
//#line_break#databap.init('#first_page#');
|
||||
}
|
||||
);
|
||||
databap = new Databap();
|
||||
databap.consts = [#]constants[#];
|
||||
databap.vars = [#]variables[#];
|
||||
$(document).ready(databap.init);
|
||||
</script>
|
||||
<title>Databap</title>
|
||||
</head>
|
||||
@@ -34,8 +29,13 @@
|
||||
<div id="header">
|
||||
<table class="maximized">
|
||||
<tr>
|
||||
<td class="cell lefty"><a href="#index_link#" class="logo2"><img src="images/logo_43.png" /></a><!-- <a href="http://www.micropole.com" title="Groupe Micropole" target="_blank" id="micropole" class="title round"><img src="images/logo_mu_25.png" alt="Micropole" /></a> --></td>
|
||||
<td class="cell righty"><form name="form_header" id="form_header"><input type="text" name="query" id="query" class="round_left" /><input type="button" name="search_btn_submit" id="search_btn_submit" value=">" class="clickable round_right" /></form></td>
|
||||
<td class="cell lefty"><a href="[#]index_link[#]" class="logo"><img src="images/logo_43.png" /></a></td>
|
||||
<td class="cell righty">
|
||||
<form name="form_header" id="form_header">
|
||||
<div id="search_btn_submit" class="round_right clickable"><i class="fa fa-c-search"></i></div>
|
||||
<input type="text" name="query" id="query" class="round_left" />
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
@@ -43,26 +43,36 @@
|
||||
<div id="menu_title"><p>m</p><p>e</p><p>n</p><p>u</p></div>
|
||||
<div id="menu_box">
|
||||
<h1 class="title">databap</h1>
|
||||
<ul style="list-style: none;" id="menu_items">
|
||||
<li id="add_ln">Ajouter du code</li>
|
||||
<li id="procedure_ln">Ajouter une procédure</li>
|
||||
<!-- <li id="doc_ln">Doc</li> -->
|
||||
<li id="list_ln">Liste complète</li>
|
||||
<!-- <li id="quick_code_access_ln">N°<input type="text" name="quick_code_access_id" id="quick_code_access_id" class="round" value="code" /></li>-->
|
||||
<li id="profile_ln">Profil</li>
|
||||
<li id="chat_ln">Chat</li>
|
||||
<li id="options_ln">Options</li>
|
||||
<li id="rss_ln"><a href="#rss_link#" target="_blank">Flux Rss</a></li>
|
||||
<li id="log_me_out_ln">Quitter</li>
|
||||
<li id="close_menu_ln" class="mobile">Fermer</li>
|
||||
<ul id="menu_items">
|
||||
<li><a href="#accueil"><i class="fa fa-fw fa-20 fa-c-welcome"></i>Accueil</a></li>
|
||||
<li><a href="#code"><i class="fa fa-fw fa-20 fa-c-code"></i>Ajouter du code</a></li>
|
||||
<li><a href="#procedure"><i class="fa fa-fw fa-20 fa-c-procedure"></i>Ajouter une procédure</a></li>
|
||||
<li><a href="#table"><i class="fa fa-fw fa-20 fa-c-table"></i>Ajouter une table</a></li>
|
||||
<li><a href="#doc"><i class="fa fa-fw fa-20 fa-c-doc"></i>Ajouter une doc</a></li>
|
||||
<li><a href="#liste"><i class="fa fa-fw fa-20 fa-c-list"></i>Liste complète</a></li>
|
||||
<li><a href="#profil"><i class="fa fa-fw fa-20 fa-c-profile"></i>Profil</a></li>
|
||||
<li><a href="#chat"><i class="fa fa-fw fa-20 fa-c-chat"></i>Chat</a></li>
|
||||
<li><a href="#options"><i class="fa fa-fw fa-20 fa-c-options"></i>Paramètres</a></li>
|
||||
<li><a href="[#]rss_link[#]" target="_blank"><i class="fa fa-fw fa-20 fa-c-rss"></i>Flux Rss</a></li>
|
||||
<li><a href="#logout"><i class="fa fa-fw fa-20 fa-c-logmeout"></i>Quitter</a></li>
|
||||
<li class="mobile"><a id="close_menu_ln"><i class="fa fa-fw fa-20 fa-c-fold"></i>Fermer</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a href="#index_link#" class="useless_button round" title="The Secret Useless Button"></a>
|
||||
<a href="[#]index_link[#]" class="useless_button round" title="The Secret Useless Button"></a>
|
||||
</div>
|
||||
<div id="main_container" class="round">
|
||||
<div id="page_title">
|
||||
<div class="h1_wrap side_margins">
|
||||
<h1 class="round">
|
||||
<i class="fa fa-fw fa-20 fa-c-loading fa-spin"></i>
|
||||
<span id="title_text">Chargement...</span>
|
||||
</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main"></div>
|
||||
</div>
|
||||
<div id="main" class="round"></div>
|
||||
<div id="footer">
|
||||
<p><a href="#index_link#">v0.94 Beta</a>. Designed and powered by <a href="mailto:francois@lutran.fr" title="Envoyer un mail">François Lutran</a>.
|
||||
Databap Project under <a href="http://www.gnu.org/licenses/gpl.html" target="_blank">GPLv3</a> License.</p>
|
||||
<p><a href="[#]index_link[#]">v[#]version[#]</a> - Designed and powered by <a href="mailto:francois@lutran.fr" title="Envoyer un mail">François Lutran</a> - Databap Project under <a href="http://www.gnu.org/licenses/gpl.html" target="_blank">GPLv3 License</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
6
masks/item.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<div id="author_box" class="author_box clickable round">
|
||||
<a id="item_link" href="" target="_blank">
|
||||
<i class="fa fa-inline fa-30"></i><span id="description" class="description"></span>
|
||||
<span class="glue-right"><span id="author_name"></span> (<span id="author_company"></span>) • <span id="led"></span></span>
|
||||
</a>
|
||||
</div>
|
||||
@@ -1,27 +1,34 @@
|
||||
<div id="list">
|
||||
<div class="h1_wrap">
|
||||
<h1 class="round"><span>La liste</span></h1>
|
||||
</div>
|
||||
<div id="list_container" class="standalone"></div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
databap.pageInit = function()
|
||||
{
|
||||
//TODO : to be replaced by tinyscrollbar
|
||||
databap.$main.css('overflow', 'auto');
|
||||
self.initScrollBar('#main', '#list', '#list_container');
|
||||
|
||||
databap.getInfo
|
||||
var $ListBox = self.getMainElem('#list_container');
|
||||
self.getInfo
|
||||
(
|
||||
'list',
|
||||
function(items)
|
||||
{
|
||||
for(id in items) databap.appendItem(items[id], databap.getMainElem('#list_container'));
|
||||
for(var id in items)
|
||||
{
|
||||
self.appendItem(items[id], $ListBox, false);
|
||||
}
|
||||
|
||||
//Init's end
|
||||
databap.setInitEnd(true);
|
||||
self.setInitEnd(true);
|
||||
},
|
||||
{},
|
||||
'json'
|
||||
'json',
|
||||
function(){},
|
||||
true
|
||||
);
|
||||
};
|
||||
|
||||
databap.onResize = function()
|
||||
{
|
||||
self.setScrollBarSize('optimize');
|
||||
};
|
||||
</script>
|
||||
@@ -1,32 +1,96 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="author" content="Franzz" />
|
||||
<meta http-equiv="content-type" content="text/html; charset=[#]text_enc[#]" />
|
||||
<meta name="author" content="François Lutran" />
|
||||
<meta name="description" content="Abap database for consultants" />
|
||||
<meta name="keywords" content="ABAP, SAP, BW, BI" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<link rel="shortcut icon" href="images/favicon_gc3.ico" />
|
||||
<link href="style.css" rel="stylesheet" type="text/css" />
|
||||
<link href="style/screen.css?v[#]version[#]" rel="stylesheet" type="text/css" />
|
||||
<link href="style/fa.css?v[#]version[#]" rel="stylesheet" type="text/css" />
|
||||
<script type="text/javascript" src="jquery/jquery.min.js?v[#]version[#]"></script>
|
||||
<script type="text/javascript" src="jquery/common.js?v[#]version[#]"></script>
|
||||
<title>Databap • Logon</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="logon_logo">databap</div>
|
||||
<div id="logon_container">
|
||||
<form id="logon" name="logon" method="post">
|
||||
<div id="logon_box" class="round">
|
||||
<div class="key"></div>
|
||||
<div id="logon">
|
||||
<div class="logo">databap</div>
|
||||
<div class="container">
|
||||
<div class="box round">
|
||||
<div class="key">
|
||||
<i class="fa fa-c-lock"></i>
|
||||
</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td class="desc">Nom et prénom </td>
|
||||
<td class="value"><input type="text" name="auth_name" id="auth_name" class="round" value="#name#" /></td>
|
||||
<td class="desc">Nom & prénom</td>
|
||||
<td class="value"><input type="text" name="auth_name" id="auth_name" class="round" value="" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="desc">Société</td>
|
||||
<td class="value"><input type="password" name="auth_company" class="round" value="#company#" /></td>
|
||||
<td class="desc">Mot de passe</td>
|
||||
<td class="value"><input type="password" name="auth_pass" id="auth_pass" class="round" value="" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="validate">
|
||||
<form id="logon_form" name="logon_form" method="post">
|
||||
<input type="hidden" name="auth_token" id="auth_token" value="" />
|
||||
<span class="feedback">[#]feedback[#]</span>
|
||||
<input type="button" name="log_me_in" id="log_me_in" value="Ok" class="round" />
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
<tr><td colspan="2" class="validate"><input type="submit" name="log_me_in" id="log_me_in" value="Ok" class="round" /></td></tr>
|
||||
</table>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<p>v[#]version[#] - Designed and powered by <a href="mailto:francois@lutran.fr" title="Envoyer un mail">François Lutran</a> - Databap Project under <a href="http://www.gnu.org/licenses/gpl.html" target="_blank">GPLv3 License</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function()
|
||||
{
|
||||
//Events
|
||||
$(window).keyup(function(e){if(e.which==13) logMeIn();});
|
||||
$('#log_me_in').click(logMeIn);
|
||||
});
|
||||
|
||||
//Hashing and sending auth credentials
|
||||
function logMeIn()
|
||||
{
|
||||
var sName = $.trim($('#auth_name').val().toLowerCase()).replace(/ +/g, " ");
|
||||
var sPass = $.trim($('#auth_pass').val());
|
||||
if(sName!='' && sPass!='')
|
||||
{
|
||||
//Buffer
|
||||
$('.key').find('i').removeClass('fa-c-lock').addClass('fa-spin fa-c-loading');
|
||||
$('#auth_token').val(hex_md5(sName)+'[#]name_pass_sep[#]'+getLoginToken(sPass));
|
||||
$('#logon_form').submit();
|
||||
|
||||
//TODO
|
||||
/*var sFormVars = $('#logon_form').serialize();
|
||||
$.ajax
|
||||
(
|
||||
{
|
||||
type: 'POST',
|
||||
url: self.getActionLink(action),
|
||||
data: sFormVars,
|
||||
success:function(result)
|
||||
{
|
||||
$('.key').find('i').removeClass('fa-spin fa-c-loading').addClass('fa-c-lock');
|
||||
if(result.success=='ok') location.reload();
|
||||
else $('.feedback').text('Données incorrectes');
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
debug('Error handler.js 331');
|
||||
self.showError(textStatus);
|
||||
},
|
||||
dataType:'json'
|
||||
}
|
||||
);*/
|
||||
}
|
||||
else $('.feedback').text('Formulaire incomplet');
|
||||
}
|
||||
</script>
|
||||
</html>
|
||||
6
masks/logout.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<div id="logout">
|
||||
<p><i class="fa fa-spin fa-c-loading"></i>Déconnexion...</p>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
self.getInfo('log_me_out', function(){document.location='';});
|
||||
</script>
|
||||
@@ -1,64 +1,47 @@
|
||||
<div id="options">
|
||||
<div class="h1_wrap">
|
||||
<h1 class="round"><span>Options</span></h1>
|
||||
</div>
|
||||
<div id="options_container">
|
||||
<form id="options_form" name="options_form">
|
||||
<div id="options_input" class="round"><p class="loading">Chargement en cours...</p></div>
|
||||
<input type="button" value="Valider" name="options_submit" id="options_submit" class="button heavy round" />
|
||||
</form>
|
||||
<div class="options_box round">
|
||||
<h2><i class="fa fa-c-param fa-inline"></i>Options</h2>
|
||||
<form id="options_form" name="options_form">
|
||||
<div id="options_input">
|
||||
<p class="loading">Chargement en cours...</p>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="options_box round">
|
||||
<h2><i class="fa fa-c-lock fa-inline"></i>Mot de passe</h2>
|
||||
<div id="pass_input"></div>
|
||||
<form id="pass_form" name="pass_form">
|
||||
<input type="hidden" id="old_auth_token" name="old_auth_token" />
|
||||
<input type="hidden" id="new_auth_token" name="new_auth_token" />
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
databap.pageInit = function()
|
||||
{
|
||||
//TODO : to be replaced by tinyscrollbar
|
||||
databap.$main.css('overflow', 'auto');
|
||||
self.initScrollBar('#main', '#options', '#options_container');
|
||||
|
||||
//Display password form
|
||||
addOption('old_pass', {type:'P', option_name:'Mdp Actuel', user_value:''}, $('#pass_input'));
|
||||
addOption('new_pass', {type:'P', option_name:'Nouveau mdp', user_value:''}, $('#pass_input'));
|
||||
addOption('new_pass_conf', {type:'P', option_name:'Confirmation nouveau mdp', user_value:''}, $('#pass_input'));
|
||||
$('#pass_form').addButton('ok', 'Valider', validate_pass, 'validate_pass', 'heavy inverse');
|
||||
|
||||
databap.getInfo
|
||||
(
|
||||
'get_options',
|
||||
function(options)
|
||||
{
|
||||
var selectHtml = '';
|
||||
var optionHtml = '';
|
||||
var nameAndId = '';
|
||||
var selected = '';
|
||||
|
||||
//remove default text
|
||||
$('#options_input').find('.loading').hide();
|
||||
$('#options_input').find('.loading').hide().remove();
|
||||
|
||||
//Display options
|
||||
$.each
|
||||
(
|
||||
options,
|
||||
function(optNameId, optInfo)
|
||||
{
|
||||
optionHtml = '<div class="option_line"><label>'+optInfo.option_name+'</label>';
|
||||
nameAndId = 'id="'+optNameId+'" name="'+optNameId+'"';
|
||||
switch(optInfo.type)
|
||||
{
|
||||
case databap.consts.opt_type_text:
|
||||
optionHtml += '<input type="text" '+nameAndId+' value="'+optInfo.user_value+'" class="round" />';
|
||||
break;
|
||||
case databap.consts.opt_type_select:
|
||||
selectHtml = selected = '';
|
||||
$.each
|
||||
(
|
||||
optInfo.select,
|
||||
function(selectId, selectName)
|
||||
{
|
||||
debug('id='+selectId+selectName);
|
||||
//selected = (optinfo.user_value_id && selectId==optinfo.user_value_id)?' selected':'';
|
||||
selectHtml += '<option value="'+selectId+'"'+selected+'>'+selectName+'</option>';
|
||||
}
|
||||
);
|
||||
optionHtml += '<select '+nameAndId+' class="round">'+selectHtml+'</select>';
|
||||
break;
|
||||
}
|
||||
$(optionHtml+'</div>').appendTo(databap.getMainElem('#options_input')).slideDown('fast');
|
||||
}
|
||||
);
|
||||
//Display options form
|
||||
$.each(options, addOption);
|
||||
|
||||
//Submit button
|
||||
$('#options_form').addButton('ok', 'Valider', validate_options, 'validate_options', 'heavy inverse');
|
||||
|
||||
//Init's end
|
||||
databap.setInitEnd(true);
|
||||
@@ -68,26 +51,86 @@ databap.pageInit = function()
|
||||
function(){},
|
||||
true
|
||||
);
|
||||
|
||||
databap.getMainElem('#options_submit').click
|
||||
(
|
||||
function()
|
||||
{
|
||||
databap.saveForm
|
||||
(
|
||||
'set_options',
|
||||
databap.getMainElem('#options_form'),
|
||||
function(result)
|
||||
{
|
||||
databap.addSuccessIcon();
|
||||
databap.goTo('options');
|
||||
},
|
||||
'#options_submit'
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
var warning = '<p class="warning">Attention : Une fois la sélection validée, la page se rafraichira automatiquement</p>';
|
||||
databap.getMainElem('#options_container').append(warning);
|
||||
};
|
||||
|
||||
databap.onResize = function()
|
||||
{
|
||||
self.setScrollBarSize('maximize');
|
||||
};
|
||||
|
||||
function addOption(optNameId, optInfo, $Box)
|
||||
{
|
||||
$Box = $Box || $('#options_input');
|
||||
var selected = '';
|
||||
var $Option = $('<div>', {'class':'option_line'}).append($('<p>').text(optInfo.option_name));
|
||||
switch(optInfo.type)
|
||||
{
|
||||
case databap.consts.opt_type_text:
|
||||
$Option.append($('<input>', {type:'text', id:optNameId, name:optNameId, value:optInfo.user_value, 'class':'round'}));
|
||||
break;
|
||||
case databap.consts.opt_type_pass:
|
||||
$Option.append($('<input>', {type:'password', id:optNameId, name:optNameId, value:optInfo.user_value, 'class':'round'}));
|
||||
break;
|
||||
case databap.consts.opt_type_select:
|
||||
var $Select = $('<select>', {id:optNameId, name:optNameId, 'class':'round'}).appendTo($Option);
|
||||
$.each
|
||||
(
|
||||
optInfo.select,
|
||||
function(selectId, selectName)
|
||||
{
|
||||
$Select
|
||||
.append($('<option>', {value:selectId})
|
||||
.prop('selected', (selectId==optInfo.user_value_id))
|
||||
.text(selectName));
|
||||
}
|
||||
);
|
||||
break;
|
||||
}
|
||||
$Option.appendTo($Box).slideDown('fast');
|
||||
}
|
||||
|
||||
function validate_options()
|
||||
{
|
||||
databap.saveForm
|
||||
(
|
||||
'set_options',
|
||||
databap.getMainElem('#options_form'),
|
||||
function(result)
|
||||
{
|
||||
databap.addSuccessIcon();
|
||||
location.reload();
|
||||
},
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
function validate_pass()
|
||||
{
|
||||
sButtonId = '#validate_pass';
|
||||
var sOldPass = $.trim($('#old_pass').val());
|
||||
var sNewPass = $.trim($('#new_pass').val());
|
||||
|
||||
if(sOldPass=='') databap.addErrorBefore('Mdp actuel manquant', sButtonId);
|
||||
else if(sNewPass=='') databap.addErrorBefore('Mdp vide non autorisé', sButtonId);
|
||||
else if(sNewPass!=$('#new_pass').val()) databap.addErrorBefore('Pas de blanc dans le mdp', sButtonId);
|
||||
else if(sNewPass!=$('#new_pass_conf').val()) databap.addErrorBefore('Les nouveaux mdp ne coïncident pas', sButtonId);
|
||||
else if(sNewPass==sOldPass) databap.addErrorBefore('Le nouveau mdp est le même que l\'actuel', sButtonId);
|
||||
else
|
||||
{
|
||||
$('#old_auth_token').val(getLoginToken(sOldPass));
|
||||
$('#new_auth_token').val(getLoginToken(sNewPass));
|
||||
databap.saveForm
|
||||
(
|
||||
'set_pass',
|
||||
databap.getMainElem('#pass_form'),
|
||||
function(data)
|
||||
{
|
||||
if(data.result==databap.consts.success) databap.addSuccessBefore(data.desc, sButtonId);
|
||||
else databap.addErrorBefore(data.desc, sButtonId);
|
||||
},
|
||||
true,
|
||||
'json'
|
||||
);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -1,37 +1,41 @@
|
||||
<div id="procedure">
|
||||
<div class="h1_wrap">
|
||||
<h1 class="round"><span>Procédure</span></h1>
|
||||
</div>
|
||||
<form id="procedure_form" name="procedure_form">
|
||||
<input type="hidden" id="procedure_id" name="procedure_id" value="0" />
|
||||
<div class="proc_menu" id="top_menu">
|
||||
<span id="top_switch" class="button switch round"><span class="mode_read hide">Aperçu</span><span class="mode_edit hide" class="hide">Modifier</span></span>
|
||||
<a id="share" class="button share round">Partager</a>
|
||||
</div>
|
||||
<div id="titles_edit" class="hide">
|
||||
<div id="procedure_title" class="step_box round">
|
||||
<p class="step_nb_box">Titre</p>
|
||||
<input type="text" name="title" id="title" class="step_line_item round" maxlength="200" value="" />
|
||||
<div id="procedure_box">
|
||||
<div id="procedure">
|
||||
<form id="procedure_form" name="procedure_form">
|
||||
<input type="hidden" id="procedure_id" name="procedure_id" value="0" />
|
||||
<div class="proc_menu" id="top_menu">
|
||||
<a id="top_switch" class="button round">
|
||||
<i class="fa fa-c-switch"></i>
|
||||
<span class="mode_read hide">Aperçu</span>
|
||||
<span class="mode_edit hide" class="hide">Modifier</span>
|
||||
</a>
|
||||
<a id="share" class="button round"><i class="fa fa-c-share"></i>Partager</a>
|
||||
</div>
|
||||
<div id="procedure_desc" class="step_box round">
|
||||
<p class="step_nb_box">Description</p>
|
||||
<input type="text" name="description" id="description" class="step_line_item round" maxlength="500" value="" />
|
||||
<div id="titles_edit" class="hide">
|
||||
<div id="procedure_title" class="step_box round">
|
||||
<p class="step_nb_box">Titre</p>
|
||||
<input type="text" name="title" id="title" class="step_line_item inc_border round" maxlength="200" value="" />
|
||||
</div>
|
||||
<div id="procedure_desc" class="step_box round">
|
||||
<p class="step_nb_box">Description</p>
|
||||
<input type="text" name="description" id="description" class="step_line_item inc_border round" maxlength="500" value="" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="titles_read" class="step_box round hide">
|
||||
<p class="read_title"><span id="titles_read_title"></span></p>
|
||||
<p class="read_details">Créé par <span id="titles_read_user"></span> (<span id="titles_read_company"></span>) le <span id="titles_read_led"></span></p>
|
||||
<p class="read_description"><span id="titles_read_description"></span></p>
|
||||
</div>
|
||||
<div id="procedure_steps"></div>
|
||||
<div class="proc_menu" id="bottom_menu">
|
||||
<span id="add_step" class="button add round">Ajouter une étape</span>
|
||||
<span id="submit_procedure" class="button ok round">Valider</span>
|
||||
<span id="bottom_switch" class="button switch round"><span class="mode_read">Aperçu</span><span class="mode_edit" class="hide">Modifier</span></span>
|
||||
</div>
|
||||
</form>
|
||||
<div id="slider" class="round hide">
|
||||
<div id="slider_close" class="innerBorder clickable round"><img id="slider_image" src="images/processing_48.gif" /></div>
|
||||
<div id="titles_read" class="step_box round hide">
|
||||
<p class="read_title"><span id="titles_read_title"></span></p>
|
||||
<p class="read_details">Créé par <span id="titles_read_user"></span> (<span id="titles_read_company"></span>) le <span id="titles_read_led"></span></p>
|
||||
<p class="read_description"><span id="titles_read_description"></span></p>
|
||||
</div>
|
||||
<div id="procedure_steps"></div>
|
||||
<div class="proc_menu" id="bottom_menu">
|
||||
<a id="add_step" class="button round"><i class="fa fa-c-add"></i>Ajouter une étape</a>
|
||||
<a id="submit_procedure" class="button round"><i class="fa fa-c-ok"></i>Valider</a>
|
||||
<a id="bottom_switch" class="button round">
|
||||
<i class="fa fa-c-switch"></i>
|
||||
<span class="mode_read">Aperçu</span>
|
||||
<span class="mode_edit" class="hide">Modifier</span>
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div id="models" class="hide">
|
||||
@@ -49,23 +53,18 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="step_buttons">
|
||||
<span id="insert_step_before" class="button add round" title="Insérer une étape avant celle-ci">Insérer une étape avant</span>
|
||||
<span id="insert_step_after" class="button add round" title="Insérer une étape après celle-ci">Insérer une étape après</span>
|
||||
<span id="delete_step" class="button delete delete_step_button round">Supprimer l'étape</span>
|
||||
<a id="insert_step_before" class="button round" title="Insérer une étape avant celle-ci"><i class="fa fa-c-up"></i>Insérer une étape avant</a>
|
||||
<a id="insert_step_after" class="button round" title="Insérer une étape après celle-ci"><i class="fa fa-c-down"></i>Insérer une étape après</a>
|
||||
<a id="delete_step" class="button round"><i class="fa fa-c-delete"></i>Supprimer l'étape</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div id="image_model">
|
||||
<span id="image_action">
|
||||
<input type="text" id="image_desc" name="image_desc" class="image_description round" />
|
||||
<input type="hidden" name="image_name" id="image_name" value="" />
|
||||
<input type="button" id="delete_image" class="button delete round" />
|
||||
</span>
|
||||
</div>
|
||||
<div id="thumbnail_model">
|
||||
<p class="thumbnail_box">
|
||||
<img class="thumbnail_image round clickable" src="" title="Cliquer pour agrandir" />
|
||||
<a class="original_image" rel="lightbox" href="" title="">
|
||||
<img class="thumbnail_image round clickable" alt="" src="" />
|
||||
</a>
|
||||
<span class="thumbnail_desc"></span>
|
||||
</p>
|
||||
</div>
|
||||
@@ -73,16 +72,16 @@
|
||||
<script type="text/javascript">
|
||||
databap.pageInit = function()
|
||||
{
|
||||
//TODO : to be replaced by tinyscrollbar
|
||||
databap.$main.css('overflow', 'auto');
|
||||
databap.vars.mode = '';
|
||||
self.tmp('started', false);
|
||||
self.initScrollBar('#main', '#procedure_box', '#procedure');
|
||||
|
||||
//Get step HTML
|
||||
databap.vars.stepHtml = databap.getMainElem('#step_model').html();
|
||||
databap.vars.imageHtml = databap.getMainElem('#image_model').html();
|
||||
databap.vars.thumbnailHtml = databap.getMainElem('#thumbnail_model').html();
|
||||
self.vars.stepHtml = self.getMainElem('#step_model').html();
|
||||
self.vars.thumbnailHtml = self.getMainElem('#thumbnail_model').html();
|
||||
|
||||
//Get user data
|
||||
databap.getUserInfo
|
||||
self.getUserInfo
|
||||
(
|
||||
function(data)
|
||||
{
|
||||
@@ -92,8 +91,9 @@ databap.pageInit = function()
|
||||
);
|
||||
|
||||
//Add titles
|
||||
databap.getMainElem('#procedure_title').show('fast');
|
||||
databap.getMainElem('#procedure_desc').show('fast', resizeDescription);
|
||||
$('#procedure_title').add('#procedure_desc')
|
||||
.one('keydown', function(){databap.tmp('started', true);})
|
||||
.show('fast', resizeDescription);
|
||||
|
||||
//Init steps and images
|
||||
curStep = 0;
|
||||
@@ -101,63 +101,49 @@ databap.pageInit = function()
|
||||
uploaders = {};
|
||||
|
||||
//Add new step
|
||||
var $StepBox = databap.getMainElem('#add_step');
|
||||
var $StepBox = self.getMainElem('#add_step');
|
||||
$StepBox.click(function(){addStep();});
|
||||
|
||||
//submit
|
||||
databap.getMainElem('#submit_procedure').click(saveProcedure);
|
||||
self.getMainElem('#submit_procedure').click(saveProcedure);
|
||||
|
||||
//Set display
|
||||
databap.getMainElem('#bottom_switch,#top_switch').click(function(){setDisplay();});
|
||||
databap.getMainElem('#share').click
|
||||
(
|
||||
function()
|
||||
{
|
||||
var iProcId = getProcId();
|
||||
if(iProcId>0)
|
||||
{
|
||||
$(this)
|
||||
.hide()
|
||||
.text(databap.getProcLink(iProcId))
|
||||
.addClass('addr')
|
||||
.slideDown('fast')
|
||||
.unbind('click');
|
||||
}
|
||||
}
|
||||
);
|
||||
if(databap.vars.proc_id>0)
|
||||
self.getMainElem('#bottom_switch,#top_switch').click(function(){setDisplay();});
|
||||
self.getMainElem('#share').click(function(){self.shareEvent('proc', getProcId());});
|
||||
|
||||
if(self.vars.id>0)
|
||||
{
|
||||
loadProcedure
|
||||
(
|
||||
databap.vars.proc_id,
|
||||
self.vars.id,
|
||||
function()
|
||||
{
|
||||
//Init's end
|
||||
databap.setInitEnd(true);
|
||||
self.setInitEnd(true);
|
||||
}
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
setDisplay('edit');
|
||||
self.setInitEnd(true);
|
||||
$StepBox.trigger('click');
|
||||
}
|
||||
|
||||
//Slider
|
||||
oSlider = new Slider();
|
||||
databap.onResize = function()
|
||||
{
|
||||
oSlider.resizeImage();
|
||||
resizeDescription();
|
||||
};
|
||||
databap.onKeyUp = function(e){if(e.keyCode==27)oSlider.quit();};
|
||||
};
|
||||
|
||||
databap.onResize = function()
|
||||
{
|
||||
self.setScrollBarSize('optimize');
|
||||
resizeDescription();
|
||||
};
|
||||
|
||||
databap.onQuit = function(){ return (self.tmp('started') === false); };
|
||||
|
||||
function resizeDescription()
|
||||
{
|
||||
//width adjustement
|
||||
var maxWidth = databap.getMainElem('#procedure_desc').find('p.step_nb_box').width();
|
||||
databap.getMainElem('#description').width(maxWidth-10);
|
||||
//databap.getMainElem('#description').width(maxWidth-10);
|
||||
}
|
||||
|
||||
function setDisplay(sNewMode)
|
||||
@@ -214,9 +200,11 @@ function setDisplay(sNewMode)
|
||||
databap.vars.mode = sNewMode;
|
||||
|
||||
//Change switch button
|
||||
//databap.getMainElem('#mode_'+sNewMode).hide('fast', function(){databap.getMainElem('#mode_'+sOldMode).show('fast');});
|
||||
|
||||
databap.getMainElem('#bottom_switch,#top_switch').find('.mode_'+sNewMode).hide('fast', function(){$(this).parent().find('.mode_'+sOldMode).show('fast');});
|
||||
|
||||
//Resize scrollbar & description
|
||||
databap.updateScrollBar();
|
||||
resizeDescription();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,29 +253,15 @@ function setThumbnails(bShow)
|
||||
$Thumbnail.find('.thumbnail_image').attr('title', 'Image introuvable');
|
||||
}
|
||||
$Thumbnail.find('.thumbnail_image').attr('src', sThumbnailUrl);
|
||||
//$Thumbnail.find('.thumbnail_image').attr('alt', sImageName);
|
||||
|
||||
$Thumbnail.find('.original_image')
|
||||
.attr('href', getImageUrl(basename($Thumbnail.find('.thumbnail_image').attr('src'))))
|
||||
.attr('rel', 'lightbox[step_'+iStepId+']')
|
||||
.attr('title', sImageDesc);
|
||||
|
||||
//Add image description
|
||||
$Thumbnail.find('.thumbnail_desc').text(sImageDesc);
|
||||
$Thumbnail.hide().appendTo($ThumbnailsBox).show
|
||||
(
|
||||
function()
|
||||
{
|
||||
//add event listener : Enlarge picture
|
||||
$Thumbnail.find('.thumbnail_image').click
|
||||
(
|
||||
function()
|
||||
{
|
||||
$this = $(this);
|
||||
var sImageUrl = getImageUrl(basename($this.attr('src')));
|
||||
if(sImageUrl!='')
|
||||
{
|
||||
oSlider.startSlider(sImageUrl);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
$Thumbnail.hide().appendTo($ThumbnailsBox).show();
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -314,109 +288,16 @@ function getImageUrl(sImageName, bThumbnail)
|
||||
return '';
|
||||
}
|
||||
|
||||
function Slider()
|
||||
{
|
||||
//Variables
|
||||
this.$Slider = databap.getMainElem('#slider');
|
||||
this.$SliderImage = this.$Slider.find('#slider_image');
|
||||
var self = this;
|
||||
|
||||
//Methods
|
||||
this.resizeImage = function()
|
||||
{
|
||||
//max size
|
||||
var maxWidth = databap.consts.maxWidth - 60; //5*2*2 border + 20*2 margin
|
||||
var maxHeight = databap.consts.maxHeight - 60;
|
||||
$image = self.$SliderImage.css({'width':'auto', 'height':'auto'});
|
||||
var image_height = $image.height();
|
||||
var image_width = $image.width();
|
||||
//debug('max H : '+maxHeight+', max W : '+maxWidth)
|
||||
//debug('H : '+image_height+', W : '+image_width)
|
||||
if(image_width > maxWidth || image_height > maxHeight)
|
||||
{
|
||||
if(image_width > maxWidth)
|
||||
{
|
||||
image_height = maxWidth / image_width * image_height;
|
||||
image_width = maxWidth;
|
||||
}
|
||||
if(image_height > maxHeight)
|
||||
{
|
||||
image_width = maxHeight / image_height * image_width;
|
||||
image_height = maxHeight;
|
||||
}
|
||||
//debug('new H : '+image_height+', new W : '+image_width)
|
||||
$image.css({'width':image_width+'px', 'height':image_height+'px'});
|
||||
}
|
||||
var sliderLeftPos = (databap.consts.maxWidth - self.$Slider.width())/2 - 5;
|
||||
var sliderTopPos = (databap.consts.maxHeight - self.$Slider.height())/2 - 5;
|
||||
self.$Slider.css({'left':sliderLeftPos, 'top':sliderTopPos});
|
||||
};
|
||||
|
||||
this.startSlider = function(sImageUrl)
|
||||
{
|
||||
//this.$Slider.find('#slider_image').animate({width:'auto', height:'auto'});
|
||||
this.$Slider.show();
|
||||
this.$SliderImage.attr('src', sImageUrl).css({'width':'auto', 'height':'auto'});
|
||||
};
|
||||
|
||||
this.quit = function()
|
||||
{
|
||||
self.$Slider.hide();
|
||||
};
|
||||
|
||||
//Bindings
|
||||
this.$Slider.find('#slider_close').click(this.quit);
|
||||
this.$SliderImage.resize(this.resizeImage);
|
||||
//this.$SliderImage.load(function(){debug('load');});
|
||||
}
|
||||
|
||||
function addImage(stepId, imageId, imageName, imageDesc)
|
||||
{
|
||||
//get image number
|
||||
$ImageBox = databap.getMainElem('#'+databap.getElemTag('uploader_item', [stepId, imageId]));
|
||||
|
||||
//Create new image
|
||||
$newImage = $(databap.vars.imageHtml);
|
||||
|
||||
//Set image name
|
||||
$newImage.find('#image_name').val(imageName);
|
||||
|
||||
//Set image description
|
||||
$newImage.find('#image_desc').val(imageDesc);
|
||||
|
||||
//delete button for this image
|
||||
$newImage.find('#delete_image').click
|
||||
(
|
||||
function()
|
||||
{
|
||||
var stepIds = databap.getElemIds($(this).attr('id'));
|
||||
removeImage(stepIds[0], stepIds[1]);
|
||||
}
|
||||
);
|
||||
|
||||
//Add ids
|
||||
$newImage = databap.setElemTags($newImage, [stepId, imageId]);
|
||||
|
||||
//Add Image to the step
|
||||
$newImage.appendTo($ImageBox);
|
||||
|
||||
return imageId;
|
||||
}
|
||||
|
||||
function addStep(stepId, sPosition, sDesc)
|
||||
{
|
||||
//Set Step Count
|
||||
iCurrentStep = '0';
|
||||
|
||||
//Build new Step
|
||||
$StepBox = databap.getMainElem('#procedure_steps');
|
||||
var $step = $(databap.vars.stepHtml);
|
||||
|
||||
//Add Step text
|
||||
if(sDesc)
|
||||
{
|
||||
$step.find('#step_text').val(sDesc);
|
||||
}
|
||||
if(sDesc) $step.find('#step_text').val(sDesc);
|
||||
|
||||
//Insert new step before this step
|
||||
$step.find('#insert_step_before').click
|
||||
@@ -450,10 +331,7 @@ function addStep(stepId, sPosition, sDesc)
|
||||
|
||||
//Append to page
|
||||
$step.hide();
|
||||
if(!stepId)
|
||||
{
|
||||
$step.appendTo(databap.getMainElem('#procedure_steps'));
|
||||
}
|
||||
if(!stepId) $step.appendTo(databap.getMainElem('#procedure_steps'));
|
||||
else
|
||||
{
|
||||
var $elem = databap.getMainElem('#'+databap.getElemTag('step', stepId));
|
||||
@@ -473,36 +351,22 @@ function addStep(stepId, sPosition, sDesc)
|
||||
|
||||
//Add Image Uploader
|
||||
var iStepId = databap.getFirstElemId($step.attr('id'));
|
||||
|
||||
var sImageBoxId = databap.getElemTag('step_images', iStepId);
|
||||
uploaders[iStepId] = new qq.FileUploader
|
||||
(
|
||||
{
|
||||
element: document.getElementById(sImageBoxId),
|
||||
action: databap.getActionLink('upload_image'),
|
||||
allowedExtensions: databap.consts.authorized_img_exts,
|
||||
sizeLimit: parseInt(databap.consts.max_size)*100,
|
||||
debug: false,
|
||||
stepId: iStepId
|
||||
}
|
||||
);
|
||||
var asOptions = { element: document.getElementById(sImageBoxId),
|
||||
action: databap.getActionLink('upload_image'),
|
||||
allowedExtensions: databap.consts.authorized_img_exts,
|
||||
sizeLimit: parseInt(databap.consts.max_size)*100,
|
||||
debug: false,
|
||||
stepId: iStepId};
|
||||
|
||||
uploaders[iStepId] = new qq.FileUploader(asOptions);
|
||||
$step.show('fast', function(){databap.setInitEnd(true);});
|
||||
|
||||
databap.updateScrollBar();
|
||||
return iStepId;
|
||||
}
|
||||
|
||||
function removeImage(iStepId, iImageId)
|
||||
{
|
||||
var sImageTag = databap.getElemTag('uploader_item', [iStepId, iImageId]);
|
||||
databap.getMainElem('#'+sImageTag).hide
|
||||
(
|
||||
'fast',
|
||||
function()
|
||||
{
|
||||
$(this).remove();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function removeStep(iStepId)
|
||||
{
|
||||
//debug('removing step '+iStepId);
|
||||
@@ -516,6 +380,7 @@ function removeStep(iStepId)
|
||||
delete uploaders[databap.getFirstElemId($this.attr('id'))];
|
||||
$this.remove();
|
||||
recalculateStepNb();
|
||||
databap.updateScrollBar();
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -531,7 +396,7 @@ function recalculateStepNb()
|
||||
|
||||
//Get current and new step id
|
||||
var iStepId = databap.getFirstElemId($step.attr('id'));
|
||||
var iNewStepId = iRank+1;
|
||||
var iNewStepId = iRank + 1;
|
||||
|
||||
//Update step id
|
||||
databap.setElemTags($step, [iNewStepId], true);
|
||||
@@ -570,7 +435,6 @@ function saveProcedure()
|
||||
{
|
||||
if(checkProcedure())
|
||||
{
|
||||
//debug(databap.getMainElem('#procedure_form').find('input,textarea'));
|
||||
databap.saveForm
|
||||
(
|
||||
'add_procedure',
|
||||
@@ -585,7 +449,12 @@ function saveProcedure()
|
||||
|
||||
databap.addSuccessBefore('La procédure est enregistrée', '#bottom_menu');
|
||||
databap.addSuccessIcon();
|
||||
setDisplay('read');
|
||||
//setDisplay('read');
|
||||
|
||||
//Unblock exit
|
||||
databap.tmp('started', false);
|
||||
|
||||
databap.goToInternalLink('proc', proc_info.proc_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -659,6 +528,7 @@ function loadProcedure(iProcId, fOnSuccess)
|
||||
}
|
||||
}
|
||||
);
|
||||
databap.tmp('started', false);
|
||||
}
|
||||
else $form.find('#title').val('Introuvable !');
|
||||
|
||||
@@ -666,7 +536,7 @@ function loadProcedure(iProcId, fOnSuccess)
|
||||
setDisplay('read');
|
||||
fOnSuccess();
|
||||
},
|
||||
{proc_id:iProcId},
|
||||
{id:iProcId},
|
||||
'json',
|
||||
function(textStatus)
|
||||
{
|
||||
@@ -1,21 +1,19 @@
|
||||
<div id="profile">
|
||||
<div class="h1_wrap">
|
||||
<h1 class="round"><span>Profil</span></h1>
|
||||
</div>
|
||||
<div id="avatar" class="clickable round"></div>
|
||||
<div class="user round">
|
||||
<p>Nom : <span id="profile_name"></span></p>
|
||||
<p>Société : <span id="profile_company"></span></p>
|
||||
<p>Mission actuelle : <span id="profile_assignment"></span></p>
|
||||
<p><i class="fa fa-fw fa-c-name"></i>Nom : <span id="profile_name"></span></p>
|
||||
<p><i class="fa fa-fw fa-c-company"></i>Société : <img id="profile_company_logo" /><span id="profile_company"></span></p>
|
||||
<p><i class="fa fa-fw fa-c-assignment"></i>Mission actuelle : <span id="profile_assignment"></span></p>
|
||||
</div>
|
||||
<p class="user_history_title">Historique</p>
|
||||
<div id="user_history" class="round hide"></div>
|
||||
<div>
|
||||
<div id="history_box"><div id="history_subbox" class="round"><div id="user_history"></div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
databap.pageInit = function()
|
||||
{
|
||||
//TODO : to be replaced by tinyscrollbar
|
||||
databap.$main.css('overflow', 'auto');
|
||||
databap.initScrollBar('#history_box', '#history_subbox', '#user_history');
|
||||
|
||||
databap.getInfo
|
||||
(
|
||||
@@ -23,12 +21,13 @@ databap.pageInit = function()
|
||||
function(profile)
|
||||
{
|
||||
//user info
|
||||
databap.getMainElem('#profile_name').text(profile.name);
|
||||
databap.getMainElem('#profile_company').text(profile.company);
|
||||
databap.getMainElem('#profile_assignment').text(profile.status);
|
||||
databap.getMainElem('#profile_name').text(profile.user.name);
|
||||
databap.getMainElem('#profile_company').text(profile.user.company);
|
||||
databap.getMainElem('#profile_company_logo').attr('src', databap.consts.app_image_folder+profile.user.logo).attr('alt', profile.user.logo);
|
||||
databap.getMainElem('#profile_assignment').text(profile.user.status || 'Aucune');
|
||||
|
||||
//Profile link
|
||||
databap.getMainElem('#avatar').click(function(){alert(databap.getExternalLink('p', profile.nickname));});
|
||||
databap.getMainElem('#avatar').click(function(){alert(databap.getInternalLink('p', profile.user.nickname, true));});
|
||||
|
||||
//user history
|
||||
$UserHistory = databap.getMainElem('#user_history');
|
||||
@@ -37,22 +36,33 @@ databap.pageInit = function()
|
||||
$.each
|
||||
(
|
||||
profile.history,
|
||||
function(id_code, code_info)
|
||||
function(led, item)
|
||||
{
|
||||
var url = databap.getCodeLink(code_info.phrase);
|
||||
var code = $('<p class="history_line">'+code_info.date+' - '+code_info.action+' : <a href="'+url+'" title="'+code_info.phrase+'" target="_blank">'+code_info.description+'</a></p>');
|
||||
$UserHistory.append(code);
|
||||
var iItemId = item.id;
|
||||
var sUrl = databap.getInternalLink(item.type, iItemId);
|
||||
var $Code = $('<p>', {'class':'history_line'})
|
||||
.append(item.date+' - '+item.action+' :')
|
||||
.append($('<a>', {href:sUrl, title:'Lien vers le document', target:'_blank'})
|
||||
.append($('<i>', {'class':'fa fa-c-'+item.type}))
|
||||
.append(item.title));
|
||||
|
||||
$UserHistory.append($Code);
|
||||
}
|
||||
);
|
||||
$UserHistory.show('fast', function(){databap.setInitEnd(true);});
|
||||
databap.getMainElem('#history_subbox').show('fast', function(){databap.setInitEnd(true);});
|
||||
}
|
||||
else
|
||||
{
|
||||
databap.setInitEnd(true);
|
||||
}
|
||||
},
|
||||
{user:databap.vars.profile_user},
|
||||
{id:databap.vars.id},
|
||||
'json'
|
||||
);
|
||||
};
|
||||
|
||||
databap.onResize = function()
|
||||
{
|
||||
self.setScrollBarSize('optimize');
|
||||
}
|
||||
</script>
|
||||
17
masks/raw_code.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=[#]text_enc[#]" />
|
||||
<meta name="author" content="[#]author[#]" />
|
||||
<link rel="shortcut icon" href="images/favicon_gc3.ico" />
|
||||
<title>Databap •</title>
|
||||
</head>
|
||||
<body>
|
||||
<pre id="content"></pre>
|
||||
<script>
|
||||
document.getElementById("content").textContent = [#]content[#];
|
||||
document.title = document.title+" "+[#]title[#];
|
||||
if([#]print[#]) window.print();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,178 +0,0 @@
|
||||
<div id="reader">
|
||||
<div class="h1_wrap">
|
||||
<h1 class="round"><span>Revue de code</span></h1>
|
||||
</div>
|
||||
<div id="code_menu">
|
||||
<a id="edit" class="button round">Modifier</a>
|
||||
<a id="raw" class="button round" href="#" target="_blank">Fichier brut</a>
|
||||
<a id="save" class="button round" href="#">Télécharger</a>
|
||||
<a id="print" class="button round" href="#" target="_blank">Imprimer</a>
|
||||
<a id="share" class="button share round">Partager</a>
|
||||
</div>
|
||||
<div id="previous_versions" class="standalone"></div>
|
||||
<div id="code_container"></div>
|
||||
<div id="next_versions" class="standalone"></div>
|
||||
<div id="edit_container">
|
||||
<div class="h1_wrap">
|
||||
<form name="edit_code" id="edit_code">
|
||||
<textarea id="content" name="content" class="round"></textarea>
|
||||
<input type="hidden" id="code" name="code" value="" />
|
||||
</form>
|
||||
<a id="edit_btn" class="button heavy round">Corriger</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
databap.pageInit = function()
|
||||
{
|
||||
//TODO : to be replaced by tinyscrollbar
|
||||
databap.$main.css('overflow', 'auto');
|
||||
|
||||
databap.setCodeContainer
|
||||
(
|
||||
function()
|
||||
{
|
||||
databap.getInfo
|
||||
(
|
||||
'read_code',
|
||||
function(jContent)
|
||||
{
|
||||
//debug(jContent);
|
||||
//append code to main and refresh id
|
||||
databap.appendCode('#code_reader', jContent);
|
||||
|
||||
if(typeof jContent.other_versions !== 'undefined')
|
||||
{
|
||||
if(jContent.truncated)
|
||||
{
|
||||
var $Truncated = $(databap.consts.versionHtml);
|
||||
$Truncated.data('id_code', jContent.truncated).click(function(){databap.loadReadPage($(this).data('id_code'));});
|
||||
$Truncated.find('#item_link').text('...');
|
||||
$('#previous_versions').append($Truncated);
|
||||
}
|
||||
$.each
|
||||
(
|
||||
jContent.other_versions,
|
||||
function(key, code_info)
|
||||
{
|
||||
$verHtml = $(databap.consts.versionHtml).data('id_code', code_info.id_code).click(function(){databap.loadReadPage($(this).data('id_code'));});
|
||||
|
||||
$verHtml.find('#description').html(code_info.description);
|
||||
$verHtml.find('#author_name').html(code_info.name);
|
||||
$verHtml.find('#author_company').html(code_info.company);
|
||||
$verHtml.find('#led').html(code_info.led);
|
||||
$verHtml.find('#item_link').attr('target', '').attr('title', 'Afficher cette version du code');
|
||||
|
||||
$verHtml = databap.setElemTags($verHtml, code_info.id_code);
|
||||
var anchor = '#'+((parseInt(code_info.id_code) < parseInt(databap.vars.code))?'previous':'next')+'_versions';
|
||||
$(anchor).append($verHtml);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
//expanding
|
||||
$("input").click(function(){expand($(this));});
|
||||
$("#code_container input[id^=expand_loop]").hover
|
||||
(
|
||||
function()
|
||||
{
|
||||
$('.'+$(this).attr('id').substr(7)).toggleClass('code_hover');
|
||||
}
|
||||
);
|
||||
|
||||
//action links
|
||||
$("#edit").click
|
||||
(
|
||||
function()
|
||||
{
|
||||
if($('#content').val()=='')
|
||||
{
|
||||
//make space for edit box
|
||||
databap.getMainElem('#previous_versions,#next_versions').slideUp
|
||||
(
|
||||
'fast',
|
||||
function()
|
||||
{
|
||||
$code_container = $('#'+databap.getElemTag('tab_left', databap.vars.code));
|
||||
$code_container.css('overflow', 'auto').height(Math.min($code_container.height(), 200));
|
||||
}
|
||||
);
|
||||
|
||||
databap.getInfo
|
||||
(
|
||||
'nude_code',
|
||||
function(data)
|
||||
{
|
||||
databap.vars.old_code = data;
|
||||
$('#content').val(databap.vars.old_code);
|
||||
$('#code').val(databap.vars.code);
|
||||
$('#edit_container').show('fast');
|
||||
},
|
||||
{code:databap.vars.code}
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
databap.getMainElem('a#raw').attr('href', databap.getActionLink('raw_code', {code:databap.vars.phrase}));
|
||||
databap.getMainElem('a#save').attr('href', databap.getActionLink('dl_code', {code:databap.vars.phrase}));
|
||||
databap.getMainElem('a#print').attr('href', databap.getActionLink('print_code', {code:databap.vars.phrase}));
|
||||
databap.getMainElem('#share').click
|
||||
(
|
||||
function()
|
||||
{
|
||||
$(this)
|
||||
.hide()
|
||||
.text(databap.getCodeLink(databap.vars.phrase))
|
||||
.addClass('addr')
|
||||
.slideDown('fast')
|
||||
.unbind('click');
|
||||
}
|
||||
);
|
||||
|
||||
//edit code
|
||||
$('#edit_btn').click
|
||||
(
|
||||
function()
|
||||
{
|
||||
code = $('textarea#content').val();
|
||||
if(code !='')
|
||||
{
|
||||
if(code != databap.vars.old_code)
|
||||
{
|
||||
databap.saveForm
|
||||
(
|
||||
'edit_code',
|
||||
$('#edit_code'),
|
||||
function(iCodeId)
|
||||
{
|
||||
databap.vars.code = iCodeId;
|
||||
databap.vars.old_code = '';
|
||||
databap.switchPage(databap.pages.read_code);
|
||||
},
|
||||
'#edit_btn'
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
databap.addErrorBefore('Aucune modification n\'a été effectuée', '#edit_btn');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
databap.addErrorBefore('Le champ code est vide', '#edit_btn');
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
//Init's end
|
||||
databap.setInitEnd(true);
|
||||
},
|
||||
{code:databap.vars.code},
|
||||
'json'
|
||||
);
|
||||
},
|
||||
'#code_container'
|
||||
);
|
||||
};
|
||||
</script>
|
||||
@@ -1,22 +1,37 @@
|
||||
<div id="search">
|
||||
<div class="h1_wrap">
|
||||
<h1 class="round"><span>Recherche</span></h1>
|
||||
<div class="step_box round">
|
||||
<p class="step_nb_box">Recherche</p>
|
||||
<input type="text" name="repeat_query" id="repeat_query" class="step_line_item inc_border round" maxlength="200" value="">
|
||||
<div id="sub_button_box"></div>
|
||||
<p class="summary"><span id="search_count">0</span> résultat<span id="search_multi"></span> pour la recherche "<span id="search_words"></span>".</p>
|
||||
</div>
|
||||
<div id="search_container">
|
||||
<div id="list_container" class="standalone"></div>
|
||||
</div>
|
||||
<div id="list_container" class="standalone"></div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
databap.pageInit = function()
|
||||
{
|
||||
//TODO : to be replaced by tinyscrollbar
|
||||
databap.$main.css('overflow', 'auto');
|
||||
databap.pageInit = function()
|
||||
{
|
||||
self.initScrollBar('#main', '#search_container', '#list_container');
|
||||
|
||||
if($('#query').val()==databap.consts.search_box_text)
|
||||
{
|
||||
$('#query').val(databap.vars.search_words);
|
||||
}
|
||||
databap.loadSearchPage();
|
||||
self.tmp('searched_words', '');
|
||||
if($('#query').val()!=databap.consts.search_box_text) databap.search();
|
||||
|
||||
//Init's end
|
||||
databap.setInitEnd(true);
|
||||
};
|
||||
//Double link
|
||||
$('#query').change(function(){$('#repeat_query').val($(this).val());});
|
||||
$('#sub_button_box').addButton('search', 'Chercher', function(){$('#repeat_query').trigger('keyup');}, 'sub_button', 'inc_border inverse');
|
||||
$('#repeat_query')
|
||||
.addDefaultValue(self.consts.search_box_text, $('#query').val())
|
||||
.change(function(){$('#query').val($(this).val());})
|
||||
.keyup(function(e){if(e.which==13 || e.isTrigger) self.search();})
|
||||
.width('calc(50% - '+$('#sub_button').outerWidth(true)+'px)');
|
||||
|
||||
//Init's end
|
||||
databap.setInitEnd(true);
|
||||
};
|
||||
|
||||
databap.onResize = function()
|
||||
{
|
||||
self.setScrollBarSize('maximize');
|
||||
}
|
||||
</script>
|
||||
162
masks/table.html
Normal file
@@ -0,0 +1,162 @@
|
||||
<div id="table">
|
||||
<div id="table_container">
|
||||
<form id="table_info">
|
||||
<div id="table_meta" class="step_box form_success round">
|
||||
<p class="step_box_title">
|
||||
<span class="edit">Table</span>
|
||||
<span class="read"><span id="read_system"></span>| <span id="read_title"></span> - <span id="read_description"></span></span></p>
|
||||
<select id="system" name="system" class="edit inc_border round">
|
||||
<option value="TOUS">Tous</option>
|
||||
<option value="BW" selected="selected">BW</option>
|
||||
<option value="ECC">ECC</option>
|
||||
</select>
|
||||
<input type="text" name="title" id="title" class="edit inc_border round" maxlength="200" value="" />
|
||||
<input type="text" name="description" id="description" class="edit inc_border round" maxlength="500" value="" />
|
||||
<input type="hidden" name="id" id="id" value="" />
|
||||
<p class="read table_info"><i class="fa fa-c-desc fa-inline fa-30"></i>Dernière modification par <span id="read_name"></span> le <span id="read_date"></span></p>
|
||||
</div>
|
||||
<div id="table_main" class="step_box form_success round">
|
||||
<p class="step_box_title"><!-- <a href="http://fr.wikipedia.org/wiki/Le_Monde_de_monsieur_Fred" target="_blank"> --><span title="Helmut Perchut">"J'ai explication !"</span><!-- </a> --></p>
|
||||
<textarea name="keywords" id="keywords" class="edit inc_border round"></textarea>
|
||||
<p class="read" id="read_keywords"></p>
|
||||
</div>
|
||||
<div id="validation" class="form_success"></div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
databap.pageInit = function()
|
||||
{
|
||||
//Scroll bar
|
||||
self.initScrollBar('#main', '#table', '#table_container');
|
||||
|
||||
//Table object
|
||||
oTable = new Table(self.vars.id);
|
||||
|
||||
//Init's end
|
||||
databap.setInitEnd(true);
|
||||
};
|
||||
|
||||
databap.onResize = function()
|
||||
{
|
||||
self.setScrollBarSize('maximize');
|
||||
//self.maximizeElem($('#keywords'), false, $('#table'));
|
||||
};
|
||||
|
||||
function Table(iTableId)
|
||||
{
|
||||
|
||||
this.DISPLAY_EDIT = 'edit';
|
||||
this.DISPLAY_READ = 'read';
|
||||
this.DISPLAY_ERROR = 'error'
|
||||
this.ACTION_BTN_ID = 'table_button';
|
||||
this.SUCCESS_CLASS = 'form_success';
|
||||
this.ERROR_CLASS = 'form_error';
|
||||
|
||||
this.sDisplay = '';
|
||||
this.iTableId = iTableId || 0;
|
||||
this.sTableName = '';
|
||||
this.sFeedBackBoxId = '#validation';
|
||||
tableself = this;
|
||||
|
||||
$('#title').addDefaultValue('Nom de la table');
|
||||
$('#description').addDefaultValue('Description');
|
||||
$('#validation').addButton('dummy', '', function(){}, this.ACTION_BTN_ID, '', this.ACTION_BTN_ID);
|
||||
this.$Button = databap.tmp(this.ACTION_BTN_ID);
|
||||
|
||||
if(this.iTableId>0 || this.iTableId!='')
|
||||
{
|
||||
this.applyTableInfo();
|
||||
}
|
||||
else this.setDisplay(this.DISPLAY_EDIT);
|
||||
}
|
||||
|
||||
Table.prototype.applyTableInfo = function()
|
||||
{
|
||||
databap.getInfo
|
||||
(
|
||||
'get_table',
|
||||
function(asData)
|
||||
{
|
||||
if(asData.result == databap.consts.error)
|
||||
{
|
||||
tableself.setDisplay(tableself.DISPLAY_ERROR);
|
||||
databap.addErrorBefore(asData.desc, tableself.sFeedBackBoxId);
|
||||
}
|
||||
else
|
||||
{
|
||||
tableself.sTableName = asData.title;
|
||||
$.each(asData, function(sKey, sValue)
|
||||
{
|
||||
if(sKey=='warning' && sValue!='') databap.addWarningBefore(sValue, tableself.sFeedBackBoxId);
|
||||
//debug('key='+sKey+', value='+sValue);
|
||||
$('#read_'+sKey).html(sValue.replace(/(?:\r\n|\r|\n)/g, '<br />'));
|
||||
$('#'+sKey).val(sValue);
|
||||
});
|
||||
tableself.setDisplay(tableself.DISPLAY_READ);
|
||||
databap.updateScrollBar();
|
||||
}
|
||||
},
|
||||
{id:this.iTableId},
|
||||
'json',
|
||||
function(){debug('Error: Unknown error thrown');},
|
||||
true
|
||||
);
|
||||
};
|
||||
|
||||
Table.prototype.setDisplay = function(sDisplay)
|
||||
{
|
||||
//debug(sDisplay);
|
||||
var sOtherDisplay = '';
|
||||
var bRedit = (this.sDisplay!=''); //Edit existing table
|
||||
this.sDisplay = sDisplay || (this.sDisplay==this.DISPLAY_EDIT?this.DISPLAY_READ:this.DISPLAY_EDIT);
|
||||
|
||||
var bSuccess = true;
|
||||
switch(this.sDisplay)
|
||||
{
|
||||
case this.DISPLAY_READ:
|
||||
sOtherDisplay = this.DISPLAY_EDIT;
|
||||
this.$Button.modifyButton({'type':'edit', 'title':'Modifier', 'action':function(){tableself.setDisplay(sOtherDisplay)}});
|
||||
break;
|
||||
case this.DISPLAY_EDIT:
|
||||
sOtherDisplay = this.DISPLAY_READ;
|
||||
this.$Button.modifyButton({'type':'ok', 'title':'Valider', 'action':tableself.save});
|
||||
if(bRedit) $('#title').prop('disabled', true).add('#description').focus().blur();
|
||||
break;
|
||||
case this.DISPLAY_ERROR:
|
||||
bSuccess = false;
|
||||
sOtherDisplay = 'dummy';
|
||||
break;
|
||||
}
|
||||
$('.'+sOtherDisplay).add('.'+(bSuccess?this.ERROR_CLASS:this.SUCCESS_CLASS)).hide();
|
||||
$('.'+this.sDisplay).add('.'+(bSuccess?this.SUCCESS_CLASS:this.ERROR_CLASS)).show();
|
||||
databap.updateScrollBar();
|
||||
};
|
||||
|
||||
Table.prototype.save = function()
|
||||
{
|
||||
var $Form = $('#table_info');
|
||||
if($Form.checkForm())
|
||||
{
|
||||
databap.saveForm
|
||||
(
|
||||
'add_table',
|
||||
$Form,
|
||||
function(asData)
|
||||
{
|
||||
if(asData.result == databap.consts.success)
|
||||
{
|
||||
databap.goToInternalLink('table', asData.name.toLowerCase());
|
||||
//tableself.iTableId = asData.name;
|
||||
//tableself.applyTableInfo();
|
||||
}
|
||||
else databap.addErrorBefore(asData.desc, tableself.sFeedBackBoxId);
|
||||
},
|
||||
true,
|
||||
'json'
|
||||
);
|
||||
}
|
||||
else databap.addWarningBefore('Formulaire incomplet', this.sFeedBackBoxId);
|
||||
};
|
||||
|
||||
</script>
|
||||
@@ -1,49 +1,48 @@
|
||||
<div id="welcome">
|
||||
<div class="h1_wrap">
|
||||
<h1 class="round"><span>Bienvenue</span></h1>
|
||||
</div>
|
||||
<div id="welcome_container" class="round">
|
||||
<p class="welcome_text">Bienvenue sur la base de données Databap.</p>
|
||||
<ul>
|
||||
<li>Version 0.94 En cours de développement (maj du 31/05/2013)</li>
|
||||
<li>Upcoming features :
|
||||
<ul>
|
||||
<li>Recherche avancée : expressions régulières, version de document, recerche large (code, procédure, chat, Q&A)</li>
|
||||
<li>Téléversement de documentation</li>
|
||||
<li>Q&A</li>
|
||||
<p class="welcome_text">Bienvenue sur la plateforme Databap</p>
|
||||
<div id="welcome_box"><div id="welcome_subbox">
|
||||
<ul class="fa-ul">
|
||||
<li><i class="fa-li fa fa-30 fa-c-ok"></i>Version <span id="version"></span> (maj du 15/06/2014)</li>
|
||||
<li><i class="fa-li fa fa-30 fa-c-changelog"></i>Changelog
|
||||
<ul class="fa-ul">
|
||||
<li><i class="fa-li fa fa-c-checked"></i>Utilisation des # pour les accès aux pages, compatible avec les boutons prec/suiv des navigateurs. Ex: <a href="#chat">databap.lutran.fr#chat</a></li>
|
||||
<li><i class="fa-li fa fa-c-checked"></i>Mot de passe personnalisé et modifiable dans les <a href="#options">options</a></li>
|
||||
<li><i class="fa-li fa fa-c-checked"></i>paramètre dans les <a href="#options">options</a> pour supprimer les messages d'arrivée et de départ des gens (console)</li>
|
||||
<li><i class="fa-li fa fa-c-checked"></i>Téléversement de documentation</li>
|
||||
<li><i class="fa-li fa fa-c-checked"></i>Documentation de tables ECC / BW</li>
|
||||
<li><i class="fa-li fa fa-c-checked"></i>Homogénéisation des icônes</li>
|
||||
<li><i class="fa-li fa fa-c-checked"></i>Recherche élargie sur tous les types de documents (codes, procédures, docs, articles et tables)</li>
|
||||
<li><i class="fa-li fa fa-c-checked"></i>Commande /invite X : invite X à rejoindre le chan ouvert (Cf. Clippy)</li>
|
||||
<li><i class="fa-li fa fa-c-checked"></i>Commande /news X : Vous annoncez le message X (votre message est ajouté à la liste des news automatiquement)</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Changelog :
|
||||
<ul>
|
||||
<li>/9gag</li>
|
||||
<li>Nouvelle aide Clippy</li>
|
||||
<li><i class="fa-li fa fa-30 fa-c-wip"></i>In progress
|
||||
<ul class="fa-ul">
|
||||
<li><i class="fa-li fa fa-c-unchecked"></i>Version compatible mobile (surtout pour le chat)</li>
|
||||
<li><i class="fa-li fa fa-c-unchecked"></i>Version compatible IE8+</li>
|
||||
<li><i class="fa-li fa fa-c-unchecked"></i>Recherche avancée : expressions régulières, version de document</li>
|
||||
<li><i class="fa-li fa fa-c-unchecked"></i>Messagerie interne</li>
|
||||
<li><i class="fa-li fa fa-c-unchecked"></i>Q&A (forum like)</li>
|
||||
<li><i class="fa-li fa fa-c-unchecked"></i>Image de profil</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="mailto:francois@lutran.fr" class="feedback">Me contacter</a></li>
|
||||
<li><i class="fa-li fa fa-30 fa-c-mail"></i><a href="mailto:francois@lutran.fr">Me contacter</a>, car toute idée est bonne à prendre !</li>
|
||||
</ul>
|
||||
<p class="redirect">Cette page sera automatiquement remplacé par la page "<span id="default_page"></span>" dans 10 secondes</p>
|
||||
</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
databap.pageInit = function()
|
||||
{
|
||||
//TODO : to be replaced by tinyscrollbar
|
||||
databap.$main.css('overflow', 'auto');
|
||||
databap.pageInit = function()
|
||||
{
|
||||
$('#version').text(databap.consts.version);
|
||||
self.initScrollBar('#main', '#welcome_box', '#welcome_subbox');
|
||||
|
||||
$('#default_page').text(databap.consts.default_page);
|
||||
setTimeout
|
||||
(
|
||||
function()
|
||||
{
|
||||
if(databap.vars.current_page == databap.pages.welcome)
|
||||
{
|
||||
databap.switchPage(databap.consts.default_page);
|
||||
}
|
||||
},
|
||||
'10000'
|
||||
);
|
||||
|
||||
//Init's end
|
||||
databap.setInitEnd(true);
|
||||
};
|
||||
//Init's end
|
||||
self.setInitEnd(true);
|
||||
};
|
||||
databap.onResize = function()
|
||||
{
|
||||
self.setScrollBarSize('optimize');
|
||||
};
|
||||
</script>
|
||||
21
readme
@@ -3,21 +3,6 @@ Hi there!
|
||||
To install, kindly follow this procedure:
|
||||
1. Add apache module rewrite (a2enmod rewrite on debian)
|
||||
2. Add php-curl, php-gd and php-mbstring packages to PHP (if not already built in)
|
||||
3. Create a settings.php in databap root folder :
|
||||
|
||||
<?php
|
||||
|
||||
class Settings
|
||||
{
|
||||
const DB_SERVER = 'localhost';
|
||||
const DB_LOGIN = 'root';
|
||||
const DB_PASS = 'pass';
|
||||
const DB_NAME = 'databap';
|
||||
const TIMEZONE = 'Europe/Paris';
|
||||
const TEXT_ENC = 'UTF-8';
|
||||
const SQL_ENC = 'utf8';
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
4. You're good to go ! Check users SQL table for default admin user
|
||||
3. Fill in settings.php in databap root folder
|
||||
4. add php user access (read/write) to log.html file
|
||||
5. You're good to go ! Check users SQL table for default admin user
|
||||
2
robots.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
User-agent: *
|
||||
Disallow: /
|
||||