
// =========================================================
// telepark.wiki Standard

// This Software is copyright (c) 2007 by telepark, 
// Inh. Patrick Thomas, www.telepark.de. 
// All rights reserved. 

// You may not modify, alter, reverse engineer or emulate 
// the functionality, or create derivative works of the 
// Software in parts or it's entirety without the prior
// written consent of telepark.
// =========================================================

//tree object
var tree;
//id for new (unsaved) item
var newItemId = "-1";
// set context menu un-called
var ismenucalled = false;
// define from where the script is called
var ajaxFolder = true;
// itemId for reload
var tmpID = -1;

window.onresize = windowResize;


// ==============
// INITIALIZATION
// ==============

// set width and height of div elements
function windowResize() {
	// treebox height
	if (document.getElementById('treebox') && document.getElementById('treebox').style.height!=(document.body.clientHeight-130)) {
		document.getElementById('treebox').style.height=(document.body.clientHeight-130);
	}
	// treebox width
	var treeWidth = document.getElementById('treebox').style.width.replace(/px/,"");
	// main width
	if (document.getElementById('main') && document.getElementById('main').style.width!=(document.body.clientWidth-(document.body.clientWidth-parseInt(treeWidth)-20))) {
		document.getElementById('main').style.width=(document.body.clientWidth-parseInt(treeWidth)-20);
	}
	// main height
	if (document.getElementById('main') && document.getElementById('main').style.height!=(document.body.clientHeight-130)) {
		document.getElementById('main').style.height=(document.body.clientHeight-130);
	}
	// content width
	if ((parseInt(treeWidth)+parseInt(contentWidth)) <= document.body.clientWidth) {
		// within screen
		if (document.getElementById('content') && document.getElementById('content').style.width!=contentWidth) {
			document.getElementById('content').style.width=contentWidth;
		}
	}
	else {
		// larger than screen
		if (document.getElementById('content') && document.getElementById('content').style.width!=(document.body.clientWidth-(document.body.clientWidth-parseInt(treeWidth)-20))) {
			document.getElementById('content').style.width=(document.body.clientWidth-parseInt(treeWidth)-20);
		}
	}
}

//load tree on page
function loadTree(){
	status(true);
	aMenu=new dhtmlXContextMenuObject('120',0,"imgs/");
	aMenu.menu.setGfxPath("imgs/");		
	aMenu.menu.loadXML(pre + "UserFiles/Menu/context.xml?random=" + Math.random());				
    aMenu.setContextMenuHandler(onButtonClick);
	aMenu.setOnShowMenuHandler(changeMenu);
	aMenu._fixMenuPosition=function(){}
	
	tree = new dhtmlXTreeObject("treebox","100%","100%",0);
	tree.setImagePath(pre + "imgs/");
	tree.enableDragAndDrop(true);
	tree.enableDragAndDropScrolling(true);
	tree.setDragBehavior("complex");
	tree.setDragHandler(onBeforeDrop);
	tree.setDropHandler(onDrop);
	tree.setOnClickHandler(onSelect);
	tree.setOnDblClickHandler(onDoubleClick);
	tree.enableContextMenu(aMenu); //link context menu to tree
	tree.enableSmartXMLParsing(true);//false to disable
	tree.setOnLoadingEnd(startFunc); //go to after loading
	tree.setSerializationLevel(true,true);
	tree.enableTreeLines(false);
	tree.setEscapingMode("utf8");
	tree.setStdImages("leaf.gif","leaf.gif","leaf.gif");
	tree.enableMultiselection(true);
	tree.loadXML(pre + "UserFiles/Menu/menu.xml?random=" + Math.random());
	status();
}

