/*
 *  Name: BradleyHalpern.com
 *  Date: May 2011
 *  Description: Sitewide JavaScript
 *  Version: 3.0
 *  Author: Bradley Halpern
 *  Autor URI: http://www.bradleyhalpern.com
 */
 
$(function() {
	
	/*
	 * Navigation
	 *
	 */
	$("nav ul").append('<li id="selected"></li>');
	var $navSelector = $("#selected");
	$navSelector
		.width($("#current").width())
		.css("left", $("#current a").position().left)
		.data("origLeft", $navSelector.position().left)
		.data("origWidth", $navSelector.width());
	$("nav ul li a").hover(function() {
		var $navCurrent = $(this);
		var newDistFromLeft = $navCurrent.position().left;
		var newWidth = $navCurrent.parent().width();
		$navSelector.stop().animate({
			left: newDistFromLeft,
			width: newWidth
		});
	}, function() {
		$navSelector.stop().animate({
			left: $navSelector.data("origLeft"),
			width: $navSelector.data("origWidth")
		});
	});
	
	/*
	 * Loaders
	 *
	 */
	//$('#slider img').load(function() {
    	//$('#feature_loading').fadeOut('500', function() {$('#feature').fadeIn('500');});
	//});
	$('#calendar iframe').load(function() {
    	$('#feature_loading').fadeOut('500', function() {$('#calendar iframe').fadeIn('500');});
	});
	//$('#hosting img').load(function() {
    //	$('#feature_loading').fadeOut('500', function() {$('#hosting').fadeIn('500');});
	//});
	// Portfolio loader in portfolio.js
	
	/* Submit button selection */
	$(".submit").mousedown(function() {
		$(this).addClass("selected");
	});
	$(".submit").mouseup(function() {
		$(this).removeClass("selected");
	});
	$(".submit").mouseleave(function() {
		$(this).removeClass("selected");
	});
	
	
	/*
	 * Portfolio index
	 *
	 */
	$("#portfolio article a").click(function(e) {
		//var State = History.getState(); // Note: We are using History.getState() instead of event.state
        //History.log(State.data, State.title, State.url);
		//Disable default action
		var event = e;
		e.preventDefault();
		var url = $(this).attr('href');
		//Fly out animation
		
		//$('#portfolio article a.thumb').css('border', '#F1EFED');
		$("#portfolio img").flyOffPage({
    		duration: 900
		});
		//Fade out content
		setTimeout('window.location.href="'+url+'"', 550);
		$("#portfolio #index").fadeOut('slow');
		$("#portfolio #index").show();
		//Load asynchronous content into the body
		//$("body").delay(2000).load(url);
		//Change URL
		//window.history.pushState(State, "Beta Site Title", url);
	});
	//Thumbnail outline hover effect
	$("#portfolio .details .preview").hover(function() {$("#portfolio .details .preview span").fadeIn();}, function() {$("#portfolio .details .preview span").fadeOut();})
	
	$('.slidedown').slideDown();
	$('.fadein').fadeIn();
	
	/*
	 * Contact form
	 *
	 */
	var contactcode = '<div id="contactbox"><div id="contact"><h2>Contact Me <span id="social-media"><a href="/calendar/"><img src="http://cdn.bradleyhalpern.com/images/cal.png" width="28" height="28" alt="Calendar" title="Calendar" style="position:relative;top:-3px;right:4px;" /></a><a href="http://www.facebook.com/bhalpern"><img src="http://cdn.bradleyhalpern.com/images/facebook.png" width="32" height="32 alt="on Facebook" title="on Facebook" /></a><a href="http://linkedin.com/in/bradleyhalpern"><img src="http://cdn.bradleyhalpern.com/images/linkedin.png" width="32" height="32 alt="on LinkedIn" title="on LinkedIn" /></a><a href="https://profiles.google.com/101820819009709189000"><img src="http://cdn.bradleyhalpern.com/images/google.png" width="32" height="32 alt="on Google Plus" title="on Google Plus" /></a></span></h2><form id="contact-form" action="/contact/" method="post"><input type="text" class="text" name="name" id="name" value="Name" data-default="Name"><br><input type="text" class="text" name="email" id="email" value="Email" data-default="Email"><br><textarea name="message" data-default="Message">Message</textarea><br><input type="submit" class="submit" value="Send"><span id="sending"><img src="http://static.bradleyhalpern.com/css/loading.gif" alt="Sending" height="20" /></span><span id="result" style="display:none;"></span></form></div></div>';
	$('body').prepend(contactcode);
	
	$('.contact').click(function(e){
		e.preventDefault();
		clicky.log( "#contact", "Contact", "click" );
		$('#contact').animate({
			opacity: '1',
			marginTop: '5%'
			}, 500, function() {
				// Animation complete.
			});
		$('#contactbox').fadeIn();
	});
	
	$('#contactbox').click(function(e){
		var caller = e.target.id;
		if(caller == 'contactbox') {
			$('#contactbox').fadeOut();
		}
	});
	
	$("#contact-form").submit(function(e) {
		e.preventDefault();
		$("#contact-form #sending").fadeIn();
		var $form = $(this),
		name = $form.find('input[name="name"]').val(),
		email = $form.find('input[name="email"]').val(),
		message = $form.find('textarea[name="message"]').val(),
		url = '/_contact-submit.php'; //$form.attr('action');
		
		var fields = ['input[name="name"]', 'input[name="email"]', 'textarea[name="message"]'];
		var errors = ['Can I have your name?', 'Can I have your email?', 'You forgot a message!'];
		var dims = ['29', '29', '34']; //Number of pixels to pad error message by; make it more for textarea
		var contactError = false;
		for(var i=0; i < fields.length; i++) {
			if($(fields[i]).val() == $(fields[i]).attr('data-default') || $(fields[i]).val() == '') {
				$(fields[i]).css('border', '1px solid #c12126').after('<p style="float: right; padding: 2px 5px; position: relative; top: -'+dims[i]+'px; right: 3px; background: rgba(0,0,0,0.8); color:#fff; -webkit-border-radius35px; -moz-border-radius:3px; -o-border-radius:3px; -khtml-border-radius:3px; border-radius:3px; margin: 0 0 -26px 0; display:none;" class="invalid-email-format">'+errors[i]+'</p>');
				contactError = true;
			$('.invalid-email-format').fadeIn().delay('3000').fadeOut('slow', function() {$('.invalid-email-format').remove();});
			$("#contact-form #sending").fadeOut('fast');
			}
		}
		var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
		if(!emailReg.test(email) && !contactError) {
			contactError = true;
			$form.find('input[name="email"]').css('border', '1px solid #c12126').after('<p style="float: right; padding: 2px 5px; position: relative; top: -29px; right: 2px; background: rgba(0,0,0,0.8); color:#fff; -webkit-border-radius35px; -moz-border-radius:3px; -o-border-radius:3px; -khtml-border-radius:3px; border-radius:3px; margin: 0 0 -26px 0; display:none;" class="invalid-email-format">…a real one please</p>');
			$('.invalid-email-format').fadeIn().delay('3000').fadeOut('slow', function() {$('.invalid-email-format').remove();});
			$("#contact-form #sending").fadeOut('fast');
		}
		if(contactError) {
			return false;
		}
		
		$.post(url,{name: name, email: email, message: message, method: 'ajax'}, function(data, respText, xhr){
			$("#result").html(data);
			$("#contact-form #sending").fadeOut('fast', function() {
				$("#result").addClass("message").addClass("email-success").fadeIn();
				$("#contact-form input.text, #contact-form textarea").css('color', '#999');
				$("#result").delay('3000').fadeOut('slow', function() {$("#result").removeClass("message").removeClass("email-success").html(''); $("#contact-form").reset(); $("#contact-form textarea").html('Message'); $('#contactbox input.text, #contactbox textarea').css('border', '1px solid #999'); $('#contactbox').delay('2000').fadeOut();});
			});
		})
		.success(function() {})
		.error(function() {
			$("#result").html('Error: Your message has not been sent');
			$("#contact-form #sending").fadeOut('fast', function() {
				$("#result").addClass("message").addClass("email-error").fadeIn();
				$("#result").delay('3000').fadeOut('slow', function() {$("#result").removeClass("message").removeClass("email-error").html('');});
			});
		});
	});
	
	/*
	 * Form default hide/fill
	 *
	 */
	$("input[data-default]").focus(function() {
		if ($(this).val() == $(this).attr('data-default')) {$(this).val('');}
		$(this).css('color', '#000');
	});
	$("input[data-default]").blur(function() {
		if ($(this).val() == '') {$(this).val($(this).attr('data-default')); $(this).css('color', '#999');}
	});
	$("textarea[data-default]").focus(function() {
		if ($(this).val() == $(this).attr('data-default')) {$(this).html('');}
		$(this).css('color', '#000');
	});
	$("textarea[data-default]").blur(function() {
		if ($(this).val() == '') {$(this).html($(this).attr('data-default')); $(this).css('color', '#999');}
	});
	jQuery.fn.reset = function () {
		$(this).each (function() { this.reset(); });
	}
	
});

