﻿//
// JScript File
//

var isloaded = false;
var elavbbbox;

// Special Atlas event fired AFTER window.onload and AFTER Atlas components have been loaded.
// See http://weblogs.asp.net/wallym/archive/2006/01/24/436309.aspx
function pageLoad()
{
    // Ejerlav
    InitEjerlavSuggest();
		
	// Koordinatsøgning
	InitMapGimmick();
	InitMapSelect();
	
	// Search result keymap
	InitKeymap();
	
	// Webservice vars
	kms.o2kort.ws.Service_01.set_timeout(10000);
	
    isloaded = true;
}


/***********************************
*   Ejerlav
************************************/
var elavSuggest;        // Autosuggest object for ejerlav
var elavNavnList = null;    // List of suggestions for elavSuggest
var elavCodeList = null;    // List of suggestions for elavSuggest

function InitEjerlavSuggest()
{
	elavSuggest = new AutoSuggest(document.getElementById('txtEjerlavNavn'),getEjerlav);
	elavSuggest.onItemSelected = onEjerlavNavnSelected;
	elavSuggest.onPressEnter = searchFromEjerlavInput;
	elavSuggest.idleTimeOut = 10000;
	
	elavCodeSuggest = new AutoSuggest(document.getElementById('txtEjerlavsNummer'),getEjerlavByCode);
	elavCodeSuggest.onItemSelected = onEjerlavCodeSelected;
	elavCodeSuggest.onPressEnter = searchFromEjerlavInput;
	elavCodeSuggest.idleTimeOut = 10000;
}

function getEjerlav(searchString)
{
    var txt = searchString + '*';
    var requestSS = kms.o2kort.ws.Service_01.SearchEjerlavFromName(
        txt,
        12,
        OnEjerlavNavnComplete, 
        OnEjerlavNavnError, 
        "Ejerlav navn"
        );
}

function getEjerlavByCode(searchString)
{
    if(isNumeric(searchString))
    {
        var txt = searchString + '*';
        var requestSS = kms.o2kort.ws.Service_01.SearchEjerlavFromEjerlavCode(
            txt,
            12,
            OnEjerlavCodeComplete, 
            OnEjerlavNavnError, 
            "Ejerlav kode"
          );
    }
    else  alert('Fejl: Ejerlavskoden må kun indeholde tal');
}

function OnEjerlavNavnComplete(result, userContext, methodname) 
{
    elavNavnList = result.EjerlavList;
    var a = new Array();
    for (i=0; i < elavNavnList.length; i++)
    {
        a[i] = new Array(elavNavnList[i].Name, elavNavnList[i].Name + ' (' + elavNavnList[i].Id + ')');
    }
    elavSuggest.fill(a);
}

function OnEjerlavCodeComplete(result, userContext, methodname) 
{
    elavCodeList = result.EjerlavList;
    var a = new Array();
    for (i=0; i < elavCodeList.length; i++)
    {
        a[i] = new Array(elavCodeList[i].Id, elavCodeList[i].Id + ' ' + elavCodeList[i].Name);
    }
    elavCodeSuggest.fill(a);
}

function OnEjerlavNavnError(reqError, userContext, methodName) 
{
    alert("Fejl: Søgning efter ejerlav mislykkedes\n(" + reqError.get_message() + ")");
    //debug.trace(reqError.get_message()); // se http://forums.asp.net/thread/1443115.aspx
    //debug.trace(reqError.get_stackTrace());
}

function onEjerlavNavnSelected(i,item)
{ 
    if(elavNavnList[i].Name == item[0])
    {
        document.getElementById('txtEjerlavsNummer').value = elavNavnList[i].Id;
    }
    else
    {
         alert('FEJL: Autofuldførelse af ejerlav har udført en fejl. \nKontakt systemadministrator');
    }
}

