var jabberIconList;
var MAP = null;
var SHOW_EGG = false;
var EGGS = null;
var stats_away, stats_xa, stats_online, stats_dnd, stats_offline;
var SHOW_OFFLINE = false;
var BOUNDS = null;
var SHOW_IN_VIEW = true;
var ICON_BASE = "http://map.butterfat.net/images/objects/";
var SHOWING_OBJECTS = false;
var OBJECT_TYPES = null;
var JIDS = null;

Butterlate.setTextDomain("messages","/lang");
setInterval("reLoadMap()",30000);
window.onresize=reLoadMap;

function zoomOnAddy() { 
  var addy=document.getElementById("addy").value;
  if(addy=="") alert(_("The address cannot be blank."));
  else {
    document.getElementById("addy").value = _("Searching...");
    var request = GXmlHttp.create();
    request.open("POST", "getCoordinates.php", true);
    request.onreadystatechange = function() {
      if (request.readyState == 4) {
        var xmlDoc = request.responseXML;
        var code = xmlDoc.documentElement.getAttribute("code");
        if(code!="1") alert(__("Could not find the address \"%s\"",new Array(addy)));
        else {
          var lon = xmlDoc.documentElement.getAttribute("lon");
          var lat = xmlDoc.documentElement.getAttribute("lat");
          var point = new GPoint(lon,lat);
          SHOWING_OBJECTS = true; // dirty trick to keep from clearing & redrawing overlays while zooming
          MAP.centerAndZoom(point, 1);
          var marker = new GMarker(point);
          MAP.addOverlay(marker);
          marker.openInfoWindowHtml("<b>"+addy+"<br />(roughly)</b>");
          SHOWING_OBJECTS = false; // end of the dirty trick
          document.getElementById("addy").value = _("Type in address...");
        }
      }
    };
    request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    request.send("addy="+escape(addy));
  }
}

function clearMessage() {
  makeInvisible(document.getElementById("message"));
}

function showComments(object_id) {
  // seems pretty ridiculous to clear it before filling it, yet here we are
  clearMessage();
  var message = document.getElementById("message");
  var value = "<a class=\"right_floater\" style=\"background-color: #FFFFFF; font-size: 14pt;\" title=\""+_("Close window")+"\" onclick=\"clearMessage();\">X</a><br />";
  value+="<iframe src=\"http://map.butterfat.net/comments.php?object_id="+object_id+"\" class=\"iframe\" />";
  message.innerHTML=value;
  makeVisible(message);
}

function showTypeComments(object_type_id) {
  // seems pretty ridiculous to clear it before filling it, yet here we are
  clearMessage();
  var message = document.getElementById("message");
  var value = "<a class=\"right_floater\" style=\"background-color: #FFFFFF; font-size: 14pt;\" title=\""+_("Close window")+"\" onclick=\"clearMessage();\">X</a><br />";
  value+="<iframe src=\"http://map.butterfat.net/comments.php?type_id="+object_type_id+"\" class=\"iframe\" />";
  message.innerHTML=value;
  makeVisible(message);
}

function showingObjects(value) {
  SHOWING_OBJECTS = value;
  if(value) clearMap();
  else showMap();
}

function handleObjects() {

  //jids
  JIDS = new Array();
  var request = GXmlHttp.create();
  request.open("GET", "object_jids.php", true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      var info = "";
      var xmlDoc = request.responseXML;
      var jids = xmlDoc.documentElement.getElementsByTagName("jid");
      for (var i = 0; i < jids.length; i++) {
        info+=makeObjectJID(jids[i].getAttribute("value"));
        JIDS.push(jids[i].getAttribute("value"));
      }
      info = (info=="") ? "-none-" : info;
      document.getElementById("object_jids").innerHTML = info;
    }
  };
  request.send(null);

  // object types
  OBJECT_TYPES = new Array();
  var nrequest = GXmlHttp.create();
  nrequest.open("GET", "object_types.php", true);
  nrequest.onreadystatechange = function() {
    if (nrequest.readyState == 4) {
      var info = "";
      var xmlDoc = nrequest.responseXML;
      var types = xmlDoc.documentElement.getElementsByTagName("type");
      for (var i = 0; i < types.length; i++) {
        var type = new ObjectType(types[i].getAttribute("name"),types[i].getAttribute("id"));
        type.icon = types[i].getAttribute("icon");
        type.description = (types[i].getAttribute("description")=="") ? _("Unknown") : types[i].getAttribute("description");
        type.cnumber = types[i].getAttribute("cnumber");
        info+=makeObjectType(type);
        OBJECT_TYPES.push(type.id);
      }
      info = (info=="") ? _("-none-") : info;
      document.getElementById("object_types").innerHTML = info;
    }
  };
  nrequest.send(null);

}

