//<?php 
//Code written by Hideki Shima (http://shi.ma/hideki)
//header('Content-type: text/javascript');
//?>

var map = null;
var entry = null;
var geocoder = new GClientGeocoder();

function init() {
  if (GBrowserIsCompatible()) {
	startLoading();  
        map = new GMap2($("map"));
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        map.setCenter(new GLatLng(40.44404035668254, -79.94519233703613), 12);
	map.enableDoubleClickZoom();
        map.enableContinuousZoom();
        new GKeyboardHandler(map);
	//map.enableScrollWheelZoom();
        //var offset = new GSize(0, -20);
	
	resize();
	search(1);
        endLoading();
  }
}

var lats = new Array();
var lngs = new Array();
function addMarkers( json ) {
	 //init
	map.clearOverlays()
	$("loclist").innerHTML = "";
	if (json.feed.entry==null) {
	   $('loclist').innerHTML='<h3>No results found.</h3>';
	} else {
	  lats = new Array();
	  lngs = new Array();
          latavg=0;
	  lngavg=0;
	  for (var i=0; i<json.feed.entry.length; i++) {
	    if (json.feed.entry[i].gsx$isvalid.$t == 1) {
	      var wi = new wrap( json.feed.entry[i] );
	      var latlng = wi.addMarker();
	      if (latlng.lat){
  	        lats[lats.length] = (latlng.lat*1);
  	        lngs[lngs.length] = (latlng.lng*1);
	      }
	    }
	  }
	  var latavg = average( lats );
	  var lngavg = average( lngs );
	  //var latvar = variance(lats, latavg)*2;
	  //var lngvar = variance(lngs, lngavg)*2;

	  //var center = map.getCenter();

	  //var rectObj = new GLatLngBounds(new GLatLng(center.lat()-latvar,center.lng()-lngvar), new GLatLng(center.lat()+latvar,center.lng()+lngvar));
	  //var zm = map.getBoundsZoomLevel(rectObj);
  	  //GLog.write('center = '+center);
	  //GLog.write('rect = '+rectObj);
	  //GLog.write('zoom = '+ map.getZoom() );
  	  //GLog.write('new zoom = '+ zm );
	  if (40.43<latavg && latavg<40.5 && -80.5<lngavg && lngavg<-79.5 ) {
            map.panTo( new GLatLng( latavg, lngavg ) );
          }
	}
}

function average( a ) {
    var sum = 0;
    for (var i=0; i<a.length; i++) {
       sum += a[i];
    }
    return sum/a.length;
}

function variance( a, avg ) {
    var v = 0;
    for (var i=0; i<a.length; i++) {
       v += (a[i]-avg)*(a[i]-avg)/a.length;
    }
    return v;
}

function search( q ) {
	 if (q) {
	         $('searchresultfor').innerHTML = "Search result for ";
	 	 startLoading();
		 var uri = 'http://spreadsheets.google.com/feeds/list/o17118448949911721754.465749789391400037/od6/public/values?alt=json-in-script&callback=loadJson&q='+q;
		 var script=document.createElement('script');
		 //var script=$('gss');
		 script.setAttribute('src',uri);
		 script.setAttribute('type','text/javascript');
		 document.documentElement.firstChild.appendChild(script);
		 if ( q==1 ) {
		   $('shoplistforx').innerHTML = "all entries";
		 } else if ( q.match(/c:/i) ) {
		   $('shoplistforx').innerHTML = cmap[q];
		 } else {
		   $('shoplistforx').innerHTML = q;
		 }
	}
	//endLoading();
}

function $(id) {
	 return document.getElementById(id);
}

function loadJson( json ) {
    addMarkers( json );
    endLoading();
}

function wrap( entry ) {
	 this.entry = entry;
}

var gHistory = "";
wrap.prototype.addMarker = function() {

	var address = this.entry.gsx$address.$t;
	var lat = this.entry.gsx$lat.$t;
	var lng = this.entry.gsx$lng.$t;
	var section = this.entry.gsx$section.$t;
	var subsection = this.entry.gsx$subsection.$t;
	var subsubsection = this.entry.gsx$subsubsection.$t;
	var item = this.entry.gsx$item.$t;
	var tel = this.entry.gsx$telephone.$t;
	var url = this.entry.gsx$url.$t;
	var officehour = this.entry.gsx$officehour.$t;
	var comment = this.entry.gsx$comment.$t;
	comment = comment.replace(/\n+/g,"\n");
	comment = "<ul style='padding-left:15px;margin-left:0px'><li>"+comment+"</li></ul>";
	comment = comment.replace(/\n/g, "</li><li>");

	var name = "<strong>"+item+"</strong><span class=\"resultcategory\">";
	if ( subsubsection ) {
	   name += " - "+subsubsection;
	} else if(subsection) {
	   name += " - "+subsection;
	} else if (section) {
	   name += " - "+section;
	}
	name += "</span>";

	var desc    = "<table width=300><tr><td class=shopdetail>";
	if (item)    desc += "<span class=shopname>"+item+"</span><br>";
	if (address) desc += address + "<br>";
	if (tel)     desc += tel + "<br>";
	if (url)     desc += "<a href=\""+url+"\" target=\"_blank\">"+url+"</a>";
	if (comment){
	    desc += "<hr size=1><div class=comment ";
	    desc += (comment.length>400)?"style=\"height:240px;\">":">";
	    desc += comment+"</div>";
	}
	desc += "</td></tr></table>";
	desc += "<div align=\"right\"><a target=\"_blank\" ";
        desc += "href=\"http://komachi.sp.cs.cmu.edu/maps/kuchikomi-form.php?title="+item+"\" ";
        desc += "style=\"text-decoration:underline;font-size:10px;\"> Add Comment</a></div>";

	if ( lat && lng ) {
	   var point = new GLatLng(lat, lng);
            point2marker( map, point, name, desc );
	} else {
   	  geocoder.getLatLng(address,
            function(point) {
              point2marker( map, point, name, desc );
            }  
          );
	}
	return { "lat":lat, "lng":lng };
}

