
DgMap = {};

// object display globals
DgMap.homeurl = '/sites/edinburghantiques.co.uk/modules/gmap/';
DgMap.MCount = 0;
DgMap.Markers = new Array();
DgMap.infoDiv = null;
DgMap.possFilter = -1;
DgMap.inFilter = -1;
DgMap.filterProtect = 0;
DgMap.viewingMarker = null;
DgMap.nClicks = 0;

DgMap.preLoadImages = new Array();
DgMap.preLoadImageSrcs = [
  "images/marker1.png",  // purple1
  "images/marker2.png",  // purple2
  "images/marker3.png",  // blue1
  "images/marker4.png",  // blue2
  "images/marker5.png",  // green1
  "images/marker6.png",  // green2
  "images/marker7.png",  // yellow1
  "images/marker8.png",  // yellow2
  "images/marker9.png",  // cyan1
  "images/marker10.png", // cyan2
  "images/marker11.png", // orange1
  "images/marker12.png", // orange2
  "images/marker13.png", // grey1
  "images/marker14.png", // grey2
  "images/marker15.png", // grey1
  "images/marker16.png", // grey2
  "images/markerS.png"   // shadow (always last)
];

DgMap.modeDefs = [
  "Antique Shop",
  "Antique Restoration Service",
  "Auction House",
  "Restaurant/Cafe",
  "Accommodation/Hotel",
  "Charity Shop",
  "Museum/Tourist Attraction",
  "Other"
];

DgMap.Icon = new Array();

// object editing globals
DgMap.edit = false;
DgMap.editlat = null;
DgMap.editlng = null;
DgMap.postcde = null;
DgMap.editmarker = null;

/**
 * helper functions:
 *  is_numeric
 */

DgMap.is_numeric = function(text) { 
  var valid=false;
  if (text) {
    if (text.length>0) {
      var ehD="0123456789";  
      valid=true;
      for (var j=0; j<text.length; j++) {
        if (ehD.indexOf(text.charAt(j))<0) {valid=false;break;}
      }
    }
  }
  return valid;
};


/**
 * helper functions
 *  find_marker - return the marker given the nid
 */

DgMap.find_marker = function(nid) {
  var marker = null;

  for (var i=0;i<DgMap.Markers.length;i++) {
    if (DgMap.Markers[i].nid==nid) {
      marker = DgMap.Markers[i];
      break;
    }
  }
  return marker;
}


/** 
 * editMode
 *   are we in edit mode, ie entering data rather than browsing!
 *
 */
DgMap.editMode = function() {
  DgMap.editlat = document.getElementById("edit-lat");
  DgMap.editlng = document.getElementById("edit-lng");
  DgMap.postcde = document.getElementById("edit-cpostc");

  DgMap.edit = ((DgMap.editlat)&&(DgMap.editlng));

  return DgMap.edit;
}

/**
 * locateMarker
 *  shift map to centre upong the marker and zoom in (callback to locator click)
 */

DgMap.locateMarker = function() {
  if ((DgMap.viewingMarker)&&(DgMap.viewingMarker.nid>0)) DgMap.map.setCenter(DgMap.viewingMarker.getLatLng(),15);
}

/**
 * hoverInfo
 *    display information in the Info box
 */

DgMap.hoverInfo = function(text,marker) {
  if (DgMap.infoDiv) {
    // NOTE: using drupal's JQuery here
    if (text.length==0) {
      if (DgMap.inFilter>0) DgMap.filterInfo(1);  // we are in a filtered view, so remind that it can be removed
      else $(DgMap.infoDiv).html(text);
    } else {
      if (typeof(marker.mode)!='undefined') $(DgMap.infoDiv).html('<div class="ginfomark"><img src="'+DgMap.homeurl+'images/marker'+((marker.mode-1)*2+1)+'s.png" alt="marker" width="12px" height="21px" \></div><div class="ginfotext"><strong>'+text+'</strong><br />'+DgMap.modeDefs[marker.mode-1]+'</div>');
      else $(DgMap.infoDiv).html(text);	
    }
  } 
}

/**
 * filterInfo
 *    display filtering information in the Info box
 */

DgMap.filterInfo = function(mode) {
  if (DgMap.infoDiv) {
    // NOTE: using drupal's JQuery here
    $("#filterG").unbind();
    if (DgMap.inFilter>0) {
      // already filtering something, so give the option to remove filters!
      $(DgMap.infoDiv).html('<div class="ginfomark"><img src="'+DgMap.homeurl+'images/markerA.png" alt="all" width="18px" height="21px" \></div><div id="filterG">&nbsp;Show all markers again</div>');
    } else {
      // not filtering so give option to do so
      $(DgMap.infoDiv).html('<div class="ginfomark"><img src="'+DgMap.homeurl+'images/marker'+((mode-1)*2+1)+'s.png" alt="purple" width="12px" height="21px" \></div><div id="filterG">Show only '+DgMap.modeDefs[mode-1]+'s</div>');
    }
    $("#filterG").click(DgMap.filter);
  } 
}