// call directly after tree is loaded
function startFunc() {
	tree.closeAllItems();
	toggleTextLinks();
	var wikiitem = true;
	if (tmpID != -1) {
		var itemId = tmpID;
		wikiitem = false;
	} else {
		var params = new query_params(window.location.search);
		for (query in params) {
		  if (query=='telepark.wiki') {
		  	var itemId = params[query];
		  	wikiitem = false;
		  }
		}
	}
	if (wikiitem == true) {
		var itemId = "wiki";
	}
	setItemFontColor(color1,color2);
	tree.selectItem(itemId,true);
}


// ================
// HELPER FUNCTIONS
// ================

// close message box
function closeMessageBox() {
	document.getElementById('innerMessage').innerHTML = "";
	document.getElementById('messageBox').style.display = "none";
}

// set ajax flag
function ajaxFlag(mode) {
	if (mode == 'no')
		ajaxFolder = false;
	else
		ajaxFolder = true;
}

// toggle div visibility
function toggleDivDisplay(id) {
	var div = document.getElementById(id);
	if (div) {
		// show
		if (div.style.display == 'none') {
			div.style.display = 'block';
		}
		// hide
		else {
			div.style.display = 'none';
		}
	}
}

// get child ids
function getChildIds(pageId) {
	var childItems = tree.getSubItems(pageId);
	var children = childItems.split(",");
	var idstring = "";
	for (var i=0; i<children.length; i++) {
		idstring = idstring + "," + children[i];
		if (tree.hasChildren(children[i])) {
			idstring = idstring + "," + getChildIds(children[i]);
		}
	}
	return idstring.substr(1);
}

// set color to tree items
function setItemFontColor(col1,col2) {		// telepark.wiki std
	var ids = getChildIds('wiki');
	var idlist = ids.split(",");
	for (var i=0; i<idlist.length; i++) {
		tree.setItemColor(idlist[i],col1,col2);
	}
	tree.setItemColor("wiki",col1,col2);
}

// get query parameters
function query_params(querystring) {
  if (querystring == '') return;
  var string = decodeURI(querystring);
  string = string.slice(1);
  var pairs = string.split("&");
  for (var i=0; i < pairs.length; i++) {
    var name = pairs[i].substring(0, pairs[i].indexOf("="));
    var value = pairs[i].substring(pairs[i].indexOf("=")+1, pairs[i].length);
    this[name] = value;
  }
}

// show status of request on page
function status(fl){
	var d = document.getElementById("loading");
	if(fl)
		d.style.display = "block";
	else
		d.style.display = "none";
}

// no function
function nofunction(req) {
	if (req.readyState == 4)	{
		if (req.status == 200)	{
			//displaySystemMessage(req);
		}
	}
	return;
}

// write change timestamp
function writeChangestamp(){
	var hp = new HTTPPost();
	if (ajaxFolder == false) var pre = "";
	else var pre = "ajax/";
	hp.postData(pre + 'writeChangestamp.php', '', proceedWriteChangestamp, true);
}

// read change timestamp
function readChangestamp(){
	var hp = new HTTPPost();
	if (ajaxFolder == false) var pre = "";
	else var pre = "ajax/";
	hp.postData(pre + 'readChangestamp.php', '', proceedReadChangestamp, true);
}

// proceed action based on timestamp
function proceedReadChangestamp(req) {
	if (req.readyState == 4)	{
		if (req.status == 200 && req.responseXML && req.responseXML.documentElement)	{
			var timestamp = getXMLData(req.responseXML.documentElement.getElementsByTagName('timestamp'));
			var err = getXMLData(req.responseXML.documentElement.getElementsByTagName('error'));
			if (err != "") logError(err);
			if (timestamp != "" && timestamp != currentTime) {
				currentTime = timestamp;
				reloadTree(tree.getSelectedItemId());
			}
		}
	}
	status();
}

// proceed action based on timestamp
function proceedWriteChangestamp(req) {
	if (req.readyState == 4)	{
		if (req.status == 200 && req.responseXML && req.responseXML.documentElement)	{
			var timestamp = getXMLData(req.responseXML.documentElement.getElementsByTagName('timestamp'));
			currentTime = timestamp;
		}
	}
	status();
}