function ObjectType(name,id) {
  this.name = name;
  this.id = id;
  this.icon = "";
  this.description = "";
  this.cnumber = "0";
}

function MapObject(name,point,type,icon) {
  this.name = name;
  this.point = point;
  this.type = type;
  this.icon = icon;
  this.id = "";
  this.cnumber = "0";
}

function makeObjectType(object) {
  var info = "<a onclick=\"showObjectsByType("+object.id+");\" title=\""+htmlify(object.description)+"\"><img class=\"icon\" style=\"border: 1px solid;\" src=\""+ICON_BASE+object.icon+"\"></a>  <a title=\"comments\" onclick=\"showTypeComments('"+object.id+"');\">["+object.cnumber+"]</a> <a onclick=\"showObjectsByType("+object.id+");\" title=\""+htmlify(object.description)+"\">"+object.name+"</a><br />";
  info+="<div id=\"object_list:"+object.id+"\"></div>";
  return info;
}

function makeObjectJID(jid) {
  return "<a onclick=\"showObjectsByJID('"+jid+"');\" >"+jid+"</a><br /><div id=\"jid:"+jid+"\" ></div>";
}

function makeObjectMarker(object) {
  var icon = new GIcon();
  icon.image = ICON_BASE+object.icon;
  icon.iconSize = new GSize(16, 16);
  icon.iconAnchor = new GPoint(10, 20);
  icon.infoWindowAnchor = new GPoint(5, 1);
  var marker = new GMarker(object.point,icon);
  //var markerHtml = "<b>"+_("Name")+":</b> "+object.name+"<br /><b>"+_("Type")+":</b> "+object.type;
  var markerHtml="<div style=\"width: 300px;\"><center><a onclick=\"showComments('"+object.id+"');\">"+__("Comments (%s)",new Array(object.cnumber))+"</a></center></div><iframe frameborder=\"0\" src=\"object_properties_pane.php?show=1&object_id="+object.id+"\" class=\"small_iframe\" />";
  GEvent.addListener(marker,'click',function() { marker.openInfoWindowHtml(markerHtml); });
  return marker;
}

function showObjectsByJID(jid) {
  clearMap();

  for(var i=0; i<JIDS.length; i++)
    makeInvisible(document.getElementById("jid:"+JIDS[i]));

  var info="";
  var request = GXmlHttp.create();
  request.open("POST", "objects.php", true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      var xmlDoc = request.responseXML;
      var positions = xmlDoc.documentElement.getElementsByTagName("position");
      for (var i = 0; i < positions.length; i++) {
        var point = new GPoint(parseFloat(positions[i].getAttribute("lon")),
                               parseFloat(positions[i].getAttribute("lat")));
        var mobject = new MapObject(positions[i].getAttribute("name"),point,positions[i].getAttribute("type"),positions[i].getAttribute("icon"));
        mobject.id = positions[i].getAttribute("object_id");
        mobject.cnumber = positions[i].getAttribute("cnumber");
	info+=makeObjectInfo(mobject); 
        var marker = makeObjectMarker(mobject);
	MAP.addOverlay(marker);
      }
      var list = document.getElementById("jid:"+jid);
      list.innerHTML = "<table border=\"0\">"+info+"</table>";
      makeVisible(list);
    }
  };
  request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  request.send("jid="+jid);
}

