/**
 * aka void main()
 */
$(function() {
    Ctmol.initAjax();

    Ctmol.Informers.init('#informers');
    Ctmol.BannerShow.init();

    Ctmol.MainMenu.init();

    Ctmol.Advices.init();

    Ctmol.Pseudos.init();

    var newmap = new Ctmol.Map();

    if (Ctmol.interfaceName === 'eshop'){
        Ctmol.eShop.init();
    }
    if (Ctmol.interfaceName === 'gallery_cat'){
        var test = new Ctmol.multipleGalleries();
    }
    if (Ctmol.interfaceName === 'contest'){
        Ctmol.PhotoContest.setupGalleries();
    }
});


/**
 * Глобальный неймспейс
 */
Ctmol = new Object();

/** @type {Object} неймспейс проекта */
Ctmol = function(undef) {
    return {
        undefined : undef
    }
}();

//----- Общие настройки---------------------------------------------------------

/** @type {String} url для ajax запроса */
Ctmol.AJAX_URI = '/json/';

/** @type {Number} Значение прозрачности для оверлея */
Ctmol.overlayOpacity = 0.6;

/** @type {string} Значение цвета для оверлея */
Ctmol.overlayColor = "#333333";

/** @type {String} id сессии из командной строки */
Ctmol.SESS_ID = '';
if (window.location.toString().match(/SESS_ID=(\d+)/))
    Ctmol.SESS_ID = RegExp.$1;

//------------------------------------------------------------------------------

//----- Общие функции ----------------------------------------------------------

/**
 * Выполняет Ajax запрос с JSON-ответом
 * @param {Object} data Данные
 * @param {Function} handler Обработчик
 */
Ctmol.getJSON = function(data, handler) {
    if (Ctmol.SESS_ID)
        data['SESS_ID'] = Ctmol.SESS_ID;
    $.post(Ctmol.AJAX_URI, data, handler, 'json');
}

/**
 * Выполняет Ajax запрос с xml-ответом
 * @param {Object} data Данные
 * @param {Function} handler Обработчик
 */
Ctmol.getXML = function(data, handler) {
    if (Ctmol.SESS_ID)
        data['SESS_ID'] = Ctmol.SESS_ID;
    $.post('/ajax/', data, handler, 'xml');
}


/**
 * Настройки для Ajax запросов
 */
Ctmol.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('Произошла ошибка при загрузке данных. Попробуйте перезагрузить страницу.');
            waitingState(false);
        });
}

/**
 *  Слой - оверлей
 */
Ctmol.Overlay = function(){
    var $overlay = null;

    function _show(){
        if (!$overlay){
              $overlay = $(document.createElement('div'))
                         .addClass('overlay')
                         .css({
                              opacity: Ctmol.overlayOpacity
                         }).hide()
                         .appendTo(document.body);
        }
        $overlay.show();
        if (Browser.isIE6)
            $overlay.css({
                position : 'absolute',
                height : document.body.scrollHeight
            });
    }

    function _hide(){
        $overlay.hide();
    }

    return {
        show: function(){
            _show();
        },
        hide: function(){
            _hide();
        },
        onclick: function(handler){
            $overlay.unbind("click");
            $overlay.click(handler);
        }
    }
}();

Ctmol.textContent = function(xml) {
    var cnt;
    if (xml.text != undefined) {
      cnt = xml.text;
    } else if (xml.textContent != undefined) {
      cnt = xml.textContent;
    } else {
      cnt=xml.firstChild.nodeValue;
    }
    return cnt;
}

//------------------------------------------------------------------------------

//----- Интерфейсные функции ---------------------------------------------------

/**
 * Обработчик галерей
 */
Ctmol.Gallery = function(){
    $(".gallery a, a.fancy").fancybox({ overlayOpacity: Ctmol.overlayOpacity,
                                        overlayColor: Ctmol.overlayColor,
                                        titlePosition: "over"})
}

Ctmol.Pseudos = function(){

    return{
        init: function(){
            $(".pseudo").click(function(){ var shows = $(this.parentNode.parentNode).find(".v-inf");
                                           shows.toggleClass("hd");
                                           if(shows.hasClass("hd")){
                                                this.innerHTML = "краткая информация";
                                           }else{
                                                this.innerHTML = "закрыть";
                                           }
                                           return false; });

        }
    }

}();

/* ------------------------------- */