/**
 * filter 
 *    do the filtering
 */

DgMap.filter = function() {
  var filterFor = DgMap.possFilter;
  if (DgMap.inFilter>0) {
    // remove all filtering
    for (var i=0;i<DgMap.Markers.length;i++) {
      DgMap.Markers[i].show();
    }
    DgMap.inFilter = -1;
    $("#filterG").unbind();       // clear the event listner
    $(DgMap.infoDiv).html('');    // clear the "unfilter" message as we just have
  } else {
    // perform filtering
    if (filterFor>0) {
      for (var i=0;i<DgMap.Markers.length;i++) {
	if (DgMap.Markers[i].mode!=filterFor) {
	  DgMap.Markers[i].hide();
	}
      }
      DgMap.inFilter = filterFor;
    }
    DgMap.filterInfo(0);  // readvertise the removal of filters
  }
}

/**
 * filterOptionEnd
 *    do the filtering
 */

DgMap.filterProtectionEnd = function() {
  DgMap.filterProtect = 0;
}


/**
 * xmlsplice
 *   slice up text using xml markers
 */

DgMap.xmlsplice = function(xml,marker) {
  var xmarker = '<'+marker+'>';
  var s = xml.indexOf(xmarker);
  var e = xml.indexOf('</'+marker+'>');

  if ((s<0)||(e<0)) return '';
  
  return xml.substring(s+xmarker.length,e);
}


/**
 * loadContent
 *   load the content of a node directly into this page
 */

DgMap.loadContent = function(nid) {
  // NOTE: using Googles XML loading and drupal's JQuery here
  var request = GXmlHttp.create();
  request.open("GET",'/antiquesXML/content/'+nid, true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      AStool.cleanup();
      $(".ASexchange").unbind("click");
      $("#ASLocButton").unbind("click");
      var h1html = DgMap.xmlsplice(request.responseText,'h1text');
      if (h1html.length>0) $(".pageTitle:first").html(h1html);
      var cnthtml = DgMap.xmlsplice(request.responseText,'therest');
      if (cnthtml.length>0) $(".content:first").replaceWith(cnthtml);
      AStool.setup();
      // setup locator:
      $("#ASLocButton").click(DgMap.locateMarker);
      // and set the cursor to clickable
      $("#ASLocButton > img").css("cursor","pointer");      

      // override certain links that may have appeared in the new conent, turning them into click events
      $(".ASexchange").click(DgMap.overrideLink);
      
      // adsense
      DgMap.adsense(nid);
      DgMap.nClicks++;
    }
  };
  request.send(null);
}  


/**
 * createMarker
 *   create a simple marker
 */

DgMap.createMarker = function(loc,text,icon,nid) {
  var marker = new GMarker(loc,icon);
  marker.nid = nid;

  // only add events for valid nids!
  if (nid>0) {
    GEvent.addListener(marker, 'click', function() {
      //if (DgMap.nClicks>3) {
      // this has the problem that you loose the map location!
      //window.location = 'http://edinburghantiques.co.uk/node/'+marker.nid;
      //} 
      // first mark the marker so they know where they clicked
      if ((DgMap.viewingMarker)&&(DgMap.viewingMarker.nid!=nid)) {  // reset the old marker
	var previcon = DgMap.viewingMarker.getIcon();
	DgMap.viewingMarker.setImage(previcon.image);
      }
      DgMap.viewingMarker = marker; // leave highlighted

      // second load page content for the marker 
      DgMap.loadContent(marker.nid);
    
      // third allow the filtering of this type of service (mode):
      if (typeof(marker.mode)!='undefined') {
	DgMap.possFilter=marker.mode;
	DgMap.filterProtect=1;
	DgMap.filterInfo(marker.mode);
	
	//delay so the mouse can move to click the filter?
	var timer=setTimeout("DgMap.filterProtectionEnd()",1800);
      } else DgMap.filterProtect=0;
    });

    // mouse over
    GEvent.addListener(marker, 'mouseover', function() {
      if (DgMap.filterProtect<1) DgMap.hoverInfo(text,marker);
      if (DgMap.viewingMarker) {
	if (DgMap.viewingMarker.nid!=marker.nid) marker.setImage(icon.highlight);
      } else marker.setImage(icon.highlight);
    });

    // mouse out
    GEvent.addListener(marker, 'mouseout', function() {
      if (DgMap.filterProtect<1) DgMap.hoverInfo('',marker);
      if (DgMap.viewingMarker) {
	if (DgMap.viewingMarker.nid!=marker.nid) marker.setImage(icon.image);
      } else marker.setImage(icon.image);
    });
    
    DgMap.Markers[DgMap.MCount] = marker;
    DgMap.MCount++;
  }
  return marker;
}

