// ==UserScript==
// @name           AllegroTools (komentarze) dla IE
// @namespace      http://www.allegrotoolsie.hopto.org/
// @description    Dodatkowe narzedzia pomocne przy przegladaniu komentarzy uzytkownikow Allegro // v0.20061221.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("#FFB895", "#FFD9C6");
var BUYER_COLORS = new Array("#9DCEFF", "#C6E2FF");

var SELLER_STRING = "Sprzedaj";
var BUYER_STRING = "Kupuj";

var SHOW_SELLERS_BTN = "_show_sellers_btn_";
var HIDE_SELLERS_BTN = "_hide_sellers_btn_";
var SHOW_BUYERS_BTN = "_show_buyers_btn_";
var HIDE_BUYERS_BTN = "_hide_buyers_btn_";
var CHECK_LINKS_BTN = "_check_links_btn_";
var ENABLE_COLORING_BTN = "_enable_coloring_btn_";
var DISABLE_COLORING_BTN = "_disable_coloring_btn_";

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 handleShowSellersButton()
{
  showButton(SHOW_SELLERS_BTN, false);
  GM_setValue("AT_C_hide_sellers", false);
  hideSellerComments(false);
  showButton(HIDE_SELLERS_BTN, true);
}

function handleHideSellersButton()
{
  showButton(HIDE_SELLERS_BTN, false);
  GM_setValue("AT_C_hide_sellers", true);
  hideSellerComments(true);
  showButton(SHOW_SELLERS_BTN, true);
}

function handleShowBuyersButton()
{
  showButton(SHOW_BUYERS_BTN, false);
  GM_setValue("AT_C_hide_buyers", false);
  hideBuyerComments(false);
  showButton(HIDE_BUYERS_BTN, true);
}

function handleHideBuyersButton()
{
  showButton(HIDE_BUYERS_BTN, false);
  GM_setValue("AT_C_hide_buyers", true);
  hideBuyerComments(true);
  showButton(SHOW_BUYERS_BTN, true);
}

function handleCheckLinksButton()
{
  showButton(CHECK_LINKS_BTN, false);
  checkLinks();
}

function handleEnableColoringButton()
{
  showButton(ENABLE_COLORING_BTN, false);
  GM_setValue("AT_C_coloring", true);
  colorComments(true);
  showButton(DISABLE_COLORING_BTN, true);
}

function handleDisableColoringButton()
{
  showButton(DISABLE_COLORING_BTN, false);
  GM_setValue("AT_C_coloring", false);
  colorComments(false);
  showButton(ENABLE_COLORING_BTN, true);
}

/////////////////////////////////////////////////////////////////
// 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 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 changeCommentColor(element, colors, doColoring)
{
  if (element.firstChild.getAttribute("className") == "list-color")
  {
    changeCommentRowBackgroundColor(element, colors[0], doColoring);
  }
  else if (element.firstChild.getAttribute("className") == "list-white")
  {
    changeCommentRowBackgroundColor(element, colors[1], doColoring);
  }
}

function colorComments(doColoring)
{
  if (SELLER_COMMENTS)
  {
    for(var i=0; i < SELLER_COMMENTS.length; i++)
    {
      if(SELLER_COMMENTS[i])
      {
        changeCommentColor(SELLER_COMMENTS[i], SELLER_COLORS, doColoring);
      }
    }
  }

  if (BUYER_COMMENTS)
  {
    for(var i=0; i < BUYER_COMMENTS.length; i++)
    {
      if(BUYER_COMMENTS[i])
      {
        changeCommentColor(BUYER_COMMENTS[i], BUYER_COLORS, 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);
  while(element && element.style.display != displayValue)
  {
    element.style.display = displayValue;
    element = document.getElementById(id);
  }
}

function getButtonHtml(title, id, visible)
{
  var displayValue = visible ? "block" : "none";
  return "<td id=\"" + id + "\" style=\"display:" + displayValue + "\"><input type=\"button\" value=\"" + title +"\"></td>";
}

function addMenu()
{
  var hideSellers = GM_getValue("AT_C_hide_sellers", false);
  var hideBuyers = GM_getValue("AT_C_hide_buyers", false);
  var coloring = GM_getValue("AT_C_coloring", false);
  var menu = document.createElement("div");
  menu.innerHTML = "<table cellspacing=2 cellpadding=0 border=0><tr>" +
                   getButtonHtml("Ukryj Sprzedających (" + SELLER_COMMENTS.length + ")", HIDE_SELLERS_BTN, !hideSellers) +
                   getButtonHtml("Pokaż Sprzedających (" + SELLER_COMMENTS.length + ")", SHOW_SELLERS_BTN, hideSellers) +
                   getButtonHtml("Ukryj Kupujących (" + BUYER_COMMENTS.length + ")", HIDE_BUYERS_BTN, !hideBuyers) +
                   getButtonHtml("Pokaż Kupujących (" + BUYER_COMMENTS.length + ")", SHOW_BUYERS_BTN, hideBuyers) +
                   getButtonHtml("Włącz kolorowanie", ENABLE_COLORING_BTN, !coloring) +
                   getButtonHtml("Wyłącz kolorowanie", DISABLE_COLORING_BTN, coloring) +
                   getButtonHtml("Sprawdź aukcje", CHECK_LINKS_BTN, true) +
                   "</tr></table>";
  COMMENT_TABLE_BODY.parentNode.parentNode.insertBefore(menu, COMMENT_TABLE_BODY.parentNode);
  registerEventHandler(document.getElementById(SHOW_SELLERS_BTN).firstChild, "click", handleShowSellersButton);
  registerEventHandler(document.getElementById(HIDE_SELLERS_BTN).firstChild, "click", handleHideSellersButton);
  registerEventHandler(document.getElementById(SHOW_BUYERS_BTN).firstChild, "click", handleShowBuyersButton);
  registerEventHandler(document.getElementById(HIDE_BUYERS_BTN).firstChild, "click", handleHideBuyersButton);
  registerEventHandler(document.getElementById(CHECK_LINKS_BTN).firstChild, "click", handleCheckLinksButton);
  registerEventHandler(document.getElementById(ENABLE_COLORING_BTN).firstChild, "click", handleEnableColoringButton);
  registerEventHandler(document.getElementById(DISABLE_COLORING_BTN).firstChild, "click", handleDisableColoringButton);
}

/////////////////////////////////////////////////////////////////
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 hideSellers = GM_getValue("AT_C_hide_sellers", false);
    var hideBuyers = GM_getValue("AT_C_hide_buyers", false);
    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))
          {
            SELLER_COMMENTS.push(row);
            hideComment(row, hideSellers);
            changeCommentColor(row, SELLER_COLORS, doColoring);
          }
          else if(string.match(BUYER_STRING))
          {
            BUYER_COMMENTS.push(row);
            hideComment(row, hideBuyers);
            changeCommentColor(row, BUYER_COLORS, doColoring);
          }
        }
      }
    }
  }
}

function allegrotoolsComments()
{
  findComments();
  addMenu();
}

/////////////////////////////////////////////////////////////////
// Start Allegro Tools Comments script
/////////////////////////////////////////////////////////////////

allegrotoolsComments()
