/*
	---------
	TweetThis
	---------
	
	Methods:
	
	TweeThis.insert({
		url      : "",
		title    : "",
		username : "",
		parent   : node
	});
		
	TweeThis.inline({
		url      : "",
		title    : "",
		username : ""
	});
		
*/

var TweetThis = (function() {
	
	var defaults = {
		username	: "millerheavy",
		format		: "{!title}: {!url} RT @{!username}",
		url			: location.href.replace(/\#.*$/gim,''),
		title		: document.title.replace(/Jason\sMiller\sDesign\s[^\s\wa-zA-Z0-9_\-]\s([a-zA-Z0-9_\-\s]*?[^\s\wa-zA-Z0-9_\-]\s)?/,'')
	};
	
	var tweetThisCounter = 0;
	
	function insert(params) {
		params = params || {};
		if (!params.insertBefore && !params.parent) {
			return false;
		}
		
		tweetThisCounter++;
		
		var url = params.url || defaults.url,
			title = params.title || defaults.title,
			username = (params.username || defaults.username).replace(/^\@/,''),
			status = params.format || defaults.format,
			cbid = "_tweetthis_dfl8callback_"+tweetThisCounter;
		
		var btn = document.createElement("a");
		btn.className = "tweetthis_button";
		btn.innerHTML = "<span>Tweet This!</span>";
		btn.setAttribute("href", "http://twitter.com/home?status="+parseTemplate(status, {
			title		: title,
			url			: url,
			username	: username
		}));
		btn.setAttribute("target", "_blank");
		
		btn.onclick = function(e) {
			e = e||window.event;
			
			var win = window.open(btn.getAttribute("href"));
			var s;
			
			window[cbid] = function(response) {
				var url2 = (response.result===true && response.url) ? response.url.replace(/^http\:\/\//,'www.') : url;
				
				var tweeturl = "http://twitter.com/home?status=" + encodeURIComponent(parseTemplate(status, {
					title		: title,
					url			: url2,
					username	: username
				}));
				
				win.location.href = tweeturl;
				
				btn.setAttribute("href", tweeturl);
				
				window.setTimeout(function() {
					s.parentNode.removeChild(s);
					delete window[cbid];
				}, 1);
			};
			
			s = document.createElement("script");
			s.setAttribute("src", "http://dfl8.me/api/?callback="+encodeURIComponent(cbid)+"&url="+encodeURIComponent(url));
			document.getElementsByTagName("head")[0].appendChild(s);
			
			try {
				e.returnValue = false;
				if (e.preventDefault)
					e.preventDefault();
				if (e.cancelBubble)
					e.cancelBubble();
			}catch(err){}
			return false;
		};
		
		if (params.insertBefore) {
			params.insertBefore.parentNode.insertBefore(btn, params.insertBefore);
		}
		else {
			params.parent.appendChild(btn);
		}
	}
	
	
	function inline(params) {
		var baseid = "tweetthis_basearea_"+tweetthis_counter;
		document.write('<div id="'+baseid+'"></div>');
		params.parent = document.getElementById(baseid);
		insert(params);
	}
	
	
	
	
	
	function parseTemplate(format, values) {
		values = values || {};
		return format.replace(/{\!([a-z0-9_\-]*?)}/gim, function(str, key) {
			return values[key] || str;
		});
	}
	
	function load() {
		var t, c, i, j, h, t;
		var url, title;
		var nodes = document.getElementsByTagName("div");
		var l = nodes.length;
		for (var x=0; x<l; x++) {
			c = nodes[x];
			if (c.className && (c.className+" ").substring(0,13)=="viewdocument ") {
				for (i=0; i<(c.childNodes.length); i++) {
					h = c.childNodes[i];
					if (h.className && h.className=="documenttitle") {
						t = h.childNodes[0].href ? h.childNodes[0] : h.childNodes[1];
						insert({
							url : t.href,
							title : t.innerHTML,
							insertBefore : h
						});
						i = 999;
					}
				}
			}
		}
	}
	
	
	if (window.JMDWiki_HTTP_HOST) {
		var oldOnDom = window.onDOM || function(){};
		window.onDOM = function() {
			load();
			oldOnDom.apply(this,arguments);
		};
	}
	else {
		if (window.addEventListener) {
			window.addEventListener("load", load);
		}
		else if (window.attachEvent) {
			window.attachEvent("onload", load);
		}
		else {
			var oldLoad = window.onload || function(){};
			window.onload = function() {
				load();
				oldLoad.apply(this,arguments);
			};
		}
	}
	
	
	return {
		insert	: insert,
		inline	: inline
	};
})();
