/********************************************************
 * Change History:
 * GE100015		Remove lesson type
 * 															02-23-2007
 * GE100020		Restructure the tables related to user_group to use integer as the group key id  
 * 				(we may want to start the key from a big number so that we can transfer the content 
 *				 from one server to another easier)
 * 															03-19-2007   
 * GE100193		The "Additional Information for Display" field is not 
 * 				reset after clicking on the reset button
 *															09-12-2007
 * GE100217		Add Firefox support
 *															09-27-2007
 * GE100275		Question numbers can be changed by the creator
 *															12-7-2007 
 * GE100299 - goChat and profile: add email input field
 * 															01-11-2008    
 * GE100274		Javascript error due to session timeout
 *															17-01-2008
 * GE100458		Allow user to click anywhere to close the pop menu
 *															07-18-2008     
 * GE100549 - Allow username and password to contain '@' and '.' characters
 *															12-11-2008  
 * GE100567 - [html/jsp pages] <select> elements 
 *															17-11-2008 
 * GE100617		Support IE 8
 * 															04-06-2009
 * GE100635 - Add mouse over effect on the 'L' & 'E' icon on the index page
 * 															05-06-2009
 * GE100645		Support female voice
 *															05-21-2009
 * GE100734 - [multi-dictionary] allow user to specify a dictionary as his/her working dictionary
 * 															08-18-2009   
 * GE100772 - [Personal Content] Input page: modify Text Input dropdown selection
 *															11-10-2009
 * GE100806 - [Change Publish Settings] Add yellow stickies on the User Group dropdown box and the arrow icon
 *															11-23-2009 
 * GE100792 - Student Scores page: add mouseover effect
 *															11-23-2009
 ********************************************************/
this.document.title='GoEnglish';

var isIE = checkIEBrowser();

function checkIEBrowser()
{
	var userAgent = navigator.userAgent.toLowerCase();
	if ( ( userAgent.indexOf("msie 6") > -1 || userAgent.indexOf("msie 7") > -1 || userAgent.indexOf("msie 8") > -1 ) &&
			userAgent.indexOf("opera") <= -1 && userAgent.indexOf("gecko") <= -1 )
	{
		return true;
	}
	return false;
}

function stopEventPropagation(event,preventDefault)
{
	if (isIE)
		event.cancelBubble = true;
	else
	{
		event.stopPropagation();
		if (preventDefault)
			event.preventDefault();
	}
}

//the below coding is to prevent user from pressing "Ctrl N" key to open a new window
if (document.all)
{
	this.document.onkeydown = function(){	
		if ((event.keyCode == 78 || event.keyCode == 84) && (event.ctrlKey || event.metaKey)){
			event.cancelBubble = true;
			event.returnValue = false;
			event.keyCode = false; 
			return false;
		}
	}
}
else
{
	this.document.onkeydown = function(event){	
		if ((event.keyCode == 78 || event.keyCode == 84) && (event.ctrlKey || event.metaKey)){
			event.stopPropagation();
			event.preventDefault();
			return false;
		}
	}
}

// the following 2 functions are common to "admin_level.jsp", "dmin_user.jsp" & "admin_group.jsp"
// can be further isolated as a single js page

function changeLocation(destination, action)
{
	document.forms[0].location.value = destination;
	document.forms[0].action.value = action;
	document.forms[0].submit();	
}

function showValidateMessage(message)
{
	alert("Validation Error: \n\n"+message+"\n\nPlease correct the above error(s) and try it again, thank you.");
}

function addMessage(message, more_message)
{
	if (more_message != "")
	{
		if (message == "")
			message = more_message
		else
	        message = message + "\n" + more_message		        
		more_message = "";
	}
	return message;
}

//
function doNothing() {}

function doSubmit(action) {
	document.forms[0].action.value=action;
	document.forms[0].submit();	
}

// helpMessagePopUp must be available
function helpMessageOpen(){
	helpMessagePopUpRef = document.getElementById('helpMessagePopUp');
	if(helpMessagePopUpRef.style.display == 'none'){
		hideContentSelectBoxes();
		helpMessagePopUpRef.style.display='block';
		setBodySelect("true");
	} else {
		showAllSelectBoxes();
		helpMessagePopUpRef.style.display='none';		
		setBodySelect(document.forms[0].disableSelect.value);
	}
}

