// JavaScript Document

var vgLib=new Object();
var funcs=new Array();

//window.onerror=alert('funcs');
var continuealerts=true;

function getArg(argName){
	funcs.push('getArg');
	if(this && this.vgClassName && this.element)	
	return this.element.getAttribute(argName)||vgLib[this.vgClassName].defaults[argName];
funcs.pop();
}

function parseChildArg(arg){
	funcs.push('parseChildArg');
	if(!arg.nodeType) return null;
	var tmp;
	
	switch(arg.nodeType){
	case 1: //Element Node
		switch(arg.tagName.toLowerCase()){
		case 'table':
		case 'tr':
			var nArray=new Array();
			var nAssoc=new Object();
			for(var c in arg.childNodes){
				tmp=parseChildArg(arg.childNodes[c]);
				if(tmp!=null){
					if(arg.childNodes[c].name) nAssoc[arg.childNodes[c].name]=tmp;
					else nArray.push(tmp);
				}
			}
			
			if(nArray.length && assocLength(nAssoc))
				for(var c in nArray)
					nAssoc[c]=nArray[c];
			
			if(nArray.length==1)
				for(var c in nArray)
					return nArray[c];
			
			if(assocLength(nAssoc)) return nAssoc;
			return nArray;
		case 'tbody':
		case 'td':
			for(var c in arg.childNodes){
				tmp=parseChildArg(arg.childNodes[c]);
				if(tmp) return tmp;
			}
			return null;
		default:
			return null;
		}
	case 3: //Text Node
		if(arg.nodeValue.match(/^\s*$/)) return null;
		return arg.nodeValue.trim();
	}
}

function getChildArgs(obj,argObj){
	funcs.push('getChildArgs');
	var str='';
	for(var c in obj.element.childNodes)
		if(obj && obj.element && obj.element.childNodes[c] && obj.element.childNodes[c].nodeType==1 && 
								  obj.element.childNodes[c].tagName && 
								  obj.element.childNodes[c].tagName.toLowerCase()=='table' && 
								  obj.element.childNodes[c].className && 
								  obj.element.childNodes[c].className.toLowerCase()=='childarg' && 
								  obj.element.childNodes[c].getAttribute('name')){
			obj.element.childNodes[c].style.display="none";
			obj.element.childNodes[c].style.visibility="hidden";
			obj[obj.element.childNodes[c].getAttribute('name')]=parseChildArg(obj.element.childNodes[c]);
		}
	/*else{
			if(obj.element.childNodes[c].tagName){
				str+=obj.element.childNodes[c].tagName+" "+(obj.element.childNodes[c].nodeType==1 ? 1 : 0) +" "+
					  (obj.element.childNodes[c].tagName ? 1 : 0)  +" "+
					  (obj.element.childNodes[c].tagName.toLowerCase()=='table' ? 1 : 0)  +" "+
					  (obj.element.childNodes[c].className ? 1 : 0)  +" "+
					  (obj.element.childNodes[c].className.toLowerCase()=='childarg' ? 1 : 0)  +" "+
					  (obj.element.childNodes[c].getAttribute('name') ? 1 : 0)+" "+
					  obj.element.childNodes[c].nodeType;
			}
			
			//str+=obj.element.childNodes[c].nodeType+" "+obj.element.childNodes[c].tagName+" "+obj.element.childNodes[c].className+" "+(obj.element.childNodes[c].getAttribute?obj.element.childNodes[c].getAttribute('name'):'')+"\n\n";
		}
	
	alert(str);*/
funcs.pop();
}

function elemTreeToString(node,depth){
	window.status="classes.js";
	funcs.push('elemTreeToString');
	if(!node || !node.tagName) return '';
	var str=node.tagName.toLowerCase()+(node.id?"#"+node.id:'')+(node.name?"&"+node.name:'')+(node.className? "."+node.className:'');
	for(var c in node.childNodes)
		if(tmp=elemTreeToString(node.childNodes[c],depth+1)!=''){
			str+="\n";
			for(var i=0;i<=(depth||0);i++)
				str+="  ";
			str+=tmp;
		}
	return str;
funcs.pop();
}

