var p4 = p4 || {};

p4.releasable = false;

var bodySize = {
    x: 0,
    y: 0
};

$(document).ready(function () {

    bodySize.y = $('#mainContainer').height();
    bodySize.x = $('#mainContainer').width();

    $(this).data('slideshow', false);
    $(this).data('slideshow_ctime', false);

    $('#mainMenu, .unselectable').disableSelection();

    display_basket();

    $(window).bind('mousedown',function () {
        $(this).focus();
    }).trigger('mousedown');

    $('.basket_wrapper').hover(
        function () {
            $(this).addClass('hover');
        },
        function () {
            $(this).removeClass('hover');
        }
    ).bind('click', function () {
            var id = $('input[name=ssel_id]', this).val();
            document.location = '/lightbox/validate/' + id + '/';
            return;
        });
    $('.basket_downloader').bind('click', function () {
        download_basket();
    });
    if ($('.right_column_wrapper_user').length > 0) {
        $('.right_column_title, #right_column_validation_toggle').bind('click',function () {
            if (!$('.right_column_wrapper_caption').is(':visible')) {
                $('.right_column_wrapper_user').height($('.right_column_wrapper_user').height()).css('top', 'auto').animate({
                    'height': 0
                });
                $('.right_column_wrapper_caption').slideDown();
                $('#right_column_validation_toggle').show();
            }
            else {
                $('.right_column_wrapper_user').height('auto').animate({
                    'top': $('.right_column_title').height()
                });
                $('.right_column_wrapper_caption').slideUp();
                $('#right_column_validation_toggle').hide();
            }
            var title = $('.right_column_title');
            title.hasClass('expanded') ? title.removeClass('expanded') : title.addClass('expanded');
        }).addClass('clickable');
    }
    var sselcont = $('#sc_container .basket_element:first');
    if (sselcont.length > 0) {
        display_basket_element(false, sselcont.attr('id').split('_').pop());
    }


    set_sizeable($('#record_main .lightbox_container, #record_compare .lightbox_container'));

    $('#navigation')
        .bind('change',
        function () {
            window.location.replace(window.location.protocol + "//" + window.location.host + '/lightbox/validate/' + $(this).val() + '/');
        }
    );

    $('#left_scroller')
        .bind('click',
        function () {
            scroll_elements(false);
        }
    );

    $('#right_scroller')
        .bind('click', function () {
            scroll_elements(true);
        }
    );

    $(window)
        .bind('resize', function () {
            resize();
        }
    );
    bind_keyboard();
});

$(window).bind('beforeunload', function () {
    if (p4.releasable !== false) {
        if (confirm(p4.releasable)) {
            $('#basket_options .confirm_report').trigger('click');
        }
    }
});

function bind_keyboard() {
    $(document).bind('keydown', function (event) {

        var stop = false;
        $('.notes_wrapper').each(function (i, n) {
            if (parseInt($(n).css('top')) >= 0)
                stop = true;
        });

        if (stop)
            return true;

        var cancelKey = false;
        var el, id;
        switch (event.keyCode) {
            case 39:
                get_next();
                cancelKey = true;
                break;
            case 37:
                get_prev();
                cancelKey = true;
                break;
            case 32:
                var bool = !$(document).data('slideshow');
                slideshow(bool);
                break;
            case 38:
                el = $('#sc_container .basket_element.selected');
                if (el.length === 1) {
                    id = el.attr('id').split('_').pop();
                    set_agreement(event, el, id, 1);
                }
                break;
            case 40:
                el = $('#sc_container .basket_element.selected');
                if (el.length === 1) {
                    id = el.attr('id').split('_').pop();
                    set_agreement(event, el, id, -1);
                }
                break;
            default:
                break;
        }

        if (cancelKey) {
            event.cancelBubble = true;
            if (event.stopPropagation)
                event.stopPropagation();
            return(false);
        }
        return true;
    });
}

function is_ctrl_key(event) {
    if (event.altKey)
        return true;
    if (event.ctrlKey)
        return true;
    if (event.metaKey)	// apple key opera
        return true;
    if (event.keyCode == '17')	// apple key opera
        return true;
    if (event.keyCode == '224')	// apple key mozilla
        return true;
    if (event.keyCode == '91')	// apple key safari
        return true;

    return false;
}

