
/*---------------------------------------------------------------------------* 
 * global variables for ajax																												 *
 *---------------------------------------------------------------------------*/

//INFO4HILTI: change time intervals if desired
var vgordr_ajaxTimeoutAfter = 60; //seconds
var vgordr_ajaxHideSuccessMsgAfter = 3; //seconds
var vgordr_comboItemType = 2; //INFO4HILTI: copied combo item type from server for the function ajax_formContainsComboItems()

// global ajax variables, because object approach to complex :->
var vgordr_clxAjaxThreadId = null; //must be null first
var vgordr_clxAjaxThreadIdSuccess = null; //must be null first
var vgordr_clxAjaxHttpRequest = null; //must be null first

//INFO4HILTI: use these status in response
var STATUS_LOADING = 0; //while waiting for server response
var STATUS_SUCCESS = 1; //after positive server response 
var STATUS_FAILURE = 2; //after negative server response
var STATUS_TIMEOUT = 3; //after waiting x seconds for server response
var STATUS_SVERROR = 4; //after server error or unknown response

//mapping of status to the styles in the css
var vgordr_msgTxtClassName = new Array();
vgordr_msgTxtClassName[STATUS_LOADING] = "loading";
vgordr_msgTxtClassName[STATUS_SUCCESS] = "info";
vgordr_msgTxtClassName[STATUS_FAILURE] = "error";
vgordr_msgTxtClassName[STATUS_TIMEOUT] = "error";
vgordr_msgTxtClassName[STATUS_SVERROR] = "error";

//default message layer texts
var vgordr_msgTxt = new Array();
vgordr_msgTxt[STATUS_LOADING] = "Loading...<br>Please wait.";
vgordr_msgTxt[STATUS_SUCCESS] = "<b>[HOL_ITEM_COUNT]</b> item(s) added to your cart.";
vgordr_msgTxt[STATUS_FAILURE] = "Item(s) could not be added to your cart.";
vgordr_msgTxt[STATUS_TIMEOUT] = "Server not responding.<br>Please try again.";
vgordr_msgTxt[STATUS_SVERROR] = "Unknown server response:";


/*-------------------------------------------------------------*
 * client-side javascript for order module objects 					   *
 * used to check quantity in prca/ordr												 *
 *-------------------------------------------------------------*/


/*---------------------------------------------------------------------------* 
 * returns true if at least one input is valid (range page)								   * 
 *---------------------------------------------------------------------------*/

// encodes html strings &lt; --> < etc...
function fl_url_encode (x) {
	x = new String(x);
	x = x.replace (/&lt;/g, '<');
	x = x.replace (/&gt;/g, '>');
	x = x.replace (/\+/g, ' ');	
	return x;
}

function addShopList()
{	
	var addShopForm								=	document.addShopList;
	addShopListForm.action.value	=	'addShopList';
	addShopListForm.submit();
}


// shows delete confirm dialog and submits delete action afterwards
// listname: url_encoded listname (< --> &lt; )
// strCheck: because browser (IE, NS) handle string param different (IE-does encode inside string, NS-does'nt!)
//						-> check if %20 (no encoding) or SPACE appears -> then do anther encoding if %20 appears ... :->>>
// displayListname : original listname with no encoding, for display in javascript confirm
// url: final url where to call delete command
// msgTxt: delete confirmation msg (out of stext)
function fgordr_delShopList(strCheck, listname, url, msgTxt, urlParams) {
	// unescape necessary, because of NS? - IE does it automatically
	if (strCheck=='%20') listname = unescape(listname);
	// for display: do unescape then map html-char (&lt; ..) to display values in ASCII -> because ASCII output not html!
	displayListname = fl_url_encode(unescape(listname));	

	var msg = msgTxt;
	msg = msg.replace (/\[HOL_SHOPLIST_NAME\]/, displayListname);
	var ret = confirm (msg);
	if (ret) {
		var newUrl = url+'?ShopList='+listname + urlParams;
		window.location.href = newUrl;
	}
}


/*---------------------------------------------------------------------------* 
 * returns true if at least one input is valid (range page)								   * 
 *---------------------------------------------------------------------------*/
function fgordr_isOneInputValid(form)
{
	//check flag to see if any item are selected to add into shopping or list
	var itemSele = false;
	var items = form.ListLength.value;
	for(var i=0; i < items; i ++)
	{
		var qtyField = form.elements["QTY_"+i];
		if (qtyField!=null) {
			var qty = qtyField.value;
			if(!isNaN(qty) && qty >= 1) itemSele = true;
		}
	}
	return(itemSele);
}

