function Plottr( siteID, lat, lng, zoom, s ) {
  this.siteID    = siteID;      //siteMap
  this.baseIcon  = '';          //baseicon
  this.mapdiv    = '';          //div containing map
  this.map       = '';          //map
  this.mc        = 0;           //marker counter
  this.markers   = new Array(); //marker placeholder
  this.thumbnail = '';          //thumbnail placeholder
  this.maplat    = lat;         //latitude placeholder
  this.maplng    = lng;         //longitude placeholder
  this.mapzoom   = zoom;        //zoom placeholder
  this.s         = s;           //s placeholder
  this.init();
}

Plottr.prototype.init = function() {
  if( this.siteID <= 0 )
    this.siteID = 1;
  this.mapdiv = getObj( 'mapdiv' );
  
  if (GBrowserIsCompatible()) {
    this.setBaseIcon();
    this.setMap();
    if( this.s ) this.setMapListeners();
    this.initThumbnail();
    this.loadMapData();
  }
}

Plottr.prototype.setBaseIcon = function() {
  this.baseIcon = new GIcon();
  this.baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
  this.baseIcon.iconSize = new GSize(20, 34);
  this.baseIcon.shadowSize = new GSize(37, 34);
  this.baseIcon.iconAnchor = new GPoint(9, 34);
  this.baseIcon.infoWindowAnchor = new GPoint(9, 2);
  this.baseIcon.infoShadowAnchor = new GPoint(18, 25);    
}

Plottr.prototype.setMap = function() {
  this.map = new GMap2( this.mapdiv );
  this.map.setCenter(new GLatLng( this.maplat, this.maplng ), this.mapzoom );
  this.map.addControl(new GLargeMapControl());
  this.map.addControl(new GMapTypeControl());

  GMarker.prototype.id = false;
  GMarker.prototype.pID = false;
  GMarker.prototype.clh = false;
  
}

Plottr.prototype.setMapListeners = function() {
  clickListener = GEvent.addListener( this.map, "click", function( marker, point ) {
    if(!marker) {
    	var pointdata = new Array();
    	var marker = plottr.createMarker( point, this.baseIcon, 0, pointdata );
      this.map.addOverlay( marker );
      this.initInfoTabs( marker );
    }
  });
}

Plottr.prototype.initThumbnail = function() {
  this.thumbnail = document.createElement( "div" );
  this.mapdiv.appendChild( this.thumbnail );
  this.thumbnail.style.visibility = "hidden";    
}

Plottr.prototype.loadMapData = function() {
  //alert( "/mapdata.php?siteID=" + this.siteID );
  FL.responseHandler = 'plottr.plottMarkers';
  FL.handle( 'retrieve', '/mapdata.php?siteID=' + this.siteID + '&fromBlog=' + fromBlog );
  //GDownloadUrl( "/mapdata.php?siteID=" + this.siteID, Plottr.plottMarkers ); 
}

Plottr.prototype.plottMarkers = function( doc ) {
  var doc = URLDecode( doc );
  var datavars = this.getPointDataFromDoc( doc );
  for( i = 0; i < datavars.length; i++ ) {
    var data = datavars[i];
    this.setDataMarkers( data['points'], data['pointdata'] );
  }  
}

Plottr.prototype.getPointDataFromDoc = function( doc )  {
  var xmlDoc = GXml.parse(doc)
	var folders = xmlDoc.documentElement.getElementsByTagName( "folder" );
	var ret = new Array();
	
	for( var f = 0; f < folders.length; f++ ) {
	  var data = new Array();
	  
	  var pointdata = new Array();
	  var meta = folders[f].getElementsByTagName( "meta" );
	  if( meta.length ) {
	    var users = meta[0].getElementsByTagName( "user" );
	    var names = users[0].getElementsByTagName( "name" );
	    pointdata["name"] = names[0].childNodes[0].data;
	    var emails = users[0].getElementsByTagName( "email" );
	    pointdata["email"] = emails[0].childNodes[0].data;
	  }
	  data['pointdata'] = pointdata;
	  
	  var points = folders[f].getElementsByTagName("point");
	  data['points'] = points;
	  
	  ret[f] = data;
	  //plottr.setDataMarkers( points, pointdata );
	}
	return ret;
}  

