From 4f1fc4c3e626d66f67e4674bd540cb7579053b58 Mon Sep 17 00:00:00 2001 From: SirCotare Date: Fri, 15 Feb 2013 14:50:17 +0100 Subject: [PATCH 1/7] #1470 updated admin tool to latest live version --- .../class/AdmAchievement_class.php | 12 -- .../class/AdmTask_class.php | 43 +++++ code/web/app/app_achievements_admin/conf.php | 8 +- .../include/adm_render_ach.php | 151 +++++++++++------- .../include/adm_render_atom.php | 2 +- .../include/adm_render_csr.php | 32 ++-- code/web/app/app_achievements_admin/index.php | 131 ++++++++++++--- 7 files changed, 269 insertions(+), 110 deletions(-) diff --git a/code/web/app/app_achievements_admin/class/AdmAchievement_class.php b/code/web/app/app_achievements_admin/class/AdmAchievement_class.php index 747254953..5722457d2 100644 --- a/code/web/app/app_achievements_admin/class/AdmAchievement_class.php +++ b/code/web/app/app_achievements_admin/class/AdmAchievement_class.php @@ -124,18 +124,6 @@ $this->category = $c; } - function setTieRace($t) { - $this->tie_race = $t; - } - - function setTieCiv($t) { - $this->tie_civ = $t; - } - - function setTieCult($t) { - $this->tie_cult = $t; - } - function setImage($i) { $this->image = $i; } diff --git a/code/web/app/app_achievements_admin/class/AdmTask_class.php b/code/web/app/app_achievements_admin/class/AdmTask_class.php index 6f6f8856b..26d050740 100644 --- a/code/web/app/app_achievements_admin/class/AdmTask_class.php +++ b/code/web/app/app_achievements_admin/class/AdmTask_class.php @@ -96,6 +96,8 @@ $DBc->sqlQuery("DELETE FROM ach_task WHERE at_id='".$this->getID()."'"); $DBc->sqlQuery("DELETE FROM ach_player_task WHERE apt_task='".$this->getID()."'"); + $DBc->sqlQuery("DELETE FROM ach_task_tie_align WHERE atta_task='".$this->getID()."'"); + $DBc->sqlQuery("DELETE FROM ach_task_tie_race WHERE attr_task='".$this->getID()."'"); $iter = $this->getIterator(); while($iter->hasNext()) { @@ -111,6 +113,17 @@ $DBc->sqlQuery("UPDATE ach_task SET at_parent=".mkn($this->getParentID()).",at_value='".$DBc->sqlEscape($this->getValue())."',at_condition='".$DBc->sqlEscape($this->getCondition())."',at_condition_value=".mkn($this->getConditionValue()).",at_dev='".$this->getDev()."',at_torder='".$this->torder."', at_inherit='".$this->inherit_obj."' WHERE at_id='".$this->getID()."'"); $DBc->sqlQuery("INSERT INTO ach_task_lang (atl_task,atl_lang,atl_name,atl_template) VALUES ('".$this->getID()."','en','".$DBc->sqlEscape($this->getName())."',".mkn($this->getTemplate()).") ON DUPLICATE KEY UPDATE atl_name='".$DBc->sqlEscape($this->getName())."',atl_template=".mkn($this->getTemplate()).""); + + $DBc->sqlQuery("DELETE FROM ach_task_tie_align WHERE atta_task='".$this->getID()."'"); + $DBc->sqlQuery("DELETE FROM ach_task_tie_race WHERE attr_task='".$this->getID()."'"); + + foreach($this->tie_race as $elem) { + $DBc->sqlQuery("INSERT INTO ach_task_tie_race (attr_task,attr_race) VALUES ('".$this->getID()."','".$DBc->sqlEscape($elem)."')"); + } + + foreach($this->tie_align as $elem) { + $DBc->sqlQuery("INSERT INTO ach_task_tie_align (atta_task,atta_alignment) VALUES ('".$this->getID()."','".$DBc->sqlEscape($elem)."')"); + } } function insert() { @@ -123,6 +136,14 @@ $this->setID($id); $DBc->sqlQuery("INSERT INTO ach_task_lang (atl_task,atl_lang,atl_name,atl_template) VALUES ('".$this->getID()."','en','".$DBc->sqlEscape($this->getName())."',".mkn($this->getTemplate()).")"); + + foreach($this->tie_race as $elem) { + $DBc->sqlQuery("INSERT INTO ach_task_tie_race (attr_task,attr_race) VALUES ('".$this->getID()."','".$DBc->sqlEscape($elem)."')"); + } + + foreach($this->tie_align as $elem) { + $DBc->sqlQuery("INSERT INTO ach_task_tie_align (atta_task,atta_alignment) VALUES ('".$this->getID()."','".$DBc->sqlEscape($elem)."')"); + } } function setAchievement($a) { @@ -141,6 +162,14 @@ $this->value = $v; } + function setTieRace($t) { + $this->tie_race = $t; + } + + function setTieAlign($t) { + $this->tie_align = $t; + } + function getCondition() { return $this->condition; } @@ -198,5 +227,19 @@ } } } + + function isTiedRace($r) { + if(sizeof($this->tie_race) == 0) { + return false; + } + return in_array($r,$this->tie_race); + } + + function isTiedAlign($cult,$civ) { + if(sizeof($this->tie_align) == 0) { + return false; + } + return in_array(($cult.'|'.$civ),$this->tie_align); + } } ?> \ No newline at end of file diff --git a/code/web/app/app_achievements_admin/conf.php b/code/web/app/app_achievements_admin/conf.php index 7163ef95a..1f20ac5a7 100644 --- a/code/web/app/app_achievements_admin/conf.php +++ b/code/web/app/app_achievements_admin/conf.php @@ -12,10 +12,10 @@ $_CONF['enable_CSR'] = true; $_CONF['enable_ADM'] = true; - /*$_CONF['char_mysql_server'] = "localhost"; - $_CONF['char_mysql_user'] = "root"; - $_CONF['char_mysql_pass'] = ""; - $_CONF['char_mysql_database'] = "app_achievements";*/ + $_CONF['char_mysql_server'] = RYAPI_NELDB_HOST; + $_CONF['char_mysql_user'] = RYAPI_NELDB_LOGIN; + $_CONF['char_mysql_pass'] = RYAPI_NELDB_PASS; + $_CONF['char_mysql_database'] = RYAPI_NELDB_RING; $_CONF['langs'] = array('en','de','fr','es','ru'); ?> \ No newline at end of file diff --git a/code/web/app/app_achievements_admin/include/adm_render_ach.php b/code/web/app/app_achievements_admin/include/adm_render_ach.php index 9259842af..4b8c1a2d7 100644 --- a/code/web/app/app_achievements_admin/include/adm_render_ach.php +++ b/code/web/app/app_achievements_admin/include/adm_render_ach.php @@ -138,30 +138,6 @@ $html .= " - - cult: - - - - - - civilization: - - - - image: @@ -199,6 +175,28 @@ condition value: + + allegiance: + + + + @@ -209,7 +207,7 @@ "; - if($cat->isTiedCultDev() || $cat->isTiedCivDev()) { + if($cat->hasTieAlignDev()) { $html .= ach_render_tiebar($cat->getCurrentCult(),$cat->getCurrentCiv(),$cat); } @@ -218,13 +216,17 @@ while($iter->hasNext()) { $curr = $iter->getNext(); - $html .= ach_render_achievement_open($curr); + if(!$curr->isTiedAlign_open($cat->getCurrentCult(),$cat->getCurrentCiv())) { + #continue; + } + + $html .= ach_render_achievement_open($curr,$cat); } return $html; } - function ach_render_achievement_open(&$ach) { + function ach_render_achievement_open(&$ach,&$cat) { global $_CONF,$menu; $html = '
@@ -303,30 +305,6 @@ $html .= " - - - - - - - - @@ -400,6 +378,28 @@ + + + + @@ -440,7 +440,7 @@ "; - $html .= ach_render_task_open($ach); + $html .= ach_render_task_open($ach,$cat); $html .= '
cult: - -
civilization: - -
image: condition value:
allegiance: + +
@@ -455,7 +455,7 @@ return $html; } - function ach_render_task_open(&$ach) { + function ach_render_task_open(&$ach,&$cat) { global $metalist; @@ -467,6 +467,10 @@ $task = $task_list->getNext(); + if(!$task->isTiedAlign($cat->getCurrentCult(),$cat->getCurrentCiv())) { + #continue; + } + $html .= ""; @@ -546,6 +550,28 @@ + + + + @@ -908,7 +934,7 @@
[task:]".$task->getDisplayName()." (".$task->getValue().")condition value:
allegiance: + +
"; - if($cat->isTiedCultDev()) { + if($cat->isAllowedCult()) { $html.= ""; } - if($cat->isTiedCivDev()) { + if($cat->isAllowedCiv()) { $html.= ""; } $html.= "
show all
@@ -934,30 +961,30 @@
"; - if($cat->isTiedCult() && !$cat->isTiedCiv() && $cult == "c_neutral") { // neutral / xx + /*if($cat->isTiedCult() && !$cat->isTiedCiv() && $cult == "c_neutral") { // neutral / xx #While being of neutral allegiance with the higher powers $html .= get_translation('ach_allegiance_neutral_cult',$_USER->getLang(),array("".get_translation('ach_c_neutral',$_USER->getLang())."")); } elseif($cat->isTiedCiv() && !$cat->isTiedCult() && $civ == "c_neutral") { // xx / neutral #While being of neutral allegiance with the homin civilizations $html .= get_translation('ach_allegiance_neutral_civ',$_USER->getLang(),array("".get_translation('ach_c_neutral',$_USER->getLang())."")); - } - elseif($cat->isTiedCiv() && $cat->isTiedCult() && $cult == "c_neutral" && $civ == "c_neutral") { // neutral / neutral + }*/ + if(($cult == "c_neutral" || !$cat->isAllowedCult()) && ($civ == "c_neutral" || !$cat->isAllowedCiv())) { // neutral / neutral #While being of neutral allegiance $html .= get_translation('ach_allegiance_neutral',$_USER->getLang(),array("".get_translation('ach_c_neutral',$_USER->getLang())."")); } else { //other #While being aligned with the $html .= get_translation('ach_allegiance_start',$_USER->getLang()); - if($cat->isTiedCult() && $cult != "c_neutral") { + if($cat->isAllowedCult() && $cult != "c_neutral") { #CULT $html .= "".ach_translate_cc($cult).""; - if($cat->isTiedCiv() && $civ != "c_neutral") { + if($cat->isAllowedCiv() && $civ != "c_neutral") { #and the CIV $html .= get_translation('ach_allegiance_and',$_USER->getLang())." ".ach_translate_cc($civ).""; } } - elseif($cat->isTiedCiv() && $civ != "c_neutral") { + elseif($cat->isAllowedCiv() && $civ != "c_neutral") { #CIV $html .= "".ach_translate_cc($civ).""; } diff --git a/code/web/app/app_achievements_admin/include/adm_render_atom.php b/code/web/app/app_achievements_admin/include/adm_render_atom.php index f5791a098..ccf5d2366 100644 --- a/code/web/app/app_achievements_admin/include/adm_render_atom.php +++ b/code/web/app/app_achievements_admin/include/adm_render_atom.php @@ -146,7 +146,7 @@ function catchTab(item,e){ } $html = "
-
[+] ".$ach->getName()." (ties= race: ".$ach->getTieRace()."; civ: ".$ach->getTieCiv()."; cult: ".$ach->getTieCult().")
+
[+] ".$ach->getName()."
".ach_render_task_open($ach)."
"; diff --git a/code/web/app/app_achievements_admin/include/adm_render_csr.php b/code/web/app/app_achievements_admin/include/adm_render_csr.php index 48327cfc2..143d20dd2 100644 --- a/code/web/app/app_achievements_admin/include/adm_render_csr.php +++ b/code/web/app/app_achievements_admin/include/adm_render_csr.php @@ -18,6 +18,18 @@ return $res[0]['name']; } + function user_get_data($id) { + global $_CONF,$DBc_char; + $DBc_align = new mySQL($_CONF['mysql_error']); + $DBc_align->connect($_CONF['char_mysql_server'],$_CONF['char_mysql_user'],$_CONF['char_mysql_pass'],$_CONF['char_mysql_database']); + + $res = $DBc_char->sqlQuery("SELECT cid FROM players WHERE id='".$DBc_char->sqlEscape($id)."'"); + + $res = $DBc_align->sendSQL("SELECT race,civilisation,cult FROM characters WHERE char_id='".$res[0]['cid']."'","ARRAY"); + + return $res[0]; + } + function csr_render_yubopoints() { global $DBc,$_USER,$_CONF; @@ -137,7 +149,7 @@ function csr_render_category(&$cat) { $html = ""; - if($cat->isTiedCult() || $cat->isTiedCiv()) { + if($cat->hasTieAlign_done() || $cat->hasTieAlign_open()) { $html .= ach_render_tiebar($cat->getCurrentCult(),$cat->getCurrentCiv(),$cat); } @@ -501,10 +513,10 @@ } -
+
"; - if($cat->isTiedCult()) { + if($cat->isAllowedCult()) { $html.= ""; } - if($cat->isTiedCiv()) { + if($cat->isAllowedCiv()) { $html.= "${p[0]}'."\n"; + +$ryzom_render_styles['table'] = array('#050505'.$transparency, '#FFFFFF'); +$ryzom_render_tmpls['table'] = '
'.$debug.'
'; - $c .= ''; + #if (!$style) + $style='bgcolor="#00000000"'; } + + if (!RYZOM_IG) { + // Javascript + $extra_code = ''; + if (is_string($files)) + $files = array($files); + foreach ($files as $file) { + $sfile = explode('.', $file); + if ($sfile[count($sfile)-1] == 'js') + $extra_code .= ' '."\n"; + else if ($sfile[count($sfile)-1] == 'css') + $extra_code .= ' '."\n"; + } + $c .= $extra_code; + } + + $c .= ' '."\n"; + $c .= ' '."\n"; + + if (!RYZOM_IG) { + $c .= ryzom_render_www(ryzom_render_window($title, $content, $homeLink)); + $c .= ''; + if (function_exists('newrelic_get_browser_timing_header')) + $c .= newrelic_get_browser_timing_footer(); + } else { + $c .= $content.'
'.ryLogger::getInstance()->getLogs().'
'; + } + + $c .= ''.$at_end; + return $c; } @@ -146,7 +170,9 @@ function ryzom_render_window_begin($title, $homeLink=false) { } function ryzom_render_window_end() { + global $user; return ' +
P_'.(isset($user['id'])?$user['id']:'GUEST').':'.(isset( $user['groups'])?implode(':', $user['groups']):'').'
'.ryLogger::getInstance()->getLogs().'

powered by ryzom-api

@@ -179,6 +205,7 @@ function ryzom_render_www_begin($url='') { English French German + Spanish Russian
@@ -191,25 +218,161 @@ function ryzom_render_www_end() { return '
'; } -function ryzom_render_login_form($char, $aligned=true) { + +function _s($tag, $text) { + global $ryzom_render_styles, $ryzom_render_tmpls; + if (!array_key_exists($tag, $ryzom_render_tmpls)) + return $text; + if (is_array($text)) + return $p = $text; + else + $p[0] = $text; + $p['color1'] = $ryzom_render_styles[$tag][0]; + $p['color2'] = $ryzom_render_styles[$tag][1]; + $code = '$c = "'.str_replace('"', '\"', $ryzom_render_tmpls[$tag]).'";'; + eval($code); + return $c; +} + +function ryzom_get_color_style($tag, $color=0) { + global $ryzom_render_styles; + if (!array_key_exists($tag, $ryzom_render_styles)) + return '000000'; + return $ryzom_render_styles[$tag][$color]; +} + +function ryzom_set_title($title) { + $GLOBALS['ryzom_render_title'] = $title; +} + +function ryzom_get_title() { + return $GLOBALS['ryzom_render_title']; +} + +function ryzom_font($text, $color="", $size="") { + if (RYZOM_IG) { + $color = $color?'color="'.$color.'"':''; + $size = $size?'size="'.$size.'"':''; + } else { + $color = $color?'color:'.$color.';':''; + $size = $size?'font-size:'.$size.'pt':''; + } + return (RYZOM_IG?"":"").$text.''; +} + +function ryzom_render_login_form($char, $aligned=true, $action="") { $c = ''; if ($aligned) { - $c .= ''; + $c .= '
'; $c .= ''; - $c .= ''; + $c .= ''; $c .= ''; - $c .= ''; + if (RYZOM_IG) + $c .= ''; + else + $c .= ''; $c .= ''; } else { - $c .= '
'._t('enter_char').'
'._t('enter_password').'
'; + $c .= '
'; $c .= ''; - $c .= ''; + $c .= ''; $c .= ''; - $c .= ''; + if (RYZOM_IG) + $c .= ''; + else + $c .= ''; $c .= ''; } $c .= '
'._t('login').'
'._t('password').'
'; return $c; } +function ryzom_dialog_yes_no($desc, $action, $name) { // will append ryzom_dialog=yes|no to url + + return '
'.(RYZOM_IG?'':''). + $desc.'
+ + + +
+
'; +} + +$GLOBALS['ryzom_render_title'] = defined('APP_NAME')?APP_NAME:'Ryzom'; + +$ig = (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'Ryzom')) || ryzom_get_param('ig'); // need be set using url param because auth is not done +$transparency = $ig?'':''; +$ryzom_render_styles = array(); +$ryzom_render_tmpls = array(); + +$ryzom_render_styles['main title'] = array('#222222'.$transparency, '#FFFFFF'); +$ryzom_render_tmpls['main title'] = '
 ${p[0]}
'."\n"; + +$ryzom_render_styles['section'] = array('#555555'.$transparency, '#FFFFFF'); +$ryzom_render_tmpls['section'] = '
 ${p[0]}
'."\n"; + +$ryzom_render_styles['color'] = array('', ''); +$ryzom_render_tmpls['color'] = ($ig?'':'').'${p[0]}'; + +$ryzom_render_styles['link'] = array('#111111', ''); +$ryzom_render_tmpls['link'] = '
 ${p[0]}
'."\n"; + +$ryzom_render_styles['button'] = array('#000000', ''); +$ryzom_render_tmpls['button'] = '
 ${p[0]}
'."\n"; + +$ryzom_render_styles['links'] = array('#111111'.$transparency, ''); +$ryzom_render_tmpls['links'] = '
 ${p[0]}
'."\n"; + +$ryzom_render_styles['back'] = array('#000000'.$transparency, ''); +$ryzom_render_tmpls['back'] = '
 «'.'main'.'
 
'; + +$ryzom_render_styles['highlight'] = array('#55ff55'.$transparency, ''); +$ryzom_render_tmpls['highlight'] = '${p[0]}'; + +$ryzom_render_styles['backlight'] = array('#272727'.$transparency, ''); +$ryzom_render_tmpls['backlight'] = '
${p[0]}
'."\n"; + +$ryzom_render_styles['actionbar'] = array('#555555'.$transparency, ''); +$ryzom_render_tmpls['actionbar'] = '
${p[0]}
'."\n"; + +$ryzom_render_styles['t header'] = array('#111111'.$transparency, '#FFFFFF'); +$ryzom_render_tmpls['t header'] = '${p[0]}'."\n"; + +$ryzom_render_styles['t row 0'] = array('#353535'.$transparency, ''); +$ryzom_render_tmpls['t row 0'] = '${p[0]}'."\n"; + +$ryzom_render_styles['t row 1'] = array('#252525'.$transparency, ''); +$ryzom_render_tmpls['t row 1'] = '${p[0]}'."\n"; + +$ryzom_render_styles['t element'] = array('#FFFFFF'.$transparency, ''); +$ryzom_render_tmpls['t element'] = '${p[0]}'; + +$ryzom_render_styles['log'] = array('#001100'.$transparency, ''); +$ryzom_render_tmpls['log'] = '
${p[0]}
'."\n"; + +$ryzom_render_styles['message'] = array('#445566'.$transparency, '#FFDDAA'); +$ryzom_render_tmpls['message'] = '
${p[0]}
'."\n"; + +$ryzom_render_styles['message warning'] = array('#AA3300'.$transparency, ''); +$ryzom_render_tmpls['message warning'] = '

 ${p[0]}

'."\n"; + +$ryzom_render_styles['message window'] = array('#5555ff'.$transparency, '#7799ff'); +$ryzom_render_tmpls['message window'] = ''.''. + '
${p[0]}${p[0]}
'."\n"; + +$ryzom_render_styles['message ask'] = array('#333333'.$transparency, ''); +$ryzom_render_tmpls['message ask'] = '
'.($ig?'':'').'${p[0]}
'."\n"; + +$ryzom_render_styles['message error'] = array('#AA2222'.$transparency, ''); +$ryzom_render_tmpls['message error'] = '

 ${p[0]}

'."\n"; + +$ryzom_render_styles['message debug'] = array('#FFAA22'.$transparency, ''); +$ryzom_render_tmpls['message debug'] = '
${p[0]}
'."\n"; + +$ryzom_render_styles['progress bar'] = array('#FF0000'.$transparency, '#000000'); +$ryzom_render_tmpls['progress bar'] = '${p[0]}
 ${p[0]} 
'."\n"; + ?> diff --git a/code/web/api/common/ryform.php b/code/web/api/common/ryform.php new file mode 100644 index 000000000..40373febd --- /dev/null +++ b/code/web/api/common/ryform.php @@ -0,0 +1,680 @@ +. + */ + +include_once (RYAPI_PATH.'/common/ryformBases.php'); + +class ryVar extends basicRyForm { + public $formName = ''; + public $varName = ''; + public $varValue = ''; + + function getFormDefs() { + return array( + new ryFormDef('varName', DEF_TYPE_TEXT), + new ryFormDef('varValue', DEF_TYPE_TEXT), + ); + } + + function getHtmlRepr() { + return $this->varName.' => '.$this->varValue; + } +} + +class ryForm { + + private $name = ''; + private $defines = array(); + private $template = ''; + + static private $forms; + static private $ryformsIcons = array(); + + function __construct($dir, $name) { + $this->name = $name; + self::$forms[$dir.'/'.$name] = $this; + } + + static function addRyFormIcon($ryform_name, $icon) { + self::$ryformsIcons[$ryform_name] = $icon; + } + + function addDefine($def) { + $this->defines[$def->name] = $def; + } + + function setTemplate($template) { + $this->template = $template; + } + + function getTemplate() { + return $this->template; + } + + function addValue($name, $value) { + if (array_key_exists($name, $this->defines)) + $this->defines[$name]->value = $value; + else + return false; + return true; + } + + function addExtraValues($name, $value) { + if (array_key_exists($name, $this->defines)) + $this->defines[$name]->extraValues = $value; + else + return false; + return true; + } + + function getForm($params) { + + if (isset($params['ryform_action']) && $params['ryform_action']) { + $res = $this->doAction($params); + return $res; + } + + if (@$params['validate'] == $this->name) + return array(DATA_FORM_VALUES, $_POST); + + if (isset($params['ryform_parent'])) + $parent_ryform_name = $params['ryform_parent'].'/'; + else + $parent_ryform_name = ''; + + $action =_url(ryzom_get_params(), array('validate' => $this->name)); + $ret = ''; + $ret .= '
'."\n"; + + if (!$this->getTemplate()) { + $ret .= ' '."\n"; + $ret .= ' '._s('t header', '')."\n"; + $tmpl = ''; + } else { + $tmpl = $this->getTemplate(); + } + + $i = 0; + + foreach ($this->defines as $def_id => $def) { + if ($def->name == 'name') + $def->name = '_name'; + + $deffullname = $def->name; + $url_params = ryzom_get_params(); + $type = $def->type; + $infos = $def->infos; + $value = ($def->value !== NULL)?$def->value:$def->defaultValue; + + if (!is_object($value) && !is_array($value)) + $str_value = _h(strval($value)); + else + $str_value = ''; + + if ($def->hidden) + $type = DEF_TYPE_HIDDEN; + + $hidden = false; + $input = ''; + switch ($type) { + + case DEF_TYPE_HIDDEN: + $input = ''."\n"; + $hidden = true; + break; + + case DEF_TYPE_TEXT: + $input = ''; + break; + case DEF_TYPE_NAMEID: + $input = ''; + break; + + case DEF_TYPE_ID: + case DEF_TYPE_INT: + case DEF_TYPE_FLOAT: + $input = ''; + break; + + case DEF_TYPE_BOOL: + $input = ''; + break; + + case DEF_TYPE_OPTION_FUNCTION: + case DEF_TYPE_OPTION: + if ($type == DEF_TYPE_OPTION) + $options = $def->params; + else { + if (is_array($def->defaultValue)) + $options = call_user_func_array($def->params, $def->defaultValue); + else + $options = call_user_func($def->params); + } + $input = ''; + break; + + case DEF_TYPE_COMBO_FUNCTION: + case DEF_TYPE_COMBO: + if ($type == DEF_TYPE_COMBO) + $options = $def->params; + else { + if (is_array($def->defaultValue)) + $options = call_user_func_array($def->params, $def->defaultValue); + else + $options = call_user_func($def->params); + } + if (_user()->ig) { + // TODO : try to do it with lua + } else { // HTML 4 + $input .= ' + '; + } + break; + + case DEF_TYPE_TEXTAREA: + if (!$value) + $value = ""; + $input = '
'.($type == DEF_TYPE_BBCODE?'- BBCode -
':'').'
'; + break; + + case DEF_TYPE_TRAD: + $base = ''; + $param = $def->name; + $value = array_merge(array('en' => '', 'fr' => '', 'de' => '', 'ru' => '', 'es' => ''), $value); + $base = ryzom_get_param('select_base', ''); + $edit = $display = $input_header = ''; + foreach (array('en', 'fr', 'de', 'ru', 'es') as $lang) { + if (_user()->lang == $lang) + $edit = _i($lang == 'en'?API_URL.'data/img/lang/us.png':API_URL.'data/img/lang/'.$lang.'.png').' '; + if ((!$base && $value[$lang]) || $base == $lang) { + $base = $lang; + $display = strtoupper($lang).' = '.str_replace("\n", '
', _h($value[$lang])).'
'; + } + $input .= ''; + $input_header .= _l(_i($lang == 'en'?API_URL.'data/img/lang/us.png':API_URL.'data/img/lang/'.$lang.'.png'), $url_params, array('select_base' => $lang)).'  '; + } + + $input = $input_header.$input.'   '.$display.'
'.$edit; + break; + + case DEF_TYPE_RYFORM: + case DEF_TYPE_RYFORMS_ARRAY: + $savedRyform = $value; + if (is_array($savedRyform)) { + $to_clean = array(); + foreach ($savedRyform as $id => $ryform) { + if (!is_object($ryform)) + $to_clean[] = $id; + } + foreach ($to_clean as $id) + unset($savedRyform[$id]); + $savedRyform = array_values($savedRyform); + } else if (is_object($savedRyform)) { + $savedRyform = array($savedRyform); + } else + $savedRyform = array(); + + $input .= '
'._t('parameter').''._t('value').'
'; + if ($savedRyform) { + foreach ($savedRyform as $id => $ryform) { + if (!is_object($ryform)) { + p('!!! ERROR !!!', $ryform); + continue; + } + $ryform->id = $id+1; + if (!isset($ryform->formName) || !$ryform->formName) + $ryform->formName = 'Element '.$id; + if (count($savedRyform) > 1) + $display_id = ''.strval(intval($id)+1).''; + else + $display_id = ''; + + $script_up = ($id != 0)?_l(_i('16/arrow_up', _t('up')), $url_params, array('ryform_name' => $parent_ryform_name.$deffullname.':'.$id, 'ryform_action' => 'up')).' ':''; + $script_down = ($id != count($savedRyform)-1)?_l(_i('16/arrow_down', _t('down')), $url_params, array('ryform_name' => $parent_ryform_name.$deffullname.':'.$id, 'ryform_action' => 'down')).' ':''; + + $icon = (isset(self::$ryformsIcons[get_class($ryform)]))?self::$ryformsIcons[get_class($ryform)]:_i('32/brick'); + $input .= _s('t row '.($id%2), + ''. + ''. + ''); + } + } + $input .= '
'._l(($def->type == DEF_TYPE_RYFORM?_i('16/arrow_redo', _t('change')):_i('16/add', _t('add'))), $url_params, array('ryform_name' => $parent_ryform_name.$deffullname.':'.strval(intval($id)+1), 'ryform_action' => 'list')).' '.$display_id.''.$script_up.$script_down.' + + + +
'.$icon.''. + _l($ryform->formName, $url_params, array('ryform_name' => $parent_ryform_name.$deffullname.':'.$id, 'ryform_action' => 'edit')).' '. + '
'._t(get_class($ryform).'_short_description').'
'.$ryform->getHtmlRepr().'
'. + _l(_i('16/script_edit', _t('edit')), $url_params, array('ryform_name' => $parent_ryform_name.$deffullname.':'.$id, 'ryform_action' => 'edit')).' '. + _l(_i('16/script_code', _t('edit_source')), $url_params, array('ryform_name' => $parent_ryform_name.$deffullname.':'.$id, 'ryform_action' => 'source')).'      '. + _l(_i('16/script_delete', _t('del')), $url_params, array('ryform_name' => $parent_ryform_name.$deffullname.':'.$id, 'ryform_action' => 'del')).' 
'; + if (count($savedRyform) == 0 || $def->type != DEF_TYPE_RYFORM) { + if (is_string($def->params)) + $infos = _l(_i('16/add', _t('add')), $url_params, array('new_ryform' => $def->params, 'ryform_name' => $parent_ryform_name.$deffullname.':0', 'ryform_action' => 'add')); + else if (count($def->params) == 1) + $infos = _l(_i('16/add', _t('add')), $url_params, array('new_ryform' => $def->params[0], 'ryform_name' => $parent_ryform_name.$deffullname.':0', 'ryform_action' => 'add')); + else + + $infos = _l(_i('16/add', _t('add')), $url_params, array('ryform_name' => $parent_ryform_name.$deffullname.':0', 'ryform_action' => 'list')); + + if ($type == DEF_TYPE_RYFORMS_ARRAY) + $infos .= '   '._l(_i('16/application_form_add', _t('multiadd')), $url_params, array('ryform_name' => $deffullname, 'ryform_action' => 'list_multiadd')); + } + break; + + case DEF_TYPE_FUNCTION: + if (is_array($def->defaultValue)) + list($result_type, $value) = call_user_func_array($def->params, $def->defaultValue); + else + list($result_type, $value) = call_user_func($def->params); + if ($result_type == DATA_HTML_FORM) { + return array(DATA_HTML_FORM, $value); + } else { + unset($url_params[$deffullname.'_action']); + $input = $value; + } + break; + + default: + $input = ''.$value."\n"; + $hidden = true; + + } + + if ($hidden) + $ret .= $input; + else + { + if ($tmpl) { + $tmpl = str_replace('{'.$def->name.'}', 'ig?'color="orange" size="11"':'style="color:orange;"').'>'._t($def->prefixTrad.$def->name).'', $tmpl); + $tmpl = str_replace('{'.$def->name.'.input}', $input, $tmpl); + $tmpl = str_replace('{'.$def->name.'.infos}', $infos, $tmpl); + } else + $ret .= _s('t row '.strval($i % 2), ' '.(!$def->optional?'*':'').($def->superAdmin?'##':'').($def->admin?'#':'')._t($def->prefixTrad.$def->name).''.$input.''.$infos.'')."\n"; + $i++; + } + } + + if ($tmpl) { + $tmpl = str_replace('{submit.input}', '', $tmpl); + $ret .= $tmpl; + $ret .= ''._s('t row '.strval($i % 2), '').'
     '._t('required_fields').'
'; + } else { + $ret .= _s('t row '.strval($i % 2), '     '._t('required_fields').''); + $ret .= ''; + } + $ret .= '

'; + return array(DATA_HTML_FORM, $ret."\n"); + } + + + function doAction($url_params) { + if (!$url_params['ryform_name']) + return array(DATA_RYFORM_VALUE, array()); + $ret = ''; + $ryforms = explode('/', $url_params['ryform_name']); + $this_ryform_name = array_shift($ryforms); + list($ryform_name,$ryform_pos) = explode(':', $this_ryform_name); + if (!isset($this->defines[$ryform_name])) + return 'Bad ryform name'; + $def = $this->defines[$ryform_name]; + + if ($ryforms) { + $action = 'edit'; + $next_action = $url_params['ryform_action']; + } else { + $action = $url_params['ryform_action']; + $next_action = ''; + } + + switch ($action) { + case 'list': + if (isset($url_params['ryform_parent']) && $url_params['ryform_parent']) + $ryform_parent = $url_params['ryform_parent'].'/'; + else + $ryform_parent = ''; + $ret .= ''; + foreach ($def->params as $id => $ryform) { + if (is_array($ryform)) { + $ret .= _s('t row 1', ''); + foreach ($ryform as $subid => $subryform) { + $ret .= _s('t row '.($subid%2), ''); + } + } else + $ret .= _s('t row '.($id%2), ''); + } + $ret .= '
'.ryzom_font(_t('ryform_cat_'.$id), '', '12').''.self::$ryformsIcons[$subryform].'  '. + _l(_t($subryform.'_short_description'), $url_params, array('ryform_name' => $ryform_parent.$url_params['ryform_name'], 'ryform_action' => 'add', 'new_ryform' => $subryform)).''.$subryform.''.self::$ryformsIcons[$ryform].'  '. + _l(_t($ryform.'_short_description'), $url_params, array('ryform_name' => $ryform_parent.$url_params['ryform_name'], 'ryform_action' => 'add', 'new_ryform' => $ryform)).''.$ryform.'
'; + return array(DATA_HTML_FORM, $ret); + break; + + case 'list_multiadd': + // TODO + /* + unset($url_params[$deffullname.'_action']); + $ret .= ''; + foreach ($def->params as $ryform) { + $ret .= ''; + } + $ret .= '
'._l($ryform, $url_params, array('ryform_action' => 'multiadd', 'new_ryform' => $ryform)).'
'; + return array(DATA_HTML_FORM, $ret);*/ + break; + + case 'add': + $new_ryform = ryzom_get_param('new_ryform'); + $valid_ryform = false; + if ($new_ryform) { + + if ((is_string($def->params) && $new_ryform == $def->params) || in_array($new_ryform, $def->params)) + $valid_ryform = true; + else { + foreach ($def->params as $param) { + if (is_array($param) && in_array($new_ryform, $param)) + $valid_ryform = true; + } + } + if (!$valid_ryform) + return array(DATA_HTML_FORM, 'Bad ryform'); + + } else { + $new_ryform = $def->params; + } + $ryform = new $new_ryform($new_ryform, ''); + $ryform->preSerialization(); + if ($def->type != DEF_TYPE_RYFORM) { + p($def->value); + if (!is_array($def->value)) + $savedRyform = array($def->value); + else + $savedRyform = $def->value; + if ($ryform_pos === 0) { + $value = array_values(array_merge(array($ryform), $savedRyform)); + } else if ($ryform_pos !== NULL) { + $begin = array_slice($savedRyform, 0, $ryform_pos); + $end = array_slice($savedRyform, $ryform_pos, count($savedRyform)-$ryform_pos); + $value = array_values(array_merge($begin, array($ryform), $end)); + } else + $value[] = $ryform; + p($ryform_name, $value); + //return array(DATA_RYFORM_VALUE, array('stages' => array())); + return array(DATA_RYFORM_VALUE, array($ryform_name => $value)); + } else { + p($ryform_name, $ryform); + return array(DATA_RYFORM_VALUE, array($ryform_name => $ryform)); + } + break; + + case 'edit': + $a_ryforms = $def->value; + if (is_array($a_ryforms)) + $ryform = $a_ryforms[$ryform_pos]; + else + $ryform = $a_ryforms; + $ryform->postSerialization(); + $validate = isset($url_params['validate']) && $url_params['validate']; + + $form = new ryForm('', $def->name); + foreach ($ryform->getFormDefs() as $form_def) { + $form->addDefine($form_def); + $name = $form_def->name; + // Init form with ryfom values + if (property_exists($ryform, $name)) { + $form->addValue($form_def->name, $ryform->$name); + } + } + foreach ($ryform->getFormDefsExtraValues() as $def_name => $extra_values) + $form->addExtraValues($def_name, $extra_values); + $form->setTemplate($ryform->getTemplate()); + + list($result_type, $value) = $form->getForm(array('action' => $url_params['action'], 'script' => $url_params['script'], 'ryform_action' => $next_action, 'ryform_parent' => $this_ryform_name, 'ryform_name' => implode('/', $ryforms), 'validate' => $validate)); + if ($result_type == DATA_HTML_FORM) { + return array(DATA_HTML_FORM, $value); + } else { + if ($result_type == DATA_FORM_VALUES) + $value = $form->validateFormPost($value); + $ryform->setFormParams($value); + $ryform->preSerialization(); + + } + if (is_array($a_ryforms)) + $a_ryforms[$ryform_pos] = $ryform; + else + $a_ryforms = $ryform; + + $value = array($ryform_name => $a_ryforms); + return array(DATA_RYFORM_VALUE, $value); + break; + + + case 'del': + $id = $ryform_pos; + p($def->value); + if (!is_array($def->value)) + $def->value = array(); + else + unset($def->value[$id]); + $value = array_values($def->value); + return array(DATA_RYFORM_VALUE, array($ryform_name => $value)); + break; + + case 'up': + $a_ryforms = $def->value; + if (!is_array($a_ryforms)) + ryzom_redirect(_url($url_params, array('ryform_action' => ''))); + + $temp_ryform = $a_ryforms[$ryform_pos-1]; + $a_ryforms[$ryform_pos-1] = $a_ryforms[$ryform_pos]; + $a_ryforms[$ryform_pos] = $temp_ryform; + $a_ryforms = array_values($a_ryforms); + p($ryform_name, $a_ryforms); + return array(DATA_RYFORM_VALUE, array($ryform_name => $a_ryforms)); + break; + + case 'down': + $a_ryforms = $def->value; + if (!is_array($a_ryforms)) + ryzom_redirect(_url($url_params, array('ryform_action' => ''))); + + $temp_ryform = $a_ryforms[$ryform_pos+1]; + $a_ryforms[$ryform_pos+1] = $a_ryforms[$ryform_pos]; + $a_ryforms[$ryform_pos] = $temp_ryform; + $a_ryforms = array_values($a_ryforms); + return array(DATA_RYFORM_VALUE, array($ryform_name => $a_ryforms)); + break; + + case 'source': + $a_ryforms = $def->value; + if (is_array($a_ryforms)) + $ryform = $a_ryforms[$ryform_pos]; + else + $ryform = $a_ryforms; + $ryform->postSerialization(); + + $form = new ryForm('', $def->name); + $form->addDefine(new ryFormDef('ryform_source', DEF_TYPE_TEXTAREA, '', base64_encode(serialize($ryform)))); + $validate = isset($url_params['validate']) && $url_params['validate']; + list($result_type, $value) = $form->getForm(array('ryform_action' => $next_action, 'ryform_parent' => $this_ryform_name, 'ryform_name' => implode('/', $ryforms), 'validate' => $validate)); + if ($result_type == DATA_HTML_FORM) { + return array(DATA_HTML_FORM, $value); + } else { + if ($result_type == DATA_FORM_VALUES) + $params = $form->validateFormPost($value); + else + $params = $value; + $ryform = unserialize(base64_decode($params['ryform_source'])); + if (!is_object($ryform)) { + unset($url_params['validate']); + ryzom_redirect(_url($url_params, array('ryform_action' => '', 'message' => 'bad_paste'))); + } + + $is_valid = false; + p($def->params); + foreach ($def->params as $id => $ryform_class) { + if (is_array($ryform_class)) { + if (in_array(get_class($ryform), array_values($ryform_class))) + $is_valid = true; + } else if (get_class($ryform) == $ryform_class) + $is_valid = true; + } + if (!$is_valid) { + p(get_class($ryform), $def->params); + ryzom_redirect(_url($url_params, array($deffullname.'_action' => '', 'message' => 'not_valid_stage'))); + return; + } + if (is_array($a_ryforms)) + $a_ryforms[$ryform_pos] = $ryform; + else + $a_ryforms = $ryform; + $value = array($ryform_name => $a_ryforms); + return array(DATA_RYFORM_VALUE, $value); + } + return; + break; + } + + return $ret; + } + + function validateFormPost($params, $use_default=true) { + $final = array(); + foreach ($this->defines as $def) { + $name = $def->name; + if ($def->name == 'name') + $def->name = '_name'; + + $type = $def->type; + if ($def->hidden) + $type = DEF_TYPE_HIDDEN; + + if (isset($params[$def->name])) { + $value = $params[$def->name]; + } else if (!$use_default) { + continue; + } else { + $value = ''; + } + + + switch ($type) { + + case DEF_TYPE_HIDDEN: + case DEF_TYPE_TEXT: + case DEF_TYPE_OPTION: + case DEF_TYPE_TEXTAREA: + $final[$name] = $value; + break; + + case DEF_TYPE_TRAD: + if (!$value[_user()->lang] && $value['europeanunion']) + $value[_user()->lang] = $value['europeanunion']; + $final[$name] = $value; + break; + + case DEF_TYPE_NAMEID: + $final[$name] = cleanNameID($value); + break; + + case DEF_TYPE_COMBO: + $final[$name] = $value; + break; + + case DEF_TYPE_ID: + case DEF_TYPE_INT: // TODO + $final[$name] = intval($value); + break; + case DEF_TYPE_FLOAT: // TODO + $final[$name] = floatval($value); + break; + + case DEF_TYPE_BOOL: + $final[$name] = $value == 'on'; + break; + + case DEF_TYPE_RYFORM: + if (is_array($value)) + $final[$name] = $value[0]; + break; + case DEF_TYPE_RYFORMS_ARRAY: + break; + + default: + $final[$name] = $value; + + } + } + return $final; + } + +/* + function reset() { + + // Clean all temp files + $userDatas = _tools()->listAppDataFiles($this->dir); + foreach ($userDatas as $userData) { + if (substr($userData, 0, strlen($this->name)) == $this->name) + _tools()->saveAppData($this->dir.'/'.$userData, NULL); + } + }*/ +} + +?> diff --git a/code/web/api/common/ryformBases.php b/code/web/api/common/ryformBases.php new file mode 100644 index 000000000..07762953f --- /dev/null +++ b/code/web/api/common/ryformBases.php @@ -0,0 +1,304 @@ +. + */ + +define('DEF_TYPE_UNKNOWN', 0); +define('DEF_TYPE_HIDDEN', 1); +define('DEF_TYPE_TEXT', 2); +define('DEF_TYPE_ID', 3); +define('DEF_TYPE_INT', 4); +define('DEF_TYPE_FLOAT', 5); +define('DEF_TYPE_BOOL', 6); +define('DEF_TYPE_OPTION', 7); +define('DEF_TYPE_TEXTAREA', 8); +define('DEF_TYPE_TRAD', 9); +define('DEF_TYPE_FORM', 10); +define('DEF_TYPE_ICON', 11); +define('DEF_TYPE_RYFORM', 12); +define('DEF_TYPE_RYFORMS_ARRAY', 13); +define('DEF_TYPE_BBCODE', 14); +define('DEF_TYPE_FUNCTION', 15); +define('DEF_TYPE_COMBO', 16); +define('DEF_TYPE_OPTION_FUNCTION', 17); +define('DEF_TYPE_NAMEID', 18); +define('DEF_TYPE_COMBO_FUNCTION', 19); +define('DEF_TYPE_DATE', 20); + + +define('DEF_TYPE_ICON_UNKNOWN', 0); +define('DEF_TYPE_ICON_SHARED', 1); +define('DEF_TYPE_ICON_RYZITEM', 2); +define('DEF_TYPE_ICON_URL', 3); + +define('DATA_HTML_FORM', 0); +define('DATA_FORM_VALUES', 1); +define('DATA_FORM_VALID_VALUES', 2); +define('DATA_RYFORM_VALUE', 3); + +function cleanFormName($name) { + $final_name = ''; + for ($i=0; $i= ord('a')) && (ord(strtolower($c)) <= ord('z'))) || + (in_array($c, array('-', '.', '_'))) || + (ord(strtolower($c)) >= ord('0')) && (ord(strtolower($c)) <= ord('9')) ) + $final_name .= $c; + } + return $final_name; +} + +function cleanNameID($name) { + $final_name = ''; + for ($i=0; $i= ord('a')) && (ord(strtolower($c)) <= ord('z'))) || + (ord($c) >= ord('0')) && (ord($c) <= ord('9')) ) + $final_name .= $c; + } + return $final_name; +} + +function getNameId($name) { + return str_replace('_', ' ', $name); +} + +function getTrad($value) { + if ($value[_user()->lang]) + $trad = $value[_user()->lang]; + foreach (array('en', 'fr', 'de', 'ru', 'es') as $lang) { + if ($value[$lang]) { + $trad = $value[$lang]; + break; + } + } + if (substr($trad, 0, 2) == '//') + $trad = strstr(str_replace("\r", '', $trad), "\n"); + return substr($trad, 1); +} + +function setRyformSource($object, $src, $indent=0, $protecteds=array()) { + $c = ''; + $src = str_replace("\r", '', $src); + $ssrc = explode("\n", $src); + $mode = 'var'; + $cache = ''; + $current_ryform = NULL; + foreach ($ssrc as $line) { + if (!$line) + continue; + if ($mode != 'ryform') + $c .= str_repeat("\t", $indent); + switch ($mode) { + case 'ryform': + if ($line[0] == "\t") { + $cache .= substr($line, 1)."\n"; + break; + } else { + $mode = 'array'; + } + + case 'array': + if ($line == ')' || $line == '}') { + if ($cache && $current_ryform) { + $c .= $current_ryform->setSource($cache, $indent+1); + $c .= 'SET SOURCE '; + if ($line == ')') + $array[] = $current_ryform; + else + $array = $current_ryform; + } + if (array_key_exists($var_name, $protecteds)) + call_user_func(array($object, $protecteds[$var_name]), $array); + else + $object->$var_name = $array; + $mode = 'var'; + $cache = ''; + continue; + } else if ($line[0] == '[') { + if ($cache && $current_ryform) { + $c .= $current_ryform->setSource($cache, $indent+1); + $array[] = $current_ryform; + $c .= 'SET SOURCE '; + } + $ryform_name = substr($line, 1, strlen($line)-2); + $c .= 'New Ryform: '.$ryform_name."\n"; + $cache = ''; + $current_ryform = new $ryform_name(); + $mode = 'ryform'; + continue; + } + break; + + default: + $sep = strpos($line, '='); + if ($sep) { + $var_name = substr($line, 0, $sep-1); + $value = substr($line, $sep+2); + if ($value == '(' || $value == '{') { + $c .= $var_name.' is ARRAY'."\n"; + $mode = 'array'; + $array = array(); + } else { + $c .= $var_name .' = '.$value."\n"; + if ($value[0] == '\'' && $value[strlen($value)-1] == '\'') + $object->$var_name = str_replace('\n', "\n", substr($value, 1, -1)); + else { + if (is_numeric($value)) + $object->$var_name = eval('return '.$value.';'); + else if ($value == 'false') + $object->$var_name = false; + else if ($value == 'true') + $object->$var_name = true; + else if ($value == 'NULL') + $object->$var_name = NULL; + } + } + } + break; + } + } + return $c; + } + +interface iRyForm { + function getForm($url_params); + function setFormParams($params); + function getHtmlRepr(); + function getFormDefs(); + function getFormDefsExtraValues(); + function preSerialization(); + function postSerialization($vars=array()); + function getTemplate(); +} + +class ryFormDef { + + public $name = ''; + public $type = DEF_TYPE_UNKNOWN; + public $params = array(); + public $infos = ''; + public $defaultValue = NULL; + public $value = NULL; + public $extraValues = array(); + public $hidden = false; + public $optional = false; + public $admin = false; + public $superAdmin = false; + public $prefixTrad = ''; + + function __construct($name, $type, $params=array(), $defaultValue=NULL, $optional=false, $infos='') { + $this->name = $name; + $this->type = $type; + $this->params = $params; + $this->defaultValue = $defaultValue; + $this->optional = $optional; + $this->infos = $infos; + } + +} + +class basicRyForm implements iRyForm { + public $formName = ''; // Used by Form + public $id = 0; + + function __construct($name='', $title='') { + } + + function getForm($url_params) { + $form = new ryForm($this->formName); + $form_defs = $this->getFormDefs(); + foreach ($form_defs as $def) + $form->addDefine($def); + return $form->getForm(_s('section', $this->formName.' ('.get_class($this).')')); + } + + function setFormParams($params) { + foreach ($params as $name => $value) { + if (property_exists($this, $name)) + $this->$name = $value; + } + } + + function getHtmlRepr() { + return $this->formName.' ('.get_class($this).')'; + } + + function getFormDefs() { + return array(); + } + + function getFormDefsExtraValues() { + return array(); + } + + /*function preSerialization() { + unset($this->tools); + }*/ + + function preSerialization() { + $all_defs = array('class_name'); + $this->author = _user()->id; + foreach ($this->getFormDefs() as $def) + $all_defs[] = $def->name; + + foreach (get_object_vars($this) as $name => $value) { + if (!in_array($name, $all_defs)) + unset($this->$name); + } + } + + function postSerialization($vars=array()) { + } + + function getTemplate() { + return ''; + } + + function getSource($indent=0) { + $attrs = $this->getFormDefs(); + $c = str_repeat("\t", $indent-1).'['.get_class($this).']'."\n"; + foreach ($attrs as $attr) { + $c .= str_repeat("\t", $indent).$attr->name.' '; + $var = $this->{$attr->name}; + if (is_object($var)) { + $c .= "= {\n".substr($var->getSource($indent+1), 0, -1)."\n".str_repeat("\t", $indent).'}'; + } else if (is_array($var)) { + $c .= '= ('."\n"; + foreach ($var as $element) { + if (is_object($element)) + $c .= $element->getSource($indent+1); + else if ($element) + $c .= '#'.str_replace("\r", '', str_replace("\n", '\\\\n', var_export($element, true))); + } + $c .= str_repeat("\t", $indent).")"; + } else + $c .= '= '.str_replace("\r", '', str_replace("\n", '\\\\n', var_export($var, true))); + $c .= "\n"; + } + return $c; + } + + function setSource($src, $indent=0) { + $this->preSerialization(); + return setRyformSource($this, $src, $indent); + } +} + +?> diff --git a/code/web/api/common/time.php b/code/web/api/common/time.php new file mode 100644 index 000000000..9d2020efe --- /dev/null +++ b/code/web/api/common/time.php @@ -0,0 +1,130 @@ +. + */ + +/* Basic constants */ +/* 1 IG hour = 3 IRL minutes = 1800 ticks */ +define('RYTIME_HOUR_TICKS', 1800); +define('RYTIME_DAY_HOURS', 24); +define('RYTIME_SEASON_DAYS', 90); +define('RYTIME_MONTH_DAYS', 30); +define('RYTIME_CYCLE_MONTHS', 12); +define('RYTIME_JY_CYCLES', 4); +define('RYTIME_WEEK_DAYS', 6); +/* 0 = spring, 1 = summer, 2 = automn, 3 = winter */ +define('RYTIME_CYCLE_SEASONS', 4); +/* Tick is offset on server of 61 days. */ +define('RYTIME_TICK_OFFSET', 61 * RYTIME_DAY_HOURS * RYTIME_HOUR_TICKS); + +define('RYTIME_START_JY', 2568); + +/* Helpers */ +define('RYTIME_CYCLE_DAYS',RYTIME_CYCLE_MONTHS * RYTIME_MONTH_DAYS); +define('RYTIME_JY_DAYS', RYTIME_CYCLE_DAYS * RYTIME_JY_CYCLES); +define('RYTIME_JY_MONTHS', RYTIME_CYCLE_MONTHS * RYTIME_JY_CYCLES); + +// Takes a server tick and returns a computed array +function ryzom_time_array($tick) { + $out = array(); + $out["server_tick"] = $tick; + + $time_in_hours = ($tick-RYTIME_TICK_OFFSET) / RYTIME_HOUR_TICKS; + $day = $time_in_hours / RYTIME_DAY_HOURS; + + $out["jena_year"] = floor($day / RYTIME_JY_DAYS) + RYTIME_START_JY; + if ($day < 0) $day = RYTIME_JY_DAYS - abs($day) % RYTIME_JY_DAYS; + $out["day_of_jy"] = $day % RYTIME_JY_DAYS; + $out["month_of_jy"] = floor($out["day_of_jy"] / RYTIME_MONTH_DAYS); + + $out["cycle"] = floor($out["day_of_jy"] / RYTIME_CYCLE_DAYS); + $out["day_of_cycle"] = $day % RYTIME_CYCLE_DAYS; + $out["month_of_cycle"] = $out["month_of_jy"] % RYTIME_CYCLE_MONTHS; + + $out["day_of_month"] = $out["day_of_jy"] % RYTIME_MONTH_DAYS; + $out["day_of_week"] = $day % RYTIME_WEEK_DAYS; + + $out["season"] = ($day / RYTIME_SEASON_DAYS) % RYTIME_CYCLE_SEASONS; + $out["day_of_season"] = $day % RYTIME_SEASON_DAYS; + + $out["time_of_day"] = abs($time_in_hours) % RYTIME_DAY_HOURS; + if ($time_in_hours < 0 && $out["time_of_day"]) $out["time_of_day"] = RYTIME_DAY_HOURS - $out["time_of_day"]; + + return $out; +} + +function ryzom_time_xml_without_cache($rytime) { + $out = new SimpleXMLElement(''); + foreach($rytime as $key => $value) { + $out->addChild($key, $value); + } + return $out; +} + +/** + * Take number of the month (0-11) and returns its name + */ +function ryzom_month_name($month_number) { + if ($month_number < 0 || $month_number > 11) return "bad month"; + + $RYTIME_MONTHS = array( + 'Winderly', 'Germinally', 'Folially', 'Floris', + 'Medis', 'Thermis', 'Harvestor', 'Frutor', + 'Fallenor', 'Pluvia', 'Mystia', 'Nivia' + ); + + return $RYTIME_MONTHS[(int)$month_number]; +} + + +/** + * Take number of the day of week (0-5) and returns its name + */ +function ryzom_day_name($day_number) { + if ($day_number < 0 || $day_number > 5) return "bad day of week"; + + $RYTIME_DAYS = array( + 'Prima', 'Dua', 'Tria', + 'Quarta', 'Quinteth', 'Holeth' + ); + + return $RYTIME_DAYS[(int)$day_number]; +} + +/** + * Take a computed ryzom time array and returns the formatted date + * (Official 2004 Format without trailing JY) + */ +function ryzom_time_txt($rytime, $lang = "en") { + if ($lang != "en" && $lang != "fr" && $lang != "de") $lang = "en"; + + $RYTIME_AC = array( + "de" => array("1. AZ", "2. AZ", "3. AZ", "4. AZ"), + "en" => array("1st AC", "2nd AC", "3rd AC", "4th AC"), + "fr" => array("1er CA", "2e CA", "3e CA", "4e CA") + ); + + # Day, Month DayOfMonth, CycleNth AC JY + return sprintf("%sh - %s, %s %d, %s %d", + $rytime["time_of_day"], + ryzom_day_name($rytime["day_of_week"]), + ryzom_month_name($rytime["month_of_cycle"]), + $rytime["day_of_month"] + 1, + $RYTIME_AC[$lang][$rytime["cycle"]], + $rytime["jena_year"]); +} + +?> \ No newline at end of file diff --git a/code/web/api/common/user.php b/code/web/api/common/user.php index 62a2de0c8..055332e97 100644 --- a/code/web/api/common/user.php +++ b/code/web/api/common/user.php @@ -1,3 +1,69 @@ . + */ + + +class ryUser { + private $infos; + + function __construct($infos) { + $this->infos = $infos; + } + + function __get($name) + { + if (array_key_exists($name, $this->infos)) { + return $this->infos[$name]; + } else { + /** TODO **/ + return NULL; + } + } + + function inGroup($groups) { + $groups = explode(':', $groups); + foreach ($groups as $group) { + if ($group != '') { + if (in_array($group, $this->groups)) + return true; + if ('P_'.$this->id == $group) + return true; + if ('G_'.$this->guild_id == $group) + return true; + if ($group == '*') + return true; + } + } + return false; + } +} + +function ryzom_auth_user($ask_login=true, $welcome_message='') { + global $user, $_USER; + + $result = ryzom_app_authenticate($user, $ask_login, $welcome_message, true); + $_USER = new RyUser($user); + return $result; +} + +function _user() { + global $_USER; + return $_USER; +} + ?> diff --git a/code/web/api/common/utils.php b/code/web/api/common/utils.php index 9f12fdfc1..129d67d9d 100644 --- a/code/web/api/common/utils.php +++ b/code/web/api/common/utils.php @@ -1,6 +1,40 @@ . + */ + include_once('logger.php'); +include_once('dfm.php'); + +define('SERVER', 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']); + +function stripslashes_deep($value) +{ + $value = is_array($value) ? + array_map('stripslashes_deep', $value) : + stripslashes($value); + + return $value; +} + +if (ini_get('magic_quotes_gpc') == 1) { + $_POST = stripslashes_deep($_POST); + $_GET = stripslashes_deep($_GET); +} // Always use this function to get param because in game, the param can be pass by _GET or by _POST function ryzom_get_param($var, $default='') @@ -24,13 +58,30 @@ function parse_query($var) foreach($var as $val) { $x = explode('=', $val); - $arr[$x[0]] = urldecode($x[1]); + if (count($x) > 1) + $arr[$x[0]] = urldecode($x[1]); + else + $arr[$x[0]] = ''; } unset($val, $x, $var); } return $arr; } +function ryzom_get_params() +{ + if (!isset($GLOBALS['URL_PARAMS'])) + $GLOBALS['URL_PARAMS'] = parse_query($_SERVER['REQUEST_URI']); + return $GLOBALS['URL_PARAMS']; +} + +function ryzom_unset_url_param($name) { + if (!isset($GLOBALS['URL_PARAMS'])) + $GLOBALS['URL_PARAMS'] = parse_query($_SERVER['REQUEST_URI']); + unset($GLOBALS['URL_PARAMS'][$name]); + return $GLOBALS['URL_PARAMS']; +} + if (!function_exists('http_build_query')) { function http_build_query($data, $prefix='', $sep='', $key='') { $ret = array(); @@ -50,6 +101,55 @@ if (!function_exists('http_build_query')) { } } +if(!function_exists('_url')){ + function _url($base_params=null, $add_params=array()){ + if ($base_params !== null) + return SERVER.'?'.http_build_query(array_merge($base_params, $add_params)); + else + return SERVER; + } +} + + +if(!function_exists('_h')){ + function _h($s){ + return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); + } +} + +if(!function_exists('_i')){ + function _i($img, $alt=''){ + if (substr($img, strlen($img)-4) == '.tga') // img from client texture : ig only + return $img; + + if (is_file(RYAPI_PATH.'/data/icons/'.$img.'.png')) + $img = RYAPI_URL.'/data/icons/'.$img.'.png'; + else if (is_file(RYAPP_PATH.'/data/icons/'.$img.'.png')) + $img = RYAPP_URL.'/data/icons/'.$img.'.png'; + else + $img = 'view_remove'; + + if ($alt) + return ''.utf8_decode($alt).''; + else + return ''; + + } +} + +if(!function_exists('_l')){ + function _l($text, $base_params=array(), $add_params=array()) + { + return ''.$text.''; + } +} + +if(!function_exists('_b')){ + function _b($text, $base_params=array(), $add_params=array()) + { + return ''.$text.''; + } +} /*** * @@ -66,8 +166,10 @@ function translation_exists($id) { function get_translation($id, $lang, $args=array()) { global $ryzom_texts, $user; if(!isset($ryzom_texts[$id])) return '{'.$id.'}'; - if(!isset($ryzom_texts[$id][$lang])) return '{'.$id.'['.$lang.']}'; - if($ryzom_texts[$id][$lang] == '' && isset($ryzom_texts[$id]['en'])) return @vsprintf($ryzom_texts[$id]['en'], $args); + if(empty($ryzom_texts[$id][$lang])){ + if(isset($ryzom_texts[$id]['en'])) return @vsprintf($ryzom_texts[$id]['en'], $args); + return '{'.$id.'['.$lang.']}'; + } return @vsprintf($ryzom_texts[$id][$lang], $args); } @@ -87,10 +189,12 @@ function _t($id, $args=array()) { $a = ' '.strval($args); } if(!isset($ryzom_texts[$id])) return '{'.$id.$a.'}'; - if(!isset($ryzom_texts[$id][$user['lang']])) return '{'.$id.'['.$user['lang'].']'.$a.'}'; - if($ryzom_texts[$id][$user['lang']] == '' && isset($ryzom_texts[$id]['en']) && $ryzom_texts[$id]['en'] != '') return @vsprintf($ryzom_texts[$id]['en'], $args); - if($ryzom_texts[$id][$user['lang']] == '' && isset($ryzom_texts[$id]['fr']) && $ryzom_texts[$id]['fr'] != '') return '{'.$id.$a.'}'; - if($ryzom_texts[$id][$user['lang']] == '' && isset($ryzom_texts[$id]['de']) && $ryzom_texts[$id]['de'] != '') return '{'.$id.$a.'}'; + if(empty($ryzom_texts[$id][$user['lang']])){ + if(!empty($ryzom_texts[$id]['en'])) return @vsprintf($ryzom_texts[$id]['en'], $args); + if(!empty($ryzom_texts[$id]['fr'])) return '{'.$id.$a.'}'; + if(!empty($ryzom_texts[$id]['de'])) return '{'.$id.$a.'}'; + return '{'.$id.'['.$user['lang'].']'.$a.'}'; + } return @vsprintf($ryzom_texts[$id][$user['lang']], $args); } @@ -100,7 +204,20 @@ function _t($id, $args=array()) { * * ***/ - +function ryzom_timer($timestamp) { + $d = intval($timestamp / 86400); + $timestamp = $timestamp % 86400; + $h = intval($timestamp / 3600); + $timestamp = $timestamp % 3600; + $m = intval($timestamp / 60); + $s = $timestamp % 60; + if ($d>1) + return sprintf('%d'._t('days').' %02d:%02d:%02d', $d, $h, $m, $s); + else if ($d) + return sprintf('%d'._t('day').' %02d:%02d:%02d', $d, $h, $m, $s); + else + return sprintf("%02d:%02d:%02d", $h, $m, $s); +} // Get a human and translated readable time, for example "3 days ago" function ryzom_relative_time($timestamp) { @@ -133,7 +250,10 @@ function ryzom_relative_time($timestamp) { } } - $final = $ryzom_periods[$user['lang']][$form][$j]; + if(!empty($ryzom_periods[$user['lang']][$form][$j])) + $final = $ryzom_periods[$user['lang']][$form][$j]; + else + $final = $ryzom_periods['en'][$form][$j]; $text = _t('date_format', array($difference, $final, $ending)); return $text; } @@ -150,33 +270,197 @@ function ryzom_absolute_time($timestamp) { return $text; } + +/*** + * + * Ryzom utilities + * + * + * ***/ + +function ryzom_generate_password($length=8, $level=2, $oneofeach=false) { + $validchars[1] = "0123456789abcdfghjkmnpqrstvwxyz"; + $validchars[2] = "0123456789abcdfghjkmnpqrstvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + $validchars[3] = "0123456789_!@#$%&*()-=+/abcdfghjkmnpqrstvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_!@#$%&*()-=+/"; + + $password = ""; + $counter = 0; + + while ($counter < $length) { + $actChar = substr($validchars[$level], rand(0, strlen($validchars[$level])-1), 1); + + // if $oneofeach then All character must be different (slower) + if (!$oneofeach || !strstr($password, $actChar)) { + $password .= $actChar; + $counter++; + } + } + + return $password; +} + + +function file_get_contents_cached($fn, $cache_time=300) { + global $ryzom_bench_text; + + $lfn = 'tmp/'.strtr($fn, ':/.?&=', '____________'); + + // get the new file from internet every $cache_time (default=5min) + if (file_exists($lfn) && filesize($lfn) > 0 && time() < filemtime($lfn) + $cache_time) { + $content = file_get_contents($lfn); + } else { + $content = file_get_contents($fn); + if ($content != '') file_put_contents($lfn, $content); + } + return $content; +} + +function ryzom_redirect($url, $group='', $extra_lua='') { + global $user; + $lua = $extra_lua."\n"; + if ($user['ig']) { + if (!$group) + $lua .= 'getUI(__CURRENT_WINDOW__):browse("'.str_replace('&', '&', $url).'")'; + else { + if (substr($group, 0, 3) == 'ui:') + $lua .= 'getUI("'.$group.'"):browse("'.str_replace('&', '&', $url).'")'; + else + $lua .= 'getUI("ui:interface:'.$group.':content:html"):browse("'.str_replace('&', '&', $url).'")'; + } + echo ''.$lua.''; + exit(); + } else { + header('Location: '.$url); + exit(); + } +} + /*** * * Debug tools * * ***/ -function p($var, $value=NULL) { +function alert($var, $value=NULL, $level=1) { + p($var, $value, '#FF7777', $level); +} + +define('pNULL', '§$£¤*µ%ù²&#!;,;:.?/?.<>'); + +function p($var, $value=pNULL, $color='#FFFF00', $level=0) { ob_start(); debug_print_backtrace(); $bt = ob_get_contents(); ob_end_clean(); - $bt = explode("\n",$bt); - $bt = explode('[', $bt[1]); - ob_start(); - echo ''.substr($bt[count($bt)-1], 0, -1)."\n"; - if ($value !== NULL) { - echo ''.$var.' : '; + $bt = explode("\n#",$bt); + if (isset($bt[$level])) + $bt1 = explode('[', $bt[$level]); + else + $bt1 = array(''); + + if (isset($bt[$level+1])) + $bt2 = explode('[', $bt[$level+1]); + else + $bt2 = array(''); + + $c = ''; + if ($value !== pNULL) { + $c .= ''.$var.' : '; $var = $value; } - //if (is_array($var)) - echo '
';
-	print_r($var);
-	echo '
'; -// else - // var_dump($var); - ryLogger::getInstance()->addPrint(ob_get_contents()); + $c .= ''.substr(str_replace("\n", "", $bt2[count($bt2)-1]), 0, -1).' => '.substr(str_replace("\n", "", $bt1[count($bt1)-1]), 0, -1)." "; + ryLogger::getInstance()->addPrint($c); + ob_start(); + var_dump($var); + ryLogger::getInstance()->addPrint(_h(ob_get_contents()), $color); ob_end_clean(); } + +/*** + * + * Lua tools + * + * ***/ + + class ryLua { + + static private $lua = array(); + static private $luaend = array(); + static private $indent; + static private $indentend; + static private $linkTargetId = 0; + + static function add($code, $indent=NULL) { + if ($indent !== NULL) + self::$indent += $indent; + $tabs = str_repeat(" ", self::$indent); + $a = $tabs.str_replace("\n", "\n ".$tabs, $code); + self::$lua[] = $a; + } + + static function addEnd($code, $indent=NULL) { + if ($indent !== NULL) + self::$indentend += $indent; + $tabs = str_repeat(" ", self::$indentend); + $a = $tabs.str_replace("\n", "\n ".$tabs, $code); + self::$luaend[] = $a; + } + + + static function get($ig) { + ryLogger::getInstance()->addPrint(implode("\n", self::$lua), '#FF00FF'); + $ret = ($ig)?"\n".implode("\n", self::$lua)."\n":''; + self::$lua = array(); + return $ret; + } + + static function getEnd($ig) { + ryLogger::getInstance()->addPrint(implode("\n", self::$luaend), '#FF55FF'); + $ret = ($ig)?"\n".implode("\n", self::$luaend)."\n":''; + self::$luaend = array(); + return $ret; + } + + static function text($text) { + return str_replace('"', '\"', $text); + } + + static function url($base_params=null, $add_params=array()) { + return str_replace('&', '&', _url($base_params, $add_params)); + } + + + function openLink($text, $target='webig', $base_params=array(), $add_params=array(), $urllua='', $runlua='') + { + $url = self::url($base_params, $add_params); + if ($target == "help_browser") + $url .= "&ignore="; + $id = ryzom_generate_password(8).strval(time()).strval(self::$linkTargetId++); + $lua = <<< END +function openLink{$id}() + runAH(nil, "browse", "name=ui:interface:{$target}:content:html|url={$url}"{$urllua}) + {$runlua} +end +END; + self::add($lua); + if (RYZOM_IG) + return ''.$text.''; + return $text; + } + + static function link($id, $luacode, $text) { + $lua = <<'.$text.''; + return $text; + } + +} + ?> diff --git a/code/web/api/common/xml_utils.php b/code/web/api/common/xml_utils.php new file mode 100644 index 000000000..28d166866 --- /dev/null +++ b/code/web/api/common/xml_utils.php @@ -0,0 +1,23 @@ +. + */ + +function ryzom_display_xml_header() { + header('Content-Type: application/xml; charset=UTF-8'); +} + +?> \ No newline at end of file diff --git a/code/web/api/data/css/ryzom_ui.css b/code/web/api/data/css/ryzom_ui.css index 8342b77f8..8b8e9ed37 100644 --- a/code/web/api/data/css/ryzom_ui.css +++ b/code/web/api/data/css/ryzom_ui.css @@ -33,14 +33,18 @@ color: white; } .ryzom-ui input, .ryzom-ui select { - border-top: 1px solid #030403; - border-right: 1px solid #6e7f57; - border-bottom: 1px solid #889e6c; - border-left: 1px solid #272d1f; - background-color: #37402b; - color: #ddd; + border-bottom: 1px solid #7B7E80; + border-left: 1px solid #7B7E80; + border-top: 1px solid #101010; + border-right: 1px solid #101010; + background-color: #1D1D1D; + border-radius: 3px; + color: #BBB; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; font-size: 12px; margin: 2px 0 5px 0; + padding: 1px; } .ryzom-ui input[type=text] { width: 100%; @@ -52,27 +56,43 @@ /* input[type=submit] will make IE6 to ignore whole CSS rule, so cant combine this with .ryzom-ui-button below */ input[type=submit] { - border-bottom: 1px solid #030403; - border-left: 1px solid #6e7f57; - border-top: 1px solid #889e6c; - border-right: 1px solid #272d1f; - background-color: #435120; + border-bottom: 1px solid #7B7E80; + border-left: 1px solid #7B7E80; + border-top: 1px solid #7B7E80; + border-right: 1px solid #7B7E80; + background-color: #232323; + border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + color: #BBB; +} +input[type=submit]:hover { + border-bottom: 1px solid #FFFFFF; + border-left: 1px solid #FFFFFF; + border-top: 1px solid #FFFFFF; + border-right: 1px solid #FFFFFF; + color: #FFF; } input.ryzom-ui-button, .ryzom-ui-button { - border-bottom: 1px solid #030403; - border-left: 1px solid #6e7f57; - border-top: 1px solid #889e6c; - border-right: 1px solid #272d1f; - background-color: #435120; + border-bottom: 1px solid #7B7E80; + border-left: 1px solid #7B7E80; + border-top: 1px solid #7B7E80; + border-right: 1px solid #7B7E80; + background-color: #232323; + border-radius: 3px; + color: #BBB; } a.ryzom-ui-button, a.ryzom-ui-button:visited { - color: white; - padding: 0 .5em; + color: #DDD; + padding: .2em .5em; text-decoration: none; } a.ryzom-ui-button:hover { - background: #536130; - color: #ddd; + border-bottom: 1px solid #FFFFFF; + border-left: 1px solid #FFFFFF; + border-top: 1px solid #FFFFFF; + border-right: 1px solid #FFFFFF; + color: #FFF; } /* window without title - just borders */ .ryzom-ui-tl { diff --git a/code/web/api/data/icons/add_app.png b/code/web/api/data/icons/add_app.png new file mode 100644 index 0000000000000000000000000000000000000000..12cfb5546642b562e37689c8ee1db36955c52cd7 GIT binary patch literal 2532 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 literal 0 HcmV?d00001 diff --git a/code/web/api/data/icons/edit.png b/code/web/api/data/icons/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..315b5d8b4534eb20e62ca35f3d69abed559100a3 GIT binary patch literal 1203 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 literal 0 HcmV?d00001 diff --git a/code/web/api/data/img/backgrounds/parchemin.png b/code/web/api/data/img/backgrounds/parchemin.png new file mode 100644 index 0000000000000000000000000000000000000000..2b889c04889f14f01c8af3d561f76229e5856795 GIT binary patch literal 377617 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

ln1Ou-mit87 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 z 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

" + + "" + + "
"; + + container = document.createElement("div"); + container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "
t
"; + tds = div.getElementsByTagName( "td" ); + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Figure out if the W3C box model works as expected + div.innerHTML = ""; + div.style.width = div.style.paddingLeft = "1px"; + jQuery.boxModel = support.boxModel = div.offsetWidth === 2; + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.style.cssText = ptlm + vb; + div.innerHTML = html; + + outer = div.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + offsetSupport = { + doesNotAddBorder: ( inner.offsetTop !== 5 ), + doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) + }; + + inner.style.position = "fixed"; + inner.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); + inner.style.position = inner.style.top = ""; + + outer.style.overflow = "hidden"; + outer.style.position = "relative"; + + offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); + offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); + + body.removeChild( container ); + div = container = null; + + jQuery.extend( support, offsetSupport ); + }); + + return support; +})(); + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var privateCache, thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, + isEvents = name === "events"; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = ++jQuery.uuid; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + privateCache = thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Users should not attempt to inspect the internal events object using jQuery.data, + // it is undocumented and subject to change. But does anyone listen? No. + if ( isEvents && !thisCache[ name ] ) { + return privateCache.events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ internalKey ] : internalKey; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ internalKey ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + } else { + elem[ internalKey ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, attr, name, + data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { + attr = this[0].attributes; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + jQuery._data( this[0], "parsedAttrs", true ); + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var self = jQuery( this ), + args = [ parts[0], value ]; + + self.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data( elem, deferDataKey ); + if ( defer && + ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && + ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery._data( elem, queueDataKey ) && + !jQuery._data( elem, markDataKey ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.fire(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = ( type || "fx" ) + "mark"; + jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); + if ( count ) { + jQuery._data( elem, key, count ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + var q; + if ( elem ) { + type = ( type || "fx" ) + "queue"; + q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + hooks = {}; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + jQuery._data( elem, type + ".run", hooks ); + fn.call( elem, function() { + jQuery.dequeue( elem, type ); + }, hooks ); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue " + type + ".run", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { + count++; + tmp.add( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + nodeHook, boolHook, fixSpecified; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = ( value || "" ).split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, l, + i = 0; + + if ( value && elem.nodeType === 1 ) { + attrNames = value.toLowerCase().split( rspace ); + l = attrNames.length; + + for ( ; i < l; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + + // See #9699 for explanation of this approach (setting first, then removal) + jQuery.attr( elem, name, "" ); + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.nodeValue = value + "" ); + } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = "" + value ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); + + + + +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /\bhover(\.\S+)?\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, + quickParse = function( selector ) { + var quick = rquickIs.exec( selector ); + if ( quick ) { + // 0 1 2 3 + // [ _, tag, id, class ] + quick[1] = ( quick[1] || "" ).toLowerCase(); + quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); + } + return quick; + }, + quickIs = function( elem, m ) { + var attrs = elem.attributes || {}; + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || (attrs.id || {}).value === m[2]) && + (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) + ); + }, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + quick: quickParse( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + t, tns, type, origType, namespaces, origCount, + j, events, special, handle, eventType, handleObj; + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + old = null; + for ( ; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old && old === elem.ownerDocument ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call( arguments, 0 ), + run_all = !event.exclusive && !event.namespace, + handlerQueue = [], + i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Determine handlers that should run if there are delegated events + // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { + + // Pregenerate a single jQuery object for reuse with .is() + jqcur = jQuery(this); + jqcur.context = this.ownerDocument || this; + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + selMatch = {}; + matches = []; + jqcur[0] = cur; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = ( + handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) + ); + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if ( event.metaKey === undefined ) { + event.metaKey = event.ctrlKey; + } + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, + + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + ret; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !form._submit_attached ) { + jQuery.event.add( form, "submit._submit", function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + jQuery.event.simulate( "change", this, event, true ); + } + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + elem._change_attached = true; + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on.call( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + var handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( var type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.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 contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context, seed ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set, seed ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set, i, len, match, type, left; + + if ( !expr ) { + return []; + } + + for ( i = 0, len = Expr.order.length; i < len; i++ ) { + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + filter = Expr.filter[ type ]; + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + pass = not ^ found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +var getText = Sizzle.getText = function( elem ) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 ) { + // Use textContent || innerText for elements + if ( typeof elem.textContent === 'string' ) { + return elem.textContent; + } else if ( typeof elem.innerText === 'string' ) { + // Replace IE's carriage returns + return elem.innerText.replace( rReturn, '' ); + } else { + // Traverse it's children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + } else { + + // If no nodeType, this is expected to be an array + for ( i = 0; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + if ( node.nodeType !== 8 ) { + ret += getText( node ); + } + } + } + return ret; +}; + +var Expr = Sizzle.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|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + first = match[2]; + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + doneName = match[0]; + parent = elem.parentNode; + + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent[ expando ] = doneName; + } + + diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr( elem, name ) : + Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context, seed ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet, seed ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +Sizzle.selectors.attrMap = {}; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array (deprecated as of jQuery 1.7) + if ( jQuery.isArray( selectors ) ) { + var level = 1; + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( i = 0; i < selectors.length; i++ ) { + + if ( jQuery( cur ).is( selectors[ i ] ) ) { + ret.push({ selector: selectors[ i ], elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} + + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
", "
" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + col: [ 2, "", "
" ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and "; + break; + case 'LOG': + $log->logf("MySQL ERROR: ".$error); + break; + default: + flush(); + break; + } + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/conf.php b/code/web/api/server/scripts/achievement_script/conf.php new file mode 100644 index 000000000..62f05526d --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/conf.php @@ -0,0 +1,33 @@ + \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/include/functions_inc.php b/code/web/api/server/scripts/achievement_script/include/functions_inc.php new file mode 100644 index 000000000..bc0a1d960 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/include/functions_inc.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/launch_parse_new_xml.sh b/code/web/api/server/scripts/achievement_script/launch_parse_new_xml.sh new file mode 100644 index 000000000..1a9c721ee --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/launch_parse_new_xml.sh @@ -0,0 +1,5 @@ +#!/bin/sh - + +cd /home/api/public_html/server/scripts/achievement_script + +sudo -u api nohup ./parse_new_xml.sh & diff --git a/code/web/api/server/scripts/achievement_script/log/_logDefaultDir_ b/code/web/api/server/scripts/achievement_script/log/_logDefaultDir_ new file mode 100644 index 000000000..e69de29bb diff --git a/code/web/api/server/scripts/achievement_script/log/xml_tmp/_xml_tmp_dir b/code/web/api/server/scripts/achievement_script/log/xml_tmp/_xml_tmp_dir new file mode 100644 index 000000000..e69de29bb diff --git a/code/web/api/server/scripts/achievement_script/parse_new_xml.sh b/code/web/api/server/scripts/achievement_script/parse_new_xml.sh new file mode 100644 index 000000000..ade33c6d1 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/parse_new_xml.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +cd /home/api/public_html/server/scripts/achievement_script + +SRC=/home/api/public_html/server/scripts/achievement_script/new_xml +DST=/home/api/public_html/server/scripts/achievement_script/parse_xml + +while true; do + + FN=`inotifywait -r -e close_write --format '%w%f' $SRC` + + for f in $SRC/*; do + NAME="$DST/"`basename $f` + mv -f $f $DST + echo "Processing $NAME" + php AchWebParser.php $NAME + rm -f $NAME + done + +done + +#cd - diff --git a/code/web/api/server/scripts/achievement_script/script/_scriptDir b/code/web/api/server/scripts/achievement_script/script/_scriptDir new file mode 100644 index 000000000..e69de29bb diff --git a/code/web/api/server/scripts/achievement_script/script/item_grade_script.php b/code/web/api/server/scripts/achievement_script/script/item_grade_script.php new file mode 100644 index 000000000..4be071adc --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/script/item_grade_script.php @@ -0,0 +1,13 @@ +sendSQL("SELECT grade FROM ryzom_nimetu_item_data WHERE sheetid='".str_replace(".sitem","",$item)."'","ARRAY"); + + #echo $res[0]['grade']; + + return $res[0]['grade']; +} +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/script/places/continents.php b/code/web/api/server/scripts/achievement_script/script/places/continents.php new file mode 100644 index 000000000..25ad07db7 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/script/places/continents.php @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/script/places/global.php b/code/web/api/server/scripts/achievement_script/script/places/global.php new file mode 100644 index 000000000..1b6609f53 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/script/places/global.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/script/statsdb.php b/code/web/api/server/scripts/achievement_script/script/statsdb.php new file mode 100644 index 000000000..a91655dfd --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/script/statsdb.php @@ -0,0 +1,89 @@ +registerValue("_money","_statsdb_money"); + function _statsdb_money($money,$_P,$_CB) { + global $cdata,$DBc,$statsdb; + $_IDENT = "_money"; + + #$DBc->sendSQL("UPDATE stat_players SET sp_money='".$money."' WHERE sp_char='".$cdata['cid']."'","NONE"); + $statsdb->setValue('sp_money',$money); + + $_P->unregisterValue($_IDENT,$_CB); + } + + $this->registerValue("_race","_statsdb_race"); + function _statsdb_race($race,$_P,$_CB) { + global $cdata,$DBc,$statsdb; + $_IDENT = "_race"; + + $race = "r_".strtolower($race); + + #$DBc->sendSQL("UPDATE stat_players SET sp_race='".$race."' WHERE sp_char='".$cdata['cid']."'","NONE"); + $statsdb->setValue('sp_race',$race); + + $_P->unregisterValue($_IDENT,$_CB); + } + + $this->registerValue("yubopoints","_statsdb_yubototal"); + function _statsdb_yubototal($yubo,$_P,$_CB) { + global $cdata,$DBc,$statsdb; + $_IDENT = "yubopoints"; + + #$DBc->sendSQL("UPDATE stat_players SET sp_yubototal='".$yubo."' WHERE sp_char='".$cdata['cid']."'","NONE"); + $statsdb->setValue('sp_yubototal',$yubo); + + $_P->unregisterValue($_IDENT,$_CB); + } + + $this->registerValue("petcount","_statsdb_mekcount"); + function _statsdb_mekcount($count,$_P,$_CB) { + global $cdata,$DBc,$statsdb; + $_IDENT = "petcount"; + + #$DBc->sendSQL("UPDATE stat_players SET sp_mekcount='".$count."' WHERE sp_char='".$cdata['cid']."'","NONE"); + $statsdb->setValue('sp_mekcount',$count); + + $_P->unregisterValue($_IDENT,$_CB); + } + + $this->registerEntity("skilllist","_statsdb_maxlevel"); + function _statsdb_maxlevel($skills,$_P,$_CB) { + global $cdata,$DBc,$log,$statsdb; + $_IDENT = "skilllist"; + + #$log->logf("rcv skilllist: ".var_export($skills,true)); + + $lvl = 0; + foreach($skills->skills as $elem) { + if($elem->current > $lvl) { + $lvl = $elem->current; + } + } + + #$DBc->sendSQL("UPDATE stat_players SET sp_maxlevel='".$lvl."' WHERE sp_char='".$cdata['cid']."'","NONE"); + $statsdb->setValue('sp_maxlevel',$lvl); + + $_P->unregisterEntity($_IDENT,$_CB); + } + + $this->registerValue("_guildid","_statsdb_guildid"); + function _statsdb_guildid($id,$_P,$_CB) { + global $cdata,$DBc,$statsdb; + $_IDENT = "_guildid"; + + #$DBc->sendSQL("UPDATE stat_players SET sp_guildid='".$id."' WHERE sp_char='".$cdata['cid']."'","NONE"); + $statsdb->setValue('sp_guildid',$id); + + $_P->unregisterValue($_IDENT,$_CB); + } + + $this->registerValue("itemcount","_statsdb_itemcount"); + function _statsdb_itemcount($count,$_P,$_CB) { + global $cdata,$DBc,$statsdb; + $_IDENT = "itemcount"; + + #$DBc->sendSQL("UPDATE stat_players SET sp_itemcount='".$count."' WHERE sp_char='".$cdata['cid']."'","NONE"); + $statsdb->setValue('sp_itemcount',$count); + + $_P->unregisterValue($_IDENT,$_CB); + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/BillingSummary/BillingSummary_class.php b/code/web/api/server/scripts/achievement_script/source/BillingSummary/BillingSummary_class.php new file mode 100644 index 000000000..bf3872c0a --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/BillingSummary/BillingSummary_class.php @@ -0,0 +1,29 @@ +sendSQL("SELECT SUM(amount) as anz, currency FROM coupons_billing WHERE iduser='".$cdata['aid']."' AND status='captured' GROUP by 'currency'","ARRAY"); + + $billed = 0; + + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + if($res[$i]['currency'] == "USD") { + $res[$i]['anz'] = $res[$i]['anz']*0.7950; + } + + if($res[$i]['currency'] == "GBP") { + $res[$i]['anz'] = $res[$i]['anz']*1.2623; + } + + $billed += $res[$i]['anz']; + } + + $_DISPATCHER->dispatchValue("user_billed_sum",$billed);*/ + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/PDRtoXMLdriver_class.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/PDRtoXMLdriver_class.php new file mode 100644 index 000000000..9fdc4ff22 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/PDRtoXMLdriver_class.php @@ -0,0 +1,972 @@ +lock = 0; + $this->open = null; + $this->entity = null; + $this->inv = null; + $this->iblock = false; + + $this->petcount = 0; + $this->itemcount = 0; + + $this->gear = new Gear(); + $this->skills = new SkillList(); + $this->mission = new MissionList(); + $this->friendlist = new Friendlist(); + $this->tplist = new TPlist(); + + $this->hasChoice = false; + $this->hasExcellent = false; + $this->hasSupreme = false; + + $this->tool_list = array('itrtje.sitem','icokamtjewel_1.sitem','icokamtjewel_2.sitem','icokartjewel_1.sitem','icokartjewel_2.sitem','itjewel.sitem','itmwea.sitem','itrtmw.sitem','icokamtmwea_1.sitem','icokamtmwea_2.sitem','icokartmwea_1.sitem','icokartmwea_2.sitem','itrtfo.sitem','itforage.sitem','itforagekam_ep2_1.sitem','itforagekam_ep2_2.sitem','itforagekam_ep2_3.sitem','itforagekar_ep2_1.sitem','itforagekar_ep2_2.sitem','itforagekar_ep2_3.sitem','icokamtforage_1.sitem','icokamtforage_2.sitem','icokartforage_1.sitem','icokartforage_2.sitem','itrwea.sitem','itrtrw.sitem','icokamtrwea_1.sitem','icokamtrwea_2.sitem','icokartrwea_1.sitem','icokartrwea_2.sitem','itammo.sitem','itrtam.sitem','icokamtammo_1.sitem','icokamtammo_2.sitem','icokartammo_1.sitem','icokartammo_2.sitem','itarmor.sitem','itrtar.sitem','icokamtarmor_1.sitem','icokamtarmor_2.sitem','icokartarmor_1.sitem','icokartarmor_2.sitem'); + + $this->itemignore = false; + + $this->tracked_items = array(); + $res = $DBc->sendSQL("SELECT api_item FROM ach_player_item WHERE api_player='".$cdata['cid']."'","ARRAY"); + foreach($res as $elem) { + $this->tracked_items[] = $elem['api_item']; + } + + $this->tracked_items_new = array(); + + //these nodes are ignored, but children are processed + $this->ignore = array(); + $this->ignore[] = "XML"; + $this->ignore[] = "ENTITYBASE"; + $this->ignore[] = "NORMALPOSITIONS"; + $this->ignore[] = "_VEC"; + $this->ignore[] = "SESSIONID"; + #$this->ignore[] = "POSSTATE"; + $this->ignore[] = "_PLAYERROOM"; + $this->ignore[] = "_INVENTORYID"; + $this->ignore[] = "_PHYSCHARACS"; + $this->ignore[] = "_PHYSSCORES"; + $this->ignore[] = "_SKILLS"; + $this->ignore[] = "_FAMES"; + + //these nodes are ignored, as well as their children + $this->ignore_block = array(); + $this->ignore_block[] = "_MEMORIZEDPHRASES"; + $this->ignore_block[] = "_FORBIDPOWERDATES"; + $this->ignore_block[] = "_INEFFECTIVEAURAS"; + $this->ignore_block[] = "_CONSUMABLEOVERDOSEENDDATES"; + $this->ignore_block[] = "_MODIFIERSINDB"; + $this->ignore_block[] = "_MISSIONS"; + $this->ignore_block[] = "RINGREWARDPOINTS"; + $this->ignore_block[] = "_PACT"; + $this->ignore_block[] = "_KNOWNPHRASES"; + $this->ignore_block[] = "STARTINGCHARACTERISTICVALUES"; + $this->ignore_block[] = "_ENCYCLOCHAR"; + $this->ignore_block[] = "_GAMEEVENT"; + $this->ignore_block[] = "_ENTITYPOSITION"; + $this->ignore_block[] = "_MISSIONHISTORIES"; + $this->ignore_block[] = "_KNOWNBRICKS"; + $this->ignore_block[] = "_BOUGHTPHRASES"; + $this->ignore_block[] = "SKILLPOINTS"; + #$this->ignore_block[] = "SPENTSKILLPOINTS"; + $this->ignore_block[] = "_LASTLOGSTATS"; + $this->ignore_block[] = "FACTIONPOINTS"; + } + + function drive($cdata) { + global $_DISPATCHER,$MY_PATH,$log,$DBc; + + #$file = $this->conf['xml_dir']."account_".$uid."_".$slot."_pdr.xml"; + $file = $_REQUEST['file']; + + $xml_parser = xml_parser_create(); + xml_set_object($xml_parser,$this); + xml_set_element_handler($xml_parser, "startElement", "endElement"); + + // temporary storage for xml files for debug purpose + $ftmp = fopen($MY_PATH."/log/xml_tmp/char_".$cdata['cid'].".xml","w"); + $fcont = file_get_contents($file); + fwrite($ftmp,$fcont); + fclose($ftmp); + # end of temp xml store + + if(!xml_parse($xml_parser, $fcont)) { + $log->logf("FATAL ERROR (PDRtoXMLdriver): unable to parse given XML!"); + $log->close(); + die(); + } + + xml_parser_free($xml_parser); + + $_DISPATCHER->dispatchEntity($this->gear->getName(),$this->gear); + #echo var_export($this->gear,true); + $_DISPATCHER->dispatchEntity($this->skills->getName(),$this->skills); + $_DISPATCHER->dispatchEntity($this->friendlist->getName(),$this->friendlist); + $_DISPATCHER->dispatchEntity($this->tplist->getName(),$this->tplist); + $_DISPATCHER->dispatchValue('petcount',$this->petcount); + $_DISPATCHER->dispatchValue('itemcount',$this->itemcount); + + $_DISPATCHER->dispatchValue('has_choice',$this->hasChoice); + $_DISPATCHER->dispatchValue('has_excellent',$this->hasExcellent); + $_DISPATCHER->dispatchValue('has_supreme',$this->hasSupreme); + + $qry = array(); + foreach($this->tracked_items_new as $elem) { + $qry[] = "('".$DBc->mre($elem)."','".$cdata['cid']."','".time()."')"; + } + if(sizeof($qry) > 0) { + $DBc->sendSQL("INSERT DELAYED INTO ach_player_item (api_item,api_player,api_date) VALUES ".implode(',',$qry),"NONE"); + } + + $DBc->sendSQL("DELETE FROM ach_player_item WHERE api_date<'".(time()-605800)."'","NONE"); + } + + function startElement($parser, $name, $attrs) { + global $_DISPATCHER,$DBc,$XMLgenerator; + + array_push($this->pathid,$name); + + $XMLgenerator->xml_split(implode("/",$this->pathid),$name,$attrs,true); + + if($this->lock == 1) { + return null; + } + + if(in_array($name,$this->ignore)) { + return null; + } + + if(in_array($name,$this->ignore_block)) { + $this->lock = 1; + return null; + } + + /* has shop item */ + if($name == '_ITEMSFORSALE') { + $this->lock = 1; + $this->ignore_block[] = "_ITEMSINSHOPSTORE"; + $_DISPATCHER->dispatchValue('has_store',true); + } + + /* death penalty */ + if($name == "_DEATHPENALTIES") { + $this->open = "_DEATHPENALTIES"; + $this->entity = new DeathPenalty(); + return null; + } + + if($this->open == "_DEATHPENALTIES") { + if($name == "_NBDEATH") { + $this->entity->NbDeath = $attrs['VALUE']; + } + + if($name == "_CURRENTDEATHXP") { + $this->entity->CurrentDeathXP = $attrs['VALUE']; + } + + if($name == "_DEATHXPTOGAIN") { + $this->entity->DeathXPToGain = $attrs['VALUE']; + } + + if($name == "_BONUSUPDATETIME") { + $this->entity->BonusUpdateTime = $attrs['VALUE']; + } + } + + /* spawn points */ + if($name == "RESPAWNPOINTS" && !$attrs['VALUE']) { + $this->open = "RESPAWNPOINTS"; + $this->entity = new RespawnPoints(); + return null; + } + + if($this->open == "RESPAWNPOINTS") { + if($name == "RESPAWNPOINTS") { + $this->respawn_outer = 0; + $this->entity->spawns[] = $attrs['VALUE']; + } + } + + /* faction points */ + if($name == "FACTIONPOINTS") { + $this->open = "FACTIONPOINTS"; + return null; + } + + if($this->open == "FACTIONPOINTS") { + if($name == "__KEY__") { + $this->entity = new FactionPoints(); + $this->entity->faction = $attrs['VALUE']; + return null; + } + + if($name == "__VAL__") { + $this->entity->value = $attrs['VALUE']; + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->entity = null; + return null; + } + + return null; + } + + /* Fame */ + if($name == "_FAME") { + $this->open = "_FAME"; + return null; + } + + if($this->open == "_FAME") { + if($name == "__KEY__") { + $this->entity = new Fame(); + $this->entity->faction = $attrs['VALUE']; + return null; + } + + if($name == "FAME") { + $this->entity->fame = $attrs['VALUE']; + return null; + } + if($name == "FAMEMEMORY") { + $this->entity->famememory = $attrs['VALUE']; + return null; + } + if($name == "LASTFAMECHANGETREND") { + $this->entity->lastfamechangetrend = $attrs['VALUE']; + return null; + } + + return null; + } + + /* last log stats */ + if($name == "_LASTLOGSTATS") { + $this->open = "_LASTLOGSTATS"; + $this->entity = new LastLogStats(); + return null; + } + + if($this->open == "_LASTLOGSTATS") { + if($name == "LOGINTIME") { + $this->entity->logintime = $attrs['VALUE']; + return null; + } + if($name == "DURATION") { + $this->entity->duration = $attrs['VALUE']; + return null; + } + if($name == "LOGOFFTIME") { + $this->entity->logofftime = $attrs['VALUE']; + return null; + } + + return null; + } + + /* mission */ + if($name == "_MISSIONHISTORIES") { + $this->open = "_MISSIONHISTORIES"; + return null; + } + + if($this->open == "_MISSIONHISTORIES") { + if($name == "__KEY__") { + $this->entity = new Mission(); + $this->entity->mission = $attrs['VALUE']; + return null; + } + + if($name == "SUCCESSFULL") { + $this->entity->successfull = $attrs['VALUE']; + return null; + } + if($name == "UTC_LASTSUCCESSDATE") { + $this->entity->utc_lastsuccessdate = $attrs['VALUE']; + return null; + } + + return null; + } + + if($name == "_FRIENDSLIST") { + $this->entity = new Friend(); + $this->entity->id = $attrs['VALUE']; + $this->friendlist->friends[] = $this->entity; + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + } + + if($name == "_ISFRIENDOF") { + $this->entity = new FriendOf(); + $this->entity->id = $attrs['VALUE']; + $this->friendlist->friendof[] = $this->entity; + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + } + + /* permanent mod */ + if($name == "SCOREPERMANENTMODIFIERS") { + $this->open = "SCOREPERMANENTMODIFIERS"; + return null; + } + + if($this->open == "SCOREPERMANENTMODIFIERS") { + if($name == "__KEY__") { + $this->entity = new PermanentMod(); + $this->entity->score = $attrs['VALUE']; + return null; + } + + if($name == "__VAL__") { + $this->entity->value = $attrs['VALUE']; + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->entity = null; + return null; + } + + return null; + } + + /* pet */ + if($name == "_PLAYERPETS") { + $this->open = "_PLAYERPETS"; + return null; + } + + if($this->open == "_PLAYERPETS") { + if($name == "__KEY__") { + $this->entity = new Pet(); + $this->entity->pet = $attrs['VALUE']; + return null; + } + + if($name == "TICKETPETSHEETID") { + $this->entity->ticketpetsheetid = $attrs['VALUE']; + return null; + } + if($name == "PETSHEETID") { + $this->entity->petsheetid = $attrs['VALUE']; + $this->petcount++; + return null; + } + if($name == "PRICE") { + $this->entity->price = $attrs['VALUE']; + return null; + } + if($name == "OWNERID") { + $this->entity->ownerid = $attrs['VALUE']; + return null; + } + if($name == "STABLEALIAS") { + $this->entity->stablealias = $attrs['VALUE']; + return null; + } + if($name == "LANDSCAPE_X") { + $this->entity->landscape_x = $attrs['VALUE']; + return null; + } + if($name == "LANDSCAPE_Y") { + $this->entity->landscape_y = $attrs['VALUE']; + return null; + } + if($name == "LANDSCAPE_Z") { + $this->entity->landscape_z = $attrs['VALUE']; + return null; + } + if($name == "UTC_DEATHTICK") { + $this->entity->utc_deathtick = $attrs['VALUE']; + return null; + } + if($name == "PETSTATUS") { + $this->entity->petstatus = $attrs['VALUE']; + return null; + } + if($name == "SLOT") { + $this->entity->slot = $attrs['VALUE']; + return null; + } + if($name == "ISTPALLOWED") { + $this->entity->istpallowed = $attrs['VALUE']; + return null; + } + if($name == "SATIETY") { + $this->entity->satiety = $attrs['VALUE']; + return null; + } + if($name == "CUSTOMNAME") { + $this->entity->customname = $attrs['VALUE']; + return null; + } + + return null; + } + + /* physical characteristics */ + if($name == "_PHYSICALCHARACTERISTICS") { + $this->open = "_PHYSICALCHARACTERISTICS"; + return null; + } + + if($this->open == "_PHYSICALCHARACTERISTICS") { + if($name == "__KEY__") { + $this->entity = new PhysCharacs(); + $this->entity->charac = $attrs['VALUE']; + return null; + } + + if($name == "__VAL__") { + $this->entity->value = $attrs['VALUE']; + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->entity = null; + return null; + } + + return null; + } + + /* physical scores */ + if($name == "PHYSICALSCORES") { + $this->open = "PHYSICALSCORES"; + return null; + } + + if($this->open == "PHYSICALSCORES") { + if($name == "__KEY__") { + $this->entity = new PhysScores(); + $this->entity->score = $attrs['VALUE']; + return null; + } + + if($name == "CURRENT") { + $this->entity->current = $attrs['VALUE']; + return null; + } + if($name == "BASE") { + $this->entity->base = $attrs['VALUE']; + return null; + } + if($name == "MAX") { + $this->entity->max = $attrs['VALUE']; + return null; + } + if($name == "BASEREGENERATEREPOS") { + $this->entity->baseregeneraterepos = $attrs['VALUE']; + return null; + } + if($name == "BASEREGENERATEACTION") { + $this->entity->baseregenerateaction = $attrs['VALUE']; + return null; + } + if($name == "CURRENTREGENERATE") { + $this->entity->currentregenerate = $attrs['VALUE']; + return null; + } + + return null; + } + + /* skill points */ + if($name == "SKILLPOINTS") { + $this->open = "SKILLPOINTS"; + return null; + } + + if($this->open == "SKILLPOINTS") { + if($name == "__KEY__") { + $this->entity = new SkillPoints(); + $this->entity->skill = $attrs['VALUE']; + return null; + } + + if($name == "__VAL__") { + $this->entity->value = $attrs['VALUE']; + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->entity = null; + return null; + } + + return null; + } + + /* spent skill points */ + if($name == "SPENTSKILLPOINTS") { + $this->open = "SPENTSKILLPOINTS"; + return null; + } + + if($this->open == "SPENTSKILLPOINTS") { + if($name == "__KEY__") { + $this->entity = new SpentSkillPoints(); + $this->entity->skill = $attrs['VALUE']; + return null; + } + + if($name == "__VAL__") { + $this->entity->value = $attrs['VALUE']; + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->entity = null; + return null; + } + + return null; + } + + /* skills */ + if($name == "SKILLS") { + $this->open = "SKILLS"; + return null; + } + + if($this->open == "SKILLS") { + if($name == "__KEY__") { + $this->entity = new Skill(); + $this->entity->skill = $attrs['VALUE']; + return null; + } + + if($name == "BASE") { + $this->entity->base = $attrs['VALUE']; + return null; + } + if($name == "CURRENT") { + $this->entity->current = $attrs['VALUE']; + return null; + } + if($name == "MAXLVLREACHED") { + $this->entity->maxlvlreached = $attrs['VALUE']; + return null; + } + if($name == "XP") { + $this->entity->xp = $attrs['VALUE']; + return null; + } + if($name == "XPNEXTLVL") { + $this->entity->xpnextlvl = $attrs['VALUE']; + return null; + } + + return null; + } + + /* Position */ + if($name == "POSSTATE") { + $this->open = "POSSTATE"; + $this->entity = new Position(); + return null; + } + + if($this->open == "POSSTATE") { + if($name == "X") { + $this->entity->x = $attrs['VALUE']; + return null; + } + if($name == "Y") { + $this->entity->y = $attrs['VALUE']; + return null; + } + if($name == "Z") { + $this->entity->z = $attrs['VALUE']; + return null; + } + if($name == "HEADING") { + $this->entity->heading = $attrs['VALUE']; + return null; + } + + return null; + } + + /* items */ + + if($name == "ROOMINVENTORY") { + $this->inv = "room"; + return null; + } + + if($name == "INVENTORY") { + $this->iblock = true; + return null; + } + + if($this->iblock == true) { + if($name == "__KEY__") { + $this->inv = $attrs['VALUE']; + } + if($name == "__VAL__") { + return null; + } + } + + if($name == '_ITEMS' || $name == '_ITEM') { + #echo "i
"; + $this->open = '_ITEM'; + $this->entity = new Item(); + $this->entity->inventory = $this->inv; + $this->itemcount++; + return null; + } + + if($this->open == '_ITEM') { + if($this->itemignore == true) { + return null; + } + + if($name == '_CRAFTPARAMETERS') { + $this->icraft = true; + return null; + } + + if($this->icraft == true) { + if($name == 'HPBUFF' || $name == 'SAPBUFF' || $name == 'FOCUSBUFF' || $name == 'STABUFF') { + $this->entity->_craftparameters[strtolower($name)] = $attrs['VALUE']; + } + return null; + } + + if($name == '_ITEMID') { + $this->entity->_itemid = $attrs['VALUE']; + return null; + } + if($name == '_SHEETID') { + if($attrs['VALUE']{0} == '#') { + $tmp = str_replace("#","",$attrs['VALUE']); + $res = $DBc->sendSQL("SELECT * FROM ryzom_nimetu_sheets WHERE nsh_numid='".$tmp."'","ARRAY"); + $attrs['VALUE'] = $res[0]['nsh_name']."".$res[0]['nsh_suffix']; + } + + if(substr($attrs['VALUE'],0,3) == 'tp_') { + $this->tplist->tps[] = $attrs['VALUE']; + $this->itemignore = true; + return null; + } + + if(substr($attrs['VALUE'],0,1) == 'm') { + $this->itemignore = true; + if($this->hasChoice == false || $this->hasExcellent == false || $this->hasSupreme == false) { + + switch(substr($attrs['VALUE'],-9,-8)) { + case 'f': + $this->hasSupreme = true; + break; + case 'e': + $this->hasExcellent = true; + break; + case 'd': + $this->hasChoice = true; + break; + } + } + return null; + } + + $this->entity->_sheetid = $attrs['VALUE']; + + if($this->entity->inventory != 'bag' && in_array($this->entity->_itemid,$this->tracked_items) && !in_array($this->entity->_sheetid,$this->tool_list)) { + $this->itemignore = true; + } + + $this->tracked_items_new[] = $this->entity->_itemid; + + return null; + } + if($name == '_LOCSLOT') { + $this->entity->_locslot = $attrs['VALUE']; + return null; + } + if($name == '_HP') { + $this->entity->_hp = $attrs['VALUE']; + return null; + } + if($name == '_RECOMMENDED') { + $this->entity->_recommended = $attrs['VALUE']; + return null; + } + if($name == '_CREATORID') { + $this->entity->_creatorid = $attrs['VALUE']; + return null; + } + if($name == '_PHRASEID') { + $this->entity->_phraseid = $attrs['VALUE']; + return null; + } + if($name == '_REFINVENTORYSLOT') { + $this->entity->_refinventoryslot = $attrs['VALUE']; + #if($this->entity->refinventoryid != null) { + $this->gear->items[] = $this->entity; + #} + return null; + } + if($name == 'REFINVENTORYID') { + $this->entity->refinventoryid = $attrs['VALUE']; + return null; + } + if($name == '_USENEWSYSTEMREQUIREMENT') { + $this->entity->_usenewsystemrequirement = $attrs['VALUE']; + return null; + } + if($name == '_REQUIREDSKILLLEVEL') { + $this->entity->_requiredskilllevel = $attrs['VALUE']; + return null; + } + if($name == '_CUSTOMTEXT') { + $this->entity->_customtext = $attrs['VALUE']; + return null; + } + if($name == '_LOCKEDBYOWNER') { + $this->entity->_lockedbyowner = $attrs['VALUE']; + return null; + } + if($name == '_DROPABLE') { + $this->entity->_dropable = $attrs['VALUE']; + return null; + } + if($name == 'STACKSIZE') { + $this->entity->stacksize = $attrs['VALUE']; + return null; + } + } + + + + + + if($attrs['VALUE'] != '') { + $_DISPATCHER->dispatchValue(strtolower($name),$attrs['VALUE']); + } + } + + function endElement($parser, $name) { + global $_DISPATCHER,$XMLgenerator; + + $XMLgenerator->xml_split(implode("/",$this->pathid),$name,null,false); + array_pop($this->pathid); + + if(in_array($name,$this->ignore_block)) { + $this->lock = 0; + return null; + } + + if($this->lock == 1) { + return null; + } + + /* death penalty */ + if($name == "_DEATHPENALTIES") { + $this->open = null; + $this->entity->DeathXPToGain = $this->entity->DeathXPToGain*min(10,$this->entity->NbDeath); + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->entity = null; + return null; + } + + /* respawn points */ + if($name == "RESPAWNPOINTS") { + $this->respawn_outer++; // increment to track double close at end of block + } + + if($name == "RESPAWNPOINTS" && $this->respawn_outer > 1) { + $this->open = null; + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->entity = null; + return null; + } + + /* faction points */ + if($name == "FACTIONPOINTS") { + $this->open = null; + return null; + } + + /* fame */ + if($name == "__VAL__" && $this->open == "_FAME") { + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->entity = null; + return null; + } + + if($name == "_FAME") { + $this->open = null; + return null; + } + + /* last log stats */ + if($name == "_LASTLOGSTATS") { + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->entity = null; + return null; + } + + /* mission */ + if($name == "__VAL__" && $this->open == "_MISSIONHISTORIES") { + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->mission->missions[] = $this->entity; + $this->entity = null; + return null; + } + + if($name == "_MISSIONHISTORIES") { + $this->open = null; + return null; + } + + /* permanent mod */ + if($name == "SCOREPERMANENTMODIFIERS") { + $this->open = null; + return null; + } + + /* pet */ + if($name == "__VAL__" && $this->open == "_PLAYERPETS") { + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + #echo "dispatched"; + $this->entity = null; + return null; + } + + if($name == "_PLAYERPETS") { + $this->open = null; + return null; + } + + /* physical characteristics */ + if($name == "_PHYSICALCHARACTERISTICS") { + $this->open = null; + return null; + } + + /* physical scores */ + if($name == "__VAL__" && $this->open == "PHYSICALSCORES") { + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->entity = null; + return null; + } + + if($name == "PHYSICALSCORES") { + $this->open = null; + return null; + } + + /* skill points */ + if($name == "SKILLPOINTS") { + $this->open = null; + return null; + } + + /* spent skill points */ + if($name == "SPENTSKILLPOINTS") { + $this->open = null; + return null; + } + + /* skills */ + if($name == "__VAL__" && $this->open == "SKILLS") { + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->skills->skills[] = $this->entity; + $this->entity = null; + return null; + } + + if($name == "SKILLS") { + $this->open = null; + return null; + } + + /* position */ + if($name == "POSSTATE") { + $this->entity->loadPlace(); + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + $this->entity = null; + return null; + } + + /* items */ + if($name == '_ITEMS' || $name == '_ITEM') { + #echo "c
"; + if($this->open == '_ITEM') { + #echo var_export($this->entity,true); + if($this->itemignore == false) { + $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); + } + $this->itemignore = false; + $this->entity = null; + } + $this->open = null; + return null; + } + + if($name == 'INVENTORY') { + $this->iblock = false; + return null; + } + + if($name == '_CRAFTPARAMETERS') { + $this->icraft = false; + return null; + } + + /*if($name == "_ITEM" || $name == "_ITEMS") { + $this->open = null; + return null; + }*/ + + + } + + + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/DeathPenalty_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/DeathPenalty_entity.php new file mode 100644 index 000000000..16f696c51 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/DeathPenalty_entity.php @@ -0,0 +1,13 @@ +setName("death_penalty"); + } +} +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/FactionPoints_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/FactionPoints_entity.php new file mode 100644 index 000000000..fa18a0fc6 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/FactionPoints_entity.php @@ -0,0 +1,10 @@ +setName("faction_points"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Fame_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Fame_entity.php new file mode 100644 index 000000000..0cfc5f15b --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Fame_entity.php @@ -0,0 +1,12 @@ +setName("fame"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/FriendOf_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/FriendOf_entity.php new file mode 100644 index 000000000..27978963f --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/FriendOf_entity.php @@ -0,0 +1,15 @@ +setName("friendof"); + } + + function getRealID() { + $tmp = explode(":",$this->id); + + return $tmp[0]; + } +} +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Friend_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Friend_entity.php new file mode 100644 index 000000000..72a9d1ee1 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Friend_entity.php @@ -0,0 +1,15 @@ +setName("friend"); + } + + function getRealID() { + $tmp = explode(":",$this->id); + + return $tmp[0]; + } +} +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Friendlist_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Friendlist_entity.php new file mode 100644 index 000000000..471190de1 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Friendlist_entity.php @@ -0,0 +1,29 @@ +setName("friendlist"); + } + + function countConfirmed() { + if($this->confirmed == false) { + $count = 0; + foreach($this->friends as $elem) { + $id = $elem->getRealID(); + foreach($this->friendof as $elem2) { + if($elem2->getRealID() == $id) { + $count++; + } + } + } + + $this->confirmed = $count; + } + + return $this->confirmed; + } +} +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Gear_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Gear_entity.php new file mode 100644 index 000000000..b84008061 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Gear_entity.php @@ -0,0 +1,9 @@ +setName("gear"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Item_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Item_entity.php new file mode 100644 index 000000000..2ffb89316 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Item_entity.php @@ -0,0 +1,28 @@ +setName("item"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/LastLogStats_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/LastLogStats_entity.php new file mode 100644 index 000000000..30878f04a --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/LastLogStats_entity.php @@ -0,0 +1,11 @@ +setName("lastlogstats"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/MissionList_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/MissionList_entity.php new file mode 100644 index 000000000..ab4a7bea9 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/MissionList_entity.php @@ -0,0 +1,9 @@ +setName("missionlist"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Mission_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Mission_entity.php new file mode 100644 index 000000000..7a95ac744 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Mission_entity.php @@ -0,0 +1,11 @@ +setName("mission"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/PermanentMod_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/PermanentMod_entity.php new file mode 100644 index 000000000..008a74895 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/PermanentMod_entity.php @@ -0,0 +1,10 @@ +setName("permanentmodifiers"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Pet_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Pet_entity.php new file mode 100644 index 000000000..e92499d93 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Pet_entity.php @@ -0,0 +1,24 @@ +setName("pet"); + #echo "created"; + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/PhysCharacs_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/PhysCharacs_entity.php new file mode 100644 index 000000000..c71109d02 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/PhysCharacs_entity.php @@ -0,0 +1,10 @@ +setName("phys_characs"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/PhysScores_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/PhysScores_entity.php new file mode 100644 index 000000000..d7deca5bb --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/PhysScores_entity.php @@ -0,0 +1,15 @@ +setName("phys_scores"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Position_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Position_entity.php new file mode 100644 index 000000000..c96cb35dc --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Position_entity.php @@ -0,0 +1,74 @@ +setName("position"); + $this->placeid = "place_unknown"; + } + + function loadPlace() { + global $_DISPATCHER; + + @include_once("script/include_InPoly_class.php"); + $region = array(); + $subregion = false; + + include("script/places/global.php"); + + $point = floor($this->x/1000)." ".floor($this->y/1000); + + $pointLocation = new pointLocation(); + + $res = $pointLocation->pointInPolygon($point, $region['place_silan'], false); + + if($res != "outside") { + include("script/places/silan.php"); + } + else { + include("script/places/continents.php"); + $region2 = $region; + foreach($region2 as $key=>$r) { + $res = $pointLocation->pointInPolygon($point, $r, false); + if($res != "outside") { + include("script/places/".$key.".php"); + if($subregion == true) { + foreach($region as $key2=>$r2) { + $res2 = $pointLocation->pointInPolygon($point, $r2, false); + if($res2 != "outside") { + include("script/places/".$key."/".$key2.".php"); + break; + } + } + } + break; + } + } + } + + foreach($region as $key=>$r) { + $res = $pointLocation->pointInPolygon($point, $r, false); + if($res != "outside") { + if($this->placeid == "place_unknown") { + $this->placeid = $key; + } + else { + $tmp = new Position(); + $tmp->x = $this->x; + $tmp->y = $this->y; + $tmp->z = $this->z; + $tmp->heading = $this->heading; + $tmp->placeid = $key; + + $_DISPATCHER->dispatchEntity($tmp->getName(),$tmp); + } + #break; + } + } + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/RespawnPoints_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/RespawnPoints_entity.php new file mode 100644 index 000000000..f1973a134 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/RespawnPoints_entity.php @@ -0,0 +1,80 @@ +setName("respawn_points"); + + $this->spawns = array(); + + $this->region_map = array(); + $this->region_map['spawn_global_bagne_matis'] = "roots"; + $this->region_map['spawn_global_bagne_nexus'] = "roots"; + $this->region_map['spawn_global_route_gouffre_fyros'] = "roots"; + $this->region_map['spawn_global_route_gouffre_nexus'] = "roots"; + $this->region_map['spawn_global_route_gouffre_tryker'] = "roots"; + $this->region_map['spawn_global_route_gouffre_zorai'] = "roots"; + $this->region_map['spawn_global_sources_fyros'] = "roots"; + $this->region_map['spawn_global_sources_zorai'] = "roots"; + $this->region_map['spawn_global_terre_nexus'] = "roots"; + $this->region_map['spawn_global_terre_zorai'] = "roots"; + $this->region_map['spawn_global_nexus_bagne'] = "roots"; + $this->region_map['spawn_global_nexus_route_gouffre'] = "roots"; + $this->region_map['spawn_global_nexus_terre'] = "roots"; + // 13/13 + + $this->region_map['spawn_global_fyros_matis'] = "desert"; + $this->region_map['spawn_global_fyros_route_gouffre'] = "desert"; + $this->region_map['spawn_global_fyros_sources'] = "desert"; + $this->region_map['spawn_global_fyros_to_zorai'] = "desert"; + $this->region_map['spawn_kami_place_pyr'] = "desert"; + $this->region_map['spawn_kami_place_thesos'] = "desert"; + $this->region_map['spawn_karavan_place_pyr'] = "desert"; + // 7/7 + + $this->region_map['spawn_global_matis_bagne'] = "forest"; + $this->region_map['spawn_global_matis_fyros'] = "forest"; + $this->region_map['spawn_global_matis_tryker'] = "forest"; + $this->region_map['spawn_kami_place_dyron'] = "forest"; + $this->region_map['spawn_kami_place_yrkanis'] = "forest"; + $this->region_map['spawn_karavan_place_avalae'] = "forest"; + $this->region_map['spawn_karavan_place_davae'] = "forest"; + #$this->region_map['spawn_karavan_place_yrkanis'] = "forest"; + // 8/7 + + $this->region_map['spawn_global_tryker_matis'] = "lakes"; + $this->region_map['spawn_global_tryker_route_gouffre'] = "lakes"; + #$this->region_map['spawn_kami_place_fairhaven'] = "lakes"; + $this->region_map['spawn_karavan_place_avendale'] = "lakes"; + $this->region_map['spawn_karavan_place_crystabell'] = "lakes"; + $this->region_map['spawn_karavan_place_fairhaven'] = "lakes"; + $this->region_map['spawn_karavan_place_windermeer'] = "lakes"; + // 7/6 + + $this->region_map['spawn_kami_place_hoi_cho'] = "jungle"; + $this->region_map['spawn_kami_place_jen_lai'] = "jungle"; + $this->region_map['spawn_kami_place_min_cho'] = "jungle"; + $this->region_map['spawn_global_zorai_route_gouffre'] = "jungle"; + $this->region_map['spawn_global_zorai_sources'] = "jungle"; + $this->region_map['spawn_global_zorai_terre'] = "jungle"; + $this->region_map['spawn_global_zorai_to_fyros'] = "jungle"; + $this->region_map['spawn_kami_place_zora'] = "jungle"; + #$this->region_map['spawn_karavan_place_zora'] = "jungle"; + // 9/8 + + } + + function countRegion($r) { + $c = 0; + + foreach($this->spawns as $elem) { + if($this->region_map[$elem] == $r) { + $c++; + } + } + + return $c; + } +} +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/SkillList_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/SkillList_entity.php new file mode 100644 index 000000000..6dc2202b3 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/SkillList_entity.php @@ -0,0 +1,10 @@ +setName("skilllist"); + $this->skills = array(); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/SkillPoints_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/SkillPoints_entity.php new file mode 100644 index 000000000..81582b703 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/SkillPoints_entity.php @@ -0,0 +1,10 @@ +setName("skillpoints"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Skill_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Skill_entity.php new file mode 100644 index 000000000..f06132ac8 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Skill_entity.php @@ -0,0 +1,14 @@ +setName("skill"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/SpentSkillPoints_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/SpentSkillPoints_entity.php new file mode 100644 index 000000000..5bacb0e52 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/SpentSkillPoints_entity.php @@ -0,0 +1,10 @@ +setName("spentskillpoints"); + } + } +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/TPlist_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/TPlist_entity.php new file mode 100644 index 000000000..7b4987d05 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/TPlist_entity.php @@ -0,0 +1,14 @@ +setName("TPlist"); + $this->tps = array(); + } + + function hasTP($tp) { + return in_array($tp,$this->tps); + } +} +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Title_entity.php b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Title_entity.php new file mode 100644 index 000000000..0186b37a7 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/source/PDRtoXMLdriver/entity/Title_entity.php @@ -0,0 +1,20 @@ +setName("title"); + $this->title_id = ""; + $this->title = null; + } + + function loadID() { + global $DBc; + + $res = $DBc->sendSQL("SELECT t_id FROM ryzom_title WHERE t_male='".$DBc->mre($this->title)."' OR t_female='".$DBc->mre($this->title)."'","ARRAY"); + + $this->title_id = $res[0]['t_id']; + } +} +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/xmldef/debug.php b/code/web/api/server/scripts/achievement_script/xmldef/debug.php new file mode 100644 index 000000000..0f009cf5f --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/xmldef/debug.php @@ -0,0 +1,84 @@ +def['XML/UTC__PVPFLAGLASTTIMECHANGE'] = array("debug"); +$this->def['XML/UTC__PVPRECENTACTIONTIME'] = array("debug"); +$this->def['XML/UTC__PVPFLAGTIMESETTEDON'] = array("debug"); +$this->def['XML/_REGIONKILLEDINPVP'] = array("debug"); +$this->def['XML/_CREATIONPOINTSREPARTITION'] = array("debug"); +$this->def['XML/UTC__FORBIDAURAUSESTARTDATE'] = array("debug"); +$this->def['XML/UTC__FORBIDAURAUSEENDDATE'] = array("debug"); +array_push($this->def['XML/_TITLE'],"debug"); +$this->def['XML/NAMESTRINGID'] = array("debug"); +$this->def['XML/_HAIRCUTEDISCOUNT'] = array("debug"); + $this->addWildcard("XML/_FORBIDPOWERDATES","debug"); +$this->def['XML/_INEFFECTIVEAURAS'] = array("debug"); +$this->def['XML/_INEFFECTIVEAURAS/_AURAACTIVATIONDATES'] = array("debug"); +$this->def['XML/_INEFFECTIVEAURAS/_AURAACTIVATIONDATES/DEACTIVATIONDATE'] = array("debug"); +$this->def['XML/_INEFFECTIVEAURAS/_AURAACTIVATIONDATES/ACTIVATIONDATE'] = array("debug"); +$this->def['XML/_INEFFECTIVEAURAS/_AURAACTIVATIONDATES/CONSUMABLEFAMILYID'] = array("debug"); +$this->def['XML/_INEFFECTIVEAURAS/_AURAACTIVATIONDATES/POWERTYPE'] = array("debug"); +$this->def['XML/_MODIFIERSINDB'] = array("debug"); + $this->addWildcard("XML/_MODIFIERSINDB/BONUS","debug"); + $this->addWildcard("XML/_MODIFIERSINDB/MALUS","debug"); +$this->def['XML/ENTITYBASE'] = array("debug"); +$this->def['XML/ENTITYBASE/_SHEETID'] = array("debug"); +$this->def['XML/ENTITYBASE/MELEEATTACKMODIFIERONENEMY'] = array("debug"); +$this->def['XML/ENTITYBASE/MELEEATTACKMODIFIERONSELF'] = array("debug"); +$this->def['XML/ENTITYBASE/MAGICCASTINGMODIFIERONSELF'] = array("debug"); +$this->def['XML/ENTITYBASE/MAGICCASTINGMODIFIERONENEMY'] = array("debug"); +$this->def['XML/ENTITYBASE/RANGEATTACKMODIFIERONENEMY'] = array("debug"); +$this->def['XML/ENTITYBASE/RANGEATTACKMODIFIERONSELF'] = array("debug"); +$this->def['XML/ENTITYBASE/ATTACKMODIFIERONSELF'] = array("debug"); +$this->def['XML/ENTITYBASE/CHANCETOFAILSTRATEGY'] = array("debug"); +$this->def['XML/ENTITYBASE/CHANCETOFAILSPELL'] = array("debug"); +$this->def['XML/ENTITYBASE/CHANCETOFAILFABER'] = array("debug"); +$this->def['XML/ENTITYBASE/CHANCETOFAILHARVEST'] = array("debug"); +$this->def['XML/ENTITYBASE/CHANCETOFAILTRACKING'] = array("debug"); +$this->def['XML/ENTITYBASE/MELEEATTACKSLOW'] = array("debug"); +$this->def['XML/ENTITYBASE/MELEESLASHINGDAMAGEARMOR'] = array("debug"); +$this->def['XML/ENTITYBASE/MELEEBLUNTDAMAGEARMOR'] = array("debug"); +$this->def['XML/ENTITYBASE/MELEEPIERCINGDAMAGEARMOR'] = array("debug"); +$this->def['XML/ENTITYBASE/MELEEDAMAGEMODIFIERFACTOR'] = array("debug"); +$this->def['XML/ENTITYBASE/RANGEDAMAGEMODIFIERFACTOR'] = array("debug"); +$this->def['XML/ENTITYBASE/CREATUREMELEETAKENDAMAGEFACTOR'] = array("debug"); +$this->def['XML/ENTITYBASE/CREATURERANGETAKENDAMAGEFACTOR'] = array("debug"); +$this->def['XML/ENTITYBASE/COMBATBRICKLATENCYMULTIPLIER'] = array("debug"); +$this->def['XML/ENTITYBASE/MAGICBRICKLATENCYMULTIPLIER'] = array("debug"); +$this->def['XML/ENTITYBASE/ARMORQUALITYMODIFIER'] = array("debug"); +$this->def['XML/ENTITYBASE/WEAPONQUALITYMODIFIER'] = array("debug"); +$this->def['XML/ENTITYBASE/ARMORABSORBTIONMULTIPLIER'] = array("debug"); +$this->def['XML/RINGREWARDPOINTS'] = array("debug"); +$this->def['XML/RINGREWARDPOINTS/RINGREWARDPOINTS/__KEY__'] = array("debug"); +$this->def['XML/RINGREWARDPOINTS/RINGREWARDPOINTS/__VAL__'] = array("debug"); + $this->addWildcard("XML/_PERSISTENTEFFECTS","debug"); +$this->def['XML/_PACT'] = array("debug"); +$this->def['XML/_PACT/PACTNATURE'] = array("debug"); +$this->def['XML/_PACT/PACTTYPE'] = array("debug"); +array_push($this->def['XML/_PLAYERPETS'],"debug"); +array_push($this->def['XML/_PLAYERPETS/__KEY__'],"debug"); +array_push($this->def['XML/_PLAYERPETS/__VAL__'],"debug"); +$this->def['XML/_PLAYERPETS/__VAL__/TICKETPETSHEETID'] = array("debug"); +$this->def['XML/_PLAYERPETS/__VAL__/PRICE'] = array("debug"); +$this->def['XML/_PLAYERPETS/__VAL__/OWNERID'] = array("debug"); +$this->def['XML/_PLAYERPETS/__VAL__/STABLEALIAS'] = array("debug"); +$this->def['XML/_PLAYERPETS/__VAL__/SLOT'] = array("debug"); +$this->def['XML/_PLAYERPETS/__VAL__/ISTPALLOWED'] = array("debug"); +$this->def['XML/_PLAYERPETS/__VAL__/CUSTOMNAME'] = array("debug"); +$this->def['XML/STARTINGCHARACTERISTICVALUES'] = array("debug"); +$this->def['XML/STARTINGCHARACTERISTICVALUES/__KEY__'] = array("debug"); +$this->def['XML/STARTINGCHARACTERISTICVALUES/__VAL__'] = array("debug"); +$this->def['XML/_ENCYCLOCHAR'] = array("debug"); +$this->def['XML/_ENCYCLOCHAR/_ENCYCHARALBUMS'] = array("debug"); +$this->def['XML/_ENCYCLOCHAR/_ENCYCHARALBUMS/ALBUMSTATE'] = array("debug"); +$this->def['XML/_ENCYCLOCHAR/_ENCYCHARALBUMS/THEMAS'] = array("debug"); +$this->def['XML/_ENCYCLOCHAR/_ENCYCHARALBUMS/THEMAS/THEMASTATE'] = array("debug"); +$this->def['XML/_ENCYCLOCHAR/_ENCYCHARALBUMS/THEMAS/RITETASKSTATEPACKED'] = array("debug"); +$this->def['XML/_GAMEEVENT'] = array("debug"); +$this->def['XML/_GAMEEVENT/UTC__DATE'] = array("debug"); + $this->addWildcard("XML/ENTITYBASE/_ENTITYPOSITION","debug"); + $this->addWildcard("XML/_ENTITYPOSITION","debug"); +$this->def['XML/INVISIBLE'] = array("debug"); +$this->def['XML/AGGROABLE'] = array("debug"); +$this->def['XML/GODMODE'] = array("debug"); + +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/xmldef/faction.php b/code/web/api/server/scripts/achievement_script/xmldef/faction.php new file mode 100644 index 000000000..f4ca5ddad --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/xmldef/faction.php @@ -0,0 +1,12 @@ +def['XML/FACTIONPOINTS'] = array("faction"); +$this->def['XML/FACTIONPOINTS/__KEY__'] = array("faction"); +$this->def['XML/FACTIONPOINTS/__VAL__'] = array("faction"); +$this->def['XML/_ORGANIZATION'] = array("faction"); +$this->def['XML/_ORGANIZATIONSTATUS'] = array("faction"); +$this->def['XML/_ORGANIZATIONPOINTS'] = array("faction"); +$this->def['XML/DECLAREDCULT'] = array("faction"); +$this->def['XML/DECLAREDCIV'] = array("faction"); + +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/xmldef/fame.php b/code/web/api/server/scripts/achievement_script/xmldef/fame.php new file mode 100644 index 000000000..568d18362 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/xmldef/fame.php @@ -0,0 +1,10 @@ +def['XML/_FAMES/_FAME'] = array("fame"); +$this->def['XML/_FAMES/_FAME/__KEY__'] = array("fame"); +$this->def['XML/_FAMES/_FAME/__VAL__'] = array("fame"); +$this->def['XML/_FAMES/_FAME/__VAL__/FAME'] = array("fame"); +$this->def['XML/_FAMES/_FAME/__VAL__/FAMEMEMORY'] = array("fame"); +$this->def['XML/_FAMES/_FAME/__VAL__/LASTFAMECHANGETREND'] = array("fame"); + +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/xmldef/inventory.php b/code/web/api/server/scripts/achievement_script/xmldef/inventory.php new file mode 100644 index 000000000..47f11512f --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/xmldef/inventory.php @@ -0,0 +1,133 @@ +def['XML/_MONEY'] = array("inventory"); +$this->def['XML/_PLAYERROOM'] = array("inventory"); +$this->def['XML/_PLAYERROOM/BUILDING'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_ITEMID'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_SHEETID'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_LOCSLOT'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_HP'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_RECOMMENDED'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CREATORID'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_PHRASEID'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_USENEWSYSTEMREQUIREMENT'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_REQUIREDSKILLLEVEL'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CUSTOMTEXT'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_LOCKEDBYOWNER'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/STACKSIZE'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/DURABILITY'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/WEIGHT'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/STATENERGY'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/DODGEMODIFIER'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PARRYMODIFIER'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTIONFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/MAXSLASHINGPROTECTION'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/MAXBLUNTPROTECTION'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/MAXPIERCINGPROTECTION'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/COLOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/FOCUSBUFF'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/HPBUFF'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/SAPBUFF'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/STABUFF'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION1'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION2'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION3'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/SAPLOAD'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/DMG'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/SPEED'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/RANGE'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/ADVERSARYDODGEMODIFIER'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/ADVERSARYPARRYMODIFIER'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION1FACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION2FACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION3FACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/DESERTRESISTANCEFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/FORESTRESISTANCEFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/LACUSTRERESISTANCEFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/JUNGLERESISTANCEFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PRIMARYROOTRESISTANCEFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/ELEMENTALCASTINGTIMEFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/ELEMENTALPOWERFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/OFFENSIVEAFFLICTIONCASTINGTIMEFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/OFFENSIVEAFFLICTIONPOWERFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/HEALCASTINGTIMEFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/HEALPOWERFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/DEFENSIVEAFFLICTIONCASTINGTIMEFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/DEFENSIVEAFFLICTIONPOWERFACTOR'] = array("inventory"); +$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/_ENCHANTMENT'] = array("inventory"); +$this->def['XML/_PLAYERPETS'] = array("inventory"); +$this->def['XML/_PLAYERPETS/__KEY__'] = array("inventory"); +$this->def['XML/_PLAYERPETS/__VAL__'] = array("inventory"); +$this->def['XML/_PLAYERPETS/__VAL__/PETSHEETID'] = array("inventory"); +$this->def['XML/_PLAYERPETS/__VAL__/LANDSCAPE_X'] = array("inventory"); +$this->def['XML/_PLAYERPETS/__VAL__/LANDSCAPE_Y'] = array("inventory"); +$this->def['XML/_PLAYERPETS/__VAL__/LANDSCAPE_Z'] = array("inventory"); +$this->def['XML/_PLAYERPETS/__VAL__/UTC_DEATHTICK'] = array("inventory"); +$this->def['XML/_PLAYERPETS/__VAL__/PETSTATUS'] = array("inventory"); +$this->def['XML/_PLAYERPETS/__VAL__/SATIETY'] = array("inventory"); +$this->def['XML/INVENTORY'] = array("inventory"); +$this->def['XML/INVENTORY/__KEY__'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_ITEMID'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_SHEETID'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_LOCSLOT'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_HP'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_RECOMMENDED'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CREATORID'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_PHRASEID'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_USENEWSYSTEMREQUIREMENT'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_REQUIREDSKILLLEVEL'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CUSTOMTEXT'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_LOCKEDBYOWNER'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/STACKSIZE'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/DURABILITY'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/WEIGHT'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/STATENERGY'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/DODGEMODIFIER'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PARRYMODIFIER'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTIONFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/MAXSLASHINGPROTECTION'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/MAXBLUNTPROTECTION'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/MAXPIERCINGPROTECTION'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/COLOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/FOCUSBUFF'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/HPBUFF'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/SAPBUFF'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/STABUFF'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION1'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION2'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION3'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/SAPLOAD'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/DMG'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/SPEED'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/RANGE'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/ADVERSARYDODGEMODIFIER'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/ADVERSARYPARRYMODIFIER'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION1FACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION2FACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION3FACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/DESERTRESISTANCEFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/FORESTRESISTANCEFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/LACUSTRERESISTANCEFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/JUNGLERESISTANCEFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PRIMARYROOTRESISTANCEFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/ELEMENTALCASTINGTIMEFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/ELEMENTALPOWERFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/OFFENSIVEAFFLICTIONCASTINGTIMEFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/OFFENSIVEAFFLICTIONPOWERFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/HEALCASTINGTIMEFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/HEALPOWERFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/DEFENSIVEAFFLICTIONCASTINGTIMEFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/DEFENSIVEAFFLICTIONPOWERFACTOR'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/_ENCHANTMENT'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/_REFINVENTORYSLOT'] = array("inventory"); +$this->def['XML/INVENTORY/__VAL__/_ITEM/REFINVENTORYID'] = array("inventory"); + +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/xmldef/knowledge.php b/code/web/api/server/scripts/achievement_script/xmldef/knowledge.php new file mode 100644 index 000000000..5ba75d2cc --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/xmldef/knowledge.php @@ -0,0 +1,11 @@ +def['XML/_BOUGHTPHRASES'] = array("knowledge"); +$this->def['XML/_KNOWNBRICKS'] = array("knowledge"); +$this->def['XML/_KNOWNPHRASES'] = array("knowledge"); +$this->def['XML/_MEMORIZEDPHRASES'] = array("knowledge"); +$this->def['XML/_MEMORIZEDPHRASES/PHRASEDESC/NAME'] = array("knowledge"); +$this->def['XML/_MEMORIZEDPHRASES/PHRASEDESC/BRICKS'] = array("knowledge"); +$this->def['XML/RESPAWNPOINTS/RESPAWNPOINTS'] = array("knowledge"); + +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/xmldef/logs.php b/code/web/api/server/scripts/achievement_script/xmldef/logs.php new file mode 100644 index 000000000..acfd7b726 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/xmldef/logs.php @@ -0,0 +1,11 @@ +def['XML/_FIRSTCONNECTEDTIME'] = array("logs"); +$this->def['XML/_LASTCONNECTEDTIME'] = array("logs"); +$this->def['XML/_PLAYEDTIME'] = array("logs"); +$this->def['XML/_LASTLOGSTATS'] = array("logs"); +$this->def['XML/_LASTLOGSTATS/LOGINTIME'] = array("logs"); +$this->def['XML/_LASTLOGSTATS/DURATION'] = array("logs"); +$this->def['XML/_LASTLOGSTATS/LOGOFFTIME'] = array("logs"); + +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/xmldef/missions.php b/code/web/api/server/scripts/achievement_script/xmldef/missions.php new file mode 100644 index 000000000..ea3a198ec --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/xmldef/missions.php @@ -0,0 +1,3 @@ +addWildcard("XML/_MISSIONS","missions"); +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/xmldef/public.php b/code/web/api/server/scripts/achievement_script/xmldef/public.php new file mode 100644 index 000000000..5b510db0c --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/xmldef/public.php @@ -0,0 +1,40 @@ +def['XML/_HAIRTYPE'] = array("public"); +$this->def['XML/HAIRTYPE'] = array("public"); +$this->def['XML/_HAIRCOLOR'] = array("public"); +$this->def['XML/HAIRCOLOR'] = array("public"); +$this->def['XML/_HATCOLOR'] = array("public"); +$this->def['XML/_JACKETCOLOR'] = array("public"); +$this->def['XML/_ARMSCOLOR'] = array("public"); +$this->def['XML/_TROUSERSCOLOR'] = array("public"); +$this->def['XML/_FEETCOLOR'] = array("public"); +$this->def['XML/_HANDSCOLOR'] = array("public"); +$this->def['XML/_PVPFLAG'] = array("public"); +$this->def['XML/_GUILDID'] = array("public"); +$this->def['XML/_TITLE'] = array("public"); +$this->def['XML/GABARITHEIGHT'] = array("public"); +$this->def['XML/GABARITTORSOWIDTH'] = array("public"); +$this->def['XML/GABARITARMSWIDTH'] = array("public"); +$this->def['XML/GABARITLEGSWIDTH'] = array("public"); +$this->def['XML/GABARITBREASTSIZE'] = array("public"); +$this->def['XML/MORPHTARGET1'] = array("public"); +$this->def['XML/MORPHTARGET2'] = array("public"); +$this->def['XML/MORPHTARGET3'] = array("public"); +$this->def['XML/MORPHTARGET4'] = array("public"); +$this->def['XML/MORPHTARGET5'] = array("public"); +$this->def['XML/MORPHTARGET6'] = array("public"); +$this->def['XML/MORPHTARGET7'] = array("public"); +$this->def['XML/MORPHTARGET8'] = array("public"); +$this->def['XML/EYESCOLOR'] = array("public"); +$this->def['XML/TATTOO'] = array("public"); +$this->def['XML/NORMALPOSITIONS/VEC/POSSTATE'] = array("public"); +$this->def['XML/NORMALPOSITIONS/VEC/POSSTATE/X'] = array("public"); +$this->def['XML/NORMALPOSITIONS/VEC/POSSTATE/Y'] = array("public"); +$this->def['XML/NORMALPOSITIONS/VEC/POSSTATE/Z'] = array("public"); +$this->def['XML/NORMALPOSITIONS/VEC/POSSTATE/HEADING'] = array("public"); +$this->def['XML/ENTITYBASE/_NAME'] = array("public"); +$this->def['XML/ENTITYBASE/_GENDER'] = array("public"); +$this->def['XML/ENTITYBASE/_SIZE'] = array("public"); + +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/xmldef/shop.php b/code/web/api/server/scripts/achievement_script/xmldef/shop.php new file mode 100644 index 000000000..5d842a17a --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/xmldef/shop.php @@ -0,0 +1,66 @@ +def['XML/_ITEMSINSHOPSTORE'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_PRICE'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_RETIREPRICE'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/UTC__STARTSALECYCLE'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_OWNER'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_CONTINENT'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_QUANTITY'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_IDENTIFIER'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_ITEMID'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_SHEETID'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_LOCSLOT'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_HP'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_RECOMMENDED'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CREATORID'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_PHRASEID'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/STACKSIZE'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_USENEWSYSTEMREQUIREMENT'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CUSTOMTEXT'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_LOCKEDBYOWNER'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/DURABILITY'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/WEIGHT'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/STATENERGY'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/DODGEMODIFIER'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PARRYMODIFIER'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTIONFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/MAXSLASHINGPROTECTION'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/MAXBLUNTPROTECTION'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/MAXPIERCINGPROTECTION'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/COLOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/FOCUSBUFF'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/HPBUFF'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/SAPBUFF'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/STABUFF'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION1'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION2'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION3'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/SAPLOAD'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/DMG'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/SPEED'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/RANGE'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/ADVERSARYDODGEMODIFIER'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/ADVERSARYPARRYMODIFIER'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION1FACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION2FACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION3FACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/DESERTRESISTANCEFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/FORESTRESISTANCEFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/LACUSTRERESISTANCEFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/JUNGLERESISTANCEFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PRIMARYROOTRESISTANCEFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/ELEMENTALCASTINGTIMEFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/ELEMENTALPOWERFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/OFFENSIVEAFFLICTIONCASTINGTIMEFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/OFFENSIVEAFFLICTIONPOWERFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/HEALCASTINGTIMEFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/HEALPOWERFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/DEFENSIVEAFFLICTIONCASTINGTIMEFACTOR'] = array("shop"); +$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/DEFENSIVEAFFLICTIONPOWERFACTOR'] = array("shop"); + +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/xmldef/skills.php b/code/web/api/server/scripts/achievement_script/xmldef/skills.php new file mode 100644 index 000000000..f0f8e2113 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/xmldef/skills.php @@ -0,0 +1,21 @@ +def['XML/ENTITYBASE/_SKILLS/SKILLS'] = array("skills"); +$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__KEY__'] = array("skills"); +$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__VAL__'] = array("skills"); +$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__VAL__/BASE'] = array("skills"); +$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__VAL__/CURRENT'] = array("skills"); +$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__VAL__/MAXLVLREACHED'] = array("skills"); +$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__VAL__/XP'] = array("skills"); +$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__VAL__/XPNEXTLVL'] = array("skills"); +$this->def['XML/SKILLPOINTS'] = array("skills"); +$this->def['XML/SKILLPOINTS/__KEY__'] = array("skills"); +$this->def['XML/SKILLPOINTS/__VAL__'] = array("skills"); +$this->def['XML/SPENTSKILLPOINTS'] = array("skills"); +$this->def['XML/SPENTSKILLPOINTS/__KEY__'] = array("skills"); +$this->def['XML/SPENTSKILLPOINTS/__VAL__'] = array("skills"); +$this->def['XML/SCOREPERMANENTMODIFIERS'] = array("skills"); +$this->def['XML/SCOREPERMANENTMODIFIERS/__KEY__'] = array("skills"); +$this->def['XML/SCOREPERMANENTMODIFIERS/__VAL__'] = array("skills"); + +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/xmldef/social.php b/code/web/api/server/scripts/achievement_script/xmldef/social.php new file mode 100644 index 000000000..92c015fd8 --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/xmldef/social.php @@ -0,0 +1,7 @@ +def['XML/_FRIENDSLIST'] = array("social"); +$this->def['XML/_ISFRIENDOF'] = array("social"); +$this->def['XML/FRIENDVISIBILITy'] = array("social"); + +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/achievement_script/xmldef/stats.php b/code/web/api/server/scripts/achievement_script/xmldef/stats.php new file mode 100644 index 000000000..014202f1b --- /dev/null +++ b/code/web/api/server/scripts/achievement_script/xmldef/stats.php @@ -0,0 +1,27 @@ +def['XML/_HPB'] = array("stats"); +$this->def['XML/_PVPPOINT'] = array("stats"); +$this->def['XML/_DEATHPENALTIES'] = array("stats"); +$this->def['XML/_DEATHPENALTIES/_NBDEATH'] = array("stats"); +$this->def['XML/_DEATHPENALTIES/_CURRENTDEATHXP'] = array("stats"); +$this->def['XML/_DEATHPENALTIES/_DEATHXPTOGAIN'] = array("stats"); +$this->def['XML/_DEATHPENALTIES/_BONUSUPDATETIME'] = array("stats"); +$this->def['XML/ENTITYBASE/_DODGEASDEFENSE'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSCHARACS/_PHYSICALCHARACTERISTICS'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSCHARACS/_PHYSICALCHARACTERISTICS/__KEY__'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSCHARACS/_PHYSICALCHARACTERISTICS/__VAL__'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSSCORES'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSSCORES/BASEWALKSPEED'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSSCORES/BASERUNSPEED'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSSCORES/CURRENTWALKSPEED'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSSCORES/CURRENTRUNSPEED'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSSCORES/__KEY__'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSSCORES/__VAL__/CURRENT'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSSCORES/__VAL__/BASE'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSSCORES/__VAL__/MAX'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSSCORES/__VAL__/BASEREGENERATEREPOS'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSSCORES/__VAL__/BASEREGENERATEACTION'] = array("stats"); +$this->def['XML/ENTITYBASE/_PHYSSCORES/__VAL__/CURRENTREGENERATE'] = array("stats"); + +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/create_guilds_xml.php b/code/web/api/server/scripts/create_guilds_xml.php new file mode 100644 index 000000000..6e815cd2b --- /dev/null +++ b/code/web/api/server/scripts/create_guilds_xml.php @@ -0,0 +1,142 @@ +asXML(); + // save in clear xml + file_put_contents($filename, $txt_xml); + // save in clear compressed xml + $gz = gzopen($filename.'.gz','w9'); + gzwrite($gz, $txt_xml); + gzclose($gz); +} + +function create_guild($out, $filename, $shard) { + global $db, $time, $guilds_cache_timeout; + + $src = simplexml_load_file($filename); + + echo "$filename\n"; + + $guild = $out->addChild('guild'); + $guild->addChild('gid', $src->Id['value']); + $guild->addChild('name', $src->_Name['value']); + $guild->addChild('race', $src->Race['value']); + $guild->addChild('icon', $src->Icon['value']); + $guild->addChild('creation_date', $src->CreationDate['value']); + + $desc = (string)$src->_Description['value']; + $desc = iconv("UTF-8", "ISO-8859-1", $desc); + $replace = array('&', '<', '>'); + $into = array('&', '<', '>'); + $desc = str_replace($replace, $into, $desc); + $guild->addChild('description', $desc); + + // create the full guild xml + + $xml = simplexml_load_string(''); + + $cache = $xml->addChild('cache'); + $cache->addAttribute('created', $time); + $cache->addAttribute('expire', $time+$guilds_cache_timeout); + + $xml->addChild('name', $src->_Name['value']); + $xml->addChild('gid', $src->Id['value']); + $xml->addChild('race', $src->Race['value']); + $xml->addChild('icon', $src->Icon['value']); + $xml->addChild('creation_date', $src->CreationDate['value']); + $xml->addChild('shard', $shard); + $xml->addChild('description', $desc); + $xml->addChild('money', $src->Money['value']); + $xml->addChild('building', $src->Building['value']); + + $xml->addChild('cult', strtolower($src->DeclaredCult['value'])); + $xml->addChild('civ', strtolower($src->DeclaredCiv['value'])); + + $motd = (string)$src->_MessageOfTheDay['value']; + $motd = iconv("UTF-8", "ISO-8859-1", $motd); + $motd = str_replace($replace, $into, $motd); + $xml->addChild('motd', $motd); + + // guild members + $members = $xml->addChild('members'); + $i = 0; + do { + $m = $src->Members->__Key__[$i]['value']; + if(!isset($m)) break; + $m2 = $src->Members->__Val__[$i]; + $mem = $members->addChild('member'); + $cid = hexdec(substr($m2->Members->Id['value'], 3, 10)); + $mem->addChild('cid', $cid); + $sql = "SELECT char_name FROM characters WHERE char_id=$cid"; + $result = $db->query($sql); + $name = $db->fetch_row($result); + $db->free_result($result); + $mem->addChild('name', $name[0]); + $mem->addChild('grade', $m2->Members->Grade['value']); + $mem->addChild('joined_date', $m2->Members->EnterTime['value']); + $i++; + } while(true); + + // guild fame + $factions = array('fyros', 'matis', 'tryker', 'zorai', 'kami', 'karavan'); + $fames = $xml->addChild('fames'); + $i = 0; + do { + $f = $src->FameContainer->FameContainer->__Parent__->Entries->__Key__[$i]['value']; + if(!isset($f)) break; + $f2 = $src->FameContainer->FameContainer->__Parent__->Entries->__Val__[$i]; + $fac = basename($f2->Sheet['value'], '.faction'); + if(in_array($fac, $factions)) { + $fames->addChild($fac, $f2->Fame['value']); + } + $i++; + } while(true); + + // guild items +/* $inventory = $xml->addChild('room'); + $result = $src->xpath('/xml/GuildInventory/_Items'); + while(list( , $node) = each($result)) { + ryzom_item_insert($inventory, $node); + } +*/ + save_xml("guild_".$src->Id['value'], $xml); +} + +function create_guilds_xml($shard) { + global $time, $guilds_cache_timeout; + + $xml = simplexml_load_string(''); + + $cache = $xml->addChild('cache'); + $cache->addAttribute('created', $time); + $cache->addAttribute('expire', $time+$guilds_cache_timeout); + $xml->addChild('shard', $shard); + + foreach(glob("/home/api/public_html/data/cache/guilds/guild_?????.xml") as $fn) { + create_guild($xml, $fn, $shard); + } +// $dirname = "tmp/$shard"; +// if ($handle = opendir($dirname)) { +// while (false !== ($file = readdir($handle))) { +// if (end(explode(".", $file)) == 'xml') { +// create_guild($xml, "$dirname/$file"); +// } +// } +// closedir($handle); +// } + + save_xml("guilds_$shard", $xml); +} + +create_guilds_xml('atys'); + +?> \ No newline at end of file diff --git a/code/web/api/server/scripts/generate_guild_icon.sh b/code/web/api/server/scripts/generate_guild_icon.sh new file mode 100644 index 000000000..0f1fcd970 --- /dev/null +++ b/code/web/api/server/scripts/generate_guild_icon.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +echo $1; + +let "back=($1 & 15) - 1" +let "symbol=($1 >> 4 & 63) - 1" +let "invert=$1 >> 10 & 1" +let "col1R=$1 >> 11 & 255" +let "col1G=$1 >> 19 & 255" +let "col1B=$1 >> 27 & 255" +let "col2R=$1 >> 35 & 255" +let "col2G=$1 >> 43 & 255" +let "col2B=$1 >> 51 & 255" + +size="$2" + +png_path='/home/api/public_html/data/ryzom/guild_png/'; +final_path='/home/api/public_html/data/cache/guild_icons/'; +tmp_path="$final_path/tmp"; +img_back=`printf $png_path/guild_back_%s_%02d_1.png $size $back` +img_back2=`printf $png_path/guild_back_%s_%02d_2.png $size $back` +img_symbol=`printf $png_path/guild_symbol_%s_%02d.png $size $symbol` +img_final=`printf $final_path/%d_%s.png $1 $size` + +convert $img_back -fill "rgb($col1R,$col1G,$col1B)" -colorize 100,100,100 $tmp_path/$1_$2_part_1.png +convert $img_back2 -fill "rgb($col2R,$col2G,$col2B)" -colorize 100,100,100 $tmp_path/$1_$2_part_2.png +convert -composite $tmp_path/$1_$2_part_1.png $tmp_path/$1_$2_part_2.png $tmp_path/$1_$2_back.png + +if [[ $invert == 1 ]] +then + convert -negate $img_symbol $tmp_path/$1_$2_symb.png + composite -compose plus $tmp_path/$1_$2_back.png $tmp_path/$1_$2_symb.png $img_final +else + composite -compose multiply $tmp_path/$1_$2_back.png $img_symbol $img_final +fi + +composite -compose copy-opacity $tmp_path/$1_$2_back.png $img_final $img_final + +rm $tmp_path/$1_$2_* diff --git a/code/web/api/server/scripts/get_guilds_xml.sh b/code/web/api/server/scripts/get_guilds_xml.sh new file mode 100644 index 000000000..f4619f459 --- /dev/null +++ b/code/web/api/server/scripts/get_guilds_xml.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +cd /home/api/public_html/server/scripts + +# get guilds + +rm /home/api/public_html/data/cache/guilds/* + +rsync -az --rsh=ssh nevrax@shard.ryzom.com:/home/nevrax/code/ryzom/server/save_shard/live_atys/guilds/guild_*.bin /home/api/public_html/data/cache/guilds/ + +./pdr_util -x -s/home/app/web_hg/api/server/scripts/sheet_id.bin /home/api/public_html/data/cache/guilds/guild_*.bin + +rm /home/api/public_html/data/cache/guilds/guild_*.bin + +/usr/bin/php ./create_guilds_xml.php + +rm /home/api/public_html/data/cache/guilds/guild_?????.xml + +rm log.log + +/root/bin/own.sh api /home/api/public_html/data/cache/guilds/ + +# get tick + +rsync -az --rsh=ssh nevrax@shard.ryzom.com:/home/nevrax/code/ryzom/server/save_shard/live_atys/game_cycle.ticks /home/api/public_html/data/cache/ + +chown api:api /home/api/public_html/data/cache/game_cycle.ticks + +cd - diff --git a/code/web/api/server/time.php b/code/web/api/server/time.php new file mode 100644 index 000000000..17166d19d --- /dev/null +++ b/code/web/api/server/time.php @@ -0,0 +1,46 @@ +. + */ + +$tick_cache_timeout = 60; + +function ryzom_time_tick() { + $fn = RYAPI_PATH.'data/cache/game_cycle.ticks'; + $handle = fopen($fn, "r"); + $version = fread($handle, 1); + $raw_tick = fread($handle, 4); + fclose($handle); + $arr = unpack("V", $raw_tick); + $tick = $arr[1]; + return sprintf("%u", $tick & 0xffffffff); +} + + +/** + * Takes a computed ryzom time array and returns a SimpleXMLElement + */ +function ryzom_time_xml($rytime) { + global $tick_cache_timeout; + $out = ryzom_time_xml_without_cache($rytime); + $filename = RYAPI_PATH.'data/cache/game_cycle.ticks'; + $cache = $out->addChild('cache'); + $cache->addAttribute('created', filemtime($filename)); + $cache->addAttribute('expire', (filemtime($filename)+$tick_cache_timeout)); + return $out; +} + +?> \ No newline at end of file diff --git a/code/web/api/server/user.php b/code/web/api/server/user.php index 9124191ae..713e6c399 100644 --- a/code/web/api/server/user.php +++ b/code/web/api/server/user.php @@ -16,15 +16,81 @@ * along with ryzom_api. If not, see . */ -function ryzom_user_get_info($cid) { +include_once(RYAPI_PATH.'server/guilds.php'); + + +function ryzom_get_user_id($cid, $name, $creation_date) { + $name = strtolower($name); + + $db = ryDB::getInstance('webig'); + + $dev_shard = ((isset($_SESSION['dev_shard']) && $_SESSION['dev_shard']) || (isset($_GET['shardid']) && $_GET['shardid'] == RYAPI_DEV_SHARDID))?1:0; + if ($dev_shard) + $_SESSION['dev_shard'] = 1; + $charsWithSameName = $db->query('players', array('name' => $name, 'deleted' => 0, 'dev_shard' => $dev_shard)); + + foreach ($charsWithSameName as $charWithSameName) { + // Another char with same name => delete it + if (intval($cid) != intval($charWithSameName['cid'])) { + $db->update('players', array('deleted' => 1), array('id' => $charWithSameName['id'])); + } + } + + $charProps = $db->querySingle('players', array('cid' => intval($cid), 'deleted' => 0, 'dev_shard' => $dev_shard)); + // new char => create record + if (!$charProps) { + $charProps = array('name' => $name, 'cid' => $cid, 'creation_date' => $creation_date, 'deleted' => 0, 'dev_shard' => $dev_shard); + $charProps['id'] = $db->insert('players', $charProps); + if (!$charProps['id']) + die('ryDb New Char Error'); + } else { + // char deleted and recreated => change to deleted + if ($charProps['creation_date'] != $creation_date) { + if (!$db->update('players', array('deleted' => 1), array('id' => $charProps['id']))) + die('ryDb Delete char Error: '.$db->getErrors()); + $charProps = array('name' => $name, 'cid' => $cid, 'creation_date' => $creation_date, 'deleted' => 0, 'dev_shard' => $dev_shard); + if (!$charProps['id'] = $db->insert('players', $charProps)) + die('ryDb New Char in Slot Error'); + } else { + // char renamed => update record + if ($charProps['name'] != $name) + if (!$db->update('players', array('name' => $name), array('id' => $charProps['id']))) + die('ryDb Rename Char Error'); + } + } + return $charProps['id']; +} + +function ryzom_get_user_gender($id) { + $db = ryDB::getInstance('webig'); + $player = $db->querySingle('players', array('id' => $id)); + if ($player) { + if ($player['gender']) + return intval($player['gender']); + $cid = $player['cid']; + $xml = @simplexml_load_file(RYAPI_PATH.'data/cache/players/public/'.substr($cid, strlen($cid)-1).'/'.$cid.'.xml'); + if ($xml !== false) { + $gender = (string)$xml->public->_gender; + $db->update('players', array('gender' => intval($gender)+1), array('id' => $id)); + return $gender+1; + } + } + return false; +} + +function ryzom_user_get_info($cid, $webprivs=false, $player_stats=false) { // User information global $_RYZOM_API_CONFIG; - $db = new ServerDatabase(RYAPI_NELDB_HOST, RYAPI_NELDB_LOGIN, RYAPI_NELDB_PASS, RYAPI_NELDB_RING); + + if (isset($_SESSION['dev_shard']) && $_SESSION['dev_shard']) + $db = new ServerDatabase(RYAPI_NELDB_HOST, RYAPI_NELDB_LOGIN, RYAPI_NELDB_PASS, RYAPI_NELDB_RING_DEV); + else + $db = new ServerDatabase(RYAPI_NELDB_HOST, RYAPI_NELDB_LOGIN, RYAPI_NELDB_PASS, RYAPI_NELDB_RING); $sql = "SELECT char_name, race, civilisation, cult, guild_id, creation_date, last_played_date FROM characters WHERE char_id = $cid"; $result = $db->query($sql) or die('Could not query on ryzom_user_get_info'); $found = $db->num_rows($result) >= 1; if (!$found) - die('Could not found on ryzom_user_get_info'); + return array('char_name' => _t('guest'), 'cid' => $cid, 'ERROR' => 'unknown_user', 'groups' => array('GUEST')); $row = $db->fetch_assoc($result); $db->free_result($result); if ($row) { @@ -32,8 +98,8 @@ function ryzom_user_get_info($cid) { $row['cult'] = substr($row['cult'], 2); $row['civ'] = substr($row['civilisation'], 2); if ($row['guild_id'] != '0') { - //$xml = @simplexml_load_file(ryzom_guild($row['guild_id'], false)); - $xml = false; + $xml = @simplexml_load_file(ryzom_guild($row['guild_id'], false)); + // $xml = false; if ($xml !== false) { $row['guild_icon'] = (string)$xml->icon; $row['guild_name'] = (string)$xml->name; @@ -45,16 +111,20 @@ function ryzom_user_get_info($cid) { } } } - + $uid = intval($cid / 16); $db = new ServerDatabase(RYAPI_NELDB_HOST, RYAPI_NELDB_LOGIN, RYAPI_NELDB_PASS, RYAPI_NELDB_NEL); $sql = "SELECT Privilege FROM user WHERE UId = $uid"; $result = $db->query($sql) or die("Could not query."); - $priv_row = $db->fetch_row($result, MYSQL_NUM); + $priv_row = $db->fetch_row($result, MYSQLI_NUM); $priv = $priv_row[0]; $db->free_result($result); $groups = array(); - + + $row['uid'] = $uid; + $row['cid'] = $cid; + $row['slot'] = $cid%16; + if (strpos($priv, ':DEV:') !== false) { $groups[] = 'DEV'; $groups[] = 'SGM'; @@ -64,14 +134,14 @@ function ryzom_user_get_info($cid) { $groups[] = 'VG'; $groups[] = 'G'; } - + if (strpos($priv, ':SGM:') !== false) { $groups[] = 'SGM'; $groups[] = 'GM'; $groups[] = 'VG'; $groups[] = 'G'; } - + if (strpos($priv, ':GM:') !== false) { $groups[] = 'GM'; $groups[] = 'VG'; @@ -86,25 +156,43 @@ function ryzom_user_get_info($cid) { if (strpos($priv, ':G:') !== false) { $groups[] = 'G'; } - + if (strpos($priv, ':SEM:') !== false) { $groups[] = 'SEM'; $groups[] = 'EM'; $groups[] = 'EG'; } - + if (strpos($priv, ':EM:') !== false) { $groups[] = 'EM'; $groups[] = 'EG'; } - + if (strpos($priv, ':EG:') !== false) { $groups[] = 'EG'; } $groups[] = 'PLAYER'; - $row['groups'] = $groups; + if (isset($_SESSION['dev_shard']) && $_SESSION['dev_shard']) + $groups[] = 'DEV_SHARD'; + + if ($webprivs) { + $db = new ServerDatabase(RYAPI_WEBDB_HOST, RYAPI_WEBDB_LOGIN, RYAPI_WEBDB_PASS, 'webig'); + $sql = 'SELECT web_privs FROM accounts WHERE uid = '.intval($cid/16); + $result = $db->query($sql) or die("Could not query.".$db->get_error()); + if ($result->num_rows == 0) + $db->query('INSERT INTO accounts (`uid`, `web_privs`) VALUES ('.intval($cid/16).', \'\')') or die("Could not query.".$db->get_error()); + $priv_row = $db->fetch_row($result, MYSQLI_NUM); + $privs = $priv_row[0]; + $db->free_result($result); + $groups = array_merge($groups, explode(':', $privs)); + } + if ($player_stats) { + include_once(RYAPI_PATH.'server/player_stats.php'); + $row['fames'] = ryzom_player_fames_array($cid); + } + $row['groups'] = $groups; return $row; } diff --git a/code/web/api/server/utils.php b/code/web/api/server/utils.php index 49860d24e..2d7146176 100644 --- a/code/web/api/server/utils.php +++ b/code/web/api/server/utils.php @@ -38,7 +38,7 @@ function ryzom_name_to_file($name) function ryzom_get_user_dir($user) { global $_RYZOM_API_CONFIG; - + if ($user == "") die("INTERNAL ERROR CODE 1"); diff --git a/code/web/api/time.php b/code/web/api/time.php new file mode 100644 index 000000000..34d8847fb --- /dev/null +++ b/code/web/api/time.php @@ -0,0 +1,35 @@ +asXML(); + break; +} + +?> \ No newline at end of file From 6130d065416d80d0f9f0f1381524155b4f4b2bb5 Mon Sep 17 00:00:00 2001 From: SirCotare Date: Fri, 15 Feb 2013 15:19:34 +0100 Subject: [PATCH 5/7] #1470 added missing summary image --- .../app_achievements/pic/menu/ig_summary.png | Bin 0 -> 49699 bytes .../app/app_achievements/pic/menu/summary.png | Bin 0 -> 2769 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 code/web/app/app_achievements/pic/menu/ig_summary.png create mode 100644 code/web/app/app_achievements/pic/menu/summary.png diff --git a/code/web/app/app_achievements/pic/menu/ig_summary.png b/code/web/app/app_achievements/pic/menu/ig_summary.png new file mode 100644 index 0000000000000000000000000000000000000000..e1dadd44216e2cb5a642cb32d57040a161909612 GIT binary patch literal 49699 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 z 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 R>Z@1hEX-_7ON>1u{{v7a^iTi* literal 0 HcmV?d00001 diff --git a/code/web/app/app_achievements/pic/menu/summary.png b/code/web/app/app_achievements/pic/menu/summary.png new file mode 100644 index 0000000000000000000000000000000000000000..599952056957afb5fc0f08beb838e80d35dce8b6 GIT binary patch literal 2769 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 XP|XFkMl_{z00000NkvXXu0mjfBTgtn literal 0 HcmV?d00001 From ba89dc7b94e210811a8dbe466c9b1516d3d0b579 Mon Sep 17 00:00:00 2001 From: SirCotare Date: Fri, 15 Feb 2013 16:00:01 +0100 Subject: [PATCH 6/7] #1470 removed old parser --- .../_AchWebParser/AchWebParser.php | 319 ------- .../_AchWebParser/class/Atom_class.php | 113 --- .../_AchWebParser/class/Callback_class.php | 18 - .../class/DataDispatcher_class.php | 90 -- .../class/DataSourceHandler_class.php | 23 - .../_AchWebParser/class/Entity_abstract.php | 25 - .../_AchWebParser/class/Logfile_class.php | 44 - .../class/SourceDriver_abstract.php | 9 - .../_AchWebParser/class/Stats_class.php | 42 - .../_AchWebParser/class/ValueCache_class.php | 31 - .../_AchWebParser/class/XMLfile_class.php | 74 -- .../class/XMLgenerator_class.php | 106 --- .../_AchWebParser/class/XMLnode_class.php | 77 -- .../_AchWebParser/class/mySQL_class.php | 160 ---- .../app_achievements/_AchWebParser/conf.php | 31 - .../_AchWebParser/include/functions_inc.php | 21 - .../_AchWebParser/log/_logDefaultDir_ | 0 .../_AchWebParser/log/xml_tmp/_xml_tmp_dir | 0 .../_AchWebParser/script/_scriptDir | 0 .../script/include_InPoly_class.php | 77 -- .../script/item_grade_script.php | 13 - .../script/places/continents.php | 6 - .../_AchWebParser/script/places/global.php | 5 - .../_AchWebParser/script/places/silan.php | 26 - .../_AchWebParser/script/statsdb.php | 82 -- .../PDRtoXMLdriver/PDRtoXMLdriver_class.php | 845 ------------------ .../entity/FactionPoints_entity.php | 10 - .../PDRtoXMLdriver/entity/Fame_entity.php | 12 - .../PDRtoXMLdriver/entity/FriendOf_entity.php | 15 - .../PDRtoXMLdriver/entity/Friend_entity.php | 15 - .../entity/Friendlist_entity.php | 29 - .../PDRtoXMLdriver/entity/Gear_entity.php | 9 - .../PDRtoXMLdriver/entity/Item_entity.php | 28 - .../entity/LastLogStats_entity.php | 11 - .../entity/MissionList_entity.php | 9 - .../PDRtoXMLdriver/entity/Mission_entity.php | 11 - .../entity/PermanentMod_entity.php | 10 - .../PDRtoXMLdriver/entity/Pet_entity.php | 24 - .../entity/PhysCharacs_entity.php | 10 - .../entity/PhysScores_entity.php | 15 - .../PDRtoXMLdriver/entity/Position_entity.php | 74 -- .../entity/RespawnPoints_entity.php | 80 -- .../entity/SkillList_entity.php | 10 - .../entity/SkillPoints_entity.php | 10 - .../PDRtoXMLdriver/entity/Skill_entity.php | 14 - .../entity/SpentSkillPoints_entity.php | 10 - .../PDRtoXMLdriver/entity/Title_entity.php | 20 - .../_AchWebParser/xmldef/debug.php | 84 -- .../_AchWebParser/xmldef/faction.php | 12 - .../_AchWebParser/xmldef/fame.php | 10 - .../_AchWebParser/xmldef/inventory.php | 131 --- .../_AchWebParser/xmldef/knowledge.php | 11 - .../_AchWebParser/xmldef/logs.php | 11 - .../_AchWebParser/xmldef/missions.php | 3 - .../_AchWebParser/xmldef/public.php | 40 - .../_AchWebParser/xmldef/shop.php | 66 -- .../_AchWebParser/xmldef/skills.php | 21 - .../_AchWebParser/xmldef/social.php | 7 - .../_AchWebParser/xmldef/stats.php | 27 - 59 files changed, 3086 deletions(-) delete mode 100644 code/web/app/app_achievements/_AchWebParser/AchWebParser.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/Atom_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/Callback_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/DataDispatcher_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/DataSourceHandler_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/Entity_abstract.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/Logfile_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/SourceDriver_abstract.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/Stats_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/ValueCache_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/XMLfile_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/XMLgenerator_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/XMLnode_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/class/mySQL_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/conf.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/include/functions_inc.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/log/_logDefaultDir_ delete mode 100644 code/web/app/app_achievements/_AchWebParser/log/xml_tmp/_xml_tmp_dir delete mode 100644 code/web/app/app_achievements/_AchWebParser/script/_scriptDir delete mode 100644 code/web/app/app_achievements/_AchWebParser/script/include_InPoly_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/script/item_grade_script.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/script/places/continents.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/script/places/global.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/script/places/silan.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/script/statsdb.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/PDRtoXMLdriver_class.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/FactionPoints_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Fame_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/FriendOf_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Friend_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Friendlist_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Gear_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Item_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/LastLogStats_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/MissionList_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Mission_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/PermanentMod_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Pet_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/PhysCharacs_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/PhysScores_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Position_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/RespawnPoints_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/SkillList_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/SkillPoints_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Skill_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/SpentSkillPoints_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Title_entity.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/xmldef/debug.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/xmldef/faction.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/xmldef/fame.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/xmldef/inventory.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/xmldef/knowledge.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/xmldef/logs.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/xmldef/missions.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/xmldef/public.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/xmldef/shop.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/xmldef/skills.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/xmldef/social.php delete mode 100644 code/web/app/app_achievements/_AchWebParser/xmldef/stats.php diff --git a/code/web/app/app_achievements/_AchWebParser/AchWebParser.php b/code/web/app/app_achievements/_AchWebParser/AchWebParser.php deleted file mode 100644 index be43d9011..000000000 --- a/code/web/app/app_achievements/_AchWebParser/AchWebParser.php +++ /dev/null @@ -1,319 +0,0 @@ -logf("File: '".$_REQUEST['file']."'"); - - $log->logf("Starting up... ",false); - - if(!$_REQUEST['file']) { - $log->logf("ERROR: no file given! EXITING!"); - $log->close(); - die(); - } - - //create database connection - $DBc = new mySQL($CONF['mysql_error']); - $DBc->connect($CONF['mysql_server'],$CONF['mysql_user'],$CONF['mysql_pass'],$CONF['mysql_database']); - - - require_once("class/DataDispatcher_class.php"); - require_once("class/DataSourceHandler_class.php"); - require_once("class/SourceDriver_abstract.php"); - require_once("class/Callback_class.php"); - require_once("class/ValueCache_class.php"); - require_once("class/Atom_class.php"); - require_once("class/XMLgenerator_class.php"); - require_once("class/XMLnode_class.php"); - require_once("class/XMLfile_class.php"); - require_once("class/Stats_class.php"); - - $_CACHE = new ValueCache(); - - //new generator for API xml files. - $XMLgenerator = new XMLgenerator(); - - //create datasource handler - $_DISPATCHER = new DataDispatcher(); - $_DATASOURCE = new DataSourceHandler(); - foreach($CONF['data_source'] as $elem) { //populate - require_once("source/".$elem."/".$elem."_class.php"); - eval('$tmp = new '.$elem.'();'); - $_DATASOURCE->addSource($tmp); - } - - #REPLACE WITH REGEX!!! - - $tmp = explode("/",$_REQUEST['file']); - $tmp2 = explode("_",$tmp[(sizeof($tmp)-1)]); - - $DBc->database($CONF['char_mysql_database']); - - $res = $DBc->sendSQL("SELECT id FROM players WHERE cid='".$DBc->mre($tmp2[1]*16+$tmp2[2])."' AND deleted='0'","ARRAY"); - #$res[0]['id'] = 1; - if(($res[0]['id'] > 0) == false) { - $log->logf("ERROR: no character found!"); - $log->close(); - die(); - } - $cdata = array("cid"=>$res[0]['id'],"aid"=>$tmp2[1],"sid"=>$tmp2[2]); - - #$cdata = array("cid"=>1,"aid"=>1,"sid"=>1); - - $DBc->database($CONF['mysql_database']); - -#echo var_export($cdata); - - $log->logf(" done!"); - - $microstop = explode(' ',microtime()); - $stop_time = $microstop[0] + $microstop[1]; - - $log->logf("Expired time: ".($stop_time - $start_time)); - - #foreach($chars as $cid) { - #STEP 1: load and register atoms - - $log->logf("Processing char '".$cdata['cid']."' ..."); - - $log->logi("Loading and registering Atoms... ",false); - - $atom_list = array(); - - $res = $DBc->sendSQL("SELECT at_id FROM ach_task WHERE NOT EXISTS (SELECT * FROM ach_player_task WHERE apt_player='".$cdata['cid']."' AND apt_task=at_id) AND at_dev='0'","ARRAY"); - foreach($res as $task) { - //get unfinished atoms belonging to unfinished objectives - $res2 = $DBc->sendSQL("SELECT ach_atom.* FROM ach_atom,ach_objective WHERE ao_task='".$task['at_id']."' AND ao_id=atom_objective AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_player='".$cdata['cid']."' AND apo_objective=ao_id)","ARRAY"); - foreach($res2 as $atom) { - $a = new Atom($atom,$cdata); - $atom_list[] = $a; - $atom_list[] = $a; - $a->register(); - } - } - - $statsdb = new Stats(); - $statsdb->register(); - - $log->logf("done!"); - - $log->logf("Memory load: ".memory_get_usage()." bytes"); - $microstop = explode(' ',microtime()); - $stop_time = $microstop[0] + $microstop[1]; - - $log->logf("Expired time: ".($stop_time - $start_time)); - - $log->logi("Driving data... ",false); - - #STEP 2: drive data - $_CACHE->setChar($cdata); - $res = $DBc->sendSQL("SELECT sum(at_value) as anz FROM ach_task,ach_player_task WHERE at_id=apt_task AND apt_player='".$cdata['cid']."'","ARRAY"); - $_DISPATCHER->dispatchValue("yubopoints",$res[0]['anz']); - - $_DISPATCHER->dispatchValue("aid",$cdata['aid']); - $_DISPATCHER->dispatchValue("cid",$cdata['cid']); - $_DISPATCHER->dispatchValue("sid",$cdata['sid']); - $_DATASOURCE->drive($cdata); - - //save daily stats - $res = $DBc->sendSQL("SELECT COUNT(*) as anz FROM stat_daily WHERE sdm_day='".date("Y-m-d",time())."'","ARRAY"); - if($res[0]['anz'] == 0) { - $res = $DBc->sendSQL("SELECT SUM(sp_money) as all_money, AVG(sp_money) as avg_money, COUNT(*) as playercount FROM app_achievements.stat_players as s, webig.players as p, ring_live.characters as c, nel.user as n WHERE s.sp_char = p.id AND p.cid = c.char_id AND c.user_id = n.uid AND n.privilege=''","ARRAY"); - - $res2 = $DBc->sendSQL("SELECT sp_money FROM app_achievements.stat_players as s, webig.players as p, ring_live.characters as c, nel.user as n WHERE s.sp_char = p.id AND p.cid = c.char_id AND c.user_id = n.uid AND n.privilege='' ORDER by sp_money ASC LIMIT ".floor($res[0]['playercount']/2).",1","ARRAY"); - - $res3 = $DBc->sendSQL("SELECT SUM(sp_yubototal) as all_yubo, AVG(sp_yubototal) as avg_yubo FROM app_achievements.stat_players as s, webig.players as p, ring_live.characters as c, nel.user as n WHERE s.sp_char = p.id AND p.cid = c.char_id AND c.user_id = n.uid AND n.privilege=''","ARRAY"); - - $res4 = $DBc->sendSQL("SELECT sp_yubototal FROM app_achievements.stat_players as s, webig.players as p, ring_live.characters as c, nel.user as n WHERE s.sp_char = p.id AND p.cid = c.char_id AND c.user_id = n.uid AND n.privilege='' ORDER by sp_money ASC LIMIT ".floor($res[0]['playercount']/2).",1","ARRAY"); - - $res5 = $DBc->sendSQL("SELECT SUM(sp_mekcount) as all_mek, AVG(sp_mekcount) as avg_mek FROM app_achievements.stat_players as s, webig.players as p, ring_live.characters as c, nel.user as n WHERE s.sp_char = p.id AND p.cid = c.char_id AND c.user_id = n.uid AND n.privilege=''","ARRAY"); - - $res6 = $DBc->sendSQL("SELECT sp_mekcount FROM app_achievements.stat_players as s, webig.players as p, ring_live.characters as c, nel.user as n WHERE s.sp_char = p.id AND p.cid = c.char_id AND c.user_id = n.uid AND n.privilege='' ORDER by sp_money ASC LIMIT ".floor($res[0]['playercount']/2).",1","ARRAY"); - - $res7 = $DBc->sendSQL("SELECT SUM(sp_maxlevel) as all_lvl, AVG(sp_maxlevel) as avg_lvl FROM app_achievements.stat_players as s, webig.players as p, ring_live.characters as c, nel.user as n WHERE s.sp_char = p.id AND p.cid = c.char_id AND c.user_id = n.uid AND n.privilege=''","ARRAY"); - - $res8 = $DBc->sendSQL("SELECT sp_maxlevel FROM app_achievements.stat_players as s, webig.players as p, ring_live.characters as c, nel.user as n WHERE s.sp_char = p.id AND p.cid = c.char_id AND c.user_id = n.uid AND n.privilege='' ORDER by sp_money ASC LIMIT ".floor($res[0]['playercount']/2).",1","ARRAY"); - - $res9 = $DBc->sendSQL("SELECT SUM(sp_itemcount) as all_item, AVG(sp_itemcount) as avg_item FROM app_achievements.stat_players as s, webig.players as p, ring_live.characters as c, nel.user as n WHERE s.sp_char = p.id AND p.cid = c.char_id AND c.user_id = n.uid AND n.privilege=''","ARRAY"); - - $res10 = $DBc->sendSQL("SELECT sp_itemcount FROM app_achievements.stat_players as s, webig.players as p, ring_live.characters as c, nel.user as n WHERE s.sp_char = p.id AND p.cid = c.char_id AND c.user_id = n.uid AND n.privilege='' ORDER by sp_money ASC LIMIT ".floor($res[0]['playercount']/2).",1","ARRAY"); - - $DBc->sendSQL("INSERT IGNORE INTO stat_daily (sd_day,sd_players,sd_money_avg,sd_money_total,sd_money_mean,sd_mek_total,sd_mek_avg,sd_mek_mean,sd_yubo_total,sd_yubo_avg,sd_yubo_mean,sd_lvl_total,sd_lvl_avg,sd_lvl_mean,sd_item_total,sd_item_avg,sd_item_mean) VALUES ('".date("Y-m-d",time())."','".$res[0]['playercount']."','".$res[0]['avg_money']."','".$res[0]['all_money']."','".$res2[0]['sp_money']."','".$res5[0]['all_mek']."','".$res5[0]['avg_mek']."','".$res6[0]['sp_mekcount']."','".$res3[0]['all_yubo']."','".$res3[0]['avg_yubo']."','".$res4[0]['sp_yubototal']."','".$res7[0]['all_lvl']."','".$res7[0]['avg_lvl']."','".$res8[0]['sp_maxlevel']."','".$res9[0]['all_item']."','".$res9[0]['avg_item']."','".$res102[0]['sp_itemcounty']."')","NONE"); - } - - $log->logf("done!"); - $microstop = explode(' ',microtime()); - $stop_time = $microstop[0] + $microstop[1]; - - $log->logf("Expired time: ".($stop_time - $start_time)); - $log->logf("xml-gen took: ".$tmp_log_xmlgen_time); - $log->logf("Memory load: ".memory_get_usage()." bytes"); - - $log->logi("Writing XML export... ",false); - - $XMLgenerator->generate(); - - $log->logf("done!"); - - $log->logf("Memory load: ".memory_get_usage()." bytes"); - $microstop = explode(' ',microtime()); - $stop_time = $microstop[0] + $microstop[1]; - - $log->logf("Expired time: ".($stop_time - $start_time)); - - #STEP 3: detect obj/task progression - $log->logi("Detecting Objectives... ",false); - - //obj - $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_condition='all' AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cdata['cid']."') AND NOT EXISTS (SELECT * FROM ach_atom WHERE atom_objective=ao_id AND NOT EXISTS (SELECT * FROM ach_player_atom WHERE apa_atom=atom_id AND apa_state='GRANT' AND apa_player='".$cdata['cid']."')) AND EXISTS (SELECT * FROM ach_atom WHERE atom_objective=ao_id)","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$cdata['cid']."','".time()."')","NONE"); - } - - $log->logf("1... ",false); - - $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_condition='value' AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cdata['cid']."') AND ao_value<=(SELECT sum(apa_value) FROM ach_atom,ach_player_atom WHERE atom_objective=ao_id AND apa_atom=atom_id AND apa_state='GRANT' AND apa_player='".$cdata['cid']."') AND EXISTS (SELECT * FROM ach_atom WHERE atom_objective=ao_id)","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$cdata['cid']."','".time()."')","NONE"); - } - - $log->logf("2... ",false); - - $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_condition='any' AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cdata['cid']."') AND EXISTS (SELECT * FROM ach_atom WHERE atom_objective=ao_id AND EXISTS (SELECT * FROM ach_player_atom WHERE apa_atom=atom_id AND apa_state='GRANT' AND apa_player='".$cdata['cid']."')) AND EXISTS (SELECT * FROM ach_atom WHERE atom_objective=ao_id)","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$cdata['cid']."','".time()."')","NONE"); - } - - $log->logf("3... ",false); - - //meta - #$res = $DBc->sendSQL("SELECT ao_id FROM ach_objective,ach_task as t1,ach_achievement WHERE ao_display='meta' AND ao_task=t1.at_id AND t1.at_achievement=aa_id AND NOT EXISTS (SELECT * FROM ach_task as t2 WHERE t2.at_achievement=ao_metalink AND NOT EXISTS (SELECT * FROM ach_player_task WHERE apt_task=t2.at_id AND apt_player='".$cdata['cid']."'))","ARRAY"); - $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_display='meta' AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cdata['cid']."') AND NOT EXISTS (SELECT * FROM ach_task WHERE ao_metalink=at_achievement AND NOT EXISTS (SELECT * FROM ach_player_task WHERE apt_task=at_id AND apt_player='".$cdata['cid']."'))","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$cdata['cid']."','".time()."')","NONE"); - } - - $log->logf("4... ",false); - - $log->logf("done!"); - - $microstop = explode(' ',microtime()); - $stop_time = $microstop[0] + $microstop[1]; - - $log->logf("Expired time: ".($stop_time - $start_time)); - - $log->logi("Clearing atom data... ",false); - - //clear atom state for completed objectives - #$DBc->sendSQL("DELETE FROM ach_player_atom WHERE EXISTS (SELECT * FROM ach_player_objective,ach_atom WHERE atom_id=apa_atom AND apa_player='".$cdata['cid']."' AND atom_objective=apo_objective)"); - - $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_player='".$cdata['cid']."' AND EXISTS (SELECT * FROM ach_player_objective,ach_atom WHERE atom_id=apa_atom AND apo_player='".$cdata['cid']."' AND atom_objective=apo_objective)"); - - $log->logf("done!"); - - $microstop = explode(' ',microtime()); - $stop_time = $microstop[0] + $microstop[1]; - - $log->logf("Expired time: ".($stop_time - $start_time)); - - //task - $log->logi("Detecting Tasks... ",false); - $res = $DBc->sendSQL("SELECT at_id FROM ach_task WHERE at_condition='all' AND NOT EXISTS (SELECT * FROM ach_player_task WHERE apt_task=at_id AND apt_player='".$cdata['cid']."') AND NOT EXISTS (SELECT * FROM ach_objective WHERE ao_task=at_id AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cdata['cid']."')) AND EXISTS (SELECT * FROM ach_objective WHERE ao_task=at_id) AND at_dev='0'","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_task (apt_task,apt_player,apt_date) VALUES ('".$res[$i]['at_id']."','".$cdata['cid']."','".time()."')","NONE"); - } - -$log->logf("1... ",false); - - $res = $DBc->sendSQL("SELECT at_id FROM ach_task WHERE at_condition='value' AND NOT EXISTS (SELECT * FROM ach_player_task WHERE apt_task=at_id AND apt_player='".$cdata['cid']."') AND at_value<=(SELECT count(*) FROM ach_objective WHERE ao_task=at_id AND EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cdata['cid']."')) AND EXISTS (SELECT * FROM ach_objective WHERE ao_task=at_id) AND at_dev='0'","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_task (apt_task,apt_player,apt_date) VALUES ('".$res[$i]['at_id']."','".$cdata['cid']."','".time()."')","NONE"); - } - -$log->logf("2... ",false); - - $res = $DBc->sendSQL("SELECT at_id FROM ach_task WHERE at_condition='any' AND NOT EXISTS (SELECT * FROM ach_player_task WHERE apt_task=at_id AND apt_player='".$cdata['cid']."') AND EXISTS (SELECT * FROM ach_objective WHERE ao_task=at_id AND EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cdata['cid']."')) AND EXISTS (SELECT * FROM ach_objective WHERE ao_task=at_id) AND at_dev='0'","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_task (apt_task,apt_player,apt_date) VALUES ('".$res[$i]['at_id']."','".$cdata['cid']."','".time()."')","NONE"); - } - -$log->logf("3... ",false); - - /*if($CONF['facebook'] == true) { - require_once("../fb/facebook.php"); - - $facebook = new Facebook(array(appId=>$CONF['fb_id'], secret=>$CONF['fb_secret'])); - - - $res = $DBc->sendSQL("SELECT * FROM ach_fb_token WHERE aft_player='".$cdata['cid']."'","ARRAY"); - - $access_token = $res[0]['aft_token']; - - if($res[0]['aft_allow'] == 1) { - - $res2 = $DBc->sendSQL("SELECT * FROM ach_player_task WHERE apt_player='".$cdata['cid']."' AND apt_fb='0'","ARRAY"); - $sz = sizeof($res2); - - for($i=0;$i<$sz;$i++) { - - //this has to be adapted! - - #$result = $facebook->api( - # '/me/feed/', - # array('access_token' => $$access_token, 'message' => 'Playing around with FB Graph..') - #); - - } - - $DBc->sendSQL("UPDATE ach_player_task SET apt_fb='1' WHERE apt_player='".$cdata['cid']."'","NONE"); - - - - - } - }*/ - - $log->logf("done!"); - #} - - $microstop = explode(' ',microtime()); - $stop_time = $microstop[0] + $microstop[1]; - - $log->logf("Total time: ".($stop_time - $start_time)); - - $log->logf("Run complete; exiting..."); - $log->close(); - exit(0); -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/Atom_class.php b/code/web/app/app_achievements/_AchWebParser/class/Atom_class.php deleted file mode 100644 index 8ddaed775..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/Atom_class.php +++ /dev/null @@ -1,113 +0,0 @@ -ruleset = $data['atom_ruleset_parsed']; - - $this->id = $data['atom_id']; - $this->objective = $data['atom_objective']; - - $this->user = $user; - } - - function register() { // register the atom's ruleset code - - try { - return eval($this->ruleset); - } - catch(Exception $e) { - echo $e->getMessage(); - } - - return null; - } - - function registerValue($name,$func) { // register to listen for a value - global $_DISPATCHER; - - $tmp = new Callback($this,$func); - $_DISPATCHER->registerValue($name,$tmp); - } - - function unregisterValue($name,$callback) { // unregister listening - global $_DISPATCHER; - - $_DISPATCHER->unregisterValue($name,$callback); - } - - function registerEntity($name,$func) { // register to listen for an entity - global $_DISPATCHER; - - $tmp = new Callback($this,$func); - $_DISPATCHER->registerEntity($name,$tmp); - } - - function unregisterEntity($name,$callback) { // unregister - global $_DISPATCHER; - - $_DISPATCHER->unregisterEntity($name,$callback); - } - - function grant($count = 1) { // grant an atom - global $DBc; - - $DBc->sendSQL("INSERT INTO ach_player_atom (apa_atom,apa_player,apa_date,apa_expire,apa_state,apa_value) VALUES ('".$this->id."','".$this->user['cid']."','".time()."',null,'GRANT','".$count."')","NONE"); - } - - function deny() { // deny an atom - global $DBc; - - $DBc->sendSQL("INSERT INTO ach_player_atom (apa_atom,apa_player,apa_date,apa_expire,apa_state) VALUES ('".$this->id."','".$this->user['cid']."','".time()."',null,'DENY','1')","NONE"); - } - - function reset_() { // reset progress for this atom - global $DBc; - - $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_atom='".$this->id."' AND apa_player='".$this->user['cid']."'","NONE"); - } - - function reset_all() { // reset progress for all atoms of the same objective - global $DBc; - - $res = $DBc->sendSQL("SELECT atom_id FROM ach_atom WHERE atom_objective='".$this->objective."'","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_atom='".$res[$i]['atom_id']."' AND apa_player='".$this->user['cid']."'","NONE"); - } - } - - function unlock() { // unlock atom - global $DBc; - - $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_atom='".$this->id."' AND apa_player='".$this->user['cid']."' AND apa_state='DENY'","NONE"); - } - - function unlock_all() { // unlock all atoms of the same objective - global $DBc; - - $res = $DBc->sendSQL("SELECT atom_id FROM ach_atom WHERE atom_objective='".$this->objective."'","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_atom='".$res[$i]['atom_id']."' AND apa_player='".$this->user['cid']."' AND apa_state='DENY'","NONE"); - } - } - - function getID() { - return $this->id; - } - - function getObjective() { - return $this->objective; - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/Callback_class.php b/code/web/app/app_achievements/_AchWebParser/class/Callback_class.php deleted file mode 100644 index 3449d024f..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/Callback_class.php +++ /dev/null @@ -1,18 +0,0 @@ -who = $who; - $this->func = $func; - } - - function call($what) { // now call it - eval(''.$this->func.'($what,$this->who,$this);'); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/DataDispatcher_class.php b/code/web/app/app_achievements/_AchWebParser/class/DataDispatcher_class.php deleted file mode 100644 index 2e296e715..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/DataDispatcher_class.php +++ /dev/null @@ -1,90 +0,0 @@ -value = array(); - $this->entity = array(); - $this->event = array(); - } - - //registering atoms - - function registerValue($name,$callback) { - if(!is_array($this->value[$name])) { - $this->value[$name] = array(); - } - $this->value[$name][] = $callback; - } - - function registerEntity($name,$callback) { - if(!is_array($this->entity[$name])) { - $this->entity[$name] = array(); - } - $this->entity[$name][] = $callback; - } - - function registerEvent($name,$callback) { - if(!is_array($this->event[$name])) { - $this->event[$name] = array(); - } - $this->event[$name][] = $callback; - } - - //unregistering atoms - - function unregisterValue($name,$callback) { - $res = array_search($callback,$this->value[$name],true); - if($res !== false) { - unset($this->value[$name][$res]); - } - } - - function unregisterEntity($name,$callback) { - $res = array_search($callback,$this->entity[$name],true); - if($res !== false) { - unset($this->entity[$name][$res]); - } - } - - function unregisterEvent($name,$callback) { - $res = array_search($callback,$this->event[$name],true); - if($res !== false) { - unset($this->event[$name][$res]); - } - } - - //dispatching data - - function dispatchValue($key,$val) { - if(is_array($this->value[$key])) { - foreach($this->value[$key] as $callback) { - $callback->call($val); - } - } - } - - function dispatchEntity($key,$val) { - if(is_array($this->entity[$key])) { - foreach($this->entity[$key] as $callback) { - $callback->call($val); - } - } - } - - function dispatchEvent($key,$val) { - if(is_array($this->event[$key])) { - foreach($this->event[$key] as $callback) { - $callback->call($val); - } - } - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/DataSourceHandler_class.php b/code/web/app/app_achievements/_AchWebParser/class/DataSourceHandler_class.php deleted file mode 100644 index 97aa2d8ad..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/DataSourceHandler_class.php +++ /dev/null @@ -1,23 +0,0 @@ -source = array(); - } - - function addSource($src) { - $this->source[] = $src; - } - - function drive($cdata) { // tell the datasources to start reading data - foreach($this->source as $elem) { - $elem->drive($cdata); - } - } - - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/Entity_abstract.php b/code/web/app/app_achievements/_AchWebParser/class/Entity_abstract.php deleted file mode 100644 index a4c33227c..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/Entity_abstract.php +++ /dev/null @@ -1,25 +0,0 @@ -name; - } - - function setName($n) { - $this->name = $n; - } - - function setData($key,$data) { - $this->_dataset[$key] = $data; - } - - function getData($key) { - return $this->_dataset[$key]; - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/Logfile_class.php b/code/web/app/app_achievements/_AchWebParser/class/Logfile_class.php deleted file mode 100644 index 5e7843f8f..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/Logfile_class.php +++ /dev/null @@ -1,44 +0,0 @@ -logfile = false; - - if($f != false) { - $this->logfile = fopen($MY_PATH.$CONF['logfile'].'.'.date("Ymd",time()).'.txt','a+'); - #echo "kk"; - } - } - - function logf($t,$nl = true) { - $this->write("[".date("H:i:s")."] ".$t); - if($nl == true) { - $this->write("\n"); - } - } - - function logi($t,$nl = true) { - #echo $t; - $this->write("[".date("H:i:s")."] > ".$t); - if($nl == true) { - $this->write("\n"); - } - } - - function write($txt) { - #echo $txt; - fwrite($this->logfile,$txt); - } - - function close() { - fclose($this->logfile); - #echo "ii"; - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/SourceDriver_abstract.php b/code/web/app/app_achievements/_AchWebParser/class/SourceDriver_abstract.php deleted file mode 100644 index 2d872600c..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/SourceDriver_abstract.php +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/Stats_class.php b/code/web/app/app_achievements/_AchWebParser/class/Stats_class.php deleted file mode 100644 index 3ae07c660..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/Stats_class.php +++ /dev/null @@ -1,42 +0,0 @@ -user = $user; - } - - function register() { // register the stats code - - include_once("script/statsdb.php"); - - return null; - } - - function registerValue($name,$func) { // register to listen for a value - global $_DISPATCHER; - - $tmp = new Callback($this,$func); - $_DISPATCHER->registerValue($name,$tmp); - } - - function unregisterValue($name,$callback) { // unregister listening - global $_DISPATCHER; - - $_DISPATCHER->unregisterValue($name,$callback); - } - - function registerEntity($name,$func) { // register to listen for an entity - global $_DISPATCHER; - - $tmp = new Callback($this,$func); - $_DISPATCHER->registerEntity($name,$tmp); - } - - function unregisterEntity($name,$callback) { // unregister - global $_DISPATCHER; - - $_DISPATCHER->unregisterEntity($name,$callback); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/ValueCache_class.php b/code/web/app/app_achievements/_AchWebParser/class/ValueCache_class.php deleted file mode 100644 index d71ba21f6..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/ValueCache_class.php +++ /dev/null @@ -1,31 +0,0 @@ -char = false; - } - - function setChar($cdata) { // select the character - $this->char = $cdata['cid']; - } - - function writeData($key,$val) { // write to cache - global $DBc; - - $DBc->sendSQL("INSERT INTO ach_player_valuecache (apv_name,apv_player,apv_value,apv_date) VALUES ('".$DBc->mre($key)."','".$this->char."','".$DBc->mre($val)."','".time()."') ON DUPLICATE KEY UPDATE apv_value='".$DBc->mre($val)."', apv_date='".time()."'","NONE"); - } - - function getData($key) { // read from cache - global $DBc; - - $res = $DBc->sendSQL("SELECT apv_value as value, apv_date as date FROM ach_player_valuecache WHERE apv_name='".$DBc->mre($key)."' AND apv_player='".$this->char."'","ARRAY"); - - return $res[0]; - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/XMLfile_class.php b/code/web/app/app_achievements/_AchWebParser/class/XMLfile_class.php deleted file mode 100644 index f7208d8a3..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/XMLfile_class.php +++ /dev/null @@ -1,74 +0,0 @@ -ident = $i; - $this->xml = new XMLNode($this->ident); - $this->curr = $this->xml; - } - - function getIdent() { - return $this->ident; - } - - function addXML($name,$attrs,$open) { - if($open == true) { - if($name == "__KEY__") { - $x = explode(".",$attrs["VALUE"]); - if(sizeof($x) > 1) { - $v = $x[1]; - $a = array("sheetid"=>$attrs["VALUE"]); - } - else { - $v = $attrs["VALUE"]; - $a = array(); - } - $this->curr = new XMLNode($v,null,$this->curr); - foreach($a as $key=>$elem) { - $this->curr->addArg($key,$elem); - } - $tmp = $this->curr->getParent(); - $tmp->addChild($this->curr); - } - elseif($name == "__VAL__") { - $this->curr->setValue($attrs["VALUE"]); - } - else { - $this->curr = new XMLNode($name,null,$this->curr); - if(isset($attrs["VALUE"])) { - $this->curr->addArg("value",$attrs["VALUE"]); - } - $tmp = $this->curr->getParent(); - $tmp->addChild($this->curr); - } - } - else { - if($name == "__KEY__") { - // do nothing - } - elseif($name == "__VAL__") { - $this->curr = $this->curr->getParent(); - } - elseif($name == $this->curr->getName()) { - if($this->curr->getArg("value") !== null) { - $this->curr->setValue($this->curr->getArg("value")); - $this->curr->clearArg("value"); - } - $this->curr = $this->curr->getParent(); - } - else { - $this->curr = $this->curr->getParent(); - } - } - } - - function generate($i) { - return $this->xml->generate($i); - } - - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/XMLgenerator_class.php b/code/web/app/app_achievements/_AchWebParser/class/XMLgenerator_class.php deleted file mode 100644 index c913a36d8..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/XMLgenerator_class.php +++ /dev/null @@ -1,106 +0,0 @@ -def['xml/CLEAR'] = array("stats"); - require_once("xmldef/public.php"); - $this->files["public"] = new XMLfile("public"); - - require_once("xmldef/logs.php"); - $this->files["logs"] = new XMLfile("logs"); - - require_once("xmldef/stats.php"); - $this->files["stats"] = new XMLfile("stats"); - - require_once("xmldef/faction.php"); - $this->files["faction"] = new XMLfile("faction"); - - require_once("xmldef/inventory.php"); - $this->files["inventory"] = new XMLfile("inventory"); - - require_once("xmldef/shop.php"); - $this->files["shop"] = new XMLfile("shop"); - - require_once("xmldef/fame.php"); - $this->files["fame"] = new XMLfile("fame"); - - require_once("xmldef/knowledge.php"); - $this->files["knowledge"] = new XMLfile("knowledge"); - - require_once("xmldef/social.php"); - $this->files["social"] = new XMLfile("social"); - - require_once("xmldef/skills.php"); - $this->files["skills"] = new XMLfile("skills"); - - require_once("xmldef/missions.php"); - $this->files["missions"] = new XMLfile("missions"); - - require_once("xmldef/debug.php"); - $this->files["debug"] = new XMLfile("debug"); - } - - function addWildcard($w,$ident) { - $this->wildcard[] = array($ident,$w); - } - - function xml_split($pathid,$name,$attrs,$open) { - global $tmp_log_xmlgen_time; - $microstart = explode(' ',microtime()); - $start_time = $microstart[0] + $microstart[1]; - - #echo $pathid." => ".$name."
    "; - if(is_array($this->def[$pathid])) { - foreach($this->def[$pathid] as $elem) { - #echo $elem."
    "; - $this->files[$elem]->addXML($name,$attrs,$open); - } - } - - foreach($this->wildcard as $elem) { - if($elem[1] == substr($pathid,0,strlen($elem[1]))) { - $this->files[$elem[0]]->addXML($name,$attrs,$open); - } - } - - $microstop = explode(' ',microtime()); - $stop_time = $microstop[0] + $microstop[1]; - - $tmp_log_xmlgen_time += ($stop_time - $start_time); - } - - function generate() { - global $cdata,$CONF; - - foreach($this->files as $elem) { - $xml = ''."\n"; - $xml .= "\n"; - $xml .= " ".time()."\n"; - $xml .= " ".$cdata['cid']."\n"; - $xml .= " ".$cdata['aid']."\n"; - $xml .= " ".$cdata['sid']."\n"; - - $xml .= $elem->generate(' '); - - $xml .= ""; - - - //store - $pth = $CONF['export_xml_path'].$elem->getIdent()."/".($cdata['cid']%10); - - if(!is_dir($pth)) { - mkdir($pth,0777,true); - } - - $f = fopen($pth."/".$cdata['cid'].".xml","w"); - fwrite($f,$xml); - fclose($f); - } - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/XMLnode_class.php b/code/web/app/app_achievements/_AchWebParser/class/XMLnode_class.php deleted file mode 100644 index abb211f56..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/XMLnode_class.php +++ /dev/null @@ -1,77 +0,0 @@ -name = $n; - $this->value = $v; - $this->parent = $p; - } - - function getParent() { - return $this->parent; - } - - function getName() { - return $this->name; - } - - function setName($n) { - $this->name = $n; - } - - function setValue($v) { - $this->value = $v; - } - - function addArg($k,$v) { - $this->args[$k] = $v; - } - - function getArg($k) { - return $this->args[$k]; - } - - function clearArg($k) { - unset($this->args[$k]); - } - - function addChild($c) { - $this->children[] = $c; - } - - function generate($indent) { - $xml = ""; - #for($i=0;$i<$indent;$i++) { - $xml .= $indent; - #} - $xml .= "<".strtolower($this->name); - foreach($this->args as $key=>$elem) { - $xml .= ' '.strtolower($key).'="'.$elem.'"'; - } - - if(sizeof($this->children) > 0) { - $xml .= ">\n"; - foreach($this->children as $elem) { - $xml .= $elem->generate($indent.' '); - } - #for($i=0;$i<$indet;$i++) { - $xml .= $indent; - #} - $xml .= "name).">\n"; - } - elseif($this->value !== null) { - $xml .= ">".$this->value."name).">\n"; - } - else { - $xml .= " />\n"; - } - - return $xml; - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/mySQL_class.php b/code/web/app/app_achievements/_AchWebParser/class/mySQL_class.php deleted file mode 100644 index e93194675..000000000 --- a/code/web/app/app_achievements/_AchWebParser/class/mySQL_class.php +++ /dev/null @@ -1,160 +0,0 @@ -$elem) { - $in[$key] = mysql_real_escape_string(stripslashes($elem)); - } - } - else { - $in = mysql_real_escape_string(stripslashes($in)); - } - return $in; - } - - function mySQL($err=false) { // constructor - $this->DBstats = array(); - $this->DBc = false; - //set error handling - if($err === "DIE" || $err === "PRINT" || $err === "ALERT" || $err === "HIDE" || $err === "LOG") { - $this->DBerror = $err; - } - else { - $this->DBerror = "HIDE"; - } - $this->resetStats(); // reset stats counter - $this->cached = false; - } - - function connect($ip,$user,$pass,$db=false) { // connect - $this->DBc = mysql_pconnect($ip,$user,$pass) or $this->error(mysql_error()); - if($this->DBc && $db) { - $this->database($db); - } - $this->resetStats(); - } - - function database($db) { // set database - if(!$this->DBc) { - return false; - } - mysql_select_db($db,$this->DBc) or $this->error(mysql_error()); - } - - function resetStats() { - $this->DBstats['query'] = 0; - $this->DBstats['error'] = 0; - } - - function getStats() { // return stats - return $this->DBstats; - } - - function sendSQL($query,$handling="PLAIN",$buffer=false) { // can be INSERT, DELETE, UPDATE, ARRAY, NONE, PLAIN - if(!$this->DBc) { - return false; - } - - if($buffer === false && $handling !== "PLAIN") { - $res = mysql_unbuffered_query($query,$this->DBc) or $this->error(mysql_error(),$query); - } - else { - $res = mysql_query($query,$this->DBc) or $this->error(mysql_error(),$query); - } - - $this->DBstats['query']++; - - if($res) { - if($handling === "INSERT") { - $tmp = mysql_insert_id($this->DBc) or $this->error(mysql_error());; - $this->unlinkSql($res); - return $tmp; - } - elseif($handling === "DELETE" || $handling === "UPDATE") { - $tmp = mysql_affected_rows($this->DBc) or $this->error(mysql_error()); - $this->unlinkSql($res); - return $tmp; - } - elseif($handling === "ARRAY") { - $tmp = $this->parseSql($res); - $this->unlinkSql($res); - return $tmp; - } - elseif($handling === "NONE") { - $this->unlinkSql($res); - return true; - } - else { - return $res; - } - } - else { - return false; - } - } - - function unlinkSql($res) { - @mysql_free_result($res); - } - - private function parseSql($res) { - $data = array(); - $k = 0; - while($tmp = mysql_fetch_array($res,MYSQL_ASSOC)) { - $data[$k] = $tmp; - $k++; - } - - return $data; - } - - function getNext($res) { - if($res) { - if($tmp = mysql_fetch_array($res,MYSQL_ASSOC)) { - return $tmp; - } - else { - return false; - } - } - else { - return false; - } - } - - private function error($error,$query = false) { // error handler - global $log; - - $this->DBstats['error']++; - - if($query != false) { - $error .= " -->|".$query."|<--"; - } - - switch($this->DBerror) { - case 'DIE': - die($error); - break; - case 'PRINT': - echo "
    ".$error."
    "; - break; - case 'ALERT': - echo ""; - break; - case 'LOG': - $log->logf("MySQL ERROR: ".$error); - break; - default: - flush(); - break; - } - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/conf.php b/code/web/app/app_achievements/_AchWebParser/conf.php deleted file mode 100644 index 0c597e934..000000000 --- a/code/web/app/app_achievements/_AchWebParser/conf.php +++ /dev/null @@ -1,31 +0,0 @@ - \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/include/functions_inc.php b/code/web/app/app_achievements/_AchWebParser/include/functions_inc.php deleted file mode 100644 index bc0a1d960..000000000 --- a/code/web/app/app_achievements/_AchWebParser/include/functions_inc.php +++ /dev/null @@ -1,21 +0,0 @@ - \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/log/_logDefaultDir_ b/code/web/app/app_achievements/_AchWebParser/log/_logDefaultDir_ deleted file mode 100644 index e69de29bb..000000000 diff --git a/code/web/app/app_achievements/_AchWebParser/log/xml_tmp/_xml_tmp_dir b/code/web/app/app_achievements/_AchWebParser/log/xml_tmp/_xml_tmp_dir deleted file mode 100644 index e69de29bb..000000000 diff --git a/code/web/app/app_achievements/_AchWebParser/script/_scriptDir b/code/web/app/app_achievements/_AchWebParser/script/_scriptDir deleted file mode 100644 index e69de29bb..000000000 diff --git a/code/web/app/app_achievements/_AchWebParser/script/include_InPoly_class.php b/code/web/app/app_achievements/_AchWebParser/script/include_InPoly_class.php deleted file mode 100644 index 476c77b41..000000000 --- a/code/web/app/app_achievements/_AchWebParser/script/include_InPoly_class.php +++ /dev/null @@ -1,77 +0,0 @@ -pointOnVertex = $pointOnVertex; - - // Transform string coordinates into arrays with x and y values - $point = $this->pointStringToCoordinates($point); - $vertices = array(); - foreach($polygon as $vertex) { - $vertices[] = $this->pointStringToCoordinates($vertex); - } - - // Check if the point sits exactly on a vertex - if($this->pointOnVertex == true and $this->pointOnVertex($point, $vertices) == true) { - return "vertex"; - } - - // Check if the point is inside the polygon or on the boundary - $intersections = 0; - $vertices_count = count($vertices); - - for($i=1; $i < $vertices_count; $i++) { - $vertex1 = $vertices[$i-1]; - $vertex2 = $vertices[$i]; - if($vertex1['y'] == $vertex2['y'] and $vertex1['y'] == $point['y'] and $point['x'] > min($vertex1['x'], $vertex2['x']) and $point['x'] < max($vertex1['x'], $vertex2['x'])) { // Check if point is on an horizontal polygon boundary - return "boundary"; - } - if($point['y'] > min($vertex1['y'], $vertex2['y']) and $point['y'] <= max($vertex1['y'], $vertex2['y']) and $point['x'] <= max($vertex1['x'], $vertex2['x']) and $vertex1['y'] != $vertex2['y']) { - $xinters = ($point['y'] - $vertex1['y']) * ($vertex2['x'] - $vertex1['x']) / ($vertex2['y'] - $vertex1['y']) + $vertex1['x']; - if($xinters == $point['x']) { // Check if point is on the polygon boundary (other than horizontal) - return "boundary"; - } - if($vertex1['x'] == $vertex2['x'] || $point['x'] <= $xinters) { - $intersections++; - } - } - } - // If the number of edges we passed through is even, then it's in the polygon. - if ($intersections % 2 != 0) { - return "inside"; - } - else { - return "outside"; - } - } - - function pointOnVertex($point, $vertices) { - foreach($vertices as $vertex) { - if ($point == $vertex) { - return true; - } - } - - return false; - - } - - function pointStringToCoordinates($pointString) { - $coordinates = explode(" ", $pointString); - return array("x" => $coordinates[0], "y" => $coordinates[1]); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/script/item_grade_script.php b/code/web/app/app_achievements/_AchWebParser/script/item_grade_script.php deleted file mode 100644 index 4be071adc..000000000 --- a/code/web/app/app_achievements/_AchWebParser/script/item_grade_script.php +++ /dev/null @@ -1,13 +0,0 @@ -sendSQL("SELECT grade FROM ryzom_nimetu_item_data WHERE sheetid='".str_replace(".sitem","",$item)."'","ARRAY"); - - #echo $res[0]['grade']; - - return $res[0]['grade']; -} -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/script/places/continents.php b/code/web/app/app_achievements/_AchWebParser/script/places/continents.php deleted file mode 100644 index e7fb2ccbb..000000000 --- a/code/web/app/app_achievements/_AchWebParser/script/places/continents.php +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/script/places/global.php b/code/web/app/app_achievements/_AchWebParser/script/places/global.php deleted file mode 100644 index 1b6609f53..000000000 --- a/code/web/app/app_achievements/_AchWebParser/script/places/global.php +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/script/places/silan.php b/code/web/app/app_achievements/_AchWebParser/script/places/silan.php deleted file mode 100644 index a77ea8357..000000000 --- a/code/web/app/app_achievements/_AchWebParser/script/places/silan.php +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/script/statsdb.php b/code/web/app/app_achievements/_AchWebParser/script/statsdb.php deleted file mode 100644 index 85d92fa61..000000000 --- a/code/web/app/app_achievements/_AchWebParser/script/statsdb.php +++ /dev/null @@ -1,82 +0,0 @@ -registerValue("_money","_statsdb_money"); - function _statsdb_money($money,$_P,$_CB) { - global $cdata,$DBc; - $_IDENT = "_money"; - - $DBc->sendSQL("INSERT INTO stat_players (sp_char,sp_money) VALUES ('".$cdata['cid']."','".$money."') ON DUPLICATE KEY UPDATE sp_money='".$money."'","NONE"); - - $_P->unregisterValue($_IDENT,$_CB); - } - - $this->registerValue("_race","_statsdb_race"); - function _statsdb_race($race,$_P,$_CB) { - global $cdata,$DBc; - $_IDENT = "_race"; - - $race = "r_".strtolower($race); - - $DBc->sendSQL("INSERT INTO stat_players (sp_char,sp_race) VALUES ('".$cdata['cid']."','".$race."') ON DUPLICATE KEY UPDATE sp_race='".$race."'","NONE"); - - $_P->unregisterValue($_IDENT,$_CB); - } - - $this->registerValue("yubopoints","_statsdb_yubototal"); - function _statsdb_yubototal($yubo,$_P,$_CB) { - global $cdata,$DBc; - $_IDENT = "yubopoints"; - - $DBc->sendSQL("INSERT INTO stat_players (sp_char,sp_yubototal) VALUES ('".$cdata['cid']."','".$yubo."') ON DUPLICATE KEY UPDATE sp_yubototal='".$yubo."'","NONE"); - - $_P->unregisterValue($_IDENT,$_CB); - } - - $this->registerValue("petcount","_statsdb_mekcount"); - function _statsdb_mekcount($count,$_P,$_CB) { - global $cdata,$DBc; - $_IDENT = "petcount"; - - $DBc->sendSQL("INSERT INTO stat_players (sp_char,sp_mekcount) VALUES ('".$cdata['cid']."','".$count."') ON DUPLICATE KEY UPDATE sp_mekcount='".$count."'","NONE"); - - $_P->unregisterValue($_IDENT,$_CB); - } - - $this->registerValue("skilllist","_statsdb_maxlevel"); - function _statsdb_maxlevel($skills,$_P,$_CB) { - global $cdata,$DBc,$log; - $_IDENT = "skilllist"; - - $log->logf("rcv skilllist: ".var_export($skills,true)); - - $lvl = 0; - foreach($skills->skills as $elem) { - if($elem->current > $lvl) { - $lvl = $elem->current; - } - } - - $DBc->sendSQL("INSERT INTO stat_players (sp_char,sp_maxlevel) VALUES ('".$cdata['cid']."','".$lvl."') ON DUPLICATE KEY UPDATE sp_maxlevel='".$lvl."'","NONE"); - - $_P->unregisterValue($_IDENT,$_CB); - } - - $this->registerValue("_guildid","_statsdb_guildid"); - function _statsdb_guildid($id,$_P,$_CB) { - global $cdata,$DBc; - $_IDENT = "_guildid"; - - $DBc->sendSQL("INSERT INTO stat_players (sp_char,sp_guildid) VALUES ('".$cdata['cid']."','".$id."') ON DUPLICATE KEY UPDATE sp_guildid='".$id."'","NONE"); - - $_P->unregisterValue($_IDENT,$_CB); - } - - $this->registerValue("itemcount","_statsdb_itemcount"); - function _statsdb_itemcount($count,$_P,$_CB) { - global $cdata,$DBc; - $_IDENT = "itemcount"; - - $DBc->sendSQL("INSERT INTO stat_players (sp_char,sp_itemcount) VALUES ('".$cdata['cid']."','".$count."') ON DUPLICATE KEY UPDATE sp_itemcount='".$count."'","NONE"); - - $_P->unregisterValue($_IDENT,$_CB); - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/PDRtoXMLdriver_class.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/PDRtoXMLdriver_class.php deleted file mode 100644 index 9639a7714..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/PDRtoXMLdriver_class.php +++ /dev/null @@ -1,845 +0,0 @@ -lock = 0; - $this->open = null; - $this->entity = null; - $this->inv = null; - $this->iblock = false; - - $this->petcount = 0; - $this->itemcount = 0; - - $this->gear = new Gear(); - $this->skills = new SkillList(); - $this->mission = new MissionList(); - $this->friendlist = new Friendlist(); - - //these nodes are ignored, but children are processed - $this->ignore = array(); - $this->ignore[] = "XML"; - $this->ignore[] = "ENTITYBASE"; - $this->ignore[] = "NORMALPOSITIONS"; - $this->ignore[] = "_VEC"; - $this->ignore[] = "SESSIONID"; - #$this->ignore[] = "POSSTATE"; - $this->ignore[] = "_PLAYERROOM"; - $this->ignore[] = "_INVENTORYID"; - $this->ignore[] = "_PHYSCHARACS"; - $this->ignore[] = "_PHYSSCORES"; - $this->ignore[] = "_SKILLS"; - $this->ignore[] = "_FAMES"; - - //these nodes are ignored, as well as their children - $this->ignore_block = array(); - $this->ignore_block[] = "_MEMORIZEDPHRASES"; - $this->ignore_block[] = "_FORBIDPOWERDATES"; - $this->ignore_block[] = "_INEFFECTIVEAURAS"; - $this->ignore_block[] = "_CONSUMABLEOVERDOSEENDDATES"; - $this->ignore_block[] = "_MODIFIERSINDB"; - $this->ignore_block[] = "_MISSIONS"; - $this->ignore_block[] = "_ITEMSINSHOPSTORE"; - $this->ignore_block[] = "RINGREWARDPOINTS"; - $this->ignore_block[] = "_PACT"; - $this->ignore_block[] = "_KNOWNPHRASES"; - $this->ignore_block[] = "STARTINGCHARACTERISTICVALUES"; - $this->ignore_block[] = "_ENCYCLOCHAR"; - $this->ignore_block[] = "_GAMEEVENT"; - $this->ignore_block[] = "_ENTITYPOSITION"; - $this->ignore_block[] = "_MISSIONHISTORIES"; - $this->ignore_block[] = "_KNOWNBRICKS"; - $this->ignore_block[] = "_BOUGHTPHRASES"; - $this->ignore_block[] = "SKILLPOINTS"; - $this->ignore_block[] = "SPENTSKILLPOINTS"; - $this->ignore_block[] = "_LASTLOGSTATS"; - } - - function drive($cdata) { - global $_DISPATCHER,$MY_PATH,$log; - - #$file = $this->conf['xml_dir']."account_".$uid."_".$slot."_pdr.xml"; - $file = $_REQUEST['file']; - - $xml_parser = xml_parser_create(); - xml_set_object($xml_parser,$this); - xml_set_element_handler($xml_parser, "startElement", "endElement"); - - // temporary storage for xml files for debug purpose - $ftmp = fopen($MY_PATH."/log/xml_tmp/char_".$cdata['cid'].".xml","w"); - $fcont = file_get_contents($file); - fwrite($ftmp,$fcont); - fclose($ftmp); - # end of temp xml store - - if(!xml_parse($xml_parser, $fcont)) { - $log->logf("FATAL ERROR (PDRtoXMLdriver): unable to parse given XML!"); - $log->close(); - die(); - } - - xml_parser_free($xml_parser); - - $_DISPATCHER->dispatchEntity($this->gear->getName(),$this->gear); - #echo var_export($this->gear,true); - $_DISPATCHER->dispatchEntity($this->skills->getName(),$this->skills); - $_DISPATCHER->dispatchEntity($this->friendlist->getName(),$this->friendlist); - #$_DISPATCHER->dispatchEntity($this->skills->mission(),$this->mission); - $_DISPATCHER->dispatchValue('petcount',$this->petcount); - $_DISPATCHER->dispatchValue('itemcount',$this->itemcount); - } - - function startElement($parser, $name, $attrs) { - global $_DISPATCHER,$DBc,$XMLgenerator; - - array_push($this->pathid,$name); - - $XMLgenerator->xml_split(implode("/",$this->pathid),$name,$attrs,true); - - if($this->lock == 1) { - return null; - } - - if(in_array($name,$this->ignore)) { - return null; - } - - if(in_array($name,$this->ignore_block)) { - $this->lock = 1; - return null; - } - - /* spawn points */ - if($name == "RESPAWNPOINTS" && !$attrs["VALUE"]) { - $this->open = "RESPAWNPOINTS"; - $this->entity = new RespawnPoints(); - return null; - } - - if($this->open == "RESPAWNPOINTS") { - if($name == "RESPAWNPOINTS") { - $this->respawn_outer = 0; - $this->entity->spawns[] = $attrs["VALUE"]; - } - } - - /* faction points */ - if($name == "FACTIONPOINTS") { - $this->open = "FACTIONPOINTS"; - return null; - } - - if($this->open == "FACTIONPOINTS") { - if($name == "__KEY__") { - $this->entity = new FactionPoints(); - $this->entity->faction = $attrs["VALUE"]; - return null; - } - - if($name == "__VAL__") { - $this->entity->value = $attrs["VALUE"]; - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->entity = null; - return null; - } - - return null; - } - - /* Fame */ - if($name == "_FAME") { - $this->open = "_FAME"; - return null; - } - - if($this->open == "_FAME") { - if($name == "__KEY__") { - $this->entity = new Fame(); - $this->entity->faction = $attrs["VALUE"]; - return null; - } - - if($name == "FAME") { - $this->entity->fame = $attrs["VALUE"]; - return null; - } - if($name == "FAMEMEMORY") { - $this->entity->famememory = $attrs["VALUE"]; - return null; - } - if($name == "LASTFAMECHANGETREND") { - $this->entity->lastfamechangetrend = $attrs["VALUE"]; - return null; - } - - return null; - } - - /* last log stats */ - if($name == "_LASTLOGSTATS") { - $this->open = "_LASTLOGSTATS"; - $this->entity = new LastLogStats(); - return null; - } - - if($this->open == "_LASTLOGSTATS") { - if($name == "LOGINTIME") { - $this->entity->logintime = $attrs["VALUE"]; - return null; - } - if($name == "DURATION") { - $this->entity->duration = $attrs["VALUE"]; - return null; - } - if($name == "LOGOFFTIME") { - $this->entity->logofftime = $attrs["VALUE"]; - return null; - } - - return null; - } - - /* mission */ - if($name == "_MISSIONHISTORIES") { - $this->open = "_MISSIONHISTORIES"; - return null; - } - - if($this->open == "_MISSIONHISTORIES") { - if($name == "__KEY__") { - $this->entity = new Mission(); - $this->entity->mission = $attrs["VALUE"]; - return null; - } - - if($name == "SUCCESSFULL") { - $this->entity->successfull = $attrs["VALUE"]; - return null; - } - if($name == "UTC_LASTSUCCESSDATE") { - $this->entity->utc_lastsuccessdate = $attrs["VALUE"]; - return null; - } - - return null; - } - - if($name == "_FRIENDSLIST") { - $this->entity = new Friend(); - $this->entity->id = $attrs["VALUE"]; - $this->friendlist->friends[] = $this->entity; - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - } - - if($name == "_ISFRIENDOF") { - $this->entity = new FriendOf(); - $this->entity->id = $attrs["VALUE"]; - $this->friendlist->friendof[] = $this->entity; - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - } - - /* permanent mod */ - if($name == "SCOREPERMANENTMODIFIERS") { - $this->open = "SCOREPERMANENTMODIFIERS"; - return null; - } - - if($this->open == "SCOREPERMANENTMODIFIERS") { - if($name == "__KEY__") { - $this->entity = new PermanentMod(); - $this->entity->score = $attrs["VALUE"]; - return null; - } - - if($name == "__VAL__") { - $this->entity->value = $attrs["VALUE"]; - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->entity = null; - return null; - } - - return null; - } - - /* pet */ - if($name == "_PLAYERPETS") { - $this->open = "_PLAYERPETS"; - return null; - } - - if($this->open == "_PLAYERPETS") { - if($name == "__KEY__") { - $this->entity = new Pet(); - $this->entity->pet = $attrs["VALUE"]; - return null; - } - - if($name == "TICKETPETSHEETID") { - $this->entity->ticketpetsheetid = $attrs["VALUE"]; - return null; - } - if($name == "PETSHEETID") { - $this->entity->petsheetid = $attrs["VALUE"]; - $this->petcount++; - return null; - } - if($name == "PRICE") { - $this->entity->price = $attrs["VALUE"]; - return null; - } - if($name == "OWNERID") { - $this->entity->ownerid = $attrs["VALUE"]; - return null; - } - if($name == "STABLEALIAS") { - $this->entity->stablealias = $attrs["VALUE"]; - return null; - } - if($name == "LANDSCAPE_X") { - $this->entity->landscape_x = $attrs["VALUE"]; - return null; - } - if($name == "LANDSCAPE_Y") { - $this->entity->landscape_y = $attrs["VALUE"]; - return null; - } - if($name == "LANDSCAPE_Z") { - $this->entity->landscape_z = $attrs["VALUE"]; - return null; - } - if($name == "UTC_DEATHTICK") { - $this->entity->utc_deathtick = $attrs["VALUE"]; - return null; - } - if($name == "PETSTATUS") { - $this->entity->petstatus = $attrs["VALUE"]; - return null; - } - if($name == "SLOT") { - $this->entity->slot = $attrs["VALUE"]; - return null; - } - if($name == "ISTPALLOWED") { - $this->entity->istpallowed = $attrs["VALUE"]; - return null; - } - if($name == "SATIETY") { - $this->entity->satiety = $attrs["VALUE"]; - return null; - } - if($name == "CUSTOMNAME") { - $this->entity->customname = $attrs["VALUE"]; - return null; - } - - return null; - } - - /* physical characteristics */ - if($name == "_PHYSICALCHARACTERISTICS") { - $this->open = "_PHYSICALCHARACTERISTICS"; - return null; - } - - if($this->open == "_PHYSICALCHARACTERISTICS") { - if($name == "__KEY__") { - $this->entity = new PhysCharacs(); - $this->entity->charac = $attrs["VALUE"]; - return null; - } - - if($name == "__VAL__") { - $this->entity->value = $attrs["VALUE"]; - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->entity = null; - return null; - } - - return null; - } - - /* physical scores */ - if($name == "PHYSICALSCORES") { - $this->open = "PHYSICALSCORES"; - return null; - } - - if($this->open == "PHYSICALSCORES") { - if($name == "__KEY__") { - $this->entity = new PhysScores(); - $this->entity->score = $attrs["VALUE"]; - return null; - } - - if($name == "CURRENT") { - $this->entity->current = $attrs["VALUE"]; - return null; - } - if($name == "BASE") { - $this->entity->base = $attrs["VALUE"]; - return null; - } - if($name == "MAX") { - $this->entity->max = $attrs["VALUE"]; - return null; - } - if($name == "BASEREGENERATEREPOS") { - $this->entity->baseregeneraterepos = $attrs["VALUE"]; - return null; - } - if($name == "BASEREGENERATEACTION") { - $this->entity->baseregenerateaction = $attrs["VALUE"]; - return null; - } - if($name == "CURRENTREGENERATE") { - $this->entity->currentregenerate = $attrs["VALUE"]; - return null; - } - - return null; - } - - /* skill points */ - if($name == "SKILLPOINTS") { - $this->open = "SKILLPOINTS"; - return null; - } - - if($this->open == "SKILLPOINTS") { - if($name == "__KEY__") { - $this->entity = new SkillPoints(); - $this->entity->skill = $attrs["VALUE"]; - return null; - } - - if($name == "__VAL__") { - $this->entity->value = $attrs["VALUE"]; - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->entity = null; - return null; - } - - return null; - } - - /* spent skill points */ - if($name == "SPENTSKILLPOINTS") { - $this->open = "SPENTSKILLPOINTS"; - return null; - } - - if($this->open == "SPENTSKILLPOINTS") { - if($name == "__KEY__") { - $this->entity = new SpentSkillPoints(); - $this->entity->skill = $attrs["VALUE"]; - return null; - } - - if($name == "__VAL__") { - $this->entity->value = $attrs["VALUE"]; - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->entity = null; - return null; - } - - return null; - } - - /* skills */ - if($name == "SKILLS") { - $this->open = "SKILLS"; - return null; - } - - if($this->open == "SKILLS") { - if($name == "__KEY__") { - $this->entity = new Skill(); - $this->entity->skill = $attrs["VALUE"]; - return null; - } - - if($name == "BASE") { - $this->entity->base = $attrs["VALUE"]; - return null; - } - if($name == "CURRENT") { - $this->entity->current = $attrs["VALUE"]; - return null; - } - if($name == "MAXLVLREACHED") { - $this->entity->maxlvlreached = $attrs["VALUE"]; - return null; - } - if($name == "XP") { - $this->entity->xp = $attrs["VALUE"]; - return null; - } - if($name == "XPNEXTLVL") { - $this->entity->xpnextlvl = $attrs["VALUE"]; - return null; - } - - return null; - } - - /* Position */ - if($name == "POSSTATE") { - $this->open = "POSSTATE"; - $this->entity = new Position(); - return null; - } - - if($this->open == "POSSTATE") { - if($name == "X") { - $this->entity->x = $attrs["VALUE"]; - return null; - } - if($name == "Y") { - $this->entity->y = $attrs["VALUE"]; - return null; - } - if($name == "Z") { - $this->entity->z = $attrs["VALUE"]; - return null; - } - if($name == "HEADING") { - $this->entity->heading = $attrs["VALUE"]; - return null; - } - - return null; - } - - /* items */ - - if($name == "ROOMINVENTORY") { - $this->inv = "room"; - return null; - } - - if($name == "INVENTORY") { - $this->iblock = true; - return null; - } - - if($this->iblock == true) { - if($name == "__KEY__") { - $this->inv = $attrs["VALUE"]; - } - if($name == "__VAL__") { - return null; - } - } - - if($name == "_ITEMS" || $name == "_ITEM") { - #echo "i
    "; - $this->open = "_ITEM"; - $this->entity = new Item(); - $this->entity->inventory = $this->inv; - $this->itemcount++; - return null; - } - - if($this->open == "_ITEM") { - if($name == "_CRAFTPARAMETERS") { - $this->icraft = true; - return null; - } - - if($this->icraft == true) { - $this->entity->_craftparameters[strtolower($name)] = $attrs["VALUE"]; - return null; - } - - if($name == "_ITEMID") { - $this->entity->_itemid = $attrs["VALUE"]; - return null; - } - if($name == "_SHEETID") { - if($attrs["VALUE"]{0} == "#") { - $tmp = str_replace("#","",$attrs["VALUE"]); - $res = $DBc->sendSQL("SELECT * FROM ryzom_nimetu_sheets WHERE nsh_numid='".$tmp."'","ARRAY"); - $attrs["VALUE"] = $res[0]['nsh_name']."".$res[0]['nsh_suffix']; - } - $this->entity->_sheetid = $attrs["VALUE"]; - return null; - } - if($name == "_LOCSLOT") { - $this->entity->_locslot = $attrs["VALUE"]; - return null; - } - if($name == "_HP") { - $this->entity->_hp = $attrs["VALUE"]; - return null; - } - if($name == "_RECOMMENDED") { - $this->entity->_recommended = $attrs["VALUE"]; - return null; - } - if($name == "_CREATORID") { - $this->entity->_creatorid = $attrs["VALUE"]; - return null; - } - if($name == "_PHRASEID") { - $this->entity->_phraseid = $attrs["VALUE"]; - return null; - } - if($name == "_REFINVENTORYSLOT") { - $this->entity->_refinventoryslot = $attrs["VALUE"]; - #if($this->entity->refinventoryid != null) { - $this->gear->items[] = $this->entity; - #} - return null; - } - if($name == "REFINVENTORYID") { - $this->entity->refinventoryid = $attrs["VALUE"]; - return null; - } - if($name == "_USENEWSYSTEMREQUIREMENT") { - $this->entity->_usenewsystemrequirement = $attrs["VALUE"]; - return null; - } - if($name == "_REQUIREDSKILLLEVEL") { - $this->entity->_requiredskilllevel = $attrs["VALUE"]; - return null; - } - if($name == "_CUSTOMTEXT") { - $this->entity->_customtext = $attrs["VALUE"]; - return null; - } - if($name == "_LOCKEDBYOWNER") { - $this->entity->_lockedbyowner = $attrs["VALUE"]; - return null; - } - if($name == "_DROPABLE") { - $this->entity->_dropable = $attrs["VALUE"]; - return null; - } - if($name == "STACKSIZE") { - $this->entity->stacksize = $attrs["VALUE"]; - return null; - } - } - - - - - - if($attrs["VALUE"] != "") { - $_DISPATCHER->dispatchValue(strtolower($name),$attrs["VALUE"]); - } - } - - function endElement($parser, $name) { - global $_DISPATCHER,$XMLgenerator; - - $XMLgenerator->xml_split(implode("/",$this->pathid),$name,null,false); - array_pop($this->pathid); - - if(in_array($name,$this->ignore_block)) { - $this->lock = 0; - return null; - } - - if($this->lock == 1) { - return null; - } - - /* respawn points */ - if($name == "RESPAWNPOINTS") { - $this->respawn_outer++; // increment to track double close at end of block - } - - if($name == "RESPAWNPOINTS" && $this->respawn_outer > 1) { - $this->open = null; - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->entity = null; - return null; - } - - /* faction points */ - if($name == "FACTIONPOINTS") { - $this->open = null; - return null; - } - - /* fame */ - if($name == "__VAL__" && $this->open == "FAME") { - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->entity = null; - return null; - } - - if($name == "_FAME") { - $this->open = null; - return null; - } - - /* last log stats */ - if($name == "_LASTLOGSTATS") { - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->entity = null; - return null; - } - - /* mission */ - if($name == "__VAL__" && $this->open == "_MISSIONHISTORIES") { - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->mission->missions[] = $this->entity; - $this->entity = null; - return null; - } - - if($name == "_MISSIONHISTORIES") { - $this->open = null; - return null; - } - - /* permanent mod */ - if($name == "SCOREPERMANENTMODIFIERS") { - $this->open = null; - return null; - } - - /* pet */ - if($name == "__VAL__" && $this->open == "_PLAYERPETS") { - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - #echo "dispatched"; - $this->entity = null; - return null; - } - - if($name == "_PLAYERPETS") { - $this->open = null; - return null; - } - - /* physical characteristics */ - if($name == "_PHYSICALCHARACTERISTICS") { - $this->open = null; - return null; - } - - /* physical scores */ - if($name == "__VAL__" && $this->open == "PHYSICALSCORES") { - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->entity = null; - return null; - } - - if($name == "PHYSICALSCORES") { - $this->open = null; - return null; - } - - /* skill points */ - if($name == "SKILLPOINTS") { - $this->open = null; - return null; - } - - /* spent skill points */ - if($name == "SPENTSKILLPOINTS") { - $this->open = null; - return null; - } - - /* skills */ - if($name == "__VAL__" && $this->open == "SKILLS") { - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->skills->skills[] = $this->entity; - $this->entity = null; - return null; - } - - if($name == "SKILLS") { - $this->open = null; - return null; - } - - /* position */ - if($name == "POSSTATE") { - $this->entity->loadPlace(); - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->entity = null; - return null; - } - - /* items */ - if($name == "_ITEMS" || $name == "_ITEM") { - #echo "c
    "; - if($this->open == "_ITEM") { - #echo var_export($this->entity,true); - $_DISPATCHER->dispatchEntity($this->entity->getName(),$this->entity); - $this->entity = null; - } - $this->open = null; - return null; - } - - if($name == "INVENTORY") { - $this->iblock = false; - return null; - } - - if($name == "_CRAFTPARAMETERS") { - $this->icraft = false; - return null; - } - - /*if($name == "_ITEM" || $name == "_ITEMS") { - $this->open = null; - return null; - }*/ - - - } - - - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/FactionPoints_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/FactionPoints_entity.php deleted file mode 100644 index fa18a0fc6..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/FactionPoints_entity.php +++ /dev/null @@ -1,10 +0,0 @@ -setName("faction_points"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Fame_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Fame_entity.php deleted file mode 100644 index 0cfc5f15b..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Fame_entity.php +++ /dev/null @@ -1,12 +0,0 @@ -setName("fame"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/FriendOf_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/FriendOf_entity.php deleted file mode 100644 index 27978963f..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/FriendOf_entity.php +++ /dev/null @@ -1,15 +0,0 @@ -setName("friendof"); - } - - function getRealID() { - $tmp = explode(":",$this->id); - - return $tmp[0]; - } -} -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Friend_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Friend_entity.php deleted file mode 100644 index 72a9d1ee1..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Friend_entity.php +++ /dev/null @@ -1,15 +0,0 @@ -setName("friend"); - } - - function getRealID() { - $tmp = explode(":",$this->id); - - return $tmp[0]; - } -} -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Friendlist_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Friendlist_entity.php deleted file mode 100644 index 471190de1..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Friendlist_entity.php +++ /dev/null @@ -1,29 +0,0 @@ -setName("friendlist"); - } - - function countConfirmed() { - if($this->confirmed == false) { - $count = 0; - foreach($this->friends as $elem) { - $id = $elem->getRealID(); - foreach($this->friendof as $elem2) { - if($elem2->getRealID() == $id) { - $count++; - } - } - } - - $this->confirmed = $count; - } - - return $this->confirmed; - } -} -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Gear_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Gear_entity.php deleted file mode 100644 index b84008061..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Gear_entity.php +++ /dev/null @@ -1,9 +0,0 @@ -setName("gear"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Item_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Item_entity.php deleted file mode 100644 index 2ffb89316..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Item_entity.php +++ /dev/null @@ -1,28 +0,0 @@ -setName("item"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/LastLogStats_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/LastLogStats_entity.php deleted file mode 100644 index 30878f04a..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/LastLogStats_entity.php +++ /dev/null @@ -1,11 +0,0 @@ -setName("lastlogstats"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/MissionList_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/MissionList_entity.php deleted file mode 100644 index ab4a7bea9..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/MissionList_entity.php +++ /dev/null @@ -1,9 +0,0 @@ -setName("missionlist"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Mission_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Mission_entity.php deleted file mode 100644 index 7a95ac744..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Mission_entity.php +++ /dev/null @@ -1,11 +0,0 @@ -setName("mission"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/PermanentMod_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/PermanentMod_entity.php deleted file mode 100644 index 008a74895..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/PermanentMod_entity.php +++ /dev/null @@ -1,10 +0,0 @@ -setName("permanentmodifiers"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Pet_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Pet_entity.php deleted file mode 100644 index e92499d93..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Pet_entity.php +++ /dev/null @@ -1,24 +0,0 @@ -setName("pet"); - #echo "created"; - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/PhysCharacs_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/PhysCharacs_entity.php deleted file mode 100644 index c71109d02..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/PhysCharacs_entity.php +++ /dev/null @@ -1,10 +0,0 @@ -setName("phys_characs"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/PhysScores_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/PhysScores_entity.php deleted file mode 100644 index d7deca5bb..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/PhysScores_entity.php +++ /dev/null @@ -1,15 +0,0 @@ -setName("phys_scores"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Position_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Position_entity.php deleted file mode 100644 index c96cb35dc..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Position_entity.php +++ /dev/null @@ -1,74 +0,0 @@ -setName("position"); - $this->placeid = "place_unknown"; - } - - function loadPlace() { - global $_DISPATCHER; - - @include_once("script/include_InPoly_class.php"); - $region = array(); - $subregion = false; - - include("script/places/global.php"); - - $point = floor($this->x/1000)." ".floor($this->y/1000); - - $pointLocation = new pointLocation(); - - $res = $pointLocation->pointInPolygon($point, $region['place_silan'], false); - - if($res != "outside") { - include("script/places/silan.php"); - } - else { - include("script/places/continents.php"); - $region2 = $region; - foreach($region2 as $key=>$r) { - $res = $pointLocation->pointInPolygon($point, $r, false); - if($res != "outside") { - include("script/places/".$key.".php"); - if($subregion == true) { - foreach($region as $key2=>$r2) { - $res2 = $pointLocation->pointInPolygon($point, $r2, false); - if($res2 != "outside") { - include("script/places/".$key."/".$key2.".php"); - break; - } - } - } - break; - } - } - } - - foreach($region as $key=>$r) { - $res = $pointLocation->pointInPolygon($point, $r, false); - if($res != "outside") { - if($this->placeid == "place_unknown") { - $this->placeid = $key; - } - else { - $tmp = new Position(); - $tmp->x = $this->x; - $tmp->y = $this->y; - $tmp->z = $this->z; - $tmp->heading = $this->heading; - $tmp->placeid = $key; - - $_DISPATCHER->dispatchEntity($tmp->getName(),$tmp); - } - #break; - } - } - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/RespawnPoints_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/RespawnPoints_entity.php deleted file mode 100644 index f1973a134..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/RespawnPoints_entity.php +++ /dev/null @@ -1,80 +0,0 @@ -setName("respawn_points"); - - $this->spawns = array(); - - $this->region_map = array(); - $this->region_map['spawn_global_bagne_matis'] = "roots"; - $this->region_map['spawn_global_bagne_nexus'] = "roots"; - $this->region_map['spawn_global_route_gouffre_fyros'] = "roots"; - $this->region_map['spawn_global_route_gouffre_nexus'] = "roots"; - $this->region_map['spawn_global_route_gouffre_tryker'] = "roots"; - $this->region_map['spawn_global_route_gouffre_zorai'] = "roots"; - $this->region_map['spawn_global_sources_fyros'] = "roots"; - $this->region_map['spawn_global_sources_zorai'] = "roots"; - $this->region_map['spawn_global_terre_nexus'] = "roots"; - $this->region_map['spawn_global_terre_zorai'] = "roots"; - $this->region_map['spawn_global_nexus_bagne'] = "roots"; - $this->region_map['spawn_global_nexus_route_gouffre'] = "roots"; - $this->region_map['spawn_global_nexus_terre'] = "roots"; - // 13/13 - - $this->region_map['spawn_global_fyros_matis'] = "desert"; - $this->region_map['spawn_global_fyros_route_gouffre'] = "desert"; - $this->region_map['spawn_global_fyros_sources'] = "desert"; - $this->region_map['spawn_global_fyros_to_zorai'] = "desert"; - $this->region_map['spawn_kami_place_pyr'] = "desert"; - $this->region_map['spawn_kami_place_thesos'] = "desert"; - $this->region_map['spawn_karavan_place_pyr'] = "desert"; - // 7/7 - - $this->region_map['spawn_global_matis_bagne'] = "forest"; - $this->region_map['spawn_global_matis_fyros'] = "forest"; - $this->region_map['spawn_global_matis_tryker'] = "forest"; - $this->region_map['spawn_kami_place_dyron'] = "forest"; - $this->region_map['spawn_kami_place_yrkanis'] = "forest"; - $this->region_map['spawn_karavan_place_avalae'] = "forest"; - $this->region_map['spawn_karavan_place_davae'] = "forest"; - #$this->region_map['spawn_karavan_place_yrkanis'] = "forest"; - // 8/7 - - $this->region_map['spawn_global_tryker_matis'] = "lakes"; - $this->region_map['spawn_global_tryker_route_gouffre'] = "lakes"; - #$this->region_map['spawn_kami_place_fairhaven'] = "lakes"; - $this->region_map['spawn_karavan_place_avendale'] = "lakes"; - $this->region_map['spawn_karavan_place_crystabell'] = "lakes"; - $this->region_map['spawn_karavan_place_fairhaven'] = "lakes"; - $this->region_map['spawn_karavan_place_windermeer'] = "lakes"; - // 7/6 - - $this->region_map['spawn_kami_place_hoi_cho'] = "jungle"; - $this->region_map['spawn_kami_place_jen_lai'] = "jungle"; - $this->region_map['spawn_kami_place_min_cho'] = "jungle"; - $this->region_map['spawn_global_zorai_route_gouffre'] = "jungle"; - $this->region_map['spawn_global_zorai_sources'] = "jungle"; - $this->region_map['spawn_global_zorai_terre'] = "jungle"; - $this->region_map['spawn_global_zorai_to_fyros'] = "jungle"; - $this->region_map['spawn_kami_place_zora'] = "jungle"; - #$this->region_map['spawn_karavan_place_zora'] = "jungle"; - // 9/8 - - } - - function countRegion($r) { - $c = 0; - - foreach($this->spawns as $elem) { - if($this->region_map[$elem] == $r) { - $c++; - } - } - - return $c; - } -} -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/SkillList_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/SkillList_entity.php deleted file mode 100644 index 6dc2202b3..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/SkillList_entity.php +++ /dev/null @@ -1,10 +0,0 @@ -setName("skilllist"); - $this->skills = array(); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/SkillPoints_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/SkillPoints_entity.php deleted file mode 100644 index 81582b703..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/SkillPoints_entity.php +++ /dev/null @@ -1,10 +0,0 @@ -setName("skillpoints"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Skill_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Skill_entity.php deleted file mode 100644 index f06132ac8..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Skill_entity.php +++ /dev/null @@ -1,14 +0,0 @@ -setName("skill"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/SpentSkillPoints_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/SpentSkillPoints_entity.php deleted file mode 100644 index 5bacb0e52..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/SpentSkillPoints_entity.php +++ /dev/null @@ -1,10 +0,0 @@ -setName("spentskillpoints"); - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Title_entity.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Title_entity.php deleted file mode 100644 index 0186b37a7..000000000 --- a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/entity/Title_entity.php +++ /dev/null @@ -1,20 +0,0 @@ -setName("title"); - $this->title_id = ""; - $this->title = null; - } - - function loadID() { - global $DBc; - - $res = $DBc->sendSQL("SELECT t_id FROM ryzom_title WHERE t_male='".$DBc->mre($this->title)."' OR t_female='".$DBc->mre($this->title)."'","ARRAY"); - - $this->title_id = $res[0]['t_id']; - } -} -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/xmldef/debug.php b/code/web/app/app_achievements/_AchWebParser/xmldef/debug.php deleted file mode 100644 index 0f009cf5f..000000000 --- a/code/web/app/app_achievements/_AchWebParser/xmldef/debug.php +++ /dev/null @@ -1,84 +0,0 @@ -def['XML/UTC__PVPFLAGLASTTIMECHANGE'] = array("debug"); -$this->def['XML/UTC__PVPRECENTACTIONTIME'] = array("debug"); -$this->def['XML/UTC__PVPFLAGTIMESETTEDON'] = array("debug"); -$this->def['XML/_REGIONKILLEDINPVP'] = array("debug"); -$this->def['XML/_CREATIONPOINTSREPARTITION'] = array("debug"); -$this->def['XML/UTC__FORBIDAURAUSESTARTDATE'] = array("debug"); -$this->def['XML/UTC__FORBIDAURAUSEENDDATE'] = array("debug"); -array_push($this->def['XML/_TITLE'],"debug"); -$this->def['XML/NAMESTRINGID'] = array("debug"); -$this->def['XML/_HAIRCUTEDISCOUNT'] = array("debug"); - $this->addWildcard("XML/_FORBIDPOWERDATES","debug"); -$this->def['XML/_INEFFECTIVEAURAS'] = array("debug"); -$this->def['XML/_INEFFECTIVEAURAS/_AURAACTIVATIONDATES'] = array("debug"); -$this->def['XML/_INEFFECTIVEAURAS/_AURAACTIVATIONDATES/DEACTIVATIONDATE'] = array("debug"); -$this->def['XML/_INEFFECTIVEAURAS/_AURAACTIVATIONDATES/ACTIVATIONDATE'] = array("debug"); -$this->def['XML/_INEFFECTIVEAURAS/_AURAACTIVATIONDATES/CONSUMABLEFAMILYID'] = array("debug"); -$this->def['XML/_INEFFECTIVEAURAS/_AURAACTIVATIONDATES/POWERTYPE'] = array("debug"); -$this->def['XML/_MODIFIERSINDB'] = array("debug"); - $this->addWildcard("XML/_MODIFIERSINDB/BONUS","debug"); - $this->addWildcard("XML/_MODIFIERSINDB/MALUS","debug"); -$this->def['XML/ENTITYBASE'] = array("debug"); -$this->def['XML/ENTITYBASE/_SHEETID'] = array("debug"); -$this->def['XML/ENTITYBASE/MELEEATTACKMODIFIERONENEMY'] = array("debug"); -$this->def['XML/ENTITYBASE/MELEEATTACKMODIFIERONSELF'] = array("debug"); -$this->def['XML/ENTITYBASE/MAGICCASTINGMODIFIERONSELF'] = array("debug"); -$this->def['XML/ENTITYBASE/MAGICCASTINGMODIFIERONENEMY'] = array("debug"); -$this->def['XML/ENTITYBASE/RANGEATTACKMODIFIERONENEMY'] = array("debug"); -$this->def['XML/ENTITYBASE/RANGEATTACKMODIFIERONSELF'] = array("debug"); -$this->def['XML/ENTITYBASE/ATTACKMODIFIERONSELF'] = array("debug"); -$this->def['XML/ENTITYBASE/CHANCETOFAILSTRATEGY'] = array("debug"); -$this->def['XML/ENTITYBASE/CHANCETOFAILSPELL'] = array("debug"); -$this->def['XML/ENTITYBASE/CHANCETOFAILFABER'] = array("debug"); -$this->def['XML/ENTITYBASE/CHANCETOFAILHARVEST'] = array("debug"); -$this->def['XML/ENTITYBASE/CHANCETOFAILTRACKING'] = array("debug"); -$this->def['XML/ENTITYBASE/MELEEATTACKSLOW'] = array("debug"); -$this->def['XML/ENTITYBASE/MELEESLASHINGDAMAGEARMOR'] = array("debug"); -$this->def['XML/ENTITYBASE/MELEEBLUNTDAMAGEARMOR'] = array("debug"); -$this->def['XML/ENTITYBASE/MELEEPIERCINGDAMAGEARMOR'] = array("debug"); -$this->def['XML/ENTITYBASE/MELEEDAMAGEMODIFIERFACTOR'] = array("debug"); -$this->def['XML/ENTITYBASE/RANGEDAMAGEMODIFIERFACTOR'] = array("debug"); -$this->def['XML/ENTITYBASE/CREATUREMELEETAKENDAMAGEFACTOR'] = array("debug"); -$this->def['XML/ENTITYBASE/CREATURERANGETAKENDAMAGEFACTOR'] = array("debug"); -$this->def['XML/ENTITYBASE/COMBATBRICKLATENCYMULTIPLIER'] = array("debug"); -$this->def['XML/ENTITYBASE/MAGICBRICKLATENCYMULTIPLIER'] = array("debug"); -$this->def['XML/ENTITYBASE/ARMORQUALITYMODIFIER'] = array("debug"); -$this->def['XML/ENTITYBASE/WEAPONQUALITYMODIFIER'] = array("debug"); -$this->def['XML/ENTITYBASE/ARMORABSORBTIONMULTIPLIER'] = array("debug"); -$this->def['XML/RINGREWARDPOINTS'] = array("debug"); -$this->def['XML/RINGREWARDPOINTS/RINGREWARDPOINTS/__KEY__'] = array("debug"); -$this->def['XML/RINGREWARDPOINTS/RINGREWARDPOINTS/__VAL__'] = array("debug"); - $this->addWildcard("XML/_PERSISTENTEFFECTS","debug"); -$this->def['XML/_PACT'] = array("debug"); -$this->def['XML/_PACT/PACTNATURE'] = array("debug"); -$this->def['XML/_PACT/PACTTYPE'] = array("debug"); -array_push($this->def['XML/_PLAYERPETS'],"debug"); -array_push($this->def['XML/_PLAYERPETS/__KEY__'],"debug"); -array_push($this->def['XML/_PLAYERPETS/__VAL__'],"debug"); -$this->def['XML/_PLAYERPETS/__VAL__/TICKETPETSHEETID'] = array("debug"); -$this->def['XML/_PLAYERPETS/__VAL__/PRICE'] = array("debug"); -$this->def['XML/_PLAYERPETS/__VAL__/OWNERID'] = array("debug"); -$this->def['XML/_PLAYERPETS/__VAL__/STABLEALIAS'] = array("debug"); -$this->def['XML/_PLAYERPETS/__VAL__/SLOT'] = array("debug"); -$this->def['XML/_PLAYERPETS/__VAL__/ISTPALLOWED'] = array("debug"); -$this->def['XML/_PLAYERPETS/__VAL__/CUSTOMNAME'] = array("debug"); -$this->def['XML/STARTINGCHARACTERISTICVALUES'] = array("debug"); -$this->def['XML/STARTINGCHARACTERISTICVALUES/__KEY__'] = array("debug"); -$this->def['XML/STARTINGCHARACTERISTICVALUES/__VAL__'] = array("debug"); -$this->def['XML/_ENCYCLOCHAR'] = array("debug"); -$this->def['XML/_ENCYCLOCHAR/_ENCYCHARALBUMS'] = array("debug"); -$this->def['XML/_ENCYCLOCHAR/_ENCYCHARALBUMS/ALBUMSTATE'] = array("debug"); -$this->def['XML/_ENCYCLOCHAR/_ENCYCHARALBUMS/THEMAS'] = array("debug"); -$this->def['XML/_ENCYCLOCHAR/_ENCYCHARALBUMS/THEMAS/THEMASTATE'] = array("debug"); -$this->def['XML/_ENCYCLOCHAR/_ENCYCHARALBUMS/THEMAS/RITETASKSTATEPACKED'] = array("debug"); -$this->def['XML/_GAMEEVENT'] = array("debug"); -$this->def['XML/_GAMEEVENT/UTC__DATE'] = array("debug"); - $this->addWildcard("XML/ENTITYBASE/_ENTITYPOSITION","debug"); - $this->addWildcard("XML/_ENTITYPOSITION","debug"); -$this->def['XML/INVISIBLE'] = array("debug"); -$this->def['XML/AGGROABLE'] = array("debug"); -$this->def['XML/GODMODE'] = array("debug"); - -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/xmldef/faction.php b/code/web/app/app_achievements/_AchWebParser/xmldef/faction.php deleted file mode 100644 index f4ca5ddad..000000000 --- a/code/web/app/app_achievements/_AchWebParser/xmldef/faction.php +++ /dev/null @@ -1,12 +0,0 @@ -def['XML/FACTIONPOINTS'] = array("faction"); -$this->def['XML/FACTIONPOINTS/__KEY__'] = array("faction"); -$this->def['XML/FACTIONPOINTS/__VAL__'] = array("faction"); -$this->def['XML/_ORGANIZATION'] = array("faction"); -$this->def['XML/_ORGANIZATIONSTATUS'] = array("faction"); -$this->def['XML/_ORGANIZATIONPOINTS'] = array("faction"); -$this->def['XML/DECLAREDCULT'] = array("faction"); -$this->def['XML/DECLAREDCIV'] = array("faction"); - -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/xmldef/fame.php b/code/web/app/app_achievements/_AchWebParser/xmldef/fame.php deleted file mode 100644 index 568d18362..000000000 --- a/code/web/app/app_achievements/_AchWebParser/xmldef/fame.php +++ /dev/null @@ -1,10 +0,0 @@ -def['XML/_FAMES/_FAME'] = array("fame"); -$this->def['XML/_FAMES/_FAME/__KEY__'] = array("fame"); -$this->def['XML/_FAMES/_FAME/__VAL__'] = array("fame"); -$this->def['XML/_FAMES/_FAME/__VAL__/FAME'] = array("fame"); -$this->def['XML/_FAMES/_FAME/__VAL__/FAMEMEMORY'] = array("fame"); -$this->def['XML/_FAMES/_FAME/__VAL__/LASTFAMECHANGETREND'] = array("fame"); - -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/xmldef/inventory.php b/code/web/app/app_achievements/_AchWebParser/xmldef/inventory.php deleted file mode 100644 index fbbb74b08..000000000 --- a/code/web/app/app_achievements/_AchWebParser/xmldef/inventory.php +++ /dev/null @@ -1,131 +0,0 @@ -def['XML/_MONEY'] = array("inventory"); -$this->def['XML/_PLAYERROOM'] = array("inventory"); -$this->def['XML/_PLAYERROOM/BUILDING'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_ITEMID'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_SHEETID'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_LOCSLOT'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_HP'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_RECOMMENDED'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CREATORID'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_PHRASEID'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_USENEWSYSTEMREQUIREMENT'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_REQUIREDSKILLLEVEL'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CUSTOMTEXT'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_LOCKEDBYOWNER'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/STACKSIZE'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/DURABILITY'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/WEIGHT'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/STATENERGY'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/DODGEMODIFIER'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PARRYMODIFIER'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTIONFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/MAXSLASHINGPROTECTION'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/MAXBLUNTPROTECTION'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/MAXPIERCINGPROTECTION'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/COLOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/FOCUSBUFF'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/HPBUFF'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/SAPBUFF'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/STABUFF'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION1'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION2'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION3'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/SAPLOAD'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/DMG'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/SPEED'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/RANGE'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/ADVERSARYDODGEMODIFIER'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/ADVERSARYPARRYMODIFIER'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION1FACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION2FACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PROTECTION3FACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/DESERTRESISTANCEFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/FORESTRESISTANCEFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/LACUSTRERESISTANCEFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/JUNGLERESISTANCEFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/PRIMARYROOTRESISTANCEFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/ELEMENTALCASTINGTIMEFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/ELEMENTALPOWERFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/OFFENSIVEAFFLICTIONCASTINGTIMEFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/OFFENSIVEAFFLICTIONPOWERFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/HEALCASTINGTIMEFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/HEALPOWERFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/DEFENSIVEAFFLICTIONCASTINGTIMEFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERROOM/ROOMINVENTORY/_ITEMS/_CRAFTPARAMETERS/DEFENSIVEAFFLICTIONPOWERFACTOR'] = array("inventory"); -$this->def['XML/_PLAYERPETS'] = array("inventory"); -$this->def['XML/_PLAYERPETS/__KEY__'] = array("inventory"); -$this->def['XML/_PLAYERPETS/__VAL__'] = array("inventory"); -$this->def['XML/_PLAYERPETS/__VAL__/PETSHEETID'] = array("inventory"); -$this->def['XML/_PLAYERPETS/__VAL__/LANDSCAPE_X'] = array("inventory"); -$this->def['XML/_PLAYERPETS/__VAL__/LANDSCAPE_Y'] = array("inventory"); -$this->def['XML/_PLAYERPETS/__VAL__/LANDSCAPE_Z'] = array("inventory"); -$this->def['XML/_PLAYERPETS/__VAL__/UTC_DEATHTICK'] = array("inventory"); -$this->def['XML/_PLAYERPETS/__VAL__/PETSTATUS'] = array("inventory"); -$this->def['XML/_PLAYERPETS/__VAL__/SATIETY'] = array("inventory"); -$this->def['XML/INVENTORY'] = array("inventory"); -$this->def['XML/INVENTORY/__KEY__'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_ITEMID'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_SHEETID'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_LOCSLOT'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_HP'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_RECOMMENDED'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CREATORID'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_PHRASEID'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_USENEWSYSTEMREQUIREMENT'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_REQUIREDSKILLLEVEL'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CUSTOMTEXT'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_LOCKEDBYOWNER'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/STACKSIZE'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/DURABILITY'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/WEIGHT'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/STATENERGY'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/DODGEMODIFIER'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PARRYMODIFIER'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTIONFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/MAXSLASHINGPROTECTION'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/MAXBLUNTPROTECTION'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/MAXPIERCINGPROTECTION'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/COLOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/FOCUSBUFF'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/HPBUFF'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/SAPBUFF'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/STABUFF'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION1'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION2'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION3'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/SAPLOAD'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/DMG'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/SPEED'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/RANGE'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/ADVERSARYDODGEMODIFIER'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/ADVERSARYPARRYMODIFIER'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION1FACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION2FACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PROTECTION3FACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/DESERTRESISTANCEFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/FORESTRESISTANCEFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/LACUSTRERESISTANCEFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/JUNGLERESISTANCEFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/PRIMARYROOTRESISTANCEFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/ELEMENTALCASTINGTIMEFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/ELEMENTALPOWERFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/OFFENSIVEAFFLICTIONCASTINGTIMEFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/OFFENSIVEAFFLICTIONPOWERFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/HEALCASTINGTIMEFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/HEALPOWERFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/DEFENSIVEAFFLICTIONCASTINGTIMEFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_CRAFTPARAMETERS/DEFENSIVEAFFLICTIONPOWERFACTOR'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/_REFINVENTORYSLOT'] = array("inventory"); -$this->def['XML/INVENTORY/__VAL__/_ITEM/REFINVENTORYID'] = array("inventory"); - -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/xmldef/knowledge.php b/code/web/app/app_achievements/_AchWebParser/xmldef/knowledge.php deleted file mode 100644 index 5ba75d2cc..000000000 --- a/code/web/app/app_achievements/_AchWebParser/xmldef/knowledge.php +++ /dev/null @@ -1,11 +0,0 @@ -def['XML/_BOUGHTPHRASES'] = array("knowledge"); -$this->def['XML/_KNOWNBRICKS'] = array("knowledge"); -$this->def['XML/_KNOWNPHRASES'] = array("knowledge"); -$this->def['XML/_MEMORIZEDPHRASES'] = array("knowledge"); -$this->def['XML/_MEMORIZEDPHRASES/PHRASEDESC/NAME'] = array("knowledge"); -$this->def['XML/_MEMORIZEDPHRASES/PHRASEDESC/BRICKS'] = array("knowledge"); -$this->def['XML/RESPAWNPOINTS/RESPAWNPOINTS'] = array("knowledge"); - -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/xmldef/logs.php b/code/web/app/app_achievements/_AchWebParser/xmldef/logs.php deleted file mode 100644 index acfd7b726..000000000 --- a/code/web/app/app_achievements/_AchWebParser/xmldef/logs.php +++ /dev/null @@ -1,11 +0,0 @@ -def['XML/_FIRSTCONNECTEDTIME'] = array("logs"); -$this->def['XML/_LASTCONNECTEDTIME'] = array("logs"); -$this->def['XML/_PLAYEDTIME'] = array("logs"); -$this->def['XML/_LASTLOGSTATS'] = array("logs"); -$this->def['XML/_LASTLOGSTATS/LOGINTIME'] = array("logs"); -$this->def['XML/_LASTLOGSTATS/DURATION'] = array("logs"); -$this->def['XML/_LASTLOGSTATS/LOGOFFTIME'] = array("logs"); - -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/xmldef/missions.php b/code/web/app/app_achievements/_AchWebParser/xmldef/missions.php deleted file mode 100644 index ea3a198ec..000000000 --- a/code/web/app/app_achievements/_AchWebParser/xmldef/missions.php +++ /dev/null @@ -1,3 +0,0 @@ -addWildcard("XML/_MISSIONS","missions"); -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/xmldef/public.php b/code/web/app/app_achievements/_AchWebParser/xmldef/public.php deleted file mode 100644 index 5b510db0c..000000000 --- a/code/web/app/app_achievements/_AchWebParser/xmldef/public.php +++ /dev/null @@ -1,40 +0,0 @@ -def['XML/_HAIRTYPE'] = array("public"); -$this->def['XML/HAIRTYPE'] = array("public"); -$this->def['XML/_HAIRCOLOR'] = array("public"); -$this->def['XML/HAIRCOLOR'] = array("public"); -$this->def['XML/_HATCOLOR'] = array("public"); -$this->def['XML/_JACKETCOLOR'] = array("public"); -$this->def['XML/_ARMSCOLOR'] = array("public"); -$this->def['XML/_TROUSERSCOLOR'] = array("public"); -$this->def['XML/_FEETCOLOR'] = array("public"); -$this->def['XML/_HANDSCOLOR'] = array("public"); -$this->def['XML/_PVPFLAG'] = array("public"); -$this->def['XML/_GUILDID'] = array("public"); -$this->def['XML/_TITLE'] = array("public"); -$this->def['XML/GABARITHEIGHT'] = array("public"); -$this->def['XML/GABARITTORSOWIDTH'] = array("public"); -$this->def['XML/GABARITARMSWIDTH'] = array("public"); -$this->def['XML/GABARITLEGSWIDTH'] = array("public"); -$this->def['XML/GABARITBREASTSIZE'] = array("public"); -$this->def['XML/MORPHTARGET1'] = array("public"); -$this->def['XML/MORPHTARGET2'] = array("public"); -$this->def['XML/MORPHTARGET3'] = array("public"); -$this->def['XML/MORPHTARGET4'] = array("public"); -$this->def['XML/MORPHTARGET5'] = array("public"); -$this->def['XML/MORPHTARGET6'] = array("public"); -$this->def['XML/MORPHTARGET7'] = array("public"); -$this->def['XML/MORPHTARGET8'] = array("public"); -$this->def['XML/EYESCOLOR'] = array("public"); -$this->def['XML/TATTOO'] = array("public"); -$this->def['XML/NORMALPOSITIONS/VEC/POSSTATE'] = array("public"); -$this->def['XML/NORMALPOSITIONS/VEC/POSSTATE/X'] = array("public"); -$this->def['XML/NORMALPOSITIONS/VEC/POSSTATE/Y'] = array("public"); -$this->def['XML/NORMALPOSITIONS/VEC/POSSTATE/Z'] = array("public"); -$this->def['XML/NORMALPOSITIONS/VEC/POSSTATE/HEADING'] = array("public"); -$this->def['XML/ENTITYBASE/_NAME'] = array("public"); -$this->def['XML/ENTITYBASE/_GENDER'] = array("public"); -$this->def['XML/ENTITYBASE/_SIZE'] = array("public"); - -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/xmldef/shop.php b/code/web/app/app_achievements/_AchWebParser/xmldef/shop.php deleted file mode 100644 index 5d842a17a..000000000 --- a/code/web/app/app_achievements/_AchWebParser/xmldef/shop.php +++ /dev/null @@ -1,66 +0,0 @@ -def['XML/_ITEMSINSHOPSTORE'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_PRICE'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_RETIREPRICE'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/UTC__STARTSALECYCLE'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_OWNER'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_CONTINENT'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_QUANTITY'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_IDENTIFIER'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_ITEMID'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_SHEETID'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_LOCSLOT'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_HP'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_RECOMMENDED'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CREATORID'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_PHRASEID'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/STACKSIZE'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_USENEWSYSTEMREQUIREMENT'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CUSTOMTEXT'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_LOCKEDBYOWNER'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/DURABILITY'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/WEIGHT'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/STATENERGY'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/DODGEMODIFIER'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PARRYMODIFIER'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTIONFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/MAXSLASHINGPROTECTION'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/MAXBLUNTPROTECTION'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/MAXPIERCINGPROTECTION'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/COLOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/FOCUSBUFF'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/HPBUFF'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/SAPBUFF'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/STABUFF'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION1'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION2'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION3'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/SAPLOAD'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/DMG'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/SPEED'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/RANGE'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/ADVERSARYDODGEMODIFIER'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/ADVERSARYPARRYMODIFIER'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION1FACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION2FACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PROTECTION3FACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/DESERTRESISTANCEFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/FORESTRESISTANCEFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/LACUSTRERESISTANCEFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/JUNGLERESISTANCEFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/PRIMARYROOTRESISTANCEFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/ELEMENTALCASTINGTIMEFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/ELEMENTALPOWERFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/OFFENSIVEAFFLICTIONCASTINGTIMEFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/OFFENSIVEAFFLICTIONPOWERFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/HEALCASTINGTIMEFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/HEALPOWERFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/DEFENSIVEAFFLICTIONCASTINGTIMEFACTOR'] = array("shop"); -$this->def['XML/_ITEMSINSHOPSTORE/_ITEMSFORSALE/_ITEMPTR/_CRAFTPARAMETERS/DEFENSIVEAFFLICTIONPOWERFACTOR'] = array("shop"); - -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/xmldef/skills.php b/code/web/app/app_achievements/_AchWebParser/xmldef/skills.php deleted file mode 100644 index f0f8e2113..000000000 --- a/code/web/app/app_achievements/_AchWebParser/xmldef/skills.php +++ /dev/null @@ -1,21 +0,0 @@ -def['XML/ENTITYBASE/_SKILLS/SKILLS'] = array("skills"); -$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__KEY__'] = array("skills"); -$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__VAL__'] = array("skills"); -$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__VAL__/BASE'] = array("skills"); -$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__VAL__/CURRENT'] = array("skills"); -$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__VAL__/MAXLVLREACHED'] = array("skills"); -$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__VAL__/XP'] = array("skills"); -$this->def['XML/ENTITYBASE/_SKILLS/SKILLS/__VAL__/XPNEXTLVL'] = array("skills"); -$this->def['XML/SKILLPOINTS'] = array("skills"); -$this->def['XML/SKILLPOINTS/__KEY__'] = array("skills"); -$this->def['XML/SKILLPOINTS/__VAL__'] = array("skills"); -$this->def['XML/SPENTSKILLPOINTS'] = array("skills"); -$this->def['XML/SPENTSKILLPOINTS/__KEY__'] = array("skills"); -$this->def['XML/SPENTSKILLPOINTS/__VAL__'] = array("skills"); -$this->def['XML/SCOREPERMANENTMODIFIERS'] = array("skills"); -$this->def['XML/SCOREPERMANENTMODIFIERS/__KEY__'] = array("skills"); -$this->def['XML/SCOREPERMANENTMODIFIERS/__VAL__'] = array("skills"); - -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/xmldef/social.php b/code/web/app/app_achievements/_AchWebParser/xmldef/social.php deleted file mode 100644 index 92c015fd8..000000000 --- a/code/web/app/app_achievements/_AchWebParser/xmldef/social.php +++ /dev/null @@ -1,7 +0,0 @@ -def['XML/_FRIENDSLIST'] = array("social"); -$this->def['XML/_ISFRIENDOF'] = array("social"); -$this->def['XML/FRIENDVISIBILITy'] = array("social"); - -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/xmldef/stats.php b/code/web/app/app_achievements/_AchWebParser/xmldef/stats.php deleted file mode 100644 index 014202f1b..000000000 --- a/code/web/app/app_achievements/_AchWebParser/xmldef/stats.php +++ /dev/null @@ -1,27 +0,0 @@ -def['XML/_HPB'] = array("stats"); -$this->def['XML/_PVPPOINT'] = array("stats"); -$this->def['XML/_DEATHPENALTIES'] = array("stats"); -$this->def['XML/_DEATHPENALTIES/_NBDEATH'] = array("stats"); -$this->def['XML/_DEATHPENALTIES/_CURRENTDEATHXP'] = array("stats"); -$this->def['XML/_DEATHPENALTIES/_DEATHXPTOGAIN'] = array("stats"); -$this->def['XML/_DEATHPENALTIES/_BONUSUPDATETIME'] = array("stats"); -$this->def['XML/ENTITYBASE/_DODGEASDEFENSE'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSCHARACS/_PHYSICALCHARACTERISTICS'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSCHARACS/_PHYSICALCHARACTERISTICS/__KEY__'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSCHARACS/_PHYSICALCHARACTERISTICS/__VAL__'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSSCORES'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSSCORES/BASEWALKSPEED'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSSCORES/BASERUNSPEED'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSSCORES/CURRENTWALKSPEED'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSSCORES/CURRENTRUNSPEED'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSSCORES/__KEY__'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSSCORES/__VAL__/CURRENT'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSSCORES/__VAL__/BASE'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSSCORES/__VAL__/MAX'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSSCORES/__VAL__/BASEREGENERATEREPOS'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSSCORES/__VAL__/BASEREGENERATEACTION'] = array("stats"); -$this->def['XML/ENTITYBASE/_PHYSSCORES/__VAL__/CURRENTREGENERATE'] = array("stats"); - -?> \ No newline at end of file From f8382e4b4f3f488b759427ccb4e66c2e5543a3f9 Mon Sep 17 00:00:00 2001 From: SirCotare Date: Fri, 15 Feb 2013 16:28:00 +0100 Subject: [PATCH 7/7] #1470 damn that merging... trying to remove malicious api --- code/web/api/client/auth.php | 47 - code/web/api/client/config.php.default | 20 - code/web/api/client/time.php | 46 - code/web/api/client/user.php | 39 - code/web/api/client/utils.php | 3 - code/web/api/common/actionPage.php | 158 - code/web/api/common/auth.php | 153 - code/web/api/common/bbCode.php | 998 -- code/web/api/common/config.php.default | 32 - code/web/api/common/db_defs.php | 24 - code/web/api/common/db_lib.php | 522 - code/web/api/common/dfm.php | 151 - code/web/api/common/logger.php | 64 - code/web/api/common/render.php | 378 - code/web/api/common/ryform.php | 680 -- code/web/api/common/ryformBases.php | 304 - code/web/api/common/time.php | 130 - code/web/api/common/user.php | 69 - code/web/api/common/utils.php | 466 - code/web/api/common/xml_utils.php | 23 - code/web/api/data/css/ryzom_iphone.css | 248 - code/web/api/data/css/ryzom_ui.css | 247 - code/web/api/data/css/skin_b.gif | Bin 748 -> 0 bytes code/web/api/data/css/skin_bl.gif | Bin 129 -> 0 bytes code/web/api/data/css/skin_blank.png | Bin 11070 -> 0 bytes code/web/api/data/css/skin_blank_inner.png | Bin 8986 -> 0 bytes code/web/api/data/css/skin_br.gif | Bin 130 -> 0 bytes code/web/api/data/css/skin_header_l.gif | Bin 434 -> 0 bytes code/web/api/data/css/skin_header_m.gif | Bin 6290 -> 0 bytes code/web/api/data/css/skin_header_r.gif | Bin 977 -> 0 bytes code/web/api/data/css/skin_l.gif | Bin 477 -> 0 bytes code/web/api/data/css/skin_r.gif | Bin 488 -> 0 bytes code/web/api/data/css/skin_t.gif | Bin 315 -> 0 bytes code/web/api/data/css/skin_tl.gif | Bin 99 -> 0 bytes code/web/api/data/css/skin_tr.gif | Bin 127 -> 0 bytes code/web/api/data/icons/add_app.png | Bin 2532 -> 0 bytes code/web/api/data/icons/edit.png | Bin 1203 -> 0 bytes code/web/api/data/icons/edit_16.png | Bin 732 -> 0 bytes code/web/api/data/icons/no_action.png | Bin 566 -> 0 bytes .../api/data/img/backgrounds/parchemin.png | Bin 377617 -> 0 bytes code/web/api/data/img/bg.jpg | Bin 50750 -> 0 bytes code/web/api/data/img/bordure.png | Bin 3920 -> 0 bytes code/web/api/data/img/lang/de.png | Bin 736 -> 0 bytes code/web/api/data/img/lang/en.png | Bin 725 -> 0 bytes code/web/api/data/img/lang/es.png | Bin 649 -> 0 bytes code/web/api/data/img/lang/fr.png | Bin 675 -> 0 bytes code/web/api/data/img/lang/ru.png | Bin 646 -> 0 bytes code/web/api/data/img/lang/sp.png | Bin 62 -> 0 bytes code/web/api/data/img/logo.gif | Bin 6763 -> 0 bytes code/web/api/data/js/combobox.js | 17 - code/web/api/data/js/jquery-1.7.1.js | 9266 ----------------- code/web/api/data/js/tab.js | 37 - code/web/api/data/ryzom/guild_png/.htaccess | 1 - .../ryzom/guild_png/guild_back_b_00_1.png | Bin 3427 -> 0 bytes .../ryzom/guild_png/guild_back_b_00_2.png | Bin 3354 -> 0 bytes .../ryzom/guild_png/guild_back_b_01_1.png | Bin 3432 -> 0 bytes .../ryzom/guild_png/guild_back_b_01_2.png | Bin 3346 -> 0 bytes .../ryzom/guild_png/guild_back_b_02_1.png | Bin 3426 -> 0 bytes .../ryzom/guild_png/guild_back_b_02_2.png | Bin 3325 -> 0 bytes .../ryzom/guild_png/guild_back_b_03_1.png | Bin 3295 -> 0 bytes .../ryzom/guild_png/guild_back_b_03_2.png | Bin 3249 -> 0 bytes .../ryzom/guild_png/guild_back_b_04_1.png | Bin 3042 -> 0 bytes .../ryzom/guild_png/guild_back_b_04_2.png | Bin 3042 -> 0 bytes .../ryzom/guild_png/guild_back_b_05_1.png | Bin 3825 -> 0 bytes .../ryzom/guild_png/guild_back_b_05_2.png | Bin 3634 -> 0 bytes .../ryzom/guild_png/guild_back_b_06_1.png | Bin 3875 -> 0 bytes .../ryzom/guild_png/guild_back_b_06_2.png | Bin 3641 -> 0 bytes .../ryzom/guild_png/guild_back_b_07_1.png | Bin 3776 -> 0 bytes .../ryzom/guild_png/guild_back_b_07_2.png | Bin 3645 -> 0 bytes .../ryzom/guild_png/guild_back_b_08_1.png | Bin 3722 -> 0 bytes .../ryzom/guild_png/guild_back_b_08_2.png | Bin 3574 -> 0 bytes .../ryzom/guild_png/guild_back_b_09_1.png | Bin 3381 -> 0 bytes .../ryzom/guild_png/guild_back_b_09_2.png | Bin 3459 -> 0 bytes .../ryzom/guild_png/guild_back_b_10_1.png | Bin 3517 -> 0 bytes .../ryzom/guild_png/guild_back_b_10_2.png | Bin 3152 -> 0 bytes .../ryzom/guild_png/guild_back_b_11_1.png | Bin 3603 -> 0 bytes .../ryzom/guild_png/guild_back_b_11_2.png | Bin 3174 -> 0 bytes .../ryzom/guild_png/guild_back_b_12_1.png | Bin 3612 -> 0 bytes .../ryzom/guild_png/guild_back_b_12_2.png | Bin 3152 -> 0 bytes .../ryzom/guild_png/guild_back_b_13_1.png | Bin 3493 -> 0 bytes .../ryzom/guild_png/guild_back_b_13_2.png | Bin 3079 -> 0 bytes .../ryzom/guild_png/guild_back_b_14_1.png | Bin 3133 -> 0 bytes .../ryzom/guild_png/guild_back_b_14_2.png | Bin 2954 -> 0 bytes .../ryzom/guild_png/guild_back_s_00_1.png | Bin 536 -> 0 bytes .../ryzom/guild_png/guild_back_s_00_2.png | Bin 517 -> 0 bytes .../ryzom/guild_png/guild_back_s_01_1.png | Bin 543 -> 0 bytes .../ryzom/guild_png/guild_back_s_01_2.png | Bin 498 -> 0 bytes .../ryzom/guild_png/guild_back_s_02_1.png | Bin 539 -> 0 bytes .../ryzom/guild_png/guild_back_s_02_2.png | Bin 502 -> 0 bytes .../ryzom/guild_png/guild_back_s_03_1.png | Bin 434 -> 0 bytes .../ryzom/guild_png/guild_back_s_03_2.png | Bin 419 -> 0 bytes .../ryzom/guild_png/guild_back_s_04_1.png | Bin 387 -> 0 bytes .../ryzom/guild_png/guild_back_s_04_2.png | Bin 363 -> 0 bytes .../ryzom/guild_png/guild_back_s_05_1.png | Bin 561 -> 0 bytes .../ryzom/guild_png/guild_back_s_05_2.png | Bin 457 -> 0 bytes .../ryzom/guild_png/guild_back_s_06_1.png | Bin 622 -> 0 bytes .../ryzom/guild_png/guild_back_s_06_2.png | Bin 484 -> 0 bytes .../ryzom/guild_png/guild_back_s_07_1.png | Bin 625 -> 0 bytes .../ryzom/guild_png/guild_back_s_07_2.png | Bin 494 -> 0 bytes .../ryzom/guild_png/guild_back_s_08_1.png | Bin 513 -> 0 bytes .../ryzom/guild_png/guild_back_s_08_2.png | Bin 366 -> 0 bytes .../ryzom/guild_png/guild_back_s_09_1.png | Bin 388 -> 0 bytes .../ryzom/guild_png/guild_back_s_09_2.png | Bin 416 -> 0 bytes .../ryzom/guild_png/guild_back_s_10_1.png | Bin 543 -> 0 bytes .../ryzom/guild_png/guild_back_s_10_2.png | Bin 397 -> 0 bytes .../ryzom/guild_png/guild_back_s_11_1.png | Bin 584 -> 0 bytes .../ryzom/guild_png/guild_back_s_11_2.png | Bin 405 -> 0 bytes .../ryzom/guild_png/guild_back_s_12_1.png | Bin 623 -> 0 bytes .../ryzom/guild_png/guild_back_s_12_2.png | Bin 394 -> 0 bytes .../ryzom/guild_png/guild_back_s_13_1.png | Bin 528 -> 0 bytes .../ryzom/guild_png/guild_back_s_13_2.png | Bin 351 -> 0 bytes .../ryzom/guild_png/guild_back_s_14_1.png | Bin 431 -> 0 bytes .../ryzom/guild_png/guild_back_s_14_2.png | Bin 238 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_00.png | Bin 2851 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_01.png | Bin 2035 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_02.png | Bin 3081 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_03.png | Bin 1850 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_04.png | Bin 2424 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_05.png | Bin 1937 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_06.png | Bin 2192 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_07.png | Bin 2655 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_08.png | Bin 1757 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_09.png | Bin 3326 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_10.png | Bin 1561 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_11.png | Bin 2189 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_12.png | Bin 2029 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_13.png | Bin 2566 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_14.png | Bin 2617 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_15.png | Bin 2474 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_16.png | Bin 1915 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_17.png | Bin 2424 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_18.png | Bin 1850 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_19.png | Bin 1009 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_20.png | Bin 1656 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_21.png | Bin 2647 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_22.png | Bin 2739 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_23.png | Bin 3122 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_24.png | Bin 2923 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_25.png | Bin 1925 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_26.png | Bin 3289 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_27.png | Bin 1864 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_28.png | Bin 1515 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_29.png | Bin 2642 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_30.png | Bin 3340 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_31.png | Bin 3335 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_32.png | Bin 1410 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_33.png | Bin 2922 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_34.png | Bin 2349 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_35.png | Bin 1490 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_36.png | Bin 3116 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_37.png | Bin 1978 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_38.png | Bin 2939 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_39.png | Bin 3075 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_40.png | Bin 1264 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_41.png | Bin 1584 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_42.png | Bin 4013 -> 0 bytes .../ryzom/guild_png/guild_symbol_b_43.png | Bin 2076 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_00.png | Bin 2125 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_01.png | Bin 1608 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_02.png | Bin 2156 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_03.png | Bin 1375 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_04.png | Bin 1951 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_05.png | Bin 1689 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_06.png | Bin 1393 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_07.png | Bin 1904 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_08.png | Bin 1117 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_09.png | Bin 2269 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_10.png | Bin 1117 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_11.png | Bin 1714 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_12.png | Bin 1530 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_13.png | Bin 1953 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_14.png | Bin 2012 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_15.png | Bin 2223 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_16.png | Bin 1552 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_17.png | Bin 1932 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_18.png | Bin 1360 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_19.png | Bin 828 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_20.png | Bin 1361 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_21.png | Bin 2076 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_22.png | Bin 1667 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_23.png | Bin 2418 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_24.png | Bin 2034 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_25.png | Bin 1542 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_26.png | Bin 2183 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_27.png | Bin 1490 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_28.png | Bin 1165 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_29.png | Bin 1848 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_30.png | Bin 2490 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_31.png | Bin 2481 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_32.png | Bin 1365 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_33.png | Bin 2224 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_34.png | Bin 1869 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_35.png | Bin 1280 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_36.png | Bin 2190 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_37.png | Bin 1543 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_38.png | Bin 2332 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_39.png | Bin 2390 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_40.png | Bin 1154 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_41.png | Bin 1301 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_42.png | Bin 2388 -> 0 bytes .../ryzom/guild_png/guild_symbol_s_43.png | Bin 1981 -> 0 bytes code/web/api/data/ryzom/interface/1h_over.png | Bin 402 -> 0 bytes code/web/api/data/ryzom/interface/2h_over.png | Bin 529 -> 0 bytes code/web/api/data/ryzom/interface/am_logo.png | Bin 619 -> 0 bytes .../api/data/ryzom/interface/ar_armpad.png | Bin 3066 -> 0 bytes .../data/ryzom/interface/ar_armpad_mask.png | Bin 1218 -> 0 bytes .../web/api/data/ryzom/interface/ar_botte.png | Bin 2969 -> 0 bytes .../data/ryzom/interface/ar_botte_mask.png | Bin 1367 -> 0 bytes .../web/api/data/ryzom/interface/ar_gilet.png | Bin 3444 -> 0 bytes .../data/ryzom/interface/ar_gilet_mask.png | Bin 1198 -> 0 bytes code/web/api/data/ryzom/interface/ar_hand.png | Bin 2206 -> 0 bytes .../api/data/ryzom/interface/ar_hand_mask.png | Bin 1097 -> 0 bytes .../api/data/ryzom/interface/ar_helmet.png | Bin 3203 -> 0 bytes .../data/ryzom/interface/ar_helmet_mask.png | Bin 1224 -> 0 bytes .../data/ryzom/interface/ar_pantabotte.png | Bin 3388 -> 0 bytes .../ryzom/interface/ar_pantabotte_mask.png | Bin 1887 -> 0 bytes .../web/api/data/ryzom/interface/asc_exit.png | Bin 2532 -> 0 bytes .../ryzom/interface/asc_rolemastercraft.png | Bin 2463 -> 0 bytes .../ryzom/interface/asc_rolemasterfight.png | Bin 2640 -> 0 bytes .../ryzom/interface/asc_rolemasterharvest.png | Bin 2456 -> 0 bytes .../ryzom/interface/asc_rolemastermagic.png | Bin 2396 -> 0 bytes .../api/data/ryzom/interface/asc_unknown.png | Bin 2368 -> 0 bytes .../data/ryzom/interface/bg_downloader.png | Bin 1712 -> 0 bytes .../web/api/data/ryzom/interface/bg_empty.png | Bin 1425 -> 0 bytes code/web/api/data/ryzom/interface/bk_aura.png | Bin 709 -> 0 bytes .../web/api/data/ryzom/interface/bk_conso.png | Bin 693 -> 0 bytes .../data/ryzom/interface/bk_consommable.png | Bin 627 -> 0 bytes .../web/api/data/ryzom/interface/bk_fyros.png | Bin 2656 -> 0 bytes .../data/ryzom/interface/bk_fyros_brick.png | Bin 117 -> 0 bytes .../api/data/ryzom/interface/bk_generic.png | Bin 2607 -> 0 bytes .../data/ryzom/interface/bk_generic_brick.png | Bin 121 -> 0 bytes code/web/api/data/ryzom/interface/bk_goo.png | Bin 2348 -> 0 bytes .../web/api/data/ryzom/interface/bk_guild.png | Bin 3095 -> 0 bytes .../web/api/data/ryzom/interface/bk_horde.png | Bin 162 -> 0 bytes code/web/api/data/ryzom/interface/bk_kami.png | Bin 2979 -> 0 bytes .../api/data/ryzom/interface/bk_karavan.png | Bin 3037 -> 0 bytes .../ryzom/interface/bk_magie_noire_brick.png | Bin 117 -> 0 bytes .../web/api/data/ryzom/interface/bk_matis.png | Bin 3143 -> 0 bytes .../data/ryzom/interface/bk_matis_brick.png | Bin 117 -> 0 bytes .../api/data/ryzom/interface/bk_mission.png | Bin 2459 -> 0 bytes .../api/data/ryzom/interface/bk_mission2.png | Bin 2689 -> 0 bytes .../api/data/ryzom/interface/bk_outpost.png | Bin 2607 -> 0 bytes .../data/ryzom/interface/bk_outpost_brick.png | Bin 552 -> 0 bytes .../web/api/data/ryzom/interface/bk_power.png | Bin 733 -> 0 bytes .../api/data/ryzom/interface/bk_primes.png | Bin 2955 -> 0 bytes .../api/data/ryzom/interface/bk_service.png | Bin 517 -> 0 bytes .../api/data/ryzom/interface/bk_training.png | Bin 3057 -> 0 bytes .../api/data/ryzom/interface/bk_tryker.png | Bin 3092 -> 0 bytes .../data/ryzom/interface/bk_tryker_brick.png | Bin 117 -> 0 bytes .../web/api/data/ryzom/interface/bk_zorai.png | Bin 3003 -> 0 bytes .../data/ryzom/interface/bk_zorai_brick.png | Bin 121 -> 0 bytes .../data/ryzom/interface/brick_default.png | Bin 1020 -> 0 bytes .../ryzom/interface/building_state_24x24.png | Bin 1514 -> 0 bytes .../api/data/ryzom/interface/cb_main_nue.png | Bin 1261 -> 0 bytes code/web/api/data/ryzom/interface/ch_back.png | Bin 120 -> 0 bytes code/web/api/data/ryzom/interface/charge.png | Bin 948 -> 0 bytes code/web/api/data/ryzom/interface/clef.png | Bin 2318 -> 0 bytes .../data/ryzom/interface/conso_branche.png | Bin 3436 -> 0 bytes .../ryzom/interface/conso_branche_mask.png | Bin 549 -> 0 bytes .../api/data/ryzom/interface/conso_fleur.png | Bin 3595 -> 0 bytes .../data/ryzom/interface/conso_fleur_mask.png | Bin 1891 -> 0 bytes .../api/data/ryzom/interface/conso_grappe.png | Bin 3602 -> 0 bytes .../ryzom/interface/conso_grappe_mask.png | Bin 1963 -> 0 bytes .../api/data/ryzom/interface/conso_nectar.png | Bin 3275 -> 0 bytes .../ryzom/interface/conso_nectar_mask.png | Bin 658 -> 0 bytes .../api/data/ryzom/interface/construction.png | Bin 3598 -> 0 bytes code/web/api/data/ryzom/interface/cp_back.png | Bin 126 -> 0 bytes .../data/ryzom/interface/cp_over_break.png | Bin 220 -> 0 bytes .../api/data/ryzom/interface/cp_over_less.png | Bin 157 -> 0 bytes .../api/data/ryzom/interface/cp_over_more.png | Bin 176 -> 0 bytes .../data/ryzom/interface/cp_over_opening.png | Bin 141 -> 0 bytes .../ryzom/interface/cp_over_opening_2.png | Bin 149 -> 0 bytes .../api/data/ryzom/interface/cristal_ammo.png | Bin 2903 -> 0 bytes .../data/ryzom/interface/cristal_generic.png | Bin 3045 -> 0 bytes .../data/ryzom/interface/cristal_spell.png | Bin 3164 -> 0 bytes code/web/api/data/ryzom/interface/ef_back.png | Bin 138 -> 0 bytes .../data/ryzom/interface/ef_over_break.png | Bin 219 -> 0 bytes .../api/data/ryzom/interface/ef_over_less.png | Bin 152 -> 0 bytes .../api/data/ryzom/interface/ef_over_more.png | Bin 169 -> 0 bytes code/web/api/data/ryzom/interface/fo_back.png | Bin 161 -> 0 bytes code/web/api/data/ryzom/interface/fo_over.png | Bin 160 -> 0 bytes code/web/api/data/ryzom/interface/fp_ammo.png | Bin 1136 -> 0 bytes .../web/api/data/ryzom/interface/fp_armor.png | Bin 1553 -> 0 bytes .../api/data/ryzom/interface/fp_building.png | Bin 1114 -> 0 bytes .../web/api/data/ryzom/interface/fp_jewel.png | Bin 1322 -> 0 bytes .../web/api/data/ryzom/interface/fp_melee.png | Bin 1316 -> 0 bytes code/web/api/data/ryzom/interface/fp_over.png | Bin 156 -> 0 bytes .../web/api/data/ryzom/interface/fp_range.png | Bin 1270 -> 0 bytes .../api/data/ryzom/interface/fp_shield.png | Bin 1460 -> 0 bytes .../web/api/data/ryzom/interface/fp_tools.png | Bin 1142 -> 0 bytes .../interface/ge_mission_outpost_townhall.png | Bin 3368 -> 0 bytes .../ryzom/interface/ico_absorb_damage.png | Bin 1020 -> 0 bytes .../api/data/ryzom/interface/ico_accurate.png | Bin 1010 -> 0 bytes .../web/api/data/ryzom/interface/ico_acid.png | Bin 883 -> 0 bytes code/web/api/data/ryzom/interface/ico_aim.png | Bin 650 -> 0 bytes .../ryzom/interface/ico_aim_bird_wings.png | Bin 1186 -> 0 bytes .../ico_aim_flying_kitin_abdomen.png | Bin 1643 -> 0 bytes .../ryzom/interface/ico_aim_homin_arms.png | Bin 1413 -> 0 bytes .../ryzom/interface/ico_aim_homin_chest.png | Bin 1433 -> 0 bytes .../ryzom/interface/ico_aim_homin_feet.png | Bin 1393 -> 0 bytes .../ryzom/interface/ico_aim_homin_feint.png | Bin 1541 -> 0 bytes .../ryzom/interface/ico_aim_homin_hands.png | Bin 1463 -> 0 bytes .../ryzom/interface/ico_aim_homin_head.png | Bin 1379 -> 0 bytes .../ryzom/interface/ico_aim_homin_legs.png | Bin 1397 -> 0 bytes .../ryzom/interface/ico_aim_kitin_head.png | Bin 1473 -> 0 bytes .../api/data/ryzom/interface/ico_amande.png | Bin 2738 -> 0 bytes .../data/ryzom/interface/ico_ammo_bullet.png | Bin 911 -> 0 bytes .../data/ryzom/interface/ico_ammo_jacket.png | Bin 1196 -> 0 bytes .../api/data/ryzom/interface/ico_angle.png | Bin 1102 -> 0 bytes .../ryzom/interface/ico_anti_magic_shield.png | Bin 1313 -> 0 bytes .../api/data/ryzom/interface/ico_armor.png | Bin 1383 -> 0 bytes .../data/ryzom/interface/ico_armor_clip.png | Bin 1066 -> 0 bytes .../data/ryzom/interface/ico_armor_heavy.png | Bin 1276 -> 0 bytes .../data/ryzom/interface/ico_armor_kitin.png | Bin 1261 -> 0 bytes .../data/ryzom/interface/ico_armor_light.png | Bin 1320 -> 0 bytes .../data/ryzom/interface/ico_armor_medium.png | Bin 1194 -> 0 bytes .../ryzom/interface/ico_armor_penalty.png | Bin 1543 -> 0 bytes .../data/ryzom/interface/ico_armor_shell.png | Bin 1519 -> 0 bytes .../web/api/data/ryzom/interface/ico_atys.png | Bin 1532 -> 0 bytes .../api/data/ryzom/interface/ico_atysian.png | Bin 733 -> 0 bytes .../data/ryzom/interface/ico_balance_hp.png | Bin 863 -> 0 bytes .../api/data/ryzom/interface/ico_barrel.png | Bin 1032 -> 0 bytes .../web/api/data/ryzom/interface/ico_bash.png | Bin 1210 -> 0 bytes .../api/data/ryzom/interface/ico_berserk.png | Bin 768 -> 0 bytes .../api/data/ryzom/interface/ico_blade.png | Bin 781 -> 0 bytes .../api/data/ryzom/interface/ico_bleeding.png | Bin 852 -> 0 bytes .../api/data/ryzom/interface/ico_blind.png | Bin 922 -> 0 bytes .../api/data/ryzom/interface/ico_blunt.png | Bin 930 -> 0 bytes .../web/api/data/ryzom/interface/ico_bomb.png | Bin 1166 -> 0 bytes .../ryzom/interface/ico_cataliseur_xp.png | Bin 4015 -> 0 bytes .../data/ryzom/interface/ico_celestial.png | Bin 790 -> 0 bytes .../ryzom/interface/ico_circular_attack.png | Bin 1574 -> 0 bytes .../api/data/ryzom/interface/ico_clothes.png | Bin 1423 -> 0 bytes .../web/api/data/ryzom/interface/ico_cold.png | Bin 1162 -> 0 bytes .../ryzom/interface/ico_concentration.png | Bin 1405 -> 0 bytes .../ryzom/interface/ico_consommable_over.png | Bin 472 -> 0 bytes .../data/ryzom/interface/ico_constitution.png | Bin 920 -> 0 bytes .../ryzom/interface/ico_counterweight.png | Bin 934 -> 0 bytes .../data/ryzom/interface/ico_craft_buff.png | Bin 1326 -> 0 bytes .../ryzom/interface/ico_create_sapload.png | Bin 1187 -> 0 bytes .../api/data/ryzom/interface/ico_curse.png | Bin 761 -> 0 bytes .../api/data/ryzom/interface/ico_debuff.png | Bin 863 -> 0 bytes .../ryzom/interface/ico_debuff_resist.png | Bin 1340 -> 0 bytes .../data/ryzom/interface/ico_debuff_skill.png | Bin 1345 -> 0 bytes .../api/data/ryzom/interface/ico_desert.png | Bin 973 -> 0 bytes .../data/ryzom/interface/ico_dexterity.png | Bin 950 -> 0 bytes .../api/data/ryzom/interface/ico_disarm.png | Bin 978 -> 0 bytes .../api/data/ryzom/interface/ico_dodge.png | Bin 906 -> 0 bytes code/web/api/data/ryzom/interface/ico_dot.png | Bin 1200 -> 0 bytes .../data/ryzom/interface/ico_durability.png | Bin 1021 -> 0 bytes .../api/data/ryzom/interface/ico_electric.png | Bin 1372 -> 0 bytes .../api/data/ryzom/interface/ico_explosif.png | Bin 682 -> 0 bytes .../data/ryzom/interface/ico_extracting.png | Bin 1299 -> 0 bytes .../web/api/data/ryzom/interface/ico_fear.png | Bin 1236 -> 0 bytes .../api/data/ryzom/interface/ico_feint.png | Bin 1202 -> 0 bytes .../web/api/data/ryzom/interface/ico_fire.png | Bin 1138 -> 0 bytes .../data/ryzom/interface/ico_firing_pin.png | Bin 1382 -> 0 bytes .../ryzom/interface/ico_fleur_carac_1.png | Bin 3025 -> 0 bytes .../interface/ico_fleur_carac_1_mask.png | Bin 1490 -> 0 bytes .../ryzom/interface/ico_fleur_carac_2.png | Bin 2513 -> 0 bytes .../interface/ico_fleur_carac_2_mask.png | Bin 1111 -> 0 bytes .../ryzom/interface/ico_fleur_carac_3.png | Bin 3175 -> 0 bytes .../interface/ico_fleur_carac_3_mask.png | Bin 1536 -> 0 bytes .../api/data/ryzom/interface/ico_focus.png | Bin 764 -> 0 bytes .../data/ryzom/interface/ico_forage_buff.png | Bin 1644 -> 0 bytes .../data/ryzom/interface/ico_forbid_item.png | Bin 1254 -> 0 bytes .../api/data/ryzom/interface/ico_forest.png | Bin 1476 -> 0 bytes .../api/data/ryzom/interface/ico_foreuse.png | Bin 3320 -> 0 bytes .../data/ryzom/interface/ico_gardening.png | Bin 949 -> 0 bytes .../api/data/ryzom/interface/ico_gentle.png | Bin 196 -> 0 bytes code/web/api/data/ryzom/interface/ico_goo.png | Bin 1491 -> 0 bytes .../api/data/ryzom/interface/ico_gripp.png | Bin 1011 -> 0 bytes .../data/ryzom/interface/ico_haircolor.png | Bin 3453 -> 0 bytes .../api/data/ryzom/interface/ico_haircut.png | Bin 3468 -> 0 bytes .../api/data/ryzom/interface/ico_hammer.png | Bin 1065 -> 0 bytes .../api/data/ryzom/interface/ico_harmful.png | Bin 194 -> 0 bytes .../api/data/ryzom/interface/ico_hatred.png | Bin 1801 -> 0 bytes .../web/api/data/ryzom/interface/ico_heal.png | Bin 746 -> 0 bytes .../api/data/ryzom/interface/ico_hit_rate.png | Bin 1272 -> 0 bytes .../data/ryzom/interface/ico_incapacity.png | Bin 952 -> 0 bytes .../data/ryzom/interface/ico_intelligence.png | Bin 894 -> 0 bytes .../data/ryzom/interface/ico_interrupt.png | Bin 852 -> 0 bytes .../ryzom/interface/ico_invulnerability.png | Bin 1688 -> 0 bytes .../data/ryzom/interface/ico_jewel_stone.png | Bin 1068 -> 0 bytes .../interface/ico_jewel_stone_support.png | Bin 804 -> 0 bytes .../api/data/ryzom/interface/ico_jungle.png | Bin 1237 -> 0 bytes .../api/data/ryzom/interface/ico_lacustre.png | Bin 1427 -> 0 bytes .../ryzom/interface/ico_landmark_bonus.png | Bin 762 -> 0 bytes .../api/data/ryzom/interface/ico_level.png | Bin 504 -> 0 bytes .../api/data/ryzom/interface/ico_lining.png | Bin 509 -> 0 bytes .../api/data/ryzom/interface/ico_location.png | Bin 1331 -> 0 bytes .../api/data/ryzom/interface/ico_madness.png | Bin 1161 -> 0 bytes .../api/data/ryzom/interface/ico_magic.png | Bin 670 -> 0 bytes .../ryzom/interface/ico_magic_action_buff.png | Bin 1368 -> 0 bytes .../data/ryzom/interface/ico_magic_focus.png | Bin 847 -> 0 bytes .../ryzom/interface/ico_magic_target_buff.png | Bin 1621 -> 0 bytes .../ryzom/interface/ico_melee_action_buff.png | Bin 1266 -> 0 bytes .../ryzom/interface/ico_melee_target_buff.png | Bin 1498 -> 0 bytes .../api/data/ryzom/interface/ico_mental.png | Bin 1323 -> 0 bytes .../data/ryzom/interface/ico_metabolism.png | Bin 702 -> 0 bytes .../web/api/data/ryzom/interface/ico_mezz.png | Bin 720 -> 0 bytes .../data/ryzom/interface/ico_misfortune.png | Bin 1199 -> 0 bytes .../ryzom/interface/ico_mission_art_fyros.png | Bin 2988 -> 0 bytes .../ryzom/interface/ico_mission_art_matis.png | Bin 2595 -> 0 bytes .../interface/ico_mission_art_tryker.png | Bin 3258 -> 0 bytes .../ryzom/interface/ico_mission_art_zorai.png | Bin 2790 -> 0 bytes .../ryzom/interface/ico_mission_barrel.png | Bin 2927 -> 0 bytes .../ryzom/interface/ico_mission_bottle.png | Bin 2684 -> 0 bytes .../ryzom/interface/ico_mission_casket.png | Bin 2586 -> 0 bytes .../ryzom/interface/ico_mission_medicine.png | Bin 2823 -> 0 bytes .../ryzom/interface/ico_mission_message.png | Bin 2875 -> 0 bytes .../ryzom/interface/ico_mission_package.png | Bin 3294 -> 0 bytes .../data/ryzom/interface/ico_mission_pot.png | Bin 2470 -> 0 bytes .../ryzom/interface/ico_mission_purse.png | Bin 3051 -> 0 bytes .../web/api/data/ryzom/interface/ico_move.png | Bin 1009 -> 0 bytes .../data/ryzom/interface/ico_multi_fight.png | Bin 917 -> 0 bytes .../ryzom/interface/ico_multiple_spots.png | Bin 673 -> 0 bytes .../web/api/data/ryzom/interface/ico_noix.png | Bin 3229 -> 0 bytes .../data/ryzom/interface/ico_opening_hit.png | Bin 1270 -> 0 bytes .../data/ryzom/interface/ico_over_autumn.png | Bin 311 -> 0 bytes .../ryzom/interface/ico_over_degenerated.png | Bin 770 -> 0 bytes .../data/ryzom/interface/ico_over_fauna.png | Bin 852 -> 0 bytes .../data/ryzom/interface/ico_over_flora.png | Bin 699 -> 0 bytes .../ryzom/interface/ico_over_hit_arms.png | Bin 630 -> 0 bytes .../ryzom/interface/ico_over_hit_chest.png | Bin 635 -> 0 bytes .../ryzom/interface/ico_over_hit_feet.png | Bin 510 -> 0 bytes .../interface/ico_over_hit_feet_hands.png | Bin 595 -> 0 bytes .../interface/ico_over_hit_feet_head.png | Bin 701 -> 0 bytes .../ryzom/interface/ico_over_hit_feet_x2.png | Bin 540 -> 0 bytes .../ryzom/interface/ico_over_hit_feint_x3.png | Bin 559 -> 0 bytes .../ryzom/interface/ico_over_hit_hands.png | Bin 523 -> 0 bytes .../interface/ico_over_hit_hands_chest.png | Bin 725 -> 0 bytes .../interface/ico_over_hit_hands_head.png | Bin 790 -> 0 bytes .../ryzom/interface/ico_over_hit_head.png | Bin 598 -> 0 bytes .../ryzom/interface/ico_over_hit_head_x3.png | Bin 625 -> 0 bytes .../ryzom/interface/ico_over_hit_legs.png | Bin 636 -> 0 bytes .../data/ryzom/interface/ico_over_homin.png | Bin 750 -> 0 bytes .../data/ryzom/interface/ico_over_kitin.png | Bin 1046 -> 0 bytes .../data/ryzom/interface/ico_over_magic.png | Bin 688 -> 0 bytes .../data/ryzom/interface/ico_over_melee.png | Bin 511 -> 0 bytes .../data/ryzom/interface/ico_over_racial.png | Bin 708 -> 0 bytes .../data/ryzom/interface/ico_over_range.png | Bin 495 -> 0 bytes .../data/ryzom/interface/ico_over_special.png | Bin 268 -> 0 bytes .../data/ryzom/interface/ico_over_spring.png | Bin 309 -> 0 bytes .../data/ryzom/interface/ico_over_summer.png | Bin 303 -> 0 bytes .../data/ryzom/interface/ico_over_winter.png | Bin 303 -> 0 bytes .../api/data/ryzom/interface/ico_parry.png | Bin 700 -> 0 bytes .../api/data/ryzom/interface/ico_piercing.png | Bin 1196 -> 0 bytes .../api/data/ryzom/interface/ico_pointe.png | Bin 849 -> 0 bytes .../api/data/ryzom/interface/ico_poison.png | Bin 808 -> 0 bytes .../api/data/ryzom/interface/ico_power.png | Bin 899 -> 0 bytes .../data/ryzom/interface/ico_preservation.png | Bin 1049 -> 0 bytes .../api/data/ryzom/interface/ico_primal.png | Bin 765 -> 0 bytes .../data/ryzom/interface/ico_prime_roots.png | Bin 1385 -> 0 bytes .../api/data/ryzom/interface/ico_private.png | Bin 880 -> 0 bytes .../data/ryzom/interface/ico_prospecting.png | Bin 897 -> 0 bytes .../api/data/ryzom/interface/ico_quality.png | Bin 1193 -> 0 bytes .../api/data/ryzom/interface/ico_racine.png | Bin 3220 -> 0 bytes .../api/data/ryzom/interface/ico_range.png | Bin 945 -> 0 bytes .../ryzom/interface/ico_range_action_buff.png | Bin 1718 -> 0 bytes .../ryzom/interface/ico_range_target_buff.png | Bin 2047 -> 0 bytes .../api/data/ryzom/interface/ico_ricochet.png | Bin 1042 -> 0 bytes .../web/api/data/ryzom/interface/ico_root.png | Bin 1524 -> 0 bytes code/web/api/data/ryzom/interface/ico_rot.png | Bin 1047 -> 0 bytes .../web/api/data/ryzom/interface/ico_safe.png | Bin 1729 -> 0 bytes code/web/api/data/ryzom/interface/ico_sap.png | Bin 724 -> 0 bytes .../data/ryzom/interface/ico_self_damage.png | Bin 985 -> 0 bytes .../api/data/ryzom/interface/ico_shaft.png | Bin 923 -> 0 bytes .../data/ryzom/interface/ico_shield_buff.png | Bin 1579 -> 0 bytes .../data/ryzom/interface/ico_shield_up.png | Bin 1406 -> 0 bytes .../data/ryzom/interface/ico_shielding.png | Bin 1061 -> 0 bytes .../data/ryzom/interface/ico_shockwave.png | Bin 1042 -> 0 bytes .../api/data/ryzom/interface/ico_sickness.png | Bin 557 -> 0 bytes .../api/data/ryzom/interface/ico_slashing.png | Bin 1017 -> 0 bytes .../web/api/data/ryzom/interface/ico_slow.png | Bin 695 -> 0 bytes .../data/ryzom/interface/ico_soft_spot.png | Bin 1220 -> 0 bytes .../ryzom/interface/ico_source_knowledge.png | Bin 909 -> 0 bytes .../data/ryzom/interface/ico_source_time.png | Bin 1662 -> 0 bytes .../api/data/ryzom/interface/ico_speed.png | Bin 605 -> 0 bytes .../data/ryzom/interface/ico_speeding_up.png | Bin 863 -> 0 bytes .../data/ryzom/interface/ico_spell_break.png | Bin 1350 -> 0 bytes .../api/data/ryzom/interface/ico_spores.png | Bin 2676 -> 0 bytes .../api/data/ryzom/interface/ico_spray.png | Bin 1410 -> 0 bytes .../api/data/ryzom/interface/ico_spying.png | Bin 1010 -> 0 bytes .../api/data/ryzom/interface/ico_stamina.png | Bin 758 -> 0 bytes .../api/data/ryzom/interface/ico_strength.png | Bin 945 -> 0 bytes .../api/data/ryzom/interface/ico_stuffing.png | Bin 1470 -> 0 bytes .../api/data/ryzom/interface/ico_stunn.png | Bin 1225 -> 0 bytes .../data/ryzom/interface/ico_task_craft.png | Bin 3962 -> 0 bytes .../data/ryzom/interface/ico_task_done.png | Bin 899 -> 0 bytes .../data/ryzom/interface/ico_task_failed.png | Bin 1168 -> 0 bytes .../data/ryzom/interface/ico_task_fight.png | Bin 3865 -> 0 bytes .../data/ryzom/interface/ico_task_forage.png | Bin 3860 -> 0 bytes .../data/ryzom/interface/ico_task_generic.png | Bin 3806 -> 0 bytes .../interface/ico_task_generic_quart.png | Bin 3379 -> 0 bytes .../data/ryzom/interface/ico_task_guild.png | Bin 3973 -> 0 bytes .../data/ryzom/interface/ico_task_rite.png | Bin 3926 -> 0 bytes .../data/ryzom/interface/ico_task_travel.png | Bin 3908 -> 0 bytes .../api/data/ryzom/interface/ico_tatoo.png | Bin 4185 -> 0 bytes .../api/data/ryzom/interface/ico_taunt.png | Bin 941 -> 0 bytes .../web/api/data/ryzom/interface/ico_time.png | Bin 720 -> 0 bytes .../data/ryzom/interface/ico_time_bonus.png | Bin 1028 -> 0 bytes .../api/data/ryzom/interface/ico_tourbe.png | Bin 3161 -> 0 bytes .../api/data/ryzom/interface/ico_trigger.png | Bin 762 -> 0 bytes .../api/data/ryzom/interface/ico_umbrella.png | Bin 1298 -> 0 bytes .../ryzom/interface/ico_use_enchantement.png | Bin 1230 -> 0 bytes .../api/data/ryzom/interface/ico_vampire.png | Bin 687 -> 0 bytes .../data/ryzom/interface/ico_visibility.png | Bin 886 -> 0 bytes .../api/data/ryzom/interface/ico_war_cry.png | Bin 1172 -> 0 bytes .../api/data/ryzom/interface/ico_weight.png | Bin 919 -> 0 bytes .../data/ryzom/interface/ico_wellbalanced.png | Bin 726 -> 0 bytes .../web/api/data/ryzom/interface/ico_will.png | Bin 716 -> 0 bytes .../api/data/ryzom/interface/ico_windding.png | Bin 1170 -> 0 bytes .../api/data/ryzom/interface/ico_wisdom.png | Bin 685 -> 0 bytes .../data/ryzom/interface/improved_tool.png | Bin 3549 -> 0 bytes .../api/data/ryzom/interface/item_default.png | Bin 1977 -> 0 bytes .../data/ryzom/interface/item_plan_over.png | Bin 220 -> 0 bytes .../api/data/ryzom/interface/lucky_flower.png | Bin 3527 -> 0 bytes code/web/api/data/ryzom/interface/mail.png | Bin 1706 -> 0 bytes .../api/data/ryzom/interface/mektoub_pack.png | Bin 4301 -> 0 bytes .../data/ryzom/interface/mektoub_steed.png | Bin 3913 -> 0 bytes code/web/api/data/ryzom/interface/mf_back.png | Bin 216 -> 0 bytes code/web/api/data/ryzom/interface/mf_over.png | Bin 205 -> 0 bytes .../web/api/data/ryzom/interface/mg_glove.png | Bin 3618 -> 0 bytes .../data/ryzom/interface/mission_icon_0.png | Bin 2760 -> 0 bytes .../data/ryzom/interface/mission_icon_1.png | Bin 2763 -> 0 bytes .../data/ryzom/interface/mission_icon_2.png | Bin 2739 -> 0 bytes .../data/ryzom/interface/mission_icon_3.png | Bin 2736 -> 0 bytes code/web/api/data/ryzom/interface/mp3.png | Bin 1515 -> 0 bytes .../web/api/data/ryzom/interface/mp_amber.png | Bin 2916 -> 0 bytes .../data/ryzom/interface/mp_back_curative.png | Bin 193 -> 0 bytes .../ryzom/interface/mp_back_offensive.png | Bin 190 -> 0 bytes .../data/ryzom/interface/mp_back_selfonly.png | Bin 186 -> 0 bytes code/web/api/data/ryzom/interface/mp_bark.png | Bin 2940 -> 0 bytes .../ryzom/interface/mp_batiment_brique.png | Bin 2791 -> 0 bytes .../ryzom/interface/mp_batiment_colonne.png | Bin 1691 -> 0 bytes .../interface/mp_batiment_colonne_justice.png | Bin 2828 -> 0 bytes .../ryzom/interface/mp_batiment_comble.png | Bin 2684 -> 0 bytes .../interface/mp_batiment_noyau_maduk.png | Bin 3596 -> 0 bytes .../ryzom/interface/mp_batiment_ornement.png | Bin 2444 -> 0 bytes .../interface/mp_batiment_revetement.png | Bin 1912 -> 0 bytes .../ryzom/interface/mp_batiment_socle.png | Bin 3064 -> 0 bytes .../ryzom/interface/mp_batiment_statue.png | Bin 2945 -> 0 bytes code/web/api/data/ryzom/interface/mp_beak.png | Bin 2440 -> 0 bytes .../web/api/data/ryzom/interface/mp_blood.png | Bin 1474 -> 0 bytes code/web/api/data/ryzom/interface/mp_bone.png | Bin 1825 -> 0 bytes code/web/api/data/ryzom/interface/mp_bud.png | Bin 2469 -> 0 bytes .../data/ryzom/interface/mp_buterfly_blue.png | Bin 2738 -> 0 bytes .../ryzom/interface/mp_buterfly_cocoon.png | Bin 2460 -> 0 bytes .../api/data/ryzom/interface/mp_cereal.png | Bin 3102 -> 0 bytes code/web/api/data/ryzom/interface/mp_claw.png | Bin 2531 -> 0 bytes .../api/data/ryzom/interface/mp_dandelion.png | Bin 4364 -> 0 bytes code/web/api/data/ryzom/interface/mp_dry | Bin 10373 -> 0 bytes .../api/data/ryzom/interface/mp_dry wood.png | Bin 2952 -> 0 bytes code/web/api/data/ryzom/interface/mp_dry.png | Bin 14122 -> 0 bytes .../api/data/ryzom/interface/mp_dry_wood.png | Bin 3057 -> 0 bytes code/web/api/data/ryzom/interface/mp_dust.png | Bin 2971 -> 0 bytes code/web/api/data/ryzom/interface/mp_egg.png | Bin 1765 -> 0 bytes code/web/api/data/ryzom/interface/mp_eyes.png | Bin 2526 -> 0 bytes code/web/api/data/ryzom/interface/mp_fang.png | Bin 2728 -> 0 bytes .../web/api/data/ryzom/interface/mp_fiber.png | Bin 3737 -> 0 bytes .../api/data/ryzom/interface/mp_filament.png | Bin 3290 -> 0 bytes .../ryzom/interface/mp_firefly_abdomen.png | Bin 4004 -> 0 bytes .../data/ryzom/interface/mp_fish_scale.png | Bin 3000 -> 0 bytes .../api/data/ryzom/interface/mp_flowers.png | Bin 2345 -> 0 bytes .../ryzom/interface/mp_fresh_loose_soil.png | Bin 1929 -> 0 bytes .../web/api/data/ryzom/interface/mp_fruit.png | Bin 1683 -> 0 bytes .../api/data/ryzom/interface/mp_generic.png | Bin 2498 -> 0 bytes .../ryzom/interface/mp_generic_colorize.png | Bin 2606 -> 0 bytes .../web/api/data/ryzom/interface/mp_gomme.png | Bin 2164 -> 0 bytes .../data/ryzom/interface/mp_goo_residue.png | Bin 3168 -> 0 bytes .../web/api/data/ryzom/interface/mp_hairs.png | Bin 2328 -> 0 bytes code/web/api/data/ryzom/interface/mp_hoof.png | Bin 2884 -> 0 bytes code/web/api/data/ryzom/interface/mp_horn.png | Bin 2277 -> 0 bytes .../api/data/ryzom/interface/mp_horney.png | Bin 2835 -> 0 bytes .../data/ryzom/interface/mp_insect_fossil.png | Bin 3390 -> 0 bytes .../data/ryzom/interface/mp_kitin_flesh.png | Bin 2011 -> 0 bytes .../ryzom/interface/mp_kitin_secretion.png | Bin 2878 -> 0 bytes .../data/ryzom/interface/mp_kitinshell.png | Bin 3065 -> 0 bytes .../web/api/data/ryzom/interface/mp_larva.png | Bin 2071 -> 0 bytes code/web/api/data/ryzom/interface/mp_leaf.png | Bin 3436 -> 0 bytes .../api/data/ryzom/interface/mp_leather.png | Bin 4001 -> 0 bytes .../web/api/data/ryzom/interface/mp_liane.png | Bin 2574 -> 0 bytes .../api/data/ryzom/interface/mp_lichen.png | Bin 3569 -> 0 bytes .../api/data/ryzom/interface/mp_ligament.png | Bin 3341 -> 0 bytes .../api/data/ryzom/interface/mp_mandible.png | Bin 2503 -> 0 bytes code/web/api/data/ryzom/interface/mp_meat.png | Bin 2826 -> 0 bytes code/web/api/data/ryzom/interface/mp_moss.png | Bin 3279 -> 0 bytes .../api/data/ryzom/interface/mp_mushroom.png | Bin 3154 -> 0 bytes code/web/api/data/ryzom/interface/mp_nail.png | Bin 2615 -> 0 bytes code/web/api/data/ryzom/interface/mp_oil.png | Bin 3139 -> 0 bytes .../api/data/ryzom/interface/mp_over_link.png | Bin 129 -> 0 bytes .../api/data/ryzom/interface/mp_parasite.png | Bin 2865 -> 0 bytes .../web/api/data/ryzom/interface/mp_pearl.png | Bin 2302 -> 0 bytes .../api/data/ryzom/interface/mp_pelvis.png | Bin 3513 -> 0 bytes .../api/data/ryzom/interface/mp_pigment.png | Bin 4092 -> 0 bytes .../api/data/ryzom/interface/mp_pistil.png | Bin 2757 -> 0 bytes .../data/ryzom/interface/mp_plant_fossil.png | Bin 2515 -> 0 bytes .../api/data/ryzom/interface/mp_pollen.png | Bin 2314 -> 0 bytes .../web/api/data/ryzom/interface/mp_resin.png | Bin 2994 -> 0 bytes .../web/api/data/ryzom/interface/mp_ronce.png | Bin 2493 -> 0 bytes .../api/data/ryzom/interface/mp_rostrum.png | Bin 2256 -> 0 bytes code/web/api/data/ryzom/interface/mp_sap.png | Bin 2473 -> 0 bytes .../api/data/ryzom/interface/mp_sawdust.png | Bin 3561 -> 0 bytes code/web/api/data/ryzom/interface/mp_seed.png | Bin 3242 -> 0 bytes .../web/api/data/ryzom/interface/mp_shell.png | Bin 3332 -> 0 bytes .../api/data/ryzom/interface/mp_silk_worm.png | Bin 2479 -> 0 bytes code/web/api/data/ryzom/interface/mp_skin.png | Bin 4247 -> 0 bytes .../web/api/data/ryzom/interface/mp_skull.png | Bin 3406 -> 0 bytes .../data/ryzom/interface/mp_spiders_web.png | Bin 4081 -> 0 bytes .../web/api/data/ryzom/interface/mp_spine.png | Bin 1885 -> 0 bytes code/web/api/data/ryzom/interface/mp_stem.png | Bin 3755 -> 0 bytes .../web/api/data/ryzom/interface/mp_sting.png | Bin 1877 -> 0 bytes .../web/api/data/ryzom/interface/mp_straw.png | Bin 2425 -> 0 bytes code/web/api/data/ryzom/interface/mp_suc.png | Bin 2370 -> 0 bytes code/web/api/data/ryzom/interface/mp_tail.png | Bin 2835 -> 0 bytes .../web/api/data/ryzom/interface/mp_tooth.png | Bin 3003 -> 0 bytes .../web/api/data/ryzom/interface/mp_trunk.png | Bin 2361 -> 0 bytes .../api/data/ryzom/interface/mp_whiskers.png | Bin 2161 -> 0 bytes code/web/api/data/ryzom/interface/mp_wing.png | Bin 2865 -> 0 bytes code/web/api/data/ryzom/interface/mp_wood.png | Bin 2296 -> 0 bytes .../api/data/ryzom/interface/mp_wood_node.png | Bin 2242 -> 0 bytes .../api/data/ryzom/interface/mw_2h_axe.png | Bin 2312 -> 0 bytes .../api/data/ryzom/interface/mw_2h_lance.png | Bin 1890 -> 0 bytes .../api/data/ryzom/interface/mw_2h_mace.png | Bin 2152 -> 0 bytes .../api/data/ryzom/interface/mw_2h_sword.png | Bin 2463 -> 0 bytes code/web/api/data/ryzom/interface/mw_axe.png | Bin 1526 -> 0 bytes .../api/data/ryzom/interface/mw_dagger.png | Bin 1075 -> 0 bytes .../web/api/data/ryzom/interface/mw_lance.png | Bin 1341 -> 0 bytes code/web/api/data/ryzom/interface/mw_mace.png | Bin 1507 -> 0 bytes .../web/api/data/ryzom/interface/mw_staff.png | Bin 1021 -> 0 bytes .../web/api/data/ryzom/interface/mw_sword.png | Bin 1894 -> 0 bytes .../api/data/ryzom/interface/no_action.png | Bin 566 -> 0 bytes .../api/data/ryzom/interface/num_slash.png | Bin 365 -> 0 bytes code/web/api/data/ryzom/interface/op_back.png | Bin 126 -> 0 bytes .../data/ryzom/interface/op_over_break.png | Bin 231 -> 0 bytes .../api/data/ryzom/interface/op_over_less.png | Bin 157 -> 0 bytes .../api/data/ryzom/interface/op_over_more.png | Bin 182 -> 0 bytes .../api/data/ryzom/interface/pa_anklet.png | Bin 2128 -> 0 bytes code/web/api/data/ryzom/interface/pa_back.png | Bin 125 -> 0 bytes .../api/data/ryzom/interface/pa_bracelet.png | Bin 1872 -> 0 bytes .../api/data/ryzom/interface/pa_diadem.png | Bin 1589 -> 0 bytes .../api/data/ryzom/interface/pa_earring.png | Bin 816 -> 0 bytes .../data/ryzom/interface/pa_over_break.png | Bin 222 -> 0 bytes .../api/data/ryzom/interface/pa_over_less.png | Bin 157 -> 0 bytes .../api/data/ryzom/interface/pa_over_more.png | Bin 178 -> 0 bytes .../api/data/ryzom/interface/pa_pendant.png | Bin 1648 -> 0 bytes code/web/api/data/ryzom/interface/pa_ring.png | Bin 1943 -> 0 bytes code/web/api/data/ryzom/interface/profile.png | Bin 129 -> 0 bytes .../data/ryzom/interface/protect_amber.png | Bin 3644 -> 0 bytes .../api/data/ryzom/interface/pvp_ally_0.png | Bin 1598 -> 0 bytes .../api/data/ryzom/interface/pvp_ally_1.png | Bin 1004 -> 0 bytes .../api/data/ryzom/interface/pvp_ally_2.png | Bin 1261 -> 0 bytes .../api/data/ryzom/interface/pvp_ally_3.png | Bin 1524 -> 0 bytes .../api/data/ryzom/interface/pvp_ally_4.png | Bin 1404 -> 0 bytes .../api/data/ryzom/interface/pvp_ally_6.png | Bin 1498 -> 0 bytes .../data/ryzom/interface/pvp_ally_primas.png | Bin 1537 -> 0 bytes .../data/ryzom/interface/pvp_ally_ranger.png | Bin 1255 -> 0 bytes .../web/api/data/ryzom/interface/pvp_aura.png | Bin 1200 -> 0 bytes .../data/ryzom/interface/pvp_aura_mask.png | Bin 2971 -> 0 bytes .../api/data/ryzom/interface/pvp_boost.png | Bin 2884 -> 0 bytes .../data/ryzom/interface/pvp_boost_mask.png | Bin 1102 -> 0 bytes .../api/data/ryzom/interface/pvp_enemy_0.png | Bin 1439 -> 0 bytes .../api/data/ryzom/interface/pvp_enemy_1.png | Bin 1281 -> 0 bytes .../api/data/ryzom/interface/pvp_enemy_2.png | Bin 1302 -> 0 bytes .../api/data/ryzom/interface/pvp_enemy_3.png | Bin 1532 -> 0 bytes .../api/data/ryzom/interface/pvp_enemy_4.png | Bin 1546 -> 0 bytes .../api/data/ryzom/interface/pvp_enemy_6.png | Bin 1612 -> 0 bytes .../ryzom/interface/pvp_enemy_marauder.png | Bin 1170 -> 0 bytes .../ryzom/interface/pvp_enemy_trytonist.png | Bin 1499 -> 0 bytes code/web/api/data/ryzom/interface/pw_4.png | Bin 297 -> 0 bytes code/web/api/data/ryzom/interface/pw_5.png | Bin 307 -> 0 bytes code/web/api/data/ryzom/interface/pw_6.png | Bin 537 -> 0 bytes code/web/api/data/ryzom/interface/pw_7.png | Bin 659 -> 0 bytes .../web/api/data/ryzom/interface/pw_heavy.png | Bin 221 -> 0 bytes .../web/api/data/ryzom/interface/pw_light.png | Bin 200 -> 0 bytes .../api/data/ryzom/interface/pw_medium.png | Bin 214 -> 0 bytes .../api/data/ryzom/interface/quest_coeur.png | Bin 2849 -> 0 bytes .../api/data/ryzom/interface/quest_foie.png | Bin 3675 -> 0 bytes .../api/data/ryzom/interface/quest_jeton.png | Bin 4192 -> 0 bytes .../api/data/ryzom/interface/quest_langue.png | Bin 2421 -> 0 bytes .../api/data/ryzom/interface/quest_louche.png | Bin 2290 -> 0 bytes .../data/ryzom/interface/quest_oreille.png | Bin 3300 -> 0 bytes .../api/data/ryzom/interface/quest_patte.png | Bin 3132 -> 0 bytes .../api/data/ryzom/interface/quest_poils.png | Bin 3011 -> 0 bytes .../api/data/ryzom/interface/quest_queue.png | Bin 2417 -> 0 bytes .../api/data/ryzom/interface/quest_ticket.png | Bin 3397 -> 0 bytes code/web/api/data/ryzom/interface/r2_live.png | Bin 3384 -> 0 bytes .../api/data/ryzom/interface/r2_live_over.png | Bin 3964 -> 0 bytes .../data/ryzom/interface/r2_live_pushed.png | Bin 2812 -> 0 bytes .../ryzom/interface/r2_palette_entities.png | Bin 1481 -> 0 bytes .../api/data/ryzom/interface/requirement.png | Bin 2791 -> 0 bytes code/web/api/data/ryzom/interface/rm_f.png | Bin 2716 -> 0 bytes .../api/data/ryzom/interface/rm_f_upgrade.png | Bin 2830 -> 0 bytes code/web/api/data/ryzom/interface/rm_h.png | Bin 2567 -> 0 bytes .../api/data/ryzom/interface/rm_h_upgrade.png | Bin 2682 -> 0 bytes code/web/api/data/ryzom/interface/rm_m.png | Bin 2487 -> 0 bytes .../api/data/ryzom/interface/rm_m_upgrade.png | Bin 2596 -> 0 bytes code/web/api/data/ryzom/interface/rm_r.png | Bin 2561 -> 0 bytes .../api/data/ryzom/interface/rm_r_upgrade.png | Bin 2668 -> 0 bytes .../api/data/ryzom/interface/rpjob_200.png | Bin 3930 -> 0 bytes .../api/data/ryzom/interface/rpjob_201.png | Bin 4027 -> 0 bytes .../api/data/ryzom/interface/rpjob_202.png | Bin 3789 -> 0 bytes .../api/data/ryzom/interface/rpjob_203.png | Bin 4267 -> 0 bytes .../api/data/ryzom/interface/rpjob_204.png | Bin 3960 -> 0 bytes .../api/data/ryzom/interface/rpjob_205.png | Bin 3452 -> 0 bytes .../api/data/ryzom/interface/rpjob_206.png | Bin 4044 -> 0 bytes .../api/data/ryzom/interface/rpjob_207.png | Bin 3968 -> 0 bytes .../data/ryzom/interface/rpjob_advanced.png | Bin 4209 -> 0 bytes .../data/ryzom/interface/rpjob_elementary.png | Bin 4140 -> 0 bytes .../data/ryzom/interface/rpjob_roleplay.png | Bin 4209 -> 0 bytes .../api/data/ryzom/interface/rpjob_task.png | Bin 4057 -> 0 bytes .../interface/rpjob_task_certificats.png | Bin 4000 -> 0 bytes .../ryzom/interface/rpjob_task_convert.png | Bin 3880 -> 0 bytes .../ryzom/interface/rpjob_task_elementary.png | Bin 4325 -> 0 bytes .../ryzom/interface/rpjob_task_generic.png | Bin 4025 -> 0 bytes .../ryzom/interface/rpjob_task_upgrade.png | Bin 3888 -> 0 bytes .../data/ryzom/interface/rpjobitem_200_a.png | Bin 3002 -> 0 bytes .../data/ryzom/interface/rpjobitem_200_b.png | Bin 4253 -> 0 bytes .../data/ryzom/interface/rpjobitem_200_c.png | Bin 3255 -> 0 bytes .../data/ryzom/interface/rpjobitem_201_a.png | Bin 3988 -> 0 bytes .../data/ryzom/interface/rpjobitem_201_b.png | Bin 3428 -> 0 bytes .../data/ryzom/interface/rpjobitem_201_c.png | Bin 2616 -> 0 bytes .../data/ryzom/interface/rpjobitem_202_a.png | Bin 4003 -> 0 bytes .../data/ryzom/interface/rpjobitem_202_b.png | Bin 4050 -> 0 bytes .../data/ryzom/interface/rpjobitem_202_c.png | Bin 2684 -> 0 bytes .../data/ryzom/interface/rpjobitem_203_a.png | Bin 4719 -> 0 bytes .../data/ryzom/interface/rpjobitem_203_b.png | Bin 4545 -> 0 bytes .../data/ryzom/interface/rpjobitem_203_c.png | Bin 3848 -> 0 bytes .../data/ryzom/interface/rpjobitem_204_a.png | Bin 2683 -> 0 bytes .../data/ryzom/interface/rpjobitem_204_b.png | Bin 2779 -> 0 bytes .../data/ryzom/interface/rpjobitem_204_c.png | Bin 2730 -> 0 bytes .../data/ryzom/interface/rpjobitem_205_a.png | Bin 3577 -> 0 bytes .../data/ryzom/interface/rpjobitem_205_b.png | Bin 3264 -> 0 bytes .../data/ryzom/interface/rpjobitem_205_c.png | Bin 2513 -> 0 bytes .../data/ryzom/interface/rpjobitem_206_a.png | Bin 2321 -> 0 bytes .../data/ryzom/interface/rpjobitem_206_b.png | Bin 3529 -> 0 bytes .../data/ryzom/interface/rpjobitem_206_c.png | Bin 2047 -> 0 bytes .../data/ryzom/interface/rpjobitem_207_a.png | Bin 3947 -> 0 bytes .../data/ryzom/interface/rpjobitem_207_b.png | Bin 3907 -> 0 bytes .../data/ryzom/interface/rpjobitem_207_c.png | Bin 4055 -> 0 bytes .../interface/rpjobitem_certifications.png | Bin 3864 -> 0 bytes .../data/ryzom/interface/rw_autolaunch.png | Bin 2268 -> 0 bytes .../api/data/ryzom/interface/rw_bowgun.png | Bin 2849 -> 0 bytes .../api/data/ryzom/interface/rw_grenade.png | Bin 1230 -> 0 bytes .../data/ryzom/interface/rw_harpoongun.png | Bin 1796 -> 0 bytes .../api/data/ryzom/interface/rw_launcher.png | Bin 2563 -> 0 bytes .../api/data/ryzom/interface/rw_pistol.png | Bin 1984 -> 0 bytes .../api/data/ryzom/interface/rw_pistolarc.png | Bin 2282 -> 0 bytes .../web/api/data/ryzom/interface/rw_rifle.png | Bin 2155 -> 0 bytes code/web/api/data/ryzom/interface/sapload.png | Bin 1079 -> 0 bytes .../api/data/ryzom/interface/sh_buckler.png | Bin 2540 -> 0 bytes .../data/ryzom/interface/sh_large_shield.png | Bin 3386 -> 0 bytes .../data/ryzom/interface/small_task_craft.png | Bin 824 -> 0 bytes .../data/ryzom/interface/small_task_done.png | Bin 464 -> 0 bytes .../ryzom/interface/small_task_failed.png | Bin 535 -> 0 bytes .../data/ryzom/interface/small_task_fight.png | Bin 808 -> 0 bytes .../ryzom/interface/small_task_forage.png | Bin 807 -> 0 bytes .../ryzom/interface/small_task_generic.png | Bin 796 -> 0 bytes .../data/ryzom/interface/small_task_guild.png | Bin 825 -> 0 bytes .../data/ryzom/interface/small_task_rite.png | Bin 848 -> 0 bytes .../ryzom/interface/small_task_travel.png | Bin 835 -> 0 bytes .../api/data/ryzom/interface/spe_beast.png | Bin 3041 -> 0 bytes code/web/api/data/ryzom/interface/spe_com.png | Bin 2443 -> 0 bytes .../data/ryzom/interface/spe_inventory.png | Bin 3253 -> 0 bytes .../web/api/data/ryzom/interface/spe_labs.png | Bin 3264 -> 0 bytes .../api/data/ryzom/interface/spe_memory.png | Bin 3080 -> 0 bytes .../api/data/ryzom/interface/spe_options.png | Bin 3407 -> 0 bytes .../api/data/ryzom/interface/spe_status.png | Bin 2912 -> 0 bytes .../ryzom/interface/stimulating_water.png | Bin 3567 -> 0 bytes .../data/ryzom/interface/tb_action_attack.png | Bin 1669 -> 0 bytes .../data/ryzom/interface/tb_action_config.png | Bin 1764 -> 0 bytes .../ryzom/interface/tb_action_disband.png | Bin 1491 -> 0 bytes .../ryzom/interface/tb_action_disengage.png | Bin 1727 -> 0 bytes .../ryzom/interface/tb_action_extract.png | Bin 1678 -> 0 bytes .../data/ryzom/interface/tb_action_invite.png | Bin 1416 -> 0 bytes .../data/ryzom/interface/tb_action_kick.png | Bin 1401 -> 0 bytes .../data/ryzom/interface/tb_action_move.png | Bin 1339 -> 0 bytes .../data/ryzom/interface/tb_action_run.png | Bin 1598 -> 0 bytes .../data/ryzom/interface/tb_action_sit.png | Bin 1565 -> 0 bytes .../data/ryzom/interface/tb_action_stand.png | Bin 1434 -> 0 bytes .../data/ryzom/interface/tb_action_stop.png | Bin 1336 -> 0 bytes .../data/ryzom/interface/tb_action_talk.png | Bin 994 -> 0 bytes .../data/ryzom/interface/tb_action_walk.png | Bin 1508 -> 0 bytes .../api/data/ryzom/interface/tb_animals.png | Bin 1716 -> 0 bytes .../api/data/ryzom/interface/tb_config.png | Bin 1764 -> 0 bytes .../data/ryzom/interface/tb_connection.png | Bin 1278 -> 0 bytes .../api/data/ryzom/interface/tb_contacts.png | Bin 1613 -> 0 bytes .../api/data/ryzom/interface/tb_desk_1.png | Bin 717 -> 0 bytes .../api/data/ryzom/interface/tb_desk_2.png | Bin 723 -> 0 bytes .../api/data/ryzom/interface/tb_desk_3.png | Bin 707 -> 0 bytes .../api/data/ryzom/interface/tb_desk_4.png | Bin 702 -> 0 bytes .../api/data/ryzom/interface/tb_faction.png | Bin 1344 -> 0 bytes .../web/api/data/ryzom/interface/tb_forum.png | Bin 1561 -> 0 bytes .../web/api/data/ryzom/interface/tb_guild.png | Bin 1704 -> 0 bytes .../web/api/data/ryzom/interface/tb_help2.png | Bin 1511 -> 0 bytes code/web/api/data/ryzom/interface/tb_keys.png | Bin 1688 -> 0 bytes .../api/data/ryzom/interface/tb_macros.png | Bin 1720 -> 0 bytes code/web/api/data/ryzom/interface/tb_mail.png | Bin 1593 -> 0 bytes code/web/api/data/ryzom/interface/tb_mode.png | Bin 401 -> 0 bytes .../data/ryzom/interface/tb_mode_dodge.png | Bin 1541 -> 0 bytes .../data/ryzom/interface/tb_mode_parry.png | Bin 1444 -> 0 bytes code/web/api/data/ryzom/interface/tb_over.png | Bin 113 -> 0 bytes .../api/data/ryzom/interface/tb_support.png | Bin 1535 -> 0 bytes code/web/api/data/ryzom/interface/tb_team.png | Bin 1462 -> 0 bytes .../api/data/ryzom/interface/tb_windows.png | Bin 770 -> 0 bytes .../api/data/ryzom/interface/tetekitin.png | Bin 4058 -> 0 bytes code/web/api/data/ryzom/interface/to_ammo.png | Bin 2936 -> 0 bytes .../web/api/data/ryzom/interface/to_armor.png | Bin 3563 -> 0 bytes .../data/ryzom/interface/to_cooking_pot.png | Bin 1958 -> 0 bytes .../data/ryzom/interface/to_fishing_rod.png | Bin 1616 -> 0 bytes .../api/data/ryzom/interface/to_forage.png | Bin 2589 -> 0 bytes .../api/data/ryzom/interface/to_hammer.png | Bin 1826 -> 0 bytes .../ryzom/interface/to_jewelry_hammer.png | Bin 1346 -> 0 bytes .../api/data/ryzom/interface/to_jewels.png | Bin 3822 -> 0 bytes .../data/ryzom/interface/to_leathercutter.png | Bin 1124 -> 0 bytes .../web/api/data/ryzom/interface/to_melee.png | Bin 2691 -> 0 bytes .../api/data/ryzom/interface/to_needle.png | Bin 1546 -> 0 bytes .../api/data/ryzom/interface/to_pestle.png | Bin 3242 -> 0 bytes .../web/api/data/ryzom/interface/to_range.png | Bin 3209 -> 0 bytes .../api/data/ryzom/interface/to_searake.png | Bin 1062 -> 0 bytes .../web/api/data/ryzom/interface/to_spade.png | Bin 1269 -> 0 bytes .../web/api/data/ryzom/interface/to_stick.png | Bin 984 -> 0 bytes .../ryzom/interface/to_tunneling_knife.png | Bin 1426 -> 0 bytes code/web/api/data/ryzom/interface/to_whip.png | Bin 2155 -> 0 bytes .../api/data/ryzom/interface/to_wrench.png | Bin 2053 -> 0 bytes .../api/data/ryzom/interface/tp_caravane.png | Bin 3668 -> 0 bytes code/web/api/data/ryzom/interface/tp_kami.png | Bin 4209 -> 0 bytes .../api/data/ryzom/interface/us_back_0.png | Bin 117 -> 0 bytes .../api/data/ryzom/interface/us_back_1.png | Bin 117 -> 0 bytes .../api/data/ryzom/interface/us_back_2.png | Bin 117 -> 0 bytes .../api/data/ryzom/interface/us_back_3.png | Bin 117 -> 0 bytes .../api/data/ryzom/interface/us_back_4.png | Bin 117 -> 0 bytes .../api/data/ryzom/interface/us_back_5.png | Bin 117 -> 0 bytes .../api/data/ryzom/interface/us_back_6.png | Bin 117 -> 0 bytes .../api/data/ryzom/interface/us_back_7.png | Bin 117 -> 0 bytes .../api/data/ryzom/interface/us_back_8.png | Bin 117 -> 0 bytes .../api/data/ryzom/interface/us_back_9.png | Bin 117 -> 0 bytes .../web/api/data/ryzom/interface/us_ico_0.png | Bin 201 -> 0 bytes .../web/api/data/ryzom/interface/us_ico_1.png | Bin 200 -> 0 bytes .../web/api/data/ryzom/interface/us_ico_2.png | Bin 201 -> 0 bytes .../web/api/data/ryzom/interface/us_ico_3.png | Bin 200 -> 0 bytes .../web/api/data/ryzom/interface/us_ico_4.png | Bin 201 -> 0 bytes .../web/api/data/ryzom/interface/us_ico_5.png | Bin 201 -> 0 bytes .../web/api/data/ryzom/interface/us_ico_6.png | Bin 200 -> 0 bytes .../web/api/data/ryzom/interface/us_ico_7.png | Bin 201 -> 0 bytes .../web/api/data/ryzom/interface/us_ico_8.png | Bin 199 -> 0 bytes .../web/api/data/ryzom/interface/us_ico_9.png | Bin 201 -> 0 bytes .../api/data/ryzom/interface/us_over_0.png | Bin 180 -> 0 bytes .../api/data/ryzom/interface/us_over_1.png | Bin 733 -> 0 bytes .../api/data/ryzom/interface/us_over_2.png | Bin 529 -> 0 bytes .../api/data/ryzom/interface/us_over_3.png | Bin 190 -> 0 bytes .../api/data/ryzom/interface/us_over_4.png | Bin 126 -> 0 bytes .../api/data/ryzom/interface/w_am_logo.png | Bin 566 -> 0 bytes .../web/api/data/ryzom/interface/w_leader.png | Bin 401 -> 0 bytes code/web/api/data/ryzom/interface/w_major.png | Bin 133 -> 0 bytes .../api/data/ryzom/interface/w_pa_anklet.png | Bin 2129 -> 0 bytes .../data/ryzom/interface/w_pa_bracelet.png | Bin 1806 -> 0 bytes .../api/data/ryzom/interface/w_pa_diadem.png | Bin 1527 -> 0 bytes .../api/data/ryzom/interface/w_pa_earring.png | Bin 793 -> 0 bytes .../api/data/ryzom/interface/w_pa_pendant.png | Bin 1618 -> 0 bytes .../api/data/ryzom/interface/w_pa_ring.png | Bin 1881 -> 0 bytes .../ryzom/interface/w_slot_shortcut_id0.png | Bin 141 -> 0 bytes .../ryzom/interface/w_slot_shortcut_id1.png | Bin 201 -> 0 bytes .../ryzom/interface/w_slot_shortcut_id2.png | Bin 178 -> 0 bytes .../ryzom/interface/w_slot_shortcut_id3.png | Bin 165 -> 0 bytes .../ryzom/interface/w_slot_shortcut_id4.png | Bin 174 -> 0 bytes .../ryzom/interface/w_slot_shortcut_id5.png | Bin 192 -> 0 bytes .../ryzom/interface/w_slot_shortcut_id6.png | Bin 147 -> 0 bytes .../ryzom/interface/w_slot_shortcut_id7.png | Bin 180 -> 0 bytes .../ryzom/interface/w_slot_shortcut_id8.png | Bin 192 -> 0 bytes .../ryzom/interface/w_slot_shortcut_id9.png | Bin 167 -> 0 bytes .../interface/w_slot_shortcut_shift_id0.png | Bin 231 -> 0 bytes .../interface/w_slot_shortcut_shift_id1.png | Bin 282 -> 0 bytes .../interface/w_slot_shortcut_shift_id2.png | Bin 253 -> 0 bytes .../interface/w_slot_shortcut_shift_id3.png | Bin 238 -> 0 bytes .../interface/w_slot_shortcut_shift_id4.png | Bin 259 -> 0 bytes .../interface/w_slot_shortcut_shift_id5.png | Bin 273 -> 0 bytes .../interface/w_slot_shortcut_shift_id6.png | Bin 239 -> 0 bytes .../interface/w_slot_shortcut_shift_id7.png | Bin 263 -> 0 bytes .../interface/w_slot_shortcut_shift_id8.png | Bin 264 -> 0 bytes .../interface/w_slot_shortcut_shift_id9.png | Bin 249 -> 0 bytes .../api/data/ryzom/interface/xp_cat_green.png | Bin 3582 -> 0 bytes code/web/api/data/ryzom/items_db.php | 7633 -------------- code/web/api/data/ryzom/ryShapesPs.php | 4481 -------- code/web/api/data/ryzom/sbrick_db.php | 4133 -------- code/web/api/index.php | 1 - code/web/api/player_auth.php | 44 - code/web/api/ryzom_api.php | 71 - code/web/api/server/auth.php | 126 - code/web/api/server/config.php.default | 42 - code/web/api/server/guilds.php | 63 - code/web/api/server/hmagic.php | 106 - code/web/api/server/item_icon.php | 266 - .../api/server/scripts/create_guilds_xml.php | 142 - .../api/server/scripts/generate_guild_icon.sh | 39 - code/web/api/server/scripts/get_guilds_xml.sh | 29 - code/web/api/server/time.php | 46 - code/web/api/server/user.php | 199 - code/web/api/server/utils.php | 49 - code/web/api/time.php | 35 - 901 files changed, 31628 deletions(-) delete mode 100644 code/web/api/client/auth.php delete mode 100644 code/web/api/client/config.php.default delete mode 100644 code/web/api/client/time.php delete mode 100644 code/web/api/client/user.php delete mode 100644 code/web/api/client/utils.php delete mode 100644 code/web/api/common/actionPage.php delete mode 100644 code/web/api/common/auth.php delete mode 100644 code/web/api/common/bbCode.php delete mode 100644 code/web/api/common/config.php.default delete mode 100644 code/web/api/common/db_defs.php delete mode 100644 code/web/api/common/db_lib.php delete mode 100644 code/web/api/common/dfm.php delete mode 100644 code/web/api/common/logger.php delete mode 100644 code/web/api/common/render.php delete mode 100644 code/web/api/common/ryform.php delete mode 100644 code/web/api/common/ryformBases.php delete mode 100644 code/web/api/common/time.php delete mode 100644 code/web/api/common/user.php delete mode 100644 code/web/api/common/utils.php delete mode 100644 code/web/api/common/xml_utils.php delete mode 100644 code/web/api/data/css/ryzom_iphone.css delete mode 100644 code/web/api/data/css/ryzom_ui.css delete mode 100644 code/web/api/data/css/skin_b.gif delete mode 100644 code/web/api/data/css/skin_bl.gif delete mode 100644 code/web/api/data/css/skin_blank.png delete mode 100644 code/web/api/data/css/skin_blank_inner.png delete mode 100644 code/web/api/data/css/skin_br.gif delete mode 100644 code/web/api/data/css/skin_header_l.gif delete mode 100644 code/web/api/data/css/skin_header_m.gif delete mode 100644 code/web/api/data/css/skin_header_r.gif delete mode 100644 code/web/api/data/css/skin_l.gif delete mode 100644 code/web/api/data/css/skin_r.gif delete mode 100644 code/web/api/data/css/skin_t.gif delete mode 100644 code/web/api/data/css/skin_tl.gif delete mode 100644 code/web/api/data/css/skin_tr.gif delete mode 100644 code/web/api/data/icons/add_app.png delete mode 100644 code/web/api/data/icons/edit.png delete mode 100644 code/web/api/data/icons/edit_16.png delete mode 100644 code/web/api/data/icons/no_action.png delete mode 100644 code/web/api/data/img/backgrounds/parchemin.png delete mode 100644 code/web/api/data/img/bg.jpg delete mode 100644 code/web/api/data/img/bordure.png delete mode 100644 code/web/api/data/img/lang/de.png delete mode 100644 code/web/api/data/img/lang/en.png delete mode 100644 code/web/api/data/img/lang/es.png delete mode 100644 code/web/api/data/img/lang/fr.png delete mode 100644 code/web/api/data/img/lang/ru.png delete mode 100644 code/web/api/data/img/lang/sp.png delete mode 100644 code/web/api/data/img/logo.gif delete mode 100644 code/web/api/data/js/combobox.js delete mode 100644 code/web/api/data/js/jquery-1.7.1.js delete mode 100644 code/web/api/data/js/tab.js delete mode 100644 code/web/api/data/ryzom/guild_png/.htaccess delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_00_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_00_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_01_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_01_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_02_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_02_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_03_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_03_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_04_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_04_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_05_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_05_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_06_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_06_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_07_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_07_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_08_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_08_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_09_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_09_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_10_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_10_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_11_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_11_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_12_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_12_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_13_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_13_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_14_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_b_14_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_00_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_00_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_01_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_01_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_02_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_02_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_03_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_03_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_04_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_04_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_05_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_05_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_06_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_06_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_07_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_07_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_08_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_08_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_09_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_09_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_10_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_10_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_11_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_11_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_12_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_12_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_13_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_13_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_14_1.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_back_s_14_2.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_00.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_01.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_02.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_03.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_04.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_05.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_06.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_07.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_08.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_09.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_10.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_11.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_12.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_13.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_14.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_15.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_16.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_17.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_18.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_19.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_20.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_21.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_22.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_23.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_24.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_25.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_26.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_27.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_28.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_29.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_30.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_31.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_32.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_33.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_34.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_35.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_36.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_37.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_38.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_39.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_40.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_41.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_42.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_b_43.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_00.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_01.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_02.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_03.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_04.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_05.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_06.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_07.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_08.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_09.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_10.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_11.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_12.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_13.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_14.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_15.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_16.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_17.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_18.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_19.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_20.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_21.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_22.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_23.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_24.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_25.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_26.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_27.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_28.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_29.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_30.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_31.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_32.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_33.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_34.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_35.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_36.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_37.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_38.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_39.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_40.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_41.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_42.png delete mode 100644 code/web/api/data/ryzom/guild_png/guild_symbol_s_43.png delete mode 100644 code/web/api/data/ryzom/interface/1h_over.png delete mode 100644 code/web/api/data/ryzom/interface/2h_over.png delete mode 100644 code/web/api/data/ryzom/interface/am_logo.png delete mode 100644 code/web/api/data/ryzom/interface/ar_armpad.png delete mode 100644 code/web/api/data/ryzom/interface/ar_armpad_mask.png delete mode 100644 code/web/api/data/ryzom/interface/ar_botte.png delete mode 100644 code/web/api/data/ryzom/interface/ar_botte_mask.png delete mode 100644 code/web/api/data/ryzom/interface/ar_gilet.png delete mode 100644 code/web/api/data/ryzom/interface/ar_gilet_mask.png delete mode 100644 code/web/api/data/ryzom/interface/ar_hand.png delete mode 100644 code/web/api/data/ryzom/interface/ar_hand_mask.png delete mode 100644 code/web/api/data/ryzom/interface/ar_helmet.png delete mode 100644 code/web/api/data/ryzom/interface/ar_helmet_mask.png delete mode 100644 code/web/api/data/ryzom/interface/ar_pantabotte.png delete mode 100644 code/web/api/data/ryzom/interface/ar_pantabotte_mask.png delete mode 100644 code/web/api/data/ryzom/interface/asc_exit.png delete mode 100644 code/web/api/data/ryzom/interface/asc_rolemastercraft.png delete mode 100644 code/web/api/data/ryzom/interface/asc_rolemasterfight.png delete mode 100644 code/web/api/data/ryzom/interface/asc_rolemasterharvest.png delete mode 100644 code/web/api/data/ryzom/interface/asc_rolemastermagic.png delete mode 100644 code/web/api/data/ryzom/interface/asc_unknown.png delete mode 100644 code/web/api/data/ryzom/interface/bg_downloader.png delete mode 100644 code/web/api/data/ryzom/interface/bg_empty.png delete mode 100644 code/web/api/data/ryzom/interface/bk_aura.png delete mode 100644 code/web/api/data/ryzom/interface/bk_conso.png delete mode 100644 code/web/api/data/ryzom/interface/bk_consommable.png delete mode 100644 code/web/api/data/ryzom/interface/bk_fyros.png delete mode 100644 code/web/api/data/ryzom/interface/bk_fyros_brick.png delete mode 100644 code/web/api/data/ryzom/interface/bk_generic.png delete mode 100644 code/web/api/data/ryzom/interface/bk_generic_brick.png delete mode 100644 code/web/api/data/ryzom/interface/bk_goo.png delete mode 100644 code/web/api/data/ryzom/interface/bk_guild.png delete mode 100644 code/web/api/data/ryzom/interface/bk_horde.png delete mode 100644 code/web/api/data/ryzom/interface/bk_kami.png delete mode 100644 code/web/api/data/ryzom/interface/bk_karavan.png delete mode 100644 code/web/api/data/ryzom/interface/bk_magie_noire_brick.png delete mode 100644 code/web/api/data/ryzom/interface/bk_matis.png delete mode 100644 code/web/api/data/ryzom/interface/bk_matis_brick.png delete mode 100644 code/web/api/data/ryzom/interface/bk_mission.png delete mode 100644 code/web/api/data/ryzom/interface/bk_mission2.png delete mode 100644 code/web/api/data/ryzom/interface/bk_outpost.png delete mode 100644 code/web/api/data/ryzom/interface/bk_outpost_brick.png delete mode 100644 code/web/api/data/ryzom/interface/bk_power.png delete mode 100644 code/web/api/data/ryzom/interface/bk_primes.png delete mode 100644 code/web/api/data/ryzom/interface/bk_service.png delete mode 100644 code/web/api/data/ryzom/interface/bk_training.png delete mode 100644 code/web/api/data/ryzom/interface/bk_tryker.png delete mode 100644 code/web/api/data/ryzom/interface/bk_tryker_brick.png delete mode 100644 code/web/api/data/ryzom/interface/bk_zorai.png delete mode 100644 code/web/api/data/ryzom/interface/bk_zorai_brick.png delete mode 100644 code/web/api/data/ryzom/interface/brick_default.png delete mode 100644 code/web/api/data/ryzom/interface/building_state_24x24.png delete mode 100644 code/web/api/data/ryzom/interface/cb_main_nue.png delete mode 100644 code/web/api/data/ryzom/interface/ch_back.png delete mode 100644 code/web/api/data/ryzom/interface/charge.png delete mode 100644 code/web/api/data/ryzom/interface/clef.png delete mode 100644 code/web/api/data/ryzom/interface/conso_branche.png delete mode 100644 code/web/api/data/ryzom/interface/conso_branche_mask.png delete mode 100644 code/web/api/data/ryzom/interface/conso_fleur.png delete mode 100644 code/web/api/data/ryzom/interface/conso_fleur_mask.png delete mode 100644 code/web/api/data/ryzom/interface/conso_grappe.png delete mode 100644 code/web/api/data/ryzom/interface/conso_grappe_mask.png delete mode 100644 code/web/api/data/ryzom/interface/conso_nectar.png delete mode 100644 code/web/api/data/ryzom/interface/conso_nectar_mask.png delete mode 100644 code/web/api/data/ryzom/interface/construction.png delete mode 100644 code/web/api/data/ryzom/interface/cp_back.png delete mode 100644 code/web/api/data/ryzom/interface/cp_over_break.png delete mode 100644 code/web/api/data/ryzom/interface/cp_over_less.png delete mode 100644 code/web/api/data/ryzom/interface/cp_over_more.png delete mode 100644 code/web/api/data/ryzom/interface/cp_over_opening.png delete mode 100644 code/web/api/data/ryzom/interface/cp_over_opening_2.png delete mode 100644 code/web/api/data/ryzom/interface/cristal_ammo.png delete mode 100644 code/web/api/data/ryzom/interface/cristal_generic.png delete mode 100644 code/web/api/data/ryzom/interface/cristal_spell.png delete mode 100644 code/web/api/data/ryzom/interface/ef_back.png delete mode 100644 code/web/api/data/ryzom/interface/ef_over_break.png delete mode 100644 code/web/api/data/ryzom/interface/ef_over_less.png delete mode 100644 code/web/api/data/ryzom/interface/ef_over_more.png delete mode 100644 code/web/api/data/ryzom/interface/fo_back.png delete mode 100644 code/web/api/data/ryzom/interface/fo_over.png delete mode 100644 code/web/api/data/ryzom/interface/fp_ammo.png delete mode 100644 code/web/api/data/ryzom/interface/fp_armor.png delete mode 100644 code/web/api/data/ryzom/interface/fp_building.png delete mode 100644 code/web/api/data/ryzom/interface/fp_jewel.png delete mode 100644 code/web/api/data/ryzom/interface/fp_melee.png delete mode 100644 code/web/api/data/ryzom/interface/fp_over.png delete mode 100644 code/web/api/data/ryzom/interface/fp_range.png delete mode 100644 code/web/api/data/ryzom/interface/fp_shield.png delete mode 100644 code/web/api/data/ryzom/interface/fp_tools.png delete mode 100644 code/web/api/data/ryzom/interface/ge_mission_outpost_townhall.png delete mode 100644 code/web/api/data/ryzom/interface/ico_absorb_damage.png delete mode 100644 code/web/api/data/ryzom/interface/ico_accurate.png delete mode 100644 code/web/api/data/ryzom/interface/ico_acid.png delete mode 100644 code/web/api/data/ryzom/interface/ico_aim.png delete mode 100644 code/web/api/data/ryzom/interface/ico_aim_bird_wings.png delete mode 100644 code/web/api/data/ryzom/interface/ico_aim_flying_kitin_abdomen.png delete mode 100644 code/web/api/data/ryzom/interface/ico_aim_homin_arms.png delete mode 100644 code/web/api/data/ryzom/interface/ico_aim_homin_chest.png delete mode 100644 code/web/api/data/ryzom/interface/ico_aim_homin_feet.png delete mode 100644 code/web/api/data/ryzom/interface/ico_aim_homin_feint.png delete mode 100644 code/web/api/data/ryzom/interface/ico_aim_homin_hands.png delete mode 100644 code/web/api/data/ryzom/interface/ico_aim_homin_head.png delete mode 100644 code/web/api/data/ryzom/interface/ico_aim_homin_legs.png delete mode 100644 code/web/api/data/ryzom/interface/ico_aim_kitin_head.png delete mode 100644 code/web/api/data/ryzom/interface/ico_amande.png delete mode 100644 code/web/api/data/ryzom/interface/ico_ammo_bullet.png delete mode 100644 code/web/api/data/ryzom/interface/ico_ammo_jacket.png delete mode 100644 code/web/api/data/ryzom/interface/ico_angle.png delete mode 100644 code/web/api/data/ryzom/interface/ico_anti_magic_shield.png delete mode 100644 code/web/api/data/ryzom/interface/ico_armor.png delete mode 100644 code/web/api/data/ryzom/interface/ico_armor_clip.png delete mode 100644 code/web/api/data/ryzom/interface/ico_armor_heavy.png delete mode 100644 code/web/api/data/ryzom/interface/ico_armor_kitin.png delete mode 100644 code/web/api/data/ryzom/interface/ico_armor_light.png delete mode 100644 code/web/api/data/ryzom/interface/ico_armor_medium.png delete mode 100644 code/web/api/data/ryzom/interface/ico_armor_penalty.png delete mode 100644 code/web/api/data/ryzom/interface/ico_armor_shell.png delete mode 100644 code/web/api/data/ryzom/interface/ico_atys.png delete mode 100644 code/web/api/data/ryzom/interface/ico_atysian.png delete mode 100644 code/web/api/data/ryzom/interface/ico_balance_hp.png delete mode 100644 code/web/api/data/ryzom/interface/ico_barrel.png delete mode 100644 code/web/api/data/ryzom/interface/ico_bash.png delete mode 100644 code/web/api/data/ryzom/interface/ico_berserk.png delete mode 100644 code/web/api/data/ryzom/interface/ico_blade.png delete mode 100644 code/web/api/data/ryzom/interface/ico_bleeding.png delete mode 100644 code/web/api/data/ryzom/interface/ico_blind.png delete mode 100644 code/web/api/data/ryzom/interface/ico_blunt.png delete mode 100644 code/web/api/data/ryzom/interface/ico_bomb.png delete mode 100644 code/web/api/data/ryzom/interface/ico_cataliseur_xp.png delete mode 100644 code/web/api/data/ryzom/interface/ico_celestial.png delete mode 100644 code/web/api/data/ryzom/interface/ico_circular_attack.png delete mode 100644 code/web/api/data/ryzom/interface/ico_clothes.png delete mode 100644 code/web/api/data/ryzom/interface/ico_cold.png delete mode 100644 code/web/api/data/ryzom/interface/ico_concentration.png delete mode 100644 code/web/api/data/ryzom/interface/ico_consommable_over.png delete mode 100644 code/web/api/data/ryzom/interface/ico_constitution.png delete mode 100644 code/web/api/data/ryzom/interface/ico_counterweight.png delete mode 100644 code/web/api/data/ryzom/interface/ico_craft_buff.png delete mode 100644 code/web/api/data/ryzom/interface/ico_create_sapload.png delete mode 100644 code/web/api/data/ryzom/interface/ico_curse.png delete mode 100644 code/web/api/data/ryzom/interface/ico_debuff.png delete mode 100644 code/web/api/data/ryzom/interface/ico_debuff_resist.png delete mode 100644 code/web/api/data/ryzom/interface/ico_debuff_skill.png delete mode 100644 code/web/api/data/ryzom/interface/ico_desert.png delete mode 100644 code/web/api/data/ryzom/interface/ico_dexterity.png delete mode 100644 code/web/api/data/ryzom/interface/ico_disarm.png delete mode 100644 code/web/api/data/ryzom/interface/ico_dodge.png delete mode 100644 code/web/api/data/ryzom/interface/ico_dot.png delete mode 100644 code/web/api/data/ryzom/interface/ico_durability.png delete mode 100644 code/web/api/data/ryzom/interface/ico_electric.png delete mode 100644 code/web/api/data/ryzom/interface/ico_explosif.png delete mode 100644 code/web/api/data/ryzom/interface/ico_extracting.png delete mode 100644 code/web/api/data/ryzom/interface/ico_fear.png delete mode 100644 code/web/api/data/ryzom/interface/ico_feint.png delete mode 100644 code/web/api/data/ryzom/interface/ico_fire.png delete mode 100644 code/web/api/data/ryzom/interface/ico_firing_pin.png delete mode 100644 code/web/api/data/ryzom/interface/ico_fleur_carac_1.png delete mode 100644 code/web/api/data/ryzom/interface/ico_fleur_carac_1_mask.png delete mode 100644 code/web/api/data/ryzom/interface/ico_fleur_carac_2.png delete mode 100644 code/web/api/data/ryzom/interface/ico_fleur_carac_2_mask.png delete mode 100644 code/web/api/data/ryzom/interface/ico_fleur_carac_3.png delete mode 100644 code/web/api/data/ryzom/interface/ico_fleur_carac_3_mask.png delete mode 100644 code/web/api/data/ryzom/interface/ico_focus.png delete mode 100644 code/web/api/data/ryzom/interface/ico_forage_buff.png delete mode 100644 code/web/api/data/ryzom/interface/ico_forbid_item.png delete mode 100644 code/web/api/data/ryzom/interface/ico_forest.png delete mode 100644 code/web/api/data/ryzom/interface/ico_foreuse.png delete mode 100644 code/web/api/data/ryzom/interface/ico_gardening.png delete mode 100644 code/web/api/data/ryzom/interface/ico_gentle.png delete mode 100644 code/web/api/data/ryzom/interface/ico_goo.png delete mode 100644 code/web/api/data/ryzom/interface/ico_gripp.png delete mode 100644 code/web/api/data/ryzom/interface/ico_haircolor.png delete mode 100644 code/web/api/data/ryzom/interface/ico_haircut.png delete mode 100644 code/web/api/data/ryzom/interface/ico_hammer.png delete mode 100644 code/web/api/data/ryzom/interface/ico_harmful.png delete mode 100644 code/web/api/data/ryzom/interface/ico_hatred.png delete mode 100644 code/web/api/data/ryzom/interface/ico_heal.png delete mode 100644 code/web/api/data/ryzom/interface/ico_hit_rate.png delete mode 100644 code/web/api/data/ryzom/interface/ico_incapacity.png delete mode 100644 code/web/api/data/ryzom/interface/ico_intelligence.png delete mode 100644 code/web/api/data/ryzom/interface/ico_interrupt.png delete mode 100644 code/web/api/data/ryzom/interface/ico_invulnerability.png delete mode 100644 code/web/api/data/ryzom/interface/ico_jewel_stone.png delete mode 100644 code/web/api/data/ryzom/interface/ico_jewel_stone_support.png delete mode 100644 code/web/api/data/ryzom/interface/ico_jungle.png delete mode 100644 code/web/api/data/ryzom/interface/ico_lacustre.png delete mode 100644 code/web/api/data/ryzom/interface/ico_landmark_bonus.png delete mode 100644 code/web/api/data/ryzom/interface/ico_level.png delete mode 100644 code/web/api/data/ryzom/interface/ico_lining.png delete mode 100644 code/web/api/data/ryzom/interface/ico_location.png delete mode 100644 code/web/api/data/ryzom/interface/ico_madness.png delete mode 100644 code/web/api/data/ryzom/interface/ico_magic.png delete mode 100644 code/web/api/data/ryzom/interface/ico_magic_action_buff.png delete mode 100644 code/web/api/data/ryzom/interface/ico_magic_focus.png delete mode 100644 code/web/api/data/ryzom/interface/ico_magic_target_buff.png delete mode 100644 code/web/api/data/ryzom/interface/ico_melee_action_buff.png delete mode 100644 code/web/api/data/ryzom/interface/ico_melee_target_buff.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mental.png delete mode 100644 code/web/api/data/ryzom/interface/ico_metabolism.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mezz.png delete mode 100644 code/web/api/data/ryzom/interface/ico_misfortune.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mission_art_fyros.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mission_art_matis.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mission_art_tryker.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mission_art_zorai.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mission_barrel.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mission_bottle.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mission_casket.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mission_medicine.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mission_message.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mission_package.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mission_pot.png delete mode 100644 code/web/api/data/ryzom/interface/ico_mission_purse.png delete mode 100644 code/web/api/data/ryzom/interface/ico_move.png delete mode 100644 code/web/api/data/ryzom/interface/ico_multi_fight.png delete mode 100644 code/web/api/data/ryzom/interface/ico_multiple_spots.png delete mode 100644 code/web/api/data/ryzom/interface/ico_noix.png delete mode 100644 code/web/api/data/ryzom/interface/ico_opening_hit.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_autumn.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_degenerated.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_fauna.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_flora.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_arms.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_chest.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_feet.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_feet_hands.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_feet_head.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_feet_x2.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_feint_x3.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_hands.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_hands_chest.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_hands_head.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_head.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_head_x3.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_hit_legs.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_homin.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_kitin.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_magic.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_melee.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_racial.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_range.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_special.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_spring.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_summer.png delete mode 100644 code/web/api/data/ryzom/interface/ico_over_winter.png delete mode 100644 code/web/api/data/ryzom/interface/ico_parry.png delete mode 100644 code/web/api/data/ryzom/interface/ico_piercing.png delete mode 100644 code/web/api/data/ryzom/interface/ico_pointe.png delete mode 100644 code/web/api/data/ryzom/interface/ico_poison.png delete mode 100644 code/web/api/data/ryzom/interface/ico_power.png delete mode 100644 code/web/api/data/ryzom/interface/ico_preservation.png delete mode 100644 code/web/api/data/ryzom/interface/ico_primal.png delete mode 100644 code/web/api/data/ryzom/interface/ico_prime_roots.png delete mode 100644 code/web/api/data/ryzom/interface/ico_private.png delete mode 100644 code/web/api/data/ryzom/interface/ico_prospecting.png delete mode 100644 code/web/api/data/ryzom/interface/ico_quality.png delete mode 100644 code/web/api/data/ryzom/interface/ico_racine.png delete mode 100644 code/web/api/data/ryzom/interface/ico_range.png delete mode 100644 code/web/api/data/ryzom/interface/ico_range_action_buff.png delete mode 100644 code/web/api/data/ryzom/interface/ico_range_target_buff.png delete mode 100644 code/web/api/data/ryzom/interface/ico_ricochet.png delete mode 100644 code/web/api/data/ryzom/interface/ico_root.png delete mode 100644 code/web/api/data/ryzom/interface/ico_rot.png delete mode 100644 code/web/api/data/ryzom/interface/ico_safe.png delete mode 100644 code/web/api/data/ryzom/interface/ico_sap.png delete mode 100644 code/web/api/data/ryzom/interface/ico_self_damage.png delete mode 100644 code/web/api/data/ryzom/interface/ico_shaft.png delete mode 100644 code/web/api/data/ryzom/interface/ico_shield_buff.png delete mode 100644 code/web/api/data/ryzom/interface/ico_shield_up.png delete mode 100644 code/web/api/data/ryzom/interface/ico_shielding.png delete mode 100644 code/web/api/data/ryzom/interface/ico_shockwave.png delete mode 100644 code/web/api/data/ryzom/interface/ico_sickness.png delete mode 100644 code/web/api/data/ryzom/interface/ico_slashing.png delete mode 100644 code/web/api/data/ryzom/interface/ico_slow.png delete mode 100644 code/web/api/data/ryzom/interface/ico_soft_spot.png delete mode 100644 code/web/api/data/ryzom/interface/ico_source_knowledge.png delete mode 100644 code/web/api/data/ryzom/interface/ico_source_time.png delete mode 100644 code/web/api/data/ryzom/interface/ico_speed.png delete mode 100644 code/web/api/data/ryzom/interface/ico_speeding_up.png delete mode 100644 code/web/api/data/ryzom/interface/ico_spell_break.png delete mode 100644 code/web/api/data/ryzom/interface/ico_spores.png delete mode 100644 code/web/api/data/ryzom/interface/ico_spray.png delete mode 100644 code/web/api/data/ryzom/interface/ico_spying.png delete mode 100644 code/web/api/data/ryzom/interface/ico_stamina.png delete mode 100644 code/web/api/data/ryzom/interface/ico_strength.png delete mode 100644 code/web/api/data/ryzom/interface/ico_stuffing.png delete mode 100644 code/web/api/data/ryzom/interface/ico_stunn.png delete mode 100644 code/web/api/data/ryzom/interface/ico_task_craft.png delete mode 100644 code/web/api/data/ryzom/interface/ico_task_done.png delete mode 100644 code/web/api/data/ryzom/interface/ico_task_failed.png delete mode 100644 code/web/api/data/ryzom/interface/ico_task_fight.png delete mode 100644 code/web/api/data/ryzom/interface/ico_task_forage.png delete mode 100644 code/web/api/data/ryzom/interface/ico_task_generic.png delete mode 100644 code/web/api/data/ryzom/interface/ico_task_generic_quart.png delete mode 100644 code/web/api/data/ryzom/interface/ico_task_guild.png delete mode 100644 code/web/api/data/ryzom/interface/ico_task_rite.png delete mode 100644 code/web/api/data/ryzom/interface/ico_task_travel.png delete mode 100644 code/web/api/data/ryzom/interface/ico_tatoo.png delete mode 100644 code/web/api/data/ryzom/interface/ico_taunt.png delete mode 100644 code/web/api/data/ryzom/interface/ico_time.png delete mode 100644 code/web/api/data/ryzom/interface/ico_time_bonus.png delete mode 100644 code/web/api/data/ryzom/interface/ico_tourbe.png delete mode 100644 code/web/api/data/ryzom/interface/ico_trigger.png delete mode 100644 code/web/api/data/ryzom/interface/ico_umbrella.png delete mode 100644 code/web/api/data/ryzom/interface/ico_use_enchantement.png delete mode 100644 code/web/api/data/ryzom/interface/ico_vampire.png delete mode 100644 code/web/api/data/ryzom/interface/ico_visibility.png delete mode 100644 code/web/api/data/ryzom/interface/ico_war_cry.png delete mode 100644 code/web/api/data/ryzom/interface/ico_weight.png delete mode 100644 code/web/api/data/ryzom/interface/ico_wellbalanced.png delete mode 100644 code/web/api/data/ryzom/interface/ico_will.png delete mode 100644 code/web/api/data/ryzom/interface/ico_windding.png delete mode 100644 code/web/api/data/ryzom/interface/ico_wisdom.png delete mode 100644 code/web/api/data/ryzom/interface/improved_tool.png delete mode 100644 code/web/api/data/ryzom/interface/item_default.png delete mode 100644 code/web/api/data/ryzom/interface/item_plan_over.png delete mode 100644 code/web/api/data/ryzom/interface/lucky_flower.png delete mode 100644 code/web/api/data/ryzom/interface/mail.png delete mode 100644 code/web/api/data/ryzom/interface/mektoub_pack.png delete mode 100644 code/web/api/data/ryzom/interface/mektoub_steed.png delete mode 100644 code/web/api/data/ryzom/interface/mf_back.png delete mode 100644 code/web/api/data/ryzom/interface/mf_over.png delete mode 100644 code/web/api/data/ryzom/interface/mg_glove.png delete mode 100644 code/web/api/data/ryzom/interface/mission_icon_0.png delete mode 100644 code/web/api/data/ryzom/interface/mission_icon_1.png delete mode 100644 code/web/api/data/ryzom/interface/mission_icon_2.png delete mode 100644 code/web/api/data/ryzom/interface/mission_icon_3.png delete mode 100644 code/web/api/data/ryzom/interface/mp3.png delete mode 100644 code/web/api/data/ryzom/interface/mp_amber.png delete mode 100644 code/web/api/data/ryzom/interface/mp_back_curative.png delete mode 100644 code/web/api/data/ryzom/interface/mp_back_offensive.png delete mode 100644 code/web/api/data/ryzom/interface/mp_back_selfonly.png delete mode 100644 code/web/api/data/ryzom/interface/mp_bark.png delete mode 100644 code/web/api/data/ryzom/interface/mp_batiment_brique.png delete mode 100644 code/web/api/data/ryzom/interface/mp_batiment_colonne.png delete mode 100644 code/web/api/data/ryzom/interface/mp_batiment_colonne_justice.png delete mode 100644 code/web/api/data/ryzom/interface/mp_batiment_comble.png delete mode 100644 code/web/api/data/ryzom/interface/mp_batiment_noyau_maduk.png delete mode 100644 code/web/api/data/ryzom/interface/mp_batiment_ornement.png delete mode 100644 code/web/api/data/ryzom/interface/mp_batiment_revetement.png delete mode 100644 code/web/api/data/ryzom/interface/mp_batiment_socle.png delete mode 100644 code/web/api/data/ryzom/interface/mp_batiment_statue.png delete mode 100644 code/web/api/data/ryzom/interface/mp_beak.png delete mode 100644 code/web/api/data/ryzom/interface/mp_blood.png delete mode 100644 code/web/api/data/ryzom/interface/mp_bone.png delete mode 100644 code/web/api/data/ryzom/interface/mp_bud.png delete mode 100644 code/web/api/data/ryzom/interface/mp_buterfly_blue.png delete mode 100644 code/web/api/data/ryzom/interface/mp_buterfly_cocoon.png delete mode 100644 code/web/api/data/ryzom/interface/mp_cereal.png delete mode 100644 code/web/api/data/ryzom/interface/mp_claw.png delete mode 100644 code/web/api/data/ryzom/interface/mp_dandelion.png delete mode 100644 code/web/api/data/ryzom/interface/mp_dry delete mode 100644 code/web/api/data/ryzom/interface/mp_dry wood.png delete mode 100644 code/web/api/data/ryzom/interface/mp_dry.png delete mode 100644 code/web/api/data/ryzom/interface/mp_dry_wood.png delete mode 100644 code/web/api/data/ryzom/interface/mp_dust.png delete mode 100644 code/web/api/data/ryzom/interface/mp_egg.png delete mode 100644 code/web/api/data/ryzom/interface/mp_eyes.png delete mode 100644 code/web/api/data/ryzom/interface/mp_fang.png delete mode 100644 code/web/api/data/ryzom/interface/mp_fiber.png delete mode 100644 code/web/api/data/ryzom/interface/mp_filament.png delete mode 100644 code/web/api/data/ryzom/interface/mp_firefly_abdomen.png delete mode 100644 code/web/api/data/ryzom/interface/mp_fish_scale.png delete mode 100644 code/web/api/data/ryzom/interface/mp_flowers.png delete mode 100644 code/web/api/data/ryzom/interface/mp_fresh_loose_soil.png delete mode 100644 code/web/api/data/ryzom/interface/mp_fruit.png delete mode 100644 code/web/api/data/ryzom/interface/mp_generic.png delete mode 100644 code/web/api/data/ryzom/interface/mp_generic_colorize.png delete mode 100644 code/web/api/data/ryzom/interface/mp_gomme.png delete mode 100644 code/web/api/data/ryzom/interface/mp_goo_residue.png delete mode 100644 code/web/api/data/ryzom/interface/mp_hairs.png delete mode 100644 code/web/api/data/ryzom/interface/mp_hoof.png delete mode 100644 code/web/api/data/ryzom/interface/mp_horn.png delete mode 100644 code/web/api/data/ryzom/interface/mp_horney.png delete mode 100644 code/web/api/data/ryzom/interface/mp_insect_fossil.png delete mode 100644 code/web/api/data/ryzom/interface/mp_kitin_flesh.png delete mode 100644 code/web/api/data/ryzom/interface/mp_kitin_secretion.png delete mode 100644 code/web/api/data/ryzom/interface/mp_kitinshell.png delete mode 100644 code/web/api/data/ryzom/interface/mp_larva.png delete mode 100644 code/web/api/data/ryzom/interface/mp_leaf.png delete mode 100644 code/web/api/data/ryzom/interface/mp_leather.png delete mode 100644 code/web/api/data/ryzom/interface/mp_liane.png delete mode 100644 code/web/api/data/ryzom/interface/mp_lichen.png delete mode 100644 code/web/api/data/ryzom/interface/mp_ligament.png delete mode 100644 code/web/api/data/ryzom/interface/mp_mandible.png delete mode 100644 code/web/api/data/ryzom/interface/mp_meat.png delete mode 100644 code/web/api/data/ryzom/interface/mp_moss.png delete mode 100644 code/web/api/data/ryzom/interface/mp_mushroom.png delete mode 100644 code/web/api/data/ryzom/interface/mp_nail.png delete mode 100644 code/web/api/data/ryzom/interface/mp_oil.png delete mode 100644 code/web/api/data/ryzom/interface/mp_over_link.png delete mode 100644 code/web/api/data/ryzom/interface/mp_parasite.png delete mode 100644 code/web/api/data/ryzom/interface/mp_pearl.png delete mode 100644 code/web/api/data/ryzom/interface/mp_pelvis.png delete mode 100644 code/web/api/data/ryzom/interface/mp_pigment.png delete mode 100644 code/web/api/data/ryzom/interface/mp_pistil.png delete mode 100644 code/web/api/data/ryzom/interface/mp_plant_fossil.png delete mode 100644 code/web/api/data/ryzom/interface/mp_pollen.png delete mode 100644 code/web/api/data/ryzom/interface/mp_resin.png delete mode 100644 code/web/api/data/ryzom/interface/mp_ronce.png delete mode 100644 code/web/api/data/ryzom/interface/mp_rostrum.png delete mode 100644 code/web/api/data/ryzom/interface/mp_sap.png delete mode 100644 code/web/api/data/ryzom/interface/mp_sawdust.png delete mode 100644 code/web/api/data/ryzom/interface/mp_seed.png delete mode 100644 code/web/api/data/ryzom/interface/mp_shell.png delete mode 100644 code/web/api/data/ryzom/interface/mp_silk_worm.png delete mode 100644 code/web/api/data/ryzom/interface/mp_skin.png delete mode 100644 code/web/api/data/ryzom/interface/mp_skull.png delete mode 100644 code/web/api/data/ryzom/interface/mp_spiders_web.png delete mode 100644 code/web/api/data/ryzom/interface/mp_spine.png delete mode 100644 code/web/api/data/ryzom/interface/mp_stem.png delete mode 100644 code/web/api/data/ryzom/interface/mp_sting.png delete mode 100644 code/web/api/data/ryzom/interface/mp_straw.png delete mode 100644 code/web/api/data/ryzom/interface/mp_suc.png delete mode 100644 code/web/api/data/ryzom/interface/mp_tail.png delete mode 100644 code/web/api/data/ryzom/interface/mp_tooth.png delete mode 100644 code/web/api/data/ryzom/interface/mp_trunk.png delete mode 100644 code/web/api/data/ryzom/interface/mp_whiskers.png delete mode 100644 code/web/api/data/ryzom/interface/mp_wing.png delete mode 100644 code/web/api/data/ryzom/interface/mp_wood.png delete mode 100644 code/web/api/data/ryzom/interface/mp_wood_node.png delete mode 100644 code/web/api/data/ryzom/interface/mw_2h_axe.png delete mode 100644 code/web/api/data/ryzom/interface/mw_2h_lance.png delete mode 100644 code/web/api/data/ryzom/interface/mw_2h_mace.png delete mode 100644 code/web/api/data/ryzom/interface/mw_2h_sword.png delete mode 100644 code/web/api/data/ryzom/interface/mw_axe.png delete mode 100644 code/web/api/data/ryzom/interface/mw_dagger.png delete mode 100644 code/web/api/data/ryzom/interface/mw_lance.png delete mode 100644 code/web/api/data/ryzom/interface/mw_mace.png delete mode 100644 code/web/api/data/ryzom/interface/mw_staff.png delete mode 100644 code/web/api/data/ryzom/interface/mw_sword.png delete mode 100644 code/web/api/data/ryzom/interface/no_action.png delete mode 100644 code/web/api/data/ryzom/interface/num_slash.png delete mode 100644 code/web/api/data/ryzom/interface/op_back.png delete mode 100644 code/web/api/data/ryzom/interface/op_over_break.png delete mode 100644 code/web/api/data/ryzom/interface/op_over_less.png delete mode 100644 code/web/api/data/ryzom/interface/op_over_more.png delete mode 100644 code/web/api/data/ryzom/interface/pa_anklet.png delete mode 100644 code/web/api/data/ryzom/interface/pa_back.png delete mode 100644 code/web/api/data/ryzom/interface/pa_bracelet.png delete mode 100644 code/web/api/data/ryzom/interface/pa_diadem.png delete mode 100644 code/web/api/data/ryzom/interface/pa_earring.png delete mode 100644 code/web/api/data/ryzom/interface/pa_over_break.png delete mode 100644 code/web/api/data/ryzom/interface/pa_over_less.png delete mode 100644 code/web/api/data/ryzom/interface/pa_over_more.png delete mode 100644 code/web/api/data/ryzom/interface/pa_pendant.png delete mode 100644 code/web/api/data/ryzom/interface/pa_ring.png delete mode 100644 code/web/api/data/ryzom/interface/profile.png delete mode 100644 code/web/api/data/ryzom/interface/protect_amber.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_ally_0.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_ally_1.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_ally_2.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_ally_3.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_ally_4.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_ally_6.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_ally_primas.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_ally_ranger.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_aura.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_aura_mask.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_boost.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_boost_mask.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_enemy_0.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_enemy_1.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_enemy_2.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_enemy_3.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_enemy_4.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_enemy_6.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_enemy_marauder.png delete mode 100644 code/web/api/data/ryzom/interface/pvp_enemy_trytonist.png delete mode 100644 code/web/api/data/ryzom/interface/pw_4.png delete mode 100644 code/web/api/data/ryzom/interface/pw_5.png delete mode 100644 code/web/api/data/ryzom/interface/pw_6.png delete mode 100644 code/web/api/data/ryzom/interface/pw_7.png delete mode 100644 code/web/api/data/ryzom/interface/pw_heavy.png delete mode 100644 code/web/api/data/ryzom/interface/pw_light.png delete mode 100644 code/web/api/data/ryzom/interface/pw_medium.png delete mode 100644 code/web/api/data/ryzom/interface/quest_coeur.png delete mode 100644 code/web/api/data/ryzom/interface/quest_foie.png delete mode 100644 code/web/api/data/ryzom/interface/quest_jeton.png delete mode 100644 code/web/api/data/ryzom/interface/quest_langue.png delete mode 100644 code/web/api/data/ryzom/interface/quest_louche.png delete mode 100644 code/web/api/data/ryzom/interface/quest_oreille.png delete mode 100644 code/web/api/data/ryzom/interface/quest_patte.png delete mode 100644 code/web/api/data/ryzom/interface/quest_poils.png delete mode 100644 code/web/api/data/ryzom/interface/quest_queue.png delete mode 100644 code/web/api/data/ryzom/interface/quest_ticket.png delete mode 100644 code/web/api/data/ryzom/interface/r2_live.png delete mode 100644 code/web/api/data/ryzom/interface/r2_live_over.png delete mode 100644 code/web/api/data/ryzom/interface/r2_live_pushed.png delete mode 100644 code/web/api/data/ryzom/interface/r2_palette_entities.png delete mode 100644 code/web/api/data/ryzom/interface/requirement.png delete mode 100644 code/web/api/data/ryzom/interface/rm_f.png delete mode 100644 code/web/api/data/ryzom/interface/rm_f_upgrade.png delete mode 100644 code/web/api/data/ryzom/interface/rm_h.png delete mode 100644 code/web/api/data/ryzom/interface/rm_h_upgrade.png delete mode 100644 code/web/api/data/ryzom/interface/rm_m.png delete mode 100644 code/web/api/data/ryzom/interface/rm_m_upgrade.png delete mode 100644 code/web/api/data/ryzom/interface/rm_r.png delete mode 100644 code/web/api/data/ryzom/interface/rm_r_upgrade.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_200.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_201.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_202.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_203.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_204.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_205.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_206.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_207.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_advanced.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_elementary.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_roleplay.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_task.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_task_certificats.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_task_convert.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_task_elementary.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_task_generic.png delete mode 100644 code/web/api/data/ryzom/interface/rpjob_task_upgrade.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_200_a.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_200_b.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_200_c.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_201_a.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_201_b.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_201_c.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_202_a.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_202_b.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_202_c.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_203_a.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_203_b.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_203_c.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_204_a.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_204_b.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_204_c.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_205_a.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_205_b.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_205_c.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_206_a.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_206_b.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_206_c.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_207_a.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_207_b.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_207_c.png delete mode 100644 code/web/api/data/ryzom/interface/rpjobitem_certifications.png delete mode 100644 code/web/api/data/ryzom/interface/rw_autolaunch.png delete mode 100644 code/web/api/data/ryzom/interface/rw_bowgun.png delete mode 100644 code/web/api/data/ryzom/interface/rw_grenade.png delete mode 100644 code/web/api/data/ryzom/interface/rw_harpoongun.png delete mode 100644 code/web/api/data/ryzom/interface/rw_launcher.png delete mode 100644 code/web/api/data/ryzom/interface/rw_pistol.png delete mode 100644 code/web/api/data/ryzom/interface/rw_pistolarc.png delete mode 100644 code/web/api/data/ryzom/interface/rw_rifle.png delete mode 100644 code/web/api/data/ryzom/interface/sapload.png delete mode 100644 code/web/api/data/ryzom/interface/sh_buckler.png delete mode 100644 code/web/api/data/ryzom/interface/sh_large_shield.png delete mode 100644 code/web/api/data/ryzom/interface/small_task_craft.png delete mode 100644 code/web/api/data/ryzom/interface/small_task_done.png delete mode 100644 code/web/api/data/ryzom/interface/small_task_failed.png delete mode 100644 code/web/api/data/ryzom/interface/small_task_fight.png delete mode 100644 code/web/api/data/ryzom/interface/small_task_forage.png delete mode 100644 code/web/api/data/ryzom/interface/small_task_generic.png delete mode 100644 code/web/api/data/ryzom/interface/small_task_guild.png delete mode 100644 code/web/api/data/ryzom/interface/small_task_rite.png delete mode 100644 code/web/api/data/ryzom/interface/small_task_travel.png delete mode 100644 code/web/api/data/ryzom/interface/spe_beast.png delete mode 100644 code/web/api/data/ryzom/interface/spe_com.png delete mode 100644 code/web/api/data/ryzom/interface/spe_inventory.png delete mode 100644 code/web/api/data/ryzom/interface/spe_labs.png delete mode 100644 code/web/api/data/ryzom/interface/spe_memory.png delete mode 100644 code/web/api/data/ryzom/interface/spe_options.png delete mode 100644 code/web/api/data/ryzom/interface/spe_status.png delete mode 100644 code/web/api/data/ryzom/interface/stimulating_water.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_attack.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_config.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_disband.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_disengage.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_extract.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_invite.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_kick.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_move.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_run.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_sit.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_stand.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_stop.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_talk.png delete mode 100644 code/web/api/data/ryzom/interface/tb_action_walk.png delete mode 100644 code/web/api/data/ryzom/interface/tb_animals.png delete mode 100644 code/web/api/data/ryzom/interface/tb_config.png delete mode 100644 code/web/api/data/ryzom/interface/tb_connection.png delete mode 100644 code/web/api/data/ryzom/interface/tb_contacts.png delete mode 100644 code/web/api/data/ryzom/interface/tb_desk_1.png delete mode 100644 code/web/api/data/ryzom/interface/tb_desk_2.png delete mode 100644 code/web/api/data/ryzom/interface/tb_desk_3.png delete mode 100644 code/web/api/data/ryzom/interface/tb_desk_4.png delete mode 100644 code/web/api/data/ryzom/interface/tb_faction.png delete mode 100644 code/web/api/data/ryzom/interface/tb_forum.png delete mode 100644 code/web/api/data/ryzom/interface/tb_guild.png delete mode 100644 code/web/api/data/ryzom/interface/tb_help2.png delete mode 100644 code/web/api/data/ryzom/interface/tb_keys.png delete mode 100644 code/web/api/data/ryzom/interface/tb_macros.png delete mode 100644 code/web/api/data/ryzom/interface/tb_mail.png delete mode 100644 code/web/api/data/ryzom/interface/tb_mode.png delete mode 100644 code/web/api/data/ryzom/interface/tb_mode_dodge.png delete mode 100644 code/web/api/data/ryzom/interface/tb_mode_parry.png delete mode 100644 code/web/api/data/ryzom/interface/tb_over.png delete mode 100644 code/web/api/data/ryzom/interface/tb_support.png delete mode 100644 code/web/api/data/ryzom/interface/tb_team.png delete mode 100644 code/web/api/data/ryzom/interface/tb_windows.png delete mode 100644 code/web/api/data/ryzom/interface/tetekitin.png delete mode 100644 code/web/api/data/ryzom/interface/to_ammo.png delete mode 100644 code/web/api/data/ryzom/interface/to_armor.png delete mode 100644 code/web/api/data/ryzom/interface/to_cooking_pot.png delete mode 100644 code/web/api/data/ryzom/interface/to_fishing_rod.png delete mode 100644 code/web/api/data/ryzom/interface/to_forage.png delete mode 100644 code/web/api/data/ryzom/interface/to_hammer.png delete mode 100644 code/web/api/data/ryzom/interface/to_jewelry_hammer.png delete mode 100644 code/web/api/data/ryzom/interface/to_jewels.png delete mode 100644 code/web/api/data/ryzom/interface/to_leathercutter.png delete mode 100644 code/web/api/data/ryzom/interface/to_melee.png delete mode 100644 code/web/api/data/ryzom/interface/to_needle.png delete mode 100644 code/web/api/data/ryzom/interface/to_pestle.png delete mode 100644 code/web/api/data/ryzom/interface/to_range.png delete mode 100644 code/web/api/data/ryzom/interface/to_searake.png delete mode 100644 code/web/api/data/ryzom/interface/to_spade.png delete mode 100644 code/web/api/data/ryzom/interface/to_stick.png delete mode 100644 code/web/api/data/ryzom/interface/to_tunneling_knife.png delete mode 100644 code/web/api/data/ryzom/interface/to_whip.png delete mode 100644 code/web/api/data/ryzom/interface/to_wrench.png delete mode 100644 code/web/api/data/ryzom/interface/tp_caravane.png delete mode 100644 code/web/api/data/ryzom/interface/tp_kami.png delete mode 100644 code/web/api/data/ryzom/interface/us_back_0.png delete mode 100644 code/web/api/data/ryzom/interface/us_back_1.png delete mode 100644 code/web/api/data/ryzom/interface/us_back_2.png delete mode 100644 code/web/api/data/ryzom/interface/us_back_3.png delete mode 100644 code/web/api/data/ryzom/interface/us_back_4.png delete mode 100644 code/web/api/data/ryzom/interface/us_back_5.png delete mode 100644 code/web/api/data/ryzom/interface/us_back_6.png delete mode 100644 code/web/api/data/ryzom/interface/us_back_7.png delete mode 100644 code/web/api/data/ryzom/interface/us_back_8.png delete mode 100644 code/web/api/data/ryzom/interface/us_back_9.png delete mode 100644 code/web/api/data/ryzom/interface/us_ico_0.png delete mode 100644 code/web/api/data/ryzom/interface/us_ico_1.png delete mode 100644 code/web/api/data/ryzom/interface/us_ico_2.png delete mode 100644 code/web/api/data/ryzom/interface/us_ico_3.png delete mode 100644 code/web/api/data/ryzom/interface/us_ico_4.png delete mode 100644 code/web/api/data/ryzom/interface/us_ico_5.png delete mode 100644 code/web/api/data/ryzom/interface/us_ico_6.png delete mode 100644 code/web/api/data/ryzom/interface/us_ico_7.png delete mode 100644 code/web/api/data/ryzom/interface/us_ico_8.png delete mode 100644 code/web/api/data/ryzom/interface/us_ico_9.png delete mode 100644 code/web/api/data/ryzom/interface/us_over_0.png delete mode 100644 code/web/api/data/ryzom/interface/us_over_1.png delete mode 100644 code/web/api/data/ryzom/interface/us_over_2.png delete mode 100644 code/web/api/data/ryzom/interface/us_over_3.png delete mode 100644 code/web/api/data/ryzom/interface/us_over_4.png delete mode 100644 code/web/api/data/ryzom/interface/w_am_logo.png delete mode 100644 code/web/api/data/ryzom/interface/w_leader.png delete mode 100644 code/web/api/data/ryzom/interface/w_major.png delete mode 100644 code/web/api/data/ryzom/interface/w_pa_anklet.png delete mode 100644 code/web/api/data/ryzom/interface/w_pa_bracelet.png delete mode 100644 code/web/api/data/ryzom/interface/w_pa_diadem.png delete mode 100644 code/web/api/data/ryzom/interface/w_pa_earring.png delete mode 100644 code/web/api/data/ryzom/interface/w_pa_pendant.png delete mode 100644 code/web/api/data/ryzom/interface/w_pa_ring.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_id0.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_id1.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_id2.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_id3.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_id4.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_id5.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_id6.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_id7.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_id8.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_id9.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_shift_id0.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_shift_id1.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_shift_id2.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_shift_id3.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_shift_id4.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_shift_id5.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_shift_id6.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_shift_id7.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_shift_id8.png delete mode 100644 code/web/api/data/ryzom/interface/w_slot_shortcut_shift_id9.png delete mode 100644 code/web/api/data/ryzom/interface/xp_cat_green.png delete mode 100644 code/web/api/data/ryzom/items_db.php delete mode 100644 code/web/api/data/ryzom/ryShapesPs.php delete mode 100644 code/web/api/data/ryzom/sbrick_db.php delete mode 100644 code/web/api/index.php delete mode 100644 code/web/api/player_auth.php delete mode 100644 code/web/api/ryzom_api.php delete mode 100644 code/web/api/server/auth.php delete mode 100644 code/web/api/server/config.php.default delete mode 100644 code/web/api/server/guilds.php delete mode 100644 code/web/api/server/hmagic.php delete mode 100644 code/web/api/server/item_icon.php delete mode 100644 code/web/api/server/scripts/create_guilds_xml.php delete mode 100644 code/web/api/server/scripts/generate_guild_icon.sh delete mode 100644 code/web/api/server/scripts/get_guilds_xml.sh delete mode 100644 code/web/api/server/time.php delete mode 100644 code/web/api/server/user.php delete mode 100644 code/web/api/server/utils.php delete mode 100644 code/web/api/time.php diff --git a/code/web/api/client/auth.php b/code/web/api/client/auth.php deleted file mode 100644 index f47dbd634..000000000 --- a/code/web/api/client/auth.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -require_once(RYAPI_PATH.'client/config.php'); - -// Og (non-ryzom.com) method -function ryzom_authenticate_with_serverkey($cid, $name, $authserver, $authkey) { -} - -// Ig method -function ryzom_authenticate_ingame($cid, $name, $authkey) { - if (isset($_SESSION['user'])) - return true; - - if (ryzom_get_param('user')) - return true; - - return false; -} - -// Session method -function ryzom_authenticate_with_session($name, $redirect) { - if (isset($_SESSION['user'])) - return true; - - if (ryzom_get_param('user')) - return true; - - return false; -} - -?> diff --git a/code/web/api/client/config.php.default b/code/web/api/client/config.php.default deleted file mode 100644 index 6cdbff401..000000000 --- a/code/web/api/client/config.php.default +++ /dev/null @@ -1,20 +0,0 @@ -. - */ - -// Url where player_auth.php is located -define('RYAPI_AUTH_SCRIPT', ''); \ No newline at end of file diff --git a/code/web/api/client/time.php b/code/web/api/client/time.php deleted file mode 100644 index 4b81db42a..000000000 --- a/code/web/api/client/time.php +++ /dev/null @@ -1,46 +0,0 @@ -. - */ - -$tick_cache_timeout = 60; - -function ryzom_time_tick() { - $fn = RYAPI_URL.'data/cache/game_cycle.ticks'; - $handle = fopen($fn, "r"); - $version = fread($handle, 1); - $raw_tick = fread($handle, 4); - fclose($handle); - $arr = unpack("V", $raw_tick); - $tick = $arr[1]; - return sprintf("%u", $tick & 0xffffffff); -} - - -/** - * Takes a computed ryzom time array and returns a SimpleXMLElement - */ -function ryzom_time_xml($rytime) { - global $tick_cache_timeout; - $out = ryzom_time_xml_without_cache($rytime); - $filename = RYAPI_URL.'data/cache/game_cycle.ticks'; - $cache = $out->addChild('cache'); - $cache->addAttribute('created', filemtime($filename)); - $cache->addAttribute('expire', (filemtime($filename)+$tick_cache_timeout)); - return $out; -} - -?> \ No newline at end of file diff --git a/code/web/api/client/user.php b/code/web/api/client/user.php deleted file mode 100644 index b6e906b2c..000000000 --- a/code/web/api/client/user.php +++ /dev/null @@ -1,39 +0,0 @@ -. - */ - -function ryzom_user_get_info($cid) { - if (isset($_SESSION['user'])) - return $_SESSION['user']; - - $user = unserialize(base64_decode(ryzom_get_param('user'))); - $_SESSION['user'] = $user; - return $user; -} - -function ryzom_get_user_id($cid, $name, $creation_date) { - if (isset($_SESSION['user'])) - return $_SESSION['user']['id']; - - $user = unserialize(base64_decode(ryzom_get_param('user'))); - $_SESSION['user'] = $user; - - return $user['id']; -} - - -?> diff --git a/code/web/api/client/utils.php b/code/web/api/client/utils.php deleted file mode 100644 index 62a2de0c8..000000000 --- a/code/web/api/client/utils.php +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/code/web/api/common/actionPage.php b/code/web/api/common/actionPage.php deleted file mode 100644 index 676012146..000000000 --- a/code/web/api/common/actionPage.php +++ /dev/null @@ -1,158 +0,0 @@ -. - */ - -class ryActionClass { - public $classname; - public $instance; - public $args; - public $requires; - - function __construct($classname, $instance, $args, $requires) { - $this->classname = $classname; - $this->instance = $instance; - $this->args = $args; - $this->requires = $requires; - } - -} - -class ryActionPage { - - private static $classesArgs = array(); - private static $myClasses = array(); - private static $aliases = array(); - private static $messages; - private static $haveMessage; - protected static $id; - - public $instanceName; - public $myMethods = array(); - - function __construct() { - } - - function addMethods($child_class) { - if (is_array($child_class)) { - foreach ($child_class as $c_class) - $this->myMethods = array_merge($this->myMethods, get_class_methods($c_class)); - } else { - $this->myMethods = get_class_methods($child_class); - } - } - - static function addClass($name, $classname, $args=array(), $requires=NULL) { - self::$myClasses[$name] = new ryActionClass($classname, NULL, $args, $requires); - } - - static function addAlias($aliasname, $name) { - self::$aliases[$aliasname] = $name; - } - - static function initInstance($listener) { - $i = self::$myClasses[$listener]; - if (!$i->instance) { - // requires - if ($i->requires) { - self::initInstance($i->requires); - } - if ($i->args) - $i->instance = new $i->classname($listener, $i->args); - else - $i->instance = new $i->classname($listener); - $i->instance->addMethods($i->classname); - $i->instance->instanceName = $listener; - - } - return $i->instance; - } - - static function getInstance($listener) { - return self::initInstance($listener); - } - - static function _addMSG($type='OK', $message='') { - self::$messages[] = array($type, $message); - return ''; - } - - function addMSG($type='OK', $action='', $message='') { - self::$messages[] = array($type, $message); - $this->haveMessage = $action; - return ''; - } - - static function getMSGs() { - return self::$messages; - } - - static function call($action, $url_params) { - $action_params = explode('_', $action); - - if (count($action_params) != 2) - return self::_addMSG('ERR', 'Action call error : bad params of ['.$action.']'); - - list($listener, $call) = $action_params; - if (array_key_exists($listener,self::$aliases)) - $listener = self::$aliases[$listener]; - - if (!array_key_exists($listener, self::$myClasses)) - return self::_addMSG('ERR', 'Action call error : class ['. $listener .'] not found'); - - $i = self::initInstance($listener); - - if (in_array('action'.$call, $i->myMethods)) { - $i->haveMessage = NULL; - $ret = call_user_func(array($i, 'action'.$call), $url_params); - if (!isset($_SESSION['last_action']) or $action != $_SESSION['last_action']) - $_SESSION['last_action'] = $action; - $msg = $i->haveMessage; - if ($msg and ($msg != $action)) { - $ret = self::call($msg, $url_params); - return self::_addMSG('OK', $ret); - } - return self::_addMSG('OK', $ret); - } else - return self::_addMSG('ERR', 'Action call error : action ['. $call .'] of ['. $listener .'] not found'); - } -} - -function callAction($action) { - $c = ''; - ryActionPage::call($action, ryzom_get_params()); - $msgs = ryActionPage::getMSGs(); - - foreach ($msgs as $msg) { - if ($msg[0] == 'HEADER') - $c .= $msg[1]; - } - - foreach ($msgs as $msg) { - if ($msg[0] == 'ERR') - $c .= _s('message error', $msg[1]); - else if ($msg[0] == 'MSG') - $c .= _s('message', $msg[1]); - else if ($msg[0] == 'WARNING') - $c .= _s('message warning', $msg[1]); - else if ($msg[0] != 'HEADER') - $c .= $msg[1]; - } - return $c; -} - -?> diff --git a/code/web/api/common/auth.php b/code/web/api/common/auth.php deleted file mode 100644 index 83c92c70c..000000000 --- a/code/web/api/common/auth.php +++ /dev/null @@ -1,153 +0,0 @@ -. - */ - - -function ryzom_app_authenticate(&$user, $ask_login=true, $welcome_message='', $webprivs=true) { - $name = ryzom_get_param('name'); - $urluser = ryzom_get_param('user'); // user serialization send by auth server - $urlusercheksum = ryzom_get_param('checksum'); // user serialization checksum - $authkey = ryzom_get_param('authkey'); // InGame authkey - $lang = ryzom_get_param('lang'); - $cid = intval(ryzom_get_param('cid')); - $is_auth_ingame = false; - // we have to set the $user['lang'] even for anonymous user or we cannot display the test in the right langage - if($lang == '') { - if (!isset($_SESSION['lang'])) { - $l = isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])?substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2):'en'; - if ($l=='fr'||$l=='en'||$l=='de'||$l=='ru'||$l=='es') - $lang = $l; - else - $lang = 'en'; - } else - $lang = $_SESSION['lang']; - } - if ($lang!='fr'&&$lang!='en'&&$lang!='de'&&$lang!='ru'&&$lang!='es') - $lang = 'en'; - - $user['message'] = ''; - $user['lang'] = $lang; - $user['groups'] = array(); - - if ((isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'Ryzom')) || ryzom_get_param('ig')) - $user['ig'] = true; - else - $user['ig'] = false; - - if (isset($_SESSION['user'])) { - if (ryzom_get_param('action') == 'logout') - unset($_SESSION['user']); - else { - $_SESSION['user']['ig'] = $user['ig']; - define('RYZOM_IG', $user['ig']); - $user = $_SESSION['user']; - return true; - } - } - - if ($urluser && $urlusercheksum) { - // Check $authuser (used to test app from another server ingame) - if (hash_hmac('sha1', $urluser, RYAPI_AUTH_KEY) == $urlusercheksum) { - $ig = $user['ig']; - $user = array_merge($user, unserialize(base64_decode($urluser))); - $user['ig'] = $ig; - if (!isset($user['groups'])) - $user['groups'] = array(); - define('RYZOM_IG', $user['ig']); - $_SESSION['user'] = $user; - return true; - } - } - - if ($user['ig']) { - // Ingame - $shardid = ryzom_get_param('shardid'); - $error_message = ''; - if (ryzom_authenticate_ingame($shardid, $cid, $name, $authkey) || ryzom_authenticate_with_session($name, $cid, $error_message)) { - $is_auth_ingame = true; - } - } else { - // Outgame or bad ingame auth (external server) : Use session - $error_message = ''; - if (!ryzom_authenticate_with_session($name, $cid, $error_message)) { - define('RYZOM_IG', false); - if ($ask_login) { - - if ($error_message) - $c = '

    '._t($error_message).'

    '; - else - $c = ''; - if (!$welcome_message) - $welcome_message = 'The application '._t(APP_NAME).' require authentication. Please enter your credentials'; - - $c .= '
    '.$welcome_message.'

    '; - - if ($user['message']) - $c .= '
    '._t($user['message']).'

    '; - $c .= ryzom_render_login_form($name, false); - echo ryzom_app_render(_t('app_'.APP_NAME), $c); - exit; - } - return false; - } - } - - $_SESSION['lang'] = $lang; - - define('RYZOM_IG', $user['ig']); - // get user informations - $ig = $user['ig']; - $user = ryzom_user_get_info($cid, $webprivs, RYAPI_USE_PLAYER_STATS); - - if (isset($user['creation_date'])) - $user['id'] = ryzom_get_user_id($cid, $user['char_name'], $user['creation_date'], $user); - - $user['gender'] = ryzom_get_user_gender($user['id']); - - $user['ig'] = $ig; - $user['lang'] = $_SESSION['lang']; - if (!isset($user['groups'])) - $user['groups'] = array(); - - if ($is_auth_ingame && $user['last_played_date'] != '0') - $user['auth_ig'] = true; - else - $user['auth_ig'] = false; - - if (!isset($_SESSION['translater_mode']) || ryzom_get_param('translate_this') == '0') - $_SESSION['translater_mode'] = false; - - // Set/unset translation mode - if (in_array('WTRS', $user['groups']) && ryzom_get_param('translate_this') == '1') - $_SESSION['translater_mode'] = true; - - $user['translation_mode'] = $_SESSION['translater_mode']; - -// $user['after_merge'] = $user['uid'] >= 671686; - - ryzom_unset_url_param('translate_this'); - - if (isset($user['last_played_date'])) - $_SESSION['last_played_date'] = $user['last_played_date']; - // don't send this informations to external apps - unset($user['last_played_date']); - unset($user['creation_date']); - return true; -} - -?> diff --git a/code/web/api/common/bbCode.php b/code/web/api/common/bbCode.php deleted file mode 100644 index b1597d5b5..000000000 --- a/code/web/api/common/bbCode.php +++ /dev/null @@ -1,998 +0,0 @@ -. - */ - -// setup bbCode formatter - -bbCode::$ig = RYZOM_IG; - -/** - * Image proxy - */ -if(!defined('IMG_PROXY')){ - $url = 'http://'.$_SERVER['HTTP_HOST'].'/app_forum/tools/imageproxy.php'; - define('IMG_PROXY', $url); -} -if (!function_exists('proxy_image_url')) { - function proxy_image_url($href, $attrs=''){ - return IMG_PROXY.'?'.($attrs != '' ? $attrs.'&' : '').'url='.urlencode($href); - } -} - - -abstract class bbCodeParser { - - /** - * @var bool - */ - private $_ig; - - /** - * @var array - */ - private $tags_ignore; - private $tags_block_open; - private $tags_block_close; - private $tags_ignore_depth; - - /** - * @var array - */ - private $open_tags; - - /** - * @var string - */ - private $last_closed_tag; - - /** - * @var int - */ - private $current_tag; - - /** - * @var array - */ - private $state; - - /** - * @param bool $ig if true, use ingame markup - */ - function __construct($ig) { - $this->_ig = $ig; - - // ignore bbcode between these tags - $this->tags_ignore = array( - 'noparse', 'code', - 'url', 'img', 'mail', 'page', 'forum', 'topic', 'post', 'wiki', 'time', 'date' - ); - - // these create block level html code, so '\n' or ' ' or '\t' around them needs to be cleared - $this->tags_block_open = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'quote', 'list', 'p'); - $this->tags_block_close = $this->tags_block_open; - if ($this->_ig) { - // ingame

    is not block level when closing, so dont strip there - $key = array_search('p', $this->tags_block_close, true); - unset($this->tags_block_close[$key]); - } - - $this->state = array(); - - // reset internals - $this->reset(); - } - - /** - * Format bbcode tag - * - * @param string $tag tag name - * @param string $open open markup - * @param string $close close markup - * @param string $attr tag attributes - * @param string $text text between tags - */ - abstract function format($tag, $open, $close, $attr, $text); - - /** - * Wrapper to call Child->format(...) - * - * @param array $tag assoc array with tag info - * @return string - */ - function handle_tag($tag) { - return $this->format($tag['tag'], $tag['open'], $tag['close'], $tag['attr'], $tag['text']); - } - - /** - * Reset internals - */ - function reset() { - $this->current_tag = 0; - $this->tags_ignore_depth = 0; - - // 0'th position is used as result - $this->open_tags = array( - 0 => array('tag' => '', 'open' => '', 'close' => '', 'attr' => '', 'text' => '') - ); - - $this->last_closed_tag = false; - } - - /** - * Save working state - */ - private function _state_save() { - $this->state[] = array($this->current_tag, $this->tags_ignore_depth, $this->open_tags, $this->last_closed_tag); - $this->reset(); - } - - /** - * Restore working state - */ - private function _state_restore() { - if (!empty($this->state)) { - list($this->current_tag, $this->tags_ignore_depth, $this->open_tags, $this->last_closed_tag) = array_pop($this->state); - } - } - - /** - * Main worker. Parse $text for bbCode tags - * - * NOTE: Text must already be safe for HTML, ie. treated with htmlspecialchars() - * - * @param string $text - * @return string formatted string - */ - function bbcode($text) { - $text = str_replace("\r\n", "\n", $text); - - $split = preg_split('/(\[[a-zA-Z0-9_\/]*?(?:[= ].*?)?\])/', $text, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - - foreach ($split as $chunk) { - if (substr($chunk, 0, 1) == '[' && substr($chunk, -1, 1) == ']') { - if (substr($chunk, 0, 2) == '[/') { - $this->close($chunk); - } else { - $this->open($chunk); - } - } else { - $this->text($chunk); - } - } - - return $this->result(); - } - - /** - * Push tag with args to stack - * Do not strip whitespace because tag might be invalid - * - * @param string $chunk full tag string, eg. [tag=attr] - */ - function open($chunk) { - list($tag, $attr) = $this->split_params($chunk); - - // test for [noparse] - if ($this->tags_ignore_depth > 0) { - $this->text($chunk); - } else { - $this->current_tag++; - // remember tag, attributes and complete string that was used in markup - $this->open_tags[$this->current_tag] = array('tag' => $tag, 'attr' => $attr, 'open' => $chunk, 'close' => '', 'text' => ''); - } - - if (in_array($tag, $this->tags_ignore)) { - $this->tags_ignore_depth++; - } - } - - /** - * Close tag and call tag handler to format output - * - * @param $chunk full tag string, eg. [/tag] - */ - function close($chunk) { - // extract tag name from [/name] - $tag = strtolower(substr($chunk, 2, -1)); - - if ($this->tags_ignore_depth > 0 && in_array($tag, $this->tags_ignore)) { - $this->tags_ignore_depth--; - } - - // stack underrun - if ($this->current_tag < 0) { - $this->text($chunk); - return; - } - - // ignore block - if ($this->tags_ignore_depth > 0) { - $this->text($chunk); - return; - } - - // tag mismatch - if ($this->open_tags[$this->current_tag]['tag'] !== $tag) { - // try to find first open tag for this - $key = false; - for ($i = $this->current_tag - 1; $i > 0; $i--) { - if (isset($this->open_tags[$i]['tag']) && $this->open_tags[$i]['tag'] === $tag) { - $key = $i; - break; - } - } - if ($key === false) { - $this->text($chunk); - return; - } - - // tag is open so we need to 'rewind' a bit - for ($i = $this->current_tag; $i > $key; $i--) { - $tmp_tag = $this->pop_stack(); - $this->text($tmp_tag['open'] . $tmp_tag['text']); - } - } - - // close tag - $open = $this->pop_stack(); - - // handle bbcode - $open['close'] = $chunk; - - $block_level = false; - if (in_array($tag, $this->tags_block_open)) { - $block_level = true; - // for block level element, trim whitespace from inside tag - // [tag]...text...[/tag] - $open['text'] = $this->trim_ws($open['text']); - } - $result = $this->handle_tag($open); - - // strip whitespace from text before tag 'text...[tag]' - if ($block_level) { - $ts = $this->rtrim_ws($this->open_tags[$this->current_tag]['text']); - $this->open_tags[$this->current_tag]['text'] = $ts; - } - - $this->text($result); - - $this->last_closed_tag = $open['tag']; - } - - function text($text) { - // strip whitespace after closing '[/tag]...text' - if (in_array($this->last_closed_tag, $this->tags_block_close)) { - $text = $this->ltrim_ws($text); - } - $this->open_tags[$this->current_tag]['text'] .= $text; - - $this->last_closed_tag = false; - } - - function result() { - // close tags that are still open - while ($this->current_tag > 0) { - $open = $this->pop_stack(); - - if ($this->tags_ignore_depth > 0) { - $this->tags_ignore_depth--; - // need to reparse text that's after ignore tag - $this->_state_save(); - $text = $open['open'] . $this->bbcode($open['text']); - $this->_state_restore(); - } else { - // tag was not closed proprely, include start tag with result - $text = $open['open'] . $open['text']; - } - - $this->text($text); - }; - - return $this->open_tags[0]['text']; - } - - /** - * Pop tag and text from stack and return them - * - * @return array [0] = tag, [1] = text - */ - function pop_stack() { - // remove from stack - $open = $this->open_tags[$this->current_tag]; - unset($this->open_tags[$this->current_tag]); - $this->current_tag--; - - return $open; - } - - /** - * Trim from end of string - * 'text...\s{0,}\n{1}\s{0,}' - * - * @param string $ts - * @return string - */ - function rtrim_ws($ts){ - // we want to get rid of all spaces/tabs, but only single \n, so rtrim($ts, " \t\n\r") would not work - $ts = rtrim($ts, " \t"); - if (substr($ts, -1, 1) === "\n") { - $ts = substr($ts, 0, -1); - $ts = rtrim($ts, " \t"); - } - return $ts; - } - - /** - * Trim from start of string - * '\s{0,}\n{1}...text' - * - * @param string $ts - * @return string - */ - function ltrim_ws($ts){ - // we want to get rid of all spaces/tabs, but only single \n, so ltrim($ts, " \t\n\r") would not work - $ts = ltrim($ts, " \t"); - if (substr($ts, 0, 1) === "\n") { - $ts = substr($ts, 1); - } - return $ts; - } - - /** - * Trim from both sides - * '\s{0,}\n{1}...text...\s{0,}\n{1}\s{0,} - * - * @param string $ts - * @return string - */ - function trim_ws($ts){ - $ts = $this->ltrim_ws($ts); - $ts = $this->rtrim_ws($ts); - return $ts; - } - - /** - * Extract tag parameters from [tag=params] or [tag key1=val1 key2=val2] - * - * @param type $tag - * @return type - */ - function split_params($chunk) { - if (substr($chunk, 0, 1) == '[') { - $b = '\['; - $e = '\]'; - } else { - $b = ''; - $e = ''; - } - // [1] [2] [3] - if (preg_match('/^' . $b . '([\*a-zA-Z0-9]*?)' . '(=| )' . '(.*?)' . $e . '$/', $chunk, $match)) { - $tagName = strtolower($match[1]); - if ($match[2] == '=') { - // = means single parameter - $tagParam = $match[3]; - } else { - // means multiple parameters - $tagParam = array(); - $args = preg_split('/[ ]/', $match[3], null, PREG_SPLIT_NO_EMPTY); - foreach ($args as $arg) { - $pairs = explode('=', $arg); - // preg_replace will remove possible quotes around value - if (isset($pairs[1])) { - $tagParam[strtolower($pairs[0])] = preg_replace('@("|\'|)(.*?)\\1@', '$2', $pairs[1]); - } else { - $tagParam[] = preg_replace('@("|\'|)(.*?)\\1@', '$2', $pairs[0]); - } - } - } - } else { - if (substr($chunk, 0, 1) == '[' && substr($chunk, -1, 1) == ']') { - $chunk = substr($chunk, 1, -1); - } - $tagName = strtolower($chunk); - $tagParam = ''; - } - return array($tagName, $tagParam); - } - -} - -class bbCode extends bbCodeParser { - static $legacy_sync = 1348956841; - static $legacy_shard = array( - 'ani' => 2363920179, - 'lea' => 2437578274, - 'ari' => 2358620001, - ); - - static $ig = false; - static $timezone = 'UTC'; - static $clock12h = false; - static $shardid = false; - static $lang = 'en'; - static $disabledTags = array(); - // - const COLOR_P = '#d0d0d0'; // normal text - // - const COLOR_BBCODE_TAG = '#444444'; - - static function bbDisabled($tag) { - return in_array(strtolower($tag), self::$disabledTags); - } - - static function getFontSize($value) { - $size = 16; - switch (strtolower($value)) { - case '1': case 'xx-small': $size = 9; break; - case '2': case 'x-small' : $size = 10; break; - case '3': case 'small' : $size = 13; break; - case '4': case 'medium' : $size = 16; break; - case '5': case 'large' : $size = 18; break; - case '6': case 'x-large' : $size = 24; break; - case '7': case 'xx-large': $size = 32; break; - //case '8': case 'smaller' : break; - //case '9': case 'larger' : break; - } - return $size; - } - - static function bb_noparse($code) { - return preg_replace(array('/\[/', '/\]/'), array('[', ']'), $code); - } - - static function bb_code($code) { - return '

    ' . self::bb_noparse($code) . '
    '; - } - - static function bb_list($list) { - $result = ''; - $list = str_replace("\n[", '[', $list); - $result = '
      ' . preg_replace('/\s*\[\*\]\s*/is', "
    • ", $list) . '
    '; - return preg_replace('#

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 literal 0 HcmV?d00001 diff --git a/code/web/api/data/img/bordure.png b/code/web/api/data/img/bordure.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8da76f69ca01e8520c5d52c9536dd9429031df GIT binary patch literal 3920 zcmdVc`8!no8wc=%k8Lco82c_`-!if#`xyI9cCwAJXKW!RvPQP-TS$a#J(Oh#Ng`X4 zQi+y_62hZI`c8kw_r6}|eeUbNuFv&3Kiof@OlwO#8;lPIK@gjXv7s&XE%di%qN8SJ zt3m?=!8C{l2G-UAVUb~^fUs~869WU0@Q5&fVz3_s8IM;L$JpDyEWWJ|_BHMg8M60WS5Ldc4H8oY8y?hJK| zS)M}AOjaphiJU(V#(z*s4>_5saUq{g`$(>F)VQMFp$;yV?3r)LxkBn`K-a@6TQW;_jbo-`bDo`5>>U%)onl*W}w^7S&*x*kkk;F@@GKJSj zf40?r6NVesFew!~8q*l5tJA1mEccH`GpL(1G{&?td5lkW1=k@1FNRjKd^iYw$p141 zfnau|<1z+!$nY**p(Oy*JH5nwKn}EK5;lNolT)YvTPSq{&>B z-lm%}>mI;bo|c&YZkWkD`A!F_m7af;m3rS5gZB>Mv;z#&sVwgW!!d6l;ncJ5_jb+)i+=C z*rvM48qLzp&@JSU+-xLh6m>JsM$N{j$$0^LM4oi-`$E=5ggoAZAb@JC>;myLRN?mAs=6v7SMAIHI;2+(2KNY_9KuQ2!lH2l7aJXuiZB^nTORV&O#5;!VT*3#^PQy>51ho^* zMA{+UJc$5~O(xN+;v*9JnA)Q7{2lU6fw6cq@^0o8Lxqc{Itya6W6RWy63hxjH}c(# z=fp*cj2nmzfenQXOquzj*x7>mC$zil5!gf8L*!u&z>OG>m?g`1>eU(58F(A7^@@Ag z+Rd9pbo;jXrha6e_*#Iqjg^*{=9a#_5O;^~PND57Thct5Xh%%iu-`y!oSHv>tI@YZ z*+n^2Ik=3rEJc~y_pvk+u4+yHf{m&jAN3%IJ*z{-7o0^Mm)%f3yEVbj&$nbEZNh(Y z@kw>DV1uZNd^xv#s-x*yOa9vw*Sdcm5t#`S2bjBNX~k2M@wk%4_KGT&)|Kvi)Ma+|b&9Gs{(^G&0G4k!Fx?bI@v9YFBT( z)%vmaMw@*@q#n_z?Dl3;xDVA59)-1KO}*#uS&=-< zTxH#YS{xe}Z}e35lti~hUpt@^?7E&Z%~!=x<=V&No)+4*rTvyauA@5Dqs}AeUDRc# z72BGYA*-ZWD8wt|AvQpX=d?JlCa*tV56^Ypx$K0T-5kxFYW^S|Jny#h7WO2-`$B>D zd_csC{o{pYm6d;%_hYcVfw}psr zpDI7)OpbqB*es3yFS`C9^2q6k?x3E%ncX~{A$|P%m+Qgf65}S4?v3J&^_DYL7L|w7 z-=_BzR29CuP4|km3AN$c=t7l4YeQdz=DvCHhU1Ov8^Sp`t;M*?J;V54v0J+W-)(oj zFP({h7Uz1YeQ)bO(L-=#f24KrV(-&Y^wDtQyTtzALanoI!>)51@MFqx%#jZ3EV~oO zj*p0hl1PWdj!7QT+QZsY38OCY(|G4A;@`aayrWvp+L766rHPL9j?W#3;V*Z(cIKEq zWJDofigAkd=DXW0HFY%IZt5)xmHp9LnbDJ>kS*lVK#_@mQS<`VV&_-W-FrESi|Gn)gLEz3NBHIPl>OHDI32wQa9>@f)_WP zv6DYm)%bVdHLoU(j3z3R^1&t76u@~Jpy`(XL4jisWZOj5U`|4dPqA7@lNb9`z%UiPwV zf3r$+v?Hb6vUSk?gWGe*7N>qnbfR$l%538J@4Hc^QDaft?BVb?cYZW&2h0XGsb^@E zUfMD7aq?NYpB+|FfiBOg&=yz|8W%PPOtbGF@vz6PEN zz8hBG%_&Sbes#P$QTXWh&c&J!=OlR~U6N*xYkR8ZJr-!9K1NPOOGICf#znJL?`yw$ z9(q27|wKAXi&4T0({g2^*-EF@& z_ORfnf#tI0WrE_eyLQyr=cf}b*)3Hs<=Uh6UH9+*@%?UhME;~Z9@X;IU9B}N60RVu zh5e`$d2;*fGqd{xq3->ZwS)KJ>pNBX>-lqMH_zI|*li6yD7h52dh(cYoe>9b5OUPA zO<35uw>1+|UtHff?l%5Qm{Dg?XPPhR!0fT&wj``Nug2cI*<97C%%ZA1x@PcuG*Dvs(17n{hzVM6*G^gLt6WRuUe{m$-Ve?J5R+aZc2U< z>8JdMkd^+Om_iok?apmko%O`^ll8st!;K48H7E3RrF+MHkJg_<5FKP~ZjYn>Qv!$) z&@cg7W)GBLIvF30OD)D-y7x04oPzr}k*Tjs|c}fS}?62yTGl0VrO; z!3WU10L=$D`2ku0a8U^YZXv)U%)%vr9mc2x-QVr z1Dbl^tUfqv0L~hMb2y+)WdyYGY}C0fo=(pc=$Qa&>YD(4Q($Nga2CMG5*S$lyfrYk z0VcMV%#_6E*A zz{Ll+`T|!!;N}b5sOb+ps0ehP0pKqp@S+L?KEc2*1o(vk|1dzf2#67YNCJUWksu@n zgv8R35DYv{S3Z5ODPGpfO*A-(a zOA)g?X%x3b97Z}0l3*9k3S@Ms@j!AT11gkt;z^F&0k-n-=lFfkaJWMf=!=Dt0%<-x z#HKV&a=$GI9!T52tp~@JHcnw;a)&#{2iGZHSzoJz(cIYpw4l|%Rt{?$5| z>;Ps)j7zEq7j%_~whrO-t2nQjoGly@#K|sFTp+BIf6*x_!T^ne)DSf6rx{?nDyQ@$ zft&z6J)O8Af>uBqE6qX&7@&cNBM&LV5Bn%X{gh$K(8$OLrGI#sGC&!8I6N|}@hj(D Ts^F;c-%T{ZSsJ$KdnNx53@$mU literal 0 HcmV?d00001 diff --git a/code/web/api/data/img/lang/de.png b/code/web/api/data/img/lang/de.png index 767abe088625c523ca3c3114faa767f325823330..787c68830005c33093765d89bd57d82ba9eaac20 100644 GIT binary patch literal 736 zcmV<60w4W}P)pF8gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900LY|L_t(IPsP(+OH*+G$ML-py$HLgltYSEIx}^1%uPZkflBy5 z$;78(Dmi3>X_$zTDN4#TXVbPcO>2o%FCd5riYPNg%+#fGPtEzjxBs>m(1jOW{LVQX z_O}IasFE=Au=nqg7o*n=dCXFP$sdX=G)c7nA-unM#$;($e$j78hr6 zxn@{ca4T}`;6f>23`z(oY|^YQ2AMzJR)h26wN zekYv9XTHUgNZ@rOFl!gMK8DN7W4N%8fLe_&CkJmv2ASp(nInNpP){z^V@4iU#kp63^F6cD`J|{Yhf$;~6$ToMPjB9G=yBMmi#aafyQ+ zD`EGr*Z})meT05>6a3jpaNR;+&5VE5i0?-W-W3CT-y88P*W&qBgH?RJ>{+jbt6Sp5 zU5SNz64Pc0r+oAKh(LZ(9#_LLviy^OfQ(f-{$^N44!5?rOG_RU%-yEHJq(AXws T{e`}CpluAEu6{1-oD!MPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0006+Nkl5XaAB54}i*g%3Ri z#in6wrGhMGhJp#znkkE}X@-ba=0jv{?xq!f;a4Au8k%94r5UM#nX)Nak)p0qDj^YU z5Oh`+EYoH;$8{e$lk!7q}Mj zWT;A1Q}*gv-4nV-AoJ~D6tC)^vo)vzqqz&QDF<=j#1rm!`KJEIYTjRAJJ$3j4b`-hxrIO`E7_x%|p~3${;$sm4MxiY}{GPh8`8G5hlTTO_q3;r}vuS^V*ThRO#h^RC|200000NkvXX Hu0mjfj3!K^ literal 396 zcmV;70dxL|P)3ZN00004b3#c}2nYxW zdZ z5NuN0Yay1Y4w6=aRf>S6*eC%Z90%dX;!HvsVPkG!c*C;qW7uNpbaYoPE2`BbNbUPS zISgf^MAD^-}V7G(m zG@TMK8bNc9rE=!D4nUy*y&lZxu-T+%;q5)`>YFVX=PMWk-7fU|Y1?!4t8t|Q+by^* z#PPB5!z*q3r@*{lUg^|@3-f`?r#)EGN$_7~RIg_Qp3O1=yDXPkaI*s&tyWJs&h@`i qljIo%!BCzTfB!n?+Vf%s!SDdn9N~#_&bqn)0000pF8gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900IR`L_t(IPsNi>YZFlzMzb%dP&ai^g{n|3tquL4wILWnYfPyP zNl5}NtwLKO6cvl57W@VJ6I|<3H*Q1_T)A?(p6T0D;4BC|MN;)YXY6>rPx*JAx&cf-cmBA3{y(ZFy&>jlaE(zqN(Gxruk{ zHr~bttz3@Q>MHKa3eCkuoOBvHnZ%l#qw+W49{%z&zP#XPvv{c#ULrwjb{2PLhGry! zGZn%fAIBOVrZF&p6^rq$9pDA5Gtau!2dYXoe&X4{8mxYp06m|vG js>DD1gMZs2b(@o00000NkvXXu0mjfuhtbo literal 0 HcmV?d00001 diff --git a/code/web/api/data/img/lang/fr.png b/code/web/api/data/img/lang/fr.png index 420474693051769ae7a934b0abe46bbf5feee08c..60ed561d4f39c3520239d77c1dd948e22977796e 100644 GIT binary patch literal 675 zcmV;U0$lxxP)pF8gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900JLLL_t(IPsNixPg7wShR@~?aPS8>JG$!N;74LG8XFMdmp{4D1dEOUGNE|yj z+~ajU_w&4Y6+mexZNXx&a`S0~?dg9KB9TZCi^YgWqlCj@0)YU*U=U-cLV1TmK~cz= z$(WIX&yk{xFQoG^SfJT#(r7ef>h(IcT8(P8N^|THjnNS{9^R$)V3_2VAY5eri^|+` zj(5Hc#bOa%*C`YVflw@`@31cH$+?tMkDyX>k^(Z;kQd^%H^_z zw@Wgaj0yK(^mS9|wO|Yn@Jk48JPxrG(3tsT!i#BMEhH(GN}DZY0}WMG5dx#nN~Py4 zrS2}uL%l?Wz&5gq_gmhCe=}*qFFk7*h9O%BiAZaevQ5C9=;w}6ymf_$5LoZ8@cygH zBW?Jyfqx2I4@kWt!HdWM165Y{n`aIo5h4rp_=O~3&H-&9`>Ghv8QXA-5syl zb&5MMGwXCRH8q99;b44xT<$Dti^&3(f_6TV{0skG@CO0`4|2m%YCr%0002ov JPDHLkV1mp}FXI3J literal 2889 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 diff --git a/code/web/api/data/img/lang/ru.png b/code/web/api/data/img/lang/ru.png index 53aaf57be4dab480ddd03e66d93f7977186a3b41..281cf66f2f517cd6edc4dd8f8aa6b6e13be4b122 100644 GIT binary patch literal 646 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 diff --git a/code/web/api/data/js/combobox.js b/code/web/api/data/js/combobox.js new file mode 100644 index 000000000..0a9440909 --- /dev/null +++ b/code/web/api/data/js/combobox.js @@ -0,0 +1,17 @@ + +function comboInit(thelist) +{ + theinput = document.getElementById(theinput); + var idx = thelist.selectedIndex; + var content = thelist.options[idx].value; + if(theinput.value == "") + theinput.value = content; +} + +function combo(thelist, theinput) +{ + theinput = document.getElementById(theinput); + var idx = thelist.selectedIndex; + var content = thelist.options[idx].value; + theinput.value = content; +} diff --git a/code/web/api/data/js/jquery-1.7.1.js b/code/web/api/data/js/jquery-1.7.1.js new file mode 100644 index 000000000..8ccd0ea78 --- /dev/null +++ b/code/web/api/data/js/jquery-1.7.1.js @@ -0,0 +1,9266 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context ? context.ownerDocument || context : document ); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.7.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.add( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.fireWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).off( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery.Callbacks( "once memory" ); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array, i ) { + var len; + + if ( array ) { + if ( indexOf ) { + return indexOf.call( array, elem, i ); + } + + len = array.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in array && array[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +// String to Object flags format cache +var flagsCache = {}; + +// Convert String-formatted flags into Object-formatted ones and store in cache +function createFlags( flags ) { + var object = flagsCache[ flags ] = {}, + i, length; + flags = flags.split( /\s+/ ); + for ( i = 0, length = flags.length; i < length; i++ ) { + object[ flags[i] ] = true; + } + return object; +} + +/* + * Create a callback list using the following parameters: + * + * flags: an optional list of space-separated flags that will change how + * the callback list behaves + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible flags: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( flags ) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function( args ) { + var i, + length, + elem, + type, + actual; + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + // Inspect recursively + add( elem ); + } else if ( type === "function" ) { + // Add if not in unique mode and callback is not in + if ( !flags.unique || !self.has( elem ) ) { + list.push( elem ); + } + } + } + }, + // Fire callbacks + fire = function( context, args ) { + args = args || []; + memory = !flags.memory || [ context, args ]; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { + memory = true; // Mark as halted + break; + } + } + firing = false; + if ( list ) { + if ( !flags.once ) { + if ( stack && stack.length ) { + memory = stack.shift(); + self.fireWith( memory[ 0 ], memory[ 1 ] ); + } + } else if ( memory === true ) { + self.disable(); + } else { + list = []; + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + var length = list.length; + add( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if ( memory && memory !== true ) { + firingStart = length; + fire( memory[ 0 ], memory[ 1 ] ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for ( ; argIndex < argLength ; argIndex++ ) { + for ( var i = 0; i < list.length; i++ ) { + if ( args[ argIndex ] === list[ i ] ) { + // Handle firingIndex and firingLength + if ( firing ) { + if ( i <= firingLength ) { + firingLength--; + if ( i <= firingIndex ) { + firingIndex--; + } + } + } + // Remove the element + list.splice( i--, 1 ); + // If we have some unicity property then + // we only need to do this once + if ( flags.unique ) { + break; + } + } + } + } + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + if ( list ) { + var i = 0, + length = list.length; + for ( ; i < length; i++ ) { + if ( fn === list[ i ] ) { + return true; + } + } + } + return false; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory || memory === true ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( stack ) { + if ( firing ) { + if ( !flags.once ) { + stack.push( [ context, args ] ); + } + } else if ( !( flags.once && memory ) ) { + fire( context, args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!memory; + } + }; + + return self; +}; + + + + +var // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + + Deferred: function( func ) { + var doneList = jQuery.Callbacks( "once memory" ), + failList = jQuery.Callbacks( "once memory" ), + progressList = jQuery.Callbacks( "memory" ), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList + }, + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function() { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function( doneCallbacks, failCallbacks, progressCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); + return this; + }, + always: function() { + deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); + return this; + }, + pipe: function( fnDone, fnFail, fnProgress ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ], + progress: [ fnProgress, "notify" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + obj = promise; + } else { + for ( var key in promise ) { + obj[ key ] = promise[ key ]; + } + } + return obj; + } + }, + deferred = promise.promise({}), + key; + + for ( key in lists ) { + deferred[ key ] = lists[ key ].fire; + deferred[ key + "With" ] = lists[ key ].fireWith; + } + + // Handle state + deferred.done( function() { + state = "resolved"; + }, failList.disable, progressList.lock ).fail( function() { + state = "rejected"; + }, doneList.disable, progressList.lock ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = sliceDeferred.call( arguments, 0 ), + i = 0, + length = args.length, + pValues = new Array( length ), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( deferred, args ); + } + }; + } + function progressFunc( i ) { + return function( value ) { + pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + deferred.notifyWith( promise, pValues ); + }; + } + if ( length > 1 ) { + for ( ; i < length; i++ ) { + if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return promise; + } +}); + + + + +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + marginDiv, + fragment, + tds, + events, + eventName, + i, + isSupported, + div = document.createElement( "div" ), + documentElement = document.documentElement; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
a"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( window.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.style.width = "2px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + fragment.removeChild( div ); + + // Null elements to avoid leaks in IE + fragment = select = opt = marginDiv = div = input = null; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, outer, inner, table, td, offsetSupport, + conMarginTop, ptlm, vb, style, html, + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + conMarginTop = 1; + ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; + vb = "visibility:hidden;border:0;"; + style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; + html = "