window.log = function(){
  log.history = log.history || [];  
  log.history.push(arguments);
  arguments.callee = arguments.callee.caller;  
  if(this.console) console.log( Array.prototype.slice.call(arguments) );
};
(function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();)b[a]=b[a]||c})(window.console=window.console||{});

/*

Title:		jShowOff: a jQuery Content Rotator Plugin
Author:		Erik Kallevig
Version:	0.1.2
Website:	http://ekallevig.com/jshowoff
License: 	Dual licensed under the MIT and GPL licenses.

jShowOff Options

animatePause :		whether to use 'Pause' animation text when pausing [boolean, defaults to true]
autoPlay :			whether to start playing immediately [boolean, defaults to true]
changeSpeed :		speed of transition [integer, milliseconds, defaults to 600]
controls :			whether to create & display controls (Play/Pause, Previous, Next) [boolean, defaults to true]
controlText :		custom text for controls [object, 'play', 'pause', 'previous' and 'next' properties]
cssClass :			custom class to add to .jshowoff wrapper [string]
effect :			transition effect [string: 'fade', 'slideLeft' or 'none', defaults to 'fade']
hoverPause :		whether to pause on hover [boolean, defaults to true]
links :				whether to create & display numeric links to each slide [boolean, defaults to true]
speed :				time each slide is shown [integer, milliseconds, defaults to 3000]

*/

