﻿/*
 * dkbox - jQuery plugin for loading and showing window overlay
 *
 * Copyright (c) 2008 Gerald Buchgraber
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 */

/* =========================================================

// jquery.dkbox.js

// Datum:   2008-06-04
// Firma:   Datenkraft IT-Consulting
// Author:  Gerald Buchgraber
// Mail:    gerald.buchgraber@datenkraft.com
// Web:     http://www.datenkraft.com
// Version: 0.5

// Demo usage

	$(function() {
		$('div#links a').dkbox(); //href parameter will be used
		$('div#moreLinks a').dkbox({url:'source.php', animation:'fade'});
		$('a.metanav').dkbox(animationSpeed:'fast'});
	});
	
	// or use class: 'dkbox' -> no additional onload is necessary
	// (@see options via metadata plugin -> changelog)

// Options:

	  OPTION            		POSSIBLE VALUES
	---------------------------------------------------------------------------------
	- url				:		string (url to load from, @see JQuery $.load function parameter url)
								e.g. 'contact.php' or '/Main_Page #p-Getting-Started li'
								( keep in mind: "same-domain" restriction for ajax calls! )
	
	- animation			:		'slide' (default) ... slides the window down/up
								'fade'            ... fades the window in/out
								null || false     ... just shows/hides the window
								
	- animationSpeed	:		'slow', 'normal', 'fast' or
								number of milliseconds to run the animation e.g. 1000
								(not for animation: null || false)
	---------------------------------------------------------------------------------

// Changelog
   
	v0.3:
		- Support for METADATA (@see http://plugins.jquery.com/project/metadata )
		  e.g: <span class="dkbox {url:'c.htm'} anotherclass">META</span>
		                      ^ auto loader of dkbox + options via metadata in class attribute
		  !!! metadata plugin itself is not necessary (-> built in functinality )

	v0.4:
		- scroll bug fixed
		
	v0.5:
		- moved dkbox-object-functions to dkbox-functions
		  functions moved:
			- extendDefaults
			- showOverlay
			- hideOverlay
			- show
			- remove (renamed to hide)
			- animateShow
			- animateHide
			- getScroll
			- getMetaData
		- can now be called form extern via e.g.: $.dkbox.showOverlay();
		  (without need for dom selection)

// ========================================================= */


