﻿//TODO Tobias 2010-02-03: Flytta maps-pluginen till egen fil när sökningsdelarna är på plats. /Tobias
/// <summary>
/// Member map plugin
/// Dependencies: Google Maps API 
/// </summary>
(function ($) {

	//map constants
	//var DEFAULT_POSITION_LATITUDE = 62.103883;
	var DEFAULT_POSITION_LATITUDE = 62.903883;
	//var DEFAULT_POSITION_LONGITUDE = 15.292969;
	var DEFAULT_POSITION_LONGITUDE = 20.292969;
	var DEFAULT_ZOOM_LEVEL = 5;
	var MAP_CANVAS = "#mapCanvas";
	var MARKERS_PATH = "/Styles/Images/Skogsindustrierna/GoogleMaps/Markers/";

	var paperAndPumpMillSymbol = "pappers_massabruk";
	var paperMillSymbol = "pappersbruk";
	var pulpMillSymbol = "massabruk";
	var sawMillAndWoodProcessingSymbol = "sagverk_m_vidareforadling";
	var sawMillSymbol = "sagverk";
	var woodProcessingSymbol = "vidareforadling_av_traprodukter";
	var otherSymbol = "ovriga_foretag";

	var membersStore;
	var map = null;
	var markers = [];
	var markerCluster = null;
	var infowindow = null;
	var startPosition = null;
	var numberOfMembers = 0;
	var settings = {};
	var loadProductsTimeout = null;
	var searchResultText = null;

	/**
	* Place marker on map
	*/
	function placeMarker(marker, location, map, contents) {

		//open info win on click
		google.maps.event.addListener(marker, 'click', function () {
			infowindow.open(map, marker);
		});

	}

	markerClickFunction = function (latlng, content) {
		return function (e) {

			infowindow.setContent(content);
			infowindow.setPosition(latlng);
			infowindow.open(map);
		};
	};


	/** SearchControl class **/
	function SearchControl(controlDiv, map) {

		$("#helpButton").live('click', function () {
			$.colorbox({ width: "30%", inline: true, href: "#helpTextFiltering" });
			return false;
		}
		);
		$("#helpButtonSub").live('click', function () {
			$.colorbox({ width: "30%", inline: true, href: "#helpTextProductFiltering" });
			return false;
		}
		);

		$("#otherLanguageLink").live('click',
			function () {
				var url = $("input[id*=m_hiddenFieldUrlToOtherLanguage]").val();
				if (url != null && url != "")
					document.location = url;

				return false;
			}
		);

		// Set CSS styles for the DIV containing the control
		// Setting padding to 5 px will offset the control
		// from the edge of the map
		controlDiv.style.padding = '5px';

		// Set search control data
		var controlUI = document.createElement('DIV');
		controlUI.innerHTML = $('#mapSearchBoxWrapper')[0].innerHTML;
		$('#mapSearchBoxWrapper')[0].innerHTML = null;
		controlDiv.appendChild(controlUI);

		//        google.maps.event.addDomListener(controlUI, 'click', function() {
		//            var startPosition = new google.maps.LatLng(DEFAULT_POSITION_LATITUDE, DEFAULT_POSITION_LONGITUDE);
		//            map.setCenter(startPosition);
		//        });
	}



	//creates markers array from members
	function getMarkersFromMembers(members) {
		var selectedType = $.fn.memberMap('getSelectedType');

		var markers = [];

		if (members.length > 0) {
			//create markers and add to array
			for (var i = 0; i < members.length; i++) {
				var member = members[i];
				//get location of member
				var location = new google.maps.LatLng(member.Latitude, member.Longitude);

				//get marker image src, default to other symbol
				var mapSymbolCode = otherSymbol,
					type = App_Code.Arbio.SI.MemberMap.OrganizationType;

				if (selectedType == type.Paper ||
					selectedType == type.PaperMill ||
						selectedType == type.PulpMill ||
							selectedType == type.PaperAndPulpMill) {
					if (member.PaperType == type.PaperMill)
						mapSymbolCode = paperMillSymbol;
					else if (member.PaperType == type.PulpMill)
						mapSymbolCode = pulpMillSymbol;
					else if (member.PaperType == type.PaperAndPulpMill)
						mapSymbolCode = paperAndPumpMillSymbol;
				}
				else if (selectedType == type.Wood ||
					selectedType == type.SawMill ||
						selectedType == type.WoodRefinement ||
							selectedType == type.SawMillAndWoodRefinement) {
					if (member.WoodType == type.SawMill)
						mapSymbolCode = sawMillSymbol;
					else if (member.WoodType == type.WoodRefinement)
						mapSymbolCode = woodProcessingSymbol;
					else if (member.WoodType == type.SawMillAndWoodRefinement)
						mapSymbolCode = sawMillAndWoodProcessingSymbol;
				}
				else {
					if (member.WoodType == type.SawMill)
						mapSymbolCode = sawMillSymbol;
					else if (member.WoodType == type.WoodRefinement)
						mapSymbolCode = woodProcessingSymbol;
					else if (member.WoodType == type.SawMillAndWoodRefinement)
						mapSymbolCode = sawMillAndWoodProcessingSymbol;
					else if (member.PaperType == type.PaperMill)
						mapSymbolCode = paperMillSymbol;
					else if (member.PaperType == type.PulpMill)
						mapSymbolCode = pulpMillSymbol;
					else if (member.PaperType == type.PaperAndPulpMill)
						mapSymbolCode = paperAndPumpMillSymbol;
				}

				var markerImageSrc = MARKERS_PATH + mapSymbolCode + ".png";

				//create marker image
				var markerImage = new google.maps.MarkerImage(
										markerImageSrc,
										new google.maps.Size(25, 29), //image size
										null,
										new google.maps.Point(20, 0) //position of infowindow
										);

				//create marker
				var marker = new google.maps.Marker({
					position: location,
					map: map,
					icon: markerImage
				});

				var infoHTML = $("#infoWindowMemberTemplate").tmpl(member).html();

				//open infowindow on click
				var markerFn = markerClickFunction(location, infoHTML);
				google.maps.event.addListener(marker, 'click', markerFn);

				markers.push(marker);
			}
		}

		return markers;
	}

	function createNewMarkerCluster() {
		/**
		//create marker cluster on map
		if(markerCluster != null)
		markerCluster.clearMarkers();
		
		//create marker cluster on map
		markerCluster = new MarkerClusterer(map, markers,
		{
		maxZoom: 13,
		styles: [{
		"height": 52,
		"width": 53,
		"url": "http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/images/m1.png"
		}]
		});
		**/
	}

	function showMembers(members) {
		if (settings.Language.indexOf("en") != -1) {
			for (var i = 0; i < members.length; i++) {
				var member = members[i];

				if (member.PostalCode != null)
					member.PostalCode = "SE-" + member.PostalCode;

				if (member.Phone != null) {
					var phone = member.Phone.startsWith("0") ? member.Phone.substr(1, member.Phone.length - 1) : member.Phone;
					member.Phone = "+46 " + phone;
				}

				if (member.Fax != null) {
					var fax = member.Fax.startsWith("0") ? member.Fax.substr(1, member.Fax.length - 1) : member.Fax;
					member.Fax = "+46 " + fax;
				}

				member.IsEnglish = true;
			}
		}

		$("#maplink1").hide();
		$("#maplink2").hide();

		$("#memberList").empty();

		// Remove old markers
		for (var i = 0; i < markers.length; i++)
			markers[i].setMap(null);

		if (members && members.length) {
			$("#buttonShowMemberList").show();
			membersStore = members;
			markers = getMarkersFromMembers(members);
			//createNewMarkerCluster();
		}
		else if (markerCluster != null) {
			$("#buttonShowMemberList").hide();
			//markerCluster.clearMarkers();
		}

		var count = members != null ? members.length : 0;
		var newText = searchResultText.replace("{0}", count);

		$("#memberSearchInfo").html(newText);

		//$.fn.memberMap('reset');
	}

	// show qtip popup on long texts
	initTooltips = function (mapCanvas) {
		var isInitialized = false;

		// init with a delagate on #mapCanvas
		mapCanvas.delegate('#mapSearchBox .mainOrganizations', 'mouseover', function () {
			if (isInitialized) {
				return;
			}

			isInitialized = true;
			$('#mapSearchBox .has-length-limit > label').each(function () {
				var node = $(this);
				node.qtip({
					content: node.parent().attr('name'),
					style: 'light',
					show: { delay: 25 },
					position: {
						adjust: {
							x: -125, y: -45
						}
					}
				});
			});
		});
	},

	initSearch = function (mapCanvas) {
		// $('#searchMemberQuery').live('keydown', ...) does not work. Add delegate to #mapCanvas #searchMemberQuery instead		
		mapCanvas.delegate('#searchMemberQuery', 'keydown', function (e) {
			if (e.keyCode == 13) {
				e.preventDefault();
				$.fn.memberMap('update', 'search', this.value);
				return false;
			}
		});
	},

	methods = {

		/// <summary>
		/// Initialize member map
		/// </summary>
		init: function (o) {
			settings = o;

			String.prototype.startsWith = function (str) { return (this.match("^" + str) == str); }

			// Store text displaying number of search results
			searchResultText = $("#memberSearchInfo").html();

			//create default postition for map
			startPosition = new google.maps.LatLng(DEFAULT_POSITION_LATITUDE, DEFAULT_POSITION_LONGITUDE);

			//default options on map
			var options = {
				zoom: DEFAULT_ZOOM_LEVEL,
				center: startPosition,
				mapTypeId: google.maps.MapTypeId.ROADMAP
			};

			//init map        
			map = new google.maps.Map($(MAP_CANVAS)[0], options);
			//init infowindow
			infowindow = new google.maps.InfoWindow();

			$("#childOf_" + settings.OrganizationIDPaperAndPulp).find("input[type=checkbox]").live("change",
				function () {
					var boxes = $("#childOf_" + $(this).val()).find("input[type=checkbox]");
					if ($(this).attr("checked"))
						boxes.attr("disabled", "");
					else
						boxes.attr("disabled", "disabled");

					$.fn.memberMap('update', 'update');
				}
			);

			$("#buttonShowMemberList").live("click", function () { $.fn.memberMap("showMemberList"); return false; });


			// Init product click method, handles ALL product checkboxes
			$("#mapSearchBox .products input:checkbox").live('click', function () { $.fn.memberMap('handleProductCheckboxChecked', this); });

			$("#SawMill, #WoodRefinement").live('click', function () { $.fn.memberMap('update', 'update'); });

			var mapCanvas = $('#mapCanvas');
			// init search
			initSearch(mapCanvas);

			// init tooltips
			initTooltips(mapCanvas);

			//init search control
			var searchControlDiv = document.createElement('DIV');
			var searchControl = new SearchControl(searchControlDiv, map);
			searchControlDiv.index = 1;
			map.controls[google.maps.ControlPosition.RIGHT_TOP].push(searchControlDiv);

			//get members from member service
			App_Code.Arbio.WebServices.SiMembersMapService.GetAllMembers(function (members) { setTimeout(function () { showMembers(members); }, 1000); });
		},

		getSelectedType: function () {
			var type = "Other";

			var paperAndPulpRadio = $("#guid" + settings.OrganizationIDPaperAndPulp);
			var wood = $("#guid" + settings.OrganizationIDWood);

			if ($(paperAndPulpRadio).attr("checked")) {
				var paperCheck = $("#guid" + settings.OrganizationIDPaper);
				var pulpCheck = $("#guid" + settings.OrganizationIDPulp);

				if ($(paperCheck).attr("checked") && $(pulpCheck).attr("checked"))
					type = "PaperAndPulpMill";
				else if ($(paperCheck).attr("checked"))
					type = "PaperMill";
				else if ($(pulpCheck).attr("checked"))
					type = "PulpMill";
				else
					type = "Paper"; // Defaults to both
			}
			else if ($(wood).attr("checked")) {
				var sawMillCheck = $("#SawMill");
				var refinementCheck = $("#WoodRefinement");

				if ($(sawMillCheck).attr("checked") && $(refinementCheck).attr("checked"))
					type = "SawMillAndWoodRefinement";
				else if ($(sawMillCheck).attr("checked"))
					type = "SawMill";
				else if ($(refinementCheck).attr("checked"))
					type = "WoodRefinement";
				else
					type = "Wood"; // Defaults to both
			}

			return App_Code.Arbio.SI.MemberMap.OrganizationType[type];
		},

		showMemberList: function (members) {
			$("#memberList").empty();
			$("#maplink1").show();
			$("#maplink2").show();

			// if members is defined, show the members. Else, show previously stored members.
			$("#memberTemplate").tmpl(members || membersStore).appendTo("#memberList");

			var type = App_Code.Arbio.SI.MemberMap.OrganizationType;
			var selectedType = $.fn.memberMap('getSelectedType');
			
			if (selectedType == type.Paper ||
					selectedType == type.PaperMill ||
						selectedType == type.PulpMill ||
							selectedType == type.PaperAndPulpMill)
			{
				$(".paperandpulp").show();
				$(".productlist").hide();
			}
			else
			{
				$(".paperandpulp").hide();
				$(".productlist").show();
			}

			$(".memberShowOnMap").each(function (index) {
				$(this).bind("click", function (event) {
					google.maps.event.trigger(markers[index], 'click');
					map.setCenter(markers[index].getPosition());
					map.setZoom(14);
				});
			});
		},

		handleProductCheckboxChecked: function (sender) {
			if (loadProductsTimeout != null)
				clearTimeout(loadProductsTimeout);

			// Dont load products like crazy, wait for user to stop checking boxes
			loadProductsTimeout = setTimeout(
				function () {
					$.fn.memberMap('update', 'update');
				},
				1000
			);
		},

		handleTopOrgClick: function (sender) {
			var id = $(sender).val(),
				elementId = "childOf_" + id;

			// Hide all containers containing the checkboxes
			$('.childOrganizations, .hide').hide();

			// Uncheck and enable all checkboxes to reset searchcontrol
			$('#mapSearchBox input[type=checkbox]').attr('checked', false).attr("disabled", "");

			if (id == settings.OrganizationIDPaperAndPulp) {
				// Kryssa ur Massa och Papper för att visa allt
				$("#childOf_" + settings.OrganizationIDPaper).show();
				$("#childOf_" + settings.OrganizationIDPulp).show();

				// Kryssa i rutorna för papper och massa
				//$("#childOf_" + settings.OrganizationIDPaperAndPulp).find("input:checkbox").attr("checked", true);

				// Kryssa ur rutor för trä-företag
				$("#childOf_" + settings.OrganizationIDWood).find("input:checkbox").attr("checked", false);
				$("#woodCertificates").find("input:checkbox").attr("checked", false);
				$("#woodProducts").find("input:checkbox").attr("checked", false);
			}
			else if (id == settings.OrganizationIDWood) {
				$("#childOf_" + settings.OrganizationIDWood).show();
				$("#woodCertificates").show();
				$("#woodProducts").show();

				$("#childOf_" + settings.OrganizationIDPaperAndPulp).find("input:checkbox").attr("checked", false);
				$("#childOf_" + settings.OrganizationIDPaper).find("input:checkbox").attr("checked", false);
				$("#childOf_" + settings.OrganizationIDPulp).find("input:checkbox").attr("checked", false);
			}
			else if (id == settings.OrganizationIDOther) {
				$("#childOf_" + settings.OrganizationIDPaper).hide();
				$("#childOf_" + settings.OrganizationIDPulp).hide();
				$("#childOf_" + settings.OrganizationIDWood).hide();
				$("#woodCertificates").hide();
				$("#woodProducts").hide();
			}

			$('.hide').each(function () {
				var $this = $(this);
				if ($this.attr("id").indexOf(elementId) != -1)
					$this.show();
			});

			$.fn.memberMap('update', 'update');
		},

		//resets maps to default position and zoom
		reset: function () {
			map.setCenter(startPosition);
			map.setZoom(DEFAULT_ZOOM_LEVEL);
			infowindow && infowindow.close();
		},

		//resets maps to default position and zoom
		totalReset: function () {
			var mainOrganizations = $(".mainOrganizations");
			mainOrganizations.find("input").attr("checked", false);
			mainOrganizations.find(".hide").hide();
			methods.reset();
			App_Code.Arbio.WebServices.SiMembersMapService.GetAllMembers(showMembers);
		},

		update: function (method, searchTerm) {

			switch (method) {
				//search for members!                                                                      
				case "search":
					var mainOrganizations = $(".mainOrganizations");
					mainOrganizations.find("input").attr("checked", false);
					mainOrganizations.find(".hide").hide();

					App_Code.Arbio.WebServices.SiMembersMapService.Search(searchTerm,
						function (members) {
							methods.reset();
							membersStore = members;
							showMembers(members);
							methods.showMemberList(members);
						}
					);

					break;

				case "update":
					{
						var selectedType = methods.getSelectedType();
						var productIds = [];

						//create guid array 
						$("#mapSearchBox .products input:checked").each(
							function () {
								if (!$(this).attr("disabled")) {
									//get guid value
									var currentProductGuid = $(this).val();

									//remove "guid" from guid
									currentProductGuid = currentProductGuid.replace(/\guid/gi, "");

									//add to array
									productIds.push(currentProductGuid);
								}
							}
						);

						App_Code.Arbio.WebServices.SiMembersMapService.GetMembersByProducts(productIds, selectedType,
							function (members) {
								methods.reset();
								if (members && members.length) {
									var metadataIDs = [];
									for (var i = 0; i < members.length; i++) {
										var member = members[i];
										for (var m = 0; m < member.MetadataIDs.length; m++) {
											var exists = false;
											var metadataId = member.MetadataIDs[m];
											for (var e = 0; e < metadataIDs.length; e++) {
												var existingMetadataId = metadataIDs[e]
												if (existingMetadataId == metadataId) {
													exists = true;
													break;
												}
											}

											if (!exists)
												metadataIDs.push(metadataId);
										}
									}

									var selector = "#mapSearchBox .products";
									if (selectedType == App_Code.Arbio.SI.MemberMap.OrganizationType.PaperMill) {
										selector = "#childOf_" + settings.OrganizationIDPaper;
									}
									else if (selectedType == App_Code.Arbio.SI.MemberMap.OrganizationType.PulpMill) {
										selector = "#childOf_" + settings.OrganizationIDPulp;
									}
									else if (selectedType == App_Code.Arbio.SI.MemberMap.OrganizationType.PaperAndPulpMill) {
										selector = "#childOf_" + settings.OrganizationIDPulp + ", #childOf_" + settings.OrganizationIDPaper;
									}
									if (selectedType == App_Code.Arbio.SI.MemberMap.OrganizationType.SawMillAndWoodRefinement
										|| selectedType == App_Code.Arbio.SI.MemberMap.OrganizationType.SawMill
											|| selectedType == App_Code.Arbio.SI.MemberMap.OrganizationType.WoodRefinement) {
										selector = "#woodProducts, #woodCertificates";
									}

									var boxes = $(selector).find("input:checkbox");
									boxes.each(
										function () {
											var $this = $(this);
											var boxMdId = $this.parent().children("input:hidden").val();
											var enabled = false;
											for (var i = 0; i < metadataIDs.length; i++) {
												if (metadataIDs[i] == boxMdId) {
													enabled = true;
													break;
												}
											}

											$this.attr("disabled", enabled ? "" : "disabled");
											if (!enabled)
												$this.attr("checked", false);
										}
									);
								}

								showMembers(members);
							}
						);
						break;
					}
			} //switch end


		} //update end

	};


	$.fn.memberMap = function (method) {
		// Method calling logic
		if (methods[method]) {
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		} else if (typeof method === 'object' || !method) {
			return methods.init.apply(this, arguments);
		} else {
			$.error('Method ' + method + ' does not exist on jQuery.memberMap');
		}
	};

})(jQuery);

