
//alert("RETWEET.JS!");

var baseURL = "http://search.twitter.com/search.json";

var searchURLs = new Array();
/**
 * Concatenates the values of a variable into an easily readable string
 * by Matt Hackett [scriptnode.com]
 * @param {Object} x The variable to debug
 * @param {Number} max The maximum number of recursions allowed (keep low, around 5 for HTML elements to prevent errors) [default: 10]
 * @param {String} sep The separator to use between [default: a single space ' ']
 * @param {Number} l The current level deep (amount of recursion). Do not use this parameter: it's for the function's own use
 */
function print_r(x, max, sep, l) {

	l = l || 0;
	max = max || 10;
	sep = sep || ' ';

	if (l > max) {
		return "[WARNING: Too much recursion]\n";
	}

	var
		i,
		r = '',
		t = typeof x,
		tab = '';

	if (x === null) {
		r += "(null)\n";
	} else if (t == 'object') {

		l++;

		for (i = 0; i < l; i++) {
			tab += sep;
		}

		if (x && x.length) {
			t = 'array';
		}

		r += '(' + t + ") :\n";

		for (i in x) {
			try {
				r += tab + '[' + i + '] : ' + print_r(x[i], max, sep, (l + 1));
			} catch(e) {
				return "[ERROR: " + e + "]\n";
			}
		}

	} else {

		if (t == 'string') {
			if (x == '') {
				x = '(empty)';
			}
		}

		r += '(' + t + ') ' + x + "\n";

	}

	return r;

};
var_dump = print_r;

/**
*
*  URL encode / decode
*  http://www.webtoolkit.info/
*
**/
 
var Url = {
 
	// public method for url encoding
	encode : function (string) {
	
		//alert("Encode!");
	
		return escape(this._utf8_encode(string));
	},
 
	// public method for url decoding
	decode : function (string) {
		return this._utf8_decode(unescape(string));
	},
 
	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
 
		}
 
		return utftext;
	},
 
	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 
		while ( i < utftext.length ) {
 
			c = utftext.charCodeAt(i);
 
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
 
		}
 
		return string;
	}
 
}


//alert("Begin getElementsByClassName");

/*
 * Developed by Robert Nyman, http://www.robertnyman.com Code/licensing:
 * http://code.google.com/p/getelementsbyclassname/
 */
var getElementsByClassName = function (className, tag, elm){
if (document.getElementsByClassName) {
	getElementsByClassName = function (className, tag, elm) {
		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);
			}
		}
		return returnElements;
	};
}
else if (document.evaluate) {
	getElementsByClassName = function (className, tag, elm) {
		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);
		}
		return returnElements;
	};
}
else {
	getElementsByClassName = function (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;
	};
}
return getElementsByClassName(className, tag, elm);
};

//alert("Begin my code");

function twitterSearch(searchTerm)
{
	//alert("twitterSearch: "+searchTerm);
	
	var query = 'rpp=100&q='+Url.encode(searchTerm);
	
	//alert("query: "+query);
	
	jsonpRequest(query, 'twitterSearchResponse');
}

function jsonpRequest(query, callback)
{   
	//alert("jsonpRequest: "+query+" : "+callback);
	
	var url = baseURL+"?callback="+callback+"&"+query;
	
	//alert("url: "+url);
	
    var script = document.createElement("script");        
    script.setAttribute("src",url);
    script.setAttribute("type","text/javascript");                
    document.body.appendChild(script);
}

function twitterSearchResponse(result)
{
	
	//alert("twitterSearchResponse: "+result);
	
	var myURL;
	if(result.query)
	{
		//alert("We have a query: "+result.query+" : "+Url.decode(result.query));
		
		//alert(print_r(result));
		
		myURL = Url.decode(result.query);
		for(var i = 0; i < searchURLs.length;  i++)
		{
			if(searchURLs[i].url == myURL)
			{
				//alert("Page: "+result.page+" count: "+result.results.length);
				
				searchURLs[i].count += result.results.length;
			}
		}
		
		if(result.nextPage != null) jsonpRequest(result.nextPage, 'twitterSearchResponse');
		else insertCount(myURL);
	}
	
	
}

function insertCount(myURL)
{
	
	//alert("insertCount: "+myURL);
	var countSpan;
	
	for(var i =  0; i < buttons.length; i++)
	{
		countSpan = buttons[i].getElementsByTagName("span")[0];
		if(countSpan.getAttribute("tweetURL") == myURL)
		{
			countSpan.innerHTML = formatCount( (getSearchURLCount(myURL)?getSearchURLCount(myURL):0) );
		}
	}
}

function getSearchURLCount(myURL)
{
	for(var  i = 0; i < searchURLs.length; i++)
	{
		if(myURL == searchURLs[i].url)
			return searchURLs[i].count;
	}
	
	return false;
}

function setSearchURLCount(myURL, newCount)
{
	for(var  i = 0; i < searchURLs.length; i++)
	{
		if(myURL == searchURLs[i].url)
		{
			searchURLs[i].count = newCount;
			return true;
		}
	}
	
	return false;
}

function addCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

function formatCount(count)
{
	var countString = '';
	
	if(count > 10000)
	{
		countString = parseInt((count/1000)+'') + " K";
	}
	else
	{
		countString = addCommas(count);
	}
	
	return countString;
}

//alert("Functions done!");


function getTarget(possibleTarget){
    while (possibleTarget.nodeName.toLowerCase() !== "a") {
        possibleTarget = possibleTarget.parentNode;
    }
    return possibleTarget;
}

function startCount(event)
{
	var button = getTarget(event.target);
	
	var countSpan = button.getElementsByTagName("span")[0];
	
	setSearchURLCount(countSpan.getAttribute("tweetURL"), 0);
	
	twitterSearch(countSpan.getAttribute("tweetURL"));
}

var buttons = getElementsByClassName("retweetButton", "a");
var retweetButton;
var countSpan;

for(var i =  0; i < buttons.length; i++)
{
	retweetButton = buttons[i];
	countSpan = retweetButton.getElementsByTagName("span")[0];
	
	//alert("CountSpan: "+countSpan+" shortURL: "+countSpan.getAttribute("tweetURL"));
	
	searchURLs.push({"url":countSpan.getAttribute("tweetURL"), "count":0})
	
	//alert("SearchURLS: "+searchURLs.length+": "+searchURLs[i]);
	
	twitterSearch(countSpan.getAttribute("tweetURL"));
	
	retweetButton.addEventListener('click', startCount, false);
}




