﻿
var timeOut;
var waterId;
var map;
var markers;

function initializeWaterMap(latitude, longitude, zoom) {
	var latlng = new google.maps.LatLng(latitude, longitude);
	var myOptions = {
		zoom: zoom,
		center: latlng,
		mapTypeId: google.maps.MapTypeId.HYBRID
	};
	
	map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
	markers = [];
}

function initializeSearchMap(latitude, longitude, zoom) {
	var latlng = new google.maps.LatLng(latitude, longitude);
	var myOptions = {
		zoom: zoom,
		center: latlng,
		mapTypeId: google.maps.MapTypeId.HYBRID
	};
	
	map = new google.maps.Map(document.getElementById("search_map"), myOptions);
	markers = [];
	
	for (var i = 1; i < places.length; i++) { 
		if (places[i].length == 4) {
			addMarker(places[i][0], places[i][1], places[i][2], places[i][3]);
		}
	}
}

function addMarker(latitude, longitude, msg, title) {
	var infowindow = new google.maps.InfoWindow({content: msg});

	var marker = new google.maps.Marker({
		position: new google.maps.LatLng(latitude, longitude),
		map: map,
		title: title,
		icon: '/img/map_icn6.png'
	});

	google.maps.event.addListener(marker, 'click', function() {
		infowindow.open(map,marker);
	});
	
	markers.push(marker);
}

function clearMarkers() {
	for (var i = 0; i < markers.length; i++) {
		markers[i].setMap(null);
	}
	
    markers = [];
	latlngbounds = new google.maps.LatLngBounds();
}

/**
 * Zoom the map to fit all markers.
 */
function zoomFitMarkers() {
	var latlngbounds = new google.maps.LatLngBounds();
	for (var i = 0; i < markers.length; i++) {
		latlngbounds.extend(markers[i].getPosition());
	}

	map.fitBounds(latlngbounds);
	
	if (map.getZoom() > 14 || markers.length == 1) {
		map.setZoom(14);
	}
}

function displayMessage(message) {
	$('#extra_user_info').addClass('user_info_message');
	$('#extra_user_info').html(message);
	$('#extra_user_info').show("slow");
}

function displaySuccess(message) {
	$('#extra_user_info').addClass('user_info_success');
	$('#extra_user_info').html(message);
	$('#extra_user_info').show("slow");
}

function displayError(message) {
	$('#extra_user_info').addClass('user_info_failed');
	$('#extra_user_info').html(message);
	$('#extra_user_info').show("slow");
}



function ajaxGotWater(data) {
	clearTimeout(timeOut);
	$('#water_info_load').hide();
	
	$('#water_info_text_edit').val(data.replace(/<br \/>/g, '\n'));
	$('#water_info_edit').show();
	$('#save_descr').show();
}

function ajaxSavedWater(data) {
	clearTimeout(timeOut);
	$('#water_info_load').hide();	
	
	displayMessage(data);
	$('#water_info_text').html($('#water_info_text_edit').val().replace(/\n/g, '<br />'));
	$('#water_info_text').show();
}

function displayYouTube(videoID) {
    var params = { allowScriptAccess: "always" };
    var atts = { id: "ytPlayer" };
    swfobject.embedSWF("http://www.youtube.com/v/" + videoID + "&enablejsapi=1&playerapiid=alltfiske1&version=3",
                       "videoDiv", "640", "505", "8", null, null, params, atts);
}

/**
 * Display the search fishingplace list.
 */
function displaySearchWater(data) {
	clearMarkers();
	var search_data = "";

	if (data.length > 0) {
		for (var i = 0; i < data.length; i++) { 
			search_data += getSearchWaterField(data[i].href, data[i].name, data[i].landscape, data[i].municipal);
			addMarker(data[i].latitude, data[i].longitude, "<a href=\"" + data[i].href + "\">" + data[i].name + "</a>", data[i].name);
		}
		
		zoomFitMarkers();

		$('#sok_data').html(search_data);
	}
	else {
		$('#sok_data').html("Tyvärr så fanns det inga fiskeplatser på det du sökte efter. Ändra söktermen och försök igen");
	}
}

/**
 * Returns an item for the fishingplace list.
 */
