// ==UserScript==
// @name           AllegroTools (komentarze) dla IE
// @namespace      http://www.allegrotoolsie.hopto.org/
// @description    Dodatkowe narzedzia pomocne przy przegladaniu komentarzy uzytkownikow Allegro // v0.20061226.0
// @include        http*://*allegro.pl/show_user.php?*
// @include        http*://*allegro.pl/my_allegro.php?page=feedbacks
// @include        http*://*allegro.pl/my_allegro.php?*page=feedbacks*type=fb_recvd*
// @include        http*://*allegro.pl/my_allegro.php?*page=feedbacks*type=fb_gave*
// @exclude        http*://*allegro.pl/*no_limit=1*
// ==/UserScript==

var SELLER_COLORS = new Array("#FFD9C6", "#FFE8DD");
var BUYER_COLORS = new Array("#C6D9FF", "#DDE8FF");

var SELLER_STRING = "Sprzedaj";
var BUYER_STRING = "Kupuj";

var ALL_BTN = "_all_btn_";
var SELLERS_BTN = "_sellers_btn_";
var BUYERS_BTN = "_buyers_btn_";
var CHECK_LINKS_BTN = "_check_links_btn_";
var COLORING_CHBX = "_coloring_chkbx_";
var AUTOCHECK_CHBX = "_autocheck_chkbx_";

var COMMENT_TABLE_BODY = false;
var BUYER_COMMENTS = new Array();
var SELLER_COMMENTS = new Array();

var BG_BYSTR = "data:image/png;base64,"+
     "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAFRlDm/AAAAB3RJTUUH1gwHDRgVt4pvywAAAAlw"+
     "SFlzAAAPYQAAD2EBqD+naQAAAARnQU1BAACxjwv8YQUAAAAYSURBVHjaY/j/nwEGoEwQBWEyoovD"+
     "FQMAkc0N9HFYUnUAAAAASUVORK5CYII=";

/////////////////////////////////////////////////////////////////
// Utility functions
/////////////////////////////////////////////////////////////////
function select()
{
  if (arguments.length>1) {
    var node = arguments[0];
    for (var i=1; i<arguments.length; i++) {
      if (typeof(arguments[i])=='string') {
        node = node.getElementById(arguments[i]);
      } else {
        var nodeIdx = arguments[i];
        var children = node.childNodes;
        if (nodeIdx<children.length) {
          node = children[nodeIdx];
        } else {
          node = null;
          break;
        }
      }
    }
  }
  return node;
}

function registerEventHandler(element, eventName, handler)
{
  if (element.addEventListener)
  {
    element.addEventListener(eventName, handler, false);
  }
  else if (document.attachEvent)
  {
    element.attachEvent("on" + eventName, handler);
  }
} 

/////////////////////////////////////////////////////////////////
// Event handlers section
/////////////////////////////////////////////////////////////////
function handleAllButton()
{
  enableButton(ALL_BTN, false);
  GM_setValue("AT_C_filter", ALL_BTN);
  hideBuyerComments(false);
  hideSellerComments(false);
  enableButton(SELLERS_BTN, true);
  enableButton(BUYERS_BTN, true);
}

function handleSellersButton()
{
  enableButton(SELLERS_BTN, false);
  GM_setValue("AT_C_filter", SELLERS_BTN);
  hideBuyerComments(true);
  hideSellerComments(false);
  enableButton(ALL_BTN, true);
  enableButton(BUYERS_BTN, true);
}

function handleBuyersButton()
{
  enableButton(BUYERS_BTN, false);
  GM_setValue("AT_C_filter", BUYERS_BTN);
  hideBuyerComments(false);
  hideSellerComments(true);
  enableButton(ALL_BTN, true);
  enableButton(SELLERS_BTN, true);
}

function handleCheckLinksButton()
{
  enableButton(CHECK_LINKS_BTN, false);
  checkLinks();
}

