
String.prototype.capitalize = function(){ //v1.0
    return this.replace(/\w+/g, function(a){
        return a.charAt(0).toUpperCase() + a.substr(1);
    });
};

function requestCountryData()
{
    try 
    {
	    countryReq.send(ajaxReqHandlerUrl,'cmd=countries&format=json');
	    emptyComboBox($('countryComboBox'), true);
	    emptyComboBox($('stateComboBox'), false);
	    emptyComboBox($('cityComboBox'), false);
	}
	catch(e) { }
}

function handleCountryReqFail()
{
	if(!fpChkLst.countryReqFailed)
	{
		requestStateData();
		fpChkLst.countryReqFailed = true;
	}
}


function processCountryData(req)
{
    try
    {
	    eval('countryData = ' + req);
	    var countryComboBoxOptions = $(countryComboBoxId).options;

		resetRootComboBoxOption(countryComboBoxOptions);

	    for(var i = 0; i < countryData.length; i++)
	    {
	    	countryComboBoxOptions[countryComboBoxOptions.length] = new Option(countryData[i]['name'], countryData[i]['id']);
	    }
	    fpChkLst.countryReqFailed = false;
    }
    catch(e) {}
}

var countryComboBoxId = '',
    stateComboBoxId = '',
    cityComboBoxId = '',
    zipCodeTextBoxId = '';
    
function bindLocationToUI(pCountryComboBoxId, pStateComboBoxId, pCityComboBoxId, pZipCodeTextBox)
{
    countryComboBoxId = pCountryComboBoxId;
    $(countryComboBoxId).onchange = requestStateData;
    stateComboBoxId = pStateComboBoxId;
    $(stateComboBoxId).onchange = requestCityData;
    cityComboBoxId = pCityComboBoxId;
    
    if(pZipCodeTextBox)
    {
        zipCodeTextBoxId = pZipCodeTextBox;
        //$(zipCodeTextBoxId).disabled = 1;
    }
}



function requestStateData()
{
    //stateReq.cancel();
    $(zipCodeTextBoxId).value = '';    
    $(zipCodeTextBoxId).disabled = 1;
    var selectedCountry = $(countryComboBoxId).value,
        postParam = 'format=json&cmd=getcountryinfo&country=' + selectedCountry;
    if(selectedCountry.length > 0 && fpChkLst.currentCountry != selectedCountry)
   	{
    	stateReq.send(ajaxReqHandlerUrl, postParam);
	    emptyComboBox($(stateComboBoxId), true);
	    emptyComboBox($(cityComboBoxId), false);
    	fpChkLst.currentCountry = '';
    }
    $('region-loader').style.display = '';
}

function handleStateReqFail()
{
	$('region-loader').style.display = 'none';
	if(!fpChkLst.stateReqFailed)
	{
		requestStateData();
		fpChkLst.stateReqFailed = true;
	}
}

function processStateData(req)
{
    try
    {
        eval('stateData = ' + req);
        fpChkLst.currentCountry = stateData['list'][0]['country_code'];
        var ComboBoxOptions = {};
        if(stateData['type'] == 'cities')
        {
            $(stateComboBoxId).disabled = 1;
            //resetRootComboBoxOption(cityComboBoxId);
            ComboBoxOptions = $(cityComboBoxId).options;
            
            ComboBoxOptions[0] = new Option('Select City...', '',1,1);
            for(var i = 0; i < stateData['list'].length; i++)
            {
                ComboBoxOptions[ComboBoxOptions.length] = new Option(stateData['list'][i]['name'].capitalize(), stateData['list'][i]['id']);
            }
      		
        }
        else if(stateData['type'] == 'regions')
        {
            $(stateComboBoxId).disabled = 0;
            ComboBoxOptions = $(stateComboBoxId).options;
            
            ComboBoxOptions[0] = new Option('Select State/Province...', '', 1,1);
            for(var i = 0; i < stateData['list'].length; i++)
            {
                ComboBoxOptions[ComboBoxOptions.length] = new Option(stateData['list'][i]['name'], stateData['list'][i]['region_code']);
            
            }
			//resetRootComboBoxOption(ComboBoxOptions);
        }
        if($(zipCodeTextBoxId) && parseInt(stateData['has_zip_code']))
        {
            $(zipCodeTextBoxId).disabled = 0;
        }
    }
    catch(e) { }
    finally 
    {
        $('region-loader').style.display = 'none';
        $('city-loader').style.display = 'none';
    }
}