// reload tree and jump to itemId
function reloadTree(itemId) {
	document.getElementById('treebox').innerHTML = '';
	delete tree;
	tmpID = itemId;
	loadTree();
}

// display system messages
function displaySystemMessage(message) {
	if (message != '' && message != 'undefined') {
		document.getElementById('innerMessage').innerHTML = message;
		document.getElementById('messageBox').style.display = 'block';
	}
}


// ===============
// CLICK FUNCTIONS
// ===============

// on select
function onSelect(itemId){
	status(true);
	hideLoginBox();
	tmpID = itemId;
	tree.openItem(itemId);
	if(itemId!=newItemId){
		if(tree.getLevel(newItemId)!=0){
			if(confirm("Do you want to save changes?")){//save changes to new item
				tree.selectItem(newItemId,false);
				// saveItem();
				document.wikiForm.submit();
				return;
			}
			tree.deleteItem(newItemId);
			saveXMLTree();
			status();
		}	
	}else{//set color to new item label
		tree.setItemColor(itemId,"red","pink");
	}
	getPage(itemId);
	ismenucalled = false;
	status();
}

// on double click
function onDoubleClick(itemId) {
	status(true);
	hideLoginBox();
	if (loggedIn == true || publiclogin == true) {
		editPage(itemId);
	}
	else {
		status();
		return false;
	}
}

// on context menu click
function onButtonClick(menuItemValue,itemId){
	if (itemId == "-1") itemId = tree.getSelectedItemId();
	
	if (ismenucalled != false) return false;

	ismenucalled = menuItemValue;
	
	// new page
	if(menuItemValue=="add") {
		//addNewPeer();
		addNewChild();
		addPage();
	}
	// edit
	else if(menuItemValue=="edit") {
		editPage(itemId);
	}
	// delete
	else if(menuItemValue=="delete" && itemId!='wiki') {
		deleteNode(itemId);
	}
	// sort
	else if(menuItemValue=="sort") {
		sortNode(itemId);
	}
	
    return false;
}


// =============
// DRAG AND DROP
// =============

// before drop
function onBeforeDrop(sourceId,targetId) {
	if (tree.getLevel(targetId)>maxLevels || (loggedIn == false && publiclogin == false))  {
		return false;
	}
	else {
		return true;
	}
}

// on drop
function onDrop(sourceId, targetId) {
	writeChangestamp();
	saveXMLTree();
}


// ============
// CONTEXT MENU
// ============

// change menu
function changeMenu(itemId) {
	tree.selectItem(itemId,true);
	if (itemId==newItemId || (loggedIn == false && publiclogin == false))	{
		doNotShowMenu();
		return false;
	}
	//hide all subblocks
	aMenu.menu.hideButtons('sort');
	aMenu.menu.hideButtons('add');
	aMenu.menu.hideButtons('edit');
	aMenu.menu.hideButtons('delete');

	if (itemId == 'wiki') {
		aMenu.menu.showButtons('sort');
		aMenu.menu.showButtons('add');
		aMenu.menu.showButtons('edit');
	}
	else if (tree.hasChildren(itemId) > 0) {
		aMenu.menu.showButtons('sort');
		if (tree.getLevel(itemId)<=maxLevels) aMenu.menu.showButtons('add');
		aMenu.menu.showButtons('edit');
		aMenu.menu.showButtons('delete');
	}
	else {
		if (tree.getLevel(itemId)<=maxLevels) aMenu.menu.showButtons('add');
		aMenu.menu.showButtons('edit');
		aMenu.menu.showButtons('delete');
	}
}

// prevent context menu from showing when it is not necessary (no menu associated with item)
function doNotShowMenu(){
	aMenu.menu.setOnShowHandler(function(){aMenu.menu.hideBar();aMenu.menu.setOnShowHandler(function(){})});
}


// ==============
// ADD TREE ITEMS
// ==============