function handleColoringCheckbox()
{
  var coloring = getCheckbox(COLORING_CHBX);
  GM_setValue("AT_C_coloring", coloring);
  colorComments(coloring);
}

function handleAutocheckCheckbox()
{
  var autocheck = getCheckbox(AUTOCHECK_CHBX);
  GM_setValue("AT_C_autocheck", autocheck);
  showButton(CHECK_LINKS_BTN, !autocheck);
  autocheckLinks();
}

/////////////////////////////////////////////////////////////////
// Links checking related functions
/////////////////////////////////////////////////////////////////
function getEndTime(str){
  if(str.match(/<span class="small">\((.{3} \d{2} .{3} \d{4} \d{2}:\d{2}:\d{2} .+?)\)<\/span>/g))
  {
    return RegExp.$1;
  }
  else
  {
    return null;
  }
}

function checkExternalArchive(str)
{
  if(str.match(/Aukcja <span class="black">nr \d*?<\/span> nie widnieje w naszej bazie/g))
  {
    return false;
  }
  else
  {
    return true;
  }
}

function autocheckLinks()
{
  if(isEnabledButton(CHECK_LINKS_BTN) && getCheckbox(AUTOCHECK_CHBX))
  {
    handleCheckLinksButton();
  }
}

function checkLinks()
{
  if (SELLER_COMMENTS)
  {
    for(var i = 0; i < SELLER_COMMENTS.length; i++)
    {
      new LinkChecker(SELLER_COMMENTS[i]);
    }
  }

  if (BUYER_COMMENTS)
  {
    for(var i = 0; i < BUYER_COMMENTS.length; i++)
    {
      new LinkChecker(BUYER_COMMENTS[i]);
    }
  }
}

function LinkChecker(row)
{
  if(row)
  {
    var link = select(row, 3, 0);
    if(link)
    {
      this.link = link;
      this.linkTD = link.parentNode;
      this.checkLink();
    }
  }
}

LinkChecker.prototype.mark = function()
{
  this.linkTD.style.backgroundImage = "url('"+BG_BYSTR+"')";
}

LinkChecker.prototype.unmark = function()
{
  this.linkTD.style.backgroundImage = "";
}

LinkChecker.prototype.checkLink = function()
{
  this.allegroUrl = this.link.getAttribute("href");
  this.mark();
  var me = this;
  GM_xmlhttpRequest({method:"GET", url:this.allegroUrl, onload:function(d){me.processCheckLinkResponse(d)}});
}

LinkChecker.prototype.processCheckLinkResponse = function(details)
{
  var responseText = details.responseText;
  var endTime = getEndTime(responseText);
  if (endTime)
  {
    var span = document.createElement('span');
    span.innerHTML = endTime + "<br>";
    this.link.parentNode.insertBefore(span, this.link);
    this.unmark();
  }
  else
  {
    this.checkArchiverLink(); 
  }
}

LinkChecker.prototype.checkArchiverLink = function()
{
  this.archiverUrl = "http://www.allegro.archiver.pl/search.php?itid=" + this.link.innerText;
  var me = this;
  GM_xmlhttpRequest({method:"GET", url:this.archiverUrl, onload:function(d){me.processCheckArchiverLinkResponse(d)}});
}

LinkChecker.prototype.processCheckArchiverLinkResponse = function(details)
{
  var responseText = details.responseText;
  var isInExternalArchive = checkExternalArchive(responseText);
  var span = document.createElement('span');
  if (isInExternalArchive)
  {
    span.innerHTML = "Archiwum zewnetrzne<br>";
    this.link.href = "http://www.allegro.archiver.pl/search.php?itid=" + this.link.innerText;
    this.link.setAttribute("target", "_blank");
  }
  else
  {
    span.innerHTML = this.link.innerText;
    this.link.style.display = "none";
  }
  this.unmark();
  this.link.parentNode.insertBefore(span, this.link);
}

