var Util = {
	findLocation : function() {
		navigator.geolocation.getCurrentPosition(
			// Success handler
			function(data) {
				var lon = data.coords.longitude,
					lat = data.coords.latitude,
					xy	= new Array(2);

				var zone = Math.floor ((lon + 180.0) / 6) + 1;
				zone = LatLonToUTMXY( DegToRad(lat), DegToRad(lon), zone, xy );

				var lonlat = new MPS.LonLat(xy[0], xy[1]);
				map.addMarker(lonlat);
				map.setCenter(lonlat, 6);
			},

			// Error Handler
			function(e) {
				switch (e.code) {
					case 1:
						alert(PDT.i18n('not to reveal your location'));
						break;
					case 2:
						alert(PDT.i18n('could not find your location'));
						break;
					case 3:
						alert(PDT.i18n('timeout to find your location'));
						break;
					case 4:
						alert(PDT.i18n('unknown error your location'));
						break;
				}
			}
			/*
			, {
				enableHighAccuracy: true,
				timeout: 60000,
				maximumAge: 75000
			}
			*/
		)
	},

	updateMapCt : function() {
		var width  = $(window).width(),
			height = $(window).height() -
					 $('#home header').height() -
					 $('#home footer').height();

		width = ($('#launcher').get(0).isVisible) ? width - $('#launcher').outerWidth() : width;

		$('#launcher').height(height - 20 /* Padding */);
		$('#map').width(width).height(height);
		map && map.updateSize();
	},

	calculateBBox : function(bbox) {
		var temp = [];

		bbox = bbox || window.map.getMaxExtent().toArray();
		
		temp.push( bbox[0] + ' ' + bbox[1] );
		temp.push( bbox[2] + ' ' + bbox[1] );
		temp.push( bbox[2] + ' ' + bbox[3] );
		temp.push( bbox[0] + ' ' + bbox[3] );
		temp.push( bbox[0] + ' ' + bbox[1] );

		return temp.join(',');
	},

	createOverlay : function(html) {
		var content = $('<div class="ov-content" />'),
			wrapper = $('<div class="ov-wrapper" />');

		wrapper.html(html).appendTo(content);

		return $('<div class="overlay" />').html(content);
	},

	createMarker : function(image, lat, lon) {
		var size	= new MPS.Size(32, 32),
			offset	= new MPS.Pixel(-(size.w / 2), -size.h),
			marker	= new MPS.Marker(
				new MPS.LonLat(lat, lon),
				new MPS.Icon(image, size, offset)
			);

		return marker;
	},

	pagination : {
		page : 1,

		total : null,

		out : function(page, records, fn) {
			this.page	= page || 1;
			this.total	= Math.ceil((records || 10) / 10);
			this.submit = fn;

			var imgPrev, imgNext, imgPrevDisabled, imgNextDisabled;

			// Images based on direction
			if (PDT.direction == 'ltr') {
				imgPrev = 'prev.png';
				imgNext = 'next.png';
				imgPrevDisabled = 'prev-disabled.png';
				imgNextDisabled = 'next-disabled.png';
			} else {
				imgPrev = 'next.png';
				imgNext = 'prev.png';
				imgPrevDisabled = 'next-disabled.png';
				imgNextDisabled = 'prev-disabled.png';
			}

			var me		= this,
				html	= $('<div class="pagination" />'),
				text	= MPS.i18n('pageOfPages', {
					page	: this.page
					,total	: this.total
				})

			if (this.page == 1) {
				html.append('<img class="disabled" src="images/' + imgPrevDisabled + '" />');
			} else {
				var prev = $('<img src="images/' + imgPrev + '" />');
				prev.click(function() {me.goPrev()});
				html.append(prev);
			}

			html.append('<span>' + text + '</span>');

			if (this.page == this.total) {
				html.append('<img class="disabled" src="images/' + imgNextDisabled + '" />');
			} else {
				var next = $('<img src="images/' + imgNext + '" />');
				next.click(function() {me.goNext()});
				html.append(next);
			}
			
			return html;
		},

		goPrev : function() {
			if (this.page == 1) {
				return;
			}

			this.page--;
			this.submit({page: this.page});
		},

		goNext : function() {
			if (this.page == this.total) {
				return;
			}

			this.page++;
			this.submit({page: this.page});
		}
	},

	launcher : {
		toggle : function(force) {
			var ln = $('#launcher');

			// Forced and already is visible/invisible, nothing to do here
			if (force === true  &&  ln.get(0).isVisible) return;
			if (force === false && !ln.get(0).isVisible) return;

			if (ln.get(0).isVisible) {
				$('#map').animate(
					{width: $(window).width()},
					function() {
						// Reset content
						$('#field-search').val('');
						$('#ln-title').html('');
						$('#ln-content').html('');
						window.map.clearMarkers();
						window.map.updateSize();
					}
				)

				if (PDT.align == 'Left') {
					ln.animate({marginRight: ln.outerWidth()});
				} else {
					ln.animate({marginLeft : '-'+ln.outerWidth()});
				}

				ln.get(0).isVisible = false;
			} else {
				// Move the map to create some space for the launcher
				// Do this only if launcher is not currently visible.
				var width = $('#map').outerWidth() - ln.outerWidth();

				$('#map').animate(
					{width: width},
					function() {window.map.updateSize()}
				)

				// ln.animate({margin: 0});
				ln.css('margin', 0);
				ln.get(0).isVisible = true;
			}
		},

		title : function() {
			if (arguments.length > 0) {
				$('#ln-title').text( arguments[0] );
			}

			return $('#ln-title').text();
		},
		
		loading : function(set) {
			var header	= $('#launcher header'),
				title	= $('#ln-title');
			
			if (set) {
				title.hide();
				header.addClass('hd-loading');
			} else {
				header.removeClass('hd-loading');
				title.show();
			}
		}
	}
};



