var map;
var jsonData;
var cluster;
var systemTexts;
var infoWindow;

var globalStaticSitesArray = [];
globalStaticSitesArray["statoil"] = new Array(); 
globalStaticSitesArray["1-2-3"] = new Array(); 
globalStaticSitesArray["truckdiesel"] = new Array();

var checkedBoxes = [];
checkedBoxes["category_statoil"] = false;
checkedBoxes["category_1_2_3"] = false;
checkedBoxes["category_truckdiesel"] = false;
checkedBoxes["fueltype_bio_E85"] = false;
checkedBoxes["fueltype_adblue"] = false;
checkedBoxes["service_24h"] = false;
checkedBoxes["service_carwash"] = false;
checkedBoxes["service_rentalcars"] = false;
checkedBoxes["service_apotek"] = false;

var MARKER_SIZE = new google.maps.Size(28, 46);
var ICONS = [];
ICONS["cluster_sweden"] = "maps/img/pin_flag_swe.png";
ICONS["cluster_norway"] = "maps/img/pin_flag_nor.png";
ICONS["cluster_denmark"] = "maps/img/pin_flag_den.png";
ICONS["statoil"] = "maps/img/pin_statoil.png";
ICONS["1-2-3"] = "maps/img/pin_123.png";
ICONS["truckdiesel"] = "maps/img/pin_truckdiesel.png";
ICONS["cluster_stations"] = "maps/img/pin_kluster_statoil.png";

var LOGOS = [];
LOGOS["statoil"] = "maps/img/logo_statoil.png";
LOGOS["1-2-3"] = "maps/img/logo_123.png";
LOGOS["truckdiesel"] = "maps/img/logo_truckdiesel.png";

var SERVICE_ICONS = [];
SERVICE_ICONS["adblue"] = "maps/img/srv_icns/AdBlue.png";
SERVICE_ICONS["always_open"] = "maps/img/srv_icns/24h_service.png";
SERVICE_ICONS["carwash"] = "maps/img/srv_icns/carwash.png";
SERVICE_ICONS["carwashmanual"] = "maps/img/srv_icns/carwash_manual.png";
SERVICE_ICONS["coffee"] = "maps/img/srv_icns/coffee.png";
SERVICE_ICONS["gas"] = "maps/img/srv_icns/Gas.png";
SERVICE_ICONS["oil"] = "maps/img/srv_icns/oil.png";
SERVICE_ICONS["rentalcars"] = "maps/img/srv_icns/Car_hire.png";
SERVICE_ICONS["rentaltrailers"] = "maps/img/srv_icns/trailer_let.png";
SERVICE_ICONS["restaurant"] = "maps/img/srv_icns/restaurant.png";
SERVICE_ICONS["routex"] = "maps/img/srv_icns/routex.png";
SERVICE_ICONS["routex_truck"] = "maps/img/srv_icns/routex_truck.png";
SERVICE_ICONS["service"] = "maps/img/srv_icns/Service.png";
SERVICE_ICONS["shop"] = "maps/img/srv_icns/Shop.png";
SERVICE_ICONS["shower"] = "maps/img/srv_icns/shower.png";
SERVICE_ICONS["truckparking"] = "maps/img/srv_icns/P_truck.png";
SERVICE_ICONS["truckwash"] = "maps/img/srv_icns/Truck_wash.png";
SERVICE_ICONS["tireservice"] = "maps/img/srv_icns/wheel.png";
SERVICE_ICONS["vacuumclean"] = "maps/img/srv_icns/vacuum_clean.png";
SERVICE_ICONS["wcempty"] = "maps/img/srv_icns/WC_empty.png";
SERVICE_ICONS["wirelessnetwork"] = "maps/img/srv_icns/wireless_network.png";
SERVICE_ICONS["95"] = "maps/img/srv_icns/95.png";
SERVICE_ICONS["98"] = "maps/img/srv_icns/98.png";
SERVICE_ICONS["d_diesel"] = "maps/img/srv_icns/D_diesel.png";
SERVICE_ICONS["diesel"] = "maps/img/srv_icns/Diesel.png";
SERVICE_ICONS["E85"] = "maps/img/srv_icns/E85.png";
SERVICE_ICONS["apotek"] = "maps/img/srv_icns/apotek.jpg";

