/*********************************************************************************
** This document is made by Laarink Webdesign (http://www.laarink.nl)			**
** It's not allowed to sell the contents of this document without approval of	**
** Laarink Webdesign.															**
**																				**
** Module: AjaxModule															**
** Document: functions to facilitate Ajax actions								**
** Version: 1.0																	**
** Author: Johnny van de Laar													**
**																				**
** Changelog:																	**
**		* version 1.0															**
**			- createURL()														**
**				-added															**
**																				**
**			- addEvent()														**
**				-added															**
**																				**
**			- generateEvent()													**
**				-added															**
**																				**
**			- createHTTPHandler()												**
**				-added															**
**																				**
**			- requestXMLPage()													**
**				-added															**
**																				**
**			- getNodeValue()													**
**				-added															**
**																				**
**			- clearSelectField()												**
**				-added															**
**																				**
**			- addSelectOption()													**
**				-added															**
**																				**
**			- fillSelectField()													**
**				-added															**
**																				**
**			- linkSelectFields()												**
**				-added															**
**																				**
*********************************************************************************/

/*--------------GENERAL--------------*/
//create an url based on the value of a element
function createURL(baseUrl, elementId, parName) {
	return baseUrl + parName + "=" + document.getElementById(elementId).value;
}

/*--------------EVENTS--------------*/
//Add a function to an event
function addEvent(obj, eventType,fn, useCapture) { 
	if (obj.addEventListener) {
		obj.addEventListener(eventType, fn, useCapture); 
		return true; 
	} else { 
		if (obj.attachEvent) {
			var r = obj.attachEvent("on"+eventType, fn); 
			return r; 
		} 
	} 
}

//Generate an event
function generateEvent(elementId, eventType, eventClass) {
	if(document.createEventObject) {
		var evt = document.createEventObject();
		document.getElementById(elementId).fireEvent("on"+eventType, evt);
	}
	else if(document.createEvent) {
		var evt = document.createEvent(eventClass);
		evt.initEvent(eventType, true, true);
		document.getElementById(elementId).dispatchEvent(evt);
	}
}

/*--------------AJAX--------------*/
//Function to create the XMLHTTPRequest object
function createHTTPHandler(){ 
	httphandler = false; 
	/*@cc_on @*/ 
	/*@if (@_jscript_version >= 5) 
	// JScript gives us Conditional compilation, we can cope with old IE versions. 
	// and security blocked creation of the objects. 
	try { 
		httphandler = new ActiveXObject("Msxml2.XMLHTTP"); 
	} catch (e) { 
		try { 
			httphandler = new ActiveXObject("Microsoft.XMLHTTP"); 
		} catch (E) { 
			httphandler = false; 
		}
	} 
	@end @*/ 
	if (!httphandler && typeof XMLHttpRequest!='undefined') { 
		httphandler = new XMLHttpRequest(); 
	} 
	return httphandler; 
}

//requests an XML Page with the first url parameter and returns a NULL on error and the XMLHTTPObject on success
function requestXMLPage(url, func, parameters, errorMsg) {
	if(url == '') return;
	var XMLHTTPObject = createHTTPHandler()
	XMLHTTPObject.open("GET", url, true);
	XMLHTTPObject.setRequestHeader("Cache-Control", "no-cache"); 
	XMLHTTPObject.setRequestHeader("X_USERAGENT", "Laarink Ajax");
	XMLHTTPObject.onreadystatechange=function() { 
		if (XMLHTTPObject.readyState==4) { 
			if (XMLHTTPObject.status == 200)
				func(XMLHTTPObject, parameters);
			else if(errorMsg != null) alert(errorMsg);
		} 
	}
	XMLHTTPObject.send(null);
}

//get the node value
function getNodeValue(obj,tag) {
	return obj.getElementsByTagName(tag)[0].firstChild.nodeValue; 
}