function onEjerlavCodeSelected(i,item)
{ 
    //alert(elavList[i].Id);
    document.getElementById('txtEjerlavNavn').value = elavCodeList[i].Name;
    document.getElementById('txtEjerlavsNummer').value = item[0];
}

function clearEjerlavInput()
{
    document.getElementById('txtEjerlavsNummer').value = '';
    document.getElementById('txtEjerlavNavn').value = '';
}

function searchFromEjerlavInput()
{
    var elav = document.getElementById('txtEjerlavsNummer').value.trim();
    if(elav.length > 0) getMapsByEjerlav(elav);
    //else alert('Kan ikke søge efter ejerlav, når feltet \'Kode\' ikke indeholder en ejerlavskode.\nFeltet udfyldes automatisk, når der er valgt et gyldigt ejerlav.');
}

function onEjerlavCodeKeyUp(evt)
{
    evt = (evt) ? evt : event;
    if (isEnterKey(evt)) searchFromEjerlavInput();
}
/***********************************
*   Adresse
************************************/


/***********************************
*   Map select
************************************/
var map1;
var pnt;
var mapgimmick;
var SelectMapX = 0;
var SelectMapY = 0;

function InitMapGimmick()
{
    mapgimmick = new keyMap(document.getElementById('mapgimmick'),'images/sat_dk_70.gif','140px','108px',432190,6038822,904158,6424389,'lime',0);
    mapgimmick.moveRectWhenClicked = true;
    mapgimmick.OnClick = OnMapGimmickClick;
    mapgimmick.SetVisible(true);
    mapgimmick.Draw(430000,6029500,480000,6079500);
}

function OnMapGimmickClick(s)
{
    with (s.boundingbox) {
        ShowMapSelect(xmin,ymin,xmax,ymax);
    }    
}

function InitMapSelect()
{
    document.getElementById('selectmap').style.display = 'none';
    map1 = new mapservice(document.getElementById('mapdiv1'),'http://kortforsyningen.kms.dk/service?version=1.1.1&service=WMS&srs=EPSG:25832&styles=&format=image/png&exceptions=application/vnd.ogc.se_inimage&bgcolor=0xDFF3FF&transparent=FALSE&servicename=topo_skaermkort&ignoreillegallayers=true&','topo_skaermkort','','430000,6000000,905000,6475000','image/png','ticket=' + kf_ticket);
    map1.defaultBehaviour = new wmsBehaviour(2,2,2,false,true,false,true,40,10,50,5);
    map1.srs='EPSG:25832';
    map1.fractionDigits=2;
    map1.bboxCalcMode=2;
    map1.minResolution = 0.2;
    map1.progressElement = document.getElementById('busyDiv');
    map1.SetFullExtent(430000,5970000,905000,6475000);
    //map1.OnTransitionEnd = map1OnTransitionEnd;
    //map1.OnBBoxChanging = map1OnBBoxChanging;
    map1.OnMouseUp = OnMapSelectMouseUp;
    map1.operationMode = 1;
    
    // tilføj ejerlav. JOWMS har en bug i transparency????
    //map1.AddService('../o2wms/service.aspx?servicename=ejerlav&','labelledejerlav','default','image/gif','&service=WMS&exceptions=application/vnd.ogc.se_inimage&transparent=TRUE&');
    
    pnt = new pointerCmL('pointer1','images/needle.gif',15,19,0,19,false);
    map1.AddCosmeticLayer(pnt); 
}

function ShowMapSelect(xmin,ymin,xmax,ymax)
{
    map1.SetView(xmin,ymin,xmax,ymax);
    map1.Show();
    document.getElementById('selectmap').style.display = '';
}
function HideMapSelect()
{
    document.getElementById('selectmap').style.display = 'none';
}

