/**
 * aka void main()
 */
$(function() {
    // Настроим поведение Ajax-запросов
    Stroika.initAjax();
    Stroika.Today();
    Stroika.MainMenu.init();
    if (Stroika.interfaceName === 'person_cat'){
        Stroika.Contacts();
    }
    if (Stroika.interfaceName === 'calculator'){
        Stroika.Calc.init();
    }
    if (Stroika.interfaceName === 'home_page'){
        Stroika.Columns.init();
    }

});


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

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

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

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

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

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

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

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

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

/**
 * Настройки для Ajax запросов
 */
Stroika.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);
        });
}

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

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

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

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

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

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

/**
 *  Показ текущей даты и дня недели в шапке сайта
 */
Stroika.Today = function(){
    var today = $("#today");
    var weekdays = ["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"];
    var months = ["Января","Февраля","Марта","Апреля","Мая","Июня","Июля","Августа","Сентября","Октября","Ноября","Декабря"];
    var date = new Date();
    today.append("<p>Сегодня:</p><p class='tdt'><strong>"+date.getDate()+"</strong> "+months[date.getMonth()]+" <strong>"+date.getFullYear()+"</strong></p>");
    today.append("<p>"+weekdays[date.getDay()]+"</p>");
}

/**
 *  Растяжка двух колонок на главной до одной высоты
 */
Stroika.Columns = function(){
    var $cols = null;

    setCols = function(){
        var height = 0;
        var columns = $cols.find(".col .rc .bd .text");
        columns.each(function(){
            if(this.offsetHeight>height)
                height = this.offsetHeight+20;
        });
        columns.each(function(){
            if ((Browser.isIE6)||(Browser.isIE7)){
                $(this).parent().css("height",height+"px");
                $(this).parent().parent().find(".lb, .rb").css("bottom","0px");
            }else{
                $(this).parent().css("min-height",height+"px");
            }
        })
    }

    return{
        init: function(){
            $cols = $(".cols");
            if($cols.length>0){
                $(window).resize(function(){
                    setCols();
                });
                setCols();
            }
        }
    }
}()

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

    var $body = null;
    var hideDelay = 50;

    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 mpp")
                            .appendTo($body);
            wrp = $(document.createElement("div"))
                            .addClass("opc-wrp")
                            .html(hd.html())
                            .appendTo(bubble);
            $(document.createElement("div"))
                            .addClass("dc dtl")
                            .appendTo(wrp);
            $(document.createElement("div"))
                            .addClass("dc dtr")
                            .appendTo(wrp);
            $(document.createElement("div"))
                            .addClass("dc dbl")
                            .appendTo(bubble);
            $(document.createElement("div"))
                            .addClass("dc dbr")
                            .appendTo(bubble);


           $([ link, bubble.get(0)]).mouseover(function () {
                  if (hideDelayTimer) clearTimeout(hideDelayTimer);
                  if (beingShown || shown) {
                        return false;
                  } else {
                        beingShown = false;
                        shown = true;
                        var position = $(link).offset();
                        position.top+=link.offsetHeight;
                        bubble.css({top: Math.round(position.top+10)+'px',
                                    left: Math.round(position.left)+'px',
                                    width: link.offsetWidth+'px',
                                    display: "block"});
                        //bubble.slideDown(100);
                  }
                  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);
            $("#header .menu .sbm .ma").each(function(){
                createOuterCont(this);
            })
        }
    }
}();

/**
 *  Страница контактов. Показ фотографий сотрудников
 */

