var req;
var message_url = "/cgi-bin/xml_message.cgi";

var item_info = new Array();

function nodeGetContent( parent, tag )
{
  try
  {
    return parent.getElementsByTagName(tag)[0].firstChild.nodeValue;
  }
  catch (e) {}

  return '';
}

function processXmlComplete()
{
 if( req.readyState == 4 )
   log( "finished loading xml doc... status: " + req.status );

 if (req.readyState == 4 && req.status == 200 && req.responseXML != null)
 {
   log( "finished loading xml doc successfully" );

    var nl = req.responseXML.getElementsByTagName( 'message' );

    if( nl && nl.item(0))
    {
      log( "xml is for a message" );
      
      var message = nl.item(0);

      var short_id = message.getAttribute('id').toString();

      var subject = nodeGetContent( message, "subject" );
      var sender  = nodeGetContent( message, "sender" );
      var rating  = nodeGetContent( message, "totAvgStatus" );
      var reviews = nodeGetContent( message, "totReviews" );
      var created = nodeGetContent( message, "created" );

      item_info["M"+short_id] = "<a href=\"/m/" + short_id + "\">" + subject + "</a><br><i>Submitted by <b>" + sender + "</b> at " + created + "</i><br>Rating: " + rating + " on " + reviews + " reviews";
    }
    else
    {
      log( "xml is for a user" );

      nl = req.responseXML.getElementsByTagName( 'user' );

      var user = nl.item(0);

      var user_id = user.getAttribute('id').toString();

      var username   = nodeGetContent( user, "username" );
      var rating     = nodeGetContent( user, "totAvgStatus" );
      var reviews    = nodeGetContent( user, "totReviews" );
      var messages   = nodeGetContent( user, "totMessages" );
      var registered = nodeGetContent( user, "registered" );

      item_info["U"+username.toLowerCase()] = "<a href=\"/u/" + username + "\">" + username + "</a> (" + user_id + ")<br># Messages: " + messages + " &nbsp; # Reviews: " + reviews + " &nbsp; Average Rating: " + rating + "<br><i>Registered " + registered + "</i>";
    }

    fillBoxForCurrentId();
  }
}


function createXmlHttpRequest()
{
  var req = false;

  if(window.XMLHttpRequest)
  {
    try
    {
      req = new XMLHttpRequest();
    }
    catch(e)
    {
      req = false;
    }
  }
  else if(window.ActiveXObject)
  {
    try
    {
      req = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch(e)
    {
      try
      {
        req = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch(e)
      {
        req = false;
      }
    }
  }

  return req;
}


function loadMessageInfo(id)
{
  log( "loading message info for id: " + id );

  if( !item_info[id] )
  {
    log( "no local info found for id: " + id );

    req = createXmlHttpRequest();

    if(req)
    {
      var my_url = message_url + "?id=" + id;

      log( "hitting url: " + my_url );

      req.onreadystatechange = processXmlComplete;
      req.open("GET", my_url, true);
      req.send("");
    }
  }
  else
  {
    fillBoxForId( false, id );
  }
}


var gMouseX = 0;
var gMouseY = 0;

var is_ie = document.all ? true : false;

if( !is_ie )
  document.captureEvents(Event.MOUSEMOVE)

document.onmousemove = getMousePos;

var tmpX = 0;
var tmpY = 0;

function getMousePos(e)
{
  if( is_ie )
  {
    tmpX = event.clientX + document.body.scrollLeft;
    tmpY = event.clientY + document.body.scrollTop;
  }
  else
  {
    tmpX = e.pageX;
    tmpY = e.pageY;
  }

  if( tmpX < 0 )
    tmpX = 0;

  if( tmpY < 0 )
    tmpY = 0;

  gMouseX = tmpX;
  gMouseY = tmpY;

  return true;
}


var uberId;
var uberLastId;

var boxPopInfo;

function uberLinkMouseOver(link)
{
  log( "in mouse over for link: " + link );
  try
  {
    var id = link.href.match( /^http:\/\/(?:[a-z\.\-]+)?ubersite.com\/m\/(\d+)/i )[1];
    showLittleBox("M"+id);
  }
  catch (e)
  {
    showError(e);
  }

  try
  {
    var id = link.href.match( /^http:\/\/(?:[a-z\.\-]+)?ubersite.com\/u\/([0-9a-z_\.\-]+)/i )[1];
    showLittleBox("U"+id.toLowerCase());
  }
  catch (e)
  {
    showError(e);
  }
}

function getPopInfo()
{
  if( !boxPopInfo )
  {
    var box = document.createElement("div");
    box.id = "pop-info";
    box.style.display = "none";
    box.onmouseout  = uberLinkMouseOut;
    box.onmouseover = showHowdy2;
    document.getElementsByTagName("body")[0].appendChild(box);
    boxPopInfo = box;
  }

  return boxPopInfo;
}

function showLittleBox(id)
{
  log( "In showLittleBox id: " + id );
  
  if( !id )
    return;

  uberId = id;

  var uberBox = getPopInfo();

  if( uberBox.style.display == "none" )
  {
    setTimeout( "showHowdy(\"" + uberId + "\")", 1000 );
  }
  else
  {
    showHowdy(uberId);
  }
}

function uberLinkMouseOut(link)
{
//  log( "in mouse out for link: " + link );
  if( uberId )
    uberLastId = uberId;

  uberId = undefined;

  setTimeout( "hideHowdy()", 500 );
}

function showError(msg)
{
  log( "Error: " + msg );
}

function log(msg)
{
//  document.getElementById("log").innerHTML += msg + "<br>";
}

function fillBoxForCurrentId(box)
{
  fillBoxForId( box, uberId );
}

function fillBoxForId(box,id)
{
  if( !box )
    box = getPopInfo();

  if( item_info[id] )
    box.innerHTML = item_info[id];

  box.style.display = 'block';
}

function hideHowdy()
{
//  log( "in hideHowdy" );

  if( !uberId )
  {
    log( "hiding box" );

    var uberBox = getPopInfo();

    uberBox.style.display = 'none';
  }
}

function showHowdy2()
{
  log( "in showHowdy2" );

  uberId = uberLastId;
  showHowdy(uberLastId,true);
}

function showHowdy(id,keepPos)
{
  log( "in showHowdy with id: " + id );

  if( uberId == id )
  {
    log( "showing box for id: " + id + " at [" + gMouseX + "," + gMouseY + "]" );

    loadMessageInfo(id);

    var uberBox = getPopInfo();

    if( !keepPos )
    {
      uberBox.style.left = gMouseX + 40;
      uberBox.style.top  = gMouseY - 10;
    }
  }
}