/**
 * overrideLink
 *  a click callback function attached to certain links that overrides the link into the 
 *  ajax actions
 */

DgMap.overrideLink = function() {
  var link = $(this).attr("href");
  var propagate = true;

  // extract the nid:
  var nid = -1;
  var indx = link.lastIndexOf('node/');
  if (indx>=0) {
    nid = link.substr(indx+5,link.length);
    if (DgMap.is_numeric(nid)) {
      DgMap.loadContent(parseInt(nid));
      // change the viewing Marker
      if ((DgMap.viewingMarker)&&(DgMap.viewingMarker.nid!=nid)) {  // reset prev highlighted icon
	var previcon = DgMap.viewingMarker.getIcon();
	DgMap.viewingMarker.setImage(previcon.image);
      }
      // highlight this icon
      DgMap.viewingMarker = DgMap.find_marker(nid);
      previcon = DgMap.viewingMarker.getIcon();
      DgMap.viewingMarker.setImage(previcon.highlight);
      // catch this click and don't propagate
      propagate = false;
    }
  }  
  return propagate;
}

/**
 * iframe adsense play
 *  this is an attempt to get adsense content loaded when the content is loaded via the 
 *  DgMap.loadContent function - i.e. called via AJAX
 *  WARNING: this is AdSense API sensitive, changes to the Adsense working may break this!
 */

DgMap.adsense = function(nid) {
  var adsrc = $("iframe[src^='http://pagead2.googlesyndication.com']").attr("src");
  if (adsrc) {
    var http = adsrc.split('?');
    var args = http[1].split('&');
    var cor = (new Date).getTime();
    var a = Math.round((new Date).getTime()/1000);
    var vid = Math.round(Math.random()*2147483647)+"."+a;
    var sid = a;
    var hid = Math.round(Math.random()*2147483647);
    var e = new Date();
    var dt  = e.getTime();
    var lmt = Date.parse(document.lastModified)/1000;
    var nc =0
      for (var i=0; i<args.length; i++) {
	if (args[i].indexOf("dt=")==0) {args[i] = "dt="+dt;nc++;}
	if (args[i].indexOf("lmt=")==0) {args[i] = "lmt="+lmt;nc++;}
	if (args[i].indexOf("correlator=")==0) {args[i] = "correlator="+cor;nc++;}
	if (args[i].indexOf("url=http")==0) {args[i] = "url=http%3A%2F%2Fedinburghantiques.co.uk%2Fnode%2F"+nid;nc++;}
	if (args[i].indexOf("ga_vid=")==0) {args[i] = "ga_vid="+vid;nc++;}
	if (args[i].indexOf("ga_sid=")==0) {args[i] = "ga_sid="+sid;nc++;}
	if (args[i].indexOf("ga_hid=")==0) {args[i] = "ga_hid="+hid;nc++;}
      }
    if (nc==7) { // only do this is we found things as they should be
      // put it all back together
      var newsrc = http[0]+'?'+args[0];
      for (var i=1; i<args.length; i++) {
	newsrc += '&'+args[i];
      }
      $("iframe[src^='http://pagead2.googlesyndication.com']").attr("src",newsrc);
    }
  }
}


/**
 * attachjs
 *
 */

