//----------------------------------------------------------------------------------------------------------
// JAVASCRIPT AJAX LIBRARY
// SHAPESHIFT INTERACTIVE 
// CREATED: 19.03.2009
// VER: 1.0 
//----------------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------------------
// AJAX CONSTRUCTS
//----------------------------------------------------------------------------------------------------------

var xmlHttpArray	= new Array();

function ajaxPost(url, data_string) {
	var index	= xmlHttpArray.push(GetXmlHttpObject(processXML)) - 1;
	
	xmlHttpArray[index].open("POST", url , true);
	xmlHttpArray[index].setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xmlHttpArray[index].send(data_string);
}

function GetXmlHttpObject(handler) {
	var objXmlHttp = null;
	
	if (window.ActiveXObject) { // IE
		try {
			if (!objXmlHttp) {
				objXmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
			}
		} catch (e) {
			try {
				objXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
				try {
					objXmlHttp = new XMLHttpRequest();
				} catch (e) {
					alert(e);
				}
			}
		}
		if (handler)
			objXmlHttp.onreadystatechange = handler;
		
	} else if (window.XMLHttpRequest) { // Mozilla, Safari,...
		objXmlHttp = new XMLHttpRequest();
		if (handler) {
			objXmlHttp.onload = handler;
			objXmlHttp.onerror = handler;
		}
	}
	
	return objXmlHttp;
}

//----------------------------------------------------------------------------------------------------------
// PARSE XML
//----------------------------------------------------------------------------------------------------------

function processXML() {
	try {
		for (index=0; index<xmlHttpArray.length; index++) {
			if (xmlHttpArray[index].readyState==4 || xmlHttpArray[index].readyState=="complete") {
				var str	= '';
				var data_array	= new Array();
				
				hideLoading();
				
				//alert(xmlHttpArray[index].responseText)
				
				var xmldoc = xmlHttpArray[index].responseXML;
				
				if (xmldoc.getElementsByTagName('response').length) {
					var root_node = xmldoc.getElementsByTagName('response').item(0);
					
					for (i=0; i<root_node.childNodes.length; i++) {
						response_node	= root_node.childNodes.item(i);
						
						if (response_node.nodeName != '#text') {
							data_array[response_node.nodeName]	= new Array();
							
							for (j=0; j<response_node.childNodes.length; j++) {
								replace_node	= response_node.childNodes.item(j);
								
								if (replace_node.nodeName != '#text') {
									for (k=0; k<replace_node.childNodes.length; k++) {
										data_node	= replace_node.childNodes.item(k);
										
										if (data_node.nodeName == '#text') {
											if (!data_array[response_node.nodeName][replace_node.nodeName])
												data_array[response_node.nodeName][replace_node.nodeName]	= '';
											
											data_array[response_node.nodeName][replace_node.nodeName]	+= data_node.nodeValue;
										}
									}
								}
							}
						}
					}
					
					//alert(unescape(data_array['replace']['outerHTML']))
					
					var outerHTML	= '';
					
					if (data_array['replace']['outerHTML'])
						outerHTML	= unescape(data_array['replace']['outerHTML'])
					
					drawDiv(data_array['replace']['id'], data_array['replace']['class'], data_array['replace']['type'], outerHTML, data_array['replace']['originator']);
					
					if (data_array['output'] && data_array['output']['message'])
						publishMessage(data_array['output']);
					
					if (data_array['finalisation']['js_eval'])
						eval(data_array['finalisation']['js_eval']);
					
					xmlHttpArray.splice(index, 1);
				}
			}
		}
	} catch (e) {
		setCookie('ajax_error', e, 1);
		//if (confirm(e) + "\n\nReload page?")
		//	location.reload(true);
	}
}

//----------------------------------------------------------------------------------------------------------
// TARGET DIV
//----------------------------------------------------------------------------------------------------------

