//this page draws complex HTML and provides handlers for getting data from input elements created on this page
//most of this page creates or manages admin features, but there are some general use functions, such as slab-based layout tools, at the bottom


//=============================================================== DATA MANAGEMENT OBJECT AND METHODS
//the data management object is used to create a standardized method for:
// 1) converting arrays composed of downloaded data and page configuration instructions into workspaces containing multiple widgets for inputing data
// 2) collecting data from pages of input widgets and formatting the data for upload to the server
function dataManagementObject(){
	this.drawEntries=drawEntries;
	this.entries=new Array();
	this.dataSrc=new Array();
	this.prepDataForDisplay="";
	this.collectAndUpload="";
	return true;
}

//this processes arrays of data and layout instructions into HTML for a complete workspace. it uses eval, which means content sent to it must be properly escaped and quoted
function drawEntries(){
	var txt="";
	var arr=this.entries;
	for(var a=0;a<arr.length;a++){
		var comStr="get"+arr[a][0]+"HTML('"+javafilt(arr[a][1])+"','"+javafilt(arr[a][2])+"',"+javafilt(arr[a][3])+","+javafilt(arr[a][4])+","+javafilt(arr[a][5])+","+javafilt(arr[a][6])+",'"+javafilt(arr[a][7])+"','"+javafilt(arr[a][8])+"',"+javafilt(arr[a][9])+",'"+javafilt(arr[a][10])+"')";
		txt+=eval(comStr);
	}
	return txt;
}


// ========================================================= DATA MODULE CONSTRUCTORS (DRAW HTML)
//these functions all compose HTML for various data input widgets. Some do the work themselves and others are friendly handlers for complex code stored in external JS files
//All of these functions use the same standardized schema for sending parameters to the functions: 
//[0] widget type name; [1] id name; [2] public name; [3] left; [4] top; [5] width; [6] height; [7] tab index; [8] default value; [9] array of static data; [10] command literal
//note that item 8 (def) will be eval-ed, therefore if it is a variable, it will eval as the variable value, if it is a string, it will be eval-ed as if it was the name of an object, such as an array

//this function is slightly non-standard
function getListBuilderHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var srcNam=def;//send as the name of the source array for choices
	var srcNam=nam;//exp
	var relArr=arr;//this is an actual array containing the selected and stored data
	if(relArr==" ")relArr="";
	var relArr=def.split();//exp
	var hedArr="";//send as comma string, split it there
	var colArr="1";//send as comma string, split it there
	var widArr=wd;//send as comma string, split it there
	return drawListBuilderHTML(nam,tp,lf,wd,tab,cap,def,ht,srcNam,hedArr,colArr,widArr,relArr);
}

function getSaveButtonHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var txt="<div id="+nam+"Div class=savebutton onclick=saveData('"+unescape(def)+"','"+nam+"') style=position:absolute;left:"+lf+";top:"+tp+";width:"+wd+";><table width="+wd+" height="+ht+" cellpadding=0 cellspacing=0 border=0><tr><td valign=middle width=10><img src=images/saveWidget.gif width=10 height=14></td><td valign=middle align=center class=savebuttontext>"+cap+"</td><td valign=middle width=10><img src=images/blank.gif width=10 height=14></tr></table></div>";
	return txt;
}

function getPasswordHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var txt="<div id="+nam+"Div class=textentrydiv style=position:absolute;left:"+lf+";top:"+tp+";width:"+wd+";>"
	if(cap)txt+=cap+"<br>";
	txt+="<input type=password id="+nam+"Entry style=width:"+wd+";height:"+ht+" tabindex="+tab+" value='"+unescape(def)+"'></div>";
	return txt;
}

function getTextEntryHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var txt="<div id="+nam+"Div class=textentrydiv style=position:absolute;left:"+lf+";top:"+tp+";width:"+wd+";>"
	if(cap)txt+=cap+"<br>";
	txt+="<input type=text id="+nam+"Entry style=width:"+wd+";height:"+ht+" tabindex="+tab+" value='"+unescape(def)+"'></div>";
	return txt;
}

function getEssayHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var txt="<div id="+nam+"Div class=textentrydiv style=position:absolute;left:"+lf+";top:"+tp+";width:"+wd+";>"
	if(cap)txt+=cap+"<br>";
	txt+="<textarea id="+nam+"Entry style=width:"+wd+";height:"+ht+" tabindex="+tab+" class=essay>"+unescape(def)+"</textarea></div>";
	return txt;
}

function getDropdownHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var txt="<div id="+nam+"Div class=dropdowndiv style=position:absolute;left:"+lf+";top:"+tp+";width:"+wd+";>"
	if(cap)txt+=cap+"<br>";
	txt+=getDropdownGuts(nam,cap,lf,tp,wd,ht,tab,def,arr,com);
	txt+="</div>";
	return txt;
}

function getDropdownGuts(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var comStr="";
	if(com)comStr=" onchange=\""+com+"('"+nam+"')\"";
	var txt="<select id="+nam+"Entry style=width:"+wd+";height:"+ht+" tabindex="+tab+comStr+">";
	for(var a=0;a<arr.length;a++){
		var selectVal="";
		if(arr[a][0]==unescape(def))selectVal=" selected";
		txt+="<option value='"+arr[a][0]+"'"+selectVal+">"+arr[a][1];
	}
	txt+="</select>";
	return txt;
}

function getRadioHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var txt="<div id="+nam+"Div class=radiodiv style=position:absolute;left:"+lf+";top:"+tp+";width:"+wd+";height:"+ht+"><br>"
	if(cap)txt+=" &nbsp; "+cap+"<br>";
	for(var a=0;a<arr.length;a++){
		var checkedVal="";
		if(arr[a][0]==unescape(def))checkedVal=" checked";
		txt+="<div style=position:absolute;left:"+arr[a][2]+";top:"+arr[a][3]+" class=radio><input id=radio"+nam+a+" name=radio"+nam+" type=radio value="+arr[a][0]+" tabindex="+tab+" style=position:relative;top:2"+checkedVal+"> "+arr[a][1]+"</div>";
	}
	txt+="<br></div>";
	return txt;
}

function getCheckboxRowHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var txt="<div id="+nam+"Div class=checkboxdiv style=position:absolute;left:"+lf+";top:"+tp+";width:"+wd+";height:"+ht+"><br>"
	if(cap)txt+=" &nbsp; "+cap+"<br>";
	for(var a=0;a<arr.length;a++){
		var checkedVal="";
		var onVals=","+unescape(def)+",";
		if(onVals.indexOf(","+arr[a][0]+",")!=-1)checkedVal=" checked";
		txt+="<div style=position:absolute;left:"+arr[a][2]+";top:"+arr[a][3]+" class=checkbox><input id=checkbox"+nam+a+" name=checkbox"+nam+" type=checkbox value="+arr[a][0]+" tabindex="+tab+" style=position:relative;top:2"+checkedVal+"> "+arr[a][1]+"</div>";
	}
	txt+="<br></div>";
	return txt;
}

function getSingleCheckboxHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var checkedVal="";
	if(def==1||def=="on"||def==true||def=="true")checkedVal=" checked";
	var txt="<div id="+nam+"Div class=subtitle style=position:absolute;left:"+lf+";top:"+tp+";width:"+wd+";height:"+ht+"><br>"
	txt+="<input id=checkbox"+nam+" type=checkbox tabindex="+tab+" style=position:relative;top:2; "+checkedVal+">"+cap;
	txt+="<br></div>";
	return txt;
}

//this works, but only creates a single instance. do not have more than one text editor window active at any time
function getTextEditorHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	def=unescape(def);
	var hAdj=0;
	var vAdj=27;
	if(ie){
		hAdj=2;
		vAdj=25;
	}
	var txt=editorButtonBar("",lf,tp,wd+hAdj);
	txt+=writeRichText(nam,def,lf,(tp+vAdj),wd,ht-vAdj);
	return txt;
}

function getImageGalleryHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	def=imgLibrary;//this needs work, data should come from server and it should be in the arr position, not def
	var txt="<div id="+nam+"Div class=imagegallerydiv style=position:absolute;left:"+lf+";top:"+tp+";width:"+wd+";><br>"
	if(cap)txt+=" &nbsp; "+cap+"<br>";
	txt+="<div id="+nam+"ImgDisplay class=imagedisplay style=position:relative;width;"+wd+";height:75;overflow-y:auto;overflow-x:hidden;>";
	txt+=getGalleryGuts(nam,cap,lf,tp,wd,ht,tab,def,arr,com);
	txt+="</div></div>";
	return txt;
}

//this can be used to repopulate nam+"ImgDisplay";
function getGalleryGuts(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var txt="<table cellpadding=0 cellspacing=0 border=0 style=position:relative;left:0;top:0;width:"+wd+";>";
	for(var d=0;d<def.length;d++){
		if(d%3==0)txt+="<tr>";
		txt+="<td valign=middle align=center class=imagecell width="+Math.round(wd/3)+" height=75 onclick=selectImage("+def[d][0]+")><img src=\""+def[d][1]+"\" height=50 tabindex="+tab+" border=1><br><nobr>"+def[d][2]+"</nobr></td>";
		if(d%3==2)txt+="</tr>";
	}
	if(d%3==1)txt+="<td> &nbsp; </td><td> &nbsp; </td></tr>";
	if(d%3==2)txt+="<td> &nbsp; </td></tr>";
	txt+="</table>";
	return txt;
}

function getFileUploadHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var txt=drawFileUploadHTML(nam,tp,lf,wd,tab,cap,unescape(def),50,50);
	return txt;
}

function getLargeFileUploadHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var txt=drawFileUploadHTML(nam,tp,lf,wd,tab,cap,unescape(def),125,125);
	return txt;
}

function getWideFileUploadHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var txt=drawFileUploadHTML(nam,tp,lf,wd,tab,cap,unescape(def),350,42);
	return txt;
}

function getCalendarHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	var mod=false;
	var calViz="visible";
	var frmViz="hidden";
	if(mod){
		calViz="hidden";
		frmViz="visible";
	}
	var txt="<span class=subtitle style=position:absolute;top:"+tp+";left:"+lf+";>"+cap+"</span><br />";
	txt+="<div id="+nam+"CalendarDiv style=position:absolute;top:"+(tp+13)+";left:"+lf+";width:"+wd+";visibility:hidden;z-index:100 class=formHolder>";
	txt+=getCalendarGridHTML(nam,tp,lf,wd,ht,tab,cap,def,mod);
	txt+="</div>";
	txt+="<div id="+nam+"InputDiv style=position:absolute;top:"+(tp+13)+";left:"+lf+";width:"+wd+";visibility:visible class=formHolder>";
	txt+=getCalendarFormHTML(nam,tp,lf,wd,ht,tab,cap,def,mod);
	txt+="</div>";
	txt+="<img src=images/calToggle.gif width=13 height=12 style=position:absolute;left:"+(lf+128)+";top:"+tp+";cursor:pointer onclick=\"toggleCal('"+nam+"',"+tp+","+lf+","+wd+","+ht+","+tab+",'"+cap+"','"+def+"')\">";
	return txt;
}

