var app = {};
app.markers = null;
app.markerList = {};
app.bounds=null;

app.cls = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {
     'font-size':'tiny',
     //fixedRelativePosition:true,
     //'positionBlocks': {"tr"},
     'minSize': new OpenLayers.Size(200,70),
     'maxSize': new OpenLayers.Size(200,300)
 });
 app.tiemout = null;

var sz = new OpenLayers.Size(12, 12); 
var sz2 = new OpenLayers.Pixel(-6, -6);                  
app.typ={};
var ic = "img/ico12x12stin/ico_";
app.typ['other'] = ic+'jine2.png';
app.typ['kopec'] = ic+'relief.png';
app.typ['skaly'] = ic+'relief.png';
app.typ['doly'] = ic+'relief.png';
app.typ['toky'] = ic+'voda.png';
app.typ['rybnik'] = ic+'voda.png';
app.typ['nadrz'] = ic+'voda.png';
app.typ['zamek'] = ic+'pamatky.png';
app.typ['admcleneni'] = ic+'sidla.png';
app.typ['cirkevni'] = ic+'pamatky.png';
app.typ['ochranapr'] = ic+'priroda.png';

app.typ['sidla'] = 'img/bluedot.gif';


  app.panPin = function(id){
    app.map.panTo(app.markerList[id].lonlat);
    app.showPopup(app.markerList[id]);
  }

  app.showPopup = function(marker){
    var s = '<b>'+marker.title+'</b>';
    if(marker.words.length>1){
      s += '<br/>Výskyty:';
      for(var i=0;i<marker.words.length;i++){
         s += " <a href='#' onclick=\"fnSelect('"+marker.words[i]+"');\">"+(i+1)+"</a>";
      }
    }
    var thePopup = new app.cls(1,marker.lonlat,new OpenLayers.Size(200,70),s,marker.icon,true,null);
    app.map.addPopup(thePopup, true);    
  }
  
  app.stred = function(size){
    //return new OpenLayers.Pixel(-0.5*size, -0.5*size);
    return sz2; 
  }
  
  app.addPin = function(id,parentId,x,y,cls,s){
    if(!app.markerList[id]){
      app.mapPins++;
      var location = new OpenLayers.LonLat(x, y);
      var url = app.typ[cls];
      if(!url) url = app.typ['other'];
      var icon = new OpenLayers.Icon(url, sz, null, app.stred);
      app.markerList[id] = new OpenLayers.Marker(location, icon);
      app.markerList[id].title = s;
      app.markerList[id].words = Array();
      app.markerList[id].events.register("click", app.markerList[id], markerClick);
      app.markers.addMarker(app.markerList[id]);
      app.bounds.extend(location);
    }
    app.markerList[id].words.push(parentId);
  }

  function markerClick(evt){
    fnSelect(this.words[0]);
    app.showPopup(this);
  }
  
  app.clearMap = function() {
    app.bounds = null;
    for(var i=0;i<app.markerList.length;i++){
      app.markerList[i]=null;
    }
    app.markerList = Array();
    app.markers.clearMarkers();
    if(app.map.popups[0])app.map.popups[0].hide();
  }

function getElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}

	function fnSelect(objId) {
    if(frames.textFrame) var frame = frames.textFrame; else var frame = window;
    fnDeSelect();
    var obj = frame.document.getElementById(objId)
    var pom = obj.getElementsByTagName('SPAN')[0];
		if (frame.document.selection) {
		  if(frame.document.body.createTextRange){ // Opera hack
		    var range = frame.document.body.createTextRange();
 	      range.moveToElementText(obj);
		    range.select();
		  }  
		}
		else if (frame.getSelection) {
		  var range = frame.document.createRange();
		  range.selectNode(obj);
		  frame.getSelection().addRange(range);
		}
		obj.scrollIntoView();
    frame.scrollBy(-100,-15);	
  }

	function fnDeSelect() {
	  app.hideList();
    if(frames.textFrame) var frame = frames.textFrame; else var frame = window;
		if (frame.document.selection){
      if(frame.document.selection.empty) frame.document.selection.empty();// Opera hack
    }   
		else if (frame.getSelection) frame.getSelection().removeAllRanges();
	}

