var app = {};
var hsLayers;
var searchURL = "http://www.hsrs.cz/mapserv/hsmap/index.php";
OpenLayers.Popup.COLOR = "transparent";


var init = function(){
    OpenLayers.ProxyHost = "/mapserv/common/proxy.php?toEncoding=utf8&proxy_url=";
    
    HS.setLang("cze");

    //HSLayers.feedbackScript = "../common/feedback.php";
    //HSLayers.Layer.WarpedWMS.proxy = undefined;
    //HSLayers.Printer.printerScript = "http://bnhelp.cz/cgi-bin/mapCreator.py";

    OpenLayers.Marker.defaultIcon = function() {
        var size = new OpenLayers.Size(32,32);
        var offset = new OpenLayers.Pixel(-16, -32);
        return new OpenLayers.Icon(OpenLayers.Util.getImagesLocation()+"icons/blue.png",size,offset);};
    
    mapOptions = {
        projection: new OpenLayers.Projection("epsg:900913"),
        displayProjection: new OpenLayers.Projection("epsg:4326"),
        units: "m",
        //numZoomLevels: 7,
        //maxResolution: 313086.678,
        //minResolution: "auto",
        minZoomLevel: 11,
        maxZoomLevel: 17, 
        maxExtent: new OpenLayers.Bounds(1690000, 6430000, 1710000, 6445000)    
    };

    app.readStateControl = new HSLayers.Control.ReadState("/mapserv/common/statusmanager/index.php");
    app.saveStateControl = new HSLayers.Control.SaveState("/mapserv/common/statusmanager/index.php");
    
    mapOptions.controls = [
        new OpenLayers.Control.Navigation({zoomBoxKeyMask: OpenLayers.Handler.MOD_CTRL}),
        new OpenLayers.Control.PanZoomBar({zoomWordIcon: true}),
        new OpenLayers.Control.Attribution(),
        app.readStateControl,
        app.saveStateControl,
        new OpenLayers.Control.Permalink(undefined, undefined,{displayProjection: new OpenLayers.Projection("epsg:4326")})
    ];
 
    app.map = new OpenLayers.Map("map", mapOptions);

    //var gphy = new OpenLayers.Layer.Google("Physical",{type: G_PHYSICAL_MAP});
    var base = new OpenLayers.Layer.Google("Streets", {'sphericalMercator': true});
    var ghyb = new OpenLayers.Layer.Google("Hybrid",{type: G_HYBRID_MAP, 'sphericalMercator': true});
    //var gsat = new OpenLayers.Layer.Google("Satellite",{type: G_SATELLITE_MAP});

    var style = new OpenLayers.Style({
        pointRadius: "${radius}",
        externalGraphic: "${icon}",
        fillColor: "#ffcc66",
        fillOpacity: 0.8,
        cursor: 'Pointer',
        strokeColor: "#cc6633",
        strokeWidth: 2,
        strokeOpacity: 0.8
      }, {
        context: {
          icon: function(feature) {
            if(feature.cluster) {
              if(feature.cluster.length>1){
                return "http://www.bnhelp.cz/projects/khmesto/img/group.gif";
              }  
              else return feature.cluster[0].style.externalGraphic;
            }
          },
          radius: function(feature) {
            if(feature.attributes.count>1) return 7;
            else return 7 
            //return 16;
            //return Math.min(feature.attributes.count, 7) + 7;
          }
        }
    });

    var kml = new OpenLayers.Layer.Vector("KML", {
            projection: new OpenLayers.Projection("epsg:4326"),
            strategies: [new OpenLayers.Strategy.BBOX(),new OpenLayers.Strategy.Cluster({distance:12})],
            visibility: true,
            maxResolution: 9,
            protocol: new OpenLayers.Protocol.HTTP({
                url: "http://www.bnhelp.cz/mapserv/hsmap/index.php?project=khkml&mode=itemnquery&qlayer=objekty&qitem=USER&pagerecs=999&qstring=/./",
                format: new OpenLayers.Format.KML({
                    extractStyles: true,
                    extractAttributes: true
                })
            }),
            styleMap: new OpenLayers.StyleMap({"default": style})
        });
     
    app.map.addLayers([base, ghyb, kml]);

    var vstyle = new OpenLayers.Style({
        externalGraphic: OpenLayers.Util.getImagesLocation()+"icons/blue.png",
        cursor: 'Pointer',
        fillOpacity: 0.9,
        graphicYOffset: -32,
        graphicXOffset: -16,
        label: "${num}",
        labelAlign: "c",
        labelYOffset: 22,
        fontColor: "#000000",
        fontSize: "11px",
        fontFamily: "sans-serif",
        fontWeight: "bold",
        pointRadius: 16
    });


    app.vlayer = new OpenLayers.Layer.Vector("Vector",{
      visibility:true,
      styleMap: new OpenLayers.StyleMap({"default": vstyle})
    });
    app.map.addLayer(app.vlayer);
    app.map.addControl(new HSLayers.Control.ArgParser({displayProjection: new OpenLayers.Projection("epsg:4326"),layer:app.vlayer}));

    var ls = new HSLayers.Control.BoxLayerSwitcher();
    app.map.addControl(ls);

    ls.add("Topo",base,[],{active: true});
    ls.add("Foto",ghyb,[],{});

    if (!app.map.getCenter()) {
	      app.map.zoomToExtent(app.map.maxExtent);
    }

    app.readStateControl.getState();

    app.selectFeature = new HSLayers.Control.SelectFeature([app.vlayer,kml], {toggle:true, clickout: true,onBeforeUnselect: onBeforeClickUnselect});
    app.selectHoverFeature = new HSLayers.Control.SelectFeature([kml], {hover:true, onBeforeUnselect: onBeforeMoveUnselect,toggle: true});

    app.map.addControl(app.selectHoverFeature);
    app.selectHoverFeature.activate();
    
    app.map.addControl(app.selectFeature);
    app.selectFeature.activate();

    kml.events.on({                                                                                                                                             
        "featureselected": onFeatureSelect,
        "featureunselected": onFeatureUnselect
    });
    
    app.vlayer.events.on({                                                                                                                                             
        "featureselected": onFeatureSelect,
        "featureunselected": onFeatureUnselect
    });
    
    kml.redraw();
};