function initialize() {
	map = new google.maps.Map(document.getElementById("map_canvas"), {
    	zoom: 4,
    	center: new google.maps.LatLng(63.0, 12.0),
    	navigationControl: true,
    	mapTypeControl: true,
    	scaleControl: true,
    	mapTypeId: google.maps.MapTypeId.ROADMAP
    });
  	infoWindow = new google.maps.InfoWindow({maxWidth:380});
    cluster = new MarkerClusterer(map, null, {gridSize:30});
    cluster.setStyles([{url:ICONS["cluster_stations"], height: 58, width: 37, opt_textSize: 1}]);
   
	initializeSystemTextsFromArguments(arguments);
	processJsonFile(); 
  	showStartMap();

  	function initializeSystemTextsFromArguments(inArguments) {
  		systemTexts = [];
  		for(var i=0; i<inArguments.length; i++) {
  			systemTexts.push(inArguments[i]);
  		}
  	}

  	function processJsonFile() {
  		jsonData = eval('(' + jsonFile + ')');
  		initializeGlobalStaticSitesArray(jsonData);
  	}

  	function initializeGlobalStaticSitesArray(jsonData) {
  		for (var i=0; i<jsonData.types.length; i++) {
  			var typename = jsonData.types[i].name;
  			for (var j=0; j<jsonData.types[i].sites.length; j++) {
  				var site = jsonData.types[i].sites[j];
  				var point = new google.maps.LatLng(parseFloat(site.lat), parseFloat(site.lng));
  				var marker = createMarker(point, typename, site);
  				if(typename.indexOf("cluster") == -1) {
  					globalStaticSitesArray[typename].push(marker);
  				}
  			}
  		}
  	}

  	function showStartMap() {
  		var markersArray = iterateThroughJsonObject("", checkedBoxes, true);
  		for(var i=0; i<markersArray.length; i++) {
  			cluster.addMarkers(markersArray[i]);
  		}
  	}
}

