 var ge, fie, tme,lpwe;
var testOpt;

function TestOption(){
	this.ctr = 0;
	this.opt = "";
	this.gdText = null;
	this.gctlist = null;
	this.filter = null;
	this.time = tp_Time;
	this.topic = tp_topicDesc;
	this.learnQAId = "";
}

function tp_Time() {
	var ao = this.opt.split("_");
	var val = ao[1];
	var e = val.substring(ao[1].length-1);
	var t = new Number(val.substring(0,ao[1].length-1));
	if(e=='m') {
		t = t * 60;
	}
	t = new Number(ao[0]) * t;
	t = Math.round(t);
	return t;
}

function tp_topicDesc(t) {
	return this.gdText[7][t];
}

function init() {
	initUserInfo();
	InitTest();
	userChange();
}

function userChange(){
	inWait();
	var gc = getGC();
	var g = gc.charAt(0);
	InitGradeInfo(g);
	testOpt.gdText = getGradeText(g);
	InitLevelTopicOption(testOpt.gdText, gc);
	InitOption(testOpt,g);
	outWait();
}

function InitTest(){
	testOpt = new TestOption();
	testOpt.filter = InitFilterOption();
	ge = document.getElementById("g");
	tme = document.getElementById("tm");
	lpwe = document.getElementById("lpw");
	InitSTPage();
}



function cg(g) {
	testOpt.gdText = getGradeText(g);
	InitLevelTopicOption(testOpt.gdText, g);
	InitOption(testOpt,g);
}

function ChangeFilter(){InitCount();}

function OnLineTest() {
	inWait();
	if(StartQSTN(testOpt)) {
		tme.className="dh";
		lpwe.className="dw";
		StartTest(testOpt);
		lpwe.className="dh";
	}
	outWait();
}

function OnLineST() {
	inWait();
	tme.className="dh";
	lpwe.className="dw";
	StartST(testOpt.filter);
	lpwe.className="dh";
	outWait();
}

function PrintTest() {
	inWait();
	if(StartQSTN(testOpt)) {
		PrintWrite(testOpt);
	}
	outWait();
}

function PrintPDF() {
	inWait();
	PrintPDFWrite(testOpt);
	outWait();
}

function ShowMain() {tme.className="dw";}
function closeTSQ(){document.getElementById("sqd").style.display="none";}

function learnTSQ() {
	setFQCookie(testOpt.learnQAId);
	window.open ("/l", "LearnTestPrint","status=1,toolbar=yes,scrollbars=1,resizable=yes,scrollbars=yes,menubar=yes")
}

function selTBOver(obj) {
	inSel();
	obj.className="dbtg";
}
function selTBOut(obj) {
	outSel();
	obj.className="dbt";
} 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 too=null,oce,oqe,ote,oae,ore,ome,owe;
var ROWSTR = "12345";

function InitOption(to, g) {
	too = to;
	InitOF();
	InitValue();
	InitCount();
}

function InitOF(){
	oce = document.getElementById("oc");
	oqe = document.getElementById("oq");
	ote = document.getElementById("ot");
	oae = document.getElementById("oa");
	ore = document.getElementById("or");
	ome = document.getElementById("om");
	owe = document.getElementById("ow");
}

function InitCount() {
	if(too.filter.allctr>60){
		too.ctr = 60;
	} else {
		too.ctr = too.filter.allctr;
	}
	InitCountDiv(too.ctr);
}

function InitCountDiv(nc) {
	var dval = "<table class=o cellspacing=4 cellpadding=4><tr>";
	if(nc>5){dval += countTd(5);}
	if(nc>10){dval += countTd(10);}
	if(nc>15){dval += countTd(15);}
	if(nc>20){dval += countTd(20);}
	if(nc>25){dval += countTd(25);}
	if(nc>50){dval += countTd(50);}
	dval += "<td onMouseover=\"this.style.backgroundColor='#FAFAD2';\" " +
	"onMouseout=\"this.style.backgroundColor='silver';\" " +
	" onMouseDown=\"setNoQ("+nc+")\">" +nc+" Max</td>";
	dval += "</tr></table>"
	oce.innerHTML = dval;
}
function countTd(val) {
	return "<td onMouseover=\"this.style.backgroundColor='#FAFAD2';\" " +
			"onMouseout=\"this.style.backgroundColor='silver';\" " +
			" onMouseDown=\"setNoQ("+val+")\">" +val+"</td>"; 
}

function setOpt(value) {
	setOptCookie(value);
	too.opt = value;
}

function updateOpt() {
	var val = oqe.value+"_"+ote.value;
	if(oae.selectedIndex==0)
		val += "s";
	else
		val += "m";
	val += "_"+ore.value;
	setOpt(val);
}

function InitValue() {
	var val = getOpt();
	if(val == "") {
		val = "10_1m_1";
		setOpt(val);
	} else {
		too.opt = val;
	}
	var as = val.split("_");
	oqe.value = as[0];
	updatePerQATime(as[1]);
	ore.value = as[2];
}

function setNoQ(val) {
	oqe.value = val;
	updateOpt();
}

function setTime(val) {
	updatePerQATime(val);
	updateOpt();
}

function updatePerQATime(val) {
	ote.value = val.substring(0, val.length-1);
	var e = val.substring(val.length-1);
	if(e=='s')
		oae.selectedIndex = 0;
	else
		oae.selectedIndex = 1;
}

function seRowC(val) {
	ore.value = val; 
	updateOpt();
}

function showNQ() {
	oce.className="dp";
}

function hideNQ(){
	if(oqe.value < 5) {
		oqe.value = 5;
	} else if(oqe.value>too.ctr) {
		oqe.value = too.ctr;
	}
	updateOpt();
	setTimeout("oce.className=\"dh\";",110);
}

function showT() {
	ome.className="dp";
}

function hideT(){
	if(ote.value == 0) {
		updatePerQATime('1m');
	} 
	updateOpt();
	setTimeout("ome.className=\"dh\";",110);
}

function showW() {
	owe.className="dp";
}

function hideW(){
	updateOpt();
	setTimeout("owe.className=\"dh\";",110);
}



function isValidKey(field,e,str) {
	var keycode;
	if (window.event)
		keycode = window.event.keyCode;
	else if (e)
		keycode = e.keyCode;
	else
		return true;
	if (isValidSpecial(keycode)	|| str.indexOf(String.fromCharCode(keycode))>=0) {
		return true;
	} else {
		return false;
	}
}

function onKeyInt(field,e) {
	return isValidKey(field, e, INTSTR);
}

