// © Mircea Mihail Marmureanu
// contact: wm_maw at evonet dot ro


// holds an instance of XMLHttpRequest
var xmlHttp = createXmlHttpRequestObject();
//set the targetDiv
var _globalTargetDiv="centerDiv";
var blocker = false;
var searchContent = true;
var loading = "<img width=\"16\" height=\"16\" src=\"img/sitestruct/ajaxload.gif\" />";
//var isLink = true;

function MM_openBrWindow(theURL,winName,features) { //v2.0
	window.open(theURL,winName,features);
}

//history Manager section - manages history
var historyManager = {
	homePage : "./",
	currentPage : 0,
	position : [ "" ],
	init : function() {
		this.position[this.position.length] = this.homePage;
	},
	add : function(path){
		if(this.position[this.currentPage] != path && path != "" && path != null){
		this.currentPage++;
		this.position[this.currentPage] = path;
		}
	},
	goforward : function(number){
		if(this.currentPage+number < this.position.length){
			this.currentPage+=number;
			return "#"+this.position[this.currentPage];
		}else{
			return "#"+this.position[this.currentPage];
		}
	},
	goback : function(number){
		number = number ? number : 1;
		if(this.currentPage-number >= 0){
			this.currentPage-=number;
			return "#"+this.position[this.currentPage];
		}else{
			return "#"+this.position[this.currentPage];
		}
	},
	pointer : function(){
		return "#"+this.position[this.currentPage];
	}
}

//site Manager section - manages firstLoad
var siteAreas = {
	loadingInterval : 100,
	contentLoader : [ "contentManagement", "catalogMenuDiv", "catalogMainDiv", "product", "register"],
	defaultPage : [ "./intro.php", null, null, null, null ],
	defaultStyle : [ "intro", "fizici", "", "", ""],
	searchAfterDefault: [false, true, true, true, true],
	init : function() {
		var i;
		customSwitch("loading", true, "loading");
		getArea(0);
		/*for(i=0; i<this.contentLoader.length; i++ ){
			setTimeout("getArea("+i+")",this.loadingInterval);
			this.loadingInterval += 1000;
		}*/
	}
};


function siteManager(){
	siteAreas.init();
	historyManager.init();
}

function setActiveStyleSheet(title) {
   var i, a;
   if(title!=null && title!=''){
	   for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
		 if(a.getAttribute("rel").indexOf("style") != -1
			&& a.getAttribute("title")) {
		   a.disabled = true;
		   if(a.getAttribute("title") == title) a.disabled = false;
		 }
	   }
   }
}

