// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

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.onClick
                    }, this.handlerOptions
                );
            },

            onClick: function(evt) {
              if ($("lon") && $("lat")){
                clearMarkers();
                addBookmark(evt);
              }
            }
  });

function map_for(loc){
      Try.these(
          function(){init_map()}
          );
      markLocations(loc);
}

function markLocations(loc){
      clearMarkers();
	if(loc){
		this.lat = loc.lat;
		this.lon = loc.lon;
            setFormLatLon(loc);
	}
	Try.these(
		function(){if(loc){
              addMarker(new OpenLayers.LonLat(loc.lon,loc.lat));
              recenterMap();
              }
            }
	);
}

function init_map(){
    map = new OpenLayers.Map($('map'),{projection:"EPSG:4326", numZoomLevels:18 });
    map.addLayer(new OpenLayers.Layer.GTileGrid("India",tile_url));
    map.addControl(new OpenLayers.Control.PanZoomBar());
    markers = new OpenLayers.Layer.Markers("markers");
    map.addLayer(markers);
    map.setCenter(new OpenLayers.LonLat(lon, lat),4);
    dragControl = { drag: new OpenLayers.Control.DragMarker(markers, {'onComplete': function(){setLonLat();}}) };
    map.addControl(dragControl['drag']); 
    click = new OpenLayers.Control.Click();
    map.addControl(click);
    click.activate();
}

function setLonLat() {
     lat.value = marker.lonlat.lat;
     lon.value = marker.lonlat.lon;
}


function activateDragMarker() {
          dragControl['drag'].activate();
}

function CenterMap(loc){
	setcenter=eval( "(" + loc + ")" );
	map.setCenter(new OpenLayers.LonLat(setcenter.Longitude,setcenter.Latitude));
}

function clearMarkers(){
 	markers.clearMarkers();
}
function setFormLatLon(lonlat){
  if($('lat') && $('lon')){
    $('lat').value=lonlat.lat;
    $('lon').value=lonlat.lon;
  }
}
function addBookmark(e){
  lonlat = map.getLonLatFromViewPortPx(e.xy);
  addMarker(lonlat);
  setFormLatLon(lonlat);
}

function displayInfo(content){
  org_name = OpenLayers.Util.isArray(content.org.name) ? content.org.name[0] : content.org.name;
  disp = "<img class=close src=/images/close.gif onclick=Element.hide('info'); />";
  disp +=  "<div class=disp><div class=head><img src=" + content.icon +"/>";
  disp += "<label class=sub_heading_1><a href=" + content.url + ">" + content.title + "</a></label></div>";
  disp += "<div class=desc><p>" + content.description + "</p></div>";
  disp += "<div class=foot> <b>Registered by</b>:" + content.user.name + "</div>";
  if (content.org.name){
    disp += "<div class=foot> <a href="+content.org.url + ">"+ org_name + "</a></div>";
  }
  disp += "<div class=foot>created on:" + content.dates[0] + "</div>";
  disp += "</div>";
  $("info").innerHTML = disp;
  Element.show("info");
}
function displayInfo2(content){
  org_name = OpenLayers.Util.isArray(content.org.name) ? content.org.name[0] : content.org.name;
  disp = "<img class=close src=/images/close.gif onclick=Element.hide('info2'); />";
  disp +=  "<div class=disp><div class=head><img src=" + content.icon +"/>";
  disp += "<label class=sub_heading_3><a href=" + content.url + ">" + content.title + "</a></label></div>";
  disp += "<div class=desc>" + content.type + "<p>" + content.description.truncate(150,"...") + "</p></div>";
  disp += "</div>";
  $("info2").innerHTML = disp;
  Effect.SlideDown("info2");
}

function initResults(results){
  total = results.size();
  var list = "";
  title = "<div class=rtitle>" + total + " Results" + "</div>";
  list += title;
  list += "<ul id=result_list class=rlist></ul>";
  $("mresults").innerHTML = list;
  Element.show("mresults");
  
}

