function tree_expand_all()
{
    $('ul.simpleTree li.folder-close').removeClass('folder-close').addClass('folder-open');
    $('ul.simpleTree li.folder-close-last').removeClass('folder-close-last').addClass('folder-open-last');
    $('ul.simpleTree ul ul').css('display', 'block');
    return false;
};

function tree_collapse_all()
{
    $('ul.simpleTree li.folder-open').removeClass('folder-open').addClass('folder-close');
    $('ul.simpleTree li.folder-open-last').removeClass('folder-open-last').addClass('folder-close-last');
    $('ul.simpleTree ul ul').css('display', 'none');
    return false;
};

var wysiwyg_val_old = '';	

function autoSave(url, tm)
{
    var wysiwyg = $('#wysiwyg');
    var wysiwyg_val_new = wysiwyg.val();
    if ((wysiwyg_val_new != '') && (wysiwyg_val_new != wysiwyg_val_old))
    {
        $.post(
            url,
            {
                message: wysiwyg_val_new
            },
            function (json)
            {
                if (json.content == '')
                {
                    return;
                }
                var wysiwyg_next = wysiwyg.parent().next('div.ok');
                if (wysiwyg_next && wysiwyg_next.length>0)
                {
                    wysiwyg_next.html(json.content);
                } else
{
                    wysiwyg.parent().after(json.content);
                }	
            },
            'json'
            );
        wysiwyg_val_old = wysiwyg_val_new;
    }
	
    setTimeout('autoSave("' + url + '", ' + tm + ')', tm);
}

function a_msgh(curr, v_url, v_tree_id)
{
    if (curr.next('div').length)
    {
        var div = curr.next('div');
        if (div.css('display')=='block')
        {
            div.hide("slow")
        } else {
            div.show("slow")
        }
    } else {

        $.post(
            v_url,
            {
                msg_id: curr.parent().attr("id").replace("li_", ""),
                tree_id: v_tree_id
            },
            function (json)
            {
                if (curr.next('div').length)
                {
                    curr.next('div').remove();
                }
                curr.after($("<div />")).next().addClass('hide').html(json.content).show("slow");
                post_success(json);
            },
            'json'
            );
    }
    return false;
}

function post_success(json) {
	
    if (json.script_src && json.script_src.length)
    {
        if (!window.scripts) {
            var re = new RegExp("http://[^/]+",'i');
            scripts = {}; // один раз определить глобальную переменную с уже загруженными скриптами
            var scripts_tmp = document.getElementsByTagName('head')[0].getElementsByTagName('script');
            for (i in scripts_tmp) {
                if (typeof i == 'undefined') {
                    continue;
                }
                var src = scripts_tmp[i].src || scripts_tmp[i].href;
                if (!src) {
                    continue;
                }
                if (src.search(re) != -1)
                {
                    // удалить домен
                    src = src.replace(re, '');
                }
                scripts[src] = true;
            }
        }
	        
        // оставить только ранее незагруженные скрипты
        var script_src = new Array();
        for (i in json.script_src)
        {
            if (scripts[json.script_src[i]]) {
                // уже загружен
                continue;
            }
            script_src[script_src.length] = json.script_src[i];
        }
        		
        if (script_src.length) {
            // ранее незагруженные скрипты
            for (i in script_src)
            {
                scripts[script_src[i]] = true; // запомнить в глобюальную переменную, что загрузили
                if (json.script_ready && i*1+1==script_src.length)
                {
                    // последний
                    $.getScript(script_src[i], function() {
                        if (json.script_ready) {
                            eval(json.script_ready);
                            json.script_ready = '';
                        }
                    });
                } else
{
                    // не последний
                    $.getScript(script_src[i]);
                }
            }
        } else {
            // код без файлов (вернее, все файлы уже ранее загружены)
            eval(json.script_ready);
            json.script_ready = '';
        }
    } else if (json.script_ready) {
        // код без файлов
        eval(json.script_ready);
        json.script_ready = '';
    }
}

