 var grade,ge,se,mnue,dlnke,lnke;
var menutime=0,filter;

function init() {
	inWait();
	initUserInfo();
	InitLearn();
	var gc = getGC();
	grade = gc.charAt(0);
	InitGradeInfo(grade);
	var gdt = getGradeText(grade);
	InitLevelTopicOption(gdt,gc);
	var lm = new LearnManager(filter);
	var id = getFQ(); 
	if(id != "") {
		InitFirstQA(lm,id,grade);
	} else {
		InitQA(lm,grade);
	}
	outWait();
}

function InitLearn(){
	ge = document.getElementById("g");
	se = document.getElementById('s');
	dlnke = document.getElementById('dlnk');
	lnke = document.getElementById('lnk');
	mnue = document.getElementById('mnu');
	InitElement();
	InitQuestion();
	initLearnManagerPage();
	filter = InitFilterOption();
}

function userChange(){
	inWait();
	ClearElement();
	var gc = getGC();
	grade = gc.charAt(0);
	InitGradeInfo(grade);
	var gdt = getGradeText(grade);
	InitLevelTopicOption(gdt,gc);
	var lm = new LearnManager(filter);
	InitQA(lm,grade);
	outWait();
}

function cg(g) {
	inWait();
	ClearElement();
	grade = g;
	var gdt = getGradeText(grade);
	InitLevelTopicOption(gdt,grade);
	var lm = new LearnManager(filter);
	InitQA(lm,g);
	outWait();
}

function ChangeFilter(){
	ClearElement();
	var lm = new LearnManager(filter);
	InitQA(lm,grade);
}

function nextq() {
	NextPage();
}

function backq() {
	BackPage();
}

function showHMenu(txt, lp, tp) {
	clearTimeout(menutime);
	mnue.innerHTML = txt;
	mnue.style.left= ""+lp+"px";
	mnue.style.top= ""+tp+"px";
	mnue.style.display="";
	outHMenu();
}

function hideHMenu(){
	mnue.style.display="none";
}

function inHMenu(){
	clearTimeout(menutime);
}

function outHMenu(){
	menutime = setTimeout("hideHMenu()",1000);
}

function printLearn(){
	my_window= window.open ("", "LearnPrint","status=1,toolbar=yes,resizable=yes,scrollbars=yes,menubar=yes");
	my_window.document.write("<html> <link rel=\"stylesheet\" type=\"text/css\" href=\"/5\"/> <body>" +
				curQA().print() + "</body></html>");
}

function showLink(obj) {
	var pos =  new ObjPos(obj);
	dlnke.style.top= ""+(pos.top+22)+"px";
	dlnke.style.display="";
	var cq = curQA().q;
	lnke.value = HOST_URL+"v?g="+cq.grade+"&q="+cq.id;
	lnke.focus();
	lnke.select();
}

function hideLink() {
	dlnke.style.display="none";
}

function showHistory() {
	var he = document.getElementById("hist");
	var pos =  new ObjPos(he);
	showHMenu(History(), pos.left-50, pos.top + 22);
}

function showLeftMenu(text,obj) {
	var pos =  new ObjPos(obj);
	showHMenu(text, pos.left+125, pos.top);
	selMMOver(obj);
}
 var gde,gme,gmde;
 var gradeText = new Array();
 var gradeIsOpen = new Array();
 var gig, gmtime=0;
 
 function InitGradeInfo(g){
	gde = document.getElementById("gd");
	gme = document.getElementById("gm");
	gmde = document.getElementById("gmd");
	
	var pos =  new ObjPos(gde);
	gme.style.left= ""+(pos.left-2)+"px";
	gme.style.top= ""+(pos.top+18)+"px";
	
	gig = g;
	var xhGTReq = createAJAX();
	xhGTReq.open("GET", "/b", false);
	xhGTReq.send(null);
	gmde.innerHTML = giParse(xhGTReq.responseText);
 }

 function giParse(text){
	 var sb = "",sb1;
	 var values = text.split("\r");
	 var gds,gdds, selCls;
	 for ( var i = 0; i < values.length; i++) {
		gds = values[i].split("\n");
		sb += "<div class=gdm id=gdgm"+i+" onMouseOver=GradeOver() " +
				"onMouseOut=GradeOut()>" ;
		
		sb1 = "";
		gradeIsOpen[i] = false;
		for ( var j = 1; j < gds.length; j++) {
			gdds = gds[j].split("\t");
			gradeText[gdds[0]] = gdds[1];
			selCls = "gdn";
			if(gdds[0] == gig) {
				selCls = "gds";
				gde.innerHTML = gdds[1] ;
				gradeIsOpen[i] = true;
			}
			sb1 += "<div id=gd"+gdds[0]+" class="+selCls+" onMouseOver=GradeMOver('"+gdds[0]+"') " +
					"onMouseOut=GradeMOut('"+gdds[0]+"') onClick=GradeOnClick('"+gdds[0]+"')" +
					"> &nbsp; " + gdds[1] + "</div>";
		}
		if(gradeIsOpen[i]) {
			sb += "<a href=# class=ai onClick=GradeShowHide('"+i+"')><img id=gdi"+i+" src='"+IMG_PDOWN+"'></a> " + gds[0] + "</div>";
			sb += "<div id=gdd"+i+" class=gdmd>" +sb1 + "</div>";
		} else {
			sb += "<img id=gdi"+i+" src='"+IMG_PUP+"'> " + gds[0] + "</div>";
			sb += "<div id=gdd"+i+" class=dh>" +sb1 + "</div>";
		}
	 }
	 return sb;
 }
 
function ShowGradeMenu(){
	outGradeMenu();
	gme.style.display="";
	inSel();	
}
 
function HideGradeMenu(){
	gme.style.display="none";
}

function outGradeMenu(){
	clearTimeout(gmtime);
	gmtime = setTimeout("HideGradeMenu()",1000);
}

function GradeOver() {
	clearTimeout(gmtime);
}

function GradeOut() {
	outGradeMenu();
}

function GradeShowHide(id) {
	if(gradeIsOpen[id]){
		gradeIsOpen[id] = false;
		document.getElementById("gdd"+id).className="dh";
		document.getElementById("gdi"+id).src = IMG_PUP;
	} else {
		gradeIsOpen[id] = true;
		document.getElementById("gdd"+id).className="gdmd";
		document.getElementById("gdi"+id).src = IMG_PDOWN;
	}
}

function GradeMOver(g) {
	clearTimeout(gmtime);
	var tge = document.getElementById("gd"+g);
	selMOver(g == gig, tge);
}
function GradeMOut(g) {
	var tge = document.getElementById("gd"+g);
	selMOut(g == gig, tge);
	outGradeMenu();
}

function GradeOnClick(g) {
	clearTimeout(gmtime);
	document.getElementById("gd"+gig).className="gdn";
	gig = g;
	setTimeout("changeGrade()",0);
	gde.innerHTML = gradeText[g];
	HideGradeMenu();
	setGC(g);
}

function changeGrade() {
	cg(gig);
}
var HOST_URL = "http://www.math17.com/";
var QUE_NOT_FOUND ="Question not found.";

var TEXT_SKIPPED = "Skipped";
var TEXT_QST = "Question";
var TEXT_LEVEL = "Level ";
var TEXT_OPTIONS = "Options";
var TEXT_RGT_OPT = "Right Option";
var TEXT_RIGHT = "Right";
var TEXT_WRONG = "Wrong";
var TEXT_OMITED = "Omited";
var TEXT_DTL_ANS = "Detail Answer";
var TEXT_NAA = "No Application Available";
var TEXT_MNTS = "Minutes";
var TEXT_1MNT = "1 Minute";
var TEXT_HRS = "Hours";
var TEXT_HR = "Hour";
var ERROR_MESSAGE = "Error! Check your firewall and try again. Thank You";
var Learn_MESSAGE = "Set Learning Suggestions of Topics Level for Learning Page is successfully.\r\n Do you want  to Learn?";

var IMAGE_RIGHT = "<img src='/i/0y.png'>";
var IMAGE_WRONG = "<img src='/i/0z.png'>";
var IMAGE_DELETE= "<img src='/i/0z.png'>";
var IMG_CLOSE = "/i/z.png";
var IMAGE_CLOSE = "<img src='" + IMG_CLOSE + "'>";
var IMG_PDOWN = "/i/l.png";
var IMG_PUP = "/i/m.png";
var IMAGE_DOWN = "<img src='" + IMG_PDOWN + "'>";
var IMAGE_UP = "<img src='" + IMG_PUP + "'>";
var IMG_BACK = "/i/0b.png";
var IMG_NBACK = "/i/0c.png";
var IMG_NEXT = "/i/0d.png";
var IMG_NNEXT = "/i/0e.png";

var IMG_SFIRST = "/i/0g.png";
var IMG_SNFIRST = "/i/0h.png";
var IMG_SBACK = "/i/0i.png";
var IMG_SNBACK = "/i/0j.png";
var IMG_SNEXT = "/i/0k.png";
var IMG_SNNEXT = "/i/0l.png";
var IMG_SLAST = "/i/0m.png";
var IMG_SNLAST = "/i/0n.png";

var IMG_OPUP = "/i/0w.png";
var IMG_OPDOWN = "/i/0x.png";
var IMAGE_OPDOWN = "<img src='" + IMG_OPDOWN + "'>";
var IMAGE_OPUP = "<img src='" + IMG_OPUP + "'>";
var IMAGE_RFERENCE = "<img src='/i/0p.png'>";

var SCALE_AP = "/i/1r.png";
var SCALE_AA = "/i/1s.png";
var SCALE_AM = "/i/1t.png";
var SCALE_APM = "<img alt='Scale A Plus' src='/i/1u.png'>";
var SCALE_AAM = "<img alt='Scale A' src='/i/1v.png'>";
var SCALE_AMM = "<img alt='Scale A Minus' src='/i/1w.png'>";
var SCALE_B = "<img alt='Scale B' src='/i/gb.png'>";
var SCALE_C = "<img alt='Scale C' src='/i/gc.png'>";
var SCALE_D = "<img alt='Scale D' src='/i/gd.png'>";
var SCALE_E = "<img alt='Scale B' src='/i/ge.png'>";
var SCALE_F = "<img alt='Scale B' src='/i/gf.png'>";
var YELLOW_LIGHT = "<img src='/i/blg.png'>";

var IMG_NUM = new Array();
IMG_NUM[0] = "<img src='/i/m0.png'>";
IMG_NUM[1] = "<img src='/i/m1.png'>";
IMG_NUM[2] = "<img src='/i/m2.png'>";
IMG_NUM[3] = "<img src='/i/m3.png'>";
IMG_NUM[4] = "<img src='/i/m4.png'>";
IMG_NUM[5] = "<img src='/i/m5.png'>";
IMG_NUM[6] = "<img src='/i/m6.png'>";
IMG_NUM[7] = "<img src='/i/m7.png'>";
IMG_NUM[8] = "<img src='/i/m8.png'>";
IMG_NUM[9] = "<img src='/i/m9.png'>";


