function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function makeErrorList(errors) {
    var $ul = $('<ul>');

    for (var field in errors)
        for (var idx in errors[field])
            $('<li>', { text:errors[field][idx] }).appendTo($ul);

    return $ul;
}

function showOverlayMessage(overlay, msg, opts) {
    var html = '';
    if (typeof msg == 'function')
        html = msg();
    else
        html = $('<span>' + msg + '</span>');

    overlay
        .data({ 'can-close':opts.can_close })
        .find('.mask').show().end()
        .find('.overlay-msg-text').empty().append(html).end()
        .find('.overlay-msg').slideDown('fast');
}

function activateCard(card_num) {
    $('#login-block').hide();
    $('#logout-block')
        .find('a.card-num').text(card_num).end()
        .show();
}

$(document).ready(function() {
    $('html').ajaxSend(function(event, xhr, settings) {
        if (!(/^https?:.*/.test(settings.url)))
            xhr.setRequestHeader("X-CSRFToken", readCookie('csrftoken'));
    });

    // кинолента
    var SLIDER_TIMER = window.setTimeout(function() {
        $('#preview-block').animate({ right:'-200', opacity:0 }, 'slow');
        $('#preview-show').show();
    }, 5000);
    $('#preview-show').click(function() {
        $(this).hide();
        $('#preview-block').animate({ right:'5', opacity:1 }, 'fast');
    });
    $('#preview-block').mouseenter(function() {
        if (SLIDER_TIMER) {
            window.clearTimeout(SLIDER_TIMER);
            SLIDER_TIMER = null;
        }
    });
    $('#preview-block').mouseleave(function() {
        SLIDER_TIMER = window.setTimeout(function() {
            $('#preview-block').animate({ right:'-200', opacity:0 }, 'slow', function() {
                $('#preview-show').show();
            });
        }, 5000);
    });

    var card_num = readCookie('card_number');
    if (card_num) activateCard(card_num);

	$('#signin').click(function() {
        $('#signin-block .error-msg').hide();

		if ($(this).hasClass('clicked')) {
			$(this).removeClass('clicked');
			$('#signin-block').hide();
		}
		else {
			$(this).addClass('clicked');
			$('#signin-block').show();
		}

		return false;
	});

	$("#posters").scrollable({
		//mousewheel: true,
		items:'#posters-items'
	}).navigator('#preview-items').data('scrollable');

	$("#preview").scrollable({
		vertical: true,
		mousewheel: true,
		items:'#preview-items',
		next:'.preview-next',
		prev:'.preview-prev'
	});

	$('a', '#top-nav').click(function() {
		var cinema = $('#'+ $(this).attr('rel'));
		if (cinema.is(':visible')) return false;

		$('#top-nav a').removeClass('active');
		$(this).addClass('active');

		if ($('.schedule:visible').size())
			$('.schedule:visible').fadeOut('fast', function() { cinema.fadeIn('fast') });
		else
			cinema.fadeIn('fast');

		return false;
	});

	$(".dates").tabs(".date-items > div", {
		effect: 'fade'
	});

	$('.close-schedule').click(function() {
		$(this)
			.parent('.schedule')
			.fadeOut('fast');

		$('#top-nav a.active').removeClass('active');
		
		return false;
	});

	$("a.price-tooltip").tooltip({
        effect: 'fade',
        fadeOutSpeed: 100,
        predelay: 100,
        relative: true,
        position: "right"
    });

	$('#bottom-banner').flashembed({
		src:"/static/img/top.swf",
		height:'100px',
		width:'700px',
		wmode:'opaque'
	});

    $('.date-item tr.movie-row').hover(
        function() {
            var movie = $(this).attr('rel');

            var $schedule = $(this).closest('.schedule');
            var $info = $schedule.find('.schedule-fd:visible');

            if ($info && $info.hasClass(movie))
                return;

            $info.hide();
            $schedule.find('.' + movie).show();
        },
        function() {}
    );

    $('a.reservation-link').overlay({
        top:'center',
        left:'center',
        mask:{ color:'black', loadSpeed: 200, opacity: 0.7 },
        speed:'fast',
        close:'#reservation-close',
        onBeforeLoad:function(event) {
            var $overlay = event.target.getOverlay();
            var $trigger = event.target.getTrigger();
            var $tr = $trigger.closest('tr');

            // скрываем прошлые сообщения
            $overlay.find('.overlay-msg').hide();
            $overlay.find('.mask').hide();
            $overlay.data({ trigger:$trigger });

            // получаем данные время, дату и название сеанса
            var date = $trigger.closest('div.schedule').find('.dates a.current').text();
            var time = $tr.find('td:eq(0)').text();
            var name = $tr.find('td:eq(1) a').text();
            var movie_details = date + ' ' + time + ' ' + name;
            $overlay.find('p.movie-details').text(movie_details);

            draw_cinema_hall($trigger.data('hall_id'));
        },
        onLoad:function(event) {
            var params = event.target.getTrigger().data();
            var data = {
                cinema_id:params.cinema_id,
                seance_id:params.seance_id,
                hall_id:params.hall_id
            };

            var $overlay = event.target.getOverlay();
            $overlay.data('params', data);

            var card_number = readCookie('card_number');
            if (!card_number) {
                $overlay
                    .data('can-close', true)
                    .find('.mask').show().end()
                    .find('.overlay-msg-close').show().end()
                    .find('.overlay-msg-text').html('<span>Для online бронирования Вам необходимо зарегистрироваться на сайте, <a href="/registration/">подробнее</a></span>').end()
                    .find('.overlay-msg').slideDown('fast');

                return;
            }

            $overlay
                .find('.mask').show().end()
                .find('.overlay-msg-close').hide().end()
                .find('.overlay-msg-text').text('Подождите ...').end()
                .find('.overlay-msg').slideDown('fast');

            $.post('/reservation_init/', data, function(data, status, hxr) {
                // TODO e-not-logged, e-reservation-limit

                if (data.status == 'e-reservation-disabled') {
                    var msg = 'Online бронирование работает с 10 утра до 23 вечера';

                    $overlay
                        .data('can-close', true)
                        .find('.mask').show().end()
                        .find('.overlay-msg-close').show().end()
                        .find('.overlay-msg-text').text(msg).end()
                        .find('.overlay-msg').slideDown('fast');
                }
                else if (data.status == 'e-internal-error') {
                    var msg = 'Извините, произошла ошибка, попробуйте позже';

                    $overlay
                        .data('can-close', true)
                        .find('.mask').show().end()
                        .find('.overlay-msg-close').show().end()
                        .find('.overlay-msg-text').text(msg).end()
                        .find('.overlay-msg').slideDown('fast');
                }
                else if (data.status == 'e-reservation-closed') {
                    var msg = 'На данный сеанс бронирование уже закрыто';

                    $overlay
                        .data('can-close', true)
                        .find('.mask').show().end()
                        .find('.overlay-msg-close').show().end()
                        .find('.overlay-msg-text').text(msg).end()
                        .find('.overlay-msg').slideDown('fast');
                }
                else
                    draw_seats_status(data.seats, function() {
                        $overlay
                            .find('.overlay-msg').slideUp('fast').end()
                            .find('.mask').hide();
                    });
            }, 'json');
        },
        onClose:function(event) {
            clear_reservation();
            $('#reservation ol').empty();
            $('#reserve-button').hide();
        }
    });

    $('#reserve-button input').click(function() {
        var seats = [];
        $('#reservation ol li').each(function() { seats.push($(this).data('seat_id')) });

        var $overlay = $('#reservation-popup');
        var params = $overlay.data('params');
        params.seats = seats;

        $overlay
            .find('.mask').show().end()
            .find('.overlay-msg-close').hide().end()
            .find('.overlay-msg-text').text('Подождите ...').end()
            .find('.overlay-msg').slideDown('fast');

        $.post('/reservation/', params, function(data, status, hxr) {
            // TODO e-not-logged

            $overlay.find('.overlay-msg').slideUp('fast', function() {
                if (data.status == 'e-reservation-disabled') {
                    var msg = 'Online бронирование работает с 10:00 до 23:00';

                    $overlay
                        .data('can-close', true)
                        .find('.overlay-msg-close').show().end()
                        .find('.overlay-msg-text').text(msg).end()
                        .find('.overlay-msg').slideDown('fast');
                }
                else if (data.status == 'e-internal-error') {
                    var msg = 'Извините, произошла ошибка, попробуйте позже';

                    $overlay
                        .data('can-close', true)
                        .find('.overlay-msg-close').show().end()
                        .find('.overlay-msg-text').text(msg).end()
                        .find('.overlay-msg').slideDown('fast');
                }
                else if (data.status == 'e-reservation-limit') {
                    var msg = 'Вы можете забронировать не более 6 мест в сутки';

                    $overlay
                        .data('can-close', true)
                        .find('.overlay-msg-close').show().end()
                        .find('.overlay-msg-text').text(msg).end()
                        .find('.overlay-msg').slideDown('fast');
                }
                else if (data.status == 'e-reservation-fail') {
                    // TODO перерисовать статус мест
                    var msg = 'Невозможно забронировать выбранные места, попробуйте другие';

                    if (data.code == 121)
                        msg = 'На данный сеанс бронирование уже закрыто';

                    $overlay
                        .data('can-close', false)
                        .find('.overlay-msg-close').show().end()
                        .find('.overlay-msg-text').text(msg).end()
                        .find('.overlay-msg').slideDown('fast');
                }
                else {
                    var msg = '<span>Номер Вашей брони <strong style="color:#f88d1c;font-size:110%">' + data.result.reservation_number + '</strong>, пожалуйста, запомните его, он потребуется Вам в кассе</span><br />Ждем Вас в нашем кинотеатре';

                    $overlay
                        .data('can-close', true)
                        .find('.overlay-msg-close').show().end()
                        .find('.overlay-msg-text').html(msg).end()
                        .find('.overlay-msg').slideDown('fast');
                }
            });
        }, 'json');
    });

    $('#signin-block').submit(function() {
        $('#signin-block .error-msg').hide();

        $.post('/login/', $(this).serialize(), function(data, status, hxr) {
            if (data.status == 'ok') {
                $('#signin').removeClass('clicked');
                $('#signin-block').hide();
                activateCard(data.card_number);
            }
            else if (data.status == 'e-bad-data') {
                $('#signin-block .error-msg')
                    .text('Неправильный номер карты или пинкод')
                    .show();
            }
            else if (data.status == 'e-internal-error') {
                $('#signin-block .error-msg')
                    .text('Не удалось получить ответ от сервера бронирования. Попробуйте, пожалуйста, позже.')
                    .show();
            }
        }, 'json');

        return false;
    });

    $('#logout-block a.logout').click(function() {
        $.post('/logout/', { dummy:'dummy' }, function(data) {
            $('#login-block').show();
            $('#logout-block').hide();
        }, 'json');

        return false;
    });

    $('#feedback-link').overlay({
        top:'center',
        left:'center',
        mask:{
            color:'black',
            loadSpeed: 200,
            opacity: 0.7
        },
        speed:'fast',
        close:'#feedback-close',
        onBeforeLoad: function(event) {
            var $overlay = event.target.getOverlay();

            $overlay.find('.overlay-msg').hide();
            $overlay.find('.mask').hide();
            $overlay.data({ trigger:'#feedback-link' });
        }
    });

    $('#feedback-popup form').submit(function() {
        $.post('/feedback/', $(this).serialize(), function(data, status, hxr) {
            var $overlay = $('#feedback-popup');

            if (data.status == 'ok')
                showOverlayMessage($overlay, 'Ваше сообщение было получено, спасибо за Ваш отзыв',
                    { can_close:true });

            else if (data.status == 'e-too-frequently')
                showOverlayMessage($overlay, 'Не более одного сообщения в 10 минут',
                    { can_close:true });

            else
                showOverlayMessage($overlay, 
                    function() { return makeErrorList(data.errors) }, { can_close:false });
        }, 'json');

        return false;
    });

    $('#subscribe-link').overlay({
        top:'center',
        left:'center',
        mask:{
            color:'black',
            loadSpeed: 200,
            opacity: 0.7
        },
        speed:'fast',
        close:'#subscribe-close',
        onBeforeLoad: function(event) {
            event.target.getOverlay()
                .data({ trigger:'#subscribe-link' })
                .find('.overlay-msg').hide().end()
                .find('.mask').hide();
        }
    });

    $('#subscribe-popup form').submit(function() {
        $.post('/subscribe/', $(this).serialize(), function(data, status, hxr) {
            var $overlay = $('#subscribe-popup');

            if (data.status == 'ok')
                showOverlayMessage($overlay, 'Вы успешно подписались на нашу рассылку',
                    { can_close:true });

            else if (data.status == 'e-email-exists')
                showOverlayMessage($overlay, 'Вы уже подписаны на рассылку',
                    { can_close:true });

            else
                showOverlayMessage($overlay,
                    function() { return makeErrorList(data.errors) }, { can_close:false });
        }, 'json');

        return false;
    });

    $('#logout-block a.card-num').live('click', function() {
        $('#card-popup')
            .data('overlay')
            .load();

        return false;
    });

    $('#card-popup').overlay({
        top:'center',
        left:'center',
        mask:{
            color:'black',
            loadSpeed: 200,
            opacity: 0.7
        },
        speed:'fast',
        close:'#card-close',
        load:false,
        onBeforeLoad: function(event) {
            event.target.getOverlay()
                .find('div.reservations').empty().end()
                .find('.overlay-msg').hide().end()
                .find('.mask').hide();

                $('#card-sum').empty();
                $('#card-discount').empty();
        },
        onLoad: function() {
            var $overlay = $('#card-popup');

            $overlay
                .find('.mask').show().end()
                .find('.overlay-msg-close').hide().end()
                .find('.overlay-msg-text').text('Подождите ...').end()
                .find('.overlay-msg').slideDown('fast');

            $.post('/card_info/', { dummy:'dummy' }, function(data, status, hxr) {
                if (data.status == 'ok') {
                    if (data.reservations.length) {
                        var $ol = $('<ol class="reservations-list">');

                        for (var idx in data.reservations) {
                            var r = data.reservations[idx];
                            var $a = $('<a>', { href:'#', text:'отменить' });
                            $a.data('number', r.num);

                            $('<li>', { text:r.text })
                                .append('<br>')
                                .append($a)
                                .appendTo($ol);
                        }

                        $('#card-popup div.reservations')
                            .text('Активные брони:')
                            .append($ol);

                        $('a', $ol).click(function() {
                            if (!window.confirm('Вы уверены?')) return false;

                            var $a = $(this);

                            $.post('/reservation_cancel/', { number:$a.data('number') }, function(data, status, hxr) {
                                if (data.status == 'ok') $a.closest('li').remove();
                            });

                            return false;
                        });
                    }
                    else
                        $('#card-popup div.reservations').text('Активных броней нет');

                    $('#card-sum').text(data.sum + ' сом');
                    $('#card-discount').text(data.discount + '%');

                    $overlay
                        .find('.overlay-msg').slideUp('fast').end()
                        .find('.mask').hide();
                }
                else if (data.status == 'e-ticketsoft-error')
                    showOverlayMessage($overlay, 'Не удалось получить информацию по Вашей карте',
                        { can_close:true });

                else if (data.status == 'e-no-session')
                    showOverlayMessage($overlay, 'Произошла ошибка, попробуйте позже',
                        { can_close:true });
            });
        }
    });

    $('.overlay-msg-close').click(function() {
        var $overlay = $(this).closest('.overlay');
        var trigger = $overlay.data('trigger');

        $overlay.find('.overlay-msg').slideUp('fast', function() {
            $overlay.find('.mask').hide();

            if ($overlay.data('can-close'))
                $(trigger).data('overlay').close();
        });

        return false;
    });

    if ($('#film-trailer').length)
        flowplayer('film-trailer',
            { src:'/static/flowplayer-3.2.5.swf', wmode:'opaque' },
            { clip:{ autoPlay:false }}
        );
});