function onKeyRow(field,e) {
	return isValidKey(field,e,ROWSTR);
}var toq,qalist,ltqalist,curgct,pq=0,pqa,pg,readAll;
var xhReq;


function StartQSTN(to) {
	toq = to;
	pq = 0;
	pg = 0;
	pqa = 0;
	readAll=false;
	qalist = new Array();
	ltqalist = new Array();
	toq.gctlist = new Array();
	creategct();
	if(toq.gctlist.length>0){
		xhReq = createAJAX();
		ReadQst();
		return true;
	}
	return false;
}


function hasMore() {
	if(readAll && pq == qalist.length) {
		return false;
	}
	return true;
}

function nextqa() {
	var ret = qalist[pq];
	if(ret != null) {
		pq++;
	}
	return ret;
}

function qalt() {
	return ltqalist[pq];
}
function creategct() {
	if(toq.filter.allctr ==0){
		alert("Select Valid Level and Topic.")
		return;
	}
	var len = new Number(toq.opt.split("_")[0]);
	if(len <=0){
		alert("Select Valid No of Question.")
		return;
	}
	var nPos =0;
	var glsa = toq.filter.gls.split("_");
	var g = glsa[0];
	var sl = glsa[1];
	var st = glsa[2];
	var per = len/toq.filter.allctr;
	var qctr =0;
	var qct,lt;
	var vallt = toq.filter.vallt;
	var iSkip = 1;
	var i = 0;
	if(vallt.length>len){
		iSkip = Math.floor(vallt.length/len);
		i = randomPos(iSkip);
	}
	while (i < vallt.length) {
		lt = vallt[i];
		if(qctr<len) {
			qct = Math.ceil(toq.filter.countlt(lt) * per);
			toq.gctlist[nPos++] = g + lt + qct;
			qctr += qct;
		}
		i+= iSkip;
	}
	if(len != qctr) {
		nPos--;
		var gctstr = toq.gctlist[nPos].substring(0,3);
		toq.gctlist[nPos] = gctstr + (qct + len - qctr);
	}
}

function ReadQst() {
	curgct = toq.gctlist[pg++];
	var url = "/p?g="+curgct;
	xhReq.open("POST", url, true);
	xhReq.onreadystatechange = ParseQst;
	xhReq.send(null);
}

function ParseQst() {
	if (xhReq.readyState == 4) {
		readQA(xhReq.responseText);
		if (pg < toq.gctlist.length) {
			ReadQst();
		} else {
			readAll = true;
		}
	}
}

function readQA(text){
	try {
		values = text.split("\r");
		for ( var i = 3; i < values.length; i=i+4) {
			qalist[pqa] = new Qstn(values, i-3, toq.gdText,toq.filter.grade());
			ltqalist[pqa] = curgct.substring(1, 3);
			pqa++;
		}
	}catch(e) {
		sendError("readQA:"+text+"/"+e);
	}
}

var ttt;
var tp=0,tcp=0;
var qp = null,qc,qn,op,oc,on,inxe,ibe,ltte,gdte,mbacke,mnexte;
var firstq=true, lastq=false;

function TestTest(to) {
	
	this.to = to;
	to.ctrta = new Array();
	this.sp = 0;
	this.timeid=0;
	this.endtime=0; 
	
	this.tte = document.getElementById("tt");
	this.tqse = document.getElementById("tqs");
	this.scse = document.getElementById("scs");
	this.stse = document.getElementById("sts");
	this.tthe = document.getElementById("tth");
	this.ttme = document.getElementById("ttm");
	this.ttse = document.getElementById("tts");
	this.dtce = document.getElementById("dtc");
	this.m2e = document.getElementById("m2");
	this.qhlpe = document.getElementById("qhlp");
	this.qhlpde = document.getElementById("qhlpd");
	
	this.refreshTime = tt_refreshTime;
	this.startClock = tt_startClock;
	this.close = tt_Close;
}

function tt_refreshTime() {
	var time = this.endtime - Math.round(new Date().getTime()/1000);
	if(time<0) {
		SubmitTest();
		return;
	}
	this.ttse.innerHTML = time%60;
	time = Math.floor(time/60);
	if(time == 0) {
		this.dtce.className = "dtw";
		this.ttme.innerHTML = '0';
	} else {
		this.ttme.innerHTML = time%60;
		time = Math.floor(time/60);
		this.tthe.innerHTML = time;
	}
	this.timeid = setTimeout("ttt.refreshTime()",1000);
}

function tt_startClock() {
	this.dtce.className = "dh";
	this.endtime =   Math.round(new Date().getTime()/1000)+this.to.time();
	this.refreshTime();
}

function tt_Close() {
	clearTimeout(this.timeid);
	this.tte.className="dh";
}

function InitTestFields(to) {
	ttt = new TestTest(to);
	tp=0;
	tcp=0;
	if(qp == null) {
		qp = document.getElementById("qx");
		qc = document.getElementById("qy");
		qn = document.getElementById("qz");
		op = document.getElementById("qu");
		oc = document.getElementById("qv");
		on = document.getElementById("qw");
		inxe = document.getElementById("inx");
		ibe = document.getElementById("ib");
		ltte = document.getElementById("ltt");
		gdte = document.getElementById("gdt");
		mbacke = document.getElementById("mback");
		mnexte = document.getElementById("mnext");
	}
	gdte.innerHTML = gde.innerHTML;
}

function StartTest(to) {
	InitTestFields(to);
	getTestQA();
}

function SubmitTest() {
	ttt.close();
	StartTS(ttt.to,ttt.endtime);
}

function QuitTest(){
	ttt.close();	
	ShowMain();	
}

function getTestQA() {
	var lt = qalt();
	var q = nextqa();
	if(q == null){
		if(hasMore()) {
			setTimeout("getTestQA()",100);
		} else {
			tp--;
			InitQAT();
		}
		return;
	}
	ttt.to.ctrta[tp] = new QAT(q,tp,lt);
	tp++;
	getTestQA();
}

function curQAT() {
	return ttt.to.ctrta[tcp];
}

function InitQAT() {
	ttt.tte.className="dw";	
	setQAHtml(qc,oc,curQAT());
	setQAHtml(qn,on,ttt.to.ctrta[tcp+1]);
	var str = ""+(tp+1);
	ttt.stse.innerHTML = str;
	setSCQARevOpt();
	setSCQA();
	ttt.startClock();
}

function setQAHtml(q,o,qa) {
	q.innerHTML = qa.q.question;
	o.innerHTML = qa.html();
}

function refreshSCInd() {
	var cq = curQAT();
	if(cq.selopt == -1) {
		document.getElementById("ind"+tcp).className='ae';
	} else {
		document.getElementById("ind"+tcp).className='aev';
	}
}

