jQuery(document).ready(function($){
// Masonry
/*************************************************
**	jQuery Masonry version 1.3.2
**	Copyright David DeSandro, licensed MIT        * Modified Masonry thanks to Rob Edwards
**	http://desandro.com/resources/jquery-masonry  *http://robedwards.org/
**************************************************/
;(function($){	

  /*!
   * smartresize: debounced resize event for jQuery
   * http://github.com/lrbabe/jquery-smartresize
   *
   * Copyright (c) 2009 Louis-Remi Babe
   * Licensed under the GPL license.
   * http://docs.jquery.com/License
   *
   */
  var event = $.event,
	  resizeTimeout;

  event.special.smartresize = {
	setup: function() {
	  $(this).bind( "resize", event.special.smartresize.handler );
	},
	teardown: function() {
	  $(this).unbind( "resize", event.special.smartresize.handler );
	},
	handler: function( event, execAsap ) {
	  // Save the context
	  var context = this,
		  args = arguments;

	  // set correct event type
	  event.type = "smartresize";

	  if (resizeTimeout) { clearTimeout(resizeTimeout); }
	  resizeTimeout = setTimeout(function() {
		jQuery.event.handle.apply( context, args );
	  }, execAsap === "execAsap"? 0 : 100);
	}
  };

  $.fn.smartresize = function( fn ) {
	return fn ? this.bind( "smartresize", fn ) : this.trigger( "smartresize", ["execAsap"] );
  };

  // masonry code begin
  $.fn.masonry = function(options, callback) { 

	// all my sweet methods
	var msnry = {
	  getBricks : function($wall, props, opts) {
		var hasItemSelector = (opts.itemSelector === undefined);
		if ( opts.appendedContent === undefined ) {
		  // if not appendedContent
		  props.$bricks = hasItemSelector ?
				$wall.children() :
				$wall.find(opts.itemSelector);
		} else {
		 //	 if appendedContent...
		 props.$bricks = hasItemSelector ?
				opts.appendedContent : 
				opts.appendedContent.filter( opts.itemSelector );
		}
	  },
	  
	  placeBrick : function($brick, setCount, setY, props, opts) {
			// get the minimum Y value from the columns...
		var minimumY = Math.min.apply(Math, setY),
			setHeight = minimumY + $brick.outerHeight(true),
			i = setY.length,
			shortCol = i,
			setSpan = props.colCount + 1 - i;
		// Which column has the minY value, closest to the left
		while (i--) {
		  if ( setY[i] == minimumY ) {
			shortCol = i;
		  }
		}
			
		var position = {
		  left: props.colW * shortCol + props.posLeft,
		  top: minimumY
		};
			
		// position the brick
		$brick.applyStyle(position, $.extend(true,{},opts.animationOptions) );

		// apply setHeight to necessary columns
		for ( i=0; i < setSpan; i++ ) {
		  props.colY[ shortCol + i ] = setHeight;
		}
	  },
	  
	  setup : function($wall, opts, props) {
		msnry.getBricks($wall, props, opts);

		if ( props.masoned ) {
		  props.previousData = $wall.data('masonry');
		}

		if ( opts.columnWidth === undefined) {
		  props.colW = props.masoned ?
			  props.previousData.colW :
			  props.$bricks.outerWidth(true);
		} else {
		  props.colW = opts.columnWidth;
		}

		props.colCount = Math.floor( $wall.width() / props.colW ) ;
		props.colCount = Math.max( props.colCount, 1 );
	  },
	  
	  arrange : function($wall, opts, props) {
		var i;

		if ( !props.masoned || opts.appendedContent !== undefined ) {
		  // just the new bricks
		  props.$bricks.css( 'position', 'absolute' );
		}

		// if masonry hasn't been called before
		if ( !props.masoned ) { 
		  $wall.css( 'position', 'relative' );

		  // get top left position of where the bricks should be
		  var $cursor = $( document.createElement('div') );
		  $wall.prepend( $cursor );
		  props.posTop =  Math.round( $cursor.position().top );
		  props.posLeft = Math.round( $cursor.position().left );
		  $cursor.remove();
		} else {
		  props.posTop =  props.previousData.posTop;
		  props.posLeft = props.previousData.posLeft;
		}
		
		// set up column Y array
		if ( props.masoned && opts.appendedContent !== undefined ) {
		  // if appendedContent is set, use colY from last call
		  props.colY = props.previousData.colY;

		  /*
		  *	 in the case that the wall is not resizeable,
		  *	 but the colCount has changed from the previous time
		  *	 masonry has been called
		  */
		  for ( i = props.previousData.colCount; i < props.colCount; i++) {
			props.colY[i] = props.posTop;
		  }

		} else {
		  // start new colY array, with starting values set to posTop
		  props.colY = [];
		  i = props.colCount;
		  while (i--) {
			props.colY.push(props.posTop);
		  }
		}

		// are we animating the rearrangement?
		// use plugin-ish syntax for css or animate
		$.fn.applyStyle = ( props.masoned && opts.animate ) ? $.fn.animate : $.fn.css;


		// layout logic
		if ( opts.singleMode ) {
		  props.$bricks.each(function(){
			var $brick = $(this);
			msnry.placeBrick($brick, props.colCount, props.colY, props, opts);
		  });	   
		} else {
		  props.$bricks.each(function() {
			var $brick = $(this),
				//how many columns does this brick span
				colSpan = Math.ceil( $brick.outerWidth(true) / props.colW);
			colSpan = Math.min( colSpan, props.colCount );

			if ( colSpan === 1 ) {
			  // if brick spans only one column, just like singleMode
			  msnry.placeBrick($brick, props.colCount, props.colY, props, opts);
			} else {
			  // brick spans more than one column

			  //how many different places could this brick fit horizontally
			  var groupCount = props.colCount + 1 - colSpan,
				  groupY = [];

			  // for each group potential horizontal position
			  for ( i=0; i < groupCount; i++ ) {
				// make an array of colY values for that one group
				var groupColY = props.colY.slice(i, i+colSpan);
				// and get the max value of the array
				groupY[i] = Math.max.apply(Math, groupColY);
			  }

			  msnry.placeBrick($brick, groupCount, groupY, props, opts);
			}
		  }); //	/props.bricks.each(function() {
		}  //	  /layout logic

		// set the height of the wall to the tallest column
		props.wallH = Math.max.apply(Math, props.colY);
		var wallCSS = { height: props.wallH - props.posTop };
		$wall.applyStyle( wallCSS, $.extend(true,[],opts.animationOptions) );

		// add masoned class first time around
		if ( !props.masoned ) { 
		  // wait 1 millisec for quell transitions
		  setTimeout(function(){
			$wall.addClass('masoned'); 
		  }, 1);
		}

		// provide props.bricks as context for the callback
		callback.call( props.$bricks );

		// set all data so we can retrieve it for appended appendedContent
		//	  or anyone else's crazy jquery fun
		$wall.data('masonry', props );
		
	  }, // /msnry.arrange
	  
	  resize : function($wall, opts, props) {
		props.masoned = !!$wall.data('masonry');
		var prevColCount = $wall.data('masonry').colCount;
		msnry.setup($wall, opts, props);
		if ( props.colCount != prevColCount ) {
		  msnry.arrange($wall, opts, props);
		}
	  }
	};


	/*
	*  let's begin
	*  IN A WORLD...
	*/
	return this.each(function() {  

	  var $wall = $(this),
		  props = {};

	  // checks if masonry has been called before on this object
	  props.masoned = !!$wall.data('masonry');
	
	  var previousOptions = props.masoned ? $wall.data('masonry').options : {},
		  opts =  $.extend(
					{},
					$.fn.masonry.defaults,
					previousOptions,
					options
				  ),
		  resizeOn = previousOptions.resizeable;

	  // should we save these options for next time?
	  props.options = opts.saveOptions ? opts : previousOptions;

	  //picked up from Paul Irish
	  callback = callback || function(){};

	  msnry.getBricks($wall, props, opts);

	  // if brickParent is empty, do nothing, go back home and eat chips
	  if ( !props.$bricks.length ) { 
		return this; 
	  }

	  // call masonry layout
	  msnry.setup($wall, opts, props);
	  msnry.arrange($wall, opts, props);
	
	  // binding window resizing
	  if ( !resizeOn && opts.resizeable ) {
		$(window).bind('smartresize.masonry', function() { msnry.resize($wall, opts, props); } );
	  }
	  if ( resizeOn && !opts.resizeable ) { 
		$(window).unbind('smartresize.masonry'); 
	  }
	   

	});	   //	 /return this.each(function()
  };	  //	/$.fn.masonry = function(options)


// Default plugin options
$.fn.masonry.defaults = {
  singleMode: false,
  columnWidth: undefined,
  itemSelector: undefined,
  appendedContent: undefined,
  saveOptions: true,
  resizeable: true,
  animate: false,
  animationOptions: {}
};

})(jQuery);

// Masonry Options
var
  speed = 500,	 // animation speed
  $wall = $('.portfolio_gallery').find('ul')
  $wall.masonry({
	  columnWidth:240, 
	  itemSelector: 'li:not(.invis)',
	  animate: true,
	  animationOptions: {
	  duration: 1000,
	  queue: false }
  });
	
// Scroll to anchor, on hrefs with .goto on them
$('a.goto[href*=#], a.blog').click(function() {
  // Add active & Background position animation
  $('#primary_nav li a.goto').each(function(){
	  $(this).removeClass('active');
	  $(this).stop().animate({backgroundPosition: '0px 0px'}, 400, function(){
		  $(this).removeClass( 'animating' );
	  })
	  .addClass('animating');
  });
  $('.folio-item').remove();
  
  $(this).addClass('active');
  // Use element height, and double, then minus 2px
  height = $(this).height() * (-1) -2;  
  $(this).stop().animate({'backgroundPosition':'(0 ' + height + ')'}, {duration:400});

  if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'')
  && location.hostname == this.hostname) {
	  var $target = $(this.hash);
	  $target = $target.length && $target
	  || $('[name=' + this.hash.slice(1) +']');
	  if ($target.length) {
	  var targetOffset = $target.offset().top - 0;
	  $('html,body')
	  .stop().animate({scrollTop: targetOffset}, 2300);
	 return false;
	}
  }
});


