/**
 * RAÄ Bebyggelseregister: JavaScript för klientsidan
 * Version: $Id: bbr.js,v 1.45 2009/11/16 16:09:28 niklas Exp $
 */

// interval som används för scrollning;
 var ss_INTERVAL;
 var MAP_RECENTER_MARKER_LAYER_TITLE = "Mark\u00f6r f\u00f6r koordinat";

var stopSubmit = false;

function doSubmit() {
    return !stopSubmit;
}

function testSub() {
    alert('bla');
}

/*
function submitOnSpace(e, obj) {
    var keycode;
    if (window.event) {
        keycode = window.event.keyCode;
    } else if (e) {
        keycode = e.which;
    }
    if (keycode == 32) {
        try {
            var temp = "";
            var i = 0;
            for (x in obj) {
                temp += x + ": " + obj[x] + "\n";
                if (i > 20) {
                    alert (temp);
                    temp ="";
                    i = 0;
                }
                i++;
            }
            alert (temp);
        } catch (ex) {
            alert(ex);
        }
    }
}
*/

function handleArrowKeys(event) {
    var keyCode = event.keyCode;
    switch(keyCode) {
        case 33:  // pgUp
        case 34:  // pgDn
        case 35:  // end
        case 36:  // home
        case 38:  // pil upp
        case 40:  // pil ned

            // stoppa submit
            disableSubmit();
            break;
        default:
            // enabla submit
            enableSubmit();
            break;
    }
}

function enableSubmit(event) {
    stopSubmit = false;
}

function disableSubmit(event) {
    stopSubmit = true;
}


