

$(function() {
	init();
});

function init() {
	
	currentPath = '';
	
	// init nav
	$('#header .nav ul>li ul li').click(onNavClick);
	
	// init utils
	$('#utils ul li').click(onNavClick);
	
	// init slides / slideControls
	initSlides();
	
	// resize handler
	$(window).resize(resizeHandler);
	
	// init nav / deeplinking
	$.address.change(function(event) {
		// $.address.change event properties: value, path, pathNames, parameterNames, parameters, queryString
		
		// *** does change event fire on first load?
		
		if (event.path != "/") {
			
			if(event.path != currentPath) {
				// store path
				currentPath = event.path;
				
				// load content
				$('#body .contentWrapper').load(event.value, function() {
					
					// highlight utils nav (if applicable)
					$('#utils li.selected').removeClass('selected');
					$('#utils li a[href=#'+ event.value +']').parent().addClass('selected');
					
					// highlight nav (if applicable)
					$('#header .nav li.selected').removeClass('selected');
					$('#header .nav li a[href=#'+ event.value +']').parent().addClass('selected');
					$('#header .nav li a[href=#'+ event.value +']').parent().parent().parent().addClass('selected');
					
					// handle url parameters
					if (event.parameterNames.length == 0) {
						// *** default to first section
					} else {
						handleUrlParams(event);
					}
					
					// check for section slides
					if ($('#section_slides .slide').length > 0 ) {
						addSlides();
					}
					nextSlide();
					
					initPage();
				});
				
			} else {
				
				// handle url parameters
				if (event.parameterNames.length == 0) {
					// *** default to first section
				} else {
					handleUrlParams(event);
				}
				
				initPage();
			}
		
		}
		// $('#content').load(event.value + '.xml');
	});

}

function handleUrlParams(event) {
	var params = event.parameters;
	for (var i in params) {
		if (i == 'section') {
			//console.log(params[i]);
			var sectionID = params[i];
			$('#body .section.selected').hide().removeClass('selected');
			$('#body .section[id=' + sectionID + ']').show().addClass('selected');
		} else {
			//console.log('no section defined');
		}
	}
	
	// set subnav highlight
	$('#body .nav li.selected').removeClass('selected');
	$('#body .nav li a[href=#'+ event.value +']').parent().addClass('selected');
	
}
function initPage() {
	
	// balance columns
	var colH = null;
	$('.box .col').each(function() {
		$(this).css({'height':'auto'});
		// calc max height
		if (colH == null || $(this).height() > colH) {
			colH = $(this).height();
		}
	});
	
	// set columns to max height
	$('.box .col').each(function() { 
		$(this).css({'height':colH});
	});
	
	resizeHandler();
}
function onNavClick(e) {
	// set selected state (see'handleUrlParams')
	//$('#header .selected').removeClass('selected');
	//$('#utils .selected').removeClass('selected');
	//$(e.currentTarget).addClass('selected');
	
	// load content
	var href = $(e.currentTarget).find('a').attr('href').substr(2);
	
}


// form handling

function initContactForm() {
	$("#contact_form .default").focus(function(eventObj) {
		if ($(this).hasClass("default")) {
			$(this).attr('value', "");
			$(this).removeClass('default');
		}
	});
}

function submitContactForm() {
	if ($("#firstName").val() == "" || $("#firstName").val() == "First" || $("#lastName").val() == "" || $("#lastName").val() == "Last" || $("#email").val() == "" || $("#email").val() == "Email") {
		$('#contact_error').html("<p class='error'>Please complete the required fields.</p>").show();
		initPage();
	} else {
		$.post('assets/php/contact_request.php', $("#contact_form").serialize(), function(data) {
			if (data == "success") {
				$('#contact_error').html("").hide();
				$('#contact_form').hide();
				$('#contact_result').html("Thank you.").show();
				setTimeout("resetForm()", 5000);
			} else {
				$('#contact_error').html("").hide();
				$('#contact_form').hide();
				$('#contact_result').html("<p>There seems to have been an error processing your form. Please check your connection and try again or contact us directly at <a href='info@oxbowschool.org'>info@oxbowschool.org</a>.</p>").show();
				setTimeout("resetForm()", 8000);
			}
		});
	}
}