function getArea(pointer){
	found = false;
	siteLocation = document.URL.split("#");
	if(siteLocation[1] != undefined){
		siteLocation = siteLocation[1].split("~");
	}else{
		customSwitch("loading", false);
	}
	targetDiv = siteAreas.contentLoader[pointer];
	for(i = 1; i < siteLocation.length; i+=1){
		siteArea = siteLocation[i].split("!");
		siteStyle = siteArea[0].split(":");
		siteStyle[1] == undefined ? siteStyle[1] = '' : null;
		//alert("searching ("+targetDiv+") found ("+siteStyle[0]+")");
		if(siteStyle[0] == targetDiv){
			loadStuff(targetDiv, "./"+siteArea[1]+".php", false, siteArea[2], siteStyle[1]);
			found = true;
			//alert("found = true");
			if(pointer > 0){
				siteAreas.searchAfterDefault[pointer-1] ? searchContent = false : null;
			}else{
				searchContent = true;
				//alert("searchContent = true");
			}
			//alert(siteAreas.contentLoader.length+" > "+(pointer+1)+" = "+(siteAreas.contentLoader.length > pointer+1));
			if(siteAreas.contentLoader.length > (pointer+1)){
				//getArea(pointer+1);
				setTimeout("getArea("+(pointer+1)+")",siteAreas.loadingInterval);
			}else{
				customSwitch("loading", false);	
			}
		}
	}
	if(found == false){
		//alert("found = false");
		if(pointer > 0){
		siteAreas.searchAfterDefault[pointer-1] ? searchContent = false : null;
		//alert("searchContent = "+siteAreas.searchAfterDefault[pointer-1]);
		}else{
			searchContent = true;
			//alert("searchContent = true");
		}
		if(siteAreas.defaultPage[pointer] != null){
			searchContent ? loadStuff(targetDiv, siteAreas.defaultPage[pointer], true, null, siteAreas.defaultStyle[pointer]) : null;
			//alert(siteAreas.contentLoader.length+" > "+(pointer+1)+" = "+(siteAreas.contentLoader.length > pointer+1));
			if((siteAreas.searchAfterDefault[pointer] == true) && siteAreas.contentLoader.length > (pointer+1)){
				//getArea(pointer+1);
				setTimeout("getArea("+(pointer+1)+")",siteAreas.loadingInterval);
			}
		}else{
			//alert(siteAreas.contentLoader.length+" > "+(pointer+1)+" = "+(siteAreas.contentLoader.length > pointer+1));
			if((siteAreas.searchAfterDefault[pointer] == true) && siteAreas.contentLoader.length > (pointer+1)){
			//getArea(pointer+1);
			setTimeout("getArea("+(pointer+1)+")",siteAreas.loadingInterval);
			}else{
				customSwitch("loading", false);	
			}
		}
	}
}
//end of site first Load management


// creates an XMLHttpRequest instance
function createXmlHttpRequestObject(){
	// will store the reference to the XMLHttpRequest object
	var xmlHttp;
	// this should work for all browsers except IE6 and older
	try{
		// try to create XMLHttpRequest object
		xmlHttp = new XMLHttpRequest();
	}
	catch(e){
		// assume IE6 or older
		var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
		"MSXML2.XMLHTTP.5.0",
		"MSXML2.XMLHTTP.4.0",
		"MSXML2.XMLHTTP.3.0",
		"MSXML2.XMLHTTP",
		"Microsoft.XMLHTTP");
		// try every prog id until one works
		for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++){
			try{
				// try to create XMLHttpRequest object
				xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
			}
		catch (e){}
	}
}
// return the created object or display an error message
if (!xmlHttp){
	customSwitch(_globalTargetDiv, false);
	errorHandler("<center>Eroare</center> <p> Error creating the XMLHttpRequest object.</p> errorEnd-->");
}
else
	return xmlHttp;
}

//custom Display
function display(targetDiv, targetPage, silent, vars, style, _class, method){
	//alert("targetDiv- "+targetDiv+" targetPage - "+targetPage+" silent - "+silent+" vars - "+vars+" style - "+style+" _class - "+_class+" method - "+method);
	if(targetPage.slice(0,13)=='javascript://'){
		targetPage = './'+targetPage.slice(13);
	}
	loadStuff(targetDiv, targetPage, silent, vars, style, method);
	customSwitch(targetDiv, true, _class);
}


//queue
var memory = new Array();
function remeberClicks(targetDiv, targetPage, silent, vars, style, method){
			memory[memory.length] = targetDiv;
			memory[memory.length] = targetPage;
			memory[memory.length] = silent;
			memory[memory.length] = vars;
			memory[memory.length] = style;
			memory[memory.length] = method;
}

//loading nextData LIFO;
function loadNextData(){
	if(memory.length !=0){
	method = memory.pop();
	style = memory.pop();
	vars = memory.pop();
	silent = memory.pop();
	targetPage = memory.pop();
	targetDiv = memory.pop();
	display(targetDiv, targetPage, silent, vars, style, method);
	}
}

