/* Matteo 30/09/2008 */
/* javascript per le funzioni della "Cerca Viaggio" */

/* INIZIO AJAX chiamata alla pagina che resstituisce i viaggi trovati */
var externalSourceFile_cercaviaggi="jsp/bridge/cercaviaggi.jsp"; //jsp per la ricerca dei viaggi
var elencoViaggiTrovati=new Array();

function cercaViaggi() {
	//chiamiamo via AJAX la jsp che si occupa di fare la login
	var reqObject = new sack();
	reqObject.requestFile = externalSourceFile_cercaviaggi  + '?cerca_da=' + $("#cerca_da").val() +
		'&cerca_a=' + $("#cerca_a").val();	// Specifying which file to get
	reqObject.onCompletion = function(){ chkCercaViaggiFromServer(reqObject); };	// Specify function that will be executed after file has been found
	
	//nascondiamo il layer con l'immagine di "loading..." e viasualizzaimo il layer contenente il carosello
	//è importante che questo venga fatto prima dell'iniziaizzazione del carosello stesso altrimenti il layer che da hidden diventa block
	//contiene informazioni di width e height = 0 e gli oggetti all'interno del carosello non si vedono
	document.getElementById('viaggitrovati_loading').style.display='block';
	document.getElementById('viaggitrovati_screen').style.display='none';
	
	reqObject.runAJAX();		// Execute AJAX function
}

function trimString(sInString) {
  sInString = sInString.replace( /^\s+/g, "" );
  return sInString.replace( /\s+$/g, "" );
}

function chkCercaViaggiFromServer(reqObject) {
	//controlliamo il risultato della ricerca viaggi
	var res=reqObject.response;
	var items = res.split(/<item>/g);
	reqObject=false;
	elencoViaggiTrovati = new Array();
	
	for(var no=1;no<items.length;no++){
		var lines = items[no].split(/\n/g);
		elencoViaggiTrovati[no] = new Array();
		for(var no2=0;no2<lines.length;no2++){
			var key = lines[no2].replace(/<([^>]+)>.*/g,'$1');
			if (key) key = trimString(key);
			var pattern = new RegExp("<\/?" + key + ">","g");
			var value = lines[no2].replace(pattern,'');
			value = trimString(value);
			elencoViaggiTrovati[no][key] = value;
		}
	}
	showViaggiTrovati(); //si trova nel file "elencoviaggi.js"
}
/* FINE AJAX chiamata alla pagina che resstituisce i viaggi trovati */



/* INIZIO configurazione pagina di viaggi trovati */
// Set thickbox loading image
tb_pathToImage = "skin/thickbox/loading-thickbox.gif";
tb_pathToImage = "skin/thickbox/loading.gif";

/**
 * This is the callback function which receives notification
 * when an item becomes the first one in the visible range.
 * Triggered before animation.
 */
function mycarousel_itemVisibleInCallbackBeforeAnimation(carousel, item, idx, state) {
	// No animation on first load of the carousel
	if (state == 'init') return;
	jQuery('img', item).fadeIn('slow');
};
/**
 * This is the callback function which receives notification
 * when an item is no longer the first one in the visible range.
 * Triggered before animation.
 */
function mycarousel_itemVisibleOutCallbackBeforeAnimation(carousel, item, idx, state) {
	jQuery('img', item).fadeOut('slow');
};

/**
 * We use the initCallback callback
 * to assign functionality to the controls
 */
function mycarousel_initCallback(carousel) {
	jQuery('.jcarousel-scroll select').bind('change', function() {
		carousel.options.scroll = jQuery.jcarousel.intval(this.options[this.selectedIndex].value);
		return false;
	});

	jQuery('#mycarousel-next').bind('click', function() {
		carousel.next();
		return false;
	});

	jQuery('#mycarousel-prev').bind('click', function() {
		carousel.prev();
		return false;
	});
};
	
