/********************************************************
 headerfuncs.js
 Created	: 11.july 2003, 08:00
 Author	: Powel Gemini As/jet,ks
 Purpose	: This file contains js functions used in the topframe,
 such as maptype, coordsys and help functions.
 History :
 - 19.03.2004 / ks
 References between frames has been altered. parent
 should allways be used instead of top.
 ********************************************************/

// !!! var upper_scale_available; Must be defined elsewhere!

//var dMap = top.frames['MapFrame'];
dMap = parent.frames['MapFrame'];
dLeftTop = parent.frames['LeftMenu1'];

var baseurl = "/bergen/";

function changeMapType() {
    if (dMap.waitForResponse) {
        dMap.waitMessage();
    } else {
        var kart = document.Main.maptype.value;
        var cmdURL = "maptype=" + kart ;
        dMap.executeprocess(cmdURL);
    }
    if (dLeftTop.reloadPrintTabIfActive) {
        dLeftTop.reloadPrintTabIfActive();
    }
    dMap.hideMeasure();
}


// Returns maptype
function getMapType() {
    var MapType = "";
    try {
        MapType = document.getElementById("maptype").value;
    } catch(e) {
        MapType = "";
    }
    return (MapType);
}
//    function getMapType()   {
//        var kart = document.Main.maptype.value;
//        return kart;
//    }

// Returns maptype alias
function getMapTypeAlias() {
    var mapTypeAlias = "";
    try {
        mapTypeAlias = document.getElementById("maptype").options[document.getElementById("maptype").selectedIndex].text;
    } catch(e) {
        mapTypeAlias = "";
    }
    return mapTypeAlias;
}


function changeDatum() {
    var datum = document.Main.datum.value;
    var kart = document.Main.maptype.value;
    var cmdURL = "maptype=" + kart + "&datum=" + datum;
    parent.MapFrame.executeprocess(cmdURL);

}

function runHelp() {
    var nW = window.open("", "popup", "resizable=yes,scrollbars=no,top=10,left=10,width=1000,height=700");
    nW.location.href = baseurl + "help/mainhelp/aimsHelpMain.html";
    nW.focus();
    nW.resizeTo(1000, 700);
    nW = null;
}


function openMapInfo() {
    var nW = window.open("", "popup", "resizable=yes,scrollbars=no,top=10,left=10,width=1000,height=700");
    nW.location.href = baseurl + "help/maphelp/aimsMapHelpMain.jsp?maptype=" + getMapType();
    nW.resizeTo(1000, 700);
    nW.focus();
    nW = null;
}


function listLayers(value) {
    if (value == 1) { //legend image
        document.Main.setlayer.value = 1;
    } else if (value == 2) { //layer list
        document.Main.setlayer.value = 2;
    } else if (value == 3) { //update layerlist
        document.Main.action.value = 9;
    }
    document.Main.submit();
}

function sMakeOption(sValue, sDesc, sSelValue) {
    var str = "";
    str = "<option ";
    if (sValue == sSelValue)
        str += " selected ";
    str += "value=" + sValue + ">" + sDesc + "</option>";
    return str;
}


function setDatum(selvalue) {
    document.Main.datum.value = selvalue;
}

var mvalues = new Array();
// Array to hold all measurevalues
mvalues[0] = 500;
// values..
mvalues[1] = 1000;
mvalues[2] = 2000;
mvalues[3] = 3000;
mvalues[4] = 4000;
mvalues[5] = 5000;
mvalues[6] = 9000;
mvalues[7] = 10000;
mvalues[8] = 25000;
mvalues[9] = 50000;
mvalues[10] = 100000;
mvalues[11] = 200000;
var isuserdefined = false;

// Needed to sort array ny number
function numberSort(n1, n2) {
    if (n1 < n2)
        retVal = -1;
    else if (n1 > n2)
        retVal = 1;
    else
        retVal = 0;
    return retVal;
}

// Check if measurevalue exist
function domValueExist(value) {
    for (var i = 0; i < mvalues.length; i++) {
        if (mvalues[i] == value)
            return true;
    }
    return false;
}

// Add new measurevalue
function addmValue(value) {
    mvalues[mvalues.length] = value;
}

// Delete measurevalue by index
function delmElement(delindex) {
    size = mvalues.length;
    for (var i = 0; i <= size; i++)
        mvalues[i] = ((i == delindex) ? "delete" : mvalues[i]);
    for (var j = delindex; j < size - 1; j++)
        if (j != size) mvalues[j] = mvalues[j + 1];
    mvalues.length = size - 1;
}

// Delete measurevalue
function deletemValue(value) {
    for (var i = 0; i < mvalues.length; i++) {
        if (mvalues[i] == value) {
            delmElement(i);
        }
    }
}