function setBodySelect(disableSelect)
{
	if (disableSelect == "true")
	{
		document.body.onselectstart=new Function("return false");
		document.body.onmousedown=stopDefaultAction;
	}	
	else
	{
		document.body.onselectstart=new Function("return true");
		document.body.onmousedown=new Function("return true");
	}
}

function stopDefaultAction(event)
{
	if (!isIE)
		event.preventDefault();
}


// toolbar.jsp
// executed when user change the displayformat dropdown value
function doChangeDisplay(action) {
	if (document.forms[0].displayFormat.value == '') return;
	doSubmit(action);
}

// toolbar.jsp
// executed when user change the pinyinSize dropdown value
function doChangeSize(action) {
	if (document.forms[0].pinyinSize.value == '') return;
	doSubmit(action);
}

function doChangeVoice(action) {
	if (document.forms[0].speed.value == '') return;
	doSubmit(action);
}

// GE100822 start
function doChangeVoiceSpeed(action) {
	if (document.forms[0].voiceSpeed.value == '') return;
	doSubmit(action);
}
// GE100822 end

///////////////////////////////////////////////////////////////////////
// profile.jsp
function selectOption(elem,val)
{
	var len = elem.options.length;
	for (i=0; i<len; i++)
	{
		elem.options[i].selected = (elem.options[i].value == val);
	}
}

// profile.jsp
function loadProfile(speed,theme,dictionary,pinyinSize,website,instruction, organizationName, email )
{
	if (document.forms[0].oldpassword != null)	// in case for bb extension
	{
	    document.forms[0].oldpassword.value = '';
	    document.forms[0].newpassword1.value = '';
	    document.forms[0].newpassword2.value = '';
	}
    
	selectOption(document.forms[0].speed[1], speed);
	selectOption(document.forms[0].pinyinSize[1], pinyinSize);
	
	if (dictionary) {
		document.forms[0].showDictionary[0].checked = true;
	} else {
		document.forms[0].showDictionary[1].checked = true;
	}
	
	if (document.forms[0].theme)
		selectOption(document.forms[0].theme, theme);
		
    if (website)
        document.forms[0].website.value = website;
    else
        document.forms[0].website.value = '';

    if (instruction) {
        document.forms[0].showInstruction[0].checked = true;
    } else {
        document.forms[0].showInstruction[1].checked = true;
    }           
    if (organizationName)
        document.forms[0].organizationName.value = organizationName;
    else
    	document.forms[0].organizationName.value = '';
    
    // GE100299 start
    if (document.forms[0].email)
    {
	    if (email)
	    	document.forms[0].email.value = email;
	    else
	    	document.forms[0].email.value = '';
	}
    // GE100299 end    	
}

// profile.jsp
function DoProfileValidateAndSubmit(action,error_newpassword,error_oldpassword,error_passwordnotmatch,error_passwordinvalid){

	if(document.forms[0].oldpassword != null && document.forms[0].oldpassword != undefined ) 	// in case for bb extension
	{
		if(document.forms[0].oldpassword.value != '' && document.forms[0].newpassword1.value == ''){
			alert(error_newpassword);
			return false;
		}
	
		if(document.forms[0].oldpassword.value == '' && document.forms[0].newpassword1.value != ''){
			alert(error_oldpassword);
			return false;
		}
			
		if(document.forms[0].newpassword1.value != document.forms[0].newpassword2.value){
			alert(error_passwordnotmatch);
			return false;
		}
		// GE100549 start		
		if(!validCharacters(document.forms[0].newpassword1.value)){
				alert(error_passwordinvalid);
				return false;
		}
		// GE100549 end
	}	
	
	document.forms[0].action.value = action;
	document.forms[0].submit();
}
///////////////////////////////////////////////////////////////////////
function hideAllSelectBoxes()
{
	// GE100567 start
	var elements = document.forms[0].getElementsByTagName("select");
	for (var y = 0; y < elements.length; y++)			
	{
			elements[y].style.display='none';
	}
	// GE100567 end
}