(function($) {
	
	$.dkbox = {
		defaults:  {
			url : null,
			animation : 'slide',
			animationSpeed : 'slow',
			modal: false
		},
		extendDefaults: function(options) {
			return $.extend({}, $.dkbox.defaults, options);
		},
		showOverlay: function(options) {
			var opts = $.dkbox.extendDefaults(options);
			if (typeof(document.body.style.maxHeight) === 'undefined') { /*if IE 6*/
				$('body', 'html').css({height: '100%', width: '100%'});
				//$('html').css('overflow', 'hidden');
				/*iframe to hide select elements in ie6*/
				if ($('#dkbox_overlay')) {
					$('body').append('<iframe id="dkbox_HideSelect"></iframe><div id="dkbox_overlay"></div>');
				}
			}
			if ($('div#dkbox_overlay')) {
				$('body').append('<div id="dkbox_overlay"></div>');
			}
			if (!opts.modal) {
				$('#dkbox_overlay').click(function() {
					return $.dkbox.hide(opts);
				});
			}
			$('#dkbox_overlay').addClass('dkbox_overlayBG');
		},
		hideOverlay: function() {
			$('#dkbox_overlay').fadeOut('fast', function() {
				$.dkbox.hideLoading();
				$('#dkbox_overlay, #dkbox_HideSelect').trigger('unload').unbind().remove();
				if (typeof(document.body.style.maxHeight) === 'undefined') {/* if IE 6 */
					$('body', 'html').css({height: 'auto', width: 'auto'});
					//$('html').css('overflow','');
				}
			});
		},
		show: function(url, options) {
			if (typeof(options) === 'undefined') {
				options = $.dkbox.extendDefaults(options);
			}
			$.dkbox.showOverlay(options);
			$.dkbox.showLoading(options);
			
			if ($('div#dkbox_window')) {
				$('body').append('<div id="dkbox_window" style="display:none"></div>');
			}
			if (url) {
				$('#dkbox_window').load(url, function(data) {
	            	$('#dkbox_window .dkbox-hide').click(function() {
						return $.dkbox.hide(options);
					});
					/* position */
					var scr = $.dkbox.getScroll();
	            	$('#dkbox_window').css({'top':scr.y+'px','margin-left':-parseInt($('#dkbox_window').width())/2});
					$.dkbox.hideLoading(options);
	            	$.dkbox.animateShow(options);
	            });
			}
	
	    },
	    hide: function(options) {
	    	var opts = $.dkbox.extendDefaults(options);
	    	$('#dkbox_load').remove();
	    	$.dkbox.animateHide(opts, $.dkbox.hideOverlay);
			return false;
	    },
	    animateShow: function(options, callback) {
	    	var opts = $.dkbox.extendDefaults(options);
	    	var $win = $('#dkbox_window');
	    	if ($win) {
				if (opts.animation == 'slide') {
					return $win.slideDown(opts.animationSpeed, callback);
				} else if (opts.animation == 'fade') {
					return $win.fadeIn(opts.animationSpeed, callback);
				}
				$win.show();
	    	}
			if ($.isFunction(callback)) {
				callback();
			}
	    },
	    animateHide: function(options, callback) {
	    	var opts = $.dkbox.extendDefaults(options);
	    	var $win = $('#dkbox_window');
	    	if ($win) {
				if (opts.animation == 'slide') {
					return $win.slideUp(opts.animationSpeed, callback);
				} else if (opts.animation == 'fade') {
					return $win.fadeOut(opts.animationSpeed, callback);
				}
				$win.hide();
	    	}
			if ($.isFunction(callback)) {
				callback();
			}
	    },
	    showLoading: function(options) {
	    	var opts = $.dkbox.extendDefaults(options);
	    	if ($('div#dkbox_load')) {
				$('body').append('<div id="dkbox_load" style="display:none;"><span></span></div>');
	    	}
			$('#dkbox_load').show();
	    },
	    hideLoading: function(options) {
	    	var opts = $.dkbox.extendDefaults(options);
	    	$('#dkbox_load').hide();
	    },
	    getScroll: function() {
			var scrOfX = 0, scrOfY = 0;
			if( typeof( window.pageYOffset ) == 'number' ) {
				/* Netscape compliant */
				scrOfY = window.pageYOffset;
				scrOfX = window.pageXOffset;
			} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
				/* DOM compliant */
				scrOfY = document.body.scrollTop;
				scrOfX = document.body.scrollLeft;
			} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
				/* IE6 standards compliant mode */
				scrOfY = document.documentElement.scrollTop;
				scrOfX = document.documentElement.scrollLeft;
			}
			return {x:scrOfX, y:scrOfY};
		},
		getMetaData: function(elem) {
			/* inspired by the metadata plugin, @see http://plugins.jquery.com/project/metadata */
			var metaData = /({.*})/.exec( $(elem).attr('class') );
			if (metaData) {
				var data = metaData[1];
				if ( data.indexOf( '{' ) < 0 ) {
					data = '{' + data + '}';
				}
				return eval('(' + data + ')');
			}
			return null;
		}
	}
	
	
	//----------------------------------------------------------
	// DKBOX - Object function(s) from here
	//----------------------------------------------------------
	
    $.fn.dkbox = function(options) {
    	var opts = $.dkbox.extendDefaults(options);
        return this.each(function() {
        	var $this = $(this);
        	var metaData = $.dkbox.getMetaData($this);
			var o = metaData ? $.extend({}, opts, metaData) : opts;
			var url = o.url || this.href;
			if (url) {
				$(this).click(function() {
					$.dkbox.show(url, o);
					return false;
				}).css('cursor', 'pointer');
			}
        });
    };
    
	//----------------------------------------------------------
	// On Load hook
	//----------------------------------------------------------
    
    /* dkbox onload */
    $(function() {
		$('.dkbox').dkbox();
	});
	
	
	
	//----------------------------------------------------------
	// Helper
	//----------------------------------------------------------
	
	function log(data) {
		if (typeof(console) !== 'undefined') {
			console.log(data);
		} else {
			alert(data);
		}
	}
	
})(jQuery);