function setSCQA() {
	document.getElementById("ind"+tcp).className='aen';
	RefreshBN();
	ltte.innerHTML = curQAT().lttext();
}

function QAT(qstn,p,lt) {
	this.q = qstn;
	this.p = p;
	this.lt = lt;
	this.selopt = -1;
	this.isRight = q_isRight;
	this.isOmit = q_isOmit;
	this.html = q_html;
	this.review = q_review;
	this.lttext = q_TopicLevelText;
}

function q_html() {
	var sb = "Options";
	sb += "<table width=100% cellspacing='2px' cellpadding='2px' class=tn ><tr>";
	for ( var i = 0; i < this.q.options.length; i++) {
		sb += "<td width='50%'><div onclick=selAns("+i+") ";
		if(i != this.selopt){
			sb += "onMouseover='selMO(this)' ";
			sb += "onMouseout='selMT(this)' class='qb'";
		} else {
			sb += "onMouseover='selMOR(this)' ";
			sb += "onMouseout='selMTR(this)' class='qbv'";
		}
		sb += ">";
		sb+= this.q.options[i];
		if(i==1){
			sb += "</tr><tr>"
		}
	}
	sb += "</tr></table>";
	return sb;
}

function q_isRight() {
	return (this.selopt == this.q.ansopt);
}

function q_isOmit() {
	return this.selopt==-1;
}

function q_review() {
	var sb = this.q.question;
	if(this.isRight()){
		sb += TEXT_RIGHT + " " + IMAGE_RIGHT;
	} else if(!this.isOmit()) {
		sb += TEXT_WRONG + " " + IMAGE_WRONG;
	} else {
		sb += TEXT_OMITED;
	}
	sb += "<table width=100% cellspacing='2px' cellpadding='2px' class=tn><tr>";
	for ( var i = 0; i < this.q.options.length; i++) {
		sb += "<td width='50%'><div class=";
		if(i == this.selopt && i == this.q.ansopt){
			sb += "qba";
		} else if(i == this.selopt) {
			sb += "qbw";
		} else if(i == this.q.ansopt) {
			sb += "qbr";
		} else {
			sb += "qb";
		}
		sb += ">";
		sb+= this.q.options[i];
		sb += "</div><td>";
		if(i==1){
			sb += "</tr><tr>"
		}
	}
	sb += "</tr></table>";
	return sb;
}

function q_TopicLevelText() {
	return tof.tptxt[this.lt.substring(1, 2)]+" / "+ TEXT_LEVEL + this.lt.substring(0, 1);
}
function selAns(i) {
	var cq = curQAT();
	if(cq.selopt == -1) {
		ttt.sp++;
		ttt.scse.innerHTML = ttt.sp;
	}
	cq.selopt = i;
	nextq();
}

function selMO(obj){inSel();obj.className="qbh";}
function selMT(obj){outSel();obj.className="qb";}
function selMOR(obj){inSel();obj.className="qbvh";}
function selMTR(obj){outSel();obj.className="qbv";}
function hasNext(){return tcp != tp;}
function hideqo(){qc.className="dh";oc.className="dh";}
function showqo(){qc.className="dw";oc.className="dw";}

function nextq() {
	if(hasNext()) {
		refreshSCInd();
		tcp++;
		setSCQA();
		var tq = qp;
		var to = op;
		qp = qc;
		op = oc;
		hideqo();
		qc = qn;
		oc = on;
		showqo();
		qn = tq;
		on = to;
		if(tcp < tp) {
			setQAHtml(tq,to,ttt.to.ctrta[tcp+1]);
		}
		oc.innerHTML = curQAT().html();
	} else {
		oc.innerHTML = curQAT().html();
		ttt.m2e.style.display="";
		setTimeout("ttt.m2e.style.display='none'",1000);
	}
}

function backq() {
	if(tcp>0) {
		refreshSCInd();
		tcp--;
		setSCQA();
		var tq = qn;
		var to = on;
		qn = qc;
		on = oc;
		hideqo();
		qc = qp;
		oc = op;
		showqo();
		qp = tq;
		op = to;
		if(tcp > 0) {
			setQAHtml(tq,to,ttt.to.ctrta[tcp-1]);
		}
		oc.innerHTML = curQAT().html();
	} 
}

function gotoq(i) {
	refreshSCInd();
	tcp = i;
	setSCQA();
	setQAHtml(qc, oc, ttt.to.ctrta[tcp]);
	if (tcp < tp) {
		setQAHtml(qn, on, ttt.to.ctrta[tcp + 1]);
	}
	if (tcp > 0) {
		setQAHtml(qp, op, ttt.to.ctrta[tcp - 1]);
	}
}

function setSCQARevOpt() {
	var sb = "";
	var obj = ttt.to.ctrta;
	var j;
	for ( var i = 0; i < obj.length; i++) {
		j = i+1;
		sb += "<a id=ind"+i+" href=# class=ae onClick='gotoq("+i+");return false;' " +
				" onmouseover=\"inHelp("+j+",'"+obj[i].q.shortq()+"')\" " +
				" onmouseout=outHelp() >"+j+"</a> ";
	}
	ttt.tqse.innerHTML = sb;
}

var TEXT_TBACK = "<a href=# onClick=backq() title='Previous Question'><img src='" + IMG_BACK + "'></a>";
var TEXT_TNBACK = "<img src='" + IMG_NBACK + "'>";
var TEXT_TNEXT = "<a href=# onClick=nextq() title='Next Question'><img src='" + IMG_NEXT + "'></a>";
var TEXT_TNNEXT = "<img src='" + IMG_NNEXT + "'>";

var TEXT_MBACK = "<a href=# onClick=\"gotoq(0)\" title='First Question'><img src='"+IMG_SFIRST+"'></a>&nbsp;<a href=# onClick=backq() title='Previous Question'><img src='"+IMG_SBACK+"'></a>";
var TEXT_MNBACK = "<img src='"+IMG_SNFIRST+"'>&nbsp;<img src='"+IMG_SNBACK+"'>";
var TEXT_MNEXT = "<a href=# onClick=\"nextq()\" title='Next Question'><img src='"+IMG_SNEXT+"'></a>&nbsp;<a href=# onClick=lastques() title='Last Question'><img src='"+IMG_SLAST+"'></a>";
var TEXT_MNNEXT = "<img src='"+IMG_SNNEXT+"'>&nbsp;<img src='"+IMG_SNLAST+"'>";

