var DistributorFinder = new function(){
	var m_Map = null;
	var m_GeoCoder = null;
	var m_Marker = null;
	var m_MapManager = null;
	var m_Markers = [];
	var m_Culture = gmap_culture;
	
	this.Init = function(){
		if (GBrowserIsCompatible()) {
			m_Map = new GMap2(document.getElementById("map"));
			m_Map.addControl(new GLargeMapControl());
			m_Map.addControl(new GMapTypeControl());
			m_Map.addControl(new GOverviewMapControl());
			m_Map.setCenter(new GLatLng(parseFloat(latitude),parseFloat(longitude)),parseInt(zoom));
			m_MapManager = new GMarkerManager(m_Map);
			if (Statistics != null){
				Statistics.DistributorFinderSearch();
			}
			GEvent.addListener(m_Map, "moveend", DistributorFinder.GetValues);
			DistributorFinder.GetValues();
		}
	}
	
	this.GetValues = function(){
		var messageObj = document.getElementById("mapmessage");
		messageObj.style.display = "none";
		var locationList = document.getElementById(lstLocationID);
		var lstTypeID = document.getElementById(lstCompanyID);
		var postalCodeTextBox = document.getElementById(tbxPostalCodeID);
		var selectedlocationValue = locationList.options[locationList.selectedIndex].value;
		var selectedTypeValue = lstTypeID.options[lstTypeID.selectedIndex].value;
		var postalCode = postalCodeTextBox != null && !simplePostalCodeSearch ? postalCodeTextBox.value : "";
		var bounds = m_Map.getBounds();
		var swPoint = bounds.getSouthWest();
		var nePoint = bounds.getNorthEast();
		AssaAbloy.Web.Apps.DistributorFinder.GMap.GetCompanies(pageID, m_Culture, selectedlocationValue, selectedTypeValue, postalCode, swPoint.lat(), swPoint.lng(), nePoint.lat(), nePoint.lng(), DistributorFinder.FillMarkers);
	}

	this.GetLocation = function(){
		var messageObj = document.getElementById("mapmessage");
		messageObj.style.display = "none";
		var locationList = document.getElementById(lstLocationID);
		var selectedlocationValue = locationList.options[locationList.selectedIndex].value;
		AssaAbloy.Web.Apps.DistributorFinder.GMap.GetLocation(pageID, m_Culture, selectedlocationValue, DistributorFinder.FillLocation);
	}
	
	this.GetPostalCode = function(){
		var postalCodeTextBox = document.getElementById(tbxPostalCodeID);
		var postalCode = postalCodeTextBox != null ? postalCodeTextBox.value : "";
		if (postalCode != null && postalCode.length > 0){
			AssaAbloy.Web.Apps.DistributorFinder.GMap.GetPostalCode(pageID, m_Culture, postalCode, DistributorFinder.FillPostalCode);
		}
	}
	
	this.FillPostalCode = function(result){
		var postalCode = result.value;
		if (postalCode != null){
			m_Map.setCenter(new GLatLng(parseFloat(postalCode.Lat), parseFloat(postalCode.Lng)), parseInt("12"));
		}
	}
	
	this.LocationChanged = function(){
		DistributorFinder.GetLocation();
	}

	this.FillLocation = function(result){
		var location = result.value.Location;
		m_Map.setCenter(new GLatLng(parseFloat(location.Latitude), parseFloat(location.Longitude)), parseInt(location.ZoomLevel));
	}

	this.FiltersChanged = function(){
		DistributorFinder.GetValues();
	}
	
	this.PostalCodeChanged = function(){
		if (simplePostalCodeSearch) {
			DistributorFinder.GetPostalCode();
		} else {
			DistributorFinder.GetValues();
		}
	}

	this.FillMarkers = function(result){
		var location = result.value.Location;
		var companies = result.value.CompanyCollection;
		var filtered = result.value.IsFiltered;
		var isPostalCodeSearch = result.value.IsPostalCodeSearch;
		var messageObj = document.getElementById("mapmessage");
		m_Map.clearOverlays();
		if (filtered){
			var filteredMessage = result.value.FilteredMessage;
			messageObj.innerHTML = filteredMessage;
			messageObj.style.display = "block";
			messageObj.onclick = function(){
				this.style.display = "none";
			}
		} else if (companies.length == 0 && result.value.NoHitsMessage != null && result.value.NoHitsMessage.length > 0){
			var noHitsMessage = result.value.NoHitsMessage;
			messageObj.innerHTML = noHitsMessage;
			messageObj.style.display = "block";
			messageObj.onclick = function(){
				this.style.display = "none";
			}
		} else {
			messageObj.innerHTML = "";
			messageObj.style.display = "none";
		}
		m_Markers = [];
		for(var i = 0; i < companies.length; i++){
			var point = new GLatLng(parseFloat(companies[i].Latitude), parseFloat(companies[i].Longitude));
			var gmarker = new DistributorFinder.CMarker(point, companies[i].FullAddress, companies[i].Name, DistributorFinder.CreateIcon(companies[i].IconColor));
			gmarker.contentHtml = gmarker.contentHtml.replace("\n", "<br />");
			gmarker.db_id = companies[i].CompanyId;
			gmarker.clickEventListener = GEvent.addListener(gmarker, "click", function() {
				DistributorFinder.GetInfoHtmlContent(this);
			});
			DistributorFinder.AddMarkers(gmarker);
		}
		if(companies.length == 0){
			
		}
		DistributorFinder.RenderCompanyList(companies);
	}
	
	this.ShowCompanyInfo = function(){
		var marker = DistributorFinder.FindCompanyMarker(this.rel); // the this keyword refers to the anchor object that called this function
		if (marker != null){
			DistributorFinder.GetInfoHtmlContent(marker);
		}
	}
	
	this.FindCompanyMarker = function(companyId){
		for (var i = 0; i < m_Markers.length; i++){
			if (m_Markers[i].db_id == companyId){
				return m_Markers[i];
			}
		}
		return null;
	}
	
	this.RenderCompanyList = function(companies){
		var listContainer = document.getElementById("distributor-list");
		if (listContainer != null){
			if (listContainer.hasChildNodes()){
				listContainer.removeChild(listContainer.firstChild);
			}
			var listWrapper = document.getElementById("distributor-list-wrapper");
			if (companies.length > 0){
				var listTag = document.createElement("ul");
				for (var i = 0; i < companies.length; i++){
					var listItemTag = document.createElement("li");
					var anchorTag = document.createElement("a");
					anchorTag.setAttribute("rel", companies[i].CompanyId);
					anchorTag.onclick = DistributorFinder.ShowCompanyInfo;
					var textNode = document.createTextNode(companies[i].Name);
					anchorTag.appendChild(textNode);
					listItemTag.appendChild(anchorTag);
					listTag.appendChild(listItemTag);
				}
				listContainer.appendChild(listTag);
				listWrapper.style.display = "block";
			} else {
				listWrapper.style.display = "none";
			}
		}
	}
	
	this.AddMarkers = function(gmarker){
		m_Markers[m_Markers.length] = gmarker;
		m_Map.addOverlay(gmarker);
	}

	this.GetInfoHtmlContent = function(gmarker) {
		m_Marker = gmarker;
		AssaAbloy.Web.Apps.DistributorFinder.GMap.GetInfoHtmlContent(pageID, m_Marker.db_id.toString(), m_Culture, DistributorFinder.FillInfoHtmlContent);
	}

	this.FillInfoHtmlContent = function(result) {
		if(result.value != null) {
			m_Marker.openInfoWindowHtml(result.value, {maxWidth: 200});
		}
	}

	this.CMarker = function(position, contentHtml, tooltip, markerIcon) {
		this.inheritFrom = GMarker;
		if (typeof markerIcon == "undefined"){
			var cMarkerColor = new CMarkerColor();
			this.markerIcon = CreateIcon(cMarkerColor.getColor(cMarkerColor.Random));
		} else
			this.markerIcon = markerIcon;
	    
		if (typeof tooltip != "undefined")
			this.title = tooltip;
		else
			this.title = "";
			
		this.inheritFrom(position, {icon: this.markerIcon, title: this.title});

		this.clickEventListener = null;
		if (typeof contentHtml != "undefined")
			this.contentHtml = contentHtml;
		else
			this.contentHtml = "";
	}

	this.CMarker.prototype = new GMarker(new GLatLng(0,0));

	// Create the icon for a marker
	this.CreateIcon = function(iconcolor, smallMarker, specialMarker) {
		var icon = new GIcon();
	    
		if(typeof iconcolor == "undefined" || iconcolor == null)
			iconcolor = "red";
		icon.color = iconcolor;

		if(typeof smallMarker == "undefined")
			smallMarker = true;

		if(smallMarker == true) {
		    icon.image = "http://maps.google.com/mapfiles/ms/micons/" + iconcolor + ".png";
		    icon.shadow = "http://maps.google.com/mapfiles/ms/micons/msmarker.shadow.png";
			icon.iconSize = new GSize(16,16);
			icon.shadowSize = new GSize(22,14);
			icon.iconAnchor = new GPoint(8,14);
			icon.infoWindowAnchor = new GPoint(6,1);
			icon.infoShadowAnchor = new GPoint(13,16);
		} else {
			icon.shadow = "/Web/Core/UI/Images/Markers/shadow50.png";
			icon.iconSize = new GSize(20, 34); 
			icon.shadowSize = new GSize(37, 34);
			icon.iconAnchor = new GPoint(9, 34); 
			icon.infoWindowAnchor = new GPoint(9, 2); 
			icon.infoShadowAnchor = new GPoint(18, 25);
			if(iconcolor == "yellow")
				iconcolor = "blue";
			icon.image = "/Web/Core/UI/Images/Markers/marker-" + iconcolor;
			if(typeof specialMarker == "undefined" || specialMarker == null)
				specialMarker = false;
			if(specialMarker == true)
				icon.image += "star.png";
			else icon.image += ".png";
		}
		return icon;
	}
}

if(document.addEventListener){
    document.addEventListener("load", DistributorFinder.Init, false);
}
if(window.addEventListener){
    window.addEventListener("load", DistributorFinder.Init, false);
}
else if(window.attachEvent){
    window.attachEvent("onload", DistributorFinder.Init); 
}