function getSearchWaterField(href, name, landscape, municipal) {
	//TODO: This is duplicated in php, need to be changed there as well
	return "<div class=\"search_result_item\"><a href=\"" + href + "\"><div class=\"search_result_item_inner\"><strong>" + name + "</strong> <br />Ligger i " + landscape + ", " + municipal + "</div></a></div>";
}

$(document).ready(function() {
	
	$('.change_descr').live('click', function(event) {
		event.preventDefault();
		
		waterId = $('#water_info_text_edit').text();
		
		$('#water_info_text_edit').css('height', Math.max($('#water_info_text').innerHeight(), 250));
		$('#water_info_text').hide();
		
		$('#water_info_load').show();
		timeOut = setTimeout(function() {
			displayError('Oj, det verkar som att vi har lite tillfälliga problem, försök gärna igen eller lite senare.<br />Ladda om sidan för att se orginalet.');
		}, 10000);
		
		$.post('/ajax/fiskeplats',
				{id: waterId},
				function(data){
					ajaxGotWater(data);
				});
	});
	
	$('#save_descr').live('click', function(event) {
		event.preventDefault();
		
		$('#water_info_edit').hide();
		$('#save_descr').hide();
		
		$('#water_info_load').show();
		timeOut = setTimeout(function() {
			displayError('Oj, det verkar som att vi har lite tillfälliga problem, försök gärna igen eller lite senare.<br />Ladda om sidan för att se orginalet.');
		}, 10000);
		
		var wikiInfo = $('#water_info_text_edit').val();
		
		$.post('/ajax/red_fiskeplats',
				{id: waterId, wiki_info: wikiInfo, name: "TODO: Fetch name..", email: "TODO: ..and email"},
				function(data){
					ajaxSavedWater(data);
				});
		
	});
	
	$('#save_new_fishingplace').live('click', function(event) {
		event.preventDefault();
		
		$('#save_new_fishingplace').hide();
		
		timeOut = setTimeout(function() {
			displayError('Oj, det verkar som att vi har lite tillfälliga problem, försök gärna igen eller lite senare.');
		}, 10000);
		
		var title = $('#title_input').val();
		var wikiInfo = $('#water_info_text_edit').val();
		
		var lat = 0;
		var lng = 0;
		var zoom = 5;
		
		if (map) {
			lat = map.getCenter().lat();
			lng = map.getCenter().lng();
			zoom = map.getZoom();
		}
		
		$.post('/ajax/add_fiskeplats',
				{title: title, wiki_info: wikiInfo, latitude: lat, longitude: lng, zoom: zoom},
				function(data){
					clearTimeout(timeOut);
					displaySuccess(data);
					$('#save_new_fishingplace').show();
				});
		
	});
	
	$('#sok_input').live("keyup", function(e) {
		if(e.keyCode==13){
			var search_word = $('#sok_input').val();
	
	
			$.post("/index.php/ajax/sok", 
						{ search_word: search_word }, 
						function(json){
							displaySearchWater(json);
						}, "json");
		}
	});
	
	
	$('#add_map_marker').live("click", function(event) {
		event.preventDefault();
		
		displayMessage($('#test_1').val());
		
		if (map) {
			$('#water_map_box').expose({ closeOnEsc: false, closeOnClick: false });
			
			var infowindow = new google.maps.InfoWindow({content: "Beskrivning:<br /><textarea id=\"test_1\" cols=20 rows=5></textarea>"});
	
			var marker = new google.maps.Marker({
				position: map.getCenter(),
				map: map,
				title: "Ny, flytta mig",
				draggable: true
			});
	
			google.maps.event.addListener(marker, 'click', function() {
				infowindow.open(map,marker);
			});
			
			markers.push(marker);
		}
	});

});










/**************************************************************************************
 * Expose
 */
/**
 * @license 
 * jQuery Tools 1.2.3 / Expose - Dim the lights
 * 
 * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
 * 
 * http://flowplayer.org/tools/toolbox/expose.html
 *
 * Since: Mar 2010
 * Date:    Mon Jun 7 13:43:53 2010 +0000 
 */
