// GMap2 object
var dkk_map = null;

// GDirections object
var rute;

var featuredOverlays;
var addressListPage;

var currentResultPage = 0;
var lastResultPage = 0;

var searchMarkers;
var addressListIDs;
var streetResults;

var openSingleResult = false;

/**
 * Setup the initial map
 */

function dkk_load() {
	if (!GBrowserIsCompatible()) {
		alert("Din browser er desværre ikke kombatibel med vores kort!");
		return;
	}

	var mapFrame = document.getElementById("mapDiv");

	dkk_map = new google.maps.Map2(mapFrame);
	dkk_map.enableScrollWheelZoom();
	dkk_map.enableContinuousZoom();
	
	// create instance of the route planner
	rute = new google.maps.Directions(dkk_map, document.getElementById("routeDiv"));

	// pile taster
	new google.maps.KeyboardHandler(dkk_map);

	//map type
	dkk_map.addControl(new google.maps.MapTypeControl(), new google.maps.ControlPosition(G_ANCHOR_TOP_RIGHT, new google.maps.Size(10,10)))
	dkk_map.addControl(new google.maps.LargeMapControl3D(), new google.maps.ControlPosition(G_ANCHOR_TOP_RIGHT, new google.maps.Size(30,40)))
	dkk_map.addControl(new google.maps.ScaleControl(), new google.maps.ControlPosition(G_ANCHOR_BOTTOM_LEFT, new google.maps.Size(10,40)))

	// center the map
	dkk_map.setCenter(new google.maps.LatLng(55.900, 10.569), 7);


//	mapFrame.focus();

	featuredOverlays = Array();
	
	createFeaturedMarkers();
	setupAddressListSlider();
	
	searchMarkers = Array();
	addressListIDs = Array();

	// add featured overlays
	showFeaturedMarkers();
	
	
	// if a search was given, do the search
	var qstr = $(document).getUrlParam('q');
	if (qstr != null && qstr != '') {
		$('#searchAddress').val(urldecode(qstr));
		openSingleResult = true;
		setTimeout('search()',1900);
	}
	
	// old search
	var adr = $(document).getUrlParam('adr'),
		postBy = $(document).getUrlParam('postBy');
	if (adr != null && adr != "" && postBy != null && postBy != "") {
		var queryString = urldecode(adr) + ', ' + urldecode(postBy);
		$('#searchAddress').val(queryString);
		openSingleResult = true;
		setTimeout('search()',2300);
	}
	
	// old routesearch
	var fraAdr = $(document).getUrlParam('frabar'), fraPostNr = $(document).getUrlParam('frapostbar'),
		tilAdr = $(document).getUrlParam('tilbar'), tilPostNr = $(document).getUrlParam('tilpostbar');
	if (fraAdr != null && fraAdr != "" && fraPostNr != null && fraPostNr != "" &&
		tilAdr != null && tilAdr != "" && tilPostNr != null && tilPostNr != "") {
		var queryStringFrom = urldecode(fraAdr) + ', ' + urldecode(fraPostNr);
		var queryStringTo = urldecode(tilAdr) + ', ' + urldecode(tilPostNr);
		$('#searchFrom').val(queryStringFrom);
		$('#searchTo').val(queryStringTo);
		setTimeout('searchRoute()',2300);
	}
}

/**
 * Function which is called to remove the map on page close
 * @return null
 */
function dkk_unload() {
	GUnload();
}

/**
 * Returns the URL encoded string
 * Replaces the standard URL encode, since some specialchars are not properly encoded.
 * @param str
 * @return string
 */
function urlencode(str) {
	str = escape(str);
	str = str.replace('+', '%2B');
	str = str.replace('%20', '+');
	str = str.replace('*', '%2A');
	str = str.replace('/', '%2F');
	str = str.replace('@', '%40');
	return str;
}

/**
 * Returns the URL Decoded string
 * @param str String to be decoded
 * @return str Decoded string
 */
function urldecode(str) {
	str = str.replace('+', ' ');
	str = unescape(str);
	return str;
}


function hideMarker(marker) {
	dkk_map.removeOverlay(marker);
}

function showFeaturedMarkers() {
	for (var i = 0; i < featuredOverlays.length; i++) {
		featuredOverlays[i].show();
	}
}
function hideFeaturedMarkers() {
	for (var i = 0; i < featuredOverlays.length; i++) {
		featuredOverlays[i].hide();
	}
}

function createIcon(path, w, h) {
	var icon = new google.maps.Icon();
	icon.image = path;
	icon.iconSize = new google.maps.Size(w,h);
	icon.shadowSize = new google.maps.Size(w,h);
	icon.iconAnchor = new google.maps.Point(6, 20);
	icon.infoWindowAnchor = new google.maps.Point(5, 1);
	return icon;
}

