// Identica Reply script
// version 0.2 BETA!
// 2008-07-03
// Copyright (c) 2008, Brad McCrorey
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script.  To install it, you need
// Greasemonkey 0.3 or later: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "Identica Reply", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name          Identica Reply
// @namespace     http://brad.globeproductions.com.au/greasemonkey/identica-reply.user.js
// @description   Script to install a "reply" button on identi.ca
// @include       http://identi.ca/*
// @exclude       http://identi.ca/main/*
// @exclude       http://identi.ca/settings/*
// @exclude       http://identi.ca/search/*
// @exclude       http://identi.ca/notice/*
// ==/UserScript==
/*
  Developed by Robert Nyman, http://www.robertnyman.com
  Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/  


// Last updated: 2008-07-09

(function() {

var header = document.getElementById("header");
if (!header) return;

// create form if none exists
var instructs = getElementsByClassName("instructions", "p", header)[0];
var statusForm = document.getElementById("status_form");
if (!statusForm && !instructs) {
  var navViews = document.getElementById("nav_views");
  if (navViews) {
    header.insertBefore(newForm(), navViews);
  } else {
    header.appendChild(newForm());
  }
}

var profile = getElementsByClassName("pagetitle", "h1", header)[0].textContent;

var theLis = getElementsByClassName('notice_single');
for(var i = 0; i < theLis.length; i++) {
  var nickname = safeGetElementsByClassName('nickname', 'a', theLis[i]);
  var nicknameStrip = user_name_only(nickname + '.ignore');

  // use profile's name if there are no nicknames on profile page
  theLis[i].appendChild(replyLink((nickname.length > 0) ? nicknameStrip : profile));
}

function getElementsByClassName(className, tag, elm){
  if (document.getElementsByClassName) {
    elm = elm || document;
    var elements = elm.getElementsByClassName(className),
    nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
    returnElements = [],
    current;
    for(var i=0, il=elements.length; i<il; i+=1){
      current = elements[i];
      if(!nodeName || nodeName.test(current.nodeName)) {
        returnElements.push(current);
      }
    }
  } else if (document.evaluate) {
    tag = tag || "*";
    elm = elm || document;
    var classes =
      className.split(" "),
      classesToCheck = "",
      xhtmlNamespace = "http://www.w3.org/1999/xhtml",
      namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
      returnElements = [],
      elements,
      node;
    for(var j=0, jl=classes.length; j<jl; j+=1){
      classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
    }
    try  {
      elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
    } catch (e) {
      elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
    }
    while ((node = elements.iterateNext())) {
      returnElements.push(node);
    }
  } else {
    tag = tag || "*";
    elm = elm || document;
    var classes = className.split(" "),
      classesToCheck = [],
      elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
      current,
      returnElements = [],
      match;
    for(var k=0, kl=classes.length; k<kl; k+=1){
      classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
    }
    for(var l=0, ll=elements.length; l<ll; l+=1){
      current = elements[l];
      match = false;
      for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
        match = classesToCheck[m].test(current.className);
        if (!match) {
          break;
        }
      }
      if (match) {
        returnElements.push(current);
      }
    }
  }
  return returnElements;
};


function safeGetElementsByClassName(className, tag, elm) {
  tag = tag || "*";
  elm = elm || document;
  var classes = className.split(" "),
    classesToCheck = [],
    elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
    current,
    returnElements = [],
    match;
  for(var k=0, kl=classes.length; k<kl; k+=1){
    classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
  }
  for(var l=0, ll=elements.length; l<ll; l+=1){
    current = elements[l];
    match = false;
    for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
      match = classesToCheck[m].test(current.className);
      if (!match) {
        break;
      }
    }
    if (match) {
      returnElements.push(current);
    }
  }
  return returnElements;
};


function user_name_only(str) {
  return str.substring(str.lastIndexOf('/') + 1, str.lastIndexOf('.'))
} 

function replyLink(aNickName) {
  var link = document.createElement("a");
  link.href = "http://identi.ca/notice/new?replyto=" + aNickName;
  link.textContent = "reply";
  link.addEventListener("click", function(e) {
    e.preventDefault();
    var t = document.getElementById("status_textarea");
    t.value += "@" + aNickName + " ";
    t.focus();
    scrollTo(0, 0);
    counter(t);
  }, false);
  return link;
}

function counter(aNode) {
  var maxLength = 140;
  var currentLength = aNode.value.length;
  var remaining = 140 - currentLength;
  var counter = document.getElementById("counter");
  counter.textContent = remaining;
  if (remaining <= 0) {
    counter.className = "toomuch";
  } else {
    counter.className = "";
  }
}

function newForm() {
  var form = document.createElement("form");
  form.id = "status_form";
  form.method = "post";
  form.action = "http://identi.ca/notice/new";

  var p = form.appendChild(document.createElement("p"));

  var label = p.appendChild(document.createElement("label"));
  label.id = "status_label";
  label.setAttribute("for", "status_textarea");
  label.textContent = "What\'s up?";

  var span = p.appendChild(document.createElement("span"));
  span.id = "counter";
  span.className = "";
  span.textContent = "140";

  var textarea = p.appendChild(document.createElement("textarea"));
  textarea.id = "status_textarea";
  textarea.name = textarea.id;
  textarea.setAttribute("cols", "60");
  textarea.setAttribute("rows", "3");
  textarea.addEventListener("keyup", function(e) {
    counter(this);
  }, false);

  var send = p.appendChild(document.createElement("input"));
  send.id = "status_submit";
  send.name = send.id;
  send.type = "submit";
  send.value = "Send";

  return form;
}

})()