(function($) { 	

	// static constructs
	$.tools = $.tools || {version: '1.2.3'};
	
	var tool;
	
	tool = $.tools.expose = {
		
		conf: {	
			maskId: 'exposeMask',
			loadSpeed: 'slow',
			closeSpeed: 'fast',
			closeOnClick: true,
			closeOnEsc: true,
			
			// css settings
			zIndex: 9998,
			opacity: 0.8,
			startOpacity: 0,
			color: '#333', //TODO: Andy: Was #fff for white background
			
			// callbacks
			onLoad: null,
			onClose: null
		}
	};

	/* one of the greatest headaches in the tool. finally made it */
	function viewport() {
				
		// the horror case
		if ($.browser.msie) {
			
			// if there are no scrollbars then use window.height
			var d = $(document).height(), w = $(window).height();
			
			return [
				window.innerWidth || 							// ie7+
				document.documentElement.clientWidth || 	// ie6  
				document.body.clientWidth, 					// ie6 quirks mode
				d - w < 20 ? w : d
			];
		} 
		
		// other well behaving browsers
		return [$(document).width(), $(document).height()]; 
	} 
	
	function call(fn) {
		if (fn) { return fn.call($.mask); }
	}
	
	var mask, exposed, loaded, config, overlayIndex;		
	
	
	$.mask = {
		
		load: function(conf, els) {
			
			// already loaded ?
			if (loaded) { return this; }			
			
			// configuration
			if (typeof conf == 'string') {
				conf = {color: conf};	
			}
			
			// use latest config
			conf = conf || config;
			
			config = conf = $.extend($.extend({}, tool.conf), conf);

			// get the mask
			mask = $("#" + conf.maskId);
				
			// or create it
			if (!mask.length) {
				mask = $('<div/>').attr("id", conf.maskId);
				$("body").append(mask);
			}
			
			// set position and dimensions 			
			var size = viewport();
				
			mask.css({				
				position:'absolute', 
				top: 0, 
				left: 0,
				width: size[0],
				height: size[1],
				display: 'none',
				opacity: conf.startOpacity,					 		
				zIndex: conf.zIndex 
			});
			
			if (conf.color) {
				mask.css("backgroundColor", conf.color);	
			}			
			
			// onBeforeLoad
			if (call(conf.onBeforeLoad) === false) {
				return this;
			}
			
			// esc button
			if (conf.closeOnEsc) {						
				$(document).bind("keydown.mask", function(e) {							
					if (e.keyCode == 27) {
						$.mask.close(e);	
					}		
				});			
			}
			
			// mask click closes
			if (conf.closeOnClick) {
				mask.bind("click.mask", function(e)  {
					$.mask.close(e);		
				});					
			}			
			
			// resize mask when window is resized
			$(window).bind("resize.mask", function() {
				$.mask.fit();
			});
			
			// exposed elements
			if (els && els.length) {
				
				overlayIndex = els.eq(0).css("zIndex");

				// make sure element is positioned absolutely or relatively
				$.each(els, function() {
					var el = $(this);
					if (!/relative|absolute|fixed/i.test(el.css("position"))) {
						el.css("position", "relative");		
					}					
				});
			 
				// make elements sit on top of the mask
				exposed = els.css({ zIndex: Math.max(conf.zIndex + 1, overlayIndex == 'auto' ? 0 : overlayIndex)});			
			}	
			
			// reveal mask
			mask.css({display: 'block'}).fadeTo(conf.loadSpeed, conf.opacity, function() {
				$.mask.fit(); 
				call(conf.onLoad);
			});
			
			loaded = true;			
			return this;				
		},
		
		close: function() {
			if (loaded) {
				
				// onBeforeClose
				if (call(config.onBeforeClose) === false) { return this; }
					
				mask.fadeOut(config.closeSpeed, function()  {					
					call(config.onClose);					
					if (exposed) {
						exposed.css({zIndex: overlayIndex});
					}				
				});				
				
				// unbind various event listeners
				$(document).unbind("keydown.mask");
				mask.unbind("click.mask");
				$(window).unbind("resize.mask");
	
				loaded = false;
			}
			
			return this; 
		},
		
		fit: function() {
			if (loaded) {
				var size = viewport();				
				mask.css({width: size[0], height: size[1]});
			}				
		},
		
		getMask: function() {
			return mask;	
		},
		
		isLoaded: function() {
			return loaded;	
		}, 
		
		getConf: function() {
			return config;	
		},
		
		getExposed: function() {
			return exposed;	
		}		
	};
	
	$.fn.mask = function(conf) {
		$.mask.load(conf);
		return this;		
	};			
	
	$.fn.expose = function(conf) {
		$.mask.load(conf, this);
		return this;			
	};


})(jQuery);