function showMarker(point, level, message, icon_path, itemNr) {
	var marker;
	if (icon_path != null) {
		marker = new google.maps.Marker(point,createIcon(icon_path, 25, 25));
	} else {
		marker = new google.maps.Marker(point, G_DEFAULT_ICON);
	}
	
	dkk_map.addOverlay(marker);
	if (dkk_map.getZoom() < level) {
		marker.hide();
	}
	google.maps.Event.addListener(dkk_map,"zoomend",function(zoomfra, zoomtil) {
		if(zoomtil >= level && level > zoomfra) {
			marker.show();
		} else if (zoomtil < level && level <= zoomfra) {
			marker.hide();
		}
	});

	google.maps.Event.addListener(marker, "click", function(){
		marker.openInfoWindowHtml(message);
	});
	return marker;
}

function getNullString(str) {
	if (str == null || str == '') {
		return null;
	}
	return str;
}

/**
 * Creates the message that is displayed in the popup box on the map
 * @param item
 * @return string message
 */
function getPopupMessage(item, itemNr) {
	var message = '<b>' + item.name + '</b><br />';
	message = message + item.address + '<br />';
	message = message + item.zip + ' ' + item.city + '<br />';
	if (item.site != null && item.site != "" && item.site != '/') {
		var site = item.site;
		if (site.indexOf('http://') < 0) {
			site = 'http://' + site;
		}
		site = '/redir.php?cid=' + item.id + '&action=webclickpopup&url=' + urlencode(site);
		// Add btnResWebPreview__ID__
		message = message + '<a id="btnResWebPreviewPopup' + itemNr + '" href="' + site + '">' + item.site + '</a>';
	}
	var iconPath = getNullString(item.icon), imgPath = getNullString(item.preview);
	
	if (imgPath != null) {
		message = '<img src="' + imgPath + '" style="width:98px; height:74px; padding:3px; float:left;" />' + message;
	} else if (iconPath != null) {
		message = '<img src="' + iconPath + '" style="width:60px; height:60px; padding:3px; float:left;" />' + message;
	}
	return message;
}

/**
 * Show the featured overlay icons
 */
function createFeaturedMarkers() {
	var url = '/ajax/featuredCompanies.php?q=featured';
	$.getJSON(url, function(data) {
		featuredOverlays = Array();
		$.each(data, function(i, comp) {
			var point = new google.maps.LatLng(comp.lat, comp.lng);
			featuredOverlays.push(showMarker(point, comp.level, getPopupMessage(comp, 'Feature' + i), getNullString(comp.icon), i));			
		});
	});
}

var maxResultsPerPage = 4;

function search() {
	switchMenu("#addressSearchDiv");
	var searchAddress = urlencode($('#searchAddress').val());
	// TODO: check if the user entered a route description and switch to route mode...
	var url = '/ajax/findCompanies.php?q=' + searchAddress ;
	//alert(searchAddress);
	$.getJSON(url, function(data) {
		//hideFeaturedMarkers();
		addressListPage = 0;
		clearAddressList();
		if (data.length == 0) {
			//alert("Vi fandt desværre ikke nogen resultater.");
			addAddressListItem(new Array("Empty"), 0, null, null);
		}
		$.each(data, function(i, item) {
			var iconPath = getNullString(item.icon);
			var imgPath = getNullString(item.preview);
			var message = getPopupMessage(item, i);
			var point = new google.maps.LatLng(item.lat, item.lng);
			var marker = showMarker(point, item.level, message, iconPath);
			searchMarkers.push(marker);
			addAddressListItem(new Array(item.name, item.site, item.address, item.zip, item.city, item.phone, item.email, imgPath), i, message, marker, item.id);
		});
		gotoResultPage(0);
		showResultPageButtons(currentResultPage);
	    switchMenu('#addressResultsDiv');
		if (openSingleResult) {
			openSingleResult = false;
			if (streetResults.length > 0) {
				$('#btnResShowMap' + streetResults[0]).click();
			}
		}
	});
	return false;
}

