/**
	@description Scripts to handle XHR-based updates to skus.
	* 				Note: Uses eval();
	* 				Note: Uses multiple Global variables
	@since Pre v11.5
	@requires prototype.js
*/


var skusUpdated = 'true';
var distinctItemFromDropDown = '';
var distinctItemFromRadio = '';
var distinctItemSequence = '';
var updateImages = true;
var fieldIndex = -1;


/* Objects */
function SkuControl() {
	this.skuOptions = new Array();
}

/**
	@description Initiates the XHR request for updated sku data.
	@since Pre v11.5
	@param {DOM FORM OBJECT} form The form containing the sku data to be updated.
	@param {OBJECT} skuControl The object containing information about the sku selections.
	@param {STRING} itemID The item ID.
	@param {NUMBER} fieldIndex The index of the field being updated.
	@requires prototype.js
	@see ajaxSkuUpdateResponse - XHR Response Action.
	@example ajaxUpdateSkuControls(control.form, skuControl, itemID, fieldIndex);		// {@link updateskucontrols}
*/
var ajaxUpdateSkuControls = function (form, skuControl, itemID, fieldIndex) {
	var url = '/ajax/com.eonegroup.eonecommerce.ajax.AJAXItemSkus',
		formNameParm = 'formName='+form.name,
		itmID,
		itmIdObj,
		iidLen,
		radioLength,
		itemIdParm,	
		skuMessageTypes = '',
		skuOptionParms = '',
		oszcodeParm = '',
		parms,
		myAjax,
		lc1;

	if (document.getElementById('selectskus')) {
		document.getElementById('selectskus').innerHTML = '';
	}

	if (itemID === '') {
		itmIdObj = form.IID
		iidLen = itmIdObj.length;

		if(iidLen > 1) {
			itmID = itmIdObj[fieldIndex].value;
		} else {
			itmID = itmIdObj.value;
		}

		if (!itmID) {
			radioLength = itmIdObj.length;
			for(lc1 = 0; lc1 < radioLength; lc1 += 1) {
				if(itmIdObj[lc1].checked) {
					itmID = itmIdObj[lc1].value;
					distinctItemFromRadio = itmID;
				}
			}
		}
	} else {
		itmID = itemID;
	}

	itemIdParm = 'itemId='+itmID;

	if (skuControl) {
		for (lc1 = 0; lc1 < skuControl.skuOptions.length; lc1 += 1) {
			skuOptionParms = skuOptionParms + '&skuoptions=' + encodeURIComponent(skuControl.skuOptions[lc1]);
		}
	}

	if(form.oszcode) {
		oszcodeParm = '&oszcode='+form.oszcode.value;	
	}

	parms = itemIdParm + skuOptionParms + oszcodeParm + '&' + formNameParm + skuMessageTypes;

	myAjax = new Ajax.Request( url, { method: 'get', parameters: parms, onComplete: ajaxSkuUpdateResponse, encoding:'UTF-8' });
	skusUpdated = 'true';
};

/**
 * @description XHR Response to handle updating sku information
 * 					Note: uses eval().
 * @param {XHR Response Object} req The XHR Response.
 * @see ajaxUpdateSkuControls
 */
