var gMap = {
	ajaxParam: {
		//URL: 'http://vl.fiat.com/service/virtuallayerservice.svc/dealers/jsonp',//chiamata corretta
		URL: fiat_vlurl+'/dealers/jsonp',//panacea
		//URL:'http://vl.fiat.com/virtuallayerservice.svc/dealers/jsonp',
		//URL:'http://93.62.229.136:8080/virtuallayerservice.svc/dealers/jsonp',
		rad: '5',//radius in km
		dealer: '1',//boolean
		organized: '0',//boolean
		garage: '1',//boolean
		bodyshop: '1',//boolean
		cmp: '',//ragione sociale
		x: '',
		y: ''
	},
	ajaxLoadingSearch:null,
	checkParams:"",//*** la stringa per la chiamata ajax relativa ai check sui tipi di rivenditore->'findDealer=true','findOrganized=true'
	map:'',
	section:'',
	myInfoBox:'',
	markersArray:[],
	markerStart: null,
	userPosition: '',
	start: '',
	end: '',
	directionsDisplay: null,
	directionsService: null,
	panorama: null,
	closeSV: null,
	paramAddressName:["address=","name="],
	paramAddressNameIndex:0,
	filteredResults:[],
	init: function(){ //caricamento asincrono mappa
		var script = document.createElement('script');
		script.type = 'text/javascript';
		//script.src = 'http://maps.googleapis.com/maps/api/js?sensor=false&language='+fiat_lang+'&callback=gMap.initInfoBox';//callback function
		script.src = 'http://maps.googleapis.com/maps/api/js?v=3&client=gme-fiat&sensor=false&language='+fiat_lang+'&callback=gMap.initInfoBox';//premier client
		document.body.appendChild(script);
		gMap.section = $('div.tdrive').is('div') ? 'tdrive' : 'locator';//identifico la sezione (layer test drive oppure pagina locator)
		dealerPanel.init();
	},
	initInfoBox:function(){ //caricamento asincrono infobox.js -> libreria esterna di gmaps per stilare i balloon
		var infoBoxPlugin = document.createElement('script');
		infoBoxPlugin.type = 'text/javascript';
		infoBoxPlugin.src = fiat_respath + 'js/libs/infobox.js';
		
		if(infoBoxPlugin.readyState){ //IE
			infoBoxPlugin.onreadystatechange = function(){
				if (infoBoxPlugin.readyState == "loaded" || infoBoxPlugin.readyState == "complete"){
					infoBoxPlugin.onreadystatechange = null;
					gMap.initializeMap();
				}
			};
		}else{ //Others
			infoBoxPlugin.onload = function(){
				gMap.initializeMap();
			};
		}
		
		document.body.appendChild(infoBoxPlugin);
		//if (gMap.section=="tdrive") {
			//$.log('eccoci');
			//gMap.ajaxCall("torino");//static? to be checked
		//}
	},
	marketZoom: {
		'it': [41.87194,12.56738,5,1500]//lat, lon, zoom and radius for Italy (radius const for search by address)
		//,'es': [41.87194,12.56738,5]//add other markets
	},
	centerRadius:null,//((gMap.map.getBounds().aa.d-gMap.map.getBounds().aa.b)*100)
	getRadius:function(){
		function rad(x) {//convert from deg to radius
			return x*Math.PI/180;
		}
		//$.log( gMap.map.getCenter() );
		//$.log( gMap.map.getCenter().lat() );
		//$.log( gMap.map.getCenter().lng() );
		//var mlat = gMap.map.getBounds().Z.b;//obsolete
		//var mlng = gMap.map.getBounds().aa.b;//obsolete
		var MAX_RADIUS = 400;//to be tested: 250 till 400 is ok, 450 is too much
		var mlat = gMap.map.getBounds().getNorthEast().lat();
		var mlng = gMap.map.getBounds().getNorthEast().lng();
		var lat = gMap.map.getCenter().lat();
		var lng = gMap.map.getCenter().lng();
		//$.log( 'lat: '+lat );
		var dLat  = rad(mlat - lat);
		//$.log( 'dLat: '+dLat );
		var R = 6371;
		var dLong = rad(mlng - lng);
		//$.log( 'dLong: '+dLong );
		var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
				Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2);
		//$.log( 'a: '+a );
		var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
		
		var radius = parseInt(R * c, 10);
		//$.log('raggio '+ parseInt(R * c) );
		if ( radius > MAX_RADIUS ) {
			radius = MAX_RADIUS;
		}
		//$.log('raggio dopo '+ radius );
		return radius;
	},
	results:null,
	firstDrive:0,// al load della pagina
	ajaxCall: function(_this){//function(callback, fn){
		//alert("call");
		var _data;
		if (gMap.section!="tdrive"){
			_data = 'market='+fiat_market+'&language='+fiat_lang+'&'+gMap.paramAddressName[gMap.paramAddressNameIndex]+_this+'&'+gMap.checkParams+'&radio='+//
				(gMap.paramAddressNameIndex==1 ? gMap.marketZoom[fiat_market][3]+"&y_wgs84="+gMap.map.getCenter().lat() + "&x_wgs84="+gMap.map.getCenter().lng() : gMap.getRadius() );//se ricerca per nome, valorizzo raggio a costante e anche x_wgs84 y_wgs84 (per coprire solo la zona attualmente zoomata); se ricerca per indirizzo, raggio su zoom attuale
				//(gMap.paramAddressNameIndex==1 ? gMap.getRadius()+"&y_wgs84="+gMap.map.getCenter().lat() + "&x_wgs84="+gMap.map.getCenter().lng() : gMap.getRadius() );//se ricerca per nome, valorizzo raggio con getradius e anche x_wgs84 y_wgs84 (per coprire solo la zona attualmente zoomata); se ricerca per indirizzo, raggio su zoom attuale
				//(gMap.paramAddressNameIndex==1 ? gMap.marketZoom[fiat_market][3]+"&y_wgs84="+gMap.marketZoom[fiat_market][0]+ "&x_wgs84="+gMap.marketZoom[fiat_market][1] : gMap.getRadius() );//se ricerca per nome, valorizzo raggio a costante di 1500km (per coprire tutta l'italia) e anche x_wgs84 y_wgs84; se ricerca per indirizzo, valorizzo raggio col getradius
				//(gMap.paramAddressNameIndex==1 ? "1500&y_wgs84="+gMap.map.getCenter().lat() + "&x_wgs84="+gMap.map.getCenter().lng() : gMap.getRadius() );//se ricerca per indirizzo, valorizzo raggio col getradius
			//_data = 'market='+fiat_market+'&language='+fiat_lang+'&'+gMap.paramAddressName[gMap.paramAddressNameIndex]+_this+'&'+gMap.checkParams+'&radio='+gMap.getRadius()+(gMap.paramAddressNameIndex==1 ? "&y_wgs84="+gMap.map.getCenter().Ra + "&x_wgs84="+gMap.map.getCenter().Qa : "");
		} else {
			if (gMap.firstDrive==0) {
				_data  = 'market='+fiat_market+'&language='+fiat_lang+'&address='+$(".tdrive input.address").val()+','+$(".tdrive input.zip").val()+'%20'+$(".tdrive input.city").val()+'&findDealer=true&findOrganized=true';
				dealerPanel.init();
				gMap.firstDrive=1;
			} else {
				_data  = 'market='+fiat_market+'&language='+fiat_lang+'&address='+_this+'&findDealer=true&findOrganized=true';
			}
		}
		/* if (gMap.section=="tdrive"){
			_data  = 'market='+fiat_market+'&language='+fiat_lang+'&address='+$(".tdrive input.address").val()+','+$(".tdrive input.zip").val()+'%20'+$(".tdrive input.city").val()+'&findDealer=true&findOrganized=true';
		}else{
            if (gMap.firstDrive==0){
                //dealerPanel.init();
				//alert( gMap.getRadius() );
				//_data = 'market='+fiat_market+'&language='+fiat_lang+'&'+gMap.paramAddressName[gMap.paramAddressNameIndex]+_this+'&'+gMap.checkParams+'&radio='+gMap.getRadius()+(gMap.paramAddressNameIndex==1 ? "&y_wgs84="+gMap.map.getCenter().Ra + "&x_wgs84="+gMap.map.getCenter().Qa : "");
				_data = 'market='+fiat_market+'&language='+fiat_lang+'&'+gMap.paramAddressName[gMap.paramAddressNameIndex]+_this+'&'+gMap.checkParams+'&radio=500&_=';//500km di raggio = DATO STATICO 
                gMap.firstDrive=1;
            }else{
                _data  = 'market='+fiat_market+'&language='+fiat_lang+'&address='+_this+'&findDealer=true&findOrganized=true';
            }
        } */
		$.ajax({
			type: 'GET',
			url: gMap.ajaxParam.URL,
			contentType: 'application/json; charset=utf-8',
			dataType: 'jsonp',//The type of data that you're expecting back from the server findDealer=true&findOrganized=true&findBodyShop=true&findMachineShop=true
			data: _data,
			cache: true,
			success: function(msg){
			//complete: function(msg){
				gMap.ajaxLoadingSearch.hide();
				if (msg.Error==null) {
					gMap.results = msg.Dealers;
					//cc[callback](response, param, fn, info);
					gMap.showResult();
				} else {
					//$.log(msg.Error.description);
					//$.log(msg.Error.code);
					//$.log( typeof (msg.Error.code) );
					switch (msg.Error.code) {
						case 204:
							alert( printMsg('gmap', 'noResult') );
						break;
						default:
							alert( printMsg('gmap', 'error') );
					}
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				gMap.ajaxLoadingSearch.hide();
				var sStatus = XMLHttpRequest.status;
				var sResponse = XMLHttpRequest.responseText;
				var sXml = XMLHttpRequest.responseXml;
				alert('http status: '+sStatus+', text response entity body: '+sResponse+', document response entity body: '+sXml+', type of error: '+textStatus);
			}
		});
	},
	initializeMap: function(){ //identifica centro e zoom della mappa, in base al mercato di riferimento
		
		
		var ibClearanceX = 255;
		var ibClearanceY = 130;
		if (gMap.section == 'tdrive') {
			ibClearanceX = 0;
			ibClearanceY = 0;
		}
		
		var infoBoxOpt = {
			map: gMap.map,
			alignBottom: true,
			closeBoxURL: fiat_respath+'img/btn_close_white.png',
			infoBoxClearance: new google.maps.Size(ibClearanceX,ibClearanceY),//offset from map borders
			pixelOffset: new google.maps.Size(-25,-70)//offset from the pin
		};
		
		gMap.myInfoBox = new InfoBox(infoBoxOpt);
		
		gMap.directionsDisplay = new google.maps.DirectionsRenderer({
			suppressMarkers: true,//prevent default markers: we use ours
			polylineOptions:{
				strokeColor: "#96172e",
				strokeOpacity: 0.8,
				strokeWeight: 5
			}
		});
		activateDirections.init();
		gMap.directionsService = new google.maps.DirectionsService();
		mapTabs.init();
		//gMap.showMap(gMap.marketZoom['it'][0],gMap.marketZoom['it'][1],gMap.marketZoom['it'][2]); //es. italia
		gMap.showMap(gMap.marketZoom[fiat_market][0],gMap.marketZoom[fiat_market][1],gMap.marketZoom[fiat_market][2]); //es. italia
		gMap.handleSV();//street view
		//ownerTools.triggerMap();
	},
	/* setIcon: function(offsetY){//obsolete
		var icon = new google.maps.MarkerImage(
			''+fiat_respath+'img/markers.png'// URL of the image
			,new google.maps.Size( 49, 69 )// (width,height) of the image
			,new google.maps.Point( 0, offsetY )// The origin point (x,y), useful for the sprite
			,new google.maps.Point( 25, 69 )// The anchor point (x,y)
		)
		return icon;
	}, */
	setIcon: function(info){
		var icon = new google.maps.MarkerImage(
			fiat_respath+'img/markers.png'// URL of the image
			,new google.maps.Size( info.width, info.height )// (width,height) of the image
			,new google.maps.Point( 0, info.offsetY )// The origin point (x,y), useful for the sprite
			,new google.maps.Point( info.anchorX, info.anchorY )// The anchor point (x,y)
		);
		//$.log(icon);
		return icon;
	},
	showMap: function(myLat,myLong,myZoom){ //stampa la mappa
		var latlng = new google.maps.LatLng(myLat, myLong);
		//var isMapTypeControl = true;
		var isMapTypeControl = false;//disabled on all maps because now are shorter
		var isPegman = true;
		if (gMap.section == 'tdrive') {
			//isMapTypeControl = false;
			isPegman = false;
		}
		var myOptions = {
			zoom: myZoom,
			center: latlng,
			mapTypeId: google.maps.MapTypeId.HYBRID,
			mapTypeControl: isMapTypeControl,
			//mapTypeControlOptions: {
				//position: google.maps.ControlPosition.LEFT_CENTER
			//},
			panControlOptions: {
				position: google.maps.ControlPosition.LEFT_CENTER
			},
			zoomControlOptions: {
				position: google.maps.ControlPosition.LEFT_CENTER
			},
			streetViewControl: isPegman,
			streetViewControlOptions: {
				position: google.maps.ControlPosition.LEFT_CENTER
			},
			scrollwheel: false
		};
		
		gMap.map = new google.maps.Map(
			document.getElementById("dealer_map"),
			myOptions
		);
        
		    
		//gMap.filterSearch();
		
//		$('div.locate input[type="text"]').keypress(function(event) {//user presses enter
//			if ( event.which == 13 ) {
//				$('div.locate button.search').trigger('click');
//				return false;
//			}
//		});

		gMap.directionsDisplay.setMap(gMap.map);//associates calcruote to our map
		gMap.directionsDisplay.setPanel( document.getElementById("directions_text") );//where to print the textual display of directions
		
		google.maps.event.addListener( gMap.map, 'tilesloaded', function(){
			ownerTools.triggerMap();
			google.maps.event.clearListeners(gMap.map, 'tilesloaded');//remove listener after once
		});
		
		
		
		
		
	},
	handleSV: function(){
		var svOptions = {
			addressControlOptions: {
				position: google.maps.ControlPosition.BOTTOM
			}
			,panControlOptions: {
				position: google.maps.ControlPosition.LEFT_CENTER
			}
			,zoomControlOptions: {
				position: google.maps.ControlPosition.LEFT_CENTER
			}
			,scrollwheel: false
			,enableCloseButton: false//we use our own close button
		};
		
		gMap.closeSV = $("<a href='#' class='close' title='"+printMsg('gmap','closeSV')+"'>x</a>");
		
		var div_map = gMap.map.getDiv();
		$(div_map).append(gMap.closeSV);
		gMap.panorama = gMap.map.getStreetView();
		gMap.panorama.setOptions(svOptions);//reach the street view object and set options for displaying controls
		
		google.maps.event.addListener( gMap.panorama, 'visible_changed', function(){
			if (gMap.panorama.getVisible()) {
				gMap.closeSV.show().click(function(){
					gMap.panorama.setVisible(false);
					return false;
				});
			} else {
				gMap.closeSV.hide();
			}
			
		});
	},
    typeOn:null,
//	filterSearch: function(){
//		var categoryOn = '';
//		var typeOn = '';

//		if(gMap.section == 'tdrive'){ // layer test drive: la ricerca e' limitata ai soli Dealer, sono esclusi i Workshop
//			categoryOn = 'dealer';
//			typeOn = ['dealer','organized'];
//			gMap.clear();
//			gMap.showResult(typeOn);
//			$('div.input_text button.search').click(function(){
//				gMap.clear();
//				//gMap.showResult(typeOn);
//                //alert("");
//                gMap.ajaxCall();
//			})
//		}else{ // pagina locator: la ricerca e' filtrata in base alla categoria e alle checkbox selezionate
//			$('div.input_text button.search').click(function(){
//				categoryOn = mapTabs.tabs.tabControls.filter('li.on').find('a').attr('class');
//				gMap.typeOn = $('.tab_'+categoryOn+' input:checkbox:checked').map(function () { // array delle checkbox checked all'interno della categoria selezionata
//								return this.value;
//							}).get();
//				gMap.clear();
//				//gMap.showResult(typeOn);
//                //alert("");
//                gMap.ajaxCall();
//			});
//		}
//	},
    getTypeLocation:function(i){//translated
        var response=new Array();
        if (gMap.results[i].isDealer) {
					response.push(printMsg("gmap","dealer"));
				}
        if (gMap.results[i].isOrganized) {
					response.push(printMsg("gmap","organized"));
				}
        if (gMap.results[i].isBodyShop) {
					response.push(printMsg("gmap","bodyshop"));
				}
        if (gMap.results[i].isMachineBody) {
					response.push(printMsg("gmap","mechanic"));
				}
        return response.join(", ");
    },
		getTypeLoc:function(i){//not translated, for tracking
        var response=new Array();
        if (gMap.results[i].isDealer) {
					response.push("dealer");
				}
        if (gMap.results[i].isOrganized) {
					response.push("organized");
				}
        if (gMap.results[i].isBodyShop) {
					response.push("body repair shop");
				}
        if (gMap.results[i].isMachineBody) {
					response.push("mechanic");
				}
        return response.join(", ");
    },
	getDealerData: function(i){
		var res = gMap.results[i];
		var response = "";
		if ( res.isDealer || res.isOrganized ){
			response = "dealer";
			return  response;
		}
		if ( res.isBodyShop || res.isMachineBody ){
			response = "assistance";
			return response; 
		}
	},
	showResult: function(typeOn){
		gMap.filteredResults=[];
		//gMap.ajaxCall();
		//var marker, i;
		var num = 0;
		//var iconOffset = 0;
		var info = {
			offsetY: 0,
			width: 49,
			height: 69,
			anchorX: 25,
			anchorY: 69
		};
		for (var i = 0, len = gMap.results.length; i < len; i++) {
            //if (i==10) {break;}
				if (i==50) {
					break;
				}
				num++;
				if(num<=9) {
					//iconOffset += 75;
					info.offsetY += 75;//mini marker
				} else {//mini marker
					//iconOffset = 0;//blank marker
					//iconOffset = 975;//mini marker
					info.offsetY = 975;
					info.width = 20;
					info.height = 27;
					//info.anchorX = 0;
					//info.anchorY = 50;
				}
				//$.log(info);
				var latLng = new google.maps.LatLng(gMap.results[i].y_wgs84, gMap.results[i].x_wgs84);
				gMap.filteredResults.push(latLng);

				var marker = new google.maps.Marker({
					position: latLng,
					map: gMap.map,
					title: gMap.results[i].name,
					//icon: gMap.setIcon(iconOffset)
					icon: gMap.setIcon(info)
				});
				gMap.markersArray.push(marker);
				
				var dealerData = gMap.getTypeLoc(i);
				var dealerCategory = gMap.getDealerData(i);
				marker.set("data-tracking", "/dealer-locator/"+dealerCategory+"/"+dealerData+"/details/");//adding data-tracking to markers
				
				google.maps.event.addListener(marker, 'click', (function(marker, i){
					return function(){
						s3_log( marker.get("data-tracking") );//sending data to sophus
						$.log(marker.get("data-tracking"));
						
						$('div.result').removeClass('on').filter('[rel='+i+']').addClass('on');
						dealerPanel.results.scrollTo('div.result[rel='+i+']', 200);
						
						gMap.userPosition = $('#above div.locate div.input_text input[type="text"]').val();//copy input value from locate panel to infobox
						
						var icon = (gMap.results[i].isDealer||gMap.results[i].isOrganized) ? fiat_respath+'img/icon_dealer.png' : fiat_respath+'img/icon_workshop.png';
						
						var contentString = '';
						if(gMap.section == 'locator'){
							contentString = '<div class="ib_wrap">'+
													'<div class="ib">'+
														'<div class="vcard">'+
															'<div class="fn org">'+gMap.results[i].name+'</div>'+
															
															'<div class="distance">'+(gMap.results[i].distance ? gMap.results[i].distance : "..")+'<span class="unit">Km</span></div>'+
															
															'<div class="text_wrap">'+
																'<div class="adr">'+
																	'<span class="street-address">'+gMap.results[i].address+'</span> - '+
																	'<span class="postal-code">'+gMap.results[i].zipCode+'</span> '+
																	'<span class="locality">'+gMap.results[i].town+'</span>'+
																'</div>';

										if (gMap.results[i].tel_1) {
											contentString+=		'<div class="tel">'+printMsg("gmap","tel")+'.: '+gMap.results[i].tel_1+'</div>';
										}
										if (gMap.results[i].tel_2) {
											contentString+=		'<div class="tel">'+printMsg("gmap","tel")+'.: '+gMap.results[i].tel_2+'</div>';
										}										
                                        if (gMap.results[i].fax) {
											contentString+=		'<div class="fax">fax: '+gMap.results[i].fax+'</div>';
										}
										contentString +='<div class="links">';
										if (gMap.results[i].website) {
											contentString+=			'<a class="url" href="'+gMap.results[i].website+'" target="_blank">www</a>';
										}
										if (gMap.results[i].email) {
											contentString+=			'<a class="email" href="mailto:'+gMap.results[i].email+'">@</a>';
										}
											contentString+=		'</div>';
										//if (gMap.results[i].category === 'dealer') {
										//	contentString+=			'<a href="#" class="tdrive btn small" rel="tdrive">'+printMsg("gmap","testDrive")+'</a>';
										//}
										
										var dealerData = gMap.getTypeLoc(i);
										var dealerCategory = gMap.getDealerData(i);
										
										contentString+=		'</div>'+
															'<div class="business" rel="'+gMap.results[i].category+'">'+
																'<img src="'+icon+'" alt="['+gMap.results[i].category+']" />'+
																'<ul>'+
																	/* '<li>'+gMap.results[i].category+'</li>'+ */
																	'<li>'+gMap.getTypeLocation(i)+'</li>'+
																'</ul>'+
															'</div>'+
														'</div>'+
														'<div class="ib_directions">'+
															'<button type="button" class="btn" data-tracking="/dealer-locator/'+dealerCategory+'/'+dealerData+'/details/directions/">'+printMsg("gmap","search-dir")+'</button>'+//tracking
														'</div>'+
													'</div>'+
												'</div>';
										
										//var trackClicks = new TrackClicks(); // sophus tracking
										//trackClicks.tracking($('div.ib_directions'));
										
						}else{//test drive
                          
								contentString = '<div class="ib_wrap">'+
													'<div class="ib">'+
														'<div class="vcard">'+
															'<div class="fn org">'+gMap.results[i].name+'</div>'+
															'<div class="dealer_info">'+
																'<div class="text_wrap">'+
																	'<div class="adr">'+
																		'<span class="street-address">'+gMap.results[i].address+'</span> - '+
																		'<span class="postal-code">'+gMap.results[i].zipCode+'</span> '+
																		'<span class="locality">'+gMap.results[i].town+'</span>'+
																	'</div>'+
																	'<div class="links">';
												/* if (gMap.results[i].website != '') {
													contentString+=		'<a class="url" href="'+gMap.results[i].website+'">www</a>';
												}
												if (gMap.results[i].email != '') {
													contentString+=		'<a class="email" href="mailto:'+gMap.results[i].email+'">@</a>';
												} */
												contentString+=		'</div>';
												if (gMap.results[i].tel_1) {
													contentString+=		'<div class="tel">'+printMsg("gmap","tel")+'. '+gMap.results[i].tel_1+'</div>';
												}
												if (gMap.results[i].tel_2) {
													contentString+=		'<div class="tel">'+printMsg("gmap","tel")+'. '+gMap.results[i].tel_2+'</div>';
												}
												if (gMap.results[i].fax) {
													contentString+=		'<div class="fax">fax: '+gMap.results[i].fax+'</div>';
												}
												contentString+=	'</div>'+
																'<div class="distance">'+(gMap.results[i].distance ? gMap.results[i].distance : "..")+'<span class="unit">Km</span></div>'+
																/* '<div class="fake_directions">'+
																	'<a href="4.1.0_fiat_locator.html">'+printMsg("gmap","directions")+'</a>'+
																'</div>'+ */
															'</div>'+
														'</div>'+
													'</div>'+
												'</div>';
						}
						
						gMap.myInfoBox.setContent(contentString);
						gMap.myInfoBox.open(gMap.map,marker);
						
						gMap.map.setZoom(15);
					}
				})(marker, i));
				
				//var dealerData = gMap.getTypeLocation(i);
				//var dealerCategory = gMap.getDealerData(i);
				var resultBox=	'<div class="result" rel="'+i+'" >';
					if(gMap.section == 'locator'){
						resultBox +='<a href="#" class="show_balloon" data-tracking="/dealer-locator/'+dealerCategory+'/'+dealerData+'/details/" title="'+printMsg("gmap","showBalloon")+'" >';//tracking
					}
							resultBox +='<div class="order">'+num+'</div>'+
										'<div class="vcard">'+
											'<div class="fn org">'+gMap.results[i].name+'</div>';
							if(gMap.section == 'locator'){
								resultBox +='<div class="business">'+gMap.getTypeLocation(i)+'</div>';
							}
							resultBox +=	'<div class="adr">'+
												'<span class="street-address">'+gMap.results[i].address+'</span> - '+
												'<span class="postal-code">'+gMap.results[i].zipCode+'</span> '+
												'<span class="locality">'+gMap.results[i].town+'</span>'+
											'</div>'+
										'</div>';
						if(gMap.section == 'locator'){
							resultBox +='<div class="distance">'+(gMap.results[i].distance ? gMap.results[i].distance : "..")+'<span class="unit">Km</span></div></a>';
						} else {
							resultBox +='<div>'+
											'<a href="#" class="show_balloon" title="'+printMsg("gmap","showBalloon")+'">Maps</a>'+
											'<a href="#" class="btn small book">'+printMsg("gmap","book")+'</a>'+
										'</div>';
						}

					resultBox +='</div>';
				
				dealerPanel.results.append(resultBox);
				
				var trackClicksResults = new TrackClicks(); // sophus tracking
				trackClicksResults.tracking($('div.results_contents'));
				
				$('div.result[rel='+i+'] a.show_balloon').bind('click', { myMarker: marker}, function(event){
					google.maps.event.trigger(event.data.myMarker, 'click');
					if(gMap.panorama){
						gMap.panorama.setVisible(false);
					}
					return false;
				});
				
		}

		google.maps.event.clearListeners(gMap.myInfoBox, 'domready');
		google.maps.event.addListener(gMap.myInfoBox, 'domready', function(){//quando il contenuto dell'infobox e' pronto nel DOM, aggancio le funzioni
			gMap.openTestDrive();
			var dealerData = gMap.getTypeLoc(i);//useful for tracking
			var dealerCategory = gMap.getDealerData(i);//useful for tracking
			$('div.ib_directions button').click(function(){
				//$.log('clicking');
				var $this = $(this);
				gMap.start = $('.point.you input');
				gMap.end = $('div.directions input[type="hidden"]');
				gMap.aGetDir = $('div.directions a.btn');
                //gMap.aGetDir=$("a.get-dir");
                gMap.directionText=$("#directions_text");
                var children=$this.closest('div.ib').find('div.adr').children();
                gMap.end.val(children.eq(0).text() + ' - ' + children.eq(1).text() + ' ' + children.eq(2).text());//copy dealer location to hidden input in the direction panel
				//$('div.ib div.business').attr('rel');
				//.val(gMap.end);//copy dealer location to hidden input in the direction panel
				$('div.directions div.point_end').removeClass('dealer workshop').addClass( $this.closest('div.ib').find('div.business').attr('rel') ).children('div').text( $this.closest('div.ib').find('div.org').text() +' - '+ $this.closest('div.ib').find('span.locality').text() );//copy dealer name and city to div in the direction panel
				gMap.myInfoBox.close();
				
				$('a.return_to_dealer, div.directions').fadeIn();
				dealerPanel.divLocate.fadeOut();
				gMap.triggerRoute();
				
				gMap.aGetDir.attr("data-tracking", "/dealer-locator/"+dealerCategory+"/"+dealerData+"/details/directions/thank-you"); //tracking
				//var trackClicksDirection = new TrackClicks(); // sophus tracking
				//trackClicksDirection.tracking($('div.directions'));//useless: we use generic function fired at document ready
				var data = $this.attr("data-tracking");
				s3_log(data);
				$.log(data);
				return false;
			});
                //gMap.updateRadius();
			
			$('div.ib_directions input[type="text"]').keypress(function(event) {//user presses enter
				if ( event.which == 13 ) {
					$('div.ib_directions button').trigger('click');
					return false;
				}
			});

		});
		
	
		//per centrare e zoomare automaticamente la mappa sulla base dei risultati ottenuti
		var latlngbounds = new google.maps.LatLngBounds( );
		//$.log('gMap.filteredResults.length: '+gMap.filteredResults.length);
		for ( var j = 0; j < gMap.filteredResults.length; j++ ) {
		//for ( var j = 0; j < 10; j++ ) {
			//$.log('step '+j);
			if ( j == 10 ) {//zoom limited to first 10 results
				break;
			}
			latlngbounds.extend( gMap.filteredResults[ j ] );
		}
		gMap.map.fitBounds( latlngbounds );
		var myLatlng = new google.maps.LatLng(gMap.results[0].y_wgs84,gMap.results[0].x_wgs84);
		gMap.map.setCenter(myLatlng);
	},
	startInput:null,
	openTestDrive:function(){
		openObj($('div.ib a.tdrive'));
	},
	clear: function(){
		dealerPanel.results.html('');
		
		if(gMap.myInfoBox){
			gMap.myInfoBox.close();
		}
		
		if(gMap.markersArray.length>0){ //rimuove i markers
			for(var j = 0; j < gMap.markersArray.length; j++){
				gMap.markersArray[j].setMap(null);
			}
		}
		if(gMap.panorama){
			gMap.panorama.setVisible(false);//disable streetview
		}
		if(gMap.directionsDisplay){
			gMap.directionsDisplay.setMap(null);//reset directions
		}
		
		//var myLatlng = new google.maps.LatLng(gMap.marketZoom['it'][0], gMap.marketZoom['it'][1]);
		//gMap.map.setZoom( gMap.marketZoom['it'][2] );
	},
	aGetDir:null,
	directionText:null,
	triggerRoute: function(){//calc route from directions panel
		//$('div.directions a.btn').click(function(){
		//	gMap.start = $('div.directions input[type="text"]');
		//	gMap.end = $('div.directions input[type="hidden"]');
		//	gMap.calcRoute(gMap.start.val(), gMap.end.val());
		//	gMap.copyUserPosition( $('div.directions input[type="text"]').val() );
		//});

		gMap.aGetDir.click(function(){
			if (gMap.start.val()!="") {
				gMap.calcRoute(gMap.start.val(), gMap.end.val());
				gMap.directionText.slideDown();
				gMap.directionText.scrollTo(0);
			}
			//gMap.copyUserPosition( $this.siblings('label').children('input[type="text"]').val() );//switching of locate and directions panels: move to successful direction status
		});
		
		gMap.start.keypress(function(event) {
			if ( event.which == 13 ) {
				gMap.aGetDir.trigger('click');
				return false;
			}
		});
		
	},
	calcRoute: function(start,end){
		//var start = $('div.directions div.you input[type="text"]').val();
		//var end = $('div.directions div.dealer').text();
		start = jQuery.trim( start );
		end = jQuery.trim( end );
		var request = {
			origin:start,
			destination:end,
			travelMode: google.maps.TravelMode.DRIVING
		};
		gMap.directionsService.route(request, function(result, status) {
			//var markerStart;
			if (gMap.markerStart != null){
				gMap.markerStart.setMap(null);//reset previous marker starting point
			}
			if (status == google.maps.DirectionsStatus.OK) {
				//move here switching of locate and directions panels
				gMap.directionsDisplay.setDirections(result);
				gMap.directionsDisplay.setMap(gMap.map);//re-associates calcruote to our map, in order to grant reset of previous routes
				var leg = result.routes[ 0 ].legs[ 0 ];
				//makeMarker( leg.start_location, icons.start, "You start from here" );
				var info = {
					offsetY: 750,
					width: 49,
					height: 69,//valid also for anchorY
					anchorX: 25,
					anchorY: 69
				};
				gMap.markerStart = new google.maps.Marker({//marker for start position (end position is already set)
					position: leg.start_location,
					map: gMap.map,
					//icon: gMap.setIcon(750),
					icon: gMap.setIcon(info),
					title: printMsg("gmap","start")
				});
				gMap.markersArray.push(gMap.markerStart);//push start marker in the array marker, to clear all together after a new search
			} else {
				alert(printMsg("gmap","errorRoute")+start+printMsg("gmap","and")+end);
			}
		});
	},
	copyUserPosition: function(userPosition){
		$('div.locate input[type="text"], div.ib_directions input[type="text"], div.directions div.you input[type="text"]').val(userPosition);
	}
};