/*---------------------------------------------------------------------------* 
 * returns true if all inputs are valid (shopcart, shoplist)							   * 
 * first one that is not valid, focus is set																 * 
 *---------------------------------------------------------------------------*/
function fgordr_isAllInputValid(form)
{
	//check flag to see if any item are selected to add into shopping or list
	var itemSele = true;
	var items = form.ListLength.value;
	for(var i=0; i < items; i ++)
	{
		var qtyField = form.elements["QTY_"+i];
		if (qtyField!=null) {
			var qty = qtyField.value;
			if (!(!isNaN(qty) && qty >= 1)) {
				if (itemSele) qtyField.focus();
				itemSele = false;
			}
		}
	}
	return(itemSele);
}

// set message texts for ajax status message display during "add2cart"
function fgordr_setMsgTxt (x1, x2, x3, x4, x5) {
	vgordr_msgTxt[STATUS_LOADING] = x1;
	vgordr_msgTxt[STATUS_SUCCESS] = x2;
	vgordr_msgTxt[STATUS_FAILURE] = x3;
	vgordr_msgTxt[STATUS_TIMEOUT] = x4;
	vgordr_msgTxt[STATUS_SVERROR] = x5;
}

/*---------------------------------------------------------------------------* 
 * displays message layer on page load																					 *
 *---------------------------------------------------------------------------*/
function fgordr_showMessage (status, added) {
	fgutils_setMessageLayerWindowCenter();
	_fgordr_showMsgLayer(status, added, null)
}

/*---------------------------------------------------------------------------* 
 * will be called after user clickes 'Add to cart'(core ajax functionality)
 *---------------------------------------------------------------------------*/
function _fgordr_addItems2CartAsyncAjax(form) {
	if(vgordr_clxAjaxThreadId==null){
		// re-init http object all the time else further requests fail...
		vgordr_clxAjaxHttpRequest = null;
		fgutils_initHttpRequest();

		vgordr_clxAjaxThreadId = setTimeout(_fgordr_ajaxHandleTimeout,vgordr_ajaxTimeoutAfter*1000); //handles timeout
		_fgordr_showMsgLayer(STATUS_LOADING,null,null);
		var params = fgutils_getFormFieldsAsParams(form);
		fgutils_makePostRequest('../order/ordr_fuse.jsp', params, _fgordr_ajaxReadyStateChanged); //TODO4HILTI: uncomment
	}
}

/*---------------------------------------------------------------------------* 
 * will be called after the server responded (core ajax functionality)																						 *
 *---------------------------------------------------------------------------*/
function _fgordr_ajaxReadyStateChanged() {
	if (vgordr_clxAjaxThreadId!=null && (vgordr_clxAjaxHttpRequest.readyState == 4 || vgordr_clxAjaxHttpRequest.readyState=="complete")) {
		clearTimeout(vgordr_clxAjaxThreadId);
		vgordr_clxAjaxThreadId = null;
		if (vgordr_clxAjaxHttpRequest.status == 200 || vgordr_clxAjaxHttpRequest.readyState=="complete") {
			var response = vgordr_clxAjaxHttpRequest.responseText;
			var status = fgutils_getValue(response,"status");
			var items = fgutils_getValue(response,"items");
			var added = fgutils_getValue(response,"added");
			_fgordr_showMsgLayer(status,added,response);
			if(status==STATUS_SUCCESS || status==STATUS_FAILURE) _fgordr_setShopcartQty(items);
			if(status==STATUS_SUCCESS) objSubmitForm.resetQuantities();
		} else {
			_fgordr_showMsgLayer(STATUS_TIMEOUT,null,null);
		}
		
	}
}

/*---------------------------------------------------------------------------* 
 * displays all types of (ajax) status messages	in floating layer 					 *
 * status: status of message (STATUS_LOADING, ...)													 *
 * added: number of items added (optional)																	 *
 * response: server response in case of http error													 *
 *---------------------------------------------------------------------------*/