// Set scale with measurevalue
function setscale(value) {
    var str = "";
    var istmpvalue = false;
    if (!domValueExist(value)) {
        addmValue(value);
        istmpvalue = !isuserdefined;
    }
    mvalues.sort(numberSort);
    str = "<select class=tools name=scale id=scale ONCHANGE='javascript:runScale();'>";
    //str += "<option selected value=" + value + ">1:" + value + "</option>";
    //str += "<option value=-1>Ny verdi..</option>";
    for (var i = 0; i < mvalues.length; i++) {
        str += "<option "
        if (value == mvalues[i]) str += "selected "
        str += "value=" + mvalues[i] + ">1:" + mvalues[i] + "</option>";
    }
    str += "<option value=-1>Ny verdi..</option>";
    str += "</select>"
    document.getElementById("measurearea").innerHTML = str;
    if (istmpvalue) {
        deletemValue(value);
        istmpvalue = false;
    }
}

// Checks if valid int
function validInt(nr) {
    return (("" + parseInt(nr)) == nr);
}


// trim string
function trimString(str) {
    str = this != window? this : str;
    return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
}


// Checks if numeric
function IsNumeric(sText) {
    var ValidChars = "0123456789.";
    var IsNumber = true;
    var Char;
    for (i = 0; i < sText.length && IsNumber == true; i++) {
        Char = sText.charAt(i);
        if (ValidChars.indexOf(Char) == -1)
            IsNumber = false;
    }
    return IsNumber;
}


// Check to see if user wants to add owen scale value
function runScale() {
    if (dMap.waitForResponse) {
        dMap.waitMessage();
    } else {
        var kart = document.Main.maptype.value;
        var value = document.Main.scale.value;
        var currentscale = Math.round(parent.scale);
        if (value == -1) {
            var retval = parseInt(prompt("Oppgi egen målestokk:", "1000"));
            var validNo = !isNaN(retval);
            if (validNo) {
                if (upper_scale_available == undefined) { // from header.jsp
                    upper_scale_available = 500000
                }
                if (retval > upper_scale_available) {
                    alert("Du må velge en verdi mindre enn " + upper_scale_available + "!");
                    setscale(currentscale);
                    return;
                }
                isuserdefined = true;
                setscale(retval);
                isuserdefined = false;
            } else {
                //alert("Verdien du oppga er ikke lovlig eller feil!");
                setscale(currentscale);
                return;
            }
            value = retval;
        }
        var cmdURL = "maptype=" + kart + "&scale=" + value;
        parent.MapFrame.executeprocess(cmdURL);

        //dMap.resetPrintx(); // Hide printing-info when changing scale
        // Update print-scale accordingly:
        if (parent.EventFrame.resetPrintTool) {
            parent.EventFrame.resetPrintTool();
        }
        if (parent.EventFrame.synchronizeScaleWithValue) {
            parent.EventFrame.synchronizeScaleWithValue(value);
        }
        dMap.hideMeasure();
    }
}


//******************** Geographic coords*************************************************** by Heidi/Kenneth

var xconst = 6430707.919;
var yconst = 20000;

function radToDeg(r) {
    var v = r * 180 / Math.PI;
    return v;
}

function getDesBredde(a, b, x) {
    var bredde;
    var breddeGrad;
    var f = getF(a, b);
    var n = getN(a, b);

    var tmp = (x * 10 / 10) ;
    x = tmp;

    var alpha = getAlpha(a, b, n);
    var yh = getYH(x, alpha);
    var beta = getBeta(n);

    var e = getE(f);
    var omega = getOmega(n);
    var epsilon = getEpsilon(n);
    var lamda = getLambda(n);

    var u = yh + (beta * Math.sin(2 * yh));
    var v = lamda * Math.sin(4 * yh);
    var w = omega * Math.sin(6 * yh);
    var p = epsilon * Math.sin(8 * yh);

    bredde = u + v + w + p;
    breddeGrad = bredde * 180 / Math.PI;
    //document.Main.breddeGrad.value = breddeGrad;

    return bredde;
}

function doShowCoords(x, y) {
    var newNorth = "";
    var newEast = "";
    /*
    var datum = document.Main.datum.value;
if (document.Main.datum.value=="bhalvxy") {
newNorth = y;
newEast = x;
} else if (document.Main.datum.value=="bhalvbrln") {
var a = 6377492.0176; //sjekkes opp
var b = 6356173.50832;
var tmp =  (x *10 / 10) ;
var x2 = tmp + 6430707.919;
x = x2;
newEast = toGradMinSek( radToDeg(getLengde(a,b,y,x)) );
newNorth = toGradMinSek( radToDeg(getBredde(a,b,y,x)) );
} else {

//newNorth = y + "*";
//newEast = x + "*";

newNorth = y;
newEast = x;
}
    */
    newNorth = y;
    newEast = x;
    parent.FooterFrame.document.getElementById('north').innerHTML = newNorth;
    parent.FooterFrame.document.getElementById('east').innerHTML = newEast;
}