function submitAlumniUpdateForm() {
	if ($("#firstName").val() == "" || $("#lastName").val() == "" || $("#email").val() == "" || $("#message").val() == "") {
		$('#contact_error').html("<p class='error'>Please complete the required fields.</p>").show();
		initPage();
	} else {
		$.post('assets/php/alumni_request.php', $("#contact_form").serialize(), function(data) {
			if (data == "success") {
				$('#contact_error').html("").hide();
				$('#contact_form').hide();
				$('#contact_result').html("Thank you.").show();
				setTimeout("resetForm()", 3000);
			} else {
				$('#contact_error').html("").hide();
				$('#contact_form').hide();
				$('#contact_result').html("<p>There seems to have been an error processing your form. Please check your connection and try again or contact us directly at <a href='info@oxbowschool.org'>info@oxbowschool.org</a>.</p>").show();
				setTimeout("resetForm()", 8000);
			}
		});
	}
}

function resetForm() {
	document.contact_form.reset();
	$('#contact_error').html("").hide();
	$('#contact_form').fadeIn();
	$('#contact_result').html("").hide();
}







// *************************************************
// slide managment
// *************************************************

var slideInterval;
var slideDelay = 10; //10
var playState = 1;

function initSlides() {
	
	// hide all slides / register default slide set
	$('#slides .slide')
		.hide()
		.addClass('default');
	
	// start slideshow
	startSlides();
	nextSlide();
	
	// bind window focus
	$(window).bind("focus", function(event) {
		if (playState == 1) {
			startSlides();
		}
		//console.log('focus');
	});
	
	// bind window blur
	$(window).bind("blur", function(event) {
		stopSlides();
		//console.log('blur');
	});
	
	// init slide controls
	$('.slideControls .hide').toggle(function() {
		//$(this).html('Show Content');
		$(this).addClass('show');
		$('#body').fadeOut();
	}, function() {
		//$(this).html('Hide Content');
		$(this).removeClass('show');
		$('#body').fadeIn();
	});
	
	$('.slideControls .pause').toggle(function() {
		// set global play state
		playState = 0;
		// pause slideshow
		stopSlides();
	}, function() {
		// set global play state
		playState = 1;
		// play slideshow
		startSlides();
	});
	
}
function addSlides() {
	// set slide group to page hash
	var slideGroup = $.address.value().split('.')[0];
	
	// add group class to slides
	$('#section_slides .slide')
		.addClass(slideGroup) // add group class identifier
		.hide() // hide slides
		.appendTo($('#slides ul')); // add to master slide list
}
function loadSlide(id) {
	// load slide
	var elmt = $('#slides .slide').eq(id);
	elmt.html("<img src='" +  elmt.attr('src') + "' alt='" + elmt.attr('alt') + "' />");
	
	// reorder z-index of slides
	$('#slides .selected').css({'z-index':'-2'});
	elmt.css({'z-index':'-1'});
	
	// set selected class identifier
	$('#slides .selected').removeClass('selected');
	elmt.addClass('selected');
	
	// slide load handler
	elmt.find('img').load(function() {
		onLoadSlide($(this).parent());
	});
	
	// stop timer
	clearInterval(slideInterval);
}
function onLoadSlide(elmt) {
	
	// show new	
	elmt.fadeIn(500, function() {
		
		// hide old and clear inner html img
		$('#slides .slide').filter(':visible').filter(':not(.selected)').hide().html('');
		// set caption
		$('#footer .slideTitle').html(elmt.find('img').attr('alt'));
		
		// reset timer
		clearInterval(slideInterval);
		slideInterval = setInterval(function() {
	 		nextSlide();
		}, slideDelay*1000);
	
	});
	
	
	// display
	resizeHandler();
	
}
function nextSlide() {
	
	// set default
	var slideGroup = 'default';
	
	// retrieve slidegroup name from hash
	if ($.address.value() != "" && $.address.value() != "/") {
		slideGroup = $.address.value().split('.')[0];
		// check to see if slides defined
		if ($('#slides .slide.'+slideGroup).length == 0) {
			slideGroup = 'default';
		}
	}
	
	// clean up old slide list
	$('#slides .slide')
		.not('.selected')
		.not('.default')
		.not('.' + slideGroup)
		.remove();
	
	// create subset of slideGroup elements and current selected element
	var slideGroupElmts = $('#slides .slide.'+slideGroup)
		.add('#slides .slide.selected');
	
	// find index of selected element within slideGroup elements
	var selectedIndex = slideGroupElmts.index($('#slides .slide.selected'));
	
	//console.log(slideGroupElmts);
	//console.log(slideGroupElmts.length);
	//console.log('selectedIndex:' + selectedIndex);
	
	// check that there are more than 1 element in set
	if (slideGroupElmts.length > 1) {
		// find next element in slideGroup set
		if (selectedIndex == -1) {
			var nextElmt = slideGroupElmts.eq(Math.floor(Math.random()*slideGroupElmts.length));
		} else if (selectedIndex >= slideGroupElmts.length - 1) {
			var nextElmt = slideGroupElmts.eq(0);
		} else {
			var nextElmt = slideGroupElmts.eq(selectedIndex + 1);
		}
		// find same item in master slide set
		var slideIndex = $('#slides .slide').index(nextElmt);
		// load slide
		loadSlide(slideIndex);
	}
	
	//console.log(nextElmt);
	//console.log(' slideIndex:' + slideIndex);
}
function previousSlide() {
}
function startSlides() {
	//console.log('startSlides');
	
	//set controls
	$('.slideControls .slideshow').removeClass('play');
	
	// start timer
	clearInterval(slideInterval);
	slideInterval = setInterval(function() {
 		nextSlide();
	}, slideDelay*1000);
	
}
function stopSlides() {
	//console.log('stopSlides');
	
	// set controls
	$('.slideControls .slideshow').addClass('play');
	
	// stop timer
	clearInterval(slideInterval);
}