DgMap.attachjs = function() {
  // Setup some globals now the page is ready
  DgMap.infoDiv = document.getElementById("gMapInfo0");

  // preload the marker images
  for (var i=0;i<DgMap.preLoadImageSrcs.length;i++) {
    DgMap.preLoadImages.push(new Image());
    DgMap.preLoadImages[i].src = DgMap.homeurl + DgMap.preLoadImageSrcs[i];
  }

  // Check if this browser can hangle this API
  if (GBrowserIsCompatible()) { 
    // remove the No Javascript warning
    $("#gMapNoJS").remove();    // NOTE: using drupal's JQuery here

    // set up the map
    DgMap.loc = new GLatLng(55.9501609,-3.1997680);
    DgMap.ctl = new GSmallZoomControl();
    DgMap.map = new GMap2(document.getElementById("gMapBlock0"));
    DgMap.map.addControl(DgMap.ctl);
    DgMap.map.setCenter(DgMap.loc,12);

    // create our icons
    for (var i=0;i<((DgMap.preLoadImageSrcs.length-1)/2);i++) {
      DgMap.Icon[i] = new GIcon();
      DgMap.Icon[i].image = DgMap.preLoadImages[i*2].src;
      DgMap.Icon[i].highlight = DgMap.preLoadImages[(i*2)+1].src; // addition to the default object to define the highlight src
      DgMap.Icon[i].shadow = DgMap.preLoadImages[DgMap.preLoadImageSrcs.length-1].src;
      DgMap.Icon[i].iconSize = new GSize(30,35);
      DgMap.Icon[i].shadowSize = new GSize(30,35);
      DgMap.Icon[i].iconAnchor = new GPoint(19,33);
      DgMap.Icon[i].infoWindowAnchor = new GPoint(20,10);
    }

    if (DgMap.editMode()) {
      // if in edit mode, 

      // can we get a Geocoder to convert places and postcodes?
      var Gcoder = new GClientGeocoder();
      DgMap.postcde.onkeypress = function(e) { // catch enter key in the postcode field
	var key;
	if (window.event) key = window.event.keyCode; //IE
	else key = e.which;                           //Standard (firefox,Opera etc)
	if (key == 13) {
	  if ((Gcoder)&&(DgMap.postcde.value)) {
	    Gcoder.getLatLng(DgMap.postcde.value,
	      function(gloc) {
		if (DgMap.editmarker) {
		  DgMap.map.removeOverlay(DgMap.editmarker);
		}
		DgMap.editmarker = DgMap.createMarker(gloc,'Position Finder',DgMap.Icon[0],-1);
		DgMap.map.setCenter(gloc,12);
		DgMap.map.addOverlay(DgMap.editmarker);
	      });
	  }
	  return false; //don't propogate
	}
      };

      GEvent.addListener(DgMap.map, 'click', function(overlay,point) {
	var lat = point.lat();
	var lng = point.lng();
	DgMap.editlat.value = lat;
	DgMap.editlng.value = lng;
	if (DgMap.editmarker) {
	  DgMap.map.removeOverlay(DgMap.editmarker);
	}
	DgMap.editmarker = DgMap.createMarker(point,'Position Finder',DgMap.Icon[0],-1);
	DgMap.map.addOverlay(DgMap.editmarker);
      });
    } else {
      var initialnid = -2;
      var rnid = $("#ratenid").text();
      if (rnid) initialnid = parseInt(rnid);

      // if not in edit mode, draw the appropiate markers (current from XML)
      var request = GXmlHttp.create();
      //request.open("GET", "/sites/edinburghantiques.co.uk/modules/gmap/gmap.xml", true);
      request.open("GET", "/antiquesXML/markers/all", true);
      request.onreadystatechange = function() {
	if (request.readyState == 4) {
	  var xmlDoc = GXml.parse(request.responseText);
	  var markers = xmlDoc.documentElement.getElementsByTagName("marker");
	  for (var i = 0; i < markers.length; i++) {
	    // obtain the attribues of each marker
	    var nid = parseInt(markers[i].getAttribute("nid"));
	    var lat = parseFloat(markers[i].getAttribute("lat"));
	    var lng = parseFloat(markers[i].getAttribute("lng"));
	    var loc = new GLatLng(lat,lng);
	    var mode = parseInt(markers[i].getAttribute("mode"));
	    var text = markers[i].getAttribute("text");
	    // only create the marker if sensible lat/lang
	    if (!((Math.abs(lat)<0.01) && (Math.abs(lng)<0.01))) {
	      // create the marker
	      if ((mode>0)&&(mode<=((DgMap.preLoadImageSrcs.length-1)/2))) {
		var marker = DgMap.createMarker(loc,text,DgMap.Icon[mode-1],nid);
	      } else {
		// default marker is the last in the list we have!
		var marker = DgMap.createMarker(loc,text,DgMap.Icon[((DgMap.preLoadImageSrcs.length-1)/2)-1],nid);
	      }
	      marker.mode = mode;
	      DgMap.map.addOverlay(marker);
	      if (nid==initialnid) {
		// this page is being loaded with a specific marker in mind, 
		// so set that as the viewing marker
		DgMap.viewingMarker = marker;
		// and recenter and zoom the map:
		DgMap.map.setCenter(loc,15);
	      }
	    }
	  }
	  if (DgMap.viewingMarker) {
	    var hicon = DgMap.viewingMarker.getIcon();
	    DgMap.viewingMarker.setImage(hicon.highlight);
	  }
	}
      }
      request.send(null);

      // override certain links that may have appeared in the new conent, turning them into click events
      $(".ASexchange").click(DgMap.overrideLink);
    }
  }
}

/**
 * cleanup
 *   unload all the google maps stuff to be nice on browser memory etc
 */

DgMap.cleanup = function() {
  GUnload();
}


if (Drupal.jsEnabled) {
  $(document).ready(DgMap.attachjs);
  $(window).unload(DgMap.cleanup);
}
