﻿///<reference path="ms_common.js" />

/*
    JAVASCRIPT FUNKTIONEN FÜR DIE MAPSERVER-ENGINE.
    
    | Kern-Funktionen >> 2010-01-22 by Stefan Kowalczyk |
    
    Diese Code-Datei enthält alle grundlegenden Funktionen, welche für das Ansteuern des Kartenelementes notwendig sind. Des Weiteren
    muss diese Code-Datei zwingend vor allen anderen im ASPX- oder HTML-Dokument inkludiert werden. Die globalen Variablen sollten
    nicht verändert werden.
    
    Getestete Browser: FF2, FF3, FF3.5 | IE 6, IE 7, IE 8
*/

// ----> Globale Variablen instanzieren <----

// --> können ggf. angepasst werden <---
var cMapControlName = "MapObject"; // Name des HTML-Elementes, welches das Kartenelement widerspiegelt
var cImagesPath = "../MapEngine/Images/"; // relativer Pfad zu den Bildern; wird hauptsächlich von ms_interface.js verwendet
var cGlobalPlaceHolderName = "ctl00_ContentPlaceHolder1_"; // gloabler Präfix aller Control-IDs
var nZoomBoxAlpha = 0.5; // 50%
var nMaxMoveFactor = 30; // um diesen Faktor (in Prozent), allerdings abhängig von der Breite und Höhe des Kartenelementes, kann die Karte maximal in eine Richtung verschoben werden
// ---->

// --> bitte nicht verändern <--
var oMapControl; // aktuelles Image-Element
var aMapAbsPos; // speichert die aktuellen Koordinaten, innerhalb der Bildausdehnung, der ZoomBox (Array, globale Variable
var lInit = false; // gibt an, ob das MapControl initialisiert werden konnte (Bool, globale Variable)
// ---->

function MS_Init()
{
    ///<summary>Initialisiert einige Objekte für den MapServer.</summary>
    ///<returns>Liefert im Erfolgsfall 'true'.</returns>    
    _cRectBasicStyle = "background-color:#D2E9F1; border-color:#536A72; border-collapse: collapse; position: absolute; z-index: 102; -moz-opacity:" + nZoomBoxAlpha + "; opacity:" + nZoomBoxAlpha + "; filter:ALPHA(opacity=" + (nZoomBoxAlpha * 100).toString() + ")";  // Style der Zoombox
    var cEventCmdLine = cEventCmdLine = "onmousedown=\"MS_ZoomStart(event)\" onmousemove=\"MS_ZoomMove(event)\" onmouseup=\"MS_ZoomEnd(event);\"";
    
    document.write("<table border=\"2\" cellpadding=\"0\" cellspacing=\"0\" style=\"left: 0px; top: 0px; " + _cRectBasicStyle + "\" width=\"1px\" height=\"1px\" id=\"Rectangle\" " + cEventCmdLine + "><tr><td></td></tr></table>"); // Zoombox als Table-Objekt einbetten
    document.getElementById( "Rectangle" ).style.visibility = "hidden"; // Zoombox zunächst verstecken
        
    oMapControl = document.getElementById(cGlobalPlaceHolderName + cMapControlName);
    if (oMapControl == null)
        return false;
    else
    {
        nMaxPanX = 500; // gibt an, um wieviel Pixel der Kartenausschnitt beim Pan verschoben werden darf; die Angabe sollte bei anderen Applikation getestet und ggf. angepasst werden
        nMaxPanY = 540;        
    }

    MS_DisableDragDropOnMapElement(); // deaktiviert die Drag-n-Drop-Fähigkeit des Kartenelementes

    return true;
}

function MS_DisableDragDropOnMapElement() {
    ///<summar>Deaktivert das Drag-n-Drop-Verhalten im Kartenelement.</summary>
    if (MS_Common_IsBrowserIE()) { // für IE
        onerror = function() { return false; };
        document.ondragstart = function() { return false; };
    }
    else {
        addEventListener("mousedown", _MS_Common_FFpreventDrag, false); // für FF
    }
}

function _MS_Common_FFpreventDrag(event) {
    ///<summar>Verhindert das Drag-n-Drop bei HTML-Elementen, indem der ausgelöste JS-Event gestoppt wird. Funktioniert nur im Firefox.</summary>
    if (event.preventDefault) {
        event.preventDefault();
    }
}