function is_shift_key(event) {
    if (event.shiftKey)
        return true;
    return false;
}

function resize() {
    bodySize.y = $('#mainContainer').height();
    bodySize.x = $('#mainContainer').width();
    display_record($('#record_compare').css('visibility') != 'hidden');
}

function set_release(el) {
    $('.loader', el).css({
        visibility: 'visible'
    });
    $.ajax({
        type: "POST",
        url: "/lightbox/ajax/SET_RELEASE/" + $('#navigation').val() + "/",
        dataType: 'json',
        error: function (data) {
            $('.loader', el).css({
                visibility: 'hidden'
            });
        },
        timeout: function (data) {
            $('.loader', el).css({
                visibility: 'hidden'
            });
        },
        success: function (data) {
            $('.loader', el).css({
                visibility: 'hidden'
            });
            if (data.datas) {
                alert(data.datas);
            }
            if (!data.error) {
                p4.releasable = false;
            }

            return;
        }
    });
}

function load_report() {
    $.ajax({
        type: "GET",
        url: "/lightbox/ajax/LOAD_REPORT/" + $('#navigation').val() + "/",
        dataType: 'html',
        success: function (data) {
            $('#report').empty().append(data);
            $('#report .reportTips').tooltip({
                delay: false
            });
            $('#report').dialog({
                width: 600,
                modal: true,
                resizable: false,
                height: Math.round($(window).height() * 0.8)
            });

            return;
        }
    });
}

function display_basket() {
    var sc_wrapper = $('#sc_wrapper');
    var basket_options = $('#basket_options');

    $('.report').live('click',function () {
        load_report();
        return false;
    }).addClass('clickable');
    //	$('#basket_infos .report').button({
    //					icons: {
    //						primary: 'ui-icon-document'
    //    				}
    //				}).bind('click',function(){
    //					$(this).blur();
    //				});
    $('.confirm_report', basket_options).button()
        .bind('click', function () {
            set_release($(this));
        });

    $('.basket_element', sc_wrapper).parent()
        .bind('click', function (event) {
            scid_click(event, this);
            return false;
        });

    $('.agree_button, .disagree_button', sc_wrapper).bind('click',function (event) {

        var sselcont_id = $(this).closest('.basket_element').attr('id').split('_').pop();

        var agreement = $(this).hasClass('agree_button') ? '1' : '-1';

        set_agreement(event, $(this), sselcont_id, agreement);
        return false;
    }).addClass('clickable');

    n = $('.basket_element', sc_wrapper).length;
    $('#sc_container').width(n * $('.basket_element_wrapper:first', sc_wrapper).outerWidth() + 1);

    $('.previewTips').tooltip();
}


function scid_click(event, el) {
    var compare = is_ctrl_key(event);

    if (compare) {
        if ($('.basket_element', el).hasClass('selected'))
            return;
    }
    else {
        $('#sc_container .basket_element.selected').removeClass('selected');
        $('.basket_element', el).addClass('selected');
    }

    var sselcont_id = $('.basket_element', el).attr('id').split('_').pop();
    var ssel_id = $('#navigation').val();

    var container = $('#sc_container');

    var request = container.data('request');
    if (request && typeof(request.abort) == 'function') {
        request.abort();
    }

    request = $.ajax({
        type: "GET",
        url: $(el).attr('href'),//"/lightbox/ajax/LOAD_BASKET_ELEMENT/"+sselcont_id+'/',
        dataType: 'json',
        success: function (datas) {
            var container = false;
            var data = datas;

            if (compare) {
                container = $('#record_compare');
            }
            else {
                container = $('#record_main');

                $('#record_infos .lightbox_container')
                    .empty()
                    .append(data.caption);

                $('#basket_infos')
                    .empty()
                    .append(data.agreement_html);
            }

            $('.display_id', container)
                .empty()
                .append(data.number);

            $('.title', container)
                .empty()
                .append(data.title)
                .attr('title', data.title);

            var options_container = $('.options', container);
            options_container
                .empty()
                .append(data.options_html);

            $('.lightbox_container', container).empty()
                .append(data.preview + data.selector_html + data.note_html);


            display_basket_element(compare, sselcont_id);


            return;
        }
    });
    container.data('request', request);
}

