/**
 * Набор классов для проекта
 * @requires jQuery
 * @namespace GlobalResources
 */

GlobalResources = new Object();
GlobalResources.AJAX_URI = '/djson/';

if (window.location.toString().match(/SESS_ID=(\d+)/))
    GlobalResources.SESS_ID = RegExp.$1;


/**
 * Выполняет Ajax запрос с JSON-ответом
 * @param {Object} data Данные
 * @param {Function} handler Обработчик
 */
GlobalResources.getJSON = function(data, handler) {
    if (!GlobalResources._AJAX_SETUP)
        GlobalResources._AJAX_SETUP = GlobalResources.initAjax();

    if (GlobalResources.SESS_ID)
        data['SESS_ID'] = GlobalResources.SESS_ID;

    $.post(
        $G.AJAX_URI,
        data,
        handler,
        'json'
    );
}

GlobalResources.initAjax = function() {
    var $body = $(document.body);
    function waitingState(state) {
        if (state) {
            $body.addClass('waiting');
        } else {
            $body.removeClass('waiting');
        }
    }

    $(document)
        .ajaxStart(function() {
            waitingState(true);
        })
        .ajaxStop(function() {
            waitingState(false);
        })
        .ajaxError(function(event, XMLHttpRequest, ajaxOptions, thrownError) {
            alert('Произошла ошибка при загрузки данных');
        });
    return 1;
}

/**
 * Синглтон для колонки навигации
 */
GlobalResources.NavigationBar = function() {

    /** @type {Number} Длительность анимации скролла */
    var SCROLL_DURATION = 200;

    /** @type {Number} таймаут для запуска скролла */
    var SCROLL_TIMEOUT = 100;

    /** @type {Number} Длительность анимации показа */
    var SLIDE_DURATION = 300;

    var $wrap = $(), $bar = $(), $btn = $();

    var visible = true;

    var scrollBody;

    /**
     * Настраивает прокрутку колонки
     */
    function setupScroll() {
        var offsetTop = $bar.offset().top;
        var height = $bar.outerHeight();
        var scrollTop = scrollBody.scrollTop;
        function barScroll() {
            var b = $bar.parent().height() - height + offsetTop;
            var pTop = (scrollTop > offsetTop)
                ? ((scrollTop > b)
                    ? b
                    : scrollTop)
                : offsetTop;
            pTop -= offsetTop;
            $bar.stop().animate(
                {
                    top: pTop
                },
                SCROLL_DURATION,
                'swing'
            );
        }
        $(window).scroll(function() {
            var _scrollTop = scrollBody.scrollTop;
            window.setTimeout(function() {
                if (_scrollTop == scrollTop) {
                    barScroll();
                }
            }, SCROLL_TIMEOUT);
            scrollTop = _scrollTop;
        });
        barScroll();
    }

    /**
     * Скрыть панель
     * @param {Boolean} force Сделать все по-быстрому
     */
    function hide(force) {
        visible = false;
        var left = - ($wrap.outerWidth() + $wrap.parent().offset().left);
        if (force) {
            $wrap.stop().css({
                marginLeft: left
            });
            _hideHandler();
        } else {
            $wrap.stop().animate(
                {
                    marginLeft: left
                },
                SLIDE_DURATION,
                'swing',
                _hideHandler
            );
        }
    }
    function _hideHandler() {
        $btn.removeClass('fbb-close');
    }

    /**
     * Показать панель
     * @param {Boolean} force Сделать все по-быстрому
     */
    function show(force) {
        visible = true;
        if (force) {
            $wrap.stop().css({
                marginLeft: 0
            });
            _showHandler();
        } else {
            $wrap.stop().animate(
                {
                    marginLeft: 0
                },
                SLIDE_DURATION,
                'swing',
                _showHandler
            );
        }
    }
    function _showHandler() {
        $btn.addClass('fbb-close');
    }

    function _clickHandler() {
        if (visible) {
            hide();
        } else {
            show();
        }
    }

    function _resizeHandler() {
        hide(true);
        var $p = $wrap.parent();
        $p.css('min-height', $bar.height());
    }

    return {
        /**
         * Настройка
         */
        setup: function() {
            scrollBody = Browser.getScrollBody();
            var $contentWrap = $('div.cont-wrap-wide');
            $bar = $contentWrap.find('div.left-col');
            if ($bar.length) {
                $bar.css('position', 'relative');
                $wrap = $(document.createElement('div'))
                    .addClass('b-floating-bar')
                    .insertBefore($bar)
                    .append($bar);
                $btn = $(document.createElement('div'))
                    .addClass('fb-btn')
                    .addClass('fbb-close')
                    .click(_clickHandler)
                    .appendTo($bar);
                $(window).resize(_resizeHandler)
                setupScroll();
                _resizeHandler();
            }
        }
    }
}();

/**
 * Класс дл всплывающих окон
 */