function OnMapSelectMouseUp(sender)
{
    var tol = sender.minRectSize; // Enhed: pix
    // Check if user has performed click or drag
    if(     (Math.abs(sender.MouseDownX - sender.MousePosX) < tol)
            && (Math.abs(sender.MouseDownY - sender.MousePosY) < tol)
      )
    {
        SelectMapX = sender.worldX;
        SelectMapY = sender.worldY;
        document.getElementById('SelectMapX').innerHTML = SelectMapX;
        document.getElementById('SelectMapY').innerHTML = SelectMapY;
        pnt.setCoords(SelectMapX,SelectMapY);
        pnt.setVisibility('visible');
        document.getElementById('btnSelectMapOk').disabled = false;
    }
}

function OnSelectMapOk()
{
    getMapsByCoord(SelectMapX, SelectMapY)
    HideMapSelect();
}

function navPan(x,y,pct) {
 map1.Pan(pct*x,pct*y);
}

function Zoom(val)
{
    map1.Zoom(val);
}

function setArrowCursor(val) {
 document.getElementById('navigationImg').style.cursor = val;
} 


/***********************************
*   Get map lists
************************************/
function getMapsByEjerlav(nr)
{
    if(isNumeric(nr))
    {
        var context = 'ejerlavsnummer ' + nr;
        
        OnSearchBegin(context);
        
        var requestSS = kms.o2kort.ws.Service_01.SimpleMDFromEjerlav(
            nr,
            OnGetMapsByEjerlavComplete, 
            OnGetMapsError, 
            context
          );
    }
    else  alert('Fejl: Ejerlavskoden må kun indeholde tal');
}

function OnGetMapsByEjerlavComplete(result, request, userContext) 
{
    // Todo: handle empty result
    var o1kort = result.O1kort;
    var o2kort = result.O2kort;
    var rammekort = result.Rammekort;
    var ejerlav = result.Ejerlav;
    var context;
    if(ejerlav==null) // No ejerlav found in db
    {
        context = userContext;
        UpdateSearchResult(new Array(),o1kort,o2kort,rammekort, context);
        alert('I databasen findes ingen ejerlav, der matcher de indtastede oplysninger');
    }
    else
    {
        context = 'ejerlavet \'' + ejerlav.Name + '\' (' + ejerlav.Id + ')' ;
        UpdateSearchResult(new Array(ejerlav),o1kort,o2kort,rammekort, context);
    }
}

function getMapsByCoord(x,y)
{
    // cast to int as the webservice serialization fails on doubles
    var E = parseInt(x);
    var N = parseInt(y);
    var context = 'koordinat E: ' + E + ' N: ' + N;
    var crs = 'epsg:25832';
    
    OnSearchBegin(context);
    
    var requestSS = kms.o2kort.ws.Service_01.SimpleMDFromCoord(
        E,N,crs,
        OnGetMapsByCoordComplete, 
        OnGetMapsError, 
        context
       );
}

function OnGetMapsByCoordComplete(result, userContext, methodname) 
{
    var coord = result.Koordinat; // Søgte koordinat
    var o1kort = result.O1kort;
    var o2kort = result.O2kort;
    var rammekort = result.Rammekort;
    var elavlist = result.Ejerlav;
    var txt = 'koordinaten E: ' + coord.Point.X + ' N: ' + coord.Point.Y;
    txt += '<br />';
    switch (elavlist.length)
    {
        case 0:
            txt += 'OBS: Ingen ejerlav fundet på koordinaten!'; break;
        case 1:
            txt += 'som ligger i ejerlavet '; break;
        default:
            txt += 'som ligger i ejerlavene ';
    }
    for (i = 0; i < elavlist.length; i++)
    {
        if(i!=0) txt += ', ';
        txt += elavlist[i].Name + ' (' + elavlist[i].Id + ')';
    }
    
    UpdateSearchResult(elavlist,o1kort,o2kort,rammekort, txt);
    //debug.dump(result,userContext,true,'-');
}

function OnGetMapsError(reqError, userContext, methodName) 
{
    alert("Fejl: Søgning efter kort mislykkedes");
//    debug.trace(sender.get_message()); // Ikke supported i RC - kommer igen senere
//    debug.trace(sender.get_stackTrace());
}

