// Javascript

// convert all characters to lowercase to simplify testing
var agt = navigator.userAgent.toLowerCase();
var appVer = navigator.appVersion.toLowerCase();

// *** BROWSER VERSION ***

var is_minor = parseFloat(appVer);
var is_major = parseInt(is_minor);
var is_opera = (agt.indexOf("opera") != -1);
var iePos  = appVer.indexOf('msie');
var is_ie   = ((iePos!=-1) && (!is_opera));
var is_ie7up = (is_ie && (agt.indexOf("msie 7.") != -1));

function getElement(id) {
	if (document.getElementById) {
		return document.getElementById(id);
	}
	else if (document.all) {
		return document.all[id];
	}
	else if (document.layers) {
		return document.layers[id];
	}
}

// threadsafe asynchronous XMLHTTPRequest code V 2.4
var TAVersion = "2.4";

function requestData (url, data, callback, dType, cApply) {
    resXML = (dType == "XML" ? true : false);
    // we use a javascript feature here called "inner functions"
    // using these means the local variables retain their values after the outer function
    // has returned. this is useful for thread safety, so
    // reassigning the onreadystatechange function doesn\'t stomp over earlier requests.
    function ajaxBindCallback() {
        if (ajaxRequest.readyState == 4) {
            if (ajaxRequest.status == 200) {
                if (ajaxCallback) {
                    if (resXML) {
                        eval(ajaxCallback + "(ajaxRequest.responseXML.documentElement, ajaxApply)");
                    } else {
                        eval(ajaxCallback + "(ajaxRequest.responseText, ajaxApply)");
                    }
                } else {
                    alert("No callback defined!");
                }
            } else {
                alert("There was a problem retrieving the XML data!\n\nStatus: " + ajaxRequest.statusText + " (" + ajaxRequest.status + ")\n\nResponse:\n" + ajaxRequest.responseText);
            }
        }
    }
    
    // use a local variable to hold our request and callback until the inner function is called...
    var ajaxRequest = false;
    var ajaxCallback = callback;
    var ajaxApply = cApply;
    
    // bind our callback then hit the server...
    ajaxRequest = getHTTPObject(resXML);
    
    if (!ajaxRequest) {
        return false;
    } else {
        ajaxRequest.onreadystatechange = ajaxBindCallback;
        try {
            ajaxRequest.open("POST", url, true);
        } catch (e) {
            return false;
        }
        ajaxRequest.setRequestHeader("X-Requested-With", "XMLHttpRequest");
        ajaxRequest.setRequestHeader("X-Prototype-Version", TAVersion);
        ajaxRequest.setRequestHeader("Connection", "close");
        ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        ajaxRequest.send(data);
        return true;
    }
    return false;
}

function getHTTPObject (resXML) {
	var xO = false;
	if (typeof XMLHttpRequest != "undefined") {
		try {
			xO = new XMLHttpRequest();
			if (resXML) {
				xO.overrideMimeType("text/xml");
			} else {
				xO.overrideMimeType("text/html");
			}
			return xO;
		} catch (e) {
			if (is_ie7up) {
				xO = new XMLHttpRequest();
				return xO;
			} else {
				xO = false;
			}
		}
	} else {
		var msxmls = new Array(
			"Msxml2.XMLHTTP",
			"Msxml2.XMLHTTP.5.0",
			"Msxml2.XMLHTTP.4.0",
			"Msxml2.XMLHTTP.3.0",
			"Microsoft.XMLHTTP"
		);
		for (var i = 0; i < msxmls.length; i++) {
			var msxml = msxmls[i]; 
			try {
				xO = new ActiveXObject(msxml);
				return xO;
			} catch(e) {
				xO = false;
			}
		}
		
	}
	return xO;
}