GlobalResources.Popup = function() {
    var w = window;
    var d = document;
    return {
        /**
         * Показать попап c завязкой на ссылку
         * @param {Object} link ссылка
         * @param {Number} width
         * @param {Number} height
         * @param {String} [windowType] тип окна (simple|modern)
         */
        show: function(link, width, height, windowType) {
            if (link._window) {
                link._window.focus();
                return;
            }
            windowType = windowType || 'simple';
            var win = GlobalResources.Popup.showStandart(link.href, width, height, windowType, link);
            if ((!jQuery.browser.opera) && (!Browser.isMSIE)) {
                var $link = $(link);
                $link.addClass('active');
                var _unloadHandler = function() {
                    $link.removeClass('active');
                    link._window = null;
                }
                if (windowType == 'modern') {
                    win.attachEventListener('close', _unloadHandler);
                } else {
                    link._window = win;
                    win.onbeforeunload = _unloadHandler;
                }
            }
        },

        /**
         * Показывает стандартный браузерный попап
         * @param {String} url урл
         * @param {Number} width ширина окна
         * @param {Number} height высота окна
         * @param {String} [type] Тип (simple|modern)
         * @param {Object} [link] якорь для красоты
         */
        showStandart: function(url, width, height, type, link) {
            if (type == 'modern') {
                var w = new $G.Window({
                    align          : 'center-center',
                    width          : width,
                    height         : height,
                    animation      : true,
                    animationSlide : true,
                    slideAncestor  : link
                });
                w.attachEventListener('draw', function(_window) {
                    var iframe = document.createElement('iframe');
                    iframe.src = url;
                    _window.$content.append(
                        $(iframe)
                        .css({
                            width    : width,
                            height   : height
                        })
                    );
                });
                w.show();
                return w;
            } else {
                var d = new Date();
                var name = 'W_' + d.getTime().toString();
                var windowParams = {
                    alwaysLowered : 'no',
                    dependent     : 'yes',
                    directories   : 'no',
                    location      : 'no',
                    menubar       : 'no',
                    toolbar       : 'no',
                    scrollbars    : 'no',
                    resizable     : 'yes',
                    innerWidth    : width,
                    innerHeight   : height,
                    width         : width,
                    height        : height
                };
                var w = window.open(url, name, ConvertHashToString(windowParams, ','));
                return w;
            }
        }

    }
}();


/**
 * Синглтон для заявки звонка
 */
GlobalResources.CallRequest = function() {

    var PHONE_REGEXP = /8\-\d{3}\-\d{3}\-\d{4}/;

    var form, input;
    var sent = false;

    function submit() {
        if (!sent) {
            sent = true;
            $G.getJSON({
                _do   : 'call_request',
                phone : input.value
            }, _responseHandler);
        }
    }

    function _responseHandler(data) {
        if (data.success) {
            $(form).replaceWith($(document.createElement('div')).addClass('text').html(data.success));
        } else {
            input.blur();
            input.value = input.defaultValue;
            sent = false;
        }
    }

    function _submitHandler() {
        if ((input.value) && (input.value != input.defaultValue)) {
            submit();
        }
        return false;
    }


    return {
        /**
         * Инициализация
         * @param {String} objectId Id объекта
         */
        init: function(objectId) {
            form = document.getElementById(objectId);
            if ((form) && (form.tagName.toLowerCase() === 'form')) {
                $(form).submit(_submitHandler);
                //$.mask.definitions['~']='[+-0123456789()]';
                var $input = $('input[name="phone"]', form)
                    /*.mask(
                        '~~~~~~~~~~~~~~~~~~~~~',
                        {
                            placeholder: '_'
                        }
                    )*/
                    .focus(function() {
                        $(this).addClass('active');
                        if (this.value == this.defaultValue)
                            this.value = '';
                    })
                    .blur(function() {
                        if (!this.value) {
                            $(this).removeClass('active')
                            this.value = this.defaultValue;
                        }
                    });
                input = $input.get(0);
                input.value = input.defaultValue = 'Введите номер';
            }
        }
    }
}()

/**
 * Синглетон формы авторизации
 */
GlobalResources.LoginForm = function() {

    var form;

    function _submitHandler() {

    }

    return {
        init : function() {
            form = document.getElementById('login-form');
            if (form) {
                var $form = $(form);
                $form.submit(_submitHandler)
                $form.find('input:text,input:password')
                    .focus(function() {
                        $(this).addClass('active')
                    })
                    .blur(function() {
                        if (!this.value) {
                            $(this).removeClass('active')
                        }
                    })
                    .each(function() {
                        Placeholder.attach(this);
                    });

            }
        }
    }
}();


/**
 * Класс анимации часов
 */
GlobalResources.Clocks = function() {
    var elements = new Array();
    var timer;

    var zoneOffset;

    function setupTimer() {
        timer = window.setInterval(timerHandler, 500);
    }

    function timerHandler() {
        var local = new Date();
        var date = new Date(local.getTime() + (local.getTimezoneOffset() + zoneOffset * 60) * 60000);
        var h = date.getHours();
        var m = date.getMinutes();
        if (h < 10)
            h = '0' + h;
        if (m < 10)
            m = '0' + m;
        var s = date.getSeconds();
        for (var i = 0; i < elements.length; i ++) {
            elements[i].innerHTML = h + '<span>:</span>' + m;
            elements[i].className = (s % 2 == 0) ? 'sh' : '';
        }
    }

    return {
        init: function(objectId, zone) {
            zoneOffset = zone;
            var el = document.getElementById(objectId);
            if (el) {
                elements.push(el);
                setupTimer();
            }
        },
        addElement: function(objectId) {
            var el = document.getElementById(objectId);
            if (el) {
                elements.push(el);
            }
        }
    }
}();

GlobalResources.VisualEffects = function() {
    var FOLD_DURATION = 400;
    var $wrap = $(document.getElementById('cnt-wrap'));
    $wrap.find('a[rel="fancy"]').fancybox({
        padding: 0,
        titlePosition: 'inside',
        overlayOpacity: 0
    });

    $wrap.find('a[rel="fold"]').click(function() {
        if (this._unfolded) {
            $(this).parent().addClass('f-deact').next().slideUp(FOLD_DURATION);
            this._unfolded = false;
        } else {
            var l = this;
            function _scroll() {
                $(Browser.getScrollBody()).animate({
                    scrollTop: $(l).parent().offset().top - 20
                }, FOLD_DURATION)
            }
            $(this).parent().removeClass('f-deact').next().slideDown(FOLD_DURATION, _scroll);
            this._unfolded = true;
        }
        return false;
    });
}


$G = GlobalResources;


