123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- /*
- * Facebox (for jQuery)
- * version: 1.3
- * @requires jQuery v1.2 or later
- * @homepage https://github.com/defunkt/facebox
- *
- * Licensed under the MIT:
- * http://www.opensource.org/licenses/mit-license.php
- *
- * Copyright Forever Chris Wanstrath, Kyle Neath
- *
- * 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')
- * jQuery.facebox('some html', 'my-groovy-style')
- *
- * The above will open a facebox with "some html" as the content.
- *
- * jQuery.facebox(function($) {
- * $.get('blah.html', function(data) { $.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, an image, or the contents of a div:
- *
- * jQuery.facebox({ ajax: 'remote.html' })
- * jQuery.facebox({ ajax: 'remote.html' }, 'my-groovy-style')
- * jQuery.facebox({ image: 'stairs.jpg' })
- * jQuery.facebox({ image: 'stairs.jpg' }, 'my-groovy-style')
- * jQuery.facebox({ div: '#box' })
- * jQuery.facebox({ div: '#box' }, 'my-groovy-style')
- *
- * 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
- * afterClose.facebox
- *
- * Simply bind a function to any of these hooks:
- *
- * $(document).bind('reveal.facebox', function() { ...stuff to do after the facebox and contents are revealed... })
- *
- */
- (function($) {
- $.facebox = function(data, klass) {
- $.facebox.loading()
- if (data.ajax) fillFaceboxFromAjax(data.ajax, klass)
- else if (data.image) fillFaceboxFromImage(data.image, klass)
- else if (data.div) fillFaceboxFromHref(data.div, klass)
- else if ($.isFunction(data)) data.call($)
- else $.facebox.reveal(data, klass)
- }
- /*
- * Public, $.facebox methods
- */
- $.extend($.facebox, {
- settings: {
- opacity : 0.2,
- overlay : true,
- loadingImage : '/facebox/loading.gif',
- closeImage : '/facebox/closelabel.png',
- imageTypes : [ 'png', 'jpg', 'jpeg', 'gif' ],
- faceboxHtml : '\
- <div id="facebox" style="display:none;"> \
- <div class="popup"> \
- <div class="content"> \
- </div> \
- <a href="#" class="close"></a> \
- </div> \
- </div>'
- },
- loading: function() {
- init()
- if ($('#facebox .loading').length == 1) return true
- showOverlay()
- $('#facebox .content').empty().
- append('<div class="loading"><img src="'+$.facebox.settings.loadingImage+'"/></div>')
- $('#facebox').show().css({
- top: getPageScroll()[1] + (getPageHeight() / 10),
- left: $(window).width() / 2 - ($('#facebox .popup').outerWidth() / 2)
- })
- $(document).bind('keydown.facebox', function(e) {
- if (e.keyCode == 27) $.facebox.close()
- return true
- })
- $(document).trigger('loading.facebox')
- },
- reveal: function(data, klass) {
- $(document).trigger('beforeReveal.facebox')
- if (klass) $('#facebox .content').addClass(klass)
- $('#facebox .content').empty().append(data)
- $('#facebox .popup').children().fadeIn('normal')
- $('#facebox').css('left', $(window).width() / 2 - ($('#facebox .popup').outerWidth() / 2))
- $(document).trigger('reveal.facebox').trigger('afterReveal.facebox')
- },
- close: function() {
- $(document).trigger('close.facebox')
- return false
- }
- })
- /*
- * Public, $.fn methods
- */
- $.fn.facebox = function(settings) {
- if ($(this).length == 0) return
- init(settings)
- function clickHandler() {
- $.facebox.loading(true)
- // support for rel="facebox.inline_popup" syntax, to add a class
- // also supports deprecated "facebox[.inline_popup]" syntax
- var klass = this.rel.match(/facebox\[?\.(\w+)\]?/)
- if (klass) klass = klass[1]
- fillFaceboxFromHref(this.href, klass)
- return false
- }
- return this.bind('click.facebox', clickHandler)
- }
- /*
- * Private methods
- */
- // called one time to setup facebox on this page
- function init(settings) {
- if ($.facebox.settings.inited) return true
- else $.facebox.settings.inited = true
- $(document).trigger('init.facebox')
- makeCompatible()
- var imageTypes = $.facebox.settings.imageTypes.join('|')
- $.facebox.settings.imageTypesRegexp = new RegExp('\\.(' + imageTypes + ')(\\?.*)?$', 'i')
- if (settings) $.extend($.facebox.settings, settings)
- $('body').append($.facebox.settings.faceboxHtml)
- var preload = [ new Image(), new Image() ]
- preload[0].src = $.facebox.settings.closeImage
- preload[1].src = $.facebox.settings.loadingImage
- $('#facebox').find('.b:first, .bl').each(function() {
- preload.push(new Image())
- preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1')
- })
- $('#facebox .close')
- .click($.facebox.close)
- .append('<img src="'
- + $.facebox.settings.closeImage
- + '" class="close_image" title="close">')
- }
- // 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 $s = $.facebox.settings
- $s.loadingImage = $s.loading_image || $s.loadingImage
- $s.closeImage = $s.close_image || $s.closeImage
- $s.imageTypes = $s.image_types || $s.imageTypes
- $s.faceboxHtml = $s.facebox_html || $s.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 = window.location.href.split('#')[0]
- var target = href.replace(url,'')
- if (target == '#') return
- $.facebox.reveal($(target).html(), klass)
- // image
- } else if (href.match($.facebox.settings.imageTypesRegexp)) {
- fillFaceboxFromImage(href, klass)
- // ajax
- } else {
- fillFaceboxFromAjax(href, klass)
- }
- }
- function fillFaceboxFromImage(href, klass) {
- var image = new Image()
- image.onload = function() {
- $.facebox.reveal('<div class="image"><img src="' + image.src + '" /></div>', klass)
- }
- image.src = href
- }
- function fillFaceboxFromAjax(href, klass) {
- $.get(href, function(data) { $.facebox.reveal(data, klass) })
- }
- function skipOverlay() {
- return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null
- }
- function showOverlay() {
- if (skipOverlay()) return
- if ($('#facebox_overlay').length == 0)
- $("body").append('<div id="facebox_overlay" class="facebox_hide"></div>')
- $('#facebox_overlay').hide().addClass("facebox_overlayBG")
- .css('opacity', $.facebox.settings.opacity)
- .click(function() { $(document).trigger('close.facebox') })
- .fadeIn(200)
- return false
- }
- function hideOverlay() {
- if (skipOverlay()) return
- $('#facebox_overlay').fadeOut(200, function(){
- $("#facebox_overlay").removeClass("facebox_overlayBG")
- $("#facebox_overlay").addClass("facebox_hide")
- $("#facebox_overlay").remove()
- })
- return false
- }
- /*
- * Bindings
- */
- $(document).bind('close.facebox', function() {
- $(document).unbind('keydown.facebox')
- $('#facebox').fadeOut(function() {
- $('#facebox .content').removeClass().addClass('content')
- $('#facebox .loading').remove()
- $(document).trigger('afterClose.facebox')
- })
- hideOverlay()
- })
- })(jQuery);
|