﻿var simpleSearchDialog;
var addressResponse;

document.observe('dom:loaded', function() 
{
    setPreviousCodeSetToFalseByDefault();
    setupAddressControlsBasedOnCountry();
    setUpLookUpAddressViaAjax();
    setUpCountryChangeEvent();
    simpleSearchDialog = new Dialog({dimensions: {height: 'auto', width: '600px'}, display:$('searchResults')});
});

function setPreviousCodeSetToFalseByDefault()
{
	if($('Previous_PostCode_Set'))
		$('Previous_PostCode_Set').value = "";
}

function setupAddressControlsOnCountryChange()
{
    clearAllErrors();
    clearAddressControls();
    setupAddressControlsBasedOnCountry();
    if(isStateSupportingCountry()) 
    {
        populateStates();
    }
}


function setupAddressControlsBasedOnCountry()
{
    if(isPostCodeSupported())
    {
        setupAddressControlsForPostCodeSupportingContry();
    }
    else 
    {
        setupAddressControlsForNonPostCodeSupportingContry();       
    }
    if(isStateSupportingCountry())
    {
        setupAddressControlsForStateSupportingCountry();
    }
    else 
    {
        setupAddressControlsForNonStateSupportingCountry(); 
    }
}

function setupAddressControlsForNonPostCodeSupportingContry()
{
    hideSearchButton();
    showAddressControls();
    if($("isDefaultDeliveryAddressDiv")) {
		$("isDefaultDeliveryAddressDiv").hide();
		$("RegisterCustomer_isDefaultDeliveryAddress").checked = false;
	}
    $(POST_CODE_LOOKUP_LABEL).update(POSTCODE_CUSTOM_LABEL_TEXT);    
}

function setupAddressControlsForPostCodeSupportingContry()
{
    showSearchButton();
    $(POST_CODE_LOOKUP_LABEL).update(POSTCODE_CUSTOM_SEARCH_LABEL_TEXT);
    $("isDefaultDeliveryAddressDiv") && $("isDefaultDeliveryAddressDiv").show();
    hideAddressControlsIfAddressLinesAreBlankForPostCodeSupportingCountries();
}

function setupAddressControlsForStateSupportingCountry()
{
    $(ADDRESS_LINE4_LABEL).update(CITY_CUSTOM_LABEL_TEXT);
    $(ADDRESS_LINE5_LABEL).hide();
    $(STATE_CONTROLS).show();
}
function setupAddressControlsForNonStateSupportingCountry()
{
    $(ADDRESS_LINE4_LABEL).update(ADDRESS4_CUSTOM_LABEL_TEXT);
    $(ADDRESS_LINE5_LABEL).show();
    $(STATE_CONTROLS).hide();
}

function populateStates() {
    $(STATE).length = 0;
    $(STATE).clear();
    $(STATE).options.add(new Option("Please Select", ""));
    var statesList = LIST_OF_STATES_FOR_COUNTRY[$(ADDRESS_COUNTRY_CODE).value];
    for(var i=0; i < statesList.length; i++) {
        $(STATE).options.add(new Option(statesList[i].Name, statesList[i].Name));
    }
}


function isStateSupportingCountry()
{
    return (LIST_OF_STATES_FOR_COUNTRY[$(ADDRESS_COUNTRY_CODE).value] != null) ;
}

function showSearchButton() 
{
    $("lookup").show();
}

function hideSearchButton() 
{
    $("lookup").hide();    
}


function setUpLookUpAddressViaAjax()
{
    Event.observe($(ADDRESS_POST_CODE_BUTTON),'click', function(){		
					   makeAjaxCallToGetAddress($(ADDRESS_POST_CODE).value, $(ADDRESS_COUNTRY_CODE).value);
                   });
}

function setUpCountryChangeEvent() 
{
    Event.observe($(ADDRESS_COUNTRY_CODE),'change', function() {
                    setupAddressControlsOnCountryChange();
                });
}

function makeAjaxCallToGetAddress(postCode,countryCode)
{
  var url =AJAX_ADDRESS_HANDLER;
	new Ajax.Request(url , {
		method: 'get',
		parameters: { Command: LOOKUP_ADDRESS, PostCode : postCode, CountryCode : countryCode , rand: Math.random()},
		onSuccess:update
	});
}

function clearAllErrors() 
{
    for(var i=0; i< ALL_ERROR_LABELS.length; i++) {
        $(ALL_ERROR_LABELS[i]).update("");
        $(ALL_ERROR_LABELS[i]).hide();
    }
}

function handleWarning(addressResponse)
{
	populatePostCodeError(addressResponse.Warning)
    $('PrevPostCode').value = $('PostCode').value;
	showAddressControls();
}