/*------------------Text Label--------------------*/
function fillTextLabel(XMLHTTPObject, parameters) {
	var answer = XMLHTTPObject.responseXML;
	var root = answer.documentElement;
	var vars = root.getElementsByTagName(parameters['item']);
	document.getElementById(parameters['element']).innerHTML = getNodeValue(vars.item(0), parameters['name']);
}

/*--------------Linked Select Fields--------------*/
var loading = false;
//clear a Select field
function clearSelectField(selectField) {
	while(selectField.length > 0) {
		selectField.remove(0);	
	}	
}

function addSelectOption(elSel, label, value) {
	var elOptNew = document.createElement('option');
	elOptNew.text = label;
	elOptNew.value = value;

	try {
		elSel.add(elOptNew, null); // standards compliant; doesn't work in IE
	}
	catch(ex) {
		elSel.add(elOptNew); // IE only
	}
}

//parse the xml data and put it in the select field
function fillSelectField(XMLHTTPObject, parameters) {
	loading = true;
	var answer = XMLHTTPObject.responseXML;
	var root = answer.documentElement;
	var vars = root.getElementsByTagName(parameters['item']);

	var elSel = document.getElementById(parameters['select_field']);
	clearSelectField(elSel);

	//fill the select field
	addSelectOption(elSel, parameters['first_value'],"");

	for(i = 0; i < vars.length; i++) {
		addSelectOption(elSel, getNodeValue(vars.item(i), parameters['name']), getNodeValue(vars.item(i), parameters['value']));
	}

	//select a field
	if(parameters['selected'] != undefined && parameters['selected'] != -1) {
		for(var i = 0; i < elSel.length; i++) {
			if(elSel.options[i].selected == true && i > 0) return;

			if(elSel.options[i].value == parameters['selected']) {
				elSel.options[i].selected = true;
				generateEvent(parameters['select_field'],'change','HTMLEvents');
				parameters['selected'] = -1;
				loading = false;
				return;
			}
		}
	}
	loading = false;
}

function setLoaded(elId, msg) {
	var elSel = document.getElementById(elId);
	clearSelectField(elSel);
	addSelectOption(elSel, msg,"");
}

function linkSelectFields(fields, errorMsg) {
	for(i = 0; i < fields.length; i++) {
		if(i < (fields.length-1)) {
			addEvent(document.getElementById(fields[i]['select_field']), 'change',
				function() {
					if(arguments[0].target) srcId = arguments[0].target.id;
					else if(arguments[0].srcElement.id) srcId = arguments[0].srcElement.id;
					else return;

					var foundJ = -1;

					for(j = 0; j < fields.length; j++) {
						if(fields[j]['select_field'] == srcId) foundJ = j;
						if(j >= (foundJ+2)) {
							var tmp = document.getElementById(fields[j]['select_field'])
							clearSelectField(tmp);
							addSelectOption(tmp, fields[j]['first_value'], '');
						}
					}

					if(foundJ != -1) {
						setLoaded(fields[foundJ+1]['select_field'], fields[foundJ+1]['loading']);
						requestXMLPage(createURL(fields[foundJ+1]['url'], fields[foundJ]['select_field'], fields[foundJ+1]['value']),fillSelectField, fields[foundJ+1], errorMsg);
					}
				}
			);
		}
		if(i == (fields.length-1)) {
			addEvent(document.getElementById(fields[i]['select_field']), 'change', function(e) {
					if(!loading && e.srcElement) showHTWGO(component_fields);//e.srcElement.form.submit();
					else if(!loading && e.target) showHTWGO(component_fields);//e.target.form.submit();
				}
			);
		}
		if(i > 0)
			addSelectOption(document.getElementById(fields[i]['select_field']), fields[i]['first_value'], '');
	}
	setLoaded(fields[0]['select_field'], fields[0]['loading']);
	requestXMLPage(fields[0]['url'], fillSelectField, fields[0], errorMsg);
}