function createAJAX() {
   try { return new XMLHttpRequest(); } catch(e) {}
   try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
   try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
   alert("XMLHttpRequest not supported");
   return null;
 }

function TL(t,l) {
	this.t = t;
	this.l = l;
}

 var gdMap = new Array();
 function getGradeText(grade){
	var gdt = gdMap[grade];
	if(gdt == null){
		var xhGTReq = createAJAX();
		xhGTReq.open("GET", "/a?g="+grade, false);
		xhGTReq.send(null);
		gdt = readGTFunc(xhGTReq.responseText);
		gdMap[grade] = gdt;
	}
	return gdt;
 }

 function ParseText(value,gdt){
	try {
		var parser = new Parser(value,gdt);
		parser.parse();
		return parser.out;
	} catch(e) {
		throw "ParseText:"+value+"/"+e;
	}
 }
 
 function readGTFunc(strGT){
 	var gdt = InitGTObject();
 	var textFormaters = getTextFormaters();
 	var gts,key,value,nInd;
 	var gtbs = strGT.split("\r");
 	for ( var i = 0; i < 7; i++) {
 		if(gtbs[i].length>0){
 			gts = gtbs[i].split("\n");
 			for ( var j = 0; j < gts.length; j++) {
 				nInd = gts[j].indexOf("=");
 				key = gts[j].substr(0, nInd);
 				value = gts[j].substr(nInd + 1);
 				gdt[key] = new textFormaters[i](value);
 			}
 		}
 	}
 	
 	gdt[7] = getNameValue(gtbs[7]);
 	gdt[70] = getIds(gtbs[8]);
 	gdt[71] = getNameValue(gtbs[8]);
 	return gdt;
 }
 function getTextFormaters(){
 	var textFormaters = new Array();
 	textFormaters[0] = Text0Parm;
 	textFormaters[1] = Text1Parm;
 	textFormaters[2] = Text2Parm;
 	textFormaters[3] = Text3Parm;
 	textFormaters[4] = TextNParm;
 	textFormaters[5] = TextImageN;
 	textFormaters[6] = TextImage;
 	return textFormaters;
 }

 function InitGTObject(){
 	var obj = new Array();
 	obj[0] = new TextOnly();
 	obj[1] = new TableText();
 	return obj;
 }
  
 function getNameValue(gtbs){
	var gtb = new Array();
	var gts = gtbs.split("\n");
	var nInd;
	for ( var j = 0; j < gts.length; j++) {
		nInd = gts[j].indexOf("=");
		gtb[gts[j].substr(0, nInd)] = gts[j].substr(nInd + 1);
	}
	return gtb;
 }

 function getIds(gtbs){
	var gtb = new Array();
	var gts = gtbs.split("\n");
	var nInd;
	for ( var j = 0; j < gts.length; j++) {
		nInd = gts[j].indexOf("=");
		gtb[j] = gts[j].substr(0, nInd);
	}
	return gtb;
 }
 
 function Parser(value,gdt,prfx){
	this.gdt = gdt;
	this.prfx = prfx;
 	this.out="";
 	this.values=value.split('\t');
 	this.pos=0;	
 	this.parse = p_parse;
 	this.nextq = p_next;
 	this.curVal = p_curVal;
 	this.parseNext = p_parseNext;
 	this.hasNext = p_hasNext;
 }
 
 function p_parse(){
 	while(this.hasNext()){
 		this.parseNext();
 	}
 }
  
 function p_parseNext(){
	try {
		this.gdt[this.values[this.pos++]].parse(this);
		this.out +=" ";
	} catch(e){
		this.pos--;
		var val = this.values[this.pos];
		if(val == null){
			throw "Parse:Parameter not found for "+this.pos+"/"+this.values.length+":"+this.values+"/"+e;
		} else if(this.gdt == null){
			throw "Parse:Grade Text Array is null/"+e;
		} else if(this.gdt[val] == null){
			throw "Parse:Grade Text Object not found for "+val+"/Pos:"+this.pos+"/"+e;
		} else {
			throw "Parse:Unknown/"+e;
		}
	}
 }
 
function p_curVal(){
	return this.values[this.pos];
}
 
 function p_next(){
 	var s = this.values[this.pos++];
 	if(s.charAt(0)=='\f') {
 		s = ParseText(s.substr(1),this.gdt); 
 	}
	return s;
 }
  
function p_hasNext(){
	return this.pos<this.values.length;
}

 function TextOnly(){
 	this.parse = text_parse;
 }
 function text_parse(pars){
 	pars.out += pars.nextq();
 }

 function Text0Parm(value){
 	this.value = value;
 	this.parse = text_parseValue;
 }

 function Text1Parm(value){
 	var values = value.split('`')
 	this.prefix = values[0];
 	this.suffix = values[1];
 	this.parse = text_parse1;
 }
 function text_parse1(pars){
 	pars.out += this.prefix+pars.nextq()+this.suffix;
 }
 
 function Text2Parm(value){
 	var values = value.split('`');
 	this.prefix = values[0];
 	this.mid = values[1];
 	this.suffix = values[2];
 	this.parse = text_parse2;
 }
 function text_parse2(pars){
 	pars.out += this.prefix+pars.nextq()+this.mid+pars.nextq()+this.suffix;
 }
 function Text3Parm(value){
 	var values = value.split('`');
 	this.prefix = values[0];
 	this.mid1 = values[1];
 	this.mid2 = values[2];
 	this.suffix = values[3];
 	this.parse = text_parse3;
 }
 function text_parse3(pars){
 	pars.out += this.prefix+pars.nextq()+this.mid1+pars.nextq()+this.mid2+pars.nextq()+this.suffix;
 }

 function TextNParm(value){
 	this.values = value.split('`');
 	this.parse = text_parseN;
 }
 function text_parseN(pars){
 	pars.out += this.values[0];
 	for(var i=1;i<this.values.length;i++){
 		pars.out += pars.nextq()+this.values[i];
 	}
 }
  
 function TextImageN(value){
	this.value = "<img src=\"/k?n="+value+"\"  class=\"iq\"/> ";
 	this.parse = text_parseImgN;
 }
 function text_parseImgN(pars){
 	var	len = pars.nextq();
	for(var i=0;i<len;i++){
		pars.out += this.value;
	}
 }

 function TextImage(value){
 	this.value = "<img src=\"/k?n="+value+"\" class=\"iq\"/>";
 	this.parse = text_parseValue;
 }
 function text_parseValue(pars){
 	pars.out += this.value;
 }
 
 
 function Qstn(values,pos,gdt,grade){
	try {
		this.gdt = gdt;
		this.grade = grade;
		this.id = values[pos++];
		this.question = ParserQstn(values[pos++],gdt);
		this.options = ParserQstnOptions(values[pos++],gdt);
		this.ansopt = new Number(values[pos++]);
		this.shortq = qstn_shortQuestion;
		this.gid = qstn_gid;
	} catch (e) {
		throw "Qstn/Pos:"+pos+"/"+e;
	}
}

function qstn_gid() {
	return this.grade+this.id;
}

function qstn_shortQuestion() {
	return this.question.substring(0, this.question.indexOf("<BR>"));
}

function ParserQstn(value,gdt){
	var sb = "";
	var values = value.split("\n");
	for ( var i = 0; i < values.length; i++) {
		sb += ParseText(values[i], gdt) + "<BR>";
	}
	return sb;
}

function ParserQstnOptions(value,gdt){
	var values = value.split("\n");
	var opts = new Array();
	for ( var i = 0; i < values.length; i++) {
		opts[i] = ParseText(values[i],gdt);
	}
	return opts;
}


function getTimeString(tt) {
	var t = Math.round(tt);
	var time = "";
	var t1 = t % 60;
	if (t1 > 1) {
		time = "" + t1 + " " + TEXT_MNTS;
	}
	t = Math.floor(t / 60);
	if (t > 0) {
		if (t > 1) {
			time = "" + t + " " + TEXT_HRS + " " + time;
		} else {
			time = "" + t + " " + TEXT_HR + " " + time;
		}
	}
	if (time.length == 0) {
		time = TEXT_1MNT;
	}
	return time;
}

function sortStr(str, val) {
	var sb = "";
	var c;
	for ( var i = 0; i < str.length; i++) {
		c = str[i];
		if (val.indexOf(c) >= 0) {
			sb += c;
		}
	}
	return sb;
}

function TableText(){
 	this.parse = tt_parse;
 }
 function tt_parse(pars){
	var tc =  pars.nextq();
	var colcount = pars.nextq();
	var nCtr = 0;
	pars.out = "<table class=tt"+tc+" cellpadding=2><tr><td class=tt"+tc+pars.nextq()+">";
	while(pars.hasNext()){
		if(pars.curVal() != "\f") {
			pars.parseNext();
		} else {
			pars.pos++;
			pars.out += "</td>";
			nCtr++;
			if(nCtr== colcount) {
				pars.out += "</tr><tr>";
				nCtr =0;
			}
			pars.out += "<td class=tt"+tc+pars.nextq()+">";
		}
 	}
	pars.out += "</td></tr></table>";
 }
 
 function GoTo(url) {
	window.location.href = url;
}
 function GoToLearn() {
	 GoTo("/l");
} 
function setSC() {
	var ge = document.getElementById("s");
	setSCCookie(ge.value);
}
 
function searchEnter(field,e) {
	var keycode;
	if (window.event)
		keycode = window.event.keyCode;
	else if (e)
		keycode = e.keyCode;
	else
		return true;

	if (keycode == 13) {
		setSCCookie(field.value);
		window.location.href = "/s";
		return false;
	} else
		return true;
}

function setFQ(g) {
	var gs = document.getElementById("s");
	var s = gs.value;
	if(s == "") {
		return false;
	}
	if(s == "") {
		alert(QUE_NOT_FOUND);
		return false;
	}
	inWait();
	s = escape(s);
	var id = g + s;
	var xhReq = createAJAX();
	xhReq.open("GET", "/m?q="+id, false);
	xhReq.send(null);
	var val = xhReq.responseText;
	outWait();
	if(val!= ""){
		setFQCookie(val);
		return true;
	} else {
		alert(QUE_NOT_FOUND);
		return false;
	}
}

function searchWeb() {
	var g = gradeText[getGC().charAt(0)];
	var gs = document.getElementById("s");
	var s = g + " " + gs.value;
	window.open("http://www.google.com/cse?cx=002097777976339130104%3Age8wuj2vkji&ie=UTF-8&q="
					+ s + "&sa=Search", "Search",
			"status=1,toolbar=yes,resizable=yes,scrollbars=yes,menubar=yes"); 
}

