/**
 * Include script for javascript application layer.
 * 
 * @author R.J.T. de Vries <rdevries@thirdwave.nl>
 * @version 1.00, 01/18/2008
 * @access public
 */

//------------------------------------------------------------------------------
// PHASE I: INCLUDE ALL NECESSARY JAVASCRIPT FILES.
//------------------------------------------------------------------------------
document.write("<script src='/cms/jscripts/cms.event.js'></script>");
document.write("<script src='/cms/jscripts/cms.functions.js'></script>");
document.write("<script src='/cms/jscripts/cms.dateinput.js'></script>");
document.write("<script src='/inc/jscripts/ddMenus.js'></script>");
document.write("<script src='/inc/jscripts/EventregForm.js'></script>");
document.write("<script src='/inc/jscripts/FormDependencies.js'></script>");
document.write("<script src='/inc/jscripts/fakeFileselect.js'></script>");
document.write("<script src='/inc/jscripts/SpanExpander.js'></script>");

//------------------------------------------------------------------------------
// PHASE II: INITIALIZATION FUNCTION, CALLED ON DOCUMENT LOAD EVENT
//------------------------------------------------------------------------------

/**
 * Instance of ddMenus object.
 * @var object ddmenus
 * @access global
 */
var ddmenus;

/**
 * Instance of the FormDependencies object.
 * @var object formDependencies
 * @access global
 */
var formDependencies = null;

/**
 * Instance of eventregForm object. This object ads (unobtrusive) enhanced
 * usability features for the eventregistration form on the website.
 * @var object eventregForm
 * @access global
 */
var eventregForm = null;

/**
 * Instance of TabManager object.
 * @var object tabManager
 * @access global
 */
var tabManager = null;

/**
 * Date input management object, that takes care of automatically continuing to
 * next field input.
 * @var object dateInput
 * @access global
 */
var dateinput = null;
/**
 * Fake file input object, that enables you to style the file input fields
 * next field input.
 * @var object fakeFileUploads
 * @access global
 */
var fakeFileUploads = null;

/**
 * Instance of SpanExpander object.
 * @var object spanExpander
 * @access global
 */
var spanExpander = null;
 
/**
 * Initialization function.
 *
 * @param		boolean		refresh		should the nav-list be refreshed? default to true.
 * @return 	void
 * @access	public
 */
function init() {
	var selects, i, extlinks, newwinLinks;
	
	set_select_values();
	
	ddmenus = new ddMenus;
	if ( !ddmenus.init() ) {
		alert('Dropdown menus kunnen niet worden geactiveerd');
	}

	// set formdependencies.
	formDependencies = new FormDependencies;
	formDependencies.init();
	
	eventregForm = new EventregForm;
	eventregForm.init();
	
	selects = document.getElementsByAttribute('className', 'jumpto', 'select');
	for ( i = 0; i < selects.length; i++ ) {
		addEvent(selects[i], 'change', jump);
	}
	
	extlinks = document.getElementsByAttribute('className', 'external', 'a');
	for ( i = 0; i < extlinks.length; i++ ) {
		extlinks[i].setAttribute('target', '_blank');
	}
	
	// initialize dateinput.
	dateinput = new Dateinput;
	dateinput.init();
	
	// fakeFileUploads = new FakeFileUploads;
	// fakeFileUploads.init();
	
	// Add newwin event to links with class name = 'newwin*'.
	newwinLinks = document.getElementsByAttribute('className', 'newwin%', 'a');
	for ( i = 0; i < newwinLinks.length; i++ ) {
		addEvent(newwinLinks[i], 'click', _newwin);
	}
	
	// Get all buttons that have their className ending in 'sign'.
	var signBtns = document.getElementsByAttribute('className', '%sign', 'input');
	if ( signBtns.length ) {
		addEvent(document, 'scroll', _updateLoadingMessage);
		addEvent(document.body, 'scroll', _updateLoadingMessage);
		for ( i = 0; i < signBtns.length; i++ ) {
			addEvent(signBtns[i], 'click', _showWaitingMessage);
		}
	}
	
	spanExpander = new SpanExpander();
	spanExpander.init();
} // init()

//------------------------------------------------------------------------------
// PHASE III: Some site specific functions and setting of the onload handler.
//------------------------------------------------------------------------------

window.onload = init;

/**
 * Open a newwin to the href of the link, taking the size of the new window from
 * the classnew, which should new in the form of newwin<width>x<height>
 * 
 * @param		object	[e]		event object for compliant browsers.
 * @return	boolean				false to avoid default action in IE.
 * @access	global
 */
