// common variables, functions and objects for the MyClassbook.com web app



// add functions to an event without interupting previous instructions

function addEventFunction(obj, evType, fn)
{
	/* ***************************************************************
	 For some reason KHTML claims to implement addEventListener
	 but fails to deliver.
	*/

	if(obj.addEventListener && !(navigator.userAgent.indexOf('KHTML') > -1))	// DOM compliant browsers
	{
		return obj.addEventListener(evType.substr(2), fn, false);
	}
	else if(obj.attachEvent)	// internet explorer
	{
		return obj.attachEvent(evType, fn);
	}
	else
	{
		// try attaching the function directly
		var oldFn = obj[evType];

		if(!oldFn)	// we can safely attach the function
		{
			obj[evType] = fn;
		}
		else
		{
			// window.onload is the most common event and
			// should safely allow us to trigger multiple
			// functions without strange recursive behaviours

			if(obj == window && evType == 'onload')
			{
				obj[evType] = function()
				{
					oldFn();
					fn();
				}
			}
		}
	}
}

// focus the first text field by default
// and add styles to several form elements
// nice IE work around

addEventFunction(
	window,
	'onload',
	function()
	{

		if(document.forms[0] && document.forms[0].elements.length > 0)
		{
			// add event driven styles

			for(var i = 0; i < document.forms[0].elements.length; i++)
			{
				if(
					document.forms[0].elements[i].type == 'text' ||
					document.forms[0].elements[i].type == 'textarea' ||
					document.forms[0].elements[i].type == 'password'
					|| (document.forms[0].elements[i].type == 'select-one' && document.forms[0].elements[i].name != 'courseID')
				)
				{
					// set the field to change colour on focus - javascript is for the benefit of ie


					// Unfortunately Firefox selects become less responsive if focus attributes are applied.
					// This code should change as soon as that becomes a non-issue.

					if(document.forms[0].elements[i].type != 'select-one')
					{
						/*
						document.forms[0].elements[i].className = 'standardText';

						addEventFunction(document.forms[0].elements[i], 'onfocus',
							function()
							{
								this.className = 'focusedText';
							}
						);

						addEventFunction(document.forms[0].elements[i], 'onblur',
							function()
							{
								this.className = 'standardText';
							}
						);
						*/
					}

				}

				// attach some styles to different form elements

				else if(document.forms[0].elements[i].type == 'submit' || document.forms[0].elements[i].type == 'button')
				{
					document.forms[0].elements[i].className = 'button';
				}
				else if(document.forms[0].elements[i].nodeName.toLowerCase() == 'select')
				{
					if(document.forms[0].elements[i].getAttribute('size'))
					{
						document.forms[0].elements[i].className = 'sizeSelect';
					}
				}
			}

			// safari and konqueror should just focus on the form fields and not the labels when tabbing through

			if(document.getElementsByTagName && document.getElementById)
			{
				var labels = document.getElementsByTagName('label');

				for(var i = 0; i < labels.length; i++)
				{
					if(labels[i].getAttribute)
					{
						addEventFunction(labels[i], 'onfocus',
							function()
							{
								document.getElementById(this.getAttribute('for')).focus();
							}
						);
					}
				}
			}



			// style "formTable" elements

			if(document.getElementsByTagName)
			{
				var tables = document.getElementsByTagName('table');
				//var inputs = false;

				for(var i = 0; i < tables.length; i++)
				{
					if(tables[i].getAttribute && tables[i].getAttribute('class') == 'formTable')
					{
						inputs = tables[i].getElementsByTagName('input');

						for(var ii = 0; ii < inputs.length; ii++)
						{
							if(inputs[ii].type == 'text' || inputs[ii].type == 'password')
							{
								// the following two styles are for the benefit of IE 6-
								inputs[ii].style.border = 'none';
								inputs[ii].style.width = '100%';

								addEventFunction(
									inputs[ii],
									'onfocus',
									function()
									{
										this.parentNode.style.backgroundColor = '#ffc000';
									}
								);

								addEventFunction(
									inputs[ii],
									'onblur',
									function()
									{
										this.parentNode.style.backgroundColor = 'transparent';
									}
								);
							}
						}
					}
				}
			}


			for(var i = 0; i < document.forms[0].elements.length; i++)
			{
				if(
					document.forms[0].elements[i].name != 'courseID' &&
					(
						document.forms[0].elements[i].type == 'text' ||
						document.forms[0].elements[i].type == 'password' ||
						document.forms[0].elements[i].type == 'textarea'
						//|| document.forms[0].elements[i].type == 'select-one'
					)
				)
				{
					document.forms[0].elements[i].focus();
					break;
				}
			}
		}


		// "details" tables

		if(document.getElementsByTagName && document.body.getAttribute)
		{
			var tables = document.getElementsByTagName('table');
			var tbody;
			var inputs;
			var row;
			var rowClass;
			var labels;

			for(var i = 0; i < tables.length; i++)
			{
				if(tables[i].getAttribute('class') == 'details')
				{
					if(tables[i].getElementsByTagName('tbody').length > 0)
					{
						tbody = tables[i].getElementsByTagName('tbody')[0];
						rowClass = null;

						for(var ii = 0; ii < tbody.rows.length; ii++)
						{
							row = tbody.rows[ii];

							if(rowClass)
							{
								row.className = rowClass;
								rowClass = null;
							}
							else
							{
								rowClass = 'alternate';
							}

							// make labels full length of cell

							if((inputs = row.getElementsByTagName('input')) && (inputs[0].type == 'radio' || inputs[0].type == 'checkbox'))
							{
								for(var iii = 0; iii < row.cells.length; iii++)
								{
									cell = row.cells[iii];
									if(cell.innerHTML && cell.childNodes[0] != inputs[0] && cell.childNodes[0].nodeName.toLowerCase() != 'label')
									{
										cell.innerHTML = '<label for="' + row.getElementsByTagName('input')[0].id + '">' + cell.innerHTML + '</label>';
									}
								}
							}


							if(labels = row.getElementsByTagName('label'))
							{
								for(var iii = 0; iii < labels.length; iii++)
								{
									labels[iii].style.display = 'block';
								}
							}
						}
					}
				}
			}
		}






	}
);


// allow form submission to be halted

function checkBeforeSubmit()	// set the window['haltSubmit'] variable to true to halt submission
{
	if(window.haltSubmit)
	{
		window.haltSubmit = false;
		return false;
	}
	else
	{
		return true;
	}
}
