/* The variable objXMLHTTP will hold our new XMLHttpRequest object. */
var objXMLHTTP;
var ajaxCompat = false;
var isIE = false;
var requestUnderway = false;

var nextReturnHandler = '';
var objResponse = null;

var posX=0;
var posY=0;

//for testing!
// writes the ajax statuses into the ajax feedback div
var isWriteAjaxStatuses = true;
// opens the ajax request into a new window instead of sending it normally
var isOpenAjaxInNewWindow = false;


createAjaxReqObject();


/**
* function to create the ajax request object
*/
function createAjaxReqObject () {
	//must set it to false otherwise IE and FF freaks out
	objXMLHTTP = false;

	if (window.XMLHttpRequest) {
		//mozilla / safari / opera...
		ajaxCompat = true;
		objXMLHTTP = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		// IE/Windows ActiveX version
		isIE = true;
		ajaxCompat = true;
		//objXMLHTTP = new ActiveXObject("Microsoft.XMLHTTP");
		objXMLHTTP = eval("new A" + "ctiv" + "eX" + "Ob" + "ject('Micr" + "osoft.XM" + "LHTTP');");
	}
}


/**
* very simple prinf substitute kind of function
* frist arg is the base, rest are the params
* params in the base str are marked as {1} and {2} and so on
*/
function printf () {
	var num = arguments.length;
	var oStr = arguments[0];
	for (var i = 1; i < num; i++) {
		var pattern = "\\{" + i + "\\}";
		var re = new RegExp(pattern, "g");
		oStr = oStr.replace(re, arguments[i]);
	}
	return oStr;
}


/**
* build an ajax req from parameters and submit it
* e               - the event (to identify the coords)
* url            - the url of the ajax request handler
* funcID         - the system function ID to invoke
* returnHanlder  - the js return hanlder function
* params         - the parameters to attach to the request
* fields            - comma separated field IDs. The field values will be read and attached to the request
*/
function submitAJAXreq( e, url, funcID, returnHandler, params, fields ) {

	if ( !ajaxCompat || requestUnderway ) return;

	if ( ! isOpenAjaxInNewWindow ) {
		requestUnderway = true;
	}
	nextReturnHandler = returnHandler;

	var url = url + '?_f=' + funcID +  params;

	url = addFields(url, fields);

	//alert(url);

	if ( isWriteAjaxStatuses ) {
		getPosition(e);
		document.getElementById('feedBackDiv').style.display = 'block';
		document.getElementById('feedBackDiv').style.top = posY+'px';
		document.getElementById('feedBackDiv').style.left = posX+'px';
		document.getElementById('feedBackDiv').attributes['class'].nodeValue = "feedback warning";
		document.getElementById('feedBackDiv').innerHTML =  'Please wait, request is running!';
	}
	//open in a new window instead of/besides handled by ajax - handy for testing
	if ( isOpenAjaxInNewWindow ) {
		window.open ( url, 'newwin' ); return;
	} else {
		if ( window.ActiveXObject ) {
			createAjaxReqObject();
		}
		objXMLHTTP.open("POST", url, true);
		objXMLHTTP.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		objXMLHTTP.onreadystatechange = ajaxResponseHandler;
		objXMLHTTP.send('');
	}
}


/*
* interrogate a DOM object (return its properties)
*/
function interrogate(what, htmlwise) {
	var output = '';
	for (var i in what) {
		output += i + '\n';
		if (htmlwise) {
			output = output + '<br/>';
		}
	}
	return(output);
}

//------------------------------------
//  ajax response handlers
//------------------------------------

/**
* a global level response handler doing checks and calling the actual function
*/
function ajaxResponseHandler () {
	//alert ('readyState' + objXMLHTTP.readyState + 'status:' + objXMLHTTP.status);
	if(objXMLHTTP.readyState == 4) {
		if (objXMLHTTP.status != 200) {
			//bad request
			if ( isWriteAjaxStatuses ) {
				document.getElementById('feedBackDiv').attributes['class'].nodeValue = "feedback error";
				document.getElementById('feedBackDiv').innerHTML =  'Request failed. HTTP status='+ objXMLHTTP.status ;
			}
		} else {
			//the request is ok...see the rest now
			if ( isWriteAjaxStatuses ) {
				document.getElementById('feedBackDiv').attributes['class'].nodeValue = "feedback actionok";
				document.getElementById('feedBackDiv').innerHTML =  'Request successful...';
			}
			//check if the response format is in order
			if ( objXMLHTTP.responseXML==null || objXMLHTTP.responseXML.documentElement==null || objXMLHTTP.responseXML.documentElement.firstChild==null) {
				//something is amiss
				if ( isWriteAjaxStatuses ) {
					document.getElementById('feedBackDiv').attributes['class'].nodeValue = "feedback error";
				}
				if  ( objXMLHTTP.responseXML==null ) {
					if ( isWriteAjaxStatuses ) {
						document.getElementById('feedBackDiv').innerHTML = 'ERROR: empty XML response';
					}
				} else if ( objXMLHTTP.responseXML.documentElement==null ) {
					if ( isWriteAjaxStatuses ) {
						document.getElementById('feedBackDiv').innerHTML = 'ERROR: malformed XML response, documentElement missing';
					}
				} else if ( objXMLHTTP.responseXML.documentElement.firstChild==null ) {
					if ( isWriteAjaxStatuses ) {
						document.getElementById('feedBackDiv').innerHTML = 'ERROR: malformed XML response, firstChild missing';
					}
				}
			} else {
				//all good, see the response
				objResponse = objXMLHTTP.responseXML.documentElement;
				var responsetype = objResponse.firstChild.tagName;

				if ( responsetype=='error' ) {
					//alert('error returned' + objResponse.getElementsByTagName('feedback')[0].firstChild.data );
					if ( isWriteAjaxStatuses ) {
						document.getElementById('feedBackDiv').attributes['class'].nodeValue = "feedback error";
					}
					errStr = objResponse.getElementsByTagName('feedback')[0].firstChild.data;
					if ( isWriteAjaxStatuses ) {
						document.getElementById('feedBackDiv').innerHTML = 'ERROR: ' + errStr;
					}
				} else if ( responsetype=='feedback' ) {
					if ( isWriteAjaxStatuses ) {
						document.getElementById('feedBackDiv').attributes['class'].nodeValue = "feedback actionok";
						document.getElementById('feedBackDiv').innerHTML =  responsetype +': '+ objResponse.getElementsByTagName('feedback')[0].firstChild.data;
					}
				} else {
					document.getElementById('feedBackDiv').style.display = 'none';
					//call the appropriate function
					nextReturnHandler();
				}
			}
		}
	}
	requestUnderway = false;
}