var INTSTR = "0123456789";
function isInt(str) {
	var i = 0;
	if(str.charAt(0)=='-'){
		i++;
	}
	for (;i < str.length; i++) {
		if (INTSTR.indexOf(str.charAt(i)) == -1) {
			return false;
		}
	}
	return true;
}

function initLinkForward(g,id) {
	initUserId();
	var grade = getGC().charAt(0);
	if(g != grade) {
		setGC(g);
	}
	setFQCookie(id);
	GoTo("/l");
}

function ObjPos(obj) {
	var curleft = curtop = 0;
	do {
		curleft = curleft + obj.offsetLeft;
		curtop = curtop + obj.offsetTop;
	} while (obj = obj.offsetParent);
	this.left = curleft;
	this.top = curtop;
}
 
function onMOBut(obj){obj.className = 'dby';} 
function onMTBut(obj){obj.className = 'dbw';}
function inSel(){document.body.style.cursor='pointer';}
function outSel(){document.body.style.cursor='auto';}
function selMMOver(obj){inSel();obj.className="gdmo";}
function selMMOut(obj){outSel();obj.className="gdn";}
function selMMSOver(obj){inSel();obj.className="gdsh";}
function selMMSOut(obj){outSel();obj.className="gds";}

function inWait() {
	document.body.style.cursor = 'wait';
	document.getElementById("pw").style.display="";
}
function outWait(){
	document.body.style.cursor='auto';
	document.getElementById("pw").style.display="none";
}

function selMOver(isSel,obj) {
	if(isSel) {
		selMMSOver(obj);
	} else {
		selMMOver(obj);
	}
}
function selMOut(isSel,obj) {
	if(isSel) {
		selMMSOut(obj);
	} else {
		selMMOut(obj);
	}
}

function arrayCopy(inAry) {
	var ret = new Array();
	for ( var i = 0; i < inAry.length; i++) {
		ret[i] = inAry[i];
	}
	return ret;
}

function sendError(err) {
	if(isPublic) {
		var sb = "n= Error&";
		sb += "e= System &";
		sb += "t="+encodeURI(err)+"\r\n";
		var xhR = createAJAX();
		try{ xhR.overrideMimeType('text/html');} catch(e){}
		xhR.open("POST", "/w", true);
		xhR.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xhR.setRequestHeader("Content-length", sb.length);
		xhR.setRequestHeader("Connection", "close");
		xhR.send(sb);
		alert(ERROR_MESSAGE);
	} else {
		alert(err);
	}
}

function randomPos(d) {
	return new Date().getTime()%d;
}

function randomOne() {
	return randomPos(10);
}

function writeCemiCircle(tc,desc) {
	var sb = startCemiCircle(tc)+desc+endCemiCircle(tc);
	return sb;
}

function isValidSpecial(keycode) {
	return (keycode==8 || keycode==9 || 
			keycode==37 || keycode==38 || keycode==46);
}

function startCemiCircle(tc) {
	var sb = "<table class="+tc+" width=100% cellspacing=0 cellpadding=0 border=0>";
	sb+= "<tr><td class="+tc+"lt ></td>";
	sb+= "<td class="+tc+"t ></td>";
	sb+= "<td class="+tc+"tr ></td></tr>";
	sb+= "<tr><td class="+tc+"l ></td>";
	sb+= "<td>";
	return sb;
}

function endCemiCircle(tc) {
	var sb = "</td>";
	sb+= "<td class="+tc+"rr ></td></tr>";
	sb+= "<tr><td class="+tc+"bl ></td>";
	sb+= "<td class="+tc+"bb ></td>";
	sb+= "<td class="+tc+"br ></td></tr>";
	sb+="</table>";
	return sb;
}

function numImgage(num) {
	var sb = "";
	if(num>0) {
		var i = num;
		while(i>0) {
			sb = IMG_NUM[i%10]+sb;
			i = Math.floor(i/10);
		}
	} else {
		sb = IMG_NUM[0];
	}
	return sb;
}
function readCookie(nameEQ) {
	var cName = getUserPrefix()+nameEQ;
	var ca = document.cookie.split(';');
	var val = "";
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(cName) == 0) {
			val= c.substring(cName.length,c.length);
			break;
		}
	}
	return val;
}

function readCookieRemove(nameEQ) {
	var val = readCookie(nameEQ);
	if(val!= ""){
		document.cookie=nameEQ;
	}
	return val;
}

function writeCookieExpiresLocal(prefix, value) {
	var date = new Date();
	date.setTime(date.getTime()+(8760*3600000));
	document.cookie = getUserPrefix()+prefix+value+"; expires="+date.toUTCString();
}

function writeCookieExpires(prefix, value) {
	var date = new Date();
	date.setTime(date.getTime()+(8760*3600000));
	document.cookie = getUserPrefix()+prefix+value+"; expires="+date.toUTCString()+"; path=/";
}

function writeCookie(prefix, value) {
	document.cookie = getUserPrefix()+prefix+value+"; path=/";
}

function setGC(value) {
	writeCookieExpires("1=",value)
}

function getGC() {
	var val = readCookie("1=");
	if(val== ""){
		val = "0";
		setGC(val);
	}
	return val;
}

function setSCCookie(val) {
	writeCookie("2=",val);
}

function getSC() {
	return readCookieRemove("2=");
}

function setFQCookie(val) {
	writeCookie("3=", val);
}
function getFQ() {
	return readCookieRemove("3=");
}

function setLevelCookie(value) {
	writeCookieExpires("4=",value)
}

function getLevelCookie() {
	return readCookie("4=");
}

function setOptCookie(value) {
	writeCookieExpiresLocal("8=",value);
}

function getOpt() {
	return readCookie("8=");
}

var VALID_ID_CHAR =" 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var USER_COOKIE_NAMEEQ = "u=";
var DELETED_USER = "-";
var GUEST = "Guest";
var utime=0
var userInfo = null;
var inUser = false,inDiv=false;

function openUserSelection() {
	
	var umde = document.getElementById("umd");
	var sb= "";
	if(userInfo.length>0) {
		var sel = parseInt(userInfo[0]);
		sb= "<table cellspacing=0 cellpadding=0 border=0 width=100%>";
		sb +="<colgroup width=90%></colgroup>";
		sb +="<colgroup width=10%></colgroup>";
		for ( var i = 1; i < userInfo.length; i++) {
			if(userInfo[i] != DELETED_USER) {
				if(i!=sel){
					sb += "<tr><td><div class=gdn onclick=selUser("+i+") onMouseover='selMMOverUser(this)' " +
					"onMouseout='selMMOutUser(this)'>";
					sb+= userInfo[i] +"</div></td><td>";
					sb += "<div class=gdn onclick=delUser("+i+") onMouseover='selMMOverUser(this)' " +
					"onMouseout='selMMOutUser(this)' alt='Delete User'>";
					sb+= IMAGE_DELETE +"</div></td></tr>";
				} else {
					sb += "<tr><td><div class=gds onclick=selUser("+i+") onMouseover='selMMSOverUser(this)' " +
						"onMouseout='selMMSOutUser(this)'>";
					sb+= userInfo[i] +"</div></td><td>";
					sb += "<div class=gds onclick=delUser("+i+") onMouseover='selMMSOverUser(this)' " +
					"onMouseout='selMMSOutUser(this)' alt='Delete User'>";
					sb+= IMAGE_DELETE +"</div></td></tr>";
					
				}
			}
		}
		sb+="</table>"
	}
	umde.innerHTML = sb;
	var ume = document.getElementById("um");
	ume.style.display="";
}

function selUser(i) {
	userInfo[0] = "" +i;
	setUserDisplay();
	hideUserSelection();
	setTimeout("userChange()",0);
	writeUserInfo();
}

function selMMOverUser(obj) {
	selMMOver(obj);
	inUC();
}

function selMMOutUser(obj) {
	selMMOut(obj);
	outUC();
}

function selMMSOverUser(obj) {
	selMMSOver(obj);
	inUC();
}

function selMMSOutUser(obj) {
	selMMSOut(obj);
	outUC();
}

function onUserFocus(field) {
	if(field.value == GUEST) {
		field.value="";
	}
	inUser = true;
}
function onBlueUser() {
	inUser = false;
	checkHideUserSelection();
}

function checkHideUserSelection() {
	if(!inUser && !inDiv) {
		hideUserSelection();
	}
}

function enterNewUser(field,e) {
	var keycode;
	if (window.event)
		keycode = window.event.keyCode;
	else if (e)
		keycode = e.keyCode;
	else
		return true;

	if (keycode == 13) {
		setNewUser(field);
		return false;
	} else if(isValidSpecial(keycode) || VALID_ID_CHAR.indexOf(String.fromCharCode(keycode))>=0){
		return true;
	} else {
		return false;
	}
}

function okNewUser() {
	setNewUser(document.getElementById("nu"));
}

function setNewUser(fd) {
	var val = fd.value;
	if(val != GUEST && val != "") {
		var i = userInfo.length;
		for ( var j = 1; j < userInfo.length; j++) {
			if(userInfo[j] == fd.value) {
				i = j;
				break;
			}
		}
		userInfo[i] = fd.value;
		fd.value=GUEST;
		selUser(i);
	} else {
		selUser(0);
	}
	hideUserSelection();
}
function delUser(i) {
	userInfo[i] = DELETED_USER;
	if(i == parseInt(userInfo[0])) {
		selUser(0);
	}
	hideUserSelection();
}

function hideUserSelection() {
	var ume = document.getElementById("um");
	ume.style.display="none";
}

function inUC(){
	inDiv = true;
	clearTimeout(utime);
}

function outUC(){
	inDiv = false;
	utime = setTimeout("checkHideUserSelection()",1000);
}

function getUserPrefix() {
	return userInfo[0]+".";
}
function initUserId() {
	var ca = document.cookie.split(';');
	var val = "";
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(USER_COOKIE_NAMEEQ) == 0) {
			val= c.substring(USER_COOKIE_NAMEEQ.length,c.length);
			break;
		}
	}
	if(val != null) {
		userInfo = val.split(":");
	} else {
		userInfo =  new Array();
		userInfo[0] = "0";
	}
}

function initUserInfo() {
	initUserId();
	setUserDisplay();
}

function setUserDisplay() {
	var i = parseInt(userInfo[0]);
	var val = GUEST;
	if(i>0) {
		val = userInfo[i];
	}
	document.getElementById("user").innerHTML = val
}

function writeUserInfo() {
	var value = userInfo[0];
	for ( var i = 1; i < userInfo.length; i++) {
		value += ":" + userInfo[i];
	}
	var date = new Date();
	date.setTime(date.getTime()+(8760*3600000));
	document.cookie = USER_COOKIE_NAMEEQ+value+"; expires="+date.toUTCString()+"; path=/";
}