function ajaxSkuUpdateResponse(req) {
	var reqXML = (new DOMParser()).parseFromString(req.responseText, 'text/xml'),
		formnameTag = reqXML.getElementsByTagName('formname').item(0),
		skuIdTag = reqXML.getElementsByTagName('skuid').item(0),
		defaultSkuIdTag = reqXML.getElementsByTagName('lastskuid').item(0), 
		imageTag = reqXML.getElementsByTagName('image').item(0),
		priceTag = reqXML.getElementsByTagName('price').item(0),
		inventoryMessageTag = reqXML.getElementsByTagName('inventoryMessage').item(0),
		formName = '',
		skuID = '',
		image = '',
		price = '',
		imgElements,
		inventoryMessage = '',
		form,
		spanElements,
		lc1;

	if (formnameTag && formnameTag.firstChild) {
		formName = formnameTag.firstChild.nodeValue;
		formName = formName.replace(/\r|\n|\r\n/g, '');
	}

	if (skuIdTag && skuIdTag.firstChild) {
		skuID = skuIdTag.firstChild.nodeValue;
		if (eval('$(\'' + distinctItemFromDropDown + distinctItemSequence + 'skuid1\')')) {
			eval('$(\'' + distinctItemFromDropDown + distinctItemSequence + 'skuid1\')').innerHTML = skuID;
		}
	} else {
		if (eval('$(\'' + distinctItemFromDropDown + distinctItemSequence + 'skuid1\')')) {
			eval('$(\'' + distinctItemFromDropDown + distinctItemSequence + 'skuid1\')').innerHTML = '';
		}
	}

	if (imageTag && imageTag.firstChild) {
		image = imageTag.firstChild.nodeValue;
	}

	if (inventoryMessageTag && inventoryMessageTag.firstChild) {
		inventoryMessage = inventoryMessageTag.firstChild.nodeValue;
	}
	if (priceTag && priceTag.firstChild) {
		price = getChildrenXMLString(reqXML, 'price');
		if (document.getElementById('skuprice1')) {
			document.getElementById('skuprice1').innerHTML = price;		
		}

		if (eval('$(\''+distinctItemFromDropDown+distinctItemSequence+'skuprice1\')')) {
			eval('$(\''+distinctItemFromDropDown+distinctItemSequence+'skuprice1\')').innerHTML = price;
		}

		if (eval('$(\''+distinctItemFromRadio+'skuprice1\')')) {
			eval('$(\''+distinctItemFromRadio+'skuprice1\')').innerHTML = price;
		}
	}

	if (formName.length > 0) {
		form = document.forms[formName];
		spanElements = form.getElementsByTagName('span');

		for(lc1 = 0; lc1 < spanElements.length; lc1 += 1) {
			if (skuIdTag && skuIdTag.firstChild) {
				if (spanElements[lc1].className == 'itemid') {
					spanElements[lc1].innerHTML=skuID;
				}

				if (spanElements[lc1].className == 'itemid2') {
					spanElements[lc1].innerHTML=skuID;
				}
			}
		}

		for(lc1 = 0; lc1 < spanElements.length; lc1 += 1) {
			if (spanElements[lc1].className == 'inventorymsg') {
				spanElements[lc1].innerHTML=inventoryMessage;
			}
		}

		if (priceTag && priceTag.firstChild) {
			for(lc1 = 0; lc1 < spanElements.length; lc1 += 1) {
				if (spanElements[lc1].className == 'skuprice') {
					spanElements[lc1].innerHTML=price;
				}
			}
		}
	}

	if (eval('$(\''+distinctItemFromDropDown+distinctItemSequence+'inventorymsg\')')) {
		eval('$(\''+distinctItemFromDropDown+distinctItemSequence+'inventorymsg\')').innerHTML = inventoryMessage;
	}

	if (eval('$(\''+distinctItemFromRadio+'inventorymsg\')')) {
		eval('$(\''+distinctItemFromRadio+'inventorymsg\')').innerHTML = inventoryMessage;
	}

	if (image.length > 0 && updateImages) {
		imgElements = document.getElementsByTagName('img');

		for(lc1 = 0; lc1 < imgElements.length; lc1 += 1) {
			if (imgElements[lc1].className == 'itemimg') {
				imgElements[lc1].src = image;
			}
		}

		imgElements = form.getElementsByTagName('img');
		for(lc1 = 0; lc1 < imgElements.length; lc1 += 1) {
			if (imgElements[lc1].className === 'itemimgthumb') {
				imgElements[lc1].src = image;
			}
		}
	}

	if (document.getElementById(distinctItemFromDropDown+distinctItemSequence+'skuID')) {
		document.getElementById(distinctItemFromDropDown+distinctItemSequence+'skuID').value = skuID;
	}

	updateSkuOptions(reqXML, getFieldByID(form, 'skuvalue', distinctItemFromDropDown+distinctItemSequence+'skuvalue1', fieldIndex), 'Skuoption1');
	updateSkuOptions(reqXML, getFieldByID(form, 'skuvalue', distinctItemFromDropDown+distinctItemSequence+'skuvalue2', fieldIndex), 'Skuoption2');
	updateSkuOptions(reqXML, getFieldByID(form, 'skuvalue', distinctItemFromDropDown+distinctItemSequence+'skuvalue3', fieldIndex), 'Skuoption3');
	updateSkuOptions(reqXML, getFieldByID(form, 'skuvalue', distinctItemFromDropDown+distinctItemSequence+'skuvalue4', fieldIndex), 'Skuoption4');
	updateSkuOptions(reqXML, getFieldByID(form, 'skuvalue', distinctItemFromDropDown+distinctItemSequence+'skuvalue5', fieldIndex), 'Skuoption5');
	updateSkuOptions(reqXML, getFieldByID(form, 'skuvalue', distinctItemFromDropDown+distinctItemSequence+'skuvalue6', fieldIndex), 'Skuoption6');

	if (typeof window.ajaxSkuExit === 'function') {
		ajaxSkuExit(reqXML);
	}
}

