$(function($) {
    
    var did_search = $('#did_search');
    var did_selector = $('#did_selector');
    
    var syncLocal = function(selected) {
    	var formatted = format(selected[0].did);
    	var did_search = $('#did_search');
    	did_search.find('#local_number_search').hide();
    	did_search.find('#local_number_selection')
    		.show()
    		.find('#current_local_number')
    			.text(formatted);
    	$('#account_did').val(selected[0].did);
    	$('#account_guid').val(selected[0].guid);
    };
    
    var format = function(num) {
    	return '('+num.substring(0,3)+') '+num.substring(3,6)+'-'+num.substring(6,10);
    };
    
    var timeout;
    var oldValue;

    var $available = $('#subdomain_notice .success');
    var $taken = $('#subdomain_notice .error:not(.prompt)');
    var $warning = $('#subdomain_notice .error.prompt');
    var $initial_domain = $('#initial_domain');
    var message_displayed = false;
    
    var $domain = $('#account_subdomain').keyup(function(event) {
    	$initial_domain.hide();
        var val = makeDomain($domain.val());
        if (val != oldValue && /^((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$/.test(val) && val != '') {
        	if (/[A-Z]/.test(val)) {
        		message_displayed = true;
        		
        	}
            var search = function() {
            	domainExists(val, doDomain);
            };
            clearTimeout(timeout);
            timeout = setTimeout(search, 1000);
        } else if (message_displayed) {
	            $taken.hide();
	            $available.hide();
	            $warning.show();
        }
        oldValue = makeDomain($domain.val());
    });
    
    var doDomain = function(data) {
        if (data.response == 'true') {
            $taken.show();
            $available.hide();
            $warning.hide();
        } else if (data.response == 'false') {
            $taken.hide();
            $available.show();
            $warning.hide();
        } else {
            $taken.show();
            $available.hide();
            $warning.hide();
        }
        message_displayed = true
    };
    
    var makeDomain = function(subdomain) {
    	return subdomain+'.phonebooth.com';
    };
    
    var domainExists = function(domain, callback) {
        $.ajax({
            type: 'POST',
            url: '/pb/signup/domain_exists/'+domain,
            success: callback,
            error: callback,
            dataType: 'json'
        });
    };
    
    var initial_domain_val = $('#account_subdomain').val();
    if (initial_domain_val) {
    	domainExists(initial_domain_val, doDomain);
    }
    
    $('#local_number_change').click(function(e) {
    	e.preventDefault();
    	
    	$('#local_number_selection').hide();
    	$('#local_number_search').show();
    	
    	
    	return false;
    });
    
    //$.getJSON('/pb/assets/valids.json?_='+(new Date().getTime()), function(valids) {
    	
    	var valids = PhoneboothStore;
    
    	var number_state = $('#number_state');
    	var number_npa = $('#number_npa');
    	var number_nxx = $('#number_nxx');
    	
    	var state_keys = valids.states; //$.keys(valids.states).sort();
    	number_state.addOption('--', '--', false);
    	$.each(state_keys, function(i, state) {
    		number_state.addOption(state, state, false);
    	});
    	
    	number_state.change(function() {
    		var state = $(this).val();
    		
    		if (state) {
        		// reset values and enable
        		number_npa.val('').removeOption(/./).removeAttr('disabled');
        		$.getJSON('/pb/signup/npa/'+state+'?_='+(new Date().getTime()), function(npas) {
            		//var npas = valids.states[state].sort();
                	$.each(npas.npa, function(i, npa) {
                		number_npa.addOption(npa, npa, false);
                	});
                	var first_npa = npas.npa[0];
                	onNumberNpaChange(first_npa, npas[first_npa].nxx);
        		});
    		}
    		
    	});
    	
    	// generic npa change
    	var onNumberNpaChange = function(npa, nxxs) {
    		if (npa && nxxs) {
    			number_nxx.val('').removeOption(/./).removeAttr('disabled');
            	$.each(nxxs, function(i, nxx) {
            		number_nxx.addOption(nxx.nxx, nxx.nxx+' - '+nxx.rc_long_name||'', false);
            	});
            	number_nxx.change();
    		}
    	};
    	
    	
    	number_npa.change(function () {
    		var npa = $(this).val();
    		$.getJSON('/pb/signup/nxx/'+npa+'?_='+(new Date().getTime()), function(nxxs) {
    			onNumberNpaChange(npa, nxxs.nxx);
    		});
    	});
    	
        // set up actions...
    	var did_search = $('#did_search');
        var searchform = $('form[name=numberSearch]',did_search);
        var searchResults = $('form[name=numberSearchResults]',did_search);
        var spinner = $('.spinner',did_search);
        var errorResults = $('.errorDisplay',did_search);
        var numberResults = $('.numberSearchResults',did_search);
        var numberDiv = $('.newNumbers',searchResults);
        var number_request = $('#number_request');
        // keep track of the request in order to cancel, if necesssary
        
        var request = null;
    	number_nxx.change(function() {
    		$('input[type="submit"]', numberResults).removeAttr('disabled');
    		number_request.hide();
    		errorResults.hide();
    		
            if (request) { // if there is already an existing get request, kill it
                request.abort();
            }
            
    		var searchString = $('#number_npa',searchform).val() + $('#number_nxx',searchform).val();
            numberResults.hide();
            spinner.show();
            numberDiv.empty(); // ensure the results div is empty
    		
            request = $.ajax({
                type: 'GET',
                url: '/pb/signup/search/' + searchString,
                dataType: 'json',
                success: function(data) {
                    if (data.numbers.length != 0) {
                        var resultHTML = '<ul>';
                        $.each(data.numbers, function(index,pair) {
                            var phonenumber = pair.did;
                            var guid = pair.guid;
                            var formatted = format(phonenumber);
                            resultHTML += '<li><input type="radio" name="numbers" value="' + guid + ':'+phonenumber+'"> '+formatted+'</li>';
                        });
                        resultHTML += '</ul>';
                        numberDiv.html(resultHTML);
                        numberDiv.find('li:first').addClass('strong').find(':radio').attr('checked', 'checked');
                        spinner.fadeOut('normal', function() {
                        	numberResults.fadeIn();
                        });
                    } else {
                        spinner.fadeOut('normal', function() {
                        	number_request.fadeIn();
                        });
                    }
                    request = null;
                },
                error: function() {
                    spinner.fadeOut('normal', function() {
                        errorResults.fadeIn();
                    });
                }
            });
            
            searchResults.click(function(e) {
                var target = $(e.target);
                if (target.is(':radio')) {
                	target.parent().parent().find('.strong').removeClass('strong');
                    target.parent().addClass('strong');
                }
            });
            
            var submitted = false;
            searchResults.submit(function(e) {
            	$('input[type="submit"]', numberResults).attr('disabled','true');
            	if (!submitted) {
            		
	            	e.preventDefault();
	
	                var selected = searchResults.find('input:checked').get();
	                
	                if (selected.length > 0) {
	                    selected = $.map(selected, function(input) {
	                        var pair = $(input).val().split(':');
	                        return {
	                            guid:pair[0],
	                            did: pair[1]
	                        };
	                    });
	
	                    $.ajax({
	                        type: 'POST',
	                        url: '/pb/signup/reserve',
	                        processData: false,
	                        data: $.toJSON({
	                            numbers:selected
	                        }),
	                        success: function(data, status) {
	                            syncLocal(selected);
	                        },
	                        error: function(xhr, status, error) {
	                            $('.messages', content)
	                            .show()
	                            .html('<p><label class="error">Your numbers could not be reserved. Please call <em>(877) 599-MYPB</em> for further assistance.</label></p>');
	                        }
	                    });
	                }
                	submitted = true;
            	}

                return false;
            });
            
            return false;
    	});
    //});

});

(function($) {
	
	$.extend({
		keys: function(obj){
			var a = [];
			$.each(obj, function(k){ a.push(k); });
			return a;
		}
	});

$.fn.addOption = function()
{
	var add = function(el, v, t, sO)
	{
		var option = document.createElement("option");
		option.value = v, option.text = t;
		// get options
		var o = el.options;
		// get number of options
		var oL = o.length;
		if(!el.cache)
		{
			el.cache = {};
			// loop through existing options, adding to cache
			for(var i = 0; i < oL; i++)
			{
				el.cache[o[i].value] = i;
			}
		}
		// add to cache if it isn't already
		if(typeof el.cache[v] == "undefined") el.cache[v] = oL;
		el.options[el.cache[v]] = option;
		if(sO)
		{
			option.selected = true;
		}
	};
	
	var a = arguments;
	if(a.length == 0) return this;
	// select option when added? default is true
	var sO = true;
	// multiple items
	var m = false;
	// other variables
	var items, v, t;
	if(typeof(a[0]) == "object")
	{
		m = true;
		items = a[0];
	}
	if(a.length >= 2)
	{
		if(typeof(a[1]) == "boolean") sO = a[1];
		else if(typeof(a[2]) == "boolean") sO = a[2];
		if(!m)
		{
			v = a[0];
			t = a[1];
		}
	}
	this.each(
		function()
		{
			if(this.nodeName.toLowerCase() != "select") return;
			if(m)
			{
				for(var item in items)
				{
					add(this, item, items[item], sO);
				}
			}
			else
			{
				add(this, v, t, sO);
			}
		}
	);
	return this;
};

$.fn.removeOption = function()
{
	var a = arguments;
	if(a.length == 0) return this;
	var ta = typeof(a[0]);
	var v, index;
	// has to be a string or regular expression (object in IE, function in Firefox)
	if(ta == "string" || ta == "object" || ta == "function" )
	{
		v = a[0];
		// if an array, remove items
		if(v.constructor == Array)
		{
			var l = v.length;
			for(var i = 0; i<l; i++)
			{
				this.removeOption(v[i], a[1]); 
			}
			return this;
		}
	}
	else if(ta == "number") index = a[0];
	else return this;
	this.each(
		function()
		{
			if(this.nodeName.toLowerCase() != "select") return;
			// clear cache
			if(this.cache) this.cache = null;
			// does the option need to be removed?
			var remove = false;
			// get options
			var o = this.options;
			if(!!v)
			{
				// get number of options
				var oL = o.length;
				for(var i=oL-1; i>=0; i--)
				{
					if(v.constructor == RegExp)
					{
						if(o[i].value.match(v))
						{
							remove = true;
						}
					}
					else if(o[i].value == v)
					{
						remove = true;
					}
					// if the option is only to be removed if selected
					if(remove && a[1] === true) remove = o[i].selected;
					if(remove)
					{
						o[i] = null;
					}
					remove = false;
				}
			}
			else
			{
				// only remove if selected?
				if(a[1] === true)
				{
					remove = o[index].selected;
				}
				else
				{
					remove = true;
				}
				if(remove)
				{
					this.remove(index);
				}
			}
		}
	);
	return this;
};


})(jQuery);