function requestCityData()
{
	$('city-loader').style.display = '';
    var selectedState = $(stateComboBoxId).value,
    selectedCountry = $(countryComboBoxId).value,
    postParam = 'format=json&cmd=cities&region=' + selectedState + '&country=' + selectedCountry;
    if(selectedState.length > 0 && selectedCountry.length > 0)
    {
    	emptyComboBox(cityComboBoxId, true);
    	cityReq.send(ajaxReqHandlerUrl, postParam);
    }
}

function handleCityReqFail()
{
	$('city-loader').style.display = 'none';
	if(!fpChkLst.cityReqFailed)
	{
		requestCityData();
		fpChkLst.cityReqFailed = true;
	}
}



function processCityData(req)
{
    try
    {
	    eval('cityData = ' + req);
        var cityDataList = cityData['list'];
	    var cityComboBoxOptions = $(cityComboBoxId).options;
	    
	    cityComboBoxOptions[0] = new Option('Select City...', '',1,1);
	    for(var i = 0; i < cityDataList.length; i++)
	    {
	    	cityComboBoxOptions[cityComboBoxOptions.length] = new Option(cityDataList[i]['name'].capitalize(), cityDataList[i]['id']);
	    }
	    fpChkLst.cityReqFailed = false;
	    $('city-loader').style.display = 'none';
    }
    catch(e) {}
}

function emptyComboBox(comboBoxId, displayLoading)
{
	var comboBoxObj = $(comboBoxId);
	comboBoxObj.innerHTML = '<option>...</option>';
	
	/*
	if (displayLoading && comboBoxObj.options[0].value != 'Loading....') {
		fpChkLst.comboBoxRootOption = comboBoxObj.options[0];
		comboBoxObj.options[0] = new Option('Loading....', '');
	}*/
	
	/*
	for(var i = comboBoxObj.length; i > 1; i--)
	{
		comboBoxObj.options[i].remove();
	}*/
	
	
	
	
}



function resetRootComboBoxOption(comboBoxOptions)
{
		comboBoxOptions[0] = fpChkLst.comboBoxRootOption;
	    fpChkLst.comboBoxRootOption = null;
}

function removeFirstComboBoxOption(comboBoxOptions)
{
		comboBoxOptions[0].remove();
}





/*
XHR.prototype.cancel = function()
{
	if(!this.running)
		return this;
	this.running = false;
	this.transport.abort();
	this.transport.onreadystatechange = Class.empty;
	return this;
}*/

var fpChkLst = {
	comboBoxRootOption : null,
	currentCountry : '',
	currentRegion: '',
	stateReqFailed : false,
	cityReqFailed : false,
    zipReqFailed : false,
	countryReqFailed : false
}

var ajaxReqHandlerUrl = 'location.php';
var stateReq = new XHR({onSuccess: processStateData, onFailure: handleStateReqFail, headers: { 'Content-Type':'application/x-www-form-urlencoded' }});
var countryReq = new XHR({onSuccess: processCountryData, onFailure: handleCountryReqFail, headers: { 'Content-Type':'application/x-www-form-urlencoded' } });
var cityReq = new XHR({onSuccess: processCityData, onFailure: handleCityReqFail, headers: { 'Content-Type':'application/x-www-form-urlencoded' }});

/*
var zipReq = new XHR({onSuccess: processZipData, onFailure: handleZipReqFail, headers: { 'Content-Type':'application/x-www-form-urlencoded' }});

function processZipData(req)
{
    eval('zipData = ' req);
    if('OK' == zipData['req_stat'])
    {
        
    }
}
*/
