function setCarousel() {
	//inizializziamo il carosello
	jQuery('#mycarousel').jcarousel({
		scroll: 2,
		wrap: 'last',
		itemVisibleInCallback: {
			onBeforeAnimation: mycarousel_itemVisibleInCallbackBeforeAnimation
		},
		itemVisibleOutCallback: {
			onBeforeAnimation: mycarousel_itemVisibleOutCallbackBeforeAnimation
		},
		initCallback: mycarousel_initCallback
	});
}

function setMapViaggiTrovati(mapID, elencoFermate) {
	if (GBrowserIsCompatible()) {
		var map = new GMap2(document.getElementById(mapID), {size: new GSize(160,130)});
		//map.enableScrollWheelZoom();
		
		var dirn = new GDirections();
		dirn.load(elencoFermate, { getPolyline: true });
		GEvent.addListener(dirn, "load", function() {
			var bounds = dirn.getBounds();
			map.setCenter( bounds.getCenter(), map.getBoundsZoomLevel(bounds));
			
			var polyline = dirn.getPolyline();
			map.addOverlay(polyline);
		});
	}
}
		
//this is primary function that is called -
//from an onclick event in a link:
function caricaViaggio(title, link) {
	tb_show(title, link, true);
}

function showViaggiTrovati() {
	//ripuliamo il div che continene l'elenco dei viaggi trovati (carosello)
	var div=document.getElementById("viaggitrovati_screen");
	while (div.hasChildNodes()) {
		div.removeChild(div.firstChild);
	}
	
	//generiamo e carichiamo il carosello nel DIV
	div.innerHTML=setViaggiTrovati();
	caricaMappeViaggiTrovati();
	
	//aggiorniamo lo slider dei viaggi trovati
	setViaggiSlider();
		
	//visualizziamo il div e nascondiamo il div con la gif di "loading..."
	document.getElementById('viaggitrovati_loading').style.display='none';
	div.style.display='block';
	//impostiamo il carosello
	setCarousel();
}

function trimLongText(text, limit) {
	//se un testo supera il limite, sostituiamo il restante con 3 puntini
	if (text.length>limit) text=text.substring(0,(limit-3)) + "...";
	return text;
}

