/*
 * 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($) { 
 *      $.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 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:
 *
 *   $(document).bind('reveal.facebox', function() { ...stuff to do after the facebox and contents are revealed... })
 *
 */
(function($) {
  $.facebox = function(id, data, klass, frameWidth, frameHeight, elementForWidth) {
    $.facebox.loading(id);
    if (data.ajax) fillFaceboxFromAjax(id, data.ajax);
    else if (data.image) fillFaceboxFromImage(id, data.image);
    else if (data.div) fillFaceboxFromHref(id, data.div);
    else if (data.iframe) fillFaceboxFromIFrame(id, data.iframe, klass, frameWidth, frameHeight, elementForWidth);
    else if ($.isFunction(data)) data.call($);
    else $.facebox.reveal(id, data, klass);
	if (jQuery.fn.pngFix) $(document).pngFix();
  }

  /*
   * Public, $.facebox methods
   */

  $.extend($.facebox, {
    settings: {
      id           : 'facebox',
      opacity      : 0.7,
      overlay      : 1,
      loadingImage : 'loading.gif',
      closeImage   : 'closelabel.gif',
      useClone     : true,
      imageTypes   : [ 'png', 'jpg', 'jpeg', 'gif' ],
      faceboxHtml  : '<div>testing.....</div>'
    },

    loading: function(id) {
      $.facebox.settings.inited = false;

      init(id)
      if ($('#' + id + ' .loading').length == 1) return true
      showOverlay(id)

      $('#' + id + ' .facebox-content').empty()
      $('#' + id + ' .body').children().hide().end().
        append('<div class="loading"><img src="'+$.facebox.settings.loadingImage+'"/></div>')


      $(document).bind('keydown.facebox', function(e) {
        if (e.keyCode == 27) $.facebox.close()
        return true
      })
	  
        $(window).resize(function(){
            $('#' + id).animate({
                //top:	($(window).height()-$('#' + id).height()) / 2+getPageScroll()[1],//getPageScroll()[1] + (getPageHeight() / 10),
                left:	($(window).width()-$('#' + id).width()) / 2,
                top: 5 +getPageScroll()[1]
            },50);
        });


        /*	  $(window).bind('resize', function(e) {
        $('#facebox').animate({
        top:	($(window).height()-$('#facebox').height()) / 2+getPageScroll()[1],//getPageScroll()[1] + (getPageHeight() / 10),
        left:	($(document).width()-$('#facebox').width()) / 2
        },50);
        return true
        })
        */
        $(window).scroll(function(){
            $('#' + id).css({
                //top:	($(window).height()-$('#' + id).height()) / 2+getPageScroll()[1],//getPageScroll()[1] + (getPageHeight() / 10),
                left:	($(window).width()-$('#' + id).width()) / 2,
                top: 5 +getPageScroll()[1]
            });//,30);
            return true
        })
        $(document).trigger('loading.facebox');
        //$(document).ready(function(){
        $('#' + id).css({
            //top:	($(window).height()-$('#' + id).height()) / 2+getPageScroll()[1],//getPageScroll()[1] + (getPageHeight() / 10),
            left:	($(window).width()-$('#' + id).width()) / 2,
            top: 5 +getPageScroll()[1]
        }).show()

        //});
        },

    reveal: function(id, data, klass) {
      $(document).trigger('beforeReveal.facebox')
      if (klass) $('#' + id + ' .facebox-content').addClass(klass)
      $('#' + id + ' .facebox-content').append(data)
      $('#' + id + ' .loading').remove()
      $('#' + id + ' .body').children().fadeIn('normal')
        $('#' + id + '').css({
          //top:	($(window).height()-$('#' + id).height()) / 2+getPageScroll()[1],//getPageScroll()[1] + (getPageHeight() / 10),
          left:	($(window).width()-$('#' + id).width()) / 2,
          top: 5 +getPageScroll()[1]
        })
        $(document).trigger('reveal.facebox').trigger('afterReveal.facebox')
    },

    close: function(id) {
      $.facebox.settings.id = id;
      $(document).trigger('close.facebox')
      if($.facebox.settings.useClone==false){
        $('#' + id + ' .facebox-content > *').appendTo('body').hide();
      }
      $('#' + id).remove()
      return false
    },


    resizeIFrame: function(id) {
        var MAX_HEIGHT = 500;

        //var IFrame = $('#' +id + "-frame");
        var IFrame = document.getElementById(id + "-frame");
        var height = 0;

        if (IFrame && document.all && !window.opera) {
            innerDoc = (IFrame.contentDocument) ? IFrame.contentDocument : IFrame.contentWindow.document;
            objToResize = (IFrame.style) ? IFrame.style : IFrame;
            height = innerDoc.body.scrollHeight + 20;
        } else if (IFrame && !window.opera) {
            IFrame.style.display = "block";
            if (IFrame.contentDocument && IFrame.contentDocument.body.offsetHeight) {
                height = IFrame.contentDocument.body.offsetHeight + 20;
            } else if (IFrame.Document && IFrame.Document.body.scrollHeight) {
                height = IFrame.Document.body.scrollHeight + 20;
            }
        }

        if (height > 0) {
            if (height > MAX_HEIGHT) {
                height = MAX_HEIGHT;
            }
            IFrame.style.height = height + "px";
        }
        return false;
    }



  })

  /*
   * Public, $.fn methods
   */

  $.fn.facebox = function(id, settings) {
    init(id, 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(id, this.href, klass)
      return false
    }

    return this.click(clickHandler)
  }

  /*
   * Private methods
   */

  // called one time to setup facebox on this page
  function init(id, settings) {
    if ($.facebox.settings.inited) return true
    else $.facebox.settings.inited = true

    $(document).trigger('init.facebox')

    $.facebox.settings.id = id;
    $.facebox.settings.faceboxHtml  = '\
    <div class="facebox" id="' + id + '" style="display:none;"> \
      <div class="popup"> \
        <table> \
          <tbody> \
            <tr> \
              <td class="body"> \
                <div class="facebox-content"> \
                </div> \
              </td> \
            </tr> \
          </tbody> \
        </table> \
      </div> \
    </div>';
    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

    $('#' + id).find('.b:first, .bl, .br, .tl, .tr').each(function() {
      preload.push(new Image())
      preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1')
    })

    $('#' + id + ' .close').click($.facebox.close)
    $('#' + id + ' .close_image').attr('src', $.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 $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(id, href, klass) {
    // div
    if (href.match(/#/)) {
      var url    = window.location.href.split('#')[0]
      var target = href.replace(url,'')
        if($.facebox.settings.useClone){
            $.facebox.reveal(id, $(target).clone().show(), klass);
        }else{
            $.facebox.reveal(id, $(target).show(), klass)
        }

    // image
    } else if (href.match($.facebox.settings.imageTypesRegexp)) {
      fillFaceboxFromImage(id, href, klass)
    // ajax
    } else {
      fillFaceboxFromAjax(id, href, klass)
    }
  }

  function fillFaceboxFromImage(id, href, klass) {
    var image = new Image()
    image.onload = function() {
      $.facebox.reveal(id, '<div class="image"><img src="' + image.src + '" /></div>', klass)
    }
    image.src = href
  }

  function fillFaceboxFromAjax(id, href, klass) {
    $.get(href, function(data) { $.facebox.reveal(id, data, klass) })
  }


  function fillFaceboxFromIFrame(id, href, klass, frameWidth, frameHeight, elementForWidth) {
    var MAX_WIDTH = 900;
    var MAX_HEIGHT = 500;

    var data = $('<iframe id="' + id + '-frame" src="' + href + '" width="100%" frameborder="0" scrolling="auto"/>');
    if (frameHeight === null) {
        frameHeight = 500;
    } else if (frameHeight > MAX_HEIGHT) {
        frameHeight = MAX_HEIGHT;
    }
    
    if (frameWidth === null) {
        frameWidth = 500;
    } else if (frameWidth > MAX_WIDTH) {
        frameWidth = MAX_WIDTH;
    }

    data.height(frameHeight);
    data.width(frameWidth);

    data.load(function () {

        var IFrame = this;

        // Start with the initial values and modify as required, this will ensure
        // that after either value is changed it goes back to default when popup is reloaded.
        $(this).height(frameHeight);
        $(this).width(frameWidth);

        var height = $(this).height();

        if (IFrame && document.all && !window.opera) {
            innerDoc = (IFrame.contentDocument) ? IFrame.contentDocument : IFrame.contentWindow.document;
            objToResize = (IFrame.style) ? IFrame.style : IFrame;
            height = innerDoc.body.scrollHeight + 20;
        } else if (IFrame && !window.opera) {
            IFrame.style.display = "block";
            if (IFrame.contentDocument && IFrame.contentDocument.body.offsetHeight) {
                height = IFrame.contentDocument.body.offsetHeight;
            } else if (IFrame.Document && IFrame.Document.body.scrollHeight) {
                height = IFrame.Document.body.scrollHeight;
            }

        }
        if (height < frameHeight) {
            $(this).height(height);
        }

    });

    $.facebox.reveal(id, data, klass);

  }



  function skipOverlay() {
    return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null; 
  }

  function showOverlay(id) {

    if (skipOverlay()) return; 	
    if ($(id + '_overlay').length == 0) $("body").append('<div id="' + id + '_overlay" class="facebox_hide facebox_overlay"></div>');
   	$('#' + id + '_overlay').addClass("facebox_overlayBG");
	//$('#facebox_overlay').hide();
/*	$('#facebox_overlay').animate({ 
        opacity: $.facebox.settings.opacity
      }, 'fast' );*/
	$('#' + id + '_overlay').css('opacity',$.facebox.settings.opacity)
	//$('#facebox_overlay').fadeTo("fast", $.facebox.settings.opacity);

	//$('#facebox_overlay').click(function() { $(document).trigger('close.facebox') });
	//$('#facebox_overlay').fadeIn(200);

    return false;
  }

  function hideOverlay(id) {
    if (skipOverlay()) return;

    $('#' + id + '_overlay').fadeOut("fast", function(){
      $('#' + id + '_overlay').removeClass("facebox_overlayBG")
      $('#' + id + '_overlay').addClass("facebox_hide")
      $('#' + id + '_overlay').remove()
    })
    
    return false;
  }

  /*
   * Bindings
   */

  $(document).bind('close.facebox', function() {
    $(document).unbind('keydown.facebox')
    $('#' + $.facebox.settings.id).fadeOut(function() {
      $('#' + $.facebox.settings.id + ' .facebox-content').removeClass().addClass('facebox-content')
      hideOverlay($.facebox.settings.id)
      $('#' + $.facebox.settings.id + ' .loading').remove()
    })
  })

})(jQuery);

