(function($){
    $.IE = ($.browser.msie) ? true : false;
    $.IE6 = ($.browser.msie && $.browser.version.substr(0, 2) < 7) ? true : false;
    $.cookie = function(name, value, options){
        if (typeof value != 'undefined') {
            options = options || {};
            if (value === null) {
                value = '';
                options.expires = -1;
            }
            var expires = '';
            if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
                var date;
                if (typeof options.expires == 'number') {
                    date = new Date();
                    date.setTime(date.getTime() + (options.expires * 1000));
                }
                else {
                    date = options.expires;
                }
                expires = '; expires=' + date.toUTCString();
            }
            var path = options.path ? '; path=' + (options.path) : '';
            var domain = options.domain ? '; domain=' + (options.domain) : '';
            var secure = options.secure ? '; secure' : '';
            document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
        }
        else {
            var cookieValue = null;
            if (document.cookie && document.cookie != '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    if (cookie.substring(0, name.length + 1) == (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }
    };
    $.fn.extend({
        autocomplete: function(urlOrData, options){
            var isUrl = typeof urlOrData == "string";
            options = $.extend({}, $.Autocompleter.defaults, {
                url: isUrl ? urlOrData : null,
                data: isUrl ? null : urlOrData,
                delay: isUrl ? $.Autocompleter.defaults.delay : 10,
                max: options && !options.scroll ? 10 : 150
            }, options);
            options.highlight = options.highlight ||
            function(value){
                return value;
            };
            options.formatMatch = options.formatMatch || options.formatItem;
            return this.each(function(){
                new $.Autocompleter(this, options);
            });
        },
        result: function(handler){
            return this.bind("result", handler);
        },
        search: function(handler){
            return this.trigger("search", [handler]);
        },
        flushCache: function(){
            return this.trigger("flushCache");
        },
        setOptions: function(options){
            return this.trigger("setOptions", [options]);
        },
        unautocomplete: function(){
            return this.trigger("unautocomplete");
        }
    });
    $.Autocompleter = function(input, options){
        var KEY = {
            UP: 38,
            DOWN: 40,
            DEL: 46,
            TAB: 9,
            RETURN: 13,
            ESC: 27,
            COMMA: 188,
            PAGEUP: 33,
            PAGEDOWN: 34,
            BACKSPACE: 8
        };
        var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
        var timeout;
        var previousValue = "";
        var cache = $.Autocompleter.Cache(options);
        var hasFocus = 0;
        var lastKeyPressCode;
        var config = {
            mouseDownOnSelect: false
        };
        var select = $.Autocompleter.Select(options, input, selectCurrent, config);
        var blockSubmit;
        $.browser.opera && $(input.form).bind("submit.autocomplete", function(){
            if (blockSubmit) {
                blockSubmit = false;
                return false;
            }
        });
        $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event){
            hasFocus = 1;
            lastKeyPressCode = event.keyCode;
            switch (event.keyCode) {
                case KEY.UP:
                    event.preventDefault();
                    if (select.visible()) {
                        select.prev();
                    }
                    else {
                        onChange(0, true);
                    }
                    break;
                case KEY.DOWN:
                    event.preventDefault();
                    if (select.visible()) {
                        select.next();
                    }
                    else {
                        onChange(0, true);
                    }
                    break;
                case KEY.PAGEUP:
                    event.preventDefault();
                    if (select.visible()) {
                        select.pageUp();
                    }
                    else {
                        onChange(0, true);
                    }
                    break;
                case KEY.PAGEDOWN:
                    event.preventDefault();
                    if (select.visible()) {
                        select.pageDown();
                    }
                    else {
                        onChange(0, true);
                    }
                    break;
                case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
                case KEY.TAB:
                case KEY.RETURN:
                    if (selectCurrent()) {
                        event.preventDefault();
                        blockSubmit = true;
                        return false;
                    }
                    break;
                case KEY.ESC:
                    select.hide();
                    break;
                default:
                    clearTimeout(timeout);
                    timeout = setTimeout(onChange, options.delay);
                    break;
            }
        }).focus(function(){
            hasFocus++;
        }).blur(function(){
            hasFocus = 0;
            if (!config.mouseDownOnSelect && select.visible()) {
                hideResults();
            }
        }).click(function(){
            if (hasFocus++ > 1 && !select.visible()) {
                onChange(0, true);
            }
        }).bind("search", function(){
            var fn = (arguments.length > 1) ? arguments[1] : null;
            function findValueCallback(q, data){
                var result;
                if (data && data.length) {
                    for (var i = 0; i < data.length; i++) {
                        if (data[i].result.toLowerCase() == q.toLowerCase()) {
                            result = data[i];
                            break;
                        }
                    }
                }
                if (typeof fn == "function") 
                    fn(result);
                else 
                    $input.trigger("result", result && [result.data, result.value]);
            }
            $.each(trimWords($input.val()), function(i, value){
                request(value, findValueCallback, findValueCallback);
            });
        }).bind("flushCache", function(){
            cache.flush();
        }).bind("setOptions", function(){
            $.extend(options, arguments[1]);
            if ("data" in arguments[1]) 
                cache.populate();
        }).bind("unautocomplete", function(){
            select.unbind();
            $input.unbind();
            $(input.form).unbind(".autocomplete");
        }).bind("togglelist", function(){
            if (!select.visible()) {
                lastKeyPressCode = "";
                hasFocus++;
                $input.trigger("focus").trigger("click");
            }
        });
        function selectCurrent(){
            var selected = select.selected();
            if (!selected) 
                return false;
            var v = selected.result;
            previousValue = v;
            if (options.multiple) {
                var words = trimWords($input.val());
                if (words.length > 1) {
                    var seperator = options.multipleSeparator.length;
                    var cursorAt = $(input).selection().start;
                    var wordAt, progress = 0;
                    $.each(words, function(i, word){
                        progress += word.length;
                        if (cursorAt <= progress) {
                            wordAt = i;
                            return false;
                        }
                        progress += seperator;
                    });
                    words[wordAt] = v;
                    v = words.join(options.multipleSeparator);
                }
                v += options.multipleSeparator;
            }
            $input.val(v);
            hideResultsNow();
            $input.trigger("result", [selected.data, selected.value]);
            return true;
        }
        function onChange(crap, skipPrevCheck){
            $("#" + $input.get(0).id + "_code").val("");
            if (lastKeyPressCode == KEY.DEL) {
                select.hide();
                return;
            }
            var currentValue = $input.val();
            if (!skipPrevCheck && currentValue == previousValue) 
                return;
            previousValue = currentValue;
            currentValue = lastWord(currentValue);
            if (currentValue.length >= options.minChars) {
                $input.addClass(options.loadingClass);
                if (!options.matchCase) 
                    currentValue = currentValue.toLowerCase();
                request(currentValue, receiveData, hideResultsNow);
            }
            else {
                stopLoading();
                select.hide();
            }
        };
        function trimWords(value){
            if (!value) 
                return [""];
            if (!options.multiple) 
                return [$.trim(value)];
            return $.map(value.split(options.multipleSeparator), function(word){
                return $.trim(value).length ? $.trim(word) : null;
            });
        };
        function lastWord(value){
            if (!options.multiple) 
                return value;
            var words = trimWords(value);
            if (words.length == 1) 
                return words[0];
            var cursorAt = $(input).selection().start;
            if (cursorAt == value.length) {
                words = trimWords(value)
            }
            else {
                words = trimWords(value.replace(value.substring(cursorAt), ""));
            }
            return words[words.length - 1];
        };
        function autoFill(q, sValue){
            if (options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE) {
                $input.val($input.val() + sValue.substring(lastWord(previousValue).length));
                $(input).selection(previousValue.length, previousValue.length + sValue.length);
            }
        };
        function hideResults(){
            clearTimeout(timeout);
            timeout = setTimeout(hideResultsNow, 200);
        };
        function hideResultsNow(){
            var wasVisible = select.visible();
            select.hide();
            clearTimeout(timeout);
            stopLoading();
            if (options.mustMatch) {
                $input.search(function(result){
                    if (!result) {
                        if (options.multiple) {
                            var words = trimWords($input.val()).slice(0, -1);
                            $input.val(words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : ""));
                        }
                        else {
                            $input.val("");
                            $input.trigger("result", null);
                        }
                    }
                });
            }
        };
        function receiveData(q, data){
            if (data && data.length && hasFocus) {
                stopLoading();
                select.display(data, q);
                autoFill(q, data[0].value);
                select.show();
            }
            else {
                hideResultsNow();
            }
        };
        function request(term, success, failure){
            if (!options.matchCase) 
                term = term.toLowerCase();
            var data = cache.load(term);
            if (data && data.length) {
                success(term, data);
            }
            else 
                if ((typeof options.url == "string") && (options.url.length > 0)) {
                    var extraParams = {
                        timestamp: +new Date()
                    };
                    extraParams[options.qParam] = lastWord(term);
                    $.each(options.extraParams, function(key, param){
                        extraParams[key] = typeof param == "function" ? param() : param;
                    });
                    $.ajax({
                        mode: "abort",
                        port: "autocomplete" + input.name,
                        dataType: options.dataType,
                        url: options.url,
                        data: $.extend({
                            limit: options.max
                        }, extraParams),
                        success: function(data){
                            var parsed = options.parse && options.parse(data) || parse(data);
                            cache.add(term, parsed);
                            success(term, parsed);
                        }
                    });
                }
                else {
                    select.emptyList();
                    failure(term);
                }
        };
        function parse(data){
            var parsed = [];
            var rows = data.split("\n");
            for (var i = 0; i < rows.length; i++) {
                var row = $.trim(rows[i]);
                if (row) {
                    row = row.split("|");
                    parsed[parsed.length] = {
                        data: row,
                        value: row[0],
                        result: options.formatResult && options.formatResult(row, row[0]) || row[0]
                    };
                }
            }
            return parsed;
        };
        function stopLoading(){
            $input.removeClass(options.loadingClass);
        };
            };
    $.Autocompleter.defaults = {
        inputClass: "ac_input",
        resultsClass: "ac_results",
        loadingClass: "ac_loading",
        minChars: 1,
        delay: 400,
        matchCase: false,
        matchSubset: false,
        matchContains: false,
        cacheLength: 10,
        max: 100,
        mustMatch: false,
        qParam: "q",
        extraParams: {},
        selectFirst: true,
        formatItem: function(row){
            return row[0];
        },
        formatMatch: null,
        autoFill: false,
        width: 0,
        multiple: false,
        multipleSeparator: ", ",
        highlight: function(value, term){
            return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
        },
        scroll: true,
        scrollHeight: 180
    };
    $.Autocompleter.Cache = function(options){
        var data = {};
        var length = 0;
        function matchSubset(s, sub){
            if (!options.matchCase) 
                s = s.toLowerCase();
            var i = s.indexOf(sub);
            if (options.matchContains == "word") {
                i = s.toLowerCase().search("\\b" + sub.toLowerCase());
            }
            if (i == -1) 
                return false;
            return i == 0 || options.matchContains;
        };
        function add(q, value){
            if (length > options.cacheLength) {
                flush();
            }
            if (!data[q]) {
                length++;
            }
            data[q] = value;
        }
        function populate(){
            if (!options.data) 
                return false;
            var stMatchSets = {}, nullData = 0;
            if (!options.url) 
                options.cacheLength = 1;
            stMatchSets[""] = [];
            for (var i = 0, ol = options.data.length; i < ol; i++) {
                var rawValue = options.data[i];
                rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;
                var value = options.formatMatch(rawValue, i + 1, options.data.length);
                if (value === false) 
                    continue;
                var firstChar = value.charAt(0).toLowerCase();
                if (!stMatchSets[firstChar]) 
                    stMatchSets[firstChar] = [];
                var row = {
                    value: value,
                    data: rawValue,
                    result: options.formatResult && options.formatResult(rawValue) || value
                };
                stMatchSets[firstChar].push(row);
                if (nullData++ < options.max) {
                    stMatchSets[""].push(row);
                }
            };
            $.each(stMatchSets, function(i, value){
                options.cacheLength++;
                add(i, value);
            });
        };
        setTimeout(populate, 25);
        function flush(){
            data = {};
            length = 0;
        };
        return {
            flush: flush,
            add: add,
            populate: populate,
            load: function(q){
                if (!options.cacheLength || !length) 
                    return null;
                if (!options.url && options.matchContains) {
                    var csub = [];
                    for (var k in data) {
                        if (k.length > 0) {
                            var c = data[k];
                            $.each(c, function(i, x){
                                if (matchSubset(x.value, q)) {
                                    csub.push(x);
                                }
                            });
                        }
                    }
                    return csub;
                }
                else 
                    if (data[q]) {
                        return data[q];
                    }
                    else 
                        if (options.matchSubset) {
                            for (var i = q.length - 1; i >= options.minChars; i--) {
                                var c = data[q.substr(0, i)];
                                if (c) {
                                    var csub = [];
                                    $.each(c, function(i, x){
                                        if (matchSubset(x.value, q)) {
                                            csub[csub.length] = x;
                                        }
                                    });
                                    return csub;
                                }
                            }
                        }
                return null;
            }
        };
    };
    $.Autocompleter.Select = function(options, input, select, config){
        var CLASSES = {
            ACTIVE: "ac_over"
        };
        var listItems, active = -1, data, term = "", needsInit = true, element, list;
        function init(){
            if (!needsInit) 
                return;
            element = $("<div/>").hide().addClass(options.resultsClass).css("position", "absolute").appendTo(document.body);
            list = $("<ul/>").appendTo(element).mouseover(function(event){
                if (target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
                    active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
                    $(target(event)).addClass(CLASSES.ACTIVE);
                }
            }).click(function(event){
                $(target(event)).addClass(CLASSES.ACTIVE);
                select();
                input.focus();
                return false;
            }).mousedown(function(){
                config.mouseDownOnSelect = true;
            }).mouseup(function(){
                config.mouseDownOnSelect = false;
            });
            if (options.width > 0) 
                element.css("width", options.width);
            needsInit = false;
        }
        function target(event){
            var element = event.target;
            while (element && element.tagName != "LI") 
                element = element.parentNode;
            if (!element) 
                return [];
            return element;
        }
        function moveSelect(step){
            listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
            movePosition(step);
            var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
            if (options.scroll) {
                var offset = 0;
                listItems.slice(0, active).each(function(){
                    offset += this.offsetHeight;
                });
                if ((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
                    list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
                }
                else 
                    if (offset < list.scrollTop()) {
                        list.scrollTop(offset);
                    }
            }
        };
        function movePosition(step){
            active += step;
            if (active < 0) {
                active = listItems.size() - 1;
            }
            else 
                if (active >= listItems.size()) {
                    active = 0;
                }
        }
        function limitNumberOfItems(available){
            return options.max && options.max < available ? options.max : available;
        }
        function fillList(){
            list.empty();
            var max = limitNumberOfItems(data.length);
            for (var i = 0; i < max; i++) {
                if (!data[i]) 
                    continue;
                var formatted = options.formatItem(data[i].data, i + 1, max, data[i].value, term);
                if (formatted === false) 
                    continue;
                var li = $("<li/>").html(options.highlight(formatted, term)).addClass(i % 2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
                $.data(li, "ac_data", data[i]);
            }
            listItems = list.find("li");
            if (options.selectFirst) {
                listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
                active = 0;
            }
            if ($.fn.bgiframe) 
                list.bgiframe();
        }
        return {
            display: function(d, q){
                init();
                data = d;
                term = q;
                fillList();
            },
            next: function(){
                moveSelect(1);
            },
            prev: function(){
                moveSelect(-1);
            },
            pageUp: function(){
                if (active != 0 && active - 8 < 0) {
                    moveSelect(-active);
                }
                else {
                    moveSelect(-8);
                }
            },
            pageDown: function(){
                if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
                    moveSelect(listItems.size() - 1 - active);
                }
                else {
                    moveSelect(8);
                }
            },
            hide: function(){
                element && element.hide();
                listItems && listItems.removeClass(CLASSES.ACTIVE);
                active = -1;
            },
            visible: function(){
                return element && element.is(":visible");
            },
            current: function(){
                return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
            },
            show: function(){
                var target = $(options.target || input);
                var offset = target.offset();
                var tmp_target = target.clone().css({
                    visibility: 'hidden',
                    border: 'none',
                    'position': 'absolute'
                }).insertAfter(target);
                element.css({
                    width: typeof options.width == "string" || options.width > 0 ? options.width : tmp_target.outerWidth(),
                    top: offset.top + target.get(0).offsetHeight,
                    left: offset.left
                }).show();
                if (tmp_target) 
                    tmp_target.remove();
                if (options.scroll) {
                    list.scrollTop(0);
                    list.css({
                        maxHeight: options.scrollHeight,
                        overflow: 'auto'
                    });
                    if ($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
                        var listHeight = 0;
                        listItems.each(function(){
                            listHeight += this.offsetHeight;
                        });
                        var scrollbarsVisible = listHeight > options.scrollHeight;
                        list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight);
                        if (!scrollbarsVisible) {
                            listItems.width(list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")));
                        }
                    }
                }
            },
            selected: function(){
                var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
                return selected && selected.length && $.data(selected[0], "ac_data");
            },
            emptyList: function(){
                list && list.empty();
            },
            unbind: function(){
                element && element.remove();
            }
        };
    };
    $.fn.selection = function(start, end){
        if (start !== undefined) {
            return this.each(function(){
                if (this.createTextRange) {
                    var selRange = this.createTextRange();
                    if (end === undefined || start == end) {
                        selRange.move("character", start);
                        selRange.select();
                    }
                    else {
                        selRange.collapse(true);
                        selRange.moveStart("character", start);
                        selRange.moveEnd("character", end);
                        selRange.select();
                    }
                }
                else 
                    if (this.setSelectionRange) {
                        this.setSelectionRange(start, end);
                    }
                    else 
                        if (this.selectionStart) {
                            this.selectionStart = start;
                            this.selectionEnd = end;
                        }
            });
        }
        var field = this[0];
        if (field.createTextRange) {
            var range = document.selection.createRange(), orig = field.value, teststring = "<->", textLength = range.text.length;
            range.text = teststring;
            var caretAt = field.value.indexOf(teststring);
            field.value = orig;
            this.selection(caretAt, caretAt + textLength);
            return {
                start: caretAt,
                end: caretAt + textLength
            }
        }
        else 
            if (field.selectionStart !== undefined) {
                return {
                    start: field.selectionStart,
                    end: field.selectionEnd
                }
            }
    };
    $.fn.calendar = function(settings){
        var cfg = {
            id: 'datepicker',
            init: false,
            append: 'BODY',
            input: '',
            cinput: '',
            cls: 'calendar',
            popup: ".popup",
            fsep: ".",
            lang: {
                day_names: ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'],
                month_names: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
                today: "Сегодня",
                cancel: "Отмена",
                apply: "Ок"
            },
            days_in_month: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
            from: 1950,
            to: new Date().getFullYear(),
            cdate: {
                date: new Date()
            },
            div: {
                content: ".content",
                monthbox: ".month",
                yearbox: ".year",
                bottombox: ".bottomnav",
                cday: ".cd",
                lists: ".selectbox",
                listitems: "LI"
            },
            ui: {
                toggle: true,
                topnav: true,
                bottomnav: true,
                monthbox: "month",
                yearbox: "year"
            },
            ajax: false
        };
        if (settings) 
            $.extend(cfg, settings);
        function applyToInput(o){
            if (!cfg.ui.toggle) 
                return;
            $(cfg.calendar).css({
                "top": $(o).offset().top - 1 + $(o).outerHeight() + "px",
                "left": $(o).offset().left + "px"
            });
        };
        function hasParam(val, def){
            var def = (arguments.length == 1) ? false : def;
            return (val == 'undefined' || isNaN(val)) ? def : val;
        };
        function hasVal(val){
            return (val == 'undefined' || isNaN(val)) ? false : true;
        };
        function Match(str, exp){
            if (!str || !exp) 
                return false;
            var re = new RegExp(exp);
            var m = re.exec(str);
            return (m == null) ? false : m;
        };
        function initElements(){
            var d = cfg.div;
            cfg.div.monthbox = cfg.calendar.find(d.monthbox);
            cfg.div.yearbox = cfg.calendar.find(d.yearbox);
            cfg.div.bottombox = cfg.calendar.find(d.bottombox);
            cfg.div = {
                content: $(cfg.calendar).find(d.content),
                month_p: $(d.monthbox).children('.prev'),
                month_c: $(d.monthbox).children('.cur'),
                month_n: $(d.monthbox).children('.next'),
                month_l: $(d.monthbox).children('.selectbox'),
                month_lc: $($(d.monthbox).children().get(3)).children().get(0),
                year_p: $(d.yearbox).children('.prev'),
                year_c: $(d.yearbox).children('.cur'),
                year_n: $(d.yearbox).children('.next'),
                year_l: $(d.yearbox).children('.selectbox'),
                year_lc: $($(d.yearbox).children().get(3)).children().get(0),
                bottom_t: $(d.bottombox).children('.today'),
                bottom_a: $(d.bottombox).children('.apply'),
                bottom_c: $(d.bottombox).children('.cancel'),
                cday: d.cday,
                lists: $(cfg.calendar).find(d.lists),
                listitems: d.listitems
            };
            if (cfg.ajax) 
                cfg.div.loader_div = $('<div id="load-calendar"></div>');
        };
        function bindEvents(){
            var d = cfg.div;
            if (cfg.ui.monthbox) {
                $(d.month_p).click(function(){
                    return Change.call(this, '-', 'month')
                });
                $(d.month_n).click(function(){
                    return Change.call(this, '+', 'month')
                });
                $(d.month_c).click(function(){
                    return List('month_l')
                });
            }
            if (cfg.ui.yearbox) {
                $(d.year_p).click(function(){
                    return Change.call(this, '-', 'year')
                });
                $(d.year_n).click(function(){
                    return Change.call(this, '+', 'year')
                });
                $(d.year_c).click(function(){
                    return List('year_l')
                });
            }
            if (cfg.ui.bottomnav) {
                $(d.bottom_t).html(cfg.lang.today).click(function(){
                    $(d.lists).hide();
                    currentDate();
                    Insert();
                });
                $(d.bottom_a).html(cfg.lang.apply).click(function(){
                    cfg.cinput.value = $("#d" + cfg.cdate.day).get(0).abbr;
                    toggleCalendar();
                });
                $(d.bottom_c).html(cfg.lang.cancel).click(function(){
                    cfg.cinput.value = "";
                    toggleCalendar();
                });
            }
        };
        function buttonSet(name){
            return (!name) ? '' : '<div class="selector ' + name + '"><a href="#" class="prev"></a><a href="#" class="cur"></a><a href="#" class="next"></a><div class="selectbox"><ul class="list"></ul></div></div>';
        };
        function topNav(){
            return (cfg.ui.topnav) ? '<tr><td class="topnav">' + buttonSet(cfg.ui.monthbox) + buttonSet(cfg.ui.yearbox) + '</td></tr>' : '';
        };
        function bottomNav(){
            return (cfg.ui.bottomnav) ? '<tr><td class="bottomnav"><a class="but today"></a><a class="but cancel"></a><a class="but apply"></a></td></tr>' : '';
        };
        function initCalendar(){
            var cstr = '<div id="' + cfg.id + '" class="' + cfg.popup.slice(1) + '"><table cellspacing="0" class="' + cfg.cls + '">' + topNav() + '<tr><td class="content"></td></tr>' + bottomNav() + '</table></div>';
            cfg.calendar = $(cstr).hide();
            if (cfg.append == 'BODY') {
                $(document).ready(function(){
                    $(cfg.append).append(cfg.calendar);
                    initElements();
                    bindEvents();
                });
            }
            else {
                $(cfg.append).html(cfg.calendar);
                initElements();
                bindEvents();
            }
        };
        function buildCalendar(o){
            if (cfg.cinput == o && cfg.ui.toggle) 
                toggleCalendar();
            else 
                showCalendar();
            checkInput(o);
            if (cfg.ajax.data) {
                cfg.cdate.day = Math.round(cfg.ajax.data.date);
                cfg.cdate.month = Math.round(cfg.ajax.data.month) - 1;
                cfg.cdate.year = Math.round(cfg.ajax.data.year);
            }
            Insert();
            checkLimit();
            applyToInput(o);
            cfg.cinput = o;
        };
        function dayHighlight(current){
            var selector = "#d" + ((!cfg.ajax.data) ? cfg.cdate.day : parseInt(cfg.ajax.data.date, 10));
            cfg.div.content.find(cfg.div.cday).removeClass("current");
            cfg.div.content.find(selector).addClass("current");
        };
        function currentDate(){
            cfg.cdate.month = cfg.cdate.date.getMonth();
            cfg.cdate.year = cfg.cdate.date.getFullYear();
            cfg.cdate.day = cfg.cdate.date.getDate();
        };
        function checkLimit(){
            $(cfg.div.year_n)[(cfg.cdate.year == cfg.to) ? 'addClass' : 'removeClass']('disable');
            $(cfg.div.year_p)[(cfg.cdate.year == cfg.from) ? 'addClass' : 'removeClass']('disable');
            $(cfg.div.month_n)[(cfg.cdate.month == 11 && cfg.cdate.year == cfg.to) ? 'addClass' : 'removeClass']('disable');
            $(cfg.div.month_p)[(cfg.cdate.month == 0 && cfg.cdate.year == cfg.from) ? 'addClass' : 'removeClass']('disable');
        };
        function checkInput(input){
            var date = Match($(input).val(), "(0[1-9]|[1-2][0-9]|3[01]|[1-9])\.(0[1-9]|1[0-1]|[1-9])\.([12][0-9][0-9][0-9])$");
            if (cfg.ui.toggle) 
                currentDate();
            if (date) {
                cfg.cdate.day = Math.round(date[1]);
                cfg.cdate.month = Math.round(date[2]) - 1;
                cfg.cdate.year = Math.round(date[3]);
            }
        };
        function bindListEvents(type){
            $(cfg.div[type + "c"]).find(cfg.div.listitems).click(function(){
                var exp = Match(this.id, "([a-zA-Z]+)([0-9]+)");
                Change.call(this, parseInt(exp[2]), exp[1]);
            });
        };
        function getList(type){
            var data = "";
            if (type == 'year_l') 
                for (var i = cfg.from; i < cfg.to + 1; i++) 
                    data += '<li id="year' + i + '">' + i + '</a></li>';
            if (type == 'month_l') 
                for (var i = 0; i < cfg.lang.month_names.length; i++) 
                    data += '<li id="month' + i + '">' + cfg.lang.month_names[i] + '</a></li>';
            $(cfg.div[type + "c"]).html(data);
            bindListEvents(type);
        };
        function hideCalendar(){
            $(cfg.div.lists).hide();
            if (cfg.ui.toggle) 
                $(cfg.calendar).hide();
        };
        function showCalendar(){
            $(cfg.popup).hide();
            $(cfg.calendar).show();
        };
        function toggleCalendar(){
            $(cfg.div.lists).hide();
            if (cfg.ui.toggle) 
                $(cfg.calendar).toggle();
        };
        function List(type){
            if (!$(cfg.div[type + "c"]).children().get(0)) 
                getList(type);
            if ($(cfg.div[type]).is(":visible")) {
                cfg.div.content.find('.opacity-gray').hide();
                $(cfg.div[type]).hide();
            }
            else {
                $(cfg.div.lists).hide();
                cfg.div.content.find('.opacity-gray').show();
                $(cfg.div[type]).show();
            }
            return false;
        };
        function ifAjaxData(urlparams, callback, params){
            var params = hasParam(params, []);
            if (cfg.ajax) {
                cfg.div.loader_div.css({
                    width: cfg.div.content.width(),
                    height: cfg.div.content.height()
                });
                cfg.div.content.html(cfg.div.loader_div);
                setTimeout(function(){
                    $.getJSON(cfg.ajax.url + urlparams, function(data){
                        cfg.ajax.data = data;
                        callback(params);
                    });
                }, 300);
            }
            else {
                callback(params);
            }
        };
        function FormatedDate(day){
            var day = day || cfg.cdate.day;
            if (day < 10) 
                var day = "0" + day;
            if (cfg.cdate.month < 9) 
                var month = "0" + (cfg.cdate.month + 1);
            else 
                var month = (cfg.cdate.month + 1);
            return day + '.' + month + '.' + cfg.cdate.year;
        };
        function Change(val, type){
            if ($(this).hasClass('disable')) 
                return false;
            cfg.cdate[type] = (val == "+" || val == "-") ? cfg.cdate[type] + parseInt(val + 1) : val;
            if (type == "month") {
                if (cfg.cdate.month > 11) {
                    cfg.cdate.month = 0;
                    cfg.cdate.year = parseInt(cfg.cdate.year) + 1;
                }
                if (cfg.cdate[type] < 0) {
                    cfg.cdate.month = 11;
                    cfg.cdate.year = parseInt(cfg.cdate.year) - 1;
                }
            }
            cfg.div.lists.hide();
            checkLimit();
            ifAjaxData(FormatedDate('0'), Insert);
            return false;
        };
        function Insert(){
            cfg.div.content.html(generateCalendar(cfg.cdate.month, cfg.cdate.year, cfg.cdate.day));
            var month = (cfg.ui.yearbox) ? cfg.cdate.monthName : cfg.cdate.monthName + " " + cfg.cdate.year;
            if (cfg.ui.monthbox) 
                $(cfg.div.month_c).html(month);
            if (cfg.ui.yearbox) 
                $(cfg.div.year_c).html(cfg.cdate.year);
            dayHighlight();
            cfg.div.content.find(cfg.div.cday).click(function(){
                $(cfg.cinput).val(this.abbr);
                cfg.cdate.day = parseInt($(this).text());
                dayHighlight();
                toggleCalendar();
            });
        };
        function getLink(day){
            if (!cfg.ajax.data) 
                return day;
            var strdate = (day < 10) ? "0" + day : day;
            if (typeof(cfg.ajax.data.days[strdate]) != 'undefined') 
                return '<a href="' + encodeURI(cfg.ajax.data.days[strdate][1]) + '">' + day + '</a>';
            else 
                return day;
        };
        function generateCalendar(m, y, d){
            cfg.cdate.day = hasParam(d, cfg.cdate.date.getDate());
            cfg.cdate.month = hasParam(m, cfg.cdate.date.getMonth());
            cfg.cdate.year = hasParam(y, cfg.cdate.date.getFullYear());
            cfg.cdate.startingDay = new Date(cfg.cdate.year, cfg.cdate.month, 0).getDay();
            cfg.cdate.monthLength = cfg.days_in_month[cfg.cdate.month];
            cfg.cdate.monthName = cfg.lang.month_names[cfg.cdate.month];
            if (cfg.cdate.month == 1 && (cfg.cdate.year % 4 == 0 && cfg.cdate.year % 100 != 0) || cfg.cdate.year % 400 == 0) 
                cfg.cdate.monthLength = 29;
            var html = '<div id="backTR" class="opacity-gray"></div><table cellspacing="1" cellpadding="0"><tr class="dr">';
            for (var i = 0; i <= 6; i++) 
                html += '<td class="dn">' + cfg.lang.day_names[i] + '</td>';
            html += '</tr><tr>';
            var day = 1;
            var i, j;
            for (i = 0; i < 9; i++) {
                for (j = 0; j <= 6; j++) {
                    if (day <= cfg.cdate.monthLength && (i > 0 || j >= cfg.cdate.startingDay)) {
                        html += '<td class="cd" id="d' + day + '" abbr="' + FormatedDate(day) + '">' + getLink(day) + '</td>';
                        day++;
                    }
                    else {
                        html += '<td></td>'
                    }
                }
                if (day > cfg.cdate.monthLength) 
                    break;
                else 
                    html += '</tr><tr>';
            }
            html += '</tr></table>';
            return html;
        };
        initCalendar();
        this.each(function(i, o){
            if (cfg.init != 'auto') {
                $(o).addClass("datepicker-input");
                $('<a href="#" class="datepicker-button"></a>').insertAfter(o).click(function(){
                    buildCalendar(o);
                    return false;
                });
            }
        });
        if (cfg.init == 'auto') 
            ifAjaxData(cfg.ajax.param, buildCalendar, [this]);
        return this;
    };
    $.queryString = function(key, def){
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for (var i = 0; i < hashes.length; i++) {
            hash = hashes[i].split('=');
            vars.push(hash[0]);
            vars[hash[0]] = hash[1];
        }
        return (!key) ? vars : ((!vars[key]) ? ((def === 'undefined') ? false : '') : vars[key]);
    };
    $.popUp = function(settings){
        var cfg = {
            title: "PopUP",
            method: "html",
            content: "url",
            width: "",
            height: "",
            callback: function(data){
            },
            buttons: {
                close: '<a class="close"></a>'
            },
            popup: {
                win: ".popup_window",
                transparent: ".popup_transparent",
                header: ".popup_header",
                content: ".popup_content"
            },
            onclose: function(cfg){
            }
        };
        if (settings) 
            $.extend(cfg, settings);
        this.Remove = function(){
            return Clear();
        };
        this.fixPosition = function(){
            return FixPos();
        };
        function fixIE6(){
            $("HTML,BODY").css("overflow", "hidden");
            $([cfg.popup.transparent, cfg.popup.win]).css("position", "absolute");
            $(cfg.popup.transparent).addClass("ie-transparent");
            $(cfg.popup.transparent).css({
                top: $(this).scrollTop() + "px"
            });
            $(cfg.popup.win).css({
                top: parseInt((($(window).height() - $(cfg.popup.win).height()) / 2) + $(this).scrollTop()) + "px"
            });
        };
        function popUpInit(){
            if (!$.data(document, 'popUpInit')) {
                var bg = $('<div class="popup_transparent"></div>').hide();
                var wn = $('<div class="popup popup_window"><div class="popup_header"><div class="title"></div><div class="buttons"></div></div><div class="popup_content"></div></div>').hide();
                $('BODY').prepend(bg).append(wn);
                $(window).bind("resize", FixPos);
                $.data(document, 'popUpInit', true);
            }
        };
        function FixPos(){
            var width, height;
            if ($(cfg.popup.win).is(':visible')) {
                height = $(cfg.popup.win).height();
                width = $(cfg.popup.win).width();
            }
            else {
                $(cfg.popup.win).css({
                    visibility: 'hidden',
                    display: 'block'
                });
                height = $(cfg.popup.win).height();
                width = $(cfg.popup.win).width();
                $(cfg.popup.win).css({
                    display: 'none',
                    visibility: 'visible'
                });
            }
            $(cfg.popup.win).css({
                top: parseInt(($(window).height() - height) / 2) + "px",
                left: parseInt(($(window).width() - width) / 2) + "px"
            });
        };
        function Clear(){
            $("IFRAME").css("visibility", "visible");
            $(cfg.popup.win).hide();
            $(cfg.popup.transparent).hide();
            if ($.IE6) 
                $("HTML,BODY").removeAttr("style");
        };
        function Show(){
            $("IFRAME").css("visibility", "hidden");
            FixPos();
            $(cfg.popup.win).show();
            $(cfg.popup.transparent).show();
            $($(cfg.popup.header).find(".close")).one("click", function(){
                Clear();
                cfg.onclose();
            });
        };
        function Create(){
            cfg.popup.transparent = $(cfg.popup.transparent);
            cfg.popup.win = $(cfg.popup.win);
            cfg.popup.header = $(cfg.popup.header);
            cfg.popup.content = $(cfg.popup.content);
            cfg.popup.header_title = $(cfg.popup.header).find(".title");
            cfg.popup.header_buttons = $(cfg.popup.header).find(".buttons");
            var buttons = '';
            for (r in cfg.buttons) 
                buttons += cfg.buttons[r] || '';
            $(cfg.popup.header_buttons).html(buttons);
            $(cfg.popup.header_title).html(cfg.title);
            $(cfg.popup.win).width(cfg.width).height(cfg.height);
            if (cfg.method == "html") {
                $(cfg.popup.content).html(cfg.content);
                Show();
                if ($.IE6) 
                    fixIE6();
            }
            else 
                if (cfg.method == "load") {
                    if ($.data(document, cfg.content)) {
                        $(cfg.popup.content).html($.data(document, cfg.content));
                        Show();
                        if ($.IE6) 
                            fixIE6();
                    }
                    else {
                        $(cfg.popup.content).load(cfg.content, function(){
                            $.data(document, cfg.content, $(cfg.popup.content).html());
                            Show();
                            if ($.IE6) 
                                fixIE6();
                        });
                    }
                }
                else {
                    $(cfg.popup.content).html("Ошибка вызова функции $.popUp method");
                }
        };
        popUpInit();
        if (settings) 
            Create();
        return this;
    };
    $.sendForm = function(settings){
        var config = {
            form: "",
            nocache: false,
            beforeSubmit: function(config){
            },
            afterSubmit: function(data){
            },
            postData: {}
        };
        if (settings) 
            $.extend(config, settings);
        config.fields = $(config.form).find("INPUT,SELECT,TEXTAREA").filter("[name]");
        config.action = $(config.form).attr("action");
        function isArray(name){
            var length = config.fields.filter('[name=' + name + ']').length;
            if (length > 1) {
                if (!config.postData[name]) 
                    config.postData[name] = [];
                return true;
            }
            else {
                return false;
            }
        };
        $(config.fields).each(function(i, v){
            if (v.type == 'checkbox' && !v.checked) 
                return false;
            else 
                if (v.type == 'radio' && !v.checked) 
                    return false;
            if (isArray(v.name)) {
                config.postData[v.name].push(v.value);
            }
            else {
                config.postData[v.name] = v.value;
            }
        });
        config.beforeSubmit(config);
        if (!config.nocache) 
            config.nocache = "";
        $.post(config.action + config.nocache, $.param(config.postData, true), config.afterSubmit);
        return this;
    };
    $.userBlock = function(settings){
        var config = {
            append: false,
            form: "",
            menu: "",
            url: "/l_doc2.nsf/checkUser.act?_=",
            nocache: new Date().getTime(),
            field: {
                name: "#t_name",
                units: "#t_units",
                bonus: "#t_bonus",
                free: "#t_free"
            }
        };
        if (settings) 
            $.extend(config, settings);
        this.logout = function(){
            $.get("/l_doc2.nsf/logoutE3?redirectTo=" + location.href, function(data){
                location.reload()
            });
            return this;
        };
        function insertData(data){
            $(config.field.name).html(data.info.auth_by_external_service ? data.info.userName :  data.info.name);
            $(config.field.units).html(data.info.units);
            $(config.field.bonus).html(data.info.bonus);
            $(config.field.free).html(data.info.free);
            if (data.info.actual) {
                $(config.field.units + "," + config.field.free);
            }
        };
        function requestData(){
            $.getJSON(config.url + config.nocache, function(data){
                if (config.append) {
                    if (data.check == "true") 
                        $(append).load(config.menu, function(){
                            insertData(data);
                            $(append).show()
                        });
                    else 
                        $(append).load(config.form, function(){
                            $(append).show()
                        });
                }
                else {
                    if (data.check == "true") {
                        insertData(data);
                        $(config.menu).show()
                    }
                    else {
                        $(config.form).show();
                    }
                }
            });
        };
        if (settings) 
            requestData();
        return this;
    };
    $.Alert = function(settings){
        var cfg = {
            selector: ".msg",
            div: "BODY",
            method: "prepend",
            type: "success",
            msg: false,
            close: false,
            closehref: "#",
            closestyle: "",
            allhide: false,
            methodHide: 'hide',
            methodShow: 'show',
            closeBut: '#closeAlert',
            onClose: function(){
            },
            top: '<div class="roundYBlock f12"><div class="tc"><div><div>&nbsp;</div></div></div><div class="outer"><div class="inner">',
            bottom: '</div></div><div class="bc"><div><div>&nbsp;</div></div></div></div>'
        };
        if (settings) 
            $.extend(cfg, settings);
        this.Remove = function(){
            return $(cfg.div).find(cfg.selector).remove()
        };
        this.Hide = function(){
            return $(cfg.div).find(cfg.selector)[cfg.methodHide]()
        };
        this.Show = function(){
            return $(cfg.div).find(cfg.selector)[cfg.methodShow]()
        };
        $(cfg.div).find(cfg.selector).remove();
        if (cfg.allhide) 
            $(cfg.selector).hide();
        if (cfg.close) 
            cfg.top += '<a href="' + cfg.closehref + '" style="float:right;" class="' + cfg.closestyle + ' link-icon icon-close" id="closeAlert">' + cfg.close + '</a>';
        $(cfg.div)[cfg.method]('<div class="' + cfg.selector.slice(1) + ' ' + cfg.type + '" style="display:none;">' + cfg.top + cfg.msg + cfg.bottom + '</div>');
        if (cfg.close) 
            $(cfg.closeBut).live("click", function(){
                $(cfg.div).find(cfg.selector).remove();
                cfg.onclose();
                return false;
            });
        return this;
    };
    $.fn.toggleBox = function(settings){
        var cfg = {
            togglelink: "",
            togglebox: "",
            imgclose: "",
            imgopen: "",
            imgtag: "IMG",
            hide: false
        };
        if (settings) 
            $.extend(cfg, settings);
        this.each(function(i, o){
            o.box = $(o).find(cfg.togglebox);
            o.link = $(o).find(cfg.togglelink);
            o.img = $(o).find(cfg.imgtag);
            if (cfg.hide) {
                $(o.box).hide();
                $(o.img).attr("src", cfg.imgclose);
            };
            o.link.live("click", function(){
                if ($(o.box).is(":visible")) {
                    $(o.box).hide();
                    $(o.img).attr("src", cfg.imgclose);
                }
                else {
                    $(o.box).show();
                    $(o.img).attr("src", cfg.imgopen);
                }
            });
        });
        return this;
    };
    $.menuLight = function(selector, core){
        var check = false;
        var lastMatch = "";
        var links = $(selector);
        var home = $(links).filter(function(index){
            if (this.rel == "home") 
                return this;
        });
        if (core == location.pathname) {
            $(home).addClass("active");
            return;
        };
        links.each(function(i, v){
            if (check) 
                return;
            if (location.pathname.indexOf(core + v.rel) == 0) {
                $(links).removeClass("active");
                $(v).addClass("active");
                check = true;
            }
        }).each(function(i, v){
            if (location.pathname.indexOf(core + v.rel) == 0) {
                $(links).removeClass("active");
                $(v).addClass("active");
                check = true;
            }
        });
        if (!check) 
            $(home).addClass("active");
    };
    $.menuSlide = function(selector, parent){
        var menuShow = false;
        var outline = parent || selector;
        var ul = $(selector).find("A.active").parents("UL");
        $(ul).show().prev().addClass("hactive current");
        var active = $(selector).find(".active").get(0);
        if ($(active).next().get(0)) {
            $(active).addClass("hactive current");
            $(active).next().show();
        }
        var obj = $(".subhead").filter(function(index){
            if (!$(this).hasClass("current")) 
                return this;
        });
        $(obj).mouseover(function(){
            if (!$(this).next().is(":visible")) {
                $t = this;
                this.timer2 = setTimeout(function(){
                    $($t).addClass("hactive");
                    $($t).next().slideDown(300);
                    menuShow = true;
                }, 300);
            }
        }).mouseout(function(){
            if (!menuShow) 
                clearTimeout(this.timer2);
        });
        $(outline).mouseout(function(){
            if (!$(obj).next().is(":visible")) {
                return menuShow = false;
            };
            this.timer = setTimeout(function(){
                $(obj).next().slideUp(300, function(){
                    $(obj).removeClass("hactive");
                    menuShow = false;
                }).blur()
            }, 600);
        }).mouseover(function(){
            if (menuShow) 
                clearTimeout(this.timer)
        });
    };
    $.fn.extend({
        changeTab: function(handler, index){
            return this.trigger('changeTab', handler, index);
        }
    });
    $.fn.tabmenu = function(settings){
        var config = {
            title: ".title",
            box: ".box",
            current: ".current",
            hover: "hover",
            index: 0,
            ajax: false,
            fixed: false,
            outer: false,
            ext: ".add",
            beforeSwitch: function(){
            },
            afterSwitch: function(){
            }
        };
        if (settings) 
            $.extend(config, settings);
        var fixHeight = function(){
            config.ie = ($.IE6) ? 1 : 0;
            config.tmp_height = 0;
            $(config.parent_children).each(function(i, v){
                if (v.id == config.accord.id) {
                    return;
                }
                config.tmp_height = config.tmp_height + $(v).outerHeight();
            });
            $(config.accord).height($(config.parent).outerHeight() - config.tmp_height - config.ie);
            config.tmp_height = 0;
            $(config.titles).each(function(i, v){
                config.tmp_height += $(v).outerHeight();
            });
            $(config.boxes).height($(config.accord).height() - config.tmp_height - config.ie);
        };
        var requestContent = function(){
            if ($(config.currentBox).hasClass("is_loaded")) {
                fixHeight();
                return;
            }
            config.fileurl = config.currentTitle.hash.slice(1) + config.ext;
            $(config.currentBox).html('<div id="bg-loading"></div>');
            $.get(config.fileurl, function(data){
                $(config.currentBox).html(data);
                fixHeight();
                $(config.currentBox).addClass("is_loaded");
            });
        };
        var switchTab = function(index){
            if (config.index == (index - 1)) 
                return false;
            config.index = index - 1;
            config.beforeSwitch();
            if (config.currentTitle) 
                $(config.currentTitle).removeClass(config.current.slice(1));
            if (config.currentBox) 
                $(config.currentBox).hide();
            config.currentTitle = config.titles[index];
            config.currentBox = config.boxes[index];
            $(config.currentTitle).addClass(config.current.slice(1));
            $(config.currentBox).show();
            config.afterSwitch();
            if (config.fixed && !config.outer) 
                fixHeight();
            if (config.ajax) 
                requestContent();
        };
        this.each(function(i, o){
            config.accord = this;
            config.parent = $(this).parent();
            config.parent_children = $(config.parent).children();
            config.root = (config.outer) ? document : this;
            config.titles = $(config.root).find(config.title);
            config.boxes = $(config.root).find(config.box);
            switchTab(config.index);
            $(config.titles).click(function(event){
                switchTab(config.titles.index(this));
                return false;
            });
            if (config.fixed) {
                $(function(){
                    $(window).resize(function(){
                        fixHeight();
                    });
                });
            }
        });
        $(this).bind('changeTab', function(event, index){
            switchTab(index);
        });
        return this;
    };
    $.fn.selectbox = function(settings){
        var config = {
            input: ".input",
            hide_input: false,
            box: ".box",
            arrow: ".arrow A",
            arrow_active: ".active",
            attr: "name",
            selected: ".selected",
            hover: ".hover",
            height: false,
            popup: ".popup",
            onChange: function(obj, current){
            }
        };
        if (settings) 
            $.extend(config, settings);
        config.selector = this.selector;
        config.act_cn = config.arrow_active.slice(1);
        config.sel_cn = config.selected.slice(1);
        function initElements(index, el){
            var attr = $(this).attr(config.attr);
            this.hide = config.hide_input ? $(this).find(config.hide_input) : $('<input />').attr({
                type: 'hidden',
                name: attr,
                id: attr
            });
            this.input = $(this).find(config.input);
            this.box = $(this).find(config.box);
            this.arrow = $(this).find(config.arrow);
            this.list = $(this.box).children();
            this.selected = $(this.list).filter(config.selected);
        };
        function Change(obj){
            obj.box.hide();
            obj.arrow.removeClass(config.act_cn);
            obj.input.html(obj.selected.html());
            obj.hide.val(obj.selected.attr(config.attr));
        };
        function Toggle(){
            if (this.box.is(":visible")) {
                $(config.popup).hide();
                $(config.arrow).removeClass(config.act_cn);
            }
            else {
                $(config.popup).hide();
                $(config.arrow).removeClass(config.act_cn);
                this.arrow.addClass(config.act_cn);
                this.offset = this.input.offset();
                this.box.show().css({
                    top: parseInt(this.offset.top + this.input.outerHeight()),
                    left: this.offset.left
                });
            }
        };
        function bindEvents(index, el){
            $(this.arrow).one('click', function(e){
                el.box.width($(el).outerWidth());
                if (config.height && (config.height < $(el.box).height())) 
                    el.box.height(el.height).css("overflow", "auto");
                $("BODY").append(el.box);
            }).click(function(){
                Toggle.call(el);
                return false;
            });
            $(this.input).one('click', function(e){
                el.box.width($(el).outerWidth());
                if (config.height && (config.height < $(el.box).height())) 
                    el.box.height(el.height).css("overflow", "auto");
                $("BODY").append(el.box);
            }).click(function(){
                Toggle.call(el);
                return false;
            });
            $(this.list).click(function(){
                el.selected.removeClass(config.sel_cn);
                el.selected = $(this).addClass(config.sel_cn);
                Change(el);
                config.onChange(el, this);
            });
        };
        function windowEvent(index, el){
            $(window).bind("click", function(event){
                if (!$(event.target).parents(config.box).get(0) && $(el.box).is(":visible")) {
                    $(config.popup).hide();
                    $(config.arrow).removeClass(config.act_cn);
                }
            });
        };
        function defaultValue(index, el){
            this.input.html(this.selected.html());
            this.hide.val(this.selected.get(0) ? this.selected.attr(config.attr) : '');
            if (config.hide_input === false) 
                $(this).append(this.hide);
        };
        return this.each(initElements).each(bindEvents).each(windowEvent).each(defaultValue);
    };
    $.fn.toolTitle = function(settings){
        var cfg = {
            disabled_class: 'disableToolTitle',
            target_class: '.toolTitleContent',
            tooltip_class: '.toolTitleBox',
            cursor: 'help',
            delay: 250,
            attr: 'title',
            find_content: function(elem){
                return $(elem).parent().find(cfg.target_class);
            }
        };
        if (settings) 
            $.extend(cfg, settings);
        var el_top, el_left, el_width, el_height, p_left, p_top, a_left, a_top;
        function positionBox(elem){
            el_top = $(elem).offset().top;
            el_left = $(elem).offset().left;
            el_width = $(elem).outerWidth();
            el_height = $(elem).outerHeight();
            p_left = el_left - (cfg.toolBox.outerWidth() / 2) + (el_width / 2);
            p_top = el_top - cfg.toolBox.outerHeight() - 5;
            a_left = el_left - (cfg.arrow.outerWidth() / 2) + (el_width / 2);
            a_top = el_top - cfg.arrow.outerHeight();
            p_left = (parseInt(p_left) < 0) ? 10 : p_left;
            if (($(document).scrollTop() + $(cfg.toolBox).outerHeight()) > el_top) {
                p_top = parseInt(el_top + el_height + 5);
                a_top = parseInt(el_top + el_height);
                cfg.arrow.addClass('arrowUp').removeClass('arrowDown');
            }
            else {
                cfg.arrow.removeClass('arrowUp').addClass('arrowDown');
            }
            cfg.toolBox.css({
                left: p_left,
                top: p_top
            });
            cfg.arrow.css({
                left: a_left,
                top: a_top
            });
        };
        function prepareContent(elem){
            $(elem).data('tooltip-text', (elem[cfg.attr].length) ? elem[cfg.attr] : cfg.find_content(elem).html());
            elem[cfg.attr] = '';
            cfg.find_content(elem).remove();
        };
        function createToolBox(){
            cfg.toolBox = $('<div>');
            cfg.arrow = $('<div id="toolArrow">');
            cfg.toolBox.addClass(cfg.tooltip_class.slice(1));
            cfg.toolBox.hide();
            cfg.arrow.hide();
            $('BODY').append(cfg.toolBox, cfg.arrow);
            if ($.IE6 && $(cfg.toolBox).outerWidth() > 400) 
                $(elem.box).css('width', '400px');
        };
        createToolBox();
        this.each(function(i, elem){
            prepareContent(elem);
            $(elem).css('cursor', cfg.cursor).hover(function(){
                if ($(this).hasClass(cfg.disabled_class)) 
                    return;
                cfg.timer = setTimeout(function(){
                    cfg.toolBox.html($(elem).data('tooltip-text'));
                    positionBox(elem);
                    cfg.toolBox.show();
                    cfg.arrow.show();
                }, cfg.delay);
            }, function(){
                if (cfg.timer) {
                    clearTimeout(cfg.timer);
                    cfg.arrow.hide();
                    cfg.toolBox.hide();
                }
            });
        });
        return this;
    };
    $.fn.toggleBox = function(settings){
        var config = {
            togglelink: "",
            togglebox: "",
            imgclose: "",
            imgopen: "",
            imgtag: "IMG",
            hide: false
        };
        if (settings) 
            $.extend(config, settings);
        this.each(function(i, o){
            o.box = $(o).find(config.togglebox);
            o.link = $(o).find(config.togglelink);
            o.img = $(o).find(config.imgtag);
            if (config.hide) {
                $(o.box).hide();
                $(o.img).attr("src", config.imgclose);
            };
            o.link.click(function(){
                if ($(o.box).is(":visible")) {
                    $(o.box).hide();
                    $(o.img).attr("src", config.imgclose);
                }
                else {
                    $(o.box).show();
                    $(o.img).attr("src", config.imgopen);
                }
            });
        });
        return this;
    };
    $.fn.RoundAbout = function(options){
        var options = jQuery.extend({
            RoundAboutDirection: 'left',
            Speed: '50'
        }, options);
        return this.each(function(){
            var Timer = options.RoundAboutDirection + Math.floor(Math.random() * 40);
            var speed = parseInt(options.Speed);
            var object = $(this);
            var ElementSize = $(this).find("li").size();
            var SumaElement = 0;
            var elementParentHW = 0;
            var Direction = "";
            switch (options.RoundAboutDirection) {
                case "left":
                    $(object).find(" > ul").css({
                        position: 'absolute',
                        left: '0px',
                        top: '0px'
                    });
                    Direction = "horizontal";
                    elementParentHW = parseInt($(this).width()) * 5;
                    break;
                case "right":
                    $(object).find(" > ul").css({
                        position: 'absolute',
                        right: '0px',
                        top: '0px'
                    });
                    Direction = "horizontal";
                    elementParentHW = parseInt($(this).width()) * 5;
                    break;
                case "top":
                case "bottom":
                    $(object).find(" > ul").css({
                        position: 'absolute',
                        left: '0px',
                        bottom: '0px'
                    });
                    Direction = "vertical";
                    elementParentHW = parseInt($(this).height()) * 5;
                    break;
            }
            for (var i = 0; i < ElementSize; i++) {
                if (Direction == "horizontal") {
                    SumaElement += parseInt($(this).find("li:eq(" + i + ")").width()) + ($(this).find("li:eq(" + i + ")").css("paddingLeft") != "" ? parseInt($(this).find("li:eq(" + i + ")").css("paddingLeft")) : 0) + ($(this).find("li:eq(" + i + ")").css("paddingLeft") != "" ? parseInt($(this).find("li:eq(" + i + ")").css("paddingRight")) : 0) + ($(this).find("li:eq(" + i + ")").css("paddingLeft") != "" ? parseInt($(this).find("li:eq(" + i + ")").css("marginLeft")) : 0) + ($(this).find("li:eq(" + i + ")").css("paddingLeft") != "" ? parseInt($(this).find("li:eq(" + i + ")").css("marginRight")) : 0);
                }
                else 
                    if (Direction == "vertical") {
                        SumaElement += parseInt($(this).find("li:eq(" + i + ")").height()) + ($(this).find("li:eq(" + i + ")").css("paddingLeft") != "" ? parseInt($(this).find("li:eq(" + i + ")").css("paddingTop")) : 0) + ($(this).find("li:eq(" + i + ")").css("paddingLeft") != "" ? parseInt($(this).find("li:eq(" + i + ")").css("paddingBottom")) : 0) + ($(this).find("li:eq(" + i + ")").css("paddingLeft") != "" ? parseInt($(this).find("li:eq(" + i + ")").css("marginTop")) : 0) + ($(this).find("li:eq(" + i + ")").css("paddingLeft") != "" ? parseInt($(this).find("li:eq(" + i + ")").css("marginBottom")) : 0);
                    }
                    else {
                        alert("left, right, top, bottom");
                        return false;
                    }
            }
            if (Direction != "") 
                ClonGalery(options.RoundAboutDirection, elementParentHW, SumaElement);
            function ClonGalery(Direction, elementParentHW, SumaElement){
                $(object).find(" > ul").hover(function(){
                    clearTimeout(Timer);
                    Timer = null;
                }, function(){
                    switch (Direction) {
                        case "left":
                        case "right":
                            Timer = setTimeout(function(){
                                ScrullMove($(object).width(), SumaElement, Direction)
                            }, speed);
                            break;
                        case "top":
                        case "bottom":
                            Timer = setTimeout(function(){
                                ScrullMove($(object).height(), SumaElement, Direction)
                            }, speed);
                            break;
                    }
                });
                if (SumaElement >= elementParentHW) {
                    switch (Direction) {
                        case "left":
                        case "right":
                            $(object).find(" > ul").css("width", SumaElement);
                            Timer = setTimeout(function(){
                                ScrullMove($(object).width(), SumaElement, Direction)
                            }, speed);
                            break;
                        case "top":
                        case "bottom":
                            $(object).find(" > ul").css("height", SumaElement);
                            Timer = setTimeout(function(){
                                ScrullMove($(object).height(), SumaElement, Direction)
                            }, speed);
                            break;
                    }
                }
                else {
                    switch (Direction) {
                        case "left":
                        case "right":
                            var nn = Math.floor(elementParentHW / SumaElement + 1);
                            SumaElement = 0;
                            var objectHTML = $(object).find(" > ul").html();
                            for (i = 0; i < nn; i++) {
                                $(object).find(" > ul").append(objectHTML);
                            }
                            for (var n = 0; n < $(object).find(" > ul > li").size(); n++) {
                                SumaElement += parseInt($(object).find(" > ul > li:eq(" + n + ")").width()) + ($(object).find(" > ul > li:eq(" + n + ")").css("paddingLeft") != "" ? parseInt($(object).find(" > ul > li:eq(" + n + ")").css("paddingLeft")) : 0) + ($(object).find(" > ul > li:eq(" + n + ")").css("paddingLeft") != "" ? parseInt($(object).find(" > ul > li:eq(" + n + ")").css("paddingRight")) : 0) + ($(object).find(" > ul > li:eq(" + n + ")").css("paddingLeft") != "" ? parseInt($(object).find(" > ul > li:eq(" + n + ")").css("marginLeft")) : 0) + ($(object).find(" > ul > li:eq(" + n + ")").css("paddingLeft") != "" ? parseInt($(object).find(" > ul > li:eq(" + n + ")").css("marginRight")) : 0);
                            }
                            $(object).find(" > ul").css("width", SumaElement);
                            Timer = setTimeout(function(){
                                ScrullMove($(object).width(), SumaElement, Direction)
                            }, speed);
                            break;
                        case "top":
                        case "bottom":
                            var nn = Math.floor(elementParentHW / SumaElement + 1);
                            SumaElement = 0;
                            var objectHTML = $(object).find(" > ul").html();
                            for (i = 0; i < nn; i++) {
                                $(object).find(" > ul").append(objectHTML);
                            }
                            for (var n = 0; n < $(object).find(" > ul > li").size(); n++) {
                                SumaElement += parseInt($(object).find(" > ul > li:eq(" + n + ")").height()) + ($(object).find(" > ul > li:eq(" + n + ")").css("paddingLeft") != "" ? parseInt($(object).find(" > ul > li:eq(" + n + ")").css("paddingTop")) : 0) + ($(object).find(" > ul > li:eq(" + n + ")").css("paddingLeft") != "" ? parseInt($(object).find(" > ul > li:eq(" + n + ")").css("paddingBottom")) : 0) + ($(object).find(" > ul > li:eq(" + n + ")").css("paddingLeft") != "" ? parseInt($(object).find(" > ul > li:eq(" + n + ")").css("marginTop")) : 0) + ($(object).find(" > ul > li:eq(" + n + ")").css("paddingLeft") != "" ? parseInt($(object).find(" > ul > li:eq(" + n + ")").css("marginBottom")) : 0);
                            }
                            $(object).find(" > ul").css("height", SumaElement);
                            Timer = setTimeout(function(){
                                ScrullMove($(object).height(), SumaElement, Direction)
                            }, speed);
                            break;
                    }
                }
            }
            function ScrullMove(elementParentHW, SumaElement, Direction){
                if ((SumaElement - elementParentHW) > (parseInt($(object).find(" > ul").css(Direction)) * -1)) {
                    $(object).find(" > ul").css(Direction, (parseInt($(object).find(" > ul").css(Direction)) - 1) + "px");
                }
                else {
                    $(object).find(" > ul").css(Direction, "0px");
                }
                Timer = setTimeout(function(){
                    ScrullMove($(object).width(), SumaElement, Direction)
                }, speed);
            }
        });
    }
})(jQuery);