/* Ajax Utility Methods */
function updateSkuOptions(req, skuControl, optionTag) {
	//alert(distinctItemFromDropDown);
	if(!skuControl) {return;}
	var skuElements = req.getElementsByTagName(optionTag);
	if (skuElements.length > 0) {
		skuControl.options.length=0;

		for(i = 0; i < skuElements.length; i++) {
			var text = skuElements.item(i).firstChild.nodeValue;
			
			if ('function' == typeof window.ajaxSkuOptionValidator) {
				text = ajaxSkuOptionValidator(text, optionTag);
			} 
			var option = document.createElement('option');
			option.text = text;
			option.value = text;
		skuControl.options.add(option);
		}
	}
}

/**
	@description Initiates the update of the sku controls.
	@author Revised by John Arthur (v11.5) - Took out a function call within a function call, set it to its own variable. Replaced a call to a function with the function itself.
	@since v11.5
	@param {DOM SELECT OBJECT} control The sku interface control that triggered the function.
	@param {ARRAY} skuControls An array of all sku interface controls in the form.
	@requires getFieldByID
	@requires ajaxUpdateSkuControls
*/
var updateskucontrols = function (control, skuControls) {
	var skuControl = new SkuControl(),
		callingcontrolnumber = control.id.substring(control.id.length-1, control.id.length-0),
		index = control.id.indexOf('skuvalue'),	
		index1 = control.id.indexOf('_'),
		sequenceString = control.id.substring(index1 + 1),
		itemID = '',
		skuField = '',
		lc1;

	fieldIndex = getFieldIndexById(control);

	index1 = sequenceString.indexOf('_');
	sequenceString = sequenceString.substring(0,index1);

	if (index1 > -1) {
		distinctItemSequence = '_' + sequenceString + '_';
	}

	if (index > 1) {
		itemID = control.id.substring(0, index);
		itemID = itemID.replace(distinctItemSequence,'');
		distinctItemFromDropDown = itemID;
	}
	for (lc1 = 1; lc1 <= callingcontrolnumber; lc1 += 1) {
		skuField = getFieldByID(control.form, control.name, itemID + distinctItemSequence + 'skuvalue' + lc1, fieldIndex);

		if (skuField) {
			skuControl.skuOptions[lc1 - 1] = skuField.value;
		}
	}

	ajaxUpdateSkuControls(control.form, skuControl, itemID, fieldIndex);
};

/* Page Utility Methods */
function updateSkuFromImage(caption) {
	//alert('skufor image');
	var skuOne = document.getElementById('skuvalue1');
	if (skuOne) {
		//alert('caption :'+ caption);
		if (skuOne.options) {
			for(var i = 0; i < skuOne.options.length; i++) {	
				if(skuOne.options[i].text == caption) {
					skuOne.selectedIndex = i;
				}
			}
		} else if (skuOne.value) {
			skuOne.value = caption;
		}
		updateskucontrols(skuOne, '');	
	}
}

function updateSkuFromImageWithForm(form, caption) {
	var skuOne
	
	if (form.skuvalue.length > 0) {
		skuOne = form.skuvalue[0];	
	}
	else {
		skuOne = form.skuvalue[0];
	}
	
	for(var i = 0; i < skuOne.options.length; i++) {
		if(skuOne.options[i].text == caption) {
			skuOne.selectedIndex = i;
		}
	}
	updateskucontrols(skuOne, '');
		
}

function updateitemcontrols() {
	if (document.getElementById('skuvalue1')) {
		ajaxUpdateSkuControls(document.getElementById('skuvalue1').form, null, '', 0);
	}
}

function getChildrenXMLString(obj,tag){
	var nodes =	obj.getElementsByTagName(tag);
	var nodeVal = '';
	var browser=navigator.appName;
	//alert(browser);
	for(var i=0; i<nodes.length; i++) {
		var childNodes = nodes[i].childNodes;
		for(var j=0; j<childNodes.length; j++) {
			if(browser=='Netscape') {
				nodeVal += (new XMLSerializer()).serializeToString(childNodes[j]);
			} else {
				nodeVal += childNodes[j].xml;
			}
		}
	}
	//var nodeVal = (new XMLSerializer()).serializeToString(nodes[0]);
	//document.getElementById('testdom').innerHTML = nodeVal;
	return nodeVal;
}