/* ---------------------------------------------------------------------------- */

/*
 * lightbox based on facebox (for jQuery)
 * version: 1.2 (05/05/2008)
 * @requires jQuery v1.2 or later
 *
 */
 
(function($) {
  $.lightbox = function(data, klass) {
    $.lightbox.loading()

    if (data.ajax) filllightboxFromAjax(data.ajax, klass)
    else if (data.image) filllightboxFromImage(data.image, klass)
    else if (data.div) filllightboxFromHref(data.div, klass)
    else if ($.isFunction(data)) data.call($)
    else $.lightbox.reveal(data, klass)
  }

  /*
   * Public, $.lightbox methods
   */

  $.extend($.lightbox, {
    settings: {
      opacity      : 0.2,
      overlay      : true,
      loadingImage : 'http://static.bradleyhalpern.com/css/loading.gif',
      closeImage   : 'http://static.bradleyhalpern.com/css/close.png',
      imageTypes   : [ 'png', 'jpg', 'jpeg', 'gif' ],
      lightboxHtml  : '\
    <div id="lightbox" style="display:none;"> \
      <div class="popup"> \
        <div class="content"> \
        </div> \
        <a href="#" class="close"><img src="http://static.bradleyhalpern.com/css/close.png" title="close" class="close_image" /></a> \
      </div> \
    </div>'
    },

    loading: function() {
      init()
      if ($('#lightbox .loading').length == 1) return true
      showOverlay()

      $('#lightbox .content').empty()
      $('#lightbox .body').children().hide().end().
        append('<div class="loading"><img src="'+$.lightbox.settings.loadingImage+'"/></div>')

      $('#lightbox').css({
        top:	getPageScroll()[1] + (getPageHeight() / 10),
        left:	$(window).width() / 2 - 205
      }).show()

      $(document).bind('keydown.lightbox', function(e) {
        if (e.keyCode == 27) $.lightbox.close()
        return true
      })
      $(document).trigger('loading.lightbox')
    },

    reveal: function(data, klass) {
      $(document).trigger('beforeReveal.lightbox')
      if (klass) $('#lightbox .content').addClass(klass)
      $('#lightbox .content').append(data)
      $('#lightbox .loading').remove()
      $('#lightbox .body').children().fadeIn('normal')
      $('#lightbox').css('left', $(window).width() / 2 - ($('#lightbox .popup').width() / 2))
      $(document).trigger('reveal.lightbox').trigger('afterReveal.lightbox')
    },

    close: function() {
      $(document).trigger('close.lightbox')
      return false
    }
  })

  /*
   * Public, $.fn methods
   */

  $.fn.lightbox = function(settings) {
    if ($(this).length == 0) return

    init(settings)

    function clickHandler() {
      $.lightbox.loading(true)

      // support for rel="lightbox.inline_popup" syntax, to add a class
      // also supports deprecated "lightbox[.inline_popup]" syntax
      var klass = this.rel.match(/lightbox\[?\.(\w+)\]?/)
      if (klass) klass = klass[1]

      filllightboxFromHref(this.href, klass)
      return false
    }

    return this.bind('click.lightbox', clickHandler)
  }

  /*
   * Private methods
   */

  // called one time to setup lightbox on this page
  function init(settings) {
    if ($.lightbox.settings.inited) return true
    else $.lightbox.settings.inited = true

    $(document).trigger('init.lightbox')
    makeCompatible()

    var imageTypes = $.lightbox.settings.imageTypes.join('|')
    $.lightbox.settings.imageTypesRegexp = new RegExp('\.(' + imageTypes + ')$', 'i')

    if (settings) $.extend($.lightbox.settings, settings)
    $('body').append($.lightbox.settings.lightboxHtml)

    var preload = [ new Image(), new Image() ]
    preload[0].src = $.lightbox.settings.closeImage
    preload[1].src = $.lightbox.settings.loadingImage

    $('#lightbox').find('.b:first, .bl').each(function() {
      preload.push(new Image())
      preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1')
    })

    $('#lightbox .close').click($.lightbox.close)
    $('#lightbox .close_image').attr('src', $.lightbox.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 = $.lightbox.settings

    $s.loadingImage = $s.loading_image || $s.loadingImage
    $s.closeImage = $s.close_image || $s.closeImage
    $s.imageTypes = $s.image_types || $s.imageTypes
    $s.lightboxHtml = $s.lightbox_html || $s.lightboxHtml
  }

  // Figures out what you want to display and displays it
  // formats are:
  //     div: #id
  //   image: blah.extension
  //    ajax: anything else
  function filllightboxFromHref(href, klass) {
    // div
    if (href.match(/#/)) {
      var url    = window.location.href.split('#')[0]
      var target = href.replace(url,'')
      if (target == '#') return
      $.lightbox.reveal($(target).html(), klass)

    // image
    } else if (href.match($.lightbox.settings.imageTypesRegexp)) {
      filllightboxFromImage(href, klass)
    // ajax
    } else {
      filllightboxFromAjax(href, klass)
    }
  }

  function filllightboxFromImage(href, klass) {
    var image = new Image()
    image.onload = function() {
      $.lightbox.reveal('<div class="image"><img src="' + image.src + '" /></div>', klass)
    }
    image.src = href
  }

  function filllightboxFromAjax(href, klass) {
    $.get(href, function(data) { $.lightbox.reveal(data, klass) })
  }

  function skipOverlay() {
    return $.lightbox.settings.overlay == false || $.lightbox.settings.opacity === null
  }

  function showOverlay() {
    if (skipOverlay()) return

    if ($('#lightbox_overlay').length == 0)
      $("body").append('<div id="lightbox_overlay" class="lightbox_hide"></div>')

    $('#lightbox_overlay').hide().addClass("lightbox_overlayBG")
      .css('opacity', $.lightbox.settings.opacity)
      .click(function() { $(document).trigger('close.lightbox') })
      .fadeIn(200)
    return false
  }

  function hideOverlay() {
    if (skipOverlay()) return

    $('#lightbox_overlay').fadeOut(200, function(){
      $("#lightbox_overlay").removeClass("lightbox_overlayBG")
      $("#lightbox_overlay").addClass("lightbox_hide")
      $("#lightbox_overlay").remove()
    })

    return false
  }

  /*
   * Bindings
   */

  $(document).bind('close.lightbox', function() {
    $(document).unbind('keydown.lightbox')
    $('#lightbox').fadeOut(function() {
      $('#lightbox .content').removeClass().addClass('content')
      $('#lightbox .loading').remove()
      $(document).trigger('afterClose.lightbox')
    })
    hideOverlay()
  })

})(jQuery);

jQuery(document).ready(function() {
    jQuery('a[data-lightbox*=lightbox]').lightbox()
    jQuery('a[rel*=lightbox]').lightbox()
});








/* ---------------------------------------------------- */



/*
 *  Name: BradleyHalpern.com
 *  Date: September 2011
 *  Description: jQuery plugin 'flyOffPage'
 *  Version: 0.1
 *  Author: James Padolsey & Bradley Halpern
 *  Autor http://james.padolsey.com/javascript/new-jquery-plugin-fly-off-page/
 */

(function($,W,D){
    // Define all possible exit positions:
    var exitPositions = {
        top: function(el) {
            return {
                top: 0 - el.height(),
                left: el.offset().left
            };
        },
        topLeft: function(el) {
            return {
                top: 0 - el.height(),
                left: 0 - (el.width()/2)
            };
        },
        topRight: function(el) {
            return {
                top: 0 - el.height(),
                left: $(W).width() + (el.width()/2)
            };
        },
        left: function(el) {
            return {
                top: el.offset().top,
                left: 0 - el.width()
            };
        },
        right: function(el) {
            return {
                top: el.offset().top,
                left: $(W).width() + el.width()
            };
        },
        btmLeft: function(el) {
            return {
                top: getWindowHeight() + el.height(),
                left: 0 - (el.width()/2)
            };
        },
        btmRight: function(el) {
            return {
                top: getWindowHeight() + el.height(),
                left: getWindowHeight() + (el.width()/2)
            };
        },
        btm: function(el) {
            return {
                top: getWindowHeight(),
                left: el.offset().left
            };
        }
    };
    
    function getWindowHeight() {
        return W.innerHeight || $(window).height();   
    }
    
    function randDirection() {
        var directions = [],
            count = 0;
        // Loop through available exit positions:
        for (var i in exitPositions) {
            // Push property name onto new array:
            directions.push(i);
            count++;
        }
        
        // Return random directions property (corresponds to exitPositions properties):
        return directions[ parseInt(Math.random() * count, 10) ];
    }
    
    function prepareOverflow() {
        // The various overflow settings will be set to hidden,
        // but only if it does not conflict with the current document:
        var oX = $(D).width() <= $(W).width(),
            oY = $(D).height() <= $(W).height(),
            oR = oX && oY;
        oX && $('body').css('overflow-x','hidden');
        oY && $('body').css('overflow-y','hidden');
        oR && $('body').css('overflow','hidden');
    }
    
    function flyElement(s) {
        // Main functionality of plugin:
        // Create shortcut to element:
        var el = $(this),
        
            // Handle random direction:
            direction = s.direction.toLowerCase() === 'random' ? randDirection() : s.direction,
        
            // New objext: Tweens - All tweens, including user-defined ones and ours:
            // (Gives our tweens precedence):
            tweens = $.extend(s.tween, exitPositions[direction](el)),
            
            // Define all properties associated with layout/position:
            positionProps = 'position,left,top,bottom,right,width,height,paddingTop,paddingRight,paddingBottom,paddingLeft,marginTop,marginRight,marginBottom,marginLeft,zIndex,overflow,clip,display',
            // New element: clone of original (remove unique identifier):
            // (Must re-apply all layout styles because the ID may have been CSS hook):
            clone = $(el.clone())
                        .removeAttr('id')
                        .attr('id', 'replaced-element-' + (+new Date()))
                        .css((function(){
                            // Loop through each position/layout property
                            // and return object containing all:
                            var props =  positionProps.split(','),
                                length = props.length,d
                                styles = {};
                            while(length--) { styles[props[length]] = el.css(props[length]); }
                            return styles;
                        })());
        // Prepare document overflows:
        prepareOverflow();
        
        $(el)
            // Style new element:
            .css({
                left: tweens.left ? el.offset().left : null,
                top: tweens.top ? el.offset().top : null,
                position: 'absolute',
                zIndex: 999,
                width: el.outerWidth(),
                height: el.outerHeight()
            })
            // Animate using collective 'tweens' object:
            .animate(tweens, s.duration, function(){
                // On comepletion, remove the animated element:
                el.remove(); 
            })
            .filter(function(){
                // Filter:
                // (will only continue with chain if user set 'retainSpace' to true)
                return !!s.retainSpace;
            })
            // Insert clone before original element: (make clone invisible)
            .before($(clone).css('opacity',0));
            if (s.retainSpace && typeof s.retainSpace === 'object') {
                $(clone).animate(s.retainSpace, s.duration, function(){
                    $(this).remove();
                });
            }
    }
    
    // Expose functionality to jQuery namespace:
    $.fn.flyOffPage = function(userDefinedSettings) {
        
        // Define settings
        var s = $.extend({
            direction: 'random',
            tween: {},
            retainSpace: true,
            duration: 500
        }, userDefinedSettings);
        
        // Initiate:
        return this.each(function(){
            flyElement.call(this,s);
        });
    };
    
})(jQuery,window,document);






/*
 *  Name: BradleyHalpern.com
 *  Date: September 2011
 *  Description: Homepage Slider JavaScript
 *  Version: 3.0
 *  Author: Bradley Halpern
 *  Autor URI: http://www.bradleyhalpern.com
 */

/* Slider */
(function($) {

    var featuredSlider = function(element, options){
		//Defaults are below
		var settings = $.extend({}, $.fn.featuredSlider.defaults, options);

        //Useful variables. Play carefully.
        var vars = {
            currentSlide: 0,
            currentImage: '',
            totalSlides: 0,
            randAnim: '',
            running: false,
            paused: false,
            stop: false
        };
    
        //Get this slider
        var slider = $(element);
        slider.data('featured:vars', vars);
        slider.css('position','relative');
        slider.addClass('featuredSlider');
        
        //Find our slider children
        var kids = slider.children();
        kids.each(function() {
            var child = $(this);
            var link = '';
            if(!child.is('img')){
                if(child.is('a')){
                    child.addClass('featured-imageLink');
                    link = child;
                }
                child = child.find('img:first');
            }
            //Get img width & height
            var childWidth = child.width();
            if(childWidth == 0) childWidth = child.attr('width');
            var childHeight = child.height();
            if(childHeight == 0) childHeight = child.attr('height');
            //Resize the slider
            if(childWidth > slider.width()){
                slider.width(childWidth);
            }
            if(childHeight > slider.height()){
                slider.height(childHeight);
            }
            if(link != ''){
                link.css('display','none');
            }
            child.css('display','none');
            vars.totalSlides++;
        });
        
        //Set startSlide
        if(settings.startSlide > 0){
            if(settings.startSlide >= vars.totalSlides) settings.startSlide = vars.totalSlides - 1;
            vars.currentSlide = settings.startSlide;
        }
        
        //Get initial image
        if($(kids[vars.currentSlide]).is('img')){
            vars.currentImage = $(kids[vars.currentSlide]);
        } else {
            vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
        }
        
        //Show initial link
        if($(kids[vars.currentSlide]).is('a')){
            $(kids[vars.currentSlide]).css('display','block');
        }
        
        //Set first background
        slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');

        //Create caption
        slider.append(
            $('<div class="featured-caption"><p></p></div>').css({ display:'none', opacity:settings.captionOpacity })
        );			
		
		// Process caption function
		var processCaption = function(settings){
			var featuredCaption = $('.featured-caption', slider);
			if(vars.currentImage.attr('title') != '' && vars.currentImage.attr('title') != undefined){
				var title = vars.currentImage.attr('title');
				if(title.substr(0,1) == '#') title = $(title).html();	

				if(featuredCaption.css('display') == 'block'){
					featuredCaption.find('p').fadeOut(settings.animSpeed, function(){
						$(this).html(title);
						$(this).fadeIn(settings.animSpeed);
					});
				} else {
					featuredCaption.find('p').html(title);
				}					
				featuredCaption.fadeIn(settings.animSpeed);
			} else {
				featuredCaption.fadeOut(settings.animSpeed);
			}
		}
		
        //Process initial  caption
        processCaption(settings);
        
        //In the words of Super Mario "let's a go!"
        var timer = 0;
        if(!settings.manualAdvance && kids.length > 1){
            timer = setInterval(function(){ featuredRun(slider, kids, settings, false); }, settings.pauseTime);
        }

        //Add Direction nav
        if(settings.directionNav){
            slider.append('<div class="featured-directionNav"><a class="featured-prevNav">'+ settings.prevText +'</a><a class="featured-nextNav">'+ settings.nextText +'</a></div>');
            
            //Hide Direction nav
            if(settings.directionNavHide){
                $('.featured-directionNav', slider).hide();
                slider.hover(function(){
                    $('.featured-directionNav', slider).show();
                }, function(){
                    $('.featured-directionNav', slider).hide();
                });
            }
            
            $('a.featured-prevNav', slider).live('click', function(){
                if(vars.running) return false;
                clearInterval(timer);
                timer = '';
                vars.currentSlide -= 2;
                featuredRun(slider, kids, settings, 'prev');
            });
            
            $('a.featured-nextNav', slider).live('click', function(){
                if(vars.running) return false;
                clearInterval(timer);
                timer = '';
                featuredRun(slider, kids, settings, 'next');
            });
        }
        
        //Add Control nav
        if(settings.controlNav){
            var featuredControl = $('<div class="featured-controlNav"></div>');
            slider.append(featuredControl);
            for(var i = 0; i < kids.length; i++){
            	var n = i+1;
                if(settings.controlNavThumbs){
                    var child = kids.eq(i);
                    if(!child.is('img')){
                        child = child.find('img:first');
                    }
                    if (settings.controlNavThumbsFromRel) {
                        featuredControl.append('<a class="featured-control" rel="'+ i +'" onclick="clicky.log(\'#slider\', \'Slider\', \'click\'); clicky.log(\'#slide'+n+'\', \'Slide '+n+'\', \'click\');"><img src="'+ child.attr('rel') + '" alt="" /></a>');
                    } else {
                        featuredControl.append('<a class="featured-control" rel="'+ i +'" onclick="clicky.log(\'#slider\', \'Slider\', \'click\'); clicky.log(\'#slide'+n+'\', \'Slide '+n+'\', \'click\');"><img src="'+ child.attr('src').replace(settings.controlNavThumbsSearch, settings.controlNavThumbsReplace) +'" alt="" /></a>');
                    }
                } else {
                    featuredControl.append('<a class="featured-control" rel="'+ i +'" onclick="clicky.log(\'#slider\', \'Slider\', \'click\'); clicky.log(\'#slide'+n+'\', \'Slide '+n+'\', \'click\');">'+ (i + 1) +'</a>');
                }
                
            }
            //Set initial active link
            $('.featured-controlNav a:eq('+ vars.currentSlide +')', slider).addClass('active');
            
            $('.featured-controlNav a', slider).live('click', function(){
                if(vars.running) return false;
                if($(this).hasClass('active')) return false;
                clearInterval(timer);
                timer = '';
                slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
                vars.currentSlide = $(this).attr('rel') - 1;
                featuredRun(slider, kids, settings, 'control');
            });
        }
        
        //Keyboard Navigation
        if(settings.keyboardNav){
            $(window).keypress(function(event){
                //Left
                if(event.keyCode == '37'){
                    if(vars.running) return false;
                    clearInterval(timer);
                    timer = '';
                    vars.currentSlide-=2;
                    featuredRun(slider, kids, settings, 'prev');
                }
                //Right
                if(event.keyCode == '39'){
                    if(vars.running) return false;
                    clearInterval(timer);
                    timer = '';
                    featuredRun(slider, kids, settings, 'next');
                }
            });
        }
        
        //For pauseOnHover setting
        if(settings.pauseOnHover){
            slider.hover(function(){
                vars.paused = true;
                clearInterval(timer);
                timer = '';
            }, function(){
                vars.paused = false;
                //Restart the timer
                if(timer == '' && !settings.manualAdvance){
                    timer = setInterval(function(){ featuredRun(slider, kids, settings, false); }, settings.pauseTime);
                }
            });
        }
        
        //Event when Animation finishes
        slider.bind('featured:animFinished', function(){ 
            vars.running = false; 
            //Hide child links
            $(kids).each(function(){
                if($(this).is('a')){
                    $(this).css('display','none');
                }
            });
            //Show current link
            if($(kids[vars.currentSlide]).is('a')){
                $(kids[vars.currentSlide]).css('display','block');
            }
            //Restart the timer
            if(timer == '' && !vars.paused && !settings.manualAdvance){
                timer = setInterval(function(){ featuredRun(slider, kids, settings, false); }, settings.pauseTime);
            }
            //Trigger the afterChange callback
            settings.afterChange.call(this);
        });
        
        // Add slices for slice animations
        var createSlices = function(slider, settings, vars){
            for(var i = 0; i < settings.slices; i++){
				var sliceWidth = Math.round(slider.width()/settings.slices);
				if(i == settings.slices-1){
					slider.append(
						$('<div class="featured-slice"></div>').css({ 
							left:(sliceWidth*i)+'px', width:(slider.width()-(sliceWidth*i))+'px',
							height:'0px', 
							opacity:'0', 
							background: 'url("'+ vars.currentImage.attr('src') +'") no-repeat -'+ ((sliceWidth + (i * sliceWidth)) - sliceWidth) +'px 0%'
						})
					);
				} else {
					slider.append(
						$('<div class="featured-slice"></div>').css({ 
							left:(sliceWidth*i)+'px', width:sliceWidth+'px',
							height:'0px', 
							opacity:'0', 
							background: 'url("'+ vars.currentImage.attr('src') +'") no-repeat -'+ ((sliceWidth + (i * sliceWidth)) - sliceWidth) +'px 0%'
						})
					);
				}
			}
        }
		
		// Add boxes for box animations
		var createBoxes = function(slider, settings, vars){
			var boxWidth = Math.round(slider.width()/settings.boxCols);
			var boxHeight = Math.round(slider.height()/settings.boxRows);
			
			for(var rows = 0; rows < settings.boxRows; rows++){
				for(var cols = 0; cols < settings.boxCols; cols++){
					if(cols == settings.boxCols-1){
						slider.append(
							$('<div class="featured-box"></div>').css({ 
								opacity:0,
								left:(boxWidth*cols)+'px', 
								top:(boxHeight*rows)+'px',
								width:(slider.width()-(boxWidth*cols))+'px',
								height:boxHeight+'px',
								background: 'url("'+ vars.currentImage.attr('src') +'") no-repeat -'+ ((boxWidth + (cols * boxWidth)) - boxWidth) +'px -'+ ((boxHeight + (rows * boxHeight)) - boxHeight) +'px'
							})
						);
					} else {
						slider.append(
							$('<div class="featured-box"></div>').css({ 
								opacity:0,
								left:(boxWidth*cols)+'px', 
								top:(boxHeight*rows)+'px',
								width:boxWidth+'px',
								height:boxHeight+'px',
								background: 'url("'+ vars.currentImage.attr('src') +'") no-repeat -'+ ((boxWidth + (cols * boxWidth)) - boxWidth) +'px -'+ ((boxHeight + (rows * boxHeight)) - boxHeight) +'px'
							})
						);
					}
				}
			}
		}

        // Private run method
		var featuredRun = function(slider, kids, settings, nudge){
			//Get our vars
			var vars = slider.data('featured:vars');
            
            //Trigger the lastSlide callback
            if(vars && (vars.currentSlide == vars.totalSlides - 1)){ 
				settings.lastSlide.call(this);
			}
            
            // Stop
			if((!vars || vars.stop) && !nudge) return false;
			
			//Trigger the beforeChange callback
			settings.beforeChange.call(this);
					
			//Set current background before change
			if(!nudge){
				slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
			} else {
				if(nudge == 'prev'){
					slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
				}
				if(nudge == 'next'){
					slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
				}
			}
			vars.currentSlide++;
            //Trigger the slideshowEnd callback
			if(vars.currentSlide == vars.totalSlides){ 
				vars.currentSlide = 0;
				settings.slideshowEnd.call(this);
			}
			if(vars.currentSlide < 0) vars.currentSlide = (vars.totalSlides - 1);
			//Set vars.currentImage
			if($(kids[vars.currentSlide]).is('img')){
				vars.currentImage = $(kids[vars.currentSlide]);
			} else {
				vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
			}
			
			//Set active links
			if(settings.controlNav){
				$('.featured-controlNav a', slider).removeClass('active');
				$('.featured-controlNav a:eq('+ vars.currentSlide +')', slider).addClass('active');
			}
			
			//Process caption
			processCaption(settings);
			
			// Remove any slices from last transition
			$('.featured-slice', slider).remove();
			
			// Remove any boxes from last transition
			$('.featured-box', slider).remove();
			
			if(settings.effect == 'random'){
				var anims = new Array('sliceDownRight','sliceDownLeft','sliceUpRight','sliceUpLeft','sliceUpDown','sliceUpDownLeft','fold','fade',
                'boxRandom','boxRain','boxRainReverse','boxRainGrow','boxRainGrowReverse');
				vars.randAnim = anims[Math.floor(Math.random()*(anims.length + 1))];
				if(vars.randAnim == undefined) vars.randAnim = 'fade';
			}
            
            //Run random effect from specified set (eg: effect:'fold,fade')
            if(settings.effect.indexOf(',') != -1){
                var anims = settings.effect.split(',');
                vars.randAnim = anims[Math.floor(Math.random()*(anims.length))];
				if(vars.randAnim == undefined) vars.randAnim = 'fade';
            }
		
			//Run effects
			vars.running = true;
			if(settings.effect == 'sliceDown' || settings.effect == 'sliceDownRight' || vars.randAnim == 'sliceDownRight' ||
				settings.effect == 'sliceDownLeft' || vars.randAnim == 'sliceDownLeft'){
				createSlices(slider, settings, vars);
				var timeBuff = 0;
				var i = 0;
				var slices = $('.featured-slice', slider);
				if(settings.effect == 'sliceDownLeft' || vars.randAnim == 'sliceDownLeft') slices = $('.featured-slice', slider)._reverse();
				
				slices.each(function(){
					var slice = $(this);
					slice.css({ 'top': '0px' });
					if(i == settings.slices-1){
						setTimeout(function(){
							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('featured:animFinished'); });
						}, (100 + timeBuff));
					} else {
						setTimeout(function(){
							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed);
						}, (100 + timeBuff));
					}
					timeBuff += 50;
					i++;
				});
			} 
			else if(settings.effect == 'sliceUp' || settings.effect == 'sliceUpRight' || vars.randAnim == 'sliceUpRight' ||
					settings.effect == 'sliceUpLeft' || vars.randAnim == 'sliceUpLeft'){
				createSlices(slider, settings, vars);
				var timeBuff = 0;
				var i = 0;
				var slices = $('.featured-slice', slider);
				if(settings.effect == 'sliceUpLeft' || vars.randAnim == 'sliceUpLeft') slices = $('.featured-slice', slider)._reverse();
				
				slices.each(function(){
					var slice = $(this);
					slice.css({ 'bottom': '0px' });
					if(i == settings.slices-1){
						setTimeout(function(){
							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('featured:animFinished'); });
						}, (100 + timeBuff));
					} else {
						setTimeout(function(){
							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed);
						}, (100 + timeBuff));
					}
					timeBuff += 50;
					i++;
				});
			} 
			else if(settings.effect == 'sliceUpDown' || settings.effect == 'sliceUpDownRight' || vars.randAnim == 'sliceUpDown' || 
					settings.effect == 'sliceUpDownLeft' || vars.randAnim == 'sliceUpDownLeft'){
				createSlices(slider, settings, vars);
				var timeBuff = 0;
				var i = 0;
				var v = 0;
				var slices = $('.featured-slice', slider);
				if(settings.effect == 'sliceUpDownLeft' || vars.randAnim == 'sliceUpDownLeft') slices = $('.featured-slice', slider)._reverse();
				
				slices.each(function(){
					var slice = $(this);
					if(i == 0){
						slice.css('top','0px');
						i++;
					} else {
						slice.css('bottom','0px');
						i = 0;
					}
					
					if(v == settings.slices-1){
						setTimeout(function(){
							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('featured:animFinished'); });
						}, (100 + timeBuff));
					} else {
						setTimeout(function(){
							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed);
						}, (100 + timeBuff));
					}
					timeBuff += 50;
					v++;
				});
			} 
			else if(settings.effect == 'fold' || vars.randAnim == 'fold'){
				createSlices(slider, settings, vars);
				var timeBuff = 0;
				var i = 0;
				
				$('.featured-slice', slider).each(function(){
					var slice = $(this);
					var origWidth = slice.width();
					slice.css({ top:'0px', height:'100%', width:'0px' });
					if(i == settings.slices-1){
						setTimeout(function(){
							slice.animate({ width:origWidth, opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('featured:animFinished'); });
						}, (100 + timeBuff));
					} else {
						setTimeout(function(){
							slice.animate({ width:origWidth, opacity:'1.0' }, settings.animSpeed);
						}, (100 + timeBuff));
					}
					timeBuff += 50;
					i++;
				});
			}  
			else if(settings.effect == 'fade' || vars.randAnim == 'fade'){
				createSlices(slider, settings, vars);
				
				var firstSlice = $('.featured-slice:first', slider);
                firstSlice.css({
                    'height': '100%',
                    'width': slider.width() + 'px'
                });
    
				firstSlice.animate({ opacity:'1.0' }, (settings.animSpeed*2), '', function(){ slider.trigger('featured:animFinished'); });
			}          
            else if(settings.effect == 'slideInRight' || vars.randAnim == 'slideInRight'){
				createSlices(slider, settings, vars);
				
                var firstSlice = $('.featured-slice:first', slider);
                firstSlice.css({
                    'height': '100%',
                    'width': '0px',
                    'opacity': '1'
                });

                firstSlice.animate({ width: slider.width() + 'px' }, (settings.animSpeed*2), '', function(){ slider.trigger('featured:animFinished'); });
            }
            else if(settings.effect == 'slideInLeft' || vars.randAnim == 'slideInLeft'){
				createSlices(slider, settings, vars);
				
                var firstSlice = $('.featured-slice:first', slider);
                firstSlice.css({
                    'height': '100%',
                    'width': '0px',
                    'opacity': '1',
                    'left': '',
                    'right': '0px'
                });

                firstSlice.animate({ width: slider.width() + 'px' }, (settings.animSpeed*2), '', function(){ 
                    // Reset positioning
                    firstSlice.css({
                        'left': '0px',
                        'right': ''
                    });
                    slider.trigger('featured:animFinished'); 
                });
            }
			else if(settings.effect == 'boxRandom' || vars.randAnim == 'boxRandom'){
				createBoxes(slider, settings, vars);
				
				var totalBoxes = settings.boxCols * settings.boxRows;
				var i = 0;
				var timeBuff = 0;
				
				var boxes = shuffle($('.featured-box', slider));
				boxes.each(function(){
					var box = $(this);
					if(i == totalBoxes-1){
						setTimeout(function(){
							box.animate({ opacity:'1' }, settings.animSpeed, '', function(){ slider.trigger('featured:animFinished'); });
						}, (100 + timeBuff));
					} else {
						setTimeout(function(){
							box.animate({ opacity:'1' }, settings.animSpeed);
						}, (100 + timeBuff));
					}
					timeBuff += 20;
					i++;
				});
			}
			else if(settings.effect == 'boxRain' || vars.randAnim == 'boxRain' || settings.effect == 'boxRainReverse' || vars.randAnim == 'boxRainReverse' || 
                    settings.effect == 'boxRainGrow' || vars.randAnim == 'boxRainGrow' || settings.effect == 'boxRainGrowReverse' || vars.randAnim == 'boxRainGrowReverse'){
				createBoxes(slider, settings, vars);
				
				var totalBoxes = settings.boxCols * settings.boxRows;
				var i = 0;
				var timeBuff = 0;
				
				// Split boxes into 2D array
				var rowIndex = 0;
				var colIndex = 0;
				var box2Darr = new Array();
				box2Darr[rowIndex] = new Array();
				var boxes = $('.featured-box', slider);
				if(settings.effect == 'boxRainReverse' || vars.randAnim == 'boxRainReverse' ||
                   settings.effect == 'boxRainGrowReverse' || vars.randAnim == 'boxRainGrowReverse'){
					boxes = $('.featured-box', slider)._reverse();
				}
				boxes.each(function(){
					box2Darr[rowIndex][colIndex] = $(this);
					colIndex++;
					if(colIndex == settings.boxCols){
						rowIndex++;
						colIndex = 0;
						box2Darr[rowIndex] = new Array();
					}
				});
				
				// Run animation
				for(var cols = 0; cols < (settings.boxCols * 2); cols++){
					var prevCol = cols;
					for(var rows = 0; rows < settings.boxRows; rows++){
						if(prevCol >= 0 && prevCol < settings.boxCols){
							/* Due to some weird JS bug with loop vars 
							being used in setTimeout, this is wrapped
							with an anonymous function call */
							(function(row, col, time, i, totalBoxes) {
								var box = $(box2Darr[row][col]);
                                var w = box.width();
                                var h = box.height();
                                if(settings.effect == 'boxRainGrow' || vars.randAnim == 'boxRainGrow' ||
                                   settings.effect == 'boxRainGrowReverse' || vars.randAnim == 'boxRainGrowReverse'){
                                    box.width(0).height(0);
                                }
								if(i == totalBoxes-1){
									setTimeout(function(){
										box.animate({ opacity:'1', width:w, height:h }, settings.animSpeed/1.3, '', function(){ slider.trigger('featured:animFinished'); });
									}, (100 + time));
								} else {
									setTimeout(function(){
										box.animate({ opacity:'1', width:w, height:h }, settings.animSpeed/1.3);
									}, (100 + time));
								}
							})(rows, prevCol, timeBuff, i, totalBoxes);
							i++;
						}
						prevCol--;
					}
					timeBuff += 100;
				}
			}
		}
		
		// Shuffle an array
		var shuffle = function(arr){
			for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
			return arr;
		}
        
        // For debugging
        var trace = function(msg){
            if (this.console && typeof console.log != "undefined")
                console.log(msg);
        }
        
        // Start / Stop
        this.stop = function(){
            if(!$(element).data('featured:vars').stop){
                $(element).data('featured:vars').stop = true;
                trace('Stop Slider');
            }
        }
        
        this.start = function(){
            if($(element).data('featured:vars').stop){
                $(element).data('featured:vars').stop = false;
                trace('Start Slider');
            }
        }
        
        //Trigger the afterLoad callback
        settings.afterLoad.call(this);
		
		return this;
    };
        
    $.fn.featuredSlider = function(options) {
    
        return this.each(function(key, value){
            var element = $(this);
            // Return early if this element already has a plugin instance
            if (element.data('featuredslider')) return element.data('featuredslider');
            // Pass options to plugin constructor
            var featuredslider = new featuredSlider(this, options);
            // Store plugin object in this element's data
            element.data('featuredslider', featuredslider);
        });

	};
	
	//Default settings
	$.fn.featuredSlider.defaults = {
		effect: 'boxRain', //random, fold
		slices: 15,
		boxCols: 8,
		boxRows: 4,
		animSpeed: 200,
		pauseTime: 3000,
		startSlide: 0,
		directionNav: false,
		directionNavHide: false,
		controlNav: true,
		controlNavThumbs: false,
        controlNavThumbsFromRel: false,
		controlNavThumbsSearch: '.jpg',
		controlNavThumbsReplace: '_thumb.jpg',
		keyboardNav: true,
		pauseOnHover: true,
		manualAdvance: true,
		captionOpacity: 0.8,
		prevText: 'Previous',
		nextText: 'Next',
		beforeChange: function(){},
		afterChange: function(){},
		slideshowEnd: function(){},
        lastSlide: function(){},
        afterLoad: function(){}
	};
	
	$.fn._reverse = [].reverse;
	
})(jQuery);



//Put feature_loading element back into portfolio.php first and change .project back to #portfolio
$(function() {
	$('.project').hide();
	$('footer').hide()
});
$(window).load(function() {
	/* Portfolio */
	$('#feature_loading').fadeOut('500', function() {$('#portfolio').fadeIn('500'); $('footer').fadeIn('500');});
	$('footer').delay('500').fadeIn('500');
	/* Slider */
	$('#feature p').fadeIn('500');
	$('#faded-slide').fadeIn('500', function() {
		$('#slider').featuredSlider();
	});
});

