//GMAP functions
var map = null;
var geocoder = null;
var dynamap;
var overlays =[];
var exists={};
var version=0; //map display vers
var g_selected=0;
var g_dynahome=null;
var g_homeLid=0;
var g_scrollEnabled=0;
var g_dynaType=0;
var g_noUpdate=0;

function showWhereInTextarea(el, start, len){
    var textarea = el;
    if(textarea.setSelectionRange){
	textarea.setSelectionRange(start, start+len);
    }
    else{
	var range = textarea.createTextRange();
	range.collapse(true);
	
	range.moveStart('character',start);
	range.moveEnd('character',len);
	range.select();
    }
}
function formatText(el,tagstart,tagend) {
    if (el.setSelectionRange) {
	var top = el.scrollTop;
	var selStart=el.selectionStart;
	var selLen = el.selectionEnd - selStart;
	el.value = el.value.substring(0,el.selectionStart) + tagstart + el.value.substring(el.selectionStart,el.selectionEnd) + tagend + el.value.substring(el.selectionEnd,el.value.length)
	    showWhereInTextarea(el, selStart+3, selLen);
	el.focus();
	el.scrollTop = top;
	    }
    else{
	var selectedText = document.selection.createRange().text;
	if (selectedText != "") {
	    var newText = tagstart+ selectedText + tagend;
	    document.selection.createRange().text = newText;
	    el.focus();
	}
    }

}

function dynaswitch(pins){
    if(pins==true) g_dynaType=1;
    else g_dynaType=0;
    dynarefresh();
}
function dynarefresh(){
    dynamap.clearOverlays();
    var overlays2=[];
    var len = overlays.length;
    for(var i=0;i<len;++i){
	var old = overlays[i];
	var myoptions={};

	if( g_dynaType==0)
	    myoptions = old.options;

	var marker = new GMarker(old.getLatLng(), myoptions);
	marker.lid=old.lid;
	marker.version=old.version;
	marker.cat=old.cat;
	marker.options=old.options;

	exists[old.lid] = marker;
	overlays2.push(marker);
	GEvent.addListener(marker, 'click', function(){highlightDynaMarker(this.lid);});
	dynamap.addOverlay(marker);
    }
    overlays=overlays2;

    addDynaHome();
}

function initializeAddmap(lat, lng, zoom) {
  if (GBrowserIsCompatible()) {
      map = new GMap2(document.getElementById("map_canvas"));
    map.setCenter(new GLatLng(lat, lng), zoom);
    map.addControl(new GSmallMapControl());
    //map.enableGoogleBar();

    map.clearOverlays();
    var marker = new GMarker(new GLatLng(lat, lng));
    map.addOverlay(marker);

    GEvent.addListener(map, "moveend", function() {
	var center = map.getCenter();
	var lat = center.lat();
	var lng = center.lng();
	map.clearOverlays();
        var mymarker = new GMarker(center);
        map.addOverlay(mymarker);
	updateCoords(lat,lng);

      });
    geocoder = new GClientGeocoder();
  }
}

var dynaInitial='';
function delargeDynamap(){
    var floatBG = document.getElementById('floatBG');
    var floatContent = document.getElementById('floatContent');
    var floatBox = document.getElementById('floatBox');
    var floatWrap = document.getElementById('floatWrap');
    floatWrap.style.display='none';
    floatBG.style.display='none';
    floatContent.innerHTML = dynaInitial;

}
function enlargeDynamap(){
    var floatContent = document.getElementById('floatContent');
    var floatBox = document.getElementById('floatBox');
    var floatWrap = document.getElementById('floatWrap');
    var floatBG = document.getElementById('floatBG');
    var pageHeight = document.body.clientHeight;
    var windowHeight = document.documentElement.clientHeight;
    var windowWidth = document.documentElement.clientWidth;
    var scrollOffset = document.documentElement.scrollTop;
    var margin = 50;

    floatBG.style.height=pageHeight+'px';
    floatBG.style.display='block';

    floatWrap.style.display='block';
    floatBox.style.top = (margin + scrollOffset)+'px';
    floatBox.style.height = (windowHeight-margin-margin) + 'px';
    floatBox.style.width = Math.min(1000, (windowWidth-margin-margin))+'px';

    dynaInitial = floatBox.innerHTML;
    var mapHeight = (windowHeight-margin-margin - 35);
    floatContent.style.height=mapHeight + 'px';

    var bounds = dynamap.getBounds();
    var min = bounds.getSouthWest();
    var max = bounds.getNorthEast();

    floatContent.innerHTML = '<iframe width=100% height=100% frameborder=0 marginwidth=0 marginheight=0 src="http://www.worldsaurus.com/expandMap.php?height='+mapHeight+'&min='+min+'&max='+max+'&home='+g_dynahome+'&homeLid='+g_homeLid+'"></iframe>';
}

