
$.fn.imagesLoaded = function(callback){
	var elems = $('img',this);
	var len = elems.length;
	var blank = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
	var called = false;
	elems.load(function(){
	    if(!called && --len <= 0 && this.src !== blank){
	    	callback.call(elems,this);
	    	called = true; 
		}
	});
	setTimeout(function(){
		elems.load();
	},1000);
	return this;
};

$.fn.idle = function(time){  
    var i = $(this);  
    i.queue(function(){  
        setTimeout(function(){  
            i.dequeue();  
        }, time);  
    });
    return this;
};  

$.fn.centerBottom = function(){
	var selector = this;
	$(window).scroll(function(){
		
	    var newTop =   $(window).height() - $(selector).height() + $(window).scrollTop();
	    var newLeft = (($(window).width()  - $(selector).width()) / 2 ) + $(window).scrollLeft();
	    $(selector).css({
	        'position': 'absolute',
	        'left': newLeft,
	        'top': newTop
	    });
    }).scroll();
}

$.fn.fillWall = function(options){
	var wall = this;
	if($.browser.msie && parseFloat($.browser.version) < 9){
		return this;
	}
	$("body").css({"background-image":"none"});
	$.ajax({
		url:options.url,
		cache: false,
		success:function(data){
			$("<img />").attr("src",data).css({'display':'none',"position":"absolute"}).load(function(){
				if(options.timeout > 0){
					setTimeout(function(){$(wall).fillWall(options)},options.timeout);
				}
				var image = this;
				var iw = $(this).width();
				var ih = $(this).height();
				
				var resizeTimeout = null;
				
				$(window).resize(function(){
					clearTimeout(resizeTimeout);
					resizeTimeout = setTimeout(function(){
						
						var sw = $(window).width();
						var sh = $(window).height();
						
						$(wall).height(sh);
						
						var imgRatio = iw/ih;
						var img = $(image);
						if((sw/sh)<(imgRatio)){
							//screen taller than image
							var nh = sh+60;
							img.height(nh);
							img.width(nh/ih*iw);
						}
						else{
							//screen wider than image
							var nw = sw+60;
							img.width(nw);
							img.height(nw/iw*ih);
						}
						var diff = img.width() - sw;
						if(diff<0){diff = 0;}
						img.css({'left':"-" + (diff/2) + "px"});
						
					},10);
				}).idle(200).resize();
				
				$(this).idle(1000).fadeIn(options.fadeDuration,function(){
					if($("img",wall).length>1){
						$("img",wall).each(function(){
							$(this).remove();
							if($("img",wall).length==1){
								return false;
							}
						});
					}
				});
			}).appendTo(wall);
		}
	});
	return this;
};



function dateAddExtention(p_Interval, p_Number){
    var thing = new String();
    
    //in the spirt of VB we'll make this function non-case sensitive
    //and convert the charcters for the coder.
    p_Interval = p_Interval.toLowerCase();
    
    if(isNaN(p_Number)){
    
        //Only accpets numbers 
        //throws an error so that the coder can see why he effed up    
        throw "The second parameter must be a number. \n You passed: " + p_Number;
        return false;
    }

    p_Number = new Number(p_Number);
    switch(p_Interval.toLowerCase()){
        case "yyyy": {// year
            this.setFullYear(this.getFullYear() + p_Number);
            break;
        }
        case "q": {        // quarter
            this.setMonth(this.getMonth() + (p_Number*3));
            break;
        }
        case "m": {        // month
            this.setMonth(this.getMonth() + p_Number);
            break;
        }
        case "y":        // day of year
        case "d":        // day
        case "w": {        // weekday
            this.setDate(this.getDate() + p_Number);
            break;
        }
        case "ww": {    // week of year
            this.setDate(this.getDate() + (p_Number*7));
            break;
        }
        case "h": {        // hour
            this.setHours(this.getHours() + p_Number);
            break;
        }
        case "n": {        // minute
            this.setMinutes(this.getMinutes() + p_Number);
            break;
        }
        case "s": {        // second
            this.setSeconds(this.getSeconds() + p_Number);
            break;
        }
        case "ms": {        // second
            this.setMilliseconds(this.getMilliseconds() + p_Number);
            break;
        }
        default: {
        
            //throws an error so that the coder can see why he effed up and
            //a list of elegible letters.
            throw    "The first parameter must be a string from this list: \n" +
                    "yyyy, q, m, y, d, w, ww, h, n, s, or ms. You passed: " + p_Interval;
            return false;
        }
    }
    return this;
}
Date.prototype.dateAdd = dateAddExtention;
function daysDifferent(fD,sD){
	var firstDate = new Date(fD.valueOf());
	var secondDate = new Date(sD.valueOf());
	
	var dd = 0;
	
	while(firstDate.getYear()!= secondDate.getYear()){
		var years = secondDate.getYear() - firstDate.getYear();
		var daysAdd = years * 350;
		firstDate.dateAdd("d",daysAdd);
		dd+= daysAdd;
	}
	
	while(firstDate.getMonth()!= secondDate.getMonth()){
		var months = secondDate.getMonth() - firstDate.getMonth();
		var daysAdd = months * 25;
		firstDate.dateAdd("d",daysAdd);
		dd+= daysAdd;
	}
	
	while(firstDate.getDate()!= secondDate.getDate()){
		var daysAdd = secondDate.getDate() - firstDate.getDate();
		firstDate.dateAdd("d",daysAdd);
		dd+= daysAdd;
	}
	
	return dd;
}


