
    // 1.  mausposition
    // 2.  close info popup
    // 3.  search & replace
    // 4.  search & replace 2
    // 5.  update Formats
    // 6.  INIT POLYGON STRING
    // 7.  BObjectsInfo
    // 8.  BObjectsInfoOff
    // 9.  BObjectsInfoGetId
    // 10. BObjectsInfo
    // 11. BObjectsInfo OFF
    // 12. get All Features
    // 13. import Objects
    // 14. import Polygons
    // 15. save Object Collection
    // 16. New Article With Polygon string
    // 17. ZoomBarControl
    // 18. measure
    // 19. ADD delete object button
    // 20. ADD info object button
    // 21. show save button (locate add.)
    // 22. show locate button
    // 23. show Editing Tool
    // 24. click class
    // 25. getMapMetaData


    // 1.  mausposition
    // ###############################################################################################
	if(document.layers)
		{
		window.captureEvents(Event.MOUSEMOVE);
		window.onmousemove = koordinaten;
		}
	else
		{
		document.onmousemove = koordinaten;
		}
	function koordinaten(e)
		{
			// ( documentElement OR body )
			//xpos = (document.layers || (document.getElementById && !document.all)) ? e.pageX : document.documentElement.scrollLeft + event.clientX ;
			//ypos = (document.layers || (document.getElementById && !document.all)) ? e.pageY : document.documentElement.scrollTop + event.clientY;
            xpos = (document.layers || (document.getElementById && !document.all)) ? e.pageX : document.body.scrollLeft + event.clientX ;
            ypos = (document.layers || (document.getElementById && !document.all)) ? e.pageY : document.body.scrollTop + event.clientY;
		}

    // 2.  close info popup
    // ###############################################################################################
      function closeinfopopup() {
        document.getElementById('infopopup').style.visibility = 'hidden';
        document.getElementById('infopopup').style.display    = 'none';
        boDelObject();
      	}

    // 3.  search & replace
    // ###############################################################################################
        function SuchenUndErsetzen(sourceText, searchText, replaceText) {
            if ((sourceText == null) || (searchText == null))         { return null; }
            if ((sourceText.length == 0) || (searchText.length == 0)) { return sourceText; }
            if ((replaceText == null) || (replaceText.length == 0))   { replaceText = ""; }

            var lengthsearchText  = searchText.length;
            var lengthreplaceText = replaceText.length;
            var Pos = sourceText.indexOf(searchText, 0);

            var myrest;
            while (Pos >= 0)
            {
                myrest = sourceText.substring(Pos + lengthsearchText);
                var Pos2   = myrest.indexOf('",', 0);
                myrest     = myrest.substring(Pos2);

                sourceText = sourceText.substring(0, Pos) + replaceText + myrest;
                Pos = sourceText.indexOf(searchText, Pos + lengthsearchText);
            }


            return sourceText;
        }

    // 4.  search & replace 2
    // ###############################################################################################
        function SuchenUndErsetzen2(sourceText, searchText, replaceText) {
            if ((sourceText == null) || (searchText == null))         { return null; }
            if ((sourceText.length == 0) || (searchText.length == 0)) { return sourceText; }
            if ((replaceText == null) || (replaceText.length == 0))   { replaceText = ""; }

            var lengthsearchText  = searchText.length;
            var lengthreplaceText = replaceText.length;
            var Pos = sourceText.indexOf(searchText, 0);

            while (Pos >= 0)
            {
                sourceText = sourceText.substring(0, Pos) + replaceText + sourceText.substring(Pos + lengthsearchText);
                Pos = sourceText.indexOf(searchText, Pos + lengthsearchText);
            }



            return sourceText;
        }

    // 5.  update Formats
    // ###############################################################################################
    function updateFormats() {
            var in_options = {
                'internalProjection': map.baseLayer.projection,
                'externalProjection': map.baseLayer.projection
            };
            var out_options = {
                'internalProjection': map.baseLayer.projection,
                'externalProjection': map.baseLayer.projection
            };
            var gmlOptions = {
                featureType: "feature",
                featureNS: "http://example.com/feature"
            };
            var gmlOptionsIn = OpenLayers.Util.extend(
                OpenLayers.Util.extend({}, gmlOptions),
                in_options
            );
            var gmlOptionsOut = OpenLayers.Util.extend(
                OpenLayers.Util.extend({}, gmlOptions),
                out_options
            );
            formats = {
              'in': {
                wkt: new OpenLayers.Format.WKT(in_options),
                geojson: new OpenLayers.Format.GeoJSON(in_options),
                georss: new OpenLayers.Format.GeoRSS(in_options),
                gml2: new OpenLayers.Format.GML.v2(gmlOptionsIn),
                gml3: new OpenLayers.Format.GML.v3(gmlOptionsIn),
                kml: new OpenLayers.Format.KML(in_options)
              },
              'out': {
                wkt: new OpenLayers.Format.WKT(out_options),
                geojson: new OpenLayers.Format.GeoJSON(out_options),
                georss: new OpenLayers.Format.GeoRSS(out_options),
                gml2: new OpenLayers.Format.GML.v2(gmlOptionsOut),
                gml3: new OpenLayers.Format.GML.v3(gmlOptionsOut),
                kml: new OpenLayers.Format.KML(out_options)
              }
            };
        }

    // 6.  INIT POLYGON STRING
    // ###############################################################################################
            function init_polygonstring() {
							var PolygonString;

							if (incomingPolygonString == "" || incomingPolygonString == null) {
								return;
								}
							PolygonString  = unescape(incomingPolygonString);
							
							PolygonString2 = '';
							var cPos       = PolygonString.indexOf('bobject123',0);
							while (cPos >= 0) {
								PolygonString  = PolygonString.substring(cPos+10);
								cPos           = PolygonString.indexOf('bobject123',0);
                                PolygonString2 = PolygonString.substring(0,cPos);
                                PolygonString2 = SuchenUndErsetzen2(PolygonString2, '\\"', '"');
                                importPolygons(PolygonString2);
								PolygonString  = PolygonString.substring(cPos+10);
								cPos           = PolygonString.indexOf('bobject123',0);
								}

            	}

    // 7.  BObjectsInfo
    // ###############################################################################################
	function showArticleInfo(windowid) {
	    if (windowid != null && windowid != '') {
          document.getElementById("item"+windowid).style.visibility = 'visible';
          document.getElementById("item"+windowid).style.zIndex = 997;
          document.getElementById("item"+windowid).style.left  = xpos - 50;
          document.getElementById("item"+windowid).style.top   = ypos - 230;
          }
		}

    // 8.  BObjectsInfoOff
    // ###############################################################################################
	function showArticleInfoOff(windowid) {
	    if (windowid != null && windowid != '') {
          document.getElementById("item"+windowid).style.visibility = 'hidden';
          }
		}

    // 9.  BObjectsInfoGetId
    // ###############################################################################################
    function BObjectInfoGetId(str) {
						var startid = 'id":"';
						var endid   = '"';
						var sPos    = str.indexOf(startid, 0) + 5;
						var cuObjId = str.substring(sPos);
						var ePos    = cuObjId.indexOf(endid, 0);
						cuObjId = cuObjId.substring(0, ePos);
						return cuObjId;
    	}

    // 10. BObjectsInfo
    // ###############################################################################################
    function BObjectInfo(feature) {
            var type    = 'geojson';
            var pretty  = false;
            var str     = formats['out'][type].write(feature, pretty);
            var cuObjId = BObjectInfoGetId(str);
            showArticleInfo(cuObjId);

            //document.getElementById('output').value = str;
            //document.getElementById('outputid').innerHTML = cuObjId;
            //document.getElementById('outputid').innerHTML = feature.id;
        }

    // 11. BObjectsInfo OFF
    // ###############################################################################################
    function BObjectInfoOff(feature) {
            var type    = 'geojson'; //document.getElementById("formatType").value;
            var pretty  = false;
            var str     = formats['out'][type].write(feature, pretty);
            var cuObjId = BObjectInfoGetId(str);
						showArticleInfoOff(cuObjId);
        }

    // 12. get All Features
    // ###############################################################################################
    function getAllFeatures_core() {
        var feature = vectors.features;
        var type = 'geojson'; //document.getElementById("formatType").value;
        var pretty = false;
        var str = formats['out'][type].write(feature, pretty);
        return str;
        }


    function getAllNewFeatures_core() {
        var feature = vectors.features;
        var type = 'geojson'; //document.getElementById("formatType").value;
        var pretty = false;
        var str = formats['out'][type].write(feature, pretty);

        var searchText2 = '{"type":"Feature","id":"OpenLayers.Feature.Vector_';
        var searchText  = '{"type":"Feature","id":';
				var lengthsearchText = searchText.length;
				var PolyObjects = '';
				var beginColl = '{"type":"FeatureCollection","features":[';
				var endColl   = ']}';
				var endObj = ']}}';
        var Pos2;
				var tmpEnd;
				var tmp;

        var Pos = str.indexOf(searchText, 0);

		if (Pos >= 0) {
          str  = str.substring(Pos);

	        while (Pos >= 0) {
			        	// looking for new one
				        Pos2 = str.indexOf(searchText2, 0);
								if (Pos2 >= 0) {
									tmp         = str.substring(Pos2);
									tmpEnd      = tmp.indexOf(endObj, 0) + 3;
									PolyObjects = PolyObjects + ',' + tmp.substring(0, tmpEnd);

									str = tmp.substring(tmpEnd);
									}
								else {
									tmpEnd = str.indexOf(endObj, 0) + 3;
									str = str.substring(tmpEnd);
									}

	          Pos = str.indexOf(searchText, 0);
	          } // while
					if (PolyObjects == '') {
						str = '';
						}
					else {
						str = beginColl + PolyObjects.substring(1) + endColl;
						}
					}
				else {
	        str = '';
					}
        return str;
        }



    function getAllFeatures() {
        //document.getElementById('output').value = getAllNewFeatures_core();
        }

    // 13. import Objects
    // ###############################################################################################
    function importObjects() {
        //var element = document.getElementById('input');
        var type = 'geojson';//document.getElementById("formatType").value;
        var features = formats['in'][type].read(element.value);
        var bounds;
        if(features) {
            if(features.constructor != Array) { features = [features]; }
            for(var i = 0; i < features.length; ++i) {
                if (!bounds) { bounds = features[i].geometry.getBounds(); } else { bounds.extend(features[i].geometry.getBounds()); }
                }
            vectors.addFeatures(features);
            //map.zoomToExtent(bounds);
            var plural = (features.length > 1) ? 'e' : '';
            element.value = features.length + ' Objekt' + plural + ' hinzugefügt'
            }
        else { element.value = 'Fehler: ' + type; }
        }

    // 14. import Polygons
    // ###############################################################################################
    function importPolygons(element) {
        var type = 'geojson'; //document.getElementById("formatType").value;
        var features = formats['in'][type].read(element);
        var bounds;
        if(features) {
            if(features.constructor != Array) { features = [features]; }
            for(var i = 0; i < features.length; ++i) {
                if (!bounds) { bounds = features[i].geometry.getBounds(); } else { bounds.extend(features[i].geometry.getBounds()); }
                }
            vectors.addFeatures(features);
            }
        else { element.value = 'Fehler: ' + type; }
        }


    // 15. save Object Collection
    // ###############################################################################################
    function saveObjectCollection() {
        var allobjects   = getAllNewFeatures_core();
        //var allobjects   = getAllFeatures_core();

        if (allobjects == '') {
          var check;
          check = confirm("Es wurden kein Objekt eingezeichnet! Wollen Sie trotzdem forfahren?");
//          check = confirm("Couldn't find any object to store. Would you like to proceed anyway?");
          if (check==true) {
            var objectstring = '';
//            boNewArticleWithPolygonstring(objectstring);
            openBeitragsForm(objectstring);
            }
          //alert(noObjectsOnSavingErrorMessage);
          }
        else {
          var objectstring = boSeparator + SuchenUndErsetzen(allobjects, 'OpenLayers.Feature.Vector_', 'bobjectid') + boSeparator;
alert(objectstring);

//          boNewArticleWithPolygonstring(objectstring);
          openBeitragsForm(objectstring);
          }
        }


    // 15.b  save Object Collection
    // ###############################################################################################
    function openBeitragsForm(objectstring) {
        //document.getElementById('newpolygon').value = objectstring;
        document.getElementById('beitragseingabe').style.display = 'block';
        document.getElementById('beitragseingabe').style.visibility = 'visible';
        }
        
        

    // 16. New Article With Polygon string
    // ###############################################################################################
	function boNewArticleWithPolygonstring(objectstring)
		{
		if (locateAdditionally == 'no')
		    {
            var gisextent     = '';//getMapMetaData('extent');
            var gislayers     = '';//getMapMetaData('layers');
            myHREF = "discoursemachine.php?locateAdditionally=no&extent="+gisextent+"&layers="+gislayers+"&page=submit_item&preselect=off&polygonstring=" + objectstring + "&id_viewback=67&karte_id_view=" + id_view + "&submit_itemtype="+gisSetFlagIdItemtype;
            document.location.href = myHREF;
		    }
		else
		    {
            var extent     = '';//getMapMetaData('extent');
            var layers     = '';//getMapMetaData('layers');
    		myHREF = "?locateAdditionally=yes&extent="+gisextent+"&layers="+gislayers+"&page=infopage&id_page=81&locateAdditionalIdItem=" + locateAdditionallyId + "&newitemnumber="+locateAdditionallyId+"&locateAdditionalStatus=UPDATENOW&newpolygon="+objectstring+"&menucontext=";
    		document.location.href = myHREF;
            }
        }

    // 17. ZoomBarControl
    // ###############################################################################################
    function createZoomBarControl() {
			var zoomBarControl = new OpenLayers.Control.PanZoomBar();
	        zoomBarControl.zoomWorldIcon = true;
	        return zoomBarControl;
	    }

    // 18. measure
    // ###############################################################################################
        function calcVincenty(geometry) {
            /**
             * Note: this function assumes geographic coordinates and
             *     will fail otherwise.  OpenLayers.Util.distVincenty takes
             *     two objects representing points with geographic coordinates
             *     and returns the geodesic distance between them (shortest
             *     distance between the two points on an ellipsoid) in *kilometers*.
             *
             * It is important to realize that the segments drawn on the map
             *     are *not* geodesics (or "great circle" segments).  This means
             *     that in general, the measure returned by this function
             *     will not represent the length of segments drawn on the map.
             */
            var dist = 0;
            for (var i = 1; i < geometry.components.length; i++) {
                var first = geometry.components[i-1];
                var second = geometry.components[i];
                dist += OpenLayers.Util.distVincenty(
                    {lon: first.x, lat: first.y},
                    {lon: second.x, lat: second.y}
                );
            }
            return dist;
        }

        function handleMeasurements(event) {
            var geometry = event.geometry;
            var units = event.units;
            var order = event.order;
            var measure = event.measure;
            var element = document.getElementById('output');
            var out = "";
            if(order == 1) {
                out += "Messergebnis: " + measure.toFixed(3) + " " + units;
                if (map.getProjection() == "EPSG:4326") {
                    out += "<br /> Great Circle Distance: " +
                        calcVincenty(geometry).toFixed(3) + " km *";
                }
            } else {
                out += "Messergebnis: " + measure.toFixed(3) + " " + units + "<sup>2</sup>";
            }
            element.innerHTML = out;
        }


        function toggleControl(element) {
            for(key in measureControls) {
                var control = measureControls[key];
                if(element.value == key && element.checked) {
                    control.activate();
                } else {
                    control.deactivate();
                }
            }
        }
    // ################################################################################ measure







    // 19. ADD delete object button
    // ###############################################################################################
        function boDelObject() {

            var myselectedfeatures = vectors.features;
            var mylength = myselectedfeatures.length;
            if ( mylength > 0) {
                vectors.removeFeatures(myselectedfeatures);
                }



//                var mylength = myselectedfeatures.length;
//                if ( mylength > 0) {
//
//                    var str = formats['out']['geojson'].write(myselectedfeatures[0], false);
//                    if ( str.indexOf("OpenLayers.Feature.Vector_") == -1 ) {
//                      alert('Dieses Objekt gehört zu einer anderen Stellungnahme und kann nicht gelöscht werden.');
//                      }
//                    else {
//                      vectors.removeFeatures(myselectedfeatures);
//                      }
//                }
//                else {
//                    alert('Sie haben kein Objekt gewählt.');
//                }
        }

    // 20. ADD info object button
    // ###############################################################################################
        function boInfoObject() {
        	if (infoRequest == 'on') {
        		infoRequest = 'off';
        		toggleInfoRequestOff('boInfoObjectItemInactive');
        		}
        	else {
        		infoRequest = 'on';
        		toggleInfoRequestOn('boInfoObjectItemInactive');
        		}

        }

    // 21. show save button (locate add.)
    // ###############################################################################################
    function showSaveButtons() {
                document.getElementById('sn_speichern').style.visibility = 'visible';
                document.getElementById('sn_speichern').style.display    = 'block';
                document.getElementById('infopopup').style.visibility    = 'visible';
                document.getElementById('infopopup').style.display       = 'block';
                document.getElementById('sn_neue_sn').style.visibility   = 'hidden';
                document.getElementById('sn_neue_sn').style.display      = 'none';
    }

    // 22. show locate button
    // ###############################################################################################
    function showLocateButtons() {
                document.getElementById('sn_neue_sn').style.visibility   = 'visible';
                document.getElementById('sn_neue_sn').style.display      = 'block';
                document.getElementById('sn_speichern').style.visibility = 'hidden';
                document.getElementById('sn_speichern').style.display    = 'none';
                document.getElementById('infopopup').style.visibility    = 'hidden';
                document.getElementById('infopopup').style.display       = 'none';
    }

    // 23. show Editing Tool
    // ###############################################################################################
    function showEditingTool() {
            map.addControl(editingBar);
            panel.addControls([button1]);
    }

    // rio public order
    function showEditingTool2() {
            map.addControl(toolbar);
//            panel.addControls([button1]);
    }


    // 24. click class
    // ###############################################################################################
        OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {
                defaultHandlerOptions: {
                    'single': true,
                    'double': false,
                    'pixelTolerance': 0,
                    'stopSingle': false,
                    'stopDouble': false
                },
                initialize: function(options) {
                    this.handlerOptions = OpenLayers.Util.extend(
                        {}, this.defaultHandlerOptions
                    );
                    OpenLayers.Control.prototype.initialize.apply(
                        this, arguments
                    );
                    this.handler = new OpenLayers.Handler.Click(
                        this, {
                            'click': this.trigger
                        }, this.handlerOptions
                    );
                },
                trigger: function(e) {
                    if(infoRequest == 'on') {
                      var tmpx = e.xy.x;
                      var tmpy = e.xy.y;
                      var tmpbbox = map.getExtent().toBBOX();
                      var tmpURL = "http://egis.kreis-stormarn.de/mywms_neu/servlet/myWMS?REQUEST=GetFeatureInfo&SERVICE=WMS&VERSION=1.1.1&FORMAT=image/png&WIDTH=600&HEIGHT=600&SCALE=2009&BBOX="+tmpbbox+"&LAYERS=BadOldes_BPL_105&QUERY_LAYERS=BadOldes_BPL_105&X="+tmpx+"&Y="+tmpy+"&INFO_FORMAT=text/html ";
                      var infoWindow = window.open(tmpURL, "boGIS_Information", "scrollbars=yes,width=600,height=500,left=100,top=200");
                      infoWindow.focus();
                    	}
                }
        });






        // ################################################################
        function toggleEditingBar() {
            var control;
            for(var key in editingBar) {
                control = editingBar[key];
            }
        }

        // ################################################################
        function toggleControlEditingBar() {
            for(key in editingBar) {
                alert(key);
                var control = editingBar[key];
                control.deactivate();
            }
        }

        // ################################################################
        function toggleInfoRequestOn(myclassname) {
            var allElems = document.getElementsByTagName('DIV');
            for (var i = 0; i < allElems.length; i++) {
                var thisElem = allElems[i];
                if (thisElem.className && thisElem.className == myclassname) {
                thisElem.style.background = 'url(site/pictures/infoobjectactivated.png)';
                }
            }
        }

        // ################################################################
            function toggleInfoRequestOff(myclassname) {
                var allElems = document.getElementsByTagName('DIV');
                for (var i = 0; i < allElems.length; i++) {
                    var thisElem = allElems[i];
                    if (thisElem.className && thisElem.className == myclassname) {
                        thisElem.style.background = 'url(site/pictures/infoobject.png)';
                    }
                }
            }

        // 25. getMapMetaData
        // ################################################################
        function getMapMetaData (metatype) {
            //var url = 'http://egis.kreis-stormarn.de/mywms_neu/servlet/myWMS?LAYERS=';
            //    url += activelayers;
            //    url += '&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A31467&BBOX=';
            //    url += extent;
            //    url += '&WIDTH=256&HEIGHT=256';
            //alert(url);
            //window.open(url, "test", "width=300,height=300,left=100,top=200");


            if (metatype === "extent") {
                var extent  = map.getExtent();
                extent  = [extent.left, extent.bottom, extent.right, extent.top].join(',');
                return extent;
                }
            else {
                var activelayers = [];
                var tmp = '';
                var i = 0;
                for (i=0; i < layers.length; i++) {
                    if (!layers[i].getVisibility()) continue;
                    if (!layers[i].calculateInRange()) continue;
                    if(typeof(layers[i].params) !== 'undefined' && layers[i].params != null) {
                        tmp = String(layers[i].params["LAYERS"]);
                        activelayers[activelayers.length] = String(tmp);
                        }
                    }
                activelayers = activelayers.join(',');
                return activelayers;
                }

            }

            
            function ohjeroutine1() {
                var allobjects   = getAllNewFeatures_core();
                if (allobjects != '') {
                //var objectstring = boSeparator + SuchenUndErsetzen(allobjects, 'OpenLayers.Feature.Vector_', 'bobjectid') + boSeparator;
                openBeitragsForm();
                }
            }

            function ohjeroutine2() {
                
                document.getElementById('beitragseingabe').style.display = 'none';
                document.getElementById('beitragseingabe').style.visibility = 'hidden';
            }

