/*
* Facebox (for jQuery)
* version: 1.2 (05/05/2008)
* @requires jQuery v1.2 or later
*
* Examples at http://famspam.com/facebox/
*
* Licensed under the MIT:
*   http://www.opensource.org/licenses/mit-license.php
*
* Copyright 2007, 2008 Chris Wanstrath [ chris@ozmm.org ]
*
* Usage:
*  
*  jQuery(document).ready(function() {
*    jQuery('a[rel*=facebox]').facebox() 
*  })
*
*  <a href="#terms" rel="facebox">Terms</a>
*    Loads the #terms div in the box
*
*  <a href="terms.html" rel="facebox">Terms</a>
*    Loads the terms.html page in the box
*
*  <a href="terms.png" rel="facebox">Terms</a>
*    Loads the terms.png image in the box
*
*
*  You can also use it programmatically:
* 
*    jQuery.facebox('some html')
*
*  The above will open a facebox with "some html" as the content.
*    
*    jQuery.facebox(function(jQuery) { 
*      jQuery.get('blah.html', function(data) { jQuery.facebox(data) })
*    })
*
*  The above will show a loading screen before the passed function is called,
*  allowing for a better ajaxy experience.
*
*  The facebox function can also display an ajax page or image:
*  
*    jQuery.facebox({ ajax: 'remote.html' })
*    jQuery.facebox({ image: 'dude.jpg' })
*
*  Want to close the facebox?  Trigger the 'close.facebox' document event:
*
*    jQuery(document).trigger('close.facebox')
*
*  Facebox also has a bunch of other hooks:
*
*    loading.facebox
*    beforeReveal.facebox
*    reveal.facebox (aliased as 'afterReveal.facebox')
*    init.facebox
*
*  Simply bind a function to any of these hooks:
*
*   jQuery(document).bind('reveal.facebox', function() { ...stuff to do after the facebox and contents are revealed... })
*
*/
; (function(jQuery) {
    jQuery.facebox = function(data, klass) {
        jQuery.facebox.loading();

        if (data.ajax) fillFaceboxFromAjax(data.ajax);
        else if (data.image) fillFaceboxFromImage(data.image);
        else if (data.div) fillFaceboxFromHref(data.div);
        else if (jQuery.isFunction(data)) data.call(jQuery);
        else jQuery.facebox.reveal(data, klass);
    }

    /*
    * Public, jQuery.facebox methods
    */

    ; jQuery.extend(jQuery.facebox, {
        settings: {
            opacity: 0.5,
            overlay: true,
            loadingImage: 'loading.gif',
            closeImage: 'closelabel.gif',
            indexTemplate: '{index} / ',
            allTemplate: '{all}',
            prevTemplate: ' ',
            contentPrevTemplate: ' ',
            contentNextTemplate: ' ',
            showContentNavigation: false,
            startTemplate: ' ',
            stopTemplate: ' ',
            nextTemplate: ' ',

            delay: 4000,
            fadeToDuration: 'slow',
            fadeToOpacity: '0.2',
            contenturl: '',
            imageTypes: ['png', 'jpg', 'jpeg', 'gif'],
            top: 0,
            left: 0,
            faceboxHtml: '<div id="facebox" style="display:none;"> ' +
                              '<div class="popup">' +
                                ' <table>' +
                                    '<tbody>' +
                                        '<tr>' +
                                            '<td class="tl"></td><td class="b"> </td><td class="tr"></td>' +
                                        '</tr>' +
                                        
                                        '<tr>' +
                                            '<td class="b"></td>' +
                                            '<td class="body">' +
                                                '<div id=faceboxcontent class="content">' +
                                                '</div>' +
                                                '<div class="footer">' +
                                                    '<div class="faceboxpager">' +
                                                        '<a id=faceboxprev></a>' +
                                                        '<a id=faceboxstart></a>' +
                                                        '<a id=faceboxstop></a>' +
                                                        '<a id=faceboxnext></a>' +
                                                    '</div>' +
                                                    '<div class=faceboxtitle>' +
                                                        '<span id=faceboxcurrent> </span>' +
                                                        '<span id=faceboxallcount> </span>' +
                                                        '<div id=faceboxtitle style="display:inline"> </div>' +
                                                    '</div>' +
                                                    '<div class="close">' +
                                                        '<a href="#">' +
                                                        '<img src="closelabel.gif" title="close" class="close_image" />' +
                                                        '</a>' +
                                                    '</div>' +
                                                    '<div style="clear:both;"></div>' +
                                                '</div>' +
                                            '</td>' +
                                            '<td class="b"></td>' +
                                        '</tr>' +
                                        '<tr>' +
                                            '<td class="bl"></td><td class="b"></td><td class="br"></td>' +
                                        '</tr>' +
                                      '</tbody>' +
                                  '</table>' +
                                '</div>' +
                        '</div>'
        },

        loading: function() {
            init();
            if (jQuery('#facebox .loading').length == 1) return true;
            showOverlay();
         
            if (jQuery.facebox.settings.prevTemplate == "")
                jQuery.facebox.settings.prevTemplate = 'prev';
            if (jQuery.facebox.settings.startTemplate == "")
                jQuery.facebox.settings.startTemplate = 'start';
            if (jQuery.facebox.settings.stopTemplate == "")
                jQuery.facebox.settings.stopTemplate = 'stop';
            if (jQuery.facebox.settings.nextTemplate == "")
                jQuery.facebox.settings.nextTemplate = 'next';
            jQuery('#faceboxprev').empty().append(jQuery.facebox.settings.prevTemplate);
            jQuery('#faceboxstart').empty().append(jQuery.facebox.settings.startTemplate);
            jQuery('#faceboxstop').empty().append(jQuery.facebox.settings.stopTemplate);
            jQuery('#faceboxnext').empty().append(jQuery.facebox.settings.nextTemplate);

            jQuery('#facebox .body').children()
                                .hide()
                                .end()
                                .append('<div class="loading"><img src="' + jQuery.facebox.settings.loadingImage + '"/></div>');

            var t;
            var l;

            if (jQuery.facebox.settings.top == 0)
                t = getPageScroll()[1] + (getPageHeight() / 10);

            else
                t = jQuery.facebox.settings.top;

            if (jQuery.facebox.settings.left == 0)
                l = 385.5;
            else
                l = jQuery.facebox.settings.left;
           
            jQuery('#facebox').css({
                top: t,
                left: l
            }).show();

            jQuery(document).bind('keydown.facebox', function(e) {
                if (e.keyCode == 27) jQuery.facebox.close();
                return true;
            });
            jQuery(document).trigger('loading.facebox');
        },

        reveal: function(data, klass) {
            jQuery(document).trigger('beforeReveal.facebox');
            if (klass) jQuery('#facebox .content').addClass(klass);
            jQuery('#facebox .content').html(data);
            jQuery('#facebox .loading').remove();
            //淡入
            jQuery('#facebox .body').children().fadeIn(jQuery.facebox.settings.fadeToDuration);
            //透明度
            jQuery('#facebox #faceboxcontent').fadeTo(jQuery.facebox.settings.fadeToDuration, 1.0);

            //jQuery('#facebox').css('left', jQuery(window).width() / 2 - (jQuery('#facebox table').width() / 2));
            var l;
            if (jQuery.facebox.settings.left == 0)
                l = jQuery(window).width() / 2 - (jQuery('#facebox table').width() / 2);
            else
                l = jQuery.facebox.settings.left;
            jQuery('#facebox').css('left', l);
            jQuery(document).trigger('reveal.facebox').trigger('afterReveal.facebox');
        },

        close: function() {
            jQuery(document).trigger('close.facebox');
            return false;
        }
    });

    /*
    * Public, jQuery.fn methods
    */

    //第一步：初始化，维护一个对象保存上一个显示，和下一个显示
    var timeoutid = null;
    jQuery.fn.facebox = function(settings) {
        init(settings);

        var allfaceboxs = [];
        this.each(function(i) {
            allfaceboxs.push(this);
        });
        var pager = function() {
            this.now = null;
            this.count = null;
        };
        /*转移到分组中*/
        var mypager; //= new pager();
        //显示当前页
        function fillcategory(pager, categoryfaceboxs) {

            //更改索引最大最小控制方式
            if (pager.now == -1) {
                pager.now = pager.count - 1;
            }
            if (pager.now == pager.count) {
                pager.now = 0;
            }
            var index = parseInt(pager.now);
            //请等待图像
            if (jQuery('#facebox .loading').length == 0) {
                jQuery('#facebox .body').children()
                                    .end()
                                    .append('<div class="loading"><img src="' + jQuery.facebox.settings.loadingImage + '"/></div>')
                                    .find('.loading')
                                    .css({ 'position': 'absolute', 'left': '45%', 'top': '40%' });
            }
            //淡出效果
            jQuery('#facebox #faceboxcontent').fadeTo(jQuery.facebox.settings.fadeToDuration, jQuery.facebox.settings.fadeToOpacity, function() {

                //当前索引；
                var indexlabel;
                if (jQuery.facebox.settings.indexTemplate.match(/{index}/)) {
                    indexlabel = jQuery.facebox.settings.indexTemplate.replace(/{index}/, index + 1);
                }
                else {
                    indexlabel = index + 1 + ' of ';
                }
                jQuery('#faceboxcurrent').html(indexlabel);
                //总数；
                var alllabel;
                if (jQuery.facebox.settings.allTemplate.match(/{all}/)) {
                    alllabel = jQuery.facebox.settings.allTemplate.replace(/{all}/, categoryfaceboxs.length);
                } else {
                    alllabel = categoryfaceboxs.length;
                }
                jQuery('#faceboxallcount').html(alllabel);
                //标题；
                jQuery('#faceboxtitle').html(categoryfaceboxs[index].title);

                if (categoryfaceboxs.length <= 1) {
                    jQuery('.faceboxpager').hide();
                    jQuery('#faceboxcurrent').hide();
                    jQuery('#faceboxallcount').hide();
                } else {
                    jQuery('.faceboxpager').show();
                    jQuery('#faceboxcurrent').show();
                    jQuery('#faceboxallcount').show();
                };
                // support for rel="facebox.inline_popup" syntax, to add a class
                // also supports deprecated "facebox[.inline_popup]" syntax
                var klass = categoryfaceboxs[index].rel.match(/facebox\[?\.(\w+)\]?/);
                if (klass) klass = klass[1];
                fillFaceboxFromHref(categoryfaceboxs[index].href, klass);
            });

        };
        function clickHandler() {

            jQuery.facebox.loading(true);
            mypager = new pager();
            var categoryfaceboxs = [];
            /*根据name参数分类，如果没有设置name参数，当前元素算一个分组*/
            var rg = /name=\[?(\w+)\]?/;
            var name = this.rel.match(rg);
            if (name == null) {
                categoryfaceboxs.push(this);
            }
            else {
                for (var i = 0, length = allfaceboxs.length; i < length; i++) {
                    var myname = allfaceboxs[i].rel.match(rg);
                    if (myname != null) {
                        if (myname[1] == name[1]) {
                            categoryfaceboxs.push(allfaceboxs[i]);
                        }
                    }
                }
            }
            /*当前点击元素处于分类中的位置*/
            var myindex;
            for (var j = 0, length = categoryfaceboxs.length; j < length; j++) {
                if (categoryfaceboxs[j].href == this.href) {
                    myindex = j;
                }
            }
            mypager.count = categoryfaceboxs.length;
            mypager.now = myindex;

            fillcategory(mypager, categoryfaceboxs);
            jQuery('#faceboxstop').hide();
            jQuery('#faceboxstart').show();

            //下一篇
            var nextclick = function() {
                mypager.now = mypager.now + 1;
                fillcategory(mypager, categoryfaceboxs);

                jQuery('#faceboxstop').click();
            };
            jQuery('#faceboxnext').unbind('click').click(nextclick);
            //上一篇
            var prevclick = function() {
                mypager.now = mypager.now - 1;
                fillcategory(mypager, categoryfaceboxs);

                jQuery('#faceboxstop').click();
            };
            jQuery('#faceboxprev').unbind('click').click(prevclick);
            //开始播放
            var startclick = function() {
                if (timeoutid != null)
                    clearTimeout(timeoutid);
                mypager.now = mypager.now + 1;
                fillcategory(mypager, categoryfaceboxs);

                try {
                    timeoutid = setTimeout(startclick, jQuery.facebox.settings.delay);
                } catch (e) {
                    alert(e);
                }
                jQuery('#faceboxstart').hide();
                jQuery('#faceboxstop').show();
            };
            jQuery('#faceboxstart').unbind('click').click(startclick);

            //停止播放
            var stopclick = function() {
                jQuery('#faceboxstop').hide();
                jQuery('#faceboxstart').show();
                clearTimeout(timeoutid);
            };
            jQuery('#faceboxstop').unbind('click').click(stopclick);

            //鼠标导航
            if (jQuery.facebox.settings.showContentNavigation && mypager.count > 1) {
                var mousemove = function(e) {
                    var myself = jQuery(this);

                    var mywidth = myself.width();
                    var pagewidth = jQuery('body').width();
                    var pagex = e.pageX;
                    //鼠标在照片的右侧
                    var ifright = (pagex - (pagewidth - mywidth) / 2) > (mywidth / 2);
                    if (ifright) {
                        jQuery('#flyprev').remove();
                        if (jQuery('#flynext').length == 0) {
                            jQuery('#faceboxcontent').append('<a id=flynext></a>')
                                .find('#flynext')
                                .empty()
                                .append(jQuery.facebox.settings.contentNextTemplate)
                                .css({ 'position': 'absolute', 'top': '40%', 'right': '10px', 'cursor': 'pointer' })
                                .click(nextclick);
                        }
                        if (myself.height() < 30) {
                            jQuery('#flynext').css('top', '25px');
                        }
                    } else {//鼠标在照片的左侧
                        jQuery('#flynext').remove();
                        if (jQuery('#flyprev').length == 0) {
                            jQuery('#faceboxcontent').append('<a id=flyprev ></a>')
                                .find('#flyprev')
                                .empty()
                                .append(jQuery.facebox.settings.contentPrevTemplate)
                                .css({ 'position': 'absolute', 'top': '40%', 'left': '10px', 'cursor': 'pointer' })
                                .click(prevclick);
                        }
                        if (myself.height() < 30) {
                            jQuery('#flyprev').css('top', '25px');
                        }
                    }
                    return false;
                };

                var bodymouseover = function() {
                    jQuery('#flynext').remove();
                    jQuery('#flyprev').remove();
                };

                jQuery(document.body).mousemove(bodymouseover);
                jQuery('#faceboxcontent').mousemove(mousemove);
            } else {
                jQuery(document.body).unbind('mousemove');
                jQuery('#faceboxcontent').unbind('mousemove');
            };
            return false;
        };
        return this.click(clickHandler);
    };

    /*
    * Private methods
    */

    // called one time to setup facebox on this page
    function init(settings) {


        if (jQuery.facebox.settings.inited) return true;
        else jQuery.facebox.settings.inited = true;

        jQuery(document).trigger('init.facebox');
        makeCompatible();

        var imageTypes = jQuery.facebox.settings.imageTypes.join('|');
        jQuery.facebox.settings.imageTypesRegexp = new RegExp('\.' + imageTypes + 'jQuery', 'i');

        if (settings) jQuery.extend(jQuery.facebox.settings, settings);
        jQuery('body').append(jQuery.facebox.settings.faceboxHtml);

        var preload = [new Image(), new Image()];
        preload[0].src = jQuery.facebox.settings.closeImage;
        preload[1].src = jQuery.facebox.settings.loadingImage;

        jQuery('#facebox').find('.b:first, .bl, .br, .tl, .tr').each(function() {
            preload.push(new Image());
            preload.slice(-1).src = jQuery(this).css('background-image').replace(/url\((.+)\)/, 'jQuery1');
        });

        jQuery('#facebox .close').click(jQuery.facebox.close);
        jQuery('#facebox .close_image').attr('src', jQuery.facebox.settings.closeImage);
    }

    // getPageScroll() by quirksmode.com
    function getPageScroll() {
        var xScroll, yScroll;
        if (self.pageYOffset) {
            yScroll = self.pageYOffset;
            xScroll = self.pageXOffset;
        } else if (document.documentElement && document.documentElement.scrollTop) {	 // Explorer 6 Strict
            yScroll = document.documentElement.scrollTop;
            xScroll = document.documentElement.scrollLeft;
        } else if (document.body) {// all other Explorers
            yScroll = document.body.scrollTop;
            xScroll = document.body.scrollLeft;
        }
        return new Array(xScroll, yScroll);
    }

    // Adapted from getPageSize() by quirksmode.com
    function getPageHeight() {
        var windowHeight;
        if (self.innerHeight) {	// all except Explorer
            windowHeight = self.innerHeight;
        } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
            windowHeight = document.documentElement.clientHeight;
        } else if (document.body) { // other Explorers
            windowHeight = document.body.clientHeight;
        }
        return windowHeight;
    }

    // Backwards compatibility
    function makeCompatible() {
        var jQuerys = jQuery.facebox.settings;

        jQuerys.loadingImage = jQuerys.loading_image || jQuerys.loadingImage;
        jQuerys.closeImage = jQuerys.close_image || jQuerys.closeImage;
        jQuerys.imageTypes = jQuerys.image_types || jQuerys.imageTypes;
        jQuerys.faceboxHtml = jQuerys.facebox_html || jQuerys.faceboxHtml;
    }

    // Figures out what you want to display and displays it
    // formats are:
    //     div: #id
    //   image: blah.extension
    //    ajax: anything else
    function fillFaceboxFromHref(href, klass) {
        // div
        if (href.match(/@/)) {
            var url = href.split('@')[0];

            var target = jQuery.facebox.settings.contenturl + href.replace(url, '').replace('@', '');

            fillFaceboxFromAjax(target, klass);
            // image
        } else if (href.match(/#/)) {
            var url = window.location.href.split('#')[0];
            var target = href.replace(url, '').replace('#', '');
            jQuery.facebox.reveal(jQuery(target).clone().show(), klass)
        } else if (href.match(jQuery.facebox.settings.imageTypesRegexp)) {
            fillFaceboxFromImage(href, klass);
            // ajax
        } else {
            fillFaceboxFromAjax(href, klass);
        }
    }

    function fillFaceboxFromImage(href, klass) {
        var image = new Image();
        image.onload = function() {
            jQuery.facebox.reveal('<div class="image"><img src="' + image.src + '" /></div>', klass);
        };
        image.src = href;
    }

    function fillFaceboxFromAjax(href, klass) {
        jQuery.get(href, function(data) { jQuery.facebox.reveal(data, klass) });
    }

    function skipOverlay() {
        return jQuery.facebox.settings.overlay == false || jQuery.facebox.settings.opacity === null;
    }

    function showOverlay() {
        if (skipOverlay()) return;

        if (jQuery('facebox_overlay').length == 0)
            jQuery("body").append('<div id="facebox_overlay" class="facebox_hide"></div>');

        jQuery('#facebox_overlay').hide().addClass("facebox_overlayBG")
      .css('opacity', jQuery.facebox.settings.opacity)
      .click(function() { jQuery(document).trigger('close.facebox') })
      .fadeIn(200);
        return false;
    }

    function hideOverlay() {
        if (skipOverlay()) return;

        jQuery('#facebox_overlay').fadeOut(200, function() {
            jQuery("#facebox_overlay").removeClass("facebox_overlayBG");
            jQuery("#facebox_overlay").addClass("facebox_hide");
            jQuery("#facebox_overlay").remove();
        });

        return false;
    }

    /*
    * Bindings
    */

    jQuery(document).bind('close.facebox', function() {
        clearTimeout(timeoutid);
        jQuery(document).unbind('keydown.facebox');
        jQuery('#facebox').fadeOut(function() {
            jQuery('#facebox .content').removeClass().addClass('content');
            jQuery('#facebox .content').empty();
            hideOverlay();
            jQuery('#facebox .loading').remove();
        });
    });

})(jQuery);



function showOverlay(src) {

    if (jQuery('facebox_overlay').length == 0)
        jQuery("body").append('<div id="facebox_overlay" class="facebox_hide" ><img src="' + src + '"  /></div>');

    jQuery('#facebox_overlay').hide().addClass("facebox_overlayBG")
      .css('opacity', jQuery.facebox.settings.opacity)
      .click(function() { })
      .fadeIn(200);
    return false;
}

function hideOverlay() {

//    jQuery('#facebox_overlay').fadeOut(200, function() {
//        jQuery("#facebox_overlay").removeClass("facebox_overlayBG");
//        jQuery("#facebox_overlay").addClass("facebox_hide");
//        jQuery("#facebox_overlay").remove();
//    });

    return false;
}

