﻿/* Provides functionality for address lookup form */

window.addEvent('domready', function() {

    addressForm.init();
    
});

function hide(el)
{
    if($(el))
    	$(el).style.display = 'none';
}

function show(el)
{
    if($(el))
	    $(el).style.display = '';
}

function isHidden(el)
{
    if($(el).style.display == 'none')
        return true;
        
    return false;
}

var addressForm = {

    addressCollection: null,

    init: function() {
        if ($('selectAddress')) {
            addressForm.UI.setupForm();

            $('selectAddress').addEvent('change', addressForm.events.selectAddressOptionChange);
        }
    },

    /* method called when find address button clicked */
    search: function() {
        if ($$('input.PostcodeSearch')[0].value.length < 5) {
            alert("Please supply a full and valid UK postcode");
        }
        else {
            // transfer postcode from postcodesearch input to postcode input
            addressForm.ajax.search($$('input.PostcodeSearch')[0].value);
        }
    },

    searchAgainFromForm: function() {
        if ($$('input.Postcode')[0].value != "")
            $$('input.PostcodeSearch')[0].value = $$('input.Postcode')[0].value;

        this.searchAgain();
    },

    searchAgain: function() {
        $('btnSearch').disabled = false;
        $('btnSearch').value = "Find Address";

        show('tb_lookup');
        hide('tb_selectaddress');
        hide('tb_form');

        if (typeof canResize == 'function') {
            if(canResize) {
            
                try
	            {
            	    parent.setIframeHeight('ifEnquiry');  
	            }
	            catch(err)
	            {}
	        }
        }
    },

    /* method called from containing form */
    validate: function() {
        if (isHidden('tb_form')) {
            if (isHidden('tb_lookup')) {
                if ($('selectAddress').value == "") {
                    alert("You must select your address from the address dropdown box, or complete your address manually by selecting the 'Enter Address Manually' option.");
                    return false;
                }
                else {
                    // populate address from select box
                    this.resolveAddressFields();
                    return true;
                }
            }
            else {
                alert("Please supply a full and valid UK postcode and click 'Find address'");
                return false;
            }
        }
        else {
            // address form completed manually therefore validate fields
            return this.validateAddressFields();
        }
    },

    validateAddressFields: function() {
        bHasError = false;
        errorString = "";

        if ($$('input.Address1')[0].value == "") {
            errorString += "Please supply your address...\r\n";
            bHasError = true;
        }

        if ($$('input.Town')[0].value == "") {
            errorString += "Please supply your town...\r\n";
            bHasError = true;
        }

        if (bHasError)
            alert(errorString);

        return !bHasError;
    },

    /* method populates address fields from selected address item */
    resolveAddressFields: function() {
        var addressId = $('selectAddress').value;
        var addressItem = this.addressCollection[addressId];

        var Organisation = addressForm.data.getAddressItem(addressItem, "Organisation");
        var Addr1 = addressForm.data.getAddressItem(addressItem, "Addr1");
        var Addr2 = addressForm.data.getAddressItem(addressItem, "Addr2");
        var Town = addressForm.data.getAddressItem(addressItem, "Town");
        var County = addressForm.data.getAddressItem(addressItem, "County");

        this.clearAddressFields();

        if (Organisation != "") {
            if (Addr2 == "") {
                $$('input.Address1')[0].value = Organisation;
                $$('input.Address2')[0].value = Addr1;
            }
            else {
                $$('input.Address1')[0].value = Organisation;
                $$('input.Address1')[0].value += ", " + Addr1;
                $$('input.Address2')[0].value = Addr2;
            }
        }
        else {
            $$('input.Address1')[0].value = Addr1;
            $$('input.Address2')[0].value = Addr2;
        }

        $$('input.Town')[0].value = Town;
        $$('input.County')[0].value = County;

        $$('input.Postcode')[0].value = $$('input.PostcodeSearch')[0].value;
    },

    /* method clears address fields */
    clearAddressFields: function() {
        $$('input.Address1')[0].value = "";
        $$('input.Address2')[0].value = "";
        $$('input.Town')[0].value = "";
        $$('input.County')[0].value = "";
        $$('input.Postcode')[0].value = "";
    }
}

addressForm.events = {

    selectAddressOptionChange: function()
    {
        if($('selectAddress').value == -1)
        {
            $$('input.Postcode')[0].value = $$('input.PostcodeSearch')[0].value;
            addressForm.UI.showForm();
        }    
    }
}

