// PersonalizationHelper.js

function persRule(type) {
	if (type == '1') {
		return "Text";
	} else if (type == '2') {
		return "A.B.C.";
	} else if (type == '3') {
		return "DD/MM/YY";
	} else if (type == '4') {
		return "DD/MM/YYYY";
	} else if (type == '5') {
		return "1st January 2000";
	} else if (type == '6') {
		return "1st Jan 2000";
	}
}

// Validation Functions
function persValidator_1(form, fieldname, divname, txt, len, result, mandatory, andor) {
	// Free text
	reWhiteSpace = new RegExp(/^\s+$/);
	var field = form.elements[fieldname];
	var onchange = field.onchange;

	if(!checkMutualExclusive(form, fieldname, divname, txt, andor)){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSMUTUALEXCLUSIVE"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(mandatory=="true" && txt == null){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSTEXT_CONTENT"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(mandatory=="true" && (txt != null && (reWhiteSpace.test(txt) || txt == ""))){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSTEXT_CONTENT"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(txt.length > len){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSTEXT_LENGTH"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	
	form.elements[result].value = txt;
}

function persValidator_2(form, fieldname, divname, txt, len, result, mandatory, andor) {
	// Initials only
	reWhiteSpace = new RegExp(/^\s+$/);
	var field = form.elements[fieldname];
	var onchange = field.onchange;

	if(!checkMutualExclusive(form, fieldname, divname, txt, andor)){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSMUTUALEXCLUSIVE"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(mandatory=="true" && txt == null){Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSINITIALS_CONTENT"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(mandatory=="true" && (txt != null && (reWhiteSpace.test(txt) || txt == ""))){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSINITIALS_CONTENT"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(txt.length > len){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSINITIALS_LENGTH"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	

	var res="";
	if (txt.length > 0) {
		var i=0;
		res = txt.substr(i,1);
		for (i=1; i<txt.length; i++) {
			if (txt.charAt(i) == '.') {
				// Ignore .s as we add them in anyway
			} else {
				res = res + '.' + txt.charAt(i);
			}
		}
		res = res + '.';
	}
	
	form.elements[result].value = res.toUpperCase();
}

function persValidator_3(form, fieldname, divname, txt, len, result, mandatory, andor) {
	// Date
	reWhiteSpace = new RegExp(/^\s+$/);
	var field = form.elements[fieldname];
	var onchange = field.onchange;

	if(!checkMutualExclusive(form, fieldname, divname, txt, andor)){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSMUTUALEXCLUSIVE"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(mandatory=="true" && txt == null){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(mandatory=="true" && (txt != null && (reWhiteSpace.test(txt) || txt == ""))){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(txt.length > len){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSDATE_LENGTH"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	

	try {
		var splitString = txt.split('/');
		var day=parseInt(splitString[0],10);
		var month=parseInt(splitString[1],10);
		var year=parseInt(splitString[2],10);
		if ((day == NaN)||(day < 1)||(day>31)) throw "Invalid Day";
		if ((month == NaN)||(month < 1)||(month>12)) throw "Invalid Month";
		if ((year == NaN)||(year < 0)) throw "Invalid Year";
		
		var d = new Date(year, month-1, day);
		
		if ((day == ("00"+d.getDate()).substr(("00"+d.getDate()).length-2,2)) &&
			(month == ("00"+(d.getMonth()+1)).substr(("00"+(d.getMonth()+1)).length-2,2)) &&
			(year == ("00"+d.getYear()).substr(("00"+d.getYear()).length-2,2)))
		{
			form.elements[result].value = 
				("00"+d.getDate()).substr(("00"+d.getDate()).length-2,2) + '/' +
				("00"+(d.getMonth()+1)).substr(("00"+(d.getMonth()+1)).length-2,2) + '/' +					
				("00"+d.getYear()).substr(("00"+d.getYear()).length-2,2);
		} else {
			Common.formErrorHandleClient(fieldname,
										 Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"]+" ["+persRule('3')+"]",
										 form.name,
										 divname);
			resetOnchange(onchange, field, form.name);
			return;		
		}

		if ((form.elements[result].value).substr(0,3) == "NaN") throw "Date format error";
	} catch (err) {
		Common.formErrorHandleClient(fieldname,
									 Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"]+" ["+persRule('3')+"]",
									 form.name,
									 divname);
		resetOnchange(onchange, field, form.name);
		return;		
	}
}

function persValidator_4(form, fieldname, divname, txt, len, result, mandatory, andor) {
	// Date
	reWhiteSpace = new RegExp(/^\s+$/);
	var field = form.elements[fieldname];
	var onchange = field.onchange;

	if(!checkMutualExclusive(form, fieldname, divname, txt, andor)){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSMUTUALEXCLUSIVE"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(mandatory=="true" && txt == null){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"],form.name,divname); resetOnchange(onchange, field, form.name);  return;}	
	if(mandatory=="true" && (txt != null && (reWhiteSpace.test(txt) || txt == ""))){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(txt.length > len){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSDATE_LENGTH"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	

	try {
		var splitString = txt.split('/');
		var day=parseInt(splitString[0],10);
		var month=parseInt(splitString[1],10);
		var year=parseInt(splitString[2],10);
		if ((day == NaN)||(day < 1)||(day>31)) throw "Invalid Day";
		if ((month == NaN)||(month < 1)||(month>12)) throw "Invalid Month";
		if ((year == NaN)||(year < 0)) throw "Invalid Year";
		
		var d = new Date(year, month-1, day);
		
		if ((day == ("00"+d.getDate()).substr(("00"+d.getDate()).length-2,2)) &&
			(month == ("00"+(d.getMonth()+1)).substr(("00"+(d.getMonth()+1)).length-2,2)) &&
			(year == ("0000"+d.getFullYear()).substr(("0000"+d.getFullYear()).length-4,4)))
		{
			form.elements[result].value = 
				("00"+d.getDate()).substr(("00"+d.getDate()).length-2,2) + '/' +
				("00"+(d.getMonth()+1)).substr(("00"+(d.getMonth()+1)).length-2,2) + '/' +
				("0000"+d.getFullYear()).substr(("0000"+d.getFullYear()).length-4,4);
		} else {
			Common.formErrorHandleClient(fieldname,
										 Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"]+" ["+persRule('4')+"]",
										 form.name,
										 divname);
			resetOnchange(onchange, field, form.name);
			return;		
		}

		if ((form.elements[result].value).substr(0,3) == "NaN") throw "Date format error";
	} catch (err) {
		Common.formErrorHandleClient(fieldname,
									 Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"]+" ["+persRule('4')+"]",
									 form.name,
									 divname);
		resetOnchange(onchange, field, form.name);
		return;		
	}
}

function persValidator_5(form, fieldname, divname, txt, len, result, mandatory, andor) {
	// Date
	months = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	reWhiteSpace = new RegExp(/^\s+$/);
	var field = form.elements[fieldname];
	var onchange = field.onchange;

	if(!checkMutualExclusive(form, fieldname, divname, txt, andor)){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSMUTUALEXCLUSIVE"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(mandatory=="true" && txt == null){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(mandatory=="true" && (txt != null && (reWhiteSpace.test(txt) || txt == ""))){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(txt.length > len){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSDATE_LENGTH"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	

	try {
		var day=("00"+parseInt(txt,10)).substr(("00"+parseInt(txt,10)).length-2,2);
		var month=txt.split(" ")[1];
		var year=parseInt(txt.split(" ")[2]);

		var d = new Date(month+" "+day+", "+year);	
		var dayth = "th";
		
		if (((""+day).substr(1,1)=="1") && ((""+day).substr(0,1)!="1"))
			dayth="st";
		if (((""+day).substr(1,1)=="2") && ((""+day).substr(0,1)!="1"))
			dayth="nd";
		if (((""+day).substr(1,1)=="3") && ((""+day).substr(0,1)!="1"))
			dayth="rd";
		
		form.elements[result].value = 
			d.getDate() + dayth + " " +
			months[d.getMonth()] + " " +
			("0000"+d.getFullYear()).substr(("0000"+d.getFullYear()).length-4,4);

		if ((form.elements[result].value).substr(0,3) == "NaN") throw "Date format error";
	} catch (err) {
		Common.formErrorHandleClient(fieldname,
									 Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"]+" ["+persRule('5')+"]",
									 form.name,
									 divname);
		resetOnchange(onchange, field, form.name);
		return;		
	}
}

function persValidator_6(form, fieldname, divname, txt, len, result, mandatory, andor) {
	// Date
	mths = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
	reWhiteSpace = new RegExp(/^\s+$/);
	var field = form.elements[fieldname];
	var onchange = field.onchange;

	if(!checkMutualExclusive(form, fieldname, divname, txt, andor)){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSMUTUALEXCLUSIVE"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(mandatory=="true" && txt == null){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(mandatory=="true" && (txt != null && (reWhiteSpace.test(txt) || txt == ""))){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	
	if(txt.length > len){ Common.formErrorHandleClient(fieldname,Common.errorMessages["ERROR_INVALIDPERSDATE_LENGTH"],form.name,divname); resetOnchange(onchange, field, form.name); return;}	

	try {
		var day=("00"+parseInt(txt,10)).substr(("00"+parseInt(txt,10)).length-2,2);
		var month=txt.split(" ")[1];
		var year=parseInt(txt.split(" ")[2]);
		var d = new Date(month+" "+day+", "+year);	
		var dayth = "th";
		if (((""+day).substr(1,1)=="1") && ((""+day).substr(0,1)!="1"))
			dayth="st";
		if (((""+day).substr(1,1)=="2") && ((""+day).substr(0,1)!="1"))
			dayth="nd";
		if (((""+day).substr(1,1)=="3") && ((""+day).substr(0,1)!="1"))
			dayth="rd";

		form.elements[result].value = 
			d.getDate() + dayth + " " +
			mths[d.getMonth()] + " " +
			("0000"+d.getFullYear()).substr(("0000"+d.getFullYear()).length-4,4);
			
		if ((form.elements[result].value).substr(0,3) == "NaN") throw "Date format error";
	} catch (err) {
		Common.formErrorHandleClient(fieldname,
									 Common.errorMessages["ERROR_INVALIDPERSDATE_CONTENT"]+" ["+persRule('6')+"]",
									 form.name,
									 divname);
		resetOnchange(onchange, field, form.name);
		return;		
	}
}

function savePersChanges(orderItemId, form) { // Based on UserRegistrationUpdate
	var params = [];
	var count = 0;
	updateParamObject(params, "p_orderItemsId", orderItemId, false, -1);
	for (i=0; i<form.elements.length; i++)
	{
		if (form.elements[i].name.indexOf(orderItemId) > 0) {
			updateParamObject(params, form.elements[i].name, form.elements[i].value, false, -1);
			count=count+1;
		}
	}
	
	if (count>1) { // Ensure only pers items are saved here
		wc.service.invoke("AjaxOrderItemPersonalizationUpdate", params);
	}
}

function updateParamObject(params, key, value, toArray, index){
   if(params == null){
	   params = [];
   }

   if(params[key] != null && toArray)
   {
		if(dojo.lang.isArrayLike(params[key]))
		{
			//3rd time onwards
		    if(index != null && index != "")
			{
				//overwrite the old value at specified index
			     params[key][index] = value;
			}
			else
			{
			    params[key].push(value);
		     }
	    }
		else
		{
		     //2nd time
		     var tmpValue = params[key];
		     params[key] = [];
		     params[key].push(tmpValue);
		     params[key].push(value);
	    }
   }
   else
   {
		//1st time
	   if(index != null && index != "" && index != -1)
	   {
	      //overwrite the old value at specified index
	      params[key+"_"+index] = value;
	   }
	   else if(index == -1)
	   {
	      var i = 1;
	      while(params[key + "_" + i] != null)
		  {
		       i++;
	      }
	      params[key + "_" + i] = value;
	   }
	   else
	   {
	      params[key] = value;
	    }
   }
   return params;
}

function resetOnchange(onchange, field, formName) {
	// For some reason the common error routine overwrites the onchange function,
	// so this will set it back again.
	field.onchange = onchange;
	field.onfocus = (function() {Common.hideErrorNode(field.name, formName);});
}

function checkMutualExclusive(form, fieldname, divname, txt, andor) {
	// Fields are in the following format
	// ${PREFIX}__persOriginalValue__${v_orderItemId}__${count}__
	// Assumes no more than 20 pers lines
	// if (andor != 2) return true;
	var valueSet=0;
	var flds = new Array(20);
	var startPoint;
	var orderItemId = fieldname.split("__")[2];
	var line = parseInt(fieldname.split("__")[3],10);
	for (var i=0; i<form.elements.length; i++) {
		var fld = form.elements[i];
		if ((fld.name.indexOf(orderItemId) > -1) &&
			(fld.name.indexOf(fieldname.split("__")[1]) > -1)) {
			flds[parseInt(fld.name.split("__")[3],10)] = fld;
			if (fld.name == fieldname) {
				startPoint = parseInt(fld.name.split("__")[3],10);
			}
		}
	}
	var thisField = startPoint;
	if (startPoint<1) startPoint=1;
	
	for (var i=startPoint-1; i>0; i--) {
		// Move backwards until we find an AND rather than OR
		if (form.elements[
				flds[i].name.split("__")[0]+"__"+
				"persAndOr__"+
				flds[i].name.split("__")[2]+"__"+
				flds[i].name.split("__")[3]+"__"].value == 1) {
			break;
		}
		startPoint=i;
	}

	for (var i=startPoint; i<20; i++) {
		if (flds[i]) {
			if ((flds[i].value != null) && (flds[i].value != "")) {
				valueSet = valueSet+1;
			}
			if (form.elements[
					flds[i].name.split("__")[0]+"__"+
					"persAndOr__"+
					flds[i].name.split("__")[2]+"__"+
					flds[i].name.split("__")[3]+"__"].value == 1) {
				break;
			}
		}
	}
	
	return (valueSet < 2);
}

