/**
 * 1
 * @author Fredrik Stöckel, Exait AB, fredrik.stockel@exait.se
 */
var MapObject = function() {
	
	var BASE_PATH			= '/SWEDEN/restsite.nsf';
	var MARKER_URL 			= BASE_PATH + '/markers?ReadForm';
	var POI_URL				= BASE_PATH + '/getCoordFile?OpenAgent';
	var map 				= null;
	var markers 			= new Object();
	var mLength				= 0;
	var JSONObj				= null;
	var geocoder;
	var    gdir;
	var defLatLng			= new GLatLng(60.67391, 17.14104);
	var defIcon 			= new GIcon();
	defIcon.image 			= BASE_PATH + '/marker-icon-dot.png';
	defIcon.shadow 			= BASE_PATH + '/marker-transparent-dot.png';
	defIcon.transparent		= BASE_PATH + '/marker-icon-dot.png';
	defIcon.iconSize 			= new GSize(14, 14); 
	defIcon.shadowSize		= new GSize(14, 14);
	defIcon.iconAnchor 		= new GPoint(7, 7);
	defIcon.infoWindowAnchor 	= new GPoint(2, 35);
	
	var miniIcon 			= new GIcon();
	miniIcon.image 			= BASE_PATH + '/marker-icon-logo.png';
	miniIcon.shadow 			= BASE_PATH + '/marker-transparent-logo.png';
	miniIcon.transparent		= BASE_PATH + '/marker-icon-logo.png';
	miniIcon.iconSize 		= new GSize(25, 25); 
	miniIcon.shadowSize		= new GSize(25, 25);
	miniIcon.iconAnchor 		= new GPoint(0, 0);
	miniIcon.infoWindowAnchor 	= new GPoint(0, 0);
	var currentPos = null;
	
	function createMarker(pos, md) {
		
		var opts = { 
				"icon": defIcon,
				"clickable": true,
				"title": md.city +': ' + md.name,
				"labelOffset": new GSize(-6, -10)
			};
		
		var marker = new GMarker(pos, opts);
		marker.categories = md.categories != '' ? md.categories.split(',') : [];
		if(md.opennow){marker.categories.push("opennow"); };
		marker.id = 'id-' + md.rid;
		marker.unid = md.unid;
		GEvent.addListener(marker, "click", function() {
			marker.openExtInfoWindow(
				map,
				'map-dialog',
				'<div id="loading"> Hämtar restauranginformation, vänligen vänta...</div>',
				{
					beakOffset: 3,
					ajaxUrl: BASE_PATH + '/details.html?ReadForm&unid=' + md.unid
				}
			);
			MapObject.setPoint(pos);
		}); 
		// markers.push(marker);
		markers[marker.id] = marker;
		mLength++;
		return marker;
	};
	function addMarkersRest(resp) {
		JSONObj 	= eval('(' + resp + ')');
		var md 	= null; // marker data
		var pos	= null;
		var len 	= JSONObj.markers.length;
		
		for (var i = 0; i < len; i++) {
			md = JSONObj.markers[i];
			if((Number(md.lat) != currentPos.lat()) && (Number(md.lng) != currentPos.lng())) {
				pos = new GLatLng(Number(md.lat), Number(md.lng));
				map.addOverlay(createMarker(pos, md));
			}
		}
		initRestUI();
	};
	
	function addMarkers(resp) {
		JSONObj 	= eval('(' + resp + ')');
		var md 	= null; // marker data
		var pos	= null;
		var len 	= JSONObj.markers.length;
		
		for (var i = 0; i < len; i++) {
			md = JSONObj.markers[i];
			pos = new GLatLng(Number(md.lat), Number(md.lng));
			map.addOverlay(createMarker(pos, md));
		}
		initUI();
	};
	function initRestUI() {
		// enable search
		$('#dir-search-button').click(function(event) {
			MapObject.getDirections();
			event.preventDefault();
		});
		// enable gps downloads
		$('#tools-pois').click(function(event) {
			var gps = $('#gps-dialog');
			var pos = $(this).offset();
			var width = $(this).width();
						
			var pos = $(this).offset();            
       		var bWidth = $(this).outerWidth();        
        		var dWidth = gps.outerWidth();  
			var dHeight = gps.outerHeight(); 
        		var left = (pos.left + bWidth - dWidth + 50) + "px";        
        		var top = (pos.top - dHeight + 10) + "px";
			gps.css({left: left, top: top});
			if($(this).hasClass('button-on')) {
				gps.hide();
				$(this).removeClass('button-on');
				//MapObject.closeDialogWindow('gps-dialog');
				this.blur();
				} else {
					$(this).addClass('button-on');
					gps.show('fast');
				}
				event.preventDefault();
				this.blur();
			});
		$('.gps-dialog-close').click(function(event) {
			MapObject.closeDialogWindow('gps-dialog');
			$('#tools-pois').removeClass('button-on');
			event.preventDefault();
		});
		$('#coord-files-download').click(function(event) {
			var val = $('#coord-files-list').val();
			if(val !='') {
				window.location.href = POI_URL + '&out=' + val;
			}
			event.preventDefault();	
			this.blur();
		});
	};
	function initUI() {
		$('form').live('submit', function() { return false;});
		// add event handers to filter buttons
		$('#button-options-top').show('slow').find('a').click(function(event){
			var active = [];
			if($(this).hasClass('button-on')) {
				$(this).removeClass('button-on');
				this.blur();
			} else {
				$(this).addClass('button-on');
			};
			
			$('#button-options-top').find('a.button-on').each(function() {
				active.push((this.id.split("-"))[1]);
			});
			MapObject.toogleFilter(active);
			event.preventDefault();
		});
		$('.dir-dialog-close').click(function(event) {
			MapObject.closeDialogWindow('dir-dialog');
			MapObject.closeDialogWindow('directions-result-dialog');
			$('#tools-dir').removeClass('button-on');
			event.preventDefault();
		});
		$('.info-dialog-close').click(function(event) {
			MapObject.closeDialogWindow('instructions-box');
			event.preventDefault();
		});
		$('.dir-result-close').click(function(event) {
			MapObject.closeDialogWindow('directions-result-dialog');
			event.preventDefault();
		});
		
		$('.gps-dialog-close').click(function(event) {
			MapObject.closeDialogWindow('gps-dialog');
			$('#tools-pois').removeClass('button-on');
			event.preventDefault();
		});
		
		$('#tools-dir').click(function(event) {
			//var dir = $('#dir-dialog');
			var dir = document.getElementById('dir-dialog');
			if($(this).hasClass('button-on')) {
				//dir.hide();
				dir.style.display = 'none';
				$(this).removeClass('button-on');
				MapObject.closeDialogWindow('directions-result-dialog');
				this.blur();
			} else {
				$(this).addClass('button-on');
				dir.style.display = 'block';
				//dir.show('300');
				//var o = document.getElementById('dir-from');
				//o.focus();
			}
			event.preventDefault();
		});
		$('#dir-dialog .text-field').keypress(function(event) {
			if(event.keyCode == '13') {
				 $('#dir-search').click();
				 return false;
			}
		});
		$('#tools-search').click(function(event) {
			var val = document.getElementById('searchfield').value;
			if(val && val !='') {
				MapObject.search(val);
			}
			event.preventDefault();
			this.blur();
		});
		$('#button-options-bottom').show();
		$('#tools-dir').click();
		$('#searchfield').autocomplete(JSONObj.markers, {
		minChars: 3,
		width: 310,
		delay: 20,
		matchContains: true,
		matchSubset: false,
		autoFill: false,
		formatItem: function(row, i, max) {
			return row.city + ", " + row.name;
		},
		formatMatch: function(row, i, max) {
			return row.city+ ", " + row.name;
		},
		formatResult: function(row) {
			return row.city + ", " + row.name;
		}
		}).result(function(e, row) {
			MapObject.showMarker('id-' + row.rid);
		});
		$('#dir-search').click(function(event) {
			MapObject.getDirections();
			event.preventDefault();
			this.blur();
		});
		$('#tools-pois').click(function(event) {
			var gps= $('#gps-dialog');
			if($(this).hasClass('button-on')) {
				gps.hide();
				$(this).removeClass('button-on');
				//MapObject.closeDialogWindow('gps-dialog');
				this.blur();
			} else {
				$(this).addClass('button-on');
				gps.show('fast');
			}
			event.preventDefault();
			this.blur();
		});
		$('#coord-files-download').click(function(event) {
			var val = $('#coord-files-list').val();
			if(val !='') {
				window.location.href = POI_URL + '&out=' + val;
			}
			event.preventDefault();	
			this.blur();
		});
	};
	function initDirections(strFrom, strTo, loc) {
		loc = loc || 'sv';
		if(!gdir) {
			gdir = new GDirections(map, document.getElementById('directions'));
			GEvent.addListener(gdir, "load", onGDirectionsLoad);
        		GEvent.addListener(gdir, "error", handleErrors);
		} 
		gdir.clear();
    		gdir.load("from: " + strFrom+ " to: " + strTo,{ "locale": loc});
	
	};
	function onGDirectionsLoad() {
			$('#directions-result-dialog').show('slow');
		
	};
	function handleErrors() {
			if (gdir.getStatus().code == 604) {
			alert("Det gick inte att hitta någon geografisk plats för den angivna adressen,\nNi kan alltid prova att förfina sökningen genom att te x även lägga till ort och land");
			} else {
			alert("Det gick inte att hitta någon geografisk plats för den angivna adressen,\nNi kan alltid prova att förfina sökningen genom att te x även lägga till ort och land");
			}
	};
	return {
		
		toogleFilter: function(lookfor) {
			var len = mLength;
			var searchval;
			var m;
			var mCnt;
			var hits = 0;
			var catCnt = lookfor.length;
			if(lookfor.toString() == '') {
				for(i in markers) { m = markers[i];if(m.isHidden()){m.show()};} 
			} else {
				for(i in markers) {
					m = markers[i];
					mCnt = m.categories.length;
					hits = 0;
					searchval = m.categories.toString();
					if(!(catCnt > mCnt)) {
						for(var x = 0; x < lookfor.length; x++) {
							if(searchval.match(lookfor[x]) != null) {
								hits++;
							}
							if(hits == catCnt){
								if(m.isHidden()){ m.show();};
								break;
							}
						}
					}
					if(!(hits == catCnt) && !m.isHidden()) m.hide();
				}
			}
		},
		search: function(q) { 
				if(q != '') {
					geocoder = geocoder || new GClientGeocoder();
					geocoder.getLatLng(q, MapObject.showSearchResult);
				}
		},
		showSearchResult: function(arg) {
			if(arg){
				var opts = { 
					//"icon": defIcon,
					"clickable": false,
					"title": "Sökresultat för " + document.getElementById('searchfield').value,
					"labelOffset": new GSize(-6, -10)
				};
				map.setCenter(arg, 13);
      	  			var  m = new GMarker(arg, opts);
        				map.addOverlay(m);
			} else {
				alert('Sökningen gav ingen träff på kartan');
			}
		},
		getDirections: function() {
				var from 	= document.getElementById('dir-from').value;
				var toObj 	= document.getElementById('dir-to');
				var to	= toObj != null ? toObj.value : currentPos;
				
				if(from != '' && to != '') {	
					initDirections(from, to);
				}
		},
		closeDialogWindow: function(oid) {
			oid = '#' + oid;
			$(oid).hide();
			return false;
		},
		setPoint:function(pos) { currentPos = pos; },
		showDialog: function() {
			var mini_map = new GMap2(document.getElementById("mini-map")); 
			mini_map.addControl(new GSmallZoomControl()); 
			mini_map.setCenter(currentPos,13); 
			var m = new GMarker(currentPos, {"icon": miniIcon});
			mini_map.addOverlay(m);  
			map.getExtInfoWindow().resize();    
		},
		showMarker: function(id) {
			var m = markers[id];
			if(m) {
				MapObject.setPoint(m.getLatLng()); 
				map.panTo(currentPos); 
				m.show();
				m.openExtInfoWindow(
					map,
					'map-dialog',
					'<div id="loading">Hämtar restauranginformation, vänligen vänta...</div>',
					{
						beakOffset: 3,
						ajaxUrl: BASE_PATH + '/details.html?ReadForm&unid=' + m.unid
					}
				);
				map.getExtInfoWindow().resize();
			}
		},
		
		init: function(mapId, posObj) {
			if(GBrowserIsCompatible()) {
				mapId = mapId || "map-area";
				map = new GMap2(document.getElementById(mapId));
				map.addMapType(G_PHYSICAL_MAP);
				//map.removeMapType(G_HYBRID_MAP);
				map.setMapType(G_PHYSICAL_MAP);
				map.addControl(new GLargeMapControl());
				map.addControl(new GMapTypeControl());
				if(posObj) {
					//lat, lng
					var pos = new GLatLng(Number(posObj[0]), Number(posObj[1])); 
					map.setCenter(pos, 15);
					MapObject.setPoint(pos);
					var m = new GMarker(pos, {"icon": miniIcon});
					map.addOverlay(m);
					
					// load the markers
					GDownloadUrl(MARKER_URL, addMarkersRest);
					GEvent.addDomListener(map, 'extinfowindowupdate',function(){
						MapObject.showDialog();
					});
				} else {
					// set default center
					map.setCenter(defLatLng, 5);
					// load the markers
					GDownloadUrl(MARKER_URL, addMarkers);
					GEvent.addDomListener(map, 'extinfowindowupdate',function(){
						MapObject.showDialog();
					});
				}
			} else {
				var msg = "Opps...er webbläsare är inte kompatibel Google Maps som denna tjänst använder sig av!";
				document.getElementById(mapId).innerHTML = msg;
			}
		}
		
	}
}();