addressForm.UI = {

    setupForm: function()
    {
        // html is configured initially for users with js disabled
        // therefore show and hide necessary elements
        $('btnSearch').disabled = false;

        hide('tb_form');
        show('btnSearchAgainFromForm');
        show('tb_lookup');
        
        if (typeof canResize == 'function') {
            if(canResize) {
            
                try
	            {
            	    parent.setIframeHeight('ifEnquiry');  
	            }
	            catch(err)
	            {}
	        }
        }
    },
    
    showForm: function()
    {
        hide('tb_lookup');
        hide('tb_selectaddress');
        show('tb_form');
        
        if(canResize != undefined && canResize)
        {
            try
	    {
            	parent.setIframeHeight('ifEnquiry');  
	    }
	    catch(err)
	    {}
        }
    },
    
    showAddressSelect: function()
    {
        hide('tb_lookup');
        show('tb_selectaddress');   
        
        if(canResize != undefined && canResize)
        {
            try
	    {
            	parent.setIframeHeight('ifEnquiry');  
	    }
	    catch(err)
	    {}
        }
    },
    
    showSearching: function()
    {
        $('btnSearch').disabled = true;
        $('btnSearch').value = "Searching";  
            
        if(canResize != undefined && canResize)
        {
            try
	    {
            	parent.setIframeHeight('ifEnquiry');  
	    }
	    catch(err)
	    {}
        }
    },    
    
    lookupFailure: function(result)
    {
        alert("Sorry, there has been a problem searching for your address.\nPlease complete your address manually.");
        
        show('tb_form');
        hide('tb_lookup');  
        
        if(canResize != undefined && canResize)
        {
            try
	    {
            	parent.setIframeHeight('ifEnquiry');  
	    }
	    catch(err)
	    {}
        }
    }
}

addressForm.data = {

    addOptionToSelect: function(select, value, text)
    {
        var option = new Element('option');
		option.setProperty('value', value).appendText(text);
		select.adopt(option);
    },
    
    buildAddress: function(el)
    {
        address = "";
	
	    addressForm.data.appendAddressItem(el, "Organisation");
	    addressForm.data.appendAddressItem(el, "Addr1");
	    addressForm.data.appendAddressItem(el, "Addr2");
	    addressForm.data.appendAddressItem(el, "Town");
	    addressForm.data.appendAddressItem(el, "County");
	    
        return address;
    },
    
    appendAddressItem: function(addrnode, nodename)
    {
        var addressItem = addressForm.data.getAddressItem(addrnode, nodename);
        
        if(addressItem != "")
            address += (address != "" ? ", " : "") + addressItem;
    },
    
    getAddressItem: function(addrnode, nodename) 
    {
	    if(addrnode.getElementsByTagName(nodename)) 
	    {
		    var el = addrnode.getElementsByTagName(nodename);
    		
		    if(el.item(0).childNodes.item(0)) 
			    return el.item(0).childNodes.item(0).data;
	    }
    	
	    return "";
    }  
}

addressForm.ajax = {

    lookupservice: "/xmladdresses.aspx",
     
    search: function(postcode)
    {
        var lookupUrl = this.lookupservice + "?pc=" + postcode;
        
        var ajaxAddressSearch = new Ajax(lookupUrl, {
                                                method: 'get', 
                                                onSuccess: addressForm.ajax.lookupResult,
                                                onFailure: addressForm.UI.lookupFailure
                                            });
        ajaxAddressSearch.request();
        addressForm.UI.showSearching(); 
    },
    
    lookupResult: function(result, responseXML)
    {        
        addressForm.addressCollection = responseXML.getElementsByTagName("Address");
        
        $('selectAddress').empty();
        
        addressForm.data.addOptionToSelect($('selectAddress'), "", "Select your address..."); 
        
        if(addressForm.addressCollection.length != 0)
        {   
            for(var i = 0; i < addressForm.addressCollection.length; i++)
            {
                addressForm.data.addOptionToSelect($('selectAddress'), i, addressForm.data.buildAddress(addressForm.addressCollection[i]));
            }   
            
            addressForm.data.addOptionToSelect($('selectAddress'), -1, "<< Enter address manually >>");    
            
            addressForm.UI.showAddressSelect();          
        }
        else
        {
            alert("Sorry, no addresses were found for the postcode you supplied.\nPlease try your search again, or complete your address manually."); 
            
            // transfer postcode from postcodesearch input to postcode input
            $$('input.Postcode')[0].value = $$('input.PostcodeSearch')[0].value;
            
            addressForm.UI.showForm();
        }
        
    }  
  
}

