var BBCodeEditor = new Class({

    CSS_CLASS_NAME: "bbCodeEditor",

    initialize: function(inputId, bbCodeElements) {
        this.element = new Element("div");
        this.element.set("class", this.CSS_CLASS_NAME);

        this.input = $(inputId);
        var tagName;
        var attributes;
        
        for(var i = 0; i < bbCodeElements.length; i++)
        {
            var obj = this;
            
            var button = new Element("a", { "href": "#" });
            button.set("class", "button");
           
            button.set("text", bbCodeElements[i][0]);
            button.bbCodeTag = bbCodeElements[i][1];
            button.bbCodeAttributes = $chk(bbCodeElements[i][2]) ? bbCodeElements[i][2] : [];
            
            button.addEvent("click", function(e) { e.stop(); obj.markUp(this.bbCodeTag, this.bbCodeAttributes); });
            
            this.element.grab(button);
        }
    },
    
    markUp: function(tagName, attributes) {
        var openTag = "[" + tagName;
        
        for(var i = 0; i < attributes.length; i++)
        {
            openTag += " " + attributes[i] + "=\"\"";
        }
                
        openTag += "]";
        
        var closeTag = "[/" + tagName + "]";

        this.input.focus();
        
        if(document.selection != undefined)
        {
            var range = document.selection.createRange();
            var insText = range.text;
            range.text = openTag + insText + closeTag;
            
            
            range = document.selection.createRange();
            if(insText.length == 0)
            {
                range.moveStart('character', -closeTag.length);
                range.moveEnd('character', -closeTag.length);
            }
            else
            {
                range = document.selection.createRange();
                document.selection.createRange().moveStart('character', openTag.length + insText.length + closeTag.length);
            }
            range.select();
        }
        else if(this.input.selectionStart != undefined)
        {
            var scrollPos = this.input.scrollTop;
        
            var start = this.input.selectionStart;
            var end = this.input.selectionEnd;
            var insText = this.input.value.substring(start, end);
            
            this.input.value = this.input.value.substr(0, start) + openTag + insText + closeTag + this.input.value.substr(end);
            
            
            var pos;
            if(insText.length == 0)
            {
                pos = start + openTag.length;
            }
            else
            {
                pos = start + openTag.length + insText.length + closeTag.length;
            }
            
            this.input.selectionStart = pos;
            this.input.selectionEnd = pos;
            
            
            this.input.scrollTop = scrollPos;
        }
        else
        {
            this.input.value += openTag + closeTag;
        }
    },
    
    insert: function(text)
    {
        this.input.focus();

        if(document.selection != undefined)
        {
            var range = document.selection.createRange();
            range.text = text;
            
            range = document.selection.createRange();
            range.move('character', -text.length);
            range.select();
        }
        else if(this.input.selectionStart != undefined)
        {
            var scrollPos = this.input.scrollTop;
            
            var start = this.input.selectionStart;
            var end = this.input.selectionEnd;
            
            this.input.value = this.input.value.substr(0, start) + text + this.input.value.substr(end);
            
            pos = start + text.length;
            
            this.input.selectionStart = pos;
            this.input.selectionEnd = pos;
            
            
            this.input.scrollTop = scrollPos;
        }
        else
        {
            this.input.value += text;
        }
    },
    
    
    // this function gets automatically called when this object is being used as an elment, i.e. by the $-function
    toElement: function()
    {
        return this.element;
    }
});