/////////////////////////////////////////////////////////////////
// Coment coloring related functions
/////////////////////////////////////////////////////////////////
function changeCommentRowBackgroundColor(element, color, doColoring)
{
  var newColor = doColoring ? color : "";
  for(var i=0; i<element.childNodes.length; i++)
  {
    element.childNodes[i].style.backgroundColor = newColor;
  }
  element.nextSibling.firstChild.style.backgroundColor = newColor;
}

function colorComments(doColoring)
{
  if (SELLER_COMMENTS)
  {
    for(var i=0; i < SELLER_COMMENTS.length; i++)
    {
      if(SELLER_COMMENTS[i])
      {
        changeCommentRowBackgroundColor(SELLER_COMMENTS[i], SELLER_COLORS[i % 2], doColoring);
      }
    }
  }

  if (BUYER_COMMENTS)
  {
    for(var i=0; i < BUYER_COMMENTS.length; i++)
    {
      if(BUYER_COMMENTS[i])
      {
        changeCommentRowBackgroundColor(BUYER_COMMENTS[i], BUYER_COLORS[i % 2], doColoring);
      }
    }
  }
}

/////////////////////////////////////////////////////////////////
// Coment show/hide related functions
/////////////////////////////////////////////////////////////////
function hideComment(row, hide)
{
  if (row)
  {
    var displayValue = hide ? "none" : "block";
    row.style.display = displayValue;
    row.nextSibling.style.display = displayValue;
  }
}

function hideSellerComments(hide)
{
  if(SELLER_COMMENTS)
  {
    for(var i = 0; i < SELLER_COMMENTS.length; i++)
    {
      hideComment(SELLER_COMMENTS[i], hide);
    }
  }
}

function hideBuyerComments(hide)
{
  if(BUYER_COMMENTS)
  {
    for(var i = 0; i < BUYER_COMMENTS.length; i++)
    {
      hideComment(BUYER_COMMENTS[i], hide);
    }
  }
}


/////////////////////////////////////////////////////////////////
// Menu related functions
/////////////////////////////////////////////////////////////////
function showButton(id, show)
{
  var displayValue = show ? "block" : "none";
  var element = document.getElementById(id);
  if(element && element.style.display != displayValue)
  {
    element.style.display = displayValue;
  }
}

function enableButton(id, enable)
{
  var element = document.getElementById(id);
  if(element && element.firstChild && element.firstChild.disabled != !enable)
  {
    element.firstChild.disabled = !enable;
  }
}

function isEnabledButton(id)
{
  var element = document.getElementById(id);
  if(element && element.firstChild)
  {
    return !element.firstChild.disabled;
  }
  else
  {
    return false;
  }
}

function setCheckbox(id, checked)
{
  var element = document.getElementById(id);
  if(element && element.firstChild && element.firstChild.checked != checked)
  {
    element.firstChild.checked = checked;
  }
}

function getCheckbox(id)
{
  var element = document.getElementById(id);
  if(element && element.firstChild)
  {
    return element.firstChild.checked;
  }
  else
  {
    return false;
  }
}

function getButtonHtml(title, id, visible)
{
  return "<td id=\"" + id + "\"><input type=\"button\" value=\"" + title +"\"></td>";
}

function getCheckboxHtml(title, id)
{
  return "<td id=\"" + id + "\"><input type=\"checkbox\">" + title + "</input></td>";
}