var dealerPanel = {
	divLocate:null,
	OFFSET: 74,
	input_text: null,
	search_btn: null,
	close_list_btn: null,
	results: null,
	toggle_list:null,
	toggle_list_msg:[printMsg("gmap","closeList"),printMsg("gmap","openList")],
	//address: {"dealer":null,"workshop":null},
	init: function(){
        dealerPanel.divLocate = $('div.locate');
				if (dealerPanel.divLocate.length==0) {
					dealerPanel.divLocate=$("div.step2");
				}
		dealerPanel.input_text = dealerPanel.divLocate.find('div.input_text input[type="text"]');
        dealerPanel.toggle_list = dealerPanel.divLocate.find('div.input_text button.toggle_list');
        dealerPanel.toggle_list.html("<span class='on'>" + dealerPanel.toggle_list_msg[0] + "</span><span>" + dealerPanel.toggle_list_msg[1] +"</span>");
        gMap.ajaxLoadingSearch=dealerPanel.divLocate.find("span.load-search");
        //dealerPanel.address.dealer=dea
		dealerPanel.search_btn = dealerPanel.divLocate.find('button.search');
		dealerPanel.close_list_btn = dealerPanel.divLocate.find('button.close_list');
		dealerPanel.results = dealerPanel.divLocate.find('div.results'); //divLocate non c'e' nel testdrive
        dealerPanel.callbacks();
	},
	activateSearch: function(_this){
    //mapTabs.tab_content.filter('.on').find('input[type="checkbox"]')
				if (_this.val()!="") {
					if ( /*!dealerPanel.input_text.hasClass('shrink') &&*/ !$('#layout').hasClass('landing') ){
						if (!_this.hasClass('shrink')){
							if(gMap.section!="tdrive") {
								 _this.addClass('shrink').animate(
											{'width':'-='+dealerPanel.OFFSET},
											function(){
												dealerPanel.close_list_btn.css({'z-index':'+=10'});
											}//animation complete
										);
								dealerPanel.search_btn.eq(dealerPanel.input_text.index(_this)).animate({'right':'+='+dealerPanel.OFFSET});
								gMap.ajaxLoadingSearch.eq(dealerPanel.input_text.index(_this)).show().animate({'right':'+='+dealerPanel.OFFSET});
							}
							//dealerPanel.close_list_btn.fadeIn();
						}
						dealerPanel.results.slideDown();
						gMap.clear();
						gMap.ajaxCall(_this.val());
						//alert( _this.val() );
					}
				}
	},
	callbacks:function() {
		dealerPanel.clickSearch();//btn click
		dealerPanel.returnSearch();//return press
		dealerPanel.resetSearch();//close list
		dealerPanel.toggle_list.click( function() {
			dealerPanel.results.slideToggle();
			dealerPanel.toggle_list.find("span").toggleClass("on");//per il cambio testo da "open list" a "close list"
		});
	},
	clickSearch: function(){
		dealerPanel.search_btn.click(function(e){
			//alert("w");
			dealerPanel.activateSearch($(this).siblings("label").find("input"));
			
			//var data = $this.attr("data-tracking");
			//s3_log(data);
			//$.log(data);
			e.preventDefault();
			//return false;
		});
	},
	returnSearch: function(){
		dealerPanel.input_text.keypress(function(event) {
			if ( event.which == 13 ) {
				$(this).parent('label').nextAll('button.search').trigger('click');
				//dealerPanel.activateSearch($(this));
				return false;
			}
		});
	},
	resetSearch: function(){
		dealerPanel.close_list_btn.click(function(){
			if (dealerPanel.input_text.hasClass('shrink')){
				if(gMap.section!="tdrive") {
					dealerPanel.input_text.removeClass('shrink').animate({'width':'+='+dealerPanel.OFFSET});
					dealerPanel.search_btn.animate({'right':'-='+dealerPanel.OFFSET});
				}
				//dealerPanel.close_list_btn.fadeOut();
				dealerPanel.close_list_btn.css({'z-index':'-=10'});
				dealerPanel.results.slideUp();
				dealerPanel.input_text.val('');
			}
			gMap.clear();
			
			return false;
		});
	}
};

