function basename (path, suffix) {
    // Returns the filename component of the path  
    // 
    // version: 910.820
    // discuss at: http://phpjs.org/functions/basename    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Ash Searle (http://hexmen.com/blog/)
    // +   improved by: Lincoln Ramsay
    // +   improved by: djmix
    // *     example 1: basename('/www/site/home.htm', '.htm');    // *     returns 1: 'home'
    // *     example 2: basename('ecra.php?p=1');
    // *     returns 2: 'ecra.php?p=1'
    var b = path.replace(/^.*[\/\\]/g, '');
        if (typeof(suffix) == 'string' && b.substr(b.length-suffix.length) == suffix) {
        b = b.substr(0, b.length-suffix.length);
    }
    
    return b;
}

function getNumber(string) {
	string = string.replace(/\D/g,'');
	return parseInt(string);
}

function URLVariables(search) {
	if(search.length < 4) {
		return false;
	}
	search = search.substring(search.indexOf('?')+1);
	search = search.split('&');
	result = [];
	$.each(search, function () {
		var ar = this.split('=');
		var key = ar[0];
		var value = ar[1];
		result[key] = value;
	})
	return result;
}

function prepareGlobals() {
	window.ANIMATION_SPEED_FAST = 500;
	//window.HASH_SCROLL = 0;
}

function prepareCufon() {
	Cufon.replace('.cufon', {fontFamily:'DIN', hover:true});
	Cufon.replace('.cufon_myriad', {fontFamily:'Myriad Pro', hover:true});
	Cufon.replace('.cufon_rockwell', {fontFamily:'Rockwell Std'});
}

function fixHeights() {
	var page_info = $('#page_information');
	var container = $('#container');
	var info_bottom = $('#info_bottom');
	var content = $('#content');
	
	//we need to reset the heights in between js_toggle pages
	//this method makes the page flash however
	//container.height('auto');
	//content.height('auto');
	
	//instead we need to add together the height of the children
	var container_height = 0;
	var content_height = 0;
	
	$.each(container.children(), function () {
		container_height += $(this).outerHeight(true);
	});
	container_height -= 1; // for some reason!
	
	$.each(content.children(':visible'), function () {
		content_height += $(this).outerHeight(true);
	});
	
	var container_padding = getNumber(container.css('padding-top'));
		
	var offset = content.offset().top - container.offset().top;
	var leftHeight = container_height - offset;
	var rightHeight = content_height;
	
	var contentTarget, containerTarget;
	
	if(rightHeight < leftHeight) {
		contentTarget = leftHeight;
		containerTarget = leftHeight + offset - container_padding;
	}
	else {
		contentTarget = rightHeight;
		containerTarget = rightHeight + offset - container_padding;
	}
	content.height(contentTarget);
	container.height(containerTarget);
	$('#wrapper').css('height','auto');
}

// saves the scroll position between pages
// uses cookies if available or submits a hidden form
function saveScrollPosition(href) {
	var scrollTop = $(document).scrollTop();
	$.cookie('scroll_top', scrollTop);
	if($.cookie('scroll_top') == null) {
		var $form = $('#js_scrolltop');
		$form.find('input').val(scrollTop);
		$form.attr('action', href)
		$form.submit();
	}
	else {
		window.location = href;
	}
}

function setScroll() {
	// GET way:
	/*st = URLVariables()['st'];
	if(typeof(st) != 'undefined') {
		$(document).scrollTop(st);
	}*/
	
	var scrollTop;
	
	if($.cookie('scroll_top') != null) {
		// COOKIE way:
		scrollTop = $.cookie('scroll_top');
	}
	else {
		// POST way:
		// the input in js_scrolltop form has it's value set in PHP
		var scrollTop = $('#js_scrolltop input').val();
	}
	$(document).scrollTop(scrollTop);
}

function prepareAnimation() {
	$('div.glosref').css('display','none');
	// set scroll will work because the wrapper height is 1280px until fixheight is called
	setScroll();
	$('#wrapper').addClass('hasJS');
	$('div.glosref').css('display','block');
	$('#page_information').css('left',-313);
	$('#content').css('opacity',0);
	$('.box_navigation:first').addClass('visible');
	$('.box_navigation:not(:first)').addClass('hidden');
}

function animateIn() {
	$('#page_information').animate({left:0}, window.ANIMATION_SPEED_SLOW, "easeInOutQuart", function () {
		$('#content').animate({opacity:1}, window.ANIMATION_SPEED_SLOW, "easeInOutQuart", function () {
		});
	});
}

function animateOut(href) {
	$('#content').animate({opacity:0}, window.ANIMATION_SPEED_SLOW, "easeInOutQuart", function () {
		$('#page_information').animate({left:-313}, window.ANIMATION_SPEED_SLOW, "easeInOutQuart", function () {
			saveScrollPosition(href);
		});
	});
}

