﻿var DanBolig = DanBolig || {};
var $VVF = $VVF || Valtech.Validator.FieldType;
DanBolig.RadiusSearch = function() {
	var getHiddenValue = function(key) {
		var elm, value = 30;
		elm = $(key);
		if (elm && elm.value && elm.value.length > 0) {
			try {
				value = parseInt(elm.value) / 1000;
			}
			catch (e) {
				value = 30;
			}
		}
		return value.toString();
	};
	var slider_props = {
		id: "slider-max-distance", // km søgeafstand
		min: 0,
		max: 100,
		fieldName: "m_distance",
		scaleWidth: 200,
		initVal: 30
	};
	var adresse_props = {
		id: "address",
		fieldType: $VVF.Text,
		message: "Ikke godkendt!"
	};
	var radius_datamanager_props = {
		id: "RadiusSearch.dataManager",
		dataMap: { "m_address": {}, "m_roadNumber": {}, "m_zipCode": {}, "m_town": {}, "m_distanceType": {}, "m_distance": {} },
		enforceStrict: false,
		doCache: true
	};
	var rg_distancetype_props = { id: "distance-type-radioGroup", groupName: "km", dataField: "m_distanceType" };
	var request;
	return {
		init: function() {
			var _this = DanBolig.RadiusSearch;
			var initVal = getHiddenValue('m_distance');
			slider_props.initVal = initVal ? parseInt(initVal) : slider_props.initVal;
			_this.dataManager = new Valtech.DataManager(radius_datamanager_props);
			_this.address = $("address");
			_this.addressno = $("addressno");
			_this.zipcode = $("zipcode");
			_this.city = $("city");

			_this.address.active = _this.addressno.active = _this.zipcode.active = _this.city.active = false;

			_this.rsDistanceType = new Valtech.RadioButtonGroup(rg_distancetype_props, _this.dataManager);

			_this.addressCache = _this.address.value = "";
			_this.addressnoCache = _this.addressno.value = "";
			_this.zipcodeCache = _this.zipcode.value = "";
			_this.cityCache = _this.city.value = "";
			_this.slider = new Valtech.Slider(slider_props, _this.dataManager);
			_this.addressResults = [];
			_this.addressResultBox = $("address-results");
			_this.dataManager.onUpdate.subscribe(_this.send, _this, true);
			_this.dataManager.onUpdate.subscribe(_this.updateFields, _this, true);
			$E.addListener(_this.addressResultBox, "click", _this.selectFromList, _this);
			var sliderVal = $D.getElementsByClassName("sliderValue", "input", "slider-max-distance")[0];
			var stepTabs = $D.getElementsByClassName("btn-paging", "div", "search-type-radius")[0];

			$E.addListener(["distance-type-radioGroup", "kmdrive", "kmair", sliderVal], "focus", _this.checkFields, _this);
			$E.addListener("yui-gen1", "click", _this.checkFields, _this);

			var data = {};
			var elm = $('m_distanceType');
			if (!elm || !elm.value || elm.value.length == 0) {
				if (window.ActiveXObject) {
					var fn = function() {
						_this.rsDistanceType.selectItem(0);
					};
					setTimeout(fn, 300);
				}
				else {
					_this.rsDistanceType.selectItem(0);
				}
			}

			var m_address = $('m_address').value;
			var m_roadNumber = $('m_roadNumber').value;
			var m_zipCode = $('m_zipCode').value;
			var m_town = $('m_town').value;
			var m_utm32x = $('m_utm32x').value;
			var m_utm32y = $('m_utm32y').value;
			if (m_address != '' && m_roadNumber != '' && m_zipCode != '' && m_utm32x == '' && m_utm32y == '') {
				_this.address.value = m_address;
				_this.addressno.value = m_roadNumber;
				_this.zipcode.value = m_zipCode;

				this.search();
			}
			//_this.addressValidator = new Valtech.RequiredFieldValidator(adresse_props);
		},
		toggleField: function(e, c) {
			var target = $E.getTarget(e);
			target.active = !target.active;
			var active = !!c.address.active || !!c.addressno.active || c.zipcode.active || c.city.active;
			//console.log(active);
		},
		checkFields: function(e, c) {
			var active = !!c.address.active || !!c.addressno.active || c.zipcode.active || c.city.active;
			if (!active) {
				c.search();
			}
		},
		search: function() {
			var _this = DanBolig.RadiusSearch;
			if (_this.address.value == _this.addressCache &&
		        _this.addressno.value == _this.addressnoCache &&
		        _this.zipcode.value == _this.zipcodeCache &&
		        _this.city.value == _this.cityCache) { // no change
				return;
			}

			var query = "address=" + encodeURIComponent(_this.address.value);
			query += "&roadnumber=" + encodeURIComponent(_this.addressno.value);
			query += "&zipcode=" + encodeURIComponent(_this.zipcode.value);
			query += "&town=" + encodeURIComponent(_this.city.value);

			_this.addressCache = _this.address.value;
			_this.addressnoCache = _this.addressno.value;
			_this.zipcodeCache = _this.zipcode.value;
			_this.cityCache = _this.city.value;

			_this.getData(query);
		},
		getData: function(query) {
			if (request && request.readyState != 4) {
				$CN.abort(request);
			}
			var _this = DanBolig.RadiusSearch;
			_this.addressResultBox.innerHTML = "<img src='/Images/ajax-loader.gif' style='position: relative; left: 130px;' />";

			var _this = DanBolig.RadiusSearch;
			var url = "/Ajax/AjaxAddressLookup.aspx?" + query;
			var handlers = {
				success: _this.successHandler,
				failure: _this.failureHandler
			};
			request = $CN.asyncRequest('GET', url, handlers);
		},
		successHandler: function(o) {
			var _this = DanBolig.RadiusSearch;
			var createDataObject = function(elm) {
				var dataObj = {};
				var _address = elm.getAttribute("Address");
				var _roadNumber = elm.getAttribute("RoadNumber");
				_roadNumber = _roadNumber == "0" ? "" : _roadNumber;
				var _zipCode = elm.getAttribute("ZipCode");
				var _town = elm.getAttribute("Town");
				if (_town.length < 1) {
					_town = elm.getAttribute("District");
				}
				if (_town.length > 0) {
					//_town = _town.substr(0,1).toUpperCase() + _town.substr(1).toLowerCase();
					_town = _town.toLowerCase().replace(/(^[a-zæøå]|(?:\s)[a-zæøå])/g, function() {
						return arguments[0].toUpperCase();
					});
				}
				// Old school UTM coordinates no longer in use
				//var _utm32x             = elm.getAttribute("UTM32X"); 
				//var _utm32y             = elm.getAttribute("UTM32Y");
				var _lat = elm.getAttribute("Lat");
				var _lon = elm.getAttribute("Lon");

				dataObj["m_address"] = { "text": _address, "value": _address };
				dataObj["m_roadNumber"] = { "text": _roadNumber, "value": _roadNumber };
				dataObj["m_zipCode"] = { "text": _zipCode, "value": _zipCode };
				dataObj["m_town"] = { "text": _town, "value": _town };
				dataObj["m_utm32x"] = { "text": "utm32x", "value": _lon };
				dataObj["m_utm32y"] = { "text": "utm32y", "value": _lat };
				dataObj["locationType"] = { "text": "locationtype", "value": elm.getAttribute("LocationType") };
				//console.log("locationType: " + dataObj["locationType"].value);
				return dataObj;
			};
			var createList = function() {
				var ar = _this.addressResults;
				var ul = document.createElement("ul");
				var li;
				for (var i = 0, l = ar.length; i < l; i++) {
					var obj = ar[i];
					li = document.createElement("li");
					if (i % 2 == 0) {
						li.className = "alt";
					}
					var a = document.createElement("a");
					a.setAttribute("href", "#address_" + i);
					var text = "notset";
					var locationType = obj["locationType"].value;

					var smlObj = {};
					for (var key in obj) {
						smlObj[key] = obj[key].value;
					}
					switch (locationType) {
						case "1":
							text = "{m_address} {m_roadNumber}, {m_zipCode} {m_town}".supplant(smlObj);
							break;
						case "2":
							text = "{m_address} , {m_zipCode} {m_town}".supplant(smlObj);
							break;
						case "3":
							text = "{m_zipCode} {m_town}".supplant(smlObj);
							break;
						default:
							break;
					}
					a.innerHTML = text;

					li.appendChild(a);
					ul.appendChild(li);
				}
				_this.addressResultBox.innerHTML = "<h4>Vælg den ønskede adresse:</h4>";
				_this.addressResultBox.appendChild(ul);
			}

			var root = o.responseXML;
			var elements = root.getElementsByTagName("LocationInfo");
			DanBolig.Tabs.validationManager.clearErrors();
			//console.log("clear: rs");
			_this.addressResultBox.innerHTML = "";
			if (!elements || elements.length < 1) {
				DanBolig.Tabs.validationManager.propagateErrors({ "nonexist": "Det var ikke muligt at finde den søgte adresse" });
				return;
			}
			_this.addressResults = [];

			if (elements.length == 1) {
				var elm = elements[0];
				var obj = createDataObject(elm);
				if (obj["m_zipCode"] == "0") {
					return false
				}
				/*
				||
				(_this.addressnoCache && _this.addressnoCache == obj["m_roadNumber"].value) || (_this.addressnoCache == "") ||
				(_this.zipcodeCache && _this.zipcodeCache == obj["m_zipCode"].value) || (_this.zipcodeCache == "") ||
				(_this.cityCache && _this.cityCache == obj["m_town"].value) || (_this.cityCache == "")
				*/
				if (
		            (
		                (_this.addressCache && _this.addressCache.toLowerCase() == obj["m_address"].value.toLowerCase()) &&
		                ((_this.zipcodeCache && _this.zipcodeCache.toLowerCase() == obj["m_zipCode"].value.toLowerCase()) || (_this.zipcodeCache == "")) &&
		                ((_this.cityCache && _this.cityCache.toLowerCase() == obj["m_town"].value.toLowerCase()) || (_this.cityCache == ""))
		            ) ||
		            (
		                (_this.addressCache == "") &&
		                (_this.zipcodeCache && _this.zipcodeCache == obj["m_zipCode"].value) &&
		                ((_this.cityCache && _this.cityCache.toLowerCase() == obj["m_town"].value.toLowerCase()) || (_this.cityCache == ""))
		            )
		          ) {
					_this.dataManager.update("Internal", obj);
				}
				else {
					_this.addressResults.push(obj);
					createList();
				}


				if (DanBolig.Tabs.cache != null) {
					DanBolig.Tabs.selectTab(DanBolig.Tabs.cache);
				}
				return true;
			}

			var ul = document.createElement("ul");
			var li;
			for (var i = 0, l = elements.length; i < l; i++) {
				var elm = elements[i];

				var obj = createDataObject(elm);
				if (obj["m_zipCode"].value == "0") {
					continue;
				}

				_this.addressResults[i] = obj;
			}
			createList();
			return false;
		},
		selectFromList: function(e, c) {
			var _this = DanBolig.RadiusSearch;
			$E.preventDefault(e);
			var target = $E.getTarget(e);
			var nodeName = target.nodeName.toLowerCase();
			if (nodeName != "a") {
				return;
			}
			var index = parseInt(target.getAttribute("href").replace(/#address_/, ""));
			_this.dataManager.update("Internal", _this.addressResults[index]);
			_this.addressResultBox.innerHTML = "";

			if (DanBolig.Tabs.cache != null) {
				DanBolig.Tabs.selectTab(DanBolig.Tabs.cache);
			}
		},
		updateFields: function(type, args) {
			var _this = DanBolig.RadiusSearch;
			var provider = args[0].provider;
			var data = args[0]["data"];

			if (data["m_address"]) {
				_this.address.value = data["m_address"].value !== null && data["m_address"].value != "" ? data["m_address"].value : "";
				_this.addressCache = _this.address.value;
			}
			if (data["m_roadNumber"]) {
				_this.addressno.value = data["m_roadNumber"].value !== null && data["m_roadNumber"].value != "0" ? data["m_roadNumber"].value : "";
				_this.addressnoCache = _this.addressno.value;
			}
			if (data["m_zipCode"]) {
				_this.zipcode.value = data["m_zipCode"].value !== null && data["m_zipCode"].value != "" ? data["m_zipCode"].value : "";
				_this.zipcodeCache = _this.zipcode.value;
			}
			if (data["m_town"]) {
				_this.city.value = data["m_town"].value !== null && data["m_town"].value != "" ? data["m_town"].value : "";
				_this.cityCache = _this.city.value;
			}
		},
		failureHandler: function(o) {
			alert(o.responseText);
			var root = o.responseXML;
		},
		send: function(type, args) {
			var _this = DanBolig.RadiusSearch;
			var provider = args[0].provider;
			if (provider != "Internal" && provider != "slider-max-distance" && provider != "distance-type-radioGroup") {
				return;
			}
			var data = args[0].data;
			DanBolig.Global.dataManager.update("DanBolig.RadiusSearch", data);
		},
		update: function(type, args) {
			if (args[0].provider && args[0].data && args[0].provider != "DanBolig.RadiusSearch") {
				var _this = DanBolig.RadiusSearch;
				var data = args[0].data;
				var provider = args[0].provider;
				_this.dataManager.update(provider, data);
			}
		},
		validate: function() {
			var valid = (!!DanBolig.Global.dataManager.dataMap["m_zipCode"] && !!DanBolig.Global.dataManager.dataMap["m_zipCode"].value) &&
		                (!!DanBolig.Global.dataManager.dataMap["m_town"] && !!DanBolig.Global.dataManager.dataMap["m_town"].value) &&
		                (!!DanBolig.Global.dataManager.dataMap["m_utm32x"] && !!DanBolig.Global.dataManager.dataMap["m_utm32x"].value) &&
		                (!!DanBolig.Global.dataManager.dataMap["m_utm32y"] && !!DanBolig.Global.dataManager.dataMap["m_utm32y"].value);

			return valid;
		}
	}
} ();