var mapTabs = {
	tabs: null,
	tab_controls: null,
	radio_btn: null,
    radio_active:null,
	tab_content: null,
	check_btn: null,
	//tab_on: null,
    check_values:[],//valori delle check per creare la stringa dei parametri. Se cambiano nell'html, il js funziona lo stesso 
    check_active:null,//i check visibili della tab
	check_on: null,
	init: function(){
		var whichOpen = $('#layout').hasClass('owner_tools') ? 1 : 0;
		mapTabs.tabs = new Tabs( $("div.locate div.tab_wrap"), false, false, whichOpen );
		mapTabs.tabs.init();
		mapTabs.tab_controls = $('ul.tab_controls').children('li');
		mapTabs.tab_content = $('div.tab_content');
		mapTabs.radio_btn = mapTabs.tab_content.find('input[type="radio"]');
		mapTabs.radio_active = mapTabs.tab_content.filter(".on").find('input[type="radio"]');
		//gMap.paramAddressNameIndex = mapTabs.radio_active.filter
		mapTabs.updateRadio();

		mapTabs.check_btn = mapTabs.tab_content.find('input[type="checkbox"]');
				mapTabs.check_btn.each(function(){
					mapTabs.check_values.push($(this).val());
				});
		mapTabs.tab_controls.click( function() {
		        mapTabs.countChecks();
		});
		mapTabs.setValues();
		mapTabs.clickChecks();
		mapTabs.switchTab();
		//ownerTools.triggerMap();
		mapTabs.writeTracking();//update data tracking at landing
	},
	setValues: function(){//landing in the page
		//mapTabs.radio_btn.filter(':checked').closest('li').addClass('on');
		//mapTabs.tab_on = mapTabs.tab_controls.index( mapTabs.tab_controls.filter('.on') );
		//mapTabs.tab_content.eq(mapTabs.tab_on).addClass('on');
		mapTabs.countChecks();
	},
	switchTab: function(){
		mapTabs.radio_btn.change(function(){
			//mapTabs.tab_controls.add(mapTabs.tab_content).toggleClass('on');
			//mapTabs.countChecks();
                    mapTabs.updateRadio();
            //gMap.paramAddressNameIndex=mapTabs.radio_active.index($(this));
			//gMap.clear();
		});
	},
	clickChecks: function(){
		mapTabs.check_btn.change(function(){
			mapTabs.countChecks();
			mapTabs.writeTracking();//update data tracking when changing checkboxes
			gMap.clear();
		});
	},
	updateRadio:function() {
		gMap.paramAddressNameIndex=mapTabs.radio_active.index(mapTabs.radio_active.filter(":checked"));
	},
	updateActive:function() {
		mapTabs.check_active=mapTabs.tab_content.filter('.on').find('input[type="checkbox"]');
		mapTabs.radio_active = mapTabs.tab_content.filter(".on").find('input[type="radio"]');
		mapTabs.updateRadio();
	},
	countChecks: function(){
		//$.log(mapTabs.check_on.length);
		mapTabs.updateActive();
		mapTabs.check_on = mapTabs.check_active.filter(':checked');
		if ( mapTabs.check_on.length == 1 ) {//I have only a selected checkbox
			mapTabs.check_on.attr('disabled','disabled');//disable it, to prevent unchecking all checkboxes
		} else {
			mapTabs.check_on.removeAttr('disabled');//re-enable
		}
		mapTabs.setCheckParams();
	},
	setCheckParams:function() {
		var response=new Array();
		mapTabs.check_active.each(function(){
			var _this=$(this);
			if (_this.is(":checked")) {
				response.push( mapTabs.getCheckParamsString( _this.val() ) );
			}
		});
		gMap.checkParams=response.join("&");
	},
	getCheckParamsString:function(value) {
        switch(value) {
            case mapTabs.check_values[0]:
                return "findDealer=true";
            break;
            case mapTabs.check_values[1]:
                return "findOrganized=true";
            break;            
            case mapTabs.check_values[2]:
                 return "findBodyShop=true";
            break;            
            case mapTabs.check_values[3]:
                return "findMachineShop=true";
            break;
						default:
        }
	},
	writeTracking: function(){
		var dealerChecked = '';
		mapTabs.tab_content.eq(0).find('input[type="checkbox"]:checked').each(function(){
			dealerChecked += $(this).val();
		});
		mapTabs.tab_content.eq(0).find('button.search').attr('data-tracking','/dealer-locator/dealer/'+dealerChecked+'/thank-you');
		
		var assistanceChecked = '';
		mapTabs.tab_content.eq(1).find('input[type="checkbox"]:checked').each(function(){
			assistanceChecked += $(this).val();
		});
		mapTabs.tab_content.eq(1).find('button.search').attr('data-tracking','/dealer-locator/assistance/'+assistanceChecked+'/thank-you');
	}
};

