// ==UserScript==
// @name           Friend2Cache
// @namespace      Friend2Cache
// @description    Show Cache-Link on Friend-Site
// @include        http://www.geocaching.com/my/myfriends.aspx
// ==/UserScript==
//
// @contact: user: mollsaucer-gm domain: yahoo.com

function getXEle(path) {
  var result=document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue;
  return result;
}

function getXEles(path) {
  var result=document.evaluate(path, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
  return result;
}

// Vorweg: Holt den Container der einzelnen Tabs

var tabnodes = getXEles("//div[@class='FriendText']");

// -------------------------------------------------------------
// Funktion, um den aktuellen Found/Hidden-Stand zu speichern
// -------------------------------------------------------------

function persistFounds() {
  for (i in unsafeWindow.foundMap) {
    GM_setValue(i, unsafeWindow.foundMap[i]);
  }
  for (i in unsafeWindow.hidMap) {
    GM_setValue(i+"_hidden", unsafeWindow.hidMap[i]);
  }
  GM_setValue("timestamp", (new Date()).toLocaleString());
  unsafeWindow.scanTabs();
}



// -------------------------------------------------------------
// Bringt die Statistik und die Tab-Farben auf den aktuellen Stand
// -------------------------------------------------------------

function scanTabs() {

  var hidMap=new Object();
  var fndMap=new Object();
  var timestamp = GM_getValue("timestamp");
  if (null != timestamp) {
    document.getElementById("f2cts").innerHTML="Stand: "+timestamp;
  }

  for ( var i=0 ; i < tabnodes.snapshotLength; i++ ) {

    var cell=tabnodes.snapshotItem(i);
    var username=cell.childNodes[1].textContent;
    var founds=cell.childNodes[3].childNodes[19].textContent;
    //var hiddens=cell.childNodes[3].childNodes[23].textContent;

    founds=parseInt(founds.replace(/ .*$/g, ""));
    //hiddens=parseInt(hiddens.replace(/ .*$/g, ""));

    fndMap[username]=founds;
    //hidMap[username]=hiddens;

    // Wirf bei noch nicht persistierten Friends Exceptions. Die fangen wir mal weg.
    try {
      pFound=GM_getValue(username);
    } catch(anEx) {
      pFound=-1;
    }
    // Wirf bei noch nicht persistierten Friends Exceptions. Die fangen wir mal weg.
    /*try {
      pHidden=GM_getValue(username+"_hidden");
    } catch(anEx) {
      pHidden=-1;
    }
    if (typeof pHidden == 'undefined') {
      pHidden=-1;
    }*/
    if (typeof pFound == 'undefined') {
      pFound=-1;
    }

    persname=username.replace(/ /g,"+");
    persname=persname.replace(/&/g,"%26");
    //Debug: alert (username+": "+pFound+"-> "+founds+" / "+pHidden+" -> "+hiddens+" "+typeof pHidden);
    if (pFound<founds) {
      cell.parentNode.setAttribute("style", "background:#CCFFCC");
      document.getElementById("df"+persname).textContent="(+"+(founds-pFound)+")";
    } else  {
      cell.parentNode.setAttribute("style", "background:#FFFFFF");
      document.getElementById("df"+persname).textContent="";
    }
   /* if (pFound<founds && pHidden>=hiddens) {
      cell.parentNode.setAttribute("style", "background:#CCFFCC");
      document.getElementById("df"+persname).textContent="(+"+(founds-pFound)+")";
      document.getElementById("dh"+persname).textContent="";
    } else if (pFound>=founds && pHidden<hiddens) {
      cell.parentNode.setAttribute("style", "background:#FFFFAA");
      document.getElementById("df"+persname).textContent="";
      document.getElementById("dh"+persname).textContent="(+"+(hiddens-pHidden)+")";
    } else if (pFound<founds && pHidden<hiddens) {
      cell.parentNode.setAttribute("style", "background:#FFCCCC");
      document.getElementById("dh"+persname).textContent="(+"+(hiddens-pHidden)+")";
      document.getElementById("df"+persname).textContent="(+"+(founds-pFound)+")";
    } else  {
      cell.parentNode.setAttribute("style", "background:#FFFFFF");
      document.getElementById("df"+persname).textContent="";
      document.getElementById("dh"+persname).textContent="";
    }*/
  }
  // Map f�r sp�teren Einsatz speichern
  unsafeWindow.foundMap=fndMap;
//  unsafeWindow.hidMap=hidMap;

}

// Funktionen, die von au�en aufgerufen werden m�ssen

unsafeWindow.scanTabs=function() {window.setTimeout(scanTabs,0);};
unsafeWindow.persistFounds=function() {window.setTimeout(persistFounds);};


// --------------------------------------------
// main
// --------------------------------------------

for (var i=0;i<tabnodes.snapshotLength;i++) {

  cell=tabnodes.snapshotItem(i);
  fndObj=cell.childNodes[3].childNodes[17];
  //hidObj=cell.childNodes[3].childNodes[21];
  fndVal=cell.childNodes[3].childNodes[19];
  //hidVal=cell.childNodes[3].childNodes[23];
  username=cell.childNodes[1].textContent;

  // xel & rflexor Fix :-))

  username=username.replace(/ *$/g,"");
  username=username.replace(/^ */g,"");
  username=username.replace(/ /g,"+");
  username=username.replace(/&/g,"%26");

  fndObj.innerHTML="<a href=\"http://www.geocaching.com/seek/nearest.aspx?ul="+username+"\" target=\"_blank\">Found:</a>";
  //hidObj.innerHTML="<a href=\"http://www.geocaching.com/seek/nearest.aspx?u="+username+"\" target=\"_blank\">Hidden:</a>";

  fndVal.innerHTML+="&nbsp;<span style=\"font-size:8pt;\" id=\"df"+username+"\"></span>";
  //hidVal.innerHTML+="&nbsp;<span style=\"font-size:8pt;\" id=\"dh"+username+"\"></span>";
 
}

// ----------------------- Persist-Knopf -----------------------
  iA=document.createElement("div");
  iH=document.createAttribute("align");
  iH.nodeValue="center";
  iA.setAttributeNode(iH);
  iA.innerHTML="<form><input type=\"button\" value=\"Persist Founds!\" onClick=\"javascript:window.persistFounds();\"></form><br>"+            
               "Green tabs mean: <span style=\"color:#55FF55\">New Found</span><br><span id=\"f2cts\"></span>";
               //"<span style=\"color:#FF5555\">New Found & Hidden</span><br><span id=\"f2cts\"></span>";
               //"<Span style=\"color:#CCCC00\">New Hidden</span>&nbsp;"+

  var mainPanel = getXEle("//div[@id='ctl00_ContentBody_pnlMyFriends']");
  var before = getXEle("//div[@class='FriendWidget']");

  mainPanel.insertBefore(iA, before);

scanTabs();
//---------------------------------------------------------------



