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
     ****************************************************/
    // Regions ID - Sættes til 0 hvis Danmarkskort skal vises
    regionId: 0,
    
    // Kommune ID - Sættes til 0 hvis regionskort skal vises
    municipalityId: 0,
    
    currentRegionId: -1,
    currentMunicipalityId: -1,
    
    // Liste over elementer, der skal være valgt
    selected: {regions: new Array(), municipalities: new Array(), postals: new Array()},
    
    // Callback funktion der kaldes når der skiftes til et område
    callbackZoom: function(regionId, municipalityId) { },
    
    // Callback funktion der kaldes når et område vælges
    callbackSelect: function(regionId, municipalityId, postalId, postalText) { },
    
    // Callback funktion der kaldes når et område fravælges
    callbackDeselect: function(regionId, municipalityId, postalId) { },
    
    // Grafik folder
    gifPath: '/map/gif5/',
    
    // Kort folder
    mapPath: '/map/map5/',
    
    // Img folder
    imgPath: '/map/img/',
    
    imgMapId: 0,
      
    /****************************************************
     * Public methods
     ****************************************************/
    showMap: function() {
      var mapFile = "";

	if(this.currentRegionId!=this.regionId || this.currentMunicipalityId!=this.municipalityId) {

        // Vis Danmarkskort
        if (mapservice.regionId == 0) {
            mapFile = mapservice.mapPath + "country-full.html";
        } else {
            // Vis regionskort
            if (mapservice.municipalityId == 0) {
                mapFile = mapservice.mapPath + "region-" + mapservice.regionId + ".html";
            
            // Vis kommunekort
            } else {
                mapFile = mapservice.mapPath + "municipality-" + mapservice.municipalityId + ".html";
            }
        }

        $.ajax({
            type: "GET",
            url: mapFile,
            success: function(msg){
		/*document.getElementById("mapcontent").innerHTML = '';*/
                document.getElementById("mapcontent").innerHTML = msg.replace(
                  '../gif/',
                  mapservice.gifPath).replace(
                    'pixel.gif',
                    mapservice.imgPath+'pixel.gif').replace(
                      /imagemap/g,
                      'imgmap'+(mapservice.imgMapId++));
    
    
                var mainmap = document.getElementById('mainmap');
                var overlay = document.getElementById('overlay');
                var mapcontent = document.getElementById('mapcontent');
                var mapcontainer = document.getElementById('mapcontainer');
                var viewbox = document.getElementById('viewbox');

                // Placer gennemsigtigt lag over kortet
                overlay.style.width = mainmap.getAttribute("width") + "px";
                overlay.style.height = mainmap.getAttribute("height") + "px";
                             
                //mainmap.style.paddingLeft = "-" + viewbox.style.left;
                //mainmap.style.paddingTop = "-" + viewbox.style.top;
                
                // Beskær kort
                //alert("Left: " + mapcontent.offsetLeft + " -> " + "-" + viewbox.style.left + "\n" +
                //      "Top: " + mapcontent.offsetTop + " -> " + "-" + viewbox.style.top);

                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;
                }
                
                //mapcontent.style.marginLeft = viewbox.style.left;
                //mapcontent.style.marginTop = viewbox.style.top;
                
                // Hent alle billeder
                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.selectAreas();
            }
        });
      } 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.municipalityId == 0) {
          arrayToSearch = mapservice.selected.municipalities;
      } else {
          arrayToSearch = mapservice.selected.postals;
      }
      
      var areas = mapservice.getAllAreas();
			for (var i=0; i<areas.length; i++) {
				var area_info = mapservice.getAreaInfo(areas[i]);
        // Tjek om dette element skal være valgt
        if(arrayToSearch.contains(area_info[6])) {
          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.municipalityId = 0;
            mapservice.showMap();
        } else {
            mapservice.municipalityId = 0;
            mapservice.regionId = 0;
            mapservice.showMap();
        }
    },
    
    /****************************************************
     * Private methods and variables
     ****************************************************/
    // Doubleclick time
    dcTime: 250,
    
    // 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) {
        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 img = document.getElementById(area_name + '_img');
        if (img && img.className == 'polygon_selected') {
            mapservice.deselectArea(area_name);
        } else {
            mapservice.selectArea(area_name);
        }
    },
    
    doDoubleClick: function(area_name) {
        var clickMode = (mapservice.regionId == 0 || mapservice.municipalityId == 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);
            }
            
            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) {
                mapservice.createAreaImage(area_name, areas[i], mapservice.getImageUrl(area_name), 'polygon_highlight');
                createdImage = true;
            }
        }
    },
    
    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);
            }
        }
    },
    
    getAllAreas: function() {
        var result = new Array();

        var areas = document.getElementsByTagName('area');
        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');
        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.gifPath + area_name + '-highlighted.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;
        var municipalityId;
        
        if (mapservice.regionId == 0) {
            regionId = area_info[6];
            municipalityId = 0;
        } else {
            regionId = mapservice.regionId;
            municipalityId = area_info[6];
        }
        
        mapservice.callbackZoom(regionId, municipalityId, 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') {
            // Area is already selected
        } else {
            if (!img) {
                img = mapservice.createAreaImage(area_name, areas[0], this.gifPath + area_name + '-highlighted.gif', 'polygon_selected');
            } else {
                img.className = 'polygon_selected';
                //img.src = "../gif/" + area_name + "-selected.gif";
                img.src = this.gifPath + area_name + "-highlighted.gif";
            }

            var area_info = mapservice.getAreaInfo(areas[0]);
            if(!preventSubmit) 
							mapservice.callbackSelect(mapservice.regionId, mapservice.municipalityId, area_info[6], areas[0].title);
        }
    },

    deselectArea: function(area_name, preventSubmit) {
        var areas = mapservice.getAreas(area_name);
        var img = document.getElementById(area_name + '_img');

        if (img) {
            var area_info = mapservice.getAreaInfo(areas[0]);

            img.className = "polygon_highlight";
            img.src = this.gifPath + area_name + "-highlighted.gif";
            if(!preventSubmit)
							mapservice.callbackDeselect(mapservice.regionId, mapservice.municipalityId, area_info[6]);
        }
        
        mapservice.hideArea();
    },

    removeArea: function(area_name) {
        var img = document.getElementById(area_name + '_img');
        if (img) {
            img.parentNode.removeChild(img);
        }
    }
};