function prepareAjaxLogin() {
	$.ajaxSetup ({
		cache:false
	});
	
	$('#login form').submit(function (e) {
		e.preventDefault();
		$.post("system/login_check_ajax.php", $(this).serialize(), function(data){
			if(data == 'true') {
				$('#login').fadeOut(window.ANIMATION_SPEED_SLOW, "easeInOutQuart");
				animateOut('system/index.php')
			}
			else {
				var message = $('#login legend');
				message.empty().addClass('message').append(data);
			}
		});
	});
	
	$('#login').find('.close').click(function (e) {
		e.preventDefault();
		$('#login').css({'opacity':0, 'visibility':'hidden'});
	});
}

function showLoginBox() {
	var login = $('#login');
	var container = login.find('#login_container');
	var box_height = container.outerHeight();
	var margin = Math.round(($(window).height() - box_height)/2);
	container.css('margin-top',margin);
	login.height($(document).height()).css({'opacity':0, 'visibility':'visible'}).animate({opacity:1}, window.ANIMATION_SPEED_SLOW, "easeInOutQuart");
	login.find('input:first').focus();
}

function loginHandler(href) {
	if($.cookie("genomel") != null) {
		animateOut(href);
	}
	else {
		showLoginBox();	
	}
}

function prepareMenuLinks($links) {
	//$('a.js_new_page')
	//console.log($links);
	$links.click(function (e) {
		e.preventDefault();
		if($(this).attr('id') == 'js_members') {
			loginHandler($(this).attr('href'));
		}
		else {
			animateOut($(this).attr('href'));
		}
	});
}

// keeps our xhtml strict
function prepareBlankLinks($parent) {
	// make sure all links in the blog are _blank ones
	$('.blog_content a').addClass('blank');
	$('#js_meetings .news_container a').addClass('blank');
	$parent.find('.blank').click(function (e) {
		$(this).attr('target', '_blank');
	});
}

function prepareToggleLinks($parent) {	
	$parent.find('.js_toggle').click(function (e) {
		var href = $(this).attr('href');
		if(href.indexOf('#') < 0) {
			e.preventDefault();
			if(href.indexOf('link') < 0) {
				animateOut(href);
			}
			else {
				var default_page = ($('#content.home').length > 0) ? 'news1' : 'nav';
				var fragment = (URLVariables(href)['link'] != undefined && URLVariables(href)['link'].length > 0) ? URLVariables(href)['link'] : default_page;
				fragment = '#js_' + fragment;
				checkSharedPages(fragment);
				window.location.hash = fragment;
			}
		}
	});
}

function loadAjaxPage(fragment, callback) {
	var pagename = fragment.substring(4);
	// to account for multiple js_news pages
	pagename = (pagename.indexOf('news') >= 0) ? 'news' : pagename;
	pagename += '.php';
	var href = window.location.href;
	var index = href.indexOf('.php');
	href = (index >= 0) ? href.substring(0,index+4) : 'index.php';
	var folder = (window.folder != undefined && window.folder.length > 0) ? window.folder : basename(href,'.php');
	// for security
	folder = folder.replace(/[^a-zA-Z0-9_]+/,'');
	
	$.ajax({
		url: "./include/includeController.php",
		data: {path:folder, file:pagename},
		success: function(data) {
			$('#content #nkd_tagline').before(data);
			var $show = $(fragment);
			$show.addClass('hidden');
			Cufon.refresh();
			callback($show);
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			if(window.console) {
				console.log(textStatus + errorThrown);
			}
			callback($('.box_navigation:first'));
		}
	});
}

function checkSharedPages(fragment) {
	if(fragment == '#js_tandcs' || fragment == '#js_privacy') {
		window.folder = 'shared';
	}
	else {
		window.folder = '';
	}
}

// prepareToggleLinks MUST be called first
// this function will fire on page load
function setPage() {
	var default_page = ($('#content.home').length > 0) ? 'news1' : 'nav';
	var href = window.location.href;
	var link = (URLVariables(href)['link'] != undefined && URLVariables(href)['link'].length > 0) ? URLVariables(href)['link'] : default_page;
	var fragment = window.location.hash;
	fragment = (fragment.length > 1) ? fragment : '#js_' + link;

	var $show = ($(fragment)[0] != $(document)[0] && $(fragment).length > 0) ? $(fragment) : null;
	if($show == null) {
		checkSharedPages(fragment);
		loadAjaxPage(fragment, showPageOnLoad);
	}
	else {
		showPageOnLoad($show);
	}
}

