/**
 * WhereIs (for jQuery)
 * version: 0.9.1 (January 30, 2010S)
 * @requires jQuery v1.2 or later
 * @requires Google Maps API v3 or later
 * @requires Facebox for jQuery 1.2 or later
 * @requires ThereIs for jQuery 0.9 or later
 *
 * Examples at  http://scripts.paulkoppen.com/whereis
 *
 * Licensed under the MIT:
 *   http://www.opensource.org/licenses/mit-license.php
 *
 * Copyright 2009 Paul Koppen [ paul . koppen @ gmail . com ]
 *
 * Version History
 * 22 September 2009 - Paul Koppen - Initial version 
 * 30 January 2010 - Wessel Heringa - Fixed google api calls (lower_cased to CamelCased function calls)
 *
 * 
 * Module Usage:
 * -------------
 *
 *  For the utmost basic example:
 *
 *   jQuery(document).ready(function(){
 *     // adds a button next to each <input> with class="location"; click it to pick a location
 *     jQuery('input.location').whereis();
 *   });
 *
 *  You could override some defaults:
 *
 *   jQuery(document).ready(function(){
 *     // overwrite some options (however you'll mostly want to override $.thereis options...)
 *     var options = {
 *       inputbutton: 'images/icon-whereis.png',
 *       acceptbutton: 'images/button-accept.png'
 *     };
 *     jQuery('input.location').whereis(options);
 *   });
 *
 */
(function($){
	/**
	 * Button and Maps-in-Facebox Renderer
	 */
	$.fn.whereis = function(options) {
		var opts = $.extend({}, $.whereis.defaults, options);
		
		return this.each(function(){
			
			function popon() {
				$(document).bind('beforeReveal.facebox', make_acceptbutton);
				$.facebox(function(){
					$(document)
						.bind('afterclose.facebox', popoff)
						.bind('thereis.change', mapchange);
					$('#whereismap').remove();
					$.facebox($('<div id="whereismap"></div>')
								.appendTo('body')
								.thereis($.whereis.decode($this.val())));
				});
				return false;
			}
			function make_acceptbutton() {
				$(opts.acceptbuttonhtml)
					.find('img').attr('src', opts.acceptbutton).end()
					.appendTo($('#facebox .footer'))
					.click(accept);
				$(document).unbind('beforeReveal.facebox', make_acceptbutton);
			}
			function popoff() {
				$('#facebox .footer .accept').remove();
				$(document)
					.trigger('thereis.release')
					.unbind('thereis.change', mapchange)
					.unbind('afterclose.facebox', popoff);
			}
			function mapchange(event) {
				cache = $.whereis.encode(event.thereis.map, event.thereis.marker);
			}
			function accept() {
				$this.val(cache);
				$(document).trigger('close.facebox');
				return false;
			}
			
			var $this = $(this);
			var cache = $this.val();
			
			$(opts.inputbuttonhtml)
				.find('img').attr('src', opts.inputbutton).end()
				.insertAfter($this)
				.click(popon);
		});
	};
	
	/**
	 * Default Settings
	 */
	$.whereis = {
		defaults: {
			inputbutton: 'whereis.png',
			inputbuttonhtml: '<a href="#" class="whereis"><img src="" title="set location" /></a>',
			acceptbutton: 'facebox/acceptlabel.gif',
			acceptbuttonhtml: '<a href="#" class="accept"><img src="" title="accept" /></a>'
		},
		/**
		 * Maps-<input> Interaction
		 */
		encode: function(map, marker) {
			var pos = marker.getPosition();
			var ctr = map.getCenter();
			var s   = [pos.lat(),pos.lng(),map.getZoom(),ctr.lat(),ctr.lng(),map.getMapTypeId()];
			return s.join('|');
		},
		decode: function(value) {
			var s = value.split('|');
			var o = {map:{},marker:{}};
			if (s.length > 5) o.map.mapTypeId = s[5];
			if (s.length > 4) o.map.center = new google.maps.LatLng(parseFloat(s[3]),parseFloat(s[4]));
			if (s.length > 2) o.map.zoom = parseInt(s[2]);
			if (s.length > 1)
				o.marker.position = new google.maps.LatLng(parseFloat(s[0]),parseFloat(s[1]));
			return o;
		}
	};
	
	/**
	 * Patch Facebox
	 */
	try {
		$.extend($.facebox.settings, {faceboxHtml:
			['<div id="facebox" style="display:none;"><div class="popup"><table><tbody><tr>',
			'<td class="tl"/><td class="b"/><td class="tr"/></tr><tr><td class="b"/>',
			'<td class="body"><div class="content"></div><div class="footer">',
			'<a href="#" class="close">',
			'<img src="/facebox/closelabel.gif" title="close" class="close_image" /></a></div>',
			'</td><td class="b"/></tr><tr><td class="bl"/><td class="b"/><td class="br"/></tr>',
			'</tbody></table></div></div>'].join('')});
		function faceboxSkipOverlay() {
			return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null;
		}
		function faceboxHideOverlay() {
			if (faceboxSkipOverlay()) return;
			$('#facebox_overlay').fadeOut(200, function(){
				$("#facebox_overlay")
					.removeClass("facebox_overlayBG")
					.addClass("facebox_hide")
					.remove();
			});
			return false;
		}
		function faceboxClose() {
			$(document).unbind('keydown.facebox');
			$('#facebox').fadeOut(function(){
				$('#facebox .content').removeClass().addClass('content');
				faceboxHideOverlay();
				$('#facebox .loading').remove();
				// allows me to mess with the interface when it is fully hidden
				$(document).trigger('afterclose.facebox');
			});
		}
		$(document).unbind('close.facebox').bind('close.facebox', faceboxClose);
	}
	catch (e) {}
})(jQuery);