function removeLink(div){
	targetUrl = "";
	siteLocation = document.URL.split("#");
	if(siteLocation[1] != undefined){
		siteLocation = siteLocation[1].split("~");
	}else{
		siteLocation[0] = "";	
	}
	for(i = 1; i < siteLocation.length; i+=1){
		siteArea = siteLocation[i].split("!");
		siteStyle = siteArea[0].split(":");
		if(siteStyle[0] != div){
			targetUrl += '~'+siteLocation[i];
		}
	}
	MM_openBrWindow('#'+targetUrl, '_self');
}

// called to read a file from the server
function loadStuff(targetDiv, targetPage, silent, vars, style, method){
	if(blocker == false){
		originalURL = new String();
		targetPage = targetPage.replace('.php','');
		vars == undefined ? vars = "" : null;
		targetUrl = "";
		found = false;
		siteLocation = document.URL.split("#");
		if(siteLocation[1] != undefined){
			siteLocation = siteLocation[1].split("~");
		}else{
			siteLocation[0] = "";	
		}
		for(i = 1; i < siteLocation.length; i+=1){
			siteArea = siteLocation[i].split("!");
			siteStyle = siteArea[0].split(":");
			if(siteStyle[0] == targetDiv){
				if(silent == false){
					targetUrl += '~'+targetDiv+':'+style+'!'+targetPage+'!'+vars;
				}else{
					targetUrl += '~'+targetDiv+':'+style+'!'+targetPage+'!';
				}
				found = true;
			}else{
				targetUrl += '~'+siteLocation[i];
			}
		}
		if(found == false){
			if(silent == false){
					targetUrl += '~'+targetDiv+':'+style+'!'+targetPage+'!'+vars;
				}else{
					targetUrl += '~'+targetDiv+':'+style+'!'+targetPage+'!';
				}
		}
		MM_openBrWindow('#'+targetUrl, '_self');
		historyManager.add(targetUrl);
		setActiveStyleSheet(style);
		_globalTargetDiv = targetDiv;
		method == null ? method = "GET" : null;
		vars == null ? vars = "": null;
		// only continue if xmlHttp isn't void
		targetPage = "./"+targetPage+".php"
		if (xmlHttp){
			// try to connect to the server
			try{
				if(method == "GET"){
					targetPage+="?"+vars;
					// initiate reading PHP file from the server
					xmlHttp.open(method, targetPage, true);
					xmlHttp.onreadystatechange = handleRequestStateChange;
					xmlHttp.send(null);
				} else {
					// initiate reading PHP file from the server
					xmlHttp.open(method, targetPage, true);
					xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
					xmlHttp.onreadystatechange = handleRequestStateChange;
					xmlHttp.send(vars);
				}
			}
			// display the error in case of failure
			catch (e){
				customSwitch(_globalTargetDiv, false);
				errorHandler("<center>Eroare</center> <p>Can't connect to server: </br> " + e.toString() + "</p>");
			}
		}
	}else{
		remeberClicks(targetDiv, targetPage, silent, vars, style, method);
	}
}

//checkbox change value
function checkbox_change(id){
	value = document.getElementById(id).value;
	if(value == "1"){
		document.getElementById(id).value = "0";
		document.getElementById(id).checked = false;
	}else{
		document.getElementById(id).value = "1";
		document.getElementById(id).checked = true;
	}
	//errorHandler("<center>Valoare checkbox</center><p>"+id+" = "+document.getElementById(id).value+"</p>");
}

//switch to visible/invisible
function customSwitch(id, on, _class){
	(_class != null && _class != 'null' && _class != '') ? document.getElementById(id).className = _class : null;
	var status = document.getElementById(id).style.visibility;
	if((status == 'hidden' || status == '') && on != false){
		document.getElementById(id).style.visibility = 'visible';
		//document.getElementById('loading').style.visibility = 'hidden';
	} else if(on == false){
		document.getElementById(id).style.visibility = 'hidden';
	} else return false;
}