function _newwin(e) {
	var eventSrc, className, dimensions;
	
	if ( !e ) e = window.event;
	if ( !(eventSrc = getEventSrc(e)) ) return false;
	if ( eventSrc.tagName.toLowerCase() != 'a' ) return false;
	
	className = eventSrc.className.substr(6, 11);
	dimensions = className.split('x');
	newwin(eventSrc.getAttribute('href'), parseInt(dimensions[0]), parseInt(dimensions[1]));
	
	if ( e && e.preventDefault ) e.preventDefault();
	return false;
} // _newwin()

/**
 * Show the loading message, when the user clicked the 'sign' submit button.
 * 
 * @param		object		[e]		event object for compliant browsers.
 * @return	boolean					true to prevent preventing the default action.
 * @access	global
 */
function _showWaitingMessage(e) {
	var div, childDivs, scrollTop;

	if ( !(div = document.getElementById('preloaderdiv')) ) {
		return true;
	}

	childDivs = div.getElementsByTagName('div');
	if ( childDivs.length ) {
		childDivs[0].style.height = getAvailHeight() + 15 + 'px';
	}
	if ( childDivs.length > 1 ) {
		scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0;
		childDivs[1].style.top = scrollTop + 'px';
	}

	// for testing.
	div.style.display = 'block';
	return true;
} // _showWaitingMessage()

/**
 * Make sure the loading message is shown in the user's viewport.
 * 
 * @param		object		[e]		event object for compliant browsers.
 * @return	boolean					true to prevent preventing the default action.
 * @access	global
 */
function _updateLoadingMessage(e) {
	var div, childDivs, scrollTop;

	if ( !(div = document.getElementById('preloaderdiv')) ) {
		return true;
	}

	childDivs = div.getElementsByTagName('div');
	if ( childDivs.length > 1 ) {
		scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0;
		childDivs[1].style.top = scrollTop + 'px';
	}
	return true;
} // _updateLoadingMessage()

/**
 * Jump to the url that is given in the value of the selected option in the
 * event source.
 * 
 * @param		object		[e]		event object for compliant browsers.
 * @return	boolean					true on success, false on failure.
 * @access	global
 */
function jump(e) {
	var eventSrc, url;
	
	if ( !e ) e = window.event;
	if ( !(eventSrc = getEventSrc(e)) ) return false;
	if ( eventSrc.tagName.toLowerCase() != 'select' ) return false;
	if ( !(url = eventSrc.options[eventSrc.selectedIndex].value) ) return false;
	document.location = url;
	return true;
} // jump()

/**
 * Remove the default text from inputs to which this event was attached.
 * 
 * @param		object	[e]	event object for Mozilla based browsers.
 * @return	void
 */
function removeDefTxt(e) {
	if ( !e ) e = window.event;
	var eventSrc = getEventSrc(e);
	if ( eventSrc.getAttribute('defaultText') == eventSrc.value ) {
		eventSrc.value = '';
		if ( eventSrc.getAttribute('ispass') == 'yes' ) {
			eventSrc = changeInputType(eventSrc, 'password');
		}
		eventSrc.className = eventSrc.className.replace(' deftxt', '');
	}
	setTimeout( function() { eventSrc.focus(); }, 100);
} // removeDefTxt()

/**
 * Restore the default value for inputs to which this event was attached.
 * 
 * @param		object	[e]	event object for Mozilla based browsers.
 * @return	void
 */
function restoreDefTxt(e) {
	if ( !e ) e = window.event;
	var eventSrc = getEventSrc(e);
	if ( eventSrc.value == '' ) {
		eventSrc.value = eventSrc.getAttribute('defaultText');
		if ( eventSrc.getAttribute('ispass') == 'yes' ) {
			changeInputType(eventSrc, 'text');
		}
		eventSrc.className += ' deftxt';
	}
} // restoreDefTxt()

/**
 * Change the type of given input in a way that even Internet Explorer can
 * understand.
 * 
 * @param		object		inp				input element.
 * @param		string		newtype		new type to set.
 * @return	void
 */
function changeInputType(inp, newtype) {
	var str, input;
	try {
		inp.setAttribute('type', newtype);
	} catch(e) {
		str = "<input type='" + newtype + "' name='" + inp.name + "' value='" + inp.value + "' class='" + inp.className + "'>";
		input = document.createElement(str);
		input.setAttribute('ispass', 'yes');
		input.setAttribute('defaultText', inp.getAttribute('defaultText'));
		inp.parentNode.replaceChild(input, inp);
		addEvent(input, 'focus', removeDefTxt);
		addEvent(input, 'blur', restoreDefTxt);
		inp = input;
	}
	return inp;
} // changeInputType()