// Söker automatiskt efter länkar i text på sidan och infogar <A@HREF/> för dessa
function linkify() {

    var urlRegex = /(((h?t?t)?ps?|ftp):\/\/[^\s+\"\<\>]+)/ig;


    // tags we will scan looking for un-hyperlinked urls
/*
    var allowedParents = [
        "abbr", "acronym", "address", "applet", "b", "bdo", "big", "blockquote", "body",
        "caption", "center", "cite", "code", "dd", "del", "div", "dfn", "dt", "em",
        "fieldset", "font", "form", "h1", "h2", "h3", "h4", "h5", "h6", "i", "iframe",
        "ins", "kdb", "li", "object", "pre", "p", "q", "samp", "small", "span", "strike",
        "s", "strong", "sub", "sup", "td", "th", "tt", "u", "var"
    ];
*/
    var allowedParents = [
        "body", "p", "pre", "span", "strike", "s", "strong", "sub", "sup", "td",
        "th", "tt", "u", "if", "fieldset", "center", "code", "dd", "dt", "acronym",
        "address", "abbr"
    ];


    var xpath = "//text()[(parent::" + allowedParents.join(') or(parent::')+")]";

    // TODO: något går sönder vid document.evaluate...
    return;
    var candidates = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    //var t0 = new Date().getTime();

    for (var cand = null, i = 0; (cand = candidates.snapshotItem(i)); i++) {
        if (urlRegex.test(cand.nodeValue)) {
            var span = document.createElement("span");
            var source = cand.nodeValue;
            cand.parentNode.replaceChild(span, cand);
            urlRegex.lastIndex = 0;
            for (var match = null, lastLastIndex = 0; (match = urlRegex.exec(source)); ) {
                span.appendChild(document.createTextNode(source.substring(lastLastIndex, match.index)));
                //ttp or tp or p
                var uri = match[0].replace(/^(ttp|tp|p)/,'http');
                var a = document.createElement("a");
                //a.setAttribute("href", match[0]);
                a.setAttribute("href", uri);
                a.appendChild(document.createTextNode(match[0]));
                span.appendChild(a);
                lastLastIndex = urlRegex.lastIndex;
            }
            span.appendChild(document.createTextNode(source.substring(lastLastIndex)));
            span.normalize();
        }
    }
    /*
    var t1 = new Date().getTime();
    alert((t1 - t0) / 1000);
    */
}

/**
 * Växlar visning av element via CSS.
 */
//var toggleShowText = "Visa";
function toggleSubgroup(id, openJs, closeJs) {
    var element = document.getElementById(id);
    var hiddenClassField = document.getElementById(id + "-class");
    var hrefId = "toggler-" + id;
    var hidden = "hide";
    var shown = "show";
    var collapsed = "collapsed";
    var expanded = "expanded";

    var href = document.getElementById(hrefId);

    if (element.className.indexOf(hidden) != -1) {
        // är gömt, vi ska visa nu

        // kör smoothScroll
        smoothScroll(href);

        // scrolla in i vyn omgående
        //href.scrollIntoView();
        element.className = element.className.replace(/hide/, shown);
        href.className = href.className.replace(/collapsed/, expanded);
        hiddenClassField.value = shown;
        if (typeof(openJs) == "function") {
            openJs();
        }
    } else {
        element.className = element.className.replace(/show/, hidden);
        hiddenClassField.value = hidden;
        href.className = href.className.replace(/expanded/, collapsed);
        if (typeof(closeJs) == "function") {
            closeJs();
           }
    }
}

function scrollToResult() {
    var res = document.getElementById("Sökresultat");
    if (res) {
        res.scrollIntoView();
    }
}

function smoothScroll(element) {
    var ss_STEPS = 25;
     var dest = getAbsolutePosition(element);
     var destx = dest.x;
     var desty = dest.y;
     clearInterval(ss_INTERVAL);
     var cypos = ss_getCurrentYPos();
     var ss_stepsize = parseInt((desty-cypos)/ss_STEPS);

     //ss_INTERVAL = setInterval('ss_scrollWindow('+ss_stepsize+','+desty+')',10);
     ss_INTERVAL = setInterval('ss_scrollWindow('+30+','+desty+',true,'+cypos+')',10);
}

function getAbsolutePosition(element) {
    var r = getAbsolutePositionInternal(element);
    // justera lite så vi får med hela bilden (det verkar som att det är typ mitten på bilden som är positionen?)
    r.x = Math.max(0, r.y - 20);
    return r;
  }

  function getAbsolutePositionInternal(element) {
  var r = { x: element.offsetLeft, y: element.offsetTop };
    if (element.offsetParent) {
      var tmp = getAbsolutePositionInternal(element.offsetParent);
      r.x += tmp.x;
      r.y += tmp.y;
    }
    return r;
}

function ss_getCurrentYPos() {
 if (document.body && document.body.scrollTop)
   return document.body.scrollTop;
 if (document.documentElement && document.documentElement.scrollTop)
   return document.documentElement.scrollTop;
 if (window.pageYOffset)
   return window.pageYOffset;
 return 0;
}


function ss_scrollWindow(scramount,dest,tryToSmoothStop, startPos) {
     var wascypos = ss_getCurrentYPos();
     var isAbove = (wascypos < dest);

    //alert("tryToSmoothStop = " + tryToSmoothStop);
    if (tryToSmoothStop) {

         var totalDist = dest - startPos;
         var toGo = Math.abs(dest - wascypos);
         var speedModifier;
         if (toGo < totalDist/2) {
             // slow down
             speedModifier = toGo;

            //scramount = Math.max(1, scramount - parseInt(scramount - toGo/scramount));
         } else {
             var haveGone = Math.abs(startPos - wascypos);
             speedModifier = haveGone;
         }
         scramount = Math.max(3, parseInt(3*scramount*speedModifier/totalDist));

     }
     window.scrollTo(0,wascypos + scramount);
     var iscypos = ss_getCurrentYPos();
     var isAboveNow = (iscypos < dest);
     if ((isAbove != isAboveNow) || (wascypos == iscypos)) {
       // if we've just scrolled past the destination, or
       // we haven't moved from the last scroll (i.e., we're at the
       // bottom of the page) then scroll exactly to the link
       window.scrollTo(0,dest);
       // cancel the repeating timer
       clearInterval(ss_INTERVAL);
     }
}

function hideMsg() {
  hide('msg');
}

function showMsg(msg, title) {
  // TODO: den här används ej, dvs den syns inte då "show" aldrig anropas, så gör ej ändringar i html som inte syns...
  return false;

  if (msg) {
    var msgEl = document.getElementById('msg_text');
    if (msgEl) msgEl.innerHTML = msg;
  }
  if (title) {
    var titleEl = document.getElementById('msg_title');
    if (titleEl) titleEl.innerHTML = title;
  }
  var imgDiv = document.getElementById('msg_img');
  if (imgDiv) {
      imgDiv.innerHTML = '<img src="/cocoon/bbr/img/indicator.gif" class="transp" alt=""/></div>'
  }
  var x = xScrollLeft() + (xClientWidth() / 2);
  var y = xScrollTop() + (xClientHeight() / 2) - /*(xHeight('msg') / 2)*/150;

  xMoveTo('msg', x, y);
  return false;
}

function show(id,x,y) {
  YAHOO.util.Dom.removeClass(id, 'hide');
  YAHOO.util.Dom.addClass(id, 'block');
}

function hide(id) {
  YAHOO.util.Dom.removeClass(id, 'block');
  YAHOO.util.Dom.addClass(id, 'hide');
}

function getDropdownValue(dropdownId) {
    var theDropdown = document.getElementById(dropdownId);
    var selectedIndex = theDropdown.selectedIndex;
    var retVal = "";
    if (selectedIndex > -1) {
        retVal = trim(theDropdown.options[selectedIndex].text);
    } return retVal;
}

function updateMiljoName(namnFieldId, lanFieldId, kommunFieldId, landskapFieldId, sockenFieldId, fritextFieldId) {
    var lan = createLan(getDropdownValue(lanFieldId));
    var landskap = createLandskap(getDropdownValue(landskapFieldId));
    var kommun = createKommun(getDropdownValue(kommunFieldId));
    var socken = createSocken(getDropdownValue(sockenFieldId));
    var fritext = document.getElementById(fritextFieldId).value;
    var namn = createMiljoNamn(lan, kommun, landskap, socken, fritext);
    document.getElementById(namnFieldId).innerHTML=namn;
    // lagra undan namnet också så att man kan använda det i undervyer
    document.getElementById("miljo_label").value=namn;
}

function updateInventeringName(namnFieldId, typFieldId, kommunFieldId, lanFieldId, stiftFieldId, fritextFieldId) {
    var typ = getDropdownValue(typFieldId);
    var kommun = createKommun(getDropdownValue(kommunFieldId));
    var lan = createLan(getDropdownValue(lanFieldId));
    var stift = createStift(getDropdownValue(stiftFieldId));
    var fritext = document.getElementById(fritextFieldId).value;
    var namn = createInventeringNamn(typ, kommun, lan, stift, fritext);
    document.getElementById(namnFieldId).innerHTML=namn;
    // lagra undan namnet också så att man kan använda det i undervyer
    document.getElementById("inventering_label").value=namn;
}

function updateAnlaggningName(namnFieldId, kommunFieldId, fastighetFieldId, fritextFieldId) {
    var kommun = createKommun(getDropdownValue(kommunFieldId));
    var fastighetString = document.getElementById(fastighetFieldId).value;
    var fritextString = document.getElementById(fritextFieldId).value;
    var namn = createAnlaggningNamn(kommun, fastighetString, fritextString);
    document.getElementById(namnFieldId).innerHTML=namn;
    // lagra undan namnet också så att man kan använda det i undervyer
    document.getElementById("anlaggning_label").value=namn;
}

function addSelectedMultiSelectItem(element) {
	var selectId = element.id;
	var hiddenId = selectId.replace("_multiselect", "");
	var hidden = document.getElementById(hiddenId);
	var option = element.options[element.selectedIndex];
	if (option && element.selectedIndex > 0) {
		var optionValue = option.value;
		var optionText = option.text;
		hidden.value = hidden.value + (hidden.value != '' ? "," + optionValue : optionValue);
		var tr = element;
		while ((tr = tr.parentNode) != null && tr.nodeName != "TR") {
		}
		if (tr != null && tr.nodeName == "TR") {
			var newTR = document.createElement("tr");
			newTR.id = element.id + "_" + optionValue;
			var td = document.createElement("td");
			td.innerHTML = ""+
			// funkar i FF
//			alert("tr.parentNode.nodeName=" + tr.parentNode.nodeName);
//			tr.parentNode.insertBefore(newTR, tr.nextSibling);
//			newTR.innerHTML = "<td class='multipleChoiceList' colspan='2'>" + // "<span>" + optionText + "</span></td>";
			                  "  <a onclick='alert(\"ta bort (" + optionValue + ") " + optionText + "\"); " +
			                  "removeSelectedMultiSelectItem(\"" + selectId + "\",\"" + newTR.id + "\"); return false;' " +
			                  "href='#' title='' class='deleteButton'>" +
			                  "<img src='/cocoon/bbr/img/button_delete.gif' alt='Ta bort'>" +
			                  "</a>" +
			                  "<span>" + optionText + "</span>"; // +
			                  //"</td>";
			newTR.appendChild(td);
			td.className = 'multipleChoiceList';
			td.colSpan = 2;
			//alert("tr.innerHTML = " + newTR.innerHTML);
			tr.parentNode.insertBefore(newTR, tr.nextSibling);
			//alert("tr.nextSibling.innerHTML = " + tr.nextSibling.innerHTML);
		}

		var selectedIndex = element.selectedIndex;
		element.selectedIndex = 0;
		element.remove(selectedIndex);
	}
	//alert("Hidden is now: " + hidden.value);
}

function removeSelectedMultiSelectItem(selectId, trId) {
	var tr = document.getElementById(trId);
	tr.parentNode.removeChild(tr);
}

function passTab(srcEvent)
  {
    // make sure tab is passed so that focus can be retained
    var myEvent = (srcEvent)? srcEvent : window.event;
    var keyCode = myEvent.keyCode;
    if(keyCode == 9) {
      return true;
    } else {
        return false;
    }
}

function InitDropdown(id) {
   YAHOO.util.Event.onAvailable(id, this.handleOnAvailable, this);
 }
 InitDropdown.prototype.handleOnAvailable = function(me) {
     eval("drop_init_val_" + this.id + " = " + this.selectedIndex);
}

var ml_autocomplete = {
  keyTime : null,
  keyStr : '',
  allOpts : null,
  lastElement : null,
  onChange : null, // callback function reference
  delay : 500, // do type-ahead if two keys were pressed within 500 milliseconds (0.5 second, one can change this value for customization)

  populate : function(srcEvent)
  {
    var element = (srcEvent)? ((srcEvent.target)? srcEvent.target : srcEvent.srcElement) : window.event.srcElement;
    if(this.lastElement != element)
    {
      this.allOpts = new Array();
      for(var i = 0; i < element.options.length; i++)
        this.allOpts[i] = element.options[i].text.toLowerCase();
      this.lastElement = element;
    }
  },
  setSelection : function(srcEvent, form, action, callbackFunc)
  {
    var myEvent = (srcEvent)? srcEvent : window.event;
    var element = (myEvent.target)? myEvent.target : myEvent.srcElement;
    var keyCode = myEvent.keyCode;

    if(myEvent.type=='blur' || (keyCode == 13 || keyCode == 9) &&
    		(action && action!='' || callbackFunc && callbackFunc != ''))
    {
      // skicka formuläret eller kör callback om värdet har ändrats
      var originalIndex = eval("drop_init_val_" + element.id);
      if (originalIndex != element.selectedIndex) {
    	  if (action && action != '') {
	          // skicka
	          form.form_action.value=action; submitForm(form);
    	  } else if (callbackFunc && callbackFunc != '') {
    		  callbackFunc(element);
    	  }
       } else {
           // inget har ändrats
       }

      this.keyTime = null; // reset time after enter key's pressed
      return;
    }
    // messy JS keycodes force me to preprocess. Note: I use a US keyboard, other keyboards may vary?
    if((keyCode > 47 && keyCode < 58) || (keyCode > 64 && keyCode < 91 || keyCode == 32)) ; // space or alphanumerical characters, leave them alone
    else if(keyCode > 95 && keyCode < 106) keyCode -= 48; // keypad numbers
    else if(keyCode > 105 && keyCode < 112) keyCode -= 64; // keypad '+', '-', '/', '*', '.'
    else if(keyCode > 187 && keyCode < 191) keyCode -= 144; // '/', '.', ',', '-'
    //else if(keyCode > 218 && keyCode < 222) keyCode -= 128; // '\', '[', ']'
    else if(keyCode > 218 && keyCode < 221) keyCode -= 128; // som ovan, men exkludera å,ä (221, 222)
    else
    {
      switch(keyCode)
      {
        case 187: keyCode = 61; break; // '='
        //case 222: keyCode = 39; break; // '''
        case 222: keyCode = 132; break; // 'ä';
        case 221: keyCode = 134; break; // 'å'
//        case 192: keyCode = 96; break; // '`'
        case 192: keyCode = 148; break; // 'ö';
        case 186: keyCode = 59; break; // ';'
        case 191: keyCode = 39; break // '''
        default: return; // do not process non printable characters (unfortunately backspace cannot be supported because browsers like IE interpret backspace as go back a page in history)
      }
    }
    var currentKey = String.fromCharCode(keyCode).toLowerCase();
    // hantera å, ä, ö, osv
    switch (keyCode) {
        case 134: currentKey = "å"; break;// 'å'
        case 132: currentKey = "ä";  break;// 'ä';
        case 148: currentKey = "ö";  break;// 'ö';
        default: break;
    }
    var idx, currentSIdx = element.selectedIndex, useOld = false;

    var newTime = new Date().getTime();
    if(this.keyTime != null && newTime - this.keyTime < this.delay)
    {
      this.keyStr += currentKey;
      idx = this.findIdx(currentSIdx);
      if(idx == -1)
      {
        this.keyTime = newTime;
        return; // not found, keep current selection then (leave the incorrect keyStr alone)
      } else {
      // hittat
      }
    }
    else // handle default browser behavior
    {
      this.keyStr = currentKey;
      idx = this.findIdx(currentSIdx);
    }
    if(idx >= 0) // if keyStr is found in an option, select the option
    {
      if(currentSIdx >= 0) element.options[currentSIdx].selected = false;
      // gecko-based browsers have a very strange bug that strikes when user presses
      // the same character multiple times (like 'AAA', 'BBBB'), which could be "fixed"
      // in a strange way too (actually the idx > 0 test is not even necessary!)
      // first make a pattern to check if it's same character multiple times
      var pattern = new RegExp('^' + this.keyStr.charAt(0) + '+$', "i");
      if((navigator.userAgent.toLowerCase().indexOf("gecko") != -1) && pattern.test(this.keyStr) && idx > 0) element.options[idx-1].selected = true;
      else element.options[idx].selected = true;
    }
    this.keyTime = newTime;
  },
  findIdx : function(currentSIdx)
  {
    // full scan to find the smallest idx that match string keyStr (case-insensitive)
    var len = this.keyStr.length;
    var startidx = (currentSIdx < 0)? 0 : ((len == 1)? currentSIdx + 1 : currentSIdx);
    for(var i = startidx; i < this.allOpts.length; i++) {
      if(this.allOpts[i].length >= len && this.allOpts[i].substring(0, len) == this.keyStr) {
        return i;
      }
    }
    for(var i = 0; i < startidx; i++)
      if(this.allOpts[i].length >= len && this.allOpts[i].substring(0, len) == this.keyStr)
        return i;
    return -1;
  }

  };


/* Callback för att lägga till byggnadspunkter på kartan
*/
function pointCallback(pos) {
	// TODO: begränsa precision?
    var geometry = new OpenLayers.Geometry.Point(pos.lon, pos.lat);
    var formatter = new OpenLayers.Format.GML();
    var gmlPoint = formatter.buildGeometryNode(geometry);
    gmlPoint.setAttribute("srsName", "SDO:82202");
    var serializer = new OpenLayers.Format.XML();
    var pointAsXML = serializer.write(gmlPoint);
    // if (this.ID == "edit") kan användas om man vill veta att man kommer ifrån verktyget
    // till skillnad från formulär-js-kod
    var iconUrl = findMarkerIconUrl();
    var markerl = findMarkerLayer();

	if (markerl) {
	    var icon = new OpenLayers.Icon(iconUrl);
		var marker = new OpenLayers.Marker(pos, icon);

	    // ta bort ev existerande marker då det bara ska finnas en
	    checkRemoveMarker(markerl);

		markerl.addMarker(marker);
		setNewPointValue(pointAsXML);

		var cancel_new_building = document.getElementById("cancel_new_building");
		if (cancel_new_building) {
			cancel_new_building.disabled=false;
		}
		setNewPointStatus("Ny byggnad kommer att sparas med position " + pos.lon + ", " + pos.lat);
	}
}

/*
 * sätter gömt punktvärde
 */
function setNewPointValue(value) {
	var hidden = document.getElementById("new_point");
	if (hidden) {
		hidden.value = value;
	}
}

/*
 * uppdaterar statustext för ny byggnad
 */
function setNewPointStatus(text) {
	var new_point_status = document.getElementById("new_point_status");
	if (new_point_status) {
		new_point_status.innerHTML = text;
	}
}

/* Sätta byggnadspunkt från koordinater
*/
function setPoint(x, y) {
	if (isNaN(parseFloat(x))) {
		alert("'" + x + "' är ej ett giltigt värde för x");
		return;
	}
	if (isNaN(parseFloat(y))) {
		alert("'" + y + "' är ej ett giltigt värde för y");
		return;
	}
	if (x > y) {
		if (confirm("Du har troligen kastat om koordinaterna då x är större än y, ska ordningen bytas?")) {
			var tmp = x;
			x = y;
			y = tmp;
			document.desc.x.value=x;
			document.desc.y.value=y;
		}
	}
    pointCallback(new OpenLayers.LonLat(x, y));
    recenterMap(map, x, y);
}

/* Hitta marker-layer, ska bara finnas ett
*/
function findMarkerLayer() {
	var markerlayer = null;
	if (map) {
		for(var i = 0; i < map.layers.length; ++i) {
	        var layer = map.layers[i];
	        if(layer.CLASS_NAME == "OpenLayers.Layer.Markers") {
	        	markerlayer = layer;
	            break;
	        }
		}
    }
	return markerlayer;
}

/* Hitta ikon-URL
*/
function findMarkerIconUrl(page) {
	var iconUrl = null;
	if (map) {
	    for(var i = 0; i < map.controls.length; ++i) {
	        var control = map.controls[i];
	        if(control.CLASS_NAME == "OpenLayers.Control.Identify") {
	            iconUrl = control.markerIconUrl;
	            break;
	        }
	    }
	}
    return iconUrl;
}

/* Ta bort markör
 *
 */
function removeMarker() {
    // if (this.ID == "edit") kan användas för att veta att man kommer från verktyget vid behov
    var markerl = findMarkerLayer();
    checkRemoveMarker(markerl);
    // rensa new_point om den finns
    setNewPointValue("");
    setNewPointStatus("Ny byggnad kommer att sparas utan kartposition");
}

/* Ta bort marker (skall bara finnas en i taget)
*/
function checkRemoveMarker(markerl) {
	if(markerl == null){
		return;
	}
    for(var ii = 0; ii < markerl.markers.length; ii++) {
        markerl.removeMarker(markerl.markers[ii]);
    }
}

/** Callback funktion för i-knappen
*/
function idCallback(coords) {
    var MIN_USABLE_SCALE = 25000;

    var scale = Math.round(map.getScale());

    if(scale > MIN_USABLE_SCALE) {
          return;
    }

    var MIN_SCALE = 2500;
    var MIN_OFFSET = 5;

    var offset = scale / MIN_SCALE * MIN_OFFSET;
    var pt_x = Math.round(coords.lon);
    var pt_y = Math.round(coords.lat);
    //parametrar för att utföra sökningen
    var params = (pt_x - offset) + "," + (pt_y - offset) + "," + (pt_x + offset) + "," + (pt_y + offset);
    //vilka parametrar som behövs (layers för karta? overview? vilken sida som ska visas? prata med Stefan.
    //var id_extent = document.getElementById("id_extent");
    //id_extent.
    var id_tool_search = document.getElementById("id_tool_search");
    id_tool_search.value = "true";
    var extent = document.getElementById("extent");
    extent.value = params;
    // fusk, fusk, men hur hittar man vad formuläret heter?
    document.forms[0].form_action.value="id_tool_search";
    document.forms[0].submit();
}

/**
* Hjälpfunktion
*/
function isSet(s) {
    return (s!=null && s!="" && s!="null" && s!="undefined");
}
/**
*	Centrerar karta givet x och y
*/
var MAP_CENTER_SCALE_INDEX = 12;
function recenterMap(map, x, y) {
    var zoom = map.getZoom();
    if(zoom < MAP_CENTER_SCALE_INDEX) {
        zoom = MAP_CENTER_SCALE_INDEX;
    }
    map.setCenter(new OpenLayers.LonLat(x, y), zoom);
}

function bbr_map_init() {
    map.events.register("zoomend", null, updateMapExtent);
    map.events.register("moveend", null, updateMapExtent);
    updateMarkerLayerAndSLD("searchResultMarkers", "objectMarkerUrl", "sld_id");
    showHideUseExtent();
}

function updateMarkerLayerAndSLD(markerId, objectMarkerId, sldId) {
    // ta bort ev tidigare markerlager
    var layer = map.getLayer("BBR_MARKERS");
    if (layer) {
        map.removeLayer(layer);
        layer.destroy();
    }
    // lägg till nytt markerlager om vi har en url
    var markers = document.getElementById(markerId);
    if (!markers) {
        // kolla om det finns en för bara ett objekt (ej sökning)
        markers = document.getElementById(objectMarkerId);
    }
    if (markers) {
        markers = markers.href;
        layer = new OpenLayers.Layer.Text(
            "Byggnader markering",
            {
                location: markers,
                popupClass: OpenLayers.Popup.FramedCloud
            }
        );
        layer.id = "BBR_MARKERS";
        map.addLayer(layer);
        layer.setVisibility(true);
    }
    // hämta sld för utskrifter
        /*
    var sld = document.getElementById(sldId);
    if (sld) {
        RAA.printSLD = decodeURI(sld.href);
    } else {
        RAA.printSLD = null;
    }
    */
}




/**
 * Lägg till en markör för en position. Använd lagret om det redan finns,
 * annars skapas nytt lager. Markören läggs till som en ny Marker.
 * @param x
 * @param y
 * @param layerName String Namn på lager att skapa eller uppdatera
 * @param replacePrevious boolean Om tidigare markörer i lagret ska rensas
 */
function addMarker(x, y, layerName, replacePrevious) {

    var ICON_URL = "img/position_marker.png";
    var ICON_SIZE_WIDTH = 23;
    var ICON_SIZE_HEIGHT = 36;

    var markerLayer;

    var markerLayers = map.getLayersByName(layerName);
    if (markerLayers != null && markerLayers.length > 0) {
          markerLayer = markerLayers[0];
    } else {
          markerLayer = new OpenLayers.Layer.Markers(layerName);
          map.addLayer(markerLayer);
    }

    var size = new OpenLayers.Size(ICON_SIZE_WIDTH, ICON_SIZE_HEIGHT);
    var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
    var icon = new OpenLayers.Icon(ICON_URL, size, offset);

    if (replacePrevious) {
        var m = markerLayer.markers;
        if (m.length > 0) {
            var i = 0;
            for (i = 0; i < m.length; i++) {
                m[i].destroy();
            }
        }
        markerLayer.clearMarkers(); // nollställ markerLayer's referens
        markerLayer.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(x,y),icon));
    } else {
        markerLayer.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(x,y),icon.clone()));
    }
}