function getTimeOfDayHTML(nam,cap,lf,tp,wd,ht,tab,def,arr,com){
	def=new Date(def*1000);
	var hrs=def.getHours();
	var mins=def.getMinutes();
	if(mins<10)mins="0"+mins;
	var txt="<div id="+nam+"TimeDiv class=textentrydiv style=position:absolute;left:"+lf+";top:"+tp+";width:"+wd+";>"
	if(cap)txt+=cap+"<br>";
	txt+="<nobr><input type=text id="+nam+"HourEntry style=width:25;height:22 tabindex="+tab+" value='"+unescape(hrs)+"'>";
	txt+=" <b style=position:relative;top:-2>:</b> ";
	txt+="<input type=text id="+nam+"MinuteEntry style=width:25;height:22; tabindex="+tab+" value='"+unescape(mins)+"'> ";
	var amSel="";
	var pmSel="";
	if(hrs>12){
		hrs-=12;
		pmSel=" selected";
	}
	else amSel=" selected";
	txt+="<select id="+nam+"Meridian tabindex="+tab+"><option value=0> <option value=1"+amSel+">AM<option value=2"+pmSel+">PM</select></nobr>";
	txt+="</div>";
	return txt;
}

// ========================================================== DATA MODULE EXTRACTORS
//these functions are used to easily retrieve data from data input widgets

function getListBuilderValue(nam){
	var relArr=grab(nam+"hidRelArr");
	if(!relArr)return "";
	var ret=relArr.value.toString();
	if(ret.charAt(0)==",")ret=ret.substring(1);
	ret=escape(ret);
	ret=safer(ret);
	if(ret=="")ret=" ";
	return ret;
}

function getPasswordValue(nam){
	var targ=grab(nam+"Entry");
	if(!targ)return "";
	var ret=escape(targ.value);
	ret=safer(ret);
	return ret;
}

function getTextEntryValue(nam){
	var targ=grab(nam+"Entry");
	if(!targ)return "";
	var ret=escape(targ.value);
	ret=safer(ret);
	return ret;
}

function getEssayValue(nam){
	var targ=grab(nam+"Entry");
	if(!targ)return "";
	var ret=escape(targ.value);
	ret=safer(ret);
	return ret;
}

function getDropdownValue(nam){
	var targ=grab(nam+"Entry");
	if(!targ)return "";
	for(var o=0;o<targ.options.length;o++){
		if(targ.options[o].selected){
			var ret=escape(targ.options[o].value);
			ret=safer(ret);
			if(ret=="se")ret=" ";
			return ret;
		}
	}
	return "";
}

function getRadioValue(nam){
	var rads=document.getElementsByName("radio"+nam);
	if(!rads)return "";
	for(var r=0;r<rads.length;r++){
		if(rads[r].checked){
			var ret=escape(rads[r].value);
			ret=safer(ret);
			return ret;
		}
	}
	return "";
}

//return comma string of values
function getCheckboxRowValue(nam){
	var res="";
	var rads=document.getElementsByName("checkbox"+nam);
	if(!rads)return "";
	for(var r=0;r<rads.length;r++){
		if(rads[r].checked){
			res+=escape(rads[r].value)+",";
		}
	}
	if(res!="")res=res.substring(0,res.length-1);
	return res;
}

function getSingleCheckboxValue(nam){
	var targ=grab("checkbox"+nam);
	if(!targ)return "";
	var res=targ.checked;
	if(res)return 1;
	return 0;
}

//this only extracts from a single instance. no more than one instance should be active at any time.
function getTextEditorValue(nam){
	var editFrame=grabEditSpaceContent();
	var storyBody=editFrame.document.body.innerHTML;
	storyBody=cleanEditSpace(storyBody);
	if(!storyBody)return "";
	return storyBody;
}

function getImageGalleryValue(nam){
	return "";
}

function getFileUploadValue(nam){
	var targ=grab(nam+"ImgInput");
	if(!targ)return "";
	var ret=escape(targ.value);
	ret=safer(ret);
	return ret;
}

function getLargeFileUploadValue(nam){
	var targ=grab(nam+"ImgInput");
	if(!targ)return "";
	var ret=escape(targ.value);
	ret=safer(ret);
	return ret;
}

function getWideFileUploadValue(nam){
	var targ=grab(nam+"ImgInput");
	if(!targ)return "";
	var ret=escape(targ.value);
	ret=safer(ret);
	return ret;
}

