
//var globalData;
var count = 0;
//var postcodeEle;
var maxAttempt = 0;
var noRecordError;
var selectLabel;
var maxAttemptError
var invalidPostCodeError;
var nonMainlandDeliveryChargeMsg;
var mainlandDeliveryChargeMsg;
var mainlandFreeDelivery;
var freeDeliveryMsg;
var addressCategoryId;

var addressView1;
var addressView2;
var currentView;



function handleLookup(postFix, nonMainlandDeliveryGrp, mainlandDeliveryGrp, mainlandDeliveryType)
{
    if(postFix == 1) {
    	addressView1 = new AddressView("1");
		currentView = addressView1;
    }
    else if (postFix == 2) {
    	addressView2 = new AddressView("2");
		currentView = addressView2;
    }

	currentView.clean();

	if( currentView.validatePostcode())
	{
		
	   postcodeValue = document.getElementById(currentView.postcode).value;
	   addressLookupDWRService.findAddressByPostCode(postcodeValue, nonMainlandDeliveryGrp, mainlandDeliveryGrp, mainlandDeliveryType, handleResult);
	}
}

function handleResult(data) {
	
    if (data != null && typeof data == 'object') {
	    var addressList = data.addressList;
		
		count = data.count;		
	    var length = addressList.length;
		    var dataArray = new Array(length+1);
			dataArray[0] = { name:selectLabel, id:0 };
			for(var i=1;i<dataArray.length;i++)
			{
				if(addressList[i-1].addressSplit.propertySubname != '')
				{
					var str = addressList[i-1].addressSplit.propertySubname+" "+addressList[i-1].addressSplit.propertyNumber+" "+addressList[i-1].addressSplit.propertyName+" "+addressList[i-1].addressSplit.dependentStreetName+" "+addressList[i-1].addressSplit.streetName;
					str = str.replace(/\s+/g,' ');
					dataArray[i] = { name:str.trim(), id:i };
				}
				else
				{
					var str = addressList[i-1].addressSplit.propertyNumber+" "+addressList[i-1].addressSplit.propertyName+" "+addressList[i-1].addressSplit.dependentStreetName+" "+addressList[i-1].addressSplit.streetName;
					str = str.replace(/\s+/g,' ');
					dataArray[i] = { name:str.trim(), id:i };
				}
			}
			currentView.addressList = addressList;
			currentView.deliveryCost = data.deliveryCost;
			currentView.deliveryLocation = data.deliveryLocation;

            currentView.populateDropDown(dataArray);
			currentView.render();
	}
}

function showAddressDetails(postFix) {
	var address;
    if(postFix == 1) {
		address = addressView1;
    }
    else if (postFix == 2) {
    	address = addressView2;
    }
    address.state = "EDIT_ADDRESS_DETAILS";
    address.render();
}

function populateAddressDetails(postFix) {
	var address;
    if(postFix == 1) {
		address = addressView1;
    }
    else if (postFix == 2) {
    	address = addressView2;
    }
    var i = document.getElementById(address.lookup_result_dropdown).selectedIndex;
    address.populateAddressDetails(i);
    address.render();
}


function AddressView(postfix) {
    this.postcode = "postcode_"+postfix;
	this.lookup_result_div =  "lookupResult_"+postfix;
	this.manual_address_link = "manualAddressLink_"+postfix;
	this.fullAddress = "fullAddress_"+postfix;
	this.lookup_result_dropdown = "lookupResultDropdown_"+postfix
	this.flatNumber = "flatNumber_"+postfix;
	this.houseNumber = "houseNumber_"+postfix;
	this.streetName = "streetName_"+postfix;
	this.postalTown = "postalTown_"+postfix;
	this.county = "county_"+postfix;
	this.country = "country_"+postfix;
	this.error = "postcode_"+postfix+"_error";
	this.addressList = "";
	this.deliveryCost = "";
	this.deliveryLocation = "";
	this.state = "AWAITING_POSTCODE";
	this.deliveryCostLabel = "deliveryCost_"+postfix;
}

AddressView.prototype.populateDropDown = function(list) {
	DWRUtil.removeAllOptions(currentView.lookup_result_dropdown);
	DWRUtil.addOptions(currentView.lookup_result_dropdown,list,'id','name');

	if(list.length == 1) { // this is "please select"
	 	this.state = "NO_ADDRESS_RESULTS_FOUND";
	 }
	 else if(list.length == 2) { // just a single address found
	 	this.populateAddressDetails(1);
	 	this.state = "SINGLE_ADDRESS_RESULT_FOUND";
	 }
	 else  {
	 	this.state = "AWAITING_ADDRESS_SELECTION";
	 }
}

