Encoder = function(){

	function ReplacementProxy(field) {
		
		this.field = field;
		this.pos = field.selectionStart; // Try to get cursor position
	    this.endPos = field.selectionEnd;
	    this.scrollPos = field.scrollTop;
	    if( typeof(this.pos) == "undefined") {
	        // IE Method
	        // Force focus on the intended field
	        if (!field.focus()) {
	        	field.focus();
	        }
	        this.ieRange = field.ownerDocument.selection.createRange();
	        this.selectionText = this.ieRange.text;
	     }
	     else {
	     	this.selectionText= field.value.substring(this.pos, this.endPos);
	     }
	     
		
		this.addTag = function(prefix, suffix, text) {
			
			var newtext = prefix + (this.selectionText||text||"") + suffix;
			
			if( this.ieRange ) {
		        // IE Method
		        // Force focus on the intended field
		        if( !this.field.focus() ) this.field.focus();
		        this.ieRange.text=newtext;
		        this.ieRange.select();
		    }
		    else {
		        // Standards Compliant Method (Firefox, Opera, ...)
		        this.field.value = this.field.value.substr(0, this.pos) + newtext + this.field.value.substr(this.endPos);
		        this.field.selectionStart = this.pos + prefix.length;
		        this.field.selectionEnd = this.pos + newtext.length - suffix.length;	
		    }
	    
		    // Reset scroll position and focus
		    this.field.scrollTop = this.scrollPos;
		    this.field.focus();
	
		}
		this.replaceSelection = function(text){
			this.selectionText = text
			this.addTag("", "");
		}
		
	}
	
	return {
	
		bbedit: function(fieldname){
			var fn = fieldname||"body";
			
			return{

				italic: function (el) {
					var field = el.form.elements[fn];
					var replace = new ReplacementProxy(field);
					replace.addTag("[i]", "[/i]");
					field.focus();
				}
		
				,bold: function (el) {
					var field = el.form.elements[fn];
					var replace = new ReplacementProxy(field);
					replace.addTag("[b]", "[/b]");
					field.focus();
				}
	
				,quote: function (el) {
					var field = el.form.elements[fn];
					var replace = new ReplacementProxy(field);
					replace.addTag("[quote]", "[/quote]");
					field.focus();
				}
				
				,code: function (el) {
					var field = el.form.elements[fn];
					var replace = new ReplacementProxy(field);
					replace.addTag("[code]", "[/code]");
					field.focus();
				}
	
				,link: function (el) {
					var field = el.form.elements[fn];
					var replace = new ReplacementProxy(field);
					var url = prompt("URL", "http://");
					if(replace.selectionText)
						replace.addTag("[url=" + url +"]", "[/url]");
					else replace.addTag("[url]", "[/url]", url);
					field.focus();
				}
			}
		
		}
		
		,mardown: function(fieldname){
			var fn = fieldname||"body";
			
			return{
				italic: function (el) {
					var field = el.form.elements[fn];
					var replace = new ReplacementProxy(field);
					replace.addTag("*", "*");
					field.focus();
				}
		
				,bold: function (el) {
					var field = el.form.elements[fn];
					var replace = new ReplacementProxy(field);
					replace.addTag("**", "**");
					field.focus();
				}
	
				,quote: function (el) {
					var field = el.form.elements[fn];
					var replace = new ReplacementProxy(field);
	
					var lines = replace.selectionText.split('\n');
					for (var i=0; i < lines.length; i++) {
						var line = lines[i];
						lines[i] = "> " + line;
					}
					
					var replaceText = lines.join('\n');
					replace.replaceSelection(replaceText);
					field.focus();
				}
				
				,code: function (el) {
					var field = el.form.elements[fn];
					var replace = new ReplacementProxy(field);
	
					var lines = replace.selectionText.split('\n');
					if (lines.length > 1) {
						for (var i=0; i < lines.length; i++) {
							var line = lines[i];
							lines[i] = "    " + line;
						}
						var replaceText = lines.join('\n');
						replace.replaceSelection('\n'+replaceText);
					}
					else replace.addTag("`", "`", "my code");
					field.focus();
				}
	
				,link: function (el) {
					var field = el.form.elements[fn];
					var replace = new ReplacementProxy(field);
					var url = prompt("URL", "http://");
					replace.addTag("[", "](" + url + ")", "link text")
					field.focus();
				}
				
				,image: function (el) {
					var field = el.form.elements[fn];
					var replace = new ReplacementProxy(field);
					var url = prompt("URL", "http://");
					replace.addTag("![", "](" + url + ")", "alt text")
					field.focus();
				}
			}

		}
	}

}();