function save_note(container, button) {
    var sselcont_id = $(button).attr('id').split('_').pop();
    var note = $('.notes_wrapper textarea', container).val();

    $.ajax({
        type: "POST",
        url: "/lightbox/ajax/SET_NOTE/" + sselcont_id + "/",
        dataType: 'json',
        data: {
            note: note
        },
        success: function (datas) {
            hide_notes(container);
            $('.notes_wrapper', container).remove();
            $('.lightbox_container', container).append(datas.datas);
            activate_notes(container);
            return;
        }
    });

}

function display_basket_element(compare, sselcont_id) {
    var container;
    if (compare) {
        container = $('#record_compare');
    }
    else {
        container = $('#record_main');
    }
    $('.record_image', container).removeAttr('ondragstart');
    $('.record_image', container).draggable();

    var options_container = $('.options', container);

    $('.download_button', options_container).bind('click', function () {
        //		$(this).blur();
        download($(this).next('form[name=download_form]').find('input').val());
    });

    $('.comment_button', options_container).bind('click', function () {
            //				$(this).blur();
            if ($('.lightbox_container', container).hasClass('note_editing')) {
                hide_notes(container);
            }
            else {
                show_notes(container);
            }
        }
    );

    activate_notes(container);

    $('.previous_button', options_container).bind('click', function () {
        //		$(this).blur();
        get_prev();
    });

    $('.play_button', options_container).bind('click', function () {
        //		$(this).blur();
        slideshow(true);
    });

    $('.pause_button', options_container).bind('click', function () {
        //		$(this).blur();
        slideshow(false);
    });

    if ($(document).data('slideshow')) {
        $('.play_button, .next_button.play, .previous_button.play', options_container).hide();
    }
    else {
        $('.pause_button, .next_button.pause, .previous_button.pause', options_container).hide();
    }

    $('.next_button', options_container).bind('click', function () {
        //		$(this).blur();
        slideshow(false);
        get_next();
    });


    $('.lightbox_container', container).bind('dblclick', function (event) {
        display_record();
    });


    $('#record_wrapper .agree_' + sselcont_id + ', .big_box.agree')
        .bind('click',
        function (event) {
            set_agreement(event, $(this), sselcont_id, '1');
        }
    )
        .addClass('clickable');

    $('#record_wrapper .disagree_' + sselcont_id + ', .big_box.disagree')
        .bind('click',
        function (event) {
            set_agreement(event, $(this), sselcont_id, '-1');
        }
    )
        .addClass('clickable');

    if (compare == $('#record_wrapper').hasClass('single')) {
        if (compare) {
            //      $('.agreement_selector').show();
            //			$('#record_wrapper').stop().animate({right:0},100,function(){display_record(compare);});
            $('#record_wrapper').css({
                right: 0
            });
            display_record(compare);
            $('#right_column').hide();
        }
        else {
            //      $('.agreement_selector').hide();
            $('#record_wrapper').css({
                right: 250
            });
            display_record(compare);
            $('#right_column').show();
            $('#record_compare .lightbox_container').empty();
        }

    }
    else {
        display_record(compare);
    }

}

function show_notes(container) {
    $('.notes_wrapper', container).animate({
        top: 0
    });
    $('.lightbox_container', container).addClass('note_editing');
}

function hide_notes(container) {
    $('.notes_wrapper', container).animate({
        top: '-100%'
    });
    $('.lightbox_container', container).removeClass('note_editing');
}

function activate_notes(container) {
    $('.note_closer', container).button({
        text: true
    }).bind('click', function () {
            $(this).blur();
            hide_notes(container);
            return false;
        }
    );

    $('.note_saver', container).button({
        text: true
    }).bind('click', function () {
            $(this).blur();
            save_note(container, this);
            return false;
        }
    );
}

