// ==UserScript==
// @name           LDRize_Command_Tumblr_Reblog
// @namespace      http://ido.nu/kuma/
// @description    add reblog function to LDRize minibuffer command.
// @include        http://*.tumblr.com/*
// ==/UserScript==

function trace() {
	var fn;
	if ( typeof Firebug == 'undefined' ) {
		fn = console;
	} else if ( Firebug && Firebug.Console && Firebug.Console.log  ) {
		fn = Firebug.Console;
	}

	if ( fn ) {
		if ( arguments.length == 1 ) {
			fn.log(arguments[0]);
		} else {
			var args = [];
			for (var i = 0; i < arguments.length; i++) {
				args.push(arguments[i]);
			}
			fn.log(args);
		}
	}
}
var log = trace;

window.Tumblr = {
	Reblog: {
		VERSION: "0.0.2",
		init: function () {
			window.LDRize.addCommand(this.reblog);

			trace(window.AutoPagerize);

			window.AutoPagerize.addFilter ( function(page_element) {
				trace(page_element);
			} );
		},
		reblog: {
			name: 'reblog',
			command: function ( info ) {
				//"http://www.tumblr.com/reblog/9658275?r=dashboard"
				var xpath = ( window.location.host == 'www.tumblr.com' ?
									'(.//div[@class="control"]//a)[1]/@href' :
									'.//div[@class="permalink"]/a/@href' );
				var index = 0;
				info.paragraphes.forEach( function ( paragraph ) {
					var permalinks = window.LDRize.$X(xpath, paragraph);
					var permalink = permalinks.pop();

					if ( ! permalinks ) 
						return;
						
					var u = permalink.value;
					if ( u.match( /\/(\d+)$/ ) ) {
						var id = RegExp.$1;
						setTimeout( function () {
							reblog( id, function () {
								trace( u + " reblooged.");
							} );
						}, index++ * 3000 );
					}
				} );
			//	info.links.forEach ( function ( u ) {
			//	} );
				return false;
			},
			condition: function(siteinfo) {
				log("siteinfo");
				log(siteinfo);
				//return siteinfo['link']
				return true;
			}
		}
	}
};


var timerid = window.setInterval( function() {
	if(window.LDRize) {
		window.Tumblr.Reblog.init();
	};
	window.clearInterval(timerid);
}, 500);

function addTab() {
	// cannot open nerw tab in gm context.
}


//
// copied from ShareOnTumblr.js (c) id:brazil 
// http://d.hatena.ne.jp/brazil/20070708/1183855622
// and add onload argument to reblog function.
//

var context = {
	title:  '',
	withKey: 0,
};
var SHIFT_KEY = 1;
var CTRL_KEY = 2;

function reblog(id, onload){
	var url = 'http://www.tumblr.com/reblog/' + id;
	
	var onerror = function(res){
		addTab(url);
		alert('Post failed. (' + res.status + ')');
	}
	
	getInputFields(url, function(fields){
		if(fields['post[type]']=='photo'){
			var source = {
				url : url,
				title : 'ReBlog: ' + id,
			}
			
			checkPhoto(function(){
				postByXHR(url, fields, onload, onerror);
			}, source);
			
			return;
		}
		
		postByXHR(url, fields, onload, onerror);
	}, onerror)
}

function getInputFields(url, onload, onerror){
	getByXHR(
		url, 
		null, 
		function(res){
			var doc = convertToHTMLDocument(res.responseText);
			var elms = LDRize.$X('id("edit_post")//*[name()="INPUT" or name()="TEXTAREA"]', doc, true);
			var fields = {};
			elms.forEach(function(elm){
				fields[elm.name] = elm.value;
			});
			return onload(fields);
		}, 
		onerror
	)
}

function postByXHR(url, params, onload, onerror){
	url = url + 
	GM_xmlhttpRequest({
		method : 'POST',
		url : url,
		data : queryString(params),
		onload : function(res){
			if(res.status!=200)
				return onerror(res);
			onload && onload(res);
		},
		onerror : onerror,
		headers : {
			'Content-Type' : 'application/x-www-form-urlencoded',
		}
	})
}
function checkPhoto(proceed, source){
	var onerror = createReopener('Post failed.', source);
	var onlimit = createReopener("You've used 100% of your daily photo uploads.", source);
	getInputFields('http://www.tumblr.com/new/photo', function(fields){
		if(isEmpty(fields))
			return onerror();
		
		if(!('photo_src' in fields))
			return onlimit();
		
		proceed();
	}, onerror);
}
function createReopener(msg1, source){
	source = source || {
		url : location.href,
		title : context.title,
	}
	return function(res, msg2){
		msg2 = msg2 || '';
		if(confirm(
			msg1 + msg2 + '\n'+
			'Will you reopen?\n\n' + 
			'Source page: ' + source.title + '\n' + source.url)){
			addTab(source.url);
		}
	}
}
function getByXHR(url, params, onload, onerror){
	url = url + queryString(params, true);
	GM_xmlhttpRequest({
		method : 'GET',
		url : url,
		onload : function(res){
			if(res.status!=200)
				return onerror(res);
			onload && onload(res);
		},
		onerror : onerror,
	})
}
function queryString(params, question){
	if(isEmpty(params))
		return '';
	
	var qeries = [];
	for(var key in params)
		qeries.push(key + '='+ encodeURIComponent(params[key]));
	return (question? '?' : '') + qeries.join('&');
}
function isEmpty(obj){
	for(var i in obj)
		return false;
	return true;
}
function convertToHTMLDocument(html) {
	var xsl = (new DOMParser()).parseFromString(
		'<?xml version="1.0"?>\
			<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">\
			<output method="html"/>\
		</stylesheet>', "text/xml");
	
	var xsltp = new XSLTProcessor();
	xsltp.importStylesheet(xsl);
	
	var doc = xsltp.transformToDocument(document.implementation.createDocument("", "", null));
	doc.appendChild(doc.createElement("html"));
	
	var range = doc.createRange();
	range.selectNodeContents(doc.documentElement);
	doc.documentElement.appendChild(range.createContextualFragment(html));
	
	return doc
}