function hideContentSelectBoxes()
{
	hideAllSelectBoxes();
	var elem = document.forms[0].displayFormat;
	elem ? (elem[0].type == "select-one" ? elem[0].style.display = 'block' : elem.style.display = 'block') : null;
	elem = document.forms[0].speed; 
	elem ? (elem[0].type == "select-one" ? elem[0].style.display = 'block' : elem.style.display = 'block') : null;
	elem = document.forms[0].pinyinSize; 
	elem && elem[0] ? (elem[0].type == "select-one" ? elem[0].style.display = 'block' : elem.style.display = 'block') : null;
	document.forms[0].instructorLesson ? document.forms[0].instructorLesson.style.display='block' : null; 
	document.forms[0].instructorExercise ? document.forms[0].instructorExercise.style.display='block' : null; 
	document.forms[0].assignedLesson ? document.forms[0].assignedLesson.style.display='block' : null; 
	document.forms[0].assignedExercise ? document.forms[0].assignedExercise.style.display='block' : null; 
	// GE100015 start <code deleted> GE100015 end
	document.forms[0].linguistic ? document.forms[0].linguistic.style.display='block' : null; 		
}

function showAllSelectBoxes()
{
	for (var y = 0; y < document.forms[0].elements.length; y++)
	{
		if (document.forms[0].elements[y].type == "select-one")
		{
			if (document.forms[0].elements[y].name == 'historyViewType' 
				|| document.forms[0].elements[y].name == 'group')
				document.forms[0].elements[y].style.display='inline';
			else		
				document.forms[0].elements[y].style.display='block';
		}
	}
}


function openNotes(theBlock, command){
	if(command == 'open'){
		hideAllSelectBoxes();
		document.getElementById(theBlock).style.display='block';
	}
	if(command == 'close'){
		showAllSelectBoxes();
		document.getElementById(theBlock).style.display='none';
	}
}

// for lessonList.jsp and exerciseList.jsp
function expandTableRow(row)
{
	isIE?row.style.display='block':row.style.visibility='visible';
}

function collapseTableRow(row)
{
	isIE?row.style.display='none':row.style.visibility='collapse';
}

function moduleOpener(obj)
{
	var isOpen = 'false';
	var _img = obj.childNodes[0].childNodes[0];
	if(_img.getAttribute('status') == 'closed'){
		_img.setAttribute('status','open');
		_img.src = '../image/minus.gif';
		isOpen = 'true';
	} else {
		_img.setAttribute('status','closed');
		_img.src = '../image/plus.gif';
	}

	var module = obj.getAttribute('module');
	var next = node_after(obj);
	if (isOpen == 'true')
	{
		while(next != null && next.getAttribute('module') == module)
		{
			if (next.getAttribute('isCategory') == 'true')
			{
				expandTableRow(next);
				if (next.getAttribute('category') > -1)
				{
					if (next.getAttribute('isOpen') == 'true')
						openCategory(next);
					else
						closeCategory(next);
				}
			}
			next = node_after(next);
		}
	}
	else
	{
		while(next != null && next.getAttribute('module') == module)
		{
			collapseTableRow(next);
			next = node_after(next);
		}
	}	
}

function moduleCategoryOpener(obj)
{
	if (obj.getAttribute('isOpen') == 'true')
		closeCategory(obj);
	else
		openCategory(obj);
}

function openCategory(obj)
{
	obj.childNodes[1].childNodes[0].src = '../image/minus.gif';
	obj.setAttribute('isOpen','true');

	var module = obj.getAttribute('module');
	var category = obj.getAttribute('category');
	var next = node_after(obj);
	while(next != null && next.getAttribute('module') == module && next.getAttribute('category') == category)
	{
		expandTableRow(next);			
		next = node_after(next);
	}
}

function closeCategory(obj)
{
	obj.childNodes[1].childNodes[0].src = '../image/plus.gif';
	obj.setAttribute('isOpen','false');
	
	var module = obj.getAttribute('module');
	var category = obj.getAttribute('category');
	var next = node_after(obj);
	while(next != null && next.getAttribute('module') == module && next.getAttribute('category') == category)
	{
		collapseTableRow(next);
		next = node_after(next);
	}
}

