(function(k,e,i,j){k.fn.caret=function(b,l){var a,c,f=this[0],d=k.browser.msie;if(typeof b==="object"&&typeof b.start==="number"&&typeof b.end==="number"){a=b.start;c=b.end}else if(typeof b==="number"&&typeof l==="number"){a=b;c=l}else if(typeof b==="string")if((a=f.value.indexOf(b))>-1)c=a+b[e];else a=null;else if(Object.prototype.toString.call(b)==="[object RegExp]"){b=b.exec(f.value);if(b!=null){a=b.index;c=a+b[0][e]}}if(typeof a!="undefined"){if(d){d=this[0].createTextRange();d.collapse(true);
d.moveStart("character",a);d.moveEnd("character",c-a);d.select()}else{this[0].selectionStart=a;this[0].selectionEnd=c}this[0].focus();return this}else{if(d){c=document.selection;if(this[0].tagName.toLowerCase()!="textarea"){d=this.val();a=c[i]()[j]();a.moveEnd("character",d[e]);var g=a.text==""?d[e]:d.lastIndexOf(a.text);a=c[i]()[j]();a.moveStart("character",-d[e]);var h=a.text[e]}else{a=c[i]();c=a[j]();c.moveToElementText(this[0]);c.setEndPoint("EndToEnd",a);g=c.text[e]-a.text[e];h=g+a.text[e]}}else{g=
f.selectionStart;h=f.selectionEnd}a=f.value.substring(g,h);return{start:g,end:h,text:a,replace:function(m){return f.value.substring(0,g)+m+f.value.substring(h,f.value[e])}}}}})(jQuery,"length","createRange","duplicate");

(function($) {
    $.fn.Qbb = function(options) {
        var settings = $.extend({
            'width': 96 + '%',
            'height': 100 + 'px',
            'folder' : 'theme/img/bbcode/'
        }, options);
        
        var element = $(this);
             
        //Создаем bbcodebar
        $(this).before('<div id="bb_cont"><a href="#" id="bb_bold" title="Полужирный"></a><img src="' + settings.folder + 'line_bb.png" class="bbline" /><a href="#" id="bb_italic" title="Курсив"></a><img src="' + settings.folder + 'line_bb.png" class="bbline" /><a href="#" id="bb_underline" title="Подчеркнутый"></a><img src="' + settings.folder + 'line_bb.png" class="bbline" /><a href="#" id="bb_abc" title="Зачеркнутый"></a><img src="' + settings.folder + 'line_bb.png" class="bbline" /><a href="#" id="bb_sub" title="Надстрочный"></a><img src="' + settings.folder + 'line_bb.png" class="bbline" /><a href="#" id="bb_sup" title="Подстрочный"></a><img src="' + settings.folder + 'line_bb.png" class="bbline" /><a href="#" id="bb_link" title="Ссылка"></a></div>');
        
        //Стиль для bbcodebar
        $('#bb_cont').css({position : 'absolute', top : 0, left : 0, overflow : 'hidden', background : 'url(' + settings.folder + 'bg.png)', 'padding-top': 1 + 'px', 'padding-left': 1 + 'px', 'height' : 21 + 'px', display : 'none', '-moz-border-radius': 3 + 'px', '-webkit-border-radius': 3 + 'px', '-khtml-border-radius': 3 + 'px', 'border-radius': 3 + 'px', 'border-bottom' : 1 + 'px solid #b7b7b7', 'border-right' : 1 + 'px solid #b7b7b7', 'z-index' : 99999});
        
        $('#bb_cont a').css({'position' : 'relative', 'display': 'inline-block', 'width' : 20 + 'px', 'height' : 20 + 'px', 'margin-right' : 1 + 'px'});
        /*$('#bb_cont a').hover(function(){
            $(this).css({'backgroundColor' : '#5B6C78'});
        }, function(){
            $(this).css({'backgroundColor' : 'transparent'});
        });*/
        
        $('.bbline').css({width : 2 + 'px', height : 17 + 'px', position : 'relative', top : -1 + 'px'});
        
        $('#bb_bold').css({background : 'url(' + settings.folder + 'bold.png) center center no-repeat'});
        $('#bb_italic').css({background : 'url(' + settings.folder + 'italic.png) center center no-repeat'});
        $('#bb_underline').css({background : 'url(' + settings.folder + 'underline.png) center center no-repeat'});
        $('#bb_abc').css({background : 'url(' + settings.folder + 'abc.png) center center no-repeat'});
        $('#bb_sub').css({background : 'url(' + settings.folder + 'sub.png) center center no-repeat'});
        $('#bb_sup').css({background : 'url(' + settings.folder + 'sup.png) center center no-repeat'});
        $('#bb_link').css({background : 'url(' + settings.folder + 'link.png) center center no-repeat'});
        
        //создаём  переменные для координат точки курсора
        var mouseX = 0;
        var mouseY = 0;
          
        $(this).mousemove(function(e) {
            // отслеживаем позицию курсора
            mouseX = e.pageX;
            mouseY = e.pageY;
        });
        
        // Прячем тулбар
        $(this).mousedown(function() {
            $("#bb_cont").fadeOut(300);
        });
        
        $(this).select(function() {
            // вычисляем  позицию курсора и показываем тулбар при наступлении события .select 
            $("#bb_cont").css({top : mouseY + 8, left : mouseX +  10}).fadeIn(300);
        });
        
        $("#bb_bold").click(function() {
            wrapText("[b]", "[/b]");
            $("#bb_cont").fadeOut(300);
            return false;
        });
        $("#bb_italic").click(function() {
            wrapText("[i]", "[/i]");
            $("#bb_cont").fadeOut(300);
            return false;
        });
        $("#bb_underline").click(function() {
            wrapText("[u]", "[/u]");
            $("#bb_cont").fadeOut(300);
            return false;
        });
        $("#bb_abc").click(function() {
            wrapText("[s]", "[/s]");
            $("#bb_cont").fadeOut(300);
            return false;
        });
        $("#bb_sub").click(function() {
            wrapText("[sub]", "[/sub]");
            $("#bb_cont").fadeOut(300);
            return false;
        });
        $("#bb_sup").click(function() {
            wrapText("[sup]", "[/sup]");
            $("#bb_cont").fadeOut(300);
            return false;
        });
        $("#bb_link").click(function() {
            var m = prompt('URL', 'http://');
            wrapText("[url="+m+"]", "[/url]");
            $("#bb_cont").fadeOut(300);
            return false;
        });
        
        function wrapText(startText, endText) {
            // находим  и помещаем в переменную текст, расположенный до начала выделенного фрагмента
            var before =  element.val().substring(0,  element.caret().start);
            // находим и помещаем в переменную  текст, расположенный после выделенного фрагмента
            var after =  element.val().substring(element.caret().end,  element.val().length);
            
            element.val(before + startText + element.caret().text + endText + after);
        }
        
        $(this).css({width : settings.width, height : settings.height, outline : 'none'});
    }
}) (jQuery);