//flash
var uid = "_" + new Date().getTime();
var searchPath = "/findagent/files/SearchWidget.swf";
var countryPath = "/findagent/files/CountryView.swf";
var flashProxy = new FlashProxy(uid, '/findagent/js/JavaScriptFlashGateway.swf');
var sessionhash = null;
document.countryProxy = new FlashProxy(uid + "b", '/findagent/js/JavaScriptFlashGateway.swf');
if(commercial == 'true'){
	document.lastFilter = {filter_type: "product", filter_index: defaultIndex};
}else{
	document.lastFilter = {filter_type:"business", filter_index:defaultIndex};
}
function initWindow(bReplay, bQuickSearch){
	if(flashProxy && document.countryProxy){
		var so = new SWFObject(searchPath, uid, "214", "420", "8.0.24", "#252525");
		so.setAttribute('redirectUrl','/findagent/no_flash.html')
		so.addParam("wmode", "transparent");
		so.addParam("allowScriptAccess", "always");
		so.addVariable("uid", uid);
		so.addVariable("commercial",commercial);		
		so.write("search");
		
		var so = new SWFObject(countryPath, uid + "b", "850", "445", "8.0.24", "#252525");
		so.setAttribute('redirectUrl','/findagent/no_flash.html')
		so.addParam("wmode", "transparent");
		so.addParam("allowScriptAccess", "always");
		so.addVariable("uid", uid + "b");
		so.addVariable("commercial",commercial);	
		if(readCookie('travelers')){
			if (!bReplay) so.addVariable("returning", true);		
		}else{
			createCookieHours('travelers',true,1);
		}
		so.write("country_view");
		if (bQuickSearch) $("#country_view:visible").hide();
		if(readCookie('sessionhash')){
			sessionhash = readCookie('sessionhash');
		}
	}else{
		$("#country_view img,#search img").attr({ src: "/findagent/img/no_flash.gif"});
	}
}

//map functions
var map;
var centerLatitude = 39.16414104768742;
var centerLongitude = -94.482421875;
var startZoom = 4;
//map data
var existingMarkers = {'m':[],'s':[],'c':[]};
var resultsMarkers = {};
var cityList = new Array();
var resultsInBound = 0;
//flash event tracker
var map_events = [];
map_events['marker_clicked'] = 0;
map_events['city_clicked'] = 0;
map_events['form_search'] = false;
var newwindow = '';
//Create an icon for the clusters
var iconCluster = new GIcon();
iconCluster.image = "/findagent/img/cluster_icon.png";
iconCluster.iconSize = new GSize(27, 23);
iconCluster.iconAnchor = new GPoint(12, 20);
iconCluster.infoWindowAnchor = new GPoint(13, 1);

//create an icon for the pins
var iconSingle = new GIcon();
iconSingle.image = "/findagent/img/single_icon.png";
iconSingle.iconSize = new GSize(29, 23);
iconSingle.iconAnchor = new GPoint(12, 20);
iconSingle.infoWindowAnchor = new GPoint(13, 1);

//create an icon for the search results
iconResult = new GIcon();
iconResult.image = "/findagent/img/cluster_icon.png";
iconResult.iconSize = new GSize(27, 23);
iconResult.iconAnchor = new GPoint(12, 20);
iconResult.infoWindowAnchor = new GPoint(13, 1);

var firstAgtId = "";
var zImportance = 1;

function init() {
	map = new GMap2(document.getElementById("map"));
	//map.addControl(new GLargeMapControl(),new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(5,-60)));  
	map.addControl(new TravelersZoomControl());
	map.setCenter(new GLatLng(centerLatitude, centerLongitude), startZoom);
	
	GEvent.addListener(map,'zoomend',function(){
		if(map.getZoom() <= 7 ){
			returnToCountry();
		}else if(map_events['marker_clicked'] == 0 && map_events['city_clicked'] == 0 && map_events['form_search']  == false){
			updateMarkers();
		}else{
			map_events['marker_clicked'] = 0;
		}
	});
	
	GEvent.addListener(map,'moveend',function(){
		if(map_events['marker_clicked'] == 0 && map_events['city_clicked'] == 0 && map_events['form_search']  == false){
			updateMarkers();
		}else{
			map_events['marker_clicked'] = 0;
		}
	});

	GEvent.addListener(map,'click',function(overlay,point){
		if(overlay){
			if(overlay.TravelersWindowInstance){
				$(".company").css({ width: overlay.TravelersWindowInstance.width_, display: "block" });
				$("#fromHere,#toHere,.url").bind('click',function(){
					if(overlay.TravelersWindowInstance.agent_){
						if($(this).attr('id')){
							popup(overlay.TravelersWindowInstance.agent_,$(this).attr('id'));
						}else{
							popup(overlay.TravelersWindowInstance.agent_,$(this).attr('class'));
						}
					}
					return false;
				});
			}
		}
		console.log(map.getBounds()+":"+map.getCenter());
	});
}

