function positionSidebar() {
	var contentTop = $('#content').offset().top - $('header').outerHeight();
	var footerTop = $('footer').offset().top;
	var gap = 28;
	var offset = contentTop - gap - $(window).scrollTop();
	var newtop = ( offset < 0 ) ? -offset : 0;
	
	// don't overlap the footer.
	if( (newtop + $('#sidebar').height() + contentTop + $('header').outerHeight()) > footerTop ) {
		newtop = footerTop - contentTop - $('#sidebar').height() - $('header').outerHeight();
	}
	$('#sidebar').stop(true).animate( {'top':newtop + 'px' }, 500 );	
}

function limit( input, min, max ) {
	if( input < min ) {
		return min;
	}
	if( input > max ) {
		return max;
	}
	return input;
}

function updateScrollControls( controlsElem ) {
	var article = $(controlsElem).closest( 'article' );
	var clipper = $(article).find( '.clipper' );
	var content = $(clipper).find( '.copy' );
	if( content.height() < parseInt( clipper.css('max-height') ) ) {
		$(controlsElem).hide();
	}
	var clipperHeight = $(clipper).height();
	
}

$(window).load(function(){
	$('#slider').nivoSlider({
		pauseTime:6000,
		directionNavHide:false,
		effect:'fade',
		prevText:'',
		nextText:''
	});			
	initPlaceholderSupport();
	
	$('article .controls').each( function( index, elem ) {
		updateScrollControls( elem );
	} );
	
	// scrolling of home page sections.
	$('article .controls a').click( function(event) { 
		var article = $(this).closest( 'article' );
		var clipper = $(article).find( '.clipper' );
		var clipperHeight = $(clipper).height();
		var distance = clipperHeight - 40;
		var direction = $(this).hasClass( 'up' ) ? 1 : -1; 
		var copy = $(article).find( '.clipper .copy' );
		var bottomPadding = 20;
		var newposition = limit( $(copy).position().top + (distance * direction), -(copy.height() - (clipperHeight - bottomPadding)), 0 );
		
		$(copy).stop(true).animate({
			top:newposition + 'px'
		},400);
	} );
	
	//thanks to Kasper for this smooth scroll snippet http://beski.wordpress.com/2009/04/21/scroll-effect-with-local-anchors-jquery/
	//tweaked a bit for our purposes.
	$('header nav li a').click(function(event) {
	
		// we only do this on the home page
		if( document.location.pathname != '/' ) {
			return;
		}
		
		// looking for hrefs starting with '/#'
		if( ! $(this).attr('href').charAt(1) == '#' ) {
			return;
		}
	
		var scrollTo = $(this).attr('href');
		var target = $( "[name='" + scrollTo.substr( scrollTo.indexOf('#') + 1 ) + "']" );
		if( target != null && target.length > 0 ) {
			event.preventDefault();		
			var offset = target.offset().top - $('header').outerHeight(); // allow room for the fixed header.
			$('html, body').animate({scrollTop:offset}, 500);
		}
		
		// window.location.href = window.location.pathname + scrollTo;
	});
	
	$('input,textarea').focus( function() {
		$(this).removeClass( 'error' );
	} );
	
	$('#addFarmForm').submit( function( event ) {
		var validation = validateForm( this );
		if( validation.errors.length > 0 ) {
			event.preventDefault();
			jQuery.each( validation.errors, function( index, elem ) {
				$(elem.field).addClass('error');
			} );
		}
	} );
	
	$('#contactForm').submit( function( event ) {
		event.preventDefault();
		if( ! validate( $('#contactForm input[name=email]'), 'email' ) ) {
			$('#contactForm input[name=email]').addClass( 'error' );
			return;
		}
		$('#contactForm').css( 'visibility', 'hidden' );
		$('#contactFormSection .ajaxSpinner').show();
		var data = $(this).serialize();
		data += '&isAjax=1&contactFormSubmit=1';
		jQuery.post( '/?id=17', data, function( data, status, req ) {
			$('#contactFormSection .ajaxSpinner').hide();
			$('#contactFormSection .message .content').html( data )
			$('#contactFormSection .message').show();
		} )
		.error( function() {
			alert( 'An error occurred. Please try again later.' );
			$('#contactFormSection .ajaxSpinner').hide();
			$('#contactForm').css( 'visibility', 'visible' );
		} );
		return false;
	} );
	
	$('#subscribeForm').submit( function( event ) {
		event.preventDefault();
		if( ! validate( $('#subscribeForm input[name=email]'), 'email' ) ) {
			$('#subscribeForm input[name=email]').addClass( 'error' );
			return;
		}
		$('#subscribeForm').css( 'visibility', 'hidden' );
		$('#subscribeFormSection .ajaxSpinner').show();
		var data = $(this).serialize();
		data += '&isAjax=1&action=doNewsletter';
		jQuery.post( '/?id=18', data, function( data, status, req ) {
			console.log( data );
			$('#subscribeFormSection .ajaxSpinner').hide();
			$('#subscribeFormSection .message .content').html( data )
			$('#subscribeFormSection .message').show();
		} )
		.error( function() {
			alert( 'An error occurred. Please try again later.' );
			$('#subscribeFormSection .ajaxSpinner').hide();
			$('#subscribeForm').css( 'visibility', 'visible' );
		} );
	} );
	
});

function validateForm( form ) {
	var results = { errors:[] };
	$(form).find( 'input,textarea' ).each( function(index, elem) {
		if( $(elem).hasClass( 'required' ) && ! validate( $(elem), 'required' ) ) {
			results.errors.push( { field:$(elem) } );
		}
		if( $(elem).hasClass( 'email' ) && ! validate( $(elem), 'email' ) ) {
			results.errors.push( { field:$(elem) } );
		}
	});
	return results;
}

function validate( field, type ) {
	switch( type ) {
		case 'email':
			return /^[\w\.]+@[\w\.]+\.[\w]+$/.test( $(field).val() );
		break;
		case 'required':
			return $(field).val().trim().length > 0;
		break;
		default:
			console.log( 'unrecognized validation type. skipping validation.');
			return true;
		break;
	}
}

$(window).ready( function() {
	$(window).scroll( $.throttle( 100, positionSidebar ) );
} );

function initPlaceholderSupport() {
	if( ! Modernizr.input.placeholder ) {
		$('[placeholder]').focus(function() {
		  var input = $(this);
		  if (input.val() == input.attr('placeholder')) {
			input.val('');
			input.removeClass('placeholder');
		  }
		}).blur(function() {
		  var input = $(this);
		  if (input.val() == '' || input.val() == input.attr('placeholder')) {
			input.addClass('placeholder');
			input.val(input.attr('placeholder'));
		  }
		}).blur();
	}
}


