/* =========================================================

// jquery.fader.js

// Datum: 2009-03-10
// Author: Philip Floetotto
// Version: 1.0
// Mail: mmeier23@gmail.com
// Web: http://philipf.alphacomplex.org/showroom/

// based on the innerfade plugin by medienfreund.de
// Web: http://medienfreunde.com/lab/innerfade/

 *
 *  <ul id="news"> 
 *      <li>content 1</li>
 *      <li>content 2</li>
 *      <li>content 3</li>
 *  </ul>
 *  
 *  $('#news').fader({ 
 *	  animationtype: Type of animation 'fade' or 'slide' (Default: 'fade'), 
 *	  speed: Fading-/Sliding-Speed in milliseconds (Default: '600'), 
 *	  timeout: Time between the fades in milliseconds (Default: '2000'), 
 * 	  containerheight: Height of the containing element in any css-height-value (Default: 'auto'),
 *	  runningclass: CSS-Class which the container getâ€™s applied (Default: 'fader'),
 *	  previousButtonClass: CSS-Class of the previous Button. (Default: 'previousButton') Can be used to set other elements to control the fader,
 *	  nextButtonClass: CSS-Class of the next Button. (Default: 'nextButton'),
 *	  previousButtonText: text inside the previousButton (Default: '&nbsp;') Can be an image or HTML,
 *	  nextButtonText: text inside the nextButton (Default: '&nbsp;') Can be an image or HTML,
 *	  createButtons: true for false if you want the plugin to create navigation buttons (prev and next) automatically (Default: 'true'),
 *	  play: set to start or stop animation (Default: 'true'),
 *  }); 
 *

// ========================================================= */