// Multiple fields feedback;
// targetDiv, targetPage, vars, method
// silent means the variables won't be posted in URL
// mode is for cheking data or not
function submitForm(mode, targetDiv, targetPage, silent, style, method){
	var loop=0, vars = "", value = "", error = false;
	for ( loop = arguments.length-1; loop >=6; loop--){
		value = document.getElementById(arguments[loop]).value;
		if(mode == true && (value == null || value == "undefined" || value == "")){
			errorHandler("<center>Eroare!</center> <p> Nu au fost completate toate campurile. </p>");
			error = true;
			break;
		}
		vars += arguments[loop]+"="+value;
		(loop-1) >=5 ? vars +="&" : null;
	}
	!error ? loadStuff(targetDiv, targetPage, silent, vars, style, method) : null;
}

//function that hadles errors;
function errorHandler(dataString, id){
		if(id == null || id == "" || id == undefined){
			var myErrorDiv = document.getElementById("errorDiv");
			id = "errorDiv";
		}else{
			var myErrorDiv = document.getElementById(id);	
		}
		var ok = "<center><input onclick=\"javascript:customSwitch('"+id+"', false);customSwitch('loading', false);\" id=\"commErrorOk\" type=\"button\" value=\"ok\" /></center><br/>";
		if (dataString == null || dataString == "") {
			var	dataString = "<center> Unknown error </center> <p>An unknown error has occured, please retry!</p>";
		}else{
			myErrorDiv.innerHTML = dataString+ok;
		}
		customSwitch(id, true);	
}

//changes the class of the loading object
function changeClass(myDivId, dataString){
	if (dataString != null || dataString != "") {
		var start = dataString.indexOf("<!--newClassStart")+18;
		var end = dataString.indexOf("newClassEnd-->");
		var newClass = dataString.slice(start, end);
		customSwitch(myDivId, true, newClass);
	}	
}
// function that handles the HTTP response
function handleRequestStateChange(){
	// obtain a reference to the <div> element on the page
	var myDiv = document.getElementById(_globalTargetDiv);
	var myDivId = _globalTargetDiv;
	myDiv.innerHTML = loading;
	blocker = true;
	//custom Loading... made by wm_maw
	//customSwitch("loading", true, "loading");
	customSwitch(myDivId, false);
	//display the status of the request
	if (xmlHttp.readyState == 4){
	// continue only if HTTP status is "OK"
	if (xmlHttp.status == 200){
		try{
			// read the message from the server
			response = xmlHttp.responseText;
			//php error handeling
			if(response.indexOf("<!--newClassStart") != -1){
				changeClass(myDivId, response);
			}
			if(response.indexOf("<!--errorStart") != -1){
				var start = response.indexOf("<!--errorStart")+14;
				var end = response.indexOf("errorEnd-->");
				var error = response.slice(start, end);
				errorHandler(error);
			}
			// display the message
			myDiv.innerHTML = response;
			customSwitch(myDivId, true);
			blocker = false;
			loadNextData();
			//setTimeout("",50);
		}
		catch(e){
			// display error message
			errorHandler("<center>Eroare</center> <p> Error reading the response:" + e.toString() + "</p>");
		//	customSwitch(myDivId, false);
			blocker = false;
			loadNextData();
		}
	} else{
		// display status message
		errorHandler("<center>Eroare</center> <p>There was a problem retrieving the data: </br> " + xmlHttp.statusText + "</p>");
	//	customSwitch(myDivId, false);
		blocker = false;
		loadNextData();
		}
	}
}

//change a button..
function changeButt(id, targetDiv, targetPage, vars, method, _class, name){
	var button = document.getElementById(id);
	button.href = "javascript:display('"+targetDiv+"', '"+targetPage+"', "+vars+", "+method+", '"+_class+"');"
	button.innerHTML = name;
}

//change a title..
function changeTitle(id, newTitle){
	var title = document.getElementById(id);
	title.innerHTML = newTitle;
}