/* JavaScript Document */

/**
 * Project:		RENN WENN DU KANNST
 * Purpose:		
 * 
 * @author:		<ap@okapi.de>
 * @version:	1.0
 * @date:		07/2010
 */


var APJ = function($){
	
/* ////// DEFINITION AND NAMING OF ALL RELEVANT ELEMENTS	*/

	var selectors = {
		
		containers : {
			modal	:	"#win-layer",
			overlay	:	"#bg-overlay"
		},
	
		btns : {
			btnShowModal	:	"#btn-aufkleber",		/* a#btn-aufkleber		*/
			btnCloseModal	:	"#btn-layer-close"		/* a#btn-layer-close	*/
		}
	};
	
	
	var classes = {
		
		offsite : "offsite"
	};
	
	
	var defaults = {
		
		bg_overlay : {
			color	: "#000000",
			opacity	: 0.6
		}
	};

	
	
/* ////// HELPER-FUNCTIONS	*/
	
	function getWindowParams(){
		
		var wInfo = {
			viewportW	: $(window).width(),
			viewportH	: $(window).height(),
			docScrollT	: $(document).scrollTop(),
			docScrollL	: $(document).scrollLeft(),
			pageW		: $(document).width(),
			pageH		: $(document).height()
		};
		
		return wInfo;
	};
	
	
	
	function initIEDetection(){
		
		if( $.browser.msie ) {
			
			$('body').addClass("msie");
		}	
	};
	
	
	
	function showOverlay(){
		
		// var html stuff
		var ovID			= selectors.containers.overlay,
			ovColor			= defaults.bg_overlay.color,
			ovOpacity		= defaults.bg_overlay.opacity,
			wInfo			= getWindowParams(),
			pageH			= wInfo.pageH,
			overlayHTML		= '<div id="' + ovID.substring(1) + '" style="height: ' + pageH + 'px;"></div>';	
		
		
		// inject html
		$('body').append( overlayHTML );
		
		// animate overlay
		$(ovID)
			.css({
				'background-color' : ovColor,
				'opacity' : 0
			})
			
			.animate({
				opacity : [ovOpacity, 'easeInOutQuad']			
			}, 400);
	};
	
	
	
	function hideOverlay(){
		
		var $ov_selector = $(selectors.containers.overlay);
		
		// animate overlay
		$ov_selector
			.animate({
				opacity : [0, 'easeInOutQuad']			
			}, 200,
			
			function() {
			 // Execute after Animation is completed.
			 $(this).remove();
		 });
	};
	
	
	
	function ctrlOverlay(){
		
		var $ov_selector = $(selectors.containers.overlay);
		
		// if modal is already visble
		if( $ov_selector.length ){
			
			hideOverlay();
		}
		
		else {
			showOverlay();
		}	
	};
	
	
	
	function showModal(){
		
		var $modal 			= $(selectors.containers.modal),
			class_offsite	= classes.offsite;
		
		// show modal window
		$modal.removeClass(class_offsite);
		
		// if browser is ie
		if( $('body').hasClass('msie') ){
			
			// wait for animation to complete
			var wait = setInterval(function() {
				if( !$(selectors.containers.overlay).is(":animated") ) {
					clearInterval(wait);
					
					// and do when animation has finished
					$modal.show();
				}
			}, 700);
		}
		// if browser is not ie
		else {
			$modal.delay(700).fadeIn();
		}
	};
	
	
	
	function hideModal(){
		
		var $modal 			= $(selectors.containers.modal),
			class_offsite	= classes.offsite;
		
		$modal.hide();
		$modal.addClass(class_offsite);
	};
	
	
	
	function hideLayer( container ){
		
		$(container).hide();
	};
	
	


/* ////// EVENT-RELATED/PROCESSING FUNCTIONS	*/
	
	/* purpose:
	 *	removes default bevhavior of any given html-element (links, buttons, etc.)
	 *	jQuery substitute for: return false;
	 */
	function removeBubbles( selector ){
		
		var $selector = $(selector);
		
		if( $selector.length ){
				
			$selector.live("click", function(e){
				
				e.preventDefault();
			});
		}
	};
	
	
	function addLogicShowModal( btn_selector ){
		
		var $btn_selector = $(btn_selector);
		
		if( $btn_selector.length ){
			
			$btn_selector.live("click", function(e){
				
				ctrlOverlay();
				showModal();
			});
		}
	};
	
	
	function addLogicHideModal( btn_selector ){
		
		var $btn_selector = $(btn_selector);
		
		if( $btn_selector.length ){
			
			$btn_selector.live("click", function(e){
				
				hideModal();
				// evntl. zeitliche verzögerung für das ausblenden des overlays
				ctrlOverlay();
			});
		}
	};
	

	
	
/* ////// FUNCTIONS CONTROLLING THE INTIAL PAGE/EVENT SET-UP	*/
	
	function removeBtnBubbles( allBtns ){	
	
		for( var btn in allBtns ){
			
			removeBubbles( allBtns[btn] );
		}
	};	
	
	
	
	function addBtnLogic( allBtns ){
		/* DEFINE WHICH CONTROL-FUNCTION HAS TO PROCESS A DEFINED BUTTON-TYPE */
		for( var btn in allBtns ){
			
			var btn_selector = allBtns[btn];
			
			switch( btn_selector ){
				
				case selectors.btns.btnShowModal:
					
					addLogicShowModal( btn_selector );
					break;
				
				
				case selectors.btns.btnCloseModal:
					
					addLogicHideModal( btn_selector );
					break;
				
				
				default:
						
					break;
			}
		}
	};

	

	
/* ////// EXECUTE/ADD ALL FEATURES THAT NEED TO BE INITALIZED	*/

	function initPage(){
		
		initIEDetection();
		
		hideLayer( selectors.containers.modal );
		
		removeBtnBubbles( selectors.btns );
		
		addBtnLogic( selectors.btns );
	};
	
	


/* ////// RETURN/MAKE PUBLIC ALL FUNCTIONS/VARIABLES THAT MAY NEED TO BE ACCESSED FROM THE OUTSIDE	*/

	return {	
		// PUBLIC VARIABLES
		selectors			:	selectors,
		classes				:	classes,
		defaults			:	defaults,
		
		// PUBLIC FUNCTIONS
		initPage			:	initPage,
		removeBubbles		:	removeBubbles
	};
	
	
}(jQuery);




/**
 * AVOID CONFLICTS WITH ADDITIONAL FRAMEWORKS
 */
(function($){
	// DO THIS WHEN DOM IS READY
	$(document).ready( function () {
		APJ.initPage();
	});
})(jQuery);