function showPageOnLoad($show) {
	$('#content .box_navigation.visible').removeClass('visible');
	$('#content .box_navigation').addClass('hidden');
	$show.removeClass('hidden').addClass('visible');
	fixHeights();
	prepareMenuLinks($show.find('.js_new_page'));
	prepareGlossaryLinks($show);
	prepareBlankLinks($show);
	prepareToggleLinks($show);
	prepareAGMforms($show);
	animateIn();
}

// doesn't work well
/*// stores the scroll position on window scroll
function getScrollTop() {
	window.HASH_SCROLL = $(document).scrollTop();
	console.log(window.HASH_SCROLL);
}*/

// this function will fire onhashchange, or be explicitly called if onhashchange is not available
function hashFunc() {
	//$(document).scrollTop(window.HASH_SCROLL);
	var default_page = ($('#content.home').length > 0) ? '#js_news1' : 'js_nav';
	var fragment = window.location.hash;
	fragment = (fragment.length > 1) ? fragment : default_page;
	trackPageView();
	var $show = ($(fragment)[0] != $(document)[0] && $(fragment).length > 0) ? $(fragment) : null;
	$('#content').animate({opacity:0}, window.ANIMATION_SPEED_SLOW, "easeInOutQuart", function () {
		if($show == null) {
			loadAjaxPage(fragment, showPage);
		}
		else {
			showPage($show);
		}
	});
}

function showPage($show) {
	$('#content .box_navigation.visible').removeClass('visible');
	$('#content .box_navigation').addClass('hidden');
	$show.removeClass('hidden').addClass('visible');
	fixHeights();
	prepareMenuLinks($show.find('.js_new_page'));
	prepareGlossaryLinks($show);
	prepareBlankLinks($show);
	prepareToggleLinks($show);
	prepareAGMforms($show);
	$('#content').animate({opacity:1}, window.ANIMATION_SPEED_SLOW, "easeInOutQuart");
}

function doReferenceSearch(word) {
	if(word.length > 0 && word != 'Search') {
		$.each($('#references dt'), function() {
			var a = $(this).find('a');
			if(a.length > 0) {
				var haystack1 = a.attr('id').toLowerCase().substring(1);
				var haystack2 = a.text().toLowerCase();
				var needle = word.toLowerCase();
				if(haystack1.substring(10) != needle && haystack2.indexOf(needle) < 0) {
					$(this).css('display','none');
					$(this).next().css('display','none');
				}
				else {
					$(this).css('display','block');
					$(this).next().css('display','block');
				}	
			}
		});
	}
	else {
		$('#references dl').children().css('display','block');
	}
	$.each($('#references dl'), function () {
		$(this).find('.title').css('display','block');
		if($(this).find(':visible').length == 1) {
			$(this).find('.title').css('display','none');
		}
	});
}

function doGlossarySearch(word) {
	if(word.length > 0 && word != 'Search') {
		$.each($('#glossary dt'), function() {
			if($(this).text().toLowerCase().indexOf(word.toLowerCase()) < 0) {
				$(this).css('display','none');
				$(this).next().css('display','none');
			}
			else {
				$(this).css('display','block');
				$(this).next().css('display','block');
			}
		});
	}
	else {
		$('#glossary dl').children().css('display','block');
	}
}

function prepareGlossaryLinks($parent) {
	$parent.find('.js_glossary').click(function (e) {
		e.preventDefault();
		var $glossary = $('#glossary');
		var word = $(this).attr('href');
		// cut off #glossary_
		word = word.substring(10);
		$glossary.find('input').val(word).keyup();
		var topY = $(document).scrollTop() + 150;
		$glossary.css({visibility:'visible',top:topY}).animate({opacity:1}, window.ANIMATION_SPEED_FAST, "easeInOutQuart");
	})
	
	$parent.find('.js_references').click(function (e) {
		e.preventDefault();
		var $references = $('#references');
		var word = $(this).attr('href');
		// cut off #references_
		word = word.substring(12);
		$references.find('input').val(word).keyup();
		var topY = $(document).scrollTop() + 150;
		$references.css({visibility:'visible',top:topY}).animate({opacity:1}, window.ANIMATION_SPEED_FAST, "easeInOutQuart");
	})
}