$.fn.SpinButton = function(cfg){
    return this.each(function(){

        // Apply specified options or defaults:
        // (Ought to refactor this some day to use $.extend() instead)
        this.spinCfg = {
            //min: cfg && cfg.min ? Number(cfg.min) : null,
            //max: cfg && cfg.max ? Number(cfg.max) : null,
            min: cfg && !isNaN(parseFloat(cfg.min)) ? Number(cfg.min) : null,	// Fixes bug with min:0
            max: cfg && !isNaN(parseFloat(cfg.max)) ? Number(cfg.max) : null,
            step: cfg && cfg.step ? Number(cfg.step) : 1,
            page: cfg && cfg.page ? Number(cfg.page) : 10,
            upClass: cfg && cfg.upClass ? cfg.upClass : 'up',
            downClass: cfg && cfg.downClass ? cfg.downClass : 'down',
            reset: cfg && cfg.reset ? cfg.reset : this.value,
            delay: cfg && cfg.delay ? Number(cfg.delay) : 500,
            interval: cfg && cfg.interval ? Number(cfg.interval) : 100,
            _btn_width: 20,
            _btn_height: 12,
            _direction: null,
            _delay: null,
            _repeat: null
        };
		
        this.adjustValue = function(i){
            var v = (isNaN(this.value) ? this.spinCfg.reset : Number(this.value)) + Number(i);
            if (this.spinCfg.min !== null) v = Math.max(v, this.spinCfg.min);
            if (this.spinCfg.max !== null) v = Math.min(v, this.spinCfg.max);
            this.value = v;
        };
		
        $(this)
        .addClass(cfg && cfg.spinClass ? cfg.spinClass : 'spin-button')
		
        .mousemove(function(e){
            // Determine which button mouse is over, or not (spin direction):
            var x = e.pageX || e.x;
            var y = e.pageY || e.y;
            var el = e.target || e.srcElement;
            var direction = 
            (x > coord(el,'offsetLeft') + el.offsetWidth - this.spinCfg._btn_width)
            ? ((y < coord(el,'offsetTop') + this.spinCfg._btn_height) ? 1 : -1) : 0;
			
            if (direction !== this.spinCfg._direction) {
                // Style up/down buttons:
                switch(direction){
                    case 1: // Up arrow:
                        $(this).removeClass(this.spinCfg.downClass).addClass(this.spinCfg.upClass);
                        break;
                    case -1: // Down arrow:
                        $(this).removeClass(this.spinCfg.upClass).addClass(this.spinCfg.downClass);
                        break;
                    default: // Mouse is elsewhere in the textbox
                        $(this).removeClass(this.spinCfg.upClass).removeClass(this.spinCfg.downClass);
                }
				
                // Set spin direction:
                this.spinCfg._direction = direction;
            }
        })
		
        .mouseout(function(){
            // Reset up/down buttons to their normal appearance when mouse moves away:
            $(this).removeClass(this.spinCfg.upClass).removeClass(this.spinCfg.downClass);
            this.spinCfg._direction = null;
        })
		
        .mousedown(function(e){
            if (this.spinCfg._direction != 0) {
                // Respond to click on one of the buttons:
                var self = this;
                var adjust = function() {
                    self.adjustValue(self.spinCfg._direction * self.spinCfg.step);
                };
			
                adjust();
				
                // Initial delay before repeating adjustment
                self.spinCfg._delay = window.setTimeout(function() {
                    adjust();
                    // Repeat adjust at regular intervals
                    self.spinCfg._repeat = window.setInterval(adjust, self.spinCfg.interval);
                }, self.spinCfg.delay);
            }
        })
		
        .mouseup(function(e){
            // Cancel repeating adjustment
            window.clearInterval(this.spinCfg._repeat);
            window.clearTimeout(this.spinCfg._delay);
        })
		
        .dblclick(function(e) {
            if ($.browser.msie)
                this.adjustValue(this.spinCfg._direction * this.spinCfg.step);
        })
		
        .keydown(function(e){
            // Respond to up/down arrow keys.
            switch(e.keyCode){
                case 38:
                    this.adjustValue(this.spinCfg.step);
                    break; // Up
                case 40:
                    this.adjustValue(-this.spinCfg.step);
                    break; // Down
                case 33:
                    this.adjustValue(this.spinCfg.page);
                    break; // PageUp
                case 34:
                    this.adjustValue(-this.spinCfg.page);
                    break; // PageDown
            }
        })

        .bind("mousewheel", function(e){
            // Respond to mouse wheel in IE. (It returns up/dn motion in multiples of 120)
            if (e.wheelDelta >= 120)
                this.adjustValue(this.spinCfg.step);
            else if (e.wheelDelta <= -120)
                this.adjustValue(-this.spinCfg.step);
			
            e.preventDefault();
        })
		
        .change(function(e){
            this.adjustValue(0);
        });
		
        if (this.addEventListener) {
            // Respond to mouse wheel in Firefox
            this.addEventListener('DOMMouseScroll', function(e) {
                if (e.detail > 0)
                    this.adjustValue(-this.spinCfg.step);
                else if (e.detail < 0)
                    this.adjustValue(this.spinCfg.step);
				
                e.preventDefault();
            }, false);
        }
    });
	
    function coord(el,prop) {
        var c = el[prop], b = document.body;
		
        while ((el = el.offsetParent) && (el != b)) {
            if (!$.browser.msie || (el.currentStyle.position != 'relative'))
                c += el[prop];
        }
		
        return c;
    }
};