/***********************************
*   Map lists
************************************/
function OnSearchBegin(context)
{
    ClearSearchResult();
    UpdateSearchInfo('Henter data for ' + context,-1,-1);
}

// elevwbbox (array) is used for updating keymap bbox for the oekort
function UpdateSearchResult(elavwbbox,o1k,o2k,ram,context)
{
    UpdateSearchInfo('Søgeresultat for ' + context, o1k.length, o2k.length, ram.length)
    UpdateOekortList(o1k, 'o1k_oekort');
    UpdateOekortList(o2k, 'o2k_oekort');
    UpdateRammekortList(ram, elavwbbox[0].Id);
    
    // Add ejerlav cordinates to keymap
    for(i = 0; i < elavwbbox.length; i++)
    {
        var bbox = elavwbbox[i].BBox;
        document.getElementById('altMap').style.visibility = 'visible';
        elavbbbox = bbox.Point1.X+','+bbox.Point1.Y+','+bbox.Point2.X+','+bbox.Point2.Y;
        AddBBoxToKeymap(elavwbbox[i].BBox);
    }
}

function ClearSearchResult()
{
    ClearSearchInfo();
    ClearOekortList('o1k_oekort');
    ClearOekortList('o2k_oekort');
    ClearRammekortList();
    ClearKeymap();
}

function UpdateOekortList(oe, bladType)
{
    ClearOekortList(bladType);
    var tbl;
    switch (bladType)
    {
        case 'o1k_oekort':
            tbl = document.getElementById('o1kortListBody');
            break;
        case 'o2k_oekort':
            tbl = document.getElementById('o2kortListBody');
            break;
    }
    for(i = 0;i < oe.length; i++)
    {
        var kort = oe[i];
        var tr = document.createElement('tr');
        
        var td = document.createElement('td');
        td.innerHTML = '<a href="#" onclick="ShowO2Map(\''+ bladType +'\', ' + kort.OekortBladId + ',\'' + kort.Ejerlav.Id + '\');return false;">Vis</a>';
        tr.appendChild(td);
        
        var td = document.createElement('td');
        td.innerHTML = kort.Ejerlav.Name;
        tr.appendChild(td);
        
        var td = document.createElement('td');
        td.innerHTML = kort.GyldigFra;
        tr.appendChild(td);
        
        var td = document.createElement('td');
        td.innerHTML = kort.GyldigTil;
        tr.appendChild(td);
        
        var td = document.createElement('td');
        for(j = 0; j < kort.Planer.length; j++)
        {
            if (j > 0) td.innerHTML += ', ';
            td.innerHTML += kort.Planer[j];
        }
        tr.appendChild(td);
        
        var td = document.createElement('td');
        td.innerHTML = kort.Maalestok;
        tr.appendChild(td);
        
        var td = document.createElement('td');
        td.innerHTML = kort.Bemaerkning;
        tr.appendChild(td);
        tbl.appendChild(tr);
    }
    if(oe.length == 0)
    {
        var tr = document.createElement('tr');
        var td = document.createElement('td');
        td.setAttribute('colspan','7')
        td.colSpan = 7;
        td.innerHTML = 'Ingen data';
        tr.appendChild(td);
        tbl.appendChild(tr);
    }
}

function ClearOekortList(bladType)
{
    var oetbl;
    switch (bladType)
    {
        case 'o1k_oekort':
            oetbl = document.getElementById('o1kortListBody');
            break;
        case 'o2k_oekort':
            oetbl = document.getElementById('o2kortListBody');
            break;
    }
    RemoveChilds(oetbl);
}