Ctmol.Advices = function(){

    function show(xml){
        if(xml){
            var template = xml.getElementsByTagName("template")[0];
            if(template){
                $.fancybox(Ctmol.textContent(template),{ overlayOpacity: Ctmol.overlayOpacity,
                                                         overlayColor: Ctmol.overlayColor,
                                                         titleShow: false});

                $("#advice-form form").submit(function(){ send(this); return false; });
            }
        }
    }

    function send(form){
        var params = { iface: "advices_form" };

        var $form = $(form);

        var errorFlag = false;

        $form.find('.p').removeClass('error');
        var $fields = $form.find('input, textarea');
        for (var i = 0; i < $fields.length; i++) {
            var $f = $fields.eq(i), $p = $f.parent();
            if(($f.attr('name'))&&($f.attr('name')!='__BACK')){
                var val = $f.val().trim();
                params[ $f.attr('name') ] = val;
                if (($p.hasClass('need-field')) && (val == '')) {
                    $p.addClass('error');
                    errorFlag = true;
                }
            }
        }
        if (!errorFlag) {
            $.fancybox.showActivity();
            Ctmol.getXML(params,function(xml){ answer(xml); });
        }

    }

    function answer(xml){
        if(xml){
            var template = xml.getElementsByTagName("template")[0];
            if(template){
                 $.fancybox(Ctmol.textContent(template),{ overlayOpacity: Ctmol.overlayOpacity,
                                                          overlayColor: Ctmol.overlayColor,
                                                          titleShow: false});
            }
        }
    }

    return{
        init: function(){
            $("#advices").click(function(){
                $.fancybox.showActivity();
                Ctmol.getXML({ iface : "advices_form",
                               _action: "get" },function(xml){ show(xml); }); return false; })
        }
    }
}();

/* ------------------------------- */

Ctmol.multipleGalleries = function(){
    this.name = "MultiGallery";
    this.gallery = null;
    this.start();
}

Ctmol.multipleGalleries.prototype = {
    start: function(){
        var self = this;
        $(".galleries .g-item").each(function(){
            var links = $(this).find("a.shg");
            if(links.length>0){
                $(links[0]).click(function(){
                    var gallery_id = this.href.split("?")[1].split("=")[1];
                    if(self.gallery){ self.gallery = null };
                    self.gallery = new FBox({
                            animation: true,
                            imagesList: true,
                            imagesListWidth: 80,
                            useLoaderAnim: true,
                            loaderParams: {
                                animatioLength: 400,
                                animationStep: 50,
                                animationTime: 100
                            },
                            showOverlay: true,
                            navigationButtons: true,
                            navigationButtonsHover: false,
                            ajax: {
                                url: '/ajax/',
                                iface: 'gallery',
                                gallery_id: gallery_id
                            },
                            constraints: {
                                minWidth: 470,
                                minHeight: 465,
                                maxWidth: 750,
                                maxHeight: 1400
                            }
                        });
                    self.gallery.show();
                    return false;
                });
                $(links[1]).click(function(){
                    $(links[0]).trigger('click');
                    return false;
                })
            }
        });
    }
}

/**
 *  Главное меню сайта. Создает и показывает попапы.
 */
Ctmol.MainMenu = function(){

    var $body = null;
    var hideDelay = 80;

    createOuterCont = function(link){

        var hideDelayTimer = null;
        var beingShown = false;
        var shown = false;

        var parent = link.parentNode;
        var hd = $(parent).find(".hd");
        if(hd.length>0){
            var bubble = $(document.createElement("div"))
                            .addClass("popup")
                            .appendTo($body);
            if($(parent.parentNode).hasClass('menu')){
                bubble.data("mmenu",1);
            }
            var wrp = $(document.createElement("div"))
                            .addClass("pp-cnt")
                            .appendTo(bubble);
            var pp = $(document.createElement("div"))
                            .addClass("pp")
                            .html(hd.html())
                            .appendTo(wrp);
            bubble.append("<em class='arr png'/>");
            pp.append("<em class='cn cn-tl'/><em class='cn cn-tr'/>");
            wrp.append("<em class='cn cn-bl'/><em class='cn cn-br'/>");

           $([ link, bubble.get(0)]).mouseover(function () {
                  if (hideDelayTimer) clearTimeout(hideDelayTimer);
                  if (beingShown || shown) {
                        return false;
                  } else {
                        beingShown = false;
                        shown = true;
                        var position = $(link.parentNode).offset();

                        if(bubble.data("mmenu")){
                            position.top+=2;
                        }else{
                            position.left+=5;
                        }
                        bubble.css({top: Math.round(position.top - (23 - link.offsetHeight/2))+'px',
                                    left: Math.round(position.left + link.offsetWidth)+'px',
                                    display: "block"});
                  }
                  return false;
            }).mouseout(function () {
                  if (hideDelayTimer) clearTimeout(hideDelayTimer);
                  hideDelayTimer = setTimeout(function () {
                        hideDelayTimer = null;
                        bubble.css('display', 'none');
                        shown = false;
                  },hideDelay);
                  return false;
            });
            //$(link).click(function(){ return false; });
        }
    }

    return{
        init: function(){
            $body = $(document.body);
            $("#left .menu .mi, #left .menu-s .mi").each(function(){
                createOuterCont(this);
            })
        }
    }
}();