function MS_ModusStart(e) {
    ///<summary>Vorschaltfunktion, wenn mit einer Aktion auf dem MapControl begonnen wird, Funktion kann natürlich um weitere Modi erweitert werden.</summary>
    ///<param name="e">Mausereignis (event).</param>
    if (nGlobalMouseMode == 1) // Zoomen
    {
        if (!MS_Browser_isIE())
            MS_ZoomStart(e);
    }

    if (nGlobalMouseMode == 2) // Identifizieren
    {
        var aClickPoint = MS_Utils_GetCurrentCoords(e);
        var cSHPFiles = document.getElementById("_CurDataLayer").value;
        MS_Common_OpenRadWindow("GetFeature", "Tools/GetFeatureInfo.aspx?x=" + aClickPoint[0] + "&y=" + aClickPoint[1] + "&SHPS=" + cSHPFiles + "&H=" + oMapControl.height + "&W=" + oMapControl.width + "&SID=" + document.getElementById("_SessionMarker").value, "GetFeature", "720", "600", "yes", "center");
    }

    if (nGlobalMouseMode == 3) // Verschieben
    {
        if (!MS_Browser_isIE())
            MS_PanStart(e);
    }
}

function MS_MouseStart( e ) {
    ///<summary>Funktion die anhand des aktuellen Mausmodus, das Zoomen oder Verschieben der Karte skriptseitig startet.</summary>
    ///<param name="e">Mausereignis (event).</param>
    if (nGlobalMouseMode == 1)
        MS_ZoomStart( e );
        
    if (nGlobalMouseMode == 3)
        MS_PanStart(e);             
}

function MS_MouseMove( e ) {
    ///<summary>Funktion die anhand des aktuellen Mausmodus, das Zoomen oder Verschieben der Karte skriptseitig fortsetzt. Des Weiteren
    ///werden die XY-Koordinaten an das StatusLabel gehängt, sofern die Funktion vom Benutzer aktiviert wurde.</summary>
    ///<param name="e">Mausereignis (event).</param>    
    if (nGlobalMouseMode == 1)
        MS_ZoomMove( e );
        
    if (nGlobalMouseMode == 3)
        MS_PanMove(e);    
}

function MS_MouseEnd( e ) {
    ///<summary>Funktion die anhand des aktuellen Mausmodus, das Zoomen oder Verschieben der Karte skriptseitig beendet.</summary>
    ///<param name="e">Mausereignis (event).</param>    
    if (nGlobalMouseMode == 1)
        MS_ZoomEnd( e );
        
    if (nGlobalMouseMode == 3)
        MS_PanEnd(e);
}

function MS_ZoomStart(e) {
    ///<summary>Initiiert das Zeichnen der ZoomBox (Ermittlung der Pixel-Startkoordinaten) und stellt die Zoombox per CSS dar.</summary>
    ///<param name="e">Mausereignis (event).</param>    
    var x, y;

    if (MS_Browser_isIE()) {
        x = e.clientX;
        y = e.clientY;

        scrollpos = MS_Utils_getscrollPos();
        x += scrollpos[0];
        y += scrollpos[1];
    }
    else {
        x = e.pageX;
        y = e.pageY;
    }

    aMapAbsPos = MS_Utils_GetAbsPosOfMap(false);
    if (aMapAbsPos != null) {
        if (!_lStartZoom) {
            _lStartZoom = true;
            x1 = x;
            y1 = y;
            XStart = x;
            YStart = y;
            x2 = x + 2;
            y2 = y + 2;

            MS_Utils_SetRectAttributes(x1, y1, x2 - x1, y2 - y1, true);
        }
    }
}

function MS_ZoomMove(e) {
    ///<summary>Anhand der Mausbewegung auf dem Kartenelement, wird die ZoomBox entsprechend vergrößert oder verkleinert.</summary>
    ///<param name="e">Mausereignis (event).</param>        
    var x, y;

    if (MS_Browser_isIE()) {
        x = e.clientX;
        y = e.clientY;

        scrollpos = MS_Utils_getscrollPos();
        x += scrollpos[0];
        y += scrollpos[1];
    }
    else {
        x = e.pageX;
        y = e.pageY;
    }

    if (_lStartZoom) {
        if (x < XStart) {
            x2 = XStart;
            x1 = x;
        }
        else {
            x2 = x;
            x1 = XStart;
        }
        if (y < YStart) {
            y2 = YStart;
            y1 = y;
        }
        else {
            y2 = y;
            y1 = YStart;
        }

        x1 = Math.max(x1, aMapAbsPos[0]);
        y1 = Math.max(y1, aMapAbsPos[1]);
        x2 = Math.min(x2, aMapAbsPos[2]);
        y2 = Math.min(y2, aMapAbsPos[3]);

        MS_Utils_SetRectAttributes(x1, y1, x2 - x1, y2 - y1, false);
    }
}