var lastevt;
var lastidx;
var markers;
var marker;
var watchPos;

function onFeatureSelect(event) {
  var feature = event.feature;
  switch(event.event.type) {
    case "mousemove": 
      feature.selectedBy = "mousemove";
      onOverFeatureSelect(event.feature);
      break;
    case "click" : 
      feature.selectedBy = "click";
      onClickFeatureSelect(event.feature,event);
      break;
  }
}

function onOverFeatureSelect(feature){  
    var theLabel = "";
    for(var i=0; i < feature.cluster.length; i++){
      if(feature.cluster[i].attributes.name){
        if(i>0) theLabel += "<br/>";
        theLabel += feature.cluster[i].attributes.name.trim();
      }  
    }
    if(!theLabel) return;
    
    var tooltipLonLat = feature.geometry.getBounds().getCenterLonLat();
    // move the popup 10x10 px right-down
    var map = feature.layer.map;
    var px = map.getPixelFromLonLat(tooltipLonLat);
    px.x += 10;
    px.y += 10;
    tooltipLonLat = map.getLonLatFromPixel(px);

    var tooltipPopup = new OpenLayers.Popup("tt"+feature.id,
        tooltipLonLat,
        new OpenLayers.Size(10,10),
        theLabel,
        false 
    );

    //tooltipPopup.autosize=true;
    //tooltipPopup.updateSize();
     //this is messy, but I'm not a CSS guru
    //tooltipPopup.contentDiv.style.backgroundColor='#FFFFE0';
    tooltipPopup.contentDiv.style.overflow='hidden';
    //tooltipPopup.contentDiv.style.padding='2px';
    //tooltipPopup.contentDiv.style.border='1px solid gray';
    //tooltipPopup.contentDiv.style.height="14px";
    //tooltipPopup.closeOnMove = true;
    feature.tooltipPopup = tooltipPopup;
    app.map.addPopup(tooltipPopup); 
    tooltipPopup.updateSize();  
    //quick hack
    if (!/MSIE (\d+\.\d+);/.test(navigator.userAgent)){
      tooltipPopup.setSize(new OpenLayers.Size(tooltipPopup.size.w-12, tooltipPopup.size.h - 15));
    }
}