function is_viewable(el) {
    var sc_wrapper = $('#sc_wrapper');
    var sc_container = $('#sc_container');

    var el_width = $(el).parent().outerWidth();
    var el_position = $(el).parent().position();
    var sc_scroll_left = sc_wrapper.scrollLeft();

    var boundup = sc_wrapper.width(),
        bounddown = 0,
        placeup = el_position.left + el_width - sc_scroll_left,
        placedown = el_position.left - sc_scroll_left;

    if (placeup <= boundup && placedown >= bounddown)
        return true;
    return false;
}

function adjust_visibility(el) {
    if (is_viewable(el))
        return;

    var sc_wrapper = $('#sc_wrapper');
    var el_parent = $(el).parent();

    var sc_left = el_parent.position().left + el_parent.outerWidth() / 2 - sc_wrapper.width() / 2;

    sc_wrapper.stop().animate({
        'scrollLeft': sc_left
    });
}

function get_next() {
    var current_wrapper = $('#sc_container .basket_element.selected').parent().parent();

    if (current_wrapper.length === 0)
        return;

    current_wrapper = current_wrapper.next();
    if (current_wrapper.length === 0)
        current_wrapper = $('#sc_container .basket_element_wrapper:first');

    $('.basket_element', current_wrapper).parent().trigger('click');

    adjust_visibility($('.basket_element', current_wrapper));

    if ($(document).data('slideshow')) {
        var timer = setTimeout('get_next();', 3500);
        $(document).data('slideshow_ctime', timer);
    }
}

function get_prev() {
    var current_wrapper = $('#sc_container .basket_element.selected').parent().parent();

    if (current_wrapper.length === 0)
        return;

    slideshow(false);

    current_wrapper = current_wrapper.prev();
    if (current_wrapper.length === 0)
        current_wrapper = $('#sc_container .basket_element_wrapper:last');

    $('.basket_element', current_wrapper).parent().trigger('click');

    adjust_visibility($('.basket_element', current_wrapper));
}

function slideshow(boolean_value) {
    if (boolean_value == $(document).data('slideshow'))
        return;

    if (!boolean_value && $(document).data('slideshow_ctime')) {
        clearTimeout($(document).data('slideshow_ctime'));
        $(document).data('slideshow_ctime', false);
    }

    $(document).data('slideshow', boolean_value);

    var headers = $('#record_wrapper .header');

    if (boolean_value) {
        $('.play_button, .next_button.play, .previous_button.play', headers).hide();
        $('.pause_button, .next_button.pause, .previous_button.pause', headers).show();
        get_next();
    }
    else {
        $('.pause_button, .next_button.pause, .previous_button.pause', headers).hide();
        $('.play_button, .next_button.play, .previous_button.play', headers).show();
    }
}

function set_sizeable(container) {

    $(container).bind('mousewheel', function (event, delta) {

        if ($(this).hasClass('note_editing'))
            return;

        var record = $('.record_image', this);

        if (record.length === 0)
            return;

        var o_top = parseInt(record.css('top'));
        var o_left = parseInt(record.css('left'));

        var o_width, o_height, width, height;

        if (delta > 0) {
            if (record.width() > 29788 || record.height() >= 29788)
                return;
            o_width = record.width();
            o_height = record.height();
            width = Math.round(o_width * 1.1);
            height = Math.round(o_height * 1.1);
        }
        else {
            if (record.width() < 30 || record.height() < 30)
                return;
            o_width = record.width();
            o_height = record.height();
            width = Math.round(o_width / 1.05);
            height = Math.round(o_height / 1.05);
        }

        var top = Math.round((height / o_height) * (o_top - $(this).height() / 2) + $(this).height() / 2);
        var left = Math.round((width / o_width) * (o_left - $(this).width() / 2) + $(this).width() / 2);

        record.width(width).height(height).css({
            top: top,
            left: left
        });
    });

}