function showObjectsByType(type_id) {
  clearMap();

  for(var i=0; i<OBJECT_TYPES.length; i++)
    makeInvisible(document.getElementById("object_list:"+OBJECT_TYPES[i]));

  var info="";
  var request = GXmlHttp.create();
  request.open("POST", "objects.php", true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      var xmlDoc = request.responseXML;
      var positions = xmlDoc.documentElement.getElementsByTagName("position");
      for (var i = 0; i < positions.length; i++) {
        var point = new GPoint(parseFloat(positions[i].getAttribute("lon")),
                               parseFloat(positions[i].getAttribute("lat")));
        var mobject = new MapObject(positions[i].getAttribute("name"),point,positions[i].getAttribute("type"),positions[i].getAttribute("icon"));
        mobject.id = positions[i].getAttribute("object_id");
        mobject.cnumber = positions[i].getAttribute("cnumber");
        info+= makeObjectInfo(mobject);
        var marker=makeObjectMarker(mobject);
        MAP.addOverlay(marker);
      }
      var list = document.getElementById("object_list:"+type_id);
      list.innerHTML="<table border=\"0\">"+info+"</table>";
      makeVisible(list);
    }
  };
  request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  request.send("type_id="+type_id);
}

function makeVisible(element) {
  element.style.display = "block";
  element.style.visibility = "visible";
}

function makeInvisible(element) {
  element.style.display = "none";
  element.style.visibility = "hidden";
}

function toggleVisibility(element_id) {
  var element=document.getElementById(element_id);
  if(element.style.visibility=="hidden" || element.style.visibility=="") makeVisible(element);
  else makeInvisible(element);
}

function makeObjectInfo(mobject) {
  var info = "<tr><td valign=\"middle\"><a target=\"_BLANK\" href=\""+getLink("object_id="+mobject.id)+"\"><img src=\""+getImageLink("link")+"\" border=\"0\" /></a></td>";
  info+="<td valign=\"middle\"><a title=\"comments\" onclick=\"showComments('"+mobject.id+"');\">["+mobject.cnumber+"]</a></td>";
  info+="<td valign=\"middle\"><a onclick=\"objectCenterAndZoom("+mobject.point.x+","+mobject.point.y+",'"+makeFunctionSafe(htmlify(mobject.name))+"','"+makeFunctionSafe(htmlify(mobject.type))+"','"+mobject.id+"','"+mobject.cnumber+"');\" >"+mobject.name+"</a></td></tr>";
  return info;
}

function objectCenterAndZoom(x,y,name,type,object_id,object_cnumber) {
  MAP.centerAndZoom(new GPoint(x,y),2);
  //var markerHtml = "<b>"+_("Name")+":</b> "+name+"<br /><b>"+_("Type")+":</b> "+type;
  var markerHtml="<div style=\"width: 300px;\"><center><a onclick=\"showComments('"+object_id+"');\">"+__("Comments (%s)",new Array(object_cnumber))+"</a></center></div><iframe frameborder=\"0\" src=\"object_properties_pane.php?show=1&object_id="+object_id+"\" class=\"small_iframe\" />";
  MAP.openInfoWindowHtml(new GPoint(x,y),markerHtml,new GSize(-5,-20));
}

function clearMap() {
  MAP.clearOverlays();
}

// icon types:
// online, away, xa, dnd, big (big is for multiple people in a region, defaults to online)
function makeIcon(type) {
  var icon = new GIcon();
  if(type=="away") {
    icon.image = getImageLink(type);
    //icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    icon.iconSize = new GSize(16, 16);
    icon.shadowSize = new GSize(22, 20);
    icon.iconAnchor = new GPoint(10, 20);
    icon.infoWindowAnchor = new GPoint(5, 1);
  } else if(type=="xa") {
    icon.image = getImageLink(type);
    //icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    icon.iconSize = new GSize(16, 16);
    icon.shadowSize = new GSize(22, 20);
    icon.iconAnchor = new GPoint(10, 20);
    icon.infoWindowAnchor = new GPoint(5, 1);
  } else if(type=="dnd") {
    icon.image = getImageLink(type);
    //icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    icon.iconSize = new GSize(16, 16);
    icon.shadowSize = new GSize(22, 20);
    icon.iconAnchor = new GPoint(10, 20);
    icon.infoWindowAnchor = new GPoint(5, 1);
  } else if(type=="big") {
    icon.image = getImageLink(type);
    //icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    icon.iconSize = new GSize(26,26);
    //icon.iconSize = new GSize(20,20);
    icon.shadowSize = new GSize(16, 20);
    icon.iconAnchor = new GPoint(10, 20);
    icon.infoWindowAnchor = new GPoint(5, 1);
  } else if(type=="egg") {
    icon.image = getImageLink(type);
    //icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    icon.iconSize = new GSize(16,16);
    icon.shadowSize = new GSize(16, 20);
    icon.iconAnchor = new GPoint(10, 20);
    icon.infoWindowAnchor = new GPoint(5, 1);
  } else if(type=="offline") {
    icon.image = getImageLink(type);
    //icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    icon.iconSize = new GSize(16,16);
    //icon.iconSize = new GSize(20,20);
    icon.shadowSize = new GSize(16, 20);
    icon.iconAnchor = new GPoint(10, 20);
    icon.infoWindowAnchor = new GPoint(5, 1);
  } else {
    icon.image = getImageLink("online");
    //icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    icon.iconSize = new GSize(16,16);
    icon.shadowSize = new GSize(22, 20);
    icon.iconAnchor = new GPoint(10, 20);
    icon.infoWindowAnchor = new GPoint(5, 1);
  }
  return icon;
}

