window.IDN=null;
var DEBUG_UTIL=false;
var DEBUG_ACCTCTRL=false;
var DEBUG_STUDENT=false;
var DEBUG_PROJCTRL=false;
var DEBUG_SESSION=false;

var CELL_SPACING="1";
var CELL_PADDING="1";

var	INT_W_UICTRL=240;
var	INT_H_UICTRL=25;
var	INT_W_UICHECKBOX=25;

var HOSTNAME="www.asymptopia.com";
//var HOSTNAME="linuxcorps.psl.nmsu.edu";

var W_WIDGET_TYPICAL=150;
var SHADOW_COLOR="black";
var BG_COLOR="gray";
var Utf8={
	
	// public method for url encoding
	encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
		
		for (var n = 0; n < string.length; n++) {
			
			var c = string.charCodeAt(n);
			
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
		
		}
		
		return utftext;
	},
	
	// public method for url decoding
	decode : function (utftext) {
		
		var string = "";
		
		try{if(utftext.length==0)return string;}
		catch(ex){return string;}
		
		var i = 0;
		var c = c1 = c2 = 0;
		
		while ( i < utftext.length ) {
			
			c = utftext.charCodeAt(i);
			
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else{
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
		}
		return string;
	}
}

function new_xhr(){
	var xhr=null;
	try{xhr=new ActiveXObject('Msxml2.XMLHTTP');}
	catch(e){
		try{xhr=new ActiveXObject('Microsoft.XMLHTTP');}
		catch(e2){
			try{xhr=new XMLHttpRequest();}
			catch(e3){xhr=null;}
		}
	}
	return xhr;
}
function SelectUpdater(xhr_func,select_id,domain,tablename,colname,primary_key,primary_value,cut_key,cut_value,cb_func_name){
	//this.Update() called manually for initial fill, also from saveCB.
	//optionCB's set here.
	this.xhr_func=xhr_func;//"get_column_values" or "get_row_values" (row=refs & bookmarks -- single array returned; col=col of values)
	this.select_id=select_id;
	this.domain=domain;
	this.tablename=tablename;
	this.colname="['"+colname+"']";
	this.primary_key=primary_key;
	this.primary_value=primary_value;
	this.cut_key=cut_key;
	this.cut_value=cut_value;
	this.cb_func_name=cb_func_name;
	
	this.SetCutValue=function(new_cut_value){
		this.cut_value=new_cut_value;
//		alert(new_cut_value);
	}
	this.SetPrimaryValue=function(new_primary_value){
		this.primary_value=new_primary_value;
//		alert(new_primary_value);
	}	
	this.Update=function(e){
//		alert(this.xhr_func+" "+this.domain+" "+this.tablename+" "+this.colname+" "+this.primary_key+" "+this.primary_value+" "+this.cut_key+" "+this.cut_value+" "+this.cb_func_name);
//		alert('SelectUpdater.Update()');
//		account_type=GetCookieContent("type");
		
/*
		if(this.cut_key=="null"){}
		else if(account_type=='super')this.cut_value='';//admin
		else if(account_type=='admin')this.cut_value='';//instructor
		else if(account_type=='instructor')this.cut_value='student';
		else this.cut_value='';
*/
//		alert('SelectUpdater.Update: '+this.cut_key+" "+this.cut_value);
		PostXHRGetRequest(this.xhr_func,this.domain,this.tablename,this.colname,this.primary_key,this.primary_value,this.cut_key,this.cut_value,this.cb_func_name);
	}
}
function PostXHRCommand(domain,cmd,cb_func_name){
	if(0)alert('domain: '+domain);
	if(0)alert('cmd: '+cmd);

	var xhr=new_xhr();
	xhr.onreadystatechange=function(){
		if(xhr.readyState==4){
			if(xhr.status==200){
				try{
					if(0)alert('RESPONSE: '+xhr.responseText);
					if(cb_func_name){
						cmd=cb_func_name+"(1)";//relay-queue right here!
						eval(cmd);
					}
				}
				catch(e){alert("PostXHRCommand(1):"+e);}
			}//END:if
			else{
				if(0)alert("PostXHRCommand(2):"+xhr.status);
				if(cb_func_name){
					cmd=cb_func_name+"(0)";
					eval(cmd);
				}
			}//END:else	
		}
	}
	
	url="http://"+HOSTNAME+"/pypost/xhr_posthandler.py/dummy";
	xhr.open('POST',url,true);
	str_domain=domain;
	str_req="cmd";
	var params="str_req="+str_req+"&str_domain="+str_domain+"&str_cmd="+cmd;
	if(0)alert(params);
	
	xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//	xhr.setRequestHeader("Content-type", "text/html; charset=utf-8");
//	xhr.setRequestHeader("Content-type", "text/plain; charset=utf-8");
//	xhr.setRequestHeader("Content-type", "text/xml;charset=utf-8");
	
	xhr.setRequestHeader("Content-length", params.length);
	xhr.setRequestHeader("Connection", "close");
	xhr.send(params);
}

