<?php

$microstart = explode(' ',microtime());
$start_time = $microstart[0] + $microstart[1];

error_reporting(E_ALL ^ E_NOTICE);
ini_set("display_errors","1");

define('APP_NAME', 'app_achievements_admin');

require_once('../config.php');
include_once('../lang.php');
include_once('lang.php');
require_once('conf.php');

// Ask to authenticate user (using ingame or session method) and fill $user with all information
ryzom_app_authenticate($user, true);

#echo var_export($user,true);

/*$user = array();
$user['id'] = 1;
$user['lang'] = 'en';
$user['name'] = 'Talvela';
$user['race'] = "r_matis";
$user['civilization'] = "c_neutral";
$user['cult'] = "c_neutral";
$user['admin'] = true;*/

require_once($_CONF['app_achievements_path']."class/RyzomUser_class.php");
require_once("class/RyzomAdmin_class.php");
$_ADMIN = new RyzomAdmin($user);

if($_ADMIN->isIG()) {
	die("IG disabled for admin tool!");
}

require_once("class/mySQL_class.php");

require_once($_CONF['app_achievements_path']."include/ach_render_common.php");

require_once($_CONF['app_achievements_path']."class/DLL_class.php");
require_once($_CONF['app_achievements_path']."class/Node_abstract.php");
require_once($_CONF['app_achievements_path']."class/AVLTree_class.php");
require_once($_CONF['app_achievements_path']."class/Parentum_abstract.php");
require_once($_CONF['app_achievements_path']."class/AchList_abstract.php");
require_once($_CONF['app_achievements_path']."class/Tieable_inter.php");
require_once($_CONF['app_achievements_path']."class/NodeIterator_class.php");
#require_once($_CONF['app_achievements_path']."class/InDev_trait.php");

require_once($_CONF['app_achievements_path']."class/AchMenu_class.php");
require_once($_CONF['app_achievements_path']."class/AchMenuNode_class.php");
require_once($_CONF['app_achievements_path']."class/AchCategory_class.php");
require_once($_CONF['app_achievements_path']."class/AchAchievement_class.php");
require_once($_CONF['app_achievements_path']."class/AchTask_class.php");
require_once($_CONF['app_achievements_path']."class/AchObjective_class.php");
require_once($_CONF['app_achievements_path']."class/AchSummary_class.php");

require_once("class/ADM_inter.php");
#require_once("class/AdmDispatcher_trait.php");
require_once("class/AdmMenu_class.php");
require_once("class/AdmMenuNode_class.php");
require_once("class/AdmCategory_class.php");
require_once("class/AdmAchievement_class.php");
require_once("class/AdmTask_class.php");
require_once("class/AdmObjective_class.php");
require_once("class/AdmAtom_class.php");

#require_once("class/CSRDispatcher_trait.php");
require_once("class/CSR_inter.php");
require_once("class/CSRCategory_class.php");
require_once("class/CSRAchievement_class.php");
require_once("class/CSRTask_class.php");
require_once("class/CSRObjective_class.php");
require_once("class/CSRAtom_class.php");

$DBc = ryDB::getInstance("app_achievements");

function mkn($x) { // make NULL function for SQL
	global $DBc;
	if($x == null || strtolower($x) == "null" || $x == "") {
		return "NULL";
	}
	else {
		return "'".$DBc->sqlEscape($x)."'";
	}
}


$c = "<script type='text/javascript'>

		function hs(id,mod) { // hide / show
			if(document.getElementById(id).style.display == 'none') {
				document.getElementById(id).style.display=mod;
			}
			else {
				document.getElementById(id).style.display='none';
			}
		}

		function hs_force(id,mod,show) { // hide / show forced
			if(show == true) {
				document.getElementById(id).style.display=mod;
			}
			else {
				document.getElementById(id).style.display='none';
			}
		}
</script>

<style>
	h1 {
		margin-top:0px;
	}
</style>