function _fgordr_showMsgLayer(status, added, response) {
	var msg_layer = document.getElementById("base_messageAsync");
	var msg_txt = document.getElementById("msg_layer_txt");
	var istatus = parseInt(status);
	var msg = "";
	switch (istatus) {
		case STATUS_LOADING:
		case STATUS_FAILURE:
		case STATUS_TIMEOUT:
			msg = vgordr_msgTxt[istatus];
			break;
		case STATUS_SUCCESS:
			msg = vgordr_msgTxt[istatus];
			msg = msg.replace (/\[HOL_ITEM_COUNT\]/, added);
			if(status) {
				clearTimeout(vgordr_clxAjaxThreadIdSuccess);
				vgordr_clxAjaxThreadIdSuccess = setTimeout("fgutils_hideMessageLayer()", vgordr_ajaxHideSuccessMsgAfter*1000);
			}
			break;
		default:
			istatus = STATUS_SVERROR;
			msg = vgordr_msgTxt[istatus]+" '"+response+"'";
			break;
	}
	msg_txt.innerHTML = msg;
	msg_layer.className = vgordr_msgTxtClassName[istatus];
	msg_layer.style.visibility = "visible";
}

/*---------------------------------------------------------------------------* 
 * will be called after server has not responded within x seconds, displays message
 *---------------------------------------------------------------------------*/
function _fgordr_ajaxHandleTimeout() {
	var msg_layer = document.getElementById("base_messageAsync");
	msg_layer.className = "error";
	var msg_txt = document.getElementById("msg_layer_txt");
	msg_txt.innerHTML = vgordr_msgTxt[STATUS_TIMEOUT];
	vgordr_clxAjaxThreadId = null;
}

/*---------------------------------------------------------------------------* 
 * updates clients cart item status																					 *
 *---------------------------------------------------------------------------*/
function _fgordr_setShopcartQty(items) {
	document.getElementById("base_shopcartLength").innerHTML = items;
}


/* ----------------------------------------------------------------*/

/*---------------------------------------------------------------------------* 
 * Submit form object																												 *
 * used in all shopping relevant pages (prca, ordr..)												 *
 * reason: one object supports all submit types															 *
 *---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------* 
 * submit form method																												 *
 * action: which action (addItem2Cart, addItem2List, ..)										 *
 * objAction: which shoplist selectbox																			 *
 * validType: validate for isAllInputValid or isOneInputValid   	 					 *
 * flag: only used in prca_product.jsp																			 *
 *---------------------------------------------------------------------------*/
function _fgordr_objSubmitForm_submitForm (action, objAction, flag) {
	// validates and submit form
	// returns true if validate & submit ok -> else false;
	function validateSubmit (form, action, flag, msg, validType) {
		var res = false;
		// do validation based on type (check all or at least one choosen)
		if (validType == 'isAllInputValid') {
			res = fgordr_isAllInputValid(form);
		} else if (validType == 'isOneInputValid') {
			res = fgordr_isOneInputValid(form)			
		}	else {
			alert ('validType:'+validType+' not supported!');
			return false;
		}
		// valid ok? -> submit form else display info message
		if(res) {
			// asynchronous add2cart call? -> if ajax available -> do async ajax call
			if(action=="addItem2CartAsync" && vgutils_isAjaxAvailable && !_fgordr_objSubmitForm_isComboItemInForm(form)) {
				form.action.value = "addItem2CartAsyncAjax";
				_fgordr_addItems2CartAsyncAjax(form);
				return false;
			}
			
			form.action.value = action;   
			form.submit();
			return true;
		} else {
			alert(msg);
			return false;
		}
	}
	// check actions: addItem2List, delItem, addItem2Cart
	var form = this._objForm;
	if (action=='addItem2List') {  // add 2 shoplist 
		var obj = objAction;
		var value = obj.options[obj.selectedIndex].value;
		if (value!='') {                                  // not navigation part choosed ?
			form.ShopList.value = value;                    // set choosen ShopList for further processing -> ordr_fuse
			var ret = validateSubmit(form, action, flag, this._strInfoMsg, this._validType);
			// reset select box values -> better navigation
			if (!ret) obj.selectedIndex = 0;                // Netscape?
		}
	} else if (action=='addPreItem2List') {
			var ret = validateSubmit(form, action, flag, this._strInfoMsg, this._validType);
			// reset select box values -> better navigation
			if (!ret) obj.selectedIndex = 0;                // Netscape?
	} else if (action=='delItem') {
		var ret = confirm (this._strDeleteMsg);
		if (ret) validateSubmit(form, action, flag, this._strInfoMsg, this._validType);
	} else if (action=='delItemNoPrice') {
		var ret = confirm (this._strDeleteNoPriceMsg);
		if (ret) validateSubmit(form, action, flag, this._strInfoMsg, this._validType);
	} else {                                            // add 2 shopcart, show shopcart, ...
		validateSubmit(form, action, flag, this._strInfoMsg, this._validType);
	}

}