Plottr.prototype.setDataMarkers= function( points, pointdata ) {
	for (var i = 0; i < points.length; i++) {
    var pointdata = this.getPointData( pointdata, points[i] );
    
	  var point  = new GLatLng( pointdata["lat"],pointdata["lng"] );
	  var marker = this.createMarker( point, this.baseIcon, pointdata["pointID"], pointdata );
	  
	  this.map.addOverlay(marker);
	  //this.markers.push( marker );
	}    
}

Plottr.prototype.getPointData = function( pointdata, point ) {
  pointdata["pointID"] = point.getAttribute( "id" );
  var lng, lat, alt, date, title, introduction, body, name, desc, thumb;
	var latn = point.getElementsByTagName( "latitude" );
	pointdata["lat"] = latn.length ? latn[0].childNodes[0].data : "";
	var lngn = point.getElementsByTagName( "longitude" );
	pointdata["lng"] = lngn.length ? lngn[0].childNodes[0].data : "";
  
  var data = point.getElementsByTagName( "data" );
  if( data.length ) {
    var dates = data[0].getElementsByTagName( "date" );
    pointdata["date"] = dates.length ? dates[0].childNodes[0].data : "";
    
    var titles = data[0].getElementsByTagName( "title" );
    pointdata["title"] = titles.length && titles[0].childNodes[0].length ? titles[0].childNodes[0].data : "";
    var introductions = data[0].getElementsByTagName( "introduction" );
    pointdata["introduction"] = introductions.length && introductions[0].childNodes.length ? introductions[0].childNodes[0].data : "";                            
    var bodies = data[0].getElementsByTagName( "body" );
    pointdata["body"] = bodies.length && bodies[0].childNodes.length ? bodies[0].childNodes[0].data : "";
    
    var images = data[0].getElementsByTagName( "images" );
    var image = images[0].getElementsByTagName( "image" );
    pointdata["thumb"] = image.length ? image[0].childNodes[0].data : "";
  }
  
  return pointdata;
}

Plottr.prototype.createMarker = function(point, baseIcon, pID, pointdata ) {
	//increase markercounter
	this.mc++;

  var icon = new GIcon( this.baseIcon ); 
  icon.image = "http://www.plottr.com/if/map/images/marker" + this.mc + ".png";	
	
  var opts = new Object();
  opts.clickable = true;
  if( this.s ) opts.draggable = true;
  //opts.icon = icon; //een custom marker geeft een rare fout
  opts.title = pointdata["title"]; 
  
	var marker = new GMarker( point, opts );
	marker.id = new String( "id" + this.mc );
	marker.pID = pID;
	
	var thumb = '';
	if( pointdata["thumb"] ) thumb = "<img src=\"" + pointdata["thumb"] + "\" width=\"80\" height=\"60\">";
	marker.thumbnail = "<div class=\"tooltip\">" + thumb + "</div>";
  
  	 
  GEvent.addListener(marker,"mouseover", function() {
    plottr.showThumbnail(marker);
  });        
  
  GEvent.addListener(marker,"mouseout", function() {
	  plottr.thumbnail.style.visibility="hidden"
  });

  GEvent.addListener(marker, "dragstart", function() {
  	plottr.thumbnail.style.visibility="hidden"
    plottr.map.closeInfoWindow();
    });
  
  GEvent.addListener(marker, "dragend", function() {
  	var latlng = marker.getPoint();
  	var lat = latlng.lat();
  	lat = Math.round( lat * 100000 ) / 100000;
  	var lng = latlng.lng();
  	lng = Math.round( lng * 100000 ) / 100000;      	
  	marker.openInfoWindowHtml("<div class=\"infowindow\"><iframe frameborder=\"0\" noresize scrolling=\"no\" src=\"/modules/site/saveblogfile.php?action=form&type=newcoos&lat=" + lat + "&lng=" + lng + "&pID=" + pID + "\" class=\"blogiframe\" id=\"myblogiframe\" name=\"myblogiframe\"></iframe></div>" );
    //wacht tot de infowindow iframe is geladen
    window.setTimeout( "plottr.setLatLng( " + pID + ", " + lat + ", " + lng + ")", 200 );
  });
  
  marker.clh = GEvent.addListener(marker, "click", function() {
    //hier moet de infowindow gevuld worden.
    var z = plottr.map.getZoom();
    if( z < 15 )
      z = 15;
    plottr.map.setCenter( marker.getPoint(), z );
    plottr.initInfoTabs( marker );
    plottr.thumbnail.style.visibility="hidden"
  });
  
  plottr.markers[this.mc] = marker;
	
	return marker;
}

