(function(){
function sprintf(format){
var i = 1, re = /%s/, result = "" + format;
while (re.test(result) && i < arguments.length) result = result.replace(re, arguments[i++]);
return result;
}
function parseHTML(str, ignoreTags) {
var exp = "^[\\s\\S]*?]*)?>|[\\S\\s]*$";
if (ignoreTags) {
if (typeof ignoreTags == "string") ignoreTags = [ignoreTags];
var stripTags = [];
ignoreTags = ignoreTags.filter(function(tag) tag[tag.length - 1] == "/" || !stripTags.push(tag))
.map(function(tag) tag.replace(/\/$/, ""));
if (stripTags.length > 0) {
stripTags = stripTags.length > 1
? "(?:" + stripTags.join("|") + ")"
: String(stripTags);
exp += "|<" + stripTags + "(?:\\s[^>]*|/)?>|" + stripTags + "\\s*>";
}
}
str = str.replace(new RegExp(exp, "ig"), "");
var res = document.implementation.createDocument(null, "html", null);
var range = document.createRange();
range.setStartAfter(window.content.document.body);
res.documentElement.appendChild(res.importNode(range.createContextualFragment(str), true));
if (ignoreTags) ignoreTags.forEach(function(tag) {
var elements = res.getElementsByTagName(tag);
for (var i = elements.length, el; el = elements.item(--i); el.parentNode.removeChild(el));
});
return res;
}
function getElementsByXPath(xpath, node){
node = node || document;
var nodesSnapshot = (node.ownerDocument || node).evaluate(xpath, node, null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var data = [];
for(var i = 0, l = nodesSnapshot.snapshotLength; i < l;
data.push(nodesSnapshot.snapshotItem(i++)));
return (data.length > 0) ? data : null;
}
function getFirstElementByXPath(xpath, node){
node = node || document;
var result = (node.ownerDocument || node).evaluate(xpath, node, null,
XPathResult.FIRST_ORDERED_NODE_TYPE, null);
return result.singleNodeValue ? result.singleNodeValue : null;
}
function showFollowersStatus(){
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://mixi.jp/recent_echo.pl", false);
xhr.send(null);
var nodes = getElementsByXPath('id("echo")//div[@class="archiveList"]//tr', parseHTML(xhr.responseText, ['script']));
var statuses = [];
nodes.forEach(function(node) {
var img = getFirstElementByXPath('.//img', node).src;
var name = getFirstElementByXPath('.//*[@class="nickname"]', node).textContent.replace(/(?:\r?\n|\r)[ \t]*/g, "");
var c = getFirstElementByXPath('.//*[@class="comment"]', node).childNodes;
var text = '';
for (var n = 0; n < c.length; n++) {
if (c[n].nodeName.toUpperCase() == 'SPAN') break;
text += c[n].textContent.replace(/^\s+|\s+$/g, '').replace(/&/g, '&').replace(/>/g, '>').replace(/.toSource()
.replace(/(?:\r?\n|\r)[ \t]*/g, " ") +
statuses.map(function(status)
<>
{status.user.name}
>.toSource()
.replace(/(?:\r?\n|\r)[ \t]*/g, " ") +
sprintf(': ', status.text))
.join("
");
//liberator.log(html);
liberator.echo(html, true);
}
function sayEcho(text){
/* FIXME TODO: does not work!!!!!!!!!!!!!!!!!!!!
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://mixi.jp/recent_echo.pl", false);
xhr.send(null);
var form = getFirstElementByXPath('//form[@action="add_echo.pl"]', parseHTML(xhr.responseText, ['script']));
var input = getFirstElementByXPath('.//textarea', form);
input.value = text;
var params = [];
var inputs = getElementsByXPath('.//*[contains(" INPUT TEXTAREA SELECT ", concat(" ", local-name(), " "))]', form);
inputs.forEach(function(input) { params.push(input.name + '=' + encodeURIComponent(input.value)); });
xhr.open("POST", "http://mixi.jp/add_echo.pl", false);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(params.join('&'));
*/
}
liberator.commands.addUserCommand(["mixiecho"], "Change mixi echo",
function(arg, special){
if (special || arg.length == 0)
showFollowersStatus()
//else
//sayTwitter(username, password, arg);
},
{ });
})();