/**
 * XML Request handling, with support for multiple connections
 * (c) 2006 IVinity
 * http://www.ivinity.nl/
 * Tested with:
 *  IE 6 (win)
 *  Opera 8.5 (win / mac)
 *  Firefox 1.5 (win / mac)
 *  Safari 1.3 (mac)
 */
 
// global request and XML document objects
var http_request;
var handleRequestFunctionArray = new Array();

function XMLRequestHandler(method, url, asynch, data) {
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		this.xmlRequest = new XMLHttpRequest();
	} else if (window.ActiveXObject) { // IE
		this.xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
	}
	var self = this;
	this.handle = processReqChange;
	this.requestID = requestID++;
	
	try {
		if(arguments[4] == false) {
		
		} else {
			this.xmlRequest.onreadystatechange = function() { self.handle(); }	
		}
	}
	catch(e) { this.xmlRequest.onreadystatechange = function() { self.handle(); } }
	
	this.xmlRequest.open(method, url, asynch);
	if (method == "POST") {
		this.xmlRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		this.xmlRequest.setRequestHeader("Accept-Charset","UTF-8");

	}
	this.xmlRequest.send(data);
	return this;
}

var requests = new Array();
var requestID = 1;

function addXMLListenerFunction(functionName) {
	var valid = true;
	
	// Check if function already excists
	for(var i = 0; i < handleRequestFunctionArray.length; i++) {
		if(handleRequestFunctionArray[i] == functionName) valid = false;
	}
	
	if(valid) handleRequestFunctionArray[handleRequestFunctionArray.length] = functionName;
}


function loadXMLDoc(url) {
	var index = requests.length;
	requests[index] = new XMLRequestHandler('GET', url, true, null);	
}

function loadXMLDocPost(url, postdata) {
	var index = requests.length;
	requests[index] = new XMLRequestHandler('POST', url, true, postdata);	
}

// handle onreadystatechange event of req object
function processReqChange() {
    // only if req shows "loaded"
    if (this.xmlRequest.readyState == 4) {
        // only if "OK"
        if (this.xmlRequest.status == 200) {
					if(window.handleXMLupdate) { // check if handleXMLupdate function exists
						handleXMLupdate(this.xmlRequest); // default function, backwards compatibility
					}

        			for(var j = 0; j < handleRequestFunctionArray.length; j++) {
						var functionString = handleRequestFunctionArray[j]+"(this.xmlRequest);";
						eval(functionString);
					}
										
					// Cleanup
					for (i = 0; i < requests.length; i++) {
						if (requests[i].requestID == this.requestID) {
							requests.splice(i, 1);							
						}
					}					
        } else {
           alert("There was a problem retrieving the XML data:\n" +
               this.xmlRequest.statusText);
        }
    }
}

// retrieve text of an XML document element, including
// elements using namespaces
function getElementTextNS(prefix, local, parentElem, index) {
    var result = "";
    if (prefix && isIE) {
        // IE/Windows way of handling namespaces
        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
    } else {
        // the namespace versions of this method
        // (getElementsByTagNameNS()) operate
        // differently in Safari and Mozilla, but both
        // return value with just local name, provided
        // there aren't conflicts with non-namespace element
        // names
        result = parentElem.getElementsByTagName(local)[index];
    }
    if (result) {
        // get text, accounting for possible
        // whitespace (carriage return) text nodes
        if (result.childNodes.length > 1) {
            return result.childNodes[1].nodeValue;
        } else {
            return result.firstChild.nodeValue;
        }
    } else {
        return "n/a";
    }
}

/**
* Dynamically loads the given content into the element, also supporting HTML and Javascript
**/
function setHTML(elementIDName,content) { 
    var search = content; 
    var script; 
          
    while( script = search.match(/(<script[^>]+javascript[^>]+>\s*(<!--)?)/i)) { 
      search = search.substr(search.indexOf(RegExp.$1) + RegExp.$1.length); 
       
      if (!(endscript = search.match(/((-->)?\s*<\/script>)/))) break; 
       
      block = search.substr(0, search.indexOf(RegExp.$1)); 
      search = search.substring(block.length + RegExp.$1.length); 
       
      var oScript = document.createElement('script'); 
      oScript.text = block; 
      document.getElementsByTagName("head").item(0).appendChild(oScript); 
    } 
    
    document.getElementById(elementIDName).innerHTML = content; 
} 



/**
* XML POSTING SUPPORT FOR FORMS by Guido 23-02-2009
**/
function lib_submitFormByAjax(formID, postUrl) {
	var form = document.getElementById(formID);
	var data = lib_getFormValues(form,"");
	loadXMLDocPost(postUrl, data)
}

function lib_getFormValues(formObject,valFunc) {
   var str = "";
   var valueArr = null;
   var val = "";
   var cmd = "";
   for(var i = 0; i < formObject.elements.length; i++) {
       switch(formObject.elements[i].type) {
           	case "hidden":
           		str += formObject.elements[i].name + "=" + escape(formObject.elements[i].value) + "&";
           		break;
           	case "checkbox":
           		if(formObject.elements[i].checked) {
           			str += formObject.elements[i].name + "=" + escape(formObject.elements[i].value) + "&";
           		}
           		break;
       		case "text":
                if(valFunc) {
                    //use single quotes for argument so that the value of
                    //fobj.elements[i].value is treated as a string not a literal
                    cmd = valFunc + "(" + 'fobj.elements[i].value' + ")";
                    val = eval(cmd)
                }
                str += formObject.elements[i].name + "=" + escape(formObject.elements[i].value) + "&";
                 break;
           case "select-one":
                str += formObject.elements[i].name + "=" + formObject.elements[i].options[formObject.elements[i].selectedIndex].value + "&";
                break;
           case "textarea":
                str += formObject.elements[i].name + "=" + formObject.elements[i].value + "&";
                break;
       }
   }
   str = str.substr(0,(str.length - 1));
   return str;
}

function encode_utf8(s) {
  return unescape(encodeURIComponent(s));
}

function decode_utf8( s ) { 
  return decodeURIComponent(escape(s));
}


/**
*
*  AJAX IFRAME METHOD (AIM)
*  http://www.webtoolkit.info/
*
**/
 
AIM = {
 	frame : function(c) {
		var n = 'f' + Math.floor(Math.random() * 99999);
		var d = document.createElement('DIV');
		d.innerHTML = '<iframe style="display:none" src="about:blank" id="'+n+'" name="'+n+'" onload="AIM.loaded(\''+n+'\')"></iframe>';
		document.body.appendChild(d);
 
		var i = document.getElementById(n);
		if (c && typeof(c.onComplete) == 'function') {
			i.onComplete = c.onComplete;
		}
 
		return n;
	},
 
	form : function(f, name) {
		f.setAttribute('target', name);
	},
 
	submit : function(f, c) {
		AIM.form(f, AIM.frame(c));
		if (c && typeof(c.onStart) == 'function') {
			return c.onStart();
		} else {
			return true;
		}
	},
 
	loaded : function(id) {
		var i = document.getElementById(id);
		if (i.contentDocument) {
			var d = i.contentDocument;
		} else if (i.contentWindow) {
			var d = i.contentWindow.document;
		} else {
			var d = window.frames[id].document;
		}
		if (d.location.href == "about:blank") {
			return;
		}
 
		if (typeof(i.onComplete) == 'function') {
			i.onComplete(d.body.innerHTML);
		}
	}
 
}