function MS_ZoomEnd(e)
{
    ///<summary>Finalisiert das Setzen der ZoomBox und ermittelt die Pixel-Koordinaten (Eckkoordinaten) der gezeichneten ZoomBox.
    ///Anschließend wird der MapServer mit Übergabe der entsprechenden URL-Paramater neugestartet.</summary>
    ///<param name="e">Mausereignis (event).</param>
    var x, y;
    var nLeft, nTop, nWidth, nHeight;
    var lowerX, lowerY, upperX, upperY;
    
    var scrollpos = new Array(0, 0);

    if (MS_Browser_isIE()) {
        x = e.clientX;
        y = e.clientY;

        scrollpos = MS_Utils_getscrollPos();
        x += scrollpos[0];
        y += scrollpos[1];
    }
    else {
        x = e.pageX;
        y = e.pageY;
    }

    if (_lStartZoom) {
        x1 = Math.min(x1, x);
        y1 = Math.min(y1, y);
        x2 = Math.max(x2, x);
        y2 = Math.max(y2, y);

        x1 = Math.max(x1, aMapAbsPos[0]);
        y1 = Math.max(y1, aMapAbsPos[1]);
        x2 = Math.min(x2, aMapAbsPos[2]);
        y2 = Math.min(y2, aMapAbsPos[3]);

        nHeight = y2 - y1;
        nWidth = x2 - x1;
        MS_Utils_SetRectAttributes(x1, y1, nWidth, nHeight, false);

        nLeft = Math.round(x1 - aMapAbsPos[0]);
        nTop = Math.round(y1 - aMapAbsPos[1]);

        // linke untere Ecke
        lowerX = nLeft;
        lowerY = nTop + nHeight;
        // ---->
        // rechte obere Ecke
        upperX = nLeft + nWidth;
        upperY = nTop;
        // ---->

        _lStartZoom = false;
        
        document.getElementById(cGlobalPlaceHolderName + "_CurrentArgs").value = "mode=1|mm=1|box=" + lowerX + "^" + lowerY + "^" + upperX + "^" + upperY;
        __doPostBack('', 'my_Args');
    }
}

function MS_PanStart( e )
{
    ///<summary>Startet das Verschieben der Karte und ermittelt die Ausgangsposition der zu verschiebenden Karte.</summary>
    ///<param name="e">Mausereignis (event).</param>
    aMapAbsPos = MS_Utils_GetAbsPosOfMap(true);
    
    if (aMapAbsPos != null)
    {
        if (!_lStartPan && !_lMovedPan)
        {           
            if (MS_Browser_isIE())
            {
                _nPanStartX = e.offsetX;
                _nPanStartY = e.offsetY;
            }
            else
            {
                _nPanStartX = e.pageX - aMapAbsPos[0];
                _nPanStartY = e.pageY - aMapAbsPos[1];                 
            }
            
            _lStartPan = true;
            _lMovedPan = false;            
        }
        
        if (_nPanStartX <= 0)
            _nPanStartX = 1;
        if (_nPanStartX > oMapControl.width)
            _nPanStartX = oMapControl.width;
        if (_nPanStartY <= 0)
            _nPanStartY = 1;
        if (_nPanStartY > oMapControl.height)
            _nPanStartY = oMapControl.height;  
    }      
}