// Map initialization
$(function() {
	window.map = new MPS.Map('map', {
		lang: PDT.lang,
		controls: [
			'ArgParser',
			'Copyright',
			'KeyboardDefaults',
			'MapType',
			'Navigation',
			'Navigator',
			'Scale',
			'ScaleLine',
			'ZoomBar'
		]
	});

	// Register new event name
	window.map.events.addEventType('contextmenu');

	$('html').css('overflow', 'hidden');
	$(window).resize( Util.updateMapCt );

	Util.updateMapCt();
});



// Element handlers
$(function() {
	
	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	// Go Links functionality

	$('#go-location').click( function(e) {
		e.preventDefault();
		Util.findLocation();
	});


	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	// Do Links functionality
	
	var doLinks	= $('#menu-secondary a');

	var doHandlers = {
		general : function() {
			var me		= this,
				id		= me.id.split('-')[1],
				ct		= $('#header-bottom'),
				el		= ct.get(0),
				section	= ct.find('.sections'),
				height;
			
			if (el.xheight) {
				section.html('');
				height = el.xheight;
				delete el.xheight;
			} else {
				section.html( $('#template-' + id).html() );
				height = 190;
				el.xheight = ct.height();
			}

			ct.animate({height: height});

			// Hide other links
			doLinks.each( function(idx, link) {
				if (link == me) return;

				$(link).parent().animate({
					opacity	: 'toggle',
					width	: 'toggle'
				})
			})

			var frmId = '#sec-' + id;
			$(frmId).toggle('fast');
			
			// Toggle language switch
			$('#btn-language').toggle();
		},

		doprint : function() {
			var center	= map.getCenter(),
				zoom	= map.getZoom(),
				lon		= center.lon,
				lat		= center.lat;

			// Set paramters in cookie to keep url clean
			$.cookie('location', [lon, lat, zoom].join(':'));
			window.open(this.href);
			return;
		},

		dopermalink : function() {
			doHandlers.general.apply(this, arguments);

			var c = map.getCenter(),
				z = map.getZoom(),
				l = map.layers,
				layers = '';

            for (var i = 0, len = l.length; i < len; i++) {
                var layer = l[i];

                if (layer.isBaseLayer) {
                    layers += (layer == map.baseLayer) ? "B" : "0";
                } else {
                    layers += (layer.getVisibility()) ? "T" : "F";
                }
            }

			var	link  =	window.location	+ ['?zoom='+z, 'lat='+c.lat, 'lon='+c.lon, '&layers='+layers].join('&');
			var frame = '<iframe width="425" height="350" frameborder="0" scrolling="no" src="' +
						'http://map.tehran.ir/' + PDT.lang + ['/mapframe?zoom='+z, 'lat='+c.lat, 'lon='+c.lon].join('&');

			$('#permalink-link').val(link);
			$('#permalink-frame').val(frame);
		}
	}
	
	doLinks.click( function(event) {
		var hdl = this.id.replace('-', '');
		
		// If there's a spicific handler for this link call it, otherwise use general handler
		hdl = (doHandlers[hdl]) ? doHandlers[hdl] : doHandlers.general;

		event.preventDefault();
		hdl.call(this, event);
	});


	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	// Tootltips

	// Go Links
	$('#menu-primary a[title]').tooltip({
		effect: 'fade',
		offset: [10, 0],
		position: ['bottom', 'center']
	});
	
	// Do Links
	doLinks.tooltip({offset: [-10, 0]});


	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	// Go Links overlay
	
	$('#go-mobile, #go-help, #go-register, #go-api, #go-contact').overlay({
		onBeforeLoad : function() {
			window.ovGeneral = this;
			window.ovSetting && window.ovSetting.close();
			
			// grab wrapper element inside content
			var wrap = this.getOverlay().find(".ov-wrapper");
			
			// load the page specified in the trigger
			wrap.load(this.getTrigger().attr("href"));
		},
		onLoad : function() {
			$(document).mask({
				color		: '#FFF',
				opacity		: 0.5,
				zIndex		: 999,
				loadSpeed	: 'fast',
				closeOnEsc	: false,
				closeOnClick: false
			})
		},
		onClose : function() {
			// grab wrapper element inside content
			var wrap = this.getOverlay().find(".ov-wrapper");

			// Empty the content
			wrap.html('');

			// Remember the showed mask
			$.mask.close();
		}
	});


	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	// Settings overlay

	var offset = $('#go-setting').offset(),
		width  = $('#ov-setting').width(),
		left   = (PDT.direction == 'ltr') ? offset.left-width+25 : offset.left-10;
	
	$('#go-setting').overlay({
		left: left,
		top: 40,
		speed: 'fast',
		mask: {
			color: '#FFF',
			opacity: 0.1
		},
		onBeforeLoad : function() {window.ovSetting = this;}
	});


	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	// Map Context-menu

	window.map.events.register('contextmenu', this, function(e) {
		var id	= e.target.id.split('-')[1];
		
		if (id == 'postalcode') {
			Util.launcher.toggle(true);
			Util.launcher.loading(true);
			
			var content = $('#ln-content'),
				lonlat	= e.lonlat.lon + ' ' + e.lonlat.lat,
				url		= 'http://map.tehran.ir/services/postal_code/pub/home.php/request/postal_code/' + lonlat;
			
			// Place a marker for current point
			window.map.addMarker(lonlat);
			Util.launcher.title( PDT.i18n('get postal code') );
				
			$.ajax({
				url		: url,
				dataType: 'json',
				type	: 'get',
				success	: function(data) {
					Util.launcher.loading(false);
					var ctResults = $('<div class="search-results" />');

					if (!data || data.length < 1) {
						content.html('<div class="text-center">' + PDT.i18n('no search results') + '</div>');
						return;
					}
					
					// We've got some results, let's show
					$.each(data, function(idx, rec) {
						var cls = (idx % 2 == 0) ? 'even' : 'odd';

						// Add results to launcher
						var dr	= $(
							'<div class="' + cls + '">' +
								'<span>' + rec.postcode + '</span>' +
							'</div>'
						);

						ctResults.append(dr);
					})
					
					content.html(ctResults);
				},
				error	: function() {
					Util.launcher.loading(false);
					Util.launcher.toggle(false);
					alert(PDT.i18n('an error occured'));
				}
			})
		} else
		if (id == 'bugreport') {
			var html = $('#template-' + id).html(),
				ov	 = Util.createOverlay(html);

			ov.appendTo('#repository').overlay({
				load	: true,
				onBeforeLoad : function() {
					window.ovGeneral = this;
					window.ovSetting && window.ovSetting.close();
				},
				onClose : function() {
					this.getOverlay().remove();
				}
			});

			$('#sec-' + id).show().get(0)._event = e;
		}
	});
	
});