// *************************************************
// display / resize managment
// *************************************************

function resizeHandler() {
	//console.log("resizeHandler");
	
	// background
	fullscreen();
	
	// content
	var winH = $(window).height();
	var maxH = winH-(winH*.3)-100;
	//console.log(maxH/winH);
	$('.box').css({'max-height':maxH});
	$('#body .contentWrapper').css({'margin-top':winH*.3});
	
}

function fullscreen() {
	
	var elmt = $('#slides .selected img');
	var ratio = elmt.height()/elmt.width();
	var winH = $(window).height();
	var winW = $(window).width();
	var minW = 1020;
	var minH = 568;
	
	// set min H,W
	if (winH < minH) {
		winH = minH;
	}
	if (winW < minW) {
		winW = minW;
	}
	
	// scale
	if ((winH/winW) > ratio) {
		elmt.height(winH);
		elmt.width(winH / ratio);
	} else {
		elmt.width(winW);
		elmt.height(winW * ratio);
	}
	
	// center
	elmt.css('left', (winW - elmt.width())/2);
	elmt.css('top', (winH - elmt.height())/2);

}


/* open gallery
-----------------------------------------------------------------------------*/
function openGallery(url) {
	var params = 'status=no,toolbar=no,location=no,menubar=no,titlebar=no';
	newwin = window.open(url,'gallery', params);
	if (window.focus) { 
		newwin.focus();
	}
}


/* URL Encode Decode
-----------------------------------------------------------------------------*/

$.extend({
URLEncode:function(c){var o='';var x=0;c=c.toString();var r=/(^[a-zA-Z0-9_.]*)/;
  while(x<c.length){var m=r.exec(c.substr(x));
    if(m!=null && m.length>1 && m[1]!=''){o+=m[1];x+=m[1].length;
    }else{if(c[x]==' ')o+='+';else{var d=c.charCodeAt(x);var h=d.toString(16);
    o+='%'+(h.length<2?'0':'')+h.toUpperCase();}x++;}}return o;},
URLDecode:function(s){var o=s;var binVal,t;var r=/(%[^%]{2})/;
  while((m=r.exec(o))!=null && m.length>1 && m[1]!=''){b=parseInt(m[1].substr(1),16);
  t=String.fromCharCode(b);o=o.replace(m[1],t);}return o;}
});



/*
 * Date formatting functions adapted from FullCalendar v1.4.6
 * http://arshaw.com/fullcalendar/ */

/* Parse Date String
-----------------------------------------------------------------------------*/
	
	function parseISO8601(s, ignoreTimezone) {
	// derived from http://delete.me.uk/2005/03/iso8601.html
	// TODO: for a know glitch/feature, read tests/issue_206_parseDate_dst.html
	var m = s.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?$/);
	if (!m) {
		return null;
	}
	var date = new Date(m[1], 0, 1),
		check = new Date(m[1], 0, 1, 9, 0),
		offset = 0;
	if (m[3]) {
		date.setMonth(m[3] - 1);
		check.setMonth(m[3] - 1);
	}
	if (m[5]) {
		date.setDate(m[5]);
		check.setDate(m[5]);
	}
	fixDate(date, check);
	if (m[7]) {
		date.setHours(m[7]);
	}
	if (m[8]) {
		date.setMinutes(m[8]);
	}
	if (m[10]) {
		date.setSeconds(m[10]);
	}
	if (m[12]) {
		date.setMilliseconds(Number("0." + m[12]) * 1000);
	}
	fixDate(date, check);
	if (!ignoreTimezone) {
		if (m[14]) {
			offset = Number(m[16]) * 60 + Number(m[17]);
			offset *= m[15] == '-' ? 1 : -1;
		}
		offset -= date.getTimezoneOffset();
	}
	return new Date(+date + (offset * 60 * 1000));
};