function setViaggiTrovati() {
	var viaggiTrovati="<ul id=\"mycarousel\" class=\"jcarousel-skin-tango\">";
		
	var i;
	if (elencoViaggiTrovati) {
		for (i=1;i<elencoViaggiTrovati.length;i++) {
			var trovadirezione="from: "+ elencoViaggiTrovati[i]['da'] //prima fermata
			trovadirezione=trovadirezione + " to: "+ elencoViaggiTrovati[i]['a'] //ultima fermata
			
			var str_percorsocompleto=elencoViaggiTrovati[i]['da'] + " - "; //per il tooltip percorso intero
			str_percorsocompleto=str_percorsocompleto + elencoViaggiTrovati[i]['a'];
			
			//creiamo un oggetto LI per il carosello e un DIV per la mappa che ospiterà il percorso corrente
			var htm="<li><div id=\"map_" + i + "\" style=\"width: 160px; height: 130px\"></div>";
			htm=htm + "<div id=\"mapdetail\">";
			htm=htm + "<b>Percorso</b>: " + i + " di " + (elencoViaggiTrovati.length-1) +
				"<br>Utente: " + elencoViaggiTrovati[i]['utente'] +
				
				//"<br><span class=\"normal\" style=\"cursor:help\" onmouseover=\"toolTip('<table class=tip><tr><td><b>Percorso completo</td></tr><tr><td>" + str_percorsocompleto + "</td></tr></table>')\" onmouseout=\"toolTip()\">Da: " + elencoViaggiTrovati[i]['da'] +
				//"<br>A: " + elencoViaggiTrovati[i]['a'] + "</span>" + 
				
				"<br>Da: " + trimLongText(elencoViaggiTrovati[i]['da'], 25) +
				"<br>A: " + trimLongText(elencoViaggiTrovati[i]['a'], 25) + 
				"<br>Data: " + elencoViaggiTrovati[i]['data'] + 
				"<br><a href=\"#panel_dettaglioviaggio\" onclick=\"loadDettaglioViaggio('" + elencoViaggiTrovati[i]['codviaggio'] + "')\">Dettagli</a>";
				//"<br><a href=\"javascript:caricaViaggio('Chiedi un passaggio', 'cercaviaggi_map_dettaglio.jsp?codviaggio=" + elencoViaggiTrovati[i]['codviaggio'] + "&keepThis=true&TB_iframe=true&height=500&width=500')\">Dettagli</a>";
			htm=htm + "</font></div></li>";
			//scriviamo l'elemento mappa nel carosello
			viaggiTrovati=viaggiTrovati + htm;
			
			//aggiungiamo la parte del dettaglio del viaggio (un div hidden)
			viaggiTrovati=viaggiTrovati + elencoViaggiTrovati[i]['dettaglio'];
		}
	}
	if (i<=1) {
		//se non ci sono percorsi creiamo un oggetto per il carosello con la sctitta di "nessun percorso caricato"
		var htm="<style type=\"text/css\">/*** Overwrite for having a carousel with dynamic width.*/" + 
			".jcarousel-skin-tango .jcarousel-item {width: 400px;height: 200px;}</style>";
		htm=htm + "<li><div style=\"text-align: center;\"><font color=\"gray\">Non ho trovato nessun viaggio sul tuo tragitto." + 
			"</font></div></li>";
		viaggiTrovati=viaggiTrovati + htm;
	}
	viaggiTrovati=viaggiTrovati + "</ul>"
	if (i>1) viaggiTrovati=viaggiTrovati + "<div><center><b>" + (i-1) + " possibili viaggi trovati</b></center></div><br>"
	
	//in ultimo aggiungiamo il tool con i controlli del carosello
	viaggiTrovati=viaggiTrovati + "<!-- layer comandi carosello -->" + 
		"<div class=\"jcarousel-scroll\">" + 
		"<center><table class=\"normal\">" + 
		"<tr>" + 
		"<td><a class=\"small\" href=\"#\" id=\"mycarousel-prev\">&laquo; Precedente</a></td>" + 
		"<td>" + 
		"<select style=\"width:200px;\">" + 
		"<option value=\"1\">Scorri 1 percorso per click</option>" + 
		"<option value=\"2\" selected>Scorri 2 percorsi per click</option>" + 
		"<option value=\"3\">Scorri 3 percorsi per click</option>" + 
		"</select>" + 
		"</td>" + 
		"<td><a class=\"small\" href=\"#\" id=\"mycarousel-next\">Successivo &raquo;</a></td>" + 
		"</table></center>" + 
		"</div>";
				
	return viaggiTrovati;
}

function caricaMappeViaggiTrovati() {
	//carichiamo le mappe dei viaggi trovati dentro il carosello
	if (elencoViaggiTrovati) {
		for (i=1;i<elencoViaggiTrovati.length;i++) {
			var trovadirezione="from: "+ elencoViaggiTrovati[i]['da'] //prima fermata
			trovadirezione=trovadirezione + " to: "+ elencoViaggiTrovati[i]['a'] //ultima fermata
			setMapViaggiTrovati("map_" + i, trovadirezione);
		}
	}
}

//funzione per caricare il dettaglio del viaggio selezionato
function loadDettaglioViaggio(codviaggio) {
	var div=document.getElementById("viaggitrovati_dettaglio");
	
	//copiamo il testo dal div gia preparato ma hidden, al div visibile nel pannello a scorrimento
	div.innerHTML=document.getElementById("viaggio_" + codviaggio).innerHTML;
	//visualizziamo il menu per tornare all'elenco dei viaggi
	document.getElementById("cmd_backtoviaggi").style.display='block';
}

