// ==UserScript==
// @licence       Mozilla
// @author        RussTyndall
// @name          TracTab
// @namespace     http://acceleration.net/GreaseMonkey/TraqTab
// @description   Makes tab work in the textarea on traq
// @include       *
// ==/UserScript==

(function(){

	var TabWidth=3;


//
// Cross Platform Event Adding
//
function AddEventListener( elem, evt, func, capture){
	capture = capture || false;
   if(elem.addEventListener) elem.addEventListener( evt, func, capture);
   else elem.attachEvent('on'+evt, func);
	return func;
}

///
///Better Cross PLatform Event Adding
///
function AddEventListenerWithTarget( elem, evt, func, capture){
	var newFunc = function( event ){
		var target;
      if(!event) event = window.event;
      if(event.target) target = event.target;
      else if(event.srcElement) target = event.srcElement;
      if(target.nodeType == 3) // Safari bug
         target = target.parentNode;
		func( event, target );
	}
	AddEventListener(elem, evt, newFunc, capture);
	return newFunc
}

//
// Cross Platform Event Removal
//
function RemoveEventListener(elem, evt, func){
   if(elem.removeEventListener) elem.removeEventListener( evt, func, false);
   else elem.detachEvent('on'+evt, func)
}

// Cross Platform Event Propogation stopping
function stopPropogation(event){
	if (window.event) { 
		window.event.cancelBubble = true; 
		window.event.returnValue = false;
	}
	if (event && event.preventDefault && event.stopPropagation) {
		event.preventDefault();
		event.stopPropagation();
	} 
	return false;
}


function getCaretPos(inp) {
	if(inp.selectionEnd)
		return inp.selectionEnd;
	
	if(inp.createTextRange) {
		//dump('using createTextRange\n');
		var docrange = _win.Shell.document.selection.createRange();
		var inprange = inp.createTextRange();
		//inprange.setEndPoint('EndToStart', docrange);
		return inprange.text.length;
	}
	
	return inp.value.length; // sucks, punt
}

//var note = document.createElement('span');
//note.appendChild(document.createTextNode('Ctrl+Tab will move to the next field'));
//note.style.cssText = "font-size:small; color:#AAAAAA;";

var i=0, strId;
var collection = document.getElementsByTagName('textarea') 
for (i=0; item = collection[i]; i++){
	(function(){
		var text = item;
		if(text != null){
			AddEventListenerWithTarget( text,   
												 'keypress', 
												 function( evt, target ){
													 if(evt.keyCode == 9){ //tab
														 var caret = text.selectionEnd;
														 var textVal = new String( text.value );
														 if(evt.shiftKey){  // go backward
															 var front = textVal.slice(0, caret );
															 var i=0;
															 while(i++ < TabWidth && front[front.length-1] == ' ') front = front.slice(0, front.length-1); 
															 text.value =  front+textVal.slice( caret );
															 text.selectionEnd = caret-(i-1);
														 }
														 else{
															 var spaces = '';
															 for(var i = 0; i < TabWidth ; i++) spaces += ' ';
															 text.value = textVal.slice(0, caret ) +spaces+textVal.slice( caret );
															 text.selectionEnd = caret+3;
														 }
														 stopPropogation(evt);
													 }
												 },
												 false);
		}
	})()
}

})();