function point2marker( map, point, name, desc ) {
            if (!point) {
              //alert(address+" not found!");
            } else {
              //var marker = new GMarker(point, {draggable: true});
      	      var marker = new GMarker( point );
	      lat=point.lat();
	      lng=point.lng();
              map.addOverlay(marker);

	      var pointId = marker.getPoint()+"";
	      pointId = pointId.replace(/[^0-9]/g,'');

	      GEvent.addListener(marker, "click", function(){
		  marker.openInfoWindowHtml( desc );
                  if(gHistory.style) {gHistory.style.backgroundColor='';}
                  gHistory = $( pointId );
	          gHistory.style.backgroundColor='#CCCCCC';
	      });
	      GEvent.addListener(marker, "infowindowclose", function()
	      {
	      	  var p = marker.getPoint()+"";
	          p = p.replace(/[^0-9]/g,'');
	          $(p).style.backgroundColor='';
	      });
	      //GEvent.addListener(marker, "dragend", function(){GLog.write( marker.getPoint()); });	  
	      var posLink = document.createElement("a");
	      posLink.innerHTML  = name;
	      posLink.href = "javascript:void(0)";

	       var newLi = document.createElement("li");
	       var newDiv = document.createElement("div");
	       newDiv.id = pointId;
	       
               newDiv.onclick = function() {
	       	 map.panTo(point);
		 map.setZoom(14);
		 marker.openInfoWindowHtml( "<p>"+desc+"</p>" );
		
                 if(gHistory.style) {gHistory.style.backgroundColor='';}
                 gHistory = newDiv;
	         gHistory.style.backgroundColor='#CCCCCC';
               }
	       newLi.appendChild(newDiv);
	       newDiv.appendChild(posLink);

	      $("loclist").appendChild(newLi);	      
            }
	    return { "lat":lat, "lng":lng };
}

function resize() {
	 var wsize = getWindowClientSize();
	 //var areah = $('area').style.height;
	 //=120px
	 var areah = 120;

	 // if katsukatsu?
	 var katsukatsu = 1;	 
	 
 	 $('map').style.width= (wsize.width-330)+"px";
  	 $('map').style.height= wsize.height+"px";

	 $('searchbox').style.left = (wsize.width -319)+"px";
	 $('loc').style.left       = (wsize.width -319)+"px";	 
	 $('area').style.left      = (wsize.width -319)+"px";

	 $('loc').style.height       = (wsize.height-88-65-areah)+"px";
	 $('area').style.top         = (wsize.height-33-areah)+"px";

 	 if ( katsukatsu ) {
	   // 35-> 10
	   $('searchbox').style.top = 10+"px";
	   // 100 -> 75
	   $('loc').style.top = 75+'px';
	   $('loc').style.height       = (wsize.height-88-65-areah+25)+"px";
	   $('area').style.top = (wsize.height-33-areah)+"px";
	   $('area').style.height = 130+'px';
	 }

 }

function getWindowClientSize() {
    var result = {"width":0,"height":0};
    if(window.self&&self.innerHTML)    {
        result.width = self.innerWidth();
        result.height = self.innerHeight();
        return result;
    } else if(document.documentElement&&document.documentElement.clientHeight) {
        result.width = document.documentElement.clientWidth;
	result.height = document.documentElement.clientHeight;
        return result;
    } else {
        result.width = 	document.body.clientWidth;
        result.height = document.body.clientHeight;
    }
    return result;
}

function jumpTo( lat, lng, zoom ) {
	 map.setZoom( zoom );
	 map.panTo( new GLatLng( lat, lng ) );
}

function startLoading() {
	 var wsize = getWindowClientSize();
	 $('loading').style.top  = ((wsize.height)/2-10)+'px';
	 $('loading').style.left = ((wsize.width-335)/2-75)+'px';
	 $('loading').style.visibility = 'visible';
}

function endLoading() {
	 $('loading').style.visibility = 'hidden';
}