/*
 * jQuery autoResize (textarea auto-resizer)
 * @copyright James Padolsey http://james.padolsey.com
 * @version 1.04
 */

(function(a){
    a.fn.autoResize=function(j){
        var b=a.extend({
            onResize:function(){},
            animate:true,
            animateDuration:150,
            animateCallback:function(){},
            extraSpace:20,
            limit:1000
        },j);
        this.filter('textarea').each(function(){
            var c=a(this).css({
                resize:'none',
                'overflow-y':'hidden'
            }),k=c.height(),f=(function(){
                var l=['height','width','lineHeight','textDecoration','letterSpacing'],h={};
                
                a.each(l,function(d,e){
                    h[e]=c.css(e)
                });
                return c.clone().removeAttr('id').removeAttr('name').css({
                    position:'absolute',
                    top:0,
                    left:-9999
                }).css(h).attr('tabIndex','-1').insertBefore(c)
            })(),i=null,g=function(){
                f.height(0).val(a(this).val()).scrollTop(10000);
                var d=Math.max(f.scrollTop(),k)+b.extraSpace,e=a(this).add(f);
                if(i===d){
                    return
                }
                i=d;
                if(d>=b.limit){
                    a(this).css('overflow-y','');
                    return
                }
                b.onResize.call(this);
                b.animate&&c.css('display')==='block'?e.stop().animate({
                    height:d
                },b.animateDuration,b.animateCallback):e.height(d)
            };
                
            c.unbind('.dynSiz').bind('keyup.dynSiz',g).bind('keydown.dynSiz',g).bind('change.dynSiz',g)
        });
        return this
    }
})(jQuery);


(function( $ ){
    $.fn.breadcrumbs = function(icon) {
        $.breadcrumbs  = {};
  
        this.addClass("breadcrumb_container");
	
        if (icon)
        {
            this.children().first().before('<li><span class="breadcrumb_e breadcrumb_icon_' + icon + '"></span></li>');
        }
	
        $.breadcrumbs.tc = this.children();
        $.breadcrumbs.tc.addClass("breadcrumb_e breadcrumb_item");
        $.breadcrumbs.tc.after('<li class="breadcrumb_e breadcrumb_divider"> </li>');
	
        $.breadcrumbs.tc = this.children();
        $.breadcrumbs.tc.last().removeClass("breadcrumb_divider").addClass("breadcrumb_end");
        $.breadcrumbs.tc.first().before('<li class="breadcrumb_e breadcrumb_before"> </li>');
	
        $.breadcrumbs.tc = this.children(".breadcrumb_item")
        $.breadcrumbs.tc.hover(bc_menter, bc_mleave);
        $.breadcrumbs.tc.mousedown(bc_mleave);
        $.breadcrumbs.tc.mouseup(bc_menter);
    };
})( jQuery );

function bc_menter()
{
    $(this).addClass("breadcrumb_item_hover");
		
    var next = $(this).next();
    var prev = $(this).prev();
	
    if (next.hasClass("breadcrumb_end")) {
        next.addClass("breadcrumb_end_hover");
    }
    if (next.hasClass("breadcrumb_divider")) {
        next.addClass("breadcrumb_divider_left");
    }
    if (prev.hasClass("breadcrumb_divider")) {
        prev.addClass("breadcrumb_divider_right");
    }
    if (prev.hasClass("breadcrumb_before")) {
        prev.addClass("breadcrumb_before_hover");
    }
}

function bc_mleave()
{
    $(this).removeClass("breadcrumb_item_hover");
		
    var next = $(this).next();
    var prev = $(this).prev();
	
    if (next.hasClass("breadcrumb_end_hover")) {
        next.removeClass("breadcrumb_end_hover");
    }
    if (next.hasClass("breadcrumb_divider_left")) {
        next.removeClass("breadcrumb_divider_left");
    }
    if (prev.hasClass("breadcrumb_divider_right")) {
        prev.removeClass("breadcrumb_divider_right");
    }
    if (prev.hasClass("breadcrumb_before_hover")) {
        prev.removeClass("breadcrumb_before_hover");
    }
}