function PostXHRGetRequest(str_req,domain,tablename,varlist,primary_key,primary_value,cut_key,cut_value,cb_func_name){
	var xhr=new_xhr();
	var params;
	xhr.onreadystatechange=function(){
		if(xhr.readyState==4){
			if(xhr.status==200){
				if(DEBUG_UTIL)alert(xhr.responseText);
				var cmd;
				try{
					if(cb_func_name!=null){
						
						if(cb_func_name=='theProjectMgr.loadCB'){
							if(DEBUG_UTIL){}
							//alert(xhr.responseText);
							
							//031710:Arrays->Chars
							//xhr_responseText=UnEscapeArrays(xhr.responseText);
							xhr_responseText=UnEscapeChars(xhr.responseText);
							
							//alert(xhr_responseText);
							cmd=cb_func_name+"("+xhr_responseText+")";
						}
						else if(cb_func_name=='loadRawCB'){
							//xhr_responseText=UnEscapeChars(xhr.responseText);
							//cmd=cb_func_name+"("+xhr_responseText+")";
							cmd=cb_func_name+"("+xhr.responseText+")";
						}
						else if(cb_func_name=='StartSessionCB'){
							
							//031710:Arrays->Chars
							//xhr_responseText=UnEscapeArrays(xhr.responseText);
							xhr_responseText=UnEscapeChars(xhr.responseText);
							
							cmd=cb_func_name+"("+xhr_responseText+")";
						}
						else
//							cmd=cb_func_name+"("+xhr.responseText+")";
							cmd=cb_func_name+"(\""+xhr.responseText+"\")";
						
						if(DEBUG_UTIL){}
						//alert("before: "+cmd);
						eval(cmd);
						if(DEBUG_UTIL){}
						//alert("after: "+cmd);
					}
				}
				catch(e){alert("PostXHRGetRequest(1): "+xhr.responseText+" "+e+" "+cmd);}
			}
			else alert("PostXHRGetRequest(2):"+xhr.status+params);
		}
	}
	
	url="http://"+HOSTNAME+"/pypost/xhr_posthandler.py/dummy";
	xhr.open('POST',url,true);
	str_domain=domain;
	
	params="str_req="+str_req+"&str_domain="+domain+"&cut_key="+cut_key+"&cut_value="+cut_value+"&primary_key="+primary_key+"&primary_value="+primary_value+"&tablename="+tablename+"&varlist="+varlist;
//	alert(params);
	xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xhr.setRequestHeader("Content-length", params.length);
	xhr.setRequestHeader("Connection", "close");
	xhr.send(params);
}
function RemoveLinks(str_chars,N){
//	lhsRegExp=new RegExp("<a href=\".*\">.*</a>","g");
//	lhsRegExp=new RegExp('<a href="[^"]+">[^<]+</a>',"g");
	lhsRegExp=new RegExp("<a href=\".*\">","g");
//	alert(lhsRegExp);
	for(var dummy=0;dummy<N;dummy++){
		str_chars=str_chars.replace(/<a [^>]+>/, '');
		str_chars=str_chars.replace(/<\/a [^>]+>/, '');
	}
	return str_chars;
}
function RemoveBreaks(str_chars,N){
	lhsRegExp=new RegExp("<br.*/>","g");
	str_chars=str_chars.replace(lhsRegExp,"  ");
	return str_chars;
}
function AutoParse(str_chars){
	lhsRegExp=new RegExp("</p>","g");
	str_chars=str_chars.replace(lhsRegExp,"$PAGEBREAK$");
//	str_chars=str_chars.split(lhsRegExp,1000);
	return str_chars;
}
function UnEscapeChars(str_chars){
//	lhsRegExp=new RegExp("\\$SQ\\$","g");
//	str_chars=str_chars.replace(lhsRegExp,"\\'");

//	alert(str_chars);

	lhsRegExp=new RegExp("\\$DQ\\$","g");
	str_chars=str_chars.replace(lhsRegExp,'\\"');

	lhsRegExp=new RegExp("\\$SC\\$","g");
	str_chars=str_chars.replace(lhsRegExp,';');

	lhsRegExp=new RegExp("\\$WC\\$","g");
	str_chars=str_chars.replace(lhsRegExp,':');

	var lhsRegExObj=new RegExp("\\$LEFT\\[\\$","g");
	str_chars=str_chars.replace(lhsRegExObj,"[");

	var rhsRegExObj=new RegExp("\\$RIGHT\\]\\$","g");
	str_chars=str_chars.replace(rhsRegExObj,"]");
	
	var rhsRegExObj=new RegExp("\\$CR\\$","g");
	str_chars=str_chars.replace(rhsRegExObj,"");//<br>
	
	var rhsRegExObj=new RegExp("\\$UNI\\$","g");
	str_chars=str_chars.replace(rhsRegExObj,"\\u");

	var rhsRegExObj=new RegExp("\\$AMP\\$","g");
	str_chars=str_chars.replace(rhsRegExObj,"\&");

	var rhsRegExObj=new RegExp("\\$PCT\\$","g");
	str_chars=str_chars.replace(rhsRegExObj,"\%");

/*
	var lhsRegExObj=new RegExp("\\$LEFT\\(\\$","g");
	str_chars=str_chars.replace(lhsRegExObj,"new Array(");

	var rhsRegExObj=new RegExp("\\$RIGHT\\)\\$","g");
	str_chars=str_chars.replace(rhsRegExObj,")");
*/
	return str_chars;
}
function SetSelected(select_id,select_text){
	target_select=document.getElementById(select_id);
	for(var oidx=0;oidx<target_select.options.length;oidx++){
		if(target_select.options[oidx].text==select_text)	
			target_select.selectedIndex=oidx;
	}
}
function SetSelectedValue(select_id,select_value){
	target_select=document.getElementById(select_id);
	for(var oidx=0;oidx<target_select.options.length;oidx++){
		if(target_select.options[oidx].value==select_value)	
			target_select.selectedIndex=oidx;
	}
}
function GetSelected(select_id){
	target_select=document.getElementById(select_id);
	for(var oidx=0;oidx<target_select.options.length;oidx++){
		if(target_select.options[oidx].selected==1)	
			return target_select.options[oidx].text;
	}
	return '';
}
function GetSelectedValue(select_id){
	target_select=document.getElementById(select_id);
	for(var oidx=0;oidx<target_select.options.length;oidx++){
		if(target_select.options[oidx].selected==1)	
			return target_select.options[oidx].value;
	}
	return '';
}
function GetCookieContent(requested_key){
	if(0)alert('GetCookieContent: '+requested_key);
	cookies=document.cookie.split(";",1000);
	cookies_obj=new Object();
	for(var idx=0;idx<cookies.length;idx++){
		key=cookies[idx].split("=",2)[0];
		val=cookies[idx].split("=",2)[1];
		val=val.replace(/'/g,"$SQ$");
		if(key==requested_key)return val.replace("%40","@");
		xcmd="cookies_obj."+key+"='"+val.replace("%40","@")+"'";
//		cmd="cookies_obj."+key+"='"+val+"'";
		eval(xcmd);
		if(DEBUG_UTIL)alert('GetCookieContent: '+xcmd);
	}
	if(0)alert('GetCookieContent returning: '+cookies_obj[requested_key]);
	return cookies_obj[requested_key];
}
function MkInput(str_id,str_name,int_W){
	input_area=Mk("input");
	input_area.id=str_id;
	input_area.name=str_name;
	input_area.style.width=parseInt(int_W)+"px";
	return input_area;
}
function MkFieldset(specs){
//	specs={'name':'someting','hsize_name':'h4'}
	h_node=document.createElement(specs.hsize_name);
	bold_node=document.createElement("b");
	text_node=document.createTextNode(specs.name);
	bold_node.appendChild(text_node);
	h_node.appendChild(bold_node);
	fieldset=document.createElement("fieldset");
	try{fieldset.id=specs.id;}
	catch(e){}
	legend=document.createElement("legend");
	legend.appendChild(h_node);
	fieldset.appendChild(legend);
	return fieldset;
}	
function Mk(str_type){
	return document.createElement(str_type);
}
function MkButton(str_type,str_label,str_id,width,func_cb){
	newB=Mk("input");
	newB.type=str_type;
	newB.style.width=width;
	newB.value=str_label;
	newB.hidden=-1;
	newB.id=str_id;
	if(func_cb==null){}
	else if(navigator.appName=="Microsoft Internet Explorer"){
		newB.attachEvent("onclick",func_cb);
	}
	else{
		newB.addEventListener("click",func_cb,false);
	}
	return newB;
}
function MkShadowSet(specs){
//	specs={'name':'someting','tlcx':0,'tlcy':0,'position':'absolute','id':'something','fgColor':'white',bgColor':'black','img':'/images/default.png','width':100,'height'75'}
	fg_specs={'position':specs.position,'tlcy':specs.tlcy,'tlcx':specs.tlcx,'width':specs.width-specs.offset,'height':specs.height-specs.offset,'bgColor':specs.fgColor,'img':specs.img}
	fg_div=MkDiv(fg_specs);
	bg_specs={'position':specs.position,'tlcy':specs.tlcy+specs.offset,'tlcx':specs.tlcx+specs.offset,'width':specs.width-specs.offset,'height':specs.height-specs.offset,'bgColor':specs.bgColor,'img':null}
	bg_div=MkDiv(bg_specs);
	shadow_set={'bg':bg_div,'fg':fg_div};
	return(shadow_set);
}
function MkDiv(specs){
//	specs={'name':'someting','tlcx':0,'tlcy':0,'position':'absolute','id':'something',bgColor':'white','img':'/images/default.png','width':100,'height'75'}
	div=Mk("div");
	div.id=specs.id;
	div.name=specs.name;
	div.style.position=specs.position;
	div.style.top=specs.tlcy;
	div.style.left=specs.tlcx;
	div.style.backgroundColor=specs.bgColor;
	div.style.width=parseInt(specs.width)+"px";
	div.style.height=parseInt(specs.height)+"px";
	if(specs.img!=null){
		bgImage=Mk("img");
		bgImage.height=specs.height;
		bgImage.width=specs.width;
		bgImage.src=specs.img;
		div.appendChild(bgImage);
	}
	return div;
}
function MkLabel(str,fontWeight,fontSize,fgColor){
	f=Mk("font");
	if(fontWeight!=null)f.style.fontWeight=fontWeight;
	if(fontSize!=null)f.style.fontSize=fontSize;
	f.appendChild(document.createTextNode(str));
	return f;
}
function UnEscapeSQ(str_chars){
	lhsRegExp=new RegExp("\\$SQ\\$","g");
	str_chars=str_chars.replace(lhsRegExp,"'");

	lhsRegExp=new RegExp("\\$DQ\\$","g");
	str_chars=str_chars.replace(lhsRegExp,'"');

	lhsRegExp=new RegExp("\\$CR\\$","g");
	str_chars=str_chars.replace(lhsRegExp," \n ");

//there was a return; in front of this, so wasn't getting called
//	lhsRegExp=new RegExp("<br>","g");
//	str_chars=str_chars.replace(lhsRegExp,"  ");

////////////////////////////////////////////////
	lhsRegExp=new RegExp("\\$DQ\\$","g");
	str_chars=str_chars.replace(lhsRegExp,'\\"');

	lhsRegExp=new RegExp("\\$SC\\$","g");
	str_chars=str_chars.replace(lhsRegExp,';');

	rhsRegExObj=new RegExp("\\$UNI\\$","g");
	str_chars=str_chars.replace(rhsRegExObj,"\\u");

	rhsRegExObj=new RegExp("\\$AMP\\$","g");
	str_chars=str_chars.replace(rhsRegExObj,"\&");

	rhsRegExObj=new RegExp("\\$PCT\\$","g");
	str_chars=str_chars.replace(rhsRegExObj,"\%");

////////////////////////////////////////////////
	return str_chars;
}
function EscapeChars(str_chars){
	str_chars=str_chars.replace(/\&quot;/g,"$DQ$");
	str_chars=str_chars.replace(/\&quot/g,"$DQ$");
	str_chars=str_chars.replace(/\&mdash;/g,"--");
	str_chars=str_chars.replace(/\&nbsp;/g," ");
	str_chars=str_chars.replace(/\&ldquo;/g,"\"");
	str_chars=str_chars.replace(/\&rdquo;/g,"\"");
	
	str_chars=str_chars.replace(/'/g,"$SQ$");
	str_chars=str_chars.replace(/"/g,"$DQ$");
	str_chars=str_chars.replace(/;/g,"$SC$");
	str_chars=str_chars.replace(/:/g,"$WC$");
	str_chars=str_chars.replace(/\n/g,"$CR$");
	str_chars=str_chars.replace(/\\n/g,"$CR$");
	str_chars=str_chars.replace(/\\u/g,"$UNI$");
	str_chars=str_chars.replace(/\&/g,"$AMP$");
	str_chars=str_chars.replace(/\%/g,"$PCT$");
	
	
	return str_chars;
}

function MkSelect(array_options,str_label,str_id,str_width,func_cb){
	newS=Mk("select");
	newS.id=str_id;
	newS.name=str_id;
	newS.style.width=str_width;
	for(var idx=0;idx<array_options.length;idx++){
		opt=Mk("option");
		opt.text=array_options[idx];
//		opt.defaultSelected=1;
		opt.selected=0;
		if(idx==0)
			opt.selected=0;
		if(navigator.appName=="Microsoft Internet Explorer"){
			newS.add(opt);
			opt.attachEvent("onSelect",func_cb);
		}
		else{
			newS.add(opt,newS.options[newS.options.length]);
			opt.addEventListener("click",func_cb,false);
		}
	}
	return newS;
}
function MkTStamp(){

	var currentTime = new Date();

	var month = currentTime.getMonth() + 1;
	if (month < 10){
		month = "0" + month;
	}

	var day = currentTime.getDate();
	if (day < 10){
		day = "0" + day;
	}
	
	var year = currentTime.getFullYear();
//	tstamp=month+"/"+day+"/"+year;
	
	var hours = currentTime.getHours();
	if (hours < 10){
		hours = "0" + hours;
	}


	var minutes = currentTime.getMinutes();
	if (minutes < 10){
		minutes = "0" + minutes;
	}
//	tstamp+="@"+hours+":"+minutes;
	tstamp=year+"-"+month+"-"+day+" "+hours+":"+minutes+":00";
//	alert(tstamp);
	return tstamp;
}
