/* Progressive Map jQuery Plugin v1; Martin Schlagnitweit <office@solunic.at> */

(function($){

	// toArray Added from jquery 1.4 to be compatibel with jQuery 1.3
	jQuery.fn.toArray = function() {
			return jQuery.fn.slice.call( this, 0 );
	};

	$.fn.progressiveMap = function(options) {

		return this.each(function(){
			var element = $(this);

			// Return early if this element already has a plugin instance
			if (element.data('progressivemap')) return;

			// Pass options to plugin constructor
			var progressivemap = new ProgressiveMap(this, options);

			// Store plugin object in this element's data
			element.data('progressivemap', progressivemap);
		});
		
	};

	//Default settings
	$.fn.progressiveMap.defaults = {
		zoom: 3,
		debug: false,
		mapType: 'roadmap',
		openFirstInfoWindowOnLoad: true,
		initialLat: 0,
		initialLng: 0,
		afterLoad: function(){},
		afterZoom: function(){},
		onDragEnd: function(){}
	};


	
	var ProgressiveMap = function(element, options){
		var settings;
		var mapContainer;

		var googleMap;

		var markers;
		var center;
		var zoom;
		var mapType;

		var firstMarker;
		
		var infowindows;
		
		
		construct();


		function addInfoWindow(infowindow){
			infowindows[infowindows.length] = infowindow;
		}

		function closeAllInfoWindows(){
			for(var i = 0; i < infowindows.length; i++){
				infowindows[i].close();
			}
		}

		function getFirstInfoWindow(){
			if(infowindows.length >= 1){
				return infowindows[0];
			}
		}
		
		
		function construct(){
			settings = $.extend({}, $.fn.progressiveMap.defaults, options);
			mapContainer = $(element);

			infowindows = new Array();
			
			parseMapData();

			loadMap();
			unHideMap();

			addMarkersToMap();
			
			if(settings.openFirstInfoWindowOnLoad){
				openFirstInfoWindow();
			}
		}

		function loadMap(){
			var availableMapTypes = new Array();
			availableMapTypes['roadmap'] = google.maps.MapTypeId.ROADMAP;
			availableMapTypes['terrain'] = google.maps.MapTypeId.TERRAIN;


			var googleMapOptions = {
				scrollwheel: false,
				zoom: zoom,
				center: center,
				mapTypeId: availableMapTypes[mapType]
			};

			googleMap = new google.maps.Map(element, googleMapOptions);
			
			handleCallback();
			
		}

		function handleCallback(){
			google.maps.event.addListener(googleMap, 'dragend', function() {
				settings.onDragEnd.call(this);
			});

		  	google.maps.event.addListener(googleMap, 'zoom_changed', function() {
				settings.afterZoom.call(this);
		  	});

			settings.afterLoad.call(googleMap);
		}
	
		function unHideMap(){
			mapContainer.show().css('visibility', 'visible');
		}
		
		
		function parseMapData(){
			
			if(settings.debug)
				$('.status', mapContainer).html('<p>Start Parsing</p>');
			
			markers = parseMarkers();
			center = parseCenter();
			zoom = parseZoom();
			mapType = parseMapType();
		}

		function parseMarkers(){
			var markerRaw = $('ul.progressive-map-markers > li', mapContainer);		
			var markers = markerRaw.toArray();

			if(settings.debug)
				$('.status', mapContainer).html($('.status', mapContainer).html() + '<p>Markers parsed successfully</p>');
			
			return markers;
			
		}

		function parseCenter(){
			var centerRaw = $('.progressive-map-center', mapContainer).html();		
			if(cleanUp(centerRaw) != ''){
				var center = stringToLatLng(centerRaw);
			}else{
				var center = new google.maps.LatLng(settings.initialLat, settings.initialLng)
			}

			if(settings.debug)
				$('.status', mapContainer).html($('.status', mapContainer).html() + '<p>Center parsed successfully</p>');

			return center;
		}

		function parseZoom(){
			var zoomRaw = $('.progressive-map-zoom', mapContainer).html();		
			
			if(cleanUp(zoomRaw) != ''){
				var zoom = parseInt(zoomRaw);
			}else{
				var zoom = settings.zoom;
			}
			
			if(settings.debug)
				$('.status', mapContainer).html($('.status', mapContainer).html() + '<p>Zoom parsed successfully</p>');

			return zoom;
		}
		
		function parseMapType(){
			var mapTypeRaw = $('.progressive-map-type', mapContainer).html();		
			
			if(cleanUp(mapTypeRaw) != ''){
				var mapType = cleanUp(mapTypeRaw);
			}else{
				var mapType = settings.mapType;
			}

			if(settings.debug)
				$('.status', mapContainer).html($('.status', mapContainer).html() + '<p>MapType parsed successfully</p>');
			
			return mapType;
		}
		
		function addMarkersToMap(){
			if(typeof markers != 'undefined'){
				for ( var i = 0; i < markers.length; i++ ){
				  addSingleMarkerToMap(markers[i]);
				}
			}
		}
		
		function addSingleMarkerToMap(markerElement){
			var markerData = $(markerElement);
			
			var markerPosition = $('.progressive-map-marker-position', markerData).html();
			
			markerPosition = stringToLatLng(markerPosition);


			var markerIconElement = $('img.progressive-map-marker-icon', markerData)
			
			if(markerIconElement.length > 0) {
				var markerIcon = markerIconElement.attr('src');

//				var markerIconWidth = markerIconElement.attr('width');
//				var markerIconHeight = markerIconElement.attr('height');

				var markerIconWidth = $('.progressive-map-marker-icon-width', markerData).html();
				markerIconWidth = parseInt(markerIconWidth);

				var markerIconHeight = $('.progressive-map-marker-icon-height', markerData).html();
				markerIconHeight = parseInt(markerIconHeight);

				
				var markerIconPosition = $('.progressive-map-marker-icon-position', markerData).html();
				markerIconPosition = cleanUp(markerIconPosition).toLowerCase();
			
				if(markerIconPosition == "center"){
					var markerPoint = new google.maps.Point(markerIconWidth/2, markerIconHeight/2);
				}else{
					var markerPoint = new google.maps.Point(markerIconWidth/2, markerIconHeight);
				}

			  	var image = new google.maps.MarkerImage(markerIcon,
			      new google.maps.Size(markerIconWidth, markerIconHeight),
			      new google.maps.Point(0, 0),
			      markerPoint
				);

				var marker = new google.maps.Marker({
					map: googleMap,
					position: markerPosition,
					icon:image
				});
			} else {

				var marker = new google.maps.Marker({
					map: googleMap,
					position: markerPosition
				});
				
			}
			
			

			if(typeof firstMarker == 'undefined'){
				firstMarker = marker;
			}

			var infoWindowContent = $('.progressive-map-marker-infowindow', markerData).html();



			var infowindow = new google.maps.InfoWindow({
				content: infoWindowContent
			});

			addInfoWindow(infowindow);

		    google.maps.event.addListener(marker, 'click', function() {
				closeAllInfoWindows();
				infowindow.open(googleMap, marker);
		    });
			
		}
		
		function openFirstInfoWindow(){
			if(typeof firstMarker != 'undefined'){
				firstInfoWindow = getFirstInfoWindow();
				firstInfoWindow.open(googleMap, firstMarker);
			}
		}
				
		function cleanUp(string){
			return $.trim(string);
		}
		
		function stringToLatLng(latLngString){
			latLngString = cleanUp(latLngString);
			latLngString = removeTags(latLngString);
			
			var latLngData = latLngString.split(',');
						
			var lat = cleanUp(latLngData[0]);
			var lng = cleanUp(latLngData[1]);

			var latlng = new google.maps.LatLng(lat, lng);
						
			return latlng;
		}
		
		function removeTags(string){
			/* remove tags if iOS added tel links*/
			return string.replace(/(<([^>]+)>)/ig,"");
		}
		

	}

})( jQuery );;
(function($) {
	

	$(document).ready(function() {
		
		$('.gmap').progressiveMap({
			openFirstInfoWindowOnLoad: false
		});


		resizeFooter();
		
		$(window).resize(function() {
			resizeFooter();
		});
			
		function resizeFooter(){
			var footerBorderTop = 3;
			
			var windowHeight = $(window).height();
			var pageHeight = $('#page-wrapper').outerHeight();
			var footerHeight = $('#footer').outerHeight();
			
			var diff = (windowHeight - pageHeight) * 1.0 ;

			footerHeight = footerHeight + diff - footerBorderTop;

			if(footerHeight < 80){
				footerHeight = 80;
			}
			
			
			$('#footer').css('height', footerHeight + 'px');

			var pageHeightAfter = $('#page-wrapper').outerHeight();

		}
		
	});
	

})(jQuery);;