function createMarker(point, icontype, site) {
	var marker = new google.maps.Marker({position:point});
	if(icontype.indexOf("cluster") != -1) {
		marker.setIcon(ICONS[icontype]);
		google.maps.event.addListener(marker, "click", function() {
			var markersArray = iterateThroughJsonObject("", checkedBoxes, false);
			cluster.clearMarkers();
			for(var i=0; i<markersArray.length; i++) {
				cluster.addMarkers(markersArray[i]);
			}
			map.setCenter(point, 6);
			cluster.redraw();
		});
	} else {
		marker.setIcon(new google.maps.MarkerImage(ICONS[icontype], null, null, null, MARKER_SIZE));
		google.maps.event.addListener(marker, "click", function () {
			var headersNode = document.createElement("ul");
			var header1 = wrapTabHeaderIntoNode(transformASCIIToSpecialCharacters(site.name), 1);
			var header2 = wrapTabHeaderIntoNode(systemTexts[0], 2);
			var header3 = wrapTabHeaderIntoNode(systemTexts[1], 3);
			headersNode.appendChild(header1);
			headersNode.appendChild(header2);
			headersNode.appendChild(header3);
			var content1 = wrapTabContentIntoNode(["<table id=\"info_content_table\"><tr><td><a href=\"", site.url, "\"><b>", site.name, "</b></a><br><br>",
			                                          	site.street, "<br>",
			                                          	site.zipcode, " ", site.state, "<br><br>",
														"Tel: ", site.phonenumber, "<br>",
														"E-mail:  ", "<a href=\"mailto:", site.email, "\">", site.email, "</a></td>",
														"<td><img src=", LOGOS[icontype], " alt=\"\" height=\"80px\" id=\"logo_img\"></img></td></tr></table>"].join(""),
														1
													);
			var rawHtml2 = ["<table id=\"info_content_table\"><tr><td><a href=\"", site.url, "\"><b>", site.name, "</b></a><br><br>"].join("");
			if(site.allday == 1) {				
				rawHtml2 = [rawHtml2, systemTexts[2]].join("");
			} else {
				rawHtml2 = [rawHtml2, "<table id=\"opening_hours_table\"><tr><td>", systemTexts[3], "</td><td>", site.weekdays, "</td></tr>",
							"<tr><td>", systemTexts[4], "</td><td>", site.saturdays, "</td></tr>",
							"<tr><td>", systemTexts[5], "</td><td>", site.sundays, "</td></tr></table>"].join("");
			}
			rawHtml2 = [rawHtml2, "</td></tr></table>"].join("");
			var content2 = wrapTabContentIntoNode(rawHtml2, 2);
			
			var serviceIcons = getServiceIcons(site.services);
			var rawHtml3 = ["<table id=\"info_content_table\"><tr><td><a href=\"", site.url, "\"><b>", site.name, "</b></a><br><br>",
			                "<table><tr>"].join("");
			for(var i=0; i<serviceIcons.length; i++) {
				rawHtml3 = [rawHtml3, "<td><img src=", serviceIcons[i][0], " alt=\"", serviceIcons[i][1], "\" height=\"30px\" width=\"25px\"></img></td>"].join("");
				if(i != 0 && i%7 == 0) {
					rawHtml3 = [rawHtml3, "</tr><tr>"].join("");
				}
			}
			rawHtml3 = [rawHtml3, "</tr></table></td></tr></table>"].join("");
			var content3 = wrapTabContentIntoNode(rawHtml3, 3);
			
			var tabDiv = document.createElement("div");
			tabDiv.setAttribute("id", "tabs");
			tabDiv.appendChild(headersNode);
			tabDiv.appendChild(content1);
			tabDiv.appendChild(content2);
			tabDiv.appendChild(content3);
			infoWindow.setContent(tabDiv);
            infoWindow.open(map, marker);
            $("#tabs").tabs();
		});
	}
	return marker;

	function wrapTabHeaderIntoNode(label, tabNumber) {
		var tabHeader = document.createElement("li");
		tabHeader.innerHTML = ["<a href=\"#tabNo", tabNumber, "\"><span>", label, "</span></a>"].join("");
		return tabHeader;
	}

	function wrapTabContentIntoNode(content, tabNumber) {
		var tabContent = document.createElement("div");
		tabContent.setAttribute("id", "tabNo" + tabNumber);
		tabContent.setAttribute("class", "info_window");
		tabContent.innerHTML = content;
		return tabContent;
	}
	
	function getServiceIcons(services) {
		var serviceIcons = [];
		for(var i=0; i<services.length; i++) {
			switch(services[i][0]) {
			case(61352) : case(61360) :	case(61361) :
				serviceIcons.push([SERVICE_ICONS["adblue"], services[i][1]]);
				break;
			case(10010) : case(20000) :	case(50000) :
				serviceIcons.push([SERVICE_ICONS["always_open"], services[i][1]]);
				break;
			case(10006) : case(20002) :	case(50003) :
				serviceIcons.push([SERVICE_ICONS["carwash"], services[i][1]]);
				break;
			case(20024) : case(50013) :
				serviceIcons.push([SERVICE_ICONS["carwashmanual"], services[i][1]]);
				break;
			case(10025) : case(20007) : case(50025) :
				serviceIcons.push([SERVICE_ICONS["coffee"], services[i][1]]);
				break;
			case(10000) : case(20020) : case(50051) :
				serviceIcons.push([SERVICE_ICONS["gas"], services[i][1]]);
				break;
			case(10029) :
				serviceIcons.push([SERVICE_ICONS["oil"], services[i][1]]);
				break;
			case(20003) : case(50002) :
				serviceIcons.push([SERVICE_ICONS["rentalcars"], services[i][1]]);
				break;
			case(10015) : case(20015) :	case(50016) :
				serviceIcons.push([SERVICE_ICONS["rentaltrailers"], services[i][1]]);
				break;
			case(20034) : case(61014) : case(61015) :
				serviceIcons.push([SERVICE_ICONS["restaurant"], services[i][1]]);
				break;
//			case() : case() : case() :
//				serviceIcons.push([SERVICE_ICONS["routex"], services[i][1]]);
//				break;
//			case() : case() : case() :
//				serviceIcons.push([SERVICE_ICONS["routextruck"], services[i][1]]);
//				break;
			case(10019) : case(20013) : case(50014) :
				serviceIcons.push([SERVICE_ICONS["service"], services[i][1]]);
				break;
			case(20010) : case(61035) : case(61036) :
				serviceIcons.push([SERVICE_ICONS["shop"], services[i][1]]);
				break;
			case(20025) : case(50007) : case(61012) :
				serviceIcons.push([SERVICE_ICONS["shower"], services[i][1]]);
				break;
			case(61016) : case(61017) : case(61018) :
				serviceIcons.push([SERVICE_ICONS["truckparking"], services[i][1]]);
				break;
			case(61009) : case(61010) : case(61019) :
				serviceIcons.push([SERVICE_ICONS["truckwash"], services[i][1]]);
				break;
			case(10009) : case(20027) :	case(50006) :
				serviceIcons.push([SERVICE_ICONS["tireservice"], services[i][1]]);
				break;
//			case() : case() : case() :
//				serviceIcons.push([SERVICE_ICONS["vacuumclean"], services[i][1]]);
//				break;
			case(20032) : case(50018) :
				serviceIcons.push([SERVICE_ICONS["wcempty"], services[i][1]]);
				break;
			case(50050) :
				serviceIcons.push([SERVICE_ICONS["wirelessnetwork"], services[i][1]]);
				break;
			case(10035) : case(20044) : case(50043) :
				serviceIcons.push([SERVICE_ICONS["95"], services[i][1]]);
				break;
			case(10036) : case(20045) : case(50044) :
				serviceIcons.push([SERVICE_ICONS["98"], services[i][1]]);
				break;
			case(10028) : case(20050) : case(50047) :
				serviceIcons.push([SERVICE_ICONS["d_diesel"], services[i][1]]);
				break;
//			case(10028) : case(20050) : case(50047) :
//				serviceIcons.push([SERVICE_ICONS["diesel"], services[i][1]]);
//				break;
			case(20043) : case(61355) :
				serviceIcons.push([SERVICE_ICONS["E85"], services[i][1]]);
				break;
			case(61367) : 
				serviceIcons.push([SERVICE_ICONS["apotek"], services[i][1]]);
				break;
			default :
				break;
			}
		}
		return serviceIcons;
	}
}