function getImageLink(type) {
  var location = "";
  if(type=="away") {
    location = "/images/available-away.gif";
  } else if(type=="xa") {
    location = "/images/available-xa.gif";
  } else if(type=="dnd") {
    location = "/images/available-dnd.gif";
  } else if(type=="big") {
    location = "/images/available.gif";
  } else if(type=="egg") {
    location = "/images/egg.gif";
  } else if(type=="link") {
    location = "/images/link.png";
  } else if(type=="offline") {
    location = "/images/available-broken.gif";
  } else if(type=="magnify") {
    location = "/images/magnifying_glass.gif";
  } else {
    location = "/images/available.gif";
  }
  return location;
}

function Member(jid,resource,state,description,updated) {
  this.jid = jid;
  this.resource = resource; 
  this.state=state;
  this.description = description;
  this.updated = updated;
}

function JabberIcon(type,members,id,point) {
  this.type = type;
  this.members=members;
  this.id = id;
  this.point = point;
}

JabberIcon.prototype.addMember = function(member) {
  this.members.push(member);
}

function addMemberToList(member,point) {
  var added = false;

  // if this member is close to another, add them to that icon
  for(var index=0; index<jabberIconList.length; index++) {
    var icon = jabberIconList[index];
    if(isCloseTo(point,icon.point)) {
      icon.addMember(member);
      // now we have a big bulb, since more than one member
      icon.type = "big";
      added=true;
      break;
    }
  }

  // if creating new icon
  if(!added) {
    var members = new Array();
    var size = jabberIconList.length;
    members.push(member);
    jabberIconList[size]=new JabberIcon(member.state,members,size,point);
  }

}

// determine if two points are close to each other - MAP object must be initialized by now!!!!
function isCloseTo(one,two) {
  // the next line is FRIGGIN MAGIC - don't touch it or bmuller will get very, very, very angry
  var distanceMagic = new Array(.0004,.0004,.0005,.002,.008,.008,.01,.015,.06,.06,.06,.06,.5,3,5,5,5);
  var zoomLevel = MAP.getZoomLevel();
  if(zoomLevel>=distanceMagic.length) zoomLevel=distanceMagic.length - 1;
  distance = distanceMagic[zoomLevel];

  var xdiff = Math.abs(one.x-two.x);
  var ydiff = Math.abs(one.y-two.y);
  return (xdiff < distance && ydiff < distance);
}

function showView(x,y,zoom) {
  MAP.centerAndZoom(new GPoint(x,y), zoom);
}

function onZoomOrMove(reason) {
  BOUNDS = MAP.getBoundsLatLng();  

  // need to show new folks (zoom apparently triggers move)
  if(reason!="zoom") showMap();

}