/* added by christine wong start */
function doPrintFriendlyPage(command, printType, event)
{
	if(command == 'toggle'){
		if(document.getElementById('dropdownMenu_print').style.display == 'none')
		{
			// GE100458 start
			event.cancelBubble = true;
			// GE100458 end
			document.getElementById('dropdownMenu_print').style.display = 'block';
		}
		else
			document.getElementById('dropdownMenu_print').style.display = 'none';
	} else {
		document.forms[0].printType.value = printType;
		document.forms[0].action.value = command;	
		document.forms[0].submit();
	}
}
/* added by christine wong end */

_group_delimiter = '"';
_group_view_delimiter = ' | ';

function setIndexedGroup(groupChoiceElem,groupCheckboxElem,groups,index)
{
	if (groups == '' || groups == '0')
    {
        if (groupChoiceElem != null)
            groupChoiceElem[0].checked = true;
        modifyIndexedGroupChoice(index);
    }
    else
    {
        if (groupChoiceElem != null)
            groupChoiceElem[1].checked = true;
        if (groupCheckboxElem)
        {
            groups = _group_delimiter+groups+_group_delimiter;
            if (groupCheckboxElem.length)
                for (i=0; i<groupCheckboxElem.length; i++)
                {
                    groupCheckboxElem[i].disabled = false;
                    groupCheckboxElem[i].checked = groups.indexOf(_group_delimiter+groupCheckboxElem[i].value+_group_delimiter) > -1;
                }
            else
            {
                groupCheckboxElem.disabled = false;
                groupCheckboxElem.checked = groups.indexOf(_group_delimiter+groupCheckboxElem.value+_group_delimiter) > -1;
            }
        }
    }
}

function setGroup(groupChoiceElem,groupCheckboxElem,groups)
{
	if (groups == '' || groups == '0')
	{
		if (groupChoiceElem != null)
			groupChoiceElem[0].checked = true;
		modifyGroupChoice();
	}
	else
	{
		if (groupChoiceElem != null)
			groupChoiceElem[1].checked = true;
		if (groupCheckboxElem)
		{
			groups = _group_delimiter+groups+_group_delimiter;
			if (groupCheckboxElem.length)
				for (i=0; i<groupCheckboxElem.length; i++)
				{
					groupCheckboxElem[i].disabled = false;
					groupCheckboxElem[i].checked = groups.indexOf(_group_delimiter+groupCheckboxElem[i].value+_group_delimiter) > -1;
				}
			else
			{
				groupCheckboxElem.disabled = false;
				groupCheckboxElem.checked = groups.indexOf(_group_delimiter+groupCheckboxElem.value+_group_delimiter) > -1;
			}
		}
	}
}

function selectGroupChoice(groupChoiceElem,groupCheckboxElem)
{
	if (groupChoiceElem[0].checked == true)
	{
		if (groupCheckboxElem)
		{
			if (groupCheckboxElem.length)
			{
				for (i=0; i<groupCheckboxElem.length; i++)
				{
					groupCheckboxElem[i].checked = false;
					groupCheckboxElem[i].disabled = true;
				}
			}
			else
			{
				groupCheckboxElem.checked = false;
				groupCheckboxElem.disabled = true;
			}
		}
	}
	else
	{
		if (groupCheckboxElem)
		{
			if (groupCheckboxElem.length)
				for (i=0; i<groupCheckboxElem.length; i++)
					groupCheckboxElem[i].disabled = false;
			else
				groupCheckboxElem.disabled = false;
		}
	}	
}

function selectGroup(groupCheckboxElem)
{
	var groups = '';
	if (groupCheckboxElem.length)
	{
		for (i=0; i<groupCheckboxElem.length; i++)
		{
			if (groupCheckboxElem[i].checked == true)
			{
				groups = groups + groupCheckboxElem[i].value + _group_delimiter;
			}
		}
	}
	else
	{
		if (groupCheckboxElem.checked == true)
		{
			groups = groupCheckboxElem.value + _group_delimiter;
		}
	}
	if (groups.length > 0)
		return groups.substring(0,groups.lastIndexOf(_group_delimiter));
	else
		return '';
}

function getAllowedGroupDisplay(group,strAllGroup,groupDB)
{
	var allowedGroup = getGroupDisplay(group,groupDB);
	if (allowedGroup.length < 1)
		return strAllGroup;
	else
		return allowedGroup;
}