// Map Context-menu
$(function($) {
	$('#map').bind('contextmenu', function(e) {
		e.preventDefault();
	});

	// A control class for capturing click events...
	MPS.Control.ContextMenu = MPS.Class(MPS.Control, {
		xy: null,

		handleRightClicks: true,

		initialize: function() {
			MPS.Control.prototype.initialize.apply(this, arguments);

			this.handler = new MPS.Handler.Click(this, {
				'click': this.onClick,
				'rightclick': this.onRightClick
			}, {
				'pixelTolerance': 0,
				'stopSingle': true
			});
		},

		draw: function() {
			MPS.Control.prototype.draw.apply(this, arguments);

			MPS.Element.addClass(this.div, 'MPS-hidden');
			
			this.div.innerHTML = [
				'<ul>',
					'<li id="ctx-postalcode">', PDT.i18n('get postal code'), '</li>',
				'</ul>',
				'<ul>',
					'<li id="ctx-bugreport">', PDT.i18n('bug report'), '</li>',
				'</ul>'
			].join('');

			// Attach Event Handlers
			setTimeout(MPS.Function.bind(this.registerEvents, this), 500);

			return this.div;
		},

		registerEvents: function() {
			var o = MPS.Event.observe;
			var b = MPS.Function.bindAsEventListener;

			o(this.div, "click", b(this.onMenuClick, this));
		},

		onMenuClick: function(e) {
			var target = MPS.Event.element(e);
			var lonlat = this.map.getLonLatFromViewPortPx( this.xy );
			
			this.map.events.triggerEvent('contextmenu', {
				xy: this.xy,
				target: target,
				lonlat: lonlat
			});
		},

		onClick : function() {
			MPS.Element.addClass(this.div, 'MPS-hidden');
		},

		onRightClick: function(e) {
			var xy = e.xy.add(5, -17);
			this.moveTo(this.xy = xy);
			MPS.Element.removeClass(this.div, 'MPS-hidden');
		},

		CLASS_NAME: "MPS.Control.ContextMenu"
	});


	// Add an instance of the Click control that listens to various click events:
	var ctxMenu = new MPS.Control.ContextMenu();

	window.map.addControl(ctxMenu);
	ctxMenu.activate();
});