function showMap() {
  if(SHOWING_OBJECTS) return;
  jabberIconList = new Array();

  // determine if this is the first load
  var isFirstLoad = (MAP==null);

  // if we're about to zoom in on a specific user, zoom in first to get the resolution right
  // so that we don't end up zooming in on the wrong cluster icon
  var urlWhole = unescape(top.location.search.substring(1)).split(/=/);
  var urlJid="";
  var urlResource="";
  var object_id="";
  var shouldZoom = false;
  if(urlWhole[0]=="jid") {
    var urlWholeJid = urlWhole[1];
    var pairs = urlWholeJid.split(/:/);
    urlJid = (pairs[0]==urlWholeJid) ? "" : pairs[0]; 
    urlResource = pairs[1];
    shouldZoom = true; 
    SHOW_IN_VIEW = false;
    SHOW_OFFLINE = true;
  } else if(urlWhole[0]=="object_id") {
    object_id = urlWhole[1];
    shouldZoom = true;
  }

  var zoom = (shouldZoom) ? 1 : 13;

  // don't make a new map unless we have to
  if(isFirstLoad) {
    var map = new GMap(document.getElementById("map"));
    MAP = map;
    map.setMapType(G_HYBRID_TYPE);
    map.centerAndZoom(new GPoint(-94.21875, 37.71859032558813), zoom);
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    GEvent.addListener(map,"zoom",function(oldZoomLevel, newZoomLevel) { resetMessage(); onZoomOrMove("zoom"); })
    GEvent.addListener(map,"moveend",function() { onZoomOrMove("move"); });
    BOUNDS = map.getBoundsLatLng();  

    resetMessage();

    var b = map.ownerDocument.createElement('div');
    b.id = 'itlabMessage';
    b.style.position='absolute';
    b.style.right='5px';
    b.style.bottom = '20px';
    b.style.backgroundColor='#f2efe9';
    b.style.zIndex=5500;
    map.div.parentNode.appendChild(b);
    var c=0.8;
    var d=document.getElementById(b.id);
    d.innerHTML="<a href=\"http://www.butterfat.net\">"+_("Made in the USA")+"</a>";
    if(typeof(d.style.filter)=='string'){d.style.filter='alpha(opacity:'+c*100+')';}
    if(typeof(d.style.KHTMLOpacity)=='string'){d.style.KHTMLOpacity=c;}
    if(typeof(d.style.MozOpacity)=='string'){d.style.MozOpacity=c;}
    if(typeof(d.style.opacity)=='string'){d.style.opacity=c;}

    var c=0.94;
    var d = MAP.ownerDocument.createElement('div');
    d.setAttribute("class","map_message");
    d.style.left = "100px";
    d.style.top =  "20px";
    d.style['width'] = "50%";
    d.style['height'] = "70%";
    //d.style['backgroundColor'] = "#FFFFFF";
    d.id = 'message';
    d.style.position='absolute';
    d.style.zIndex=5500;
    if(typeof(d.style.filter)=='string'){d.style.filter='alpha(opacity:'+c*100+')';}
    if(typeof(d.style.KHTMLOpacity)=='string'){d.style.KHTMLOpacity=c;}
    if(typeof(d.style.MozOpacity)=='string'){d.style.MozOpacity=c;}
    if(typeof(d.style.opacity)=='string'){d.style.opacity=c;}
    MAP.div.parentNode.appendChild(d);

    handleObjects();
  } else {
    map = MAP;
  }

  // clear stats
  stats_away = 0; stats_offline = 0; stats_xa = 0; stats_online = 0; stats_dnd = 0;

  var request = GXmlHttp.create();
  request.open("POST", "positions.php", true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      map.clearOverlays();
      var xmlDoc = request.responseXML;
      var positions = xmlDoc.documentElement.getElementsByTagName("position");
      for (var i = 0; i < positions.length; i++) {
        var point = new GPoint(parseFloat(positions[i].getAttribute("lon")),
                               parseFloat(positions[i].getAttribute("lat")));
	var jid = positions[i].getAttribute("jid");
	var resource = positions[i].getAttribute("resource");
        var state = positions[i].getAttribute("state");
        var description = positions[i].getAttribute("description");
        var updated = positions[i].getAttribute("updated");

        if(state!="offline" || (state=="offline" && SHOW_OFFLINE)) {
          var member = new Member(jid,resource,state,description,updated);
          addMemberToList(member,point);
          addStateToStats(state);       
        }
      }

      // now paint all the icons
      for(var j=0;j<jabberIconList.length;j++) {
	var jabberIcon = jabberIconList[j];
        var icon = makeIcon(jabberIcon.type);
        var marker = makeMarker(jabberIcon.point,icon,j);
        map.addOverlay(marker);
      }
 
      // show stats now that you have the totals
      showStats();

      // now check and see if we're supposed to focus on any specific jid
      if(isFirstLoad && urlJid!="" && urlResource!="") {
        var jidIndex = getJabberIconListIndex(urlJid,urlResource);      
        // if the user is currently logged in, show them
        if(jidIndex!=-1) {
          showIconInfo(jidIndex);
          mapMember(jidIndex);
        } else {
          var message = __("The user \"%s\" is not currently signed on or is using a different resource than \"%s\"",new Array(urlJid,urlResource));
          alert(message);
          map.zoomTo(13);
        }
      }


      // now check and see if we're supposed to focus on any specific object
      if(isFirstLoad && object_id!="") {
        showTab(2,3); 
        showingObjects(true);
        centerAndZoomOnObject(object_id);
      }


    }
  }
  var send = "minX="+BOUNDS.minX+"&minY="+BOUNDS.minY+"&maxX="+BOUNDS.maxX+"&maxY="+BOUNDS.maxY;
  if(SHOW_OFFLINE) send+="&all=1";
  if(SHOW_IN_VIEW) send+="&showinview=1";
  request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  request.send(send);

  ///this section does not exist///
  if(map.getZoomLevel()<=2) {
    var icon = new GIcon();
    icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
    icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    icon.iconSize = new GSize(12, 20);
    icon.shadowSize = new GSize(22, 20);
    icon.iconAnchor = new GPoint(6, 20);
    icon.infoWindowAnchor = new GPoint(5, 1);
    var point = new GPoint(-81.11678123474121, 34.066383065960544);
    var marker = new GMarker(point,icon);
    GEvent.addListener(marker,"click",function() { marker.openInfoWindowHtml("Little red men are invading Charleston!"); SHOW_EGG=true; });
    map.addOverlay(marker);
  }
  showEgg();
  //////////////////////////////////

}