Plottr.prototype.showThumbnail = function( marker ) {
  this.thumbnail.innerHTML = marker.thumbnail;
  var point  = this.map.getCurrentMapType().getProjection().fromLatLngToPixel(this.map.getBounds().getSouthWest(),this.map.getZoom());
  var offset = this.map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),this.map.getZoom());
  var anchor = marker.getIcon().iconAnchor;
  var width  = marker.getIcon().iconSize.width;
  var pos    = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(offset.x - point.x - anchor.x + width,- offset.y + point.y +anchor.y)); 
  pos.apply( this.thumbnail );
  this.thumbnail.style.visibility="visible";
}

Plottr.prototype.createInfoTabs = function( pointdata ) {
  var infoTabs = [
    new GInfoWindowTab("Plott spot", "<div class=\"infowindow\"><p><div id=\"img_" + pointdata["pointID"] + "\"><a href=\"#\" onclick=\"enlargeImage( '" + pointdata["thumb"] + "', " + pointdata["pointID"] + " );\"><img src=\"" + pointdata["thumb"] + "\" align=\"left\" style=\"border:0px;padding-right:5px;\" width=\"160\" alt=\"" + pointdata["title"] + "\" /></a></div><b>" + pointdata["title"] + "</b><br/><br/>" + pointdata["introduction"] + "</p></div>"),
    new GInfoWindowTab("Details",    "<div class=\"infowindow\"><p><b>Geo info</b><br/>Latitude: " + pointdata["lat"] + "<br/>Longitude: " + pointdata["lng"] + "</p><p><b>Plott info</b><br/>Plotted at: " + pointdata["date"] + "<br/>Plotted by: " + pointdata["name"] + "</p></div>")
  ];
  if( this.s ) {
    infoTabs[2] = new GInfoWindowTab("Edit",       "<div class=\"infowindow\"><iframe frameborder=\"0\" noresize scrolling=\"no\" src=\"/modules/site/saveblogfile.php?action=form&pID=" + pointdata["pointID"] + "\" class=\"blogiframe\" id=\"myblogiframe\" name=\"myblogiframe\"></iframe></div>");
    infoTabs[3] = new GInfoWindowTab("Delete",     "<div class=\"infowindow\"><iframe frameborder=\"0\" noresize scrolling=\"no\" src=\"/modules/site/deleteblog.php?pID=" + pointdata["pointID"] + "\" class=\"blogiframe\" id=\"mydeliframe\" name=\"mydeliframe\"></iframe></div>");
  }
  return infoTabs;    
}

Plottr.prototype.openInfoTabs = function( marker, pointdata ) {
  var infoTabs = this.createInfoTabs( pointdata );
  marker.openInfoWindowTabsHtml( infoTabs );
}

Plottr.prototype.initInfoTabs = function( marker ) {
	var pID = marker.pID;

  processTabData = function( doc ) {
    var doc = URLDecode( doc );
    var datavars = plottr.getPointDataFromDoc( doc );
    for( var i = 0; i < datavars.length; i++ ) {
 	    var points = datavars[i]['points'];
 	    var pointdata = datavars[i]['pointdata'];
 	    for (var j = 0; j < points.length; j++ ) {
 	       var pointdata = plottr.getPointData( pointdata, points[j] );
 	       if( pointdata["lat"] == '' ) 
 	         pointdata["lat"] = plottr.getMarkerLat( marker );
 	       if( pointdata["lng"] == '' ) 
 	         pointdata["lng"] = plottr.getMarkerLng( marker );
 	         
         plottr.openInfoTabs( marker, pointdata );
      }
    }    
  } 
	
	if( pID > 0 ) {
	  GDownloadUrl("/mapdata.php?siteID=7&unplotted=1&pID=" + pID,processTabData);
	} else {
    //new marker
    var pointdata = new Array();
    pointdata["thumb"] = '';
    pointdata["name"] = '';
    pointdata["email"] = '';
    pointdata["title"] = '';
    pointdata["introduction"] = '';
    pointdata["body"] = '';
    var latlng = marker.getPoint();
  	var lat = latlng.lat();
  	lat = Math.round( lat * 100000 ) / 100000;
  	pointdata["lat"] = lat;
  	var lng = latlng.lng();
  	lng = Math.round( lng * 100000 ) / 100000;
  	pointdata["lng"] = lng;
  	pointdata["date"] = 'now';
  	
  	var infoTabs = this.createInfoTabs( pointdata );
    marker.openInfoWindowTabsHtml(infoTabs);
    window.setTimeout( "plottr.selectTab( 2 )", 100 );
    window.setTimeout( "plottr.setLatLng('', " + lat + ", " + lng + " )", 1000 );
    window.setTimeout( "plottr.setMarkerID( '" + marker.id + "' )", 500 );
  }
}