// Slow it down for portfolio gallery so scrollbar doesn't go whacky
$('a.folio-goto[href*=#]').click(function() {
	if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'')
	&& location.hostname == this.hostname) {
		var $target = $(this.hash);
		$target = $target.length && $target
		|| $('[name=' + this.hash.slice(1) +']');
		if ($target.length) {
		var targetOffset = $target.offset().top - 0;
		$('html,body')
		.stop().animate({scrollTop: targetOffset}, 500);
	   return false;
	  }
	}
});
	
	
// Fading Header
var Header = {
  // Let's write in JSON to make it more modular
  addFade : function(selector){
	$("<span class=\"fake-hover\"></span>").css("display", "none").prependTo($(selector)); 
	// Safari dislikes hide() for some reason
	$(selector+" a").bind("mouseenter",function(){
		$(selector+" .fake-hover").fadeIn("slow");
	});
	$(selector+" a").bind("mouseleave",function(){
		$(selector+" .fake-hover").fadeOut("slow");
	});
	  
  }
};


// Controls and other small stuffs

$(document).ready(function(){
	
	// Fade that header
	Header.addFade("#michael");
	
	//To switch directions up/down and left/right just place a "-" in front of the top/left attribute
	//Vertical Sliding
	$('li.slidedown').hover(function(){
		$(".cover", this).stop().animate({top:'-260px'},{queue:false,duration:0});
	}, function() {
		$(".cover", this).stop().animate({top:'0px'},{queue:false,duration:0});
	});

//Page Slider
$('.scrollPage').click(function() {
   var elementClicked = $(this).attr("href");
   var destination = $(elementClicked).offset().top;
   $("html:not(:animated),body:not(:animated)").animate({ scrollTop: destination-20}, 1500 );
   return false;
});


//Piro Box Image Viewer
	$().piroBox({
			my_speed: 400, //animation speed
			bg_alpha: 0.3, //background opacity
			slideShow : true, // true == slideshow on, false == slideshow off
			slideSpeed : 4, //slideshow duration in seconds(3 to 6 Recommended)
			close_all : '.piro_close,.piro_overlay'// add class .piro_overlay(with comma)if you want overlay click close piroBox
	});


	// Set starting slide to 1
	var startSlide = 1;
	// Get slide number if it exists
	if (window.location.hash) {
		startSlide = window.location.hash.replace('#','');
	}
	// Initialize Slides
	$('#slides').slides({
		preload: true,
		preloadImage: 'css/demo5/ajax-loader.gif',
		generatePagination: true,
		play: 5000,
		pause: 2500,
		hoverPause: true,
		// Get the starting slide
		start: startSlide,
		animationComplete: function(current){
			// Set the slide number as a hash... (It Screws up the URL)
			//window.location.hash = '#' + current;
		}
	});
	
}); // Closing function - Starts line: 381