/**
* display a popup menu given back via ajax
*/
function arh_menubuild() {
	if ( isWriteAjaxStatuses ) {
		document.getElementById('feedBackDiv').innerHTML =  "at the arh_menubuild" ;
	}
	requestUnderway = false;
	nextReturnHandler = '';
	//menu name in <data><menu><name>
	var strMenuName = objResponse.getElementsByTagName('data')[0].getElementsByTagName('menu')[0].getElementsByTagName('name')[0].firstChild.data;
	//the built menu as a string is within the <data><menu><built> tags
	var strMenu = objResponse.getElementsByTagName('data')[0].getElementsByTagName('menu')[0].getElementsByTagName('built')[0].firstChild.data;
	overlib(strMenu, CAPTION, 'Manage "' + strMenuName + '"');


}

/**
* display a rights-access list given back via ajax
*/
function arh_rightslist() {
	if ( isWriteAjaxStatuses ) {
		document.getElementById('feedBackDiv').innerHTML =  "at the arh_rightslist " ;
	}
	requestUnderway = false;
	nextReturnHandler = '';
	//menu name in <data><menu><name>
	var strMenuName = objResponse.getElementsByTagName('data')[0].getElementsByTagName('menu')[0].getElementsByTagName('name')[0].firstChild.data;
	//rights list in <data><rightslist>
	var strMenu = objResponse.getElementsByTagName('data')[0].getElementsByTagName('rightslist')[0].firstChild.data;
	overlib(strMenu, CAPTION, 'Rights at "' + strMenuName + '"');
}

/**
* update the shopping cart widget after successful request
*/
function arh_UpdateCart () {
	if ( isWriteAjaxStatuses ) {
		document.getElementById('feedBackDiv').innerHTML =  "at the arh_UpdateCart" ;
	}
	requestUnderway = false;
	nextReturnHandler = '';
	document.getElementById('shoppingCartWidget').innerHTML = objResponse.getElementsByTagName('data')[0].getElementsByTagName('shopHTML')[0].firstChild.data;

	document.getElementById('feedBackDiv').attributes['class'].nodeValue = "feedback actionok";
	document.getElementById('feedBackDiv').innerHTML =  objResponse.getElementsByTagName('data')[0].getElementsByTagName('feedback')[0].firstChild.data;
	document.getElementById('feedBackDiv').style.display = 'block';
	//close in a few seconds!
	setTimeout("hideFeedbackDiv()", 2000);

	//var = objResponse.getElementsByTagName('data')[0].getElementsByTagName('menu')[0].getElementsByTagName('name')[0].firstChild.data;
}

//--------------------------------
//  utility functions
//-----------------------------

/**
* simply hide the display of the feedback
*/
function hideFeedbackDiv () {
	document.getElementById('feedBackDiv').style.display = 'none';
}

/**
* add form fields to the request
* adds &fieldName=$fieldValue pairs
* the field ID is the identification
*/
function addFields( url, fields ) {
	if ( !isBlank(fields) ) {
		var arrFields = fields.split(",");
		for(i=0;i<(arrFields.length);i++) {
			arrFields[i] = arrFields[i].trim();
			if ( objField = document.getElementById( arrFields[i] ) ) {
				// alert ('add field \nID=' + arrFields[i] +' \nValue='+ objField.value );
				//if it's a select it still works
				//if it's a text field
			  url = url + '&' + objField.name + '=' + objField.value;
			}
		}
	}
	return url;
}

/**
* get the mouse posy
*/
function getPosition(e) {
	posX = 0;
	posY = 0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) 	{
		posX = e.pageX;
		posY = e.pageY;
	} else if (e.clientX || e.clientY) 	{
		posX = e.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft;
		posY = e.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop;
	}
	//alert ("x="+posX+", y="+ posY);
}