$.fn.jshowoff = function(settings,callbacks) {

	// default global vars
	var config = {
		animatePause : true,
		autoPlay : true,
		changeSpeed : 600,
		controls : true,
		controlText : {
			play :		'Play',
			pause :		'Pause',
			next :		'Next',
			previous :	'Previous'
		},
		effect : 'fade',
		hoverPause : true,
		links : true,
		speed : 3000
	};
	 // Callback functions for transitions and the main function
	var callback = {
		fCallback : '',
		tCallback : ''
	};
	
	// merge default global variables with custom variables, modifying 'config'
	if (settings) $.extend(true, config, settings);
	if (settings) $.extend(true, callback, callbacks);

	// make sure speed is at least 20ms longer than changeSpeed
	if (config.speed < (config.changeSpeed+20)) {
		alert('jShowOff: Make speed at least 20ms longer than changeSpeed; the fades aren\'t always right on time.');
		return this;
	};
	function transitionCallback(){
		if(typeof callback.tCallback == 'function'){
			callback.tCallback.call(this);
		}
	};
	function functionCallback(){
		if(typeof callback.fCallback == 'function'){
			callback.fCallback.call(this);
		}
	};
	// create slideshow for each matching element invoked by .jshowoff()
	this.each(function(i) {
		
		// declare instance variables
		var $cont = $(this);
		var gallery = $(this).children().remove();
		var timer = '';
		var counter = 0;
		var preloadedImg = [];
		var howManyInstances = $('.jshowoff').length+1;
		var uniqueClass = 'jshowoff-'+howManyInstances;
		var cssClass = config.cssClass != undefined ? config.cssClass : '';
		
		
		// set up wrapper
		$cont.css('position','relative').wrap('<div class="jshowoff '+uniqueClass+'" />');
		var $wrap = $('.'+uniqueClass);
		$wrap.css('position','relative').addClass(cssClass);
		
		// add first slide to wrapper
		$(gallery[0]).clone().appendTo($cont);
		
		// preload slide images into memory
		preloadImg();
		
		// add controls
		if(config.controls){
			addControls();
			if(config.autoPlay==false){
				$('.'+uniqueClass+'-play').addClass(uniqueClass+'-paused jshowoff-paused').text(config.controlText.play);
			};
		};
		
		// add slide links
		if(config.links){
			addSlideLinks();
			$('.'+uniqueClass+'-slidelinks a').eq(0).addClass(uniqueClass+'-active jshowoff-active');
		};
		
		// pause slide rotation on hover
		if(config.hoverPause){ $cont.hover(
			function(){ if(isPlaying()) pause('hover'); },
			function(){ if(isPlaying()) play('hover'); }
		);};
		
		// determine autoPlay
		if(config.autoPlay && gallery.length>1) {
			timer = setInterval( function(){ play(); }, config.speed );
		};
		
		// display error message if no slides present
		if(gallery.length<1){
			$('.'+uniqueClass).append('<p>For jShowOff to work, the container element must have child elements.</p>');
		};

		
		// utility for loading slides
		function transitionTo(gallery,index) {
			
			var oldCounter = counter;
			if((counter >= gallery.length) || (index >= gallery.length)) { counter = 0; var e2b = true; }
			else if((counter < 0) || (index < 0)) { counter = gallery.length-1; var b2e = true; }
			else { counter = index; }


			if(config.effect=='slideLeft'){
				var newSlideDir, oldSlideDir;
				function slideDir(dir) {
					newSlideDir = dir=='right' ? 'left' : 'right';
					oldSlideDir = dir=='left' ? 'left' : 'right';					
				};
				

				counter >= oldCounter ? slideDir('left') : slideDir('right') ;

				$(gallery[counter]).clone().appendTo($cont).slideIt({direction:newSlideDir,changeSpeed:config.changeSpeed});
				if($cont.children().length>1){
					$cont.children().eq(0).css('position','absolute').slideIt({direction:oldSlideDir,showHide:'hide',changeSpeed:config.changeSpeed},function(){$(this).remove();});
				};
			} else if (config.effect=='fade') {
				$(gallery[counter]).clone().appendTo($cont).hide().fadeIn(config.changeSpeed,function(){if($.browser.msie)this.style.removeAttribute('filter');});
				if($cont.children().length>1){
					$cont.children().eq(0).css('position','absolute').fadeOut(config.changeSpeed,function(){$(this).remove();});
				};
			} else if (config.effect=='none') {
				$(gallery[counter]).clone().appendTo($cont);
				if($cont.children().length>1){
					$cont.children().eq(0).css('position','absolute').remove();
				};
			};
			// update active class on slide link
			if(config.links){
				$('.'+uniqueClass+'-active').removeClass(uniqueClass+'-active jshowoff-active');
				$('.'+uniqueClass+'-slidelinks a').eq(counter).addClass(uniqueClass+'-active jshowoff-active');
			};
			transitionCallback();
		};
		
		// is the rotator currently in 'play' mode
		function isPlaying(){
			return $('.'+uniqueClass+'-play').hasClass('jshowoff-paused') ? false : true;
		};
		
		// start slide rotation on specified interval
		function play(src) {
			if(!isBusy()){
				counter++;
				transitionTo(gallery,counter);
				if(src=='hover' || !isPlaying()) {
					timer = setInterval(function(){ play(); },config.speed);
				}
				if(!isPlaying()){
					$('.'+uniqueClass+'-play').text(config.controlText.pause).removeClass('jshowoff-paused '+uniqueClass+'-paused');
				}
			};
		};
		
		// stop slide rotation
		function pause(src) {
			clearInterval(timer);
			if(!src || src=='playBtn') $('.'+uniqueClass+'-play').text(config.controlText.play).addClass('jshowoff-paused '+uniqueClass+'-paused');
			if(config.animatePause && src=='playBtn'){
				$('<p class="'+uniqueClass+'-pausetext jshowoff-pausetext">'+config.controlText.pause+'</p>').css({ fontSize:'62%', textAlign:'center', position:'absolute', top:'40%', lineHeight:'100%', width:'100%' }).appendTo($wrap).addClass(uniqueClass+'pauseText').animate({ fontSize:'600%', top:'30%', opacity:0 }, {duration:500,complete:function(){$(this).remove();}});
			}
		};
		
		// load the next slide
		function next() {
			goToAndPause(counter+1);
		};
	
		// load the previous slide
		function previous() {
			goToAndPause(counter-1);
		};
		
		// is the rotator in mid-transition
		function isBusy() {
			return $cont.children().length>1 ? true : false;
		};
		
		// load a specific slide
		function goToAndPause(index) {
			$cont.children().stop(true,true);
			if((counter != index) || ((counter == index) && isBusy())){
				if(isBusy()) $cont.children().eq(0).remove();
				transitionTo(gallery,index);
				pause();
			};
		};	

		// load images into memory
		function preloadImg() {
			$(gallery).each(function(i){
				$(this).find('img').each(function(i){
					preloadedImg[i] = $('<img>').attr('src',$(this).attr('src'));					
				});
			});
		};
			
		// generate and add play/pause, prev, next controls
		function addControls() {
			$wrap.append('<p class="jshowoff-controls '+uniqueClass+'-controls"><a class="jshowoff-play '+uniqueClass+'-play" href="#null">'+config.controlText.pause+'</a> <a class="jshowoff-prev '+uniqueClass+'-prev" href="#null">'+config.controlText.previous+'</a> <a class="jshowoff-next '+uniqueClass+'-next" href="#null">'+config.controlText.next+'</a></p>');
			$('.'+uniqueClass+'-controls a').each(function(){
					if($(this).hasClass('jshowoff-play')) $(this).click(function(){ isPlaying() ? pause('playBtn') : play(); return false; } );
					if($(this).hasClass('jshowoff-prev')) $(this).click(function(){ previous(); return false; });
					if($(this).hasClass('jshowoff-next')) $(this).click(function(){ next(); return false; });

			});
		};	

		// generate and add slide links
		function addSlideLinks() {
			$wrap.append('<p class="jshowoff-slidelinks '+uniqueClass+'-slidelinks"></p>');
			$.each(gallery, function(i, val) {
				var linktext = $(this).attr('title') != '' ? $(this).attr('title') : i+1;
				$('<a class="jshowoff-slidelink-'+i+' '+uniqueClass+'-slidelink-'+i+'" href="#null">'+linktext+'</a>').bind('click', {index:i}, function(e){ goToAndPause(e.data.index); return false; }).appendTo('.'+uniqueClass+'-slidelinks');
			});
		};		


	// end .each
	});
	functionCallback()
	return this;

// end .jshowoff
};

