var marked,storedataContainer,bounds,map,startpoint,topictitle, height, map_divisor; 
var topicmarker;
var original_topicmarker;
var showstatus = false;

// **********************************************************************************************
// * Method to create specific marker object. When clicked, it disappears. Click again, and a   *
// * movable marker appears.
// **********************************************************************************************
function createMarkerObject(point,myname,draggable){

    var marker = new GMarker(point,{draggable: draggable, title:myname });
    var tmp = point.toString();
    var separator = ",";
    var arrayOfStrings = tmp.split(separator);
    var latitude = arrayOfStrings[0];
    var longitude = arrayOfStrings[1];    
    latitude = latitude.slice(1);
    longitude = longitude.slice(1,-1);
    var markerObject = {"latitude":latitude,"longitude":longitude,"marker":marker, "title":myname};
    return markerObject;
}

function addRemoveListener(){
    topicmarker = original_topicmarker;
    GEvent.addListener(topicmarker.marker, "click", function() {
            removeMarker();   
        }); 
}


// **********************************************************************************************
// * Eventlistener for user interaction. If the user clicks on the map, a marker will be added  *
// * The marker can be set to be draggable, and if so can be repositioned. Only one marker can  *
// * be added within the context.                                                               *
// **********************************************************************************************
function addNewMarker(){
    if(marked){
        alert("Allerede en markør i kartet for dette emnet");
        return;
    }else{
        GEvent.clearInstanceListeners(map);
        GEvent.addListener(map, "click", function(overlay,point){
                if(!marked){
                    var separator = ",";
                    topicmarker = null;
                    topicmarker = createMarkerObject(point,topictitle,true);
                    map.addOverlay(topicmarker.marker);
                    enableMarkerDragging();
                    marked = true;
                    var tmpbounds = GLatLngBounds(point);
                    map.setCenter(point,map.getZoom());
                    displayStoreButton(true);
                    displayEditPencil(false);         
            }
         });         
     }   
}

function displayStoreButton(show_me){
    
    if(show_me){
        document.getElementById('storeform').style.display = 'block'; 
        }else{
        document.getElementById('storeform').style.display = 'none'; 
        }
}

function displayEditPencil(show_me){
    
    if(show_me){
        document.getElementById('map_edit').style.display = 'block'; 
    }else{
        document.getElementById('map_edit').style.display = 'none'; 
        }
}

function enableMarkerDragging(){
    topicmarker.marker.enableDragging();
    marker_stored = false;
}
 function disableMarkerDragging(){
    if(marked)
        topicmarker.marker.disableDragging();    
    marked_stored = true;
}

// **********************************************************************************************
// * Remove marker from map, and prepare for a new one.                                         *
// **********************************************************************************************
function removeMarker(){
    map.removeOverlay(topicmarker.marker);
    topicmarker = null;
    marked = false;
    marker_stored = false;
    addNewMarker();
}

function rollBack(){
    map.clearOverlays();
    topicmarker = original_topicmarker;
    map.addOverlay(topicmarker.marker);
    map.setCenter(topicmarker.marker.getPoint());
    marked = true;
    marker_stored = true;        
}

function createRequest(){
    var request;
    if (window.XMLHttpRequest) { // Mozilla, Safari..
        request= new XMLHttpRequest();
        if (request.overrideMimeType) {
            request.overrideMimeType('text/xml');
            } 
        }else if (window.ActiveXObject) { // IE
            try {
                request= new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }
    if (!request) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
         }
    return request;        
}

// **********************************************************************************************
// * Function to store coordinates for new or repositioned marker                               *
// * This function is called from the page template.                                            *
// **********************************************************************************************
function storeCoordinates(){
    //If the marker already has stored coordinates, there is no need to store it again.
    if(marker_stored){
        alert("Posisjon er allerede lagret - avbryter operasjon");
        return;
    }
    if(!topicmarker){
        var nought = " ";
        var url = location.href;
        xmlHttpPythonRequest(null, nought,nought,url);
        displayStoreButton(false);
        displayEditPencil(true);         
        return;
    }
    try{
            var newPoint = topicmarker.marker.getPoint();
            addPosition(null, newPoint);
            disableMarkerDragging();
            GEvent.clearInstanceListeners(topicmarker.marker);
            marker_stored = true;
            original_topicmarker = topicmarker;
            mapListener(newPoint);             
            displayStoreButton(false);
            displayEditPencil(true);         
    }catch(err){
        alert("Ingen koordinater å lagre - trykk i kart for markør" + err);
    }
}

