/* Copyright (c) 2008, Mathieu Vilaplana (mvilaplana@df-e.com)
 * Adapted by OW Interactive */
(function ($) {
    $.fn.fancyzoom = function (userOptions) {
        var oOverlay = $('<div>').css({
            height: '100%',
            width: '100%',
            position: 'fixed',
            zIndex: 100,
            left: 0,
            top: 0,
            cursor: "default"
        });

        function openZoomBox(imgSrc, o) {
            if (o.showoverlay) {
                oOverlay.appendTo('body').click(function () {
                    closeZoomBox(o);
                });
                if ($.browser.msie && $.browser.version < 7) {
                    oOverlay.css({
                        position: 'absolute',
                        height: $(document).height(),
                        width: $(document).width()
                    });
                }
            }
            var oImgZoomBox = o.oImgZoomBox;
            pos = imgSrc.offset();
            o = $.extend(o, {
                imgSrc: imgSrc,
                dimOri: {
                    width: imgSrc.outerWidth(),
                    height: imgSrc.outerHeight(),
                    left: pos.left,
                    top: pos.top,
                    'opacity': 1
                }
            });
            if (!imgSrc.is('img')) {
                o.dimOri = $.extend(o.dimOri, {
                    width: 0,
                    height: 0
                });
            }
            oImgZoomBox.css({
                'text-align': 'center',
                'border': '0px solid red'
            }).appendTo('body');
            var iWidth = oImgZoomBox.outerWidth();
            var iHeight = oImgZoomBox.outerHeight();
            dimBoxTarget = $.extend({}, {
                width: iWidth,
                height: iHeight,
                'opacity': 1
            }, __posCenter((iWidth), (iHeight + 30)));
            o.oImgClose.css({
                left: (dimBoxTarget.left + dimBoxTarget.width - 15),
                top: (dimBoxTarget.top - 15)
            });
            var $fctEnd = function () {
                if ($.fn.shadow && o.shadow && !$.browser.msie) {
                    $('img:first', oImgZoomBox).shadow(o.shadowOpts);
                }
                if (o.Speed > 0 && !$.browser.msie) {
                    o.oImgClose.fadeIn('slow');
                    $('div', oImgZoomBox).fadeIn('slow');
                }
                else {
                    o.oImgClose.show();
                    $('div', oImgZoomBox).show();
                }
            };
            $('div', oImgZoomBox).hide();
            if (o.imgSrc.is('img')) {
                o.imgSrc.css({
                    'opacity': 0
                });
            }
            var oImgDisplay = $('img:first', oImgZoomBox).css({
                'width': '100%',
                'height': 'auto'
            });
            if (o.Speed > 0) {
                oImgZoomBox.css(o.dimOri).animate(dimBoxTarget, o.Speed, $fctEnd);
            }
            else {
                oImgZoomBox.css(dimBoxTarget);
                $fctEnd();
            }
        }

        function closeZoomBox(o) {
            var oImgZoomBox = o.oImgZoomBox;
            o.oImgClose.remove();
            $('div', oImgZoomBox).remove();
            var endClose = function () {
                oImgZoomBox.empty().remove();
                o.imgSrc.css('opacity', 1);
            };
            if (o.Speed > 0) {
                var pos = oImgZoomBox.offset();
                var iPercent = 0.15;
                var oDimPlus = {
                    width: (oImgZoomBox.width() * (1 + iPercent)),
                    height: (oImgZoomBox.height() * (1 + iPercent)),
                    left: (pos.left - (oImgZoomBox.width() * (iPercent / 2))),
                    top: (pos.top - (oImgZoomBox.height() * (iPercent / 2)))
                };
                oImgZoomBox.animate(oDimPlus, o.Speed * 0.2, function () {
                    oImgZoomBox.animate(o.dimOri, o.Speed, function () {
                        endClose();
                    });
                    if (o.showoverlay) {
                        oOverlay.animate({
                            'opacity': 0
                        }, o.Speed, function () {
                            $(this).remove();
                        });
                    }
                });
            } else {
                endClose();
                if (o.showoverlay) {
                    oOverlay.remove();
                }
            }
        }
        return this.each(function () {
            var $this = $(this);
            var imgTarget = $this.is('img') ? $this : ($('img:first', $this).length == 0) ? $this : $('img:first', $this);
            var imgTargetSrc = null;
            if ($this.attr('href')) {
                imgTargetSrc = $this.attr('href');
            }
            var oImgClose = $('<img class="jqfancyzoomclosebox">').css({
                position: 'absolute',
                top: 0,
                left: 0,
                cursor: 'pointer'
            });
            var opts = $.extend({}, $.fn.fancyzoom.defaultsOptions, userOptions || {}, {
                dimOri: {},
                oImgZoomBoxProp: {
                    position: 'absolute',
                    left: 0,
                    top: 0
                },
                oImgClose: oImgClose
            });
            if (imgTarget.is('img')) {
                var oImgHover = $("<img src='" + opts.imgDir + "zoom.png'>").css({
                    position: 'absolute',
                    top: 0,
                    left: 0,
                    width: '0px',
                    height: '0px',
                    border: 'none'
                });
                imgTarget.hover(function () {
                    if (imgTarget.css('opacity') != 0) {
                        oImgHover.appendTo(imgTarget.parent()).hide();
                        var pos = imgTarget.position();
                        var marginLeft = parseInt(imgTarget.css('margin-left').replace(/px/, ''));
                        var marginTop = parseInt(imgTarget.css('margin-top').replace(/px/, ''));
                        var objpos = __posImgCenter(imgTarget.width(), imgTarget.height(), (pos.left + marginLeft - 12), (pos.top + marginTop - 12));
                        marginTop = (marginTop) ? marginTop : 0;
                        marginLeft = (marginLeft) ? marginLeft : 0;
                        oImgHover.css({
                            'margin-left': objpos.left,
                            'margin-top': objpos.top
                        }).show();
                        if ($.fn.ifixpng) {
                            oImgHover.ifixpng(opts.imgDir + 'blank.gif');
                        }
                    }
                }, function () {
                    oImgHover.remove();
                });
            }
            if ($this.is('img')) {
                imgTargetSrc = $this.css('cursor', 'pointer').attr('src');
                if (opts.imgResizeScript) {
                    if (imgTargetSrc.match(new RegExp("^" + opts.imgResizeScript, "g"))) {
                        imgTargetSrc = imgTargetSrc.replace(/.*img=([^&]*).*/gi, '$1');
                    }
                }
            }
            oOverlay.css({
                opacity: opts.overlay,
                background: opts.overlayColor
            });
            if (!/\.jpg|\.jpeg|\.png|\.gif/i.test(imgTargetSrc)) {
                return true;
            }
            $this.click(function () {
                var zoomOpened = $('div.jqfancyzoombox');
                if (zoomOpened.length > 0) {
                    if ($('img:first', zoomOpened).attr('src') != imgTargetSrc) {
                        if (oLoading && oLoading.is(':visible')) {
                            __cancelLoading();
                        }
                    }
                    else {
                        return false;
                    }
                }
                var o = $.extend({}, opts, userOptions);
                var closeBtn = $("img.jqfancyzoomclosebox");
                if (closeBtn.length > 0) {
                    var imCurrent = $('img:first', zoomOpened);
                    if (imgTargetSrc == imCurrent.attr('src')) {
                        pos = imgTarget.offset();
                        o = $.extend(o, {
                            dimOri: {
                                width: (imgTarget.outerWidth()),
                                height: (imgTarget.outerHeight()),
                                left: pos.left,
                                top: (pos.top),
                                'opacity': 0
                            }
                        });
                        closeZoomBox(o);
                        return false;
                    } else {
                        closeBtn.trigger('click');
                    }
                }
                if (o.showoverlay && oOverlay) {
                    oOverlay.empty().remove().css({
                        'opacity': o.overlay
                    });
                }
                oImgClose.attr('src', o.imgDir + 'closebox.png').appendTo('body').hide();
                if ($.fn.ifixpng) {
                    $.ifixpng(o.imgDir + 'blank.gif');
                    oImgClose.ifixpng(o.imgDir + 'blank.gif');
                }
                oImgClose.unbind('click').click(function () {
                    closeZoomBox(o);
                });
                var oImgZoomBox = $('<div class="jqfancyzoombox"></div>').css(o.oImgZoomBoxProp);
                o = $.extend(o, {
                    oImgZoomBox: oImgZoomBox
                });
                var strTitle = imgTarget.attr('alt');
                if (strTitle) {
                    var oTitle = $('<div><center><table height=0 border="0" cellspacing=0 cellpadding=0><tr><td></td><td class="fancyTitle">' + strTitle + '</td><td></td></table></center></div>').css({
                        marginTop: 10,
                        marginRight: 15
                    });
                    var tdL = oTitle.find('td:first').css({
                        'background': 'url(' + o.imgDir + 'zoom-caption-l.png)',
                        width: '13px',
                        height: '26px'
                    });
                    var tdR = oTitle.find('td:last').css({
                        'background': 'url(' + o.imgDir + 'zoom-caption-r.png)',
                        width: '13px',
                        height: '26px'
                    });
                    var tdC = $('.fancyTitle', oTitle).css({
                        'background': 'url(' + o.imgDir + 'zoom-caption-fill.png)',
                        'padding': '0px 20px',
                        color: '#FFF',
                        'font-size': '14px'
                    });
                    if ($.fn.ifixpng) {
                        tdL.ifixpng(o.imgDir + 'blank.gif');
                        tdR.ifixpng(o.imgDir + 'blank.gif');
                        tdC.ifixpng(o.imgDir + 'blank.gif');
                    }
                    oTitle.appendTo(oImgZoomBox);
                }
                var oImgZoom = $('<img />').attr('src', imgTargetSrc).click(function () {
                    closeZoomBox(o);
                }).prependTo(oImgZoomBox);
                var imagezindex = opts.imagezindex;
                oOverlay.css('zIndex', imagezindex - 1);
                oImgZoomBox.css('zIndex', imagezindex);
                oImgClose.css('zIndex', (imagezindex + 10));
                var imgPreload = new Image();
                imgPreload.src = imgTargetSrc;
                var $fctEndLoading = function () {
                    if (bCancelLoading) {
                        bCancelLoading = false;
                    }
                    else {
                        if (__getFileName(imgPreload.src) == __getFileName($('img:first', oImgZoomBox).attr('src'))) {
                            fctCalculateImageSize(o.autoresize);
                            openZoomBox(imgTarget, o);
                            __stoploading();
                        }
                    }
                };
                var fctCalculateImageSize = function (autoresize) {
                    if (autoresize) {
                        var divCalculate = $('<div></div>').css({
                            position: 'absolute',
                            'top': 0,
                            'left': 0,
                            opacity: 0,
                            'border': '0px solid red'
                        });
                        var bResize = false;
                        oImgZoom.appendTo(divCalculate);
                        divCalculate.appendTo('body');
                        imWidth = oImgZoom.width();
                        imHeight = oImgZoom.height();
                        maxWidth = $(window).width() * 0.9;
                        maxHeight = $(window).height() - 100;
                        if (maxHeight < imHeight) {
                            bResize = true;
                            oImgZoom.height(maxHeight);
                            imWidth = (imWidth * maxHeight) / imHeight;
                            oImgZoom.width(imWidth);
                            if (maxWidth < imWidth) {
                                oImgZoom.width(maxWidth);
                                oImgZoom.height(imHeight * maxWidth / imWidth);
                            }
                        } else if (maxWidth < imWidth) {
                            bResize = true;
                            oImgZoom.width(maxWidth);
                            oImgZoom.height(imHeight * maxWidth / imWidth);
                        }
                        if (bResize && o.imgResizeScript) {
                            var tWidth = oImgZoom.width();
                            var tHeight = oImgZoom.height();
                            var finalWidth = tWidth;
                            var tabSizes = new Array(1440, 1280, 1024, 800, 640, 480, 360);
                            for (i = 0; i < tabSizes.length; i++) {
                                if (tWidth > tabSizes[i]) {
                                    finalWidth = tabSizes[i];
                                    break;
                                }
                            }
                            oImgZoom.width(finalWidth);
                            oImgZoom.height(parseInt(tHeight * finalWidth / tWidth));
                            var args = "img=" + encodeURI(oImgZoom.attr('src'));
                            args += "&width=" + oImgZoom.width();
                            args += "&height=" + oImgZoom.height();
                            oImgZoom.attr('src', o.imgResizeScript + "?" + args);
                        }
                        divCalculate.remove();
                    }
                    oImgZoom.prependTo(oImgZoomBox);
                };
                if (imgPreload.complete) {
                    fctCalculateImageSize(o.autoresize);
                    openZoomBox(imgTarget, o);
                }
                else {
                    __displayLoading(o);
                    imgPreload.onload = function () {
                        $fctEndLoading();
                    };
                }
                return false;
            });
        });
    };
    $.fn.fancyzoom.defaultsOptions = {
        overlayColor: '#000',
        overlay: 0.6,
        imagezindex: 100,
        showoverlay: true,
        Speed: 400,
        shadow: true,
        shadowOpts: {
            color: "#000",
            offset: 4,
            opacity: 0.2
        },
        imgDir: 'ressources/',
        imgResizeScript: null,
        autoresize: true
    };

    function __posCenter(iWidth, iHeight) {
        var iLeft = ($(window).width() - iWidth) / 2 + $(window).scrollLeft();
        var iTop = ($(window).height() - iHeight) / 2 + $(window).scrollTop();
        iLeft = (iLeft < 0) ? 0 : iLeft;
        iTop = (iTop < 0) ? 0 : iTop;
        return {
            left: Math.floor(iLeft),
            top: Math.floor(iTop)
        };
    }

    function __posImgCenter(iWidth, iHeight, x, y) {
        var iLeft = ((iWidth - 30) / 2) + (x + 12);
        var iTop = ((iHeight - 30) / 2) + (y + 12);
        return {
            left: Math.floor(iLeft),
            top: Math.floor(iTop)
        };
    }
    var oLoading = null;
    var bCancelLoading = false;
    var timerLoadingImg = null;

    function __displayLoading(o) {
        if (!oLoading) {
            oLoading = $('<div></div>').css({
                width: 50,
                height: 50,
                position: 'absolute',
                'background': 'transparent',
                opacity: 8 / 10,
                color: '#FFF',
                padding: '5px',
                'font-size': '10px'
            });
        }
        oLoading.css(__posCenter(50, 50)).html('<img src="' + o.imgDir + 'blank.gif" />').click(function () {
            __cancelLoading();
        }).appendTo('body').show();
        timerLoadingImg = setTimeout(function () {
            __changeimageLoading(o);
        }, 400);
    }

    function __cancelLoading() {
        bCancelLoading = true;
        __stoploading();
    }

    function __stoploading() {
        oLoading.hide().remove();
        if (timerLoadingImg) {
            clearTimeout(timerLoadingImg);
            timerLoadingImg = null;
        }
    }

    function __changeimageLoading(o) {
        if (oLoading && !oLoading.is(':visible')) {
            timerLoadingImg = null;
            return;
        }
        var $im = $('img', oLoading);
        if (!$im.attr('src') || /blank\.gif/.test($im.attr('src'))) {
            strImgSrc = o.imgDir + "zoom-spin-1.png";
        }
        else {
            tab = $im.attr('src').split(/[- .]+/);
            iImg = parseInt(tab[2]);
            iImg = (iImg < 12) ? (iImg + 1) : 1;
            strImgSrc = tab[0] + "-" + tab[1] + "-" + iImg + "." + tab[3];
        }
        var pLoad = new Image();
        pLoad.src = strImgSrc;
        var $fct = function () {
            oLoading && oLoading.css(__posCenter(50, 50));
            $im.attr('src', strImgSrc);
            timerLoadingImg = setTimeout(__changeimageLoading, 100);
        };
        if (pLoad.complete) {
            $fct();
        }
        else {
            pLoad.onload = $fct;
        }
    }

    function __getFileName(strPath) {
        if (!strPath) {
            return false;
        }
        var tabPath = strPath.split('/');
        return ((tabPath.length < 1) ? strPath : tabPath[(tabPath.length - 1)]);
    }
})(jQuery);