Plottr.prototype.selectTab = function(t) {
	var iw = this.map.getInfoWindow();
  iw.selectTab( t );            
}

Plottr.prototype.setLatLng = function(pID, lat, lng ) {
  var iframeDoc = this.getIframe( "myblogiframe" );
	if( !isObject( iframeDoc.getElementById( "lat_" + pID ) ) ) {
    window.setTimeout( "plottr.setLatLng( " + pID + ", " + lat + ", " + lng + ")", 200 );
  } else {
	  iframeDoc.getElementById( "lat_" + pID ).value = lat;
    iframeDoc.getElementById( "lng_" + pID ).value = lng;
  }
}
Plottr.prototype.setTitle = function(pID, title ) {
  var iframeDoc = this.getIframe( "myblogiframe" );
	if( !isObject( iframeDoc.getElementById( "title_" + pID ) ) ) {
    window.setTimeout( "plottr.setTitle( " + pID + ", " + title + ")", 200 );
  } else {
	  iframeDoc.getElementById( "title_" + pID ).value = title;
  }
}
Plottr.prototype.setMarkerID = function( mID ) {
  var iframeDoc = this.getIframe( "myblogiframe" );
	if( !isObject( iframeDoc.getElementById( "markerID" ) ) ) {
    window.setTimeout( "plottr.setMarkerID( " + mID + " )", 200 );
  } else {
	  iframeDoc.getElementById( "markerID" ).value = mID;
  }  
  
}

Plottr.prototype.getIframe = function( iframeID ) {
  var iframe = getObj( iframeID );                                  
  
  if(iframe.contentDocument) { // For NS6
    return iframe.contentDocument;
  } else if (iframe.contentWindow) { // For IE5.5 and IE6
    return iframe.contentWindow.document;
  } else if (iframe.document) { // For IE5
    return iframe.document;
  } else {
    return true;
  }
}

Plottr.prototype.findMarker = function( mID ) {
  var markers = plottr.markers;
	for( i = 0; i < markers.length; i++ ) {
		var marker = markers[i];
		if( marker.id = mID ) {
		  return marker;  	
		}
	}
	return false;	
}

Plottr.prototype.findMarkerByPID = function( pID ) {
  var arLen = this.markers.length;
  for ( var i=0, len=arLen; i<len; ++i ){
    if( !isUndefined( this.markers[i] ) && this.markers[i].pID == pID ) {
      return this.markers[i];
    }
  }

	return false;	
}
Plottr.prototype.saveData = function ( pID ) {
  var iframeDoc = this.getIframe( "myblogiframe" );
  
  iframeDoc.getElementById( "save_" + pID ).disabled = true;
  var iform = iframeDoc.getElementById( "blogform_" + pID )
  iform.submit();
}

Plottr.prototype.refreshData = function( pID ) {
  this.map.closeInfoWindow();
	//var m = this.findMarkerByPID( pID );
	//plottr.initInfoTabs( m );
	//FL.responseHandler = 'plottr.showData';
  //FL.handle( 'retrieve', '/modules/site/getblog.php?pID=' + pID );	
}

Plottr.prototype.showData = function( response ) {
  //response bevat de nieuwe tab inhouden
  eval( URLDecode( response ) );  
  
  var iw = this.map.getInfoWindow();
  var ccs = iw.getContentContainers();
  for( i = 0; i < ccs.length; i++ ) {
    var cc = ccs[i];
    cc.innerHTML = tabs[i];
  }
  iw.selectTab( 0 );
}

Plottr.prototype.getMarkerLat = function( marker ) {
  var markerPoint =  marker.getPoint();
  return Math.round( markerPoint.lat() * 100000 ) / 100000;
}
Plottr.prototype.getMarkerLng = function( marker ) {
  var markerPoint =  marker.getPoint();
  return Math.round( markerPoint.lng() * 100000 ) / 100000;
}

Plottr.prototype.removeClickListener = function() {
  GEvent.removeListener( clickListener );
}