function highlightDynaMarker(lid){
  var marker = exists[lid];
  if(!marker) return;
  if(g_selected){
    var element = document.getElementById('dynaentry'+g_selected);
    if(element)element.className='dynaentry';
  }

  g_selected=lid;
  var entry = document.getElementById('dynaentry'+lid);
  if(entry)
      entry.className='dynaselect';
  dynaInfo2(marker);
}

 function dynaPopulate2(str){
   var data=str;
   if(data=='') return;

   var entries= data.split('$');
   var total = entries.length;
   ++version;

   var list='';
   var bounds = dynamap.getBounds();

   for(var i=0;i<total;++i){
     var fields = entries[i].split('^');
     var lid = fields[0];
     var image = fields[3];
     var name = fields[4];
     var basic = fields[5];
     var point = new GLatLng(fields[1], fields[2]);     
     var cat = fields[6];
     
     if(lid==g_homeLid) continue;

     var imageFields=null;
     var imagePiece='';
     if(image) imageFields = image.split('|');

     //     if(bounds.containsLatLng(point))
     {
	 if(image) imagePiece ='<div class=floatLeftImage><img src='+imageFields[0]+' width='+imageFields[1]+' height='+imageFields[2]+'></div>';

	 if(cat==1) info='<img src=/images/info.png width=14 height=14>';
	 else info='';

	 var style='dynaentry';
	 if(lid==g_selected) style='dynaselect';
	 list +='<div id=dynaentry'+lid+' class='+style+' onclick="highlightDynaMarker('+lid+')">';
	 list += "<div style='float:right'><a target=_top href=\""+fields[7]+"\"><img width=12 height=12 src=/images/new_window.gif></a></div>";
	 list +=imagePiece+info+"<a class=link>"+name+"</a> - " + basic;
	 list +='<div class=clear></div></div>';
     }
     if(exists[lid]) {exists[lid].version=version; continue;}


     var options ={};
     if(image){
       var imageFields = image.split('|');
       if(cat == 0 || 1){
	   var myicon = new GIcon();
	   myicon.image =imageFields[0];
	   var width=imageFields[1];
	   var height=imageFields[2];
	   myicon.iconSize = new GSize(width,height);
	   myicon.iconAnchor = new GPoint(width/2,height/2);
	   myicon.infoWindowAnchor = new GPoint(width/2,height/2);
	   options={icon:myicon};
       }
     }
     if(0 && cat==1){
	 var myicon = new GIcon();
	 myicon.image ='/images/info.png';
	 var width=32;
	 var height=32;
	 myicon.iconSize = new GSize(width,height);
	 myicon.iconAnchor = new GPoint(width/2,height/2);
	 myicon.infoWindowAnchor = new GPoint(width/2,height/2);
	 options={icon:myicon, zIndexProcess:last};
     }
     
     var myoptions = options;
     if(g_dynaType==1) myoptions={};

     var marker = new GMarker(point, myoptions );
     marker.lid=lid;
     marker.version=version;
     marker.cat=cat;
     marker.options=options;

     GEvent.addListener(marker, 'click', function(){highlightDynaMarker(this.lid);});
     dynamap.addOverlay(marker);
     
     exists[lid]=marker;
     overlays.push(marker);
   }
   document.getElementById('dynalist').innerHTML=list;

   //purge unused
   total = overlays.length;
   var overlaysNew=[];
   for(var i=0;i<total;++i){
     var lid = overlays[i].lid;
     var ver = exists[lid].version;

     if(ver != version){
       delete exists[lid];
       dynamap.removeOverlay(overlays[i]);
     }else overlaysNew.push(overlays[i]);
   }
   overlays = overlaysNew;
 }

var ajaxVer=0;
function dynamize2(){
  var bounds = dynamap.getBounds();
  var min = bounds.getSouthWest();
  var max = bounds.getNorthEast();
  var url = "http://www.worldsaurus.com/dynamize2.php?min="+min+"&max="+max;

  ++ajaxVer;
  var myver = ajaxVer;

  var ajax = new Ajax.Request(url, {
    method:'post',
	onSuccess:
      function(transport){
          if(myver != ajaxVer) return;
	dynaPopulate2(transport.responseText);
      }
    });
  }

 function dynaInfo2(marker){
   var url="http://www.worldsaurus.com/dynamize2.php?lid="+marker.lid;
   var ajax = new Ajax.Request(url, {
     method:'post',
	 onSuccess:
       function (transport){
	   if(marker.lid != g_selected) return; //user clicked another location
	 var text = transport.responseText;
	   g_noUpdate=1;
	 marker.openInfoWindowHtml(text, {maxWidth:250});
       }
     });
 }