var tof=null;
var lve, tpe, fie,fme,tpsae,lvsae;
var lastgls="";
var levSel=false, tppSel=false;

function FilterOption() {
	this.levels = null;
	this.topics = null;
	this.tptxt = "";
	this.gls = "";
	this.lvl = null;
	this.tpl = null;
	this.ctra = null;
	this.vallt = null;
	this.gdText = null;
	this.allctr = 0;
	this.count = fo_countAllCtr;
	this.countlt = fo_countlt;
	this.grade = fo_grade;
	this.validLevelTopic = fo_validLevelTopic;
}

function fo_validLevelTopic(l,t) {
	var a = this.ctra[l];
	if(a != null) {
		var c = a[t];
		if (c != null) {
			return true;
		}
	}
	return false;
}

function fo_grade() {
	return this.gls.charAt(0);
}

function fo_countlt(lt) {
	return this.ctra[lt.charAt(0)][lt.charAt(1)];
}

function fo_countAllCtr() {
	var glsa = this.gls.split("_");
	var sl = glsa[1];
	var st = glsa[2];
	var a,c,l,t; 
	this.allctr = 0;
	this.vallt = new Array();
	for ( var i = 0; i < sl.length; i++) {
		l = sl.charAt(i);
		a = this.ctra[l];
		if (a != null) {
			for ( var j = 0; j < st.length; j++) {
				t = st.charAt(j);
				c = a[t];
				if (c != null) {
					this.allctr = this.allctr + c;
					this.vallt[this.vallt.length] = l+t;
				}
			}
		}
	}
	return this.allctr;
}

function InitFilterOption(){
	fie = document.getElementById("fi");
	fme = document.getElementById("fm");
	lve = document.getElementById("lv");
	tpe = document.getElementById("tp");
	tpsae = document.getElementById("tpsa");
	lvsae = document.getElementById("lvsa");
	tof = new FilterOption();
	return tof;
}

function InitCtra(g) {
	var xhGTReq = createAJAX();
	xhGTReq.open("GET", "/o?g=" + g, false);
	xhGTReq.send(null);
	var ctrs = xhGTReq.responseText.split("\r");
	tof.ctra = new Array();
	for ( var i = 0; i < ctrs.length; i++) {
		var ctrl = ctrs[i].split("\n");
		if (ctrl.length == 2) {
			tof.ctra[ctrl[0]] = parseTopic(ctrl[1]);
		}
	}
	
}

function parseTopic(str){
	var a = new Array();
	var as = str.split("\t");
	for ( var i = 0; i < as.length; i++) {
		var ctrl = as[i].split("=");
		a[ctrl[0]] = new Number(ctrl[1]);
	}
	return a;
}

function filterOpen() {
	fie.style.display="";
	lastgls = tof.gls;
}

function filterOk() {
	if(lastgls != tof.gls) {
		if(tof.count()>0) {
			fie.style.display="none";
			ChangeFilter();
			setGC(tof.gls);
			lastgls="";
		} else {
			alert("Please select valid Level Topic combination.");
		}
	} else {
		fie.style.display="none";
	}
}

function filterCancel() {
	if(lastgls != tof.gls) {
		InitLevelTopicOption(tof.gdText,lastgls);
		lastgls="";
	} 
	fie.style.display="none";
}

function InitLevelTopicOption(gdText,gls){
	InitCtra(gls.charAt(0));
	tof.topics = new Array();
	tof.gdText = gdText;
	var levels = gdText[70];
	tof.levels = levels;
	tof.tptxt = gdText[7];
	tof.lvl = new Array();
	tof.tpl = new Array();
	
	var sl = "";
	var st = "";
	if(gls.length> 1) {
		tof.gls = gls;
		var glsa = tof.gls.split("_");
		sl = glsa[1];
		st = glsa[2];
	} else {
		tof.topics = new Array();
		tof.gls = "";
	}
	topics = tof.topics;
	
	var i;
	var lvh = "<table width=\"100%\" class=c>";
	var l,t;
	for (i = 0; i < levels.length; i++) {
		l = levels[i];
		lvh += "<tr><td onmouseover=\"onLVMO('"+l+"')\" onmouseout=\"onLVMU('"+l+"')\" onClick=\"onLV('"+l+"');return false;\">";
		lvh += "<div id=lvd"+l+ " class=";
		if(sl=="" || sl.indexOf(l)>=0){
			lvh += "gdmo>&diams;";
		} else {
			lvh += "gdn>&loz;";
		}
		lvh += " Level "+l+" </div>";
		lvh += "</td></tr>";
		tof.lvl[l]= gdText[71][l].split(",");
		for ( var j = 0; j < tof.lvl[l].length; j++) {
			t = tof.lvl[l][j];
			if(tof.tpl[t] == null){
				tof.tpl[t] = new Array();
				topics[topics.length] = t;
			} 
			tof.tpl[t][tof.tpl[t].length] = l;
		}
	}
	lvh += "</table>";
	lve.innerHTML = lvh;
	
	topics.sort();
	var tph = "<table width=\"100%\" class=c>";
	for ( i = 0; i < topics.length; i++) {
		t = topics[i];
		tph += "<tr><td onmouseover=\"onTPMO('"+t+"')\" onmouseout=\"onTPMU('"+t+"')\" onClick=\"onTP('"+t+"');return false;\">";
		tph += "<div id=tpd"+t+" class=";
		if(st=="" || st.indexOf(t)>=0){
			tph += "gdmo>&diams;";
		} else {
			tph += "gdn>&loz;";
		}
		tph += tof.tptxt[t]+"</div>";
		tph += "</td></tr>";
	}
	tph += "</table>";
	tpe.innerHTML = tph;
	
	if(gls.length==1) {
		tof.gls = gls+"_";
		for ( i = 0; i < levels.length; i++) {
			tof.gls += levels[i];
		}
		tof.gls += "_";
		for ( i = 0; i < topics.length; i++) {
			tof.gls += topics[i];
		}
		setGC(tof.gls);
	}
	tof.count();
}

function onLV(l){
	var e = document.getElementById("lvd"+l);
	var glsa = tof.gls.split("_");
	var sl = glsa[1];
	var sd = "";
	var n = sl.indexOf(l);
	if(n>=0){
		sd = "&loz;";
		sl = sl.substring(0,n) +  sl.substring(n+1);
	} else {
		sd = "&diams;";
		sl += l;
		sl = sortStr(tof.levels,sl);
	}
	sd = sd + " Level "+l
	e.innerHTML = sd;
	tof.gls = glsa[0]+"_"+ sl+"_"+ glsa[2];
}
function onTP(t){
	var e = document.getElementById("tpd"+t);
	var glsa = tof.gls.split("_");
	var st = glsa[2];
	var sd = "";
	var n = st.indexOf(t);
	if(n>=0){
		sd = "&loz;";
		st = st.substring(0,n) +  st.substring(n+1);
	} else {
		sd = "&diams;";
		st += t;
		st = sortStr(tof.topics,st);
	}
	sd = sd + tof.tptxt[t];
	e.innerHTML = sd;
	tof.gls = glsa[0]+ "_" + glsa[1] + "_" + st;
}

function onLVMO(l){
	inSel();
	var glsa = tof.gls.split("_");
	var sl = glsa[1];
	var st = glsa[2];
	if(sl.indexOf(l)>=0){
		document.getElementById("lvd"+l).className="gdsh";
	} else {
		document.getElementById("lvd"+l).className="gds";
	}
	var t;
	var ll = tof.lvl[l];
	for ( var j = 0; j < ll.length; j++) {
		t = ll[j];
		if(st.indexOf(t)>=0){
			document.getElementById("tpd"+t).className="gdsh";
		} else {
			document.getElementById("tpd"+t).className="gds";
		}
	}
}
function onTPMO(t){
	inSel();
	var glsa = tof.gls.split("_");
	var sl = glsa[1];
	var st = glsa[2];
	
	if(st.indexOf(t)>=0){
		document.getElementById("tpd"+t).className="gdsh";
	} else {
		document.getElementById("tpd"+t).className="gds";
	}
	var l;
	var tt = tof.tpl[t];
	for ( var j = 0; j < tt.length; j++) {
		l = tt[j];
		if(sl.indexOf(l)>=0){
			document.getElementById("lvd"+l).className="gdsh";
		} else {
			document.getElementById("lvd"+l).className="gds";
		}
	}
}
function onLVMU(l){
	outSel();
	var glsa = tof.gls.split("_");
	var sl = glsa[1];
	var st = glsa[2];
	
	if(sl.indexOf(l)>=0){
		document.getElementById("lvd"+l).className="gdmo";
	} else {
		document.getElementById("lvd"+l).className="gdn";
	}
	var t;
	var ll = tof.lvl[l];
	for ( var j = 0; j < ll.length; j++) {
		t = ll[j];
		if(st.indexOf(t)>=0){
			document.getElementById("tpd"+t).className="gdmo";
		} else {
			document.getElementById("tpd"+t).className="gdn";
		}
	}
}
function onTPMU(t){
	outSel();
	var glsa = tof.gls.split("_");
	var sl = glsa[1];
	var st = glsa[2];
	if(st.indexOf(t)>=0){
		document.getElementById("tpd"+t).className="gdmo";
	} else {
		document.getElementById("tpd"+t).className="gdn";
	}
	var l;
	var tt = tof.tpl[t];
	for ( var j = 0; j < tt.length; j++) {
		l = tt[j];
		if(sl.indexOf(l)>=0){
			document.getElementById("lvd"+l).className="gdmo";
		} else {
			document.getElementById("lvd"+l).className="gdn";
		}
	}
}

function onSRMOLevel(){
	inSel();
	lvsae.className="gdsh";
}
function onSRMOutLevel(){
	outSel();
	lvsae.className="dfo";
}

function onLevel() {
	if(levSel) {
		onLevelSA();
		levSel = false;
		lvsae.innerHTML = "&diams; Deselect All";
	} else {
		onLevelRA();
		levSel = true;
		lvsae.innerHTML = "&loz; Select All";
	}
}

function onLevelSA() {
	var levels = tof.levels;
	var glsa = tof.gls.split("_");
	var sl = "";
	var l,e,i;
	for ( i = 0; i < levels.length; i++) {
		l = levels[i];
		sl += l;
		e = document.getElementById("lvd"+l);
		e.innerHTML = "&diams; Level "+l;
		e.className="gdmo";
	}
	tof.gls = glsa[0]+"_"+ sl+"_"+ glsa[2];
}

function onLevelRA() {
	var levels = tof.levels;
	var glsa = tof.gls.split("_");
	var l,e,i;
	for ( i = 0; i < levels.length; i++) {
		l = levels[i];
		e = document.getElementById("lvd"+l);
		e.innerHTML = "&loz; Level "+l;
		e.className="gdn";
	}
	tof.gls = glsa[0]+"__"+ glsa[2];
}