var onClickFeatureSelect = function(feature,event) {

    // definice funkci pro zobrazeni obsahu, "Vice informaci"  a nadpisu
    // pro pripad, ze se jedna o Cluster strategii pro zobrazeni ikon v
    // mape
    var title = function(feature) {
        if(feature.style) var img = "<img src='"+ feature.style.externalGraphic +"' height='16px;'> "; else var img = "";
        return img;
        //return  img+(feature.layer.getPopupTitle ?  feature.layer.getPopupTitle(feature): (feature.data.name ? feature.data.name : feature.data.title))
    };

    var content = function(feature){
      return (feature.layer.getPopupContent ? feature.layer.getPopupContent(feature) : feature.data.description)
    };

    var moreInfo = function(feature) {
      if (feature.fid) {
        var ids = feature.fid.split("-");
        if(ids[0] && ids[0] > 0){
          return "http://www.kutnahora.cz/index.php?sec="+ids[0]+"&cid="+ids[1];
        }
        else {
          return undefined;
        }
      }
      else {
        return undefined;
      }
    };
    
    if(event!=undefined){ 
        var lonlat = app.map.getLonLatFromPixel(event.event.xy);
    }  
    else{
        var p = feature.geometry.getCentroid();
        var lonlat = new OpenLayers.LonLat(p.x,p.y)
    }    
    // zobrazeni bubliny
    var popup = new HSLayers.Popup({
      lonlat: lonlat,
      size: new OpenLayers.Size(230,150),
      feature: feature,
      title: title,
      moreInfo: moreInfo,
      contentHTML: content,
      anchor: null, 
      closeBox: true
    });

    feature.popup = popup;
    app.map.addPopup(popup,true);

    // odvybrat pripadne dalsi 
    app.selectFeature.unselectAll({except: feature});
}

var onFeatureUnselect = function(event) {
    var feature = event.feature;
    var popup;
    switch(event.event.type) {
        case "mousemove": 
            popup = feature.tooltipPopup;
            break;
        case "click":
            popup = feature.popup;
            break;
    }

    if(popup) {
        app.map.removePopup(popup);
        popup.destroy();
    }

    switch(event.event.type) {
        case "mousemove": 
            feature.tooltipPopup = undefined;
            break;
        case "click":
            feature.popup = undefined;
            break;
    }

    if (event.event.type != feature.selectedBy && feature.selectedBy === "mousemove") {
        app.selectFeature.select(feature,event.event);
    }
};

var onBeforeClickUnselect = function(feature,event) {
    //return (event.type === feature.selectedBy);
}
var onBeforeMoveUnselect = function(feature,event) {
    return (event.type === feature.selectedBy);
}

/******************************************************************************
 * moje poloha - experiment
 *****************************************************************************/
var getPosition = function(){
  if (navigator.geolocation) {
    var adr = document.getElementById("adr");
    adr.innerHTML = "hledám...";
    //navigator.geolocation.getCurrentPosition(showPosition, errorPosition); // jednou
    watchPos = navigator.geolocation.watchPosition(showPosition, errorPosition);  //opakovane
  }  
  else alert("Tento prohlížeč tohle nepodporuje :(");
}