var _lMapControl_StartPositionsDetermined = false;
var _nMapControl_StartLeft = 0, _nMapControl_StartTop = 0;
function MS_PanMove(e) {
    ///<summary>Bewegt die zu verschiebende Karte in die entsprechende Mausrichtung.</summary>
    ///<param name="e">Mausereignis (event).</param>
    var x, y;
    
    if (_lStartPan) {
        aScrollPos = MS_Utils_getscrollPos();

        if (MS_Browser_isIE()) {
            x = aScrollPos[0] + e.x;
            y = aScrollPos[1] + e.y;
        }
        else {
            x = e.pageX;
            y = e.pageY;
        }

        nLeft = x - _nPanStartX;
        nTop = y - _nPanStartY;

        if (!_lMapControl_StartPositionsDetermined && oMapControl.style.left.toString() != "") {        
            _nMapControl_StartLeft = parseInt(oMapControl.style.left.toString().replace(/px/, ""), 0);
            _nMapControl_StartTop = parseInt(oMapControl.style.top.toString().replace(/px/, ""), 0);            
            _lMapControl_StartPositionsDetermined = true;
        }
        
        var nMaxLeftMoveSize = oMapControl.width * nMaxMoveFactor / 100;
        var nMinLeftMoveSize = 0 - nMaxLeftMoveSize;
        var nMaxTopMoveSize = oMapControl.height * nMaxMoveFactor / 100;
        var nMinTopMoveSize = 0 - nMaxTopMoveSize;

        var aNotMovables = new Array(false, false, false, false); // left, top, right, bottom
        if (_nMapControl_StartLeft > 0 && _nMapControl_StartTop > 0) {
            if (nLeft < (_nMapControl_StartLeft + nMinLeftMoveSize)) {
                aNotMovables[0] = true; // left
            }
            else if (nLeft > (_nMapControl_StartLeft + nMaxLeftMoveSize)) {
                aNotMovables[2] = true; // right
            }
            else
                _nMouseX = x; // x ist die aktuelle Mausposition, und diese wird nur "weitergegeben", wenn die Verschiebung der Karte nach links oder rechts möglich war

            if (nTop < (_nMapControl_StartTop + nMinTopMoveSize)) {
                aNotMovables[1] = true; // top
            }
            else if (nTop > (_nMapControl_StartTop + nMaxTopMoveSize)) {
                aNotMovables[3] = true; // bottom
            }
            else
                _nMouseY = y; // y ist die aktuelle Mausposition, und diese wird nur "weitergegeben", wenn die Verschiebung der Karte nach oben oder unten möglich war
        }
        
        _lMovedPan = true;
        MS_Utils_SetPanningMap(nLeft, nTop, aNotMovables);        
    }
}

function MS_PanEnd(e) {
    ///<summary>Finalisiert das Verschieben der Karte und liefert die Pixel-Eck-Koordinaten der verschobenen Karte.
    ///Anschließend wird der MapServer mit Übergabe der entsprechenden URL-Paramater neugestartet.</summary>
    ///<param name="e">Mausereignis (event).</param>    
    var x, y;

    if (_lStartPan && _lMovedPan) { 
        x = _nMouseX;
        y = _nMouseY;
        
        if (x < aMapAbsPos[0]) // left
            x = 0
        else
            if (x > aMapAbsPos[2]) // right
            x = oMapControl.width;
        else
            x -= aMapAbsPos[0]; // left

        if (y < aMapAbsPos[1]) // top
            y = 0
        else
            if (y > aMapAbsPos[3]) // bottom
            y = oMapControl.height;
        else
            y -= aMapAbsPos[1]; // top

        _lStartPan = false;
        _lMovedPan = false;

        if (x > oMapControl.width)
            x = oMapControl.width;
        if (y > oMapControl.height)
            y = oMapControl.height;
        if (x <= 0)
            x = 1;
        if (y <= 0)
            y = 1;

        _nPanStartX = Math.round(_nPanStartX);
        _nPanStartY = Math.round(_nPanStartY);
        x = Math.round(x);
        y = Math.round(y);

        document.getElementById(cGlobalPlaceHolderName + "_CurrentArgs").value = "mode=3|mm=3|newarea=" + _nPanStartX + "^" + _nPanStartY + "^" + x + "^" + y;
        __doPostBack('', 'my_Args');        
    }
}

