var PromocodeStep;
var PC = {
	req : null, start:[], end:[], s:[], e:[], url : window.location.href+'/price',
	live : undefined,
	datepickerOpts : { 
		dateFormat: 'yy-mm-dd', 
		showAnim: 'slideDown',
		minDate: '0d',
		maxDate: '+2y',
		showOtherMonths : false,
		showOn: 'button', 
		buttonImage: PATHFIX+'img/cal-grey.gif', 
		buttonImageOnly: true,
		onSelect : function(txt){
			var $sel = $(this).closest('td').find('select');
			var sp = txt.split('-');
			$sel.eq(0).val(sp[2]);
			$sel.eq(1).val(sp[0]+'-'+sp[1]);
			$(this).trigger('change');
		},
		beforeShow : function(inp){ if(inp.value==''){
			var $oi = $(inp.name=='arrival' ? '#pci_departure' : '#pci_arrival'), d = $oi.val();
			if(d) $(inp).datepicker('option', 'defaultDate', d);
		} },
		beforeShowDay : function(date){ 
			var dep = this.name=='departure';
			var obj = this, cnt=1, s=PC.s, e=PC.e, start=0, end=0, ret='';
			var time = date.getTime();
			var next = new Date(); next.setTime(time); next.setDate( next.getDate()-1 ); next = next.getTime();
			for(var i=0,l=s.length;i<l;i++) if(s[i]){ if(date>=s[i]) cnt++; if(time==s[i].getTime()) start++; }
			for(var i=0,l=e.length;i<l;i++) if(e[i]){ if(date>e[i]) cnt--; if(next==e[i].getTime()) end++; }
			if(date<new Date() || !(start+end)){ ret = ''; }
			else if(start && !end){ ret = 'available-start'; if(dep) cnt=0; }
			else if(end && !start && cnt<=0){ ret = 'available-end'; if(dep) cnt=1; }
			return [ cnt<=0, ret ];
		}
	},
	validate : function(e){
		var $form = $(this).find('form'),
			d = $form.serializeArray(),
			$s = $(this);
		if(PC.live || $('#pci_adults').val()>0){
			PC.live = true;
			if(PC.req){ $(PC.req).data('aborted',true); PC.req.abort(); }
			var fade = function(ev){  };
			PC.req = $.ajax({
			    type: "POST",
			    url: PC.url,
			    data: d,
			    success: function(msg){ if(msg) $s.html( $(msg).find('.pricecalculator').html() ); PC.install(); },
			    beforeSend : function(o){ $('.loader',$s).fadeIn('fast',function(){ if(o.readyState!=4) $s.fadeTo('slow', 0.6); } );  },
			    complete: function(o,s){ $s.fadeTo(0,1); $('.loader',$s).hide(); }
			});
		}
		
//		$(this).load( window.location.href+'/price', d /*, function(h,s,o){ alert(o.responseText); }*/ );
	},
	convertDate : function(s){
		var b = s.split('-'); 
		if(b.length==3) return new Date(1*b[0],1*b[1]-1,1*b[2]);
		return null;
	},
	
	updatePromocode : function(e){
		var $c = $('#pricecalculator');
		var code = $c.find('.promocode-code').val();
		if(''==code){ alert('Please enter code'); return; }
		$.getJSON('checkpromocode?code='+encodeURIComponent(code),null,function(obj){
			if(obj.error) alert(obj.error);
			$c.find('input[name=promovalue]').val(obj.value ? obj.value : 0);
			if(obj.value){
				$('.promocode-text',$c).text(code);
				PC.togglePromocode(3);
				$c.trigger('change');
			}
		});
		return false;
	},
	getPromotionValue : function(){
		return PC.parse($('#pricecalculator .promocode-value').val());
	},
	togglePromocode : function(step){
		var $c = $('#pricecalculator');
		if(step) PromocodeStep = step;
		else throw 'No step provided';
		
		switch(PromocodeStep){
		case 1:
			$('.promocode-step1',$c).show();
			$('.promocode-step2, .promocode-step3, .promocode-step23',$c).hide();
			$('input[name=promovalue], input[name=promocode]',$c).val('');
			$c.trigger('change');
			break;
		case 2:
			$('.promocode-step1, .promocode-step3',$c).hide();
			$('.promocode-step2, .promocode-step23',$c).show();
			break;
		case 3:
			$('.promocode-step1, .promocode-step2',$c).hide();
			$('.promocode-step3, .promocode-step23',$c).show();
			break;
		}
	},
	parse : function(str){ return 1*( str ? str : 0 ); },
	updateHidden : function(e){
		var $td = $(e.target).closest('td');
		$sel = $td.find('select');
		$inp = $td.find('input');
		if($sel.length==2) $inp.val( $sel[1].value+'-'+$sel[0].value );
	},
	install :function(){
		var $c = $('#pricecalculator');
		$('#pci_arrival,#pci_departure').datepicker( PC.datepickerOpts );
		$c.find('form').submit( PC.submit );
		$c.find('select').click( PC.updateHidden );
		$c.find('.promocode-find').click( PC.updatePromocode );
		$c.find('.promocode-code').change(function(e){e.stopPropagation();}).keypress( function(e){ if(e.which==13){ e.preventDefault(); PC.updatePromocode(e); return false; } });
		$c.find('a.promocode-step1').click( function(e){ PC.togglePromocode(2); return false; });
		$c.find('a.promocode-step23').click( function(e){ PC.togglePromocode(1); return false; });
		if(!PC.e.length){
			PC.s = PC.start.length ? PC.start.map(PC.convertDate).sort() : [];
			PC.e = PC.end.length ? PC.end.map(PC.convertDate).sort() : [];
			if(PC.live===undefined) PC.live = $('#pci_adults').val()>0;
		}
	},
	submit : function(e){
		var abort = false;
		if($('#pci_adults').val()=='0'){ alert('Please select a number of adults'); abort = true; }
		else if($('#pricecalculator').find('.invalid').length){ alert('Sorry, there are errors in your form.'); abort = true; }
		if(abort){ e.preventDefault(); return false; }
		return true;
	}
};

$(function(){ $('#pricecalculator').change( PC.validate ); PC.install(); });


if (!Array.prototype.map){
  Array.prototype.map = function(fun){
    var len = this.length >>> 0;
    if (typeof fun != "function")
      throw new TypeError();

    var res = new Array(len);
    var thisp = arguments[1];
    for (var i = 0; i < len; i++){
      if (i in this) res[i] = fun.call(thisp, this[i], i, this);
    }

    return res;
  };
}