Array.prototype.remove = function (s) {
    for (i = 0; i < this.length; i++) {
        if (s == this[i]) this.splice(i, 1);
    }
}

Array.prototype.add = function (s) {
    if (!this.contains(s)) this[this.length] = s;
}

Array.prototype.contains = function (s) {
    for (i = 0; i < this.length; i++) {
        if (s == this[i]) return true;
    }
    return false
}

var mapservice = {
    /****************************************************
    * Indstillinger af kort - Skal overskrives p?siden
    ****************************************************/
    regionId: 0,
    municipalityId: 0,
    postalId: 0,
    
    currentRegionId: -1,
    currentMunicipalityId: -1,
	currentPostalId: -1,
    
    mapCountyPostCodes: {}, //this object will hold the zipcodes to municipality mapping array

    selected: { regions: new Array(), municipalities: new Array(), postals: new Array() },

    callbackZoom: function (regionId, municipalityId) { },


    callbackSelect: function (regionId, municipalityId, postalId, postalText) { },


    callbackDeselect: function (regionId, municipalityId, postalId) { },

    // Grafik folder
    imgPath: '../images/map/',

    // Kort folder
    mapPath: '../map/',

    /****************************************************
    * Public methods
    ****************************************************/
    //start added, moved the map content preparation from the AJAX callback function to a standalone function, so it can be used both by the maps and the zipcodes list
    displayMapContent: function (msg, isMap) {
        document.getElementById("mapcontent").innerHTML = '';
        if (isMap == true) {
            var content = msg;
        }
        else {
            var content = "";
            if (msg["postal_codes"].length > 0) {
                for (i = 0; i <= msg["postal_codes"].length - 1; i++) {
                    var postalAreaText = 'municipality-' + msg["postal_codes"][i]["county_id"] + '-part-' + msg["postal_codes"][i]["zip"];
                    content += '<span class="postalcode"><input type="checkbox" class="postal_checkbox" onmouseover="mapservice.hoverArea(' + "'" + postalAreaText + "'" + ');" onmouseout="mapservice.hideArea();" rel="' + postalAreaText + '|0,0|0|0|' + msg["postal_codes"][i]["region_id"] + '|' + msg["postal_codes"][i]["county_id"] + '|' + msg["postal_codes"][i]["zip"] + '" title="' + msg["postal_codes"][i]["zip"] + " " + msg["postal_codes"][i]["zip_name"] + '" />&nbsp;' + msg["postal_codes"][i]["zip"] + " " + msg["postal_codes"][i]["zip_name"] + "</span><br />";
                }
                content = '<div class="postalcodes_container">' + content + '</div>';
            }
        }


        document.getElementById("mapcontent").innerHTML = content;
        var mainmap = document.getElementById('mainmap');



        if (isMap == true) {
            var mapcontent = document.getElementById('mapcontent');
            var mapcontainer = document.getElementById('mapcontainer');
            var viewbox = document.getElementById('viewbox');
            var overlay = document.getElementById('overlay');
            overlay.style.width = mainmap.width + "px";
            overlay.style.height = mainmap.height + "px";


            mapcontainer.style.width = viewbox.style.width;
            mapcontainer.style.height = viewbox.style.height;
            mapcontainer.style.display = 'block';
            mapcontent.style.width = viewbox.style.width;

            mapcontent.style.height = viewbox.style.height;

            if (viewbox.style.left.substr(0, 1) == "-") {
                mapcontent.style.left = viewbox.style.left.substr(1);
            }
            else {
                mapcontent.style.left = "-" + viewbox.style.left;
            }

            if (viewbox.style.top.substr(0, 1) == "-") {
                mapcontent.style.top = viewbox.style.top.substr(1);
            }
            else {
                mapcontent.style.top = "-" + viewbox.style.top;
            }

            var areas = mapservice.getAllAreas();
            var loadedImages = {};
            var container = document.createElement('div');
            container.id = 'mapimagepreload';
            mapcontent.appendChild(container);

            container.innerHTML = "";

            for (var i = 0; i < areas.length; i++) {
                var area_info = mapservice.getAreaInfo(areas[i]);

                if (loadedImages[area_info[0]] == null) {
                    loadedImages[area_info[0]] = true;
                    var img = document.createElement('img');
                    img.src = mapservice.getImageUrl(area_info[0]);
                    img.style.display = 'none';
                    container.appendChild(img);
                }
            }
        }
        mapservice.currentRegionId = mapservice.regionId;
        mapservice.currentMunicipalityId = mapservice.municipalityId;
        mapservice.currentPostalId = mapservice.postalId;
        mapservice.selectAreas();
    },
    //end added
    showMap: function () {
        var mapFile = "";

        if (this.currentRegionId != this.regionId || this.currentMunicipalityId != this.municipalityId || this.currentPostalId != this.postalId) {
            // Vis Danmarkskort
            if (mapservice.regionId == 0) {
                mapFile = mapservice.mapPath + "country-full.html";
            }
            else {
                // Vis regionskort
                if (mapservice.regionId != 0 && mapservice.municipalityId == 0) {
                    mapFile = mapservice.mapPath + "region-" + mapservice.regionId + ".html";
                    // Vis kommunekort
                }
                else {
                    if (mapservice.regionId != 0 && mapservice.municipalityId != 0 && mapservice.postalId == 0) {
                        mapFile = mapservice.mapPath + "municipality-" + mapservice.municipalityId + ".html";
                    }
                    else if (mapservice.regionId != 0 && mapservice.municipalityId != 0 && mapservice.postalId != 0) {
                        mapservice.displayMapContent(mapservice.mapCountyPostCodes[mapservice.municipalityId], false);
                        return;
                    }
                }
            }
            
			// alert(mapFile);
			$.get(
				mapFile,
				function (msg) {
					mapservice.displayMapContent(msg, true);
				}
			);
        }
        else {
            mapservice.selectAreas();
        }
    },

    selectAreas: function () {
        // Find den liste af valgte elementer der skal tjekkes op imod
        var arrayToSearch;
		
		if (mapservice.regionId == 0)
            arrayToSearch = mapservice.selected.regions;
        else if (mapservice.regionId > 0 && mapservice.municipalityId == 0)
			arrayToSearch = mapservice.selected.municipalities;
        else if (mapservice.regionId > 0 && mapservice.municipalityId > 0)
            arrayToSearch = mapservice.selected.postals;
		
        var areas = mapservice.getAllAreas();
        for (var i = 0; i < areas.length; i++) {
            var area_info = mapservice.getAreaInfo(areas[i]);

			if (arrayToSearch.contains(area_info[6]) && this.hasChildren(area_info[6]) == false) {
                mapservice.hoverArea(area_info[0]);
                mapservice.selectArea(area_info[0], true);
            }
            else {
                mapservice.deselectArea(area_info[0], true);
            }
        }
    },

    back: function () {
		if (mapservice.municipalityId == 0 && (mapservice.postalId == 0 || mapservice.postalId == mapservice.regionId))
		{
			mapservice.municipalityId = 0;
			mapservice.regionId = 0;
			mapservice.postalId = 0;
			mapservice.showMap();
		}
		else if (mapservice.postalId != 0 || (mapservice.postalId == 0 && mapservice.municipalityId != 0)) {
			mapservice.postalId = 0;
			mapservice.municipalityId = 0;
			mapservice.showMap();
		}
		else if (mapservice.postalId == 0 && mapservice.municipalityId == 0 && mapservice.regionId != 0) {
			mapservice.municipalityId = 0;
			mapservice.regionId = 0;
			mapservice.showMap();
		}
    },

    /****************************************************
    * Private methods and variables
    ****************************************************/
    // Doubleclick time
    dcTime: 50,

    // No clicks after doubleclick
    dcDelay: 50,

    // Time of doubleclick
    dcAt: 0,

    // Save event for handling doClick()
    savEvent: null,

    // Save time of click event
    savEvtTime: 0,

    // Handle of click setTimeOut
    savTO: 0,

    dblclick: false,
    timer: null,

    hadDoubleClick: function () {
        var d = new Date();
        var now = d.getTime();
        if (now - mapservice.dcAt < mapservice.dcDelay) {
            return true;
        }
        else {
            return false;
        }
    },

    handleClick: function (event, area_name) {
		mapservice.maintainHierarchyTree(area_name);
        
		switch (event.type) {
            case "click":
                if (mapservice.hadDoubleClick()) {
                    return false;
                }

                mapservice.savEvent = event;
                d = new Date();
                mapservice.savEvtTime = d.getTime();
                mapservice.savTO = setTimeout("mapservice.doSingleClick('" + area_name + "');", mapservice.dcTime);
                break;

            case "dblclick":
                mapservice.doDoubleClick(area_name);
                break;
        }
    },

    doSingleClick: function (area_name) {
        if (mapservice.savEvtTime - mapservice.dcAt <= 0) {
            return false;
        }
        var areas = mapservice.getAreas(area_name);
        var img = document.getElementById(area_name + '_img');
        
		if ((img && img.className == 'polygon_selected') || (!img && areas[0].getAttribute("type") == "checkbox" && areas[0].parentNode.className == "postalcode_selected" && !areas[0].checked)) {
            mapservice.deselectArea(area_name);
        }
        else {
            mapservice.selectArea(area_name);
        }
    },

    doDoubleClick: function (area_name) {
        var clickMode = (mapservice.regionId == 0 || mapservice.municipalityId == 0 || mapservice.postalId == 0) ? 'zoom' : 'select';
        if (clickMode == 'select') {
            this.displayInfoBoxZoom();
            return;
        }

        var d = new Date();
        mapservice.dcAt = d.getTime();
        if (mapservice.savTO != null) {
            clearTimeout(mapservice.savTO);
        }

        mapservice.zoomArea(area_name);
    },

    hoverArea: function (area_name) {
        mapservice.hideArea();

        // Determine if area is selected
        if (document.getElementById(area_name + '_img')) {
            return;
        }

        var areas = mapservice.getAreas(area_name);
        var createdImage = false;

        for (var i = 0; i < areas.length; i++) {
            areas[i].onclick = function (e) {
                var myEvent;
                try {
                    myEvent = e;
                    if (e.type) {
                    }
                }
                catch (ex) {
                    myEvent = event;
                }
                mapservice.handleClick(myEvent, area_name);
            }

            if (areas[i].tagName.toLowerCase() == "area") {
                areas[i].ondblclick = function (e) {
                    var myEvent;
                    try {
                        myEvent = e;
                        if (e.type) {
                        }
                    }
                    catch (ex) {
                        myEvent = event;
                    }
                    mapservice.handleClick(myEvent, area_name);
                }
            }

            if (createdImage == false && areas[i].tagName.toLowerCase() == "area") {
                mapservice.createAreaImage(area_name, areas[i], mapservice.getImageUrl(area_name), 'polygon_highlight');
                createdImage = true;
            }
            else if (areas[i].getAttribute("type") == "checkbox" && areas[i].parentNode.className == "postalcode") {
                areas[i].parentNode.className = "postalcode_selected";
            }
        }
    },

    hideArea: function () {
        // Remove all images that are not selected.
        var images = document.getElementsByTagName('img');
        for (var i = 0; i < images.length; i++) {
            var img = images[i];
            if (img.className == 'polygon_highlight') {
                img.parentNode.removeChild(img);
            }
        }
        var boxes = document.getElementsByTagName("input");
        if (boxes.length > 0) {
            for (i = 0; i <= boxes.length - 1; i++) {
                if (boxes[i].type.toLowerCase() == "checkbox" && !boxes[i].checked && boxes[i].parentNode.className == "postalcode_selected") {
                    boxes[i].parentNode.className = "postalcode";
                }
            }
        }
    },
	
	maintainHierarchyTree: function (area_name) {
		var areas = mapservice.getAreas(area_name);
		var area_info = mapservice.getAreaInfo(areas[0]);
		
		if (typeof mapservice.hierarchyTree[area_info[6]] == 'undefined')
			mapservice.hierarchyTree[area_info[6]] = area_info[5] > 0 ? area_info[5] : area_info[4];
	},
	
	hasChildren: function (id)
	{
		for (var i in mapservice.hierarchyTree)
			if (mapservice.hierarchyTree[i] == id && (typeof mapservice.data.PostNumre[i] != 'undefined' || typeof mapservice.data.Kommuner[i] != 'undefined'))
				return true;
		
		return false;
	},
	
    getAllAreas: function () {
        var result = new Array();

        var areas = document.getElementsByTagName('area');
        if (areas.length == 0) {
            areas = document.getElementsByTagName('input');
            var arr = new Array();
            if (areas.length > 0) {
                for (i = 0; i <= areas.length - 1; i++) {
                    if (areas[i].getAttribute("type") == "checkbox" && areas[i].className == "postal_checkbox") {
                        arr.push(areas[i]);
                    }
                }
            }
            if (arr.length > 0) {
                areas = arr;
            }
        }

        for (var i = 0; i < areas.length; i++) {
            if (areas[i].getAttribute("rel")) {
                result[result.length] = areas[i];
            }
        }

        return result;
    },

    getAreas: function (area_name) {
        var result = new Array();

        var areas = document.getElementsByTagName('area');
        if (areas.length == 0) {
            areas = document.getElementsByTagName('input');
            var arr = new Array();
            if (areas.length > 0) {
                for (i = 0; i <= areas.length - 1; i++) {
                    if (areas[i].getAttribute("type") == "checkbox" && areas[i].className == "postal_checkbox") {
                        arr.push(areas[i]);
                    }
                }
            }
        }
        for (var i = 0; i < areas.length; i++) {
            if (areas[i].getAttribute("rel") && areas[i].getAttribute("rel").substring(0, area_name.length + 1) == area_name + "|") {
                result[result.length] = areas[i];
            }
        }

        return result;
    },

    getAreaInfo: function (area) {
        return area.getAttribute("rel").split(/\|/);
    },

    getImageUrl: function (area_name) {
        return this.imgPath + area_name + '-h.gif';
    },

    createAreaImage: function (area_name, area, image, className) {
        var area_info = mapservice.getAreaInfo(area);
        var coords = area_info[1].split(/,/);
        var x = Math.round(parseFloat(coords[0]));
        var y = Math.round(parseFloat(coords[1]));

        var img = document.createElement('img');
        img.id = area_name + '_img';
        img.src = image;
        img.className = className;
        img.style.position = 'absolute';
        img.style.left = x + 'px';
        img.style.top = y + 'px';
        img.style.width = area_info[2] + 'px';
        img.style.height = area_info[3] + 'px';

        img.style.display = 'block';
        var container = document.getElementById('overlaycontainer');
        container.appendChild(img);
        return img;
    },

    zoomArea: function (area_name) {
        var areas = mapservice.getAreas(area_name);
        var area_info = mapservice.getAreaInfo(areas[0]);

        var regionId = area_info[4];
        var municipalityId = area_info[5];
        var postalId = area_info[6];

        if (regionId == 0) {
            regionId = area_info[6];
        }
        else if (regionId != 0 && municipalityId == 0) {
            municipalityId = area_info[6];
        }
        else if (regionId != 0 && municipalityId != 0 && postalId == 0) {
            postalId = area_info[6];
        }

        mapservice.callbackZoom(regionId, municipalityId, postalId, areas[0].title);
    },

    selectArea: function (area_name, preventSubmit) {
        var img = document.getElementById(area_name + '_img');
        var areas = mapservice.getAreas(area_name);
		
        if (!(img && img.className == 'polygon_selected'))
		{
			if (!img) {
                if (areas[0].tagName.toLowerCase() == "area") {
                    img = mapservice.createAreaImage(area_name, areas[0], this.imgPath + area_name + '-h.gif', 'polygon_selected');
                }
                else if (areas[0].tagName.toLowerCase() == "input" && areas[0].getAttribute("type") == "checkbox") {
					switch (areas[0].parentNode.className)
					{
						case "postalcode":
							areas[0].parentNode.className = "postalcode_selected";
							break;
						case "postalcode_selected":
							areas[0].checked = true;
							break;
					}
                }
            }
            else {
                img.className = 'polygon_selected';
                img.src = this.imgPath + area_name + "-h.gif";
            }
            
            var area_info = mapservice.getAreaInfo(areas[0]);
            
			if (!preventSubmit) {
				if (area_info[4] == '0' && area_info[5] == '0')
					mapservice.callbackSelect(area_info[6], 0, 0, areas[0].title);
				else if (area_info[5] == '0')
					mapservice.callbackSelect(0, area_info[6], 0, areas[0].title);
				else
					mapservice.callbackSelect(0, 0, area_info[6], areas[0].title);
			}
		}
    },

    deselectArea: function (area_name, preventSubmit) {
        var areas = mapservice.getAreas(area_name);
        var img = document.getElementById(area_name + '_img');
        var area_info = mapservice.getAreaInfo(areas[0]);

        if (img) {
            img.className = "polygon_highlight";
            img.src = this.imgPath + area_name + "-h.gif";
            if (!preventSubmit) {
				if (area_info[4] == '0' && area_info[5] == '0')
					mapservice.callbackDeselect(area_info[6], 0, 0);
				else if (area_info[5] == '0')
					mapservice.callbackDeselect(0, area_info[6], 0);
				else
					mapservice.callbackDeselect(0, 0, area_info[6]);
            }
        }
        else if (!img && areas[0].getAttribute("type") == "checkbox" && areas[0].parentNode.className == "postalcode_selected") {
            areas[0].parentNode.className = "postalcode";
            areas[0].checked = false;
            if (document.getElementById("p" + area_info[6])) {
                mapservice.removeSelected(document.getElementById("p" + area_info[6]));
            }
            
            if (!preventSubmit) {
				if (area_info[4] == '0' && area_info[5] == '0')
					mapservice.callbackDeselect(area_info[6], 0, 0);
				else if (area_info[5] == '0')
					mapservice.callbackDeselect(0, area_info[6], 0);
				else
					mapservice.callbackDeselect(0, 0, area_info[6]);
			}
        }

        mapservice.hideArea();
    },

    removeArea: function (area_name) {
        var img = document.getElementById(area_name + '_img');
        if (img) {
            img.parentNode.removeChild(img);
        }
    }
};


$(function(){
	function bindTapholdEvent(){
		$('map area:not(.loaded)').addClass('loaded').bind('taphold', function(e){
			e.stopPropagation();
			e.stopImmediatePropagation();        
			mapservice.doDoubleClick(this.getAttribute('rel').split('|')[0]);
		});
	}
	
	setInterval(bindTapholdEvent, 500);
});