function onSRMOTopic(){
	inSel();
	tpsae.className="gdsh";
}
function onSRMOutTopic(){
	outSel();
	tpsae.className="dfo";
}

function onTopic() {
	if(tppSel) {
		onTopicSA();
		tppSel = false;
		tpsae.innerHTML = "&diams; Deselect All";
	} else {
		onTopicRA();
		tppSel = true;
		tpsae.innerHTML = "&loz; Select All";
	}
}

function onTopicSA() {
	var glsa = tof.gls.split("_");
	var st = "";
	var t,e,i;
	for ( i = 0; i < tof.topics.length; i++) {
		t = topics[i];
		st+= t;
		e = document.getElementById("tpd"+t);
		e.innerHTML = "&diams; "+ tof.tptxt[t];
		e.className="gdmo";
	}
	tof.gls = glsa[0]+"_"+ glsa[1]+"_"+ st;
}

function onTopicRA() {
	var glsa = tof.gls.split("_");
	var t,e,i;
	for ( i = 0; i < tof.topics.length; i++) {
		t = tof.topics[i];
		e = document.getElementById("tpd"+t);
		e.innerHTML = "&loz; "+ tof.tptxt[t];
		e.className="gdn";
	}
	tof.gls = glsa[0]+"_"+glsa[1]+"_";
}

function fltMsgOn(id) {
	inSel();
	var ide = document.getElementById(id);
	var pos =  new ObjPos(ide);
	fme.style.left= ""+(pos.left-80)+"px";
	fme.style.top= ""+(pos.top-110)+"px";
	fme.style.display="";
}

function fltMsgOut() {
	outSel();
	fme.style.display="none";
}
var lde, pde, cde, nde, ibe, mbacke, ltte;
var firstq=true;

function DivElement(id){
	this.id = id;
	this.e = document.getElementById(id);
	this.show = de_show;
	this.hide = de_hide;
}

function de_show(){
	this.e.className="w";
}

function de_hide(){
	this.e.className= "h";
}

function InitElement(){
	lde = new DivElement("w");
	pde = new DivElement("x");
	cde = new DivElement("y");
	nde = new DivElement("z");
	ibe = document.getElementById('ib');
	mbacke = document.getElementById('mback');
	ltte = document.getElementById('ltt');
	InitScoreElement();
}

function ClearElement(){
	lde.show();
	pde.hide();
	cde.hide();
	nde.hide();
}

function StartQA(text){
	lde.hide();
	cde.e.innerHTML = text;
	cde.show();
	RefreshBack();
	InitScoreBoard();
}

function RefreshOption(text){
	ope = document.getElementById(cde.id+"op");
	ope.innerHTML = text;
}

function BackPage(){
	if(qap==0){
		return;
	}
	cde.hide();
	pde.show();
	--qap;
	var te = nde;
	nde=cde;
	cde=pde;
	if(qap>0){
		te.e.innerHTML = qas[qap-1].html(te.id);
	}
	pde = te;
	RefreshBack();
	updateLTText();
}

function NextPage(){
	cde.hide();
	nde.show();
	++qap;
	var te = pde;
	pde=cde;
	cde=nde;
	nde = te;
	if(tq<=qap){			
		tq++;
		qas[qas.length] = lrnMgr.getQA();
		RefreshScore(false);
	} else {
		updateLTText();
	}
	te.e.innerHTML = qas[qap+1].html(te.id);
	RefreshBack();
}

function RefreshScore(isCount){
	updateLTText();
	updateScoreBoard(isCount);
}

function updateLTText() {
	var lttext = "";
	var qa = curQA();
	var llt = qa.llt;
	if(llt != null) {
		var glt = llt.glt;
		lttext = tof.tptxt[glt.charAt(2)] + " / " + TEXT_LEVEL + glt.charAt(1);
		ltte.innerHTML = lttext;
	}
	qa.seen();
}

var TEXT_BACK = "<a href=# onClick=backq() title=\"Previous Question\"><img src='" + IMG_BACK + "'></a>";
var TEXT_NBACK = "<img src='" + IMG_NBACK + "'>";
var TEXT_SBACK = "<a href=# onClick=\"selHistory(0)\"><img src='"+IMG_SFIRST+"'></a>&nbsp;<a href=# onClick=backq()><img src='"+IMG_SBACK+"'></a>";
var TEXT_SNBACK = "<img src='"+IMG_SNFIRST+"'>&nbsp;<img src='"+IMG_SNBACK+"'>";
function RefreshBack() {
	if(qap==0) {
		if(!firstq) {
			ibe.innerHTML = TEXT_NBACK;
			mbacke.innerHTML = TEXT_SNBACK;
			firstq = true;
		}
	} else if(firstq){
		ibe.innerHTML = TEXT_BACK;
		mbacke.innerHTML = TEXT_SBACK;
		firstq = false;
	}
}

var mre,mwe,sce,scie, scte,scpie,scple;
var ere,ese,epe,eape,ease,etpe,etps;
var lastRq=-1,lastTq=-1,lastPer=-1,lastAvgTimeMin=-1,lastAvgTimeSec=-1, timeMin=-1,timeSec=-1;
var ASCOUNT=5,APCOUNT=25;
var IMAGE_SCORE = new Array();
IMAGE_SCORE[0] = "/i/1h.png";
IMAGE_SCORE[1] = "/i/1i.png";
IMAGE_SCORE[2] = "/i/1k.png";
IMAGE_SCORE[3] = "/i/1l.png";
IMAGE_SCORE[4] = "/i/1m.png";
IMAGE_SCORE[5] = "/i/1n.png";
var IMAGE_SCORE_SMALL = "/i/1o.png";
var IMAGE_SM = "<img src='" + IMAGE_SCORE_SMALL + "'>";
var IMAGE_APS = "<img src='/i/1x.png'>";
var ltime = 0;

function InitScoreElement(){
	mre = document.getElementById('mr');
	mwe = document.getElementById('mw');
	sce = document.getElementById("sc");
	scie = document.getElementById('sci');
	scte = document.getElementById('sct');
	sctae = document.getElementById('scta');
	scpie = document.getElementById('scpi');
	scple = document.getElementById('scpl');
	ere = document.getElementById('er');
	ese = document.getElementById('es');
	epe = document.getElementById('ep');
	eape = document.getElementById('eap');
	ease = document.getElementById('eas');
	etpe = document.getElementById('etp');
	etse = document.getElementById('ets');
}

function InitScoreBoard(){
	sce.innerHTML = "";
	sce.className = "s";
	updateScoreBoard(true);
	startTimer();
}

function updateScoreBoard(isCount){
	updateRightScore();
	updateTotalScore();
	updatePercent(isCount);
}

function updatePercent(isCount) {
	var ttq;
	if(isCount){
		ttq = tq;
	} else {
		ttq = tq-1;
	}
	var pc = Math.round((rq/ttq)*100);
	if(lastPer != pc) {
		epe.innerHTML = numImgage(pc);
		lastPer = pc;
	}
}

function updateTotalScore() {
	if(lastTq != tq) {
		ese.innerHTML = numImgage(tq);
		lastTq = tq;
		updateAverageTime();
	}
}

function updateRightScore() {
	if(lastRq != rq) {
		var r = rq%ASCOUNT;
		if(r == 0) {
			if(rq>0) {
				if(rq%APCOUNT == 0) {
					scoreAPS();
				} else {
					countImage();
				}
			} else {
				scte.innerHTML = "";
				sctae.innerHTML = "";
			}
		}
		scie.src = IMAGE_SCORE[r];
		ere.innerHTML = numImgage(rq);
		lastRq = rq;
	}
}

function scoreAPS() {
	scple.style.display="";
	setTimeout("updateAPImage()",3000);
}

function updateAPImage() {
	scple.style.display="none";
	countImage();
}

function countImage() {
	var lrq = rq;
	var i;
	if(lrq>=APCOUNT){
		var r1 = Math.floor(lrq/APCOUNT);
		var sb1 = IMAGE_APS;
		for (i = 1; i < r1; i++) {
			if(i%3 == 0) {
				sb1 +="<BR>";
			}
			sb1 += IMAGE_APS;
		}
		lrq = lrq%APCOUNT;
		sctae.innerHTML = sb1;
	} else {
		sctae.innerHTML = "";
	}
	
	if(lrq>=ASCOUNT){
		var r = lrq/ASCOUNT;
		var sb = IMAGE_SM;
		for (i = 1; i < r; i++) {
			if(i%5 == 0) {
				sb +="<BR>";
			}
			sb += IMAGE_SM;
		}
		scte.innerHTML = sb;
	} else {
		scte.innerHTML = "";
	}
}

function startTimer() {
	clearTimeout(ltime);
	timeMin=0;
	timeSec=0;
	var num0 = numImgage(0);
	etpe.innerHTML =  num0;
	etse.innerHTML =  num0;
	ltime = setTimeout("updateTimer()",1000);
}
function updateTimer(){
	timeSec++;
	if(timeSec==60) {
		timeSec=0;
		timeMin++;
		etpe.innerHTML =  numImgage(timeMin);
	}
	etse.innerHTML =  numImgage(timeSec);
	ltime = setTimeout("updateTimer()",1000);
}

function updateAverageTime(){
	var aMin =0,aSec=0;
	if(lastTq>1) {
		var avgSec = Math.round((timeMin*60+timeSec)/(lastTq-1));
		aSec = avgSec%60;
		aMin = Math.floor(avgSec/60);
	}
	if(lastAvgTimeMin != aMin){
		eape.innerHTML =  numImgage(aMin);
		lastAvgTimeMin = aMin;
	}
	if(lastAvgTimeSec != aSec){
		ease.innerHTML =  numImgage(aSec);
		lastAvgTimeSec = aSec;
	}
}
function showRight(){
	ansrwTime = setTimeout('hideRight()',1000);
	mre.style.display="";
	document.body.onmousedown=hideRight;
}

function hideRight(){
	sce.innerHTML = TEXT_RIGHT;
	sce.className = "s";
	mre.style.display="none";
	document.body.onmousedown="";
	nextq();
}

function showWrong(){
	sce.innerHTML = TEXT_WRONG;
	sce.className = "sd";
	mwe.style.display="";
	document.body.onmousedown=hideWrong;
	setTimeout('hideWrong()',1000);
}

function hideWrong(){
	mwe.style.display="none";
	document.body.onmousedown="";
}
var qas = null;
var qap=0;
var tq=1;
var rq=0;
var sce,mre,mwe;
var xhReq1;
var gdText = null,lrnMgr;
var ansrwTime=0;

function InitQuestion(){
	xhReq1 = createAJAX();
}
function curQA(){
	return qas[qap];
}