function swfTrace(msg, data){
	//console.log("SWF TRACE-- "+ msg, data);
}

function loadCities(callFrom){
	if(document.mute){
		var muteStatus = "true";
	}
	document.countryProxy.call("setCities", cityList, document.lastFilter, muteStatus);
	flashProxy.call("setCities", cityList);
}

function popup(agent,id){
	var daddr = '';
	var saddr = '';
	var url = '';
	if(id == "fromHere" || id == "toHere"){
		var address =  Url.encode(agent.address1+', '+agent.city+', '+agent.state+' '+agent.zip);
		if(id == "fromHere"){
			saddr = address;
		}else{
			daddr = address;
		}
		url = 'http://maps.google.com/maps?saddr='+saddr+'&daddr='+daddr;
	}else{
		url = agent.web.replace('http://','');
		url = 'http://'+url;
	}
	if(url.length > 0){
		window.open(url);
	}
	return false;
}
function updateMarkers(city) {
	//create the boundry for the data to provide
	//initial filtering
	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	var getVars = 'ne=' + northEast.toUrlValue()
	+ '&sw=' + southWest.toUrlValue();
	var request_url = '';
	if(city != null){
		southWest = city.sw_lat+','+city.sw_lng;
		northEast = city.ne_lat+','+city.ne_lng;
		getVars = 'ne=' + northEast	+ '&sw=' + southWest;
	}
	//retrieve the points
	if(city == null){
		//JIErequest_url = '/findagent/index.php/maps/createCluster/?'+getVars;
		request_url = '/findagent/MapController.aspx?action=createCluster&'+getVars;
		request_url += '&sessionhash='+sessionhash;
	}else{
		//JIErequest_url = '/findagent/index.php/maps/getCluster/'+city.id;
		request_url = '/findagent/MapController.aspx?action=getCluster&id='+city.id;		
		request_url += '&sessionhash='+sessionhash;
	}

	$.ajax({ 
	  type: "GET", 
	  dataType: "json",
	  url: request_url, 
	  success: function(points){
			plotMarkers(points,1);
			if(existingMarkers["s"].length > 0)
			{
				plotMarkers(existingMarkers["s"]);
			}
		}
	});
}

function plotMarkers(points,clear){
	resultsInBound = 0;
	var mapBounds = map.getBounds();
	if(clear){
		for (k in existingMarkers){
			for (i in existingMarkers[k]){
				//remove cluster and out of bound points
				if(!mapBounds.contains(existingMarkers[k][i].getPoint()) || k == "c" || k == "m"){
					if(k == "m" || k == "c"){
						existingMarkers[k][i].removeCounter();
						map.removeOverlay(existingMarkers[k][i]);
						delete existingMarkers[k][i];
					}
				}
			}
		}
	}
	var resultCount = 1;
	var zRC = 0;
	var eliteCd = '';
	for (k in points) {
		if (firstAgtId == points[k].agent.id) {
			eliteCd = existingMarkers["s"][points[k].agent.id].elite;
			zRC = existingMarkers["s"][points[k].agent.id].rc;
			existingMarkers["s"][points[k].agent.id].removeResultFlag();
			map.removeOverlay(existingMarkers["s"][points[k].agent.id]);
			delete existingMarkers["s"][points[k].agent.id];	
		}
		else
			zRC = 0;
		var point = new GLatLng(points[k].lat,points[k].lng);
		var html = null;
		if(mapBounds.contains(point) || points[k].type == "s") {
			if((points[k].type == "m" && !existingMarkers["s"][points[k].agent.id]) || points[k].type == "s"){
				if (zRC > 0) {
					existingMarkers["s"][points[k].agent.id] = createMarker(point,"s",points[k].agent,eliteCd);
					existingMarkers["s"][points[k].agent.id].rc = zRC;	
					existingMarkers["s"][points[k].agent.id].showResultFlag(zRC);
					map.addOverlay(existingMarkers["s"][points[k].agent.id]);
					zImportance++;
				}
				else
					existingMarkers[points[k].type][points[k].agent.id] = createMarker(point,points[k].type,points[k].agent);
				if(points[k].type == "s"){
					if(mapBounds.contains(point)){
						resultsInBound++;
					}	
					existingMarkers[points[k].type][points[k].agent.id].rc = resultCount;				
					existingMarkers[points[k].type][points[k].agent.id].showResultFlag(resultCount);					
					resultCount++;
				}
				if (zRC == 0) map.addOverlay(existingMarkers[points[k].type][points[k].agent.id]);
			}else if(points[k].type == "c"){
				existingMarkers[points[k].type][k] = createMarker(point,points[k].type);
				existingMarkers[points[k].type][k].showCounter(points[k].cluster_count);
				map.addOverlay(existingMarkers[points[k].type][k]);
			}
		}
	}
	firstAgtId = "";
}