function MS_Utils_SetPanningMap(nLeft, nTop, aNotMoveables) {
    ///<summary>Setzt die Positionen für das verschobene Kartenelement mit Hilfe von absoluten CSS-Eigenschaften.
    ///Des Weitteren steuert die Funktion, wie weit die verschobene Karte in eine jeweilige Richtung verschoben werden kann.
    ///Die gloabel Variable 'nMaxMoveSize' gibt prozentual an, wie weit die Karte abhängig von der Breite bzw. Höhe des
    ///Kartenelementes maximal verschoben werden kann.</summary>
    ///<param name="nLeft">Linke untere Ecke.</param>
    ///<param name="nTop">Obere rechte Ecke.</param>
    ///<param name="lMovingNotPossible">Wenn 'true', kann das Element nicht mehr verschoben werden und dazu wird ein roter Rahmen um das Element eingeblendet.</param>

    var cBorderDefault = "1px dotted LightSkyBlue";
    var cBorderDefault_NotMoveable = "1px solid #FF0000";

    var cBorderLeft = cBorderDefault, cBorderTop = cBorderDefault, cBorderRight = cBorderDefault, cBorderBottom = cBorderDefault;
    if (aNotMoveables[0]) // left
        cBorderLeft = cBorderDefault_NotMoveable;
    if (aNotMoveables[1]) // top
        cBorderTop = cBorderDefault_NotMoveable;
    if (aNotMoveables[2]) // right
        cBorderRight = cBorderDefault_NotMoveable;
    if (aNotMoveables[3]) // bottom
        cBorderBottom = cBorderDefault_NotMoveable;

    oMapControl.style.position = "absolute";

    if (!aNotMoveables[0] && !aNotMoveables[2]) {
        oMapControl.style.left = nLeft.toString() + "px";
    }
    if (!aNotMoveables[1] && !aNotMoveables[3]) {
        oMapControl.style.top = nTop.toString() + "px";
    }

    oMapControl.style.opacity = nZoomBoxAlpha.toString(); // funktioniert ab FF 3.5 auch
    oMapControl.style.filter = "ALPHA(opacity=" + (nZoomBoxAlpha * 100).toString() + ")";

    if (!MS_Browser_isIE())
        oMapControl.style.MozOpacity = nZoomBoxAlpha.toString(); // für FF ab 1 bis 3.?.?
    
    oMapControl.style.zIndex = "101";

    oMapControl.style.borderLeft = cBorderLeft;
    oMapControl.style.borderTop = cBorderTop;
    oMapControl.style.borderRight = cBorderRight;
    oMapControl.style.borderBottom = cBorderBottom;
}

function MS_Utils_GetCurrentCoords(e)
{
    ///<summary>Ermittelt die Pixel-Koordianten eines geklickten Punktes im Kartenelement.
    ///Anschließend wird der MapServer mit Übergabe der entsprechenden URL-Paramater neugestartet.</summary>
    ///<param name="e">Mausereignis (event).</param>    
    ///<returns>Liefert ein 2-Elementen-Array mit dem X-Wert ([0]) und dem Y-Wert ([1]).</returns>
    var x, y;
    var aCoords = new Array(0, 0);
    if (MS_Browser_isIE()) {
        x = e.clientX;
        y = e.clientY;

        scrollpos = MS_Utils_getscrollPos();
        x += scrollpos[0];
        y += scrollpos[1];
    }
    else {
        x = e.pageX;
        y = e.pageY;
    }

    var aMapAbsCoords = MS_Utils_GetAbsPosOfMap(true);
    if (aMapAbsCoords != null) {
        x = x - aMapAbsCoords[0];
        y = y - aMapAbsCoords[1];

        if (x < 0)
            x = 0;
        if (y < 0)
            y = 0;
        if (x > oMapControl.width)
            x = oMapControl.width;
        if (y > oMapControl.height)
            y = oMapControl.height;

        aCoords[0] = Math.round(x);
        aCoords[1] = Math.round(y);
        return aCoords;
    }
    
    return null
}

function MS_Utils_SetRectAttributes(left, top, width, height, lStarting) {
    ///<summary>Stellt das Rechteck (Zoombox) in der entsprechenden Größe und Position mit CSS grafisch dar.</summary>
    ///<param name="left">Untere linke Ecke des Rechtecks (Pixelposition).</param>
    ///<param name="top">Obere rechte Ecke des Rechtecks (Pixelposition).</param>
    ///<param name="width">Breite des Rechtecks.</param>
    ///<param name="height">Höhe des Rechtecks.</param>
    ///<param name="lStarting">Logische Variable gibt an, ob das Zeichnen des Rechtecks bereits gestartet wurde.</param>
    var oRect = document.getElementById("Rectangle");

    if (oRect != null && lInit) {
        if (!MS_Browser_isFF()) {
            oRect.style.position = "absolute";
            oRect.style.left = left.toString() + "px";
            oRect.style.top = top.toString() + "px";
            oRect.style.width = width.toString() + "px";
            oRect.style.height = height.toString() + "px";
            oRect.style.zIndex = "101";
            if (lStarting)
                oRect.style.visibility = "visible";
        }
        else {
            width += 3;
            height += 3;
            oRect.setAttribute("style", "left: " + left + "px; width: " + width + "px; position: absolute; top: " + top + "px; height: " + height + "px; " + _cRectBasicStyle, false);
        }
    }
}

