// ==UserScript==
// @name           Full Twitter
// @namespace      com.expertsbundle.twitter
// @description    Expands Twitter interface to use the 100% of the screen
// @include        http://twitter.com/*
// @include        https://twitter.com/*
// ==/UserScript==

/*!
 * Full Twitter
 * Copyright 2010, Oscar Nevarez Leal
 * Copyright 2010, expertsbundle.com
 * Released under the MIT, BSD, and GPL Licenses.
 *
 * Date: Feb 12 19:43:33 2010 -0500
 * Modified : Feb 14 04:28:02 2010 -0500
 */
 
var ftpackage = 'com.expertsbundle.fulltwitter';
var __GLOBAL_CSS_STYLE_FILE__ = 'http://labs.instropy.com/GreaseMonkey_twitter/fulltwitter.user.css?fc='+Math.random();


//@globals------

Object.prototype.extends = function(target){ for(var s in target) this[s] = target[s]; };
window.$ = {'utils':{},'css':{},'twitter':{}};
function e($id){return document.getElementById($id);};

var com={expertsbundle:{fulltwitter:{
	
		css:{
			loadStyleSheet:function($file){
				var head, style;
				head = document.getElementsByTagName('head')[0];
				if (!head) { return; }
				style = document.createElement('link');
				style.type = 'text/css';
				style.rel = 'stylesheet';
				style.href = $file;
				head.appendChild(style);
			},
			addGlobalStyle:function(css) {
				var head, style;
				head = document.getElementsByTagName('head')[0];
				if (!head) { return; }
				style = document.createElement('style');
				style.type = 'text/css';
				style.innerHTML = css;
				head.appendChild(style);
			},
			addClass:function(element, value) {
				if(!element.className) {
					element.className = value;
				} else {
					newClassName = element.className;
					newClassName+= " ";
					newClassName+= value;
					element.className = newClassName;
				}
			}	
		},
		
		utils:{
		
		css_attr:function(el,attrs){ for(var s in attrs)el.style[s] = attrs[s]; }
		,attr:function(el,attrs){for(var s in attrs)el[s] = attrs[s];}
		,serialize:function (form){
			var elements = form.getElementsByTagName('*');
			var i;
			var count = 0;
			var controls = new Array();
			var res='';
			for(i=0;i<elements.length;i++)
			{
				if(elements[i].tagName.toLowerCase()=='input' || elements[i].tagName.toLowerCase()=='select' || elements[i].tagName.toLowerCase()=='textarea')
				{
					if(elements[i] && !elements[i].disabled && elements[i].name.length>0)
					{
						var tmp = '';
						if(elements[i].type=="checkbox" || elements[i].type=="radio")
						{
							if(elements[i].checked)
								tmp = elements[i].name + "=" + encodeURIComponent(elements[i].value);
						}
						else
							tmp = elements[i].name + "=" + encodeURIComponent(elements[i].value);
						if(res=='') res = tmp; else if (res!='' && tmp!='') res = res + "&" + tmp;
					}
				}
			}
			
			return res;
		},
		
		ajax:function(){
		var objeto;
		try{
				objeto  = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e1) {
			try{
				objeto  = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e2) {
				objeto  = null;
			}
			}
			if (! objeto ) {
			if (typeof XMLHttpRequest != "undefined") {
				objeto  = new XMLHttpRequest();
			}
		}
		return objeto;
	},
	bind:function($element,$evt,callback){
		if ($element.addEventListener){$element.addEventListener($evt,callback, false);}
		else{$element.attachEvent("on"+$evt,callback, false);}
	},	
	ft_encodeParams:function(params){
		var str='',s='';
		for(s in params) str+= s+"="+encodeURI(params[s])+'&';
		return str.slice(0,str.length-1);
	},	
	ft_post:function($url,$params,$callback){
		
		var http_request = $.utils.ajax();
		var parameters = $.utils.ft_encodeParams($params);
		
		http_request.onreadystatechange = $callback;
		http_request.open('post','status/update',false);
		http_request.setRequestHeader("Host", "twitter.com");
		http_request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
		http_request.setRequestHeader("Referer", "http://twitter.com/");
		http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
		http_request.setRequestHeader("Content-length", parameters.length);
		http_request.setRequestHeader("Connection", "close");
		http_request.send(parameters);
	},	
	normalize:function(){
		
		var body = document.getElementsByTagName("body")[0];
		
		$.utils.css_attr(body,{overflow:'auto'});
		$.utils.css_attr(e('ft_overlay'),{display:'none'});
		$.utils.css_attr(e('container'),{display:'block'});
		$.utils.css_attr(e('goFullBtn'),{display:'block'});		
		$.utils.bind(document,'keyup',function(){});
	},	
	highlightSimilars:function($userid){
		var parentNode,element,els,i;
		
		els = document.getElementsByClassName('ft_photo'); 
		for(i=0;i<els.length;i++){
			
			var _opacity = ($.twitter.extractUserIdFromSrcImage(els[i].src) != $userid) ? .6: 1;
			parentNode = els[i].parentNode.parentNode.parentNode;
			$.utils.css_attr(parentNode,{opacity:_opacity});
		}
	},
	insertClones:function(elements,into){ 
		var statusID;
		var userID;
		
		for(var el in elements){
			
			if('object' != typeof elements[el]) continue;
			
			statusID = elements[el].getAttribute('id').split("_")[1];
			userID = String(elements[el].className.split("u-")[1]).split(" ")[0];
			
			var clone = elements[el].cloneNode(true);
			var image = (clone.getElementsByClassName("photo")[0]);
			
			$.css.addClass(clone,'ft_hentry');			
			into.appendChild(clone); 			
			statusID = statusID = '';
			
			$.css.addClass(image,'ft_photo');
			
			$.utils.bind(image,'mouseover',function($evt){
				var _this = $evt.target;
				var userid = $.twitter.extractUserIdFromSrcImage(_this.src);
				$.utils.highlightSimilars(userid);
			});
			
			/*
			clone.innerHTML+= '<a class="a2a_dd" href="http://www.addtoany.com/share_save?linkname=&amp;linkurl=http%3A%2F%2Ftwitter.com%2F'+userID+'%2Fstatus%'+statusID+'"><img src="http://static.addtoany.com/buttons/share_save_106_16.gif" width="106" height="16" border="0" alt="Share/Bookmark"/></a><script type="text/javascript">a2a_linkurl="http://twitter.com/'+userID+'/status/'+statusID+'";</script><script type="text/javascript" src="http://static.addtoany.com/menu/page.js"></script>';
			*/
		}
		
		
	}
	,findElement:function($el,$exp){
		var i=0 , ind = 0;		
		var tag = '',typ = '';
		
		var found = -1;
		
		//tag:index
		if($exp.match(/^([a-z]*)\:([0-9]+)$/i)){
			tag = $exp.split(':')[0];
			ind = $exp.split(':')[1];
			//console.log($exp.split(':'));
		//tag:type:index
		}else if($exp.match(/^([a-z]*)\:([a-z]*)\:([0-9]+)$/i)){
			tag = $exp.split(':')[0];
			typ = $exp.split(':')[1];
			ind = $exp.split(':')[2];
			//console.log($exp.split(':'));
		}else{
			tag = $exp;
		}
		
		var els = $el.getElementsByTagName(tag);
		
		//console.log("findElement [args] -> ",tag,typ,ind);
		
		for(i=0;i<els.length;i++)
		{
			//console.log("iteration ",els[i].tagName.toLowerCase(),els[i].type);
			
			if(els[i].tagName.toLowerCase()==tag){
				if(els[i].type == typ){
					if(++found == ind){
						return els[i]; 
					}else{
						continue;
					}					
				}				
				//-----------				
				/*
				if(ind!=-1 && ++found == ind){
					return els[i];				
				}else{
					found++;
				}
				*/
			}///
			
		}
		
		return null;
		
	}//end fcn
		
		},//end utils package
		
		twitter:{
			
			initialized:false,
			overlay:null,
			
			extractUserIdFromSrcImage:function($src){ return String($src.split("/profile_images")).split("/")[3] }
			
			,tweet:function($msg,$callback){
				var params = {};
					params.authenticity_token=e('authenticity_token').value;
					params['lat']='';
					params['long']='';
					params['location_string']='';
					params['return_rendered_status']=true;
					params['status']=$msg;
					params['twttr']=true;
				$.utils.ft_post('status/update',params,$callback);
			},
			
			tryTweetDefault:function(){
				var tweetMsg = e('ft_status').value;
				if(tweetMsg!='')
				$.twitter.tweet(tweetMsg);
			},
			
			getTweetsDomElements:function(){
				return Array.filter( document.getElementsByClassName('hentry'), function(elem){ return elem.nodeName == 'LI'; });
			},
			onGo:function(e){
				try{
					$.twitter.ftInitializeer(); 
					$.utils.css_attr(e('goFullBtn'),{display:'none'});						
				}catch(e){
					//alert(e);
				}
			},
			onCreationComplete:function(){
				
				var body = document.getElementsByTagName("body")[0];	
				var overlay = document.createElement("div");
				var topbar = document.createElement("div");				
				var goFullBtn = document.createElement("div");
				
				var sidebar = e('side').cloneNode(true);
					$.utils.attr(sidebar,{'id':'ft_sidebar'});
				
				$.utils.attr(topbar,{'class':'ft_topbar','id':'ft_topbar','align':'center'});	
				$.utils.attr(overlay,{'id':'ft_overlay','align':'center'});
				$.utils.attr(goFullBtn,{'id':'goFullBtn'});				
				$.utils.css_attr(overlay,{'position':'absolute','width':'100%','height':'100%','top':0,'left':0,'zIndex':100,'overflow':'auto'});
				
				overlay.appendChild(e('header').cloneNode(true));
				topbar.appendChild(e('status_update_form').cloneNode(true));
				
				goFullBtn.appendChild(document.createTextNode("Go Full Twitter"));
				
				$.utils.bind(goFullBtn,'click',$.twitter.onGo);
				
				overlay.appendChild(sidebar);
				overlay.appendChild(topbar);
				
				e('profile').appendChild(goFullBtn);
				
				var _ft_status_update_form = topbar.getElementsByTagName("form")[0]; $.utils.attr(_ft_status_update_form,{id:'ft_status_update_form'}); 								
				var txtStatus = _ft_status_update_form.getElementsByTagName('textarea')[0];				
				var updateBtn = $.utils.findElement(_ft_status_update_form,'input:submit:0');
				
				updateBtn.removeAttribute('disabled');
				
				$.utils.attr(updateBtn,{id:'ft_updateBtn'});
				$.utils.attr(txtStatus,{id:'ft_status'});
				$.utils.bind(updateBtn,'click',function($ev){ $ev.preventDefault(); $ev.stopPropagation(); $.twitter.tryTweetDefault(); return false; });
				
				//-- Style		
				$.css.loadStyleSheet(__GLOBAL_CSS_STYLE_FILE__);
				
				$.twitter.overlay = overlay;
				$.twitter.sidebar = sidebar;
			
			},
			
			ftInitializeer:function(){
				
				var body = document.getElementsByTagName("body")[0];
				var nodeListH = document.createElement("ul");
					$.utils.attr(nodeListH,{id:'ft_nodeUList'});
				
				$.utils.css_attr(body,{overflow:'hidden'});
				$.utils.css_attr(e('container'),{display:'none'});
				
				$.utils.bind(document,'keyup',function(e){												
				var kC  = (window.event) ?    // MSIE or Firefox?
				event.keyCode : e.keyCode;
				var Esc = (window.event) ?   
				27 : e.DOM_VK_ESCAPE; // MSIE : Firefox
				if(kC==Esc){
					$.utils.normalize();
				}});
				
				if(!$.twitter.initialized){//overlay.parentNode
					
					var hentrys = $.twitter.getTweetsDomElements();
					
					//alert(hentrys);
					
					$.utils.insertClones(hentrys,nodeListH);
					$.twitter.overlay.appendChild(nodeListH);
					
					body.appendChild($.twitter.overlay);
					
					alert("Press esc for exit of fulltwitter");
					
					$.twitter.initialized = true;
					
				}else{
					$.twitter.utils.css_attr(e('ft_overlay'),{display:'block'});
				}
				
			},
	
			
			}//end twitter package
		}//end expertsbundle
	}//end package fulltwitter
};//end package def

window.$.extends(com.expertsbundle.fulltwitter);
window.$.twitter.onCreationComplete();