function getElementsByStyleClass(className, baseNode) {
	funcs.push('getElementsByStyleClass');
	allelem=findAllChildren(baseNode) || document.all || document.getElementsByTagName('*');
	var elements = new Array();
	var str, strarray;
	continuealerts=true;
	for (var e = 0; e < allelem.length; e++){
		if (allelem[e].className){
			strarray=allelem[e].className.split(/\s/);
			for (str in strarray)
				if(strarray[str].toLowerCase()==className.toLowerCase())
					elements[elements.length] = allelem[e];
		}
	}
	funcs.pop();
	return elements;
}

function vgInit(baseNode){
	funcs.push('vgInit');
	var className, elemList, elem, inst;
	for(className in vgLib)
		if(elemList=getElementsByStyleClass(className,baseNode)){
			for(elem in elemList){
//				try{
					inst=new vgClass(elemList[elem],className);
	/*			}catch(err){
					displayError('Class Constructor ' + className,err);	
				}
		*/	}
		}
	funcs.pop();
}

function vgClass(element,className,argObj){
	funcs.push('vgClass');
	if(!vgLib[className]){
		alert("VGLib class "+className + " does not exist!");
		return null;
	}
	vgLib[className].elements.push(element);
	var nObj=element[className]=this;
	nObj.getArg=getArg;
	nObj.vgClassName=className;
	nObj.element=element;
	
	for(varName in vgLib[className].defaults)
		nObj[varName]=element.getAttribute(varName)||vgLib[className].defaults[varName];
	
	getChildArgs(nObj);
	
	for(varName in argObj) nObj[varName]=argObj[varName];
	
	for(varName in vgLib[className].requires)
		if(!nObj[vgLib[className].requires[varName]] || nObj[vgLib[className].requires[varName]].match(/^\s*$/)){
			if(element.id) alert("Missing attribute "+vgLib[className].requires[varName]+" for "+className+" with ID of " + element.id);
			else if(element.name) alert("Missing attribute "+vgLib[className].requires[varName]+" for "+className+" named " + element.name);
			else alert("Missing attribute "+vgLib[className].requires[varName]+" for "+className);
			nObj.vgClassName=null;
			return null;
		}
	
	this.constructor=vgLib[className].constructor;
	nObj.vgClassName=className;
	nObj.element=element;
	
	this.constructor();
	funcs.pop();
}

function registerClassConstructor(className,classConstructor)
{
	funcs.push('registerClassConstructor');
	vgLib[className]=new Object();
	vgLib[className].defaults=new Object();
	vgLib[className].elements=new Array();
	vgLib[className].requires=new Array();
	vgLib[className].constructor=classConstructor;
	funcs.pop();
}

function setClassDefaults(className,defObj){
	funcs.push('setClassDefaults');
	for(var varName in defObj)
		vgLib[className].defaults[varName]=defObj[varName];	
funcs.pop();
}

function setClassRequires(className, defArray){
	funcs.push('setClassRequires');
	for(var varCount in defArray)
		vgLib[className].requires.push(defArray[varCount]);
funcs.pop();
}

function displayError(where,err){
	alert("An error occurred at \n" + where+"\n"+
		  "\n in function: \n"+funcs);
}

function initMain(){
	funcs.push('initMain');
/*	function display(){
		funcs.push('display');
		var jsLoad=document.getElementById('jsLoad');
		if(jsLoad) jsLoad.style.visibility='collapse';
		document.getElementById('wrapper').style.visibility='visible';
	}
	window.setTimeout(display,500);*/
//	try{
		var jsLoad=document.getElementById('jsLoad');
		if(jsLoad) jsLoad.style.display='none';
		if(document.getElementById('wrapper'))
			document.getElementById('wrapper').style.visibility='visible';
	/*}catch(err){
		displayError('Javascript Check',err);
	}*/
	vgInit();
}

window.onload=initMain;