var SAALBACH_MAP = {
	initParams: {},
	
	
	init: function(initParams) {
		this.initParams = initParams||this.initParams;
		
		// merge params
		if( initParams.layoutParams ) { // merge layout properties
			this.common.mergeProperties(this.layout.layoutParams, initParams.layoutParams);
		}
		
		if( initParams.mapParams ) { // merge map properties
			this.common.mergeProperties(this.GMaps.mapParams, initParams.mapParams);
		}
		
		// init layout
		this.layout.initLayout();
		
		// init map
		this.GMaps.initMap();
		
		// add event listener
		this.eventHandlers.addEventHandler({ // window resize listener
			targetObj: window,
			event:	'resize',
			eventIE: 'onresize',
			handler: this.eventHandlers.windowResize,
			callback: function() {}
		});
		
		// event listener for onunload
		this.eventHandlers.addEventHandler({ // unload listener
			targetObj: window,
			event:	'unload',
			eventIE: 'onunload',
			handler: GUnload
		});
	},
	
	
	
	common: {
		debug: function(debugObj, debugHint) {
			debugObj = debugObj||false;
			debugHint = debugHint||'';
			
			if( typeof console != 'undefined' ) {
				console.log('-----------------------------------');
				if (debugHint.length > 0) {
					console.log(debugHint);
				}
				console.log(debugObj);
				console.log('-----------------------------------');
			}
		},
		
		mergeProperties: function( origPropObj, newPropObj ) {
			for( var prop in newPropObj ) {
				origPropObj[prop] = newPropObj[prop];
			}
		},
		
		countObject: function(obj) {
			var j = 0;
			for( var i in obj ) {
				j++;
			}
			return j;
		}
	},
	
	
	
	eventHandlers: {
		addEventHandler: function(handlerParams) {
			if (handlerParams.targetObj.addEventListener) {
				handlerParams.targetObj.addEventListener (handlerParams.event, function() {
					handlerParams.handler(handlerParams);
				}, false);
				
			}
			else if( handlerParams.targetObj.attachEvent ) {
				handlerParams.targetObj.attachEvent(handlerParams.eventIE, function() {
					handlerParams.handler(handlerParams);
				});
			}
		},
		
		windowResize: function(p) {
			SAALBACH_MAP.layout.initLayout();
			p.callback();
		}
	},
	
	
	
	layout: {
		layoutParams: {
			type: 'default'
		},
		
		initLayout: function(type) {
			type = type||this.layoutParams.type;
			
			switch(type) {
				case 'fullscreen': this.initFullscreen(); break;
				default: this.initDefault();
			}
		},
		
		initDefault: function() {},
		
		initFullscreen: function() {
			var viewportDimensions = this.getViewport();
			this.setBodySize({
				width: viewportDimensions.width+'px',
				height: viewportDimensions.height+'px'
			});
		},
		
		getViewport: function() {
			var viewportWidth;
			var viewportHeight;
			
			if (typeof window.innerWidth != 'undefined') {
				viewportWidth  = window.innerWidth;
				viewportHeight = window.innerHeight;
			}
			else if(typeof document.documentElement != 'undefined'
					&& typeof document.documentElement.clientWidth != 'undefined'
					&& document.documentElement.clientWidth != 0) {
				viewportWidth  = document.documentElement.clientWidth;
				viewportHeight = document.documentElement.clientHeight;
			}
			else {
				viewportWidth  = document.getElementsByTagName('body')[0].clientWidth;
				viewportHeight = document.getElementsByTagName('body')[0].clientHeight;
			}
			
			//SAALBACH_MAP.common.debug( { width: viewportWidth, height: viewportHeight }, 'viewport vor' );
			//SAALBACH_MAP.common.debug( SAALBACH_MAP.initParams, 'param' );
			
			if( SAALBACH_MAP.initParams.layoutParams.adjustViewportHeight != undefined ) {
				viewportHeight = viewportHeight - SAALBACH_MAP.initParams.layoutParams.adjustViewportHeight;
			}
			if( SAALBACH_MAP.initParams.layoutParams.adjustViewportWidth != undefined ) {
				viewportWidth = viewportWidth - parseInt(SAALBACH_MAP.initParams.layoutParams.adjustViewportWidth);
			}
			//SAALBACH_MAP.common.debug( { width: viewportWidth, height: viewportHeight }, 'viewport nach' );
			
			return { width: viewportWidth, height: viewportHeight };
		},
		
		setBodySize: function(dimensions) {
			document.getElementsByTagName('body')[0].style.width = dimensions.width;
			document.getElementsByTagName('body')[0].style.height = dimensions.height;
		}
	},
	
	
	GMaps: {
		mapParams: {
			//map: false,
			canvasId: 'map_canvas',
			mapStartLat: 47.3900838,
			mapStartLng: 12.6545333,
			mapStartZoomLevel: 13,
			mapTypes: [G_NORMAL_MAP, G_SATELLITE_MAP, G_HYBRID_MAP, G_PHYSICAL_MAP],
			defaultMapType: G_PHYSICAL_MAP,
			highlightRegion: false,
			iconStyles: {},
			layers: {}
		},
		explodedMarkers: false,
		showMarkerDetail: false,
		showMarkerDetailObj: false,
		
		initMap: function() {
			//SAALBACH_MAP.common.debug(this.mapParams);
			if (GBrowserIsCompatible()) {
				this.map = new GMap2(document.getElementById(this.mapParams.canvasId));
				this.map.setCenter(
					new GLatLng(
						this.mapParams.mapStartLat,
						this.mapParams.mapStartLng
					),
					this.mapParams.mapStartZoomLevel
				);
				
				// map control
				this.setMapControl();
				
				this.map.enableScrollWheelZoom();
				
				// map types
				for(i in this.mapParams.mapTypes) {
					this.map.addMapType(this.mapParams.mapTypes[i]);
				}
				
				// default map type
				//this.map.setMapType(this.mapParams.defaultMapType);
				
				
        var copyrightCollection = new GCopyrightCollection("<a href='http://www.opencyclemap.org/'>OpenCycleMap.org</a>");
        var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 4, " ");
        copyrightCollection.addCopyright(copyright);
        var TileOverlay = [new GTileLayer(copyrightCollection, 1, 15)];
        TileOverlay[0].getTileUrl = function(TileKoordinaten,ZoomStufe){return "http://andy.sandbox.cloudmade.com/tiles/cycle/"+ZoomStufe+"/"+TileKoordinaten.x+"/"+TileKoordinaten.y+".png";};
        var GMapTypeOptions = new Object();
        GMapTypeOptions.minResolution = 4;
        GMapTypeOptions.maxResolution = 15;
        GMapTypeOptions.errorMessage = "Dieser Kartenausschnitt ist f&uuml;r diese Zoomstufe nicht verf&uuml;gbar";
        GMapTypeOptions.alt = "Open Cycle Map (www.opencyclemap.org)";
        GMapTypeOptions.shortName = "Detail";
        var custommap = new GMapType(TileOverlay, new GMercatorProjection(18), "CycleMap", GMapTypeOptions);
        this.map.addMapType(custommap);
        //this.map.setMapType(custommap);
				
				
				
				// add some info layers
				//this.map.addOverlay(new GLayer("com.panoramio.all")); 
				//this.map.addOverlay(new GLayer("com.youtube.all")); 
				//this.map.addOverlay(new GLayer("org.wikipedia.de")); 
				
				// restrict map
				this.restrictMap();
				
				// load marker styles
				this.loadMarkerStyles();
				
				// explode markers
				//this.explodeMarkers();
				
				// load layer
				//this.loadLayer('http://map.bike-circus.at/json/sample_layer.json', 'lifts');
				
				// show layer
				//this.showLayer('lifts');
				
				
				
				jQuery('#categoryList a.showStart').each(function(i){
					var currCategorySelection = jQuery(this);
					
					if( currCategorySelection.hasClass('active') ) {
						SAALBACH_MAP.GMaps.hideLayer( currCategorySelection.attr('rel') );
						currCategorySelection.removeClass('active');
					}
					else {
						SAALBACH_MAP.GMaps.loadLayer( currCategorySelection.attr('href'), currCategorySelection.attr('rel') );
						SAALBACH_MAP.GMaps.showLayer( currCategorySelection.attr('rel') );
						currCategorySelection.addClass('active');
					}
				});
				
				jQuery('#categoryList a').click(function(){
					var currCategorySelection = jQuery(this);
					
					if( currCategorySelection.hasClass('active') ) {
						SAALBACH_MAP.GMaps.hideLayer( currCategorySelection.attr('rel') );
						currCategorySelection.removeClass('active');
					}
					else {
						SAALBACH_MAP.GMaps.loadLayer( currCategorySelection.attr('href'), currCategorySelection.attr('rel') );
						SAALBACH_MAP.GMaps.showLayer( currCategorySelection.attr('rel') );
						currCategorySelection.addClass('active');
					}
					
					return false;
				});
			}
		},
		
		setMapControl: function() {
			var extLargeMapControl = new ExtLargeMapControl();
			var topRight = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(90,209));
			this.map.addControl(extLargeMapControl,topRight);
			this.map.addControl(new GMapTypeControl());
		},
		
		restrictMap: function() {
			if( this.mapParams.highlightRegion ) {
				this.highlightRegion();
			}
		},
		
		highlightRegion: function() {
			var regionHighlight = new GPolygon.fromEncoded({
				polylines: [
					{
						points: "?_eiuU_}qyN??`ynf_@~|qyN??aynf_@",
						levels: "PPPPP",
						color: "#000000",
						opacity: 0,
						weight: 0,
						numLevels: 18,
						zoomFactor: 2
					},
					{
						points: "ev``HmnbmA`\\hC~^bAzQmEb\\?xTbA|NlE|a@?`\\zKdy@?n`@lEl`@`N|a@bP|QvXzA|i@|Adn@l@dn@vG`l@dIjp@dI`{@yDpaAwGrcAiFbjAdIxv@hVrt@~Nf}@jCjnAyDxtAm@f}@zAj_Al@dn@{Ar}BjCj_AzAnaAn@tcAwGrt@wG|i@yDdn@}Ahp@zDn{BfFrcAm@|i@?f}@wGnaAwG~vAmPxcB}QvpBwWtrA__@`jA}aA?_oA_N{qA{ZgfAa]{q@sV{q@mTqz@{Zci@?is@eP_|@mTgcAwXnMse@xTucAzQurArJ{i@fFe_@m@yeAbIucAdI}x@yDurAmPa{@}^qpAic@{rBuGen@{QcjAyTq_BoMcyAcIg{AvTsVvTmc@m@cjA{QycBuWijB_\\g}@k`@wXcY_]?}i@tG}x@zAuaB?yv@gFe_@?mlBn@mc@zAse@zAal@m@k_A|Ag}@jPmTzQoTbYdAtWaNtWcPxq@xeAza@~Mpj@nc@za@`l@xa@hRza@fCff@_Nnm@sV~NyClTcAlP`@",
						levels: "PCEDFDEEEEHBFK@CFACGCCGEEFGCFADEBCIBECGDFBECHAGENEGECBBFFBCLCEBBGFBIFDDGCCEHGDGEHFGEIDDEEEEB@DDKBGFBIGFEFIFDFDCP",
						opacity: 0,
						weight: 0,
						numLevels: 18,
						zoomFactor: 2
					}
				],
				fill: true,
				color: "#000000",
				opacity: 0.6,
				outline: true
			});
		
			this.map.addOverlay(regionHighlight);
		},
		
		loadMarkerStyles: function() {
			this.mapParams.markerStyles = SAALBACH_MAP.comm.recieveJSON('http://map.bike-circus.at/json/marker_styles.json');
			this.createGIconsFromMarkerStyles();
				
		},
		
		createGIconsFromMarkerStyles: function() {
			for( i in this.mapParams.markerStyles ) {
				
				var mapIcon = new GIcon();
				mapIcon.image = this.mapParams.markerStyles[i].markerIcon.image;
				mapIcon.imageMap = this.mapParams.markerStyles[i].markerIcon.imageMap;
				mapIcon.shadow = this.mapParams.markerStyles[i].markerIcon.shadow;
				mapIcon.iconSize = new GSize(this.mapParams.markerStyles[i].markerIcon.iconSize.width, this.mapParams.markerStyles[i].markerIcon.iconSize.height);
				mapIcon.shadowSize = new GSize(this.mapParams.markerStyles[i].markerIcon.shadowSize.width, this.mapParams.markerStyles[i].markerIcon.shadowSize.height);
				mapIcon.iconAnchor = new GPoint(this.mapParams.markerStyles[i].markerIcon.iconAnchor.x, this.mapParams.markerStyles[i].markerIcon.iconAnchor.y);
				mapIcon.infoWindowAnchor = new GPoint(this.mapParams.markerStyles[i].markerIcon.infoWindowAnchor.x, this.mapParams.markerStyles[i].markerIcon.infoWindowAnchor.y);
				//mapIcon.infoShadowAnchor = new GPoint(this.mapParams.markerStyles[i].markerIcon.infoShadowAnchor.x, this.mapParams.markerStyles[i].markerIcon.infoShadowAnchor.y);
				mapIcon.transparent = this.mapParams.markerStyles[i].markerIcon.transparent;
				/*mapIcon.printImage = this.mapParams.markerStyles[i].markerIcon.printImage;
				mapIcon.mozPrintImage = this.mapParams.markerStyles[i].markerIcon.mozPrintImage;*/
				
				this.mapParams.markerStyles[i].markerIcon.mapIcon = mapIcon;
				this.mapParams.iconStyles[i] = mapIcon;
			}
			mapIcon = null;
		},
		
		getIconStyleByKey: function(key) {
			return this.mapParams.iconStyles[key]||new GIcon(G_DEFAULT_ICON);
		},
		
		loadLayer: function(jsonUrl, objKey, callback) {
			callback = callback || function(){};
			
			if (this.mapParams.layers[objKey] == undefined) {
				var layerObj = {};
				
				var jsonObj = SAALBACH_MAP.comm.recieveJSON(jsonUrl);
				
				if (jsonObj != null) {
					var layerObj = {
		 title: jsonObj.title,
		 icon: jsonObj.icon,
		 zoomLevelVisible: jsonObj.zoomLevelVisible,
		 items: []
		 };
					/*if (jsonObj.title != undefined) {
						layerObj.title = jsonObj.title;
					}
					if (jsonObj.icon != undefined) {
						layerObj.icon = jsonObj.icon;
					}
					if (jsonObj.zoomLevelVisible != undefined) {
						layerObj.zoomLevelVisible = jsonObj.zoomLevelVisible;
					}
					jsonObj.items = [];*/
					
					
					// go trough layer items
					for (var i in jsonObj.items) {
						//SAALBACH_MAP.common.debug(jsonObj.items[i], 'loadLayer item[' + i + ']');
						
						layerObj.items[i] = {
							id: jsonObj.items[i].id,
							title: jsonObj.items[i].title
						};
						
						// polyline
						for (var j in jsonObj.items[i].polyline) {
							if (!layerObj.items[i].polyline) {
								layerObj.items[i].polyline = [];
							}
							layerObj.items[i].polyline[j] = this.processLayerPolyline(jsonObj.items[i].polyline[j]);
						}
						
						// markers
						for (var m in jsonObj.items[i].marker) {
							if (!layerObj.items[i].marker) {
								layerObj.items[i].marker = {};
							}
							//layerObj.items[i].marker[jsonObj.items[i].marker[m].key] = jsonObj.items[i].marker[m];
							layerObj.items[i].marker[jsonObj.items[i].marker[m].key] = this.processLayerMarker(jsonObj.items[i].marker[m]);
						}
						
						// polygons
						for (var po in jsonObj.items[i].polygon) {
							if (!layerObj.items[i].polygon) {
								layerObj.items[i].polygon = [];
							}
							layerObj.items[i].polygon[po] = this.processLayerPolygon(jsonObj.items[i].polygon[po]);
						}
					}
					
					//SAALBACH_MAP.common.debug(layerObj, 'load layer');
					
					// save layer
					this.mapParams.layers[objKey] = layerObj;
				}
				
				callback(this.mapParams.layers[objKey]);
			}
		},
		
		processLayerPolyline: function(polylineObj) {
			polylineObj.polyline = new GPolyline.fromEncoded(polylineObj.polylineData);			
			
			return polylineObj;
		},
		
		processLayerMarker: function(markerObj) {
			if( markerObj ) {
				/*markerObj.mapMarker = new GMarker(
					new GLatLng(markerObj.markerPoint.lat, markerObj.markerPoint.lng),
					{
						icon: this.getIconStyleByKey(markerObj.markerStyle),
						title: markerObj.markerContent.title
					} 
				); */
				markerObj.mapMarker = new PdMarker(
					new GLatLng(markerObj.markerPoint.lat, markerObj.markerPoint.lng),
					{
						icon: this.getIconStyleByKey(markerObj.markerStyle),
						title: markerObj.markerContent.title
					} 
				); 
				
				return markerObj;
			}
		},
		
		processLayerPolygon: function(polygonObj) {
			polygonObj.polygon = new GPolygon.fromEncoded(polygonObj.polygonData);
			
			return polygonObj;
		},
		
		showLayer: function(objKey) {
			//SAALBACH_MAP.common.debug(Object.prototype.toString.call(this.mapParams.layers[objKey].items), 'objKey type');
			
			if (this.mapParams.layers[objKey] != undefined) {
				for (var i in this.mapParams.layers[objKey].items) {
				
					// show polylines
					if (this.mapParams.layers[objKey].items[i].polyline) {
						for (var p in this.mapParams.layers[objKey].items[i].polyline) {
							if (this.mapParams.layers[objKey].items[i].polyline[p].show != 'start') {
								this.mapParams.layers[objKey].items[i].polyline[p].polyline.hide();
							}
							else { this.mapParams.layers[objKey].items[i].polyline[p].polyline.show(); }
							this.map.addOverlay(this.mapParams.layers[objKey].items[i].polyline[p].polyline);
						}
					}
					
					// show polygons
					if (this.mapParams.layers[objKey].items[i].polygon) {
						for (var po in this.mapParams.layers[objKey].items[i].polygon) {
							if (this.mapParams.layers[objKey].items[i].polygon[po].show != 'start') {
								this.mapParams.layers[objKey].items[i].polygon[po].polygon.hide();
							}
							else { this.mapParams.layers[objKey].items[i].polygon[po].polygon.show(); }
							this.map.addOverlay(this.mapParams.layers[objKey].items[i].polygon[po].polygon);
						}
					}
					
					// show markers
					if (this.mapParams.layers[objKey].items[i].marker) {
						for (var m in this.mapParams.layers[objKey].items[i].marker) {
							var currentMapMarker = this.mapParams.layers[objKey].items[i].marker[m].mapMarker;
							this.mapParams.layers[objKey].items[i].marker[m].polyline = [];
							this.mapParams.layers[objKey].items[i].marker[m].polygon = [];
							this.mapParams.layers[objKey].items[i].marker[m].submarker = [];
												
							// marker event handlers for polyline
							for (var mpl in this.mapParams.layers[objKey].items[i].polyline) {
							
								if (this.mapParams.layers[objKey].items[i].polyline[mpl].bindMarker == m &&
								this.mapParams.layers[objKey].items[i].polyline[mpl].show != 'start' &&
								this.mapParams.layers[objKey].items[i].polyline[mpl].hide != 'start') {
									this.mapParams.layers[objKey].items[i].marker[m].polyline[mpl] = this.mapParams.layers[objKey].items[i].polyline[mpl];
								}
							}
							
							// marker event handlers for polygon
							for (var mpo in this.mapParams.layers[objKey].items[i].polygon) {
							
								if (this.mapParams.layers[objKey].items[i].polygon[mpo].bindMarker == m &&
								this.mapParams.layers[objKey].items[i].polygon[mpo].show != 'start' &&
								this.mapParams.layers[objKey].items[i].polygon[mpo].hide != 'start') {
									this.mapParams.layers[objKey].items[i].marker[m].polygon[mpo] = this.mapParams.layers[objKey].items[i].polygon[mpo];
								}
							}
							
							this.addMarkerListener('mouseover', {
								'markerObj'			: this.mapParams.layers[objKey].items[i].marker[m],
								'layerObjKey'		: objKey,
								'layerItemKey'		: i,
								'layerSubitemKey'	: m
							});
							this.addMarkerListener('mouseout', {
								'markerObj'			: this.mapParams.layers[objKey].items[i].marker[m],
								'layerObjKey'		: objKey,
								'layerItemKey'		: i,
								'layerSubitemKey'	: m
							});
							this.addMarkerListener('click', {
								'markerObj'			: this.mapParams.layers[objKey].items[i].marker[m],
								'layerObjKey'		: objKey,
								'layerItemKey'		: i,
								'layerSubitemKey'	: m
							});
							
							//GEvent.addListener(this.mapParams.layers[objKey].items[i].marker[m].mapMarker, "mouseover", function() {
								//SAALBACH_MAP.GMaps.showMarkerTooltip(currentMapMarker.mapMarker);
								
								/*GEvent.trigger(currentMapMarker.mapMarker, 'markerMouseOver', {
									'layerObjKey'		: objKey,
									'layerItemKey'		: i,
									'layerSubitemKey'	: m,
									'marker'			: currentMapMarker
								});*/
								//var bla = SAALBACH_MAP.GMaps.mapParams.layers[objKey].items[i].marker[m];
								//SAALBACH_MAP.common.debug(bla, 'add listener');
								//GEvent.trigger(SAALBACH_MAP.GMaps.mapParams.layers[objKey].items[i].marker[m].mapMarker, 'markerMouseOver', bla);
							//});
							/*GEvent.addListener(this.mapParams.layers[objKey].items[i].marker[m].mapMarker, "mouseout", function(){
								//SAALBACH_MAP.GMaps.hideMarkerTooltip();
								
								GEvent.trigger(SAALBACH_MAP.GMaps.mapParams.layers[objKey].items[i].marker[m].mapMarker, 'markerMouseOut', {
									'layerObjKey'		: objKey,
									'layerItemKey'		: i,
									'layerSubitemKey'	: m,
									'marker'			: SAALBACH_MAP.GMaps.mapParams.layers[objKey].items[i].marker[m]
								});
							});*/
							
							//this.explodeMarkers(objKey);
							//SAALBACH_MAP.GMaps.explodeMarkers(this.mapParams.layers[objKey].items[i].marker[m].mapMarker);
							
							//var currentMapMarkerObj = this.mapParams.layers[objKey].items[i].marker[m];
							//GEvent.addListener(this.mapParams.layers[objKey].items[i].marker[m].mapMarker, "markerMouseOver", function(bla) {
								//SAALBACH_MAP.common.debug(bla, 'event marker');
								
								/*var markerPoly = SAALBACH_MAP.GMaps.explodeMarkersCircle(this.mapParams.layers[objKey].items[i].marker[m].mapMarker.getLatLng(), SAALBACH_MAP.GMaps.explodeMarkersCalcIconRadius(this.mapParams.layers[objKey].items[i].marker[m].mapMarker.getIcon()) );
								var affectedMarkers = SAALBACH_MAP.GMaps.explodeMarkersGetAffected(markerPoly);
								
								if( affectedMarkers.length < 2 ) {
									SAALBACH_MAP.GMaps.map.removeOverlay(markerPoly);
								}*/
								
								//SAALBACH_MAP.common.debug(markerPoly.Contains(this.mapParams.layers[objKey].items[i].marker[m].mapMarker.getLatLng()), 'contains true?false');
								
								
							//});
							
							this.map.addOverlay(this.mapParams.layers[objKey].items[i].marker[m].mapMarker);
							
							
							// bind submarkers to markers
									
							for (var subm in this.mapParams.layers[objKey].items[i].marker) {
								if (this.mapParams.layers[objKey].items[i].marker[subm].bindMarker == m) {
									this.mapParams.layers[objKey].items[i].marker[m].submarker[subm] = this.mapParams.layers[objKey].items[i].marker[subm];
								}
							}
							
							// hide binded markers
							if( this.mapParams.layers[objKey].items[i].marker[m].show=="detailView" ) {
								this.mapParams.layers[objKey].items[i].marker[m].mapMarker.hide();
							}
							else { this.mapParams.layers[objKey].items[i].marker[m].mapMarker.show(); }
							
							
							
							
						}
					}
				}
				
				//SAALBACH_MAP.common.debug(this.mapParams.layers[objKey], 'showLayer obj');
			}
		},
		
		hideLayer: function(objKey) {
			//SAALBACH_MAP.common.debug(this.mapParams.layers[objKey], 'hideLayer');
			
			if (this.mapParams.layers[objKey] != undefined) {
				for (var i in this.mapParams.layers[objKey].items) {
					// hide polylines
					if (this.mapParams.layers[objKey].items[i].polyline) {
						for (var p in this.mapParams.layers[objKey].items[i].polyline) {
							this.mapParams.layers[objKey].items[i].polyline[p].polyline.hide();
						}
					}
					
					// hide polygons
					if (this.mapParams.layers[objKey].items[i].polygon) {
						for (var po in this.mapParams.layers[objKey].items[i].polygon) {
							this.mapParams.layers[objKey].items[i].polygon[po].polygon.hide();
						}
					}
					
					// hide markers
					if (this.mapParams.layers[objKey].items[i].marker) {
						for (var m in this.mapParams.layers[objKey].items[i].marker) {
							this.mapParams.layers[objKey].items[i].marker[m].mapMarker.hide();
						}
					}
				}
			}
		},
		
		addMarkerListener: function(event, p) {
			
			// mouseover
			if (event == 'mouseover') {
				GEvent.addListener(p.markerObj.mapMarker, event, function(){
					GEvent.trigger(p.markerObj.mapMarker, 'markerMouseOver', {
						'currentMarkerObj': p
					});
					
					// z-index
					p.markerObj.mapMarker.topMarkerZIndex();
					
					if (p.markerObj.markerContent.teaser != undefined) {
						SAALBACH_MAP.GMaps.showMarkerTooltip(p.markerObj);
					}
					else if(p.markerObj.markerContent.webcam_img != undefined) {
						SAALBACH_MAP.GMaps.showMarkerTooltipWebcam(p.markerObj);
					}
					
					// polygon on mouseover
					if( p.markerObj.polygon != undefined ) {
						for( var po in p.markerObj.polygon ) {
							if( p.markerObj.polygon[po].show == 'mouseover' ) {
								p.markerObj.polygon[po].polygon.show();
							}
							else if( p.markerObj.polygon[po].hide == 'mouseover' ) {
								p.markerObj.polygon[po].polygon.hide();
							}
						}
					}
					// polyline on mouseover
					if( p.markerObj.polyline != undefined ) {
						for( var pl in p.markerObj.polyline ) {
							if( p.markerObj.polyline[pl].show == 'mouseover' ) {
								p.markerObj.polyline[pl].polyline.show();
							}
							else if( p.markerObj.polyline[pl].hide == 'mouseover' ) {
								p.markerObj.polyline[pl].polyline.hide();
							}
						}
					}
				});
				
				GEvent.addListener(p.markerObj.mapMarker, 'markerMouseOver', function(a){
					//SAALBACH_MAP.common.debug(a.currentMarkerObj);
					if (SAALBACH_MAP.GMaps.explodedMarkers === false) {
						SAALBACH_MAP.GMaps.explodeMarkers(a.currentMarkerObj);
					}
				});
			}
			else if(event == 'mouseout') {
				GEvent.addListener(p.markerObj.mapMarker, 'mouseout', function(){
					
					// z-index
					p.markerObj.mapMarker.restoreMarkerZIndex();
					
					SAALBACH_MAP.GMaps.hideMarkerTooltip(p.markerObj);
					
					if (SAALBACH_MAP.GMaps.showMarkerDetail == false || SAALBACH_MAP.GMaps.showMarkerDetail!=p.markerObj.key) {
						// polygon on mouseover
						if (p.markerObj.polygon != undefined) {
							for (var po in p.markerObj.polygon) {
								if (p.markerObj.polygon[po].hide == 'mouseout') {
									p.markerObj.polygon[po].polygon.hide();
								}
								else 
									if (p.markerObj.polygon[po].show == 'mouseout') {
										p.markerObj.polygon[po].polygon.show();
									}
							}
						}
						// polyline
						if (p.markerObj.polyline != undefined) {
							for (var pl in p.markerObj.polyline) {
								if (p.markerObj.polyline[pl].hide == 'mouseout') {
									p.markerObj.polyline[pl].polyline.hide();
								}
								else 
									if (p.markerObj.polyline[pl].show == 'mouseout') {
										p.markerObj.polyline[pl].polyline.show();
									}
							}
						}
						
						// submarker
						if(p.markerObj.submarker != undefined) {
							for(var subm in p.markerObj.submarker) {
								p.markerObj.submarker[subm].mapMarker.hide();
								p.markerObj.submarker[subm].mapMarker.restoreMarkerZIndex();
							}
						}
					}
				});
			}
			else if(event == 'click') {
				GEvent.addListener(p.markerObj.mapMarker, 'click', function(){
					if ( p.markerObj.markerContent.detailUri!=undefined || p.markerObj.markerContent.extUri != undefined) {
						SAALBACH_MAP.GMaps.showMarkerContent(p.markerObj);
						
						// polygon on mouseover
						if( p.markerObj.polygon != undefined ) {
							for( var po in p.markerObj.polygon ) {
								if( p.markerObj.polygon[po].show == 'mouseover' || p.markerObj.polygon[po].show == 'click' ) {
									p.markerObj.polygon[po].polygon.show();
								}
							}
						}
						// polyline on mouseover
						if( p.markerObj.polyline != undefined ) {
							for( var pl in p.markerObj.polyline ) {
								if( p.markerObj.polyline[pl].show == 'mouseover' || p.markerObj.polyline[pl].show == 'click' ) {
									p.markerObj.polyline[pl].polyline.show();
								}
							}
						}
					}
				});
			}
			
			GEvent.addListener(p.markerObj.mapMarker, 'markerDetail', function(){
					// polygon on mouseover
					if( p.markerObj.polygon != undefined ) {
						for( var po in p.markerObj.polygon ) {
							if( p.markerObj.polygon[po].show == 'mouseover' ) {
								p.markerObj.polygon[po].polygon.show();
							}
							else if( p.markerObj.polygon[po].hide == 'mouseover' ) {
								p.markerObj.polygon[po].polygon.hide();
							}
						}
					}
					// polyline on mouseover
					if( p.markerObj.polyline != undefined ) {
						for( var pl in p.markerObj.polyline ) {
							if( p.markerObj.polyline[pl].show == 'mouseover' ) {
								p.markerObj.polyline[pl].polyline.show();
							}
							else if( p.markerObj.polyline[pl].hide == 'mouseover' ) {
								p.markerObj.polyline[pl].polyline.hide();
							}
						}
					}
						
					// submarker
					if(p.markerObj.submarker != undefined) {
						for(var subm in p.markerObj.submarker) {
							p.markerObj.submarker[subm].mapMarker.show();
							p.markerObj.submarker[subm].mapMarker.topMarkerZIndex();
						}
					}
			});
		},
		
		
		explodeMarkers: function(currentMarkerObj) {
			var currentMapMarker = currentMarkerObj.markerObj.mapMarker;
			var currentMarkerPosition = currentMapMarker.getLatLng();
			var radiusPixel = SAALBACH_MAP.GMaps.explodeMarkersCalcIconRadius(currentMapMarker.getIcon());
			var markerPoly = SAALBACH_MAP.GMaps.explodeMarkersCircle(currentMapMarker.getLatLng(), radiusPixel );
			var affectedMarkersObj = SAALBACH_MAP.GMaps.explodeMarkersGetAffected(markerPoly);
			var affectedMarkers = affectedMarkersObj.markersInside;
			
			if( affectedMarkers.length < 2 ) {
				SAALBACH_MAP.GMaps.map.removeOverlay(markerPoly);
				SAALBACH_MAP.GMaps.explodedMarkers = false;
			}
			else {
				//var markerPolyOuter = SAALBACH_MAP.GMaps.explodeMarkersCircle(currentMapMarker.getLatLng(), radiusPixel*(affectedMarkers.length/2) );
				var markerPolyInner = SAALBACH_MAP.GMaps.explodeMarkersCircle(currentMapMarker.getLatLng(), radiusPixel*1.5 );
				var markerPolyOuter = SAALBACH_MAP.GMaps.explodeMarkersCircle(currentMapMarker.getLatLng(), radiusPixel*2 );
				SAALBACH_MAP.GMaps.explodedMarkers = true;
				var radiusPoints = markerPolyInner.GetPointsAtDistance( SAALBACH_MAP.GMaps.getPixelDistance() * radiusPixel );
				var markerCenterLines = [];
				var c = 0;
				for( var i in affectedMarkers ) {
					//SAALBACH_MAP.common.debug(radiusPoints[c].lat());
					if (radiusPoints[c] != undefined) {
						var newMarkerPos = new GLatLng(radiusPoints[c].lat(), radiusPoints[c].lng());
						affectedMarkers[i].mapMarker.setPoint(newMarkerPos);
						
						markerCenterLines[i] = new GPolyline([currentMarkerPosition, newMarkerPos], '#ffffff',2 );
						SAALBACH_MAP.GMaps.map.addOverlay(markerCenterLines[i]);
						c++;
					}
					else {
						SAALBACH_MAP.common.debug(affectedMarkers[i].markerContent.title, 'marker not visible');
						affectedMarkers[i].mapMarker.hide();
					}
				}
				for( var o in affectedMarkersObj.markersOutside ) {
					affectedMarkersObj.markersOutside[o].mapMarker.hide();
				}
				//SAALBACH_MAP.common.debug();
				
				
				
				// implode Event
				GEvent.addListener(markerPolyOuter, 'mouseout', function(){
					if (markerPolyOuter != undefined) {
						SAALBACH_MAP.GMaps.map.removeOverlay(markerPolyOuter);
					}
					if (markerPolyInner != undefined) {
						SAALBACH_MAP.GMaps.map.removeOverlay(markerPolyInner);
					}
					if (markerPoly != undefined) {
						SAALBACH_MAP.GMaps.map.removeOverlay(markerPoly);
					}
					
					for( var i in affectedMarkers ) {
						if (affectedMarkers[i].mapMarker.isHidden() != true) {
							//SAALBACH_MAP.common.debug(affectedMarkers[i]);
							SAALBACH_MAP.GMaps.map.removeOverlay(markerCenterLines[i]);
							affectedMarkers[i].mapMarker.setPoint(new GLatLng(affectedMarkers[i].markerPoint.lat, affectedMarkers[i].markerPoint.lng));
							c++;
						}
						else {
							affectedMarkers[i].mapMarker.show();
						}
					}
					for( var o in affectedMarkersObj.markersOutside ) {
						affectedMarkersObj.markersOutside[o].mapMarker.show();
					}
					SAALBACH_MAP.GMaps.explodedMarkers = false;
				});
			}
		},
		
		explodeMarkersGetAffected: function(markerPoly) {
			// check all markers
			var markersInside = [];
			var markersOutside = [];
			for( var objKey in SAALBACH_MAP.GMaps.mapParams.layers ) {
				for (var i in SAALBACH_MAP.GMaps.mapParams.layers[objKey].items) {
					if (SAALBACH_MAP.GMaps.mapParams.layers[objKey].items[i].marker) {
						for (var m in SAALBACH_MAP.GMaps.mapParams.layers[objKey].items[i].marker) {
							if (SAALBACH_MAP.GMaps.mapParams.layers[objKey].items[i].marker[m].mapMarker.isHidden() == false) {
								if (markerPoly.Contains(SAALBACH_MAP.GMaps.mapParams.layers[objKey].items[i].marker[m].mapMarker.getLatLng())) {
									markersInside.push(SAALBACH_MAP.GMaps.mapParams.layers[objKey].items[i].marker[m]);
								}
								else {
									markersOutside.push(SAALBACH_MAP.GMaps.mapParams.layers[objKey].items[i].marker[m]);
								}
							}
						}
					}
				}
			}
			//SAALBACH_MAP.common.debug(markersInside, 'contains');
			
			return { 'markersInside': markersInside, 'markersOutside': markersOutside };
		},
		
		explodeMarkersCalcIconRadius: function(markerIcon) {
			var largeSide = markerIcon.iconSize.height;
			if( markerIcon.iconSize.width > markerIcon.iconSize.height ) {
				largeSide = markerIcon.iconSize.width;
			}
			
			var iconSpace = Math.ceil(largeSide/3);
			iconSpace = 5*2;
			
			radius = Math.ceil( largeSide + iconSpace );
			radius = Math.ceil( largeSide/1.5 );
			
			return radius;
		},
		
		explodeMarkersCircle: function(center, radiusPixel, nodes) {
			var latConv = center.distanceFrom(new GLatLng(center.lat()+0.1, center.lng()))/100;
			var lngConv = center.distanceFrom(new GLatLng(center.lat(), center.lng()+0.1))/100;
			
			var nodes = nodes || 15;
			var liColor = '#ffffff';
			var liWidth = 2;
			var liOpa = 0;
			var fillColor = '#ffffff';
			var fillOpa = 0;
			var points = [];
			var step = parseInt(360/nodes)||10;
			
			var radius = (SAALBACH_MAP.GMaps.getPixelDistance() * radiusPixel) / 1000;
			
			for (var i=0; i<=360; i+=step) {
				var pint = new GLatLng(center.lat() + (radius/latConv * Math.cos(i * Math.PI/180)), center.lng() + (radius/lngConv * Math.sin(i * Math.PI/180)));
				points.push(pint);
			}
			points.push(points[0]);
			
			var poly = new GPolygon(points,liColor,liWidth,liOpa,fillColor,fillOpa);
			
			this.map.addOverlay(poly);
			
			return poly;
		},
		
		
		getPixelDistance: function() {
	        var p1 = this.map.fromContainerPixelToLatLng(new GPoint(300,250));
	        var p2 = this.map.fromContainerPixelToLatLng(new GPoint(300,251));
	        var lngdist = p1.distanceFrom(p2);
	
	        /*var p3 = this.map.fromContainerPixelToLatLng(new GPoint(301,250));
	        var latdist = p1.distanceFrom(p3);
	
	        GLog.write("Pixel Distance: "+lngdist+" "+latdist);*/ 
			
			return lngdist;
		},

		
		showMarkerTooltip: function(currentMarkerObj) {
			var markerPos = SAALBACH_MAP.GMaps.map.fromLatLngToContainerPixel(currentMarkerObj.mapMarker.getPoint());
			
			var tooltip = jQuery('#mapTooltip');
			
			tooltip.children('h2').text(currentMarkerObj.markerContent.title);
			tooltip.children('#tooltipTeaser').html(currentMarkerObj.markerContent.teaser);
			
			
			if (currentMarkerObj.markerContent.teaserImg != undefined
				&& currentMarkerObj.markerContent.teaserImg!='') {
				tooltip.children('#tooltipImg').html('<img src="img/content/mapLayerContent/'+ currentMarkerObj.markerContent.teaserImg +'" alt="" width="125" height="111" />');
				
				//console.log( tooltip.children('#tooltipImg').html() );
			}
			tooltip.css({
				'top': markerPos.y+'px',
				'left': markerPos.x+'px'
			}).fadeIn('fast');
		},

		
		showMarkerTooltipWebcam: function(currentMarkerObj) {
			var markerPos = SAALBACH_MAP.GMaps.map.fromLatLngToContainerPixel(currentMarkerObj.mapMarker.getPoint());
			
			var tooltip = jQuery('#mapTooltipWebcam');
			
			
			if (currentMarkerObj.markerContent.webcam_img != undefined
				&& currentMarkerObj.markerContent.webcam_img!='') {
				tooltip.html('<img src="'+ currentMarkerObj.markerContent.webcam_img +'" alt="" width="280" height="229" />');
				
				//console.log( tooltip.children('#tooltipImg').html() );
			}
			tooltip.css({
				'top': markerPos.y+'px',
				'left': markerPos.x+'px'
			}).fadeIn('fast');
		},
		
		hideMarkerTooltip: function() {
			jQuery('#mapTooltipWebcam').css('display', 'none');
			jQuery('#mapTooltip').css('display', 'none');
			jQuery('#tooltipImg').html('<img src="img/layout/bsp_tooltip.jpg" alt="" width="125" height="111" />');
			//jQuery('#mapTooltip').fadeOut('fast', function(){
			//	jQuery(this).children('#tooltipImg').html('<img src="img/layout/bsp_tooltip.jpg" alt="" width="125" height="111" />');
			//});
		},

		
		showMarkerContent: function(currentMarkerObj) {
			
			if (currentMarkerObj.markerContent.extUri) {
				window.open(currentMarkerObj.markerContent.extUri, currentMarkerObj.markerContent.title);
			}
			else {
				SAALBACH_MAP.GMaps.hideMarkerContent(currentMarkerObj, function(){
					SAALBACH_MAP.GMaps.showMarkerDetail = currentMarkerObj.key;
					SAALBACH_MAP.GMaps.showMarkerDetailObj = currentMarkerObj;
					
					
					// event for marker details
					GEvent.trigger(currentMarkerObj.mapMarker, 'markerDetail', {
						'currentMarkerObj': currentMarkerObj
					});
					
					var markerContentBox = jQuery('#mapTourContent');
					
					markerContentBox.children('h1').text(currentMarkerObj.markerContent.title);
					markerContentBox.children('#tourDescription').html(currentMarkerObj.markerContent.bodyContent);
					
					if( currentMarkerObj.markerContent.elevation_profile != undefined ) {
						markerContentBox.children('#tourElevationProfile').html('<img src="'+ currentMarkerObj.markerContent.elevation_profile +'" alt="" width="375" height="145" />');
					}
					else if( currentMarkerObj.markerContent.big_image != undefined ) {
						markerContentBox.children('#tourElevationProfile').html('<img src="'+ currentMarkerObj.markerContent.big_image +'" alt="" width="375" height="145" />');
					}
					
					var galleryContent = '';
					
					if (currentMarkerObj.markerContent.gallery != undefined) {
						if (currentMarkerObj.markerContent.gallery.length > 0) {
							var cImg = 0;
							for( var gi in currentMarkerObj.markerContent.gallery ) {
								if( cImg==3 ) { linkClass = 'imgLinkLast'; }
								else { linkClass = 'imgLink'; }
								
								galleryContent = galleryContent + '<a class="'+linkClass+'" href="img/content/mapLayerContent/gallery/big/'+currentMarkerObj.markerContent.gallery[gi].big+'" target="_blank" rel="gallery"><img src="img/content/mapLayerContent/gallery/thumb/'+currentMarkerObj.markerContent.gallery[gi].thumb+'" alt="" width="86" height="86" /></a>'; 
								cImg++;
							}
							markerContentBox.children('#tourGalleryWrap').children('#tourGallery').html(galleryContent);
							jQuery("a[rel=gallery]").fancybox({ 'titleShow': false });
						}
					}
					
					
					markerContentBox.css('display', 'block').animate({
						right: '0'
					});
					markerContentBox.children('#tourCloseBtn').click(function(){
						SAALBACH_MAP.GMaps.hideMarkerContent(currentMarkerObj);
					});
				});
			}
		},
		
		hideMarkerContent: function(currentMarkerObj, callback) {
			callback = callback || function(){};
			jQuery('#mapTourContent').animate({
				right: '-469px'
			}, function(){
				jQuery(this).css('display', 'none');
				
				var markerContentBox = jQuery('#mapTourContent');
				markerContentBox.children('h1').text('');
				markerContentBox.children('#tourElevationProfile').html('');
				markerContentBox.children('#tourDescription').html('');
				markerContentBox.children('#tourGalleryWrap').children('#tourGallery').html('');
				
				SAALBACH_MAP.GMaps.showMarkerDetail = false;
				if (SAALBACH_MAP.GMaps.showMarkerDetailObj) {
					GEvent.trigger(SAALBACH_MAP.GMaps.showMarkerDetailObj.mapMarker, 'mouseout', {
						'currentMarkerObj': SAALBACH_MAP.GMaps.showMarkerDetailObj
					});
				}
				SAALBACH_MAP.GMaps.showMarkerDetailObj = false;
				GEvent.trigger(currentMarkerObj.mapMarker, 'mouseout', {
					'currentMarkerObj': currentMarkerObj
				});
				
				callback();
			});
			
		},
		
		
		addRandomMarkers: function() {
	        var markerStyle = 'defaultStyle';

		  
		  //this.map.addOverlay(new GMarker( new GLatLng(47.3786092,12.5972268), { icon:this.getIconStyleByKey('defaultStyle') } ) );
		  //this.map.addOverlay(new GMarker( new GLatLng(47.3886092,12.5972268), { icon:this.getIconStyleByKey('customStyle') } ));
		  
		  /*SAALBACH_MAP.common.debug(this.mapParams.markerStyles[markerStyle].markerIcon.mapIcon, 'marker style aus objekt');
		  SAALBACH_MAP.common.debug(G_DEFAULT_ICON, 'google default marker style');
		  SAALBACH_MAP.common.debug(this.mapParams.markerStyles, 'marker styles');*/
		},
		
		addLift: function() {
			var liftSchattberg = new GPolyline.fromEncoded({
			  color: "#0000ff",
			  weight: 4,
			  opacity: 0.8,
			  points: "s|f`HkyblAb}@rMpmAw^",
			  levels: "PGP",
			  zoomFactor: 2,
			  numLevels: 18
			});
			
			//this.map.addOverlay(liftSchattberg);
		}
	},
	
	
	
	comm: {
		recieveJSON: function(jsonUrl) {
			
			var jsonData = null;
		    jQuery.ajax({
		        'async': false,
		        'global': false,
		        'url': jsonUrl,
		        'dataType': "json",
				'error': function (request, status, error) {
					SAALBACH_MAP.common.debug(error, 'ajax Load: '+jsonUrl);
				},
		        'success': function (data) {
					jsonData = data;
		        }
		    });
			return jsonData;
		}
	}
	
	
	
}




