Stroika.Contacts = function(){
    var hideDelay = 100;
    var $body = $(document.body);
	var lastShown = null;

    $(".person-cat .with-cols .person").each(function(){


        var trigger = this;
        var picture = $(trigger).find(".p-foto");
        if(picture.length>0){
            var height = picture.height();
            var bubble = $(document.createElement("div"))
                            .addClass("popup fpp")
                            .appendTo($body);

            picture.appendTo(bubble);
			bubble.hideDelayTimer = null;
			bubble.beingShown = false;
			bubble.shown = false;
            //picture.css("position","absolute");
            $([ trigger, bubble.get(0) ]).hover(function () {
                  if (bubble.hideDelayTimer) clearTimeout(bubble.hideDelayTimer);
                  if (bubble.beingShown || bubble.shown) {
                        return false;
                  } else {
						if(lastShown){
							lastShown.hideDelayTimer = null;
							lastShown.css('display', 'none');
							lastShown.shown = false;
							lastShown = null;
						}
                        var position = $(trigger).offset();
                        bubble.css({
                                     top: Math.round(position.top - height - 5 )+'px',
                                     left: Math.round(position.left + 25)+'px'});
						lastShown = bubble;
                        bubble.show();
                  }
                  return false;
            },function () {
                  if (bubble.hideDelayTimer) clearTimeout(bubble.hideDelayTimer);
                  bubble.hideDelayTimer = setTimeout(function () {
                        bubble.hideDelayTimer = null;
                        bubble.css('display', 'none');
                        bubble.shown = false;
						lastShown = null;
                  },hideDelay);
                  return false;
            });
        }

        });
}

/**
 *  Калкулятор стоимости размещения рекламы
 */