// Search Map
$(function($) {
	$('#ln-collapse').click( Util.launcher.toggle );

	$('#form-search').submit(function() {
		var txt = $.trim( $('#field-search').val() ),
			bBox;
		
		if (txt == '') return false;
		
		if ($('#radio-current-view').is(':checked')) {
			bBox = window.map.calculateBounds().toArray();
			bBox = Util.calculateBBox(bBox);
		} else {
			window.map.zoomTo(1);
			bBox = Util.calculateBBox();
		}
		
		var params = {
			bbox	: bBox,
			query	: txt
		}

		// Remember params for pagination
		this.submitParams = params;
		
		// Send the params
		doSearch(params);
		return false;
	})
	
	var doSearch = function(o) {
		Util.launcher.toggle(true);
		Util.launcher.loading(true);

		var savedParams = $('#form-search').get(0).submitParams,
			bbox		= o.bbox || savedParams.bbox,
			query		= o.query || savedParams.query,
			page		= o.page || 1;
		
		$.ajax({
			url		: 'http://map.tehran.ir/searchMap.php',
			dataType: 'json',
			success	: function(d) {searchSuccess(d, page)},
			error	: searchError,
			data	: {
				bbox	: bbox,
				query	: query,
				page	: page,
				locale	: PDT.lang,
				type	: 'all_roads'
			}
		})
	}
	
	var searchError = function() {
		Util.launcher.loading(false);
		Util.launcher.toggle(false);
		alert(PDT.i18n('an error occured'));
	}
	
	var searchSuccess = function(data, page) {
		Util.launcher.loading(false);
		
		var content		= $('#ln-content'),
			ctResults	= $('<div class="search-results" />');
		
		window.map.clearMarkers();
		
		if (!data || data.results < 1) {
			content.html('<div class="text-center">' + PDT.i18n('no search results') + '</div>');
			return;
		}
		
		// We've got some results, let's show
		Util.launcher.title( $('#field-search').val() );

		$.each(data.locations, function(idx, rec) {
			var cls	 = (idx % 2 == 0) ? 'even' : 'odd',
				icon = 'images/markers/t2-blue-' + (idx + 1) + '.png';

			var marker = Util.createMarker(icon, rec.lat, rec.lng);
			window.map.addMarker(marker);

			// Add results to launcher
			var dr	= $(
				'<div class="' + cls + '">' +
					'<img class="marker" src="' + icon + '" />' +
					'<span>' + rec.label + '</span>' +
				'</div>'
			);

			dr.get(0).lat = rec.lat;
			dr.get(0).lng = rec.lng;
			dr.get(0).marker = marker.icon.imageDiv;

			dr.click( function() {
				window.map.setCenter(new MPS.LonLat(this.lat, this.lng), 6);
			}).hover( function() {
				$(this.marker).toggleClass('scale15');
			})

			ctResults.append(dr);
		})
		
		
		var pageInfo = Util.pagination.out(page, data.results, doSearch);

		content.html(pageInfo);
		content.append(ctResults);
	}
});