function fixDate(d, check) { // force d to be on check's YMD, for daylight savings purposes
	if (+d) { // prevent infinite looping on invalid dates
		while (d.getDate() != check.getDate()) {
			d.setTime(+d + (d < check ? 1 : -1) * HOUR_MS);
		}
	}
}


/* Date Formatting
-----------------------------------------------------------------------------*/

var formatDate = function(date, format, options) {
	return formatDates(date, null, format, options);
};

var formatDates = function(date1, date2, format, options) {
	options = options;
	var date = date1,
		otherDate = date2,
		i, len = format.length, c,
		i2, formatter,
		res = '';
	for (i=0; i<len; i++) {
		c = format.charAt(i);
		if (c == "'") {
			for (i2=i+1; i2<len; i2++) {
				if (format.charAt(i2) == "'") {
					if (date) {
						if (i2 == i+1) {
							res += "'";
						}else{
							res += format.substring(i+1, i2);
						}
						i = i2;
					}
					break;
				}
			}
		}
		else if (c == '(') {
			for (i2=i+1; i2<len; i2++) {
				if (format.charAt(i2) == ')') {
					var subres = formatDate(date, format.substring(i+1, i2), options);
					if (parseInt(subres.replace(/\D/, ''))) {
						res += subres;
					}
					i = i2;
					break;
				}
			}
		}
		else if (c == '[') {
			for (i2=i+1; i2<len; i2++) {
				if (format.charAt(i2) == ']') {
					var subformat = format.substring(i+1, i2);
					var subres = formatDate(date, subformat, options);
					if (subres != formatDate(otherDate, subformat, options)) {
						res += subres;
					}
					i = i2;
					break;
				}
			}
		}
		else if (c == '{') {
			date = date2;
			otherDate = date1;
		}
		else if (c == '}') {
			date = date1;
			otherDate = date2;
		}
		else {
			for (i2=len; i2>i; i2--) {
				if (formatter = dateFormatters[format.substring(i, i2)]) {
					if (date) {
						res += formatter(date, options);
					}
					i = i2 - 1;
					break;
				}
			}
			if (i2 == i) {
				if (date) {
					res += c;
				}
			}
		}
	}
	return res;
};

var dateFormatters = {
	s	: function(d)	{ return d.getSeconds() },
	ss	: function(d)	{ return zeroPad(d.getSeconds()) },
	m	: function(d)	{ return d.getMinutes() },
	mm	: function(d)	{ return zeroPad(d.getMinutes()) },
	h	: function(d)	{ return d.getHours() % 12 || 12 },
	hh	: function(d)	{ return zeroPad(d.getHours() % 12 || 12) },
	H	: function(d)	{ return d.getHours() },
	HH	: function(d)	{ return zeroPad(d.getHours()) },
	d	: function(d)	{ return d.getDate() },
	dd	: function(d)	{ return zeroPad(d.getDate()) },
	ddd	: function(d,o)	{ return o.dayNamesShort[d.getDay()] },
	dddd: function(d,o)	{ return o.dayNames[d.getDay()] },
	M	: function(d)	{ return d.getMonth() + 1 },
	MM	: function(d)	{ return zeroPad(d.getMonth() + 1) },
	MMM	: function(d,o)	{ return o.monthNamesShort[d.getMonth()] },
	MMMM: function(d,o)	{ return o.monthNames[d.getMonth()] },
	yy	: function(d)	{ return (d.getFullYear()+'').substring(2) },
	yyyy: function(d)	{ return d.getFullYear() },
	t	: function(d)	{ return d.getHours() < 12 ? 'a' : 'p' },
	tt	: function(d)	{ return d.getHours() < 12 ? 'am' : 'pm' },
	T	: function(d)	{ return d.getHours() < 12 ? 'A' : 'P' },
	TT	: function(d)	{ return d.getHours() < 12 ? 'AM' : 'PM' },
	u	: function(d)	{ return formatDate(d, "yyyy-MM-dd'T'HH:mm:ss'Z'") },
	S	: function(d)	{
		var date = d.getDate();
		if (date > 10 && date < 20) {
			return 'th';
		}
		return ['st', 'nd', 'rd'][date%10-1] || 'th';
	}
};

function zeroPad(n) {
	return (n < 10 ? '0' : '') + n;
}