// add new node next to currently selected (or the first in tree)
function addNewPeer(){
	if(tree.getLevel(newItemId)!=0){//check if unsaved item already exists
		alert("New Item (unsaved) already exists")
		return false;
	}
	var selectedId = tree.getSelectedItemId();
	if(selectedId!=""){
		tree.insertNewNext(selectedId,newItemId,newItemLabel,"","leaf.gif","leaf.gif","leaf.gif","SELECT,CALL",0)
	}else{
		tree.insertNewItem(0,newItemId,newItemLabel,"","leaf.gif","leaf.gif","leaf.gif","SELECT,CALL",0)
	}
	return;
}

// add new child node to selected item (or the first item in tree)
function addNewChild(){
	if(tree.getLevel(newItemId)!=0){//check if unsaved item already exists
		alert("New Item (unsaved) already exists")
		return false;
	}
	var selectedId = tree.getSelectedItemId();
	if(selectedId!=""){
		tree.insertNewItem(selectedId,newItemId,newItemLabel,"","leaf.gif","leaf.gif","leaf.gif","SELECT,CALL",0)
	}else{
		tree.insertNewItem(0,newItemId,newItemLabel,"","leaf.gif","leaf.gif","leaf.gif","SELECT,CALL",0)
	}
	return;
}


// ================
// UPDATE FUNCTIONS
// ================

// update item
function doUpdateItem(id, label){
	var f = document.forms["wikiForm"];
	f.item_id.value = id;
	tree.changeItemId(tree.getSelectedItemId(),id);
	tree.setItemText(id,label);
	tree.setItemColor(id,"black","white");
	status();
}

// update item (tree)
function updateItem(pageID,label) {
	tree.changeItemId(tree.getSelectedItemId(),pageID);
	tree.setItemText(pageID,label);
	tree.setItemColor(pageID,"black","white");
	writeChangestamp();
	saveXMLTree();
}


// ============
// DELETE ITEMS
// ============

// delete item (from database)
function deleteNode(){
	status(true);
	// no deletion if item has children
	if (tree.hasChildren(tree.getSelectedItemId())) {
		alert(str_deletenotpossible);
		status();
		ismenucalled = false;
		return false;
	}
	// no deletion id item is wiki node
	if (tree.getSelectedItemId == "wiki") {
		alert(str_wikiitemdeletenotpossible);
		status();
		ismenucalled = false;
		return false;
	}
	// delete node from db
	if(tree.getSelectedItemId()!=newItemId){
		if(!confirm(str_askdeletenode)) {
			ismenucalled = false;
			status();
			return false;
		}
		var selectedId = tree.getSelectedItemId();
		deleteContentFile(selectedId);
		ismenucalled = false;
	// delete unsaved node
	}else{
		ismenucalled = false;
		deleteContentFile(newItemId);
	}
}

// delete item (content file)
function deleteContentFile(id){
	var hp = new HTTPPost();
	var pageID = 'pageID=' + id;
	if (ajaxFolder == false) var pre = "";
	else var pre = "ajax/";
	document.getElementById('content').innerHTML = '';
	hp.postData(pre + 'deletePage.php', pageID, deleteTreeItem, true);
}

// delete item (tree)
function deleteTreeItem(req) {
	if (req.readyState == 4)	{
		if (req.status == 200 && req.responseXML && req.responseXML.documentElement)	{
			var pageID = getXMLData(req.responseXML.documentElement.getElementsByTagName('pageID'));
			var err = getXMLData(req.responseXML.documentElement.getElementsByTagName('error'));
			if (err != "") logError(err);
			var pId = tree.getParentId(pageID);
			tree.deleteItem(pageID);
			if (pId!="0") tree.selectItem(pId,true);
			writeChangestamp();
			saveXMLTree();
		}
	}
	status();
}

// sort node
function sortNode(treeItemId) {
	tree.sortTree(treeItemId,'ASC',0);
	writeChangestamp();
	saveXMLTree();
}