function toGradMinSek(degr) {
    var outStr = "";
    return outStr;
}


function getBredde(a, b, x, y) {
    var b1;

    var f = getF(a, b);
    var e = getE(f);
    var desbredde = getDesBredde(a, b, x);
    var MF = getMeridianF(a, e, desbredde);
    var NF = getNormalF(a, e, desbredde);
    var eps = getEpsilonF(NF, MF);

    var u = ( sqr(y, 2) / 2) * (Math.tan(desbredde) / (MF * NF));
    var v = ( sqr(y, 4) / 24) * (Math.tan(desbredde) / (MF * sqr(NF, 3) ));
    var w = ( 5 + (3 * sqr(Math.tan(desbredde), 2)));
    var q = sqr(eps, 2);
    var r = (9 * q * Math.tan(desbredde));
    var t = (4 * sqr(eps, 4));
    var v1 = w + q - r - t;
    var v2 = v * v1;
    var s1 = sqr(y, 6) / 720;
    var s2 = Math.tan(desbredde) / (MF * sqr(NF, 5));
    var s3 = ( 61 + 90 * sqr(Math.tan(desbredde), 2)) + (45 * sqr(Math.tan(desbredde), 4));
    var s = - ( s1 * s2 * s3);

    b1 = (desbredde - u + v2 + s);

    return b1;
}


function getDeltaLengde(a, b, x, y) {
    var f = getF(a, b);
    var e = getE(f);
    var desbredde = getDesBredde(a, b, x);

    var NF = getNormalF(a, e, desbredde);
    var MF = getMeridianF(a, e, desbredde);
    var eps = getEpsilonF(NF, MF);

    var u = ( y / (NF * Math.cos(desbredde)));
    var v = ( sqr(y, 3) / (6 * sqr(NF, 3) * Math.cos(desbredde)) );

    var w1 = (2 * sqr(Math.tan(desbredde), 2));
    var w2 = sqr(eps, 2);
    var w = (1 + w1 + w2);

    var q = ( sqr(y, 5) / ( 120 * sqr(NF, 5) * Math.cos(desbredde)));
    var r = ( 5 + 28 * sqr(Math.tan(desbredde), 2) + 24 * sqr(Math.tan(desbredde), 4));
    var r1 = q * r;

    var dl = ( u - ( v * w ) ) + ( q * r);

    return dl;
}


function getLengde(a, b, x, y) {
    var lengde;
    var lengdeAkseI = (6.05625 * Math.PI / 180);
    var dl = getDeltaLengde(a, b, x, y);
    lengde = lengdeAkseI + dl;
    return lengde;
}


function getEpsilonF(Nf, Mf) {
    var eps = Math.sqrt(((Nf / Mf) - 1));
    return eps;
}


function getNormalF(a, e, bredde) {
    var NF = a / ( Math.sqrt(1 - ( sqr(e, 2) * sqr(Math.sin(bredde), 2))));
    return NF;
}


function getMeridianF(a, e, bredde) {
    var MF;

    var u = a * (1 - sqr(e, 2));
    var v = ( 1 - (sqr(e, 2) * sqr(Math.sin(bredde), 2)) );
    var w = sqr(v, 3);
    var s = Math.sqrt(w);

    MF = u / s;

    return MF;
}


function getF(a, b) {
    f = (a - b) / a;
    return f;
}

function getYH(x, alpha) {
    var u = x / alpha;
    return u;
}


function getEpsilon(n) {
    var e = 1097 / 512 * sqr(n, 4);
    return e;
}


function getOmega(n) {
    var omega = (151 / 96 * sqr(n, 3)) - (417 / 128 * sqr(n, 5));
    return omega;
}


function getLambda(n) {
    var lambi = (21 / 16 * sqr(n, 2)) - (55 / 32 * sqr(n, 4));
    return lambi;
}


function getBeta(n) {
    var u = 3 / 2 * n;
    var v = (27 / 32 * sqr(n, 3)) + ((269 / 512) * sqr(n, 5));
    var Beta = u - v;
    return Beta;
}


function getAlpha(a, b, n) {
    var u = ((a + b) / 2);
    var v = ( 1 + ( 1 / 4 * n * n) + ( 1 / 64 * n * n * n * n ) );
    var alpha = u * v;
    return alpha;
}


function getN(a, b) {
    n = (a - b) / (a + b);
    return n;
}


function getB0(a, f) {
    var b0 = a * ( (1 - (f / 2)) + (sqr(f, 2) / 16 ) + (sqr(f, 3) / 32)  );
    return b0;
}


function sqr(x, n) {
    var lm = x;
    for (i = 2; i <= n; i++)
        lm = lm * x;
    return lm;
}

function getE(f) {
    var e = Math.sqrt(f * (2 - f));
    return e;
}