$(function(){
	
	
	$("body").imagesLoaded(function(){
		$("#wall").fillWall({
			timeout:90000000,
			fadeDuration:2000,
			url:"/randomwall.php"
		});
	});
	
	var today = new Date();
	today.setHours(0);
	today.setSeconds(0);
	today.setMinutes(0);
	today.setMilliseconds(0);
	
	var twoYears = new Date(today.valueOf());
	twoYears.dateAdd("yyyy",2);

 	var availabilityString = new String($("#availability .av").html());

	var avSt = new String($("#availability .startDate").html());
	var avStartDate = new Date();
	avStartDate.setYear(avSt.substr(0,4));
	
	switch(avSt.substr(5,2)){
		case '01':
			var mon = 0;
			break;
		case '02':
			var mon = 1;
			break;
		case '03':
			var mon = 2;
			break;
		case '04':
			var mon = 3;
			break;
		case '05':
			var mon = 4;
			break;
		case '06':
			var mon = 5;
			break;
		case '07':
			var mon = 6;
			break;
		case '08':
			var mon = 7;
			break;
		case '09':
			var mon = 8;
			break;
		case '10':
			var mon = 9;
			break;
		case '11':
			var mon = 10;
			break;
		case '12':
			var mon = 11;
			break;
	}
	
	avStartDate.setMonth(mon);
	avStartDate.setDate(avSt.substr(8,2));
	avStartDate.setHours(0);
	avStartDate.setSeconds(0);
	avStartDate.setMinutes(0);
	avStartDate.setMilliseconds(0);
	
	if(availabilityString.length>0){
		var lad = new Date(avStartDate.valueOf());
		lad.dateAdd("d",availabilityString.length-1);
 	}
 	
 	function isbooked(d){
		if(availabilityString.length>0 && d>=avStartDate && d<=lad){
			var x = daysDifferent(avStartDate,d);	
			var avStr = availabilityString.substr(x,1);
	 		return parseInt(avStr);
		}
	 	return 0;
 	}
 	
 	function nextBooking(sd){
 		var nb = new Date(sd.valueOf());
 		nb.dateAdd("m",3); //Max Three Months
 		
		if(availabilityString.length>0 && sd>=avStartDate && sd<=lad){
			var dd = new Date(avStartDate.valueOf());
			for (var x = daysDifferent(avStartDate,sd); dd<lad; x++){
				
				var dd = new Date(avStartDate.valueOf());
				dd.dateAdd("d",x+1);
				
				if(dd>sd){
			 		if(parseInt(availabilityString.substr(x,1)) > 0){
			 			return dd;
			 		}
				}
			}
		}
 		return nb;
 	}
 	
 	
 	var selectEnd = false;
 	var StartDate = null;
 	var EndDate = null;
 	var nextBookingDate = null;
 	
 	var monthsView = 1;
 	if(parseFloat($("#availability .monthview").text()) > 1){
 		monthsView = parseFloat($("#availability .monthview").text());
 	}
 	
	$("#availability").datepicker({
	 	
		dateFormat: 'd MM yy',
		minDate: today,
		maxDate: twoYears,
		beforeShowDay: function(d){
	 		if(d>=today){
				var tomorrow = new Date(d.valueOf());
				tomorrow.dateAdd("d",1);
				var yesterday = new Date(d.valueOf());
				yesterday.dateAdd("d",-1);
				
				var bookingClass = "";
				var selectable = true;
				var toolTip = "Select Arrival Date";
				if(!EndDate && StartDate){
					var toolTip = "Select Departure Date";
				}
	 		
				var ybooking = isbooked(yesterday)
			 	var booking = isbooked(d);
		 		if(booking == 0){
					if(ybooking == 1){
						selectable = true;
						bookingClass = "pending-end";
					}
					else if(ybooking == 2){
						selectable = true;
						bookingClass = "booking-end";
					}
					else if(ybooking == 3){
						selectable = true;
						bookingClass = "booking-owner-end";
					}
		 		}
				else if(booking == 1){
					if(yesterday >= today && ybooking == 0){
						bookingClass = "pending-start";
						if(selectEnd){
							selectable = true;
						}
						else{
							toolTip = "Pending Booking";
							selectable = false;
						}
					}
					else{
						toolTip = "Pending Booking";
						selectable = false;
						bookingClass = "pending";
					}
				}
				else if(booking == 2){
					if(yesterday >= today && ybooking == 0){
						bookingClass = "booking-start";
						if(selectEnd){
							selectable = true;
						}
						else{
							toolTip = "Unavailable";
							selectable = false;
						}
					}
					else{
						toolTip = "Unavailable";
						selectable = false;
						bookingClass = "booking";
					}
				}
				else if(booking == 3){
					if(yesterday >= today && ybooking == 0){
						bookingClass = "booking-owner-start";
						if(selectEnd){
							selectable = true;
						}
						else{
							toolTip = "Unavailable";
							selectable = false;
						}
					}
					else{
						toolTip = "Unavailable";
						selectable = false;
						bookingClass = "booking-owner";
					}
				}
				if(selectEnd){
					if(d<=StartDate || d>=nextBookingDate){
						selectable = false;
						toolTip = "Unavailable";
						if(d.valueOf()!=StartDate.valueOf()){
							bookingClass+= " fade-out";
						}
					}
				}
				if(StartDate){
					if(d.valueOf()==StartDate.valueOf()){
						bookingClass+= " booking-selected-start";
					}
					if(EndDate){
						if(d>StartDate && d<EndDate){
							bookingClass+= " booking-selected";
						}
						else if(d.valueOf()==EndDate.valueOf()){
							bookingClass+= " booking-selected-end";
						}
					}
				}
			}
			return [selectable,bookingClass,toolTip];
		},
		numberOfMonths: monthsView,
		onSelect:function(d){
			var d = new Date(d.valueOf());
			var bookingURL = new String($("#availability .booklink").attr("href"));
			bookingURL+= "&start_date=" + d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate();
			
			$("<a href=\"" + bookingURL + "\">SecureBookIt</a>").popupWindow({width:850}).click();

//			if(!selectEnd){
//				StartDate = new Date(d.valueOf());
//				EndDate = null;
//				nextBookingDate = nextBooking(StartDate);
//			}
//			else{
//				EndDate = new Date(d.valueOf());
//			}
//			selectEnd = !selectEnd;
		}
	});
	
	 
 	$("#search_f_date").datepicker({
	 	dateFormat: 'd MM yy',
	 	minDate: today,
	 	maxDate: twoYears
	});
	
	$("#search_f_trigger").click(function(){
		$("#search_f_date").focus();
	});
	 
	$("#slides").cycle({ 
	   fx:    	'fade', 
	   speed:  1500,
	   timeout:9000
	});
	$("#prop .images").autoScroller({targetElement: "a"}).find(".Left, .Right").css({'opacity':"0.5"}).hover(function(){
		$(this).css({'opacity':"1"});
	},function(){
		$(this).css({'opacity':"0.5"});
	});
	
	$("#results").jScroll();
	
	$("#prop .images a").lightBox();
	
	$('.securebookit').popupWindow({width:850});
	$("a.vtour").popupWindow({width:850, height:650});
	 
	 $("a.lightb").lightBox();
	 $("a.testimonial").lightBox();
	 $("a.facility").click(function(){
	 	$("a.lightb:first").click();
	 });
	 
	 $(".prop").each(function(){
	 	var pr = this;
	 	$(".unit",this).click(function(){
	 		$(".image:first", pr).click();
	 	});
//	 	$(".image", this).lightBox().hover(function(){ 
	 	$(".image", this).hover(function(){ 
			$("img",this).animate({opacity: 0.6}, 200 );
		}, function(){
			$("img",this).animate({opacity: 1}, 200 );
		});
	});
	 
	//Map Code!
	var map = ".map";
	var address = $('.address').html() + " " + $('.address').attr("postcode");
	function placeMarkMap(map,address,p){
		$(map).jmap('init', {
			'mapType':'map',
			"mapZoom":16,
			'mapShowjMapsIcon': false,
			'mapEnableType': true,
			'mapCenter':p
		}).jmap('AddMarker',{
	        'pointLatLng':p,
	        'pointHTML':address,
			'centerMap': true
	    });
	}
	$(map).each(function(){
		if(point = $(map).attr("point")){
			point = point.split(",");
	   		placeMarkMap(map,address,[point[0],point[1]]);
		}
		else{
			//Get the address
			$("<div></div>").jmap('init', {
				'mapType':'map',
				"mapZoom":16,
				'mapShowjMapsIcon': false,
				'mapEnableType': true
			}).jmap('SearchAddress', {
		        'query': address,
		        'returnType': 'getLocations'
		    }, function(result, options){
		        var valid = Mapifies.SearchCode(result.Status.code);
		        if (valid.success) {
		       		$.each(result.Placemark, function(i, point){
		           		placeMarkMap(map,address,[point.Point.coordinates[1], point.Point.coordinates[0]]);
		                return false;
		            });
		        }
		    });
		}
	});
	
	$("#Header").pngFix();
	
	$("#sideMenu").each(function(){
		$("li",this).hover(function(){ 
			$(">ul:not(:animated)", this).each(function(){
				$(this).show("fast");
			}); 
		}, function(){
			$(">ul", this).each(function(){
				$(this).hide("fast");
			}); 
		}).each(function(){
			$(">ul", this).css("position","absolute").css("display","none");
		});
	});	
});