function centerAndZoomOnObject(id) {
  var request = GXmlHttp.create();
  request.open("POST", "objects.php", true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      var xmlDoc = request.responseXML;
      var positions = xmlDoc.documentElement.getElementsByTagName("position");
      if(positions.length==0) { 
        alert(_("The object you wish to view no longer exists."));
        return;
      }
      var x = positions[0].getAttribute("lon");
      var y = positions[0].getAttribute("lat");
      var name = positions[0].getAttribute("name");
      var type = positions[0].getAttribute("type");
      var type_id = positions[0].getAttribute("type_id");
      var cnumber = positions[0].getAttribute("cnumber");
      objectCenterAndZoom(x,y,name,type,id,cnumber);
      showObjectsByType(type_id);
    }
  };
  request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  request.send("object_id="+id);
}

function resetMessage() {
  var value = _("Click on an icon to see user or cluster information, or on one of the icons above to list users by their state.  You can also click on any of the icons in the lists to focus in on a specific JID.  If you hover over a JID, the time of the last status change will be displayed.  The map refreshes automatically every 30 seconds.  Please report any bugs via jabber to bmuller@jabber.lambastard.com.");
  value+="<br /><br /><a href=\"http://validator.w3.org/check?uri=referer\"><img border=\"0\" src=\"http://www.w3.org/Icons/valid-xhtml10\" height=\"31\" width=\"88\" /></a><a href=\"http://creativecommons.org/licenses/GPL/2.0/\"><img border=\"0\" src=\"images/cc-GPL-a.png\" width=\"66\" height=\"41\" /></a><br /><br /><b>";
  value+=_("We need help translating in all languages!  If you can help, please jabber bmuller.")+"</b>";
  document.getElementById("icon_description").innerHTML = value;
}

function getJabberIconListIndex(urlJid,urlResource) {
  for(var i=0;i<jabberIconList.length;i++) {
    var members = jabberIconList[i].members;
    for(var m=0;m<members.length;m++) {
      if(members[m].jid==urlJid && members[m].resource==urlResource) return i;
    }
  }
  return -1;
}

function addStateToStats(state) {
  if(state=="away") stats_away++;
  else if(state=="xa") stats_xa++;
  else if(state=="dnd") stats_dnd++;
  else if(state=="online") stats_online++;
  else stats_offline++;
}

function getLink(end) {
  return "http://map.butterfat.net/index.php?"+end;
}

