
/**************************************************
* Name: hijax_generic.js
* Author: 
* Modified: 2009-06-25 15:42:46
* Overview:
* Copyright: WLD
* Notes: 
**************************************************/

// Whether were debugging AJAX responses
var ajaxDebugMode = false;

// Adds window load events safely
function winAddLoadEvent (func) {
	var oldonload = window.onload;
	if (typeof window.onload != "function") {
		window.onload = func;
	} else {
		window.onload = function () {
			oldonload ();
			func ();
		}
	}
}

// Adds window onDOMReady events safely
/* THIS IS A COPYRIGHT AND LICENSE RESTRICTED FUNCTION WHICH MAY NOT BE REUSED OR INCORPORATED WIHOUT EXPRESS
   WRITTEN CONSENT GRANTING LICENSE AND RIGHTS TO DO SO */
function winAddReadyEvent (func) {
	var d = window.document;
	var u = window.navigator.userAgent.toLowerCase ();

	function init (e) {
		if (!arguments.callee.done) {
			arguments.callee.done = true;
			func (e);
		}
	}

	if (/khtml|webkit/.test (u)) { // Konqi/Safari
		(function () {
			if (/complete|loaded/.test (d.readyState)) {
				init ("poll");
			} else {
				setTimeout (arguments.callee, 10);
			}
		}) ();
	} else if (/msie/.test (u) && !window.opera) { // IE
		(function () {
			try {
				d.documentElement.doScroll ("left");
			} catch (e) {
				setTimeout (arguments.callee, 10);
				return;
			}
			init ("poll");
		}) ();
		d.attachEvent (
			"onreadystatechange",
			function (e) {
				if (d.readyState == "complete") {
					d.detachEvent ("on" + e.type, arguments.callee);
					init (e.type);
				}
			}
		);
	} else if (d.addEventListener && (/gecko/.test (u) && parseFloat (u.split ("rv:")[1]) >= 1.8) || (/opera/.test (u) && parseFloat (u.split ("opera/")[1]) > 9)) { // Others with native DOMContentLoaded
		d.addEventListener (
			"DOMContentLoaded",
			function (e) {
				this.removeEventListener (e.type, arguments.callee, false);
				init (e.type);
			},
			false
		);
	} else { // Worst case fallback
		winAddLoadEvent (func);
	}
}

// Checks the DOM for basic functionality
function testSanity () {
	if (document.getElementById && document.getElementsByTagName)
		sanityCheck = true;
}

// Parses a query string
function parseQueryString (url) {
	this.params = new Object ();

	url = url.replace (/\+/g, " "); // Convert "+" back to space
	url = url.substring (url.indexOf ("?") + 1, url.length); // Remove anything before "?"
	var args = url.split ("&"); // Split the name/value pairs

	// Parse the name/value pairs
	for (var i = 0; i < args.length; i++) {
		var value;
		var pair = args[i].split ("=");
		var name = unescape (pair[0]);

		if (pair.length == 2) {
			value = unescape (pair[1]);
		} else {
			value = name;
		}

		this.params[name] = value;
	}

	return this.params;
}

// Create a new HTTP connection object
function httpMech () {
	var httpServerGW = false;

	if (window.XMLHttpRequest) {
		httpServerGW = new XMLHttpRequest ();
	} else if (window.ActiveXObject) {
		try {
			httpServerGW = new ActiveXObject ("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				httpServerGW = new ActiveXObject ("Microsoft.XMLHTTP");
			} catch (e) {
				httpServerGW = false;
			}
		}
	}

	return httpServerGW;
}

// Runs the HTTP request
function httpDo (httpMode, httpURI, httpCallback, httpData) {
	var httpRequest = new httpMech ();
	if (!httpRequest) return false;

	httpRequest.onreadystatechange = function () {
		if (httpRequest.readyState == 4) {
			if (httpRequest.status == 200 || httpRequest.status == 304) {
				if (ajaxDebugMode)
					httpDebug (httpRequest, httpMode, httpURI, httpCallback, httpData);
				if (httpCallback != null)
					httpCallback (httpRequest);
			}
		}
	};

	httpRequest.open (httpMode, httpURI, true);

	if (httpData) {
		httpRequest.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
		httpRequest.send (httpData);
	} else {
		httpRequest.send (null);
	}

	return true;
}