function processGeoTags(){
  if(frames.textFrame) var frame = frames.textFrame; else var frame = window;
  app.mask.hide();
  app.clearMap();
  app.number = 0;
  app.mapPins = 0;
  app.bounds = new OpenLayers.Bounds();
  var formValues = app.loadForm.getForm().getValues();
  // z procesu
  if(app.process){
    var entity = getElementsByClassName('entita', 'span', frame.document);
    for(var i=0;i<entity.length;i++){
      entity[i].id = 'e'+i;
      entity[i].onmouseover=parent.app.onMouse;
      var geotags=getElementsByClassName('geo', 'abbr', entity[i]);
      app.number++;
      for(var j=0;j<geotags.length;j++){
        var xy = geotags[j].title.split(';');
        app.addPin(geotags[j].id,'e'+i,xy[1],xy[0],geotags[j].className.replace(/geo /,''),geotags[j].innerHTML);
      }   
    }
  }
  // jen mikroformaty TODO - i jine typy
  else{
    var geotags=getElementsByClassName('geo', 'abbr', frame.document);
    for(var j=0;j<geotags.length;j++){
      var xy = geotags[j].title.split(';');
      geotags[j].id = xy[1]+'g'+xy[0];
      geotags[j].onmouseover=parent.app.onMouse;
      app.addPin(xy[1]+'g'+xy[0],xy[1]+'g'+xy[0],xy[1],xy[0],geotags[j].className.replace(/geo /,''),geotags[j].innerHTML);  
      app.number++;    
    }
  }
  app.statusField.setText(app.number+"/"+app.mapPins);
  if(app.mapPins>0){ 
    app.map.zoomToExtent(parent.app.bounds);
    app.googleButt.enable();
  }
  else app.googleButt.disable();  
}

app.onMouse = function(e){ 
  if(frames.textFrame) var frame = frames.textFrame; else var frame = window;
  if (!e) var e = frame.event;
  var f = frame.document;
  var fdiv = f.getElementById('floatWin');
  if(!fdiv){ 
    fdiv = document.createElement('div');
    fdiv.setAttribute('id','floatWin');
    f.body.appendChild(fdiv);
  }  
  fdiv.style.display='none';
  var geotags=getElementsByClassName('geo', 'abbr', this);
  var s='';
  if(geotags.length==0) parent.app.panPin(this.id); // pro samotne tagy GEO
  if(geotags.length==1) parent.app.panPin(geotags[0].id); // pro jeden vyskyt v entite
  else {
    for(var j=0;j<geotags.length;j++){
      //TODO pripraveno pro editaci
      //s += "<div onmouseover=\"parent.app.panPin('"+geotags[j].id+"');\"><a href=\"javascript:parent.app.onlyTag('"+this.id+"','"+geotags[j].id+"')\">v</a> "+geotags[j].innerHTML+"</div>";
      s += "<div class='"+geotags[j].className.replace(/geo /,'')+"' onmouseout=\"parent.app.hideListDelayed();\" onmouseover=\"parent.app.resetTimeout(); parent.app.panPin('"+geotags[j].id+"');\">"+geotags[j].innerHTML+"</div>";
    }
    fdiv.style.display='block';
    fdiv.innerHTML = s;
    var left = e.clientX ? e.clientX + (f.documentElement.scrollLeft || f.body.scrollLeft) : e.pageX; 
    var top = e.clientY ? e.clientY + (f.documentElement.scrollTop || f.body.scrollTop) : e.pageY;
    var size = getWindowSize(frame); 
    //var width = frame.innerWidth ? frame.innerWidth : f.documentElement.clientWidth;
    //var height = frame.innerHeight ? frame.innerHeight : f.documentElement.clientHeight;
    var width= size[0];
    var height = size[1];
    if(left>(width-200)) left=width-200;
    fdiv.style.left = left+'px';
    if((height-e.clientY)<fdiv.clientHeight) top -=  fdiv.clientHeight; 
    fdiv.style.top = top+'px';
    //fdiv.onmouseout =  app.hideListDelayed;
  }
}