/**
 * Обработчик информеров
 */
Ctmol.Informers = function() {

    var RU_MONTHS = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'];

    var $wrap = $(),
        $date = $(),
        $time = $();

    var interval;

    function setupDateTime() {
        var date = new Date();
        $date = $wrap.find('.date')
        $time = $(document.createElement("span"))
            .attr("id","i-clocks")
            .addClass("time")
            .appendTo($date);

        $(document.createElement("strong"))
            .html(_gDN(date, 'Date') + ' ' + RU_MONTHS[date.getMonth()] + ' ' + date.getFullYear() + 'г.')
            .appendTo($date);

        Ctmol.Clocks.init('i-clocks', "+6")
    }

    function _gDN(date, func) {
        var num = date['get' + func]().toString();
        if (num.length < 2)
            num = '0' + num;
        return num;
    }

    return {
        init : function(wrapId) {
            $wrap = $(wrapId);
            if ($wrap.length) {
                setupDateTime();
            }
        }
    }
}();

/**
 * Класс анимации часов
 */

Ctmol.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);
            }
        }
    }
}();


/* ------------------------------- */

/**
 * Крутилка баннеров в шапке
 */

Ctmol.BannerShow = function(){

    var count = 0,
        timer = null;
        number = 0,
        delay = 5000;

    function get() {
        banners.eq(number).hide();
        if (number == count-1) {
            number = 0;
        } else {
            number++;
        }
        banners.eq(number).fadeIn(500);
    }


    return {
        init: function() {
            banners = $("#bannerContainer .bn");
            if (banners.length>1) {
                count = banners.length;
                timer = window.setInterval(function() {get() },delay);
            }
        }
    }
}();


Ctmol.Map = function() {
    this.regSelect = $("#regSelect");
    this.shopSelect = $("#shopSelect");
    this.mapContainer = $("#mapContainer");
    this.mapLink = $("#mapLink");
    this.ie6 = $.browser.msie && $.browser.version == 6;
    this.init();
}