function addMenu()
{
  var filter  = GM_getValue("AT_C_filter", ALL_BTN);
  var coloring = GM_getValue("AT_C_coloring", false);
  var autocheck = GM_getValue("AT_C_autocheck", false);
  var menu = document.createElement("div");
  menu.innerHTML = "<table cellspacing=2 cellpadding=0 border=0><tr>" +
                   getButtonHtml("Wszyscy", ALL_BTN, true) +
                   getButtonHtml("Sprzedający (" + SELLER_COMMENTS.length + ")", SELLERS_BTN, true) +
                   getButtonHtml("Kupujacy (" + BUYER_COMMENTS.length + ")", BUYERS_BTN, true) +
                   "<td>&nbsp;</td>" +
                   getCheckboxHtml("Kolorowanie", COLORING_CHBX) +
                   "<td>&nbsp;</td>" +
                   getCheckboxHtml("Autosprawdzanie", AUTOCHECK_CHBX) +
                   "<td>&nbsp;</td>" +
                   getButtonHtml("Sprawdź aukcje", CHECK_LINKS_BTN) +
                   "</tr></table>";
  COMMENT_TABLE_BODY.parentNode.parentNode.insertBefore(menu, COMMENT_TABLE_BODY.parentNode);
  enableButton(ALL_BTN, (filter != ALL_BTN));
  enableButton(SELLERS_BTN, (filter != SELLERS_BTN));
  enableButton(BUYERS_BTN, (filter != BUYERS_BTN));
  showButton(CHECK_LINKS_BTN, !autocheck);
  setCheckbox(COLORING_CHBX, coloring);
  setCheckbox(AUTOCHECK_CHBX, autocheck);
  registerEventHandler(document.getElementById(ALL_BTN).firstChild, "click", handleAllButton);
  registerEventHandler(document.getElementById(SELLERS_BTN).firstChild, "click", handleSellersButton);
  registerEventHandler(document.getElementById(BUYERS_BTN).firstChild, "click", handleBuyersButton);
  registerEventHandler(document.getElementById(CHECK_LINKS_BTN).firstChild, "click", handleCheckLinksButton);
  registerEventHandler(document.getElementById(COLORING_CHBX).firstChild, "click", handleColoringCheckbox);
  registerEventHandler(document.getElementById(AUTOCHECK_CHBX).firstChild, "click", handleAutocheckCheckbox);
}

/////////////////////////////////////////////////////////////////
function findComments()
{
  var tables = document.getElementsByTagName("table");
  var commentRows = false;
  // First find tables with comments
  for (var i = 0; i < tables.length; ++i)
  {
    node = tables[i];
    classAttr = node.getAttribute('className');
    if((classAttr) && (classAttr == "list-head"))
    {
      COMMENT_TABLE_BODY = node.firstChild;
      commentRows = COMMENT_TABLE_BODY.childNodes;
      break;
    }
  }
  
  // Now group seller and buyer comments
  if (commentRows)
  {
    var filter  = GM_getValue("AT_C_filter", ALL_BTN);
    var hideSellers = (filter == BUYERS_BTN);
    var hideBuyers = (filter == SELLERS_BTN);
    var doColoring = GM_getValue("AT_C_coloring", false);
    var row, cell;
    // Skip first row - table header
    for(var i=1; i < commentRows.length; i++)
    {
      row = commentRows[i];
      if(row && (row.childNodes.length > 1)) // check length to skip comment text rows
      {
        cell = row.firstChild;
        if(cell)
        {
          var string = cell.innerText;
          // TODO correct matching strings
          if(string.match(SELLER_STRING))
          {
            hideComment(row, hideSellers);
            changeCommentRowBackgroundColor(row, SELLER_COLORS[SELLER_COMMENTS.length % 2], doColoring);
            SELLER_COMMENTS.push(row);
          }
          else if(string.match(BUYER_STRING))
          {
            hideComment(row, hideBuyers);
            changeCommentRowBackgroundColor(row, BUYER_COLORS[BUYER_COMMENTS.length % 2], doColoring);
            BUYER_COMMENTS.push(row);
          }
        }
      }
    }
  }
}

function allegrotoolsComments()
{
  findComments();
  addMenu();
  autocheckLinks();
}

/////////////////////////////////////////////////////////////////
// Start Allegro Tools Comments script
/////////////////////////////////////////////////////////////////

allegrotoolsComments()