// INIZIO Mappa di ricerca viaggio
$(document).ready(
	function() {
		// applichiamo l'hint a tutte le input che han un testo nel title
		$('input[title!=""]').hint();

		//settiamo lo slider dei viaggi trovati
		setViaggiSlider();
		
		//settiamo callback per visualizzare in tempo reale il percorso scelto dall'utente sulla mappa di ricerca viaggio
		$("#feature .home-form #cerca_da").change(
			function() {
				var loc = new GClientGeocoder();
				loc.getLocations($(this).val(), callback_rideSearchStart);
			}
		);
		$("#feature .home-form #cerca_da").blur(
			function() {
				var loc = new GClientGeocoder();
				loc.getLocations($(this).val(), callback_rideSearchStart);
			}
		);
		
		$("#feature .home-form #cerca_a").change(
			function() {
				var loc = new GClientGeocoder();
				loc.getLocations($(this).val(), callback_rideSearchEnd);
			}
		);
		$("#feature .home-form #cerca_a").blur(
			function() {
				var loc = new GClientGeocoder();
				loc.getLocations($(this).val(), callback_rideSearchEnd);
			}
		);
	}
);

var map=null;
var loc_start = null;
var loc_start_lat = null;
var loc_start_lng = null;
var loc_end = null;
var loc_end_lat = null;
var loc_end_lng = null;

function setMapTrovaViaggi() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map_canvas"));
		//map.addControl(new GSmallMapControl());
		//map.addControl(new GMapTypeControl());
		//map.enableScrollWheelZoom();
		
		//default Italia
		map.setCenter(new GLatLng(41.442726, 12.392578), 5);
	}
}
		
function callback_rideSearchStart(response) {
	if ($('#cerca_da').val()=='Partenza...') return;

	if (response.Status.code == G_GEO_SUCCESS) {
		var place = response.Placemark[0];
		loc_start_lat = place.Point.coordinates[1];
		loc_start_lng = place.Point.coordinates[0];

		loc_start = place.address;

		var marker = new GMarker(new GLatLng(loc_start_lat, loc_start_lng));
		map.addOverlay(marker);
		map.setCenter(new GLatLng(loc_start_lat, loc_start_lng), 8);

		if (loc_start && loc_end) {
			map.clearOverlays();
			//getRouteRides(loc_start_lat, loc_start_lng, loc_end_lat, loc_end_lng);
			
			directions = new GDirections();
			directions.load('from: ' + loc_start + ' to: ' + loc_end, { getPolyline: true });
			GEvent.addListener(directions, "load", function() {
				var bounds = directions.getBounds();
				if (bounds==null) return;
				
				map.setCenter( bounds.getCenter(), map.getBoundsZoomLevel(bounds));
				var polyline = directions.getPolyline();
				map.addOverlay(polyline);
			});
		}
	} else {
		loc_start = null;
		loc_start_lat = null;
		loc_start_lng = null;
	}
}

function callback_rideSearchEnd(response) {
	if ($('#cerca_a').val()=='Destinazione...') return;
	
	if (response.Status.code == G_GEO_SUCCESS) {
		var place = response.Placemark[0];
		loc_end_lat = place.Point.coordinates[1];
		loc_end_lng = place.Point.coordinates[0];

		loc_end = place.address;

		var marker = new GMarker(new GLatLng(loc_end_lat, loc_end_lng));
		map.addOverlay(marker);
		map.setCenter(new GLatLng(loc_end_lat, loc_end_lng), 8);

		if (loc_start && loc_end) {
			map.clearOverlays();
			//getRouteRides(loc_start_lat, loc_start_lng, loc_end_lat, loc_end_lng);
			
			directions = new GDirections();
			directions.load('from: ' + loc_start + ' to: ' + loc_end, { getPolyline: true });
			GEvent.addListener(directions, "load", function() {
				var bounds = directions.getBounds();
				if (bounds==null) return;
				
				map.setCenter( bounds.getCenter(), map.getBoundsZoomLevel(bounds));
				var polyline = directions.getPolyline();
				map.addOverlay(polyline);
			});
		}
	} else {
		loc_end = null;
		loc_end_lat = null;
		loc_end_lng = null;
	}
}

$(window).unload(
	function() {
		if (map) {
			GUnload();
		}
	}
);
// FINE Mappa di ricerca viaggio
/* FINE configurazione pagina di viaggi trovati */