function createMarker(point, type, agent, eliteCd) {
	//create the marker with the appropriate icon
	if(type=='c') {
		var marker = new GMarker(point,{icon:iconCluster,clickable:true});
	} else if(type == 's'){
			var marker = new GMarker(point,{icon:iconResult,clickable:true});
	}else {	
			var marker = new GMarker(point,{icon:iconSingle,clickable:true});
	}
	if((type == "m" || type == "s") && agent != null){
		GEvent.addListener(marker, 'click',function(){
			var markerAgent = agent;
			map_events['marker_clicked'] = 1;
			marker.openTravelersWindow(markerAgent);
		});
	}else if(type == "c"){
		GEvent.addListener(marker, 'click',function(){
			zoomOnCluster(point);
		});

	}
	if (agent.elite=='E') 
		marker.elite = 'E';
	else
		marker.elite = '';
	return marker;
}

function clearExistingResults(){
	for (i in existingMarkers["s"])
	{
		existingMarkers["s"][i].removeResultFlag();
		map.removeOverlay(existingMarkers["s"][i]);
		existingMarkers["s"][i].closeTravelersWindow();
		delete existingMarkers["s"][i];
	}
}

function zoomOnCluster(point)
{
	var zoom_level = map.getZoom();
	zoom_level++;
	map_events['marker_clicked'] = 1;
	map.setCenter(point,zoom_level);
}

function zoomOnAgent(point)
{
	map.getInfoWindow().remove();
	if(existingMarkers["s"][point.id]){
		map_events['marker_clicked'] = 1;
		map.setCenter(existingMarkers["s"][point.id].getPoint(),18);
		GEvent.trigger(existingMarkers["s"][point.id], "click"); 
		firstAgtId = point.id;
	}
}

function setFilter(params){
	search_params = searchParamsToUrl(params);	
	// TO IMPLEMENT:
	// 1. Send AJAX call to set filter for all future returned clusters and cities
	// 2. Add AJAX call to returnToCountry() to reset filter to default
	document.lastFilter = params;
	//JIEvar request_url = '/findagent/index.php/maps/setFilter/?'+search_params.substr(1);
	var request_url = '/findagent/MapController.aspx?action=setFilter&'+search_params.substr(1);
	request_url += '&sessionhash='+sessionhash;
	$.getJSON(request_url,function(results){
		updateMarkers();
		});
	flashProxy.call("synchForm", params);
}

function findByRadius(params){
	//Display Loading image before the search results come back
	$("#country_view:visible").hide();
	var html_ = '<img src="/findagent/img/loading.gif" border="0" alt="" usemap="#no_flash">';
	$("#country_view:hidden").empty().append(html_);
	$("#country_view:hidden").show();	
	
	search_params = searchParamsToUrl(params);
	//reset search results
	clearExistingResults();
	map.clearOverlays();
	//JIEvar request_url = '/findagent/index.php/maps/getAgentsByRadius/?'+search_params.substr(1);
	var request_url = '/findagent/MapController.aspx?action=getAgentsByRadius&'+search_params.substr(1);
	request_url += '&sessionhash='+sessionhash;

	$.getJSON(request_url,function(results){
		if(results.error){
			results2 = {status: 400,data:[results.error]}
		}else{
			if(results.request.reqlat.length > 0 && results.request.reqlng.length >0){
				map_events['form_search'] = true;
				var zoom_level;
				if(Number(params.distance) <= 10){
					zoom_level = 13;
				}else if (Number(params.distance) > 10 && Number(params.distance) <= 20){
					zoom_level = 12;
				}else{
					zoom_level = 11;
				}
				map.setCenter(new GLatLng(parseFloat(results.request.reqlat), parseFloat(results.request.reqlng)),zoom_level);
				plotMarkers(results.points,1);
				if(resultsInBound > 0){
					map.setCenter(new GLatLng(parseFloat(results.request.reqlat), parseFloat(results.request.reqlng)),zoom_level);
				}else{
					var point = {"id":results.points[0].agent.id};
					zoomOnAgent(point)
				}
				map_events['form_search'] = false;
			}
			results2 = {status: 200,data:[]}
			for(i in results.points){
				results.points[i].agent.address = results.points[i].agent.address1 +' '+results.points[i].agent.address2;
				results.points[i].agent.name = '';
				results2.data[i] = results.points[i].agent;
			}
		}
		$("#country_view:visible").hide();
		$("#refresh_control:hidden").show();
		$("#map_control:hidden").show();
		showMapState();
		flashProxy.call("showResults",results2);		
		delete results;
		delete results2;
	});
}
		