function QA(q,llt){
	this.q = q;
	this.llt = llt;
	this.code = 0;
	this.selopt = -1;
	this.html = qa_Html;
	this.opt = qa_opt;
	this.tdc = qa_tdhtml;
	this.sel = qa_sel;
	this.selAn = qa_selAn;
	this.refObj = null;
	this.ref = qa_Ref;
	this.appObj = null;
	this.app = qa_App;
	this.showAns = false;
	this.ansObj = null;
	this.print = qa_print;
	this.seen = qa_seen;
}

function qa_seen(){
	if(this.selopt == -1 && this.llt != null ) {
		this.selopt = -2;
		this.llt.seen();
	}
}

function qa_Html(id){
	var sb =  "<div class=dq><div class=fl>" + this.q.question;
	sb += "</div><div class=dop id="+id+"op>";
	sb += this.opt();
	sb += "</div>";
		
	sb += "<div class=gdm> <a href=# onclick='shAns()'>";
	sb+= "<img id="+id+"l src='";
	var hwa;
	if(this.showAns){
		sb += IMG_PDOWN;
		hwa = "w";
	} else {
		sb += IMG_PUP;
		hwa = "h";
	}
	sb += "' height=20px class=im></a> "+TEXT_DTL_ANS+" </div>" ;
	sb += "<div id=" + id + "a "+" class="+hwa+">";
	if(this.showAns){
		sb += this.ansObj.html();
	}
	sb += "</div>";
	return sb;
}

function qa_opt(){
	var rltText,tdct="",tdcs="";
	if(this.code == 0){
		rltText = TEXT_OPTIONS;
		tdct=" onclick=selAns(";
		tdcs=") onMouseover='optMMOver(this)' onMouseout='optMMOut(this)'";
	} else if(this.code == 1){
		rltText = IMAGE_RIGHT + TEXT_RIGHT;
	} else if(this.code == 2){
		rltText = IMAGE_WRONG + TEXT_WRONG;
	}
	
	var sb =  "<BR><div class=drw>"+rltText+"</div>";
	sb += "<table width=100% cellspacing='2px' cellpadding='2px' class=tn><tr>";
	sb += this.tdc(tdct,tdcs,0);
	for ( var i = 1; i < this.q.options.length; i++) {
		if(i%2==0){
			sb += "</tr><tr>"
		}
		sb += this.tdc(tdct,tdcs,i);
	}
	if(this.q.options.length%2==1){
		sb += "<td></td></tr></table>"
	}
	sb += "</tr></table>";
	return sb;
}

function qa_tdhtml(tdc,tdcs,i){
	var cls = 'qb';
	if(this.code == 1){
		if(i==this.q.ansopt){
			cls='qbr';
		}
	} else if(this.code == 2){
		if(i==this.q.ansopt){
			cls='qba';
		} else if(i==this.selopt){
			cls='qbw';
		}
	}
	
	if(tdc.length>0) {
		return "<td width='50%'><div class="+cls+tdc+i+tdcs+">"+this.q.options[i]+"<div></td>";
	} else {
		return "<td width='50%'><div class="+cls+">"+this.q.options[i]+"</div></td>";
	}
}

function qa_print(){
	var sb =  "<html>" + TEXT_QST + ": " + this.q.question;
	sb += "Options:<br>";
	for ( var i = 0; i < this.q.options.length; i++) {
		sb += "("+(i+1)+") "+this.q.options[i]+"<br>"
	}
	if(this.code != 0){
		sb += TEXT_RGT_OPT + ": " + (parseInt(this.q.ansopt)+1) + "<br>";
	}
	if(this.showAns){
		sb += this.ansObj.print();
	}
	sb += "</html>";
	return sb;
}

function qa_sel(opt){
	this.selopt = opt;
	if(this.q.ansopt == opt){
		rq++;
		this.code = 1;
		if(this.llt != null) {
			this.llt.right();
		}
		showRight();
	} else {
		this.code = 2;
		showWrong();
		shAns();
	}
	RefreshOption(this.opt());
	RefreshScore(true);
}

function qa_selAn(){
	this.selopt = 9;
	this.code = 2;
	RefreshOption(this.opt());
	RefreshScore(true);
}

function selAns(i){
	qas[qap].sel(i);
}

function qa_Ref(){
	if(this.refObj == null){
		inWait();
		xhReq1.open("GET", "/e?q="+grade+this.q.id, false);
		xhReq1.send(null);
		this.refObj = parseRef(xhReq1.responseText);
		outWait();
	}
	return this.refObj;
}

function qa_App(){
	if(this.appObj == null){
		inWait();
		xhReq1.open("GET", "/q?q="+grade+this.q.id, false);
		xhReq1.send(null);
		var outVal = xhReq1.responseText;
		if(outVal.length>0) {
			this.appObj = parseRef(outVal);
		} else {
			this.appObj = "<div class=gdn>"+TEXT_NAA+"</div>";
		}
		outWait();
	}
	return this.appObj;
}

function parseRef(value){
	var sb = "";
	var values = value.split("\r");
	var refs;
	for(var i=0;i<values.length;i++){
		refs = values[i].split("\n");
		sb+= "<div class=gdn onclick=selQA('"+refs[0]+"','"+refs[1]+"') onMouseover='selMMOver(this)' " +
			"onMouseout='selMMOut(this)'>"
		sb+=ParseText(refs[2],getGradeText(refs[0]));
		sb += "</div>";
	}
	return sb;
}

function Reference(){
	return qas[qap].ref();
}

function Applied(){
	return qas[qap].app();
}

function History(){
	var sb = "";
	var st = tq-1;
	var end = 0;
	//if(st>qap+10) {st = qap+10;}
	//if(qap>10) {end = qap-10;}
	for(var i=st;i>=end;i--){
		if(i!=qap){
			sb += "<div class=gdn onclick=selHistory("+i+") onMouseover='selMMOver(this)' " +
			"onMouseout='selMMOut(this)'>";
		} else {
			sb += "<div class=gds onclick=selHistory("+i+") onMouseover='selMMSOver(this)' " +
				"onMouseout='selMMSOut(this)'>";
		}
		sb += (i+1) + ") ";
		sb += qas[i].q.shortq();
		if(qas[i].code ==1){
			sb += IMAGE_RIGHT;
		} else if(qas[i].code==2){
			sb += IMAGE_WRONG;
		}
		sb += "</div>";
	}
	return sb;
}

function selHistory(i){
	if(i>0){
		pde.e.innerHTML = qas[i-1].html(pde.e.id);
	}
	cde.e.innerHTML = qas[i].html(cde.e.id);
	nde.e.innerHTML = qas[i+1].html(nde.e.id);
	qap=i;
	hideHMenu();
	RefreshBack();
	updateLTText();
}

function lastSeen() {
	if(qap < tq-1) {
		selHistory(tq-1);
	} else {
		nextq();
	}
}

function getQA(gdt, id, grade){
	xhReq1.open("GET", "/g?q="+id, false);
	xhReq1.send(null);
	var text = xhReq1.responseText;
	var qa = null;
	try {
		qa = new QA(new Qstn(text.split("\r"), 0, gdt,grade),null);
	} catch (e) {
		throw "getQA/Text:"+text+"/Id:"+id+"/"+e;
	}
	return qa;
}


function selQA(grade, id){
	hideHMenu();
	try {
		InsertNextQA(getQA(getGradeText(grade),id,grade));
	} catch (e) {
		sendError("selQA:Grade"+grade+"/"+e);
	}
}

function InsertNextQA(qa){
	var np = qap+1;
	for ( var i = qas.length; i>np; i--) {
		qas[i] = qas[i-1];
	}
	qas[np] = qa;
	nde.e.innerHTML = qa.html(nde.id);
	NextPage();
}

function InitQA(lm,grade){
	lrnMgr = lm;
	gdText = lrnMgr.gdText;
	readInitQA(lrnMgr.getQA());
}

function InitFirstQA(lm,id,grade){
	lrnMgr = lm;
	gdText = lrnMgr.gdText;
	try {
		readInitQA(getQA(gdText,id,grade));
	} catch (e) {
		sendError("InitFirstQA/"+e);
	}
}

function readInitQA(qa){
	qap=0;
	tq=1;
	rq=0;
	qas = new Array();
	qas[0] = qa;
	StartQA(qa.html(cde.id));
	qas[1] = lrnMgr.getQA();
	nde.e.innerHTML = qas[1].html(nde.e.id);
	RefreshScore(false);
}


function optMMOver(obj) {
	inSel();
	obj.className="qbh";
}
function optMMOut(obj) {
	outSel();
	obj.className="qb";
}


function getAnswerText(gid){
	xhReq1.open("GET", "/f?q="+gid, false);
	xhReq1.send(null);
	return xhReq1.responseText;
}

function getAnswer(gid, gdt){
	var ans = null;
	try {
		inWait();
		ans = new Answer(getAnswerText(gid), gid, gdt);
		outWait();
	} catch(e) {
		sendError("Id:"+gid+"getAnswer:"+e);
	}
	return ans;
}

function getAlternativeAnswerText(gid,type){
	xhReq1.open("GET", "/u?q="+gid+"&t="+type, false);
	xhReq1.send(null);
	return xhReq1.responseText;
}

function getAlternativeAnswer(ans,type, gdt){
	inWait();
	var ansDet  = new Array();
	try {
		var ansText = getAlternativeAnswerText(ans.gid,type);
		var cs = ansText.split("\r");
		for (var i = 0; i < cs.length; i++) {
			var t = cs[i].charAt(0);
			if(t != 9) {
				ansDet[i] = new ansClass[t](cs[i],gdt,ans,"","","sad");
			}
		}
	} catch(e) {
		sendError("Id:"+ans.gid+"/getAlternativeAnswer:"+e);
	}
	outWait();
	return ansDet;
}

function shAns(){
	var qa = qas[qap];
	var le = document.getElementById(cde.id+"l");
	var ae = document.getElementById(cde.id+"a");
	if(qa.showAns){
		qa.showAns = false;
		le.src = IMG_PUP;
		ae.className="h";
	} else {
		qa.showAns = true;
		le.src = IMG_PDOWN;
		ae.className="w";
		if(qa.ansObj == null) {
			qa.ansObj = getAnswer(qa.q.gid(),qa.q.gdt);
			ae.innerHTML = qa.ansObj.html();
		}
		if(qa.code == 0){
			qa.selAn();
		}
	}
}

function onSelAnsDet(dp) {
	var qaa = qas[qap].ansObj;
	qaa.ansDetail[dp].clickEvent();
	var ae = document.getElementById(cde.id+"a");
	ae.innerHTML = qaa.html();
}

