/*
 * mapbox - simple jQuery plugin for fancy image zooming
 * Examples and documentation at: http://fancy.klade.lv/
 * Version: 1.0.0 (29/04/2008)
 * Copyright (c) 2008 Janis Skarnelis
 * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
 * Requires: jQuery v1.2.1 or later
*/
(function($) {
	var opts = {}, 
		imgPreloader = new Image, imgTypes = ['png', 'jpg', 'jpeg', 'gif'], 
		loadingTimer, loadingFrame = 1;
	
	var lastBounds = "";
	var morebtn = "", totalText = "", indicationText = "", ext = "", reviewText = "", noscoreText = "", gLanguage = "";
	var loadID;
	var selMarker;
	var globalsLoaded = false;
	
	var globallabels = [];
	var globalCount;
	var globalCurrent = 0;
	
	var cityHotels = [];
	var cityCount;
	var cityCurrent = 0;
	
	var WoHotels = [];
	var WoCount;
	var WoCurrent = 0;
	
	var hotelPointsAll = [];
	
	
	$.fn.mapbox = function(settings) {
		opts.settings = $.extend({}, $.fn.mapbox.defaults, settings);

		$.fn.mapbox.init();

		return this.each(function() {
			var $this = $(this);
			var o = $.metadata ? $.extend({}, opts.settings, $this.metadata()) : opts.settings;

			$this.unbind('click').click(function() {
				$.fn.mapbox.start(this, o); return false;
			});
		});
	};

	$.fn.mapbox.start = function(el, o) {
		// reset all hotel vars so they will be shown again.
		globalsLoaded = false;
		
		globallabels = [];
		globalCount;
		globalCurrent = 0;
		
		cityHotels = [];
		cityCount;
		cityCurrent = 0;
		
		WoHotels = [];
		WoCount;
		WoCurrent = 0;
		
		hotelPointsAll = [];
		
		if (opts.animating) return false;

		if (o.overlayShow) {
			$("#fancy_wrap").prepend('<div id="fancy_overlay"></div>');
			$("#fancy_overlay").css({'width': $(window).width(), 'height': $(document).height(), 'opacity': o.overlayOpacity});

			if ($.browser.msie) {
				$("#fancy_wrap").prepend('<iframe id="fancy_bigIframe" scrolling="no" frameborder="0"></iframe>');
				$("#fancy_bigIframe").css({'width': $(window).width(), 'height': $(document).height(), 'opacity': 0});
			}

			$("#fancy_overlay").click($.fn.mapbox.close);
		}

		opts.itemArray	= [];
		opts.itemNum	= 0;

		var item = {url: el.href, title: el.title, o: o};

		if (o.zoomSpeedIn > 0 || o.zoomSpeedOut > 0) {
			var c = $(el).children("img:first").length ? $(el).children("img:first") : $(el);
			item.orig = {'width': c.width(), 'height': c.height(), 'pos': $.fn.mapbox.getPosition(c)}
		}

		opts.itemArray.push(item);

		$.fn.mapbox.changeItem(opts.itemNum, el.rel);
	};

	$.fn.mapbox.changeItem = function(n, rel) {
		$.fn.mapbox.showLoading();

		$("#fancy_nav").empty();
		$("#fancy_outer").stop();
		$("#fancy_title").hide();
		$(document).unbind("keydown");

		imgRegExp = imgTypes.join('|');
    	imgRegExp = new RegExp('\.' + imgRegExp + '$', 'i');

		$.fn.mapbox.showItem('<div id="fancy_div"><div id="map_pop" style="width: 600px; height: 400px;"></div></div>');
		$.fn.mapbox.showMap(rel);
	};

	$.fn.mapbox.showMap = function(rel) {
		var arrOpts = rel.split(",");
		var zoom = parseInt(arrOpts[2]) + 2;
		$("#map_pop").jmap('init', {'mapType':'map', 'mapCenter':[arrOpts[0],arrOpts[1]], 'mapZoom': parseInt(zoom), 'language': arrOpts[4]}, function(map, element, options) {
			lastBounds = map.getBounds();
			GEvent.addListener(map, "dragend", function() { 
				$.fn.mapbox.getHotelsByBounds(map);
			});
			GEvent.addListener(map, "zoomend", function(oldZoom, newZoom) {
				if(newZoom < 13 && !globalsLoaded) {
					globalsLoaded = true;
					$.fn.mapbox.loadOverview(arrOpts[4]);
				}
			});
		});
		$("#map_pop").jmap('CreateMarkerManager', {'markerManager':'MarkerManager'});
		$.fn.mapbox.getSettings(arrOpts[4]);
		if(arrOpts.length == 6) {
			$.fn.mapbox.getHotelsById(arrOpts[4],arrOpts[5]);
			$.fn.mapbox.loadHotelsByCityWoId(arrOpts[3],arrOpts[4], arrOpts[5]);
		} else {
			$.fn.mapbox.loadHotelsByCity(arrOpts[3],arrOpts[4]);
		}
	};
	
	$.fn.mapbox.getHotelsByBounds = function(map) {
		if ($.fn.mapbox.checkUpdate(lastBounds, map.getBounds())) {
			lastBounds = map.getBounds();
			$.fn.mapbox.showLoading();
			$.fn.mapbox.loadHotelsByLatLng($.fn.mapbox.getLatLngForViewPort(map.getBounds()));
		}
	};
	
	$.fn.mapbox.getLatLngForViewPort = function(bounds) {
		var NElat = bounds.getNorthEast().lat();
		var NElng = bounds.getNorthEast().lng();
		var SWlat = bounds.getSouthWest().lat();
		var SWlng = bounds.getSouthWest().lng();

		// get screen width & height in Lat / Lng to get the hotels just outside the viewport.
		var minNElat = NElat - (SWlat - NElat); // might need some tweaking
		var maxSWlat = SWlat + (SWlat - NElat);
		var minNElng = NElng - (SWlng - NElng);
		var maxSWlng = SWlng + (SWlng - NElng);

		return "NElat="+maxSWlat+"&NElng="+maxSWlng+"&SWlat="+minNElat+"&SWlng="+minNElng;
	};
	
	$.fn.mapbox.getSettings = function(language) {
		$.getJSON("/gethotels.php?lng="+language+"&getSettings=1", function(json)
		{
			ext = json.ext;
			morebtn = json.morebtn;
			totalText = json.totalText;
			indicationText = json.indicationText;
			noscoreText = json.noscoreText;
			gLanguage = language;
		});
	};
	
	$.fn.mapbox.loadOverview = function(language) {
		$.fn.mapbox.showLoading();
		$.getJSON("/gethotels.php?lng="+language, function(json)
		{
			for(i=0;i<json.length;i++) {
				globallabels.push(json[i]);
			}
			globalCount = globallabels.length;
			setTimeout("$.fn.mapbox.getGlobals()", 10);
		});
	};
	
	$.fn.mapbox.getGlobals = function() {
		globalCurrent = globalCurrent + 5;
		marker = [];
		for(i=0; i<5; i++) {
			marker[i] = globallabels.pop();
		}
		for(i=0;i<marker.length;i++) {
			var lat = marker[i].xcoord;
			var lng = marker[i].ycoord;
	
			$('#map_pop').jmap('AddMarker', {
				'pointLatLng': [lat, lng],
				'pointMinZoom': parseInt(marker[i].minZoom),
				'pointMaxZoom': parseInt(marker[i].maxZoom),
				'numHotels': parseInt(marker[i].numHotels)
			}, function(marker, options) {
				GEvent.addListener(marker, "click", function () {
					var lat = options.pointLatLng[0];
					var lng = options.pointLatLng[1];
					$('#map_pop').jmap('MoveTo', {
						'mapCenter': [lat, lng],
						'mapZoom': options.pointMaxZoom + 1});
				});
			});
		}
		if(globalCurrent < globalCount) {
			setTimeout("$.fn.mapbox.getGlobals()", 10);
		} else {
			$("#fancy_loading").hide();
		}
	};
	
	$.fn.mapbox.loadHotelsByCity = function(city, language) {
		cityCurrent = 0;
		cityCount = 0;
		cityHotels = [];
	
		$.getJSON("/gethotels.php?lng="+language+"&city=" + city, function(json)
		{
			if(json != null) {
				for(i=0;i<json.length;i++)
				{
					if (! $.fn.mapbox.array_key_exists ( json[i].ID, hotelPointsAll )) {
						hotelPointsAll[json[i].ID] = json[i];
						cityHotels.push(json[i]);
					}
				}
				cityCount = cityHotels.length;
				setTimeout("$.fn.mapbox.getHotelsByCity()",10);
			}
		});
	};
	
	$.fn.mapbox.getHotelsByCity = function() {
		marker = [];
		if(cityCount - cityCurrent < 5) {
			var amount = cityCount - cityCurrent;
			for(i=0;i<amount;i++) {
				marker[i] = cityHotels.pop();
			}
		} else {
			for(i=0;i<5;i++) {
				marker[i] = cityHotels.pop();
			}			
		}
		cityCurrent = cityCurrent + 5;
		
		for(i=0;i<marker.length;i++) {
			var lat = marker[i].ycoord / 100000;
			var lng = marker[i].xcoord / 100000;
			var stars = marker[i].nrofStars;
			var sStars = "";
			
			if(stars>0)
			{
				if(stars>1)
				{
					for(s=0;s<stars-1;s++)
					{
						sStars += "<img src='/_mainimg/starHomeWhite.gif'/>";
					}
					sStars += "<img src='/_mainimg/starHomeWhite.gif' style='margin-right: 10px;'/>";
				}
				else
				{
					sStars += "<img src='/_mainimg/starHomeWhite.gif' style='margin-right: 10px;'/>";
				}
			}
			
			var hotelHTML =  "<span class='iwstyle'><table width='240px'>";
                hotelHTML += "<tr>";
                hotelHTML += "<td colspan='2'><strong><a href='http://www.hoteliers." + ext + marker[i].hoteluri + "'>" + marker[i].name + "</a> " + sStars + "</strong></td>";
                hotelHTML += "</tr>";
                hotelHTML += "<tr>";
                hotelHTML += "<td><a href='http://www.hoteliers." + ext + marker[i].hoteluri + "'><img src='http://images.hoteliers.com/mainclipped/"+ marker[i].mainImage +"' style='padding-right: 3px; display: block; border: none;'/></a></td>";
                hotelHTML += "<td>" + marker[i].shortDescription + "</td>";
                hotelHTML += "</tr>";
                hotelHTML += "<tr><td colspan='2'><table width='100%'>";
				if(marker[i].total) {
				    hotelHTML += "<tr><td style='font-weight: bold;'>"+totalText+": </td><td>" + marker[i].total + "</td></tr>";
				} else {
				    hotelHTML += "<tr><td style='font-weight: bold;'>"+totalText+": </td><td>" + noscoreText + "</td></tr>";
				}
				hotelHTML += "<tr><td style='font-weight: bold;'>"+indicationText+": </td><td>€" + marker[i].lowRate + " - €" + marker[i].highRate + "</td></tr>";
				hotelHTML += "<tr><td align='right' style='padding-bottom: 5px;' colspan='2'><a href='http://www.hoteliers." + ext + marker[i].hoteluri + "'><img src='http://www.hoteliers.com/_mainimg/" + morebtn + "'/></a></td></tr>";
				hotelHTML += "</table></td></tr>";
				hotelHTML += "</table></span>";
			//var hotelHTML = "<span class='iwstyle'><strong><a href='http://www.hoteliers." + ext + marker[i].hoteluri + "'>" + marker[i].name + "</a> " + sStars + '</strong><br/>';
			//	hotelHTML += "<a href='http://www.hoteliers." + ext + marker[i].hoteluri + "'><img src='http://images.hoteliers.com/mainclipped/"+ marker[i].mainImage +"' style='float: left; padding-right: 3px; display: block; border: none;'/></a>";
			//	hotelHTML += "<div style='width:190px; float: left; overflow:auto;'>" + marker[i].shortDescription +"</div><br style='clear: both;'/>";
			//	hotelHTML += "<table width='250px'>";
			//	if(marker[i].total) {
			//		hotelHTML += "<tr><td style='font-weight: bold;'>"+totalText+": </td><td>" + marker[i].total + "</td></tr>";
			//	} else {
			//		hotelHTML += "<tr><td style='font-weight: bold;'>"+totalText+": </td><td>" + noscoreText + "</td></tr>";
			//	}
			//	hotelHTML += "<tr><td style='font-weight: bold;'>"+indicationText+": </td><td>€" + marker[i].lowRate + " - €" + marker[i].highRate + "</td></tr>";
			//	hotelHTML += "<tr><td align='right' style='padding-bottom: 5px;' colspan='2'><a href='http://www.hoteliers." + ext + marker[i].hoteluri + "'><img src='http://www.hoteliers.com/_mainimg/" + morebtn + "'/></a></td></tr>";
			//	hotelHTML += "</table></span>";
			$('#map_pop').jmap('AddMarker', {
				'pointLatLng': [lat, lng],
				'pointHTML': hotelHTML,
				'pointMinZoom': 13,
				'pointMaxZoom': 17
			});
		}
		if(cityCurrent < cityCount) {
			setTimeout("$.fn.mapbox.getHotelsByCity()", 10);
		} else {
			$("#fancy_loading").hide();
		}
	};
	
	$.fn.mapbox.loadHotelsByCityWoId = function(city, language, id) {
		WoCount = 0;
		WoCurrent = 0;
		WoHotels = [];
		
		$.getJSON("/gethotels.php?lng="+language+"&city=" + city + "&skipID=" + id, function(json)
		{
			if(json != null) { 
				for(i=0;i<json.length;i++)
				{
					if (! $.fn.mapbox.array_key_exists ( json[i].ID, hotelPointsAll )) {
						hotelPointsAll[json[i].ID] = json[i];
						WoHotels.push(json[i]);
					}
				}
				WoCount = WoHotels.length;
				setTimeout("$.fn.mapbox.getHotelsByCityWoId()",10);
			} else {
				$("#fancy_loading").hide();
			}
		});
	};
	
	$.fn.mapbox.loadHotelsByLatLng = function(url) {
		WoCount = 0;
		WoCurrent = 0;
		WoHotels = [];
		
		$.getJSON("/gethotels.php?lng="+gLanguage+"&"+url, function(json)
		{
			if(json != null) { 
				for(i=0;i<json.length;i++)
				{
					if (! $.fn.mapbox.array_key_exists ( json[i].ID, hotelPointsAll )) {
						hotelPointsAll[json[i].ID] = json[i];
						WoHotels.push(json[i]);
					}
				}
				WoCount = WoHotels.length;
				setTimeout("$.fn.mapbox.getHotelsByCityWoId()",10);
			} else {
				$("#fancy_loading").hide();
			}
		});
	};
	
	$.fn.mapbox.getHotelsByCityWoId = function() {
		var amount;
		marker = [];
		if(WoCount - WoCurrent < 5) {
			amount = WoCount - WoCurrent;
		} else {
			amount = 5;
		}
		for(i=0;i<amount;i++) {
			marker[i] = WoHotels.pop();
		}
		WoCurrent = WoCurrent + 5;
		
		for(i=0;i<marker.length;i++)
		{
			var lat = marker[i].ycoord / 100000;
			var lng = marker[i].xcoord / 100000;
			var stars = marker[i].nrofStars;
			var sStars = "";
			
			if(stars>0) {
				if(stars>1) {
					for(s=0;s<stars-1;s++) {
						sStars += "<img src='/_mainimg/starHomeWhite.gif'/>";
					}
					sStars += "<img src='/_mainimg/starHomeWhite.gif' style='margin-right: 10px;'/>";
				} else {
					sStars += "<img src='/_mainimg/starHomeWhite.gif' style='margin-right: 10px;'/>";
				}
			}
			
			var hotelHTML =  "<span class='iwstyle'><table width='240px'>";
                hotelHTML += "<tr>";
                hotelHTML += "<td colspan='2'><strong><a href='http://www.hoteliers." + ext + marker[i].hoteluri + "'>" + marker[i].name + "</a> " + sStars + "</strong></td>";
                hotelHTML += "</tr>";
                hotelHTML += "<tr>";
                hotelHTML += "<td><a href='http://www.hoteliers." + ext + marker[i].hoteluri + "'><img src='http://images.hoteliers.com/mainclipped/"+ marker[i].mainImage +"' style='padding-right: 3px; display: block; border: none;'/></a></td>";
                hotelHTML += "<td>" + marker[i].shortDescription + "</td>";
                hotelHTML += "</tr>";
                hotelHTML += "<tr><td colspan='2'><table width='100%'>";
				if(marker[i].total) {
				    hotelHTML += "<tr><td style='font-weight: bold;'>"+totalText+": </td><td>" + marker[i].total + "</td></tr>";
				} else {
				    hotelHTML += "<tr><td style='font-weight: bold;'>"+totalText+": </td><td>" + noscoreText + "</td></tr>";
				}
				hotelHTML += "<tr><td style='font-weight: bold;'>"+indicationText+": </td><td>€" + marker[i].lowRate + " - €" + marker[i].highRate + "</td></tr>";
				hotelHTML += "<tr><td align='right' style='padding-bottom: 5px;' colspan='2'><a href='http://www.hoteliers." + ext + marker[i].hoteluri + "'><img src='http://www.hoteliers.com/_mainimg/" + morebtn + "'/></a></td></tr>";
				hotelHTML += "</table></td></tr>";
				hotelHTML += "</table></span>";
			//var hotelHTML = "<span class='iwstyle'><strong><a href='http://www.hoteliers." + ext + marker[i].hoteluri + "'>" + marker[i].name + "</a> " + sStars + '</strong><br/>';
				//hotelHTML += "<a href='http://www.hoteliers." + ext + marker[i].hoteluri + "'><img src='http://images.hoteliers.com/mainclipped/"+ marker[i].mainImage +"' style='float: left; padding-right: 3px; display: block; border: none;'/></a>";
				//hotelHTML += "<div style='width:190px; float: left; overflow:auto;'>" + marker[i].shortDescription +"</div><br style='clear: both;'/>";
				//hotelHTML += "<table width='250px'>";
				//if(marker[i].total) {
					//hotelHTML += "<tr><td style='font-weight: bold;'>"+totalText+": </td><td>" + marker[i].total + "</td></tr>";
				//} else {
					//hotelHTML += "<tr><td style='font-weight: bold;'>"+totalText+": </td><td>" + noscoreText + "</td></tr>";
				//}
				//hotelHTML += "<tr><td style='font-weight: bold;'>"+indicationText+": </td><td>€" + marker[i].lowRate + " - €" + marker[i].highRate + "</td></tr>";
				//hotelHTML += "<tr><td align='right' style='padding-bottom: 5px;' colspan='2'><a href='http://www.hoteliers." + ext + marker[i].hoteluri + "'><img src='http://www.hoteliers.com/_mainimg/" + morebtn + "'/></a></td></tr>";
				//hotelHTML += "</table></span>";
			$('#map_pop').jmap('AddMarker', {
				'pointLatLng': [lat, lng],
				'pointHTML': hotelHTML,
				'pointMinZoom': 13,
				'pointMaxZoom': 17
			});
		}
		
		if(WoCurrent < WoCount) {
			setTimeout("$.fn.mapbox.getHotelsByCityWoId()", 10);
		} else {
			$("#fancy_loading").hide();
		}
	};
	
	$.fn.mapbox.getHotelsById = function(language, id) {
		$.getJSON("/gethotels.php?lng="+language+"&ID=" + id, function(json)
		{
			var Markers;
			var lat = json[0].ycoord / 100000;
			var lng = json[0].xcoord / 100000;
			var stars = json[0].nrofStars;
			var sStars = "";
			
			if(stars>0)
			{
				if(stars>1)
				{
					for(s=0;s<stars-1;s++)
					{
						sStars += "<img src='/_mainimg/starHomeWhite.gif'/>";
					}
					sStars += "<img src='/_mainimg/starHomeWhite.gif' style='margin-right: 10px;'/>";
				}
				else
				{
					sStars += "<img src='/_mainimg/starHomeWhite.gif' style='margin-right: 10px;'/>";
				}
			}
			
			var hotelHTML =  "<span class='iwstyle'><table width='240px'>";
                hotelHTML += "<tr>";
                hotelHTML += "<td colspan='2'><strong><a href='http://www.hoteliers." + ext + json[0].hoteluri + "'>" + json[0].name + "</a> " + sStars + "</strong></td>";
                hotelHTML += "</tr>";
                hotelHTML += "<tr>";
                hotelHTML += "<td><a href='http://www.hoteliers." + ext + json[0].hoteluri + "'><img src='http://images.hoteliers.com/mainclipped/"+ json[0].mainImage +"' style='padding-right: 3px; display: block; border: none;'/></a></td>";
                hotelHTML += "<td>" + json[0].shortDescription + "</td>";
                hotelHTML += "</tr>";
                hotelHTML += "<tr><td colspan='2'><table width='100%'>";
				if(json[0].total) {
				    hotelHTML += "<tr><td style='font-weight: bold;'>"+totalText+": </td><td>" + json[0].total + "</td></tr>";
				} else {
				    hotelHTML += "<tr><td style='font-weight: bold;'>"+totalText+": </td><td>" + noscoreText + "</td></tr>";
				}
				hotelHTML += "<tr><td style='font-weight: bold;'>"+indicationText+": </td><td>€" + json[0].lowRate + " - €" + json[0].highRate + "</td></tr>";
				hotelHTML += "<tr><td align='right' style='padding-bottom: 5px;' colspan='2'><a href='http://www.hoteliers." + ext + json[0].hoteluri + "'><img src='http://www.hoteliers.com/_mainimg/" + morebtn + "'/></a></td></tr>";
				hotelHTML += "</table></td></tr>";
				hotelHTML += "</table></span>";
			//var hotelHTML = "<span class='iwstyle'><strong><a href='http://www.hoteliers." + ext + json[0].hoteluri + "'>" + json[0].name + "</a> " + sStars + '</strong><br/>';
				//hotelHTML += "<a href='http://www.hoteliers." + ext + json[0].hoteluri + "'><img src='http://images.hoteliers.com/mainclipped/"+ json[0].mainImage +"' style='float: left; padding-right: 3px; display: block; border: none;'/></a>";
				//hotelHTML += "<div style='width:190px; float: left; overflow:auto;'>" + json[0].shortDescription +"</div><br style='clear: both;'/>";
				//hotelHTML += "<table width='250px'>";
				//if(json[0].total) {
					//hotelHTML += "<tr><td style='font-weight: bold;'>"+totalText+": </td><td>" + json[0].total + "</td></tr>";
				//} else {
					//hotelHTML += "<tr><td style='font-weight: bold;'>"+totalText+": </td><td>" + noscoreText + "</td></tr>";
				//}
				//hotelHTML += "<tr><td style='font-weight: bold;'>"+indicationText+": </td><td>€" + json[0].lowRate + " - €" + json[0].highRate + "</td></tr>";
				//hotelHTML += "<tr><td align='right' style='padding-bottom: 5px;' colspan='2'><a href='http://www.hoteliers." + ext + json[0].hoteluri + "'><img src='http://www.hoteliers.com/_mainimg/" + morebtn + "'/></a></td></tr>";
				//hotelHTML += "</table></span>";
			$('#map_pop').jmap('AddMarker', {
				'pointLatLng': [lat, lng],
				'pointHTML': hotelHTML,
				'pointMinZoom': 13,
				'pointMaxZoom': 17
			}, function(marker, options) {
				GEvent.trigger(marker, "click");
			});
		});
	};
	
	
	$.fn.mapbox.showItem = function(val) {
		$.fn.mapbox.preloadNeighborImages();

		var viewportPos	= $.fn.mapbox.getViewport();
		var itemSize	= $.fn.mapbox.getMaxSize(viewportPos[0] - 50, viewportPos[1] - 100, opts.itemArray[opts.itemNum].o.frameWidth, opts.itemArray[opts.itemNum].o.frameHeight);

		var itemLeft	= viewportPos[2] + Math.round((viewportPos[0] - itemSize[0]) / 2) - 20;
		var itemTop		= viewportPos[3] + Math.round((viewportPos[1] - itemSize[1]) / 2) - 40;

		var itemOpts = {
			'left':		itemLeft, 
			'top':		itemTop, 
			'width':	itemSize[0] + 'px', 
			'height':	itemSize[1] + 'px'	
		}

		if (opts.active) {
			$('#fancy_content').fadeOut("normal", function() {
				$("#fancy_content").empty();
				
				$("#fancy_outer").animate(itemOpts, "normal", function() {
					$("#fancy_content").append($(val)).fadeIn("normal");
					$.fn.mapbox.updateDetails();
				});
			});

		} else {
			opts.active = true;

			$("#fancy_content").empty();

			if ($("#fancy_content").is(":animated")) {
				console.info('animated!');
			}

			/*if (opts.itemArray[opts.itemNum].o.zoomSpeedIn > 0) {
				opts.animating		= true;
				itemOpts.opacity	= "show";

				$("#fancy_outer").css({
					'top':		opts.itemArray[opts.itemNum].orig.pos.top - 18,
					'left':		opts.itemArray[opts.itemNum].orig.pos.left - 18,
					'height':	opts.itemArray[opts.itemNum].orig.height,
					'width':	opts.itemArray[opts.itemNum].orig.width
				});

				$("#fancy_content").append($(val)).show();

				$("#fancy_outer").animate(itemOpts, opts.itemArray[opts.itemNum].o.zoomSpeedIn, function() {
					opts.animating = false;
					$.fn.mapbox.updateDetails();
				});

			} else {*/
				$("#fancy_content").append($(val)).show();
				$("#fancy_outer").css(itemOpts).show();
				$.fn.mapbox.updateDetails();
			//}
		 }
	};

	$.fn.mapbox.updateDetails = function() {
		$("#fancy_bg,#fancy_close").show();

		if (opts.itemArray[opts.itemNum].title !== undefined && opts.itemArray[opts.itemNum].title !== '') {
			$('#fancy_title div').html(opts.itemArray[opts.itemNum].title);
			$('#fancy_title').show();
		}

		if (opts.itemArray[opts.itemNum].o.hideOnContentClick) {
			$("#fancy_content").click($.fn.mapbox.close);
		} else {
			$("#fancy_content").unbind('click');
		}

		if (opts.itemNum != 0) {
			$("#fancy_nav").append('<a id="fancy_left" href="javascript:;"></a>');

			$('#fancy_left').click(function() {
				$.fn.mapbox.changeItem(opts.itemNum - 1); return false;
			});
		}

		if (opts.itemNum != (opts.itemArray.length - 1)) {
			$("#fancy_nav").append('<a id="fancy_right" href="javascript:;"></a>');
			
			$('#fancy_right').click(function(){
				$.fn.mapbox.changeItem(opts.itemNum + 1); return false;
			});
		}

		$(document).keydown(function(event) {
			if (event.keyCode == 27) {
            	$.fn.mapbox.close();

			} else if(event.keyCode == 37 && opts.itemNum != 0) {
            	$.fn.mapbox.changeItem(opts.itemNum - 1);

			} else if(event.keyCode == 39 && opts.itemNum != (opts.itemArray.length - 1)) {
            	$.fn.mapbox.changeItem(opts.itemNum + 1);
			}
		});
	};

	$.fn.mapbox.preloadNeighborImages = function() {
		if ((opts.itemArray.length - 1) > opts.itemNum) {
			preloadNextImage = new Image();
			preloadNextImage.src = opts.itemArray[opts.itemNum + 1].url;
		}

		if (opts.itemNum > 0) {
			preloadPrevImage = new Image();
			preloadPrevImage.src = opts.itemArray[opts.itemNum - 1].url;
		}
	};

	$.fn.mapbox.close = function() {
		if (opts.animating) return false;

		$(imgPreloader).unbind('load');
		$(document).unbind("keydown");

		$("#fancy_loading,#fancy_title,#fancy_close,#fancy_bg").hide();

		$("#fancy_nav").empty();

		opts.active	= false;

		/*if (opts.itemArray[opts.itemNum].o.zoomSpeedOut > 0) {
			var itemOpts = {
				'top':		opts.itemArray[opts.itemNum].orig.pos.top - 18,
				'left':		opts.itemArray[opts.itemNum].orig.pos.left - 18,
				'height':	opts.itemArray[opts.itemNum].orig.height,
				'width':	opts.itemArray[opts.itemNum].orig.width,
				'opacity':	'hide'
			};

			opts.animating = true;

			$("#fancy_outer").animate(itemOpts, opts.itemArray[opts.itemNum].o.zoomSpeedOut, function() {
				$("#fancy_content").hide().empty();
				$("#fancy_overlay,#fancy_bigIframe").remove();
				opts.animating = false;
			});

		} else {*/
			$("#fancy_outer").hide();
			$("#fancy_content").hide().empty();
			$("#fancy_overlay,#fancy_bigIframe").fadeOut("fast").remove();
		//}
	};

	$.fn.mapbox.showLoading = function() {
		clearInterval(loadingTimer);

		var pos = $.fn.mapbox.getViewport();

		$("#fancy_loading").css({'left': ((pos[0] - 40) / 2 + pos[2]), 'top': ((pos[1] - 40) / 2 + pos[3])}).show();
		$("#fancy_loading").bind('click', $.fn.mapbox.close);
		
		loadingTimer = setInterval($.fn.mapbox.animateLoading, 66);
	};

	$.fn.mapbox.animateLoading = function(el, o) {
		if (!$("#fancy_loading").is(':visible')){
			clearInterval(loadingTimer);
			return;
		}

		$("#fancy_loading > div").css('top', (loadingFrame * -40) + 'px');

		loadingFrame = (loadingFrame + 1) % 12;
	};

	$.fn.mapbox.init = function() {
		if (!$('#fancy_wrap').length) {
			$('<div id="fancy_wrap"><div id="fancy_loading"><div></div></div><div id="fancy_outer"><div id="fancy_inner"><div id="fancy_nav"></div><div id="fancy_close"></div><div id="fancy_content"></div><div id="fancy_title"></div></div></div></div>').appendTo("body");
			$('<div id="fancy_bg"><div class="fancy_bg fancy_bg_n"></div><div class="fancy_bg fancy_bg_ne"></div><div class="fancy_bg fancy_bg_e"></div><div class="fancy_bg fancy_bg_se"></div><div class="fancy_bg fancy_bg_s"></div><div class="fancy_bg fancy_bg_sw"></div><div class="fancy_bg fancy_bg_w"></div><div class="fancy_bg fancy_bg_nw"></div></div>').prependTo("#fancy_inner");
			
			$('<table cellspacing="0" cellpadding="0" border="0"><tr><td id="fancy_title_left"></td><td id="fancy_title_main"><div></div></td><td id="fancy_title_right"></td></tr></table>').appendTo('#fancy_title');
		}

		if ($.browser.msie) {
			$("#fancy_inner").prepend('<iframe id="fancy_freeIframe" scrolling="no" frameborder="0"></iframe>');
		}

		if (jQuery.fn.pngFix) $(document).pngFix();

    	$("#fancy_close").click($.fn.mapbox.close);
	};

	$.fn.mapbox.getPosition = function(el) {
		var pos = el.offset();

		pos.top	+= $.fn.mapbox.num(el, 'paddingTop');
		pos.top	+= $.fn.mapbox.num(el, 'borderTopWidth');

 		pos.left += $.fn.mapbox.num(el, 'paddingLeft');
		pos.left += $.fn.mapbox.num(el, 'borderLeftWidth');

		return pos;
	};

	$.fn.mapbox.num = function (el, prop) {
		return parseInt($.curCSS(el.jquery?el[0]:el,prop,true))||0;
	};

	$.fn.mapbox.getPageScroll = function() {
		var xScroll, yScroll;

		if (self.pageYOffset) {
			yScroll = self.pageYOffset;
			xScroll = self.pageXOffset;
		} else if (document.documentElement && document.documentElement.scrollTop) {
			yScroll = document.documentElement.scrollTop;
			xScroll = document.documentElement.scrollLeft;
		} else if (document.body) {
			yScroll = document.body.scrollTop;
			xScroll = document.body.scrollLeft;	
		}

		return [xScroll, yScroll]; 
	};

	$.fn.mapbox.getViewport = function() {
		var scroll = $.fn.mapbox.getPageScroll();

		return [$(window).width(), $(window).height(), scroll[0], scroll[1]];
	};

	$.fn.mapbox.getMaxSize = function(maxWidth, maxHeight, imageWidth, imageHeight) {
		var r = Math.min(Math.min(maxWidth, imageWidth) / imageWidth, Math.min(maxHeight, imageHeight) / imageHeight);

		return [Math.round(r * imageWidth), Math.round(r * imageHeight)];
	};

	$.fn.mapbox.defaults = {
		hideOnContentClick:	false,
		zoomSpeedIn:		0,
		zoomSpeedOut:		0,
		frameWidth:			600,
		frameHeight:		400,
		overlayShow:		false,
		overlayOpacity:		0.4,
		itemLoadCallback:	null,
		language:			'en'
	};
	
	$.fn.mapbox.checkUpdate = function(oldBounds, newBounds) {
		var oldNElat = oldBounds.getNorthEast().lat();
		var oldNElng = oldBounds.getNorthEast().lng();
		var oldSWlat = oldBounds.getSouthWest().lat();
		var oldSWlng = oldBounds.getSouthWest().lng();

		var oldMaxlat = oldNElat - (oldSWlat - oldNElat) / 2;
		var oldMinlat = oldSWlat + (oldSWlat - oldNElat) / 2;
		var oldMaxlng = oldNElng - (oldSWlng - oldNElng) / 2;
		var oldMinlng = oldSWlng + (oldSWlng - oldNElng) / 2;

		var newNElat = newBounds.getNorthEast().lat();
		var newSWlat = newBounds.getSouthWest().lat();
		var newNElng = newBounds.getNorthEast().lng();
		var newSWlng = newBounds.getSouthWest().lng();
		
		if(newNElat > oldMinlat && newSWlat < oldMaxlat && newNElng > oldMinlng && newSWlng < oldMaxlng)
		{
			return false;
		}
		else
		{
			return true;
		}
	};
	
	$.fn.mapbox.array_key_exists =  function(key, search) {
		if( !search || (search.constructor !== Array && search.constructor !== Object) ){
	        return false;
	    }
	    return key in search;
	};
})(jQuery);

