//
// (C) 2008 By MCGrip Webdesign
// for the gmaps key see wrapper.tpl
//
var mcgm ={
 map: null,
 bounds: null,
 detailPage: null,
 mainPage: null,
 displaylinksPage: null, 
 markerCount: 0,

 
 
 init: function(){

    if (document.getElementById("gmap") && GBrowserIsCompatible()){
      // if found we are on the details page; if not we are on displaylinks.tpl
      mcgm.detailPage=document.getElementById("link");
      mcgm.mainPage=document.getElementById("mainpage");
      mcgm.displaylinksPage=document.getElementById("displaylinks");

      
            
      // initialize map
      mcgm.map = new GMap2(document.getElementById("gmap"));


      // collect boundary data
      mcgm.bounds = new GLatLngBounds();

      // set the map center and initial zoom level    
      mcgm.map.setCenter(new GLatLng(mcgmStartPoint[0], mcgmStartPoint[1]), mcgmStartPoint[2]);

              
      // add all articles below the gmap on displaylinks.tpl/details.tpl
      if (mcgm.mainPage && mcgmGmapPoints){
        mcgm.map.addControl(new GLargeMapControl());
        for (var i in mcgmGmapPoints){
          var d=new Object();
          d.point=new GLatLng(mcgmGmapPoints[i][2], mcgmGmapPoints[i][3]);
          d.onclick=function(marker, extraData){ location.href=extraData[0]; };
          d.onmouseover=function(marker, extraData){ marker.openInfoWindowHtml("<h2>"+extraData[1]+"</h2>"); }
          d.extraData=[mcgmGmapPoints[i][0], mcgmGmapPoints[i][0]];
          mcgm.addMarker(d);
        }
      }else if (mcgm.displaylinksPage){ // displaylinks.tpl
        mcgm.map.addControl(new GLargeMapControl());
        var h2s=this.getElementsByClassName("linkhltag");
        for (var i=0; i<h2s.length; i++){
          if (h2s[i].id.substring(0,4) == "link"){
            var linkId=h2s[i].id.substring("link".length);
            mcgm.addMarker(mcgm.getAddressData(linkId));
          }
        }
      }else if (mcgm.detailPage){
        mcgm.map.addControl(new GSmallMapControl());
        var addr=mcgm.getAddressData("");
        delete addr.onmouseover;
        delete addr.onclick;
        mcgm.addMarker(addr);
      }
      if (mcgm.markerCount == 0){
        // set the focus, the start point is centered
          mcgm.bounds = mcgm.map.getBounds();
      }
      
      // set position and zoom level, so that all markers fit the window
      mcgm.setFocus();
    }
  },



  addMarker: function(data) {
    if (!data.point){
      return;
    }
    
    if (!data.icon)
      data.icon=new GIcon(G_DEFAULT_ICON);

    mcgm.markerCount++;
    var marker=new GMarker(data.point, data.icon);

    if (data.onclick){
      GEvent.addListener(marker, "click", 
                         function() { data.onclick(marker, data.extraData); }
      );
    }
    
    if (data.onmouseover){
      GEvent.addListener(marker, "mouseover", 
                         function() { data.onmouseover(marker, data.extraData);  }
      );
    }


    mcgm.map.addOverlay(marker);
    mcgm.bounds.extend(data.point);
  },
 
 


  // set viewport to show all markers
  setFocus: function(){
    var zoomLevel=mcgm.map.getBoundsZoomLevel(mcgm.bounds);

   
    if (zoomLevel > 15){
	    zoomLevel=15;
    }
    if (zoomLevel > 1 && mcgm.markerCount > 0){
        zoomLevel--;   
    }
    
   	mcgm.map.setZoom(zoomLevel);
    mcgm.map.setCenter(mcgm.bounds.getCenter());
  },
 
  
 getAddressData: function(linkId){
      var ret=new Object();
      var coords=document.getElementById("link"+linkId+"coords").value.split("|");
      if (coords[0] == "linkcoords" && coords[1] != "" && coords[1] != 0 && coords[2] != "" && coords[2] != 0){   
          ret.point=new GLatLng(coords[1], coords[2]);
      }

      ret.onclick=function(marker){ location.href=ret.href; }
      ret.onmouseover=function(marker){
                        mcgm.bounds=mcgm.map.getBounds();
                        marker.openInfoWindowHtml(mcgm.generateHtml(linkId));
                     }
      
    
      ret.href=document.getElementById("link"+linkId+"hl").href;

      return ret;
  },
  
  
 

 
 // generates the content of the info window for links
 generateHtml: function(linkId){
    
    // create div for google info window
    var iw= document.createElement("div");
    iw.className="gmapInfoDiv";
    iw.id="link"+linkId+"gmapInfoDiv";
    
	//get the link to the details page
    var detailsurl=document.getElementById("link"+linkId+"details");
    if (detailsurl)
	 detailsurl=detailsurl.href;
    
    
    var hlLink=document.getElementById("link"+linkId+"hl").cloneNode(true);
    hlLink.href=detailsurl;
    var hl=document.createElement("h3");
    
    // check if we have a attachment image and insert it
    var img=document.getElementById("link"+linkId+"img");
    if (img){
      var cimg=img.cloneNode(true);
      cimg.className="gmapImg";
      
      var a=document.createElement("a");
      //a.href=document.getElementById("link"+linkId+"hl").href;
      a.href=detailsurl;
      a.appendChild(cimg);
      iw.appendChild(a);
      
    }

    // insert headline (linkDiv.id+"hl" is the a tag iside the <h2>
    hl.appendChild(hlLink);
    hl.className="gmapHl";
    iw.appendChild(hl);

    // insert rating
    var rating=document.getElementById("link"+linkId+"rating");
    if (rating){
      var crating=rating.cloneNode(true);
      crating.className="gmapRating";
      iw.appendChild(crating);
    }
    
    // insert description
    var desc=document.getElementById("link"+linkId+"desc")
    if (desc){
	    cdesc=desc.cloneNode(true);
	    cdesc.className="gmapDesc";
	    iw.appendChild(cdesc);
	}
    
    // insert address
    if (document.getElementById("link"+linkId+"addr")){
    	var addr=document.getElementById("link"+linkId+"addr").cloneNode(true);
    	addr.className="gmapAddr";
    	iw.appendChild(addr);
	}

    // more infos link
    var mil=document.createElement("a");
    var milText=document.createTextNode(mcgmMoreInfosText);
    mil.className="gmapMILink";
	mil.href=detailsurl;
    mil.appendChild(milText);
    iw.appendChild(mil);
    
	var clearBr=document.createElement("br");
	clearBr.className="clar";
    iw.appendChild(clearBr);

    return iw;
  },

  
  getElementsByClassName: function (className, tag, elm){
    /*
	http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
	Written by Jonathan Snook, http://www.snook.ca/jonathan
	Add-ons by Robert Nyman, http://www.robertnyman.com
    */ 
	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;
  }
  
};

var oldOnload=window.onload;
window.onload=function(){
  mcgm.init();
  if (typeof(oldOnload) == 'function')
    oldOnload();
}

