jQuery.noConflict();
(function($) {	// protect against overwrite of $

// Tag HTML element with class to indicate JavaScript is on
// krudd@uow.edu.au 13/11/07
document.getElementsByTagName('html')[0].className += ' jsOn';
$(function() {
	$('body').addClass('jsOn');
});

// Flag to indicate IE 5.5 - 6
// krudd@uow.edu.au 29/05/07
$.browser.msie55_6 = $.browser.msie && /MSIE (5\.[5-9])|6/.test(navigator.userAgent);

// Fix for IE cursor and background image "flicker" on hover
// krudd@uow.edu.au 20/08/08
if ( $.browser.msie ) {
	try { document.execCommand('BackgroundImageCache', false, true); } catch (e) { };
}

// Basic cookie functions
// krudd@uow.edu.au 05/02/07
var Cookie = {
	set: function( name, value, hours ) {
		var expire = '';
		if( hours !== null ) {
			expire = new Date(); expire.setTime( expire.getTime() + ( hours * 36e5 ) );
			expire = '; expires=' + expire.toGMTString();
		}
		document.cookie = name + '=' + escape( value ) + expire + '; path=/'; 
	},
	
	get: function( name ) {
		var cv = ( new RegExp( name + '=([^;]+)' ) ).exec( document.cookie );
		return ( cv !== null ) ? unescape( cv[ 1 ] ) : null;
	},
	
	kill: function( name ) {
		document.cookie = name + '=; expires=Wed, 13-Apr-1977 00:00:00 GMT; path=/';
	}
};

// "Scroll locking": saving and restoration of scroll position
// krudd@uow.edu.au 07/07/08
$(function() {

	// get any previous scroll position
	var scrollPos = Cookie.get( 'scrollLock' );
	if( scrollPos !== null ) {
		Cookie.kill( 'scrollLock' );
		window.scrollTo( 0, scrollPos );
	}

	function saveScrollPos() {
		var y = 0 || window.pageYOffset
			|| ( document.documentElement && document.documentElement.scrollTop )
			|| document.body.scrollTop;
		Cookie.set( 'scrollLock', y, 1 );
		return true;
	}
	
	$('input.scrollLock,a.scrollLock').click( saveScrollPos );
	$('form.scrollLock')
		.submit( saveScrollPos )
		.find(':submit,:image,a')
			.click( saveScrollPos );

	jQuery.saveWindowScrollPosition = saveScrollPos;	// export
});

// External links open in a new window
// krudd@uow.edu.au 25/09/07
$(function() {
	$('a[href^="http://"]').attr('target', '_blank');
});

// jQuery extension to make "sort" work
// krudd@uow.edu.au 04/04/07
jQuery.fn.sort = function() {
  return this.pushStack( jQuery.makeArray( [].sort.apply( this, arguments ) ) ); 
};

// Setup "showIfChecked" sections
// krudd@uow.edu.au 18/12/07
$(function() {
	
	var sectsDone = {};
	var inputs = $('input.showIfChecked');
	
	inputs.each( function() {
		var showId = /showId\-([^\s]+)/.exec( this.className );
		if ( !showId ) return;
		
		var sectId = showId[1];
		var sectHashId = '#' + sectId;
		
		if ( sectsDone[ sectHashId ] ) return;
		sectsDone[ sectHashId ] = true;
		
		var sect = $( sectHashId );
		if ( !sect.length ) return;
		
		var showIfChecked = inputs.filter('.showId-' + sectId);

		function updateState() {
			if ( showIfChecked.filter(':checked').length )
				sect.removeClass('disabled');
			else
				sect.addClass('disabled');
		}
		
		showIfChecked
			.change( updateState )
			.filter(':radio')
				.click( updateState )  // for Safari and IE
				.each( function() {
					$(':radio[@name=' + this.name + ']')
						.not( showIfChecked )
							.change( updateState )
							.click( updateState );  // for Safari and IE
				});
		
		updateState();
	});
});

// Setup any resizable textareas
// krudd@uow.edu.au 19/09/07
$(function() {	

	var curArea = null;
	var lastY = 0;
	
	function resizeAreaBy( amount ) {
		var curHeight = curArea.height();
		var newHeight = Math.max( 50, curHeight + amount );
		if( newHeight != curHeight ) {
			curArea.height( newHeight );
			return true;
		}
		return false;
	}	

	function handleDrag(e) {
		if( resizeAreaBy( e.screenY - lastY ) )
			lastY = e.screenY;
		return false;
	}

	function handleStopDrag(e) {
		curArea = null;
		lastY = 0;
		$(document)
			.unbind( 'mousemove', handleDrag )
			.unbind( 'mouseup', handleStopDrag );
		return false;
	}
	
	$('textarea.resizable').each( function() {
		var textarea = $(this);
		
		var resizer = $('<a href="#" class="resizer" title="Resize by dragging or use the arrow keys">' +
			'Resize by dragging or use the arrow keys</a>')
			.insertAfter( textarea )
			.keydown( function(e) {
				if( e.keyCode != 40 && e.keyCode != 38 )
					return true;
				curArea = textarea;
				resizeAreaBy( (e.keyCode == 38) ? -10 : 10 );
				curArea = null;
				return false;
			})
			.mousedown( function(e) {
				curArea = textarea;
				lastY = e.screenY;
				$(document)
					.bind( 'mousemove', handleDrag )
					.bind( 'mouseup', handleStopDrag );
				return false;
			})
			.click( function() { return false; });
	});
});

// Setup any "folding" fieldsets
// krudd@uow.edu.au 26/09/07
$(function() {

	var grabNotifyRE = /notify-(\S+)/;

	$('fieldset.folding').each( function() {
		var fieldset = $(this);

		var classes = this.className.split(/\s+/);
		var toNotify = [];	
		for( var i = classes.length - 1; i >= 0; i-- ) {
			var match = grabNotifyRE.exec( classes[i] );
			if( match )
				toNotify.push( fieldset.parents('.' + match[1])[0] );
		}
		toNotify = $(toNotify);
		
		fieldset.addClass('closed');
		toNotify.addClass('fieldsetClosed');

		function toggleFolding() {
			fieldset.toggleClass('closed').toggleClass('open');
			toNotify.toggleClass('fieldsetClosed').toggleClass('fieldsetOpen');
			if( fieldset.is('.open') )
				($(':input', fieldset)[0] || this).focus();
			return false;
		}

		var legend = $('legend', this);
		legend.html('<a href="#">' + legend.html() + '</a>');		
		$('a', legend).click( toggleFolding );

		$('<a href="#" class="cancel">Cancel</a>')
			.click( toggleFolding )
			.appendTo( fieldset );		
	});
});


// Setup "orderable" lists/sections
// krudd@uow.edu.au 12/04/07
$(function() {
	$('ul.orderable,ol.orderable,div.orderable').each( function() {

		var list = this;
		var items = $('> *', list);
		
		if( items.length < 2 )
			return;

		// link select.order and parent order item
		items.each( function() {
			this.orderSelect = $('select.order', this)[0];
			this.orderSelect.orderItem = this;
		});
		
		// prevent leaks
		$(window).unload( function() {
			items.each( function() {
				this.orderSelect.orderItem = null;
				this.orderSelect = null;
			});
		});

		function sortList()
		{
			items.sort( function( a, b ) {
				return a.orderSelect.selectedIndex - b.orderSelect.selectedIndex;
			});

			// reindex and move into correct order
			for ( var i = 0, len = items.length; i < len; i++ ) {
				items[i].orderSelect.selectedIndex = i;
				list.appendChild( items[i] );	// could be optimised
			}
		}

		function changeOrder()
		{			
			var oldOrder = items.index( this.orderItem );
			var newOrder = this.selectedIndex;

			if( oldOrder == newOrder )
				return;
			
			list.insertBefore( this.orderItem, (oldOrder > newOrder) ? items[newOrder] : items[newOrder].nextSibling );

			this.focus();

			// rebuild and reindex list
			items = $('> *', list);	// could be optimised
			items.each( function( i ) { this.orderSelect.selectedIndex = i; });
		}
		
		$('select.order', items)
			.change( changeOrder )
			.keyup( changeOrder )
			.focus( function() { $(this.orderItem).addClass('current'); })
			.blur( function() { $(this.orderItem).removeClass('current'); });

		// initial sort
		sortList();
	});
});


// Setup the "standards browser" section
// krudd@uow.edu.au 21/05/08
$(function() {
	var standardsBrowser = $('div.standardsBrowser');
	
	$('li.branch', standardsBrowser).each( function() {
		var openButton = $(':submit', this);
		if( openButton.length < 1 ) return;
		
		var children = $(this).children().not(openButton);
		$(this)
			.prepend('<a href="#"></a>')
			.find('a')
				.append( children )
				.click( function() {
					openButton.click();
					return false;
				});
	});
	
	$('li.leaf', standardsBrowser).each( function() {
		var leaf = $(this);
		function checkSelected()
		{
			if( this.checked )
				leaf.addClass('selected');
			else
				leaf.removeClass('selected');
			return true;
		}
		$('input.checkbox', this)
			.click( checkSelected )
			.each( checkSelected );
	});
});


/*
 * jqModal - Minimalist Modaling with jQuery
 *   (http://dev.iceburg.net/jquery/jqmodal/)
 *
 * Copyright (c) 2007,2008 Brice Burgess <bhb@iceburg.net>
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 * 
 * $Version: 07/06/2008 +r13
 */
(function($) {
$.fn.jqm=function(o){
var p={
overlay: 50,
overlayClass: 'jqmOverlay',
closeClass: 'jqmClose',
trigger: '.jqModal',
ajax: F,
ajaxText: '',
target: F,
modal: F,
toTop: F,
onShow: F,
onHide: F,
onLoad: F
};
return this.each(function(){if(this._jqm)return H[this._jqm].c=$.extend({},H[this._jqm].c,o);s++;this._jqm=s;
H[s]={c:$.extend(p,$.jqm.params,o),a:F,w:$(this).addClass('jqmID'+s),s:s};
if(p.trigger)$(this).jqmAddTrigger(p.trigger);
});};

$.fn.jqmAddClose=function(e){return hs(this,e,'jqmHide');};
$.fn.jqmAddTrigger=function(e){return hs(this,e,'jqmShow');};
$.fn.jqmShow=function(t){return this.each(function(){$.jqm.open(this._jqm,t);});};
$.fn.jqmHide=function(t){return this.each(function(){$.jqm.close(this._jqm,t)});};

$.jqm = {
hash:{},
open:function(s,t){var h=H[s],c=h.c,cc='.'+c.closeClass,z=(parseInt(h.w.css('z-index'))),z=(z>0)?z:3000,o=$('<div></div>').css({height:'100%',width:'100%',position:'fixed',left:0,top:0,'z-index':z-1,opacity:c.overlay/100});if(h.a)return F;h.t=t;h.a=true;h.w.css('z-index',z);
 if(c.modal) {if(!A[0])L('bind');A.push(s);}
 else if(c.overlay > 0)h.w.jqmAddClose(o);
 else o=F;

 h.o=(o)?o.addClass(c.overlayClass).prependTo('body'):F;
 if(ie6){$('html,body').css({height:'100%',width:'100%'});if(o){o=o.css({position:'absolute'})[0];for(var y in {Top:1,Left:1})o.style.setExpression(y.toLowerCase(),"(_=(document.documentElement.scroll"+y+" || document.body.scroll"+y+"))+'px'");}}

 if(c.ajax) {var r=c.target||h.w,u=c.ajax,r=(typeof r == 'string')?$(r,h.w):$(r),u=(u.substr(0,1) == '@')?$(t).attr(u.substring(1)):u;
  r.html(c.ajaxText).load(u,function(){if(c.onLoad)c.onLoad.call(this,h);if(cc)h.w.jqmAddClose($(cc,h.w));e(h);});}
 else if(cc)h.w.jqmAddClose($(cc,h.w));

 if(c.toTop&&h.o)h.w.before('<span id="jqmP'+h.w[0]._jqm+'"></span>').insertAfter(h.o);	
 (c.onShow)?c.onShow(h):h.w.show();e(h);return F;
},
close:function(s){var h=H[s];if(!h.a)return F;h.a=F;
 if(A[0]){A.pop();if(!A[0])L('unbind');}
 if(h.c.toTop&&h.o)$('#jqmP'+h.w[0]._jqm).after(h.w).remove();
 if(h.c.onHide)h.c.onHide(h);else{h.w.hide();if(h.o)h.o.remove();} return F;
},
params:{}};
var s=0,H=$.jqm.hash,A=[],ie6=$.browser.msie&&($.browser.version == "6.0"),F=false,
i=$('<iframe src="javascript:false;document.write(\'\');" class="jqm"></iframe>').css({opacity:0}),
e=function(h){if(ie6)if(h.o)h.o.html('<p style="width:100%;height:100%"/>').prepend(i);else if(!$('iframe.jqm',h.w)[0])h.w.prepend(i); f(h);},
f=function(h){try{$(':input:visible',h.w)[0].focus();}catch(_){}},
L=function(t){$()[t]("keypress",m)[t]("keydown",m)[t]("mousedown",m);},
m=function(e){var h=H[A[A.length-1]],r=(!$(e.target).parents('.jqmID'+h.s)[0]);if(r)f(h);return !r;},
hs=function(w,t,c){return w.each(function(){var s=this._jqm;$(t).each(function() {
 if(!this[c]){this[c]=[];$(this).click(function(){for(var i in {jqmShow:1,jqmHide:1})for(var s in this[i])if(H[this[i][s]])H[this[i][s]].w[i](this);return F;});}this[c].push(s);});});};
})(jQuery);


// Setup jqModal boxes
// krudd@uow.edu.au 22/03/07
$(function() {
	
	var infoLinks = $('a.info');
	if( infoLinks.length < 1 )
		return;

	infoLinks.attr('target','info');
	
	$('body')
		.append('<div class="infoWindow">'
				+ '<a href="#" class="close">Close</a>'
				+ '<div class="content"><div class="head"><h1>Loading...</h1></div></div>'
			+ '</div>');

	$('.infoWindow')
		.jqm({
			ajax: '@href',
			target: '.content',
			trigger: infoLinks,
			overlayClass: 'infoWindowOverlay',
			closeClass: 'close',
			overlay: 60,
			modal: true,
			onShow: function(h) {
				h.w.jqmAddClose(h.o);
				h.o.css('cursor','default');
				h.w.fadeIn( 200, function() { h.w.find('a')[0].focus(); } );
			},
			onHide: function(h) {
				h.o.remove();
				if( h.t )
					h.t.focus();
				h.w.fadeOut( 200, function() {
						h.w.find('div.content')
							.html('<div class="head"><h1>Loading...</h1></div>');	
				});
				return false;
			}
		});
});


// Setup SWFUpload component
// krudd@uow.edu.au 24/07/08
// NOTE: This is currently built to only handle _1_ file upload per page
$(function() {
	// check whether the component is needed
	if ( typeof(SWFUploadSettings) == 'undefined' )
		return;

	var uploadArea = $('div.fileUploadArea');
	if ( uploadArea.length < 1 )
		return;

	// grab sections to display after upload is complete
	var uploadCompleteSections = $('div.uploadComplete').hide();

	// create "Select file" button
	var selectFileButton = $('<a href="#" class="selectFile">Select file</a>');
	$('<p></p>').append( selectFileButton ).prependTo( uploadArea );
	
	// create progress bar
	var progressArea = $('<p class="progressArea"></p>');
	var bar = $('<span class="bar"></span>').appendTo( progressArea );
	var text = $('<span class="text"></span>').appendTo( progressArea );
	
	progressArea
		.insertAfter( selectFileButton.parent() )
		.hide();

	// status area
	var status = $('<div class="status"></div>').insertAfter( selectFileButton.parent() );
	
	function updateStatus( message, type ) {
		if ( !message || !message.length ) {
			status.html('');
			return;
		}
		
		status.html('<p>' + ( !!type ? '<strong>' + type + ':</strong> ' : '' ) +
			message + '</p>');
	}
	
	// update progress bar
	function formatSize( size ) {
		var suf = ['B', 'KiB', 'MiB', 'GiB'];
		for( var i in suf ) {
			if ( size <= 1024 ) break;
			size /= 1024;
		}
		return (i > 0 ? size.toFixed(2) : size ) + '<em>' + suf[i] + '</em>';
	}
	
	function updateProgressTo( bytesLoaded, totalBytes, finished ) {
		bar.width( Math.ceil((bytesLoaded/totalBytes) * 100) + '%' );
		text.html( formatSize(bytesLoaded) + ' of ' + formatSize(totalBytes) );
		
		if ( bytesLoaded == totalBytes && !finished )
			updateStatus( 'Please wait...', 'Processing' )
	}
	
	// handlers
	var errorOccurred = false;

	// route debug messages to Firebug console (if possible)
	function swfuDebug( message ) {
		if ( window.console ) {
			if (typeof(message) === "object" && typeof(message.name) === "string" && typeof(message.message) === "string")
				window.console.error(message);
			else
				window.console.log(message);
		}
		if (this.settings.debug)
			this.debugMessage(message);
	}
	
	// fileQueued
	function fileQueued( fileObj ) {
		updateStatus( fileObj.name + ' (' + formatSize(fileObj.size) + ')', 'Uploading' );
	}
	
	// fileQueueError
	function fileQueueError( fileObj, errorCode, message ) {
		errorOccurred = true;
		updateStatus( message + ' Please choose another file.', 'Error' )
	}
	
	// uploadError
	function uploadError( fileObj, errorCode, message ) {
		errorOccurred = true;
		updateStatus( 'An error occured while uploading the file. Please contact the administrator.'
		+ ' (' + errorCode + ':'+ message + ')', 'Error' )
	}

	// uploadProgress
	function uploadProgress( fileObj, bytesLoaded ) {
		updateProgressTo( bytesLoaded, fileObj.size );
	}
	
	// uploadSuccess
	function uploadSuccess( fileObj, serverData ) {
		uploadCompleteSections.show();
		updateProgressTo( fileObj.size, fileObj.size, true );
		updateStatus( fileObj.name + ' has been uploaded', 'Upload complete' );
	}

	// fileDialogComplete
	function fileDialogComplete( numFilesSelected, numFilesQueued ) {
		if ( errorOccurred || numFilesSelected < 1 )
			return;
		
		selectFileButton.hide();
		progressArea.show();
		
		this.startUpload();
	}
	
	// merge in defaults with specific settings
	SWFUploadSettings = $.extend(
		SWFUploadSettings,
		{
			// debug - remove in production
			//debug_handler: swfuDebug,
			
			// upload limits
			file_upload_limit: "1",
			file_queue_limit: "1",
			
			// handlers 
			file_queue_error_handler: fileQueueError,
			file_queued_handler: fileQueued,
			file_dialog_complete_handler: fileDialogComplete,
			upload_error_handler: uploadError,
			upload_success_handler: uploadSuccess,
			upload_progress_handler: uploadProgress
		}
	);

	// create SWFUpload
	var swfu = new SWFUpload( SWFUploadSettings );				
	
	// show file dialog
	selectFileButton.click( function() {
		updateStatus();
		errorOccurred = false;
		swfu.selectFile();
		return false;
	});

});


/* -- The following "common" code needs to go at the end -- */

// "Discourage" the use of the Back button (only warn once every minute)
// krudd@uow.edu.au 24/08/08
$(function() {

	// don't use on specific pages	
	if ( $('body').is('.allowBackButton') ) {
		Cookie.kill('NoBackWarned');
		Cookie.kill('NoBackPast');
		Cookie.kill('NoBackLast');
		return;
	}
	
	// refresh 'only warn once' cookie
	if ( Cookie.get('NoBackWarned') !== null ) {
		Cookie.set('NoBackWarned', 'true', .02);
		Cookie.kill('NoBackPast');
		Cookie.kill('NoBackLast');
		return;
	}
	
	var curLoc = window.location.href.replace(/\w+:\/\/[^\/]+/, '');
	var noBackLast = Cookie.get('NoBackLast');
	
	// ignore page refresh
	if ( curLoc == noBackLast )
		return;
	
	var noBackPast = Cookie.get('NoBackPast');
	
	if ( noBackPast && noBackPast.length && noBackPast == curLoc ) {
		alert('Please do not use the \'Back\' button, use this site\'s links and buttons to navigate. \nUsing the \'Back\' button may result in loss of information.');
		Cookie.set('NoBackWarned', 'true', .02);
		return;
	}
	
	Cookie.set('NoBackPast', noBackLast, .02);
	Cookie.set('NoBackLast', curLoc, .02);
});


// Disable "Enter key submits", except where otherwise specified
// krudd@uow.edu.au 11/04/07
// Removed 23/09/09 - krudd - Conflicts with Selenium testing

// Fix lack of label clicking in Safari and Internet Explorer
// krudd@uow.edu.au 11/02/08
if ( $.browser.safari || $.browser.msie55_6 ) {
	$(function() {
		$('label').click( function(e) {
			var input = $('#' + this.htmlFor)[0] || $('input,select,textarea', this)[0];
			if ( !input || e.target == input )
				return true;
			if( !input.disabled && !input.readonly
				&& !( $.browser.safari && (input.type == 'checkbox' || input.type == 'radio') ) )
				input.focus();
			if ( input.click )
				input.click();
			return false;
		});
	});
}


// Setup warning about exiting page without saving changes
// krudd@uow.edu.au 18/08/08
$(function() {

	var orginalTitle = document.title;
	var warn = false;
	var wasWarned = false;
	
	function contentChanged( elem ) {
		$(elem)
			.addClass('changed')
			.parents('label,.flagWhenChildChanged')
				.addClass('changed');

		if ( warn != true ) {
			warn = true;
			wasWarned = false;
			document.title = orginalTitle + ' *';
		}
	}

	// change checkers
	function textCheck() {
		if ( this.originalValue != this.value )
			contentChanged( this );
	}

	function checkboxRadioCheck() {
		if ( this.defaultChecked != this.checked )
			contentChanged( this );
	}

	function selectCheck() {
		if ( $(this.options).filter( function() { return this.defaultSelected == this.selected; }).length )
			contentChanged( this );
	}

	// add change handlers for all the changeable elements
	$('form').not('.ignoreChanges').each( function() {

		var elems = $(this.elements).not('.ignoreChanges');
		
		// text inputs and text areas	
		elems.filter(':text,textarea')
			.keyup( textCheck )
			.change( textCheck )
			.each( function() { this.originalValue = this.value; } );
	
		// radio buttons and check boxes
		elems.filter(':radio,:checkbox')
			.click( checkboxRadioCheck )
			.change( checkboxRadioCheck );
	
		// selects
		elems.filter('select')
			.change( selectCheck );
			
		// submits
		elems.filter(':submit')
			.click( function() {
				warn = false;
				document.title = orginalTitle;
			});
	})
	.submit( function() {
		warn = false;
		document.title = orginalTitle;
	});

	// add warning to page via "onbeforeunload"
	(function() {
		var old = window.onbeforeunload;
		window.onbeforeunload = function() {
			var str = old ? old() : null;
			if ( warn && !wasWarned )
				str = (str ? (str + '\n') : '') + 'You have not saved your changes!';
			if ( str )
				return str;
		};
	})();
	
	// add warning to links which go to other pages 
	var loc = location.href.replace(/#.*$/,'');
	$('a')
		.filter( function() {
			return !( ( this.target && this.target.length > 0 ) ||
				this.href.replace(loc, '').indexOf('#') == 0 );
		})
		.click( function() {
			if ( warn && !wasWarned ) {
				var exitPage = confirm( 'You have not saved your changes!\n Do you still want to leave this page?' );
				wasWarned = exitPage;
				return exitPage;
			}
		});
});

})(jQuery);