/**
 * Datei beinhaltet Funktionen, welche die Haendlersuche betreffen.
 * 
 * @author hutterm
 * 		$LastChangedDate: 2010-07-21 09:18:27 +0200 (Wed, 21 Jul 2010) $ 
 * 		$LastChangedBy: hutterm $
 * 
 * @version $Id: DealerSearch.js 14122 2010-07-21 07:18:27Z hutterm $
 * @package javascript
 * @category DealerSearch
 */

var map = null;
var points = [];
var markers = [];
var counter = 0;

var smallicon = new GIcon();
smallicon.image = "/pictures/layout/icons/icon_blue.png";
smallicon.shadow = "/pictures/layout/icons/icon_shadow.png";
smallicon.iconSize = new GSize(25, 18);
smallicon.shadowSize = new GSize(22, 20);
smallicon.iconAnchor = new GPoint(6, 20);
smallicon.infoWindowAnchor = new GPoint(5, 1);

// Call this function when the page has been loaded
function initializeMap(transport) {
	if (GBrowserIsCompatible()){
		var map = new google.maps.Map2($("dealerSearchMap"));
		var flag = false;

		if(transport) {
			if(Prototype.Browser.IE) {
				var cursorType = 'hand';
			} else {
				var cursorType = 'pointer';
			}
			
			$$(".dealerListEntry").each(function(dealer) {
				var point = new GPoint(dealer.readAttribute("lng"), dealer.readAttribute("lat"));
				
				dealer.observe("click", function() {
					var dealerLink = dealer.readAttribute("link");
					location.href = dealerLink;
				});
				
				dealer.observe("mouseover", function() {
					dealer.setStyle({
						backgroundColor: '#F0F8FF',
						cursor: cursorType
					});
				});
				dealer.observe("mouseout", function() {
					dealer.setStyle({
						backgroundColor: '#FFFFFF',
						cursor: 'default' 
					});
				});
				
				var bubbleText = $(dealer.readAttribute("dealerId")).innerHTML;
				
				var marker = createMarker(
					point, 
					dealer.readAttribute("dealerId"),'<div><table>' + bubbleText + '</table></div>',
					counter++
				);
	
				map.addOverlay(marker);
				
				flag = true;
			});
			
			map.setCenter(new GLatLng($('listContent').readAttribute("centerLat"), $('listContent').readAttribute("centerLng")), 16, G_NORMAL_MAP);
			
			var bds = new GLatLngBounds(
				new GLatLng(parseFloat($('listContent').readAttribute("leftLat")), parseFloat($('listContent').readAttribute("rightLng"))),
				new GLatLng(parseFloat($('listContent').readAttribute("rightLat")), parseFloat($('listContent').readAttribute("leftLng")))
			);
			map.setZoom(map.getBoundsZoomLevel(bds));
			
			$('ajaxLoaderGif').toggle();
		}
		
		if(flag == false) {
			map.setCenter(new GLatLng(51.17072, 10.1321265), 16, G_NORMAL_MAP);
			
			var bds = 0;
			var bds = new GLatLngBounds(
				new GLatLng(47.46865346, 6.07933755),
				new GLatLng(54.87278654, 14.18491545)
			);
			map.setZoom(map.getBoundsZoomLevel(bds));
			map.addControl(new GLargeMapControl());
			map.addControl(new GScaleControl());
			map.addControl(new GMapTypeControl());
			map.enableDoubleClickZoom();
			map.enableContinuousZoom();
			map.getContainer().style.overflow="hidden";
		}
		
	} else {
		alert("Die Funktionen der Google Maps können mit diesem Browser nicht genutzt werden.");
	}
}

// POI für jeden Db Eintrag erstellen
function createMarker(point, title, html, n){
	if(n >= 0) { 
		n = -1; 
	}
	var marker = new GMarker(point, smallicon);
	if(isArray(html)) { 
		GEvent.addListener(marker, "click", function(){
			marker.openInfoWindowTabsHtml(html);
		}); 
	} else { 
		GEvent.addListener(marker, "click", function(){ 
			marker.openInfoWindowHtml(html);
		}); 
	}
	points[counter] = point;
	markers[counter] = marker;
	counter++;
	return marker;
}

