	// -----------------------------------------------------------------------------
	//	General Routines
	// -----------------------------------------------------------------------------

	//browser detection variables
	var bV = parseInt(navigator.appVersion);
	var isPC = (navigator.userAgent.indexOf('Win')  != -1 && navigator.userAgent.indexOf('95')  != -1 )? true : false;
	var IE4 = ((document.all) && (bV>=4)) ? true : false;
	var NS4 = (!(navigator.userAgent.indexOf('4.04') !=-1 && isPC) && document.layers) ? true : false;
	var NS6 = (document.getElementById)? true : false;
	var ver4 = (NS4 || IE4 || NS6) ? true : false;

	// Fix Netscape's OnResize Bug
	//
	// This code is required if we have positioned <div> elements.

	if(!window.saveInnerWidth) {
	  window.onresize = resize;
	  window.saveInnerWidth = window.innerWidth;
	  window.saveInnerHeight = window.innerHeight;
	}

	function resize() {
	  if (saveInnerWidth < window.innerWidth ||
	    saveInnerWidth > window.innerWidth ||
	    saveInnerHeight > window.innerHeight ||
	    saveInnerHeight < window.innerHeight )
	  {
	    window.history.go(0);
	  }
	}
	// End: Fix Netscape's OnResize Bug

	//DHTML scripting
	if (NS4) {
	     var layerRef = 'document.layers';
	     var styleSwitch = '';
	     var leftSwitch = '.left';
	     var rightSwitch = '.right';
	}else{
	     var layerRef = 'document.all';
	     var styleSwitch = '.style';
	     var leftSwitch = '.pixelLeft';
	     var rightSwitch = '.pixelRight';
	}

	var lastLyr = '';

	function ShowThisLayer(evt,LayerName){
	  	if (!ver4) return;

		//get available window content width and height
		if(NS4) {
			var winWidth = window.innerWidth;
			var winHeight = window.innerHeight;
		}
		else {
			var winWidth = document.body.clientWidth;
			var winHeight = document.body.clientHeight;
		}

		//get layer approx. width and height
		if(eval(layerRef+'["'+LayerName+'"]')){
			if(NS4) {
				eval('var lyrWidth = '+layerRef+'["'+LayerName+'"].clip.width');
				eval('var lyrHeight = '+layerRef+'["'+LayerName+'"].clip.height');
			}
			else {
				eval('var lyrWidth = '+layerRef+'["'+LayerName+'"].clientWidth');
				eval('var lyrHeight = '+layerRef+'["'+LayerName+'"].clientHeight');
			}
		}
		else {
			//just in case the layer object is unavailable.
			var lyrWidth = 200;
			var lyrHeight = 77;
		}

		//get rid of old layer.
		if(lastLyr != "") {
			hideLayer('"+lastLyr+"');
		}

		//calculate position of new layer, based on window dimensions
		if(NS4) {
			var topPos = ((evt.pageY - 7) >= 0) ? (evt.pageY - 7):0;
			if ((topPos + lyrHeight + 25) > winHeight)
				topPos = evt.pageY - lyrHeight;

			if ((evt.pageX + lyrWidth) > document.images['frameborder'].width ||
				(evt.pageX + lyrWidth) > winWidth) {
				var leftPos = (evt.pageX - lyrWidth) - 15;
			}
			else
				var leftPos = evt.pageX + 15;
		}
		else {
			var topPos = ((window.event.y - 7) >= 0)? (window.event.y - 7):0;
			if(isIE5) {
				topPos += document.body.scrollTop;
				if ((topPos + lyrHeight + 25) > (winHeight + document.body.scrollTop))
					topPos = (window.event.y + document.body.scrollTop) - lyrHeight;
			}
			else {
				if ((topPos + lyrHeight + 25) > winHeight)
					topPos = window.event.y - lyrHeight;
			}

			if ((window.event.x + lyrWidth) > document.images['frameborder'].width ||
				(window.event.x + lyrWidth) > winWidth)
				var leftPos = (window.event.x - lyrWidth) - 15;
			else
				var leftPos = window.event.x + 15;
		}

		//move that layer.
		if(eval(layerRef+'["'+LayerName+'"]')){
			eval(layerRef+'["'+LayerName+'"]'+styleSwitch+'.top = "'+ topPos +'"');
			eval(layerRef+'["'+LayerName+'"]'+styleSwitch+'.left = "'+ leftPos +'"');
			eval(layerRef+'["'+LayerName+'"]'+styleSwitch+'.zindex = "1"');
		}
		showLayer(LayerName);
		lastLyr=LayerName;
	}

	//called onmouseover and onmouseout
	function imgflip(imgname, imgpath) {
		if (document.images) {
			eval("document.images." + imgname + ".src = '" + imgpath + "'");
		}
	}

	//called by onmouseover
	function showLayer(layerName){
	  	if (!ver4) return;
		if(eval(layerRef+'["'+layerName+'"]')){
			eval(layerRef+'["'+layerName+'"]'+styleSwitch+'.visibility = "visible"');
		}
	}

	//called by onmouseout
	function hideLayer(layerName){
	  	if (!ver4) return;
		if(eval(layerRef+'["'+layerName+'"]')){
			eval(layerRef+'["'+layerName+'"]'+styleSwitch+'.visibility = "hidden"');
		}
	}

    // List an Ojects properties
    function dumpObject(o, objName) {
            var result = ""
            count = 0
            for (var i in o) {
                    result += o + "." + i + "=" + o[i] + "\n"
                    count++
                    if (count == 25) {
                            alert(result)
                            result = ""
                            count = 0
                    }
            }
            alert(result)
    }

	// Remove the leading space/s of an argument.
	function ltrim(argvalue) {
		while (1) {
			if (argvalue.substring(0, 1) != " ")
				break;
			argvalue = argvalue.substring(1, argvalue.length);
		}
		return argvalue;
	}

	// Remove the trailing space/s of an argument.
	function rtrim(argvalue) {
		while (1) {
			if (argvalue.substring(argvalue.length - 1, argvalue.length) != " ")
				break;
			argvalue = argvalue.substring(0, argvalue.length - 1);
		}
		return argvalue;
	}

	// Remove both the leading and the trailing space/s of an argument.
	function trim(argvalue) {
		var tmpstr = argvalue;
		var tmpstr = ltrim(tmpstr);
		return rtrim(tmpstr);
	}

	// -----------------------------------------------------------------------------
	//	State Management Routines
	// -----------------------------------------------------------------------------

	function StateManager(eventObj) {
		var formObj = eventObj.form;
		if (typeof formObj + "" == "undefined" || formObj == null || formObj == '') {
			var formObj = eval('document.' + eventObj.name);
		}

		switch (eventObj.name) {
			case "mandatory_info":
				// If mandatory_info screen, ensure all dropdowns are specified
				if (typeof formObj.mylanguage.options + "" != "undefined" && (
					!formObj.mylanguage.selectedIndex ||
					!formObj.mylanglevel.selectedIndex ||
					!formObj.mylocation.selectedIndex ||
					!formObj.mycoursetype.selectedIndex ||
					!formObj.mystartdate.selectedIndex ||
					!formObj.mynumweeks.selectedIndex )) {
					alert("All fields must first be specified.");
					return false;
				}
				else {
					formObj.pn.value = '2';
					formObj.target='_top';

					// move user to secure zone for remaining pages.
					// Verify that teenagersabroad.com is prefixed by www
					if (document.location.hostname == 'teenagersabroad.com') {
						formObj.action='https://www.teenagersabroad.com' + document.location.pathname;
					}
					else {
						formObj.action='https://' + document.location.hostname + document.location.pathname;
					}
				}
				break;

			case "mylocation":
				if ( eventObj.selectedIndex && trim(eventObj.options[eventObj.selectedIndex].value) == '') {
					for (i = eventObj.options.length - 1; i; i--) {
						if (eventObj.options[i].defaultSelected) {
							eventObj.options[i].selected = true;
							return true;
						}
					}
					eventObj.options[0].selected = true;
					break;
				}
				ValidateDependencies(eventObj);
				formObj.submit();
				break;

			case "mystartdate":
				if ( eventObj.selectedIndex && trim(eventObj.options[eventObj.selectedIndex].value) == '') {
					for (i = eventObj.options.length - 1; i; i--) {
						if (eventObj.options[i].defaultSelected) {
							eventObj.options[i].selected = true;
							return true;
						}
					}
					eventObj.options[0].selected = true;
					break;
				}
				ValidateDependencies(eventObj);
				formObj.submit();
				break;

			case "page_2":
				// Perform page validation
				var isPriceChecked = 0;
				for (var i = 0; i < eventObj.length; i++) {
					if (eventObj[i].checked)
						var isPriceChecked = i+1;
				}
				if (!isPriceChecked) {
					alert("To proceed, you must choose a price package");
					return false;
				}
				formObj.submit();
				break;

			case "page_3":
				// Nothing to validate, go to page 4
				formObj.submit();
				break;

			case "page_4":
				// Verify that student has checked the terms and conditions checkbox.
				if (!terms_and_cond.document.forms[0].agree_terms.checked) {
					alert("To proceed, you must first agree to the Terms & Conditions\nby moving to the bottom of our terms and ticking the box.");
					return false;
				}
				formObj.submit();
				break;

			case "page_5":
				// Create Javascript Objects out of PHP Array names
				var s_firstname_Obj = formObj.elements['personalinfo[s_firstname]'];
				var s_lastname_Obj = formObj.elements['personalinfo[s_lastname]'];
				var s_sexismale_Obj = formObj.elements['personalinfo[s_sexismale]'];
				var s_dob_m_Obj = formObj.elements['personalinfo[s_dob_m]'];
				var s_dob_d_Obj = formObj.elements['personalinfo[s_dob_d]'];
				var s_dob_y_Obj = formObj.elements['personalinfo[s_dob_y]'];
				var s_email_Obj = formObj.elements['personalinfo[s_email]'];
				var s_citizenship_Obj = formObj.elements['personalinfo[s_citizenship]'];

				var g_firstname_Obj = formObj.elements['personalinfo[g_firstname]'];
				var g_lastname_Obj = formObj.elements['personalinfo[g_lastname]'];
				var g_sexismale_Obj = formObj.elements['personalinfo[g_sexismale]'];
				var g_guardian_relation_Obj = formObj.elements['personalinfo[g_guardian_relation]'];
				var g_address_Obj = formObj.elements['personalinfo[g_address]'];
				var g_apt_Obj = formObj.elements['personalinfo[g_apt]'];
				var g_city_Obj = formObj.elements['personalinfo[g_city]'];
				var g_stateprov_Obj = formObj.elements['personalinfo[g_stateprov]'];
				var g_country_Obj = formObj.elements['personalinfo[g_country]'];
				var g_zipcode_Obj = formObj.elements['personalinfo[g_zipcode]'];
				var g_homenum_Obj = formObj.elements['personalinfo[g_homenum]'];
				var g_worknum_Obj = formObj.elements['personalinfo[g_worknum]'];
				var g_faxnum_Obj = formObj.elements['personalinfo[g_faxnum]'];
				var g_email_Obj = formObj.elements['personalinfo[g_email]'];

				var contact_allowed_Obj = formObj.elements['personalinfo[contact_allowed]'];
				var s_emergencyname_Obj = formObj.elements['personalinfo[s_emergencyname]'];
				var s_emergencynum_Obj = formObj.elements['personalinfo[s_emergencynum]'];
				var s_howheard_Obj = formObj.elements['personalinfo[s_howheard]'];

				if (trim(s_firstname_Obj.value) == "" || trim(s_firstname_Obj.value).length < 2) {
					alert("The students first name must be specified!");
					s_firstname_Obj.focus();
					s_firstname_Obj.select();
					return false;
				}
				else if (trim(s_lastname_Obj.value) == "" || trim(s_lastname_Obj.value).length < 2) {
					alert("The students last name must be at specified!");
					s_lastname_Obj.focus();
					s_lastname_Obj.select();
					return false;
				}
				else if (!isWords(s_firstname_Obj.value)) {
					alert("The students first name can contain only 'a-z0-9,_-.:;'");
					s_firstname_Obj.focus();
					s_firstname_Obj.select();
					return false;
				}
				else if (!isWords(s_lastname_Obj.value)) {
					alert("The students last name can contain only 'a-z0-9,_-.:;'");
					s_lastname_Obj.focus();
					s_lastname_Obj.select();
					return false;
				}
				else if (s_sexismale_Obj.options[0].selected) {
					alert("The students sex must be specified!");
					s_sexismale_Obj.focus();
					return false;
				}
				else if ( s_dob_m_Obj.options[0].selected || s_dob_d_Obj.options[0].selected || s_dob_y_Obj.options[0].selected ) {
					alert("The students date of birth must be specified!");
					if ( s_dob_m_Obj.options[0].selected ) {
						s_dob_m_Obj.focus();
					}
					else if ( s_dob_d_Obj.options[0].selected ) {
						s_dob_d_Obj.focus();
					}
					else if ( s_dob_y_Obj.options[0].selected ) {
						s_dob_y_Obj.focus();
					}
					return false;
				}
				else if (!isEmail(s_email_Obj.value)) {
					alert("The students email address must be specified!");
					s_email_Obj.focus();
					s_email_Obj.select();
					return false;
				}
				else if (s_citizenship_Obj.options[0].selected) {
					alert("The students citizenship must be specified!");
					s_citizenship_Obj.focus();
					return false;
				}

				else if (trim(g_firstname_Obj.value) == "" || trim(g_firstname_Obj.value).length < 2) {
					alert("The parent / guardians first name must be specified!");
					g_firstname_Obj.focus();
					g_firstname_Obj.select();
					return false;
				}
				else if (trim(g_lastname_Obj.value) == "" || trim(g_lastname_Obj.value).length < 2) {
					alert("The parent / guardians last name must be at specified!");
					g_lastname_Obj.focus();
					g_lastname_Obj.select();
					return false;
				}
				else if (!isWords(g_firstname_Obj.value)) {
					alert("The parent / guardians first name can contain only 'a-z0-9,_-.:;'");
					g_firstname_Obj.focus();
					g_firstname_Obj.select();
					return false;
				}
				else if (!isWords(g_lastname_Obj.value)) {
					alert("The parent / guardians last name can contain only 'a-z0-9,_-.:;'");
					g_lastname_Obj.focus();
					g_lastname_Obj.select();
					return false;
				}
				else if (g_sexismale_Obj.options[0].selected) {
					alert("The parent / guardians sex must be specified!");
					g_sexismale_Obj.focus();
					return false;
				}
				else if (g_guardian_relation_Obj.options[0].selected) {
					alert("The parent / guardians relationship to the student must be specified!");
					g_guardian_relation_Obj.focus();
					return false;
				}
				else if (trim(g_address_Obj.value) == "" || trim(g_address_Obj.value).length < 5) {
					alert("The parent / guardians address of residence must be specified!");
					g_address_Obj.focus();
					g_address_Obj.select();
					return false;
				}
				else if (trim(g_city_Obj.value) == "" || trim(g_city_Obj.value).length < 3) {
					alert("The parent / guardians city of residence must be specified!");
					g_city_Obj.focus();
					g_city_Obj.select();
					return false;
				}
				else if (trim(g_stateprov_Obj.value) == "" || trim(g_stateprov_Obj.value).length < 2) {
					alert("The parent / guardians state/province/region of residence must be specified!");
					g_stateprov_Obj.focus();
					g_stateprov_Obj.select();
					return false;
				}
				else if (g_country_Obj.options[0].selected) {
					alert("The parent / guardians country of residence must be specified!");
					g_country_Obj.focus();
					return false;
				}
				else if (trim(g_zipcode_Obj.value) == "" || trim(g_zipcode_Obj.value).length < 4) {
					alert("The parent / guardians Zip/Postal of residence code must be specified!");
					g_zipcode_Obj.focus();
					g_zipcode_Obj.select();
					return false;
				}
				else if (!isZipcode(g_zipcode_Obj.value)) {
					alert("The parent / guardians Zip/Postal code can only be numbers, letters, spaces, or apostrophe!");
					g_zipcode_Obj.focus();
					g_zipcode_Obj.select();
					return false;
				}
				else if (trim(g_homenum_Obj.value) != "" && !isPhoneFax(g_homenum_Obj.value)) {
					alert("The parent / guardians home phone number is invalid. Only 0-9,()- allowed!");
					g_homenum_Obj.focus();
					g_homenum_Obj.select();
					return false;
				}
				else if (trim(g_worknum_Obj.value) != "" && !isPhoneFax(g_worknum_Obj.value)) {
					alert("The parent / guardians work phone number is invalid. Only 0-9,()- allowed!");
					g_worknum_Obj.focus();
					g_worknum_Obj.select();
					return false;
				}
				else if (trim(g_homenum_Obj.value) == "" && trim(g_worknum_Obj.value) == "") {
					alert("Either the parent / guardians home or work number must be specified!");
					g_homenum_Obj.focus();
					g_homenum_Obj.select();
					return false;
				}
				else if (trim(g_faxnum_Obj.value) != "" && !isPhoneFax(g_faxnum_Obj.value)) {
					alert("The parent / guardians fax number is invalid. Only 0-9,()- allowed or remove all information to proceed");
					g_faxnum_Obj.focus();
					g_faxnum_Obj.select();
					return false;
				}
				else if (!isEmail(g_email_Obj.value)) {
					alert("The parent / guardians email address must be specified!");
					g_email_Obj.focus();
					g_email_Obj.select();
					return false;
				}
				else if (contact_allowed_Obj.options[0].selected) {
					alert("Please specify whether we can contact the student!");
					contact_allowed_Obj.focus();
					return false;
				}
				else if (trim(s_emergencyname_Obj.value) == "" || trim(s_emergencyname_Obj.value).length < 3) {
					alert("A emergency contact must be specified.\nThis person may be notified of the situation in the event of an emergency!");
					s_emergencyname_Obj.focus();
					s_emergencyname_Obj.select();
					return false;
				}
				else if (trim(s_emergencynum_Obj.value) == "" || !isPhoneFax(s_emergencynum_Obj.value)) {
					alert("A emergency phone number must be specified, or may be detected as invalid. Only 0-9,()- allowed.\nThis number may be used in the event of an emergency!");
					s_emergencynum_Obj.focus();
					s_emergencynum_Obj.select();
					return false;
				}
				else if (s_howheard_Obj.options[0].selected) {
					alert("Please specify how you heard about us!");
					s_howheard_Obj.focus();
					return false;
				}

				formObj.submit();
				break;

			case "page_6":
				formObj.submit();
				break;

			case "page_7":
				document.location.href = 'http://' + document.location.hostname;
				break;


			default:
				ValidateDependencies(eventObj);
				formObj.submit();
		}
		return true;
	}

	function ValidateDependencies(eventObj) {
		var formObj = document.mandatory_info;

		// validate dependencies
		switch (eventObj.name) {
			case "mylanguage":
				formObj.mylanglevel.selectedIndex = 0;
			case "mylanglevel":
				formObj.mylocation.selectedIndex = 0;
			case "mylocation":
				formObj.mycoursetype.selectedIndex = 0;
			case "mycoursetype":
				formObj.mystartdate.selectedIndex = 0;
			case "mystartdate":
				formObj.mynumweeks.selectedIndex = 0;
		}
	}

	function isWords (inputVal) {
		var inputStr = inputVal.toString();
		inputStr = trim(inputStr.toLowerCase());

		if (inputStr == "")
			return false;
		for (var i=0; i<inputStr.length; i++) {
			var aChar = inputStr.charAt(i);
			if ((aChar < "0" || aChar > "9") && (aChar < "a" ||
				  aChar > "z") && !(aChar == " " || aChar == "," ||
				  aChar == ";" || aChar == ":" || aChar == "." ||
				  aChar == "\n" || aChar == "\r" ||
				  aChar == "_" || aChar == "&" || aChar == "-")) {
				return false;
			}
		}
		return true;
	}

	function isEmail(argvalue) {
		argvalue = trim(argvalue);
		if (argvalue == "")
			return false;

  		if (argvalue.indexOf(" ") != -1)
			return false;
		else if (argvalue.indexOf("@") == -1)
			return false;
		else if (argvalue.indexOf("@") == 0)
			return false;
		else if (argvalue.indexOf("@") == (argvalue.length-1))
			return false;

  		arrayString = argvalue.split("@");

		if (arrayString[1].indexOf(".") == -1)
			return false;
		else if (arrayString[1].indexOf(".") == 0)
			return false;
		else if (arrayString[1].charAt(arrayString[1].length-1) == ".") {
			return false;
		}
		return true;
	}

	function isNumber (inputVal) {
		var inputStr = inputVal.toString();
		inputStr = trim(inputStr.toLowerCase());

		if (inputStr == "")
			return false;
		for (var i=0; i<inputStr.length; i++) {
			var aChar = inputStr.charAt(i);
			if (aChar < "0" || aChar > "9") {
				return false;
			}
		}
		return true;
	}

	function isPhoneFax (inputVal) {
		var inputStr = inputVal.toString();
		inputStr = trim(inputStr.toLowerCase());

		if (inputStr == "")
			return false;
		for (var i=0; i<inputStr.length; i++) {
			var aChar = inputStr.charAt(i);
			if ((aChar < "0" || aChar > "9") && !(aChar == " " || aChar == "/" || aChar == "(" || aChar == ")" || aChar == "x" || aChar == "," || aChar == "-")) {
				return false;
			}
		}
		return true;
	}

	function isZipcode (inputVal) {
		var inputStr = inputVal.toString();
		inputStr = trim(inputStr.toLowerCase());

		if (inputStr == "")
			return false;
		for (var i=0; i<inputStr.length; i++) {
			var aChar = inputStr.charAt(i);
			if ((aChar < "0" || aChar > "9") && (aChar < "a" ||
				  aChar > "z") && !(aChar == " " || aChar == "-")) {
				return false;
			}
		}
		return true;
	}


	// -----------------------------------------------------------------------------
	//	Popup DHTML Routines
	// -----------------------------------------------------------------------------

	function showInlinePopup(page_number, param_header, param_name) {
		if (!trim(page_number) || !trim(param_header) || !trim(param_name)) {
			alert( 'Parameter Missing. i.e. showInlinePopup(page_number, param_header, param_name)' );
			return (0);
		}
		showLayer('popup_scroll');
		popup_scroll_frame.document.location.href='showmsg.php?t=popup_html&p='+page_number+'&h='+param_header+'&n='+param_name;
		return (1);
	}
	function closeInlinePopup() {
		popup_scroll_frame.close();
		hideLayer('popup_scroll');
		return (1);
	}