/*---------------------------------------------------------------------------* 
 * set action and itemIndex to change replacement item											 *
 * action: changeReplaceItem 										 														 *
 * itemIndex: which item needs to be changed																 *
 * depending on item (old, new) in corresponding select box RI_OID_i				 *
 * either item is removed (old) or the new one is taken and line not marked  *
 * as "replacment item" any more because it is resolved											 *
 *---------------------------------------------------------------------------*/
function _fgordr_objSubmitForm_changeReplaceItem (action, itemIndex) {
	
	var form = this._objForm;
	var tmp = form.elements["RI_OID_"+itemIndex].value;
	// current select box choosen -> set props and submit form
	if (!fgutils_isEmptyString(tmp)) {
		form.action.value = action;   
		form.itemIndex.value = itemIndex;
		form.submit();
		return true;
	} else {
		// current select box not choosen -> then return false and dont submit
		return false;
	}
}


/*---------------------------------------------------------------------------* 
 * returns true if one of the item is a combo item, returns false otherwise. *
 *---------------------------------------------------------------------------*/
function _fgordr_objSubmitForm_isComboItemInForm(form)
{
	var ListLength = form.ListLength.value;
	var itemType = 0;
	var qty = 0;
	for(var i=0; i < ListLength; i++) {
		oid = form.elements["OID_"+i].value;
		itemType = form.elements["COMBO_"+i].value;
		// oid not empty (then check box was really selected - in shoplist)
		// -> if selected item in shoplist wasn't a combo (and at least a combo above) -> combo intermediate page was still displayed
		if (!fgutils_isEmptyString(oid)) {
			qty = form.elements["QTY_"+i].value;
			if(fgutils_isEmptyString(qty) || isNaN(qty) || qty <=0) continue;
			if(itemType == vgordr_comboItemType) return(true);
		}
	}
	return(false);
}

/*---------------------------------------------------------------------------* 
 * set delete message																										 		 *
 * only used in shopcart, shoplistdetail 														 				 *				
 *---------------------------------------------------------------------------*/
function _fgordr_objSubmitForm_setDeleteMsg (msg) {
	this._strDeleteMsg = msg;
}

/*---------------------------------------------------------------------------* 
 * set delete message no price																							 *
 * only used in shopcart									 														 			 *
 *---------------------------------------------------------------------------*/
function _fgordr_objSubmitForm_setDeleteNoPriceMsg (msg) {
	this._strDeleteNoPriceMsg = msg;
}

/*---------------------------------------------------------------------------* 
 * resets all quantities in the form after successfull 'Add to cart'
 *---------------------------------------------------------------------------*/
function _fgordr_objSubmitForm_resetQuantities() {
	var ListLength = this._objForm.ListLength.value;
	for(var i=0; i < ListLength; i++) {
		this._objForm.elements["QTY_"+i].value = "0";
	}
}

/*---------------------------------------------------------------------------* 
 * object submit form																										 		 *
 * objForm: object form of form																							 *
 * infoMsg: message display if submit not possible (nothing choosen..)			 *
 * validType: isAllInputValid, isOneInputValid															 *
 *---------------------------------------------------------------------------*/
function fgordr_objSubmitForm (objForm, infoMsg, validType) {
	// methods
	this.submitForm		= _fgordr_objSubmitForm_submitForm;
	this.changeReplaceItem = _fgordr_objSubmitForm_changeReplaceItem;
	this.setDeleteMsg = _fgordr_objSubmitForm_setDeleteMsg;
	this.setDeleteNoPriceMsg = _fgordr_objSubmitForm_setDeleteNoPriceMsg

	// ajax specific extension
	this.resetQuantities = _fgordr_objSubmitForm_resetQuantities;
	this.isComboItemInForm = _fgordr_objSubmitForm_isComboItemInForm;
	

	// data
	this._objForm = objForm;
	this._validType = validType;
	this._strInfoMsg = infoMsg;
	this._strDeleteMsg = '';
	this._strDeleteNoPriceMsg = '';
}

