/* AJAX related */
function getXhr(){
     var xhr = null; 
	 if(window.XMLHttpRequest) {
	      xhr = new XMLHttpRequest(); 
	  }
	  else if(window.ActiveXObject) { 
		try {
			xhr = new ActiveXObject("Msxml2.XMLHTTP");
		} 
		catch (e) {
			xhr = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	else {  
		alert("XMLHTTPRequest not supported..."); 
		xhr = false; 
	} 
	return xhr;
}
//get the response from the server and display errors, 
//success or redirect to a new page
function handleResponse (errorList,formSending,targetDiv) {
			//erase the loading view if any
			if(document.getElementById('loading')) {
				new Effect.Fade(document.getElementById('loading'));
			}
			//check the response from the server
			//if doesn't start with <, assume error
			if(errorList.indexOf("<",0)==-1) {

				var displayed=getElementsByClassName(document, "div", "error");
				//hide all the divs that aren't in the error list
				for (var count=0; count<displayed.length; count++) {
					var str=displayed[count].id;
					if(!str.match(errorList)) {
						document.getElementById(displayed[count].id).style.display='none';
					}
				}
				//split the error list and display the errors
				list = errorList.split(',');
				for (var count=0; count<list.length; count++) {			
					new Effect.Appear(document.getElementById('error_'+list[count]));
				}	
				return false;
			}
			//if there is no error and no redirect link, we hide the displayed errors if any
			if(!formSending) {
				var displayed=getElementsByClassName(document, "div", "error");
				for (var count=0; count<displayed.length; count++) {
					var str=displayed[count].id;
						if(!str.match(errorList)) {
							document.getElementById(displayed[count].id).style.display='none';
						}
				}
				//if there is no target div, assign successful
				if(!targetDiv) { targetDiv='successful'; }
				if(document.getElementById(targetDiv)) {
					new Effect.Appear(document.getElementById(targetDiv));
					return;
				}
			}
			//if there's no error and a redirect link,redirect
			else if (formSending.match('/')) {
				window.location=formSending;
				return;
			}
			//we should never arrive here...
			document.forms[0].submit();
			return;
}
function handleRequest (xhr,formSending,targetDiv) {
	xhr.onreadystatechange = function(){
		//display the loading, if any
		if(document.getElementById('loading')){
			var loading=document.getElementById('loading');
			loading.style.display = 'block';
		}
		//get response from the server and delegate 
		if(xhr.readyState == 4 && xhr.status == 200){
				var errorList = xhr.responseText;
				handleResponse(errorList,formSending,targetDiv);	
		}
	}
}
//find all the forms and return the request string to the server
function getFormRequestStr() {
	forms = document.getElementsByTagName("form"); 
    for (var formNumber = 0; formNumber < forms.length; formNumber++)  { 
		var currentForm=forms[formNumber];
	    return createRequestString(currentForm); 
	} 
}
//create the request string for the server for one form
function createRequestString(currentForm) {
	var requestString= '';
	var RadioName=[];
	var RadioObj={};
 	inputs = currentForm.getElementsByTagName("input");
	for (var inputNumber = 0; inputNumber < inputs.length; inputNumber++) {

		if (inputs[inputNumber].type == "text" || inputs[inputNumber].type == "hidden" ||
			inputs[inputNumber].type == "password") {
			requestString += _encodeURIComponent(inputs[inputNumber].name) + "=" + _encodeURIComponent(inputs[inputNumber].value) + "&";
		}
		if (inputs[inputNumber].type == "radio" || inputs[inputNumber].type == "checkbox") {
			if(inputs[inputNumber].checked) {
				requestString += _encodeURIComponent(inputs[inputNumber].name) + "=" + _encodeURIComponent(inputs[inputNumber].value) + "&";
			}
		}		
	}
	//collect all selects
	var selects;
 	selects = currentForm.getElementsByTagName("select");
	for (var selectNumber = 0; selectNumber < selects.length; selectNumber++) {
		requestString += _encodeURIComponent(selects[selectNumber].name) + "=" + _encodeURIComponent(selects[selectNumber].value) + "&";
	}
	//collect all textareas
	var textareas;
 	textareas = currentForm.getElementsByTagName("textarea");
	for (var textareaNumber = 0; textareaNumber < textareas.length; textareaNumber++) {
		requestString += _encodeURIComponent(textareas[textareaNumber].name) + "=" + _encodeURIComponent(textareas[textareaNumber].value) + "&";
	}
	requestStr=requestString+"ajax=true";
	return requestStr;
}

function AJSubmit(formSending,targetDiv) {
	var xhr = getXhr();
	xhr.open("POST",document.forms[0].action,true);
	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	xhr.send(getFormRequestStr());
 	handleRequest(xhr,formSending,targetDiv);
}

/*queryPath : string, the page to call 
  success : object, the name of divs and effects to use to insert data
  failure : string, effect to use to show the error message
  params : object, parameters and value to be sent to the page to call (POST only)
*/

function remote_function (queryPath,success,params) {
		var loader=false;
		var xhr = getXhr();
		xhr.onreadystatechange = function(){

				if(!loader && document.getElementById('loading')) {
					var loading=document.getElementById('loading');
					loading.style.display = 'block';
					loader=true;
				}

			if(xhr.readyState == 4 && xhr.status == 200){

					if(loader) {
						new Effect.Fade(document.getElementById('loading'));
					}
					var response=xhr.responseText;
					alert(response);
					if(response.indexOf('errors::',0)==-1) {
					for (var i=0; i < success.length; i++) {
						for (var arrayOfAction in success[i]) {
							for (var j=0; j < success[i][arrayOfAction].length; j++) {

								if(success[i][arrayOfAction][j]=='response') {
									document.getElementById(arrayOfAction).innerHTML = response;
									continue;
								} 
								if(success[i][arrayOfAction][j].indexOf('function',0)>=0) {
									func = eval(success[i][arrayOfAction][j]);
									func();
									continue;
								} 
								eval("new Effect."+success[i][arrayOfAction][j]+"(document.getElementById(arrayOfAction))");
							}
						}
					}
					}
					else {
						response=response.split('errors::');
						for(k=1; k<response.length; k++) {
						new Effect.Appear(document.getElementById('error_'+response[k]));
						}
					}
			}	
		}
		sendValue=new Array();
		if(params) { 
			method='POST'; 
			for (var param in params) {
				sendValue.push(_encodeURIComponent(param)+"="+_encodeURIComponent(params[param]));
			}
			sendValue.push('ajax=true');
			sendValue=sendValue.join('&');
		} 
		else { 
			method='GET';
			queryPath=queryPath+'&ajax=true';
			sendValue='null';
		}
		xhr.open(method,queryPath,true);
		if(method=='POST') { 
			xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		}
		xhr.send(sendValue);
}