// News by Location
$(function($) {
	var content	= $('#ln-content');

	var doSearch = function(o) {
		Util.launcher.toggle(true);

		$.ajax({
			url		: o.url,
			dataType: 'json',
			type	: 'get',
			data	: o.data,
			success	: o.success,
			error	: o.error
		})
	}

	var addBackBtn = function() {
		// Back button
		var btn = $('<button class="btn-back">' + PDT.i18n('search again') + '</button>');
		btn.click( showForm );
		content.append(btn);
	}

	var showResults = function(data) {
		var ctResults = $('<div class="search-results" />');

		window.map.clearMarkers();

		if (!data || data.length < 1) {
			content.text( PDT.i18n('no search results') );
			addBackBtn();
			return;
		}

		var table = $('<table />');

		// We've got some results, let's show
		$.each(data, function(idx, rec) {
			var cls	  = (idx % 2 == 0) ? 'even' : 'odd',
				image = 'images/markers/t2-green-' + (idx + 1) + '.png',
				lat	  = rec.position.split(' ')[0],
				lng	  = rec.position.split(' ')[1];

			var marker = Util.createMarker(image, lat, lng);
			window.map.addMarker(marker);

			var tr = $(
				'<tr class="' + cls + '">' +
					'<td><img class="marker" src="' + image + '" alt="' + (idx + 1) + '" /></td>' +
					'<td><p>' + rec.title + '</p></td>' +
				'</tr>'
			);

			tr.get(0).lat = lat;
			tr.get(0).lng = lng;
			tr.get(0).marker = marker.icon.imageDiv;

			tr.hover( function() {
				$(this.marker).toggleClass('scale15');
				window.map.panTo(new MPS.LonLat(this.lat, this.lng));
			}).click( function() {
				var html  = '<h1><a href="' + rec.link + '" target="_blank">' + rec.title + '</a></h1>' +
							'<div class="text-justify">' + rec.body + '</div>';

				var ov = Util.createOverlay(html);

				ov.appendTo('#repository').overlay({
					load	: true,
					onBeforeLoad : function() {
						window.ovGeneral = this;
						window.ovSetting && window.ovSetting.close();
					},
					onClose : function() {
						this.getOverlay().remove();
					}
				})
			})

			table.append(tr);
		})

		ctResults.append(table);
		content.html(ctResults);
		addBackBtn();
	}

	var showForm = function() {
		Util.launcher.toggle(true);
		window.map.clearMarkers();

		var html	= $($('#template-news').html()),
			header	= html.find('h1');

		header.remove();
		Util.launcher.title( header.text() );
		content.html(html);

		html.find('form').submit( function() {
			window.map.zoomTo(1);
			
			// Disable the button to prevent multiple submits
			var btn = $(this).find('input[type="submit"]');
			btn.attr('disabled', 'disabled');
			btn.after('<span class="loading"></span>');

			doSearch({
				url		: this.action,
				data	: $(this).serialize(),
				success : function(data) {
					showResults(data);

					btn.removeAttr('disabled');
					btn.next().remove();
				},
				error	: function() {
					btn.removeAttr('disabled');
					btn.next().remove();
					
					alert(PDT.i18n('an error occured'));
				}
			});

			return false;
		})
	}

	$('#go-news').click( function(e) {
		e.preventDefault();
		showForm();
	})
});