function ifEnterSearchSites(event) {
	var theCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
	if (theCode == 13) {
		searchSites();
	}
}
	
function searchSites() {
	var searchstring = document.forms["searchform"].searchtext.value;
	var checkedBoxes = [];
	checkedBoxes["category_statoil"] = document.forms["searchform"].category_statoil.checked;
	checkedBoxes["category_1_2_3"] = document.forms["searchform"].category_1_2_3.checked;
	checkedBoxes["category_truckdiesel"] = document.forms["searchform"].category_truckdiesel.checked;
	checkedBoxes["fueltype_bio_E85"] = document.forms["searchform"].fueltype_bio_E85.checked;
	checkedBoxes["fueltype_adblue"] = document.forms["searchform"].fueltype_adblue.checked;
	checkedBoxes["service_24h"] = document.forms["searchform"].service_24h.checked;
	checkedBoxes["service_carwash"] = document.forms["searchform"].service_carwash.checked;
	checkedBoxes["service_rentalcars"] = document.forms["searchform"].service_rentalcars.checked;
	checkedBoxes["service_apotek"] = document.forms["searchform"].service_apotek.checked;
	
	var response = iterateThroughJsonObject(searchstring, checkedBoxes, false);
	redrawMap(response);

	function redrawMap(markersArray) {
		var noStations = true;
		infoWindow.close();
		cluster.clearMarkers();
		for(var i=0; i<markersArray.length; i++) {
			if(markersArray[i].length > 0) {
				cluster.addMarkers(markersArray[i]);
				noStations = false;
			}
		}
		if(noStations) {
		    map.setCenter(new google.maps.LatLng(63.0, 12.0), 4);
		    alert("There were no stations found");
		} else {
			var bounds = new google.maps.LatLngBounds();
			var markers = cluster.getMarkers();
			for(var i=0; i<markers.length; i++) {
				bounds.extend(markers[i].getPosition());
			}
			map.fitBounds(bounds);
		}
	}
}