function alertContents(httpRequest) {
        if (httpRequest.readyState == 4) {
            if (httpRequest.status == 200) {
//                alert(httpRequest.responseText);
                var ready = "";
            } else {
                if(showstatus)
                    alert('There was a problem with the request.'+httpRequest.status);
            }
        }
 }

// **********************************************************************************************
// * Opens a httprequest to post coordinates to a python script. If longitude and latitude      *
// * are blank strings, the coordinates are deleted.                                             *
// **********************************************************************************************
function xmlHttpPythonRequest(serial,longitude,latitude, url){
    var xmlHttp = createRequest();
//    var xmlHttp = new XMLHttpRequest();
    var suffix1 = "tore_view2";
    var suffix2 = "content_view";
    var slash = "/";
    if(url.match(suffix1)){
        url = url.replace(suffix1,"");
    }else if(url.match(suffix2)){
        url = url.replace(suffix2,"");    
    }
    xmlHttp.onreadystatechange = function() { alertContents(xmlHttp); };
    xmlHttp.open("POST", url+"/setcoordinates", false);
    xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlHttp.send("serial="+serial+"&lengdegrad="+longitude.toString()+"&breddegrad="+latitude.toString());
}

// **********************************************************************************************
// * Add a new position for a marker.                                                           *
// **********************************************************************************************
function addPosition(serial,point){
    var separator = ",";
    var tmp = point.toString();
    var arrayOfStrings = tmp.split(separator);
    var latitude = arrayOfStrings[0];
    var longitude = arrayOfStrings[1];
    latitude = latitude.slice(1);
    longitude = longitude.slice(1,-1);
    var url = location.href;
    xmlHttpPythonRequest("",longitude,latitude,url);
    topicmarker.marker.disableDragging();
}

// **********************************************************************************************
// * Reposition for an existing marker.                                                         *
// **********************************************************************************************
function rePosition(){
    var currentPoint = topicmarker.marker.getPoint();
    var title = topicmarker.title;
    var reposition = deleteCoordinates();
    if(!reposition){
        return;
    }
    map.removeOverlay();
    topicmarker = null;
    topicmarker = createMarkerObject(currentPoint, title, true);
    map.addOverlay(topicmarker.marker);
    marked = true;
    marker_stored = false;
}

// **********************************************************************************************
// * Deletes coordinates for context (breddegrad,lengdegrad)                                    *
// **********************************************************************************************
function deleteCoordinates(){
    var nought = " ";
    var answer = confirm("Vil du slette den nåværende posisjonen?"); 
    if(answer){
        var url = location.href;
        xmlHttpPythonRequest(null, nought,nought,url);
        marker_stored = false;
//        alert("Posisjon slettet - klikk og hold i markør for å flytte til ny posisjon, trykk deretter på Lagre");
        removeMarker();
        
        return true;
    }else{
        alert("Operasjon avbrutt");
        return false;
   }
}

//If a marker with stored coordinates exists, it is erased and the context's coordinates deleted 
//If a marker exists, but its coordinates has not yet been stored, the user is alerted to this fact.
//If no marker exists, there is nothing to delete, and the user is alerted to this.
function deleteMarker(){
    if(marked && marker_stored){
        deleteCoordinates();
    }else{
        if(marked){
            alert("Markør finnes, men posisjonen er ikke lagret ennå - trenger ikke slette");
            return;
        }else{  
            alert("Ingen posisjon å slette");
            return;
        }
    }
}

//Function to establish the client size
function windowHeight() {
	// Standard browsers (Mozilla, Safari, etc.)
	if (self.innerHeight)
		return self.innerHeight;
	// IE 6
	if (document.documentElement && document.documentElement.clientHeight)
		return document.documentElement.clientHeight;
	// IE 5
	if (document.body)
		return document.body.clientHeight;
	// Just in case. 
	return 0;
}

//The height of the sidebar-map
function handleResize() {
//    height = windowHeight() - document.getElementById('content').offsetHeight - 30;
//    height = height/map_divisor;

    height = 250;
    var found_slot = document.getElementById('sidebar_map_slot');
    if(found_slot){
        found_slot.style.height = height + 'px';
        return true;   
    }else{
        return false;
        }
}

function reSize(percentage){
    percentage = percentage + 1;
    height = height*percentage;
    document.getElementById('sidebar_map_slot').style.height = height + 'px';    
}