// ==================
// FILE I/O FUNCTIONS
// ==================

// save xml tree
function saveXMLTree() {
	var hp = new HTTPPost();
	var xmlTree = "string=" + encodeURIComponent(tree.serializeTree());
	if (ajaxFolder == false) var pre = "";
	else var pre = "ajax/";
	hp.postData(pre + 'writeXML.php', xmlTree, nofunction, true);
	return;
}

// switch page
function switchPage(pageID,mode) {
	var hp = new HTTPPost();
	var param = 'pageID=' + pageID;
	if (ajaxFolder == false) var pre = "";
	else var pre = "ajax/";
	if (mode == 'view')	hp.postData(pre + 'callPage.php',param, displayPage, true);
	else if (mode == 'form') hp.postData(pre + 'callForm.php',param, displayForm, true);
}

// load page
function getPage(pageID) {
	ismenucalled = false;
	readChangestamp();
	var hp = new HTTPPost();
	var id = 'pageID=' + pageID;
	if (ajaxFolder == false) var pre = "";
	else var pre = "ajax/";
	hp.postData(pre + 'callPage.php?r=' + Math.random(), id, displayPage, true);
}

// display page
function displayPage(req) {
	if (req.readyState == 4)	{
		if (req.status == 200 && req.responseText)	{
			if (document.getElementById('content')) {
				eval(req.responseText);
			}
		}
	}
}

// log error
function logError(err) {
	var hp = new HTTPPost();
	var err = 'error=' + err;
	hp.postData('ajax/logError.php', err, nofunction, true);
}


// ==============
// FORM FUNCTIONS
// ==============

// add page (add form)
function addPage() {
	var hp = new HTTPPost();
	var id = 'pageID=' + newItemId;
	hp.postData('ajax/callForm.php?r=' + Math.random(), id, displayForm, false);
}

// edit page (edit form)
function editPage(treeItemId) {
	var hp = new HTTPPost();
	var id = 'pageID=' + treeItemId;
	hp.postData('ajax/callForm.php?r=' + Math.random(), id, displayForm, false);
}

// display form
function displayForm(req) {
	try {
		if (req.readyState == 4)	{
			if (req.status == 200 && req.responseText)	{
				eval(req.responseText);
			}
		}
	} catch (e) {
		displayForm(req);
	}
	return;
}


// =========
// FCKEDITOR
// =========

// embedd FCKEditor
function embedEditor(nr) {
    if (!document.getElementById('wikiContent') && nr<5) embedEditor(nr+1);
    if (!document.getElementById('wikiContent') && nr>=5) {
    	displaySystemMessage("The editor couldn't be initialized. Please try again.");
    	logError("The editor couldn't be initialized. Please reload the website and try again.");
    }
	var oFCKeditor = new FCKeditor( 'wikiContent' ) ;
    oFCKeditor.BasePath = "FCKeditor/" ;
    oFCKeditor.Height = 350;
    oFCKeditor.ReplaceTextarea() ;
}

// after FCKEditor is loaded
function FCKeditor_OnComplete( editorInstance ) {
    document.getElementById('wikiMenuLabel').select();
    status();
}

// check if changes have been made
function checkEditorChanges(originalLabel,originalCheckboxState) {
	var oEditor = FCKeditorAPI.GetInstance('wikiContent') ;
	// changes
	if (oEditor.IsDirty() || (originalLabel != document.getElementById('wikiMenuLabel').value)) {
		return true;
	}
	// no changes
	else {
		getPage(tree.getSelectedItemId());
		return false;
	}
}


// ===============
// LOGIN FUNCTIONS
// ===============

// login box
function loginBox() {
	document.getElementById('loginBox').style.display = 'block';
	document.getElementById('loginBoxField').value = '';
	document.getElementById('loginBoxField').focus();
}

// hide login box
function hideLoginBox() {
	document.getElementById('loginBox').style.display = 'none';
	document.getElementById('loginBoxField').value = '';
}