function set_agreement(event, el, sselcont_id, boolean_value) {
    if (event.stopPropagation)
        event.stopPropagation();
    event.cancelBubble = true;

    var id =

        $.ajax({
            type: "POST",
            url: "/lightbox/ajax/SET_ELEMENT_AGREEMENT/" + sselcont_id + "/",
            dataType: 'json',
            data: {
                agreement: boolean_value
            },
            success: function (datas) {
                if (!datas.error) {
                    if (boolean_value == '1') {
                        $('.agree_' + sselcont_id + '').removeClass('not_decided');
                        $('.disagree_' + sselcont_id + '').addClass('not_decided');
                        $('.userchoice.me').addClass('agree').removeClass('disagree');
                    }
                    else {
                        $('.agree_' + sselcont_id + '').addClass('not_decided');
                        $('.disagree_' + sselcont_id + '').removeClass('not_decided');
                        $('.userchoice.me').addClass('disagree').removeClass('agree');
                    }
                    p4.releasable = datas.releasable;
                    if (datas.releasable !== false) {
                        if (confirm(datas.releasable))
                            $('#basket_options .confirm_report').trigger('click');
                    }
                }
                else {
                    alert(datas.datas);
                }
                return;
            }
        });
}


function calculate_display(display_width, display_height, width, height, margin) {
    if (typeof margin == 'undefined')
        margin = 10;

    var display_ratio = display_width / display_height;
    var ratio = width / height;
    var w, h;

    if (ratio > display_ratio)//landscape
    {
        w = display_width - 2 * margin;
        if (w > width)
            w = width;
        h = w / ratio;
    }
    else {
        h = display_height - 2 * margin;
        if (h > height)
            h = height;
        w = ratio * h;
    }

    return {
        width: w,
        height: h
    };
}


function display_record(compare) {
    var main_container = $('#record_wrapper');

    if (typeof compare == 'undefined')
        compare = !main_container.hasClass('single');

    var main_box = $('#record_main');
    var compare_box = $('#record_compare');

    var main_record = $('.lightbox_container .record', main_box);
    var compare_record = $('.lightbox_container .record', compare_box);

    var main_record_width = parseInt($('input[name=width]', main_box).val());
    var main_record_height = parseInt($('input[name=height]', main_box).val());
    var compare_record_width = parseInt($('input[name=width]', compare_box).val());
    var compare_record_height = parseInt($('input[name=height]', compare_box).val());

    var main_container_width = main_container.width();
    var main_container_innerwidth = main_container.innerWidth();
    var main_container_height = main_container.height();
    var main_container_innerheight = main_container.innerHeight();

    if (compare) {
        $('.agreement_selector').show();
        main_container.addClass('comparison');

        var double_portrait_width = main_container_innerwidth / 2;
        var double_portrait_height = main_container_innerheight - $('.header', main_box).outerHeight();

        var double_paysage_width = main_container_innerwidth;
        var double_paysage_height = main_container_innerheight / 2 - $('.header', main_box).outerHeight();

        var main_display_portrait = calculate_display(
            double_portrait_width, double_portrait_height,
            main_record_width, main_record_height
        );
        var main_display_paysage = calculate_display(
            double_paysage_width, double_paysage_height,
            main_record_width, main_record_height
        );

        var compare_display_portrait = calculate_display(
            double_portrait_width, double_portrait_height,
            compare_record_width, compare_record_height
        );
        var compare_display_paysage = calculate_display(
            double_paysage_width, double_paysage_height,
            compare_record_width, compare_record_height
        );

        var surface_main_portrait = main_display_portrait.width * main_display_portrait.height;
        var surface_main_paysage = main_display_paysage.width * main_display_paysage.height;
        var surface_compare_portrait = compare_display_portrait.width * compare_display_portrait.height;
        var surface_compare_paysage = compare_display_paysage.width * compare_display_paysage.height;

        var double_portrait_surface = (surface_main_portrait + surface_compare_portrait) / 2;
        var double_paysage_surface = (surface_main_paysage + surface_compare_paysage) / 2;

        var smooth_image = false;

        var m_width_image, m_height_image, c_width_image, c_height_image, dim_container;

        if (double_portrait_surface > double_paysage_surface) {
            if (!main_container.hasClass('portrait')) {
                smooth_image = true;

                smooth_transform(
                    main_box,
                    '50%',
                    '100%',
                    function () {
                        set_container_status('portrait');
                    }
                );

                compare_box.css('visibility', 'hidden');

                smooth_transform(
                    compare_box,
                    '50%',
                    '100%',
                    function () {
                        compare_box.css('display', 'none')
                            .css('visibility', 'visible')
                            .fadeIn();
                    }
                );
            }
            m_width_image = main_display_portrait.width;
            m_height_image = main_display_portrait.height;
            c_width_image = compare_display_portrait.width;
            c_height_image = compare_display_portrait.height;
            dim_container = {
                width: double_portrait_width,
                height: double_portrait_height
            };
        }
        else {
            if (!main_container.hasClass('paysage')) {
                smooth_image = true;

                smooth_transform(
                    main_box,
                    '100%',
                    '50%',
                    function () {
                        set_container_status('paysage');
                    }
                );

                compare_box.css('visibility', 'hidden');

                smooth_transform(
                    compare_box,
                    '100%',
                    '50%',
                    function () {
                        compare_box.css('display', 'none')
                            .css('visibility', 'visible')
                            .fadeIn();
                    }
                );
            }
            m_width_image = main_display_paysage.width;
            m_height_image = main_display_paysage.height;
            c_width_image = compare_display_paysage.width;
            c_height_image = compare_display_paysage.height;
            dim_container = {
                width: double_paysage_width,
                height: double_paysage_height
            };
        }

        var image_callback = set_image_position(false, compare_record, c_width_image, c_height_image, dim_container, function () {
        });
        set_image_position(smooth_image, main_record, m_width_image, m_height_image, dim_container, image_callback);
    }
    else {
        $('.agreement_selector').hide();
        main_container.removeClass('comparison');

        if (compare_box.is(':visible')) {
            compare_box.hide().css('visibility', 'hidden').css('display', 'block');
        }

        var main_display = calculate_display(
            main_container_innerwidth, (main_container_innerheight - $('.header', main_box).outerHeight()),
            main_record_width, main_record_height
        );

        if (!main_container.hasClass('single')) {
            main_box.width('100%')
                .height('100%');

            set_container_status('single');
        }
        set_image_position(smooth_image, main_record, main_display.width, main_display.height, {
            width: main_container_width,
            height: (main_container_height - $('.header', main_box).outerHeight())
        });
    }
}

