/**
 * TextareaTab: Allow tabs in textarea elements <http://code.seebz.net/p/textareatab/>
 *
 * Copyright (c) 2010 Sébastien Corne, <http://seebz.net>
 * TextareaTab is distributed under the MIT licence.
 */

(function(){
	var TextareaTab = {
		version: "1.0",
		className: "tab",
		init: function() {
			var TextareaTab = this;
			this.addEvent(window, "load", function() {
				var elements = document.getElementsByTagName("textarea");
				for(var i=0, elem; elem=elements[i]; i++) {
					var className = new RegExp("\\b" + TextareaTab.className + "\\b", "i");
					if(className.test(elem.className)) {
						TextareaTab.addEvent(elem, "keydown", TextareaTab.keydownFunction);
					}
				}
			});
			return this;
		},
		addEvent: function(obj, eventName, func) {
			if (obj.addEventListener) {
				obj.addEventListener(eventName, func, false);
			} else if (obj.attachEvent) {
				obj.attachEvent("on"+eventName, func);
			}
		},
		keydownFunction: function(e) {
			if(!e) e=event;
			
			if(e.keyCode==9) {
				if (e.preventDefault)
					e.preventDefault();
				e.returnValue = false;
				
				if(navigator.userAgent.match(/MSIE/i)) { // IE
					var range = document.selection.createRange();
					
					// IE supprime le "\n" en fin de sélection
					// On va essayer de corriger ça
					range.moveEnd("character", 1);
					var rangeValue = range.text;
					if( rangeValue.charCodeAt(rangeValue.length-2)!=10 ) {
						var moveEnd = false;
						range.moveEnd("character", -1);
						rangeValue = range.text;
					} else {
						var moveEnd = true;
					}
					var newRangeValue = "\t" + rangeValue.replace(/\r$/, "\n").replace(/\r\n/g, "\n\t");
					newRangeValue = newRangeValue.replace(/^\t\n\t/, "\n\t").replace(/\n\t$/, "\n");
					if(moveEnd) {
						newRangeValue = newRangeValue.replace(/\n\t([\S]?)$/, "\n$1");
					}
					
					range.text = newRangeValue;
					
					if(rangeValue.length!=0) {
						range.moveStart("character", -newRangeValue.length);
						if(moveEnd) {
							range.moveEnd("character", -1);
						}
					}
					range.select();
				} else if(typeof(this.selectionStart)!="undefined") { // FF
					var selStart = this.selectionStart;
					var selEnd   = this.selectionEnd;
					var selValue = this.value.substring(selStart, selEnd);
					var newSelValue = "\t" + selValue.replace(/\n/g, "\n\t");
					newSelValue = newSelValue.replace(/^\t\n\t/, "\n\t").replace(/\n\t$/, "\n");
					
					this.value = this.value.substring(0,selStart)
						+ newSelValue
						+ this.value.substring(selEnd, this.value.length);
					
					if(selValue.length==0) {
						this.selectionStart = this.selectionEnd = selStart+1;
					} else {
						this.selectionStart = selStart;
						this.selectionEnd   = selEnd + newSelValue.length - selValue.length;
					}
				} else { // Autres navigateurs ?
					return true;
				}
				
				return false;
			}
		}
	}.init();
})();