function iterateThroughJsonObject(searchstring, checkedBoxes, onLoad) {
	var response = [];
	var searchStringIsEmpty = searchstring == null || searchstring == "";
	var noCategoryIsChecked = !checkedBoxes["category_statoil"] && !checkedBoxes["category_1_2_3"] && !checkedBoxes["category_truckdiesel"];
	var allCategoriesAreChecked = checkedBoxes["category_statoil"] && checkedBoxes["category_1_2_3"] && checkedBoxes["category_truckdiesel"];
	var noFueltypeNorServiceIsChecked = !checkedBoxes["fueltype_bio_E85"] && !checkedBoxes["fueltype_adblue"] && !checkedBoxes["service_24h"] && !checkedBoxes["service_carwash"] && !checkedBoxes["service_rentalcars"] && !checkedBoxes["service_apotek"];
	if(onLoad) {
		var markers = [];
		for (var i=0; i<jsonData.types.length; i++) {
			var type = jsonData.types[i].name;
			if(type.indexOf("cluster") != -1) {
				var typename = jsonData.types[i].name;
				for (var j=0; j<jsonData.types[i].sites.length; j++) {
		    		var site = jsonData.types[i].sites[j];
	    			var latitude = parseFloat(site.lat);
	    			var longitude = parseFloat(site.lng);
	    			var point = new google.maps.LatLng(latitude, longitude);
	    			markers.push(createMarker(point, typename, site));
				}
			}
		}
		response.push(markers);
	} else if(noFueltypeNorServiceIsChecked && searchStringIsEmpty) {
		if(noCategoryIsChecked || allCategoriesAreChecked) {
			response.push(globalStaticSitesArray["statoil"]);
			response.push(globalStaticSitesArray["1-2-3"]);
			response.push(globalStaticSitesArray["truckdiesel"]);
		} else {
			if(checkedBoxes["category_statoil"]) {
				response.push(globalStaticSitesArray["statoil"]);
			}
			if(checkedBoxes["category_1_2_3"]) {    
				response.push(globalStaticSitesArray["1-2-3"]);
			}
			if(checkedBoxes["category_truckdiesel"]) {
				response.push(globalStaticSitesArray["truckdiesel"]);
				var markers = [];
				for (var i=0; i<jsonData.types.length; i++) {
					var typename = jsonData.types[i].name;
					if (typename == "statoil") {
						for (var j=0; j<jsonData.types[i].sites.length; j++) {
							var site = jsonData.types[i].sites[j];
							if (hasTuckdieselService(site)) {
								var latitude = parseFloat(site.lat);
								var longitude = parseFloat(site.lng);
								var point = new google.maps.LatLng(latitude, longitude);
								markers.push(createMarker(point, typename, site));
							}
						}	
					}
				}
				response.push(markers);
			}
		}
    } else {
		var markers = [];
		var encodedSearchString = transformSpecialCharactersToASCII(searchstring);
		var regExp = new RegExp(".*" + encodedSearchString + ".*", "i"); 
		for (var i=0; i<jsonData.types.length; i++) {
	   		var typename = jsonData.types[i].name;
	   		if(((noCategoryIsChecked) && typename.indexOf("cluster") == -1) ||
	   				((typename == "statoil" && (checkedBoxes["category_statoil"] || checkedBoxes["category_truckdiesel"])) || 
	   				(typename == "1-2-3" && checkedBoxes["category_1_2_3"]) || 
	   				(typename == "truckdiesel" && checkedBoxes["category_truckdiesel"]))) {
				for (var j=0; j<jsonData.types[i].sites.length; j++) {
		    		var site = jsonData.types[i].sites[j];
					var regExpMatches = site.name.match(regExp) || site.street.match(regExp) || site.state.match(regExp);
		    		if((regExpMatches && (noFueltypeNorServiceIsChecked || showStationWithFuelTypeOrService(site, checkedBoxes)))) {
						var latitude = parseFloat(site.lat);
		    			var longitude = parseFloat(site.lng);
		    			var point = new google.maps.LatLng(latitude, longitude);
		    			markers.push(createMarker(point, typename, site));
		    		}
				}
	   		}
		}
		response.push(markers);
	}
	return response;

	function hasTuckdieselService(site) {
		var hasService = false;
		for(var i=0; i<site.services.length; i++) {
			if(site.services[i][0] == 61022 || site.services[i][0] == 61023 || site.services[i][0] == 61024) {
				hasService = true;
				break;
			}
		}
		return hasService;
	}
	
	function showStationWithFuelTypeOrService(site, checkedBoxes) {
		var showStation = false;
		for(var i=0; i<site.services.length; i++) {
			if(checkedBoxes["fueltype_bio_E85"] == true && (site.services[i][0] == 20043 || site.services[i][0] == 61355)) {
				showStation = true;
			} else if(checkedBoxes["fueltype_adblue"] == true && (site.services[i][0] == 61352 || site.services[i][0] == 61360 || site.services[i][0] == 61361)) {
				showStation = true;
			} else if(checkedBoxes["service_24h"] == true && (site.services[i][0] == 10010 || site.services[i][0] == 20000 || site.services[i][0] == 50000)) {
				showStation = true;
			} else if(checkedBoxes["service_carwash"] == true && (site.services[i][0] == 10006 || site.services[i][0] == 20002 || site.services[i][0] == 50003)) {
				showStation = true;
			} else if(checkedBoxes["service_rentalcars"] == true && (site.services[i][0] == 20003 || site.services[i][0] == 50002)) {
				showStation = true;
			} else if(checkedBoxes["service_apotek"] == true && (site.services[i][0] == 61367)) {
				showStation = true;
			}
		}
		return showStation;
	}
}

function transformSpecialCharactersToASCII(inString) {
	var transformedString = inString.replace(/å/g,"&aring;").replace(/Å/g,"&Aring;").replace(/ä/g,"&auml;").replace(/Ä/g,"&Auml;").replace(/ö/g,"&ouml;").replace(/Ö/g,"&Ouml;").replace(/Ø/g,"&Oslash;").replace(/ø/g,"&oslash;").replace(/Æ/g,"&AElig;").replace(/æ/g,"&aelig;");
	return transformedString;
}

function transformASCIIToSpecialCharacters(inString) {
	var transformedString = inString.replace(/&aring;/g,"å").replace(/&Aring;/g,"Å").replace(/&auml;/g,"ä").replace(/&Auml;/g,"Ä").replace(/&ouml;/g,"ö").replace(/&Ouml;/g,"Ö").replace(/&Oslash;/g,"Ø").replace(/&oslash;/g,"ø").replace(/&AElig;/g,"Æ").replace(/&aelig;/g,"æ");
	return transformedString;
}