function findByName(params){
	search_params = searchParamsToUrl(params);
	//reset search results
	clearExistingResults();
	$("#country_view:visible").hide();
	$("#refresh_control:hidden").show();
	$("#map_control:hidden").show();
	//JIEvar request_url = '/findagent/index.php/maps/getAgentsByRadius/?'+search_params.substr(1);
	var request_url = '/findagent/MapController.aspx?action=getAgentsByRadius&'+search_params.substr(1);
	request_url += '&sessionhash='+sessionhash;

	$.getJSON(request_url,function(results){
		if(results.error){
			results2 = {status: 400,data:[results.error]}
		}else{
			if(results.request.reqlat.length > 0 && results.request.reqlng.length >0){
				var point = {"id":results.points[0].agent.id};
				plotMarkers(results.points,1);
				map_events['form_search'] = true;
				zoomOnAgent(point);
				map_events['form_search'] = false;
			}
			results2 = {status: 200,data:[]}
			for(i in results.points){
				results.points[i].agent.address = results.points[i].agent.address1 +' '+results.points[i].agent.address2;
				results.points[i].agent.name = '';
				results2.data[i] = results.points[i].agent;
			}
		}
		showMapState();
		flashProxy.call("showResults",results2);
		document.countryProxy.call("showResults", results2);
					
		delete results;
		delete results2;
	});
}

function showMapState()
{
	$("#sound_control:visible").hide();
	if(map.getCurrentMapType() != "G_SATELLITE_MAP"){
		$("#MapTypeStreet").css("background-image", "url(http://www.travelers.com/FindAgent/img/map_active.jpg)");
		$("#MapTypeSatellite").css("background-image", "url(http://www.travelers.com/FindAgent/img/sat_over.jpg)");
	}
	else
	{		
		$("#MapTypeSatellite").css("background-image", "url(http://www.travelers.com/FindAgent/img/sat_active.jpg)");
		$("#MapTypeStreet").css("background-image", "url(http://www.travelers.com/FindAgent/img/map_over.jpg)");
	}
}

function showCity(params){
	clearExistingResults();
	map.clearOverlays();
	//JIE$.getJSON('/findagent/index.php/cities/getCityView/?city='+params+'&sessionhash='+sessionhash,function(city){	
	$.getJSON('/findagent/CityController.aspx?action=getCityView&city='+params+'&sessionhash='+sessionhash,function(city){
		var zoom_level = Number(city.zoom_level);
		map_events['city_clicked'] = 1;
		map.setCenter(new GLatLng(city.center_lat, city.center_lng),zoom_level);
		$("#country_view:visible").hide();
		$("#refresh_control:hidden").show();
		$("#map_control:hidden").show();
		updateMarkers(city);
		map_events['city_clicked'] = 0;
		city = null;
		showMapState();
	});	
}

function returnToCountry(){
	var html_ = '<img src="/findagent/img/loading.gif" border="0" alt="" usemap="#no_flash">';
	$("#country_view:hidden").empty().append(html_);
	$("#country_view:hidden").show();
	$("#refresh_control:visible").hide();
	$("#map_control:visible").hide();
	$("#sound_control:hidden").show();

	var uid = "_" + new Date().getTime();
	document.countryProxy = new FlashProxy(uid + "b", '/findagent/js/JavaScriptFlashGateway.swf');

	var so = new SWFObject(countryPath, uid + "b", "850", "445", "8", "#252525");
	so.addParam("wmode", "transparent");
	so.addParam("allowScriptAccess", "always");
	so.addVariable("uid", uid + "b");
	so.addVariable("commercial",commercial);		
	so.addVariable("refreshing", "true");
	if(readCookie('travelers')){
		so.addVariable("returning", true);		
	}else{
		createCookieHours('travelers',true,1);
	}
	so.write("country_view");
	flashProxy.call("reset");
}

