Compare commits

..
22 Commits
Author SHA1 Message Date
franzz 0b66879a89 Add default constants to pages default tags 2023-11-19 18:10:54 +01:00
franzz 88abac6864 Make isId function available 2023-11-11 17:24:14 +01:00
franzz e1cf78b992 Change log file folder 2023-08-06 13:24:00 +02:00
franzz dd4469c349 Remove lutran.fr in generator name 2023-06-08 22:22:47 +02:00
franzz 98670dc33f Fix initial DB check 2023-02-17 18:54:49 +01:00
franzz f5e165a446 Add w3m support 2022-10-16 21:39:26 +02:00
franzz 25c0f66cff Feed update for rarbg 2022-02-09 22:02:01 +01:00
franzz 00f2b4c403 Fix log file on windows 2022-01-31 18:32:51 +01:00
franzz 5965ac9bdd Remove get_magic_quotes_gpc (php 8) 2022-01-25 23:06:28 +01:00
franzz 4c1cd60426 Remove useless instruction 2022-01-24 15:21:08 +01:00
franzz a0777a0df0 Add function to retrieve translation key 2021-09-03 23:21:25 +02:00
franzz 18de25873b Cascading deletion fix 2021-08-31 20:25:26 +02:00
franzz c977235188 rename to match class name 2021-06-28 20:40:56 +02:00
franzz 8d07078e30 Composer Compliant File Name: UploadHandler 2021-06-28 20:37:30 +02:00
franzz 3810e4db92 Composer Compliant File Name: Translator 2021-06-28 20:37:02 +02:00
franzz 908f79a6ed Composer Compliant File Name: Toolbox 2021-06-28 20:36:32 +02:00
franzz 81857f0216 Composer Compliant File Name: RSS 2021-06-28 20:36:09 +02:00
franzz b471d4787d Composer Compliant File Name: PhpObject 2021-06-28 20:35:49 +02:00
franzz 0ff486f0d0 Composer Compliant File Name: Mask 2021-06-28 20:35:21 +02:00
franzz 7fccf775a5 Composer Compliant File Name: Main 2021-06-28 20:34:56 +02:00
franzz 1624a17cb5 Update 'inc/Db.php' 2021-06-28 20:33:59 +02:00
franzz e78ed8bfc7 composer v1 2021-06-27 20:26:44 +02:00
12 changed files with 1619 additions and 324 deletions

No files matched your search

