var url = url || '';
var CostCalculatorUI = function(calculator, settings){
	var self = this;
	self.settings = settings;
	self.inputs = {};
	self.engine = calculator;
	self.zipLookup = new ZipLookup();
	self.savingsViewed = false;

	function init(){
		$('#hasSpa').val( self.settings.defaults.hasSpa );
		self.inputs.hasSpa = self.settings.defaults.hasSpa;

		//preload tab2 bkg image
		var bkg = new Image();
		bkg.src = url + "images/bkg-your-savings-ie.gif";
		
		initLabels();
		buildSliders();
		setupEvents();
		update();

		if (querySt("us") == '0') {
			$('#notUsResident').attr('checked',true);
			$('#zipCode').attr('disabled',true);
			zipCodeLookup();
		}
	}
	
	function setSystem(settings) {
		self.settings = settings;
		self.inputs = {};
		self.savingsViewed = false;
		
		// unbind previous events
		$('tdhPage input').each(function() {
			$(this).unbind('keypress');
		});
		$('tdhPage select').unbind('change');
		$('tdhPage input').unbind('keyup');
		$('[id^=totab],[id^=tab]').unbind('click');
		$('#lnkShowTwoSpeed').unbind('click');
		$('#lnkHideTwoSpeed').unbind('click');
		$('#printBtn').unbind('click');
		$('#notUsResident').unbind('click');
		
		init();
		$('div.tdhPage a#tab_1').click();
	}
	
	function initLabels(){
		for(var name in self.settings.labels	){
			var label = self.settings.labels[name];
			$('[name="'+name+'"]').each(function(){
				$(this).html('&nbsp;'+label);
			});
		}
	}
	
	function querySt(param) {
		var qs = window.location.search.substring(1);
		qs = qs.split("&");
		var i, val;
		for (i=0; i < qs.length; i++) {
			val = qs[i].split("=");
			if (val[0] == param) {
				return val[1];
			}
		}
		return null;
	}

	function buildSliders(){
		for(var id in self.settings.sliders){
			var values = self.settings.sliders[ id ];
			buildSlider(id, values);
		}
	}
	
	function buildSlider(id, values){
		var defaultIndex = self.settings.defaults[ id ];
		var defaultValue = values[ defaultIndex ];
		self.inputs[ id ] = defaultValue;
		if(id == "poolSize") changePoolImage(values,defaultIndex);
		$('#'+id+'Span').html( addCommas(defaultValue) );
		$('#'+id).slider({
			min: 0
			,max: values.length - 1
			,value: self.settings.defaults[ id ]
			,change: function(event,ui){
				var id = event.target.id;
				var values = self.settings.sliders[id];
				self.inputs[ id ] = values[ ui.value ];
				update();
				
				if(id == "poolSize") changePoolImage(values,ui.value);
			}
			,slide: function(event,ui){
				var id = event.target.id;
				var values = self.settings.sliders[id];
				var val = (id == "electricCost") ? values[ ui.value ].toFixed(2) : values[ ui.value ];
				$('#'+id+'Span').html( addCommas(val) );
				self.inputs[ id ] = val;
				update();
			}
		});
	}
	
	function resetSliders(){
		for(var id in self.settings.sliders){
			var values = self.settings.sliders[ id ];
			var defaultIndex = self.settings.defaults[ id ];
			var defaultValue = values[ defaultIndex ];
			self.inputs[ id ] = defaultValue;
			$('#'+id+'Span').html( defaultValue );
			$('#'+id).slider('option','max',values.length-1);
			$('#'+id).slider('option','value', defaultIndex);
		}
	}
	
	function setupEvents(){
		$('tdhPage input').each(function() {
			$(this).keypress(onNumericKeyPress);
		});
		
		$('tdhPage select').bind('change',function(){
			var val = Number(this.value);
			self.inputs[ this.id ] = val;
			var size = self.inputs.poolSize;
			var image = 
				url + 'images/pools' + (self.engine.metric? '_metric':'') + '/'
				+ ((self.inputs.hasSpa == 1) ? (size+"_spa.jpg") : (size + ".jpg"))
			;
			$('#poolImg').attr('src',image);
			update();
		});
		
		$('tdhPage input').bind('keyup',zipCodeLookup);
		
		$('[id^=totab],[id^=tab]').bind('click',function(){
			if(validZip()){
				if(!self.savingsViewed) setDefaults();
				updatePrintView();
				var tabId = Number(this.id.split('_')[1]);
				tabSwitch(tabId, 2, 'tab_', 'page');
				update();
			}else{
				alert('Please enter a valid ZIP code before continuing.');
			}
		});

		$('#lnkShowTwoSpeed').bind('click',function(){
			$('#varspeed').removeClass('left80');
			$('#twospeed').show();
			$('#lnkShowTwoSpeed').hide();
			$('#lnkHideTwoSpeed').show();
		});

		$('#lnkHideTwoSpeed').bind('click',function(){
			$('#twospeed').hide();
			$('#varspeed').addClass('left80');
			$('#lnkHideTwoSpeed').hide();
			$('#lnkShowTwoSpeed').show();
		});

		$('#printBtn').bind('click',function(){
			updatePrintView();
			window.print();
		});
		
		$('#notUsResident').bind('click',function(){
			$('#zipCode').attr('disabled', this.checked);
			$('#zipCode').trigger('keyup');
		});
	}

	function updatePrintView(){
		$('#poolSizePrintSpan').html(addCommas(self.inputs.poolSize));
		$('#zipCodePrintSpan').html($('#zipCode').val());
		var spa = (self.inputs.hasSpa==1) ? "Yes":"No";
		$('#hasSpaPrintSpan').html(spa);	
	}

	function setDefaults(){
		setDefaultHP();
		
		var spd = self.engine.defaultPumpSpeed(self.inputs);
		var spds = self.settings.sliders.pumpSpeed;
		var i = 0;
		for(i; i < spds.length; i++){
			if(spds[i]>=spd){
				break;	
			}
		}
		$('#pumpSpeed').slider('option','value',i);
		$('#pumpSpeedSpan').html(addCommas(spd.toFixed(0)));
		self.inputs.pumpSpeed = spd;
		self.savingsViewed = true;
	}

	function update(){
		if(validZip()){
			var results = self.engine.calculate(self.inputs);
			for(var key in results){
				var value = getOutputValue(key,results[key]);
				$('#'+key).html(value);
				updateLabel(key,value);
			}
		}
	}
	
	function getOutputValue(id,val){
		var value = val;
		if(val >= 0){
			var value = setDecimalPlaces(id,value);
			value = addCommas(value);
			value = setSuffix(id,value);
		}else{
			value = "N/A";
		}
		return value;
	}
	
	function setDecimalPlaces(id,val){
		var defaultVal = self.settings.decimalPlaces['default'];
		var decimalPlaces = self.settings.decimalPlaces[id];
		if(decimalPlaces == null) decimalPlaces = defaultVal;
		return val.toFixed(decimalPlaces);
	}
	
	function setSuffix(id,val){
		var suffix = self.settings.suffixes[id];
		suffix = (suffix!=null) ? suffix : "";
		return (suffix + " " + val);
	}
	
	function updateLabel(id,val){
		if(val=="N/A"){
			$("#"+id+"Label").html("&nbsp;");
		}else{
			var labelType = $("#"+id+"Label").attr("name")
			var label = self.settings.labels[ (labelType) ? labelType : "" ];
			label = (label) ? label : ""
			$("#"+id+"Label").html("&nbsp;"+label);
		}
	}

	function onNumericKeyPress(e) {
		var k = e.which;
		if (k == 46 || k == 13 || k == 8 || k == 10 || k == 0) return true;
		if (k < 48 || k > 57) e.preventDefault();
	}
	
	function zipCodeLookup(){
		self.savingsViewed = false;
		var val = this.value;
		var state = self.zipLookup.lookup(this.value);
		var vals = ($('#notUsResident').attr('checked'))
			? self.settings.stateDefaults['NON-US'] 
			: self.settings.stateDefaults[state]
		;
		setSliderValues(vals);
		update();
	}
	
	function setSliderValues(vals){
		var sliders = self.settings.sliders;
		if(vals != null){
			for(var id in vals){
				var sliderRange = sliders[id];
				for(var i = 0; i<sliderRange.length; i++){
					if(vals[id] == sliderRange[i]){
						$('#'+id).slider('option','value', i);
						var value = (id == "electricCost") ? sliderRange[i].toFixed(2) : sliderRange[i];
						$('#'+id+'Span').html( value );
						self.inputs[id] = value;
						break;
					}
				}
			}
		}
	}
	
	function validZip(){
		var retVal = true;
		$('#error1').html('&nbsp;');
		var zip = $('#zipCode').val();
		
		if( $('#notUsResident').attr('checked') ){
			retVal = true;
		}else if(zip.length != 5 || isNaN(Number(zip))){
			displayError('#error1', "You have entered an invalid ZIP code");
			retVal = false;
		}
		
		return retVal;
	}
	
	function addCommas(nStr) {
		nStr += '';
		x = nStr.split('.');
		x1 = x[0];
		x2 = x.length > 1 ? '.' + x[1] : '';
		var rgx = /(\d+)(\d{3})/;
		while (rgx.test(x1)) {
			x1 = x1.replace(rgx, '$1' + ',' + '$2');
		}
		return x1 + x2;
	}
	
	function displayError(id,msg){
		$(id).html('');
		$(id).append(''+msg+'<br/>');
	}

	function tabSwitch(active, number, tab_prefix, pageprefix) {
		for (var i=1; i < number+1; i++) {
			document.getElementById(pageprefix+i).style.display = 'none';
			document.getElementById(tab_prefix+i).className = '';
		}

		if (active == 2) {
			$('#lnkShowTwoSpeed').show();
			$('#twospeed').hide();
			$('#varspeed').addClass('left80');
		}

		document.getElementById(pageprefix+active).style.display = 'block';
		document.getElementById(tab_prefix+active).className = 'active';	
	}
	
	function setDefaultHP(){
		var flow = self.inputs.poolSize / (self.inputs.runTime * 60);
		var hps = self.settings.sliders.pumpHP;
		var minHP = self.settings.engine.variableSpeedPump.minHP;
		var i = hps.length - 1;
		var minIndex;
		for(i;i>=0;i--){
			var pumpFlow = self.settings.engine.standardPump[ "_"+hps[i] ][0];
			if(pumpFlow < flow || hps[i+1] <= minHP) break;
		}
		
		var index = (i >= hps.length - 1) ? hps.length - 1 : i+1;
		$('#pumpHP').slider('option','value',index);
		$('#pumpHPSpan').html(hps[index]);
		self.inputs.pumpHP = hps[index];
	}
	
	function changePoolImage(values,index){
		var size = values[index];
		var image = 
			url + 'images/pools' + (self.engine.metric? '_metric':'') + '/'
			+ ((self.inputs.hasSpa == 1) ? (size+"_spa.jpg") : (size + ".jpg"))
		;
		$('#poolImg').attr('src',image);
	}
	return {
		init: init
		,setSystem: setSystem
	};
};