function isArray(a){
	return isObject(a) && a.constructor == Array;
}

function isObject(a){
	return (a && typeof a == 'object') || isFunction(a);
}

function isFunction(a){
	return typeof a == 'function';
}

function cleanup() {
	GUnload();
	//alert("fenster wird geschlossen");
}

// Fremdcode der z.B. ein "unload" der Seite abhandeln kann.
var MyEventUtil = function() {
	var eventsList = [];
	var addEventFn, removeEventFn, getTargetFn, getRelatedTargetFn;
	
	if (document.attachEvent) {
		addEventFn = function( obj, type, fn ) {
			obj['e'+type+fn] = fn;
			obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
			obj.attachEvent( 'on'+type, obj[type+fn] );
			eventsList.push(arguments);
		}
		removeEventFn = function ( obj, type, fn ) {
			obj.detachEvent( 'on'+type, obj[type+fn] );
			obj[type+fn] = null;
		}
		getTargetFn = function(e) { return e.srcElement; }
		getRelatedFn = function(e) { return e.toElement; }
	} else if (document.addEventListener) {
		addEventFn = function( obj, type, fn ) {
			obj.addEventListener( type, fn, false );
			eventsList.push(arguments);
		}
		removeEventFn = function ( obj, type, fn ) {
			obj.removeEventListener( type, fn, false );
		}
		getTargetFn = function(e) { return e.target; }
		getRelatedFn = function(e) { return e.relatedTarget; }
	} else {
		// Not supported!
	}

	return {
		getTarget : getTargetFn,
		getRelatedTarget : getRelatedFn,
		addEvent : addEventFn,
		removeEvent : removeEventFn, 
		flush : function() {
			var len = eventsList.length, evt;
			for (var i=0;i<len;i++) {
				this.removeEvent(eventsList[i][0], eventsList[i][1], eventsList[i][2]);
			}	
		}
	}	
}();


MyEventUtil.addEvent(window, "unload", cleanup);

document.observe("dom:loaded", function() {
	$('ajaxLoaderGif').hide();
	$("vendorChooser").down().disable();
	
	initializeMap();
	
	$$(".vehicleTypeChooser").invoke("observe", "change", function(clickEvent) {
		if($F(clickEvent.element()) == "*") {
			$("vendorChooser").select("select").invoke("setValue", "*");
			
			$("dealerSearchForm").select(".MotorCaravanVendorChooser").each(function(field) {
				if(field.id != "vehicleType") {
					field.disable();
				}
			});
			
			$("dealerSearchForm").select(".CaravanVendorChooser").each(function(field) {
				if(field.id != "vehicleType") {
					field.disable();
				}
			});
			
		} else {
			var component = false;
			var componentSetup = false;
			
			this.select("[value=" + $F(this) + "]").each(function(selectedOption) {
				component = selectedOption.readAttribute("component");
				componentSetup = selectedOption.readAttribute("componentSetup");
			});
	
			var relation = new Platform.Component.Relation({
				requestParameters: {
					componentSetup: componentSetup
				},
				changeObserver: Search.vendorChooserChanged,
				relatedElement: "rangeChooser",
				className: "RangeChooser"
			}); 
			
			Platform.ComponentLoader.load(
				$(this.readAttribute("rel")), 
				component,
				relation
			);
		}
	});
	
	$("search").observe("click", function(clickEvent) {
		$('ajaxLoaderGif').show();
		
		var componentRelation = {};
		componentRelation.requestParameters = $('dealerSearchForm').serialize(true);
		componentRelation.onComplete = initializeMap;

		Platform.ComponentLoader.load(
			$("dealerList"),
			"DealerList",
			componentRelation
		);
	});
});