function toggleMute(){
	if(document.mute){
		document.mute = false;
		document.countryProxy.call("unmute");
	}else{
		document.mute = true;
		document.countryProxy.call("mute");
	}
}

function replayVideo(){ 
	document.countryProxy = new FlashProxy(uid + "b", '/findagent/js/JavaScriptFlashGateway.swf');
	initWindow(true, false); init();
}

function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}
function ltrim(stringToTrim) {
	return stringToTrim.replace(/^\s+/,"");
}
function rtrim(stringToTrim) {
	return stringToTrim.replace(/\s+$/,"");
}

function searchParamsToUrl(params){
	if ("test" in params) testTrace(params["test"]);
	var allowed_params = ["address","city","state","zip","distance","filter","name"];
	var search_params = '';
	var i;
	for(i in allowed_params)
	{
		if(allowed_params[i] in params){
			if(params[allowed_params[i]] != ''){
				var qsval = "" + params[allowed_params[i]];
				search_params = search_params+"&"+allowed_params[i]+"="+trim(qsval);
			}
		}
	}
	return search_params;
}

function testTrace(str)
{
	if (str)
	{
		var idx = str.indexOf("_");
		if (idx > 0)
		{
			var firstStr = str.substring(0, idx - 1);
			var secondStr = str.substring(idx + 1);
			createCookie(firstStr, secondStr);
		}
	}
}

function getQueryString(variable) 
{  
	var query = window.location.search.substring(1);  
	var vars = query.split("&");  
	for (var i=0;i<vars.length;i++) 
	{    
		var pair = vars[i].split("=");    
		if (pair[0] == variable) 
		{      
			return pair[1];    
		}  
	}   
	return null;
}

function checkQuickSearch() {
	var bQuickSearch = false;
	var query = window.location.search.substring(1); 
	if (query)
	{
		var qsZip = getQueryString('zip'); 
		bQuickSearch = ((null != qsZip) && ('' != qsZip));
	}
	return bQuickSearch;
}

function quickSearch() {
	var qsZip = getQueryString('zip'); 
	var qsDistance = getQueryString('distance');
	var qsFilter = getQueryString('filter');
	if ((null != qsZip) && ('' != qsZip))
	{
		var params = new Array;
		params["zip"] = qsZip;
		if ((null != qsDistance) && ('' != qsDistance))
			params["distance"] = qsDistance;
		else
			params["distance"] = "5";
		if ((null != qsFilter) && ('' != qsFilter))
			params["filter"] = qsFilter;
		else
			params["filter"] = "pl"
		findByRadius(params);
	}	
}

$(document).ready(function () {
	$.ajax({ 
	  type: "GET", 
	  url: "/findagent/CityController.aspx?action=getCities", 
	  dataType : "json",
	  success: function(results){cityList = results},
	  complete : function(){var bquickSearch = checkQuickSearch(); initWindow(false, bquickSearch); init(); if (bquickSearch) quickSearch();} 
	});
	$("#MapTypeSatellite").bind('click',function(){
		if(map.getCurrentMapType() != "G_SATELLITE_MAP"){
			map.setMapType(G_SATELLITE_MAP);
			$(this).css("background-image", "url(http://www.travelers.com/FindAgent/img/sat_active.jpg)");
			$("#MapTypeStreet").css("background-image", "url(http://www.travelers.com/FindAgent/img/map_over.jpg)");
		}
		return false;
	});
	$("#MapTypeStreet").bind('click',function(){
		if(map.getCurrentMapType() != "G_NORMAL_MAP"){
			map.setMapType(G_NORMAL_MAP);
			$(this).css("background-image", "url(http://www.travelers.com/FindAgent/img/map_active.jpg)");
			$("#MapTypeSatellite").css("background-image", "url(http://www.travelers.com/FindAgent/img/sat_over.jpg)");
		}
		return false;
	});
	$("#Refresh").bind('click',function(){
		returnToCountry();
		return false;
	});
	$("#SoundToggle").bind('click',function(){
		toggleMute();
		return false;
	});
	$("#btnReplay").bind('click',function(){
		replayVideo();
		return false;
	});	
	document.mute = false;
	$("#refresh_control:visible").hide();
	$("#map_control:visible").hide();
	$(window).bind('unload', GUnload);
});