function prepareGlossary() {
	
	var $glossary = $('#glossary');
	var $references = $('#references');
	var $both = $('.glosref');
	var $input = $both.find('input');
	var $h1 = $both.find('h1');
	
	// hide glossary to start
	$both.addClass('hasJS').css('opacity',0);
	
	// hide on close
	$both.find('.close').click(function (e) {
		e.preventDefault();
		$(this).parent('.glosref').css({'opacity':0, 'visibility':'hidden'});
	});
	
	// if there is anything left in the search box on refresh then search again
	doGlossarySearch($glossary.find('input').val());
	doReferenceSearch($references.find('input').val());
	
	// when selecting the input clear it
	$input.focus(function () {
		//if($(this).val() == 'Search') {
			$(this).attr('value','');
			$(this).keyup();
		//}
	});
	
	// when leaving the input if it's empty add 'Search'
	$input.blur(function () {
		if($(this).val().length == 0) {
			$(this).attr('value','Search');
		}
	});
	
	// do search as the user types
	$glossary.find('input').keyup(function () {
		doGlossarySearch($(this).val());
	});
	
	// do search as the user types
	$references.find('input').keyup(function () {
		doReferenceSearch($(this).val());
	});
	
	// save each description height for opening animation
	$.each($both.find('dd'), function () {
		$(this).attr('oheight', $(this).height());
		$(this).height(0);
	});
	
	// animate opening the description
	$both.find('dt a').click(function (e) {
		e.preventDefault();
		var $dd = $(this).parent().next();
		if($dd.height() == 0) {
			$dd.animate({height:$dd.attr('oheight')}, window.ANIMATION_SPEED_FAST, "easeInOutQuart");
		}
		else {
			$dd.animate({height:0}, window.ANIMATION_SPEED_FAST, "easeInOutQuart");
		}
	});
	
	// on drag save the initial mouse position
	$h1.mousedown(function (e) {
		var $box = $(this).parent('.glosref');
		$box.attr({'ix':e.pageX, 'iy':e.pageY, 'xpos':$box.offset().left, 'ypos':$box.offset().top, 'ismousedown':'true'});
	})
	
	// if dragging work out the displacement and move box
	$h1.mousemove(function (e) {
		var $box = $(this).parent('.glosref');
		if($box.attr('ismousedown') == 'true') {
			var dx = e.pageX - $box.attr('ix');
			var dy = e.pageY - $box.attr('iy');
			var xpos = parseInt($box.attr('xpos'));
			var ypos = parseInt($box.attr('ypos'));
			xpos += dx;
			ypos += dy;
			$box.css({'left':xpos,'top':ypos});	
		}
	});
	
	// if mouseup turn off dragging
	$both.mouseup(function (e) {
		$(this).attr('ismousedown','false');
	})
	
	// if mouse leave before mouseup, turn off dragging
	$both.mouseleave(function (e) {
		$(this).attr('ismousedown','false');
	})
}

function googleSearchComplete() {
	fixHeights();
	var $links = $('#searchcontrol a');
	$links.attr('target','_self');
	prepareMenuLinks($links);
}

function prepareAGMforms($show) {
	$show.find('#js_agm_pass').submit(function (e) {
		e.preventDefault();
		$.post('include/index/agm_formlogic.php', $(this).serialize(), function (data) {
			$('#js_agm_ajax_container').html(data);
			fixHeights();
			prepareAGMforms($('#js_agm'));
		});
	});
	$show.find('#js_agm_register').submit(function (e) {
		e.preventDefault();
		$.post('include/index/agm_formlogic.php', $(this).serialize(), function (data) {
			$('#js_agm_ajax_container').html(data);
			fixHeights();
			prepareAGMforms($('#js_agm'));
		});
	});
}

function setMenuBackground() {
	var $active = $('li#active');
	
	if($active.length > 0) {
		if($active.prev().length > 0) {
			$active.prev().addClass('previousMenu');
		}
		else {
			$('#menu').addClass('previousMenu');
		}	
	}
}

function trackPageView () {
	try {
		window.pageTracker._trackPageview(document.location.pathname + document.location.hash);
		if(window.console) {
			console.log('page tracked: ' + document.location.pathname + document.location.hash);
		}
	}
    catch(e) {
		if(window.console) {
			console.log('error tracking page');
		}
	}
}

function gaSSDSLoad (acct) {
  window.pageTracker = null;
  var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."),
      s;
  s = document.createElement('script');
  s.src = gaJsHost + 'google-analytics.com/ga.js';
  s.type = 'text/javascript';
  s.onloadDone = false;
  
  s.onload = function () {
    s.onloadDone = true;
	window.pageTracker = _gat._getTracker(acct);
    trackPageView();
  };
  //s.onreadystatechange = function() {
  //  if (('loaded' === s.readyState || 'complete' === s.readyState) && !s.onloadDone) {
  //    s.onloadDone = true;
  //    init();
  //  }
  //};
  document.getElementsByTagName('head')[0].appendChild(s);
}

function main() {
	//$(document).scroll(getScrollTop);
	$(window).bind('hashchange', hashFunc);
	prepareAnimation();
	gaSSDSLoad("UA-10788915-1");
	setMenuBackground();
	prepareGlobals();
	prepareGlossary();
	prepareAjaxLogin();
	prepareMenuLinks($('a.js_new_page'));
	prepareBlankLinks($(document));
	prepareGlossaryLinks($(document));
	prepareToggleLinks($(document));
	prepareCufon();
	setPage();
}

$(document).ready(main);
window.onload = fixHeights;