function getGroupDisplay(group,groupDB)
{
	var result = '';
	// GE100020 start
	if (group.length > 0 && group!='0')	
	{
	// GE100020 end	
		if (groupDB)
		{
			var groups = group.split("\"");
			result = groupDB[groups[0]];
			for (j=1; j<groups.length; j++)
				result = result + _group_view_delimiter + groupDB[groups[j]];
		}
		else
			return group.replace(/\"/g,_group_view_delimiter);
	}
	return result;
}

// for exercise input
function trimString(value) 
{
  if (value == null || value.length < 1) return "";
  value = value.replace( /^\s+/g, "" );// strip leading
  if (value.length < 1) return "";
  return value.replace( /\s+$/g, "" );// strip trailing
}

function alertReply(snqn,message,section,question) // snqn is in the form : sectionXXquestionXX
{
	var index = snqn.indexOf("q");
	var snIndex = 7 ; // "section".length 
	var sn = snqn.substring(snIndex,index);
	var qn;
	if (document.getElementById(snqn+'qDQN').style.display == 'inline')
		qn = document.getElementById(snqn+'qDQN').innerHTML;
	else
		qn = document.getElementById(snqn+'qOQN').value;
	alert(message+section+sn+question+qn);
}

function open_win(target_url,target_name,open_win_argu)
{
	if (open_win_argu != null)
		window.open(target_url,target_name ,open_win_argu);
	else
		window.open(target_url,target_name);
}

function openMultimediaWindow(target_url,open_win_argu)
{
	open_win(target_url,'_multimedia',open_win_argu);
}

//BLINKING
var blink_flag=0;
var blink_speed=100;

function blink(elemId)
{
 	if(blink_flag%2==0)
 	{
		 document.getElementById(elemId).style.visibility="visible";
		 blink_speed=2000;
	}
	else
	{
		 document.getElementById(elemId).style.visibility="hidden";
		 blink_speed=100;
	}
	if(blink_flag<1)
	 	blink_flag++;
	else
		blink_flag--
 	setTimeout("blink('"+elemId+"')",blink_speed);
}

// template selection functions
function changeTemplateCommand(template,type,action)
{
	if (type!=null)
		document.forms[0].questionType.value=type;
	document.forms[0].template.value = template;	
	doSubmit(action);
}

function dropDownSelectionCommand(template,templateExercise,action) 
{
	if (template == '') return;
	if (template == templateExercise) {
		document.getElementById('lessonSelectionControl').style.display = 'none'; //GE100772 
		document.getElementById('lessonSelectionMenu').style.display = 'none'; //GE100772
		document.getElementById('exerciseSelectionControl').style.display = 'block';
		document.getElementById('exerciseSelectionMenu').style.display = 'block';
	}else{
		document.getElementById('exerciseSelectionControl').style.display = 'none'; //GE100772
		document.getElementById('exerciseSelectionMenu').style.display = 'none'; //GE100772
		document.getElementById('lessonSelectionControl').style.display = 'block';
		document.getElementById('lessonSelectionMenu').style.display = 'block';
		//document.forms[0].template.value = template;
		//doSubmit(action);
	}
}

function trim(str)
{
	return str.replace(/^\s*|\s*$/g,"");
}

function closeTooltip(){
	return nd();
}

function openTooltip(description,wid){
	if (description.length > 0)
   		return overlib(description,WIDTH,wid,HAUTO,VAUTO,CSSCLASS,TEXTFONTCLASS,'tooltipFontClass',FGCLASS,'tooltipFgClass',BGCLASS,'tooltipBgClass',PADX,2,2,PADY,2,2);
   	else
   		return false;
}

function openTooltipSmall(description)
{
	return openTooltip(description,160);
}

function openTooltipMedium(description)
{
	return openTooltip(description,210);
}

function openTooltipLarge(description)
{
	return openTooltip(description,300);
}

function openTooltipAboveLarge(description){
	if (description.length > 0)
   		return overlib(description,WIDTH,300,CENTER,ABOVE,CSSCLASS,TEXTFONTCLASS,'tooltipFontClass',FGCLASS,'tooltipFgClass',BGCLASS,'tooltipBgClass',PADX,2,2,PADY,2,2);
   	else
   		return false;
}

function openTooltipAbove(description){
	if (description.length > 0)
   		return overlib(description,WIDTH,140,CENTER,ABOVE,CSSCLASS,TEXTFONTCLASS,'tooltipFontClass',FGCLASS,'tooltipFgClass',BGCLASS,'tooltipBgClass',PADX,2,2,PADY,2,2);
   	else
   		return false;
}

function openDefinition(description)
{
	if (description.length > 0)
   		return overlib(description,WIDTH,230,HAUTO,VAUTO,CSSCLASS,TEXTFONTCLASS,'definitionFontClass',FGCLASS,'tooltipFgClass',BGCLASS,'tooltipBgClass',PADX,2,2,PADY,2,2);
   	else
   		return false;
}

function closeDefinition()
{
	return closeTooltip();
}

function escapeHTML(text) 
{
    var div = document.createElement('div');
    var node = document.createTextNode(text);
    div.appendChild(node);
    return div.innerHTML;
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

function goToPage(action,pageNum,event){
	document.forms[0].action.value = action;	
	if(event.type == 'blur' && document.forms[0].currentPage.value != pageNum ){
		if(document.forms[0].currentPage.value <= 0){
			document.forms[0].currentPage.value = 1;
		}
		document.forms[0].submit();
	}
}

function goToPageOnEnterPressed(action,event){
	document.forms[0].action.value = action;	
    if (event.keyCode == 13)
    {
        document.forms[0].submit();
        return false;
	}
	return true;
}

// GE100458 start
function closePopupMenu()
{
	// footer: "videoMenu"
	// header: "ddmenu","ccmenu"
	// lesson & exercise display: "dropdownMenu_play","dropdownMenu_print","buttonMenu3","selectionPopupMenu","selectionPopupRef","exercisesSelectionMenu","exercisesSelectionControl"

	var menuArray = new Array("videoMenu","ddmenu","ccmenu","dropdownMenu_play","dropdownMenu_print","buttonMenu3","selectionPopupMenu","selectionPopupRef","exercisesSelectionMenu","exercisesSelectionControl");	
	for (m in menuArray)
	{		
		if (document.getElementById(menuArray[m]))
			document.getElementById(menuArray[m]).style.display='none';
	}	
	
}
// GE100458 end

//GC100635
function swapImageTagSource(elem,_source) {
	if (elem)
		elem.src = _source;
}

//GE100734 start
function changeDictionaryCommand(action) {
	document.forms[0].action.value = action;
	document.forms[0].submit();
}
// GE100734 end

// GE100806 start 
var tempLastColor1;
function showSelectGroupTooltip(refObj, toolTipMessage)  
{   
	var imgElement = refObj.getElementsByTagName("IMG");   
	if(imgElement[0].src.indexOf('/image/more.gif')>-1)
	{
		openTooltipAbove(toolTipMessage); 
		tempLastColor1 = this.bgColor;
		this.bgColor = 'yellow';
	}
}

function closeSelectGroupTooltip(refObj){
	closeTooltip();
	this.bgColor = tempLastColor1;
}
//GE100806 end

//GE100792
function changRowColor(rowid, hlColor, orgColor)
{
	//highlight the selected row
	var row = document.getElementById(rowid);
	row.bgColor = hlColor;
	
	// restore bgcolor the prior hightlight row
	var hightlightRowId = document.forms[0].hightlightRowId.value;
	var colorBeforeHightlight = document.forms[0].colorBeforeHightlight.value;
	if (hightlightRowId != '')
	{
		var hightlightRow = document.getElementById(hightlightRowId);   
		hightlightRow.bgColor = colorBeforeHightlight;
	}	
	document.forms[0].hightlightRowId.value = rowid;
	document.forms[0].colorBeforeHightlight.value = orgColor;	
}
//GE100792
function changeColorOnMouseOver(refObj, msOverColor)
{
	if (refObj.id != document.forms[0].hightlightRowId.value)
	{		
		refObj.bgColor = msOverColor;		
	}
}
//GE100792
function changeColorOnMouseOut(refObj, msOutColor)
{
	if (refObj.id != document.forms[0].hightlightRowId.value)
		refObj.bgColor = msOutColor;
}