function RefreshBN() {
	if(tcp==0) {
		if(!firstq) {
			ibe.innerHTML = TEXT_TNBACK;
			mbacke.innerHTML = TEXT_MNBACK;
			firstq = true;
		}
	} else if(firstq){
		ibe.innerHTML = TEXT_TBACK;
		mbacke.innerHTML = TEXT_MBACK;
		firstq = false;
	}
	
	if(tcp == tp) {
		if(!lastq) {
			inxe.innerHTML = TEXT_TNNEXT;
			mnexte.innerHTML = TEXT_MNNEXT;
			lastq = true;
		}
	} else if(lastq) {
		inxe.innerHTML = TEXT_TNEXT;
		mnexte.innerHTML = TEXT_MNEXT;
		lastq = false;
	}
}

function lastques(){
	gotoq(tp);
}

function inHelp(i,q){
	ttt.qhlpde.innerHTML = numImgage(i)+" : "+q;
	ttt.qhlpe.style.display="";
}
function outHelp(){
	ttt.qhlpe.style.display="none";
}
var tos;

function CloseTest() {
	ShowMain();
	CloseStatus();
}

function StartTS(to,endTime) {
	tos = new TestStatus(to, endTime);
	tos.init();
}

function CloseStatus() {
	tos.close();
	tos = null;
}

function TSP(count,rc,html) {
	this.count = count;
	this.noRight = rc;
	this.html = html;
}

function TestStatus(to, endTime) {
	this.to = to;
	this.endTime = endTime;	
	this.tse = document.getElementById("ts");
	this.sqde = document.getElementById("sqd");
	this.sqdqe = document.getElementById("sqdq");
	
	this.lta = new Array();
	
	this.init = ts_Init;
	this.initQA = ts_InitQA;
	this.close = ts_Close;
	this.getQAT = ts_getQAT;
	this.isRight = ts_isRight;
	this.isOmit = ts_isOmit;
	this.sortQ = ts_sortQ;
	this.level = ts_levelHtml;
	this.topic = ts_topicHtml;
}

function ts_getQAT(p) {
	return this.to.ctrta[p];
}

function ts_isRight(p) {
	return this.to.ctrta[p].isRight();
}

function ts_isOmit(p) {
	return this.to.ctrta[p].isOmit();
}

function ts_sortQ(p) {
	return this.to.ctrta[p].q.shortq();
}

function ts_Init() {
	this.tse.className = "dw";
	document.getElementById("sg").innerHTML = gradeText[gig];
	document.getElementById("st").innerHTML = getTimeString(this.to.time()/60);
	var t = (this.endTime - Math.round(new Date().getTime()/1000)) / 60;
	var te = document.getElementById("sl");
	if(t>0) {
		te.innerHTML = getTimeString(t);
	} else {
		te.innerHTML = "Time Over";
	}
	this.initQA();
}

function ts_InitQA() {
	var pos = 0, trc = 0, twc = 0, rc, sb, nend;
	for ( var i = 0; i < this.to.gctlist.length; i++) {
		var gctl = this.to.gctlist[i];
		var lt = gctl.substring(1, 3);
		var c = new Number(gctl.substring(3));
		rc = 0;
		sb = "";
		nend = pos + c;
		for ( var j = pos; j < nend; j++) {
			sb += "<div class=gdn onclick=selTSQuestion("+j+") " +
					"onMouseover='selMMOver(this)' onMouseout='selMMOut(this)'>";
			sb += this.sortQ(j);
			if (this.isRight(j)) {
				sb += IMAGE_RIGHT;
				rc++;
			} else if (!this.isOmit(j)) {
				sb += IMAGE_WRONG;
				twc++;
			}
			sb += "</div>";
		}
		this.lta[lt] = new TSP(c,rc,sb);
		pos += c;
		trc += rc;
	}
	document.getElementById("sq").innerHTML = pos;
	document.getElementById("sr").innerHTML = trc;
	document.getElementById("sw").innerHTML = twc;
	document.getElementById("sna").innerHTML = ""+(pos-trc-twc);
	var per = Math.round(trc/pos*100);
	document.getElementById("sc").innerHTML = ""+per+"%";
	initCloseOpenAll(per);
	
	var glsa = this.to.filter.gls.split("_");
	document.getElementById("lre").innerHTML = this.level(glsa[1],glsa[2]);
	document.getElementById("tre").innerHTML = this.topic(glsa[1],glsa[2]);
	
}

function ts_levelHtml(sl,st) {
	var sb = "<table cellspacing=1 cellpadding=1 width='100%'>";
	var l,t,lc,lr,sbt,tsp,lt;
	for ( var i = 0; i < sl.length; i++) {
		l = sl.charAt(i);
		lc = 0;
		lr = 0;
		sbt = "";
		for ( var j = 0; j < st.length; j++) {
			t = st.charAt(j);
			tsp = this.lta[l+t];
			if(tsp != null) {
				lc += tsp.count;
				lr += tsp.noRight;
				lt = l+t;
				sbt += "<tr><td><div class=gdm1>";
				sbt += "<a href=# onClick=stShowHide1('slst"+lt+"')><img id=islst"+lt+" src='"+IMG_PUP+"'></a>"; 
				sbt += this.to.topic(t);
				sbt += " : " + tsp.noRight + " of " + tsp.count + "</div>";
				sbt += "<div id=slst"+lt+" class=dh><table cellspacing=1 cellpadding=1 width='100%'>";
				sbt += "<tr><td width='5%'> </td><td>";
				sbt += tsp.html;
				sbt += "</td></tr></table></div></td></tr>";
			}
		}
		if(lc >0) {
			sb += "<tr><td><div class=gdm>";
			sb += "<a href=# onClick=stShowHide('sls"+l+"')><img id=isls"+l+" src='"+IMG_PUP+"'></a> Level " ;
			sb += l + " : " + lr + " of " + lc + "</div>";
			sb += "<div id=sls"+l+" class=dh><table cellspacing=1 cellpadding=1 width='100%'>";
			sb += "<tr><td width='5%'> </td><td>";
			sb += "<table cellspacing=1 cellpadding=1 width='100%'>";
			sb += sbt;
			sb += "</table>";
			sb += "</td></tr></table></div></td></tr>";
		}
	}
	sb += "</table>";
	return sb;
}