function getWindowSize(w) {
  var myWidth = 0, myHeight = 0;
  if( typeof( w.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = w.innerWidth;
    myHeight = w.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return [myWidth, myHeight];
}

function getScrollXY(w) {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( w.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = w.pageYOffset;
    scrOfX = w.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}

app.onlyTag = function(id, idg){
  if(frames.textFrame) var frame = frames.textFrame; else var frame = window;
  var elm = frame.document.getElementById(id);
  var geotags = elm.getElementsByTagName('DIV');
  for(var i=0;i<geotags.length;i++){
    if(geotags[i].id!=idg)  geotags[i].parentNode.removeChild(geotags[i]);
  }
  app.hideList();
}

app.resetTimeout = function(){
  clearTimeout(app.timeout);
}

app.hideListDelayed = function(){
  app.timeout=setTimeout("app.hideList();",2000);
}

app.hideList = function(){
  if(frames.textFrame) var frame = frames.textFrame; else var frame = window;
  var fw = frame.document.getElementById('floatWin')
  if(fw) fw.style.display='none';
}
/*exportKML = function(){
    var features = Array();
    
   var kml = this.createElementNS(this.kmlns, "kml");
   var folder = this.createFolderXML();

        }
        kml.appendChild(folder);
        return OpenLayers.Format.XML.prototype.write.apply(this, [kml]);

    
    for(marker in app.markerList){
        features.push(new OpenLayers.Feature.Vector(null,marker.lonlat));
       folder.appendChild(this.createPlacemarkXML(features[i]));
    }
    var kmlParser = new OpenLayers.Format.KML();
    var kml = kmlParser.write();
    console.log(kml);
    alert('ble');    
}
*/
Ext.onReady(function(){  

    // mapove vrstvy
   /* var topo = new OpenLayers.Layer.TileCache(
        "topo","http://apps.esdi-humboldt.cz/data/tilecache/","topoJTSK/20M",
        {group:'Topografická',
        resolutions: viewer.map.resolutions.slice(0,10), 
        displayInLayerSwitcher: true, isBaseLayer: false, isBaseGroup: true,format: "image/png", visibility:true, buffer:0, saveWMC:false});

    var baseTileWMS = new OpenLayers.Layer.WMS(
        "baseTileWMS","http://apps.esdi-humboldt.cz/cgi-bin/tilecache/tilecache.cgi",
        {layers: 'ceniaTopoJTSK',format:"image/png"},
        {group:"Topografická",isBaseLayer: false, isBaseGroup: true, format: "image/png",
        resolutions: viewer.map.resolutions.slice(10,30), 
        displayInLayerSwitcher: true,visibility:false, buffer:0, transitionEffect:"resize", saveWMC:false});

    var ortho = new OpenLayers.Layer.TileCache( 
        "ortho","http://apps.esdi-humboldt.cz/data/tilecache/","ceniaJTSK/20M",
        {isBaseLayer:false, isBaseGroup: true, group:'Letecká',
        resolutions: viewer.map.resolutions.slice(0,10), 
        format:"image/jpeg",displayInLayerSwitcher: true, visibility:false, saveWMC:false});

    var orthoTileWMS = new OpenLayers.Layer.WMS(
        "orthoTileWMS","http://apps.esdi-humboldt.cz/cgi-bin/tilecache/tilecache.cgi",
        {layers: 'ceniaJTSK',format:"image/jpeg"},
        {group: "Letecká",
        resolutions: viewer.map.resolutions.slice(10,30), 
        displayInLayerSwitcher: true, isBaseLayer: false, isBaseGroup: true, format: "image/jpeg", visibility:false, buffer:0, transitionEffect:"resize", saveWMC:false});

    var labels = new OpenLayers.Layer.TileCache(
        "labels","http://apps.esdi-humboldt.cz/data/tilecache/","topoOverlayJTSK/20M",
        {group:HS.i18n("Labels"),displayInLayerSwitcher: true,
        resolutions: viewer.map.resolutions.slice(0,10),
        isBaseLayer: false, isBaseGroup: false, format: "image/gif", visibility:false, buffer:0, opacity:0.6, transitionEffect:"resize", saveWMC:false}); 

    var labelTileWMS = new OpenLayers.Layer.WMS(
        "labelTileWMS","http://apps.esdi-humboldt.cz/cgi-bin/tilecache/tilecache.cgi",
        {layers:'topoOverlayJTSK',format:"image/gif"},
        {group:HS.i18n('Labels'),displayInLayerSwitcher: true,
        resolutions: viewer.map.resolutions.slice(10,30), 
        visibility:false, format:'image/gif', buffer:0, opacity:0.6, transitionEffect:"resize", isBaseLayer: false, isBaseGroup: false, saveWMC:false});
*/

    app.processUserText = function(){
      var f = app.textForm.getForm().getEl().dom;
      var db = "";
      var formValues = app.loadForm.getForm().getValues();
      var db = "";
      app.process = true;
      for(val in formValues){
        if(val.substr(0,2)=='db'){
          if(db) db += ",";
          db += val.substr(3);
        } 
      } 
      app.textForm.getForm().setValues({db:db}); 
      app.textWin.hide();
      f.action="geoparser.php";
      f.target = 'textFrame';
      f.submit();
    }  

   app.textForm  = new Ext.form.FormPanel({
        baseCls: 'x-plain',
        layout: 'fit',
        url:'geoparser.php',
        standardSubmit: true,
        items: [{
            xtype: 'htmleditor',
            name: 'ptext'
          },{
            name: 'db',
            xtype: 'textfield',
            value: 'xxx',
            hidden: true,
            disabled: false
          }],
        buttons: [{
          text: 'Zpracovat',
          handler: app.processUserText
        },{
          text: 'Zavřít',
          handler: function() {app.textWin.hide();}
        }]    
    });
   
    app.textWin =  new Ext.Window({
      title: 'Vložení textu',
      width: 500,
      height: 400,
      closeAction: 'hide',
      items: app.textForm
    });   

    app.onSubmit = function(){
        if(app.loadForm.getForm().findField('f').getValue()){
          app.loadForm.getForm().submit({
            url:'feedback.php',
            params: {'method':'JSON'},
            waitMsg: 'ukládání na server ...',
       		  success: app.nacteno,
       		  failure: app.nacteno
          });
        }
        else{
          var url = app.loadForm.getForm().getValues().url;
          if(url.substr(0,4)!='http') url = 'http://'+url;
          app.processForm(url);
        }  
    }

    app.processForm = function(url){
      if(frames.textFrame) var frame = frames.textFrame; else var frame = window;
      var formValues = app.loadForm.getForm().getValues();
      app.clearMap();
      app.mask.show();
      var db = "";
      for(f in formValues){
        if(f.substr(0,2)=='db'){
          if(db) db += ",";
          db += f.substr(3);
        } 
      } 
      if(db) app.process = true; else app.process=false; 
      frame.location = "geoparser.php?db="+db+"&url="+escape(url); 
    }
    
    app.nacteno = function(f,a){
      var url = a.result.url;
      app.processForm(url);
    }

    app.mapPanel = new Ext.Panel({layout:'fit', region:'center'});
    app.infoPanel = new Ext.Panel({layout:'fit', region:'center'});
    if(app.url) var url = app.url;
    //else var url = "zkusebni.htm";
    app.loadForm = new Ext.FormPanel({ 
          title: 'Zpracování textu',
          frame:true,
          fileUpload: true,
          region: 'north',
          height: 170,
          layout:'form',
          labelWidth: 100,
          collapsible: true,
          keys: [{ key: Ext.EventObject.ENTER, handler: app.onSubmit }],
          items:[
          	{xtype: 'field', name:'url', fieldLabel:'URL', width:300, value:url},
            {xtype: 'field', name:'f',  fieldLabel:'nebo soubor', inputType:'file', width: 300},
          	/*{xtype: 'fieldset', 
              title: 'Výběr databáze pro vyhledání objektů', 
              autoHeight:true,
              defaults: {width:200}, 
              items: [*/
                {xtype: 'checkbox', name:'db.sidla',    fieldLabel:'Sídla ČR'},
                {xtype: 'checkbox', name:'db.geonames', fieldLabel:'Geonames LK'}
         	   // ]
                
          	//}
            /*, {xtype: 'checkbox', name:'process', fieldLabel:'Zpracovat text'}*/
          ],
          buttons: [{
            text: 'Zpracovat',
            handler: app.onSubmit
          },{
            text: 'Vyčistit',
            handler: function(){app.loadForm.getForm().reset();}
          }]
    });
    
    
        

    //app.loadForm.getForm().fileUpload=true;

    var src = "info.htm";
    if(app.url) src="geoparser.php?url="+app.url; 
    
    app.statusField = new Ext.Button({text:''});
    app.googleButt = new Ext.Button({
                text: 'Google',
                tooltip: 'Zobrazit v Google maps',
                cls: 'x-btn-text-icon',
                icon: 'img/google.gif',
                disabled: true,
                handler: function() {window.open('http://maps.google.com/maps?q='+escape('http://suda.co.uk/projects/microformats/geo/get-geo.php?type=kml&uri='+escape(frames.textFrame.location.href)), 'gmParse');}
              });  
     
     app.viewport = new Ext.Viewport({
      layout:'border',
      items: [{
          region: 'north',
          contentEl: 'north',
          layout: 'fit',
          height: 70
        },{
          region:'center',
          layout: 'border',
          items: [
          {
            region:'center',
            id: "textFrame",
            el: 'center',
            html: '<iframe name="textFrame" width="100%" height="100%" src="'+src+'" onload="processGeoTags();"></iframe>',
            tbar: [{
                text: 'Vložit text',
                tooltip: 'Zadat text nebo vložit z clipboradu',
                cls: 'x-btn-text-icon',
                icon: 'img/paste.gif',
                handler: function(){ app.textWin.show();}
              },{
                text: 'Info',
                tooltip: 'Počáteční informace',
                cls: 'x-btn-text-icon',
                icon: 'img/help.gif',
                handler: function() {frames.textFrame.location = 'info.htm'}
              }, 
              app.googleButt,
              '|', 'Nalezených objektů v textu / mapě:', 
              app.statusField
            ]
          },{
            layout:'border',
            region:'west',
            width:400,
            collapsible: true,
            resizable:true,
            split:true,
            items:[
              app.loadForm,
              app.mapPanel
            ]
        }]
       }] 
   }); 
  
  app.mask = new Ext.LoadMask(Ext.get('center'));
  app.mask.show();
  initMap();
  Ext.QuickTips.init();
  
  
});
  
  function initMap() {
    /*
     * Map initialization
     * EPSG:102067
     */
    //OpenLayers.ProxyHost = "/cgi-bin/olproxy.cgi?url=";
    OpenLayers.ImgPath = "http://www.bnhelp.cz/wwwlibs/hslayers/1.0.2/img/";
    var options = { };
    //var options = HSLayers.getProjectionOptions("epsg:102067");
    options.controls = [];
    app.map = new OpenLayers.Map(app.mapPanel.body.id,options);
    hsLayers.setMap(app.map);

    /*  Panel */

    app.map.addControl(new OpenLayers.Control.Navigation());    
    app.map.addControl(new OpenLayers.Control.PanZoomBar());
    //app.map.addControl(new OpenLayers.Control.Scale());


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

    app.map.addLayers([base,gphy,ghyb,gsat,app.markers]);
    
    var box = new OpenLayers.Control.BoxLayerSwitcher();
    app.map.addControl(box);
    box.add("Základní",[base],[],{});
    box.add("Terénní",[gphy],[],{active:true});
    box.add("Letecká",[gsat],[],{});
    box.add("Hybridní",[ghyb],[],{});
  
    app.map.zoomToMaxExtent();

    /* prehledka */
    //var overviewOptions = {};//{projection: new OpenLayers.Projection("epsg:900913")};
    /*var overviewLayer = new OpenLayers.Layer.WMS(
                    "CR Topo",
                                    "http://www.bnhelp.cz/ows/crtopo2",
                                                    {layers:
                                                    'podklad,les,hr_cr,sidla,voda,doprava'},{singleTile: true});*/
    /*baseo = new OpenLayers.Layer.Google("Streets", {'sphericalMercator':false});
    app.map.addControl(new OpenLayers.Control.OverviewMap( {
        layers:[baseo],
        mapOptions: overviewOptions}));
   */
  }