function Answer(value, gid, gdt){
	this.gid = gid;
	var cs = value.split("\r");
	this.desc = null;
	if(cs[0].length>0) {
		this.desc = ParseText(cs[0],gdt)
	}
	this.ansDetail = new Array();
	this.det = new Array();
	for ( var i = 1; i < cs.length; i++) {
		this.det[i-1] = new ansClass[cs[i].charAt(0)](cs[i],gdt,this,"","","sad");
	}
	this.html = answer_Html;
	this.print = answer_Print;
}

function answer_Html(){
	var sb = "<div class=da>";
	if(this.desc != null) {
		sb += writeAnsDescription(this.desc);
	}
	sb += "<table class=n width=100%>";
	sb +="<colgroup width=5%></colgroup>";
	sb +="<colgroup width=92%></colgroup>";
	sb +="<colgroup width=3px></colgroup>";
	for ( var i = 0; i < this.det.length; i++) {
		sb += this.det[i].html("","");
	}
	sb += "</table></div>";
	return sb;
}

function answer_Print(){
	var sb = "Answer:";
	if(this.desc != null) {
		sb += this.desc;
	}
	for ( var i = 0; i < this.det.length; i++) {
		sb += "<BR>"+this.det[i].print("");
	}
	return sb;
}

var ansClass = new Array();
ansClass[0] = AnsText;
ansClass[1] = AnsTextOnly;
ansClass[2] = AnsRef;
ansClass[3] = AnsRefOnly;
ansClass[4] = AnsRefDesc;
ansClass[5] = AnsLink;
ansClass[6] = AnsLinkOnly;
ansClass[7] = AnsLinkStart;
ansClass[8] = AnsLinkStartOnly;
ansClass[9] = AnsAlternative;

function print_text(sd){
 	return  sd + this.value;
}

function AnsText(val, gdt, ans, prefix, suffix, sa){
	try {
		this.value = " = "+ prefix +" <span class=" + sa +">"+ ParseText(val.substring(1),gdt) + "</span>" + suffix;
	} catch(e) {
		sendError("AnsText:"+e);
	}
 	this.html = html_text;
 	this.print = print_text;
 }
function html_text(lp,sd){
 	return "<tr><td class=ln>"+lp+"</td><td class=ns>"+sd + this.value + "</td><td class=lr></td></tr>";
}

 function AnsTextOnly(val, gdt, ans, prefix, suffix, sa) {
 	try {
		this.value = prefix + "<span class=" + sa +">" + ParseText(val.substring(1), gdt) + "</span>" + suffix;
	} catch(e) {
		sendError("AnsTextOnly:"+e);
	}
 	this.html = html_text;
 	this.print = print_text;
 }

function AnsRef(val, gdt, ans, prefix, suffix, sa){
	var values = val.split('\n');
	this.grade = values[0].charAt(1);
	this.id = values[1];
 	try {
		this.value = " = "+ prefix +" <span class=" + sa +">"+ ParseText(values[2],gdt) + "</span>" + suffix;
	} catch(e) {
		sendError("AnsRef:"+e);
	}
	this.cls = "ns";
 	this.html = html_ref;
 	this.print = print_text;
 }
 function html_ref(lp,sd){
	return "<tr><td class=ln>"+lp+"</td>" +
		"<td class="+this.cls+">"+sd+this.value+"</td>" +
		"<td class=lr onclick=\"selQA('"+this.grade+"','"+ this.id + 
	 		"')\"><a href=# title='Reference'>"+IMAGE_RFERENCE+"</a></td></tr>";
 }

 function AnsRefOnly(val, gdt, ans, prefix, suffix, sa){
	var values = val.split('\n');
	this.grade = values[0].charAt(1);
	this.id = values[1];
 	try {
		this.value = prefix + "<span class=" + sa +">" + ParseText(values[2], gdt) + "</span>" + suffix;
	} catch(e) {
		sendError("AnsRefOnly:"+e);
	}
	
 	this.cls = "no";
 	this.html = html_ref;
 	this.print = print_text;
 }
 
 function AnsRefDesc(val,gdt,ans, prefix, suffix, sa){
	var values = val.split('\n');
	this.grade = values[0].charAt(1);
	this.id = values[1];
	try {
		this.value = prefix + "<span class=" + sa +">" + ParseText(values[2], gdt) + "</span>" + suffix;
	} catch(e) {
		sendError("AnsRefDesc:"+e);
	}
 	this.cls = "ns";
 	this.html = html_ref;
 	this.print = print_text;
 }
 
 function AnsLink(val, gdt, ans, prefix, suffix, sa) {
	var values = val.split('\n');
	this.grade = values[0].charAt(1);
	this.id = values[1];
	var pv= "",md="",ps="";
	try {
		pv = ParseText(values[2],gdt);
		md = ParseText(values[3],gdt);
		ps = ParseText(values[4],gdt);
	} catch(e) {
		sendError("AnsLink:"+e);
	}
	var inperfix = prefix +  "<span class=" + sa +">" + pv + "</span>";
	var insufix = "<span class=" + sa +">" + ps + "</span>" + suffix;
	this.ad = new AnsLinkDetail(inperfix, insufix, ans, this.grade, this.id);
	this.value = "=" + prefix +  "<span class=" + sa +">" + pv + "</span>" +
		"<span class=" + this.ad.spc + ">" + md + "</span>" +
		"<span class=" + sa +">" + ps + "</span>" + suffix;
	this.sd = "=";
	this.html = link_html;
 	this.print = link_print;
 }
 function AnsLinkOnly(val, gdt, ans, prefix, suffix, sa) {
	var values = val.split('\n');
	this.grade = values[0].charAt(1);
	this.id = values[1];
	var pv= "",md="",ps="";
	try {
		pv = ParseText(values[2],gdt);
		md = ParseText(values[3],gdt);
		ps = ParseText(values[4],gdt);
	} catch(e) {
		sendError("AnsLink:"+e);
	}
	var inperfix = prefix +  "<span class=" + sa +">" + pv + "</span>";
	var insufix = "<span class=" + sa +">" + ps + "</span>" + suffix;
	this.ad = new AnsLinkDetail(inperfix, insufix, ans, this.grade, this.id);
	this.value =  prefix +  "<span class=" + sa +">" + pv + "</span>" +
		"<span class=" + this.ad.spc + ">" + md + "</span>" +
		"<span class=" + sa +">" + ps + "</span>" + suffix;
	this.sd = "";
	this.html = link_html;
 	this.print = link_print;
 }
 
 function AnsLinkStart(val,gdt,ans, prefix, suffix, sa){
	 var values = val.split('\n');
		this.grade = values[0].charAt(1);
		this.id = values[1];
		var pv= "", md="", ps="";
		try {
			pv = ParseText(values[2],gdt);
			md = ParseText(values[3],gdt);
			ps = ParseText(values[4],gdt);
		} catch(e) {
			sendError("AnsLinkStart:"+e);
		}
		var inperfix = prefix +  "<span class=" + sa +">" + pv + "(</span>";
		var insufix = "<span class=" + sa +">)" + ps + "</span>" + suffix;
		
		this.ad = new AnsLinkDetail(inperfix, insufix, ans, this.grade, this.id);
		this.value = "=" + prefix +  "<span class=" + sa +">" + pv + "</span>" +
			"<span class=" + this.ad.spc + ">" + md + "</span>" +
			"<span class=" + sa +">" + ps + "</span>" + suffix;
		this.sd = "=";
		this.html = link_html;
	 	this.print = link_print;
 }

 function AnsLinkStartOnly(val,gdt,ans, prefix, suffix, sa){
	 var values = val.split('\n');
		this.grade = values[0].charAt(1);
		this.id = values[1];
		var pv= "", md="", ps="";
		try {
			pv = ParseText(values[2],gdt);
			md = ParseText(values[3],gdt);
			ps = ParseText(values[4],gdt);
		} catch(e) {
			sendError("AnsLinkStart:"+e);
		}
		var inperfix = prefix +  "<span class=" + sa +">" + pv + "(</span>";
		var insufix = "<span class=" + sa +">)" + ps + "</span>" + suffix;
		
		this.ad = new AnsLinkDetail(inperfix, insufix, ans, this.grade, this.id);
		this.value =  prefix +  "<span class=" + sa +">" + pv + "</span>" +
			"<span class=" + this.ad.spc + ">" + md + "</span>" +
			"<span class=" + sa +">" + ps + "</span>" + suffix;
		this.sd = "";
		this.html = link_html;
	 	this.print = link_print;
 }
 
function link_html(sp, sd) {
	var sb;
	if (this.ad.openDet) {
		var det = sp + "<a href=# onclick=\"onSelAnsDet("+ this.ad.pos + 
			");return false;\" >" + IMAGE_OPDOWN + "</a> ";
		sb = this.ad.html(det,this.sd);
	} else {
		sb = "<tr><td class=lr>" + sp;
		sb += "<a href=# onclick=\"onSelAnsDet("+ this.ad.pos + ");return false;\" >";
		sb += IMAGE_OPUP;
		sb += "</a></td>";
		sb += "<td class=ns>" + sd + this.value + "</td>";
		sb += "<td class=lr onclick=\"selQA('" + this.grade + "','" + this.id + 
			"')\"><a href=# title='Reference'>"+IMAGE_RFERENCE+"</a></td></tr>";
	}
	return sb;
}

function link_print(sd){
	var sb = null;
	if(this.ad.openDet) {
		sb = this.ad.print(this.sd);
	} else {
		sb = sd + this.value;
	}
	return sb;
}

function AnsLinkDetail(prefix, suffix, ans, grade, id){
	this.prefix = prefix;
	this.suffix = suffix;
	this.ans = ans;
	this.grade = grade;
	this.id = id;
	this.openDet = false;
	this.pos = this.ans.ansDetail.length;
	this.spc = "sa" + (this.pos%10);
	this.ans.ansDetail[this.pos] = this;
	this.det = null;
	this.clickEvent = linkdetail_clickEvent;
 	this.html = linkdetail_html;
 	this.print = linkdetail_print;
}

function linkdetail_clickEvent(){
	if(this.openDet) {
		this.openDet = false;
	} else {
		this.openDet = true;
		if(this.det == null) {
			inWait();
			var value = getAnswerText(this.grade+this.id);
			var cs = value.split("\r");
			var gdt = getGradeText(this.grade);
			this.det = new Array();
			var end = cs.length-1;
			for ( var i = 1; i < end; i++) {
				var type = cs[i].charAt(0);
				this.det[i-1] = new ansClass[type](cs[i], gdt, this.ans, 
						this.prefix, this.suffix, this.spc);
			}
			outWait();
		}
	}
}

function linkdetail_html(sp, sd){
	var sb = this.det[0].html(sp, sd);
	for (var i = 1; i < this.det.length; i++) {
		sb += this.det[i].html("", "");
	}
	return sb;
}
	