function UpdateRammekortList(ram, elavId)
{
    ClearRammekortList();
    var tbl = document.getElementById('rammekortListBody');
    for(i = 0;i < ram.length; i++)
    {
        var kort = ram[i];
        var tr = document.createElement('tr');
        
        var td = document.createElement('td');
        td.innerHTML = '<a href="#" onclick="ShowO2Map(\'o2k_rammekort\', ' + kort.RammekortBladId + ',\'' + elavId + '\');return false;">Vis</a>';
        tr.appendChild(td);
        
        var td = document.createElement('td');
        td.innerHTML = kort.KortbladsNavn;
        tr.appendChild(td);
        
        var td = document.createElement('td');
        td.innerHTML = kort.GyldigFra;
        tr.appendChild(td);
        
        var td = document.createElement('td');
        td.innerHTML = kort.GyldigTil;
        tr.appendChild(td);
       
        var td = document.createElement('td');
        td.innerHTML = kort.Maalestok;
        tr.appendChild(td);
        
        var td = document.createElement('td');
        td.innerHTML = kort.Bemaerkning;
        tr.appendChild(td);
        tbl.appendChild(tr);
        
        // Update keymap
        AddBBoxToKeymap(kort.BBox);
    }
    if(ram.length == 0)
    {
        var tr = document.createElement('tr');
        var td = document.createElement('td');
        td.setAttribute('colspan','6')
        td.colSpan = 6;
        td.innerHTML = 'Ingen data';
        tr.appendChild(td);
        tbl.appendChild(tr);
    }
}

function ClearRammekortList()
{
    var ramtbl = document.getElementById('rammekortListBody');
    RemoveChilds(ramtbl);
}

function UpdateSearchInfo(text, numO1kort, numO2kort, numRammekort)
{
    document.getElementById('searchType').innerHTML =  text;
    if((numO1kort >= 0) && (numO2kort >= 0) && (numRammekort >= 0))
    {
        document.getElementById('numO1kort').innerHTML = 'Antal original 1 kort i søgeresultat: ' + numO1kort;
        document.getElementById('numO2kort').innerHTML = 'Antal original 2 ø-kort i søgeresultat: ' + numO2kort;
        document.getElementById('numRammekort').innerHTML = 'Antal original 2 rammekort i søgeresultat: ' + numRammekort;
        document.getElementById('o1kortCount').innerHTML = numO1kort==0 ? ' (Ingen)':' ('+numO1kort+')';
        document.getElementById('o2kortCount').innerHTML = numO2kort==0 ? ' (Ingen)':' ('+numO2kort+')';
        document.getElementById('rammekortCount').innerHTML = numRammekort==0 ? ' (Ingen)':' ('+numRammekort+')';
    }
    else
    {
        document.getElementById('numO1kort').innerHTML = '';
        document.getElementById('numO2kort').innerHTML = '';
        document.getElementById('numRammekort').innerHTML = '';
        document.getElementById('o1kortCount').innerHTML = '';
        document.getElementById('o2kortCount').innerHTML = '';
        document.getElementById('rammekortCount').innerHTML = '';
    }
}

function ClearSearchInfo()
{
    document.getElementById('searchType').innerHTML = '';
    document.getElementById('numO1kort').innerHTML = '';
    document.getElementById('numO2kort').innerHTML = '';
    document.getElementById('numRammekort').innerHTML = '';
    document.getElementById('o1kortCount').innerHTML = '';
    document.getElementById('o2kortCount').innerHTML = '';
    document.getElementById('rammekortCount').innerHTML = '';
}


/***********************************
*   Keymap
************************************/
var keymap1;
var keymapXmin = 99999999;
var keymapYmin = 99999999;
var keymapXmax = -99999999;
var keymapYmax = -99999999;

function InitKeymap()
{
    //keymap1 = new keyMap(document.getElementById('keymap1'),'images/dk2.gif','190px','157px',430000,6029500,905000,6422000,'red',2);
    keymap1 = new keyMap(document.getElementById('keymap1'),'images/dk3.gif','121px','100px',430000,6029500,905000,6422000,'red',2)
    keymap1.moveRectWhenClicked = false;
    keymap1.SetVisible(false);
    //keymap1.OnClick = keymapOnClick; 
}