// Shows debug for an AJAX response
function httpDebug (httpRequest, httpMode, httpURI, httpCallback, httpData) {
	// The debug string
	var debugStr = false;

	// First try XML
	if (httpRequest.responseXML) {
		var debugXML = httpRequest.responseXML;
		//debugStr = (debugXML.textContent ? debugXML.textContent : (debugXML.innerText ? debugXML.innerText : (debugXML.Text ? debugXML.Text : (debugXML.xml ? debugXML.xml : false))));

		if (debugXML.xml) {
			debugStr = debugXML.xml;
		} else {
			var debugSerialiser = new XMLSerializer ();
			debugStr = debugSerialiser.serializeToString (debugXML);
		}

		if (!debugStr)
			alert ("[Could not extract responseXML string - will try responseText but it may not be identical]");
	}

	// Secondly try text
	if (!debugStr && httpRequest.responseText)
		debugStr = httpRequest.responseText;

	// Nothing worked :(
	if (!debugStr)
		debugStr = "[No response found or could not extract it]";

	alert ("Request:\n\nMode: " + httpMode + " HTTP/1.1\nURI: " + httpURI + "\nPost Data: " + (httpData ? httpData : "NONE") + "\nCallback: " + (httpCallback ? "\n\n" + httpCallback : "NONE"));
	alert ("Headers:\n\n" + httpRequest.getAllResponseHeaders());
	alert ("Response:\n\n" + debugStr.replace (/>/g, ">\n").replace (/</g, "\n<").replace (/\n\n/g, "\n"));
}

// Sleeps for milliseconds
function uSleep (delay) {
	var currentTime = new Date ();
	var exitTime = currentTime.getTime () + delay;
	while (true) {
		currentTime = new Date ();
		if (currentTime.getTime () >= exitTime)
			return true;
	}
}

// Hides or shows all select elements (they show through absolutely positioned layers in IE)
function formElementsVisible (show) {
	var formElements = document.getElementsByTagName ("select");
	for (var i = 0; i < formElements.length; i++)
		formElements[i].style.visibility = (show ? "" : "hidden");
}

// Fades up an element
function fadeUp (element, red, green, blue, speed, tored, toblue, togreen) {
	if (element.fading)
		clearTimeout (element.fading);

	if (!speed)
		speed = 100;

	if (!tored || tored > 255 || tored < 0)
		tored = 255;

	if (!togreen || togreen > 255 || togreen < 0)
		togreen = 255;

	if (!toblue || toblue > 255 || toblue < 0)
		toblue = 255;

	element.style.backgroundColor = "rgb(" + red + "," + green + "," + blue +")";

	if (red == tored && green == togreen && blue == toblue) {
		element.style.backgroundColor = "";
		return;
	}

	var newRed = red + Math.ceil ((tored - red) / 10);
	var newGreen = green + Math.ceil ((togreen - green) / 10);
	var newBlue = blue + Math.ceil ((toblue - blue) / 10);

	var fadeRepeat = function () {
		fadeUp (element, newRed, newGreen, newBlue, speed, tored, togreen, toblue);
	};

	element.fading = setTimeout (fadeRepeat, speed);
}

// Hard resets a form, fully clearing everything
function formHardReset (what) {
	// Get the elements and attempt a generic reset
	if (!what.elements) return true;
	var formElements = what.elements;

	// Go through the element and reset them manually based on type
	for (var i = 0; i < formElements.length; i++) {
		if (formElements[i].type.toLowerCase () == "text" || formElements[i].type.toLowerCase () == "password" || formElements[i].type.toLowerCase () == "textarea") {
			formElements[i].value = "";
		} else if (formElements[i].type.toLowerCase () == "radio") {
			formElements[i].selected = false;
		} else if (formElements[i].type.toLowerCase () == "checkbox") {
			formElements[i].checked = false;
		} else if (formElements[i].type.toLowerCase ().indexOf ("select") > -1) { // Type comparison method deliberate?
			formElements[i].selectedIndex = 0;
		}
	}

	what.reset (); // Attempt to reset back to default

	// All done
	return true;
}


// Immediately check whether Hijax can operate in this client
var sanityCheck = false;
testSanity ();