// submit login
function submitLogin() {
	var password = document.getElementById('loginBoxField').value;
	document.getElementById('loginBox').style.display = 'none';
	document.getElementById('loginBoxField').value = '';
	if (password != '') {
		password = "pass=" + password;
		var hp = new HTTPPost();
		hp.postData('ajax/validateLogin.php', password, validateLogin, true);
	}
}

// check login
function checkLogin() {
	status();
	var hp = new HTTPPost();
	hp.postData('ajax/checkLogin.php', '', login, true);
}

// login
function login(req) {
	if (req.readyState == 4)	{
		if (req.status == 200 && req.responseXML && req.responseXML.documentElement)	{
			var res = getXMLData(req.responseXML.documentElement.getElementsByTagName('checklogin'));
			var login_str = getXMLData(req.responseXML.documentElement.getElementsByTagName('login_str'));
			var login_fct = getXMLData(req.responseXML.documentElement.getElementsByTagName('login_fct'));
			var err = getXMLData(req.responseXML.documentElement.getElementsByTagName('error'));
			if (err != "") logError(err);
			// wrong password
			if (res == '') {
				loggedIn = false;
				loginBox();
			}
			// correct password
			else {
				// logged in
				loggedIn = true;
				// link
				if (document.getElementById('loginButton')) {
					document.getElementById('loginButton').innerHTML = '<a href="#" onClick="' + login_fct + '">' + login_str + '</a>';
				}
			}
			toggleTextLinks();
		}
	}
	status();
}

// validate login data
function validateLogin(req) {
	if (req.readyState == 4)	{
		if (req.status == 200 && req.responseXML && req.responseXML.documentElement)	{
			var res = getXMLData(req.responseXML.documentElement.getElementsByTagName('validatelogin'));
			var login_str = getXMLData(req.responseXML.documentElement.getElementsByTagName('login_str'));
			var login_fct = getXMLData(req.responseXML.documentElement.getElementsByTagName('login_fct'));
			var err = getXMLData(req.responseXML.documentElement.getElementsByTagName('error'));
			if (err != "") logError(err);
			// correct password
			if (res != "") {
				// login message
				displaySystemMessage(str_loggedin);
				// logged in
				loggedIn = true;
				// link
				if (document.getElementById('loginButton')) {
					document.getElementById('loginButton').innerHTML = '<a href="#" onClick="' + login_fct + '">' + login_str + '</a>';
				}
				startFunc();
			}
			// wrong password
			else {
				loggedIn = false;
				checkLogin();
			}
			toggleTextLinks();
		}
	}
	status();
}

// display or hide text links
function toggleTextLinks() {
	if (textLinks == true && document.getElementById('textlinks')) {
		if (loggedIn == true || publiclogin == true) {
			document.getElementById('textlinks').style.display = 'block';
		} else {
			document.getElementById('textlinks').style.display = 'none';
		}
	}
}

// logout
function logout() {
	status();
	var c = confirm(str_asklogout);
	if (c == true) {
		var hp = new HTTPPost();
		hp.postData('ajax/logout.php', '', setLogout, true);
	}
	ismenucalled = false;
}

// set logout
function setLogout(req) {
	if (req.readyState == 4)	{
		if (req.status == 200 && req.responseXML && req.responseXML.documentElement)	{
			var login_str = getXMLData(req.responseXML.documentElement.getElementsByTagName('login_str'));
			var login_fct = getXMLData(req.responseXML.documentElement.getElementsByTagName('login_fct'));
			var err = getXMLData(req.responseXML.documentElement.getElementsByTagName('error'));
			if (err != "") logError(err);
			if (err == "") {
				loggedIn = false;
				if (document.getElementById('loginButton')) {
					document.getElementById('loginButton').innerHTML = '<a href="#" onClick="' + login_fct + '">' + login_str + '</a>';
				}
				displaySystemMessage(str_loggedout);
				startFunc();
			}
		}
	}
	status();
}