function processContainer(divObj, sourceObj, originatorObj) {
	//setCookie('nodes', sourceObj.childNodes.length);
	//setCookie('node_id', sourceObj.childNodes[0].id);
	//setCookie('div_id', divObj.id);
	//setCookie('node_type', divObj.getAttribute('type'));
	if ((sourceObj.childNodes.length > 0) && (sourceObj.childNodes[0].id == divObj.id) && (divObj.getAttribute('type') != 'placeholder') && (divObj.getAttribute('type') != 'replacement')) {
		mergeAttributes(divObj, sourceObj.childNodes[0]);
		sourceObj.innerHTML	= sourceObj.childNodes[0].innerHTML
	}
	
	if (divObj) {
		var div_id			= divObj.id
		var transition		= false;
		var do_transitions	= false;
		
		switch(divObj.getAttribute('type')) {
			case 'replacement':
				divObj	= replaceNode(divObj, sourceObj)
				break;
			
			case 'placeholder':
				var parentObj		= createPlaceholder(divObj);
				divObj.innerHTML	= sourceObj.innerHTML;
				
				if (parentObj.id == parentObj.childNodes[0].id)
					inheritAll(parentObj, parentObj.childNodes[0])
				break;
			
			case 'stack':
				pushStack(divObj);
				divObj.innerHTML	= sourceObj.innerHTML;
				break;
			
			case 'deque':
				loadDeque(divObj, sourceObj.innerHTML, document.getElementById(originatorObj).getAttribute('index'));
				break;
			
			case 'pagenation':
				loadPagenation(divObj, sourceObj.innerHTML, document.getElementById(originatorObj.id).getAttribute('pagesize'), document.getElementById(originatorObj.id).getAttribute('index'));
				break;
			
			default:
				if (do_transitions) {
					transition	= true;
					var dimensions	= getTransitionDimension(sourceObj, divObj);
					
					//setCookie('old_w', dimensions.new_width);
					setCookie('old_h', dimensions.new_height);
					//setCookie('new_w', dimensions.old_width);
					setCookie('new_h', dimensions.old_height);
					
					var steps	= 1;
					
					var deltaX	= (dimensions.old_width - dimensions.new_width) / steps;
					var deltaY	= (dimensions.old_height - dimensions.new_height) / steps;
					
					if (!document.getElementById('__transition_container')) {
						var transitionDiv		= document.createElement('div');
						transitionDiv.style.display	= 'none';
						transitionDiv.setAttribute('id', '__transition_container');
						
						document.body.appendChild(transitionDiv);
					}
					
					var tmpDiv = document.createElement('div');
					tmpDiv.setAttribute('id', '__transition_' + div_id);
					document.getElementById('__transition_container').appendChild(tmpDiv);
					tmpDiv.innerHTML	= sourceObj.innerHTML
					
					var resizeDiv = document.createElement('div');
					resizeDiv.setAttribute('id', '__resize_' + div_id);
					resizeDiv.style.width		= divObj.clientWidth;
					resizeDiv.style.height		= divObj.clientHeight;
					resizeDiv.style.display		= 'block';
					resizeDiv.style.background	= '#FFFFFF';
					//resizeDiv.innerHTML			= 'lorem ipsum';
					
					divObj.innerHTML			= '';
					divObj.appendChild(resizeDiv);
					
					resizeContainer(div_id, deltaX, deltaY, steps);
				} else
					divObj.innerHTML	= sourceObj.innerHTML;
				break;
		}
		
		if (!transition) {
			positionChildNodes(divObj);
			setEvents(divObj);
		}
		
		try {
			$('textarea.autogrow').autogrow();
		} catch(e) {
			
		}
		return divObj;
	}
}

function resizeContainer(div_id, deltaX, deltaY, steps) {
	//setCookie('steps', steps)
	//steps	= 0;
	if (steps) {
		document.getElementById('__resize_' + div_id).style.width	+= deltaX;
		document.getElementById('__resize_' + div_id).style.height	+= deltaY;
		setCookie('delta_y', deltaY);
		setCookie('delta_h', document.getElementById('__resize_' + div_id).style.height);
		setTimeout("resizeContainer('" + div_id + "', " + deltaX + ", " + deltaY + ", " + (steps - 1) + ")", 100);
	} else {
		divObj	= document.getElementById(div_id);
		
		divObj.innerHTML	= document.getElementById('__transition_' + div_id).innerHTML;
		document.getElementById('__transition_container').removeChild(document.getElementById('__transition_' + div_id));
		
		positionChildNodes(divObj);
		setEvents(divObj);
	}
}

function getTransitionDimension(newObj, oldObj) {
	newObj.style.visibility	= 'hidden';
	newObj.style.position	= 'fixed';
	
	newObj	= document.body.appendChild(newObj);
	
	var dimensions	= {
		new_width:newObj.clientWidth,
		new_height:newObj.clientHeight,
		old_width:oldObj.clientWidth,
		old_height:oldObj.clientHeight
	}
	
	document.body.removeChild(newObj);
	
	return dimensions;
}