function set_container_status(status) {
    $('#record_wrapper').removeClass('paysage portrait single').addClass(status);
}

function set_image_position(smooth, image, width, height, container, callback) {
    var dimensions = {};

    if (typeof container !== 'undefined') {
        var c_width = container.width;
        var c_height = container.height;

        dimensions.top = parseInt((c_height - height) / 2);
        dimensions.left = parseInt((c_width - width) / 2);
    }
    if (typeof callback == 'undefined') {
        callback = function () {
        };
    }

    dimensions.width = width;
    dimensions.height = height;

    if (smooth) {
        $(image).stop().animate(dimensions, 500, callback);
    }
    else {
        $(image).css(dimensions);
        callback();
    }
}

function smooth_transform(box, width, height, callback) {
    if (typeof callback == 'undefined')
        callback = function () {
        };

    $(box).stop()
        .animate(
        {
            width: width,
            height: height
        },
        500,
        callback
    );
}


function scroll_elements(boolean_value) {
    var sc_wrapper = $('#sc_wrapper');
    var value;
    if (boolean_value)
        value = sc_wrapper.scrollLeft() + 400;
    else
        value = sc_wrapper.scrollLeft() - 400;

    sc_wrapper.stop().animate({
        'scrollLeft': value
    });
    return;
}

function download_basket() {
    var ids = $.map($('#sc_container .download_form').toArray(), function (el, i) {
        return $('input[name="basrec"]', $(el)).val();
    });
    download(ids.join(';'));
}

function download(value) {
    var dialog = p4.Dialog.Create({title: typeof(language) !== 'undefined' ? language['export'] : ''});

    $.post("/prod/export/multi-export/", "lst=" + value, function (data) {

        dialog.setContent(data);

        $('.tabs', dialog.getDomElement()).tabs();

        $('.close_button', dialog.getDomElement()).bind('click', function () {
            dialog.Close();
        });

        return false;
    });
}