function update(transport)
{
    
    addressResponse = eval('('+transport.responseText+')');
    clearAllErrors();
    //If Error occurred while doing the address search then, Clear address controls, populate error and return.
    if(addressResponse.Error != null) 
    {
        clearAndHideAddressControls();
        populatePostCodeError(addressResponse.Error);
        return;
    }
    
    if(addressResponse.Addresses.length == 1) 
    {
	if(addressResponse.Warning != null)
	{
        handleWarning(addressResponse);
		return;
	}
     updateAddressAndShowAddressControls(addressResponse.Addresses[0]);  
        return;
    }
    var html = "<div id='AddressSearchOverlay'><h1>"+ADDRESS_SEARCH_TITLE_LABEL_TEXT+"</h1><h2>"+SELECT_ADDRESS_LABEL_TEXT+"</h2><div style='overflow: auto; height: 200px; padding-right: 20px;' class='wrapper'> <ul class='AddressList'>";
    var i=0;
    //Hiding the address controls if they are empty
    hideAddressControlsIfAddressLinesAreBlankForPostCodeSupportingCountries();
    
    addressResponse.Addresses.each(function(address)
    {
            var id = "lookedUpAddress_" + i;
            html += "<li><a href='javascript:updateAddressAndClose(addressResponse.Addresses["  + i + "])' id='" + id + "' >"  + addComaToAddressLineIfRequired(address.Line1) 
                   + addComaToAddressLineIfRequired(address.Line2) + addComaToAddressLineIfRequired(address.Line3) + addComaToAddressLineIfRequired(address.Line4)
                   + addComaToAddressLineIfRequired(address.Line5) + address.PostCode + "</a></li>";
            i++;
    });
	
	html+="</ul>";
	html = createButtonOnOverlay(html);
	html+="</div></div>"
    
    updateAndShowResults(html);
    simpleSearchDialog.show();
}

function createButtonOnOverlay(html)
{
  	html += "<div class='sub'><span class='button_minor'><input type='button' value='Enter address manually' onclick='hideDialogAndShowAddressControls();return true;'/></span></div>";
  	return html;
}

function hideDialogAndShowAddressControls()
{
	simpleSearchDialog._hideDialog();
	showAddressControls();
}

function updateAndShowResults(html) 
{
    $("searchResults").show();
    $("searchResults").update(html);
}

function addComaToAddressLineIfRequired(addressLine)
{
	if(isAddressLineEmpty(addressLine)) return "";
	
    if(isTheLastCharAComma(addressLine))	
        return addressLine;
    return addressLine + ", "; 
}
function getAddressLineForDisplay(addressLine) 
{
	if(isAddressLineEmpty(addressLine)) return "";
	return addressLine;
}
function isAddressLineEmpty(addressLine)
{
    if (addressLine == null || addressLine.replace(" ", "") == "")
        return true;
	return false;
}

function isTheLastCharAComma(addressLine)
{
        var indexOfLastComma = addressLine.lastIndexOf(",");
        return indexOfLastComma == addressLine.length-1;
        
}
function updateAddressAndClose(address)
{
    updateAddressAndShowAddressControls(address);
    simpleSearchDialog._hideDialog();
}

function updateAddressAndShowAddressControls(address)
{
    updateAddress(address);
    showAddressControls();
}

function updateAddress(address) 
{
     $(ADDRESS_POST_CODE).value = address.PostCode;
     $(ADDRESS_LINE1).value = getAddressLineForDisplay(address.Line1);
     $(ADDRESS_LINE2).value = getAddressLineForDisplay(address.Line2);
     $(ADDRESS_LINE3).value = getAddressLineForDisplay(address.Line3);
     $(ADDRESS_LINE4).value = getAddressLineForDisplay(address.Line4);
     $(ADDRESS_LINE5).value = getAddressLineForDisplay(address.Line5);
}

function populatePostCodeError(error) 
{
    $(POSTCODE_ERROR_LABEL).update(error.Message);
    $(POSTCODE_ERROR_LABEL).show();
}

function clearAndHideAddressControls()
{
    clearAllErrors();
    clearAddressControls();
    hideAllAddressLines();
}

function clearAddressControls() 
{
    $(ADDRESS_LINE1).clear();
    $(ADDRESS_LINE2).clear();
    $(ADDRESS_LINE3).clear();
    $(ADDRESS_LINE4).clear();
    $(ADDRESS_LINE5).clear();
}

function hideAddressControlsIfAddressLinesAreBlankForPostCodeSupportingCountries() 
{
    if(areAllAddressLinesBlank()) 
    {
        hideAllAddressLines();
    }
}


function areAllAddressLinesBlank() 
{
    return !($(ADDRESS_LINE1).present() ||
            $(ADDRESS_LINE2).present() ||
            $(ADDRESS_LINE3).present() ||
            $(ADDRESS_LINE4).present() ||
            $(ADDRESS_LINE5).present());
}

function hideAllAddressLines() 
{
    $(ALL_ADDRESS_CONTROLS).hide();
}

function showAddressControls()
{
    $(ALL_ADDRESS_CONTROLS).show();
}

function isPostCodeSupported() {
	for(var i=0; i< POSTCODE_SUPPORTING_COUNTRIES.length; i++) {
		if(POSTCODE_SUPPORTING_COUNTRIES[i].Code == $(ADDRESS_COUNTRY_CODE).value) {
			return true;
		}
	} 
	return false;  
}

