	// -----------------------------------------------------------------------------
	//	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 languagesabroad.com is prefixed by www
					if (document.location.hostname == 'languagesabroad.com') {
						formObj.action='https://www.languagesabroad.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 firstname_Obj = formObj.elements['personalinfo[firstname]'];
				var lastname_Obj = formObj.elements['personalinfo[lastname]'];
				var address_Obj = formObj.elements['personalinfo[address]'];
				var apt_Obj = formObj.elements['personalinfo[apt]'];
				var city_Obj = formObj.elements['personalinfo[city]'];
				var stateprov_Obj = formObj.elements['personalinfo[stateprov]'];
				var country_Obj = formObj.elements['personalinfo[country]'];
				var zipcode_Obj = formObj.elements['personalinfo[zipcode]'];
				var sexismale_Obj = formObj.elements['personalinfo[sexismale]'];
				var dob_m_Obj = formObj.elements['personalinfo[dob_m]'];
				var dob_d_Obj = formObj.elements['personalinfo[dob_d]'];
				var dob_y_Obj = formObj.elements['personalinfo[dob_y]'];
				var homenum_Obj = formObj.elements['personalinfo[homenum]'];
				var worknum_Obj = formObj.elements['personalinfo[worknum]'];
				var faxnum_Obj = formObj.elements['personalinfo[faxnum]'];
				var email_Obj = formObj.elements['personalinfo[email]'];
				var citizenship_Obj = formObj.elements['personalinfo[citizenship]'];
				var howheard_Obj = formObj.elements['personalinfo[howheard]'];
				var emergencyname_Obj = formObj.elements['personalinfo[emergencyname]'];
				var emergencynum_Obj = formObj.elements['personalinfo[emergencynum]'];

				if (trim(firstname_Obj.value) == "" || trim(firstname_Obj.value).length < 2) {
					alert("Your first name must be specified!");
					firstname_Obj.focus();
					firstname_Obj.select();
					return false;
				}
				else if (trim(lastname_Obj.value) == "" || trim(lastname_Obj.value).length < 2) {
					alert("Your last name must be at specified!");
					lastname_Obj.focus();
					lastname_Obj.select();
					return false;
				}
				else if (!isWords(firstname_Obj.value)) {
					alert("Your first name can contain only 'a-z0-9,_-.:;'");
					firstname_Obj.focus();
					firstname_Obj.select();
					return false;
				}
				else if (!isWords(lastname_Obj.value)) {
					alert("Your last name can contain only 'a-z0-9,_-.:;'");
					lastname_Obj.focus();
					lastname_Obj.select();
					return false;
				}
				else if (trim(address_Obj.value) == "" || trim(address_Obj.value).length < 5) {
					alert("Your address of residence must be specified!");
					address_Obj.focus();
					address_Obj.select();
					return false;
				}
				else if (trim(city_Obj.value) == "" || trim(city_Obj.value).length < 3) {
					alert("Your city of residence must be specified!");
					city_Obj.focus();
					city_Obj.select();
					return false;
				}
				else if (trim(stateprov_Obj.value) == "" || trim(stateprov_Obj.value).length < 2) {
					alert("The state/province/region of residence must be specified!");
					stateprov_Obj.focus();
					stateprov_Obj.select();
					return false;
				}
				else if (country_Obj.options[0].selected) {
					alert("Your country of residence must be specified!");
					country_Obj.focus();
					return false;
				}
				else if (trim(zipcode_Obj.value) == "" || trim(zipcode_Obj.value).length < 4) {
					alert("Your Zip/Postal of residence code must be specified!");
					zipcode_Obj.focus();
					zipcode_Obj.select();
					return false;
				}
				else if (!isZipcode(zipcode_Obj.value)) {
					alert("The Zip/Postal code can only be numbers, letters, spaces, or apostrophe!");
					zipcode_Obj.focus();
					zipcode_Obj.select();
					return false;
				}
				else if (sexismale_Obj.options[0].selected) {
					alert("You must specify your sex!");
					sexismale_Obj.focus();
					return false;
				}
				else if ( dob_m_Obj.options[0].selected || dob_d_Obj.options[0].selected || dob_y_Obj.options[0].selected ) {
					alert("You must specify your date of birth!");
					if ( dob_m_Obj.options[0].selected ) {
						dob_m_Obj.focus();
					}
					else if ( dob_d_Obj.options[0].selected ) {
						dob_d_Obj.focus();
					}
					else if ( dob_y_Obj.options[0].selected ) {
						dob_y_Obj.focus();
					}
					return false;
				}
				else if (trim(homenum_Obj.value) != "" && !isPhoneFax(homenum_Obj.value)) {
					alert("Your home phone number is invalid. Only 0-9,()- allowed!");
					homenum_Obj.focus();
					homenum_Obj.select();
					return false;
				}
				else if (trim(worknum_Obj.value) != "" && !isPhoneFax(worknum_Obj.value)) {
					alert("Your work phone number is invalid. Only 0-9,()- allowed!");
					worknum_Obj.focus();
					worknum_Obj.select();
					return false;
				}
				else if (trim(homenum_Obj.value) == "" && trim(worknum_Obj.value) == "") {
					alert("Either your home or work number must be specified!");
					homenum_Obj.focus();
					homenum_Obj.select();
					return false;
				}
				else if (trim(faxnum_Obj.value) != "" && !isPhoneFax(faxnum_Obj.value)) {
					alert("Your fax number is invalid. Only 0-9,()- allowed or remove all information to proceed");
					faxnum_Obj.focus();
					faxnum_Obj.select();
					return false;
				}
				else if (!isEmail(email_Obj.value)) {
					alert("Your email address must be specified!");
					email_Obj.focus();
					email_Obj.select();
					return false;
				}
				else if (citizenship_Obj.options[0].selected) {
					alert("You must specify your citizenship!");
					citizenship_Obj.focus();
					return false;
				}
				else if (howheard_Obj.options[0].selected) {
					alert("Please specify how you heard about us!");
					howheard_Obj.focus();
					return false;
				}
				else if (trim(emergencyname_Obj.value) == "" || trim(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!");
					emergencyname_Obj.focus();
					emergencyname_Obj.select();
					return false;
				}
				else if (trim(emergencynum_Obj.value) == "" || !isPhoneFax(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!");
					emergencynum_Obj.focus();
					emergencynum_Obj.select();
					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 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);
	}