function submitForm(form) {
	var message = '';
	var submitForm = true;
	var found = false;
	for (var x=0; x<6; x++) {
		if (form.skutext[x]) {
			found = true;
			var select = eval('$(\'skuvalue' + (x+1) + '\')').value;
			if (select.indexOf('Select') > -1) {
				message = message + 'Please select '+ form.skutext[x].value + '<br/>';
				submitForm = false;
			}
		}
	}

	if (!found && form.skutext) {
		var select =form.skuvalue.value;
		if (select.indexOf('Select') > -1) {
			message = message + 'Please select '+ form.skutext.value + '<br/>';
			submitForm = false;
		}
	}
			 
	if (!submitForm) {
		document.getElementById('selectskus').innerHTML = message;
		return false; 
	}
	else {
		form.submit();
	}
}

if (typeof(DOMParser) == 'undefined') {
	DOMParser = function() {}
	DOMParser.prototype.parseFromString = function(str, contentType)
	{ 
		if(typeof(ActiveXObject) != 'undefined') {
			var xmldata = new ActiveXObject('MSXML.DomDocument');
			xmldata.async = false;
			xmldata.loadXML(str); 
			return xmldata; 
		} 
		else if(typeof(XMLHttpRequest) != 'undefined') {
			var xmldata = new XMLHttpRequest; 
			if(!contentType) {
				contentType = 'application/xml'; 
			} 
			xmldata.open('GET', 'data:' + contentType + ';charset=utf-8,' + encodeURIComponent(str), false);
			if(xmldata.overrideMimeType) {
				xmldata.overrideMimeType(contentType); 
			}
			xmldata.send(null);
			return xmldata.responseXML;
		} 
	} 
}





/**
	@description Get the index of this field (using its id) from an Array of input elements in a form with same name.
	@author Revised by John Arthur (v11.5) - Brought over from /utils/html_form_utils.js (not used anywhere else)
	@since v11.5
	@param {DOM INPUT OBJECT} thisField The field whose index is to be returned.
	@return {NUMBER} The index within the form held by the field in question.
	@example fieldIndex = getFieldIndexById(control);		// {@link updateskucontrols}
*/
var getFieldIndexById = function (thisField) {
	var tempForm = thisField.form,
		tempFieldName = thisField.name,
		tempFieldID = thisField.id,
		fields = tempForm.elements,
		returnIndex = '',
		fieldCount = -1,
		lc1;

	for (lc1 = 0; lc1 < fields.length; lc1 += 1) {
		if (fields[lc1].name === tempFieldName && fields[lc1].id === tempFieldID) {
			fieldCount += 1;

			if (fields[lc1] === thisField) {
				returnIndex = fieldCount;
			}
		}
	}

	return returnIndex;
};

/**
	@description Get the input field (using its id)	from an Array of input elements in a form using the name and index
	@author Revised by John Arthur (v11.5) - Brought over from /utils/html_form_utils.js (not used anywhere else)
	@since v11.5
	@param {DOM FORM OBJECT} thisForm The form the field is a part of.
	@param {STRING} fieldName The value of the name attribute of the field to be returned.
	@param {STRING} fieldID The value of the id attribute of the field to be returned.
	@param {NUMBER} fieldIndex The index of the field to be returned.
	@return {DOM FORM FIELD OBJECT} The field in the form with name and ID matching those supplied.
	@example skuField = getFieldByID(control.form, control.name, itemID+distinctItemSequence+'skuvalue'+i, fieldIndex);		// {@link updateskucontrols}
	
*/
var getFieldByID = function (thisForm, fieldName, fieldID, fieldIndex) {
	var fields = thisForm.elements,
		returnIndex = '',
		fieldCount = 0,
		returnField,
		lc1;

	for (lc1 = 0; lc1 < fields.length; lc1 += 1) {
		if (fields[lc1].name === fieldName && fields[lc1].id === fieldID) {
			if (fieldCount === fieldIndex) {
				returnField = fields[lc1];
			}

			fieldCount += 1;
		}
	}

	return returnField;
};