(function($) {

    $.fn.fader = function(options) {
        return this.each(function() {   
            $.fader(this, options);
        });
    };
			
    $.fader = function(container, options) {
        var o = {
        	'animationType':    'fade',
            'speed':            600, // please use only numbers because of the jumpNav fade!! 600 is normal, 1200 is slow
            'type':             'sequence',
            'timeout':          2000,
            'containerHeight':  'auto',
            'runningclass':     'fader',
            'previousButtonClass':     'previousButton',
            'nextButtonClass':     'nextButton',
            'previousButtonText':     '',
            'nextButtonText':     '',
            'createButtons':     true,
            'play':     false
        };
        if (options)
            $.extend(o, options);
                            
        // checks
        if(isNaN(o.speed)){
        	alert('The speed settings needs to be in seconds, not a string');
        }
        
        // wrap nav and container
        var $container = $(container);
        if (!$container.parent().hasClass('fader-container')){
        	
        	var $faderNav = $("<div>")
        		$('#gallerynav')
    			.addClass('fader-nav')
    			.append($("<span>").addClass('fader-jumpNav'))
        //redundant    	.append($("<span>").addClass('fader-navButtons'));
            	
        	$container
				.wrap('<div></div>')
				.before($faderNav)
        		.parent()
        			.addClass('fader-container');
            	
        }
        
        $container.parent = $container.parent('.fader-container');
        $jumpNav = $('.fader-jumpNav'); /* ,$container.parent removed from brackets so jumpnav appears in gallerynav */
        
        // create Buttons
        if(o.createButtons){
        	$navButtons = $('#gallerynav'); /* ,$container.parent removed from brackets so navbuttons appear in gallerynav */
        	var $previousButton = $('<a>')
	    		.addClass(o.previousButtonClass)
	    		.addClass('histalert')
	    		.html("<img src='http://www.mews7.com/wp-content/themes/emptycanvas/images/arrowLeft.gif' alt='Previous Image' width='7' height='14'/>")
	    		.attr('title','next slide')
	    		.prependTo($navButtons);
        	var $nextButton = $('<a>')
        		.addClass(o.nextButtonClass)
        		.addClass('histalert')
        		.html("<img src='http://www.mews7.com/wp-content/themes/emptycanvas/images/arrowRight.gif' alt='Next Image' width='7' height='14'/>")
        		.attr('title','next slide')
        		.appendTo($navButtons);
        }else{
        	var $nextButton = $('.'+o.nextButtonClass);
        	var $previousButton = $('.'+o.previousButtonClass);
        }
         
        
        // hiding the elements and attaching the innerFade
        $container.o = o;
        $container.slides = [];
        $container.jumpNavAnchors = [];
        
        
        // set css properties for the elements
        var elements = $container.children();
        if (elements.length > 1) {
        	
        	$container
        		.css('position', 'relative')
        		.addClass($container.o.runningclass);
        	
            for (var i = 0; i < elements.length; i++) {
                
            	var anchor = $('<a>')
				            	.attr('id',"fader-jump-"+i.toString())
				            	.attr('style','FILTER: alpha(opacity=100); ZOOM: 1')
				            	.html('&#149;')
				            	.appendTo($jumpNav);
            	
            	
            	var element = $(elements[i])
			                	.css('z-index', String(elements.length-i))
			                	.css('position', 'absolute')
			                	.hide();
                
                // assigning slide to jumpnav and vice versa
            	element.slideNumber = i;
            	anchor.data('slide',element);
            	element.data('anchor',anchor);
                $container.slides.push(element);
                $container.jumpNavAnchors.push(anchor);
            };
            
            //get number of images
            
            var imgcount = $('#fader li').size() - 1;
            
            //check if hash content exists, is a number, is no greater than the number of images, is a positive number
                        
			if (window.location.hash && !isNaN(window.location.hash.replace(/\#/,'')) && window.location.hash.replace(/\#/,'') < imgcount &&window.location.hash.replace(/\#/,'') > -1){
			startat = (window.location.hash.replace(/\#/,''));
			}
			else
			{
			startat = 0;
			};
              
            startat = parseInt(startat);
            
            $container.currentSlide = $container.slides[startat];
            $container.nextSlide = $container.slides[startat + 1];
                      
            //define function to show title and caption
            function titlecap(){
            var imgtitle = '<h2>'+$container.currentSlide.find('img').attr('title')+'</h2>';
            var imgcaption = '<p>'+$container.currentSlide.find('img').attr('alt')+'</p>';
            if(!$container.currentSlide.find('img').attr('title')){var imgtitle = '<h2>&nbsp;</h2>';}
            if($container.currentSlide.find('img').attr('title') == 'blank'){var imgtitle = '<h2>&nbsp;</h2>';}
            if(!$container.currentSlide.find('img').attr('alt')){var imgcaption = '<p>&nbsp;</p>';}
            $('#description').html(imgtitle+imgcaption);
            }
            
            //define function for hash change
            function hashchange(){
            window.location = window.location.href.replace(/\#.*/,'') + '#' + startat;
            };
            
            // initialise the sequence
            $container.currentSlide.data('anchor').addClass('active');            
            $container.currentSlide.show();
            titlecap();
        	if(!$container.o.play){
            	hashchange();
            }
	        if($container.o.play){
	            $.fader.timedChange($container);
	        }
                                    
            // set the fader container height
            if($container.o.containerHeight=='auto')
            	$container.o.containerHeight = $container.slides[0].eq(0).get(0).clientHeight + $faderNav.eq(0).get(0).clientHeight;
            $container.parent.css({'height':$container.o.containerHeight});
            
                
		}

		//history function

        if(!$container.o.play){
		        $.historyInit(imgupdate);		//init history				
		};
        
		function imgupdate(hash){
				$container.nextSlide =	$container.slides[hash];
        		$.fader.forceChange($container);
        		titlecap();
		};
		        
        // attach events to jumpNav
        $.each($container.jumpNavAnchors,function(){
        	this.click(function(){
            	$container.nextSlide = $(this).data('slide');
            	$.fader.forceChange($container);
            });
        });       
        
        // attach events to prev and next
        $nextButton.click(function(){
        	if($container.currentSlide.slideNumber + 1 > ($container.slides.length-1)){
	        	$container.nextSlide =	$container.slides[0];
	        }else{
	        	$container.nextSlide = $container.slides[$container.currentSlide.slideNumber + 1];
	        }
        	$.fader.forceChange($container);
        	titlecap();
			if (startat + 1 > imgcount){startat = 0;}else{startat = (startat) + 1;}
        	hashchange();
        });
        
        $previousButton.click(function(){
        	if($container.currentSlide.slideNumber - 1 < 0){
	        	$container.nextSlide =	$container.slides[$container.slides.length -1];
	        }else{
	        	$container.nextSlide = $container.slides[$container.currentSlide.slideNumber - 1];
	        }
        	$.fader.forceChange($container);
        	titlecap();
		 	if (startat - 1 < 0){startat = imgcount;}else{startat = (startat) - 1;}
        	hashchange();
        });

		// same as above for arrowleft or right

        if(!$container.o.play){
				$(document).keydown(function(e){
				    if (e.keyCode == 39) { 
					        	if($container.currentSlide.slideNumber + 1 > ($container.slides.length-1)){
						        	$container.nextSlide =	$container.slides[0];
						        }else{
						        	$container.nextSlide = $container.slides[$container.currentSlide.slideNumber + 1];
						        }
					        	$.fader.forceChange($container);
					        	titlecap();
					        	if (startat + 1 > imgcount){startat = 0;}else{startat = (startat) + 1;}
					        	hashchange();
					}
				});
					
				$(document).keydown(function(e){
				    if (e.keyCode == 37) { 
					        	if($container.currentSlide.slideNumber - 1 < 0){
						        	$container.nextSlide =	$container.slides[$container.slides.length -1];
						        }else{
						        	$container.nextSlide = $container.slides[$container.currentSlide.slideNumber - 1];
						        }
					        	$.fader.forceChange($container);
					        	titlecap();
					        	if (startat - 1 < 0){startat = imgcount;}else{startat = (startat) - 1;}
					        	hashchange();
					}
				});
		};
        
    };
        
    $.fader.forceChange = function($container){
        clearTimeout($container.innerFadeTimer);
        $container.o.play =  false;
        $container.innerFadeTimer = $.fader.next($container);
    };
    
    $.fader.timedChange = function($container){
    	$container.innerFadeTimer = setTimeout(function() {
            $.fader.next($container);
        }, $container.o.timeout);
    };
    
    $.fader.next = function($container) {
    	
    	if($container.currentSlide.slideNumber != $container.nextSlide.slideNumber){
	        if ($container.o.animationType == 'slide') {
	        	$container.currentSlide.slideUp($container.o.speed);
	        	$container.nextSlide.slideDown($container.o.speed);
	        } else if ($container.o.animationType == 'fade') {
	        	$container.currentSlide.fadeOut($container.o.speed);
	        	$container.nextSlide.fadeIn($container.o.speed, function() {
								removeFilter($(this)[0]);
							});
	        } else
	            alert('Innerfade-animationType must either be \'slide\' or \'fade\'');
	        
	        
	        
	        // sequence
	        $container.currentSlide = $container.nextSlide;
	        if($container.currentSlide.slideNumber + 1 > ($container.slides.length-1)){
	        	$container.nextSlide =	$container.slides[0];
	        }else{
	        	$container.nextSlide = $container.slides[$container.currentSlide.slideNumber + 1];
	        }
	        
	        // fade the jumpNav
	        $('.fader-jumpNav .active',$container.parent)
	    		.animate({opacity:0.3},$container.o.speed/2,false,function(){$(this).removeClass('active');})
				.animate({opacity:1},$container.o.speed/2);
	        
	        $container.currentSlide.data('anchor')
	        		.animate({opacity:0.3},$container.o.speed/2,false,function(){$(this).addClass('active');})
    				.animate({opacity:1},$container.o.speed/2);
    	}
    	
        // check if play or not
        if($container.o.play){
        	$.fader.timedChange($container);
        }
    };     

})(jQuery);

// **** remove Opacity-Filter in ie ****
function removeFilter(element) {
	if(element.style.removeAttribute){
		element.style.removeAttribute('filter');
	}
}

/*
 * jQuery history plugin
 * 
 * sample page: http://www.mikage.to/jquery/jquery_history.html
 *
 * Copyright (c) 2006-2009 Taku Sano (Mikage Sawatari)
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 *
 * Modified by Lincoln Cooper to add Safari support and only call the callback once during initialization
 * for msie when no initial hash supplied.
 */


jQuery.extend({
	historyCurrentHash: undefined,
	historyCallback: undefined,
	historyIframeSrc: undefined,
	
	historyInit: function(callback, src){
		jQuery.historyCallback = callback;
		if (src) jQuery.historyIframeSrc = src;
		var current_hash = location.hash.replace(/\?.*$/, '');
		
		jQuery.historyCurrentHash = current_hash;
		// if ((jQuery.browser.msie) && (jQuery.browser.version < 8)) {
		if (jQuery.browser.msie) {
			// To stop the callback firing twice during initilization if no hash present
			if (jQuery.historyCurrentHash == '') {
			jQuery.historyCurrentHash = '#';
		}
		
			// add hidden iframe for IE
			jQuery("body").prepend('<iframe id="jQuery_history" style="display: none;"'+
				(jQuery.historyIframeSrc ? ' src="'+jQuery.historyIframeSrc+'"' : '')
				+'></iframe>'
			);
			var ihistory = jQuery("#jQuery_history")[0];
			var iframe = ihistory.contentWindow.document;
			iframe.open();
			iframe.close();
			iframe.location.hash = current_hash;
		}
		else if (jQuery.browser.safari) {
			// etablish back/forward stacks
			jQuery.historyBackStack = [];
			jQuery.historyBackStack.length = history.length;
			jQuery.historyForwardStack = [];
			jQuery.lastHistoryLength = history.length;
			
			jQuery.isFirst = true;
		}
		if(current_hash)
			jQuery.historyCallback(current_hash.replace(/^#/, ''));
		setInterval(jQuery.historyCheck, 100);
	},
	
	historyAddHistory: function(hash) {
		// This makes the looping function do something
		jQuery.historyBackStack.push(hash);
		
		jQuery.historyForwardStack.length = 0; // clear forwardStack (true click occured)
		this.isFirst = true;
	},
	
	historyCheck: function(){
		// if ((jQuery.browser.msie) && (jQuery.browser.version < 8)) {
		if (jQuery.browser.msie) {
			// On IE, check for location.hash of iframe
			var ihistory = jQuery("#jQuery_history")[0];
			var iframe = ihistory.contentDocument || ihistory.contentWindow.document;
			var current_hash = iframe.location.hash.replace(/\?.*$/, '');
			if(current_hash != jQuery.historyCurrentHash) {
			
				location.hash = current_hash;
				jQuery.historyCurrentHash = current_hash;
				jQuery.historyCallback(current_hash.replace(/^#/, ''));
				
			}
		} else if (jQuery.browser.safari) {
			if(jQuery.lastHistoryLength == history.length && jQuery.historyBackStack.length > jQuery.lastHistoryLength) {
				jQuery.historyBackStack.shift();
			}
			if (!jQuery.dontCheck) {
				var historyDelta = history.length - jQuery.historyBackStack.length;
				jQuery.lastHistoryLength = history.length;
				
				if (historyDelta) { // back or forward button has been pushed
					jQuery.isFirst = false;
					if (historyDelta < 0) { // back button has been pushed
						// move items to forward stack
						for (var i = 0; i < Math.abs(historyDelta); i++) jQuery.historyForwardStack.unshift(jQuery.historyBackStack.pop());
					} else { // forward button has been pushed
						// move items to back stack
						for (var i = 0; i < historyDelta; i++) jQuery.historyBackStack.push(jQuery.historyForwardStack.shift());
					}
					var cachedHash = jQuery.historyBackStack[jQuery.historyBackStack.length - 1];
					if (cachedHash != undefined) {
						jQuery.historyCurrentHash = location.hash.replace(/\?.*$/, '');
						jQuery.historyCallback(cachedHash);
					}
				} else if (jQuery.historyBackStack[jQuery.historyBackStack.length - 1] == undefined && !jQuery.isFirst) {
					// back button has been pushed to beginning and URL already pointed to hash (e.g. a bookmark)
					// document.URL doesn't change in Safari
					if (location.hash) {
						var current_hash = location.hash;
						jQuery.historyCallback(location.hash.replace(/^#/, ''));
					} else {
						var current_hash = '';
						jQuery.historyCallback('');
					}
					jQuery.isFirst = true;
				}
			}
		} else {
			// otherwise, check for location.hash
			var current_hash = location.hash.replace(/\?.*$/, '');
			if(current_hash != jQuery.historyCurrentHash) {
				jQuery.historyCurrentHash = current_hash;
				jQuery.historyCallback(current_hash.replace(/^#/, ''));
			}
		}
	},
	historyLoad: function(hash){
		var newhash;
		hash = decodeURIComponent(hash.replace(/\?.*$/, ''));
		
		if (jQuery.browser.safari) {
			newhash = hash;
		}
		else {
			newhash = '#' + hash;
			location.hash = newhash;
		}
		jQuery.historyCurrentHash = newhash;
		
		// if ((jQuery.browser.msie) && (jQuery.browser.version < 8)) {
		if (jQuery.browser.msie) {
			var ihistory = jQuery("#jQuery_history")[0];
			var iframe = ihistory.contentWindow.document;
			iframe.open();
			iframe.close();
			iframe.location.hash = newhash;
			jQuery.lastHistoryLength = history.length;
			jQuery.historyCallback(hash);
		}
		else if (jQuery.browser.safari) {
			jQuery.dontCheck = true;
			// Manually keep track of the history values for Safari
			this.historyAddHistory(hash);
			
			// Wait a while before allowing checking so that Safari has time to update the "history" object
			// correctly (otherwise the check loop would detect a false change in hash).
			var fn = function() {jQuery.dontCheck = false;};
			window.setTimeout(fn, 200);
			jQuery.historyCallback(hash);
			// N.B. "location.hash=" must be the last line of code for Safari as execution stops afterwards.
			//      By explicitly using the "location.hash" command (instead of using a variable set to "location.hash") the
			//      URL in the browser and the "history" object are both updated correctly.
			location.hash = newhash;
		}
		else {
		  jQuery.historyCallback(hash);
		}
	}
});