RBjs_Bbcode = function( owner )
{
    this.owner = owner;
    var me = this;
    this.cache = {};
    
    this.textareaInit = function(selector, obj)
    {
        if(selector != '')
        {
            me.cache['current_id'] = document.getElementById(selector);//$j(selector)[0];
        }
        else
        {
            me.cache['current_id'] = obj;
        }
    }
    
    this.setCaretPosition = function(pos)
    {
        ctrl = me.cache['current_id'];
        if(ctrl.setSelectionRange)
        {
            ctrl.focus();
            ctrl.setSelectionRange(pos,pos);
        }
        else if (ctrl.createTextRange) {
            var range = ctrl.createTextRange();
            range.collapse(true);
            range.moveEnd('character', pos);
            range.moveStart('character', pos);
            range.select();
        }
    }
    
    this.getCaretPosition = function()
    { 
        el = me.cache['current_id']; 
        if (el.selectionStart) { 
        return el.selectionStart; 
        } else if (document.selection) { 
        el.focus(); 

        var r = document.selection.createRange(); 
        if (r == null) { 
          return 0; 
        } 

        var re = el.createTextRange(), 
            rc = re.duplicate(); 
        re.moveToBookmark(r.getBookmark()); 
        rc.setEndPoint('EndToStart', re); 

        return rc.text.length; 
        }  
        return 0; 
    }  
        
    this.selectedText = function()
    {
        //IE support
        if (document.selection) {
            me.cache['current_id'].focus();
            var sel = document.selection.createRange();
            if(sel == null) return {txt: sel.text + '', start: 0};
            return {txt: sel.text + '', start: me.getCaretPosition()};
        }
        //MOZILLA/NETSCAPE support
        else if (me.cache['current_id'].selectionStart || me.cache['current_id'].selectionStart == '0'){
            var startPos = me.cache['current_id'].selectionStart;
            var endPos = me.cache['current_id'].selectionEnd;
            return {txt: me.cache['current_id'].value.substring(startPos, endPos), start: startPos}//me.cache['current_id'].value.substring(startPos, endPos);
            } else {
            return '';
        }
    }
  
    
    this.replaceSelected = function(replacetext)
    {
        //IE support
        if (document.selection) {
            me.cache['current_id'].focus();
            sel = document.selection.createRange();
            sel.text = replacetext;
            sel.collapse(false);
            sel.select();            
        }
        //MOZILLA/NETSCAPE support
        else if (me.cache['current_id'].selectionStart || me.cache['current_id'].selectionStart == '0') {
                var startPos = me.cache['current_id'].selectionStart;
                var endPos = me.cache['current_id'].selectionEnd;
                me.cache['current_id'].value = me.cache['current_id'].value.substring(0, startPos) + replacetext + me.cache['current_id'].value.substring(endPos, me.cache['current_id'].value.length);
            } else {
            me.cache['current_id'].value += replacetext;
        }
        me.cache['current_id'].focus();
    }
    
    this.insertTag = function(tag, diff, promt, promt_title, options, promt_default)
    {        
        if(!me.cache['current_id']) return false;
        var diff = diff || 0;
        var promt = promt || false;
        var promt_default = promt_default || 'http://';
        var options = options || '';
        var tag_option = tag;
        
        var s = me.selectedText();
        var txt;        

        if(promt === true)
        {
            promt_arg = prompt(promt_title+'', promt_default);
            if(promt_arg)
            {
                if(options != '')
                {
                    tag_option += options;
                    tag_option = tag_option.replace('\{option\}', promt_arg);
                    diff += promt_arg.length;
                }
                else
                {
                    s['txt'] = promt_arg;
                }
            }
            else
            {
                return false;
            }
        }        
        //форсированная всатвка без промта promt_title - параметр
        else if(promt == 100)
        {
            s['txt'] = promt_title;
        }
        
        
        txt = '['+tag_option+']'+s['txt']+'[/'+tag+']';
        
        me.replaceSelected(txt);        
        me.cache['current_id'].focus();        
        
        if(s['txt'] == '')
        {
            me.setCaretPosition(s['start'] + diff);
        }
        else
        {
            me.setCaretPosition(s['start'] + txt.length);
        }
        return false;
    }
    
    //hight level
    this.attachFileExt = function(hash)
    {
        var hash = '#' + hash || '';
        if(!me.cache['current_id']) return false;
                
        window.open('/community/upload/attach_file.php' + hash, 'Xjsj239Asl' + hash, 'toolbar=0,location=0,directories=0,status=0,menubar=0,height=270,width=550,scrollbars=0,resizable=0');
    }    
}
     


RBjs.RBjs_Bbcode = new RBjs_Bbcode( RBjs );