function addToResult(row,id){
   brief = row.presentable;
   org_name = OpenLayers.Util.isArray(brief.org.name) ? brief.org.name[0] : brief.org.name;
   //.truncate([length = 30[suffix = '...']]);
   var list = ""
   list +=  " <li id=" + id + "> " +
            " <table>" +
            "  <tr >" +
            "    <td rowspan=2 valign=top><img src=" + row.icon + " />" +
            "    <td><label class=title1><a href=#>" + brief.title + "</a></label></td>" + 
            "  </tr>" +
            "  <tr>"  +
            "   <td><label>" + brief.dates[0] + "|" + org_name + "</label></td>"  +
            "  </tr>" + 
            " </table>" +
            " </li> ";


    new Insertion.Bottom('result_list', list);
}


function addMarker(pnt){
    var m_image = "/images/marker.png";
    var offset = function(size) {return new OpenLayers.Pixel(-22,-28);};
    var icon = new OpenLayers.Icon(m_image,new OpenLayers.Size(45,45),null,offset);
    marker = new OpenLayers.Marker(pnt,icon);
    markers.addMarker(marker);
    activateDragMarker(); 
  //  map.setCenter(pnt);
}

function plot_locations(locs){
         Try.these(function(){locs = eval("(" + locs + ")");});
	 
          clearMarkers();
          /**
           * the code continues if the locs is Array
           */
          if (!OpenLayers.Util.isArray(locs)) {
            plot(locs);
            recenterMap();
          }else{
            if(locs.size() < 1) {return;}
            _id = 10000;
            if($("mresults")){
		initResults(locs);
	    }
            locs.each(function(loc){plot(loc,_id++)});
            recenterMap();
          }
}
function plot(loc,id){
  m_image = loc.icon ? loc.icon : getIconForLocatable(loc);
  offset = function(size) {return new OpenLayers.Pixel(-22,-28);}
  icon = new OpenLayers.Icon(m_image,new OpenLayers.Size(20,20),null,offset);
  pnt =  new OpenLayers.LonLat(loc.lon,loc.lat);
  marker=new OpenLayers.Marker(pnt,icon);
  if(loc.presentable){
    if($("mresults")){
        addToResult(loc,id);
        Event.observe((id).toString(),'click',function(e){map.setCenter(pnt);displayInfo(loc.presentable);});
        marker.events.register("click",marker,function(e){map.setCenter(pnt);displayInfo(loc.presentable);});
    }else{
      if ($("info2")){
        marker.events.register("click",marker,function(e){map.setCenter(pnt);displayInfo2(loc.presentable);});
      }
    }
    
  }
  markers.addMarker(marker);
}

function recenterMap(){
      var bounds = markers.getDataExtent();
      map.setCenter(bounds.getCenterLonLat());
      b2 = resizeExtent(bounds);
      zoom = map.getZoomForExtent(b2);
      if(zoom < 10){
        map.zoomTo(zoom);
      }else{
        map.zoomTo(10);
      }

}


function resizeExtent(bounds){
        bounds.left *= 0.99995;
        bounds.bottom *= 0.99995;
        bounds.right *= 1.00006;
        bounds.top *= 1.00006;
        return bounds;
}


function getIconForLocatable(locatable){
        if (locatable.locatable_type){
          var ico = "/images/medium/" + locatable.locatable_type.toLowerCase() + ".gif";
          return ico;
        }
}

var map;
var zoom = 7;
var marker;
var tile_url = ["http://tiles0.mapunity.org","http://tiles1.mapunity.org","http://tiles2.mapunity.org","http://tiles3.mapunity.org"];
//var tile_url = "http://209.190.27.27:8080/tiles/oltiles/";
var lat = 23.62;
var lon= 81.78;
var markers;
var click;
var dragControl;