//returns seconds, not millseconds
function getCalendarValue(nam){
	var mo=grab(nam+"Form0").value;
	mo=mo.toString();
	if(mo.charAt(0)=="0")mo=mo.substring(1);
	mo=parseInt(mo);
	mo-=1;
	var dt=grab(nam+"Form1").value;
	dt=dt.toString();
	if(dt.charAt(0)=="0")dt=dt.substring(1);
	dt=parseInt(dt);
	var yr=grab(nam+"Form2").value;
	yr=yr.toString();
	if(yr.charAt(0)=="0")yr=yr.substring(1);
	yr=parseInt(yr);
	if(yr<10)yr="200"+yr;
	else if(yr<100)yr="20"+yr;
	var dat=new Date(yr,mo,dt);
	var ret=Math.round(dat.getTime()/1000);
	ret=safer(ret);
	return ret;
}

//returns seconds, not millseconds
function getTimeOfDayValue(nam){
	var ho=parseInt(grab(nam+"HourEntry").value);
	var mn=parseInt(grab(nam+"MinuteEntry").value);
	var mr="";
	var targ=grab(nam+"Meridian");
	for(var o=0;o<targ.options.length;o++){
		if(targ.options[o].selected){
			mr=targ.options[o].value;
			break
		}
	}
	if(mr==2&&ho<12)ho+=12;
	if(ho>=24)ho=0;
	var ret=(ho*3600)+(mn*60);
	return ret;
}

// ========================================================== MISCELLANEOUS CONTROL PAGE UI

//this processes a button click to determine what kind of button was clicked and respond appropriately
function saveData(nam,opp){
	if(opp=="saveAccountButton")var res=acctMgr.collectAndUpload();
	if(opp=="savePhotoButton")var res=photoMgr.collectAndUpload();
	if(opp=="saveStoryButton")var res=storyMgr.collectAndUpload();
	if(opp=="saveEventButton")var res=eventMgr.collectAndUpload();
	if(opp=="saveCommentButton")var res=commentMgr.collectAndUpload();
	if(opp=="classificationSaveButton")var res=uploadClassificationData();
	if(opp=="siteManagerUploadButton")var res=uploadSiteManagerData();
}

//highlights left panel nav elements in super admin
function setNavHilite(num){
	for(var n=0;n<7;n++){
		var nLink=grab("nav"+n);
		if(n!=num)nLink.style.color="FF0000";
		else nLink.style.color="FFCC00";
	}
	return true;
}

function addPhotoGallery(){
	alert("Add photo gallery");
}

//get a list of files in a directory specified in a given drop down
function getImageDirContents(nam){
	var dirName=getDropdownValue(nam);
	if(dirName=="")return true;
	var dirPath="../../uploads/"+idArr[4]+"/"+dirName;
	var res=doAjax("getFilesInDir.php",dirPath,finishGetFilesInDir);
}

function showNewImageGallery(arr){
	var cont=grab("chooseImageImgDisplay");
	if(!cont)return true;
	var txt=getGalleryGuts("chooseImageImgDisplay","",0,0,720,0,15,arr,"''","");
	if(!txt)txt="No images in directory";
	cont.innerHTML=txt;
}


//===================================================================== SET UP CONTROL PAGES NAV FRAME

function drawControlContentFrame(){
	var col0=drawNavPanelHTML();
	var col1=drawBlankControlZoneHTML();
	var conts=new Array(col0,col1);
	var cols=new Array(199,999);
	return drawSlab(cols,conts,"mainSlab");
}

function drawUserControlContentFrame(){
	var txt="<img src=images/blank.gif width=960 height=8><div id=mainTitle style=position:relative;top:0;left:10;width:960; class=mainTitle></div>";
	txt+="<div id=mainDisplay class=displaybox style=position:relative;top:0;left:10;width:950;height:1520;overflow-y:auto>";
	txt+="</div><br><br>";
	return txt;
}