AddressView.prototype.validatePostcode = function() {
 	removeSpacesInFormField(this.postcode);	
	var valid = false;
	if(count >= maxAttempt)
	{
		document.getElementById(this.error).innerHTML = maxAttemptError;
		document.getElementById(this.manual_address_link).className="visible";
		hideDeliveryCharge();
		if(nonMainlandDeliveryChargeMsg != null){
			document.getElementById(this.deliveryCostLabel).innerHTML = '';						
		}

		this.handleAltDeliveryAddress();
	}
	else {
		valid = isValidPostCode(document.getElementById(this.postcode).value);
		 if(!valid)
		 {			 
			document.getElementById(this.error).innerHTML = invalidPostCodeError;
			document.getElementById(this.manual_address_link).className="visible";
			hideDeliveryCharge();
			if(nonMainlandDeliveryChargeMsg != null){
				document.getElementById(this.deliveryCostLabel).innerHTML = '';						
			}
			this.handleAltDeliveryAddress();
		 }
	}

	return valid;
}



AddressView.prototype.clean = function() {
	this.state = "AWAITING_POSTCODE";
	this.render();
}

AddressView.prototype.render =function() {
   if(this.state == "AWAITING_POSTCODE") {
   		document.getElementById(this.fullAddress).className="hidden";
   		document.getElementById(this.lookup_result_div).className="hidden";
		document.getElementById(this.manual_address_link).className="hidden";


		document.getElementById(this.flatNumber).value='';
		document.getElementById(this.houseNumber).value='';
		document.getElementById(this.streetName).value='';
		document.getElementById(this.postalTown).value='';
		document.getElementById(this.county).value='';
		//document.getElementById(this.country).value='';
		document.getElementById(this.error).innerHTML='';
   }
   else if (this.state == "AWAITING_ADDRESS_SELECTION") {
   	    document.getElementById(this.fullAddress).className="hidden";
   		document.getElementById(this.lookup_result_div).className="visible";
		document.getElementById(this.manual_address_link).className="visible";
		this.handleDeliveryCharge();
   }
   else if(this.state == "NO_ADDRESS_RESULTS_FOUND") {
   		document.getElementById(this.fullAddress).className="hidden";
   		document.getElementById(this.lookup_result_div).className="hidden";
		document.getElementById(this.manual_address_link).className="visible";
		document.getElementById(this.error).innerHTML= noRecordError;
		this.handleDeliveryCharge();
   }
   else if(this.state == "SINGLE_ADDRESS_RESULT_FOUND") {
   		document.getElementById(this.fullAddress).className="visible";
   		document.getElementById(this.lookup_result_div).className="hidden";
		document.getElementById(this.manual_address_link).className="hidden";
   }
   else if (this.state == "EDIT_ADDRESS_DETAILS") {
 		document.getElementById(this.fullAddress).className="visible";
 		document.getElementById(this.manual_address_link).className="hidden";
   }
}
AddressView.prototype.hide = function() {
	document.getElementById(this.lookup_result_div).className="hidden";
    document.getElementById(this.fullAddress).className="hidden";
    document.getElementById(this.manual_address_link).className="hidden";
}

AddressView.prototype.show = function() {
	document.getElementById(this.lookup_result_div).className="visible";
    document.getElementById(this.fullAddress).className="visible";
    document.getElementById(this.manual_address_link).className="visible";
}

AddressView.prototype.populateAddressDetails = function(index) {

        this.state = "EDIT_ADDRESS_DETAILS";

        if (index == 0) {
        	return;
        }

		if(this.addressList[index-1].addressSplit.dependentStreetName != '')
		{
			document.getElementById(this.streetName).value = this.addressList[index-1].addressSplit.dependentStreetName+", "+this.addressList[index-1].addressSplit.streetName;
		}
		else
		{
			document.getElementById(this.streetName).value = this.addressList[index-1].addressSplit.streetName;
		}
		if(this.addressList[index-1].addressSplit.propertyName != '')
		{
			document.getElementById(this.houseNumber).value = this.addressList[index-1].addressSplit.propertyName + " " + this.addressList[index-1].addressSplit.propertyNumber;
		}
		else
		{
			document.getElementById(this.houseNumber).value = this.addressList[index-1].addressSplit.propertyNumber;
		}

		if(this.addressList[index-1].addressSplit.propertySubname != '')
		{
			document.getElementById(this.flatNumber).value = this.addressList[index-1].addressSplit.propertySubname;
		}
		else
		{
			document.getElementById(this.flatNumber).value = '';
		}

		document.getElementById(this.postalTown).value = this.addressList[index-1].postalTown;
		document.getElementById(this.county).value = this.addressList[index-1].county;
		document.getElementById(this.postcode+'_error').innerHTML = '';
		this.handleDeliveryCharge();
}

