


function MDActualMapState(){
    var mApplicationContext;

    var mIsMapClientUndefiened = false;
    if(mapClient.frames['MapFrameSet'] == undefined || mapClient.frames['MapFrameSet'].frames['IMCMapFrame'] == undefined){
        mIsMapClientUndefiened = true;
    }else{

        var mMapExtentXMin = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].xMin;
        var mMapExtentYMin = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].yMin;
        var mMapExtentXMax = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].xMax;
        var mMapExtentYMax = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].yMax;

        var mInitialExtentXMin = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].xMinInitialExtent;
        var mInitialExtentYMin = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].yMinInitialExtent;
        var mInitialExtentXMax = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].xMaxInitialExtent;
        var mInitialExtentYMax = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].yMaxInitialExtent;

        var mBBoxXMin = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].xBBoxMin;
        var mBBoxYMin = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].yBBoxMin;
        var mBBoxXMax = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].xBBoxMax;
        var mBBoxYMax = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].yBBoxMax;
        var mHasObjectExtent = mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].hasObjetExtent;
        mIsMapClientUndefiened = false;

    }



    this.getBBoxXMin = function(){
        return mBBoxXMin;
    }

    this.getBBoxYMin = function(){
        return mBBoxYMin;
    }

    this.getBBoxXMax = function(){
        return mBBoxXMax;
    }

    this.getBBoxYMax = function(){
        return mBBoxYMax;
    }

    this.getMapExtentXMin = function(){
        if(mMapExtentXMin == undefined){
            return null;
        }else{
            return mMapExtentXMin;
        }

    }

    this.getMapExtentYMin = function(){
        if(mMapExtentYMin == undefined){
            return null;
        }else{
            return mMapExtentYMin;
        }                
    }

    this.getMapExtentXMax = function(){
        if(mMapExtentXMax == undefined){
            return null;
        }else{
            return mMapExtentXMax;
        }
    }

    this.getMapExtentYMax = function(){
        if(mMapExtentYMax == undefined){
            return null;
        }else{
            return mMapExtentYMax;
        }
    }

    this.setDefaultMapState = function(pApplicationContext){
        if(!mIsMapClientUndefiened){
            mApplicationContext = pApplicationContext;
            var lUrl= mApplicationContext + '/SetPredefinedMapState.do?';
            var lMapStateHasChanged = false;
            //hat sich die Ausdehung veraendert, wie kann ich das ermitteln
            //Vergleiche aktuelle Ausdehung mit initialer Ausdehnung
            var deltaXMin = mMapExtentXMin - mInitialExtentXMin;
            var deltaYMin = mMapExtentYMin - mInitialExtentYMin;
            var deltaXMax = mMapExtentXMax - mInitialExtentXMax;
            var deltaYMax = mMapExtentYMax - mInitialExtentYMax;


            //var isMapExtentUnchanged = ((mMapExtentXMin == mInitialExtentXMin) && (mMapExtentYMin == mInitialExtentYMin) && (mMapExtentXMax == mInitialExtentXMax) && (mMapExtentYMax == mInitialExtentYMax));
            var isMapExtentUnchanged = ((-1 > deltaXMin < 1) && (-1 > deltaYMin < 1) && (-1 > deltaXMax < 1) && (-1 > deltaYMax < 1));
            if(!isMapExtentUnchanged){
                lUrl = lUrl + 'hasMapChanged=true&mapExtentXMin=' + mInitialExtentXMin + '&mapExtentXMax=' + mInitialExtentXMax + '&mapExtentYMin=' + mInitialExtentYMin + '&mapExtentYMax=' + mInitialExtentYMax;
                lMapStateHasChanged = true;
            }

            var hasBBoxAcetate = ((mBBoxXMin != undefined) && (mBBoxYMin != undefined) && (mBBoxXMax != undefined) && (mBBoxYMax != undefined));
            if(hasBBoxAcetate){
                var lUrlLength = lUrl.length;
                var lLastUrlChar = lUrl.charAt(lUrlLength - 1);
                if(lLastUrlChar != '?'){
                //if(!lIsBBoxUnchanged){
                    lUrl = lUrl + '&';
                }
                lUrl = lUrl + 'removeAcetate=true';
                lMapStateHasChanged = true;
            }
            //sind Acetate eingezeichnet (Bounding Boxen oder MD Extents)
            if(mHasObjectExtent != undefined){
                var lUrlLength2 = lUrl.length;
                var lLastUrlChar2 = lUrl.charAt(lUrlLength2 - 1);
                if(lLastUrlChar2 != '?'){
                    lUrl = lUrl + '&';
                }
                lUrl = lUrl + 'hasObjectExtent=true';
                lMapStateHasChanged = true;
            }

            if(lMapStateHasChanged){
                mapClient.frames['IMCTitleFrame'].sendAction("loadMap");
                mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].location.href=lUrl;
            }
            var lGazetteerInProcess = mapClient.frames['ContentFrameSet'].frames['IMCDataFrame'].gazetteerInProcess;
            if(lGazetteerInProcess != undefined && lGazetteerInProcess){
                this.synchronizeGazetteerRefresh();
            }
        }
    }

    this.synchronizeGazetteerRefresh = function(){
        var lTimeoutID;
        if(mapClient.frames['IMCTitleFrame'].okToSend){
            clearTimeout(lTimeoutID);
            var lGezetteerRefreshUrl= mApplicationContext + '/RefreshGazetteerState.do';
            mapClient.frames['IMCTitleFrame'].sendAction("loadData");
            mapClient.frames['ContentFrameSet'].frames['IMCDataFrame'].location.href =  lGezetteerRefreshUrl;
        }else{
            var lActualObject = this;
            lTimeoutID = setTimeout(function() { lActualObject.synchronizeGazetteerRefresh();}, 300);
        }
    }
    


    this.setObjectExtent = function(pApplicationContext, pObjectExtentXMin, pObjectExtentYMin, pObjectExtentXMax, pObjectExtentYMax){        

        mApplicationContext = pApplicationContext;
        var lUrl= mApplicationContext + '/SetObjectExtent.do?';

        //Test, if any object extent is already set in the map
        if(mHasObjectExtent != undefined){
            lUrl = lUrl + 'request=Replace_Envelope&minX=' + pObjectExtentXMin + '&maxX=' + pObjectExtentXMax + '&minY=' + pObjectExtentYMin + '&maxY=' + pObjectExtentYMax;
        }else{
            lUrl = lUrl + 'request=Add_Envelope&minX=' + pObjectExtentXMin + '&maxX=' + pObjectExtentXMax + '&minY=' + pObjectExtentYMin + '&maxY=' + pObjectExtentYMax;
        }

        mapClient.frames['IMCTitleFrame'].sendAction("loadMap");
        mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].location.href=lUrl;
    }

    this.setPredifinedMapState = function(pApplicationContext, pBBoxXMin, pBBoxYMin, pBBoxXMax, pBBoxYMax, pMapExtentXMin, pMapExtentYMin, pMapExtentXMax, pMapExtentYMax){
        mApplicationContext = pApplicationContext;
        var lUrl= mApplicationContext + '/SetPredefinedMapState.do?';

        var lMapHasChanged = false;

        var lRemoveSearchAcetate = false;
        var lAddSearchAcetate = false;
        var lChangeSearchAcetate = false;

        var lMapHasObjectExtent = false;
        //erstens pruefen, ob sich was an der Karte geandert hat
        //1. ist die KartenAusdehung identisch?

        var lBBoxXMinString = null;
        var lBBoxYMinString = null;
        var lBBoxXMaxString = null;
        var lBBoxYMaxString = null;
        if(mBBoxXMin != undefined){
            lBBoxXMinString = mBBoxXMin.toString();
        }
        if(mBBoxYMin != undefined){
            lBBoxYMinString = mBBoxYMin.toString();
        }
        if(mBBoxXMax != undefined){
            lBBoxXMaxString = mBBoxXMax.toString();
        }
        if(mBBoxYMax != undefined){
            lBBoxYMaxString = mBBoxYMax.toString();
        }

        var lIsBBoxUnchanged = ((pBBoxXMin == lBBoxXMinString) && (pBBoxXMax == lBBoxXMaxString) && (pBBoxYMin == lBBoxYMinString) && (pBBoxYMax == lBBoxYMaxString));
        if(!lIsBBoxUnchanged){
            if(pBBoxXMin == null){
                lRemoveSearchAcetate = true;
                lUrl = lUrl + 'removeAcetate=true';
            }else if(mBBoxXMin == undefined){
                lAddSearchAcetate = true;
                lUrl = lUrl + 'addAcetate=true&BBoxXMin=' + pBBoxXMin + '&BBoxXMax=' + pBBoxXMax + '&BBoxYMin=' + pBBoxYMin + '&BBoxYMax=' + pBBoxYMax;
            }else{
                lChangeSearchAcetate = true;
                lUrl = lUrl + 'changeAcetate=true&BBoxXMin=' + pBBoxXMin + '&BBoxXMax=' + pBBoxXMax + '&BBoxYMin=' + pBBoxYMin + '&BBoxYMax=' + pBBoxYMax;
            }
        }
        var lMapExtentXMinString = mMapExtentXMin.toString();
        var lMapExtentXMaxString = mMapExtentXMax.toString();
        var lMapExtentYMinString =  mMapExtentYMin.toString();
        var lMapExtentYMaxString =  mMapExtentYMax.toString();
        var lIsMapExtentUnchanged = ((pMapExtentXMin == lMapExtentXMinString) && (pMapExtentXMax == lMapExtentXMaxString) && (pMapExtentYMin == lMapExtentYMinString) && (pMapExtentYMax == lMapExtentYMaxString));

        //2. Ist das Suchrechteck identisch? (muss es entweder hinzugefuegt oder geloescht werden)
        if(!lIsMapExtentUnchanged){
            var lUrlLength = lUrl.length;
            var lLastUrlChar = lUrl.charAt(lUrlLength - 1);
            if(lLastUrlChar != '?'){
            //if(!lIsBBoxUnchanged){
                lUrl = lUrl + '&';
            }
            lUrl = lUrl + 'hasMapChanged=true&mapExtentXMin=' + pMapExtentXMin + '&mapExtentXMax=' + pMapExtentXMax + '&mapExtentYMin=' + pMapExtentYMin + '&mapExtentYMax=' + pMapExtentYMax;
            lMapHasChanged = true;
        }

        //3. Befindet sich ein Metadatenextent in der Karte der ein loeschen noetig macht
        if(mHasObjectExtent != undefined){
            var lUrlLength2 = lUrl.length;
            var lLastUrlChar2 = lUrl.charAt(lUrlLength2 - 1);
            if(lLastUrlChar2 != '?'){
                lUrl = lUrl + '&';
            }
            lUrl = lUrl + 'hasObjectExtent=true';            
            lMapHasObjectExtent = true;
        }


        if(lMapHasChanged || lRemoveSearchAcetate || lAddSearchAcetate || lChangeSearchAcetate || lMapHasObjectExtent){

            mapClient.frames['IMCTitleFrame'].sendAction("loadMap");
            mapClient.frames['MapFrameSet'].frames['IMCMapFrame'].location.href=lUrl;
         }

    }
}