+2 -2
View File
@@ -1,4 +1,4 @@
/.buildpath
/.project
/log.html
/globalsettings.php
inc/log.html
/vendor/
+10
View File
@@ -0,0 +1,10 @@
{
"name": "franzz/objects",
"description": "Objects",
"type": "library",
"autoload": {
"psr-4": {
"Franzz\\Objects\\": "inc"
}
}
}
+35 -67
View File
@@ -1,5 +1,8 @@
<?php
namespace Franzz\Objects;
use \Settings;
/**
* MySql query manager and generator
* @author franzz
@@ -23,10 +26,10 @@ class Db extends PhpObject
/**
* SQL connection Handle
* @var mysqli
* @var \mysqli
*/
private $oConnection;
private $sDatabase;
private $asConf;
private $asOptions;
/**
@@ -37,20 +40,14 @@ class Db extends PhpObject
* 'cascading_delete'=>array('table_name1'=>array('linked_table1', 'linked_table2', ...), 'table_name2'=>...))
* @var Array
*/
public function __construct($sDbServer, $sLogin, $sPass, $sDatabase, $asOptions, $sEncoding='utf8mb4')
public function __construct($asConf, $asOptions)
{
parent::__construct(__FILE__, Settings::DEBUG);
$this->sDatabase = $sDatabase;
$this->asConf = $asConf;
$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());}
*/
parent::__construct(__FILE__);
$this->oConnection = new \mysqli($this->getConf('server'), $this->getConf('user'), $this->getConf('pass'));
$this->syncPhpParams($this->getConf('encoding'));
$this->setTrace(false);
if($this->oConnection->connect_error)
@@ -60,17 +57,20 @@ class Db extends PhpObject
}
else
{
if(!$this->oConnection->select_db($this->sDatabase))
{
$this->addError('Could not find database "'.$this->sDatabase.'"');
try {
$this->oConnection->select_db($this->getConf('database'));
$this->sDbState = empty($this->getArrayQuery("SHOW TABLES"))?self::DB_NO_TABLE:self::DB_PEACHY;
}
catch(\Exception $oEx) {
$this->addError('Could not find database "'.$this->getConf('database').'"');
$this->sDbState = self::DB_NO_DATA;
}
elseif(empty($this->getArrayQuery("SHOW TABLES")))
{
$this->sDbState = self::DB_NO_TABLE;
}
else $this->sDbState = self::DB_PEACHY;
}
private function getConf($sConf) {
return $this->asConf[$sConf] ?? null;
}
private function syncPhpParams($sEncoding)
@@ -91,7 +91,6 @@ class Db extends PhpObject
public function setTrace($bTrace=true)
{
$this->bTrace = $bTrace;
//if($bTrace) $this->setDebug(true);
}
public function getTrace()
@@ -107,9 +106,9 @@ class Db extends PhpObject
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");
$this->oConnection->select_db($this->sDatabase);
$this->setQuery("DROP DATABASE IF EXISTS ".$this->getConf('database'));
$this->setQuery("CREATE DATABASE ".$this->getConf('database')." DEFAULT CHARACTER SET ".$this->getConf('encoding')." DEFAULT COLLATE ".$this->getConf('encoding')."_general_ci");
$this->oConnection->select_db($this->getConf('database'));
//Create tables
@array_walk($this->getInstallQueries(), array($this, 'setQuery'));
@@ -118,9 +117,7 @@ class Db extends PhpObject
public function getBackup() {
$sBackupFile = uniqid('backup_').'.sql';
$sAppPath = '';
if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') $sAppPath = 'C:\ProgramData\xampp\mysql\bin\\';
exec($sAppPath.'mysqldump --user='.Settings::DB_LOGIN.' --password='.Settings::DB_PASS.' '.Settings::DB_NAME.' --add-drop-table --result-file='.$sBackupFile);
exec('mysqldump --user='.$this->getConf('user').' --password='.$this->getConf('pass').' '.$this->getConf('database').' --add-drop-table --result-file='.$sBackupFile);
if(file_exists($sBackupFile)) {
$sBackup = file_get_contents($sBackupFile);
unlink($sBackupFile);
@@ -133,7 +130,7 @@ class Db extends PhpObject
$sAppPath = '';
if(file_exists($sBackupFile)) {
if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') $sAppPath = 'C:\ProgramData\xampp\mysql\bin\\';
return exec($sAppPath.'mysql --user='.Settings::DB_LOGIN.' --password='.Settings::DB_PASS.' '.Settings::DB_NAME.' < '.$sBackupFile);
return exec($sAppPath.'mysql --user='.$this->getConf('user').' --password='.$this->getConf('pass').' '.$this->getConf('database').' < '.$sBackupFile);
}
else return false;
}
@@ -158,7 +155,7 @@ class Db extends PhpObject
$asResult = $this->setQuery($sSql);
if($asResult === false)
{
$this->addError('SQL failed with error: '.$this->db->error, $sSql);
$this->addError('SQL failed with error: '.$this->oConnection->error, $sSql);
$bResult = false;
break;
}
@@ -209,7 +206,7 @@ class Db extends PhpObject
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."`)";
$asForeignKeyQueries[] = "ALTER TABLE ".$sTableName." ADD FOREIGN KEY (`".$sColumnName."`) REFERENCES ".$this->getTable($sColumnName)."(`".$sColumnName."`)";
}
}
}
@@ -273,7 +270,7 @@ class Db extends PhpObject
return $asResult;
}
private function getMaxIncrementedValue($sTable)
public function getMaxIncrementedValue($sTable)
{
return $this->selectValue($sTable, "MAX(".$this->getId($sTable).")");
}
@@ -296,7 +293,7 @@ class Db extends PhpObject
return $sTableName.".".$sColumnName;
}
private function isId($sColumnName, $sTableName='')
public function isId($sColumnName, $sTableName='')
{
$asTables = ($sTableName=='')?$this->getTables():array($sTableName);
$asTableIds = array_map(array('self', 'getId'), $asTables);
@@ -496,24 +493,14 @@ class Db extends PhpObject
$bSuccess = true;
//linked tables
switch($sTableName)
{
case (array_key_exists('cascading_delete', $this->asOptions) && array_key_exists($sTableName, $this->asOptions['cascading_delete'])) :
$asTables = array_merge(is_array($sTableName)?array_values($sTableName):array($sTableName), array_values($this->asOptions['cascading_delete'][$sTableName]));
break;
case is_string($sTableName) :
$asTables = array($sTableName);
break;
case is_array($sTableName):
$asTables = $sTableName;
break;
default:
$asTables = array();
if(array_key_exists('cascading_delete', $this->asOptions) && array_key_exists($sTableName, $this->asOptions['cascading_delete'])) {
foreach($this->asOptions['cascading_delete'][$sTableName] as $sTable) {
$bSuccess = $bSuccess && $this->deleteRow($sTable, $iTableId);
}
foreach($asTables as $sTable)
{
$bSuccess = $bSuccess && $this->setQuery("DELETE FROM ".$sTable." WHERE ".$this->getId($sTableName)." = ".$iTableId);
}
$bSuccess = $bSuccess && $this->setQuery("DELETE FROM ".$sTableName." WHERE ".$this->getId($sTableName)." = ".$iTableId);
return $bSuccess;
}
@@ -750,23 +737,4 @@ class Db extends PhpObject
return array_combine($asKeys, $asValues);
}
}
/*
public function select($asFields='*')
{
$oSql = new Sql($this, array('select'=>$asFields));
return $oSql;
}
public function from($sTable)
{
$oSql = new Sql($this, array('from'=>$sTable));
return $oSql;
}
public function getConnection()
{
return $this->oConnection;
}
*/
}
+30 -7
View File
@@ -1,5 +1,8 @@
<?php
namespace Franzz\Objects;
use \Settings;
/**
* RSS Feed Class
* @author franzz
@@ -20,7 +23,7 @@ class Feed extends PhpObject
*/
public function __construct($asChannel=array(), $asItems=array())
{
parent::__construct(__CLASS__, Settings::DEBUG);
parent::__construct(__CLASS__);
if(!empty($asChannel) && !array_key_exists('link', $asChannel))
{
$asChannel['link'] = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME'].'/rss';
@@ -28,24 +31,33 @@ class Feed extends PhpObject
$this->asChannel = $asChannel;
//Items
$this->asItems = array();
$this->removeItems();
array_walk($asItems, array($this, 'addItem'));
}
public function loadRss($sUrl)
public function loadRss($sUrl, $sMode='curl')
{
$sRssContent = '';
switch($sMode) {
case 'curl':
$oCurl = curl_init();
curl_setopt($oCurl, CURLOPT_URL, $sUrl);
curl_setopt($oCurl, CURLOPT_HEADER, false);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($oCurl, CURLOPT_USERAGENT, array_key_exists('HTTP_USER_AGENT', $_SERVER)?$_SERVER['HTTP_USER_AGENT']:'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0');
$fCookieJar = tempnam('/tmp','cookie');
curl_setopt($oCurl, CURLOPT_USERAGENT, array_key_exists('HTTP_USER_AGENT', $_SERVER)?$_SERVER['HTTP_USER_AGENT']:'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0');
$fCookieJar = @tempnam('/tmp','cookie');
curl_setopt($oCurl, CURLOPT_COOKIESESSION, true);
curl_setopt($oCurl, CURLOPT_COOKIEJAR, $fCookieJar);
curl_setopt($oCurl, CURLOPT_COOKIEFILE, $fCookieJar);
//curl_setopt($oCurl, CURLOPT_ENCODING, 'gzip');
$sRssContent = curl_exec($oCurl);
curl_close($oCurl);
break;
case 'w3m':
exec('w3m -dump '.$sUrl, $asOutput, $iResult);
$sRssContent = implode("\n", $asOutput);
break;
}
//Parse document encoding (useless)
$sEncoding = $this->getPregMatch("'encoding=[\'\"](.*?)[\'\"]'si", $sRssContent);
@@ -109,6 +121,12 @@ class Feed extends PhpObject
return count($this->asItems) - 1;
}
public function changeItem($iItemId, $asAttributes) {
if(array_key_exists($iItemId, $this->asItems)) {
$this->asItems[$iItemId] = array_merge($this->asItems[$iItemId], $asAttributes);
}
}
public function removeItem($iItemId)
{
$bExist = array_key_exists($iItemId, $this->asItems);
@@ -116,6 +134,11 @@ class Feed extends PhpObject
return $bExist;
}
public function removeItems()
{
$this->asItems = [];
}
public function filterItems($sField, $sRegex)
{
$this->asItems = array_filter($this->asItems, function($asItem) use ($sField, $sRegex) {
@@ -152,7 +175,7 @@ class Feed extends PhpObject
$sRssChannel .= array_key_exists('link', $this->asChannel)?self::getHtml('', 'atom:link', '', '', array('href'=>$this->asChannel['link'], 'rel'=>'self', 'type'=>'application/atom+xml'), true):'';
$sRssChannel .= array_key_exists('language', $this->asChannel)?self::getHtml($this->asChannel['language'], 'language'):'';
$sRssChannel .= self::getHtml($this->getGlobalPubDate(), 'lastBuildDate');
$sRssChannel .= self::getHtml('Lutran.fr RSS Feed Generator', 'generator');
$sRssChannel .= self::getHtml('Franzz RSS Feed Generator', 'generator');
$sRssChannel .= array_key_exists('webMaster', $this->asChannel)?self::getHtml($this->asChannel['webMaster'].' (Webmaster)', 'webMaster'):'';
//Feed Items
@@ -185,7 +208,7 @@ class Feed extends PhpObject
$sRssItem .= array_key_exists('category', $asItem)?self::getHtml($asItem['category'], 'category'):'';
$sRssItem .= self::getHtml(self::cleanRss($asItem['description']), 'description');
$sRssItem .= array_key_exists('pubDate', $asItem)?self::getHtml(self::getDate($asItem['pubDate']), 'pubDate'):'';
$sRssItem .= array_key_exists('guid', $asItem)?self::getHtml($asItem['guid'], 'guid', '', '', array('isPermaLink'=>'true')):'';
$sRssItem .= array_key_exists('guid', $asItem)?self::getHtml($asItem['guid'], 'guid', '', '', array('isPermaLink'=>'false')):'';
return self::getHtml($sRssItem, 'item');
}
+23 -23
View File
@@ -1,5 +1,8 @@
<?php
namespace Franzz\Objects;
use \Settings;
/**
* Main Class
* @author franzz
@@ -20,12 +23,6 @@ abstract class Main extends PhpObject
//Folders
const MASKS_FOLDER = 'masks/';
/**
* Class Management
* @var ClassManagement
*/
protected $oClassManagement;
/**
* DB Handle
* @var Db
@@ -50,24 +47,23 @@ abstract class Main extends PhpObject
/**
* Main constructor
* @param ClassManagement $oClassManagement
* @param string $sLang
*/
public function __construct($oClassManagement, $sProcessPage, $asMandatoryClasses=array(), $bDb=true, $sFile=__FILE__, $sTimeZone='')
public function __construct($sProcessPage, $bDb=true, $sTimeZone='', $sLogPath='')
{
parent::__construct($sFile, Settings::DEBUG);
$this->oClassManagement = $oClassManagement;
//Load classes
$asMandatoryClasses[] = array('name'=>'mask', 'project'=>false);
if($bDb) $asMandatoryClasses[] = array('name'=>'db', 'project'=>false);
foreach($asMandatoryClasses as $asClass) $this->oClassManagement->incClass($asClass['name'], $asClass['project']);
parent::__construct(get_class($this), Settings::DEBUG, PhpObject::MODE_FILE, $sLogPath);
$this->setContext($sProcessPage, $sTimeZone);
//Init objects
if($bDb) {
$this->oDb = new Db(Settings::DB_SERVER, Settings::DB_LOGIN, Settings::DB_PASS, Settings::DB_NAME, $this->getSqlOptions() , Settings::DB_ENC);
$asConf = array(
'server' => Settings::DB_SERVER,
'database' => Settings::DB_NAME,
'user' => Settings::DB_LOGIN,
'pass' => Settings::DB_PASS,
'encoding' => Settings::DB_ENC
);
$this->oDb = new Db($asConf, $this->getSqlOptions());
if(in_array($this->oDb->sDbState, array(Db::DB_NO_DATA, Db::DB_NO_TABLE))) $this->install();
}
}
@@ -87,7 +83,6 @@ abstract class Main extends PhpObject
header('Content-Type: text/html; charset='.Settings::TEXT_ENC);
mb_internal_encoding(Settings::TEXT_ENC);
mb_http_output(Settings::TEXT_ENC);
mb_http_input(Settings::TEXT_ENC);
mb_language('uni');
mb_regex_encoding(Settings::TEXT_ENC);
@@ -119,17 +114,21 @@ abstract class Main extends PhpObject
public function getMainPage($asGlobalVars=array(), $sMainPage='index', $asMainPageTags=array(), $asCachePages=array())
{
$asDefaultConsts = array('success'=>self::SUCCESS, 'error'=>self::ERROR, 'process_page'=>$this->asContext['process_page']);
$asDefaultConsts = array(
'success' => self::SUCCESS,
'error' => self::ERROR,
'process_page' => $this->asContext['process_page'],
'server' => $this->asContext['serv_name']
);
$asGlobalVars['consts'] = array_merge($asDefaultConsts, array_key_exists('consts', $asGlobalVars)?$asGlobalVars['consts']:array());
//Masks
if(empty($asCachePages)) $asCachePages = array_values($this->asMasks);
foreach($asCachePages as $sPage)
{
foreach($asCachePages as $sPage) {
if($sPage != $sMainPage) {
$oMask = new Mask($sPage, $this->oLang);
$sPageContent = $oMask->getMask();
$asGlobalVars['consts']['pages'][$sPage] = $sPageContent;
$oMask->setTags($asDefaultConsts);
$asGlobalVars['consts']['pages'][$sPage] = $oMask->getMask();
}
}
@@ -140,6 +139,7 @@ abstract class Main extends PhpObject
$oMainMask = new Mask($sMainPage, $this->oLang);
$oMainMask->setTag('GLOBAL_VARS', json_encode($asGlobalVars));
$oMainMask->setTags($asDefaultConsts);
$oMainMask->setTags($asMainPageTags);
return $oMainMask->getMask();
+5 -2
View File
@@ -1,5 +1,8 @@
<?php
namespace Franzz\Objects;
use \Settings;
/**
* Mask Reader
* @author franzz
@@ -29,7 +32,7 @@ class Mask extends PhpObject
public function __construct($sFileName='', Translator $oLang=null, $sTimezone = '')
{
//init
parent::__construct(__FILE__, Settings::DEBUG);
parent::__construct(__CLASS__);
$this->sMaskName = '';
$this->sFilePath = '';
$this->sMask = '';
@@ -293,7 +296,7 @@ class Mask extends PhpObject
if(!is_null($this->oLang) && self::isLangTag($sTagValue)) $sTagValue = $this->oLang->getTranslation($sTagActValue, $this->asTagsParams[$sTagName]);
//Convert Value to Mask Time Zone
if(self::isTimeTag($sTagValue)) $sTagValue = (new DateTime('@'.$sTagActValue))->setTimeZone(new DateTimeZone($this->sTimezone))->format($this->asTagsParams[$sTagName]);;
if(self::isTimeTag($sTagValue)) $sTagValue = (new \DateTime('@'.$sTagActValue))->setTimeZone(new \DateTimeZone($this->sTimezone))->format($this->asTagsParams[$sTagName]);;
}
//Replace Tags
+13 -73
View File
@@ -1,72 +1,7 @@
<?php
/**
* Manage includes
* @author franzz
* @version 1.2
*/
class ClassManagement extends PhpObject
{
const OBJECT_FOLDER = '../objects/';
const INC_FOLDER = 'inc/';
const INC_EXT = '.php';
const SETTINGS_FILE = 'settings.php';
const GLOBAL_SETTINGS_FILE = 'globalsettings.php';
const TOOLBOX_CLASS = 'toolbox';
const MAIN_CLASS_ABS = 'main';
private $asIncFiles;
function __construct($sMainClass)
{
parent::__construct(__FILE__, true);
$this->asIncFiles = array();
//try to include default files
$this->incFile(self::OBJECT_FOLDER.self::GLOBAL_SETTINGS_FILE);
$this->incFile(self::SETTINGS_FILE);
$this->incClass(self::TOOLBOX_CLASS);
//Include main class
$this->incClass(self::MAIN_CLASS_ABS);
$this->incClass($sMainClass, true);
}
function __destruct()
{
parent::__destruct();
}
public function incClass($sClassName, $bProjectClass=false)
{
$sProject = $bProjectClass?'':self::OBJECT_FOLDER;
$sFile = $sProject.self::INC_FOLDER.$sClassName.self::INC_EXT;
return $this->incFile($sFile);
}
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;
}
}
namespace Franzz\Objects;
use \Settings;
/**
* PHP Object
@@ -77,6 +12,7 @@ class PhpObject
{
//Log file name
const LOG_FILENAME = 'log.html';
private $sLogPath;
//Message types
const NOTICE_TAB = 'Notice';
@@ -96,13 +32,14 @@ class PhpObject
private $sChildClass;
private $bDebug;
function __construct($sClass='', $bDebug=false, $iExtractMode=self::MODE_FILE)
function __construct($sClass='', $bDebug=Settings::DEBUG, $iExtractMode=self::MODE_FILE, $sLogPath='')
{
$this->asMessageStack = array();
$this->resetMessageStack();
$this->setDebug($bDebug);
$this->setExtractMode($iExtractMode);
$this->sChildClass = $sClass;
$this->setLogPath($sLogPath);
}
public function setExtractMode($iExtractMode) {
@@ -120,9 +57,14 @@ class PhpObject
return $this->bDebug;
}
private static function getLogPath()
private function setLogPath($sLogPath) {
if($sLogPath == '') $sLogPath = defined('Settings::LOG_FOLDER')?Settings::LOG_FOLDER:dirname(__FILE__);
$this->sLogPath = $sLogPath.DIRECTORY_SEPARATOR.self::LOG_FILENAME;
}
private function getLogPath()
{
return dirname(__FILE__).'/'.self::LOG_FILENAME;
return $this->sLogPath;
}
private function resetMessageStack($sType=self::ALL_TAB)
@@ -168,7 +110,7 @@ class PhpObject
$this->asMessageStack[self::ERROR_TAB]
);
}
else $asMessages = $this->asMessageStack[$sType];
else $asMessages = $this->asMessageStack[$sType] ?? array();
$this->resetMessageStack($sType);
return $this->glueMessages($asMessages);
@@ -253,5 +195,3 @@ class PhpObject
$this->cleanMessageStack();
}
}
?>
+9 -65
View File
@@ -1,5 +1,8 @@
<?php
namespace Franzz\Objects;
use \Settings;
/**
* ToolBox - Only static functions missing from php library
* @author franzz
@@ -12,11 +15,7 @@ class ToolBox
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)
@@ -81,39 +80,6 @@ class ToolBox
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');
@@ -170,7 +136,7 @@ class ToolBox
//Retrieving file Content Type
if(file_exists($sPath)) //Local
{
$oFileInfo = new finfo(FILEINFO_MIME);
$oFileInfo = new \finfo(FILEINFO_MIME);
$sMimetype = $oFileInfo->file($sPath);
}
else //Remote
@@ -346,7 +312,7 @@ class ToolBox
return $asResult;
}
public function copyExif($srcfile, $destfile) {
public static function copyExif($srcfile, $destfile) {
// Function transfers EXIF (APP1) and IPTC (APP13) from $srcfile and adds it to $destfile
// JPEG file has format 0xFFD8 + [APP0] + [APP1] + ... [APP15] + <image data> where [APPi] are optional
// Segment APPi (where i=0x0 to 0xF) has format 0xFFEi + 0xMM + 0xLL + <data> (where 0xMM is
@@ -515,8 +481,8 @@ class ToolBox
switch ($sLang) {
case 'en':
$asWeekDays = array('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'satursday', 'sunday');
$asMonths = array('january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december');
$asWeekDays = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Satursday', 'Sunday');
$asMonths = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
break;
case 'fr':
$asWeekDays = array('lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche');
@@ -540,7 +506,7 @@ class ToolBox
elseif($sCurTimeStamp-$iTimeStamp<60*60*2) $sDesc = 'an hour ago';
elseif($sCurTimeStamp-$iTimeStamp<60*60*24 && $sDay==$sCurDay) $sDesc = 'at '.date('gA', $iTimeStamp);
elseif($sCurTimeStamp-$iTimeStamp<60*60*24) $sDesc = 'yesterday';
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*7 && $sWeek==$sCurWeek) $sDesc = $asWeekDays[$sWeekDay-1];
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*7 && $sWeek==$sCurWeek) $sDesc = 'on '.$asWeekDays[$sWeekDay-1];
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*7) $sDesc = 'last '.$asWeekDays[$sWeekDay-1];
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*9) $sDesc = 'a week ago';
elseif($sCurTimeStamp-$iTimeStamp<60*60*24*12) $sDesc = '10 days ago';
@@ -591,7 +557,6 @@ class ToolBox
{
if(!preg_match('/[\x80-\xff]/', $string)) return $string;
if (true || seems_utf8($string)) {
$chars = array(
// Decompositions for Latin-1 Supplement
chr(194).chr(170) => 'a', chr(194).chr(186) => 'o',
@@ -790,28 +755,7 @@ class ToolBox
}
*/
$string = strtr($string, $chars);
} else {
$chars = array();
// Assume ISO-8859-1 if not UTF-8
$chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
.chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
.chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
.chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
.chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
.chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
.chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
.chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
.chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
.chr(252).chr(253).chr(255);
$chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
$string = strtr($string, $chars['in'], $chars['out']);
$double_chars = array();
$double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
$double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
$string = str_replace($double_chars['in'], $double_chars['out'], $string);
}
return $string;
}
+9 -1
View File
@@ -1,5 +1,8 @@
<?php
namespace Franzz\Objects;
use \Settings;
/**
* Translator Class
* @author franzz
@@ -24,7 +27,7 @@ class Translator extends PhpObject
*/
public function __construct($sLang='', $sDefaultLang='')
{
parent::__construct(__FILE__, Settings::DEBUG);
parent::__construct(__FILE__);
$this->asLanguages = array();
$this->asTranslations = array();
$this->loadLanguages();
@@ -95,6 +98,11 @@ class Translator extends PhpObject
return $asPageToHash;
}
public function getTranslationKey($stransText, $sLang='') {
if($sLang=='') $sLang = $this->sLang;
return array_search($stransText, $this->asTranslations[$sLang]) ?? '';
}
private function loadLanguages()
{
//List all available languages
File diff suppressed because it is too large. Load diff
-80
View File
@@ -1,80 +0,0 @@
<?php
/*
Main Project
http://git.lutran.fr/main.git
Copyright (C) 2015 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
*/
/* Requests Handler */
//Start buffering
ob_start();
require_once '../objects/class_management.php';
$oClassManagement = new ClassManagement('main');
ToolBox::cleanPost($_POST);
ToolBox::cleanPost($_GET);
ToolBox::cleanPost($_REQUEST);
ToolBox::fixGlobalVars(isset($argv)?$argv:array());
//Available variables
$sToken = isset($_GET['token'])?$_GET['token']:'';
$sAction = isset($_GET['a'])?$_GET['a']:'';
$sPage = isset($_GET['p'])?$_GET['p']:'index';
$sLang = isset($_GET['l'])?$_GET['l']:(isset($_COOKIE['l'])?$_COOKIE['l']:'');
//...
//Initiate class
$oMain = new Main($oClassManagement, __FILE__, $sLang);
$bLoggedIn = $oMain->isLoggedIn();
$sResult = '';
if($sAction=='logmein') $sResult = $oMain->logMeIn($sToken);
elseif($sAction!='' && $bLoggedIn)
{
switch ($sAction)
{
case '':
$sResult = $oCvTheque->function();
break;
default:
$sResult = Main::getJsonResult(false, Main::NOT_FOUND);
}
}
elseif($sAction!='' && !$bLoggedIn)
{
if($oCvTheque->checkApiKey($iApiKey))
{
switch ($sAction)
{
case '':
$sResult = $oCvTheque->apifunction();
break;
default:
$sResult = Main::getJsonResult(false, Main::NOT_FOUND);
}
}
else $sResult = Main::getJsonResult(false, Main::UNAUTHORIZED);
}
elseif($bLoggedIn) $sResult = $oMain->getMainPage();
else $sResult = $oMain->getLogonPage();
$sDebug = ob_get_clean();
if(Settings::DEBUG && $sDebug!='') $oMain->addUncaughtError($sDebug);
echo $sResult;
?>
-4
View File
@@ -1,4 +0,0 @@
/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+Line truncated
return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3Line truncated
void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.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 contextmenLine truncated