/**
 * XMLHTTP Object creation
 * @param bool newObj - if true, it will create and return a new object
 * even if one already exists
 */
function getXMLHTTPObject(newObj)
{
	if (window.xmlhttp && newObj == false)
	    return window.xmlhttp;
    else
	{
	 	// native XMLHttpRequest object (non-IE)
	    if (window.XMLHttpRequest)
	        return new XMLHttpRequest();
		else if (window.ActiveXObject)     // IE/Windows ActiveX version
	        return new ActiveXObject("Microsoft.XMLHTTP");
        // http_request.overrideMimeType('text/xml');

	}
}

xmlhttp = getXMLHTTPObject();


function runXMLHTTP(url, returnFunction)
{
	xmlhttp.open("GET", url);
	if (returnFunction)
		xmlhttp.onreadystatechange = returnFunction;
    xmlhttp.send(null);
}

/**
 * Posts a form to the server
 * @param form form - form element to post
 * @param string url - url to post to
 * @param function returnFunction - actual function to call when done. (pass in without quotes)
 */
function postForm(form, url, callback_function, return_xml)
{
    var formValues = "";
	var fields = form.elements;
	for (var i=0; i < fields.length; i++)
	{
		// if multiple selections are available, how do you handle that? (like <select multiple> or checkbox array, etc.)
		fieldName = URLEncode(fields[i].name);
		if (fields[i].type == "select-multiple")
		{
			fieldValue = URLEncode(getMultiple(fields[i]));
			formValues += fieldName += "=" + fieldValue;
		}
		if (fields[i].type == "checkbox")
		{
			if (fields[i].checked == true)
			{
				fieldValue = URLEncode(fields[i].value);
				formValues += fieldName + "=" + fieldValue;		
			}
		}
		else
		{
			fieldValue = URLEncode(fields[i].value);
			formValues += fieldName + "=" + fieldValue;
		}
		if (i < fields.length - 1)
		{
			formValues += "&";
		}
	}

	xmlhttp.open("POST", url);
	xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");


	// Do callback
	if (callback_function)
	{
		// xmlhttp.onreadystatechange = returnFunction;
	   xmlhttp.onreadystatechange = function() 
	   {
	       if (xmlhttp.readyState == 4) 
		   {
	           if (xmlhttp.status == 200) 
			   {
	               if (return_xml) 
				   {
	                    callback_function(xmlhttp.responseXML);
	                   //eval(callback_function + '(http_request.responseXML)');
	               } 
				   else 
				   {
		               callback_function(xmlhttp.responseText);
	                   //eval(callback_function + '(http_request.responseText)');
	               }
	           } 
			   else 
			   {
	               alert('There was a problem with the request.(Code: ' + xmlhttp.status + ')');
	           }
	       }
		}
	}
	
    xmlhttp.send(formValues);
}

function ajaxUpdateElem(url, elem)
{
   var http_request = false;

   if (window.XMLHttpRequest) { // Mozilla, Safari,...
       http_request = new XMLHttpRequest();
       if (http_request.overrideMimeType) {
           http_request.overrideMimeType('text/xml');
       }
   } else if (window.ActiveXObject) { // IE
       try {
           http_request = new ActiveXObject("Msxml2.XMLHTTP");
       } catch (e) {
           try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
           } catch (e) {}
       }
   }

   if (!http_request) {
       alert('Unfortunatelly you browser doesn\'t support this feature.');
       return false;
   }
   http_request.onreadystatechange = function() {
       if (http_request.readyState == 4) {
           if (http_request.status == 200) 
           {
				document.getElementById(elem).innerHTML = http_request.responseText;
           } 
           else {
               alert('There was a problem with the request.(Code: ' + http_request.status + ')');
           }
       }
   }
   http_request.open('GET', url, true);
   http_request.send(null);
}


/**
 * Grabs the value from a field in an xml response
 */
function getFromResponse(field, response)
{
	return response.getElementsByTagName(field)[0].firstChild.data;	
}


function getMultiple(obj)
{
	selItems = "";
	numItems = obj.options.length;
	//max = numItems - 1;

	for (i=0; i < numItems; i++)
	{
		if (obj.options[i].selected == true)
		{
			selItems += obj.options[i].value += ",";
			
			//if (i != max)
			//	selItems += ",";
		}
	}
	return selItems;
}

function xmlhttpComplete(message)
{
	if (xmlhttp.readyState == 4) // done
	{
		if (xmlhttp.status != 200) // actual url
		{
		    if (!message)
				message = "Could not retrieve XML Data.";
			alert(message);
		    return false;
		}
		else
		    return true;
	}
	else
	    return false;

}

/**
 * The only function you will need to make an http request
 * (besides your callback function which doesn't even have to reference the object)
 * @param string - The URL to get
 * @param function - The function to call when the response is received (do not put in quotes or parenthesis)
 * @param bool - flag if the result should be passed as XMLDocument or as plain text to the callback function
 */
function makeHttpRequest(url, callback_function, return_xml)
{

   var http_request = false;

   if (window.XMLHttpRequest) { // Mozilla, Safari,...
       http_request = new XMLHttpRequest();
       if (http_request.overrideMimeType) {
           http_request.overrideMimeType('text/xml');
       }
   } else if (window.ActiveXObject) { // IE
       try {
           http_request = new ActiveXObject("Msxml2.XMLHTTP");
       } catch (e) {
           try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
           } catch (e) {}
       }
   }

   if (!http_request) {
       alert('Unfortunatelly you browser doesn\'t support this feature.');
       return false;
   }
   http_request.onreadystatechange = function() {
       if (http_request.readyState == 4) {
           if (http_request.status == 200) {
               if (return_xml) {
                    callback_function(http_request.responseXML);
                   //eval(callback_function + '(http_request.responseXML)');
               } else {
	               callback_function(http_request.responseText);
                   //eval(callback_function + '(http_request.responseText)');
               }
           } else {
               alert('There was a problem with the request.(Code: ' + http_request.status + ')');
           }
       }
   }
   http_request.open('GET', url, true);
   http_request.send(null);
}


function URLEncode(value)
{

	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	var plaintext = value;
	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";				// x-www-urlencoded, rather than %20
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
			    alert( "Unicode Character '"
                        + ch
                        + "' cannot be encoded using standard URL encoding.\n" +
				          "(URL encoding only supports 8-bit characters.)\n" +
						  "A space (+) will be substituted." );
				encoded += "+";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for

	return encoded;
	
	//return false;
};

function URLDecode(value)
{
   // Replace + with ' '
   // Replace %xx with equivalent character
   // Put [ERROR] in output if %xx is invalid.
   var HEXCHARS = "0123456789ABCDEFabcdef";
   var encoded = value;
   var plaintext = "";
   var i = 0;
   while (i < encoded.length) {
       var ch = encoded.charAt(i);
	   if (ch == "+") {
	       plaintext += " ";
		   i++;
	   } else if (ch == "%") {
			if (i < (encoded.length-2)
					&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1
					&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
				plaintext += unescape( encoded.substr(i,3) );
				i += 3;
			} else {
				alert( 'Bad escape combination near ...' + encoded.substr(i) );
				plaintext += "%[ERROR]";
				i++;
			}
		} else {
		   plaintext += ch;
		   i++;
		}
	} // while
	return plaintext;

};

