﻿/**
* Name: PiroBox Extended v.1.0
* Date: Gen 2011
* Autor: Diego Valobra (http://www.pirolab.it),(http://www.diegovalobra.com)
* Version: 1.0
* Licence: CC-BY-SA http://creativecommons.org/licenses/by-sa/3/it/
**/

(function ($) {
    $.fn.piroBox_ext = function (opt) {
        opt = jQuery.extend({
            piro_speed: 700,
            bg_alpha: 0.9,
            piro_scroll: true
        }, opt);
        $.fn.piroFadeIn = function (speed, callback) {
            $(this).fadeIn(speed, function () {
                if (jQuery.browser.msie)
                    $(this).get(0).style.removeAttribute('filter');
                if (callback != undefined)
                    callback();
            });
        };
        $.fn.piroFadeOut = function (speed, callback) {
            $(this).fadeOut(speed, function () {
                if (jQuery.browser.msie)
                    $(this).get(0).style.removeAttribute('filter');
                if (callback != undefined)
                    callback();
            });
        };
        var my_gall_obj = $('a[class*="pirobox"]');
        var map = new Object();
        for (var i = 0; i < my_gall_obj.length; i++) {
            var it = $(my_gall_obj[i]);
            map['a.' + it.attr('class').match(/^pirobox_gall\w*/)] = 0;
        }
        var gall_settings = new Array();
        for (var key in map) {
            gall_settings.push(key);
        }
        for (var i = 0; i < gall_settings.length; i++) {
            $(gall_settings[i] + ':first').addClass('first');
            $(gall_settings[i] + ':last').addClass('last');
        }
        var piro_gallery = $(my_gall_obj);
        $('a[class*="pirobox_gall"]').each(function (rev) { this.rev = rev + 0 });
        var struct = (
		'<div class="piro_overlay"></div>' +
		'<table class="piro_html"  cellpadding="0" cellspacing="0">' +
		'<tr>' +
		'<td class="h_t_l"></td>' +
		'<td class="h_t_c" title="drag me!!"></td>' +
		'<td class="h_t_r"></td>' +
		'</tr>' +
		'<tr>' +
		'<td class="h_c_l"></td>' +
		'<td class="h_c_c">' +
		'<div class="piro_loader" title="close"><span></span></div>' +
		'<div class="resize">' +
		'<div class="nav_container">' +
		'<a href="#prev" class="piro_prev" title="previous"></a>' +
		'<a href="#next" class="piro_next" title="next"></a>' +
		'<div class="piro_prev_fake">prev</div>' +
		'<div class="piro_next_fake">next</div>' +
		'<div class="piro_close" title="close"></div>' +
		'</div>' +
		'<div class="caption"></div>' +
		'<div class="div_reg"></div>' +
		'</div>' +
		'</td>' +
		'<td class="h_c_r"></td>' +
		'</tr>' +
		'<tr>' +
		'<td class="h_b_l"></td>' +
		'<td class="h_b_c"></td>' +
		'<td class="h_b_r"></td>' +
		'</tr>' +
		'</table>'
		);
        $('body').append(struct);
        var wrapper = $('.piro_html'),
	piro_capt = $('.caption'),
	piro_bg = $('.piro_overlay'),
	piro_next = $('.piro_next'),
	piro_prev = $('.piro_prev'),
	piro_next_fake = $('.piro_next_fake'),
	piro_prev_fake = $('.piro_prev_fake'),
	piro_close = $('.piro_close'),
	div_reg = $('.div_reg'),
	piro_loader = $('.piro_loader'),
	resize = $('.resize'),
	btn_info = $('.btn_info');
        var rz_img = 0.95; /*::::: ADAPT IMAGE TO BROWSER WINDOW SIZE :::::*/
        if ($.browser.msie) {
            wrapper.draggable({ handle: '.h_t_c,.h_b_c,.div_reg img' });
        } else {
            wrapper.draggable({ handle: '.h_t_c,.h_b_c,.div_reg img', opacity: 0.80 });
        }
        var y = $(window).height();
        var x = $(window).width();
        $('.nav_container').hide();
        wrapper.css({ left: ((x / 2) - (250)) + 'px', top: parseInt($(document).scrollTop()) + (100) });
        $(wrapper).add(piro_capt).add(piro_bg).hide();
        piro_bg.css({ 'opacity': opt.bg_alpha });
        $(piro_prev).add(piro_next).bind('click', function (c) {
            $('.nav_container').hide();
            c.preventDefault();
            piro_next.add(piro_prev).hide();
            var obj_count = parseInt($('a[class*="pirobox_gall"]').filter('.item').attr('rev'));
            var start = $(this).is('.piro_prev') ? $('a[class*="pirobox_gall"]').eq(obj_count - 1) : $('a[class*="pirobox_gall"]').eq(obj_count + 1);
            start.click();
        });
        $('html').bind('keyup', function (c) {
            if (c.keyCode == 27) {
                c.preventDefault();
                if ($(piro_close).is(':visible')) { close_all(); }
            }
        });
        $('html').bind('keyup', function (e) {
            if ($('.item').is('.first')) {
            } else if (e.keyCode == 37) {
                e.preventDefault();
                if ($(piro_close).is(':visible')) { piro_prev.click(); }
            }
        });
        $('html').bind('keyup', function (z) {
            if ($('.item').is('.last')) {
            } else if (z.keyCode == 39) {
                z.preventDefault();
                if ($(piro_close).is(':visible')) { piro_next.click(); }
            }
        });
        $(window).resize(function () {
            var new_y = $(window).height();
            var new_x = $(window).width();
            var new_h = wrapper.height();
            var new_w = wrapper.width();
            wrapper.css({
                left: ((new_x / 2) - (new_w / 2)) + 'px',
                top: parseInt($(document).scrollTop()) + (new_y - new_h) / 2
            });
        });
        function scrollIt() {
            $(window).scroll(function () {
                var new_y = $(window).height();
                var new_x = $(window).width();
                var new_h = wrapper.height();
                var new_w = wrapper.width();
                wrapper.css({
                    left: ((new_x / 2) - (new_w / 2)) + 'px',
                    top: parseInt($(document).scrollTop()) + (new_y - new_h) / 2
                });
            });
        }
        if (opt.piro_scroll == true) {
            scrollIt()
        }
        $(piro_gallery).each(function () {

            var descr = $(this).attr('title');
            var params = $(this).attr('rel').split('-');
            var p_link = $(this).attr('href');
            $(this).unbind();
            $(this).bind('click', function (e) {
                piro_bg.css({ 'opacity': opt.bg_alpha });
                e.preventDefault();
                piro_next.add(piro_prev).hide().css('visibility', 'hidden');
                $(piro_gallery).filter('.item').removeClass('item');
                $(this).addClass('item');
                open_all();
                if ($(this).is('.first')) {
                    piro_prev.hide();
                    piro_next.show();
                    piro_prev_fake.show().css({ 'opacity': 0.5, 'visibility': 'hidden' });
                } else {
                    piro_next.add(piro_prev).show();
                    piro_next_fake.add(piro_prev_fake).hide();
                }
                if ($(this).is('.last')) {
                    piro_prev.show();
                    piro_next_fake.show().css({ 'opacity': 0.5, 'visibility': 'hidden' });
                    piro_next.hide();
                }
                if ($(this).is('.pirobox')) {
                    piro_next.add(piro_prev).hide();
                }

            });

            function open_all() {
                wrapper.add(piro_bg).add(div_reg).add(piro_loader).show();
                function animate_html() {
                    if (params[1] == 'full' && params[2] == 'full') {
                        params[2] = $(window).height() - 70;
                        params[1] = $(window).width() - 55;
                    }
                    var y = $(window).height();
                    var x = $(window).width();
                    piro_close.hide();
                    div_reg.add(resize).animate({
                        'height': +(params[2]) + 'px',
                        'width': +(params[1]) + 'px'
                    }, opt.piro_speed).css('visibility', 'visible');

                    wrapper.animate({
                        height: +(params[2]) + 20 + 'px',
                        width: +(params[1]) + 20 + 'px',
                        left: ((x / 2) - ((params[1]) / 2 + 10)) + 'px',
                        top: parseInt($(document).scrollTop()) + (y - params[2]) / 2 - 10
                    }, opt.piro_speed, function () {
                        piro_next.add(piro_prev).css({ 'height': '20px', 'width': '20px' });
                        piro_next.add(piro_prev).add(piro_prev_fake).add(piro_next_fake).css('visibility', 'visible');
                        $('.nav_container').show();
                        piro_close.show();
                    });
                }
                function animate_image() {
                    var img = new Image();
                    img.onerror = function () {
                        piro_capt.html('');
                        img.src = "http://www.pirolab.it/pirobox/js/error.jpg";
                    }
                    img.onload = function () {
                        piro_capt.add(btn_info).hide();
                        var y = $(window).height();
                        var x = $(window).width();
                        var imgH = img.height;
                        var imgW = img.width;

                        //var rz_img =1.203; /*::::: ORIGINAL SIZE :::::*/
                        if (imgH + 20 > y || imgW + 20 > x) {
                            var _x = (imgW + 20) / x;
                            var _y = (imgH + 20) / y;
                            if (_y > _x) {
                                imgW = Math.round(img.width * (rz_img / _y));
                                imgH = Math.round(img.height * (rz_img / _y));
                            } else {
                                imgW = Math.round(img.width * (rz_img / _x));
                                imgH = Math.round(img.height * (rz_img / _x));
                            }
                        } else {
                            imgH = img.height;
                            imgW = img.width;
                        }

                        var y = $(window).height();
                        var x = $(window).width();
                        $(img).height(imgH).width(imgW).hide();

                        $(img).fadeOut(300, function () { });
                        $('.div_reg img').remove();
                        $('.div_reg').html('');
                        div_reg.append(img).show();
                        $(img).addClass('immagine');

                        div_reg.add(resize).animate({ height: imgH + 'px', width: imgW + 'px' }, opt.piro_speed);
                        wrapper.animate({
                            height: (imgH + 20) + 'px',
                            width: (imgW + 20) + 'px',
                            left: ((x / 2) - ((imgW + 20) / 2)) + 'px',
                            top: parseInt($(document).scrollTop()) + (y - imgH) / 2 - 20
                        }, opt.piro_speed, function () {
                            var cap_w = resize.width();
                            piro_capt.css({ width: cap_w + 'px' });
                            piro_loader.hide();
                            $(img).fadeIn(300, function () {
                                piro_close.add(btn_info).show();
                                piro_capt.slideDown(200);
                                piro_next.add(piro_prev).css({ 'height': '20px', 'width': '20px' });
                                piro_next.add(piro_prev).add(piro_prev_fake).add(piro_next_fake).css('visibility', 'visible');
                                $('.nav_container').show();
                                resize.resize(function () {
                                    NimgW = img.width; //1.50;
                                    NimgH = img.heigh; //1.50;
                                    piro_capt.css({ width: (NimgW) + 'px' });
                                });
                            });
                        });
                    }

                    img.src = p_link;
                    piro_loader.click(function () {
                        img.src = 'about:blank';
                    });
                }

                switch (params[0]) {

                    case 'iframe':
                        div_reg.html('').css('overflow', 'hidden');
                        resize.css('overflow', 'hidden');
                        piro_close.add(btn_info).add(piro_capt).hide();
                        animate_html();
                        div_reg.piroFadeIn(300, function () {
                            div_reg.append(
						'<iframe id="my_frame" class="my_frame" src="' + p_link + '" frameborder="0" allowtransparency="true" scrolling="auto" align="top"></iframe>'
						);
                            $('.my_frame').css({ 'height': +(params[2]) + 'px', 'width': +(params[1]) + 'px' });
                            piro_loader.hide();
                        });
                        break;

                    case 'content':
                        div_reg.html('').css('overflow', 'auto');
                        resize.css('overflow', 'auto');
                        $('.my_frame').remove();
                        piro_close.add(btn_info).add(piro_capt).hide();
                        animate_html()
                        div_reg.piroFadeIn(300, function () {
                            div_reg.load(p_link);
                            piro_loader.hide();
                        });
                        break;

                    case 'inline':
                        div_reg.html('').css('overflow', 'auto');
                        resize.css('overflow', 'auto');
                        $('.my_frame').remove();
                        piro_close.add(btn_info).add(piro_capt).hide();
                        animate_html()
                        div_reg.piroFadeIn(300, function () {
                            $(p_link).clone(true).appendTo(div_reg).piroFadeIn(300);
                            piro_loader.hide();
                        });
                        break

                    case 'gallery':
                        div_reg.css('overflow', 'hidden');
                        resize.css('overflow', 'hidden');
                        $('.my_frame').remove();
                        piro_close.add(btn_info).add(piro_capt).hide();
                        if (descr == "") {
                            piro_capt.html('');
                        } else {
                            piro_capt.html('<p>' + descr + '</p>');
                        }
                        animate_image();
                        break;

                    case 'single':
                        piro_close.add(btn_info).add(piro_capt).hide();
                        div_reg.html('').css('overflow', 'hidden');
                        resize.css('overflow', 'hidden');
                        $('.my_frame').remove();
                        if (descr == "") {
                            piro_capt.html('');
                        } else {
                            piro_capt.html('<p>' + descr + '</p>');
                        }
                        animate_image();
                        break
                }
            }
        });
        $('.immagine').live('click', function () {
            piro_capt.slideToggle(200);
        });

        function close_all() {
            if ($('.piro_close').is(':visible')) {
                $('.my_frame').remove();
                wrapper.add(div_reg).add(resize).stop();
                var ie_sucks = wrapper;
                if ($.browser.msie) {
                    ie_sucks = div_reg.add(piro_bg);
                    $('.div_reg img').remove();
                } else {
                    ie_sucks = wrapper.add(piro_bg);
                }
                ie_sucks.piroFadeOut(200, function () {
                    div_reg.html('');
                    piro_loader.add(piro_capt).add(btn_info).hide();
                    $('.nav_container').hide();
                    piro_bg.add(wrapper).hide().css('visibility', 'visible');
                });
            }
        }
        piro_close.add(piro_loader).add(piro_bg).bind('click', function (y) { y.preventDefault(); close_all(); });
    }
})(jQuery);
