/*TUPAC COMMON**************************************************************************************/

	var MANAGER_NAME = '';	
	
	var AJAX_PROCESSOR = 'ajaxProcessor.php';
	var NO_DATA = '[no data]';
	var SPEED_FAST = 'fast';
	var SPEED_NORMAL = 'normal';
	var SPEED_SLOW = 'slow';
	var PATH_TO_HELP = 'help.php';

	$(function() {
	
		initNavMenu();
		initLoading();
		initLoginForm();
		initLinks();
		initBlurb();
		initAjax();

	});

/***************************************************************************************************/
	function initLoading(){
	// select only links to php files (i.e., not javascript) where target is this window
		$('#sideNav a[href*=.php][target!=_blank]').click(showLoading);
		$('#topNav a[href*=.php][target!=_blank]').click(showLoading);
		hideLoading();
	}

/**************************************************************************************************/
function initNavMenu() {

	// chained syntax looks funky, but I think it means only finding the elements once, 
	// which is more efficient than splitting the code into two lines ... yes??
	$('#sideNav .menuBox h3[class != selected]').addClass('menuTitle_up').next().hide();

	$('#sideNav .menuBox h3 a').click(
		function() {
		
			var h3 = $(this).parents('h3');
			var menuBoxContents = $(h3).next();

			// lines must be in THIS ORDER to work properly!
			$(h3).toggleClass('menuTitle_up', $(menuBoxContents).is(':visible'));
			$(menuBoxContents).slideToggle('normal');
			
		}
	);
}

/***************************************************************************************************/
	function initAjax(){

		$.ajaxSetup({
			type:"post",
			url:AJAX_PROCESSOR
		});	

		$('body').ajaxStart(showLoading);
		$('body').ajaxComplete(hideLoading);
		$().ajaxError(showAjaxError);

	}

/***************************************************************************************************/
	function showLoading(){
		 $('#loadingBox').fadeIn();
	}
	
/***************************************************************************************************/
	function hideLoading(){			
		 $('#loadingBox').fadeOut();
	}
	
/************************************************************************************************/
	function showAjaxError(e,xhr,settings,err){
		alert('AJAX ERROR: ' + err);
	}

/***************************************************************************************************/
	function initLinks(){
		$('#logMeIn').click(showLoginForm);
		$('#logMeOut').click(logout);
	}

/***************************************************************************************************/
	function initLoginForm(){
		$('#username').focus(); // doesn't seem to work in IE, but fails gracefully
		$('#loginCloseBox').click(hideLoginForm);
		$('#loginForm').submit(login); // initialize form elements
	}
	
/***************************************************************************************************
backup for the skip link -- since I can't make it work in any browser w/out JavaScript
(though I left the standard HTML in the skip link for screen readers, since I can't test there)
***************************************************************************************************/
	function initSkipLink(e){
		$('#skipLink').click(function(){
			$('#startmain').focus();
		});
	}
	
/***************************************************************************************************/
	function getUrlParam(name){
		var str = window.location.search;
		var obj = str.parseQuery();
		return obj[name];
	}

	var CONSOLE_DIV = '<div id="console"><h1><a href="javascript:;">LOG:</a></h1><p><a href="javascript:;">clear console</a></p><textarea id="consoleContents" readonly="readonly"></textarea></div>';

/***************************************************************************************************/
	function log(msg){
		var diagnostic = getUrlParam('diagnostic');
		if (!diagnostic) return;
		if (!($('#console').length)){
			if ($('#sideNav').is(':visible')){
				$('#sideNav').append(CONSOLE_DIV);
			}else{
				$('#mainContent').append(CONSOLE_DIV);
			}
			$('#console > h1 > a').click(function(){
				if ($('#consoleContents').is(':visible')) $('#consoleContents').hide();
				else $('#consoleContents').show();
			});
			$('#console > p > a').click(function(){
				$('#consoleContents').val('');
			});
		}
		//$('#consoleContents').prepend('<p>' + msg + '</p>');
		$('#consoleContents').val( msg + '\r' + $('#consoleContents').val() );
	}
	
/***************************************************************************************************/
	function showLoginForm(){
		log('showLoginForm');
		// don't proceed if there's already a login form present
		if ($('#loginBox').length > 0) return;

		var obj = new Object();
		obj["man"] = ''; // Manager class
		obj["fn"] = "showLoginForm";

		log($.dump(obj));

		$.ajax({
			data: obj,
			success: function(rData, rStatus, r){
				$('#mainContent').html(rData); // show the form
				initLoginForm();
			}
		});
		
	}
	
/***************************************************************************************************/
	function hideLoginForm(){
		
		//$('#loginBoxContents').html("please wait");
		$('#loginBox').fadeOut('normal', function(){
			window.location.reload();
		});
	}

/***************************************************************************************************/
	function login(){
		log('login');
		var obj = new Object();
		obj['man'] = '';
		obj['fn'] = 'login';
		obj['username'] = $('#username').val();
		obj['usercode'] = $('#usercode').val();
		
		log($.dump(obj));
		
		$.ajax({
			data: obj,
			success: function(rData, rStatus, r){
				log('rData:' + rData);
				if (rData == "1"){
					$('#loginBoxContents').html('logging in ... ');
					window.location.reload();
				}else{
					if ($('#loginBoxContents .errorMsg').length == 0){
						$('#loginBoxContents').prepend('<p class="errorMsg">Username and/or password incorrect. Try again.</p>');
					}
					$('#username').val('');
					$('#usercode').val('');
					$('#username').focus();
				}
			}
		});
	
	}