var showPosition = function(o){
  var adr = document.getElementById("adr");
  adr.innerHTML = o.coords.latitude+' '+o.coords.longitude+' '+o.coords.accuracy;
  if(o.address) adr.innerHTML += '<hr/>'+o.address.street+' '+o.address.streetNumber+', '+o.address.city+', '+o.address.country; 

  var lonlat = new OpenLayers.LonLat(o.coords.longitude,o.coords.latitude);
  lonlat = lonlat.transform(
    new OpenLayers.Projection("epsg:4326"),
    new OpenLayers.Projection("epsg:900913")
  );

  var feature = new OpenLayers.Feature.Vector(
    new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat),
    { title: 'my position',  
      description: '',
      r: 30     
    },
    {
        pointRadius: 12,
        fillColor: "#66ccff",
        fillOpacity:0.5    
    }
  );
  app.vlayer.addFeatures([feature]);
  
  /*if(!markers){
    markers = new OpenLayers.Layer.Markers("markers", {});
    app.map.addLayer(markers);
  } 
  else markers.removeMarker(marker); 
  var sz = new OpenLayers.Size(23, 23);
  var calculateOffset = function(size) {
    return new OpenLayers.Pixel(-12, 15);
  };           
  var icon = new OpenLayers.Icon("http://www.bnhelp.cz/projects/khmesto/img/pin.gif", sz, null, calculateOffset);
  marker = new OpenLayers.Marker(lonlat, icon);
  markers.addMarker(marker);  */
  //app.map.panTo(lonlat);
  app.map.setCenter(lonlat, 7, true, false);  
}

var errorPosition = function(o){
  alert('Error ' + o.code+': '+o.message);
  var adr = document.getElementById("adr");
  adr.innerHTML = "";
}

/******************************************************************************/

var searchAdr = function(str){
  if(str==undefined){
  	 var str=document.searchForm.adr.value.trim().toLowerCase();   
  }  	 
  var adr = document.getElementById("adr"); 
	adr.innerHTML="hledám...";
  var result=str.split(",");
  result[0]=result[0].trim();
  if(result[1]) result[1]=result[1].trim();  
  
  var result1=result[0].split(" ");
  var str_count=result1.length;
  
  var str_name="";
  var str_num="0"; 
	 
	if (str_count==1) {
	  str_name=result1[0];
	} else {   
    for(var i=0;i<str_count;i++) {
      if (i<str_count-1){
		    if (i==0) {
		      str_name=result1[i];
			  } else {
			    str_name=str_name+" "+result1[i];
			  }            
		  } else {		  
	      var re=new RegExp (/[0-9]/);
	      if (re.test(result1[i])){
	        str_num=result1[i];
	      } else {
			    str_name += " "+result1[i];
			  }    
		  }	
	  }   
	}
	
	// bez cisla
  if (str_num=="0"){
    OpenLayers.loadURL(searchURL, 
      {
        project: 'find_hslayers_stredocesky',
        format: 'json',
        mode: 'itemnquery',
        qlayer: 'qadresy',
        qitem: 'gid',
        qstring: "kod_obec=533955 AND (nazev_ul_a ILIKE '"+str_name+"%' OR cis_d="+str_name+" OR cis_o="+str_name+")"
      }
      , app, 
      onSearchResultPins); //jmeno navratove fce z ajaxu
  } 
   else if(!str_name){
    OpenLayers.loadURL(searchURL, 
      {
        project: 'find_hslayers_stredocesky',
        format: 'json',
        mode: 'itemnquery',
        qlayer: 'qadresy',
        qitem: 'gid',
        qstring: "kod_obec=533955 AND (cis_d="+str_num+" OR cis_o="+str_num+")"
      }
      , app, onSearchResultPins);
   }    
   else {
    OpenLayers.loadURL(searchURL, 
      {
        project: 'find_hslayers_stredocesky',
        format: 'json',
        mode: 'itemnquery',
        qlayer: 'qadresy',
        qitem: 'gid',
        qstring: "kod_obec=533955 AND ((naz_cast_d ILIKE '"+str_name+"%' OR nazev_ul_a ILIKE '"+str_name+"%') AND (cis_d="+str_num+" OR cis_o="+str_num+"))"
      }
      , app, onSearchResultPins); 
	}

  return false;
}