function ts_topicHtml(sl,st) {
	var sb = "<table cellspacing=1 cellpadding=1 width='100%'>";
	var l,t,lc,lr,sbt,tsp,lt;
	for ( var i = 0; i < st.length; i++) {
		t = st.charAt(i);
		lc = 0;
		lr = 0;
		sbt = "";
		for ( var j = 0; j < sl.length; j++) {
			l = sl.charAt(j);
			tsp = this.lta[l+t];
			if(tsp != null) {
				lc += tsp.count;
				lr += tsp.noRight;
				lt = l+t;
				sbt += "<tr><td><div class=gdm>";
				sbt += "<a href=# onClick=stShowHide('stst"+lt+"')><img id=istst"+lt+" src='"+IMG_PUP+"'></a>Level " + l;
				sbt += " : " + tsp.noRight + " of " + tsp.count + "</div>";
				sbt += "<div id=stst"+lt+" class=dh><table cellspacing=1 cellpadding=1 width='100%'>";
				sbt += "<tr><td width='5%'> </td><td>";
				sbt += tsp.html;
				sbt += "</td></tr></table></div></td></tr>";
			}
		}
		if(lc >0) {
			sb += "<tr><td><div class=gdm1>";
			sb += "<a href=# onClick=stShowHide1('sts"+t+"')><img id=ists"+t+" src='"+IMG_PUP+"'></a>"+ this.to.topic(t) ;
			sb += " : " + lr + " of " + lc + "</div>";
			sb += "<div id=sts"+t+" class=dh><table cellspacing=1 cellpadding=1 width='100%'>";
			sb += "<tr><td width='5%'> </td><td>";
			sb += "<table cellspacing=1 cellpadding=1 width='100%'>";
			sb += sbt;
			sb += "</table>";
			sb += "</td></tr></table></div></td></tr>";
		}
	}
	sb += "</table>";
	return sb;
}

function ts_Close() {
	this.tse.className="dh";
}

function stShowHide(id) {stShowHd(id,"ds");}
function stShowHide1(id){stShowHd(id,"ds1");}

function stShowHd(id,sc) {
	var e = document.getElementById(id);
	var ei = document.getElementById("i"+id);
	if(e.className == "dh") {
		e.className = sc;
		ei.src = IMG_PDOWN;
	} else {
		e.className = "dh";
		ei.src = IMG_PUP;
	}
}

function selTSQuestion(pos) {
	var qa = tos.to.ctrta[pos];
	tos.to.learnQAId = qa.q.id;
	tos.sqdqe.innerHTML = qa.review();
	tos.sqde.style.display="";
}


// Quick Test, Smart Test Review
var me, re, mqe, mo0e, mo1e, mo2e, mo3e,rse,rde,sqdqe,sqde,rsme,suge;
var stm, stt, sts, stmx, mscqe, mtthe, mttme, mttse,rtimee,rnqte,ltqe,gdqe;
var smQCount=0, smQTime=0, smTimeId;
 
function InitSTPage(){
	me = document.getElementById("m");
	re = document.getElementById("r");
	mqe = document.getElementById("mq");
	mo0e = document.getElementById("mo0");
	mo1e = document.getElementById("mo1");
	mo2e = document.getElementById("mo2");
	mo3e = document.getElementById("mo3");
	rse = document.getElementById("rs");
	rde = document.getElementById("rd");
	sqdqe = document.getElementById("sqdq");
	sqde = document.getElementById("sqd");
	rsme = document.getElementById("rsm");
	suge = document.getElementById("sug");
	mscqe = document.getElementById("scqm");
	mtthe = document.getElementById("tthm");
	mttme = document.getElementById("ttmm");
	mttse = document.getElementById("ttsm");
	rtimee = document.getElementById("rtime");
	rnqte = document.getElementById("rnqt");
	ltqe = document.getElementById("ltq");
	gdqe = document.getElementById("gdq");
	initTestQuickManagerPage();
}

function StartST(filter){
	me.className="dw";
	stm = new STManager(filter);
	smQCount=1
	smQTime=Math.round(new Date().getTime()/1000);
	smRefreshTime();
	gdqe.innerHTML = gde.innerHTML;
	mscqe.innerHTML = smQCount;
}

function QuitST(){
	me.className="dh";
	stm=null;
	ShowMain();
}

function SubmitST(){
	me.className="dh";
	re.className="dw";
	clearTimeout(smTimeId);
	stm.report();
}

function CloseSTR(){
	re.className="dh";
	stm=null;
	ShowMain();
}

function selTMAns(i) {
	stm.sel(i);
	smQCount++;
	mscqe.innerHTML = smQCount;
}

function smRefreshTime() {
	var time = Math.round(new Date().getTime() / 1000) - smQTime;
	mttse.innerHTML = time % 60;
	time = Math.floor(time / 60);
	mttme.innerHTML = time % 60;
	time = Math.floor(time / 60);
	mtthe.innerHTML = time;
	smTimeId = setTimeout("smRefreshTime()", 1000);
}

function TMReview(i) {
	var qa = stm.qas[i];
	testOpt.learnQAId = qa.qstn.id;
	sqdqe.innerHTML = qa.report();
	sqde.style.display="";
}

function ShowSTScore() {
	if(sts<stt){
		rse.innerHTML = sts;
		rsme.innerHTML = ScoreMeter(sts);
		sts = sts + 5;
		setTimeout("ShowSTScore()",10);
	} else {
		rse.innerHTML = stt;
		rsme.innerHTML = ScoreMeter(stt);
	}
}

function ScoreMeter(s) {
	var a = (s/stmx)*100;
	var b = 100 - a;
	var sb = "<table class=y1 width=100% ><tr><td class=y1r width="+a+"%>"+
		s+"</td><td class=y1w width="+b+"%>"+(stmx-s)+"</td></tr></table>";
	return sb;
}

function getEndTimeStr() {
	var sb = "";
	var time = Math.round(new Date().getTime() / 1000) - smQTime;
	time = Math.floor(time / 60);
	if(time >1) {
		var tp = time % 60;
		sb = tp +" Minutes";
		time = Math.floor(time / 60);
		tp = time % 60;	
		if(tp>0) {
			sb += tp +" Hours " + sb;
		}
	} else {
		sb = "1 Minute";
	}
	return sb;
}
function SetSuggestions() {
	var sug = stm.tqm.sugg;
	var sb = "_";
	for ( var i = 0; i < sug.length; i++) {
		sb += sug[i].t+sug[i].l+"_";
	}
	setLevelCookie(sb);
	if(confirm(Learn_MESSAGE)) {
		GoToLearn(); 
	}
}

// Start Smart Test Manager
function STManager(filter) {
	this.filter = filter;
	this.tqm = new TestQuickManager(filter);
	this.qas = new Array();
	this.qa = null;
	this.report = st_report;
	this.nextq = st_nextq;
	this.sel = st_sel;
	this.nextq();
}