function addAddressListItem(item, itemNr, message, marker, itemID) {
	var html = $('#addressResultsDivTpl').html();
	
	if (item.length > 1) {
		var strFields = "name,site,address,zip,city,tlf,email,preview";
		var fields = strFields.split(',');
		for (var j = 0; j < fields.length; j++) {
			var replace = new RegExp('__' + fields[j].toUpperCase() + '__', 'g');
			var replaceWith = item[j];
			if (replaceWith == null) {
				replaceWith = "";
			} else if (fields[j] == 'site') {
				if (replaceWith.indexOf('http://') < 0) {
					replaceWith = 'http://' + replaceWith;
				}
				replaceWith = '/redir.php?cid=' + itemID + '&action=webclick&url=' + urlencode(replaceWith);
			}
			html = html.replace(replace, replaceWith);
		}
		html = html.replace(new RegExp('__ID__', 'g'), itemNr);
		html = html.replace(new RegExp('__CID__', 'g'), itemID);
	} else {
		html = $('#addressResultsDivTplEmpty').html();
	}
	addressListIDs.push(itemID);
	if (item[0] == "Adresse Resultater") {
		var strItem = "" + itemNr;
		streetResults.push(strItem);
	}
	if (itemNr % maxResultsPerPage == 0) {
		lastResultPage = addressListPage;
		addressListPage++;
		$('#companiesResultsDiv')
			.append('<div id="companiesResultPage' + addressListPage + '" class="resultPage">')
			.append('</div><!-- #companiesResultPage' + addressListPage + ' -->')
			.css('width', (343 * addressListPage) + 'px' );
	}
	
	$('#companiesResultPage' + addressListPage)
		.append(html);

	$('#btnResShowMap' + itemNr).click(function() {
		var mapclick = itemID;
		if (itemID == undefined) {
			mapclick = $(this).prevAll(".resultAddress").text() + ", " + $(this).prevAll(".resultZip").text() + " " + $(this).prevAll(".resultCity").text();
		}
		$.post('/ajax/doAction.php', { 'action' : 'mapclick', 'q' : mapclick });
		dkk_map.setCenter(marker.getLatLng(), 14);		
		marker.openInfoWindowHtml(message);
	});
	$('#btnResShowRoute' + itemNr).click(function() {
		$('#searchFrom').val('');
		$('#searchTo').val(item[2] + ', ' + item[3] + ' ' + item[4]);
		switchMenu('#routeSearchDiv');
	});
}

function clearAddressList() {
	for (var i = 0; i < searchMarkers.length; i++) {
		hideMarker(searchMarkers[i]);
	}
	searchMarkers = Array();
	addressListIDs = Array();
	streetResults = Array();
	$('#companiesResultsDiv').empty();
	currentResultPage = 0;
	lastResultPage = 0;
}

function gotoResultPage(page) {
	var ids = "";
	for (var i = (page * maxResultsPerPage); i < (page * maxResultsPerPage) + maxResultsPerPage; i++) {
		if (i < addressListIDs.length && addressListIDs[i] != null) {
			ids = ids + addressListIDs[i] + ";";
		}		
	}
	$.post('/ajax/doAction.php', { 'action' : 'view', 'q' : ids });

	if (currentResultPage == page) {
		return;
	}
	showResultPageButtons(page);
	currentResultPage = page;
	
	$("#addressResultsDiv .scroll")
		.trigger('goto', [ page ]);
}

function showResultPageButtons(page) {
	if (page == 0 && page == lastResultPage) {
		$('#addressResultsDiv input.btnNext').hide();
		$('#addressResultsDiv input.btnPrevious').hide();
	} else if (page == 0) {
		$('#addressResultsDiv input.btnNext').show();
		$('#addressResultsDiv input.btnPrevious').hide();
	} else if (page == lastResultPage) {
		$('#addressResultsDiv input.btnNext').hide();
		$('#addressResultsDiv input.btnPrevious').show();
	} else {
		$('#addressResultsDiv input.btnNext').show();
		$('#addressResultsDiv input.btnPrevious').show();
	}
}

function setupAddressListSlider() {
    var scrollOptions = {
            target: '.scroll', 	
            items: '.resultPage',
            axis: 'x',
            cycle: false,
            lazy: true,
            force: true,
            duration: 500
        };

    $("#addressResultsDiv").serialScroll(scrollOptions);
    
	$("#addressResultsDiv input.btnNext")
		.click(function() {
			gotoResultPage(currentResultPage + 1);
		});
	$("#addressResultsDiv input.btnPrevious")
		.click(function() {
			gotoResultPage(currentResultPage - 1);
		});
}

function searchRoute() {
	var searchFrom = $('#searchFrom').val();
	var searchTo = $('#searchTo').val();

	// TODO: fix missing zipcodes
	var url = '/ajax/findCompanies.php?geolocate=1&s=from&q=' + searchFrom;
	$.getJSON(url, function(data) {
		if (data.length == 0) {
			//alert("Vi fandt desværre ikke nogen resultater.");
		} else if (data.length > 1) {
			//alert("Mente du: ");
		} else {
			$.each(data, function(i, item) {
				var from = item.address + ', ' + item.zip + ' ' + item.city;
				url = '/ajax/findCompanies.php?geolocate=1&s=to&q=' + searchTo;
				$.getJSON(url, function(data) {
					if (data.length == 0) {
						//alert("Vi fandt desværre ikke nogen resultater.");
					} else if (data.length > 1) {
						//alert("Mente du: ");
					}
					$.each(data, function(i, item) {
						var to = item.address + ', ' + item.zip + ' ' + item.city;					
						var query = "from: " + from + " to: " + to; 
						rute.load(query);
						return false;
					});
				});
				return false;
			});
		}
	});
	
	switchMenu('#routeResultsDiv');
	return false;
}

function printRoute() {
	var searchFrom = $('#searchFrom').val();
	var searchTo = $('#searchTo').val();

	var nyvin = window.open('print.php?from=' + urlencode(searchFrom) + "&to=" + urlencode(searchTo));
}