AddressView.prototype.handleDeliveryCharge = function (){

	
	if(this.deliveryCost != null)
		{
		
			if(this.deliveryCost == "-99"){
				document.getElementById(this.deliveryCostLabel).className="visible";
				document.getElementById(this.deliveryCostLabel).innerHTML = mainlandFreeDelivery;
				this.handleAltDeliveryAddress();				
				this.hideWhenOptionIsCollectFromStore();
				return;
			}
			if(this.deliveryCostLabel == "deliveryCost_1"){
				document.getElementById("deliveryCost_2").className="hidden";
			}
			if(this.deliveryCostLabel == "deliveryCost_2"){
				document.getElementById("deliveryCost_1").className="hidden";
			}

			document.getElementById(this.deliveryCostLabel).className="visible";

			if(this.deliveryLocation != null){
				document.getElementById(this.deliveryCostLabel).innerHTML = nonMainlandDeliveryChargeMsg + " " + this.deliveryLocation + ": " + this.deliveryCost;
			}
			else {
				if(this.deliveryCost == "&pound;0"){
					document.getElementById(this.deliveryCostLabel).innerHTML = mainlandDeliveryChargeMsg + ": " + freeDeliveryMsg;
				}
				else{
					document.getElementById(this.deliveryCostLabel).innerHTML = mainlandDeliveryChargeMsg + ": " + this.deliveryCost;			
				}
			}
			this.handleAltDeliveryAddress();
			this.hideWhenOptionIsCollectFromStore();
			
			
		}
		else
		{			
			hideDeliveryCharge();
			if(nonMainlandDeliveryChargeMsg != null){
				this.handleAltDeliveryAddress();
				document.getElementById(this.deliveryCostLabel).innerHTML = '';						
			}
		}
}

function hideDeliveryCharge()
{
	if(mainlandDeliveryChargeMsg != null || nonMainlandDeliveryChargeMsg != null){
		document.getElementById("deliveryCost_1").className="hidden";
		document.getElementById("deliveryCost_2").className="hidden";
	}
}

AddressView.prototype.handleAltDeliveryAddress = function (){
	
	if(this.deliveryCostLabel == null || document.getElementById("deliveryAddress.addressCategoryId") == null)
	{
	      return;
	}

	if(this.deliveryCostLabel == "deliveryCost_1" && document.getElementById("deliveryAddress.addressCategoryId").value == 2){

		document.getElementById("deliveryCost_1").className="hidden";
		document.getElementById("deliveryCost_2").className="visible";
	}
}

AddressView.prototype.hideWhenOptionIsCollectFromStore = function (){

	if(document.getElementById("deliveryAddress.addressCategoryId").value == 1){
		document.getElementById("deliveryCost_1").className="hidden";
		document.getElementById("deliveryCost_2").className="hidden";
	}
}

function isValidPostCode(postcode) {
	var re = /^[A-Z,a-z]{1,2}[0-9][0-9A-Za-z]{0,1} {0,1}[0-9][ABDEFGHJLMNPQRSTUWXYZabdefghjlmnpqrstuwxyz]{2}$/;
	return re.test(postcode);
}

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}

function objectEval(text)
 {

	 // eval() breaks when we use it to get an object using the { a:42, b:'x' }
	 // syntax because it thinks that { and } surround a block and not an object
	// So we wrap it in an array and extract the first element to get around
	 // this.
	 // This code is only needed for interpreting the parameter input fields,
	 // so you can ignore this for normal use.
	 // The regex = [start of line][whitespace]{[stuff]}[whitespace][end of line]
	 text = text.replace(/\n/g, ' ');
	 text = text.replace(/\r/g, ' ');
	 if (text.match(/^\s*\{.*\}\s*$/))
	 {
		text = '[' + text + '][0]';
	 }
	 return eval(text);
 }