function MS_Utils_GetAbsPosOfMap(lUseFixSize4FF) {
    ///<summary>Ermittelt die absoluten Pixel-Koordinaten des Karten-Elementes bezogen auf das gesamte Browser-Fenster. Die Funktion ist für Firefox optimiert.</summary>
    ///<param name="lUseFixSize4FF">Wenn 'true', wird der jeweilige Pixel-Koordinatenwert um die definierte Anzahl erhöht. Im Firefox weichen die geklickten Pixel-Koordinaten im Verhältnis zum IE leicht ab.</param>
    ///<returns>Liefert ein 4-Elementen-Array mit den entsprechenden Pixel-Positionen für left, top, right, bottom.</returns>
    var nFixedSize4FF = 4; // dieser Wert muss in anderen Applikation mitunter angeglichen werden  
    aRetBox = new Array(0, 0, 0, 0);
    if (lInit) {
        if (oMapControl.getBoundingClientRect) {
            oBox = oMapControl.getBoundingClientRect(); // für IE
            if (oBox != null) {
                ascroll = MS_Utils_getscrollPos(); // mögliche Scollpositionen holen
                aRetBox[0] = oBox.left + ascroll[0];
                aRetBox[1] = oBox.top + ascroll[1];
                aRetBox[2] = oBox.right + ascroll[0];
                aRetBox[3] = oBox.bottom + ascroll[1];

                return aRetBox;
            }
        }
        else {
            if (document.getBoxObjectFor) // für Firefox, Netscape etc.
            {
                oBox = document.getBoxObjectFor(oMapControl.offsetParent);
                if (oBox != null) {
                    var nRight = oBox.width + oBox.x;
                    var nBottom = oBox.height + oBox.y;

                    aRetBox[0] = oBox.x;
                    aRetBox[1] = oBox.y;
                    aRetBox[2] = nRight;
                    aRetBox[3] = nBottom;

                    if (lUseFixSize4FF) {
                        aRetBox[0] += nFixedSize4FF;
                        aRetBox[1] += nFixedSize4FF;
                        aRetBox[2] += nFixedSize4FF;
                        aRetBox[3] += nFixedSize4FF;
                    }

                    return aRetBox;
                }
            }
        }
    }
    return null;
}

function MS_Utils_getscrollPos()
{
    ///<summary>Gibt unabhängig vom Browsertyp, die aktuellen Scrollpositionen (sofern das Fenster überhaupt gescrollt wurde) zurück.
    ///Infos zu den Browser-Rendering-Modes http://carsten-protsch.de/zwischennetz/doctype/einleitung.html. </summary>
    ///<returns>Liefert ein 2-Elementen-Array mit den entsprechenden Pixel-Positionen (X, Y).</returns>       
    var scrollPos = new Array(0, 0);
    var x = 0, y = 0;

    if (typeof window.pageYOffset != 'undefined') {
        y = window.pageYOffset;
        x = window.pageXOffset;
    }
    else if (typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') {
        y = document.documentElement.scrollTop;
        x = document.documentElement.scrollLeft;
    }
    else if (typeof document.body != 'undefined') {
        y = document.body.scrollTop;
        x = document.body.scrollLeft;
    }

    if (x != 0 || y != 0) {
        scrollPos[0] = x;
        scrollPos[1] = y;
    }

    return scrollPos;
}

function MS_Browser_isIE() {
    ///<summary>Liefert 'true', wenn der aktuelle Browser ein IE oder Opera ist.</summary>    
    var lIE = false;
    var cagent = navigator.userAgent;

    if (cagent.search("MSIE") > -1 || cagent.search("Opera") > -1)
        lIE = true;

    return lIE;
}

function MS_Browser_isFF3() {
    ///<summary>Liefert 'true', wenn der aktuelle Browser ein Mozilla Firefox Browser in der Version 3.?.? ist.</summary>    
    var lFF3 = false;
    var cagent = navigator.userAgent;

    if (cagent.search("Firefox/3") > -1)
        lFF3 = true;

    return lFF3;
}

function MS_Browser_isFF() {
    ///<summary>Liefert 'true', wenn der aktuelle Browser ein Mozilla Firefox Browser.</summary>    
    var lFF = false;
    var cagent = navigator.userAgent;

    if (cagent.search("Firefox") > -1)
        lFF = true;

    return lFF;
}

// undokumentierte globale Hilfsvariablen
var _cRectBasicStyle;
var _lStartZoom;
var _lStartPan, _lMovedPan;
var _nPanStartX, _nPanStartY;
var _nMouseX, _nMouseY;
// ---->