function st_nextq(){
	this.qa = this.tqm.getQA();
	if (this.qa != null) {
		this.qas[this.qa.tl()] = this.qa;
		var q = this.qa.qstn;
		mqe.innerHTML = q.question;
		mo0e.innerHTML = q.options[0];
		mo1e.innerHTML = q.options[1];
		mo2e.innerHTML = q.options[2];
		mo3e.innerHTML = q.options[3];
		ltqe.innerHTML = this.qa.tlText();
	} else {
		SubmitST();
	}
}

function st_sel(i){
	this.qa.sel(i);
	this.nextq();
}

function st_report(){
	var rt = this.tqm.reportCount();
	stt=rt[0];
	stmx = rt[1];
	sts =0;
	ShowSTScore();
	rde.innerHTML = this.tqm.report();
	rnqte.innerHTML = smQCount;
	rtimee.innerHTML = getEndTimeStr();
	suge.innerHTML = this.tqm.reportSuggestion();
}

//End Smart Test Manager
var noinrow,pw=0,doc,ansStr;
var OPTTYPE="ABCD";

function PrintWrite(to) {
	pw=0;
	ansStr ="";
	var ao = to.opt.split("_");
	noinrow = new Number(ao[2]);
	my_window= window.open ("", "TestPrint","status=1,toolbar=yes,scrollbars=1,resizable=yes,scrollbars=yes,menubar=yes"); 
	doc = my_window.document;
	startWrite(getTimeStr(ao));
	writeQA();
}

function getTimeStr(ao) {
	var val = ao[1];
	var e = val.substring(val.length-1);
	var t = new Number(val.substring(0,val.length-1));
	t = new Number(ao[0]) * t;
	if(e=='s') {
		t = t / 60;
	}
	return getTimeString(t);
}

function startWrite(time) {
	var d = new Date();
	doc.write("<html> <link rel=\"stylesheet\" type=\"text/css\" href=\"/5\"/>" +
			"<body><div align=center style=\"font-size: large;font-weight: bold; font-style: oblique;\">Math17 " +
			gde.innerHTML + " Mathematics Test Question</div>\r\n" +
			"<table width=\"100%\" cellspacing=4 cellpadding=4><tr><td align=left>Examination Time:"+ time+"</td><td align=right>Date : "+d.toDateString()+"</td></tr></table>"+
			"<table width=\"100%\" cellspacing=4 cellpadding=4><tr>");
}

function endWrite() {
	var i = pw%noinrow;
	i = noinrow-1-i;
	for ( var j = 0; j < i; j++) {
		doc.write("<td> </td>");
	}
	doc.write("</tr></table>\r\n<div align=center style=\"font-size: large;font-weight: bold; font-style: oblique;\">" +
			"<br>Right Answers</div>")
	doc.write(ansStr);
	doc.write("</div>\r\n");
	doc.write("<div align=center>Thank You for using www.Math17.com.</div>\r\n");
	doc.write("</body></html>\r\n");
}

function writeQA() {
	var lt = qalt();
	var q = nextqa();
	if(q == null){
		if(hasMore()) {
			setTimeout("writeQA()",100);
		} else {
			endWrite();
		}
		return;
	}
	pw++;
	var sb = "<td valign=top width=\""+(100/noinrow)+"%\" >"+pw+") " + q.question;
	sb += "Options:<table width=\"100%\" style=\"border-collapse: collapse;\"><tr>";
	for ( var i = 0; i < q.options.length; i++) {
		sb += "<td style=\"border-width: thin; border-color:black; border-style: solid;\">("
			+OPTTYPE.charAt(i)+") "+q.options[i]+"</td>"
		if (i == 1) {
			sb += "</tr><tr>";
		}
	}
	sb += "</tr></table></td>\r\n";
	if(pw%noinrow==0) {
		sb += "</tr></table>";
		sb += "<table width=\"100%\" cellspacing=4 cellpadding=4><tr>";
	}
	
	ansStr += "("+pw+") "+OPTTYPE.charAt(q.ansopt)+" &nbsp; ";
	doc.write(sb);
	writeQA();
}

function PrintPDFWrite(to) {
	var mywindow= window.open ("", "TestPrint","status=1,toolbar=yes,scrollbars=1,resizable=yes,scrollbars=yes,menubar=yes"); 
	var doc1 = mywindow.document;
	var sb = "<html><body><form action='/r?o="+to.filter.gls +"_" +to.opt 
			+"' method='post' name='fpdf'>";
	sb+= "Loading...";
	sb+= "</form></body></html>\r\n";
	doc1.write(sb);
	doc1.fpdf.submit();
}
var lrs=false;
var trs=false;

function lrAll() {
	if(lrs) {
		closeLR();
	} else {
		openLR();
	}
}

function trAll() {
	if(trs) {
		closeTR();
	} else {
		openTR();
	}
}

function initCloseOpenAll(per) {
	closeLRLink();
	closeTRLink();
	showScal(per);
}

function openLR() {
	lrs=true;
	document.getElementById("lri").src = IMG_PDOWN;
	openCloseLevelAll("ds","ds1",IMG_PDOWN);
}

function closeLRLink() {
	lrs=false;
	document.getElementById("lri").src = IMG_PUP;
}

function closeLR() {
	closeLRLink();
	openCloseLevelAll("dh","dh",IMG_PUP);
}

function openCloseLevelAll(cn,cnd,res) {
	var glsa = tos.to.filter.gls.split("_");
	var sl = glsa[1];
	var st = glsa[2];
	var l,t,lt,e,ei;
	for ( var i = 0; i < sl.length; i++) {
		l = sl.charAt(i);
		e = document.getElementById("sls"+l);
		if(e != null) {
			ei = document.getElementById("isls"+l);
			e.className = cn;
			ei.src = res;
			for ( var j = 0; j < st.length; j++) {
				t = st.charAt(j);
				lt= l+t;
				e = document.getElementById("slst"+lt);
				if(e != null) {
					ei = document.getElementById("islst"+lt);
					e.className = cnd;
					ei.src = res;
				}
			}
		}
	}
}

function openTR() {
	trs=true;
	document.getElementById("tri").src = IMG_PDOWN;
	openCloseTopicAll("ds1","ds",IMG_PDOWN);
}

function closeTRLink() {
	trs=false;
	document.getElementById("tri").src = IMG_PUP;
}

function closeTR() {
	closeTRLink();
	openCloseTopicAll("dh","dh",IMG_PUP);
}

