//-----------------------------------------------------------------
// Licensed Materials - Property of IBM
//
// WebSphere Commerce
//
// (C) Copyright IBM Corp. 2006, 2008 All Rights Reserved.
//
// US Government Users Restricted Rights - Use, duplication or
// disclosure restricted by GSA ADP Schedule Contract with
// IBM Corp.
//-----------------------------------------------------------------

/** 
 * @fileOverview This javascript is used by the store jsp's related to address creation and maintenance.
 * @version 1.0
 */

/**
 * The functions defined in this class enable address creation across the store.
 * @class The functions and variables defined in this class validate the form input field values entered by 
 * the customer. Another set of functions help in loading the UI for the state field when there is a change
 * in the country field. Another set of functions enable creating an address in the shopcart page and
 * guest user checkout page.
 */

AddressHelper = {
	/* The name of the state field div. */
	stateDivName : "stateDiv",
	/* styling class for the state field. */
	stateClass   : null,
	 
	/**
	 * This function sets the name for the state field.
	 * @param {string} stateDivName The name to be set for the state field.  
	 */
	setStateDivName:function(stateDivName){
		this.stateDivName = stateDivName; 
	 },
	
	 /**
	  * This function sets the styling class for the state field. 
	  * @param {string} stateClass The name of the styling class to be set for the state field. 
	  */
	setStateClass:function(stateClass){
		this.stateClass = stateClass;
	},

	/**
	 * This function will load the state field depending on the country selection.
	 * @param {string} formName  The name of the address form containing the state field and country field.
	 * @param {string} stateDiv  The name of the state field.
	 * @param {string} id The id of the state field to be created.
	 */
	loadStatesUI:function(formName,paramPrefix,stateDiv,id){
	
	
		var form = document.getElementById(formName);
		if(paramPrefix == null || paramPrefix == 'undefined' || paramPrefix == ""){
			paramPrefix = "";
		}
		var newid = paramPrefix + id;
		var currentState = document.getElementById(newid).value;

		if(id=="_state1"){
		this.setStateClass("form_input");
		var currentCountryCode =form[paramPrefix + "_country"].value;}
		else{
		var currentCountryCode =form[paramPrefix + "country"].value;} 

		var stateDivObj = document.getElementById(stateDiv);
		if(dojo.isIE){
		var stateClass = document.getElementById(newid).getAttribute("className");}/* For IE */
		else {var stateClass=document.getElementById(newid).getAttribute("class")};

		if(stateClass!="drop_down_country")
		this.setStateClass(stateClass);
		 while(stateDivObj.hasChildNodes()) {
			stateDivObj.removeChild(stateDivObj.firstChild);
		}

		if (countries[currentCountryCode].states) {
			/* switch to state list */
			stateDivObj.appendChild(this.createStateWithOptions(paramPrefix, currentCountryCode, currentState,id));
		} else {
			/* switch to state text input */
			stateDivObj.appendChild(this.createState(paramPrefix, currentState, id));
		}
	},
	
	/**
	 *	This function creates an input element to represent the state.
	 *  @param {string} paramPrefix The value can be shipping, billing or blank.
	 *  @param {string} currentState The value in the state field.
	 *  @param {string} id The id of the state field.
	 */
	createState:function(paramPrefix,currentState,id){
		var stateInput = document.createElement("input");
		stateInput.setAttribute("id",paramPrefix + id);
		if(id=="_state1"){
		stateInput.setAttribute("name", paramPrefix + "_state");}
		else{
		stateInput.setAttribute("name", paramPrefix + "state");}
		stateInput.setAttribute("class", this.stateClass);
		stateInput.setAttribute("className",this.stateClass);
		stateInput.setAttribute("size", "35");
		stateInput.setAttribute("maxlength", "49");
		stateInput.setAttribute("value", currentState);
		return stateInput;
	},
	
	/**
	 * This function creates a <select> element to represent the state field and loads it with the 
	 * states corresponding to the country field.
     * @param {string} paramPrefix The value can be shipping, billing or blank.
	 * @param {string} currentCountryCode The country code of the selected country.
	 * @param {string} currentState The value in the state field.
	 * @param {string} id The id of the state field.
	 */
	createStateWithOptions:function(paramPrefix, currentCountryCode, currentState,id){
		var stateSelect = document.createElement("select");
		stateSelect.setAttribute("id", paramPrefix + id);
		if(id=="_state1"){
		stateSelect.setAttribute("name", paramPrefix + "_state");}
		else{
		stateSelect.setAttribute("name", paramPrefix + "state");}
		stateSelect.setAttribute("class","drop_down_country");
		stateSelect.setAttribute("className","drop_down_country");
		/*clear old options. */
		stateSelect.options.length = 0;
		
		/* add all states. */
		for (state_code in countries[currentCountryCode].states) {
			
			aOption = document.createElement("option");
			stateSelect.options[stateSelect.length] = aOption;
			aOption.text = countries[currentCountryCode].states[state_code];
			aOption.value = state_code;

			if (state_code == currentState || countries[currentCountryCode].states[state_code] == currentState) {
				aOption.selected = true;
			}
		}
		
		return stateSelect;
	},
	
	
	/**
	 * This function validates the address form independently from the order of the fields displayed on the form, i.e. independent from the locale.
	 * A hidden field named "fields" must be set in the jsp/jspf file that calls this method. The purpose of this hidden field is 
	 * to set all the mandatory input fields and the order of these fields displayed on each locale-specific address entry page, so that
	 * this method knows which input fields to validate and in which order it should validate them.
	 *
	 * assumptions:1. Mandatory fields use UPPER CASE, non-mandatory fields use lower case.
	 *	     	   2. The error messages used in this method are declared in the jsp/jspf files that call this method. 
	 * @param {string} form The name of the address form obtained from the page containing address input fields.
	 * @param {string} prefix The value is set to shipping or billing.
	 * 
	 * @return {boolean} return true if no error was found, or the hidden field "fields" were not set in the jsp/jspf file that calls this method,
	 * return false if form could not be found, or if there was an error validating a particular field.
	 */

	validateAddressForm: function(form,prefix){
		reWhiteSpace = new RegExp(/^\s+$/);
		var addrErrors = new Object();
		if(prefix == null){prefix = ""};
		if(prefix){this.setStateDivName(prefix + "stateDiv")};
		if(form != null){
			var fields="";
			if(form["AddressForm_FieldsOrderByLocale"] != null && form["AddressForm_FieldsOrderByLocale"].value != null && form["AddressForm_FieldsOrderByLocale"].value != ""){
				fields = form["AddressForm_FieldsOrderByLocale"].value.split(",");
			}
			else if(document.getElementById("AddressForm_FieldsOrderByLocale").value!= null && document.getElementById("AddressForm_FieldsOrderByLocale").value!= ""){
				fields=document.getElementById("AddressForm_FieldsOrderByLocale").value.split(",");
			}
			var nickName = prefix + "nickName";
			var lastName = prefix + "lastName";
			var firstName = prefix + "firstName";
			var address1 = prefix + "address1";
			var address2 = prefix + "address2";
			var city = prefix + "city";
			var state = prefix + "state";
			var country = prefix + "country";
			var zipCode = prefix + "zipCode";
			var email1 = prefix + "email1";
			var phone1 = prefix + "phone1";
			var phone2 = prefix + "phone2";
			var personTitle = prefix + "personTitle";
			for(var i=0; i<fields.length; i++){
				var field = fields[i];
				if(field == "NICK_NAME" || field == "nick_name"){
					form[nickName].value = trim(form[nickName].value);
					if(field == "NICK_NAME" && (form[nickName].value == "" || reWhiteSpace.test(form[nickName].value))){
						//MessageHelper.formErrorHandleClient(form[nickName].id, MessageHelper.messages["ERROR_NicknameEmpty"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_NicknameEmpty"]]= form.nickName.id;
					}
					else if(!MessageHelper.isValidUTF8length(form[nickName].value, 254)){ 
						//MessageHelper.formErrorHandleClient(form.nickName.id, MessageHelper.messages["ERROR_NicknameTooLong"]); 
						//return false;
						addrErrors[MessageHelper.messages["ERROR_NicknameTooLong"]]= form.nickName.id;
					}
					else if(form[nickName] != null && form[nickName].value.length < 3) {
						addrErrors[MessageHelper.messages["ERR_MINIMUMLENGTH_NICKNAME"]]= form.nickName.id;
					}
				}else if(field == "LAST_NAME" || field == "last_name"){
					form[lastName].value = trim(form[lastName].value);
					if(field == "LAST_NAME" && (form[lastName].value == "" || reWhiteSpace.test(form[lastName].value))){ 
						//MessageHelper.formErrorHandleClient(form[lastName].id, MessageHelper.messages["ERROR_LastNameEmpty"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_LastNameEmpty"]]=form.lastName.id;
					}
					else if(!MessageHelper.isValidUTF8length(form[lastName].value, 128)){ 
						//MessageHelper.formErrorHandleClient(form[lastName].id, MessageHelper.messages["ERROR_LastNameTooLong"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_LastNameTooLong"]]=form.lastName.id;
					}
					else if(form[lastName].value.length < 2) {
						addrErrors[MessageHelper.messages["TGG_LAST_NAME_MIN_LENGTH_ERROR"]]=form.lastName.id;
					}
					
				}else if(field == "FIRST_NAME" || field == "first_name"){
					var flag = 0;
					form[firstName].value = trim(form[firstName].value);
					if(field == "FIRST_NAME" && (form[firstName].value == "" || reWhiteSpace.test(form[firstName].value))){ 
						//MessageHelper.formErrorHandleClient(form[firstName].id, MessageHelper.messages["ERROR_FirstNameEmpty"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_FirstNameEmpty"]]=form.firstName.id;
						flag=1;
					}
					else if(!MessageHelper.isValidUTF8length(form[firstName].value, 128)){ 
						//MessageHelper.formErrorHandleClient(form[firstName].id, MessageHelper.messages["ERROR_FirstNameTooLong"]); 
						//return false;
						addrErrors[MessageHelper.messages["ERROR_FirstNameTooLong"]]=form.firstName.id;
						flag=1;
					}
					if(flag==0){
						var dispName = form[firstName].value;
						form["displayName"].value = dispName.substr(0, 1).toUpperCase()+dispName.substr(1);
					}
				}else if(field == "ADDRESS" || field == "address"){
					form[address1].value = trim(form[address1].value);
					form[address2].value = trim(form[address2].value);
					if(field == "ADDRESS" && ((form[address1].value == "" || reWhiteSpace.test(form[address1].value)) && (form[address2].value=="" || reWhiteSpace.test(form[address2].value)))){ 
						//MessageHelper.formErrorHandleClient(form[address1].id, MessageHelper.messages["ERROR_AddressEmpty"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_AddressEmpty"]]=form.address1.id;
					}
					else if(!MessageHelper.isValidUTF8length(form[address1].value, 100)){ 
						//MessageHelper.formErrorHandleClient(form[address1].id, MessageHelper.messages["ERROR_AddressTooLong"]); 
						//return false;
						addrErrors[MessageHelper.messages["ERROR_AddressTooLong"]]=form.address1.id;
					}
					else if(!MessageHelper.isValidUTF8length(form[address2].value, 100)){ 
						//MessageHelper.formErrorHandleClient(form[address2].id, MessageHelper.messages["ERROR_AddressTooLong"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_AddressTooLong"]]=form.address2.id;
					}
				}else if(field == "CITY" || field == "city"){
					form[city].value = trim(form[city].value);
					if(field == "CITY" && (form[city].value == "" || reWhiteSpace.test(form[city].value))){ 
						//MessageHelper.formErrorHandleClient(form[city].id, MessageHelper.messages["ERROR_CityEmpty"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_CityEmpty"]]=form.city.id;
					}
					else if(!MessageHelper.isValidUTF8length(form[city].value, 128)){
						addrErrors[MessageHelper.messages["ERROR_CityTooLong"]]=form.city.id;
						//MessageHelper.formErrorHandleClient(form[city].id, MessageHelper.messages["ERROR_CityTooLong"]);
						//return false;
					}
				}else if(field == "STATE/PROVINCE" || field == "state/province"){
					var state = form[state];
					if(state == null || state == ""){
						state = document.getElementById(this.stateDivName).firstChild;
					}
					state.value = trim(state.value);
					if(field == "STATE/PROVINCE" && (state.value == null || state.value == "" || reWhiteSpace.test(state.value))){
						MessageHelper.formErrorHandleClient(state.id, MessageHelper.messages["ERROR_StateEmpty"]);
						return false;
					}
					if(!MessageHelper.isValidUTF8length(state.value, 128)){
						MessageHelper.formErrorHandleClient(state.id, MessageHelper.messages["ERROR_StateTooLong"]);
						return false;
					}
				}else if(field == "COUNTRY/REGION" || field == "country/region"){
					form[country].value = trim(form[country].value);
					if(field == "COUNTRY/REGION" && (form[country].value == "" || reWhiteSpace.test(form[country].value))){ 
						MessageHelper.formErrorHandleClient(form[country].id, MessageHelper.messages["ERROR_CountryEmpty"]);
						return false;
					}
					if(!MessageHelper.isValidUTF8length(form[country].value, 128)){ 
						MessageHelper.formErrorHandleClient(form[country].id, MessageHelper.messages["ERROR_CountryTooLong"]);
						return false;
					}
				}else if(field == "ZIP" || field == "zip"){
					form[zipCode].value = trim(form[zipCode].value);
					if(field == "ZIP" && (form[zipCode].value=="" || reWhiteSpace.test(form[zipCode].value))){ 
						//MessageHelper.formErrorHandleClient(form[zipCode].id, MessageHelper.messages["ERROR_ZipCodeEmpty"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_ZipCodeEmpty"]]=form.zipCode.id;
					}
					else if(!MessageHelper.isValidUTF8length(form[zipCode].value, 40)){ 
						//MessageHelper.formErrorHandleClient(form[zipCode].id, MessageHelper.messages["ERROR_ZipCodeTooLong"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_ZipCodeTooLong"]]=form.zipCode.id;
					}
					else if(!MessageHelper.IsNumeric(form[zipCode].value, false)){
						addrErrors[MessageHelper.messages["TGG_POSTCODE_INVALID"]]=form.zipCode.id;
					}
				}else if(field == "EMAIL1" || field == "email1"){
					form[email1].value = trim(form[email1].value);
					if(form[email1].value!=null || form[email1].value!=""){
						form[email1].value = form[email1].value.toLowerCase();
					}
					if(field == "EMAIL1" && (form[email1].value == "" || reWhiteSpace.test(form[email1].value))){
						//MessageHelper.formErrorHandleClient(form[email1].id, MessageHelper.messages["ERROR_EmailEmpty"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_EmailEmpty"]]=form.email1.id;
					}
					else if(!MessageHelper.isValidUTF8length(form[email1].value, 256)){ 
						//MessageHelper.formErrorHandleClient(form[email1].id, MessageHelper.messages["ERROR_EmailTooLong"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_EmailTooLong"]]=form.email1.id;
					}
					else if(!MessageHelper.isValidEmail(form[email1].value)){
						//MessageHelper.formErrorHandleClient(form[email1].id, MessageHelper.messages["ERROR_INVALIDEMAILFORMAT"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_INVALIDEMAILFORMAT"]]=form.email1.id;
					}
				}else if(field == "PHONE1" || field == "phone1"){
					form[phone1].value = trim(form[phone1].value);
					if(field == "PHONE1" && (form[phone1].value == "" || reWhiteSpace.test(form[phone1].value))){
						MessageHelper.formErrorHandleClient(form[phone1].id, MessageHelper.messages["ERROR_PhonenumberEmpty"]);
						return false;
					}
					else if(!MessageHelper.isValidUTF8length(form[phone1].value, 32)){ 
						MessageHelper.formErrorHandleClient(form[phone1].id, MessageHelper.messages["ERROR_PhoneTooLong"]);
						return false;
					}
					else if(!MessageHelper.IsValidPhone(form[phone1].value)){
						MessageHelper.formErrorHandleClient(form[phone1].id, MessageHelper.messages["ERROR_INVALIDPHONE"]);
						return false;
					}
				}else if(field == "person_title" || field == "PERSON_TITLE"){
					form[personTitle].value = trim(form[personTitle].value);
					if(field == "PERSON_TITLE" && (form[personTitle].value == "" || reWhiteSpace.test(form[personTitle].value))){ 
						//MessageHelper.formErrorHandleClient(form[personTitle].id, MessageHelper.messages["ERROR_titleEmpty"]);
						//return false;
						addrErrors[MessageHelper.messages["ERROR_titleEmpty"]]=form.personTitle.id;
					}
				}else{
					console.debug("error: mandatory field name " + mandatoryField + " is not recognized.");
					return false;
				}
			}
			if (form[address1].value == "" && form[address2].value != "") {
		
			form[address1].value = form[address2].value;
			form[address2].value = "";
			}
			return addrErrors;  
		}
		return addrErrors; 
	},
	
	/**
	 * This function saves the address entry form when a registered customer wants to edit/add a new address 
	 * during checkout from  his/her shopping cart.
	 * @param {string} The id of the service that was invoked, e.g. AjaxUpdateAddressForPerson, AjaxAddAddressForPerson, etc.
	 * @param {string} The name of the form containing address information.
	 */
	
	saveShopCartAddress: function(serviceId, formName){
		var form = document.forms[formName];
		if(this.validateAddressForm(form)){
			this.saveAddress(serviceId, formName);
		}
	},
	
	
	/*
	 * This function saves the address entry form on an unregistered user's checkout page.
	 * @param {string} formName1 The name of the billing address form.
	 * @param {string} formName2 The name of the shipping address form.
	 * @param {string} stateDivName1 The name of the state field in the billing address form.
	 * @param {string} stateDivName2 The name of the state field in the shipping address form.
	 */
	
	saveUnregisteredCheckoutAddress: function(formName1, formName2, stateDivName1, stateDivName2)
	{
		var form1 = document.forms[formName1];
		
		this.setStateDivName(stateDivName1);
		/*Validate form input fields */
		if(this.validateAddressForm(form1))
		{
			var sameaddress = document.getElementById("SameShippingAndBillingAddress");
			if (!sameaddress.checked)
			{
				var form2 = document.forms[formName2];
				this.setStateDivName(stateDivName2);
				/*Validate form input fields */
				if(this.validateAddressForm(form2))
				{
					this.saveAddress('AddBillingAddress', 'billingAddressCreateEditFormDiv_1');
				}
			}
			else
			{
				form1.addressType.value='SB';
				this.saveAddress('AddShippingAddress', 'billingAddressCreateEditFormDiv_1');
			}
		}
	},
	
	/**
	 * This function saves an address entry form to the associated service.
	 * @param {string} serviceId The id of the service that was invoked, e.g. AjaxUpdateAddressForPerson, AjaxAddAddressForPerson, etc. 
	 * @param {string} formName The name of the form containing address information.
	 */
	
	saveAddress:function(serviceId, formName) {
		var form = document.forms[formName];
		if (form.address1.value == "" && form.address2.value != "") {
			form.address1.value = form.address2.value;
			form.address2.value = "";
		}
	 	var addressService = wc.service.getServiceById(serviceId);
	 	addressService.formId = formName;
		/* For Handling multiple clicks */
		//if(!submitRequest()){
			//return;
		//}   	 	
	 	cursor_wait();
	 	wc.service.invoke(serviceId);
	}
}

