/**
 * Constructor (empty)
 */
Implex.Core.Ajax = function() 
{
	
};

/**
 * Handle incoming AJAX request
 */
Implex.Core.Ajax.prototype.handleRequest = function(t) 
{
	Implex.Core.Ajax._hideProgressIndicator();

	/* load response as xml */
    var xml = t.responseXML;
    /* check for valid xml */
    if (!xml)
    {
    	alert('Er is een fout opgetreden. Neem contact op met de webmaster als deze fout zich voor blijft doen.');
    	return;
    }
    
    /* init root node */
    var root = null;
    /* check first node */
    if (xml.childNodes[0].nodeName == 'ajax')
    {
    	root = xml.childNodes[0];
    }
    /* also check second node (browser dependant) */
    else if (xml.childNodes[1].nodeName == 'ajax')
    {
    	root = xml.childNodes[1];
    }
    /* otherwise no root node could be found */
    else
    {
    	alert('no good ajax response (no ajax-tag found)');
    	return;
    }
	
    /* check each ajax node */
	for (var nodeKey = 0; nodeKey < root.childNodes.length; nodeKey++)
	{
		/* get node */
		var node = root.childNodes[nodeKey];
		
		/* check name of node */
		switch (node.nodeName)
		{
			/* set element content */
			case 'set':
				var element = node.getAttribute('element');
				var position = node.getAttribute('position');
				var content = node.childNodes[0].nodeValue;
				/* replace content */
				if (position == 'replace')
				{
					document.getElementById(element).innerHTML = content;
				}
				/* add content after existing content */
				else if (position == 'after')
				{
					document.getElementById(element).innerHTML = document.getElementById(element).innerHTML + content;
				}
				/* add content before existing content */
				else if (position == 'before')
				{
					document.getElementById(element).innerHTML = content + document.getElementById(element).innerHTML;
				}

				break;
			/* add element content */
			case 'add':
				var element = node.getAttribute('element');
				var content = node.childNodes[0].nodeValue;
				
				document.getElementById(element).innerHTML = document.getElementById(element).innerHTML + content;

				break;	
			/* alert message */
			case 'alert':
				alert(node.childNodes[0].nodeValue);
				break;
			/* clear element content */
			case 'clear':
				var element = node.getAttribute('element');
				document.getElementById(element).innerHTML = '';
				break;
			/* execute custom javascript code */
			case 'javascript':
				eval(node.childNodes[0].nodeValue);
				break;
			/* redirect to another url */
			case 'redirect':
				window.top.location = node.childNodes[0].nodeValue;
				break;
			/* set element attribute */
			case 'setattrib':
				var element = node.getAttribute('element');
				var attrib = node.getAttribute('attrib');
				var content = node.childNodes[0].nodeValue;
				document.getElementById(element).writeAttribute(attrib, content);	
				
//				selectedNodes = getElementsByTagAndClassName('a', 'highlight');
//				forEach(selectedNodes, function(node)
//					{
//						removeElementClass(node, 'highlight');
//					});
//		
//				/* Add highlighting to the node. */
//				addElementClass(element, 'highlight');					
						
				break;	
			case 'add-body-content':
				var div = document.createElement('div');
				div.innerHTML = node.childNodes[0].nodeValue;
				
				document.body.appendChild(div);
				
				break;
		}
	}
						
};

/**
 * Handle AJAX request error
 */
Implex.Core.Ajax.prototype.handleError = function(t) 
{
	Implex.Core.Ajax._hideProgressIndicator();
	
    alert('Error ' + t.status + ' -- ' + t.statusText);
    //progressHide();
};

/**
 * Perform AJAX request via GET method
 */
Implex.Core.Ajax.prototype.get = function(url,params)
{
	Implex.Core.Ajax._showProgressIndicator();
	
	new Ajax.Request(url, {method: 'get', parameters: params, onSuccess:this.handleRequest, onFailure:this.handleError});
};

/**
 * Perform AJAX request via POST method
 */
Implex.Core.Ajax.prototype.post = function (url,params)
{
	Implex.Core.Ajax._showProgressIndicator();
	
	new Ajax.Request(url, {method: 'post', parameters: params, onSuccess:this.handleRequest, onFailure:this.handleError});
};

/**
 * Post a form via AJAX
 */
Implex.Core.Ajax.prototype.postForm = function (formId)
{
	/* get form */
	var form = document.getElementById(formId);
	
	/* create content for post request */
	var content = '';
	
	/* handle each form element */
	for (var i = 0; i < form.elements.length; i++)
	{
		/* name is required to post data */
		if (!form.elements[i].name)
		{
			continue;
		}
		/* do not post unchecked radiobuttons and checkboxes */
		if (form.elements[i].type && (form.elements[i].type == 'radio' || form.elements[i].type == 'checkbox') && form.elements[i].checked == false)
		{
			continue;
		}
		/* do not post disabled fields */
		if (form.elements[i].disabled && form.elements[i].disabled == true)
		{
			continue;
		}
		/* uploading files is not possible using AJAX, use iframes instead */
		if (form.elements[i].type && form.elements[i].type == 'file')
		{
			continue;
		}
		/* only add ampersand when not first element */
		if (content != '')
		{
			content += '&';
		}
		/* when multiple items are selected in a select-element, post all selected values */
		if (form.elements[i].nodeName == 'SELECT' && form.elements[i].multiple)
		{
			var selectContent = '';
			
			/* check all options */
			for (var o = 0; o < form.elements[i].options.length; o++)
			{
				/* check if option is selected */
				if (form.elements[i].options[o].selected)
				{
					/* add dividing ampersand for multiple values */
					if (o > 0)
					{
						content += '&';
					}
					/* add name/value pair to content */
					content += form.elements[i].name + '=' + encodeURIComponent(form.elements[i].options[o].value);
				}
			}
		}
		/* handle all remaining elements */
		else
		{
			/* add name/value pair to content */
			content += form.elements[i].name + '=' + encodeURIComponent(form.elements[i].value);
		}
	}
	
	/* send post request */
	this.post(form.action, content);
	
};

Implex.Core.Ajax._showProgressIndicator = function ()
{
	var indicator = Implex.Core.Ajax._getProgressIndicator();
	
	indicator.show();
};

Implex.Core.Ajax._hideProgressIndicator = function ()
{
	var indicator = Implex.Core.Ajax._getProgressIndicator();
	
	indicator.hide();
};

Implex.Core.Ajax._getProgressIndicator = function ()
{
	var indicator = $('progress-indicator');
	
	if (!indicator)
	{
		indicator = document.createElement('div');
		indicator.id = 'progress-indicator';
		indicator.style.position = 'absolute';
		indicator.style.border = '2px solid #444';
		indicator.style.backgroundColor = '#fff';
		indicator.style.padding = '16px 75px 16px 60px';
		indicator.style.fontSize = '14px';
		indicator.style.backgroundImage = 'url(/core/images/progress_indicator.gif)';
		indicator.style.backgroundRepeat = 'no-repeat';
		indicator.style.backgroundPosition = '10px center';
		indicator.innerHTML = 'Loading...';
		//indicator.style.left = '100px';
		//indicator.style.top = '100px';		
		Element.Center(indicator);
		
		document.body.appendChild(indicator);
	}
	
	return indicator;
};