var onSearchResultPins = function(r) {   
    var adr = document.getElementById("adr");
    eval("var json=" + r.responseText);
    var s = "";
    app.vlayer.destroyFeatures(app.vlayer.features);
    for(var i=0;i<json.records.length;i++){
      var descr = json.records[i].naz_cast_d + ", " + json.records[i].nazev_ul_a + " " + json.records[i].cis_d + "/" + json.records[i].cis_o;
      s += "<div class='hs-searched' style='font-size:11px; height:34px; background: url(http://www.bnhelp.cz/wwwlibs/hslayers/3.0/build/img/icons/blue.png) no-repeat; padding-left:12px'>"+(i+1) + "&nbsp;&nbsp;&nbsp; <a href=\"javascript:zoomToPin("+i+",2000);\">" + descr + "</a></div>";

      var lonlat = new OpenLayers.LonLat(json.records[i].coor_x, json.records[i].coor_y);
      lonlat = lonlat.transform(
        new OpenLayers.Projection("epsg:102067"),
        new OpenLayers.Projection("epsg:900913")
      );
    
      var f = addMarker(lonlat.lon, lonlat.lat, app.vlayer, {title: "Nalezená adresa", description: descr, num: (i+1)});

    }
    //TODO - p0okud bude jen jeden nebo zadny
    app.map.zoomToExtent(app.vlayer.getDataExtent());
    adr.innerHTML = s;

//--- zazoomuje na vsechny vybrane - musi v sobe mit odpovidajici mikroformaty
   //var features = HSLayers.Util.geoMicroformatParser(geoportal.mapViewer.infoPanel.body.dom,geoportal.origProjection,geoportal.map.getProjection()); 
   //this.addFeaturesToMap(features);

//--- nebo zazoomuje na prvni objekt  
  //var alist = geoportal.mapViewer.infoPanel.body.dom.getElementsByTagName('A');
  //if(alist.length > 0) location = alist[0].href;
}

/*******************************************************************************
* Vlozi spendlik na vyhledane misto
*******************************************************************************/
var zoomWithPin = function(bbox,scale,text,num) {
    
    var lonlat = new OpenLayers.LonLat(bbox.split(" ")[0],bbox.split(" ")[1]);
    lonlat = lonlat.transform(
        new OpenLayers.Projection("epsg:102067"),
        new OpenLayers.Projection("epsg:900913")
    );
    
    app.vlayer.destroyFeatures(app.vlayer.features);
    var f = addMarker(lonlat.lon, lonlat.lat, app.vlayer, {title: "Nalezená adresa", description: text, num: num});

    //app.map.setCenter(lonlat, 16, true, true);  
    app.map.setCenter(lonlat);
    app.map.zoomToScale(2000);
    onClickFeatureSelect(f);
}

var addMarker = function(lon, lat, layer, config){
    if(config==undefined) config = {};
    
    var feature = new OpenLayers.Feature.Vector(
        new OpenLayers.Geometry.Point(lon, lat),
        { title: config.title,
          description: config.description,
          num: config.num
        }
    );
    
    feature.closeBox = true;
    feature.popupClass = HSLayers.Popup;
    layer.addFeatures([feature]);
    layer.redraw();
    return feature;
}

// zazoomuje na spendlik - bez smazani
var zoomToPin = function(num, scale){
    var f = app.vlayer.features[num]; 
    app.map.zoomToExtent(f.geometry.bounds);
    if(scale){
      app.map.zoomToScale(scale);        
    }
    onClickFeatureSelect(f); 
}