/***************************************************************************************************/
	function logout(){
	
		$('#mainContent').html('logging out ... ');

		var obj = new Object();
		obj['man'] = '';
		obj['fn'] = 'logout';

		$.ajax({
			data: obj,
			success: function(rData, rStatus, r){
				window.location.reload();
			}
		});

	}
	
/***************************************************************************************************
UTILITY FUNCTIONS
/***************************************************************************************************/
	function idFromElement(element){ 
	
		// if it's a number already, just return it
		if ((element - 0) == element) return element;
		
		// the context will be the containing .listItem element
		var itembox = $(element).parents('.listItem');
		// the id will be in <input class="item_id" val="xx"/>
		var id = $('input.item_id', $(itembox)).val();
		return id;
	
	}
	
/***************************************************************************************************/
	function idFromEvent(e){
		if ($(e.target).length > 0){
			return idFromElement(e.target);
		}else if ((e - 0) == e){
			return e;
		}else{
			return idFromElement(e);
		}
	}

/************************************************************************************************/
	function collectFormData(form){
		var obj = new Object();
		// this collects all form elements (input/select/textarea)
		$(':input', $(form)).each(function(){
			var returnMe = false;
			if ($(this).is('input[type=hidden]')){ // always return hidden fields
				returnMe = true;
			}else if ($(this).is('input[type=text], textarea, select')){ // return changed text fields/areas
				if ($(this).val() != $(this)[0].defaultValue){
					returnMe = true;
				}
			}else if ($(this).is('input[type=checkbox]:checked')){ // return checked checkboxes
				returnMe = true;
			}else if ($(this).is('input[type=radio]:checked')){ // return checked radio buttons (??)
				returnMe = true;
			}
			
			if (returnMe){
				var classname = $(this).attr('class');
				classname = classname.gsub(/textField|checkBox|leftCheckBox|rightCheckBox|inlineField|[ ]/,'');
				obj[classname] = $(this).val();
			}
		});
		return obj;
	}
	
/*************************************************************************************************/
	function newValue(field){
		
		var oldval = $(field)[0].defaultValue;
		var newval = $(field).val();
		var retval = null;
		if (oldval != newval) retval = newval;
		return retval;
		
	}

/***************************************************************************************************/
	function initBlurb(){
		$('.editBlurbLink').click(editBlurb);
	}
	
/***************************************************************************************************/
	function editBlurb(e){
		log('editBlurb');
		
		var obj = new Object();
		obj['man'] = MANAGER_NAME;
		obj['fn'] = 'editPageBlurb';
		obj['keyword'] = $('#blurb input.keyword').val();
				
		log($.dump(obj));
				
		$.ajax({
			data: obj,
			success: function(rData, rStatus, r){
				$('#pageBlurb')
					.html(rData);
				$('#blurb').slideDown(SPEED_FAST, function(){
					$(this).submit(updateBlurb);
					$(this).find('.cancelBlurbLink').click(cancelBlurb);
					$(this).find('.help').click(getMarkDownHelp);
					$(this).find('.blurb')
						.blur(cleanUpMarkDown)
						.focus();
				});
			}
		});
		
	}
	
/***************************************************************************************************/
	function cancelBlurb(e){
		log('cancelBlurb');
		
		var obj = new Object();
		obj['man'] = MANAGER_NAME;
		obj['fn'] = 'viewPageBlurb';
		obj['keyword'] = $('#blurb input.keyword').val();
				
		log($.dump(obj));
				
		$.ajax({
			data: obj,
			success: function(rData, rStatus, r){
				//log(rData);
				$('#pageBlurb')
					.html($(rData).find('#blurb'))
					.find('.editBlurbLink').click(editBlurb);

			}
		});
		
	}
	
/***************************************************************************************************/
	function updateBlurb(e){
		
		var form = $(e.target).closest('form');
		
		var obj = new Object();
		obj['man'] = MANAGER_NAME;
		obj['fn'] = 'updatePageBlurb';
		obj['keyword'] = $(form).find('.keyword').val();
		obj['blurb'] = $(form).find('.blurb').val();
				
		log($.dump(obj));
				
		$.ajax({
			data: obj,
			success: function(rData, rStatus, r){
				$('#pageBlurb')
					.html($(rData).find('#blurb'))
					.find('.editBlurbLink').click(editBlurb);
			}
		});
		
		
	}

/************************************************************************************************/
	function cleanUpMarkDown(e){
		log('cleanUpMarkDown');
		var markdown = $(e.target).val();
		var len1 = markdown.length;
		markdown = markdown.replace(/[^\w\d\s\.,\?!:;#$%\*@"'\-\(\)\/\[\]]/g, "");
		var len2 = markdown.length;
		$(e.target).val(markdown);
		log('--removed ' + (len1 - len2) + ' characters');
	}

/************************************************************************************************/
	function getHelp(type){
		var url = PATH_TO_HELP + '?p=' + type;
		var w=600;
		var h=600;
		var name = 'helpWindow';
		var t = (screen.availHeight/2) - (h/2);
		var l = (screen.availWidth/2) - (w/2);
		var features="top="+t+",left="+l+",resizable=yes,scrollbars=1,width="+w+",height="+h+"location=0,toolbar=0,status=0,menubar=0";
		window.open(url, name, features);
	}

/************************************************************************************************/
	function getMarkDownHelp(){
		getHelp('markdown');
	}

/**************************************************************************************************/