function linkdetail_print(sd){
	var sb = this.det[0].print(sd);
	for (var i = 1; i < this.det.length; i++) {
		sb += "<BR>" + this.det[i].print("");
	}
	return sb;
}

function AnsAlternative(val, gdt, ans, prefix, suffix, sa) {
	var values = val.split('\n');
	this.ans = ans;
	this.gdt = gdt;
	this.openDet = false;
	this.altAns = null;
	this.type = values[1];
	this.value = ParseText(values[2],gdt);
	this.pos = ans.ansDetail.length;
	ans.ansDetail[this.pos] = this;
	this.clickEvent = ansAlternative_clickEvent;
	this.html = ansAlternative_html;
	this.print = ansAlternative_print;
}

function ansAlternative_clickEvent() {
	if(this.openDet) {
		this.openDet = false;
	} else {
		this.openDet = true;
		if(this.altAns == null) {
			this.altAns = getAlternativeAnswer(this.ans,this.type,this.gdt);
		}
	}
}

function ansAlternative_html() {
	var sb = "<tr><td class=ln>";
	sb += "<a href=# onclick=\"onSelAnsDet("+ this.pos + ");return false;\" >";
	if (this.openDet) {
		sb+= IMAGE_OPDOWN; 
	}  else {
		sb+= IMAGE_OPUP;
	}
	sb += "</a></td><td class=ns>";
	sb += this.value;
	sb += "</td><td class=lr> </td></tr>";
	if (this.openDet) {
		for ( var i = 0; i < this.altAns.length; i++) {
			sb += this.altAns[i].html("","");
		}
	}
	return sb;
}

function ansAlternative_print() {
	var sb = "";
	if(this.openDet) {
		sb += this.value;
		for ( var i = 0; i < this.altAns.length; i++) {
			sb += "<BR>"+this.altAns[i].print("");
		}
	}
	return sb;
} 

function writeDesc(desc) {
	var sb = "";
	var c;
	for ( var i = 0; i < desc.length; i++) {
		c = desc.charAt(i);
		sb += c;
		if(c == '.' || c== ':') {
			sb += "<BR>";
		}
	}
	return sb;
}

function writeAnsDescription(desc) {
	var sb = YELLOW_LIGHT + writeDesc(desc);
	return writeBlueCemi(sb);
}

function writeBlueCemi(desc) {
	return writeCemiCircle("ta",desc);
}

var lmReq;
var INIT_MIN_QA_COUNT =2;
var INIT_LAST_MIN_QA_COUNT=4;
var MOVE_UP_MIN_PER=70;
var MOVE_UP_MAX_PER=90;
var MOVE_BACK_PER=35;

function initLearnManagerPage() {
	lmReq = createAJAX();
}

// Start Learn Manager
function LearnManager(filter) {
	this.filter = filter;
	this.gdText = filter.gdText;
	this.topicService = null;
	this.topicServiceAll = null;
	this.activeCount = 0;
	this.pos = -1;
	this.maxCurLevel = -1;
	this.getQA = lm_getQA;
	this.prepare = lm_prepareQA;
	this.next = lm_next;
	this.nextTopic = lm_nextTopic;
	this.minLevel = lm_minLevel;
	initLearnManager(this);
	this.prepare();
}

function lm_next() {
	if(this.pos<this.topicService.length-1){
		this.pos++;
	} else {
		this.pos=0;
	}
}
function lm_nextTopic() {
	this.next();
	for ( var i = 0; i < this.topicService.length; i++) {
		if(this.topicService[this.pos] != null && this.topicService[this.pos].curLevel()<=this.maxCurLevel){
			return;
		}
		this.next();
	}
	this.maxCurLevel++;
	this.nextTopic();
}
function lm_getQA() {
	var qa = this.topicService[this.pos].getQA();
	this.prepare();
	return qa;
}

function lm_prepareQA() {
	if(this.activeCount == 0) {
		this.topicService = arrayCopy(this.topicServiceAll);
		this.activeCount = this.topicService.length;
		this.maxCurLevel = this.minLevel();
		this.pos = -1;
		setInitLearnLevel(this.topicService);
	}
	this.nextTopic();
	var isRemove = this.topicService[this.pos].prepare();
	if(isRemove) {
		this.topicService[this.pos] = null;
		this.activeCount--;
		this.prepare();
	}
}
function lm_minLevel() {
	var min=9999;
	var l;
	for ( var i = 0; i < this.topicService.length; i++) {
		l = this.topicService[i].curLevel();
		if(min>l) {
			min = l;
		}
	}
	return min;
}

function initLearnManager(lm) {
	var ltl = getLearnLevel();
	var filter = lm.filter;
	var glsa = filter.gls.split("_");
	var sl = glsa[1];
	var st = glsa[2];
	var topicService = new Array();
	var lmtopic,t;
	for ( var i = 0; i < st.length; i++) {
		t=st.charAt(i);
		lmtopic = new LMTopic(t,lm,sl,ltl[t]);
		if(lmtopic.levelService != null) {
			topicService[topicService.length] = lmtopic;
		}
	}
	lm.topicServiceAll=topicService;
}

// End Learn Manager

//Start Learn Manager Topic 
function LMTopic(topic,lm,sl,ltll) {
	this.topic = topic;
	this.lm = lm;
	this.levelService = null;
	this.pos = 0;
	this.firstLevel = -1;
	this.upPer = MOVE_UP_MIN_PER;
	this.getQA = lmt_getQA;
	this.prepare = lmt_prepareQA;
	this.skip = lmt_skipQA;
	this.curTL = lmt_curTL;
	this.curLevel = lmt_curLevel;
	initLMTopic(this,sl,ltll);
}

function lmt_getQA() {
	return this.levelService[this.pos].getQA();
}

function lmt_skipQA() {
	if(this.pos<(this.levelService.length-1)) {
		this.pos++;
	} else {
		this.pos = 0;
	}
	this.levelService[this.pos].prepare();
}

function lmt_prepareQA() {
	var ls = this.levelService[this.pos];
	var len=ls.moveLen();
	if(len<0 && this.pos>0) {
		if(this.pos>0) {
			this.pos--;
			setLearnLevel(this.topic,this.levelService[this.pos].level);
		}
	} else if(len>0) {
		if(this.pos<(this.levelService.length-1)) {
			this.pos++;
			var l = this.levelService[this.pos].level;
			if(this.lm.maxCurLevel < l) {
				this.lm.maxCurLevel++;
			}
			setLearnLevel(this.topic,this.levelService[this.pos].level);
		} else {
			this.pos = 0;
			this.upPer = this.upPer + 10;
			if (this.upPer > MOVE_UP_MAX_PER) {
				this.upPer = MOVE_UP_MAX_PER;
			}
			return true;
		}
	}
	this.levelService[this.pos].prepare();
	return false;
}
function lmt_curTL() {
	return this.topic+this.levelService[this.pos].level;
}
function lmt_curLevel() {
	return this.levelService[this.pos].level;
}

function initLMTopic(lmTopic,sl,ltll) {
	var t = lmTopic.topic;
	var filter = lmTopic.lm.filter;
	var levels = new Array();
	var l;
	for ( var i = 0; i < sl.length; i++) {
		l = sl.charAt(i);
		if(filter.validLevelTopic(l,t)) {
			levels[levels.length] = l;
		}
	}
	if(levels.length==0) {
		return;
	}
	var firstLevel = levels[0];
	lmTopic.firstLevel = firstLevel;
	var levelService = new Array();
	for ( i = 0; i < levels.length; i++) {
		if(levels[i] == ltll) {
			lmTopic.pos = i;
		}
		levelService[i] = new LMLevel(levels[i], lmTopic);
	}
	levelService[levelService.length-1].testCount = INIT_LAST_MIN_QA_COUNT;
	lmTopic.levelService = levelService;
}
//End Learn Manager Topic

//Start Learn Manager Level
function LMLevel(level,lmTopic) {
	this.level = level;
	this.lmTopic = lmTopic;
	var lm = lmTopic.lm;
	var filter = lm.filter;
	this.gdText = filter.gdText;
	this.g = filter.grade();
	this.glt = this.g+level+this.lmTopic.topic;
	this.rightCtr = 0;
	this.seenCtr = 0;
	this.testCount=INIT_MIN_QA_COUNT;
	this.pos = 0;
	this.qas = new Array();
	this.getQA = lml_getQA;
	this.prepare = lml_prepareQA;
	this.load = lml_loadQA;
	this.right = lml_right;
	this.seen = lml_seen;
	this.moveLen = lml_moveLen;
}

function lml_getQA() {
	return this.qas[this.pos++];
}
function lml_prepareQA() {
	try {
		this.load();
	} catch(e) {
		try {
			lmReq = createAJAX();
			this.load();
		} catch(e) {
			sendError("LMLevel Try 2 prepare:"+"/"+e);
			this.lmTopic.skip();
		}
	}
}

function lml_loadQA() {
	var loadCtr = this.testCount-this.qas.length; 
	if(loadCtr>0 || this.pos==this.qas.length-1) {
		lmReq.open("POST", "/c?g="+this.glt+this.qas.length, false);
		lmReq.send(null);
		var text = lmReq.responseText;
		try {
			var values = text.split("\r");
			var qstn = new Qstn(values,0,this.gdText,this.g);
			this.qas[this.qas.length] = new QA(qstn,this);
			qstn = new Qstn(values,4,this.gdText,this.g);
			this.qas[this.qas.length] = new QA(qstn,this);
		} catch(e) {
			throw "LearnManager LevelTopic  lml_loadQA:"+this.glt+"/"+text+"/"+e;
		}
	}
}

function lml_right() {
	this.rightCtr++;
}
function lml_seen() {
	this.seenCtr++;
}
function lml_moveLen() {
	if(this.seenCtr>=this.testCount){
		this.testCount=this.pos+1;
		var pc = Math.round((this.rightCtr/this.seenCtr)*100);
		if(pc>this.lmTopic.upPer) {
			return 1;
		} else if(pc<MOVE_BACK_PER){
			return -1;
		}
	}
	return 0;
}
//End Learn Manager Level

function getLearnLevel() {
	var la = new Array();
	var lc = getLevelCookie();
	var ca = lc.split('_');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		if(c.length>0){
			la[c.charAt(0)] = c.charAt(1);
		}
	}
	return la;
}

function setInitLearnLevel(topicService) {
	var lc = "_";
	for(var i=0;i < topicService.length;i++) {
		lc += topicService[i].curTL()+"_";
	}
	setLevelCookie(lc)
}

function setLearnLevel(topic,level) {
	var lc = getLevelCookie();
	var i = lc.indexOf("_"+topic);
	var clc ="";
	if(i>=0) {
		clc=lc.substring(0,i+2)+level+lc.substring(i+3);
	} else {
		clc=lc+topic+level+"_"; 
	}
	setLevelCookie(clc)
}