function drawNavPanelHTML(){
	var txt="<img src=images/blank.gif width=190 height=8><div id=navPanel style=position:relative;top:0;left:10;background-color:black;width:190;height:500>";
	txt+="<div id=navHead class=navhead style=position:relative;top:25;left:10;>Super Admin</div><p><p>";
	txt+="<div id=nav0 class=navlink style=position:relative;top:25;left:20; onclick=loadProfileMenu()>&nbsp;Account Manager</div><p><p>";
	txt+="<div id=nav1 class=navlink style=position:relative;top:25;left:20; onclick=loadPhotoMenu()>&nbsp;Photo Manager</div><p><p>";
	txt+="<div id=nav2 class=navlink style=position:relative;top:25;left:20; onclick=loadStoryMenu()>&nbsp;Story Manager</div><p><p>";
	txt+="<div id=nav3 class=navlink style=position:relative;top:25;left:20; onclick=loadEventMenu()>&nbsp;Event Manager</div><p><p>";
	txt+="<div id=nav4 class=navlink style=position:relative;top:25;left:20; onclick=loadCommentMenu()>&nbsp;Comment Manager</div><p><p>";
	txt+="<div id=nav5 class=navlink style=position:relative;top:25;left:20; onclick=loadClassificationManager()>&nbsp;Classification Manager</div><p><p>";
	txt+="<div id=nav6 class=navlink style=position:relative;top:25;left:20; onclick=loadSiteManager()>&nbsp;Site Manager</div>";
	txt+="</div><p>";
	return txt;
}

function drawBlankControlZoneHTML(){
	var txt="<img src=images/blank.gif width=960 height=8><div id=mainTitle style=position:relative;top:0;left:10;width:960; class=mainTitle></div>";
	txt+="<div id=mainDisplay class=displaybox style=position:relative;top:0;left:10;width:850;height:1520;>";
	txt+="</div><br><br>";
	return txt;
}

function drawSidebarSlab(cols,conts){
	var wid=0;
	for(var c=0;c<cols.length;c++){
		wid+=cols[c];
	}
	wid+=c+1;
	var vertBlack="<td width=1 style=background-color:black><img src=images/black.gif width=1></td>";
	var txt="<table width="+wid+" cellpadding=0 cellspacing=0 border=0 class=midbox style=position:relative><tr><td width=1>";
	for(var c=0;c<cols.length;c++){
		txt+="<td width="+cols[c]+" class=slabcell valign=top><div style=width:"+cols[c]+";height:100%;overflow-x:hidden>"+conts[c]+"</div></td>";
		if(c!=cols.length-1)txt+=vertBlack;
	}
	txt+="</tr></table>";
	return txt;
}

function drawBlankSlab(cols,conts){
	var wid=0;
	for(var c=0;c<cols.length;c++){
		wid+=cols[c];
	}
	var txt="<table width="+wid+" cellpadding=0 cellspacing=0 border=0 style=position:relative><tr>";
	for(var c=0;c<cols.length;c++){
		txt+="<td width="+cols[c]+" class=slabcell valign=top><div style=width:"+cols[c]+";height:100%;overflow-x:hidden>"+conts[c]+"</div></td>";
	}
	txt+="</tr></table>";
	return txt;
}

function drawSlab(cols,conts,nam){
	if(!nam)nam="slab";
	var wid=0;
	for(var c=0;c<cols.length;c++){
		wid+=cols[c];
	}
	var txt="<table id="+nam+" width="+wid+" cellpadding=0 cellspacing=0 border=0 class=midbox style=position:relative><tr>";
	for(var c=0;c<cols.length;c++){
		txt+="<td width="+cols[c]+" class=slabcell valign=top><div style=width:"+cols[c]+";height:100%;overflow-x:hidden>"+conts[c]+"</div></td>";
	}
	txt+="</tr></table>";
	return txt;
}
