
///
/// BestDeal namespace
///
Type.registerNamespace('BestDeal');

///
/// BestDeal.UI namespace
///
Type.registerNamespace('BestDeal.UI');

///
/// BestDeal.UI.PostCodeFinderExtender control
///
BestDeal.UI.PostCodeFinderExtender = function(element)
{
    BestDeal.UI.PostCodeFinderExtender.initializeBase(this, [element]);
    
    this._providerUrl = null;    
    this._lookupPostCodeElementId = null;
    this._selectAddressElementId = null;
    this._line1ElementId = null;
    this._line2ElementId = null;
    this._line3ElementId = null;
    this._townElementId = null;
    this._countyElementId = null;
    this._postCodeElementId = null;
    this._clientOnLookupAddress = null;
    this._clientOnFetchAddress = null;
}

BestDeal.UI.PostCodeFinderExtender.prototype = {

    ///
    /// Initialize
    ///
    initialize : function()
    {
        BestDeal.UI.PostCodeFinderExtender.callBaseMethod(this, 'initialize');
        
        $addHandler(this.get_element(), 'click', Function.createDelegate(this, this._onLookup));
        $addHandler($get(this._selectAddressElementId), 'change', Function.createDelegate(this, this._onFetch));
    },
    
    ///
    /// Dispose
    ///
    dispose : function()
    {
        $clearHandlers(this.get_element());
        $clearHandlers($get(this._selectAddressElementId));
        
        BestDeal.UI.PostCodeFinderExtender.callBaseMethod(this, 'dispose');
    },
    
    ///
    /// URL handling
    ///
    _appendUrl : function(url, append)
    {
        var last_ch = url[url.length - 1];
        if(last_ch == '?' || last_ch == '&')
            return url + append;
        else
            if(url.indexOf('?') == -1)
                return url + '?' + append;
            else
                return url + '&' + append;
    },
    
    _getLookupUrl : function(postCode)
    {
        return this._appendUrl(this._providerUrl, 'op=lookup&' + 'postCode=' + postCode);
    },
    
    _getFetchUrl : function(id)
    {
        return this._appendUrl(this._providerUrl, 'op=fetch&id=' + id);
    },
    
    ///
    /// Helper methods
    ///
    addSelectOption : function(value, text)
    {    
        // add new option
        var option = document.createElement('OPTION');
        option.value = value;
        option.text = text;
        $get(this._selectAddressElementId).options.add(option);	        
    },
    
    clearSelect : function(select)
    {
        if(typeof(select.options.remove) == 'undefined')
        {
	        for(var i = select.options.length - 1; i >= 0; i--)
    	        select.options[i] = null;
        }
	    else
	    {
	        for(var i = select.options.length - 1; i >= 0; i--)
		        select.options.remove(i);
	    }	
	},
    
    ///
    /// Lookup event
    ///
    _onLookup : function(e)
    {
        var element = this.get_element();
        if(element && !element.disabled) {
        
            if(this._clientOnLookupAddress)
                this._clientOnLookupAddress();
                
            this.clearSelect($get(this._selectAddressElementId));
            this.addSelectOption('', 'Please Wait... Loading...');
            
            var postCode = $get(this._lookupPostCodeElementId).value;
        
            var wr = new Sys.Net.WebRequest();
            wr.set_url(this._getLookupUrl(postCode));
            wr.set_httpVerb('GET');
            wr.set_timeout(20000);
            wr.set_userContext(this);
            wr.add_completed(function(executor, e) { var obj = executor.get_webRequest().get_userContext(); obj._onLookupComplete.call(obj, executor, e) });
            wr.invoke();
        }
    },
    
    ///
    /// Lookup complete delegate
    ///
    _onLookupComplete : function(executor, e)
    {
        try
        {
            var data = executor.get_responseData();
            if(data == null)
            {
                this.addSelectOption('', 'Invalid Post Code...');
                return;
            }
            
            // initialise <select> control
            var ctrlSelect = $get(this._selectAddressElementId);
            this.clearSelect(ctrlSelect);

            // deserialise results
            var option;
            var lookupData = Sys.Serialization.JavaScriptSerializer.deserialize(data);
            if(lookupData == null)
                throw Error.invalidOperation();
                
            if(lookupData.Error)
            {
    	        this.addSelectOption('', lookupData.Error);
            }
            else if(lookupData.length == 0)
            {
    	        this.addSelectOption('', 'No results found...');
            }
            else
            {
	            for(var i = 0; i < lookupData.length; i++)
                {
                    // check provider id
		            if(lookupData[i].ProviderID == '')
		                continue;
            		    
		            // add new option
		            option = document.createElement('OPTION');
		            option.value = lookupData[i].ProviderID;
		            option.text = lookupData[i].Name;
		            ctrlSelect.options.add(option);
	            }
	        }
	    }
	    catch(ex)
	    {
	        this.addSelectOption('', 'Service Error');
	    }
	},
    
    ///
    /// Fetch event
    ///
    _onFetch : function(e)
    {
        var element = this.get_element();
        if(element && !element.disabled) {
        
            if(this._clientOnFetchAddress)
                this._clientOnFetchAddress();
            
            var select = $get(this._selectAddressElementId);
            var id = select.options[select.selectedIndex].value;
            if(id != null && id != '')
            {
                var wr = new Sys.Net.WebRequest();
                wr.set_url(this._getFetchUrl(id));
                wr.set_httpVerb('GET');
                wr.set_timeout(20000);
                wr.set_userContext(this);
                wr.add_completed(function(executor, e) { var obj = executor.get_webRequest().get_userContext(); obj._onFetchComplete.call(obj, executor, e) });
                wr.invoke();
            }
        }
    },
    
    ///
    /// Fetch complete delegate
    ///
    _onFetchComplete : function(executor, e)
    {
        var data = executor.get_responseData();

        var fetchData = Sys.Serialization.JavaScriptSerializer.deserialize(data);
        if(fetchData == null)
        {
	        alert('Service Error');
	        return;
        }
        else if(fetchData.Error)
        {
	        alert(fetchData.Error);
	        return;
        }
        
        var addrControl;

        //addrControl = document.getElementById(context.addrName);
        //if(addrControl != null)
        //    addrControl.value = fetchData.HouseName;

        addrControl = $get(this._line1ElementId);
        if(addrControl != null)
            addrControl.value = fetchData.Line1;

        addrControl = $get(this._line2ElementId);
        if(addrControl != null)
            addrControl.value = fetchData.Line2;

        addrControl = $get(this._line3ElementId);
        if(addrControl != null)
            addrControl.value = fetchData.Line3;

        addrControl = $get(this._townElementId);
        if(addrControl != null)
            addrControl.value = fetchData.Town;

        addrControl = $get(this._countyElementId);
        if(addrControl != null)
            addrControl.value = fetchData.County;

        //addrControl = document.getElementById(context.addrCountry);
        //if(addrControl != null)
        //    addrControl.value = fetchData.Country;

        addrControl = $get(this._postCodeElementId);
        if(addrControl != null)
            addrControl.value = fetchData.PostCode;
        
    },
    
    ///
    /// Properties
    ///
    get_providerUrl : function()
    {
        return this._providerUrl;
    },
    
    set_providerUrl : function(val)
    {
        this._providerUrl = val;
    },
    
    get_lookupPostCodeElementId : function()
    {
        return this._lookupPostCodeElementId;
    },
    
    set_lookupPostCodeElementId : function(val)
    {
        this._lookupPostCodeElementId = val;
    },
    
	get_selectAddressElementId : function()
    {
        return this._selectAddressElementId;
    },
    
	set_selectAddressElementId : function(val)
    {
        this._selectAddressElementId = val;
    },
    
	get_line1ElementId : function()
    {
        return this._line1ElementId;
    },
    
	set_line1ElementId : function(val)
    {
        this._line1ElementId = val;
    },
    
	get_line2ElementId : function()
    {
        return this._line2ElementId;
    },
    
	set_line2ElementId : function(val)
    {
        this._line2ElementId = val;
    },
    
	get_line3ElementId : function()
    {
        return this._line3ElementId;
    },
    
	set_line3ElementId : function(val)
    {
        this._line3ElementId = val;
    },
    
	get_townElementId : function()
    {
        return this._townElementId;
    },
    
	set_townElementId : function(val)
    {
        this._townElementId = val;
    },
    
	get_countyElementId : function()
    {
        return this._countyElementId;
    },
    
	set_countyElementId : function(val)
    {
        this._countyElementId = val;
    },
    
	get_postCodeElementId : function()
    {
        return this._postCodeElementId;
    },
    
	set_postCodeElementId : function(val)
    {
        this._postCodeElementId = val;
    },
    
	get_clientOnLookupAddress : function()
    {
        return this._clientOnLookupAddress;
    },
    
	set_clientOnLookupAddress : function(val)
    {
        this._clientOnLookupAddress = val;
    },
    
	get_clientOnFetchAddress : function()
    {
        return this._clientOnFetchAddress;
    },
    
	set_clientOnFetchAddress : function(val)
    {
        this._clientOnFetchAddress = val;
    }
    
}

///
/// BestDeal.UI.PostCodeFinderExtender register class
///
BestDeal.UI.PostCodeFinderExtender.registerClass('BestDeal.UI.PostCodeFinderExtender', Sys.UI.Behavior);

///
/// Notify framework that the script has loaded
///
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
