// AJAX CLASS
// COPYRIGHT D/SITE 2006

// main ajax class
function ajax() {
	
	// variables
	this.http_request 		= false;
	this.arrError			= new Array();
	this.arrParams			= new Array();
	this.arrEvent			= new Array();
	this.arrContent			= new Array();
	this.xml				= "";
	this.xmlError			= false;
	this.xmlEvent			= false;
	this.xmlContent			= false;
	
	this.handle = new Array();
	
	this.ajaxCallerObj = false;

	var objRef = this;
	
	// initializing
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
    	this.http_request = new XMLHttpRequest();
     	if (this.http_request.overrideMimeType) {
        	this.http_request.overrideMimeType('text/xml');
     	}
  	} else if (window.ActiveXObject) { // IE
     	try {
        	this.http_request = new ActiveXObject("Msxml2.XMLHTTP");
     	} catch (e) {
        	try {
           		this.http_request = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch (e) {}
     	}
  	}
  	
  	if (!this.http_request) {
     	this.arrError[this.arrError.length] = "Cannot create XMLHTTP instance";
  	}
  	
	
	//SENDING XML TO A PHP REQUEST HANDLER
	this.sendXml = function(callerObj, target, form){
		
		// making parameter string
		var tmpParam = "";
		
		for(key in this.arrParams) {
			tmpParam += key + "=" + this.arrParams[key] + "&";
		}
		
		// removing last &
		tmpParam = tmpParam.substr(0,(tmpParam.length - 1));
	
		this.http_request.open('POST', target, true);
		//onreadystatechange needs to be after the open statement for IE to work =)
		this.http_request.onreadystatechange = this.result;
		this.http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		this.http_request.send(tmpParam);
		
		this.ajaxCallerObj = callerObj;
	}

	
   	// adding parameter to post
   	this.addParam = function(name,val) {
   		// adding param to array
   		this.arrParams[name] = escape(val);
   	}
   	
   	// getting form
   	this.addForm = function(formName) {
   		
   		// getting form object
   		var objForm = document[formName];
   		
   		// looping through form elements
   		for(var i = 0;i < objForm.elements.length;i++) {
			
   			switch(objForm.elements[i].type) {
   				
   				case "text":
   				
   					this.addParam(objForm.elements[i].name,objForm.elements[i].value);
   					break;
   					
   				case "password":
   				
   					this.addParam(objForm.elements[i].name,objForm.elements[i].value);
   					break;
   					
   				case "textarea":
   				
   					this.addParam(objForm.elements[i].name,objForm.elements[i].value);
   					break;
   					
   				case "checkbox":
   				
   					if(objForm.elements[i].checked) {
   				
   						this.addParam(objForm.elements[i].name,objForm.elements[i].value);
   					}
   					break;
   					
   				case "select-one":
   					
   					this.addParam(objForm.elements[i].name,objForm.elements[i].options[objForm.elements[i].selectedIndex].value);
   					break;
   			}	
   		}
   	}
   	
   	
   	this.result = function () {
   		
   		if (objRef.http_request.readyState == 4) {
			
			if (objRef.http_request.status == 200) {
				//alert(objRef.http_request.statusText);
				//alert(objRef.http_request.responseText);
				xmlResponse = objRef.http_request.responseXML;
				
				if(!xmlResponse || !xmlResponse.documentElement){
					alert("invalid XML structure: " + objRef.http_request.responseText);
				}
				else{
					
					var rootNodeName = xmlResponse.documentElement.nodeName;
					
					if(rootNodeName == 'parsererror'){
						
						alert("invalid xml structure for node")
					}
					else{
					
						var xmlRootElement = xmlResponse.documentElement;
						
						if(rootNodeName == 'serverResponse'){
							
							var xmlReplyElement = xmlRootElement.getElementsByTagName('reply');
							
							//for each reply
							for(var i=0; i < xmlReplyElement.length; i++){
								
								var replyFunction = new Array();
								var replyTarget = new Array();
								var replyContent = new Array();
								
								for(var k=0; k < xmlReplyElement[i].childNodes.length; k++){
								
									var nodeName = xmlReplyElement[i].childNodes[k].nodeName;
									
									if(nodeName == 'action'){
										
										for(var p=0; p < xmlReplyElement[i].childNodes[k].childNodes.length; p++){
												
											nodeName = xmlReplyElement[i].childNodes[k].childNodes[p].nodeName;
											
											if(nodeName == 'function'){
												
												var func = xmlReplyElement[i].childNodes[k].childNodes[p].getAttribute('name');
												replyFunction['call'] = func;
											}
											
											if(nodeName == 'target'){
												
												var targetId = xmlReplyElement[i].childNodes[k].childNodes[p].getAttribute('id');
												var targetTag = xmlReplyElement[i].childNodes[k].childNodes[p].getAttribute('att');
												
												replyTarget['id'] = targetId;
												replyTarget['att'] = targetTag;
											}
										}
									}
									else if(nodeName == 'content'){
										
										for(var m=0; m < xmlReplyElement[i].childNodes[k].childNodes.length; m++){
										
											var nodeName = xmlReplyElement[i].childNodes[k].childNodes[m].nodeName;
											var rowData = '';
											
											if(nodeName == 'row'){
												
												var rowDataName = xmlReplyElement[i].childNodes[k].childNodes[m].getAttribute('name');
												//var rowData = unescape(xmlReplyElement[i].childNodes[k].childNodes[m].firstChild.nodeValue);
												
												for(var p=0; p < xmlReplyElement[i].childNodes[k].childNodes[m].childNodes.length; p++){
													
													rowData += unescape(xmlReplyElement[i].childNodes[k].childNodes[m].childNodes[p].nodeValue);
												}
													
												replyContent[rowDataName] = rowData;
											}
										}
									}
								}
								
								objRef.handleReply(replyFunction, replyTarget, replyContent);
							}
						}
					}
				}
				
			} else {
				objRef.arrError[objRef.arrError.length] = "There was a problem with the request";
			}
		}
	}
	
	
	this.handleReply = function(replyFunction, replyTarget, replyContent){
	
		
		if(replyTarget['id']){
			
			content='';
			
			for(var i=0; i < replyContent.length; i++){
				content += replyContent[i];
			}
			
			if(document.getElementById(replyTarget['id'])){
				
				if(replyTarget['att'] == 'src'){
					
					document.getElementById(replyTarget['id']).src = content;
				}
				else if(replyTarget['att'] == 'innerHTML'){
					
					document.getElementById(replyTarget['id']).innerHTML = unescape(content);
				}
			}
		}
		
		if(replyFunction['call']){
			
			if(replyFunction['call'] == 'handleInit'){
				
				this.ajaxCallerObj.handleInit(replyContent);
			}
			else if(replyFunction['call'] == 'activateFirstItem'){
				
				this.ajaxCallerObj.activateFirstItem();
			}
		}
	}
	
	return this;
}