<center><table width='100%'>
	<tr>
		<td valign='top' width='200px'><div style='font-weight:bold;font-size:14px;'>";
		
		if($_ADMIN->isAdmin()) {
			$c .= "<b>Admin</b><br>
			<ul>
				<li><a href='?mode=menu'>menu settings</a></li>
				<li><a href='?mode=ach'>achievement settings</a></li>
				<li><a href='?mode=atom'>trigger settings</a></li>
				<li><a href='?mode=lang'>language editor</a></li>
				<li><a href='?mode=stats'>statistics</a></li>
			</ul><p />";
		}
		if($_ADMIN->isCSR()) {
			$c .= "<b>CSR</b><br>
			<ul>
				<li><a href='?mode=player'>player administration</a></li>
			</ul><p />";
		}


		
$c .= "</div></td>
		<td valign='top'>";

		/*if($_REQUEST['mode'] == "insert_fame" && $_ADMIN->isAdmin()) {
			$ftpl = 'ENTITY fame AS $fame {
	if($fame->faction == ".faction" && ceil($fame->fame/6000) >= [0]) {
		GRANT;
		FINAL ENTITY;
	}
}';

			$res = $DBc->sqlQuery("SELECT at_id,atl_name FROM ach_achievement,ach_task,ach_task_lang WHERE at_achievement=aa_id AND ((aa_category<'24' AND aa_category>'15') OR aa_category='56') AND atl_task=at_id AND atl_lang='en'");

			for($i=0;$i<sizeof($res);$i++) {
				$DBc->sqlQuery("INSERT INTO ach_objective (ao_task,ao_condition,ao_value,ao_display,ao_metalink) VALUES ('".$res[$i]['at_id']."','all',NULL,'hidden',NULL)");
				$nid = $DBc->insertID();
				$DBc->sqlQuery("INSERT INTO ach_atom (atom_objective,atom_mandatory,atom_ruleset) VALUES ('".$nid."','0','".$DBc->sqlEscape(str_replace('[0]',$res[$i]['atl_name'],$ftpl))."')");

				$c .= "INSERT INTO ach_objective (ao_task,ao_condition,ao_value,ao_display,ao_metalink) VALUES ('".$res[$i]['at_id']."','all',NULL,'hidden',NULL)<br>";

				$c .= "INSERT INTO ach_atom (atom_objective,atom_mandatory,atom_ruleset) VALUES ('".$nid."','0','".$DBc->sqlEscape(str_replace('[0]',$res[$i]['atl_name'],$ftpl))."')<p>";
			}
		}

		if($_REQUEST['mode'] == "enable_fame" && $_ADMIN->isAdmin()) {
			$res = $DBc->sqlQuery("SELECT aa_id FROM ach_achievement WHERE (aa_category<'24' AND aa_category>'14') OR aa_category='56'");

			for($i=0;$i<sizeof($res);$i++) {
				$DBc->sqlQuery("UPDATE ach_achievement SET aa_dev='0' WHERE aa_id='".$res[$i]['aa_id']."'");

				$DBc->sqlQuery("UPDATE ach_task SET at_dev='0' WHERE at_achievement='".$res[$i]['aa_id']."'");
			}
		}*/

		/*
		 * translation
		 */
		if($_REQUEST['mode'] == "lang" && $_ADMIN->isAdmin()) {
			$c .= "<h1>Language Editor</h1>";

			$user = array();
			$user['id'] = 0;
			$user['lang'] = 'en';
			$user['name'] = 'Talvela';
			$user['race'] = "matis";
			$user['civ'] = "neutral";
			$user['cult'] = "neutral";

			$_USER = new RyzomUser($user);

			//menu
			require_once("include/adm_render_lang.php");
			$menu = new AdmMenu($_REQUEST['cat']);

			$c .= "<center><table>
			<tr>
				<td valign='top'><div style='width:230px;font-weight:bold;font-size:14px;'>";
			

			$c .= adm_render_menu($menu);
				
			$c .= "</div></td>
					<td width='645px' valign='top'>";
			
			$open = $menu->getOpenCat();

			if($open != 0) {
				$cat = new AdmCategory($open,'%','%','%');

				if($_REQUEST['act'] == "cat_save") {
					if(is_array($_REQUEST['c_name'])) {
						foreach($_REQUEST['c_name'] as $key=>$elem) {
							$cat->setLang($key,$_REQUEST['c_name'][$key]);
						}
					}
				}

				if($_REQUEST['act'] == "ach_save") {
					$ach = $cat->getElementByPath($_REQUEST['id']);

					if(is_array($_REQUEST['a_name'])) {
						foreach($_REQUEST['a_name'] as $key=>$elem) {
							$ach->setLang($key,$_REQUEST['a_name'][$key],$_REQUEST['a_tpl'][$key]);
						}
					}
				}

				if($_REQUEST['act'] == "task_save") {
					$task = $cat->getElementByPath($_REQUEST['id']);

					if(is_array($_REQUEST['t_name'])) {
						foreach($_REQUEST['t_name'] as $key=>$elem) {
							$task->setLang($key,$_REQUEST['t_name'][$key],$_REQUEST['t_tpl'][$key]);
						}
					}
				}

				if($_REQUEST['act'] == "obj_save") {
					$obj = $cat->getElementByPath($_REQUEST['id']);

					if(is_array($_REQUEST['o_name'])) {
						foreach($_REQUEST['o_name'] as $key=>$elem) {
							$obj->setLang($key,$_REQUEST['o_name'][$key]);
						}
					}
				}

				

				$c .= atom_render_category($cat);
			}


			$c .= "</td>
				</tr>
			</table></center>";

		}

		/*
		 * Trigger settings
		 */

		if($_REQUEST['mode'] == "atom" && $_ADMIN->isAdmin()) {
			$c .= "<h1>Trigger Settings</h1>";

			$user = array();
			$user['id'] = 0;
			$user['lang'] = 'en';
			$user['name'] = 'Talvela';
			$user['race'] = "matis";
			$user['civ'] = "neutral";
			$user['cult'] = "neutral";

			$_USER = new RyzomUser($user);

			//menu
			require_once("include/adm_render_atom.php");
			$menu = new AdmMenu($_REQUEST['cat']);

			$c .= "<center><table>
			<tr>
				<td valign='top'><div style='width:230px;font-weight:bold;font-size:14px;'>";
			

			$c .= adm_render_menu($menu);
				
			$c .= "</div></td>
					<td width='645px' valign='top'>";
			
			$open = $menu->getOpenCat();

			if($open != 0) {
				$cat = new AdmCategory($open,'%','%','%');

				if($_REQUEST['act'] == "insert_atom") {
					$obj = $cat->getElementByPath($_REQUEST['id']);
					
					if($obj != null) {
						$atom = new AdmAtom(array(),$obj);
						$atom->setRuleset($_REQUEST['atom_ruleset']);
						$atom->setMandatory($_REQUEST['atom_mandatory']);
						$atom->setObjective($obj->getID());

						$obj->insertNode($atom);
					}
				}

				if($_REQUEST['act'] == "update_atom") {
					$atom = $cat->getElementByPath($_REQUEST['id']);
					
					if($atom != null) {
						$atom->setRuleset($_REQUEST['atom_ruleset']);
						$atom->setMandatory($_REQUEST['atom_mandatory']);

						$atom->update();
					}
				}

				if($_REQUEST['act'] == "delete") {
					$elem = $cat->getElementByPath($_REQUEST['id']);
					$par = $elem->getParent();
					$par->removeNode($elem->getID());
				}

				$c .= atom_render_category($cat);
			}

			$c .= "</td>
				</tr>
			</table></center>";

		}

		/*
		 * Menu settings
		 */

		if($_REQUEST['mode'] == "menu" && $_ADMIN->isAdmin()) {
			$c .= "<h1>Menu Settings</h1>";

			$user = array();
			$user['id'] = 1;
			$user['lang'] = 'en';
			$user['name'] = 'Talvela';
			$user['race'] = "matis";
			$user['civ'] = "neutral";
			$user['cult'] = "neutral";

			$_USER = new RyzomUser($user);

			require_once("include/adm_render_menu.php");
			$menu = new AdmMenu(false);
			
			if($_REQUEST['act'] == "insert") {
				$n = new AdmMenuNode(array(),null);
				$n->setID(null);
				$n->setInDev(true);
				$n->setName($_REQUEST['acl_name']);
				$n->setImage($_REQUEST['ac_image']);
				$n->setParentID($_REQUEST['ac_parent']);

				$menu->insertNode($n);
			}

			if($_REQUEST['act'] == "delete") {
				$menu->removeNode($_REQUEST['ac_id']);
			}

			if($_REQUEST['act'] == "update") {
				$menu->updateNode($_REQUEST['ac_id'],array("acl_name"=>$_REQUEST['acl_name'],"ac_image"=>$_REQUEST['ac_image']));
			}

			if($_REQUEST['act'] == "dev") {
				$curr = $menu->getNode($_REQUEST['ac_id']);
				$curr->setInDev(($_REQUEST['state'] != 1));
			}


			$c .= adm_render_menu($menu);
		}

		/*
		 * Achievement settings
		 */

		if($_REQUEST['mode'] == "ach" && $_ADMIN->isAdmin()) {
			$c .= "<h1>Achievement Settings</h1>";

			$user = array();
			$user['id'] = 0;
			$user['lang'] = 'en';
			$user['name'] = 'Talvela';
			$user['race'] = "matis";
			$user['civ'] = "neutral";
			$user['cult'] = "neutral";

			$_USER = new RyzomUser($user);

			//menu
			require_once("include/adm_render_ach.php");
			$menu = new AdmMenu($_REQUEST['cat']);

			$c .= "<center><table>
			<tr>
				<td valign='top'><div style='width:230px;font-weight:bold;font-size:14px;'>";
			

			$c .= adm_render_menu($menu);
				
			$c .= "</div></td>
					<td width='645px' valign='top'>";
			
			$open = $menu->getOpenCat();

			if($open != 0) {
				if($_REQUEST['cult']) {
					$cult = $_REQUEST['cult'];
					$_SESSION['cult'] = $cult;
				}
				elseif($_SESSION['cult']) {
					$cult = $_SESSION['cult'];
				}
				else {
					$cult = $_USER->getCult();
				}

				if($_REQUEST['civ']) {
					$civ = $_REQUEST['civ'];
					$_SESSION['civ'] = $civ;
				}
				elseif($_SESSION['civ']) {
					$civ = $_SESSION['civ'];
				}
				else {
					$civ = $_USER->getCiv();
				}

				echo $civ.$cult;

				$cat = new AdmCategory($open,$_USER->getRace(),$cult,$civ);

				$microstop = explode(' ',microtime());
				$stop_time = $microstop[0] + $microstop[1];

				echo "<br>loading: ".round($stop_time - $start_time,3);

				$start_time = $stop_time;

				if($_REQUEST['act'] == "ach_move") {
					$ach = $cat->getChildDataByID($_REQUEST['id']);
					if($ach != null) {
						$ach->setCategory($_REQUEST['new_cat']);
						$ach->update();
						$cat->removeChild($ach->getID());

						$iter = $cat->getOpen();
						while($iter->hasNext()) {
							$item = $iter->getNext();

							if($ach->getID() == $item->getParentID()) {
								$item->setCategory($_REQUEST['new_cat']);
								$item->update();
								$cat->removeChild($item->getID());
							}
						}
					}
				}

				if($_REQUEST['act'] == "ach_insert") {
					$ach = new AdmAchievement(array(),$cat);
					$ach->setCategory($cat->getID());
					$ach->setName($_REQUEST['aal_name']);
					$ach->setTemplate($_REQUEST['aal_template']);
					$ach->setImage($_REQUEST['aa_image']);
					$ach->setParentID($_REQUEST['aa_parent']);
					$ach->setSticky($_REQUEST['aa_sticky']);
					
					$cat->insertNode($ach);

					$task = new AdmTask(array(),$ach);
					$task->setAchievement($ach->getID());
					$task->setName($_REQUEST['atl_name']);
					$task->setTemplate($_REQUEST['atl_template']);
					$task->setValue($_REQUEST['at_value']);
					$task->setCondition($_REQUEST['at_condition']);
					$task->setConditionValue($_REQUEST['at_condition_value']);
					$task->setHeritage(0);

					if(is_array($_REQUEST['at_tie_allegiance'])) {
						$task->setTieAlign($_REQUEST['at_tie_allegiance']);
					}

					$ach->insertNode($task);
				}

				if($_REQUEST['act'] == "ach_update") {
					$ach = $cat->getChildDataByID($_REQUEST['id']);
					
					if($ach != null) {
						$ach->setName($_REQUEST['aal_name']);
						$ach->setTemplate($_REQUEST['aal_template']);
						#$ach->setTieCult($_REQUEST['aa_tie_cult']);
						#$ach->setTieCiv($_REQUEST['aa_tie_civ']);
						$ach->setImage($_REQUEST['aa_image']);
						$ach->setParentID($_REQUEST['aa_parent']);
						$ach->setSticky($_REQUEST['aa_sticky']);

						$ach->update();
					}
				}

				if($_REQUEST['act'] == "task_insert") {
					$ach = $cat->getChildDataByID($_REQUEST['id']);
					if($ach != null) {
						$task = new AdmTask(array(),$ach);
						$task->setAchievement($ach->getID());
						$task->setName($_REQUEST['atl_name']);
						$task->setTemplate($_REQUEST['atl_template']);
						$task->setValue($_REQUEST['at_value']);
						$task->setCondition($_REQUEST['at_condition']);
						$task->setConditionValue($_REQUEST['at_condition_value']);
						$task->setHeritage($_REQUEST['at_inherit']);

						if(is_array($_REQUEST['at_tie_allegiance'])) {
							$task->setTieAlign($_REQUEST['at_tie_allegiance']);
						}

						$ach->insertNode($task);
						$task->setParentID($_REQUEST['at_parent']);
						$ach->orderTasks();
						$task->update();
					}
				}

				if($_REQUEST['act'] == "task_update") {
					$task = $cat->getElementByPath($_REQUEST['id']);
					
					if($task != null) {
						$task->setName($_REQUEST['atl_name']);
						$task->setTemplate($_REQUEST['atl_template']);
						$task->setValue($_REQUEST['at_value']);
						$task->setCondition($_REQUEST['at_condition']);
						$task->setConditionValue($_REQUEST['at_condition_value']);
						$task->setHeritage($_REQUEST['at_inherit']);

						if(is_array($_REQUEST['at_tie_allegiance'])) {
							$task->setTieAlign($_REQUEST['at_tie_allegiance']);
						}

						$task->setParentID($_REQUEST['at_parent']);

						$ach = $task->getParent();
						$ach->orderTasks();

						$task->update();
					}
				}

				if($_REQUEST['act'] == "obj_insert") {
					$task = $cat->getElementByPath($_REQUEST['id']);
					
					if($task != null) {
						$obj = new AdmObjective(array(),$task);
						$obj->setName($_REQUEST['aol_name']);
						$obj->setCondition($_REQUEST['ao_condition']);
						$obj->setValue($_REQUEST['ao_value']);
						$obj->setDisplay($_REQUEST['ao_display']);
						$obj->setMetalink($_REQUEST['ao_metalink']);
						$obj->setTask($task->getID());

						$task->insertNode($obj);
					}
				}

				if($_REQUEST['act'] == "obj_update") {
					$obj = $cat->getElementByPath($_REQUEST['id']);
					
					if($obj != null) {
						$obj->setName($_REQUEST['aol_name']);
						$obj->setCondition($_REQUEST['ao_condition']);
						$obj->setValue($_REQUEST['ao_value']);
						$obj->setDisplay($_REQUEST['ao_display']);
						$obj->setMetalink($_REQUEST['ao_metalink']);

						$obj->update();
					}
				}

				if($_REQUEST['act'] == "delete") {
					$elem = $cat->getElementByPath($_REQUEST['id']);
					if($elem != null) {
						$par = $elem->getParent();
						$par->removeNode($elem->getID());

						if(get_class($elem) == "AdmAchievement") {
							$iter = $cat->getOpen();
							while($iter->hasNext()) {
								$item = $iter->getNext();

								if($elem->getID() == $item->getParentID()) {
									$item->setParentID(null);
									$item->update();
								}
							}
						}
					}
				}

				if($_REQUEST['act'] == "dev") {
					$curr = $cat->getElementByPath($_REQUEST['id']);
					$curr->setInDev(($_REQUEST['state'] != 1));
				}

				$microstop = explode(' ',microtime());
				$stop_time = $microstop[0] + $microstop[1];

				echo "<br>manipulation: ".round($stop_time - $start_time,3);

				$start_time = $stop_time;
				
				$c .= adm_render_category($cat);

				$microstop = explode(' ',microtime());
				$stop_time = $microstop[0] + $microstop[1];

				echo "<br>rendering: ".round($stop_time - $start_time,3);
			}

			$c .= "</td>
				</tr>
			</table></center>";

		}

		/*
		 * Statistics page
		 */

		if($_REQUEST['mode'] == "stats" && $_ADMIN->isCSR()) {
			require_once("include/adm_render_stats.php");

			$c .= "<h1>Statistics</h1>";

			$c .= stats_render();
		}

		/*
		 * CSR player manager
		 */
		if($_REQUEST['mode'] == "player" && $_ADMIN->isCSR()) {
			$c .= "<h1>Player Administration</h1>";

			#$DBc_char = new mySQL($_CONF['mysql_error']);
			#$DBc_char->connect($_CONF['char_mysql_server'],$_CONF['char_mysql_user'],$_CONF['char_mysql_pass'],$_CONF['char_mysql_database']);

			$DBc_char = ryDB::getInstance("webig");
			//menu
			require_once("include/adm_render_csr.php");

			if(!is_user($_REQUEST['pid'])) { // no user ID
				$c .= csr_render_find_player();
			}
			else {
				$user = array();
				$user['id'] = $_REQUEST['pid'];
				$user['lang'] = 'en';
				$dta = user_get_data($_REQUEST['pid']);
				$user['char_name'] = user_get_name($_REQUEST['pid']);
				$user['race'] = substr($dta['race'],2);
				$user['civ'] = substr($dta['civilisation'],2);
				$user['cult'] = substr($dta['cult'],2);

				$_USER = new RyzomUser($user);

				$menu = new AchMenu($_REQUEST['cat']);

				$open = $menu->getOpenCat();

				if($open != 0) {
					if($_REQUEST['cult']) {
						$cult = $_REQUEST['cult'];
						$_SESSION['cult'] = $cult;
					}
					elseif($_SESSION['cult']) {
						$cult = $_SESSION['cult'];
					}
					else {
						$cult = $_USER->getCult();
					}

					if($_REQUEST['civ']) {
						$civ = $_REQUEST['civ'];
						$_SESSION['civ'] = $civ;
					}
					elseif($_SESSION['civ']) {
						$civ = $_SESSION['civ'];
					}
					else {
						$civ = $_USER->getCiv();
					}

					$cat = new CSRCategory($open,$_USER->getRace(),$cult,$civ);

					if($_REQUEST['grant'] != "") {
						$cat->grantNode($_REQUEST['grant'],$_USER->getID());
					}

					if($_REQUEST['deny'] != "") {
						$cat->denyNode($_REQUEST['deny'],$_USER->getID());
					}
				}


				$c .= "<center><table>
				<tr>
				<td colspan='2' align='left'>".csr_render_yubopoints($user['id'])."</td>
			</tr>
				<tr>
					<td valign='top'><div style='width:230px;font-weight:bold;font-size:14px;'>";
				

				$c .= csr_render_menu($menu);
					
				$c .= "</div></td>
						<td width='645px' valign='top'>";


				if($open != 0) {
					$c .= csr_render_category($cat);
				}
				else {
					$cat = new AchSummary($menu,3);
					$c .= ach_render_summary_header();
				}

				if($open == 0) {
					$c .= ach_render_summary_footer($cat);
				}

				$c .= "</td>
					</tr>
				</table></center>";
			}

		}

$c .= "</td>
	</tr>
</table></center>";

#$c = var_export($_USER).$c;

echo ryzom_app_render("achievements admin", $c, $_ADMIN->isIG());

?>