//Portfolio Filtering Navigation
$('.filtering-nav a').click(function(){
	var colorClass = '.' + $(this).attr('title');
	$('.filtering-nav a.active').removeClass('active');
	$(this).addClass('active');

	if(colorClass=='.all') {
	// show all hidden boxes
	$wall.children('.invis')
	  .toggleClass('invis').fadeIn(speed);
  } else {	
	// hide visible boxes 
	$wall.children().not(colorClass).not('.invis')
	  .toggleClass('invis').fadeOut(speed);
	// show hidden boxes
	$wall.children(colorClass+'.invis')
	  .toggleClass('invis').fadeIn(speed);
  }
  $wall.masonry();
  return false;
});
$('.filtering-nav a').click(function(){
	$('.folio-item').slideUp("slow");
});

/*Contact form Validation
$('#submit').click(function () {		
	
	//Get the data from all the fields
	var name = $('input[name=name]');
	var website = $('input[name=website]');
	var project = $('input[name=project]');
	var email = $('input[name=email]');
	var comment = $('textarea[name=comment]');

	//Simple validation to make sure user entered something
	//If error found, add hightlight class to the text field
	if (name.val()=='') {
		name.addClass('hightlight');
		return false;
	} else name.removeClass('hightlight');
	
	if (email.val()=='') {
		email.addClass('hightlight');
		return false;
	} else email.removeClass('hightlight');
	
	if (comment.val()=='') {
		comment.addClass('hightlight');
		return false;
	} else comment.removeClass('hightlight');
	
	//organize the data properly
	//organize the data properly
	var data = 'name=' + name.val() + '&website=' + website.val() + '&project=' + project.val() + '&email=' + email.val() + 
	'&comment='  + encodeURIComponent(comment.val());
	
	//disabled all the text fields
	$('.form_field').attr('disabled','true');
	
	//show the loading sign
	$('.loading').show();
	
	//start the ajax
	$.ajax({
		//this is the php file that processes the data and send mail
		url: "http://michaelacevedo.com/js/process.php",	
		
		//GET method is used
		type: "GET",

		//pass the data			
		data: data,		
		
		//Do not cache the page
		cache: false,
		
		//success
		success: function (html) {				
			//if process.php returned 1/true (send mail success)
			if (html==1) {					
				//hide the form $('.form').fadeOut('slow');//		
				
				//show the success message
				$('.done').fadeIn('slow');
				
			//if process.php returned 0/false (send mail failed)
			} else alert('Sorry, unexpected error. Please try again later.');				
		}		
	});
	
	//cancel the submit button default behaviours
	return false;
});	*/
	
