/**
 * Twitter Feed Reader -- JavaScript Engine
 *
 * @author: Rahmin Pavlovic
 * @version: 03 June 2008
 *
 * copyright (c) 2008, Crain Communications
 *
 */

String.prototype.autolink = function() {
	var hlink = /\s(ht|f)tp:\/\/([^ \,\;\:\!\)\(\"\'\<\>\f\n\r\t\v])+/g;
	return this.replace (
		hlink, function ($0, $1, $2) {
			s = $0.substring(1, $0.length);

			// remove trailing dots, if any
			while (s.length > 0 && s.charAt(s.length-1)=='.') {
				s = this.substring(0, s.length-1);
			}
			// add hlink
			return " " + s.link(s); 
		}
	);
}

var JSON = {
	parse:function(code) {
		if (/^[\],:{}\s]*$/.test(code.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
			return eval('('+code+')');
		}
		return null;
	}
};

var DOM = {
	getElementById:function(id, tag) {
		if(document.getElementById && document.getElementById(id)) {
			return document.getElementById(id);
		}
		if(document.layers && document.layers[id]) {
			return document.layers[id];
		}
		if(document.all && document.all[id]) {
			return document.all[id];
		}
		if(this.createElement) {
			tag=(tag)? tag : 'div';
			el=this.createElement(tag);
			el.setAttribute('id', id);
			this.getElementsByTagName('body')[0].appendChild(el);
			return el;
		}
		return null;
	}
};

var AJAX={};

// return HTTP responses
AJAX.ReadyState={};
AJAX.ReadyState['Uninitialized']=0;
AJAX.ReadyState['Loading']		=1;
AJAX.ReadyState['Loaded']		=2;
AJAX.ReadyState['Interactive']	=3;
AJAX.ReadyState['Complete']		=4;

// initialize cross-browser HTTP request
AJAX.getHTTPRequest=function() {
	if(window.XMLHttpRequest) { return new XMLHttpRequest(); }
	if(window.ActiveXObject) {
		try { return new ActiveXObject("Msxml2.XMLHTTP"); }
		catch(e) { return new ActiveXObject("Microsoft.XMLHTTP"); }
	}
	return null;
}

// Constructor to setup HTTP file requests
AJAX.FileRequest=function(url, onload, onerror, method, params, contentType) {
	this.url=url;
	this.params=(params)? params : null;
	this.method=(method)? method : 'get';

	this.url+=(this.params!=null && this.method.toLowerCase()=='get')?'?'+this.params:'';
	this.contentType=(contentType)? contentType : "application/x-www-form-urlencoded";
	this.contentType=(!this.contentType && this.method.toLowerCase()=='post')? "application/x-www-form-urlencoded" : this.contentType;

	this.request=null;
	this.response=null;
	this.onload=(onload)? onload : this.OnLoad;
	this.onerror=(onerror)? onerror : this.OnError;
	this.sendFileRequest();
}

// method to generate an HTTP request for selected file
AJAX.FileRequest.prototype.sendFileRequest=function() {
	this.request=AJAX.getHTTPRequest();
	if(this.request) {
		try {
			// pass reference of current instance to event handler
			ref=this;
			this.request.onreadystatechange=function() { ref.onReadyState.call(ref); }

			// open HTTP connection
			this.request.open(this.method, this.url, 1);

			// set content-type header
			if(this.contentType) { this.request.setRequestHeader('content-type', this.contentType); }

			// send request
			this.request.send(this.params);
		}
		catch(err) {
			//alert('err 1')
			this.onerror.call(this);
		}
	}
}
AJAX.FileRequest.prototype.onReadyState=function() {
	if(this.request) {
		if(this.request.readyState == AJAX.ReadyState['Complete']) {
			if(this.request.status==200 || this.request.status==0) {
				this.response=this.request.responseText;
				this.onload.call(this);
			}
			else {
				//alert('err 2')
				this.onerror.call(this);
			}
		}
		else {
			//this.response=AJAX.ReadyState.getKeyProperty(this.request.readyState);
			//this.onload.call(this);
		}
	}
	else {
		//alert('err 3')
		this.onerror.call(this);
	}
}
AJAX.FileRequest.prototype.OnError=function() {
	if(this.request) {
		alert(
			"Error fetching data"
			+ "\n\tReadyState: " + this.request.readyState
			+ "\n\tStatus: " + this.request.status
			+ "\n\tHeaders: " + this.request.getAllResponseHeaders()
		);
	}
}
AJAX.FileRequest.prototype.OnLoad=function() {
	if(this.request) {
		alert(this.response);
	}
}

var twitterFeed;
var twitter = {

	html:[],
	limit:5,
	results:null,
	feedURL:'http://twitter.com/statuses/user_timeline/14692117.json',
	

	prepFeed:function() {
		DOM.getElementById('twitter_creativity').innerHTML = '<div align="center">Loading tweets...<br /><br /><img src="http://adage.com/images/global/ajax-arrows-036.gif" width="16" height="16" alt="" /></div>';
	},

	getFeed:function(count) {

		// store object instance
		twitterFeed = this;

		// display loading message before fetching feed
		this.prepFeed();

		// set limit based on widget config
		this.limit = (count) ? count : this.limit;

		// fetch feed
		new AJAX.FileRequest(
			'ajax/get_twitter_feed.php',
			function() {
				if(this.request && this.response) {
					twitterFeed.results=JSON.parse(this.response);

					for(var j=0; j<twitterFeed.results.length; j++) {
						twitterFeed.html.push('<div>');
						twitterFeed.html.push('<p id="twitter_tweet_', j, '" class="twitter_tweet">', twitterFeed.results[j].text.autolink());

						if(twitterFeed.results[j].text.indexOf('@'+twitterFeed.results[j].in_reply_to_screen_name) != -1) {
							//alert(twitterFeed.results[j].text.substring(0, twitterFeed.results[j].text.indexOf('@')));
/*
							twitterFeed.results[j].text = twitterFeed.results[j].text.substring(0, twitterFeed.results[j].text.indexOf('@')) + 
								'@<a href="http://twitter.com/' + twitterFeed.results[j].in_reply_to_screen_name + '">' + twitterFeed.results[j].in_reply_to_screen_name + '</a>';
*/
						}

						twitterFeed.html.push('</p>');
						twitterFeed.html.push('<p class="twitter_tweet_created">');
						twitterFeed.html.push('<em>Posted: <a href="http://twitter.com/creativitymag/status/', twitterFeed.results[j].id,'">', twitterFeed.results[j].created_at, '</a>');
						twitterFeed.html.push(', from ', twitterFeed.results[j].source);
						if(twitterFeed.results[j].in_reply_to_screen_name !== null) {
							twitterFeed.html.push(' in reply to <a href="http://twitter.com/',  twitterFeed.results[j].in_reply_to_screen_name,'">', twitterFeed.results[j].in_reply_to_screen_name, '</a>');
						}
						
						twitterFeed.html.push('</em></p>');
						twitterFeed.html.push('</div>');

						// stop if exceed limit
						if(j >= twitterFeed.limit-1) {
							break;
						}
					}
					twitterFeed.setFeed();
				}
			},
			null,
			'get',
			'url='+this.feedURL
		);
	},

	setFeed:function() {
		DOM.getElementById('twitter_creativity').innerHTML=this.html.join('');
		this.html.length=0;
	}
};

