/*
if(!console) {
	var console = {};
	console.info = function(){};
}
*/
// Declare your own namespace
var AVH = window.AVH || {};

/* copied from yahoo.js */
AVH.namespace = function( sNameSpace ) {

	if (!sNameSpace || !sNameSpace.length) {
		return null;
	}

	var levels = sNameSpace.split(".");

	var currentNS = AVH;

	// YAHOO is implied, so it is ignored if it is included
	for (var i=(levels[0] == "AVH") ? 1 : 0; i<levels.length; ++i) {
		currentNS[levels[i]] = currentNS[levels[i]] || {};
		currentNS = currentNS[levels[i]];
	}

	return currentNS;
};

AVH.namespace('kap');



AVH.kap.map = function() {
	var bounds = {
		LatMax: -22.095819717807696,
		LatMin: -34.732584206123626,
		LonMax: 32.98095703125,
		LonMin: 16.787109375
	};
	/*var groups = null;
	var city = null;*/
	var data = null;
	var map = null;
	var startPoint = null;

	var placeIcon = {
		img: 'o.png',
		width: 25,
		height: 25,
		obj: null
	};
	var hotelIcons = null;
	var maxZoom = 8;
	var minZoom = 13;
	var startZoom = 12;

	var placeImage = null;

	var $D = YAHOO.util.Dom;
	var $E = YAHOO.util.Event;

	var base = '';
	
	var backButtonActive = false;

	function trim(sString) {
		while (sString.substring(0,1) == ' ') {
			sString = sString.substring(1, sString.length);
		}
		while (sString.substring(sString.length-1, sString.length) == ' ') {
			sString = sString.substring(0,sString.length-1);
		}
		return sString;
	}


	var Cookie = {
		data : {
			lat: 0.0,
			lon: 0.0,
			mode: 'Place',
			zoom: 0,
			item: null
		},
		set : function(_lat,_lon, _mode, _zoom) {
			this.data.lat = _lat;
			this.data.lon = _lon;
			this.data.mode = _mode;
			this.data.zoom = _zoom;
			//console.info('cookie-set', this);
			return;
		},
		setItem : function(item_) {
			this.data.item = item_;
		},
		save : function() {
			/*var c = '';
			for(var i in this.data) {
				c+= i + ':' + this.data[i] + '-';
			}
			c = c.substr(0,c.length-1);*/
			var c = YAHOO.json.to(this.data);
			var ex = new Date();
			ex.setTime(ex.getTime() + 5*60*1000); // 5 Minuten
			document.cookie = 'UAD_JS=' + c + ';expires=' + ex.toGMTString() + ';';
			//console.info('cookie-save', document.cookie);
			delete ex;
			return;
		},
		init: function() {
			var ret = false;
			if(navigator.cookieEnabled) {
				var c = null;
				var t = document.cookie.split(';');
				for(var i in t) {
					if(t[i].search(/UAD_JS=/) != -1) {
						c = trim(t[i]).split('=');
						break;
					}
				}
				if(c != null) {
					this.data = c[1].parseJSON();
					ret = true;
				}

			}
			//console.info('cookie-init', this, t);
			return ret;
		},
		event: function(ev) {
			//console.info('event', this,ev);
			this.data.lat = ev.thisObj.YGeoPoint.Lat;
			this.data.lon = ev.thisObj.YGeoPoint.Lon;
			this.data.zoom = ev.thisObj.zoomLevel;
			//this.set(ev.thisObj.YGeoPoint.Lat, ev.thisObj.YGeoPoint.Lon, 'Place', ev.thisObj.zoomLevel);
			this.save();

		}
	};
	return {
		init: function() {
			// Create a lat/lon object
			startPoint =  new YGeoPoint(-31.62532121329918,24.4775390625);
			var init = Cookie.init();

			if(!init) {
				Cookie.set(startPoint.Lat, startPoint.Lon, 'Place', 12, null);
			}

			// Create a map object
			map = new YMap(YAHOO.util.Dom.get('mapContainer'), YAHOO_MAP_REG);
			// Display the map centered on a latitude and longitude
			map.drawZoomAndCenter(new YGeoPoint(Cookie.data.lat, Cookie.data.lon), Cookie.data.zoom);

			// Add a pan control
			map.addPanControl();
			map.addNavigatorControl();

			// Add a slider zoom control
			map.addZoomLong();
			map.setZoomRange(maxZoom,minZoom);

			// Disable navigation via <- -> ^ etc
			map.disableKeyControls();
			map.disablePanOnDoubleClick()


			for(var i in categories) {
				categories[i]['obj'] = new YImage(base + 'img/markers/' + categories[i].image, new YSize(25,25), new YCoordPoint(10,10),new YCoordPoint(-6,1));
				categories[i]['active'] = true;
			}

			// create Images:
			placeIcon = new YImage(base + 'img/markers/o.png', new YSize(25,25), new YCoordPoint(10,10),new YCoordPoint(-6,1));
			hotelIcons = categories;

			// base path laden
			base = document.getElementsByTagName('base')[0].href;

			YEvent.Capture(map, EventsList.endPan, this.moveEv, this);
			YEvent.Capture(map, EventsList.changeZoom , this.changeZoom, this);
			YEvent.Capture(map, EventsList.endMapDraw, Cookie.event, Cookie);
			YEvent.Capture(map, EventsList.endPan, Cookie.event, Cookie);



			var callback = {
				success: this.onSuccess,
				failure: this.onFailure,
				argument: [this,init]
			};
			YAHOO.util.Connect.asyncRequest('GET', base + 'xml/places/', callback);
			//map.addZoomScale();
/*
			Navigator.prototype.synch=function()
			{
				if(!this._mapParent) {return;}
				var z=this._mapParent.getZoomLevel()+4;
				var p=this._mapParent.getCenterLatLon();
				if(z>17){z=17;}
				if(!this._mapControl)
				{
					this._mapControl=new YMap(this.mapDiv);
					this._mapControl.drawZoomAndCenter(p,z);
					this._mapControl.disableCopyright();
					for(var _o in this._mapControl._coordTable)
					{
						this._mapControl.removeOverlay(_o);
					}
					this._mapControl.removeZoomScale();
				}
				else
				{
					this._mapControl.drawZoomAndCenter(p,z);
				}
				var ps=this._mapParent.getPortSize();
				var w=Math.round(ps.width/16);
				var h=Math.round(ps.height/16);
				var t=Math.round(this._map._height/2-h/2+this._map._top);
				var l=Math.round(this._map._width/2-w/2+this._map._left);
				this._thumb.setStyle(
				{
					height:h,width:w,left:l,top:t
				}
				);
				this._thumb.maxx=this._map._left+this._map._width-this._thumb._width;
				this._thumb.maxy=this._map._top+this._map._height-this._thumb._height;
			};
			Navigator.prototype._panHandler=function(that) {}
*/
		},
		onSuccess: function(ev) {
			var json = ev.responseText.split('<!--')[0];
			data = json.parseJSON();
			var t = null;
			//console.info(this);
			if(Cookie.data.mode == 'Hotel') {
				t = this.argument[0].addMarkers('Hotel', Cookie.data.item);
				this.argument[0].addBackButton();
			} else {
				if(this.argument[1]) {
					this.argument[0].addMarkers(Cookie.data.mode);
				} else {
					t = this.argument[0].addMarkers(Cookie.data.mode);
				}
			}
			if(t !== null) {
				map.drawZoomAndCenter(t.YGeoPoint, t.zoomLevel);
			}
		},
		_addMarker: function(obj, item, img, add) {
			var gPoint = new YGeoPoint(obj.lat, obj.lon);
			var marker = new YMarker(gPoint, img);
			marker.addAutoExpand('<h3>' + obj.name + add + '</h3>');
			marker.setSmartWindowColor('orange');
			marker.item = item;
			//console.info(marker);
			$D.setStyle(marker.imgdom, 'cursor', 'pointer');
			//$D.setStyle(marker.dom.lastChild.lastChild, 'zIndex', 1000);
			/*YEvent.Capture(marker, EventsList.openExpanded, function(ev, o) {
			$D.setStyle(this.dom.lastChild, 'zIndex', 1000);
			console.info(this,ev,this.dom.lastChild);
			});*/
			map.addOverlay(marker);
			return {'marker': marker, 'gPoint': gPoint};
		},
		_addHotelMarker: function(obj, i,j) {
			//console.info('_addHotelMarker', obj,i,j);
			var t = this._addMarker(obj, ['Hotel' ,i, j] , hotelIcons['i' + data[i]['Hotel'][j].category_id].obj, '');
			t.marker._expContent += '<img src="img/hotels/sml/' + data[i]['Hotel'][j].image_id + '.jpg" />';
			//console.info(t.marker);
			YEvent.Capture(t.marker, EventsList.MouseClick, this.clickHotelMarker, this);
			return t.gPoint;
		},
		_addPlaceMarker: function(obj, i) {
			var t = this._addMarker(obj, ['Hotel', i], placeIcon, " ("  + data[i]['Hotel'].length + ")");
			YEvent.Capture(t.marker, EventsList.MouseClick, this.clickCity, this);
			return t.gPoint;
		},
		addMarkers: function(mode, item) {
			//console.info('addMarkers',this,mode,item);
			var gPoints = [];
			Cookie.data.mode = mode;
			//var zoomCenter = true;
			if(mode == 'Place') {
				for(var i in data) {
					gPoints.push(this._addPlaceMarker(data[i]['Place'],i));
				}
			} else if (mode == 'Hotel') {
				for(var i in data[item][mode]) {
					gPoints.push(this._addHotelMarker(data[item][mode][i], item, i));
				}
			} else if (mode == 'AllHotels') {
				for(var i in data) {
					for(var j in data[i]['Hotel']) {
						this._addHotelMarker(data[i]['Hotel'][j], i,j);
					}
				}
				this.addBackButton();
			//	zoomCenter = false;
			} else {
				//console.error('totaler Mist!');
			}
			//if(zoomCenter) {
			var t = map.getBestZoomAndCenter(gPoints);
			if(t.zoomLevel < startZoom) {t.zoomLevel++;}
			if(t.zoomLevel < maxZoom) {t.zoomLevel = maxZoom;}
			//	map.drawZoomAndCenter(t.YGeoPoint, t.zoomLevel);
			//}
			return t;

		},
		clickCity: function(e) {
			//console.info('clickCity', this,e);
			map.removeMarkersAll();
			Cookie.data.mode = e.thisObj.item[0];
			Cookie.data.item = e.thisObj.item[1];
			var t = this.addMarkers(e.thisObj.item[0], e.thisObj.item[1]);
			map.drawZoomAndCenter(t.YGeoPoint, t.zoomLevel);
			this.addBackButton();
		},
		addBackButton: function() {
			if(!backButtonActive) {
				backButtonActive = true;
			
				// Add a back button
				overlay = YUtility.createNode('div','backbutton');
				overlay.innerHTML = "Übersicht";
				YUtility.setStyle(overlay, {opacity: 0.7});
				//console.info('overlay',overlay);
				map.addOverlay(new YCustomOverlay(new YCoordPoint(10,10), overlay));
				YAHOO.util.Event.addListener('backbutton', 'click', this.clickBackButton, this, true);
			}
		},
		clickHotelMarker: function(ev) {
			var i = ev.thisObj.item;
			window.location.href = base + 'unterkuenfte/view/' + data[i[1]][i[0]][i[2]].webname;
		},
		clickBackButton: function(ev) {
			//console.info('backButton', this, ev,map);
			map.removeMarkersAll();
			var t = this.addMarkers('Place');
			map.drawZoomAndCenter(t.YGeoPoint, t.zoomLevel);
			YAHOO.util.Event.removeListener('backbutton', 'click', this.clickBackButton);
			map.removeOverlay('backbutton');
			backButtonActive = false;
		},
		moveEv: function(ev) {
			var lat = ev.YGeoPoint.Lat;
			var lon = ev.YGeoPoint.Lon;
			var pan = false;

			if(!(bounds.LatMin < ev.YGeoPoint.Lat)) {
				pan = true;
				lat = bounds.LatMin;
			}

			if(!(ev.YGeoPoint.Lat < bounds.LatMax)) {
				pan = true;
				lat = bounds.LatMax;
			}

			if(!(bounds.LonMin < ev.YGeoPoint.Lon)) {
				pan = true;
				lon = bounds.LonMin;
			}
			if(!(ev.YGeoPoint.Lon < bounds.LonMax)) {
				pan = true;
				lon = bounds.LonMax;
			}

			if(pan) {
				map.drawZoomAndCenter(new YGeoPoint(lat,lon), map.zoomLevel);
			}
		},
		changeZoom: function(ev) {
			//console.info(this,ev, map.zoomLevel);
			if(ev.zoomObj.current < 10 && ev.zoomObj.current < ev.zoomObj.previous) { //add more logic
				map.removeMarkersAll();
				this.addMarkers('AllHotels');
			} else if(ev.zoomObj.current >= 10 && ev.zoomObj.current > ev.zoomObj.previous) {
				map.removeMarkersAll();
				this.addMarkers('Place');
			}
		}
	};
}();

YAHOO.util.Event.addListener(window, 'load', AVH.kap.map.init, AVH.kap.map,true);