//Fading Side Nav
jQuery.fn.topLink = function(settings) {
	settings = jQuery.extend({
		min: 1,
		fadeSpeed: 200,
		ieOffset: 50
	}, settings);
	return this.each(function() {
		//listen for scroll
		var el = $(this);
		el.css('display','none'); //in case the user forgot
		$(window).scroll(function() {
			if(!jQuery.support.hrefNormalized) {
				el.css({
					'position': 'absolute',
				});
			}
			if($(window).scrollTop() >= settings.min)
			{
				el.fadeIn(settings.fadeSpeed);
			}
			else
			{
				el.fadeOut(settings.fadeSpeed);
			}
		});
	});
};

$(document).ready(function() {
	$('#side_nav').topLink({
		min: 950,
		fadeSpeed: 350
	});
	
});


 var topRange      = 200,  // measure from the top of the viewport to X pixels down
	 edgeMargin    = 20,   // margin above the top or margin from the end of the page
	 animationTime = 1200, // time in milliseconds
	 contentTop = [];

$(document).ready(function(){

 // Stop animated scroll if the user does something
 $('html,body').bind('scroll mousedown DOMMouseScroll mousewheel keyup', function(e){
 if ( e.which > 0 || e.type == 'mousedown' || e.type == 'mousewheel' ){
  $('html,body').stop();
 }
})

 // Set up content an array of locations
 $('#side_nav').find('a').each(function(){
  contentTop.push( $( $(this).attr('href') ).offset().top );
 })

 // Animate menu scroll to content
  $('#side_nav').find('a').click(function(){
   var sel = this,
	   newTop = Math.min( contentTop[ $('#side_nav a').index( $(this) ) ], $(document).height() - $(window).height() ); // get content top or top position if at the document bottom
   $('html,body').stop().animate({ 'scrollTop' : newTop }, animationTime, function(){
	window.location.hash = $(sel).attr('href');
   });
   return false;
 })
 
 // adjust side menu
 $(window).scroll(function(){
  var winTop = $(window).scrollTop(),
	  bodyHt = $(document).height(),
	  vpHt = $(window).height() + edgeMargin;  // viewport height + margin
  $.each( contentTop, function(i,loc){
   if ( ( loc > winTop - edgeMargin && ( loc < winTop + topRange || ( winTop + vpHt ) >= bodyHt ) ) ){
	$('#side_nav li')
	 .removeClass('selected')
	 .eq(i).addClass('selected');
   }
  })
 })
  
})


});