var activateDirections = {
	dealerPanel: null,
	returnDealer: null,
	directionsPanel: null,
	go_btn: null,
	init: function(){
		activateDirections.dealerPanel = $('div.locate');
		activateDirections.returnDealer = $('a.return_to_dealer');
		activateDirections.directionsPanel = $('div.directions');
		activateDirections.go_btn = $('div.ib_directions button');
		activateDirections.get_btn = activateDirections.directionsPanel.find('button');
		activateDirections.clickGo();
		activateDirections.clickRtD();//return to dealer
		//activateDirections.getDirections();//calc route gmaps
	},
	clickGo: function(){
		//activateDirections.go_btn.click(function(){
		activateDirections.go_btn.live('click',function(){
			activateDirections.togglePanels();
			return false;
		});
	},
	clickRtD: function(){
		activateDirections.returnDealer.click(function(){
			activateDirections.togglePanels();
            gMap.directionText.slideUp();
			return false;
		});
	},
	togglePanels: function(){
		activateDirections.dealerPanel.add(activateDirections.returnDealer).add(activateDirections.directionsPanel).fadeToggle();
	}/*,
	getDirections: function(){
		//alert('getdir');
		activateDirections.get_btn.click(function(){
			//alert('click!');
			gMap.calcRoute();
			return false;
		});
	} */
};