function openCloseTopicAll(cn,cnd,res) {
	var glsa = tos.to.filter.gls.split("_");
	var sl = glsa[1];
	var st = glsa[2];
	var l,t,lt,e,ei;
	for ( var j = 0; j < st.length; j++) {
		t = st.charAt(j);
		e = document.getElementById("sts"+t);
		if(e != null) {
			ei = document.getElementById("ists"+t);
			e.className = cn;
			ei.src = res;
			for ( var i = 0; i < sl.length; i++) {
				l = sl.charAt(i);
				lt= l+t;
				e = document.getElementById("stst"+lt);
				if(e != null) {
					ei = document.getElementById("istst"+lt);
					e.className = cnd;
					ei.src = res;
				}
			}
		}
	}
}


function showScal(per) {
	var scale = SCALE_F;
	if(per>=90) {
		scale = SCALE_APM;
		showBigScale(SCALE_AP);
	} else if(per>=80) {
		scale = SCALE_AAM;
		showBigScale(SCALE_AA);
	} else if(per>=70) {
		scale = SCALE_AMM;
		showBigScale(SCALE_AM);
	} else if(per>=60) {
		scale = SCALE_B;
	} else if(per>=50) {
		scale = SCALE_C;
	} else if(per>=40) {
		scale = SCALE_D;
	} else if(per>=30) {
		scale = SCALE_E;
	}
	document.getElementById("scl").innerHTML=scale; 
}

function showBigScale(id) {
	document.getElementById("idscale").src=id;
	document.getElementById("dscale").style.display="";
	setTimeout("hideBigScale()",5000);
}

function hideBigScale(){
	document.getElementById("dscale").style.display="none";
}

var lmReq;

function initTestQuickManagerPage() {
	lmReq = createAJAX();
}

// Start Test Quick Manager
function TestQuickManager(filter) {
	this.filter = filter;
	this.topicService = null;
	this.topicServiceAll = null;
	this.activeCount = 0;
	this.pos = -1;
	this.sugg = null;
	this.getQA = tqm_getQA;
	this.prepare = tqm_prepareQA;
	this.next = tqm_next;
	this.nextTopic = tqm_nextTopic;
	this.remove = tqm_remove;
	this.report = tqm_report;
	this.reportCount = tqm_reportCount;
	this.reportSuggestion = tqm_reportSuggestion;
	this.findSuggestion = tqm_findSuggestion;
	initTestQuickManager(this);
	this.prepare();
}

function tqm_next() {
	if(this.pos<this.topicService.length-1){
		this.pos++;
	} else {
		this.pos=0;
	}
}
function tqm_nextTopic() {
	this.next();
	for ( var i = 0; i < this.topicService.length; i++) {
		if(this.topicService[this.pos] != null){
			return;
		}
		this.next();
	}
}

function tqm_getQA() {
	var qa = null;
	if(this.activeCount>0) {
		var ts = this.topicService[this.pos];
		qa = ts.getQA();
		if(qa==null && this.activeCount>0) {
			this.prepare();
			ts = this.topicService[this.pos];
			qa = ts.getQA();
		}
		this.prepare();
	}
	return qa;
}

function tqm_prepareQA() {
	this.nextTopic();
	var isR = this.topicService[this.pos].prepare();
	if(isR) {
		this.remove(this.pos);
		this.prepare();
	}
}

function tqm_remove(i) {
	this.topicService[i] = null;
	this.activeCount--;	
}

function initTestQuickManager(tqm) {
	var filter = tqm.filter;
	var glsa = filter.gls.split("_");
	var sl = glsa[1];
	var st = glsa[2];
	var topicService = new Array();
	var lmtopic,t,p;
	for ( var i = 0; i < st.length; i++) {
		t=st.charAt(i);
		p = topicService.length;
		lmtopic = new TQMTopic(t,tqm,sl,p);
		if(lmtopic.levelService != null) {
			topicService[p] = lmtopic;
		}
	}
	tqm.activeCount = topicService.length;
	tqm.topicServiceAll=topicService;
	tqm.topicService = arrayCopy(topicService);
}
// End Test Quick Manager

//Start Test Quick Manager Topic 
function TQMTopic(topic,tqm,sl,p) {
	this.topic = topic;
	this.tqm = tqm;
	this.tp = p;
	this.levelService = null;
	this.pos = 5;
	this.start = 0;
	this.end = 9;
	this.rightLevel=-1
	this.getQA = tqmt_getQA;
	this.prepare = tqmt_prepareQA;
	this.resetPos = tqmt_resetPos;
	this.report = tqmt_report;
	initTQMTopic(this,sl);
}

function tqmt_getQA() {
	return this.levelService[this.pos].getQA();
}
function tqmt_resetPos(isRight,level) {
	if(isRight) {
		this.rightLevel = level;
		if(this.pos != this.end) {
			if(this.pos != this.start) {
				this.start = this.pos;
			} else {
				this.start = this.end;
			}
		} else {
			this.tqm.remove(this.tp);
		}
	} else {
		if(this.pos != this.start) {
			if(this.pos != this.end) {
				this.end = this.pos;
			} else {
				this.end = this.start;
			}
		} else {
			this.tqm.remove(this.tp);
		}
	}
}

function tqmt_prepareQA() {
	var ls = this.levelService[this.pos];
	if(ls.qa != null) {
		if(ls.selOpt==-1) {
			return false;
		}
		var diff = this.end-this.start;
		if(diff > 1) {
			this.pos = this.start+Math.round(diff/2);
		} else {
			if(this.pos = this.start) {
				this.pos = this.end;
			} else {
				this.pos = this.start;
			}
		}
		ls = this.levelService[this.pos];
	}
	ls.prepare();
	if(ls.qa == null) {
		return true;
	}
	return false;
}

function initTQMTopic(tqmTopic,sl) {
	var t = tqmTopic.topic;
	var filter = tqmTopic.tqm.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) {	
		var levelService = new Array();
		for ( i = 0; i < levels.length; i++) {
			levelService[i] = new TQMLevel(levels[i], tqmTopic);
		}
		tqmTopic.levelService = levelService;
		tqmTopic.end = levels.length-1;
		tqmTopic.pos = Math.round(tqmTopic.end/2);
	}
}
//End Test Quick Manager Topic

//Start Test Quick Manager Level
function TQMLevel(level,tqmTopic) {
	this.level = level;
	this.tqmTopic = tqmTopic;
	var filter = tqmTopic.tqm.filter;
	this.gdText = filter.gdText;
	this.g = filter.grade();
	this.glt = this.g + level + this.tqmTopic.topic;
	this.qa = null;
	this.selOpt = -1;
	this.right = false;
	this.sel = tqml_sel;
	this.isRight = tqml_isRight;
	this.getQA = tqml_getQA;
	this.prepare = tqml_prepare;
	this.load = tqml_load;
	this.report = tqml_report;
}