function initializeDynamap2(bl,tr) {
    if (GBrowserIsCompatible()) {
      dynamap = new GMap2(document.getElementById("dynamap"), {backgroundColor:'#99b3cc'});
      dynamap.addControl(new GSmallMapControl());
      
      var sw= new GLatLng(bl[0], bl[1]);
      var ne = new GLatLng(tr[0], tr[1]);
      var latLngBounds = new GLatLngBounds(sw, ne);
      var center = latLngBounds.getCenter();
      var zoom = dynamap.getBoundsZoomLevel(latLngBounds);
      if(zoom >13) zoom=13;
      if(zoom<1) zoom=1;

      dynamap.setCenter(center, zoom);
      //      dynamap.enableContinuousZoom();
      GEvent.addListener(dynamap, 'moveend', dynamoved);

      //add home
      addDynaHome();

      dynamize2();
    }
  }
function addDynaHome(){
    if(g_dynahome){
	var homeicon = new GIcon();
	homeicon.image = "/images/homeIcon.png";
	homeicon.iconSize =new GSize(32,32);
	homeicon.iconAnchor = new GPoint(16,16);
	homeicon.infoWindowAnchor = new GPoint(16,16);
	var pt = new GLatLng(g_dynahome[0], g_dynahome[1]);
	var marker = new GMarker(pt, {icon:homeicon, zIndexProcess:last});
	dynamap.addOverlay(marker);
	
	GEvent.addListener(marker, 'click', function(){this.openInfoWindowHtml('Current location', {maxWidth:250});});
    }
}

function dynamoved(){
    if(g_noUpdate) {g_noUpdate=0;return;}

    dynamize2();
    if(!g_scrollEnabled){
	dynamap.enableScrollWheelZoom();
	g_scrollEnabled=1;
    }
}
function last(marker){return 999;}

function updateCoords(lat,lng){
  document.getElementById('coordinates').innerHTML=lat.toFixed(2)+', '+lng.toFixed(2);
  document.getElementById('lat').value=lat;
  document.getElementById('lng').value=lng;
}

function showAddress() {
  var address = document.getElementById('address').value;
  if (geocoder) {
    //    geocoder.setViewport(map.getBounds());
    geocoder.getLatLng(address,
		       function(point) {
			 if (!point) {
			   alert(address + " not found");
			 } else {
			   map.setCenter(point, 13);
			   var lat=point.lat();
			   var lng=point.lng();
			   updateCoords(lat,lng);
			 }
		       });
  }
}

function showDynaAddress() {
  var address = document.getElementById('address').value;
  if(!geocoder)    geocoder = new GClientGeocoder();
  if (geocoder) {
      geocoder.getLatLng(address,
			 function(point) {
			     if (!point) alert(address + " not found");
			     else dynamap.setCenter(point, 6);
			 });
  }
}


function validateSubmission(){
  var name = document.getElementById('name').value;
  var coords = document.getElementById('lat').value;
  if(name==''){
    alert("Please specify a name for the location.");
    return false;
  }
  if(coords=='0'){
    alert("Please specify the location coordinates.");
    return false;
  }
  return true;
}
function doSubmit(formname, posturl, div, callback) {
  var params = Form.serialize(formname);
  var connector = '?';
  if(posturl.indexOf('?') != -1) connector = '&';
  if(callback){
    new Ajax.Updater(div, posturl+connector+'time='+new Date(), {asynchronous:true, parameters:params, onComplete:callback});
  }
  else
    new Ajax.Updater(div, posturl+connector+'time='+new Date(), {asynchronous:true, parameters:params});
}

function doajaxConfirm(div, url, message){
    var r = confirm(message);
    if(r) doajax(div, url);
}

function doajax(div, url){
  var connector = '?';
  if(url.indexOf('?') != -1) connector = '&';
  url = url + connector + 'time='+new Date();
  
  var ajax = new Ajax.Request(url, {
    method:'post',
	onSuccess:
      function(transport){
	var box = document.getElementById(div);
	box.innerHTML = transport.responseText;
      },
    onFailure:
      function(){
        alert("Could not contact "+url+".");
      }

    });
}

function createRequestObject() {
  var ro;
  var browser = navigator.appName;
  if(browser == "Microsoft Internet Explorer"){
    ro = new ActiveXObject("Microsoft.XMLHTTP");
  }else{
    ro = new XMLHttpRequest();
  }
  return ro;
}