Ctmol.Map.prototype = {
    init: function() {
        var self = this;
        self.regSelect.change(function() {self.get()});
        self.shopSelect.change(function() {self.go()});
        $("a div.active",self.mapContainer).attr("active","true");
        $("a div.star",self.mapContainer).hover(function() {if ($(this).attr("active") != "true") {$(this).addClass("active")}},
                                                function() {if ($(this).attr("active") != "true") {$(this).removeClass("active")}});
        $("#mapSubmit").hide();
        self.mapLink.click(function() {self.showBig(); return false;});
    },
    get: function() {
        var self = this;
        $("<option value='-1' selected='1'>Загрузка</option>").appendTo(self.shopSelect.empty());
        self.mapContainer.empty().addClass("loader");
        var select = self.regSelect.get(0);
        var region = select.options[select.selectedIndex].value;
        var node = $("#curNode").attr("value");
        $.post("/xData/",{id: region,
                          node: node,
                          object: "map"},function(xml) {self.show(xml)});
    },
    show: function(xml) {
        var self = this;
        var select = xml.getElementsByTagName('select')[0];
        self.shopSelect.empty();
        for(var i=0;i<select.childNodes.length;i++){
            if(select.childNodes[i].tagName!=undefined){
                switch(select.childNodes[i].tagName){
                    case "option":
                        var option = document.createElement("option");
                        option.value = select.childNodes[i].getAttribute("value");
                        option.innerHTML = Ctmol.textContent(select.childNodes[i]);
                        self.shopSelect.append(option);
                    break;
                    case "optgroup":
                        var optgroup = document.createElement("optGroup");
                        optgroup.label = select.childNodes[i].getAttribute("label");
                        for(var j=0;j<select.childNodes[i].childNodes.length;j++){
                            if(select.childNodes[i].childNodes[j].tagName!=undefined){
                                var option = document.createElement("option");
                                option.value = select.childNodes[i].childNodes[j].getAttribute("value");
                                option.innerHTML = Ctmol.textContent(select.childNodes[i].childNodes[j]);
                                optgroup.appendChild(option);
                            }
                        }
                        self.shopSelect.get(0).appendChild(optgroup);
                    break;
                }
            }
        }
        var map = xml.getElementsByTagName('map')[0];
    },
    go: function() {
        var self = this;
        var select = self.shopSelect.get(0);
        var href = select.options[select.selectedIndex].value;
        document.location = href;
    },
    showBig: function() {
        var self = this;
        $("#main").append("<div id='popupBG' />");
        $("#popupBG").css("opacity","0.8");
        $("<img class='map'>").attr("src",self.mapLink.attr("href")).appendTo($("<div id='popupCont' title='Закрыть'>").click(function() {self.hideBig()}).appendTo("#main")).hide().fadeIn(500);
        var for_mon_height = $("#main").height();
        var for_mon_width = $("#main").width();
        var img = $("img.map").get(0);
        img.style.top = Math.floor(((document.documentElement.clientHeight - img.offsetHeight)/2)+$(document).scrollTop())+"px";
        img.style.left = Math.floor((for_mon_width - img.offsetWidth)/2) + "px";
        if (self.ie6) {
          $("#popupBG").css({left: -$(".main").offset().left});
          $("#popupCont").css({left: -$(".main").offset().left});
          $("#regSelect, #shopSelect").hide();
        }
    },
    hideBig: function() {
        var self = this;
        $("#popupBG, #popupCont").fadeOut(500,function() {$(this).remove(); if (self.ie6) {$("#regSelect, #shopSelect").show()}});
    }
};

Ctmol.SlideShow = function(id,page,count,city_id) {
    this.buttonContainer = $("#buttonContainer");
    this.prevButton = $("#prevButton");
    this.nextButton = $("#nextButton");
    this.slideContainer = $("#slideContainer");
    this.id = id;
    this.page = page;
    this.count = count;
    this.city_id = city_id;
    this.ie6 = $.browser.msie && $.browser.version == 6;
    this.init();
}

Ctmol.SlideShow.prototype = {
    init: function() {
        var self = this;
        if (!self.prevButton.get(0)) {
            self.prevButton = $("<a>&larr;</a>").hide().appendTo(self.buttonContainer);
        }
        if (!self.nextButton.get(0)) {
            self.prevButton = $("<a>&rarr;</a>").hide().appendTo(self.buttonContainer);
        }
        self.prevButton.attr("href","javascript:void(0)").click(function() {self.get(-1); return false;});
        self.nextButton.attr("href","javascript:void(0)").click(function() {self.get(1); return false;});
        self.slideContainer.fancybox({ overlayOpacity: Ctmol.overlayOpacity,
                                       overlayColor: Ctmol.overlayColor,
                                       autoScale: false,
                                       titleShow: false})
        self.checkButtons(false);
    },
    checkButtons: function(animate) {
        var self = this;
        if (self.page == 1) {
            self.prevButton.fadeOut(500);
        } else {
            self.prevButton.fadeIn(500);
        }
        if (self.page == self.count) {
            self.nextButton.fadeOut(500);
        } else {
            self.nextButton.fadeIn(500);
        }
    },
    get: function(delta) {
        var self = this;
        self.page += delta;
        $.post("/xData/",{id: self.id, page: self.page, city_id: self.city_id, object: "slide"},function(xml) {self.show(xml)});
    },
    show: function(xml) {
        var self = this;
        var content = xml.getElementsByTagName('content')[0];
        if(content){
            var img = xml.getElementsByTagName('img')[0];
            self.slideContainer.attr("href",img.getAttribute("src")).fadeOut(500,function() {$(this).html("<img src='"+img.getAttribute("src")+"' width='"+img.getAttribute("width")+"' />").fadeIn(500)});
        }
        self.checkButtons(true);
    },
    showBig: function() {

    }
};


/* ------------------------------- */

//------------------------------------------------------------------------------