function showThoseWhoAre(state) {
  var desc = document.getElementById("icon_description");
  var msg = "";

  for(var j=0;j<jabberIconList.length;j++) {
    var jabberIcon = jabberIconList[j];
    var members = jabberIcon.members;

    for(var i=0; i<members.length; i++) {
      var member = members[i];
      if(member.state==state) {
        msg+="<table border=\"0\" width=\"100%\"><tr>";
        msg+="<td valign=\"middle\" width=\"16px\"><a onclick=\"mapMember('"+j+"');\"><img src=\""+getImageLink(member.state)+"\" border=\"0\" /></a></td>";
        msg+="<td valign=\"middle\" width=\"11px\"><a target=\"_blank\" href=\""+getLink("jid="+member.jid+":"+member.resource)+"\"><img src=\""+getImageLink("link")+"\" border=\"0\" /></a></td>";
        msg+="<td title=\""+_("Last status change")+": "+member.updated+"\"><font class=\"jid\">"+member.jid+"</font><br />"+_("Resource")+": <font class=\"description\">"+member.resource+"</font>";
        if(member.description!="") {
          var description = "<br />"+_("Description:")+" <font class=\"description\">"+member.description+"<font>";
          msg+=description;
        } 
        msg+="</td></tr></table>";
        msg+="<br />";
      }
    } 
  }

  var nonMsg = __("None are %s...",new Array(state));
  if(msg=="") msg="<center><font class=\"jid\">"+nonMsg+"</font></center>";

  desc.innerHTML = msg;
}

function showStats() {
  var stats = document.getElementById("stats");
  var html = "<ul><li><a onClick=\"showThoseWhoAre('online');\"><img src=\""+getImageLink("online")+"\" border=\"0\" /></a>&nbsp;";
  html += stats_online+"</li>";
  html += "<li><a onClick=\"showThoseWhoAre('away');\"><img src=\""+getImageLink("away")+"\" border=\"0\" /></a>&nbsp;"+stats_away+"</li>";
  html += "<li><a onClick=\"showThoseWhoAre('xa');\"><img src=\""+getImageLink("xa")+"\" border=\"0\" /></a>&nbsp;"+stats_xa+"</li>";
  html += "<li><a onClick=\"showThoseWhoAre('dnd');\"><img src=\""+getImageLink("dnd")+"\" border=\"0\" /></a>&nbsp;"+stats_dnd+"</li>";
  html += "</ul>";
  stats.innerHTML = html;

  if(SHOW_OFFLINE) {
    var showOffline = document.getElementById("showOffline");
    showOffline.innerHTML = _("Hide offline")+" [<img src=\""+getImageLink("offline")+"\" border=\"0\" />&nbsp;"+stats_offline+"]";
  }

}

function showEgg() {
  if(!SHOW_EGG) return;
  if(EGGS==null) {
    EGGS = new Array();
    var request = GXmlHttp.create();
    request.open("GET", "egg.php", true);
    request.onreadystatechange = function() {
      if (request.readyState == 4) {
        var xmlDoc = request.responseXML;
        var positions = xmlDoc.documentElement.getElementsByTagName("position");
        for (var i = 0; i < positions.length; i++) {
          var point = new GPoint(parseFloat(positions[i].getAttribute("lon")),
                                 parseFloat(positions[i].getAttribute("lat")));
          var name = positions[i].getAttribute("name");
          var img = positions[i].getAttribute("img");
          var marker = makeEggMarker(point,name,img);
          MAP.addOverlay(marker);
          EGGS[EGGS.length]=marker;
        }
      }
    }
    request.send(null);
  } else {
    for(var i=0; i<EGGS.length; i++) {
      MAP.addOverlay(EGGS[i]);
    }
  }
}

function makeEggMarker(point,name,img) {
  var icon = makeIcon("egg");
  var marker = new GMarker(point,icon);
  GEvent.addListener(marker,"click",function() { showEggInfo(name,img); });
  return marker;
}

function showEggInfo(name,img) {
 var html =  '<h2>'+name+'</h2><br /><img border="0" src="'+img+'" />';
 document.getElementById("icon_description").innerHTML = html;
}

function makeMarker(point,icon,number) {
  var marker = new GMarker(point,icon);
  GEvent.addListener(marker,"click",function() {
    showIconInfo(number);
  });
  return marker;
}