/**
*  Centrerar och lägger markör för positionen x,y
*/
function placeOnMap(srcEvent) {
    var dropDownId = (srcEvent)? ((srcEvent.target)? srcEvent.target : srcEvent.srcElement) : window.event.srcElement;

    if (dropDownId.name == "place_id") {
        var index = dropDownId.selectedIndex;
        if (index >= 0) {
            var value = dropDownId.options[index].value;
            var x = value.split(",")[1];
            var y = value.split(",")[0];
            if (isSet(x) && isSet(y)) {
                recenterMap(map, x, y);
                addMarker(x, y, MAP_RECENTER_MARKER_LAYER_TITLE, true);
               }

        }
    }
}

/**
 * Skapar stränguttryck för kartutsträckning (extent) lämpligt för söksträng.
 * @return String med uttryck för värde på extent.
 */
function getMapExtentString() {
    var ext = map.getExtent();
    var s = "";
    if (isSet(ext)) {
        s = ext.left + ',' + ext.bottom + ',' + ext.right + ',' + ext.top;
    }
    return s;
}

/**
 * Uppdatera med aktuellt värde för kartutsträckning i formulärfältet "extent".
 */
function updateMapExtent(event) {
    var ext = getMapExtentString();
    var extent = document.getElementById('extent');
    if (extent) {
        extent.value = ext;
    }
    showHideUseExtent();
    return true;

}

/**
 * Stänger av "Sök inom befintlig kartbild" vid skala < 1:75000
 * (Oracle-buggen)
 */
function showHideUseExtent() {
    var chboxSokKartBild = document.getElementById("chbox_sok_kartbild");
    if(chboxSokKartBild != null) {
        var scale = Math.round(map.getScale());
        if(scale > 75000) {
            chboxSokKartBild.setAttribute("disabled", true);
        } else {
            chboxSokKartBild.removeAttribute("disabled");
        }
    }
}

function loginPopup(url){
	window.open(url,"Bebyggelseregistret","scrollbars=yes,status=no,toolbar=no,resizable=yes,location=no,menubar=yes,directories=yes");
}

/**
*  lägger till lyssnaren för i-knappen
function identifyToolClicked() {
    YAHOO.util.Dom.setStyle('map_OpenLayers_ViewPort', 'cursor', 'help');
}
*/

