/*
 +-----------------------------------------------------------------------+
 | js/ajax.js                                                            |
 |                                                                       |
 | This file is part of the Phusion Webengine                            |
 | Copyright (C) 2008-2009, Roman Gruber                                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 | PURPOSE:                                                              |
 |   Provides ajax functions                                             |
 |                                                                       |
 | TODO:                                                                 |
 |   - This part really needs a clean up                                 |
 |   - some functions should be coded again                              |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Roman Gruber <roman@phusion.ch>                               |
 +-----------------------------------------------------------------------+
*/

var loaded_containers = new Array();
var phpsessid = "";
var session_user = "";
var opened_menus = new Array();
var page_counter = 0;
var hist = new Array();
var hist_url = new Array();
var page_history = new Array();
var shared_content;

function ajaxFunction(url, id, animation, no_loading_animation, onload_function, onfinish_function, opts){
	if(id == null){
		desktopobj.open(url);
		return;
	}

	if(url == null || url == ""){
		return;
	}

	debug.info("ajaxFunction(); called: '"+id+"', '"+url+"'");

	var xmlHttp;

	function logout(animation, no_loading_animation){
	}

	try{
		// Firefox, Opera 8.0+, Safari
		xmlHttp=new XMLHttpRequest();
	}catch(e){
		// Internet Explorer
		try{
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		}catch(e){
			try{
				xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
			}catch(e){
				alert("Your browser does not support AJAX!");
				return false;
			}
		}
	}

	if(url == "reload"){
		ajaxFunction(loaded_containers[id], id, animation, no_loading_animation, onload_function, onfinish_function);
		return;
	}

	//set language
	if(typeof lang == "undefined"){
		debug.error("lang is not defined.");
		alert("lang is not defined.");
	}else{
		if(id != "new"){
			if(url.match(/lang\=[\$,a-z]*/)){
				url = url.replace(/lang\=[\$,a-z]*/, "lang="+lang);
			}else{
				if(url.match(/\?/)){
					var sign = "&";
				}else{
					var sign = "?";
				}
				url = url + sign + "lang="+lang
			}
		}
	}

	if(id == "login"){
		id = login();
		url += "&id="+id;
	}

	var method;
	if(url.match(/^get\:/)){
		url = url.replace(/^get\:/, "");
		method = "GET";
	}else if(url.match(/^post\:/)){
		url = url.replace(/^post\:/, "");
		method = "POST";
		var pairs = [];
		var regexp = /%20/g;
		for (var name in opts){
			var value = opts[name].toString();
			var pair = encodeURIComponent(name).replace(regexp, "+") +  '=' + encodeURIComponent(value).replace(regexp, "+");
			pairs.push(pair);
		}
		var encoded_data = pairs.join('&');
	}else{
		//Backwardcompatibility
		method = "GET";
	}

	if(url.match(/^mailto\:/)) {
		location.href = url;
		return;
	}

	if(id.match(/^new/)){
		if(id == "new"){
			newwindow = window.open(url);
			newwindow.focus();
		}else{
			var prefs = id.replace(/^new_/, "");
			newwindow = window.open(url, '', prefs);
			newwindow.focus();
		}
	}else if(id == "universe" || id == "rss") {
		window.open(url, "_self");
	}else if(id == "this") {
		if(phpsessid != ""){
			url = url + '&PHPSESSID=' + phpsessid;
			url = url + '&session_user=' + session_user;
		}
		window.open(url, "_self");
	}else if(id == ""){
		/* do nothing */	
		if(url.match(/^javascript\:/)){
			var jscode = url.replace(/^javascript\:/, "");
			var js = jscode.split("?");
			jscode = js[0];
			jscode = jscode.replace(/\+/g, " ");
			eval(jscode);
		}
	}else if(id.match(/^iframe/)){
		loaded_containers[id] = url;
		if(phpsessid != ""){
			url = url + '&PHPSESSID=' + phpsessid;
			url = url + '&session_user=' + session_user;
		}
		page_counter = page_counter+1;
		document.getElementById(id).src = url;
		//alert(url);
	}else if(id == "logout"){
		logout(animation, no_loading_animation);
	}else{
		if(onload_function != ""){
			eval(onload_function);
		}

		if(hist[id]){}else{hist[id] = new Array();}
		hist[id].push(document.getElementById(id).innerHTML);
		if(hist_url[id]){}else{hist_url[id] = new Array();}
		hist_url[id].push(url);
		page_counter = page_counter+1;

		if(phpsessid != ""){
			url = url + '&PHPSESSID=' + phpsessid;
			url = url + '&session_user=' + session_user;
		}

		if(no_loading_animation != "1"){
			document.getElementById(id).innerHTML='<table border=0 width=100% height=100%><tr><td width=100% height=100% valign=middle align=middle><img src=img/icons/load.gif></td></tr></table>';
		}
		xmlHttp.onreadystatechange=function(){
			if(xmlHttp.readyState==4){
				var real_url = scriptname(url);
				var response = xmlHttp.responseText;

				var sn = scriptname(url);
				var scripts = new Array();

				scripts = response.match(/\<script\ type\=\'text\/javascript\'\>([\s\S]*?)\<\/script\>/g);
				if(scripts){
					for(var i=0;i<scripts.length;i++){
						scripts[i] = scripts[i].substr(31, (scripts[i].length-40));
					}
				}

				if(scripts){
					for(var i=0;i<scripts.length;i++){
						if(onfinish_function){
							onfinish_function += " " + scripts[i];
						}else{
							onfinish_function = scripts[i];
						}
					}
				}
				
				if(animation == "swap_down"){
					placeholder = "<div class='div_dummy' id='now'><div class='div_dummy' id='pre'>" + document.getElementById(id).innerHTML + "</div>" + response + "</div>";
					document.getElementById(id).innerHTML=placeholder;
					document.getElementById("pre").style.visibility = "visible";
					document.getElementById("now").style.visibility = "visible";
					document.getElementById("pre").style.overflow = "hidden";
					document.getElementById("pre").style.verticalalign = "bottom";
					document.getElementById("now").style.overflow = "hidden";
					document.getElementById("now").style.height = document.getElementById("pre").offsetHeight;
					slide_close("pre", 20, "", 0);
				}else if(animation == "open_close"){
					var ocobj = new open_close(id, response);
					ocobj.onfinish(onfinish_function);
					ocobj.start();
				}else if(animation == "open"){
					var ocobj = new open_close(id, response);
					ocobj.onfinish(onfinish_function);
					ocobj.open();
				}else if(animation == "close"){
					var ocobj = new open_close(id, response);
					ocobj.onfinish(onfinish_function);
					ocobj.close();
				}else if(animation == "scroll_down"){
					var scrollobj = new scroll("down", document.getElementById(id).innerHTML, response, id);
					scrollobj.calc_pix_to_scroll();
					scrollobj.onfinish(onfinish_function);
					scrollobj.start();
				}else if(animation == "scroll_up"){
					var scrollobj = new scroll("up", document.getElementById(id).innerHTML, response, id);
					scrollobj.calc_pix_to_scroll();
					scrollobj.onfinish(onfinish_function);
					scrollobj.start();
				}else if(animation == "scroll_left"){
					var scrollobj = new scroll("left", document.getElementById(id).innerHTML, response, id);
					scrollobj.calc_pix_to_scroll();
					scrollobj.onfinish(onfinish_function);
					scrollobj.start()
				}else if(animation == "scroll_right"){
					var scrollobj = new scroll("right", document.getElementById(id).innerHTML, response, id);
					scrollobj.calc_pix_to_scroll();
					scrollobj.onfinish(onfinish_function);
					scrollobj.start();
				}else if(animation == "fade"){
					var fadeobj = new fade(response, id);
					fadeobj.onfinish(onfinish_function);
					fadeobj.out_in();
				}else if(animation == "merge"){
					var mergeobj = new merge(id, response);
					mergeobj.onfinish(onfinish_function);
					mergeobj.start();
				}else if(animation == "morph"){
					morph_init(response, id);
				}else{ // no special amination
					document.getElementById(id).innerHTML=response;
					if(onfinish_function){
						debug.info("onfinish function: "+onfinish_function);
						eval(onfinish_function);
					}
					//log("-------->"+id+" - "+url+":\n\n"+onfinish_function);
				}
				if(id == "main"){
					window.location.hash = "#main=="+url;
					loaded_containers[id] = url;
				}else{
					loaded_containers[id] = url;
				}
				debug.info("ajaxFunction() finished: '"+id+"', '"+url+"'");
			}
		}
	
		if(method == "GET"){
			xmlHttp.open("GET",url,true);
			xmlHttp.send(null);
		}else if(method == "POST"){
			xmlHttp.open("POST",url);
			xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			xmlHttp.send(encoded_data);
		}
	}
}

function changedHash(hash){
	var parts = hash.split("#");
	if(parts[1] != ""){
		var url = parts[1].split("==");
		if(url[0] && url[1]){
			var id = url[0];
			url = url[1];
			if(decodeURIComponent(loaded_containers[id]) != decodeURIComponent(url)){
				url = url.substr(0, url.indexOf("?")) + "?" + encodeURI(url.substr((url.indexOf("?")+1), (url.length-url.indexOf("?")-1)));
				ajaxFunction(url, id);
				debug.info("back or forward pressed");
			}
		}
	}
}

function getxml(url, opts){

	debug.info("getxml() called: '"+url+"', '"+opts+"'");

	var method;
	if(url.match(/^get\:/)){
		url = url.replace(/^get\:/, "");
		method = "GET";
	}else if(url.match(/^post\:/)){
		url = url.replace(/^post\:/, "");
		method = "POST";
		var pairs = [];
		var regexp = /%20/g;
		for (var name in opts){
			var value = opts[name].toString();
			var pair = encodeURIComponent(name).replace(regexp, "+") +  '=' + encodeURIComponent(value).replace(regexp, "+");
			pairs.push(pair);
		}
		var encoded_data = pairs.join('&');
	}else{
		//Backwardcompatibility
		method = "GET";
	}

	var xmlHttp;
	try{// Firefox, Opera 8.0+, Safari
		xmlHttp = new XMLHttpRequest();
	}
	
	catch (e){
		try{ // Internet Explorer
			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		}catch (e){
			try{
				xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			}catch (e){
				alert("Your browser does not support AJAX!");
				return false;
			}
		}
	}

	if(phpsessid != ""){
		url = url + '&PHPSESSID=' + phpsessid;
		url = url + '&session_user=' + session_user;
	}

	if(method == "GET"){
		xmlHttp.open("GET",url,false);
		xmlHttp.send(null);
	}else if(method == "POST"){
		xmlHttp.open("POST",url,false);
		xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xmlHttp.send(encoded_data);
	}

	debug.info("getxml() finished: '"+url+"', '"+opts+"'");
	return xmlHttp.responseText;
}


function xmltoarr(xmldoc){

}


//function xmlajaxFunction(url, id, function_name){
//	var xmlHttp;
//
//	try{
//		// Firefox, Opera 8.0+, Safari
//		xmlHttp=new XMLHttpRequest();
//	}
//	
//	catch (e){
//		// Internet Explorer
//		try{
//			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
//		}
//		catch (e){
//			try{
//				xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
//			}
//			catch (e){
//				alert("Your browser does not support AJAX!");
//				return false;
//			}
//		}
//	}
//
//	//alert(url + " - " + id);
//
//	if(url == "reload"){
//		xmlajaxFunction(loaded_containers[id], id, animation, no_loading_animation);
//		return;
//	}
//
//	if(id == ""){
//		/* do nothing */	
//	//}else if(id == "iframe"){
//	}else{
//		if(hist[id]){}else{hist[id] = new Array();}
//		hist[id].push(document.getElementById(id).innerHTML);
//		page_counter = page_counter+1;
//
//		if(phpsessid != ""){
//			url = url + '&PHPSESSID=' + phpsessid;
//			url = url + '&session_user=' + session_user;
//		}
//
//		xmlHttp.onreadystatechange=function(){
//			if(xmlHttp.readyState==4){
//				var xmldoc = xmlHttp.responseText;
//				//alert(xmlHttp.responseText);
//				var xotree = new XML.ObjTree();
//				var tree = xotree.parseXML( xmldoc );
//
//				eval(function_name+"(tree);");
//			}
//
//			if(id == "main"){
//				delete(loaded_containers['news']);
//				delete(loaded_containers['prod']);
//				delete(loaded_containers['dl']);
//				loaded_containers[id] = url;
//			}else{
//				loaded_containers[id] = url;
//			}
//		}
//	}
//	
//	xmlHttp.open("GET",url,true);
//	xmlHttp.send(null);
//	
//}




function jback(id, howmuch){
	if(howmuch){
	}else{
		howmuch = 1;
	}
	if(hist[id]){
		var len = hist[id].length;
		document.getElementById(id).innerHTML = hist[id][(len-howmuch)];
		for(i=0;i<howmuch;i++){
			hist_url[id].pop();
			hist[id].pop();
		}
		page_counter = page_counter-howmuch;
	}else{
		history.back();
	}
}

function jback_with_reload(id, howmuch){
	if(howmuch){
		howmuch += 1;
	}else{
		howmuch = 1;
	}
	if(hist_url[id]){
		var len = hist_url[id].length;
		ajaxFunction(hist_url[id][(len-howmuch)], id);
		for(i=0;i<howmuch;i++){
			hist_url[id].pop();
			hist[id].pop();
		}
		page_counter = page_counter-howmuch;
	}else{
		history.back();
	}
}

function open_new_window(addr) {
	mywindow = window.open(addr, "Files", "width=930,height=600,dependent=yes,location=no,menubar=no,scrollbars=no,status=no,toolbar=no");
	mywindow.focus();
}


function open_new_order_window(addr) {
	mywindow = window.open(addr, "Reihenfolge", "width=350,height=600,dependent=yes,location=no,menubar=no,scrollbars=yes,status=no,toolbar=no");
	mywindow.focus();
}