//window.onload = function() {
//    return;
//    var mainmap = document.getElementById('mainmap');
//    var overlay = document.getElementById('overlay');
//    overlay.style.width = mainmap.width + 'px';
//    overlay.style.height = mainmap.height + 'px';
//    overlay.onmouseover = function() {
//        //hideArea();
//    }

//    /*
//    overlay.onclick = function() {
//        var x = prompt('x');
//        var y = prompt('y');
//        var e = document.createElement('div');
//        e.innerHTML = '<img src="pixel.gif">';
//        e.style.position = "absolute";
//        e.style.backgroundColor = "red";
//        e.style.zIndex = 20;
//        e.style.width = "2px";
//        e.style.height = "2px";
//        e.style.left = x + "px";
//        e.style.top = y + "px";
//        document.getElementsByTagName("body")[0].appendChild(e);
//    }
//    */

//    // Add areas into select box
//    var areas = mapservice.getAllAreas();
//    
//    if (clickMode == 'select') {
//        var select = document.createElement('select');
//        select.id = 'selection_polygons';
//        select.style.position = 'absolute';
//        select.style.left = (mainmap.width + 20) + 'px';
//        select.style.zIndex = 10;
//        select.style.top = '0px';
//        select.style.width = '150px';
//        select.style.height = '400px';
//        select.multiple = 'multiple';
//        var container = document.getElementById('overlaycontainer');
//        container.appendChild(select);
//    }
//    
//    /*
//    var select = document.getElementById('selection_polygons');
//    select.onchange = function() {
//        // Synchronize all selections
//        for (var i=0; i<select.options.length; i++) {
//            var option = select.options[i];

//            if (option.selected) {
//                selectArea(option.value);
//            } else {
//                removeArea(option.value);
//            }
//        }
//    }
//    */

//    for (var i=0; i<areas.length; i++) {

//        var area_info = areas[i].getAttribute("rel").split(/\|/);
//        var area_name = area_info[0];

//        // TODO: Move onclick and onmouseover here.
//        /*
//        var option = document.createElement('option');
//        option.text = areas[i].title;
//        option.id = area_name + '_option';
//        option.value = area_name;
//        
//        select.options[select.options.length] = option;
//        */

//    }
//}