function tqml_sel(pos) {
	this.selOpt = pos;
	if (pos == this.qa.qstn.ansopt) {
		this.right = true;
	}
	this.tqmTopic.resetPos(this.right, this.level);
}
function tqml_isRight() {
	return this.right;
}
function tqml_getQA() {
	if(this.selOpt==-1) {
		return this.qa;
	}
	return null;
}
function tqml_prepare() {
	try {
		this.load();
	} catch(e) {
		try {
			this.load();
		} catch(e) {
			sendError("TQMLevel prepare:"+"/"+e);
		}
	}
}
function tqml_load() {
	var url = "/p?g=" + this.glt + randomOne();
	lmReq.open("POST", url , false);
	lmReq.send(null);
	var text = lmReq.responseText;
	try {
		var qstn = new Qstn(text.split("\r"), 0, this.gdText, this.g);
		this.qa = new TQQA(qstn,this);
	} catch (e) {
		throw "tqml_load:"+this.glt+"/"+text+"/"+e;
	}
}
//End Test Quick Manager Level

//Start Test Quick QA
function TQQA(qstn, tqLevel) {
	this.qstn = qstn;
	this.tqLevel = tqLevel; 
	this.sel = tqqa_sel;
	this.tl = tqqa_tl;
	this.tlText = tqqa_tlText;
	this.report = tqqa_report;
}
function tqqa_sel(pos) {
	this.tqLevel.sel(pos);
}
function tqqa_tl() {
	return this.tqLevel.tqmTopic.topic+this.tqLevel.level;
}
function tqqa_tlText() {
	var t = this.tqLevel.tqmTopic.topic
	return tof.tptxt[t]+" / "+ TEXT_LEVEL + this.tqLevel.level;
}
//End Test Quick QA

//Start Report
function tqm_reportCount() {
	var	nSts=0;
	var nStmx = 0;
	var ml,ts;
	for ( var i = 0; i < this.topicServiceAll.length; i++) {
		ts = this.topicServiceAll[i];
		nSts = nSts + new Number(ts.rightLevel)+1;
		ml = ts.levelService[ts.levelService.length-1].level;
		nStmx = nStmx + new Number(ml) + 1;
	}
	var ar = new Array(); 
	ar[0] = nSts *10;
	ar[1] = nStmx *10;
	return ar;
}

function tqm_report() {
	var sb = ""
	for ( var i = 0; i < this.topicServiceAll.length; i++) {
		sb += this.topicServiceAll[i].report();
	}
	return sb;
}

// Topic Report
function tqmt_report() {
	var sb = "<div class=dy><div class=gdm>&nbsp;"+this.tqm.filter.tptxt[this.topic]+"</div>";
	sb += "<div class=ds><table cellspacing=1 cellpadding=1 width='100%'>";
	var sbl="";
	for ( var i = 0; i < this.levelService.length; i++) {
		sbl+= this.levelService[i].report();
	}
	
	if(sbl.length > 0){
		sb += sbl;
	} else {
		sb += "<tr><td>"+TEXT_SKIPPED+"</td></tr>";
	}
	sb += "</table></div></div>";
	return sb;
}

//Level Report
function tqml_report() {
	var sb = "";
	var lv;
	for ( var i = 0; i < this.pos; i++) {
		lv = this.lvs[i];
		if(lv.qa.status != 0) { 
			sb += "<tr><td width='15%'>"+TEXT_LEVEL+lv.l+"</td>";
			sb += "<td width='80%'>"
			sb += "<div class=gdn onclick=TMReview('"+lv.qapos+"') " +
					"onMouseover='selMMOver(this)' onMouseout='selMMOut(this)'>";
			sb += lv.qa.qstn.shortq()+"</div></td><td width='5%'>";
			if(lv.qa.status == 1) {
				sb += IMAGE_RIGHT;
			} else {
				sb += IMAGE_WRONG;
			} 
			sb +="</td></tr>";
		}
	}
	
	if(this.qa != null && this.selOpt>=0) {
		var qstn = this.qa.qstn;
		sb += "<tr><td width='15%'>"+TEXT_LEVEL+this.level+"</td>";
		sb += "<td width='80%'>"
		sb += "<div class=gdn onclick=TMReview('"+this.tqmTopic.topic+this.level+"') " +
				"onMouseover='selMMOver(this)' onMouseout='selMMOut(this)'>";
		sb += qstn.shortq()+"</div></td><td width='5%'>";
		if(this.isRight()) {
			sb += IMAGE_RIGHT;
		} else {
			sb += IMAGE_WRONG;
		} 
		sb +="</td></tr>";
	}
	return sb;
}

function tqqa_report() {
	var sb = "";
	sb += this.qstn.question;
	if(this.tqLevel.isRight()){
		sb += TEXT_RIGHT + " " + IMAGE_RIGHT;
	} else {
		sb += TEXT_WRONG + " " + IMAGE_WRONG;
	}
	var selOpt =  this.tqLevel.selOpt;
	sb += "<table width=100% cellspacing='2px' cellpadding='2px' class=tn><tr>";
	var len = this.qstn.options.length;
	for ( var i = 0; i < len; i++) {
		sb += "<td width=\"50%\"><div class=";
		if(i == selOpt && i == this.qstn.ansopt){
			sb += "qba";
		} else if(i == selOpt) {
			sb += "qbw";
		} else if(i == this.qstn.ansopt) {
			sb += "qbr";
		} else {
			sb += "qb";
		}
		sb += ">";
		sb+= this.qstn.options[i];
		sb += "</div><td>";
		if(i==1){
			sb += "</tr><tr>"
		}
	}
	sb += "</tr></table>";
	return sb;
}

function tqm_reportSuggestion() {
	var sb ="";
	var sug = this.findSuggestion();
	sb = "<table width=100% class=x1>";
	var tl;
	for ( var i = 0; i < sug.length; i++) {
		tl = sug[i];
		sb += "<tr><th width=50%>";
		sb += this.filter.tptxt[tl.t];
		sb += "</th><td align=left>";
		sb += TEXT_LEVEL+tl.l;
		sb += "</td></tr>";
	}
	sb += "</table>";
	return sb;
}
function tqm_findSuggestion() {
	var sug = new Array();
	var ts,tl,nl;
	for ( var i = 0; i < this.topicServiceAll.length; i++) {
		ts=this.topicServiceAll[i];
		tl = ts.levelService[ts.pos];
		if(ts.levelService.length-1 != ts.pos && tl.isRight()) {
			tl = ts.levelService[ts.pos+1];
		}
		sug[sug.length] = new TL(ts.topic, tl.level);
	}
	this.sugg = sug;
	return sug;
}

//End Report