function AddCoordToKeymap(point)
{
    if(point.X < keymapXmin) keymapXmin = point.X;
    if(point.Y < keymapYmin) keymapYmin = point.Y;
    if(point.X > keymapXmax) keymapXmax = point.X;
    if(point.Y > keymapYmax) keymapYmax = point.Y;
    keymap1.Draw(keymapXmin,keymapYmin,keymapXmax,keymapYmax);
    if(!keymap1.isVisible) keymap1.SetVisible(true);
}

function AddBBoxToKeymap(box)
{
    AddCoordToKeymap(box.Point1);
    AddCoordToKeymap(box.Point2);
}

function ClearKeymap()
{
    keymapXmin = 99999999;
    keymapYmin = 99999999;
    keymapXmax = -99999999;
    keymapYmax = -99999999;
    keymap1.Draw(0,0,0,0);
    keymap1.SetVisible(false);
}

//keymap1.Draw(xmin,ymin,xmax,ymax);


/***********************************
*   Open map window
************************************/
var MapW = null;
var MapH = null;
var MapSizeOfScreen = 0.4;

function ShowO2Map(type, id, elavcontext) {
    if(MapW == null || MapH == null)
    {
        var ScreenW;
        var ScreenH;
        try
        {
            ScreenW = Math.max(screen.width,1024);
            ScreenH = Math.max(screen.height,768);
        }
        catch(err)
        {
            ScreenW = 1024;
            ScreenH = 768;
        }
        MapW = Math.floor(ScreenW * MapSizeOfScreen);
        MapH = Math.floor(ScreenH * MapSizeOfScreen);
    }
    var url = 'o2mapviewer.aspx?type='+type+'&id='+id;
    if(elavcontext) url += '&elav=' + elavcontext;
	var win = window.open(url, type + id, 'toolbar=no,resizable=yes,status=yes,scrollbars=no,width=' + MapW + ',height=' + MapH);
	win.focus();
	return false;
}


/***********************************
*   Utils
************************************/
function openWindow(url) 
{
//    window.open(AppBaseUrl+'altMapViewer.aspx?bbox='+elavbbbox,'matrikelkort','width=700,height=500,menubar=no,resizable=yes,status=no,titlebar=no');
    window.open('altMapViewer.aspx?bbox='+elavbbbox,'matrikelkort','width=700,height=500,menubar=no,resizable=yes,status=no,titlebar=no');
    return false;
}

function RemoveChilds(node)
{
    while(node.childNodes.length > 0)
    {
        node.removeChild(node.childNodes[0]);
    }
}

function isEnterKey(evt)
{
    var charCode = (evt.charCode) ? evt.charCode :
        ((evt.which) ? evt.which : evt.keyCode);
    if (charCode == 13 || charCode == 3) return true;
    else return false;
}


function isNumeric(x) {
    if(x == null || x.length == 0) return false;
    // I use this function like this: if (isNumeric(myVar)) { }
    // regular expression that validates a value is numeric
    var RegExp = /^(-)?(\d*)(\.?)(\d*)$/; // Note: this WILL allow a number that ends in a decimal: -452.
    // compare the argument to the RegEx
    // the 'match' function returns 0 if the value didn't match
    var result = x.match(RegExp);

    if(result == null) return false;
    else return true;
}

function expandList(ths, elemId) {
    var elemHead = document.getElementById(elemId+'Head');
    var elemBody = document.getElementById(elemId+'Body');
    var disp = elemHead.style.display;
    if (disp=='') {
        ths.src = 'images/plus.gif';
        elemHead.style.display = 'none';
        elemBody.style.display = 'none';
    } else {
        ths.src = 'images/minus.gif';
        elemHead.style.display = '';
        elemBody.style.display = '';
    }
}
