/**
 * Namespace PowerHour
 * Beinhaltet saemtliche Klassen die fuer die PowerHour-Website benoetigt werden
 */
var PowerHour = 
{
		// Klassen
		/**
		 * Klasse User
		 */
		User : 
		{
			//Position des Users als GLatLng
			Geolocation : null,
			GetGeolocation : function()
			{
				if(!PowerHour.User.Geolocation)
				{
					with(PowerHour)
					{
						User.Geolocation = new GLatLng(GoogleMap.LatLng.Vienna.lat, GoogleMap.LatLng.Vienna.lng);
					}
				}
				return PowerHour.User.Geolocation;
			},
			GetGeolocationJSON : function()
			{
				return 	{ 
							position : 
							{	
								latitude : PowerHour.User.GetGeolocation().lat(), 
								longitude : PowerHour.User.GetGeolocation().lng()
							} 
						};
			},
			GetGeolocationViaBrowser : function()
			{
				if(PowerHour.Browser.SupportsGeolocation())
				{
					PowerHour.Confirm(	"PowerHour.at kann deinen Standort mithilfe deiner Zustimmung genauer ermittlen, m&ouml;chtest du dies jetzt durchf&uuml;hren?", "Dein Standort", 
										function(confirmed)
										{
											if(confirmed)
											{
												PowerHour.User._setGeolocationViaBrowser();
											}
										});
				}
				else
				{
					PowerHour.Alert("Sorry, dein Browser unterst&uuml;tzt diese Funktion leider nicht!");
				}
			},
			_setGeolocationViaBrowser : function(options)
			{
				var options = $.extend({
					locationCallback : null,
					serverCallback : null
				}, options);
				PowerHour.Ajax.SetLoadingState(true);
				window.navigator.geolocation.getCurrentPosition(function(location)
				{
					try
					{
						if(location)
						{
							with(location.coords)
							{
								var latlng = new GLatLng(latitude, longitude);
								PowerHour.User._setGeolocation(latlng, options.serverCallback);
								PowerHour.Ajax.SetLoadingState(false);
								if(options.locationCallback)
								{
									options.locationCallback(location);
								}
							}
						}
					}catch(e)
					{
						PowerHour.Alert("Sorry, es ist ein Fehler aufgetreten, m&ouml;glicherweise unterst&uuml;tzt dein Browser diese Funktion nicht!");
					}
				},
				function(error)
				{
					PowerHour.Alert("Sorry, es ist ein Fehler aufgetreten, m&ouml;glicherweise unterst&uuml;tzt dein Browser diese Funktion nicht!");
				},
				{
					maximumAge : 0
				});
			},
			GetGeolocationMarker : function(dragendCallback)
			{
				var marker = new GMarker(	PowerHour.User.GetGeolocation(), 
											{
												icon : PowerHour.GoogleMap.Icons.GetUserLocationIcon(),
												draggable : true 
											});
				marker.bindInfoWindowHtml(	"<b>Das ist dein aktueller Standort</b><br />" +
											"Wenn du ihn &auml;ndern m&ouml;chtest, verschiebe<br /> einfach den Marker per Drag'n'Drop, oder<br /> klicke <a href='#changePosition' id='linkChangePosition' class='link'>hier</a> um eine konkrete Adresse einzugeben.");
				marker.enableDragging();
				


				GEvent.addListener(marker, "dragend", function(latlng) 
				{
					PowerHour.User._setGeolocation(latlng);	// Neue Position in die Session speichern
					if(PowerHour.HappyHour.Find.Current)
					{
						with(PowerHour.HappyHour.Find.Current)
						{
							route.changeStartpoint(PowerHour.User.GetGeolocation());
							calculateRoute();
						}
					}
					if(typeof(dragendCallback) == 'function')
					{
						dragendCallback(latlng);
					}
				});
				
				return marker;
			},
			ShowChangeGeolocationWindow : function(callback)
			{				
				PowerHour.Prompt("Gib hier deine Adresse ein, dein Standort wird dann automatisch ermittelt und in die Karte eingetragen.<br />(zB Taubstummengasse 11, Wien)", "Standort &auml;ndern", [{name : 'address', label : 'Adresse: ', type : 'text'}], function(result)
				{
					if(result)
					{
						PowerHour.User.ChangeGeolocation(result['address'], callback);
					}
				});
			},
			ChangeGeolocation : function(address, callback)
			{
				//Ladeanzeige
				PowerHour.Ajax.SetLoadingState(true);
				if(typeof(address) != 'string')
				{
					PowerHour.User._setGeolocation(address, callback);
				}
				else
				{
					var geocoder = new GClientGeocoder();
					geocoder.setBaseCountryCode('at');
					
					//Adresse geocoden
					geocoder.getLatLng(address, function(latlng)
					{
						//Geocode erfolgreich
						if(latlng)
						{
							PowerHour.User._setGeolocation(latlng, callback);
						}
						else
						{
							PowerHour.Alert("Diese Adresse konnte leider nicht gefunden werden!", "Fehler");
						}
					});
				}
			},
			ChangedGeolocationDefaultCallback : function()
			{
				if(PowerHour.HappyHour)
				{
					if(PowerHour.HappyHour.Find.Current)
					{
						with(PowerHour.HappyHour.Find.Current)
						{
							route.changeStartpoint(PowerHour.User.GetGeolocation());
							calculateRoute();
						}
					}
				}
			},
			_setGeolocation : function(latlng, callback)
			{
				if(latlng)
				{
					PowerHour.User.Geolocation = latlng;
					$.post(
							"/user/setstartposition",
							{
								position : {
									latitude : latlng.lat(),
									longitude : latlng.lng()
								}
							}, 
							function(success)
							{
								var address = null;
								if(success == false)
								{
									PowerHour.Alert("Hier ist wohl ein Fehler aufgetreten");
								}
								else if(success && success.length > 0)
								{
									address = success;
								}
								
								if(typeof(callback) == 'function')
								{
									callback(address);
									PowerHour.Ajax.SetLoadingState();
								}
								else
								{
									PowerHour.User.ChangedGeolocationDefaultCallback();
									PowerHour.Ajax.SetLoadingState();
								}
							});
				}
			},
			setGeolocation2DB : function(latlng)
			{
				PowerHour.User.Geolocation = latlng;

				$.post(
						"/user/setstartposition",
						{
							save2DB : true,
							position : latlng.lat()+','+latlng.lng(),
							userPosX : latlng.lat(),
							userPosY : latlng.lng()
						}, 
						function(success)
						{
							if(success == false)
							{
								PowerHour.Alert("Hier ist wohl ein Fehler aufgetreten");
							}					
						});
			},
			//Gibt an, ob der User eingeloggt ist
			IsLoggedIn : false,
			ShowLogin : function()
			{
				if($('#loginFormDiv').is(":hidden"))
				{
					$('#loginFormDiv').fadeIn(400);
					$('input#loginEmail').focus();
				}
				else
				{
					$('#loginFormDiv').fadeOut(400);
				}
			},
			
			AddLocationToRoute : function(locationId, routeId)
			{
				var url = '/userroute/addtoroute/l/' + locationId;
				if(routeId)
					url += '/r/' + routeId;
				
				$.get(url, function(res)
				{
					// 
				});
			}
		},
		
		AwesomeGlobalSearch :
		{
			LastSearchedText : ''
		},
		
		Browser :
		{
			SupportsGeolocation : function()
			{
				return (window.navigator['geolocation'] != null);
			}
		},
		
		/**
		 * Klasse Drinks
		 */
		Drinks :
		{
			List : new Array(),
			
			InitAutocomplete : function(selector, callback, options)
			{
				var defaultOpts = {
						dataType: "json",
						minChars: 1,
						max: 30,
						selectFirst: false,
						matchContains : true,
						multiple: true,
					    multipleSeparator: ", ", 
					    scrollHeight: 300,
						parse: function(data) 
						{
							return $.map(data, function(row) {
								return {
									data: row,
									value: row.id,
									result: row.name
								};
							});
						},
						formatItem: function(item) 
						{
							return item.name;
						},
						formatMatch: function(item)
						{
							return item.name;
						}
				};
				
				defaultOpts = $.extend(defaultOpts, options);
			
				$(selector).jautocomplete(PowerHour.Drinks.List, defaultOpts);
				
				$(selector).result(callback);
	
			}
			
		},
		
		/**
		 * Klasse Tooltips
		 */
		Tooltips :
		{
			showTooltip : function(tooltip)
			{
				var element = $('#'+tooltip+'Show');
				
				//$('#tooltipWhatShow').fadeOut();
				//$('#tooltipWhereShow').fadeOut();
				//$('#tooltipWhenShow').fadeOut();
				
				if(element.is(":hidden"))
				{
					element.fadeIn();
				}
				else
				{
					element.fadeOut();
				}
			},
			
			insertTime : function()
			{
				var val1 = $('input#whenUserFrom').val();
				var val2 = $('input#whenUserTo').val();
				
				if(val1 != '' && val2 != '')
				{
					$('input#when').removeClass('txt_default');
					$('input#when').val(val1 + ' bis ' + val2); 
					$('#tooltipWhenShow').fadeOut();
				}
				return false;			
			},
			
			insertIntoField : function(field, value, hiddenValue)
			{
				$('#tooltip'+field.ucFirst()+'Show').fadeOut();
				$('input#'+field).removeClass('txt_default');
				$('input#'+field).val(value);
				if(hiddenValue)
				{
					$('input#hidden' + field.ucFirst()).val(hiddenValue);
				}
			}
		},
		
		HappyHour :
		{
			Find : function(){},
			Add : function(){},
			Route : function(){}
		},
		
		//Statische Methoden		
		Cashmachines : 
		{
			GetCashmachinesNear : function(x,y,callback)
			{
				$.post('/cashmachines/near',
						{
							'x' : x,
							'y' : y
						},
						callback);
			}
		},
		
		GoogleMap : 
		{
			initializeDefault : function(id,latlon,markerText,zoom) 
			{
				if(!latlon)
				{
					var latlon = new GLatLng(PowerHour.GoogleMap.LatLng.Vienna.lat, PowerHour.GoogleMap.LatLng.Vienna.lng);
				}
				if(markerText)
				{
					var marker = new GMarker(latlon, PowerHour.GoogleMap.Icons.GetLocationIcon());
					marker.bindInfoWindowHtml(markerText);
				}
				
				PowerHour.GoogleMap.initializeWithMarker(id, marker, zoom);
			},
			initializeWithMarker : function(id, marker, zoom)
			{
				if (GBrowserIsCompatible()) 
				{
					var map = new GMap2(document.getElementById(id));
					if(!zoom)
						zoom = 13;
					map.setCenter(marker.getLatLng(),zoom);
					//map.setUIToDefault();
					map.addControl(new GSmallMapControl());
					map.enableScrollWheelZoom();
					map.enableContinuousZoom();
					
					map.addOverlay(marker);
					
					return map;
			    }
			},
			initializeWithRoute : function(id, markers, descriptionContainer)
			{
				if (GBrowserIsCompatible()) 
				{
					var map = new GMap2(document.getElementById(id));
					var latlon = new GLatLng(PowerHour.GoogleMap.LatLng.Vienna.lat, PowerHour.GoogleMap.LatLng.Vienna.lng);
					map.setCenter(latlon,16);
					map.setUIToDefault();
					
					PowerHour.GoogleMap.addRoute(map, markers, descriptionContainer);
					
					return map;
			    }
			},
			addRoute : function(map, markers, descriptionContainer, addMarkers)
			{
				if(!descriptionContainer)
				{
					descriptionContainer = document.createElement('div');
					descriptionContainer.className = 'hidden';
					document.body.appendChild(descriptionContainer);
				}
				else if(typeof(descriptionContainer) == 'String')
				{
					descriptionContainer = document.getElementById(descriptionContainer);
				}
								
				dir = new GDirections(	null,
										descriptionContainer);
									
				
				var points = new Array();
				
				var i = 0;
				for(i = 0; i < markers.length; i++)
				{
					points.push(markers[i].getLatLng());
					if(addMarkers)
						map.addOverlay(markers[i]);
				}
				
				if(points && points.length <= 1)
				{
					PowerHour.Alert("Hier ist wohl etwas schief gegangen");
					return;
				}
				
				GEvent.addListener(dir, 'load',	function()
												{
													map.addOverlay(dir.getPolyline());
													//GBounds der Route laden
													var bounds = dir.getBounds();
													var zoom = map.getBoundsZoomLevel(bounds);
													//Zoom festelegen
													map.setZoom(zoom);
													//Karte zentrieren
													map.setCenter(bounds.getCenter());
												});
				
				dir.loadFromWaypoints(points, { 
												getPolyline : true, 
												travelMode : G_TRAVEL_MODE_WALKING,
												getSteps : true
												});
				return dir;
			},
			/*
			initializeUserprofile : function(id,latlon) 
			{
				if (GBrowserIsCompatible()) 
				{
					var map = new GMap2(document.getElementById(id));
					var points = latlon.split(',');
					//alert(points[0] + " " + points[1]);
					var myPoint = new GLatLng(points[0],points[1]);					
					var marker = new GMarker(myPoint, {icon: PowerHour.GoogleMap.Icons.GetUserLocationIcon(), draggable:true});
									
					GEvent.addListener(marker, "dragend", function(p) {
						
						PowerHour.User.Geolocation = p;
						$.post(
								"/user/setstartposition",
								{
									save2DB : true,
									position : p.y+','+p.x,
									userPosX : p.x,
									userPosY : p.y
								}, 
								function(success)
								{
									if(success == false)
									{
										PowerHour.Alert("Hier ist wohl ein Fehler aufgetreten");
										PowerHour.User._setGeolocation(p,false); // auch in Session speichern
									}
									
								});
				    });

					map.setCenter(myPoint,16);
					map.setUIToDefault();
					map.addOverlay(marker);
			    }
			},*/
			print : function(points)
			{
				
				//TODO typ-Überprüfung richtigstellen
				if(typeof(points) == 'Array')
				{
					throw "PowerHour.GoogleMap.print expects an Array as parameter";
				}
				else
				{
					window.open(PowerHour.GoogleMap.getPrintUrl(points));
				}
			},
			getPrintUrl : function(addresses, travelmode)
			{
				if(!travelmode) var travelmode = G_TRAVEL_MODE_WALKING;
				//var url = "/happyhours/printroute?f=d&source=s_d";
				
				var url = "http://maps.google.com/maps?f=d&source=s_d";
				
				//var route = new Array();
				for(i = 0; i < addresses.length; i++)
				{
					if(i == 0)
					{
						url += "&saddr=";
					}
					else if(i == 1)
					{
						url += "&daddr=";
					}
					url += addresses[i].replace(' ', '+');
					if(i != addresses.length - 1 && i != 0)
					{
						url += "+to:";
					}
				}
				url += "&ie=UTF8&z=10&pw=2&hl=de";
				if(travelmode == G_TRAVEL_MODE_WALKING)
					url += "&dirflg=w";
				
				return url;
			},
			
			LatLng :
			{
				Vienna : {lat : 48.2078, lng : 16.3784}
			},
			
			Icons :
			{
				IconPath : '/images/design/map/markers/',
				GetCocktailIcon : function()
				{
					var path = PowerHour.GoogleMap.Icons.IconPath + 'cocktail/';
					var myIcon = new GIcon();
					myIcon.image = path + 'image.png';
					myIcon.printImage = path + 'printImage.gif';
					myIcon.mozPrintImage = path + 'mozPrintImage.gif';
					myIcon.iconSize = new GSize(44,41);
					myIcon.shadow = path + 'shadow.png';
					myIcon.transparent = path + 'transparent.png';
					myIcon.shadowSize = new GSize(65,41);
					myIcon.printShadow = path + 'printShadow.gif';
					myIcon.iconAnchor = new GPoint(22,41);
					myIcon.infoWindowAnchor = new GPoint(22,0);
					myIcon.imageMap = [41,0,43,1,43,2,43,3,43,4,43,5,43,6,43,7,43,8,43,9,43,10,43,11,43,12,43,13,43,14,43,15,43,16,43,17,43,18,43,19,43,20,43,21,43,22,43,23,43,24,43,25,43,26,43,27,43,28,43,29,43,30,42,31,29,32,29,33,28,34,27,35,26,36,25,37,24,38,23,39,22,40,20,40,19,39,18,38,17,37,16,36,15,35,14,34,13,33,13,32,1,31,0,30,0,29,0,28,0,27,0,26,0,25,0,24,0,23,0,22,0,21,0,20,0,19,0,18,0,17,0,16,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,2,0];
					
					return myIcon;
				},
			
				GetCashmachineIcon : function()
				{
					var path = PowerHour.GoogleMap.Icons.IconPath + 'bankomat/';
					var myIcon = new GIcon();
					myIcon.image = path + 'image.png';
					myIcon.printImage = path + 'printImage.gif';
					myIcon.mozPrintImage = path + 'mozPrintImage.gif';
					myIcon.iconSize = new GSize(33,31);
					myIcon.shadow = path + 'shadow.png';
					myIcon.transparent = path + 'transparent.png';
					myIcon.shadowSize = new GSize(49,31);
					myIcon.printShadow = path + 'printShadow.gif';
					myIcon.iconAnchor = new GPoint(17,31);
					myIcon.infoWindowAnchor = new GPoint(17,0);
					myIcon.imageMap = [31,0,31,1,32,2,32,3,32,4,32,5,32,6,32,7,32,8,32,9,32,10,32,11,32,12,32,13,32,14,32,15,32,16,32,17,32,18,32,19,32,20,31,21,31,22,24,23,23,24,22,25,21,26,20,27,19,28,18,29,17,30,15,30,14,29,13,28,12,27,11,26,10,25,9,24,8,23,0,22,0,21,0,20,0,19,0,18,0,17,0,16,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,1,0];

					return myIcon;
				},
				
				GetLocationIcon : function()
				{
					var path = PowerHour.GoogleMap.Icons.IconPath + 'location/';
					var myIcon = new GIcon();
					myIcon.image = path + 'image.png';
					myIcon.printImage = path + 'printImage.gif';
					myIcon.mozPrintImage = 'mozPrintImage.gif';
					myIcon.iconSize = new GSize(44,41);
					myIcon.shadow = path + 'shadow.png';
					myIcon.transparent = path + 'transparent.png';
					myIcon.shadowSize = new GSize(65,41);
					myIcon.printShadow = path + 'printShadow.gif';
					myIcon.iconAnchor = new GPoint(22,41);
					myIcon.infoWindowAnchor = new GPoint(22,0);
					myIcon.imageMap = [41,0,43,1,43,2,43,3,43,4,43,5,43,6,43,7,43,8,43,9,43,10,43,11,43,12,43,13,43,14,43,15,43,16,43,17,43,18,43,19,43,20,43,21,43,22,43,23,43,24,43,25,43,26,43,27,43,28,43,29,43,30,42,31,29,32,29,33,28,34,27,35,26,36,25,37,24,38,23,39,22,40,20,40,19,39,18,38,17,37,16,36,15,35,14,34,13,33,13,32,1,31,0,30,0,29,0,28,0,27,0,26,0,25,0,24,0,23,0,22,0,21,0,20,0,19,0,18,0,17,0,16,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,2,0];

					return myIcon;
				},
				
				GetFoodIcon : function()
				{
					var path = PowerHour.GoogleMap.Icons.IconPath + 'food/';
					var myIcon = new GIcon();
					myIcon.image = path + 'image.png';
					myIcon.printImage = path + 'printImage.gif';
					myIcon.mozPrintImage = 'mozPrintImage.gif';
					myIcon.iconSize = new GSize(33,31);
					myIcon.shadow =  path + 'shadow.png';
					myIcon.transparent =  path + 'transparent.png';
					myIcon.shadowSize = new GSize(49,31);
					myIcon.printShadow =  path + 'printShadow.gif';
					myIcon.iconAnchor = new GPoint(17,31);
					myIcon.infoWindowAnchor = new GPoint(17,0);
					myIcon.imageMap = [31,0,31,1,32,2,32,3,32,4,32,5,32,6,32,7,32,8,32,9,32,10,32,11,32,12,32,13,32,14,32,15,32,16,32,17,32,18,32,19,32,20,31,21,31,22,24,23,23,24,22,25,21,26,20,27,19,28,18,29,17,30,15,30,14,29,13,28,12,27,11,26,10,25,9,24,8,23,0,22,0,21,0,20,0,19,0,18,0,17,0,16,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,1,0];

					return myIcon;
				},
				
				GetUserLocationIcon : function()
				{
					var path = PowerHour.GoogleMap.Icons.IconPath + 'userlocation/';
					var myIcon = new GIcon();
					myIcon.image = path + 'image.png';
					myIcon.printImage = path + 'printImage.gif';
					myIcon.mozPrintImage = 'mozPrintImage.gif';
					myIcon.iconSize = new GSize(44,41);
					myIcon.shadow = path + 'shadow.png';
					myIcon.transparent = path + 'transparent.png';
					myIcon.shadowSize = new GSize(65,41);
					myIcon.printShadow = path + 'printShadow.gif';
					myIcon.iconAnchor = new GPoint(22,41);
					myIcon.infoWindowAnchor = new GPoint(22,0);
					myIcon.imageMap = [41,0,43,1,43,2,43,3,43,4,43,5,43,6,43,7,43,8,43,9,43,10,43,11,43,12,43,13,43,14,43,15,43,16,43,17,43,18,43,19,43,20,43,21,43,22,43,23,43,24,43,25,43,26,43,27,43,28,43,29,43,30,42,31,29,32,29,33,28,34,27,35,26,36,25,37,24,38,23,39,22,40,20,40,19,39,18,38,17,37,16,36,15,35,14,34,13,33,13,32,1,31,0,30,0,29,0,28,0,27,0,26,0,25,0,24,0,23,0,22,0,21,0,20,0,19,0,18,0,17,0,16,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,2,0];

					return myIcon;
				},
				
				GetSimilarLocationIcon : function()
				{
					var path = PowerHour.GoogleMap.Icons.IconPath + 'similar_location/';
					var myIcon = new GIcon();
					myIcon.image = path + 'image.png';
					myIcon.printImage = path + 'printImage.gif';
					myIcon.mozPrintImage = 'mozPrintImage.gif';
					myIcon.iconSize = new GSize(44,41);
					myIcon.shadow = path + 'shadow.png';
					myIcon.transparent = path + 'transparent.png';
					myIcon.shadowSize = new GSize(65,41);
					myIcon.printShadow = path + 'printShadow.gif';
					myIcon.iconAnchor = new GPoint(22,41);
					myIcon.infoWindowAnchor = new GPoint(22,0);
					myIcon.imageMap = [41,0,43,1,43,2,43,3,43,4,43,5,43,6,43,7,43,8,43,9,43,10,43,11,43,12,43,13,43,14,43,15,43,16,43,17,43,18,43,19,43,20,43,21,43,22,43,23,43,24,43,25,43,26,43,27,43,28,43,29,43,30,42,31,29,32,29,33,28,34,27,35,26,36,25,37,24,38,23,39,22,40,20,40,19,39,18,38,17,37,16,36,15,35,14,34,13,33,13,32,1,31,0,30,0,29,0,28,0,27,0,26,0,25,0,24,0,23,0,22,0,21,0,20,0,19,0,18,0,17,0,16,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,2,0];
					return myIcon;
				},
				
				GetChristkindlmarktIcon : function()
				{
					var path = PowerHour.GoogleMap.Icons.IconPath + 'christkindlmarkt/';
					var myIcon = new GIcon();
					myIcon.image = path + 'image.png';
					myIcon.shadow = path + 'shadow.png';
					myIcon.iconSize = new GSize(44,41);
					myIcon.shadowSize = new GSize(65,41);
					myIcon.iconAnchor = new GPoint(22,41);
					myIcon.infoWindowAnchor = new GPoint(22,0);
					myIcon.printImage = path + 'printImage.gif';
					myIcon.mozPrintImage = path + 'mozPrintImage.gif';
					myIcon.printShadow = path + 'printShadow.gif';
					myIcon.transparent = path + 'transparent.png';
					myIcon.imageMap = [41,0,43,1,43,2,43,3,43,4,43,5,43,6,43,7,43,8,43,9,43,10,43,11,43,12,43,13,43,14,43,15,43,16,43,17,43,18,43,19,43,20,43,21,43,22,43,23,43,24,43,25,43,26,43,27,43,28,43,29,43,30,42,31,28,32,28,33,27,34,26,35,25,36,24,37,23,38,22,39,20,39,19,38,18,37,17,36,16,35,15,34,14,33,14,32,1,31,0,30,0,29,0,28,0,27,0,26,0,25,0,24,0,23,0,22,0,21,0,20,0,19,0,18,0,17,0,16,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,2,0];
					return myIcon;
				},
				
				GetIconMarker : function(lat, lng, icon, text)
				{
					if(icon)
						eval('icon = PowerHour.GoogleMap.Icons.' + icon + '();');
					var marker = new GMarker(new GLatLng(lat, lng), icon);
					if(text)
						marker.bindInfoWindowHtml(text);
					
					return marker;
				}
			}
		},
		
		//Konstanten
		ALERT_CONFIRM_CONTAINER : 'divAlertConfirmContainer',
		
		//Methoden
		/*
		 * Highlightet ein uebergebenes Element
		 */
		Highlight : function(elem)
		{
			elem.effect('highlight', {}, 1000);
		},
		
		/*
		 * Setzt das Global Panel zurueck (ausblenden, Texte loeschen)
		 */
		ResetGlobalPanel : function()
		{
			$('#globalConfigPanel').hide();
			$('#searchResultsCounter').html('');
			$(".whiteFlap .content a").removeClass('active');
		},
		
		/**
		 * @deprecated
		 */
		AjaxLoading : function(show)
		{			
			return false;
		},
		
		/**
		 * Fuehrt ein Alert mittels Modal-Window aus
		 * 
		 * @param msg string 		Text der gezeigt werden soll
		 * @param ttl string 		Titel des Alerts (Default: "Nachricht")
		 * @param modal bool		Gibt an, ob der Hitergrund transparent hinterlegt werden soll
		 * @param _options object	Eigenschaften wie fr $.dialog
		 */
		Alert : function(msg, ttl, modal, _options)
		{
			if(!ttl)
			{
				var ttl = "Nachricht";
			}
			
			if(typeof(modal) != 'boolean')
			{
				modal = true;
			}
			
			var options = $.extend({ 'modal' : modal }, _options);
			
			PowerHour._showModal(msg, ttl, 
					{
						Ok : function()
						{
							$(this).dialog('close');
						}
					}, options);
			
			PowerHour._initKeyDownEvents();
		},
		
		/**
		 * Fhrt ein Confirm mittels Modal-Window aus
		 * 
		 * @param msg string 		Text der angezeigt werden soll
		 * @param ttl string 		Titel des Confirms (Default: "Frage")
		 * @param callback function Callback-Funktion die mit true (Ja) oder false (Nein) aufgerufen wird
		 * @param modal bool		Gibt an, ob der Hitergrund transparent hinterlegt werden soll 
		 */
		Confirm : function(msg,ttl,callback,modal)
		{
			if(!ttl)
			{
				var ttl = "Frage";
			}
			
			if(typeof(modal) != 'boolean')
			{
				modal = true;
			}
			
			var options = { 'modal' : modal };
			
			var doCallback = (callback && typeof(callback) == 'function');
			
			PowerHour._showModal(msg, ttl, 
					{
						Ja : function()
						{
							$(this).dialog('close');
							if(doCallback)
							{
								callback(true);
							}
						},
						Nein : function()
						{
							$(this).dialog('close');
							if(doCallback)
							{
								callback(false);
							}
						}
					},options);
			
			PowerHour._initKeyDownEvents(callback);
		},
		
		Prompt : function(msg, ttl, fields, callback)
		{
			var html = '<div>' + msg + '</div>';
			
			var i;
			for(i = 0; i < fields.length; i++)
			{
				if(fields[i].type == 'textarea')
					html += '<div class="autowidth">';
				else
					html += '<div>';
				
				if(fields[i].label != '')
				{
					html += '<label for="prompt_'+fields[i].name+'">'+fields[i].label+'</label>';
				}
				if(fields[i].type == 'textarea')
				{
					html += '<textarea id="prompt_'+fields[i].name+'" cols="35" rows="5" style="width:97%;"></textarea>';
				}
				else if(fields[i].type == 'select')
				{
					html += '<select id="prompt_'+fields[i].name+'">';
					var j = 0;
					var items = fields[i].items;
					for(j = 0; j < items.length; j++)
					{
						html += '<option value="'+items[j].value+'">' + items[j].text + '</option>'; 
					}
					html += '</select>';
				}
				else
				{
					html += '<input id="prompt_'+fields[i].name+'" type="'+fields[i].type+'" />';
				}
				html += '</div>';
			}
			
			var doCallback = (callback && typeof(callback) == 'function');
			
			PowerHour._showModal(html, ttl, 
						{
							Ok : function()
							{
								$(this).dialog('close');
								if(doCallback)
								{
									var result = new Object();
									for(i = 0; i < fields.length; i++)
									{
										result[fields[i].name] = $('#prompt_' + fields[i].name).val();
									}
									callback(result);
								}
							},
							Abbrechen : function()
							{
								$(this).dialog('close');
								if(doCallback)
								{
									callback(false);
								}
							}
						});
			
			$('#'+PowerHour.ALERT_CONFIRM_CONTAINER + ' input:first').focus();
			
			$(window).bind('keydown.alert',function(e)
			{
				if(e.keyCode == 13)
				{
					PowerHour.CloseAlert();
					var result = new Object();
					for(i = 0; i < fields.length; i++)
					{
						result[fields[i].name] = $('#prompt_' + fields[i].name).val();
					}
					callback(result);
				}
				else if(e.keyCode == 27)
				{
					PowerHour.CloseAlert();
					$(window).unbind('keydown.alert');
					if(doCallback) callback(false);
				}
			});
		},
		
		CloseAlert : function()
		{
			$('#'+PowerHour.ALERT_CONFIRM_CONTAINER).dialog('close');
		},
		
		_showModal : function(msg,ttl,btns,options)
		{
			var defaultOptions = {
				title : ttl,
				buttons : btns,
				modal : true,
				resizable : false,
				draggable : false,
				close : function()
				{
					$(this).dialog('destroy');
				}
			};
			var div = $('#'+PowerHour.ALERT_CONFIRM_CONTAINER);
			if(div.length <= 0)
			{
				div = $('<div id="'+PowerHour.ALERT_CONFIRM_CONTAINER+'" />').appendTo('body');
			}
			
			if(options)
			{
				options = $.extend(options, defaultOptions);
			}
			else
			{
				var options = defaultOptions;
			}
			
			div.html(msg);
			
			div.dialog(
				options
			);
		},
		
		_initKeyDownEvents : function(callback)
		{
			var doCallback = (callback && typeof(callback) == 'function');
			$(window).bind('keydown.alert',function(e)
			{
				if(e.keyCode == 13)
				{
					PowerHour.CloseAlert();
					$(window).unbind('keydown.alert');
					if(doCallback) callback(true);
				}
				else if(e.keyCode == 27)
				{
					PowerHour.CloseAlert();
					$(window).unbind('keydown.alert');
					if(doCallback) callback(false);
				}
			});
		},
		
		AppendClonedElement : function($this)
		{
			var css = $this.attr('class');
			var next_id = $this.attr('id').replace(/[0-9]/g,'') + $('.'+css).length;
			var parent = $this.parent();
			var newDiv = parent.clone(true);
			var newInput = newDiv.children('input');
			newInput.attr('id', next_id);
			newInput.attr('name', next_id);
			parent.after(newDiv);
		},
		
		Ajax : 
		{
			FreezeAndLoad : function(selector, url, params, callback)
			{
				$(selector).fadeTo(300, 0.3,function()
				{
					$.get(	url,
							params,
							function(res)
							{
								$(selector).html(res);
								$(selector).fadeTo(300, 1, function()
								{
									callback(res);
								});
							});
				});
			},
			SetLoadingState : function(loading)
			{
				if(loading)
				{
					$('#ajaxLoading').show();
				}
				else if(!loading)
				{
					$('#ajaxLoading').hide();
				}
			},
			IsMobileDevice : function()
			{
				var ua = window.navigator.userAgent.toLowerCase();
				var mobile = new Array('BlackBerry', 'iPhone', 'IEMobile', 'WAP', 'Nokia');
				var i = 0;
				for(i = 0; i < mobile.length; i++)
				{
					if(ua.indexOf(mobile[i].toLowerCase()) > -1)
						return true;
				}
				return false;
			}
		},
		Specials : 
		{
			DrawCountDown : function(zielDatum, elementId)
			{
				var element = document.getElementById(elementId);
				startDatum=new Date(); // Aktuelles Datum
	
				// Countdown berechnen und anzeigen, bis Ziel-Datum erreicht ist
				if(startDatum<zielDatum)  
				{
					var jahre=0, monate=0, tage=0, stunden=0, minuten=0, sekunden=0;
	
					// Jahre
					while(startDatum<zielDatum) {
						jahre++;
						startDatum.setFullYear(startDatum.getFullYear()+1);
					}
					startDatum.setFullYear(startDatum.getFullYear()-1);
					jahre--;
	
					// Monate
					while(startDatum<zielDatum) {
						monate++;
						startDatum.setMonth(startDatum.getMonth()+1);
					}
					startDatum.setMonth(startDatum.getMonth()-1);
					monate--;
	
					// Tage
					while(startDatum.getTime()+(24*60*60*1000)<zielDatum) {
						tage++;
						startDatum.setTime(startDatum.getTime()+(24*60*60*1000));
					}
	
					// Stunden
					stunden=Math.floor((zielDatum-startDatum)/(60*60*1000));
					startDatum.setTime(startDatum.getTime()+stunden*60*60*1000);
	
					// Minuten
					minuten=Math.floor((zielDatum-startDatum)/(60*1000));
					startDatum.setTime(startDatum.getTime()+minuten*60*1000);
	
					// Sekunden
					sekunden=Math.floor((zielDatum-startDatum)/1000);
	
					// Anzeige formatieren
					(jahre!=1)?jahre=jahre+" Jahre,  ":jahre=jahre+" Jahr,  ";
					(monate!=1)?monate=monate+" Monate,  ":monate=monate+" Monat,  ";
					if(tage > 0)
						(tage!=1)?tage=tage+" Tage,  ":tage=tage+" Tag,  ";
					else
						tage = '';
					(stunden!=1)?stunden=stunden+" Stunden,  ":stunden=stunden+" Stunde,  ";
					(minuten!=1)?minuten=minuten+" Minuten  und  ":minuten=minuten+" Minute  und  ";
					if(sekunden<10) sekunden="0"+sekunden;
					(sekunden!=1)?sekunden=sekunden+" Sekunden":sekunden=sekunden+" Sekunde";
	
					element.innerHTML=tage+stunden+minuten+sekunden;
					var zielDatumString = 	'new Date(' +
											zielDatum.getFullYear() + ',' +
											zielDatum.getMonth() + ',' +
											zielDatum.getDate() + ',' + 
											zielDatum.getHours() + ',' +
											zielDatum.getMinutes() + ',' +
											zielDatum.getSeconds() + 
											')';
	
					setTimeout('PowerHour.Specials.DrawCountDown('+zielDatumString+',"'+elementId+'")',200);
				}
				// Anderenfalls alles auf Null setzen
				else element.innerHTML="0 Jahre,  0 Monate,  0 Tage,  0 Stunden,  0 Minuten  und  00 Sekunden";
			}
		}
};