function removeMapListeners(){
    GEvent.clearInstanceListeners(map);
}

function mapListener(point){
    var empty = "";
    var tmp = point.toString();
    var separator = ",";
    var arrayOfStrings = tmp.split(separator);
    var latitude = arrayOfStrings[0];
    var longitude = arrayOfStrings[1];    
    latitude = latitude.slice(1);
    longitude = longitude.slice(1,-1); 
//    addMapListener();
    GEvent.addListener(map,"click", function(point) { 
      var url = "http://kuling.net/kart#";
      window.location = empty.concat(url,"marker:",latitude,",",longitude);
    });
}

// **********************************************************************************************
// * Initiates the map on load. Should only be called once.                                     *
// **********************************************************************************************
function init(){
    map_divisor = 2;
    var checkIfSlotPresent = handleResize();
    if(!checkIfSlotPresent)
        return;
    marked = false;
    marker_stored = false;
    map = new GMap2(document.getElementById("sidebar_map_slot"));
    startpoint = new GLatLng(68.50,16.0);
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    map.addControl(new GScaleControl());
    map.setCenter(startpoint,9);
    
    if(coordinates[0].breddegrad && coordinates[0].lengdegrad){
        var lat = coordinates[0].breddegrad;
        var lng = coordinates[0].lengdegrad;
        topictitle = coordinates[0].title;
        var point = new GLatLng(lat,lng);
        topicmarker = createMarkerObject(point, topictitle, true);
        original_topicmarker = topicmarker;
        map.addOverlay(topicmarker.marker);
        disableMarkerDragging();
        map.setCenter(point);
        mapListener(point);
//        marked = true;
//        marker_stored = true;
    }else{
        addNewMarker();
//      map.addControl(new StoreDataControl());
    }
}

window.onload = init;
window.onunload = GUnload;

//TESTER
//1: Trykk i tomt kart - ny flyttbar markør skal vises i kart
//    1.1: Trykk på lagre, dialog skal gis, og ved "OK" skal posisjon låses, og markør ikke lenger være flyttbar (marked settes til true)
//    1.1.1: Trykk på lagre en gang til, beskjed skal gis om at posisjon allerede er lagret (sjekk på at marked er true)
//    1.2: Trykk på slett, dialog skal gis, og ved "OK" skal posisjon slettes, og markør fjernes fra kart (marked settes til false)
//    1.2.1: Trykk på slett en gang til, beskjed skal gis om at ingen markør i kart som kan slettes (sjekk på at marked er false)
//2: Trykk Slett når tomt kart, beskjed om at ingenting kan slettes
//3: Trykk Slett når markør finnes, men den ikke har lagret posisjon ennå - beskjed gis om at markørens posisjon er ikke lagret              
//4:  




//deprecated function
//function StoreDataControl() {  }
//StoreDataControl.prototype = new GControl();
//StoreDataControl.prototype.initialize = function(map) {                            
//    storedataContainer = document.createElement("div");
//    storedataContainer.style.overflow="auto";
//    storedataContainer.style.backgroundColor = "#ffffcc";
//    storedataContainer.style.border = "1px solid black";
//    storedataContainer.style.height="40px";
//    storedataContainer.style.width="100px";
//    storedataContainer.style.paddingLeft="3px";
//    map.getContainer().appendChild(storedataContainer);
//    t1 = document.createElement("b");
//    t1.appendChild(document.createTextNode("Trykk paa markor"));
//    storedataContainer.appendChild(t1);
//    return storedataContainer;                            
//}
//
//StoreDataControl.prototype.getDefaultPosition = function() {
//    return new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(3, 13));
//}
//
//function myclick(i){
//    GEvent.trigger(gmarkers[i],"store");
//}
//    GEvent.addListener(map,"click", function(point) {
//        var empty = "";
//        var tmp = point.toString();
//        var separator = ",";
//        var arrayOfStrings = tmp.split(separator);
//        var latitude = arrayOfStrings[0];
//        var longitude = arrayOfStrings[1];    
//        latitude = latitude.slice(1);
//        longitude = longitude.slice(1,-1);    
//              
//          var url = "http://kuling.net/kart#";
//          window.location = empty.concat(url,"marker:",latitude,",",longitude);
//    });
//function addMapListener(){
//
//    GEvent.addListener(map,"click", function(point) { 
//      var url = "http://kuling.net/kart#";
//      window.location = empty.concat(url,"marker:",latitude,",",longitude);
//    });
//}