function showIconInfo(index) { 
  var desc = document.getElementById("icon_description");
  var msg = "";
  var jabberIcon = jabberIconList[index];
  var members = jabberIcon.members;


  for(var i=0; i<members.length; i++) {
    var member = members[i];
    msg+="<table border=\"0\" width=\"100%\"><tr>";
    msg+="<td valign=\"middle\" width=\"16px\"><a onClick=\"mapMember('"+index+"');\"><img src=\""+getImageLink(member.state)+"\" border=\"0\" /></a></td>";
    msg+="<td valign=\"middle\" width=\"11px\"><a target=\"_blank\" href=\""+getLink("jid="+member.jid+":"+member.resource)+"\"><img src=\""+getImageLink("link")+"\" border=\"0\" /></a></td>";
    msg+="<td title=\""+_("Last status change")+": "+member.updated+"\"><font class=\"jid\">"+member.jid+"</font><br />"+_("Resource")+": <font class=\"description\">"+member.resource+"</font>";
    if(member.description!="") {
      var description = "<br />"+_("Description")+": <font class=\"description\">"+member.description+"<font>";
      msg+=description;
    } 
    msg+="</td></tr></table>";
    msg+="<br />";
  }

  desc.innerHTML = msg;
}

function mapMember(index) {
  var jabberIcon = jabberIconList[index];
  MAP.centerAndZoom(jabberIcon.point,MAP.getZoomLevel());
}

function mapAndZoomMember(index) {
  var jabberIcon = jabberIconList[index];
  MAP.centerAndZoom(jabberIcon.point,3);
}

function toggleShowOffline() {
  SHOW_OFFLINE = (SHOW_OFFLINE) ? false : true;
  reLoadMap();
}

function toggleShowInView() {
  SHOW_IN_VIEW = (SHOW_IN_VIEW) ? false : true;
  reLoadMap();
}

function reLoadMap() {
  var map = document.getElementById("map");
  var h;
  var w;

  // IE sucks
  if(map.currentStyle) {
    h = document.documentElement.clientHeight;
    w = document.documentElement.clientWidth - 285;
    map.style['width']= w+"px";
    map.style['height']=h+"px";
  } else {
    h = window.innerHeight - 50;
    w = window.innerWidth - 285;
    map.style.width=w+"px";
    map.style.height=h+"px";
  }

  showMap();

  // IE continues to suck
  if(map.currentStyle) {
    h-=210;
    if(h<0) h=20;
    document.getElementById("tab1").style['height'] = h+"px";
    document.getElementById("tab2").style['height'] = h+"px";
    document.getElementById("tab3").style['height'] = h+"px";
  } else {
    h-=185;
    document.getElementById("tab1").style.maxHeight = h+"px";
    document.getElementById("tab2").style.maxHeight = h+"px";
    document.getElementById("tab3").style.maxHeight = h+"px";
  }

  if(!SHOW_OFFLINE) document.getElementById("showOffline").innerHTML = _("Show offline");
  if(SHOW_IN_VIEW) document.getElementById("showInView").innerHTML = _("Show All (slower)");
  else document.getElementById("showInView").innerHTML = _("Show Only In View (faster)");
}

function showSecondButton() {
  var jid = document.getElementById("jid").value;
  if(jid=="") {
    alert(_("You must enter a JID."));
    return;
  }
  var request = GXmlHttp.create();
  request.open("POST","sendPassphrase.php", true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      document.getElementById("pass_form").style.visibility="visible";
      document.getElementById("pass_form").style.display="block";
      document.getElementById("first_button").style.visibility="hidden";
    }
  };

  var send = "jid="+escape(jid);
  request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  request.send(send);
}

function checkPassphrase() {
  var pass = document.getElementById("pass").value;
  if(pass=="") {
    alert(_("You must enter the passphrase the bot sent you."));
    return;
  }
  while (pass.indexOf("\"") > -1) pass = pass.replace("\"","");
  var request = GXmlHttp.create();
  request.open("POST","checkPassphrase.php", true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      var xmlDoc = request.responseXML;
      var code = xmlDoc.documentElement.getAttribute("code");
      if(code=="0") alert(_("Incorrect passphrase."));
      else window.location = "http://map.butterfat.net/index.php";
    }
  };
  var send = "pass="+escape(pass);
  request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  request.send(send); 
}