// Tehran Places
$(function($) {
	var content	= $('#ln-content');

	var doSearch = function(o) {
		Util.launcher.toggle(true);

		var submitParams = content.get(0).placesParams,
			bbox		= o.bbox || submitParams.bbox,
			type		= o.type || submitParams.type,
			success		= o.success || submitParams.success,
			error		= o.error || submitParams.error,
			page		= o.page || 1;
		
		$.ajax({
			url		: 'http://map.tehran.ir/searchMap.php',
			dataType: 'json',
			type	: 'get',
			success	: function(d) {success(d, page)},
			error	: error,
			data	: {
				bbox	: bbox,
				type	: type,
				page	: page,
				locale	: PDT.lang
			}
		})
	}

	var addBackBtn = function() {
		// Back button
		var btn = $('<button class="btn-back">' + PDT.i18n('back') + '</button>');
		btn.click( showForm );
		content.append(btn);
	}

	var showResults = function(data, page) {
		var ctResults = $('<section />');

		window.map.clearMarkers();

		if (!data || data.length < 1) {
			content.text( PDT.i18n('no search results') );
			addBackBtn();
			return;
		}
		
		// We've got some results, let's show
		$.each(data.locations, function(idx, rec) {
			var cls	  = (idx % 2 == 0) ? 'even' : 'odd',
				image = 'images/markers/t2-magenta-' + (idx + 1) + '.png';

			var marker = Util.createMarker(image, rec.lat, rec.lng);
			window.map.addMarker(marker);

			// Add results to launcher
			var dr	= $(
				'<div class="' + cls + '">' +
					'<img class="marker" src="' + image + '" />' +
					'<span>' + rec.label + '</span>' +
				'</div>'
			);

			dr.get(0).lat = rec.lat;
			dr.get(0).lng = rec.lng;
			dr.get(0).marker = marker.icon.imageDiv;

			dr.click( function() {
				window.map.setCenter(new MPS.LonLat(this.lat, this.lng), 6);
			}).hover( function() {
				$(this.marker).toggleClass('scale15');
			})

			ctResults.append(dr);
		})

		var pageInfo = Util.pagination.out(page, data.results, doSearch);

		content.append(pageInfo);
		content.append($('<div class="search-results" />').html(ctResults));
		addBackBtn();
	}

	var showForm = function() {
		Util.launcher.toggle(true);
		window.map.clearMarkers();

		var html	= $($('#template-places').html()),
			header	= html.find('h1');

		header.remove();
		Util.launcher.title( header.text() );
		content.html(html);

		html.find('.search-results li').click( function() {
			window.map.zoomTo(1);

			var li	 = this,
				id	 = li.id.split('-')[1],
				bbox = Util.calculateBBox();

			$(this).append('<span class="loading"></span>');

			var params = {
				bbox	: bbox,
				type	: id,
				success : function(data, page) {
					var blink = $('<a href="#">' + PDT.i18n('places list') + '</a>');
					
					blink.click( function(e) {
						e.preventDefault();
						showForm();
					})

					var div = $('<div id="places" />').html($('<div class="breadcrumb" />').html(blink).append('<span>: ' + $(li).text() + '</span>'));
					content.html(div);
					
					showResults(data, page);
				},
				error	: function() {
					$(li).find('span').remove();
					alert(PDT.i18n('an error occured'));
				}
			}

			// Remember params for pagination
			content.get(0).placesParams = params;
			doSearch(params);

			return false;
		})
	}

	$('#go-tourism').click( function(e) {
		e.preventDefault();
		showForm();
	})
});



