/**
 * Part of the GLayer example by qFox, 
 * v1.00 February 2009, http://glayer.qfox.nl
 */

// ajax script: version something (i dont really keep track), qfox.nl
// all this stuff is publicly available at one site or another

var ajaxwaiting = false;
function sendGET(myurl, callback, noanticache) { // noanticache allows browsers like IE to cache the page
	if (!callback) callback = ajaxHandler;
	ajaxRunning();
	if (!noanticache) {
		if (myurl.indexOf('?') >= 0 && myurl.indexOf('?') != (myurl.length-1)) myurl += "&"+new Date().getTime();
		else myurl += "?"+new Date().getTime();
	}
	var xmlHttp = getAjaxObject(callback);
	if (xmlHttp == null) {
		alert("Browser does not support ajax Requests. Unable to process request.");
		return
	}
	xmlHttp.open("GET", myurl, true);
	xmlHttp.setRequestHeader("Connection", "close"); 
	xmlHttp.send(null);
}
function sendPOST(myurl, data, callback, noconvert, noanticache) {
	if (!callback) callback = ajaxHandler;
	ajaxRunning();
	if (!noanticache) {
		if (myurl.indexOf('?') >= 0 && myurl.indexOf('?') != (myurl.length-1)) myurl += "&"+new Date().getTime();
		else myurl += "?"+new Date().getTime();
	}
	if (!noconvert) data = assocToPostdata(data);
	var xmlHttp = getAjaxObject(callback);
	if (xmlHttp == null) {
		alert ("Browser does not support ajax Requests. Unable to process request.");
		return
	}
	xmlHttp.open('POST', myurl, true); 
	xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded;"); 
	xmlHttp.setRequestHeader("Content-length", data.length); 
	xmlHttp.setRequestHeader("Connection", "close");
	xmlHttp.setRequestHeader("Pragma", "no-cache");
	xmlHttp.setRequestHeader("Cache-Control", "no-cache");
	xmlHttp.send(data);
}
function sendJSON(url, noanticache) {
	if (!noanticache) {
		if (url.indexOf('?') >= 0 && url.indexOf('?') != (url.length-1)) url += "&"+new Date().getTime();
		else url += "?"+new Date().getTime();
	}
	ajaxRunning();
	var newjson = document.createElement( 'script' );
	newjson.language = 'javascript';
	newjson.type = 'text/javascript';
	newjson.src = url;
	var h = document.getElementsByTagName('head')[0];
	h.appendChild(newjson);
}

function assocToPostdata(arr) {
	// create query string from associated array
	// this already and only urlencodes ampersands and percentages
	// because they are the least of the characters that could cause
	// problems with sending post requests
	var s = '';
	var data;
	for (var i in arr) {
		data = arr[i]+''; // ensure .replace() is there for non-string-atoms or null values
		data = data.replace(/%/g,'%25'); // replace all % first
		data = data.replace(/&/g,'%26'); // then replace all ampersands (&) to prevent screwing up POST data
		// we dont have to bother with anything else since we're in UTF8. the server will automatically translate POSTed urlencoding above back to normal
		s = s+i+"="+data+"&";
	}
	//alert("form data:\n"+s);
	return s;
}

/*
 * get all the child elements of a given form element and
 * return them as an associative array (to be fed to ajax)
 */
function getFormData(form) {
  var out = new Array();
  var fd = form.getElementsByTagName("input");
  for (var i = 0; i < fd.length; i++) {
  	if (fd.item(i).type != 'button') {
  		if (fd.item(i).type == 'checkbox') {
  			if (fd.item(i).checked) fd.item(i).value = "1";
  			else fd.item(i).value = "";
  		}
  		out.push( fd.item(i) );
  	}
  }
  fd = form.getElementsByTagName("textarea");
  for (var i = 0; i < fd.length; i++) out.push( fd.item(i) );
  fd = form.getElementsByTagName("select");
  for (var i = 0; i < fd.length; i++) out.push( fd.item(i) );

  var data = {};
  for (var i=0; i<out.length; ++i) {
  	//alert("name: "+out[i].name+" value: "+out[i].value);
  	data[out[i].name] = out[i].value;
  }
  return data;
}

function getAjaxObject(callback) {
	if (!callback) callback = ajaxHandler;
	var objXMLHttp = null;
	if (window.XMLHttpRequest) {
	   objXMLHttp = new XMLHttpRequest();
	}
	else if (window.ActiveXObject) {
	  objXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
	}
	objXMLHttp.onreadystatechange = function () {
		if (objXMLHttp.readyState == 4) {
			try { objXMLHttp.status; // we're just "touching" the value to trigger the exception, if one has been thrown. this saves32 us having to trap the entire parsereply function
			} catch (errrr) {
				// just do it for anything. this will also cause the error to show for 401 errors (unknown location), but it should never happen when not manipulating the script manually
				alert("Warning: Unknown error with server request.");
				return;
			}
			if (objXMLHttp.status == 200) {
				var ret = objXMLHttp.responseText;
				callback(ret);
			} 
			else {
				alert("File request problem (code: "+objXMLHttp.status+")!"); // most likely file not found...
			}
		}
	};

	return objXMLHttp;
}

function ajaxHandler(ret) {
	if (window.parseReply) parseReply(ret);
	else alert("Error: parseReply() not found.\n\n"+ret);
	ajaxDone();
}

function ajaxRunning() {
	ajaxwaiting = true;
	var e = document.getElementById('ajax');
	if (e) e.style.display = 'inline';
}
function ajaxDone() {
	ajaxwaiting = false;
	var e = document.getElementById('ajax');
	if (e) e.style.display = 'none';
}
