var C = {
	
	_loader: '#loader',
	
	init: function() {
		this.github.init();
		this.twitter.init();
	},
	
	_sendRequest: function(uri, callback) {
		
		var d = {};
		
		$.ajax({
			url: uri,
			type: 'GET',
			dataType: 'json',
			
			beforeSend: function() {
				$(C._loader).show();
			},
			complete: function() {
				$(C._loader).hide();
			},
			
			success: function(data) {
				d.success = true;
				callback($.extend(d, data));
			},
			error: function() {
				d.success = false;
				return d;
			}
			
		});
		
	},
	
	github: {
		
		_api: 'http://github.com/api/v1/json/ranza?callback=?',
		_selector: '#github ul',
		
		init: function() {
			this.parse();
		},
		parse: function() {
			var _git = this;
			C._sendRequest(this._api, function(data) {
				
				var response = (data.success) ? data.user.repositories : data.success;
				if(response != false) {
					
					$.each(response, function() {
						
						var link = $('<a/>', {
							text: this.name,
							href: this.url,
							title: this.description
						}).appendTo(_git._selector).wrap('<li/>');
						
					});
					
				}
				
			});
			
		}
		
	},
	
	twitter: {
		
		_api: 'http://twitter.com/statuses/user_timeline/ranza.json?callback=?',
		_selector: '#twitter ul',
		
		init: function() {
			this.parse();
		},
		prettify: {
			// replaces # with link to search.twitter.com
			replaceHash: function(tweet) {
				var regexp = /[\#]+([A-Za-z0-9-_]+)/gi;
				return tweet.replace(regexp, '<a href="http://search.twitter.com/search?q=&tag=$1&lang=all">#$1</a>');
			},
			// replaces urls with real links
			replaceUrl: function(tweet) {
				var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
				return tweet.replace(regexp, '<a href="$1">$1</a>');
			},
			// replaces @ with link to twitter.com/[user]
			replaceAt: function(tweet) {
				var regexp = /[\@]+([A-Za-z0-9-_]+)/gi;
				return tweet.replace(regexp, '<a href="http://twitter.com/$1">@$1</a>');
			},
			parseText: function(text) {
				var text = this.replaceUrl(text)
				text = this.replaceAt(text);
				text = this.replaceHash(text);
				return text;
			}
		},
		parse: function() {
			var _twit = this;
			C._sendRequest(this._api, function(data) {
				
				var response = (data.success) ? data : data.success;
				if(response != false) {
					
					$.each(response, function(index) {
						if(index == 4) {
							return false;
						}
						if(index != 'success') {
							var text = _twit.prettify.parseText(this.text);
							$('<li>' + text + '</li>').appendTo(_twit._selector);
						}
					});
					
				}
				
			});
			
		}
		
	}
	
};