// Convert Postal Code
$(function($) {
	var content	= $('#ln-content');

	var doSearch = function(o) {
		Util.launcher.toggle(true);

		$.ajax({
			url		: o.url,
			dataType: 'json',
			type	: 'get',
			data	: o.data,
			success	: o.success,
			error	: o.error
		})
	}

	var addBackBtn = function() {
		// Back button
		var btn = $('<button class="btn-back">' + PDT.i18n('search again') + '</button>');
		btn.click( showForm );
		content.append(btn);
	}

	var showResults = function(data) {
		var ctResults = $('<div class="search-results" />');

		window.map.clearMarkers();

		if (!data || data.length < 1) {
			content.html('<div class="text-center">' + PDT.i18n('no search results') + '</div>' );
			addBackBtn();
			return;
		}

		// We've got some results, let's show
		$.each(data, function(idx, rec) {
			var cls	  = (idx % 2 == 0) ? 'even' : 'odd',
				image = 'images/markers/t2-magenta-' + (idx + 1) + '.png',
				lat	  = rec.x,
				lng	  = rec.y;

			// Add a marker for each record to the map
			var size	= new MPS.Size(32, 32),
				offset	= new MPS.Pixel(-(size.w / 2), -size.h),
				marker	= new MPS.Marker(
					new MPS.LonLat(lat, lng),
					new MPS.Icon(image, size, offset)
				);

			window.map.addMarker(marker);


			// Add results to launcher
			var dr	= $(
				'<div class="' + cls + '">' +
					'<img class="marker" src="' + image + '" alt="' + (idx + 1) + '" />' +
					'<span>' + PDT.i18n('point') + ' ' + (idx + 1) + '</span>' +
				'</div>'
			);

			dr.get(0).lat = lat;
			dr.get(0).lng = lng;
			dr.get(0).marker = marker.icon.imageDiv;

			dr.click( function() {
				window.map.setCenter(new MPS.LonLat(this.lat, this.lng), 6);
			}).hover( function() {
				$(this.marker).toggleClass('scale15');
				window.map.panTo(new MPS.LonLat(this.lat, this.lng));
			})

			ctResults.append(dr);
		})

		content.html(ctResults);
		addBackBtn();
	}
	
	var showForm = function() {
		Util.launcher.toggle(true);
		window.map.clearMarkers();

		var html	= $($('#template-postalcode').html()),
			header	= html.find('h1');

		header.remove();
		Util.launcher.title( header.text() );
		content.html(html);

		html.find('form').submit( function() {
			var pv = $('#postalcode-number').val();
			
			// Validate postal code
			if (/^[0-9]{10}$/.test(pv) == false) {
				XRX.FlashBox.show(PDT.i18n('invalid postal code'));
				return false;
			}
			
			window.map.zoomTo(1);
			
			// Disable the button to prevent multiple submits
			var btn = $(this).find('input[type="submit"]');
			btn.attr('disabled', 'disabled');
			btn.after('<span class="loading"></span>');
			
			var url = this.action + pv;

			doSearch({
				url		: url,
				success : function(data) {
					showResults(data);

					btn.removeAttr('disabled');
					btn.next().remove();
				},
				error	: function() {
					btn.removeAttr('disabled');
					btn.next().remove();
					
					alert(PDT.i18n('an error occured'));
				}
			});

			return false;
		})
	}
	
	$('#go-postalcode').click( function(e) {
		e.preventDefault();
		window.ovSetting && window.ovSetting.close();
		showForm();
	})
});