Stroika.Calc = function(){

	var $calc = null;     // Контейнер калькулятора
	var $page = null;     // Контейнер макета страницы газеты
	var $controls = null; // Контейнер для управления расчетом
        var $summary = null;  // Контейнер для показа итоговой информации по стоимости рекламы
        var $summ = null;     // Контейнер для показа стоимости размещения рекламы
        var $count = null;    // Поля для ввода количества строк в строчной рекламе
        var $inp = null;      // Кнопка расчета стоимости строчной рекламы
        var $form = null;     // Форма для отправки предварительного заказа
        var $send = null;     // Отправки предварительной заявки
        var $after = null;    // Контейнер для сообщения
        var $sending = null;  // Контейнер для сообщения о том, что идет загрузка

        var loading = false;
	var templates = new Array();
        var lastTemplate = null;
        var lastHandle = null;
	var lastExpanded = {};
        var DB = new Array();


	// Сбор всех шаблонов модулей на одной странице
	getAllTemplates = function(){
		$page.find("div").each(function(){
			templates.push({ type: this.className.split('_')[1],
					 dom: this });
			//$(this).hide();
		})
	}

	// Инициализация меню выбора варианта шаблона
	initMenu = function(json){
            DB = json;
            $controls.html("");
            var mod_places = $(document.createElement("ul"))
                                .addClass("mod_places")
                                .appendTo($controls);
            for(var i=0;i<json.length;i++){
                var mod_pl = $(document.createElement("li"))
                                .addClass("mod_place")
                                .appendTo(mod_places);
                var mod_pl_tr = document.createElement("span");
                $(mod_pl_tr)
                    .addClass("trig")
                    .html(DB[i].object_name)
                    .appendTo(mod_pl);
                mod_pl_tr.db_obj = DB[i];
                DB[i].dom = mod_pl_tr;
                $(mod_pl_tr).click(function(){ expand(this); });
                switch(DB[i].type){
                    case "mod_place":
                        if(DB[i].cats.length>0){
                            var mc_div = $(document.createElement("div"))
                                            .addClass("mod_cats")
                                            .appendTo(mod_pl);
                            var mod_cats = $(document.createElement("ul"))
                                        .addClass("mc_u")
                                        .appendTo(mc_div);
                            for(var j=0;j<DB[i].cats.length;j++){
                                var cat_pl = $(document.createElement("li"))
                                                .addClass("mod_cat")
                                                .appendTo(mod_cats);
                                var cat_pl_tr = document.createElement("span");
                                $(cat_pl_tr)
                                    .addClass("trig")
                                    .html(DB[i].cats[j].object_name)
                                    .appendTo(cat_pl);
                                cat_pl_tr.db_obj = DB[i].cats[j];
                                DB[i].cats[j].dom = cat_pl_tr;
                                $(cat_pl_tr).click(function(){ expand(this); });
                                if(DB[i].cats[j].mods.length>0){
                                    var m_div = $(document.createElement("div"))
                                                    .addClass("mods")
                                                    .appendTo(cat_pl);
                                    var mods = $(document.createElement("ul"))
                                                    .addClass("md_u")
                                                    .appendTo(m_div);
                                    for(var k=0;k<DB[i].cats[j].mods.length;k++){
                                        var module = $(document.createElement("li"))
                                                    .addClass("mod")
                                                    .appendTo(mods);
                                        var module_tr = document.createElement("span");
                                        $(module_tr)
                                            .addClass("sel")
                                            .html(DB[i].cats[j].mods[k].object_name)
                                            .appendTo(module);
                                        module_tr.db_obj = DB[i].cats[j].mods[k];
                                        DB[i].cats[j].mods[k].dom = module_tr;
                                        $(module_tr).click(function(){ showModule(this.db_obj); });
                                    }
                                }
                            }
                        }
                    break;
                    case "string_place":
                        if(DB[i].mods.length>0){
                            var mods_div = $(document.createElement("div"))
                                            .addClass("mods ov")
                                            .appendTo(mod_pl);
                            var prices = $(document.createElement("div"))
                                            .addClass('prc')
                                            .appendTo(mods_div);
                            $(document.createElement("h3"))
                                        .html('Цены')
                                        .appendTo(prices);
                            for(var k=0;k<DB[i].mods.length;k++){
                                var module = $(document.createElement("div"))
                                            .html("<em class='l'>"+DB[i].mods[k].object_name+"</em><em class='prc-p'>"+parseFloat(DB[i].mods[k].price).toPrice()+"</em>")
                                            .addClass("p-pos")
                                            .appendTo(prices);
                            }

                            var div = $(document.createElement("div"))
                                            .addClass("ov")
                                            .appendTo(mods_div);
                            var mods = $(document.createElement("ul"))
                                            .addClass("md_u")
                                            .appendTo(div);

                            var c_div = $(document.createElement("div"))
                                            .addClass("pr-s-count")
                                            .appendTo(div);
                            $(document.createElement("p"))
                                            .html("Введите количество строк")
                                            .appendTo(c_div);
                            $count = $(document.createElement("input"))
                                            .attr({"type":"text"})
                                            .val(0)
                                            .appendTo(c_div);

                            $count.keypress(function(e){ return checkIntInput(e); });

                            $inp = $(document.createElement("input"))
                                                .attr({"type":"button",
                                                       "disabled":"disabled"})
                                                .val("Рассчитать")
                                                .addClass("btn disabled")
                                                .appendTo(c_div);
                            $inp.click( getSumm );
                            var module = $(document.createElement("li"))
                                            .addClass("mod")
                                            .appendTo(mods);

                            var module_tr = document.createElement("span");
                            $(module_tr)
                                .addClass("sel")
                                .html("Простая строка")
                                .appendTo(module);
                            DB[i].types = {};
                            DB[i].types['simple'] = {type: 'simple',
                                                     dom: module_tr,
                                                     par: DB[i] };
                            module_tr.db_obj = DB[i].types.simple;
                            $(module_tr).click(function(){ showModule(this.db_obj,true); });

                            module_tr = document.createElement("span");
                            $(module_tr)
                                .addClass("sel")
                                .html("Выделенная строка")
                                .appendTo(module);
                            DB[i].types['selected'] = {type: 'selected',
                                                       dom: module_tr,
                                                       par: DB[i] };
                            module_tr.db_obj = DB[i].types.selected;
                            DB[i].dom = module_tr;
                            $(module_tr).click(function(){ showModule(this.db_obj,true); });

                        }
                    break;
                }
            }
            initSummary();
        }

        //  Инициализация блока с окончательным расчетом стоимости
        initSummary = function(){
            $summary = $(document.createElement("div"))
                        .addClass("mc-summary")
                        .appendTo($controls);
            $(document.createElement("div"))
                        .addClass("mc-presum text")
                        .html("Стоимость данного рекламного блока:")
                        .appendTo($summary);
            $summ = $(document.createElement("div"))
                        .addClass("mc-summ")
                        .html("0 руб.")
                        .appendTo($summary);

        }

        // Раскрытие пункта меню
	expand = function(dom,manual){

                var parent = dom.parentNode;
		var exp_flag = false;
		if(!parent.cnt){
			parent.cnt = $(parent).find('div:first');
			parent.cnt_shown = false;
			parent.tp = parent.className.split('_')[1];
		}
		if((lastExpanded[parent.tp])&&(lastExpanded[parent.tp]!=dom)){
			var type = parent.tp;
			switch(type){
				case 'place':
					if(lastExpanded['place']){
						expand(lastExpanded['place'],true);
						lastExpanded['place'] = null;
					}
                                        type = 'cat';
				case 'cat':
					if(lastExpanded['cat']){
                                            expand(lastExpanded['cat'],true);
                                            lastExpanded['cat'] = null;
					}
                                        type = 'mod';
				break;
			}
		}

		if(parent.cnt_shown){
			parent.cnt.slideUp(100);
			parent.cnt_shown = false;
			lastExpanded[parent.tp] = null;
                        if(lastExpanded['cat']){
                            expand(lastExpanded['cat'],true);
                            lastExpanded['cat'] = null;
                        }
                        if(lastTemplate){
                            $(lastTemplate.dom).removeClass("mp-mod-cur");
                            lastTemplate = null;

                        }
                        if(lastHandle){
                            $(lastHandle.dom).removeClass("cur");
                            if((lastHandle)&&(lastHandle.tp)){
                                $inp.attr("disabled","disabled").addClass("disabled");
                            }
                            lastHandle = null;
                            getSumm();
                        }
                        $(dom).removeClass("exp");
		}else{
                    if(!manual){
                            parent.cnt.slideDown(300);
                            parent.cnt_shown = true;
                            lastExpanded[parent.tp] = dom;
                    }
                    $(dom).addClass("exp");
		}
	}

        // показ выбранного модуля в сетке журнала
        showModule = function(mod_handler,is_string){
            if(lastTemplate){
                $(lastTemplate.dom).removeClass("mp-mod-cur");
                lastTemplate = null;
            }
            if(lastHandle)
                $(lastHandle.dom).removeClass("cur");

            if((lastHandle)&&(lastHandle.type)){
                $inp.attr("disabled","disabled").addClass("disabled");
            }

            if(!(is_string)){
                var template = null;
                var i = 0;
                while(template == null){
                    if(templates[i].type == mod_handler.size)
                        template = templates[i];
                    i++;
                }
                if(template){
                    $(mod_handler.dom).addClass("cur");
                    $(template.dom).addClass("mp-mod-cur");
                }
                lastTemplate = template;
            }else{
                var template = null;
                var i = 0;
                while(template == null){
                    if(templates[i].type == 'string')
                        template = templates[i];
                    i++;
                }
                if(template){
                    $(template.dom).addClass("mp-mod-cur");
                }
                lastTemplate = template;
                $(mod_handler.dom).addClass("cur");
                $inp.removeAttr("disabled").removeClass("disabled");
            }
            lastHandle = mod_handler;
            getSumm();
        }

        // расчет суммы размещения рекламы
        getSumm = function(){
            var summ = 0;
            var count = 0;
            if(lastHandle){
                if(!lastHandle.type){
                    summ = parseFloat(lastHandle.price);
                }else{
                    var stop = false;
                    var i = 0;
                    count = parseInt($count.val());
                    if(lastHandle.type=='simple'){
                        while(!stop){
                            if((lastHandle.par.mods[i].tp=='simple')){
                                if(lastHandle.par.mods[i].min<=count){
                                    if(lastHandle.par.mods[i].max!='n'){
                                        if(lastHandle.par.mods[i].max>=count){
                                            summ = parseFloat(lastHandle.par.mods[i].price)*count;
                                            stop = true;
                                        }
                                    }else{
                                        summ = parseFloat(lastHandle.par.mods[i].price)*count;
                                        stop = true;
                                    }
                                }
                            }
                            i++;
                            if(i==lastHandle.par.mods.length){
                                stop = true;
                            }
                        }
                    }else{
                        while(!stop){
                            if((lastHandle.par.mods[i].tp=='selected')){
                                stop = true;
                                summ = parseFloat(lastHandle.par.mods[i].price)*count;
                            }
                            i++;
                            if(i==lastHandle.par.mods.length){
                                stop = true;
                            }
                        }
                    }
                }
            }
            if(summ>0){
                $send.removeAttr("disabled").removeClass("disabled");
            }else{
                $send.attr("disabled","disabled").addClass("disabled");
            }
            $summ.html(summ.toPrice());
        }

        prepareForm = function(){
            if(!loading){
                var error = false;
                var params = {};
                $form.find(".error").removeClass("error");
                $form.find(".p input, .p textarea, .p select").each(function(){
                    params[this.name] = this.value;
                    if(($(this.parentNode).hasClass('need-field'))){
                        if(((this.tagName == 'INPUT')||(this.tagName == 'TEXTAREA'))&&(this.value=='')){
                            $(this.parentNode).addClass("error");
                            error = true;
                        }else{
                            if((this.tagName == 'SELECT')&&((this.value==0)||(this.value==-1))){
                                $(this.parentNode).addClass("error");
                                error = true;
                            }
                        }
                    }
                });
                $form.find("input[type='hidden']").each(function(){
                    params[this.name] = this.value;
                });
                if((!error)&&(lastHandle)){
                    if(!lastHandle.type){
                        params["advert_module_id"] = lastHandle.object_id;
                    }else{
                        params["advert_module_id"] = lastHandle.par.object_id;
                        params["advert_module_count"] = parseInt($count.val());
                        if(lastHandle.type=='selected')
                            params["selected"] = 1;
                    }
                    params['_do'] = 'add_calc_order';
                    loading = true;
                    $sending.show();
                    Stroika.getJSON(params,function(json){ orderAnswer(json); });
                }
            }
        }

        orderAnswer = function(data){
            loading = false;
            $sending.hide();
            switch(data.status){
                case "error":
                    Stroika.Overlay.show();
                    if(!$after){
                        $after = $(document.createElement("div"))
                                    .addClass("popup text message")
                                    .appendTo($(document.body));
                    }
                    $after.html('Ошибка при отправке заказа. Проверьте правильность заполнения и попробуйте еще раз.');
                    $after.show();
                    var top = parseInt(((document.body.offsetHeight + $(document).scrollTop()) - $after.height())/2);
                    if(top<0) top = 0;
                    $after.css({ top: top,
                                 left: parseInt((document.body.offsetWidth - $after.width())/2) });
                    Stroika.Overlay.onclick(function(){ $after.hide(); Stroika.Overlay.hide(); });
                break;
                case "ok":
                    if(lastExpanded['place']){
                        expand(lastExpanded['place'],true);
			lastExpanded['place'] = null;
                    }
                    Stroika.Overlay.show();
                    if(!$after){
                        $after = $(document.createElement("div"))
                                    .addClass("popup text message")
                                    .appendTo($(document.body));
                    }
                    $after.html(data.message);
                    $after.show();
                    var top = parseInt(((document.body.offsetHeight + $(document).scrollTop()) - $after.height())/2);
                    if(top<0) top = 0;
                    $after.css({ top: top,
                                 left: parseInt((document.body.offsetWidth - $after.width())/2) });
                    Stroika.Overlay.onclick(function(){ $after.hide(); Stroika.Overlay.hide(); });
                break;
            }
        }

	return {
		init: function(){
			$calc = $('#calculator');
			$page = $calc.find('.mag-page');
                        //$controls_dom = $calc.find('.mag-controls');
			$controls = $calc.find('.mag-controls-core');
                        $controls.html("<span class='mcc-loading'>Идет загрузка...</span>")
                        $form = $calc.find("form");
                        if($form.length>0){
                            $send = $form.find(".submit input.btn");
                            $send.attr("disabled","disabled").addClass("disabled");
                            $send.click(function(){ prepareForm(); return false; });
                            $sending = $(document.createElement("div"))
                                            .addClass("mcc-loading")
                                            .html("Идет загрузка...")
                                            .hide()
                                            .insertAfter($form.parent());
                        }
			getAllTemplates();
                        Stroika.getJSON({_do: "get_calc_menu"},function(json){ initMenu(json); });
		}
	}
}();

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