/*****************************************************************
*
* (c)2006-2007,David Preindl
* Version: 0.2
*
*****************************************************************/

// RESPONSE-TYPES
var AJAX_RESPONSE_XML=1;
var AJAX_RESPONSE_TEXT=2;
var AJAX_RESPONSE_ALL=3;

// INITIALISE VARIABLES
var ajaxUrl="";
var ajax=null;
var ajaxParameters="";
var ajaxResponseFunction="";
var ajaxLoadingElement="";
var ajaxResponseType=AJAX_RESPONSE_XML;
var ajaxDisableElements=null;
var ajaxAdditionalArgument=null;
var ajaxHideElements=null;


/*
 * Sets function which will be called after 
 * a successfull AJAX-Response
 * @param func Name of the Function, without ()
 * @param arg Additional Argument passed as second argument to the response function
 */
function setAjaxResponseFunction(func, arg){
	ajaxResponseFunction=func;
	ajaxAdditionalArgument=arg
}

/*
 * Sets Element which will be shown while 
 * handling AJAX-Request
 * @param val ID of the Element
 */
function setAjaxLoadingElement(val){
	ajaxLoadingElement=val;
}

/*
 * Sets Elements wich will be disabled while
 * handling AJAX-Request
 * @param elementArr Array of IDs
 */
function setAjaxDisableElements(elementArr){
	ajaxDisableElements=elementArr;
}

/**
 * Sets the ID of an Element which will be hidden 
 * while handling AJAX-Request
 * @param int ID of the Element
 */
function setAjaxHideElement(elementId){
	ajaxHideElements = elementId;
}

/*
 * Sets Response-Type.
 * Use AJAX_RESPONSE_XML or AJAX_RESPONSE_TEXT
 * On Error AJAX_RESPONSE_XML will be used
 * @param val
 */
function setAjaxResponseType(val){
	if (isNaN (val) || val>3 || val<0){
		type=AJAX_RESPONSE_ALL;
	}
	ajaxResponseType=val;
}

/*
 * Sets the Request-URL.
 * "&amp;" will be replaced
 * @param url
 */
function setAjaxUrl(url){
	ajaxUrl=url.replace(/&amp;/gi,'&');
}

/*
 * Add an Parameter for the Request
 * @param name Name of the Parameter
 * @param value Value of the Parameter
 */
function ajaxAddParameter(name, value){
	ajaxParameters=(ajaxParameters=="")? name+"="+encodeURI(value): ajaxParameters+"&"+name+"="+encodeURI(value);
}

/*
 * Abort current Request
 */
function abortAjaxRequest(){
	ajax.abort();
	ajaxHideElement();
}

/*
 * Checks if request is successfully finished
 */
function ajaxStatechange(){
	if (ajax.readyState == 4 && ajax.status == 200){
		ajaxHideElement();
		if(ajaxResponseType==AJAX_RESPONSE_XML){
			sVal = "ajaxResponseFunction( ajax.responseXML"
			sVal = (ajaxAdditionalArgument!=null)? sVal + ", ajaxAdditionalArgument)" : sVal + " )";
			eval(sVal);
		}else{
			sVal = "ajaxResponseFunction( ajax.responseText"
			sVal = (ajaxAdditionalArgument!=null)? sVal + ", ajaxAdditionalArgument)" : sVal + " )";
			eval(sVal);
		}
	}else if(ajax.readyState==4){
		ajaxHideElement();
		throw "Bei der Kommunikation mit dem Server ist ein Fehler aufgetreten";
	}
}

/*
 * Shows Element while handling AJAX-Request
 */
function ajaxShowElement(){
	if(ajaxLoadingElement!=""){
		try{
			document.getElementById(ajaxLoadingElement).style.display='inline';
		}catch(e){}
	}
	if(ajaxDisableElements!=null){
		for(var i=0;i<ajaxDisableElements.length;i++){
			document.getElementById(ajaxDisableElements[i]).disabled='disabled'; 
		}
	}
	if(ajaxHideElements!=null){
		try{
			eval ("document.getElementById('"+ajaxHideElements+"').style.display='none'");
		}catch(e){}	
	}
}

/*
 * Hides Element while not handling any AJAX-Request
 */
function ajaxHideElement(){
	if(ajaxLoadingElement!=""){
		try{
			eval ("document.getElementById('"+ajaxLoadingElement+"').style.display='none'");
		}catch(e){}
	}
	if(ajaxDisableElements!=null){
		for(var i=0;i<ajaxDisableElements.length;i++){
			eval ("document.getElementById('"+ajaxDisableElements[i]+"').disabled=''"); 
		}
	}
	if(ajaxHideElements!=null){
		try{
			eval ("document.getElementById('"+ajaxHideElements+"').style.display='block'");
		}catch(e){}	
	}
}

/*
 * Starts the Request
 */
function startAjaxRequest(){
	if(ajaxResponseFunction==""){
		throw "Es muss eine Responsefunktion definiert werden";
	}
	ajax=getXMLHttp();
	ajax.onreadystatechange = ajaxStatechange;
	ajax.open('POST', ajaxUrl, true);
	ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded;");
	ajax.setRequestHeader("Content-length", ajaxParameters.length);
	ajaxShowElement();
	ajax.send(ajaxParameters);
}

/*
 * Returns xmlhttp-Object
 */
function getXMLHttp(){
	xmlhttp=null;
	try{
		xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
		return xmlhttp;
	}catch(e){}
	try{
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
		return xmlhttp;
	}catch(e){}
	try{
		xmlhttp=new XMLHttpRequest();
		return xmlhttp;
	}catch(e){}
	return null;
}

function isSuccessfullAjaxResponse(response){
	if(response.getElementsByTagName('status')[0].firstChild.nodeValue=='true'){
		return true;
	}
	return false;
}

function getAjaxErrorMessage(response){
	aErrors = response.getElementsByTagName('failure');
	msg='';
	if(!isSuccessfullAjaxResponse(response) && aErrors!=null && aErrors[0]!=null){
		for(i=0;i<aErrors.length;i++){
			if(msg!='') msg=msg+"\n";
			msg=msg+"- "+aErrors[i].firstChild.nodeValue;
		}
	}
	return msg;
}


function isValidAjaxResponse(response){
	return (response==null || response.getElementsByTagName('status')[0]==null)? false : true;
}