/*
Formalize
http://formalize.me/
*/
var FORMALIZE=(function(b,e,f,a){var h="placeholder" in f.createElement("input");var i="autofocus" in f.createElement("input");var g="webkitAppearance" in f.createElement("select").style;var d=!!(b.browser.msie&&parseInt(b.browser.version,10)===6);var c=!!(b.browser.msie&&parseInt(b.browser.version,10)===7);return{go:function(){for(var j in FORMALIZE.init){FORMALIZE.init[j]();}},init:{detect_webkit:function(){if(!g){return;}b("html").addClass("is_webkit");},full_input_size:function(){if(!c||!b("textarea, input.input_full").length){return;}b("textarea, input.input_full").wrap('<span class="input_full_wrap"></span>');},ie6_skin_inputs:function(){if(!d||!b("input, select, textarea").length){return;}var j=/button|submit|reset/;var k=/date|datetime|datetime-local|email|month|number|password|range|search|tel|text|time|url|week/;b("input").each(function(){var l=b(this);if(this.getAttribute("type").match(j)){l.addClass("ie6_button");if(this.disabled){l.addClass("ie6_button_disabled");}}else{if(this.getAttribute("type").match(k)){l.addClass("ie6_input");if(this.disabled){l.addClass("ie6_input_disabled");}}}});b("textarea, select").each(function(){if(this.disabled){b(this).addClass("ie6_input_disabled");}});},autofocus:function(){if(i||!b(":input[autofocus]").length){return;}b(":input[autofocus]:visible:first").focus();},placeholder:function(){if(h||!b(":input[placeholder]").length){return;}FORMALIZE.misc.add_placeholder();b(":input[placeholder]").each(function(){var j=b(this);var k=j.attr("placeholder");j.focus(function(){if(j.val()===k){j.val("").removeClass("placeholder_text");}}).blur(function(){FORMALIZE.misc.add_placeholder();});j.closest("form").submit(function(){if(j.val()===k){j.val("").removeClass("placeholder_text");}}).bind("reset",function(){setTimeout(FORMALIZE.misc.add_placeholder,50);});});}},misc:{add_placeholder:function(){if(h||!b(":input[placeholder]").length){return;}b(":input[placeholder]").each(function(){var j=b(this);var k=j.attr("placeholder");if(!j.val()||j.val()===k){j.val(k).addClass("placeholder_text");}});}}};})(jQuery,this,this.document);jQuery(document).ready(function(){FORMALIZE.go();});

