/* XhtmlAjaxDocuments
Version 4.0 Copyright 1994-2007 NuView Systems, Inc.
$Id: XhtmlAjaxDocuments.js,v 1.20 2007/05/09 19:57:08 randy Exp $
*/
/**
 * NuControls Object
 */
function NuControls() {
	this._iLoadStatus;
	this._hDatasets = {};
	/**
	 * shutdown
	 */
	this.shutdown = function () {
		var v_i;
		var v_iCnt;
		var v_sCtlName;
		var v_sKey;
		var v_aRows;
		var v_hControls;
		var v_ctl;
		if (this._hDatasets) {
			for (v_sKey in this._hDatasets) {
				v_aRows = this._hDatasets[v_sKey];
				delete this._hDatasets[v_sKey];
				if (v_aRows) {
					v_iCnt = v_aRows.length;
					for (v_i = 0; v_i < v_iCnt; v_i++) {
						v_hControls = v_aRows[v_i];
						v_aRows[v_i] = null;
						if (v_hControls) {
							for (v_sCtlName in v_hControls) {
								v_ctl = v_hControls[v_sCtlName];
								delete v_hControls[v_sCtlName];
								if (!v_ctl) {
								} else if (v_ctl.shutdown) {
									v_ctl.shutdown();
									v_ctl = null;
								}
							}
							v_hControls = null;
						}
					}
					v_aRows = null;
				}
			}
			this._hDatasets = null;
			this._iLoadStatus = null;
		}
	}
	/**
	 * create
	 */
	this.create = function(prm_object, prm_parent) {
		var v_i;
		var v_iCnt;
		var v_iType;
		var v_sProp;
		var v_sbDraw;
		var v_ctl;
		switch (NuObject.getType(prm_object)) {
		case "Number":
			v_ctl = NuCtl.create(prm_object, prm_parent);
			if (v_ctl) {
				v_ctl.draw();
			}
			break;
		case "String":
			v_iType = NuCtl.getTypeByName(prm_object);
			v_ctl = NuCtl.create(v_iType, prm_parent);
			if (v_ctl) {
				v_ctl.draw();
			}
			break;
		case "Array":
			v_iCnt = prm_object.length;
			for (v_i = 0; v_i < v_iCnt; v_i++) {
				v_ctl = this.create(prm_object[v_i], prm_parent);
				this.register(v_ctl.getName(), v_ctl);
				v_ctl = null;
			}
			break;
		case "Hash":
		case "Element":
			if (!v_ctl) {
				if (prm_parent && prm_object) {
					v_ctl = NuCtl.create(prm_object, prm_parent);
				} else {
					v_ctl = NuCtl.create(prm_object);
				}
				v_ctl.draw();
				v_ctl.refresh();
				if (NuView.isTest) {
					v_ctl.test();
				}
			}
			break;
		}
		if (v_ctl) {
			this.register(v_ctl.getName(), v_ctl);
			if (this._isLoaded) {
				v_ctl.refresh();
			} else {
				v_ctl.scheduleEvent(NuEvent.c_SEVENT_ONLOAD, "refresh");
			}
		}
	}
	/**
	 * destroy
	 */
	this.destroy = function(prm_sName) {
		var v_ctl;
		v_ctl = this.get(prm_sName);
		if (v_ctl) {
			v_ctl.shutdown();
			this.set(prm_sName, null);
		}
	}
	/**
	 * get
	 */
	this.get = function(prm_sName, prm_sDataset, prm_iRow) {
		var v_Return;
		var v_iRow;
		var v_sDataset;
		var v_sId;
		var v_sName;
		var v_sPrefix;
		var v_aRows;
		var v_hControls;
		v_sName = prm_sName;
		if (!v_sName) {
			v_Return = null;
		} else {
			if ((v_sName.length > 1) && (v_sName.charAt(1) == "_")) {
				v_sPrefix = v_sName.charAt(0);
				v_sName = v_sName.substring(2);
			} else {
				v_sPrefix = "";
			}
			if (v_sName.indexOf("-") > 0) {
				v_sName = v_sName.substring(0, v_sName.indexOf("-"));
			}
			if (v_sName.indexOf("_") > 0) {
				v_sCtlName = NuStr.read(v_sName, 1, "_");
				v_sDataset = NuStr.read(v_sName, 2, "_");
				v_iRow = NuStr.read(v_sName, 3, "_");
				if (v_iRow == "") {
					v_iRow = 0;
				}
			} else {
				v_sCtlName = v_sName;
				if (prm_sDataset) {
					v_sDataset = prm_sDataset;
				} else {
					v_sDataset = "*System*";
				}
				if (prm_iRow) {
					v_iRow = prm_iRow;
				} else {
					v_iRow = 0;
				}
			}
			v_Return = null;
			v_aRows = this._hDatasets[v_sDataset];
			if (v_aRows) {
				v_hControls = v_aRows[v_iRow];
				if (v_hControls) {
					v_Return = v_hControls[v_sCtlName];
				}
			}
			if (!v_Return) {
				v_sId = v_sCtlName;
				if (v_sId.indexOf("_") > 0) {
				} else if (v_sDataset == "*System*") {
				} else if (v_iRow == 0) {
					v_sId = v_sCtlName + "_" + v_sDataset;
				} else {
					v_sId = v_sCtlName + "_" + v_sDataset + "_" + v_iRow;
				}
				v_Return = NuCtl.create({id:v_sId});
				this.set(v_sId, v_Return);
				v_Return.refresh();
			}
		}
		return v_Return;
	}
	/**
	 * getList
	 */
	this.getList = function(prm_sDataset, prm_iRow) {
		var v_Return;
		var v_iRow;
		var v_sCtlName;
		var v_sDataset;
		var v_aList;
		var v_aRows;
		var v_ctl;
		var v_forNodes;
		var v_forRows;
		var v_hControls;
		var v_hDatasets;
		var v_node;
		switch (this._iLoadStatus) {
		case NuControls.c_SSTATUS_REGISTERED:
		case NuControls.c_SSTATUS_LOADED:
			break;
		default:
			v_forNodes = new NuForEach(document.forms[0].elements);
			while (v_forNodes.next()) {
				v_node = v_forNodes.get();
				v_sCtlName = NuElement.getName(v_node);
				if (!v_sCtlName) {
				} else if (v_sCtlName.length < 2) {
				} else if (v_sCtlName.charAt(1) != '_') {
				} else if (v_sCtlName.charAt(0) == 'O') {
				} else {
					v_sCtlName = v_sCtlName.substring(2);
					if (!this.get(v_sCtlName)) {
						this.register(v_sCtlName);
					}
				}
			}
			this._iLoadStatus = NuControls.c_SSTATUS_REGISTERED;
			break;
		}
		v_aList = [];
		for (v_sDataset in this._hDatasets) {
			if (prm_sDataset && (v_sDataset != prm_sDataset)) {
			} else if (prm_iRow) {
				v_aRows = this._hDatasets[v_sDataset];
				if (v_aRows) {
					v_hControls = v_aRows[prm_iRow];
					if (v_hControls) {
						for (v_sCtlName in v_hControls) {
							v_ctl = v_hControls[v_sCtlName];
							if (!v_ctl) {
								v_ctl = this.get(v_sCtlName, v_sDataset, prm_iRow);
							}
							if (v_ctl) {
								v_aList.push(v_ctl);
							}
						}
					}
				}
			} else {
				v_forRows = new NuForEach(this._hDatasets[v_sDataset]);
				while (v_forRows.next()) {
					v_iRow = v_forRows.getIndex();
					v_hControls = v_forRows.get();
					if (v_hControls) {
						for (v_sCtlName in v_hControls) {
							v_ctl = v_hControls[v_sCtlName];
							if (v_ctl == "") {
								v_ctl = this.get(v_sCtlName, v_sDataset, v_iRow);
							}
							if (v_ctl) {
								v_aList.push(v_ctl);
							}
						}
					}
				}
			}
		}
		this._iLoadStatus = NuControls.c_SSTATUS_LOADED;
		return new NuForEach(v_aList);
	}
	/**
	 * register
	 */
	this.register = function(prm_sCtlName, prm_object) {
		if (prm_object == null) {
			this.set(prm_sCtlName, "");
		} else {
			this.set(prm_sCtlName, prm_object);
		}
	}
	/**
	 * set
	 */
	this.set = function(prm_sName, prm_object, prm_sDataset, prm_iRow) {
		var v_iRow;
		var v_sCtlName;
		var v_sDataset;
		var v_sName;
		var v_aRows;
		var v_hControls;
		v_sName = prm_sName;
		if (v_sName) {
			if (v_sName.charAt(1) == "_") {
				v_sName = v_sName.substring(2);
				if (v_sName.indexOf("-") > 0) {
					v_sName = v_sName.substring(0, v_sName.indexOf("-"));
				}
			}
			if (v_sName.indexOf("_") > 0) {
				v_sCtlName = NuStr.read(v_sName, 1, "_");
				v_sDataset = NuStr.read(v_sName, 2, "_");
				v_iRow = NuStr.read(v_sName, 3, "_");
				if (v_iRow == "") {
					v_iRow = 0;
				}
			} else {
				v_sCtlName = v_sName;
				if (prm_sDataset) {
					v_sDataset = prm_sDataset;
				} else {
					v_sDataset = "*System*";
				}
				if (prm_iRow) {
					v_iRow = prm_iRow;
				} else {
					v_iRow = 0;
				}
			}
			v_aRows = this._hDatasets[v_sDataset];
			if (!v_aRows) {
				v_aRows = [];
				this._hDatasets[v_sDataset] = v_aRows;
			}
			v_hControls = v_aRows[v_iRow];
			if (!v_hControls) {
				v_hControls = {};
				v_aRows[v_iRow] = v_hControls;
			}
			if (prm_object) {
				NuHash.set(v_hControls, v_sCtlName, prm_object);
			} else {
				NuHash.remove(v_hControls, v_sCtlName);
			}
		}
	}
}
	//
	// constants
	//
	NuControls.c_SSTATUS_UNKNOWN = 0;
	NuControls.c_SSTATUS_REGISTERED = 1;
	NuControls.c_SSTATUS_LOADED = 2;

/**
 * NuControlDef Object
 */
function NuControlDef() {
	this._objControl = {};
	this._objCtl = {};
	/**
	 * shutdown
	 */
	this.shutdown = function() {
		var v_sKey;
		if (this._objControl) {
			for (v_sKey in this._objControl) {
				this._objControl[v_sKey].shutdown();
				delete this._objControl[v_sKey];
			}
			this._objControl = null;
		}
		if (this._objCtl) {
			for (v_sKey in this._objCtl) {
				this._objCtl[v_sKey].shutdown();
				delete this._objCtl[v_sKey];
			}
			this._objCtl = null;
		}
	}
	function NuCtlDef() {
		this._sCtlName;
		this._oCtl;
		this.shutdown = function () {
			delete this._sCtlName;
			delete this._oCtl;
			this._sCtlName = null;
			this._oCtl = null;
		}
		this.setCtlInf = function(prm_sCtlName, prm_ObjCtl) {
			this._sCtlName = prm_sCtlName;
			this._oCtl = prm_ObjCtl; /*Saved the Ctl Definition in XML object form*/
		}
		this.getName = function() {
			return this._sCtlName;
		}
		this.getCtl = function() {
			return this._oCtl;
		}
	}
	this.initialize = function() {
		if (!this._objCtl) {
			this._objCtl = {};
		}
		if (!this._objControl) {
			this._objControl = {};
		}
	}
	this.registerFrmControl = function(prm_objControl, prm_sView) {
		this._objControl[prm_sView] = prm_objControl;
		this.setFrmCtl(prm_objControl, prm_sView);
	}
	this.setFrmCtl = function(prm_objControl, prm_sView) {
		var v_i;
		var v_iCnt;
		var v_jsonChild;
		var v_jsonControls;
		var v_sView;
		v_jsonControls = prm_objControl;
		v_sView = prm_sView;
		v_iCnt = NuXmlJson.getCount(v_jsonControls);
		this._objCtl[prm_sView] = v_iCnt; /*Keeping the Information regarding the Number of Controls in a View*/
		for (v_i = 0; v_i < v_iCnt; v_i++) {
			v_jsonChild = NuXmlJson.getChild(v_jsonControls, v_i);
			v_sTag = NuXmlJson.getTag(v_jsonChild);
			if (v_sTag) {
				switch (v_sTag) {
				case "ctl":
					this.createCtlInf(v_jsonChild, v_sView, v_i);
					break;
				}
			}
		}
	}
	this.createCtlInf = function(prm_ObjCtl, prm_sView, prm_iCtl) {
		var v_jsonCtls;
		var v_i;
		var v_iCnt;
		var v_jsonCtl;
		var v_iObjCtlCnt;
		v_jsonCtl = this._objCtl; /*this._objCtl Is an Hash for Keeping the control definitions*/
		v_jsonCtl[prm_sView + prm_iCtl /*View  + Count Concatenated*/] = new NuCtlDef();
		v_jsonCtl[prm_sView + prm_iCtl].setCtlInf(NuXmlJson.getAttribute(prm_ObjCtl, "name"), prm_ObjCtl);
	}
	this.getCtlLst = function(prm_sView) {
		var v_i;
		var v_iCnt;
		var v_sView;
		var v_objCtlName = {};
		var v_objCtlNameCnt = 0;
		v_sView = prm_sView;
		v_iCnt = this._objCtl[v_sView];
		for(v_i = 0; v_i < v_iCnt; v_i++) {
			v_objCtlName[v_objCtlNameCnt] = this._objCtl[v_sView + v_i].getName();
			v_objCtlNameCnt++;
		}
		return v_objCtlName;
	}
	this.getCtlInf = function(prm_CtlName, prm_sView) {
		var v_i;
		var v_iCnt;
		var v_objCtl;
		var v_objCtlLst = {};
		var v_objCtlPrp;
		var v_jsonControls;
		var v_sTag = "";
		var v_sView = "";
		v_objCtlPrp = this._objCtl;
		v_sView = prm_sView;
		for (v_i = 0; v_i < v_objCtlPrp[v_sView]; v_i++) {
			if (!v_objCtlPrp[v_sView + v_i]) {
			} else if (v_objCtlPrp[v_sView + v_i].getName() == prm_CtlName) {
				v_objCtl = v_objCtlPrp[v_sView + v_i].getCtl();
				break;
			}
		}
		if (v_objCtl) {
			v_objCtlLst = {};
			v_iCnt = NuXmlJson.getCount(v_objCtl);
			for (v_i = 0; v_i < v_iCnt; v_i++) {
				v_jsonChild = NuXmlJson.getChild(v_objCtl, v_i);
				v_sTag = NuXmlJson.getTag(v_jsonChild);
				if (v_sTag) {
					switch (v_sTag) {
					case "default":
					case "fld":
					case "format":
					case "lbl":
					case "len":
					case "required":
					case "tip":
					case "type":
					case "val":
					case "src":
						if (v_jsonChild.firstChild && v_jsonChild.firstChild.nodeValue) {
							v_objCtlLst[v_sTag] = v_jsonChild.firstChild.nodeValue;
						} else {
							v_objCtlLst[v_sTag] = "";
						}
						break;
					default:
						/*If Any Error Checking Code needs to be Applied could be added here*/
						break;
					}
				}
			}
			return v_objCtlLst;
		}
	}
	this.remove = function () {
		var v_objIterator;
		this._objControl = {};
		this._objCtl = {};
		if (this._objCtl) {
			while (v_objIterator in this._objCtl) {
				this._objCtl[v_objIterator].ctlDefRemove();
				delete this._objCtl[v_objIterator];
				this._objCtl[v_objIterator] = null;
			}
			delete this._objCtl;
			this._objCtl  = null;
		}
		if (this._objControl) {
			while (v_objIterator in this._objControl) {
				delete this._objControl[v_objIterator];
				this._objControl[v_objIterator] = null;
			}
			delete this._objControl;
			this._objControl = null;
		}
	}
	this.initialize();
}
/**
 * NuDatasource Object
 */
function NuDatasource() {
	this._iColCnt;
	this._iRowCurrent;
	this._sDataset;
	this._sColPath = "c";
	this._sHeaderPath = "doc/dataset/header/col";
	this._sRowPath = "doc/dataset/r";
	this._objFormParams;
	this._objHeaderIndex = {};
	this._objUrlParams = {};
	this._rowlist;
	/**
	 * addRow
	 */
	this.addRow = function() {
		var v_Return;
		v_Return = new NuDatasourceRow();
		this._rowlist.append(v_Return);
		return v_Return;
	}
	/**
	 * close
	 */
	this.close = function() {
		this._iColCnt = 0;
		this._iRowCurrent = 0;
		this._rowlist = null;
	}
	/**
	 * getColumnCount
	 */
	this.getColumnCount = function(prm_iRow) {
		return this._iColCnt;
	}
	/**
	 * getColumnNumByName
	 */
	this.getColumnNumByName = function(prm_sColName) {
		return this._objHeaderIndex[prm_sColName];
	}
	/**
	 * getColumnObject
	 */
	this.getColumnObject = function(prm_iRowNum, prm_iColNum) {
		var v_row;
		v_row = this.getRow(prm_iRowNum);
		if (v_row) {
			return v_row.getColumn(prm_iColNum);
		} else {
			return null;
		}
	}
	/**
	 * getColumnProperty
	 */
	this.getColumnProperty = function(prm_iRowNum, prm_iColNum, prm_sProp) {
		var v_col;
		var v_row;
		v_row = this.getRow(prm_iRowNum);
		if (!v_row) {
			return null;
		} else {
			v_col = v_row.getColumn(prm_iColNum);
			if (!v_col) {
				return null;
			} else {
				return v_col.getProperty(prm_sProp);
			}
		}
	}
	/**
	 * getColumnType
	 */
	this.getColumnType = function(prm_iColNum) {
		var v_col;
		v_col = this.getHeaderColumn(prm_iColNum);
		if (v_col) {
			return v_col.getType();
		} else {
			return null;
		}
	}
	/**
	 * getColumnValue
	 */
	this.getColumnValue = function(prm_iRowNum, prm_iColNum) {
		var v_col;
		v_col = this.getColumnObject(prm_iRowNum, prm_iColNum);
		if (v_col) {
			return v_col.getValue();
		} else {
			return null;
		}
	}
	/**
	 * getHeader
	 */
	this.getHeader = function() {
		return this._rowlist.getHeader();
	}
	/**
	 * getHeaderColumn
	 */
	this.getHeaderColumn = function(prm_iColumn) {
		var v_row;
		v_row = this.getHeader();
		if (v_row) {
			return v_row.getColumn(prm_iColumn);
		} else {
			return null;
		}
	}
	/**
	 * getRow
	 */
	this.getRow = function(prm_iRowNum) {
		var v_iRow;
		v_iRow = prm_iRowNum || this._iRowCurrent;
		return this._rowlist.getRow(v_iRow);
	}
	/**
	 * getRowCount
	 */
	this.getRowCount = function() {
		return this._rowlist.getRowCount();
	}
	/**
	 * getRowProperty
	 */
	this.getRowProperty = function(prm_iRowNum, prm_sProp) {
		return this.getColumnProperty(prm_iRowNum, 0, prm_sProp);
	}
	/**
	 * initialize
	 */
	this.initialize = function() {
		this._iColCnt = 0;
		this._iRowCurrent = 0;
		this._rowlist = new NuDatasourceRowList();
		this.setUrlParameter("F_ChooseView", "XML");
		this.setUrlParameter("F_CmdSend", "XML");
		this.setUrlParameter("F_Appliation", "HR");
		this.setUrlParameter("F_NavForm", NuView.Document.getFormname());
	}
	/**
	 * next
	 */
	this.next = function() {
		if (this._iRowCurrent == 0) {
			this.open();
		}
		this._iRowCurrent += 1;
		return this.getRow(this._iRowCurrent);
	}
	/**
	 * open
	 */
	this.open = function() {
		if (this._iRowCurrent == 0) {
			this._loadRows(1);
		}
	}
	/**
	 * setColumn
	 */
	this.setColumn = function(prm_iRowNum, prm_iColNum, prm_object) {
		var v_col;
		var v_row;
		v_row = this.getRow(prm_iRowNum);
		if (!v_row) {
			v_row = new NuDatasourceRow();
			this._rowlist.setRow(prm_iRowNum, v_row);
		}
		v_col = v_row.getColumn(prm_iColNum);
		if (!v_col) {
			v_col = new NuDatasourceCol();
			v_row.setColumn(prm_iColNum, v_col);
		}
		if (prm_object == "Blank") {
			v_col.loadValue(null);
		} else {
			v_col.loadValue(prm_object);
		}
		if (prm_iColNum > this._iColCnt) {
			this._iColCnt = prm_iColNum;
		}
	}
	/**
	 * setColumnProperty
	 */
	this.setColumnProperty = function(prm_iRowNum, prm_iColNum, prm_sProp, prm_object) {
		var v_col;
		var v_row;
		var v_objVal;
		v_row = this.getRow(prm_iRowNum);
		if (!v_row) {
			v_row = new NuDatasourceRow();
			this._rowlist.setRow(prm_iRowNum, v_row);
		}
		v_col = v_row.getColumn(prm_iColNum);
		if (!v_col) {
			v_col = new NuDatasourceCol();
			v_row.setColumn(prm_iColNum, v_col);
		}
		if (prm_sProp == NuCtl.c_SPROP_SPAN) {
			v_objVal = parseInt(prm_object);
			v_col.setProperty(prm_sProp, v_objVal);
			if ((prm_iColNum + v_objVal - 1) > this._iColCnt) {
				this._iColCnt = prm_iColNum + v_objVal - 1;
			}
		} else {
			v_col.setProperty(prm_sProp, prm_object);
			if (prm_iColNum > this._iColCnt) {
				this._iColCnt = prm_iColNum;
			}
		}
	}
	/**
	 * setFormParameter
	 */
	this.setFormParameter = function(prm_sParameter, prm_sValue) {
		if (!this._objFormParams) {
			this._objFormParams = {};
		}
		this._objFormParams[prm_sParameter] = prm_sValue;
	}
	/**
	 * setName
	 */
	this.setName = function(prm_sDataset) {
		this._sDataset = prm_sDataset;
	}
	/**
	 * setRowProperty
	 */
	this.setRowProperty = function(prm_iRowNum, prm_sProp, prm_object) {
		this.setColumnProperty(prm_iRowNum, 0, prm_sProp, prm_object);
	}
	/**
	 * setUrlParameter
	 */
	this.setUrlParameter = function(prm_sParameter, prm_sValue) {
		if (!this._objUrlParams) {
			this._objUrlParams = {};
		}
		this._objUrlParams[prm_sParameter] = prm_sValue;
	}
	/**
	 * toXml
	 */
	this.toXml = function(prm_sbDisplay) {
		var v_Return;
		v_Return = prm_sbDisplay || new StringBuffer();
		v_Return.append("<dataset");
		v_Return.append(" name=\"");
		v_Return.append(this._sDataset);
		v_Return.append("\">");
		this.getRow(1);
		this._rowlist.toXml(v_sbBuffer);
		v_Return.append("\n</dataset>");
		return v_Return;
	}
	/**
	 * _loadRows
	 */
	this._loadRows = function(prm_iRowNum) {
		var v_Return;
		var v_iCnt;
		var v_iColIdx;
		var v_iI;
		var v_iRowIdx;
		var v_iRowNum;
		var v_sMainTable;
		var v_sTag;
		var v_ajax;
		var v_col;
		var v_foreachCol;
		var v_foreachRow;
		var v_jsonChild;
		var v_nodeAttrib;
		var v_row;
		var v_rowlist;
		var v_stkiC;
		var v_stkiRowCnt;
		var v_stkiColCnt;
		var v_stkoRowLst;
		var v_stkoR;
		var v_xml;
		var v_xmlRow;
		v_Return = false;
		v_iRowNum = prm_iRowNum || 1;
		if (this._rowlist.getRow(v_iRowNum)) {
			v_Return = true;
		} else if (!this._sDataset) {
		} else {
			if (!NuView.Document.getDataset(this._sDataset)) {
				v_ajax = new NuAjax();
				this.setFormParameter("F_Dataset", this._sDataset);
				this.setFormParameter("F_NavPfind", NuElement.getValueById("F_NavPfind"));
				v_ajax.openRequest(NuView.BaseUrl, this._objUrlParams, this._objFormParams);
				v_xml = v_ajax.getResultXml();
				if (!v_xml) {
					this._rowlist.setRow(v_iRowNum, []);
				} else {
					v_foreachCol = new NuForEach();
					v_foreachRow = new NuForEach();
					if (!this._rowlist.getHeader()) {
						v_sMainTable = NuElement.getContentByXpath(v_xml, "maintable");
						v_aRowList = NuElement.getByXpath(v_xml, this._sHeaderPath);
						this._objHeaderIndex = {};
						v_row = new NuDatasourceRow();
						this._rowlist.setHeader(v_row);
						v_foreachRow.setList(v_aRowList);
						v_iColIdx = 0;
						while (v_foreachRow.next()) {
							v_iColIdx = v_foreachRow.getIndex();
							v_col = new NuDatasourceCol();
							v_xmlRow = v_foreachRow.get();
							v_foreachCol.setList(NuElement.getAttributeList(v_xmlRow));
							while (v_foreachCol.next()) {
								v_node = v_foreachCol.get();
								v_col.setProperty(v_node.nodeName, v_node.nodeValue);
								if (v_node.nodeName == "name") {
									this._objHeaderIndex[v_node.nodeValue] = v_iColIdx;
								}
							}
							v_row.setColumn(v_iColIdx, v_col);
						}
					}
					v_aRowList = NuElement.getByXpath(v_xml, this._sRowPath);
					v_foreachRow.setList(v_aRowList);
					while (v_foreachRow.next()) {
						v_xmlRow = v_foreachRow.get();
						v_iRowIdx = v_foreachRow.getIndex();
						v_aRow = NuElement.getByXpath(v_xmlRow, this._sColPath);
						v_foreachCol.setList(v_aRow);
						v_row = new NuDatasourceRow();
						v_row.setRowId(NuElement.getAttribute(v_xmlRow, "id"));
						v_row.setTimestamp(NuElement.getAttribute(v_xmlRow, "dt"));
						while (v_foreachCol.next()) {
							v_col = new NuDatasourceCol();
							v_col.loadValue(NuElement.getContent(v_foreachCol.get()));
							v_row.setColumn(v_foreachCol.getIndex(), v_col);
						}
						this._rowlist.setRow(v_iRowNum + v_iRowIdx, v_row);
					}
					if (this._rowlist.getRow(v_iRowNum)) {
						v_Return = true;
					}
				}
			} else { /** To add the support for Static Datasets */
				v_xml = NuView.Document.getDataset(this._sDataset);
				if (!v_xml) {
					this._rowlist.setRow(v_iRowNum, []);
				} else {
					v_stkiColCnt = NuElement.getContentByXpath(v_xml, "cols");
					//v_stkiRowCnt = NuElement.getContentByXpath(v_xml, "cols");
					v_stkoRowLst = NuElement.getByXpath(v_xml, "r");
					v_stkiRowCnt = NuXmlJson.getCount(v_stkoRowLst);
					for (v_iRowIdx = 0; v_iRowIdx < v_stkiRowCnt; v_iRowIdx++) {
						v_row = new NuDatasourceRow();
						v_row.setTimestamp(NuDate.now());
						v_stkiC = NuElement.getByXpath(v_stkoRowLst[v_iRowIdx], "c");
						for (v_iColIdx = 0; v_iColIdx < v_stkiColCnt; v_iColIdx++) {
							v_col = new NuDatasourceCol();
							v_col.loadValue(NuElement.getContent(v_stkiC[v_iColIdx]));
							v_row.setColumn(v_iColIdx, v_col);
						}
						this._rowlist.setRow(v_iRowNum + v_iRowIdx, v_row);
					}
					if (this._rowlist.getRow(v_iRowNum)) {
						v_Return = true;
					}
				}
			}
		}
		return v_Return;
	}
	this.initialize();
}
//
// NuDatasource end
//
/**
 * NuDatasourceCol
 */
function NuDatasourceCol() {
	this._isChanged = false;
	this._proplist = {};
	/**
	 * isChanged
	 */
	this.isChanged = function() {
		return this._isChanged;
	}
	/**
	 * getName
	 */
	this.getName = function() {
		return this.getProperty(NuCtl.c_SPROP_NAME);
	}
	/**
	 * getProperty
	 */
	this.getProperty = function(prm_sProperty) {
		return this._proplist[prm_sProperty.toLowerCase()];
	}
	/**
	 * getType
	 */
	this.getType = function() {
		return this.getProperty(NuCtl.c_SPROP_TYPE);
	}
	/**
	 * getValue
	 */
	this.getValue = function() {
		return this.getProperty(NuCtl.c_SPROP_VAL);
	}
	/**
	 * loadValue
	 */
	this.loadValue = function(prm_sValue) {
		this._proplist[NuCtl.c_SPROP_VAL] = prm_sValue;
	}
	/**
	 * setName
	 */
	this.setName = function(prm_sName) {
		this.setProperty(NuCtl.c_SPROP_NAME, prm_sName);
	}
	/**
	 * setType
	 */
	this.setType = function(prm_sType, prm_sFormat) {
		var v_sType;
		v_sType = prm_sType;
		switch (prm_sType) {
		case "Label":
			v_sType = prm_sFormat;
			break;
		}
		this.setProperty(NuCtl.c_SPROP_TYPE, v_sType);
	}
	/**
	 * setProperty
	 */
	this.setProperty = function(prm_sProperty, prm_sValue) {
		var v_sProperty;
		v_sProperty = prm_sProperty.toLowerCase();
		if (v_sProperty == NuCtl.c_SPROP_VAL) {
			this.loadValue(prm_sValue);
		} else {
			this._proplist[v_sProperty] = prm_sValue;
		}
	}
	/**
	 * setValue
	 */
	this.setValue = function(prm_sValue) {
		var v_sValue;
		var v_sValueOrig;
		v_sValueOrig = this.getProperty(NuCtl.c_SPROP_VALORIG);
		if (!v_sValueOrig) {
			v_sValue = this.getValue();
			if (!v_sValue) {
				v_sValue = prm_sValue;
			}
			this.setProperty(NuCtl.c_SPROP_VALORIG, v_sValue);
			this._isChanged = true;
		} else if (v_sValueOrig == prm_sValue) {
			this._isChanged = false;
		} else {
			this._isChanged = true;
		}
		this.setProperty(NuCtl.c_SPROP_VAL, prm_sValue);
	}
	/**
	 * toXml
	 */
	this.toXml = function(prm_sbDsp) {
		var v_Return;
		var v_sProp;
		var v_sVal;
		v_Return = prm_sbDsp || new StringBuffer();
		v_Return.append('\n  <col>');
		NuHash.toXml(this._proplist, v_Return);
		v_Return.append('</col>');
		return v_Return;
	}
}
//
// NuDatasourceCol end
//
/**
 * NuDatasourceRow
 */
function NuDatasourceRow() {
	this._iRowId;
	this._dtTimestamp;
	this._sChangeStatus;
	this._hRowStats;
	this._aColumns = [];
	/**
	 * addCol
	 */
	this.addCol = function(prm_sVal) {
		var v_Return;
		v_Return = new NuDatasourceCol();
		if (prm_sVal) {
			v_Return.loadValue(prm_sVal);
		}
		this._aColumns.push(v_Return);
		return v_Return;
	}
	/**
	 * getChangeStatus
	 */
	this.getChangeStatus = function() {
		return this._sChangeStatus;
	}
	/**
	 * getColumn
	 */
	this.getColumn = function(prm_iIndex) {
		return this._aColumns[prm_iIndex - 1];
	}
	/**
	 * getColumnArray
	 */
	this.getColumnArray = function() {
		return this._aColumns;
	}
	/**
	 * getColumnCount
	 */
	this.getColumnCount = function() {
		return this._aColumns.length;
	}
	/**
	 * getRowId
	 */
	this.getRowId = function() {
		return this._iRowId;
	}
	/**
	 * getTimestamp
	 */
	this.getTimestamp = function() {
		return this._dtTimestamp;
	}
	/**
	 * getValue
	 */
	this.getValue = function(prm_iIndex) {
		var v_col;
		v_col = this.getColumn(prm_iIndex);
		if (v_col) {
			return v_col.getValue();
		} else {
			return null;
		}
	}
	/**
	 * getValueOrig
	 */
	this.getValueOrig = function(prm_iIndex) {
		var v_col;
		v_col = this.getColumn(prm_iIndex);
		if (v_col) {
			return v_col.getValueOrig();
		} else {
			return null;
		}
	}
	/**
	 * removeColumn
	 */
	this.removeColumn = function(prm_iIndex) {
		return NuArray.remove(this._aColumns, prm_iIndex - 1);
	}
	/**
	 * setChangeStatus
	 */
	this.setChangeStatus = function(prm_sChangeStatus) {
		this._sChangeStatus = prm_sChangeStatus;
	}
	/**
	 * setColumn
	 */
	this.setColumn = function(prm_iIndex, prm_col) {
		this._aColumns[prm_iIndex - 1] = prm_col;
	}
	/**
	 * setRowId
	 */
	this.setRowId = function(prm_iRowId) {
		this._iRowId = prm_iRowId;
	}
	/**
	 * setTimestamp
	 */
	this.setTimestamp = function(prm_dtTimestamp) {
		this._dtTimestamp = prm_dtTimestamp;
	}
	/**
	 * toXml
	 */
	this.toXml = function(prm_sbDsp) {
		var v_Return;
		var v_col;
		var v_foreachCol;
		v_Return = prm_sbDsp || new StringBuffer();
		v_Return.append('\n<row>');
		v_foreachCol = new NuForEach();
		v_foreachCol.setList(this._aColumns);
		while (v_foreachCol.next()) {
			v_col = v_foreachCol.get();
			v_col.toXml(v_Return);
		}
		v_Return.append('\n</row>');
		return v_Return;
	}
}
//
// NuDatasourceCol end
//
/**
 * NuDatasourceRowList
 */
function NuDatasourceRowList() {
	this._sDataset;
	this._rowHeader;
	this._aRows = [];
	/**
	 * append
	 */
	this.append = function(prm_row) {
		this._aRows.push(prm_row);
	}
	/**
	 * createHtml
	 */
	this.createHtml = function(prm_sbDisplay) {
		var v_iColNum;
		var v_iRowNum;
		var v_sChangeStatus;
		var v_sColName;
		var v_sDataset;
		var v_col;
		var v_foreachCol;
		var v_foreachRow;
		var v_row;
		var v_rowlistHeaders;
		v_rowlistHeaders = this.getHeader();
		v_foreachRow = new NuForEach(this._aRows);
		while (v_foreachRow.next()) {
			v_row = v_foreachRow.get();
			if (!v_row) {
			} else if (!v_row.getChangeStatus()) {
			} else {
				v_iRowNum = v_foreachRow.getIndex();
				v_sChangeStatus = v_row.getChangeStatus();
				prm_sbDisplay.append('<input type="HIDDEN" name="F_Id_' + v_sDataset + '_' + v_iRowNum + '" value="');
				prm_sbDisplay.append(v_row.getRowId());
				prm_sbDisplay.append('" />\n');
				prm_sbDisplay.append('<input type="HIDDEN" name="F_Dt_' + v_sDataset + '_' + v_iRowNum + '" value="');
				prm_sbDisplay.append(v_row.getTimestamp());
				prm_sbDisplay.append('" />\n');
				if (v_sChangeStatus == "Delete") {
					prm_sbDisplay.append('<input type="HIDDEN" name="F_Cmd_' + v_sDataset + '_' + v_iRowNum + '" value="Delete" />\n');
				} else {
					v_foreachCol = new NuForEach(v_rowlistHeaders.getColumnArray());
					while (v_foreachCol.next()) {
						v_sColName = v_foreachCol.get().getName();
						v_iColNum = v_foreachCol.getIndex();
						v_col = v_row.getColumn(v_iColNum);
						prm_sbDisplay.append('<input type="O_' + v_sColName + '" value="' + v_col.getValueOrig() + '" />\n');
						prm_sbDisplay.append('<input type="N_' + v_sColName + '" value="' + v_col.getValue() + '" />\n');
					}
				}
			}
		}
	}
	/**
	 * getDataset
	 */
	this.getDataset = function() {
		return this._sDataset;
	}
	/**
	 * getHeader
	 */
	this.getHeader = function() {
		return this._rowHeader;
	}
	/**
	 * getHeaderCol
	 */
	this.getHeaderCol = function(prm_iCol) {
		var v_Return;
		var v_col;
		if (this._rowHeader) {
			v_Return = this._rowHeader.getColumn(prm_iCol);
		} else {
			v_Return = null;
		}
		return v_Return;
	}
	/**
	 * getRow
	 */
	this.getRow = function(prm_iIndex) {
		return this._aRows[prm_iIndex - 1];
	}
	/**
	 * getRowArray
	 */
	this.getRowArray = function() {
		return this._aRows;
	}
	/**
	 * getRowCount
	 */
	this.getRowCount = function() {
		return this._aRows.length;
	}
	/**
	 * initialize
	 */
	this.initialize = function() {
		this._rowHeader = new NuDatasourceRow();
	}
	/**
	 * removeRow
	 */
	this.removeRow = function(prm_iIndex) {
		return NuArray.remove(this._aRows, prm_iIndex - 1);
	}
	/**
	 * setDataset
	 */
	this.setDataset = function(prm_sDataset) {
		this._sDataset = prm_sDataset;
	}
	/**
	 * setHeader
	 */
	this.setHeader = function(prm_row) {
		this._rowHeader = prm_row;
	}
	/**
	 * setRow
	 */
	this.setRow = function(prm_iIndex, prm_row) {
		this._aRows[prm_iIndex - 1] = prm_row;
	}
	/**
	 * toXml
	 */
	this.toXml = function(prm_sbDsp) {
		var v_Return;
		var v_row;
		var v_foreach;
		v_Return = prm_sbDsp || new StringBuffer();
		v_Return.append('\n<rowlist>');
		v_foreach = new NuForEach();
		v_foreach.setList(this._aRows);
		while (v_foreach.next()) {
			v_col = v_foreach.get();
			v_col.toXml(v_Return);
		}
		v_Return.append('\n</rowlist>');
		return v_Return;
	}
	this.initialize();
}
//
// NuDatasourceRow end
//
/**
 * NuDocument Object
 */
function NuDocument() {
	this.Controls = new NuControls();
	this.EditMode = "";
	this.FrmCtls = new NuControlDef();
	this.MainTable = "";
	this.Object = "";
	this.Security = new NuSecurity();
	this.Title = "";
	this.View = "";
	this._isLoaded;
	this._iUniqueId = 0;
	this._sFormname;
	this._aChangeList;
	this._sCtlPopup;
	this._aErrorList;
	this._hDatasets = {};
	this._hDatasources = {};
	this._hEvents = {};
	this._nodeRoot;
	this._objDragging;
	/**
	 * shutdown
	 */
	this.shutdown = function() {
		if (this.Controls) {
			this.Controls.shutdown();
			this.Controls = null;
		}
		if (this.FrmCtls) {
			this.FrmCtls.shutdown();
			this.FrmCtls = null;
		}
		if (this.Security) {
			this.Security.shutdown();
			this.Security = null;
		}
		this._aChangeList = null;
		this._aErrorList = null;
		this._hDatasets = null;
		this._hDatasources = null;
		this._hEvents = null;
		this._nodeRoot = null;
		this._objDragging = null;
	}
	/**
	 * about
	 */
	this.about = function() {
		alert("Form: " + this._sFormname + "\nMain Table: " + this.MainTable + "\nView: " + this.View + "\nProfile: " + NuView.User.Profile + "\nTheme: " + NuView.User.Theme);
	}
	/**
	 * action
	 */
	this.action = function(prm_sEvent) {
		var v_Return;
		var v_sAction;
		var v_sCtl;
		var v_sType;
		var v_aActionList;
		var v_ctl;
		var v_foreachCtl;
		var v_foreachEvent;
		var v_hCode;
		var v_hParams;
		var v_msgs;
		v_Return = true;
		if (v_Return) {
			switch (prm_sEvent.toLowerCase()) {
			case NuEvent.c_SEVENT_SAVE:
				v_msgs = this.validate(NuCtl.c_SPROP_REQUIRED);
				if (!v_msgs.isEmpty()) {
					v_msgs.show();
					v_Return = false;
				}
				break;
			}
		}
		if (v_Return) {
			v_aActionList = this._hEvents[prm_sEvent.toLowerCase()];
			if (v_aActionList) {
				delete this._hEvents[prm_sEvent.toLowerCase()];
				v_foreachEvent = new NuForEach(v_aActionList);
				while (v_foreachEvent.next()) {
					v_hCode = v_foreachEvent.get();
					v_ctl = this.Controls.get(v_hCode["ctl"]);
					if (v_ctl) {
						v_sAction = v_hCode["action"];
						v_hParams = v_hCode["params"];
						if (v_sAction == "refresh") {
							v_ctl.refresh();
						} else {
							v_ctl.action(v_sAction, v_hParams);
						}
					}
				}
			}
		}
		if (v_Return) {
/*
			switch (prm_sEvent.toLowerCase()) {
			case NuEvent.c_SEVENT_SUBMIT:
				this.shutdown();
				break;
			}
*/
		}
		return v_Return;
	}
	/**
	 * addError
	 */
	this.addError = function(prm_hError) {
		if (this._aErrorList) {
			this._aErrorList.push(prm_hError);
		} else {
			this._aErrorList = [prm_hError];
		}
	}
	/**
	 * addToChangeList
	 */
	this.addToChangeList = function(prm_sCtlName) {
		if (this._aChangeList) {
			this._aChangeList.push(prm_sCtlName);
		} else {
			this._aChangeList = [prm_sCtlName];
		}
	}
	/**
	 * beforeSubmit
	 */
	this.beforeSubmit = function() {
		var v_Return;
		var v_sCtl;
		var v_sRequired;
		var v_sType;
		var v_ctl;
		v_Return = true;
		for (v_sCtl in this.Controls.getList()) {
			if (v_Return) {
				v_ctl = this.Controls.get(v_sCtl);
				v_sType = v_ctl.getType();
				v_sRequired = v_ctl.getProperty(NuCtl.c_SPROP_REQUIRED);
				v_Return = v_ctl.beforeSubmit();
				if (!v_Return) {
				} else if (v_sRequired != "Yes") {
				} else if (v_ctl.getValue() == "") {
					this.addError({msg:"FldRequired", ctl:v_sCtl});
					v_Return = false;
				}
			}
		}
		return v_Return;
	}
	/**
	 * cleanup
	 */
	this.cleanup = function () {
		if (this.Controls) {
			if (this.Controls.shutdown) {
				this.Controls.shutdown();
			}
			this.Controls = null;
			this.Controls = new NuControls();
		}
		if (this.FrmCtls) {
			if (this.FrmCtls.remove) {
				this.FrmCtls.remove();
			}
			this.FrmCtls = null;
			this.FrmCtls = new NuControlDef();
		}
		if (!this.Security) {
			this.Security = new NuSecurity();
		}
	}
	/**
	 * createControl
	 */
	this.createControl = function(prm_object) {
		if (this.Controls) {
			this.Controls.create(prm_object);
		}
	}
	/**
	 * copy
	 */
	this.copy = function() {
		this.action(NuEvent.c_SEVENT_COPY);
	}
	/**
	 * debug
	 */
	this.debug = function(prm_sDebug) {
		v_ctl = this.Controls.get("Debug");
		if (v_ctl) {
			v_ctl.setValue(prm_sDebug + "\n" + (v_ctl.getValue() || ""));
		}
	}
	/**
	 * dragDrop
	 */
	this.dragDrop = function(prm_event) {
		this._objDragging = null;
	}
	/**
	 * dragMove
	 */
	this.dragMove = function(prm_event) {
		var v_iLeft;
		var v_iTop;
		var v_ctl
		var v_event;
		if (this._objDragging) {
			v_ctl = this._objDragging["ctl"];
			if (v_ctl) {
				v_event = prm_event || window.event;
				v_iLeft = this._objDragging["left"] + v_event.clientX - this._objDragging["offsetx"];
				v_iTop = this._objDragging["top"] + v_event.clientY - this._objDragging["offsety"];
				v_ctl.setStyle(NuCtl.c_SSTYLE_LEFT, v_iLeft + "px");
				v_ctl.setStyle(NuCtl.c_SSTYLE_TOP, v_iTop + "px");
			}
		}
	}
	/**
	 * dragPickup
	 */
	this.dragPickup = function(prm_ctl, prm_event) {
		var v_iLeft;
		var v_iTop;
		var v_event;
		var v_nodeRoot;
		v_event = prm_event || window.event;
		v_iTop = v_event.clientY;
		this._objDragging = {};
		this._objDragging["ctl"] = prm_ctl;
		this._objDragging["left"] = prm_ctl.getStyle(NuCtl.c_SSTYLE_LEFT);
		this._objDragging["top"] = prm_ctl.getStyle(NuCtl.c_SSTYLE_TOP);
		this._objDragging["offsetx"] = v_event.clientX;
		this._objDragging["offsety"] = v_event.clientY;
	}
	/**
	 * drawAll
	 */
	this.drawAll = function() {
		var v_ctl;
		var v_sName;
		for (v_sName in this.Controls.getList()) {
			v_ctl = this.Controls.get([v_sName]);
			if (v_ctl) {
				v_ctl.draw();
			}
		}
	}
	/**
	 * drawByFormDef
	 */
	this.drawByFormDef = function(prm_jsonFormDef) {
		var v_i;
		var v_iCnt;
		var v_sName;
		var v_sTag;
		var v_oCtlProp;
		var v_jsonBody;
		var v_jsonChild;
		var v_jsonControls;
		var v_jsonCtl;
		var v_jsonCtlCnt;
		var v_jsonCtlItr;
		var v_jsonDisplay;
		var v_jsonFormDef;
		var v_jsonView;
		var v_objEval;
		v_iCnt = NuXmlJson.getCount(prm_jsonFormDef);
		for (v_i = 0; v_i <= v_iCnt; v_i++) {
			v_jsonChild = NuXmlJson.getChild(prm_jsonFormDef, v_i);
			v_sTag = NuXmlJson.getTag(v_jsonChild);
			if (!v_sTag) {
			} else if (v_sTag != "masterprofile") {
			} else if (NuView.User.Profile == NuXmlJson.getAttribute(v_jsonChild, "name")) {
				v_jsonFormDef = v_jsonChild;
			}
		}
		if (v_jsonFormDef) {
			v_iCnt = NuXmlJson.getCount(v_jsonFormDef);
			for (v_i = 0; v_i <= v_iCnt; v_i++) {
				v_jsonChild = NuXmlJson.getChild(v_jsonFormDef, v_i);
				v_sTag = NuXmlJson.getTag(v_jsonChild);
				if (v_sTag) {
					switch (v_sTag) {
					case "dataset":
						v_sName = NuXmlJson.getAttribute(v_jsonChild, "name");
						this._hDatasets[v_sName] = v_jsonChild;
						break;
					case "event":
						v_sName = NuXmlJson.getAttribute(v_jsonChild, "name");
						this._hEvents[v_sName] = NuXmlJson.getChild(v_jsonChild, 0).nodeValue;
						v_objEval = v_sName;
						break;
					case "view":
						v_sName = NuXmlJson.getAttribute(v_jsonChild, "name");
						if (this.View == "") {
							this.View = v_sName;
							v_jsonView = v_jsonChild;
						} else if (v_sName == this.View) {
							v_jsonView = v_jsonChild;
						}
						break;
					case "properties":
						break;
					}
				}
			}
		}
		if (v_jsonView) {
			v_iCnt = NuXmlJson.getCount(v_jsonView);
			for (v_i = 0; v_i <= v_iCnt; v_i++) {
				v_jsonChild = NuXmlJson.getChild(v_jsonView, v_i);
				v_sTag = NuXmlJson.getTag(v_jsonChild);
				if (v_sTag) {
					switch (v_sTag) {
					case "controls":
						this.FrmCtls.registerFrmControl(v_jsonChild, this.View);
						v_jsonControls = v_jsonChild;
						break;
					case "display":
						v_jsonDisplay = v_jsonChild;
						break;
					}
				}
			}
		}
		if (v_jsonDisplay) {
			v_iCnt = NuXmlJson.getCount(v_jsonDisplay);
			for (v_i = 0; v_i <= v_iCnt; v_i++) {
				v_jsonChild = NuXmlJson.getChild(v_jsonDisplay, v_i);
				v_sTag = NuXmlJson.getTag(v_jsonChild);
				if (v_sTag) {
					switch (v_sTag) {
					case "title":
						break;
					case "instructions":
						break;
					case "head":
						break;
					case "toolbar":
						break;
					case "body":
						v_jsonBody = v_jsonChild;
						break;
					}
				}
			}
		}
		if (v_jsonBody) {
			v_iCnt = NuXmlJson.getCount(v_jsonBody);
			for (v_i = 0; v_i <= v_iCnt; v_i++) {
				v_jsonChild = NuXmlJson.getChild(v_jsonBody, v_i);
				v_sTag = NuXmlJson.getTag(v_jsonChild);
				if (v_sTag) {
					switch (v_sTag) {
					case "datasheet":
					case "v":
						this.Controls.create(v_jsonChild, this._nodeRoot);
						break;
					}
				}
			}
		}
		if (v_objEval) {
			eval(this._hEvents[v_objEval]);
		}
	}
	/**
	 * fireEvent - deprecated
	 */
	this.fireEvent = function(prm_sEvent) {
		return this.action(prm_sEvent);
	}
	/**
	 * getClientWidth
	 */
	this.getClientWidth = function() {
		return this._windowPositioning(
			window.innerWidth ? window.innerWidth : 0,
			document.documentElement ? document.documentElement.clientWidth : 0,
			document.body ? document.body.clientWidth : 0
		);
	}
	/**
	 * getClientHeight
	 */
	this.getClientHeight = function() {
		return this._windowPositioning(
			window.innerHeight ? window.innerHeight : 0,
			document.documentElement ? document.documentElement.clientHeight : 0,
			0
		);
	}
	/**
	 * getDataset
	 */
	this.getDataset = function(prm_sDataset) {
		return this._hDatasets[prm_sDataset];
	}
	/**
	 * getDatasource
	 */
	this.getDatasource = function(prm_sDataset) {
		return this._hDatasources[prm_sDataset];
	}
	/**
	 * getEvents
	 */
	this.getEvents = function(prm_sName) {
		var v_object;
		v_object = this.Controls.get(prm_sName);
		if (v_object) {
			return v_object.getEvents();
		} else {
			return null;
		}
	}
	/**
	 * getFormname
	 */
	this.getFormname = function() {
		if (this._sFormname) {
		} else if (window.g_sFormName) {
			this._sFormname = window.g_sFormName;
		}
		return this._sFormname;
	}
	/**
	 * getFrmCtls
	 */
	this.getFrmCtls = function() {
		if (!this.FrmCtls) {
			return false;
		} else {
			return this.FrmCtls;
		}
	}
	/**
	 * getRoot
	 */
	this.getRoot = function() {
		if (!this._nodeRoot) {
			this._nodeRoot = document.forms[0];
		}
		return this._nodeRoot;
	}
	/**
	 * getScrollLeft
	 */
	this.getScrollLeft = function() {
		return this._windowPositioning(
			window.pageXOffset ? window.pageXOffset : 0,
			document.documentElement ? document.documentElement.scrollLeft : 0,
			document.body ? document.body.scrollLeft : 0
		);
	}
	/**
	 * getScrollTop
	 */
	this.getScrollTop = function() {
		return this._windowPositioning(
			window.pageYOffset ? window.pageYOffset : 0,
			document.documentElement ? document.documentElement.scrollTop : 0,
			document.body ? document.body.scrollTop : 0
		);
	}
	/**
	 * getUniqueId
	 */
	this.getUniqueId = function() {
		this._iUniqueId += 1;
		return this._iUniqueId;
	}
	/**
	 * getView
	 */
	this.getView = function() {
		if (!this.View) {
			return false;
		} else {
			return this.View
		}
	}
	/**
	 * initialize
	 */
	this.initialize = function() {
//		this.getRoot().onmousedown = NuDocument.onMouseDown;
	}
	/**
	 * isDragging
	 */
	this.isDragging = function() {
		if (this._objDragging) {
			return true;
		} else {
			return false;
		}
	}
	/**
	 * loadXml
	 */
	this.loadXml = function(prm_sFile, prm_sPath) {
		var v_sUrl;
		var v_ajax;
		var v_xmljsonFormDef;
		if (prm_sPath) {
			v_sUrl = prm_sPath + "/" + prm_sFile;
		} else {
			v_sUrl = prm_sFile;
		}
		v_ajax = new NuAjax();
		v_ajax.openRequest(v_sUrl);
		v_xmljsonFormDef = v_ajax.getResultXml();
		this.drawByFormDef(v_xmljsonFormDef);
	}
	/**
	 * onChange
	 */
	this.onChange = function(prm_event) {
		var v_ctl;
		var v_nuevent;
		v_nuevent = new NuEvent(prm_event);
		v_ctl = v_nuevent[NuEvent.c_SPARAM_CONTROL];
		if (v_ctl) {
			v_ctl.action(NuEvent.c_SEVENT_ONCHANGE, v_nuevent);
		}
	}
	/**
	 * onClick
	 */
	this.onClick = function(prm_event) {
		var v_ctl;
		var v_nuevent;
		v_nuevent = new NuEvent(prm_event);
		v_ctl = v_nuevent[NuEvent.c_SPARAM_CONTROL];
		if (v_ctl) {
			v_ctl.onClick(v_nuevent);
		}
	}
	/**
	 * onLoad
	 */
	this.onLoad = function(prm_event) {
		if (window.g_sFormName) {
			this._sFormname = window.g_sFormName;
		}
		this.action(NuEvent.c_SEVENT_ONLOAD);
	}
	/**
	 * onMouseDown
	 */
	this.onMouseDown = function(prm_event) {
		var v_ctl;
		var v_nuevent;
		v_nuevent = new NuEvent(prm_event);
		v_ctl = v_nuevent[NuEvent.c_SPARAM_CONTROL];
		if (v_ctl) {
			v_sProp = v_ctl.getProperty(NuCtl.c_SPROP_CANDRAG);
			if (!v_sProp) {
				v_sProp = v_ctl.getProperty(NuCtl.c_SPROP_WINDOW);
			}
			if ((v_sProp) && (v_sProp == "Yes")) {
				v_ctl.setStyle("position", "absolute");
				this.dragPickup(v_ctl, prm_event);
				document.body.style["cursor"] = "move";
				document.onmousemove = NuDocument.onMouseMove;
				document.onmouseup = NuDocument.onMouseUp;
			}
		}
		v_nuevent.cancel();
		return false;
	}
	/**
	 * onMouseMove
	 */
	this.onMouseMove = function(prm_event) {
		if (this.isDragging()) {
			this.dragMove(prm_event);
		}
		NuEvent.cancel(prm_event);
		return false;
	}
	/**
	 * onMouseOver
	 */
	this.onMouseOver = function(prm_event) {
		var v_ctl;
		var v_nuevent;
		v_nuevent = new NuEvent(prm_event);
		v_ctl = v_nuevent[NuEvent.c_SPARAM_CONTROL];
		if (v_ctl) {
			v_ctl.action(NuEvent.c_SEVENT_ONMOUSEOVER, v_nuevent);
		}
	}
	/**
	 * onMouseOut
	 */
	this.onMouseOut = function(prm_event) {
		var v_ctl;
		var v_nuevent;
		v_nuevent = new NuEvent(prm_event);
		v_ctl = v_nuevent[NuEvent.c_SPARAM_CONTROL];
		if (v_ctl) {
			v_ctl.action(NuEvent.c_SEVENT_ONMOUSEOUT, v_nuevent);
		}
	}
	/**
	 * onMouseUp
	 */
	this.onMouseUp = function(prm_event) {
		if (this.isDragging()) {
			this.dragDrop(prm_event);
			document.body.style["cursor"] = "auto";
		}
		NuEvent.cancel(prm_event);
		document.onmousemove = null;
		document.onmouseup = null;
		return false;
	}
	/**
	 * popupClose
	 */
	this.popupClose = function() {
		var v_sCtlName;
		var v_nodePopup;
		if (this._objPopup) {
			v_sCtlName = this._objPopup["popupcontrol"]
			if (v_sCtlName) {
				this.Controls.destroy(v_sCtlName);
			}
			v_nodePopup = NuElement.getById("PopupMenu");
			NuElement.setHtmlById("PopupText", null);
			NuElement.setAttribute(v_nodePopup, "class", "popupHide");
			formMoveMenu(true, true);
			this._objPopup = null;
		}
	}
	/**
	 * popupOpen
	 */
	this.popupOpen = function(prm_sCtlRelative, prm_sCtlPopup, prm_sHtml) {
		var v_iHeight;
		var v_iLeft;
		var v_iTop;
		var v_iWidth;
		var v_nodeCtl;
		var v_nodePopup;
		if (this._objPopup) {
			this.popupClose();
		}
		this._objPopup = {
			popupcontrol: prm_sCtlPopup,
			relativecontrol: prm_sCtlRelative
		};
		NuElement.setHtmlById("PopupText", prm_sHtml);
		v_nodePopup = NuElement.getById("PopupMenu");
		if ((prm_sCtlRelative == null) || (prm_sCtlRelative == "")) {
			v_iLeft = ((this.getClientWidth() - ctlGetStyle("PopupMenu", "widthabs")) / 2) + this.getScrollLeft();
			v_iTop = ((this.getClientHeight() - ctlGetStyle("PopupMenu", "heightabs")) / 2) + this.getScrollTop();
			if (v_iLeft < 0) v_iLeft = 0;
			if (v_iTop < 0) v_iTop = 0;
		} else {
			v_nodeCtl = NuElement.getById(prm_sCtlRelative);
			if (v_nodeCtl) {
				v_iLeft = ctlGetStyle(prm_sCtlRelative, "leftabs");
				v_iTop = ctlGetStyle(prm_sCtlRelative, "topabs") + ctlGetStyle(prm_sCtlRelative, "heightabs");
				v_iHeight = ctlGetStyle("PopupMenu", "heightabs");
				v_iWidth = ctlGetStyle("PopupMenu", "widthabs");
				if ((v_iTop + v_iHeight) > document.body.clientHeight) {
					v_iTop = document.body.clientHeight - v_iHeight;
					if (v_iTop < 0) {
						v_iTop = 0;
					}
				}
				if ((v_iLeft + v_iWidth) > document.body.clientWidth) {
					v_iLeft = document.body.clientWidth - v_iWidth;
					if (v_iLeft < 0) {
						v_iLeft = 0;
					}
				}
			}
		}
		NuElement.setStyle(v_nodePopup, "left", v_iLeft + "px");
		NuElement.setStyle(v_nodePopup, "top", v_iTop + "px");
		formMoveMenu(false, true);
		NuElement.setAttribute(v_nodePopup, "class", "popupMenu");
	}
	/**
	 * popupRedraw
	 */
	this.popupRedraw = function(prm_sHtml) {
		NuElement.setHtmlById("PopupText", prm_sHtml);
	}
	/**
	 * save
	 */
	this.save = function() {
		return this.action(NuEvent.c_SEVENT_SAVE);
	}
	/**
	 * scheduleEvent
	 */
	this.scheduleEvent = function(prm_sEvent, prm_sCtlName, prm_sCtlAction, prm_objParams) {
		var v_aActionList;
		var v_hCode;
		v_aActionList = this._hEvents[prm_sEvent];
		if (!v_aActionList) {
			v_aActionList = [];
			this._hEvents[prm_sEvent] = v_aActionList;
		}
		v_hCode = {
			ctl: prm_sCtlName,
			action: prm_sCtlAction,
			params: prm_objParams
		};
		v_aActionList.push(v_hCode);
	}
	/**
	 * setDataset
	 */
	this.setDataset = function(prm_sDataset, prm_object) {
		this._hDatasets[prm_sDataset] = prm_object;
	}
	/**
	 * setDatasource
	 */
	this.setDatasource = function(prm_sDataset, prm_datasource) {
		this._hDatasources[prm_sDataset] = prm_datasource;
	}
	/**
	 * setLoaded
	 */
	this.setLoaded = function(prm_isLoaded) {
		this._isLoaded = prm_isLoaded;
	}
	/**
	 * setNodeRoot
	 */
	this.setNodeRoot = function(prm_node) {
		this._nodeRoot = prm_node;
	}
	/**
	 * setNodeRootById
	 */
	this.setNodeRootById = function(prm_sId) {
		var v_node;
		v_node = NuElement.getById(prm_sId);
		if (v_node) {
			this.setNodeRoot(v_node);
		}
	}
	/**
	 * setStatus
	 */
	this.setStatus = function(prm_sStatus) {
		window.status = prm_sStatus;
	}
	/**
	 * undo
	 */
	this.undo = function() {
		this.action(NuEvent.c_SEVENT_UNDO);
	}
	/**
	 * validate
	 */
	this.validate = function(prm_aProperties, prm_sDatasheet, prm_forCtlList) {
		var v_iPropIdx;
		var v_sCtlName;
		var v_sProp;
		var v_ctl;
		var v_forCtls;
		var v_forProps;
		v_Return = new NuMessages();
		v_forProps = new NuForEach(prm_aProperties);
		if (prm_forCtlList) {
			v_forCtls = prm_forCtlList;
		} else {
			v_forCtls = this.Controls.getList(prm_sDatasheet);
		}
		while (v_forCtls.next()) {
			v_ctl = v_forCtls.get();
			while (v_forProps.next()) {
				v_sProp = v_forProps.get();
				if (v_ctl.validate) {
					v_ctl.validate(v_sProp, v_Return);
				}
			}
			v_forProps.reset();
		}
		return v_Return;
	}
	//
	// private methods
	//
	/**
	 * _windowPositioning
	 */
	this._windowPositioning = function(prm_iWin, prm_iDocel, prm_iBody) {
		var v_iResult;
		v_iResult = prm_iWin ? prm_iWin : 0;
		if (prm_iDocel && (!v_iResult || (v_iResult > prm_iDocel))) {
			v_iResult = prm_iDocel;
		}
		return prm_iBody && (!v_iResult || (v_iResult > prm_iBody)) ? prm_iBody : v_iResult;
	}
	this.initialize();
}
//
// NuDocument end
//
/**
 * NuMessages
 */
function NuMessages() {
	this._aMessages;
	/**
	 * add
	 */
	this.add = function(prm_hMessage) {
		if (!this._aMessages) {
			this._aMessages = [];
		}
		this._aMessages.push(prm_hMessage);
	}
	/**
	 * isEmpty
	 */
	this.isEmpty = function() {
		if (this._aMessages) {
			return false;
		} else {
			return true;
		}
	}
	/**
	 * show
	 */
	this.show = function() {
		var v_iMsg;
		var v_sMsg;
		var v_sName;
		var v_sParams;
		var v_sVal;
		var v_aDisplay;
		var v_hMesssage;
		var v_forMsg;
		if (!this._aMessages) {
		} else if (window.msg) {
			v_forMsg = new NuForEach(this._aMessages);
			while (v_forMsg.next()) {
				v_hMessage = v_forMsg.get();
				v_sMsg = v_hMessage["msg"];
				v_sParams = "";
				for (v_sName in v_hMessage) {
					v_sVal = v_hMessage[v_sName];
					v_sParams += v_sName + "=" + v_sVal + "|";
				}
				msg(v_sMsg, v_sParams);
			}
		} else {
			v_aDisplay = [];
			v_hMesssage = {};
			v_forMsg = new NuForEach(this._aMessages);
			while (v_forMsg.next()) {
				v_iMsg = v_forMsg.getIndex();
				v_sMsg = v_forMsg.get()["msg"];
				if (!v_hMesssage[v_sMsg]) {
					v_hMesssage[v_sMsg] = true;
					v_aDisplay[v_iMsg] = NuView.User.getMessageMerged(v_forMsg.get());
				}
			}
			alert(v_aDisplay.join("\n"));
		}
	}
}
/**
 * NuSecurity
 */
function NuSecurity() {
	this._isAddAllowed = true;
	this._isChangeAllowed = true;
	this._isDeleteAllowed = true;
	/**
	 * shutdown
	 */
	this.shutdown = function () {
	}
	/**
	 * isAddAllowed
	 */
	this.isAddAllowed = function() {
		return this._isAddAllowed;
	}
	/**
	 * isChangeAllowed
	 */
	this.isChangeAllowed = function() {
		return this._isChangeAllowed;
	}
	/**
	 * isDeleteAllowed
	 */
	this.isDeleteAllowed = function() {
		return this._isDeleteAllowed;
	}
	/**
	 * setAddAllowed
	 */
	this.setAddAllowed = function(prm_sAllowed) {
		this._isAddAllowed = NuStr.toYesNo(prm_sAllowed);
	}
	/**
	 * setChangeAllowed
	 */
	this.setChangeAllowed = function(prm_sAllowed) {
		this._isChangeAllowed = NuStr.toYesNo(prm_sAllowed);
	}
	/**
	 * setDeleteAllowed
	 */
	this.setDeleteAllowed = function(prm_sAllowed) {
		this._isDeleteAllowed = NuStr.toYesNo(prm_sAllowed);
	}
}
/**
 * NuTask
 */
function NuTask() {
	this._isRecurring;
	this._iDelaySeconds;
	this._sFuncCallback;
	this._sName;
	this._objCallback;
	/**
	 * cancel
	 */
	this.cancel = function() {
	}
	/**
	 * execute
	 */
	this.execute = function() {
		NuView.TaskManager.addTask(this);
	}
	/**
	 * getCallbackFunction
	 */
	this.getCallbackFunction = function() {
		return this._sFuncCallback;
	}
	/**
	 * getCallbackObject
	 */
	this.getCallbackObject = function() {
		if (this._objCallback) {
			return this._objCallback;
		} else {
			return window;
		}
	}
	/**
	 * getDelay
	 */
	this.getDelay = function() {
		if (this._iDelaySeconds) {
			return this._iDelaySeconds;
		} else {
			return 1;
		}
	}
	/**
	 * getName
	 */
	this.getName = function() {
		return this._sName;
	}
	/**
	 * initialize
	 */
	this.initialize = function() {
	}
	/**
	 * isRecurring
	 */
	this.isRecurring = function() {
		return this._isRecurring;
	}
	/**
	 * setCallbackFunction
	 */
	this.setCallbackFunction = function(prm_sFuncCallback) {
		this._sFuncCallback = prm_sFuncCallback;
	}
	/**
	 * setCallbackObject
	 */
	this.setCallbackObject = function(prm_objCallback) {
		this._objCallback = prm_objCallback;
	}
	/**
	 * setDelay
	 */
	this.setDelay = function(prm_iDelaySeconds) {
		this._iDelaySeconds = prm_iDelaySeconds;
	}
	/**
	 * setName
	 */
	this.setName = function(prm_sName) {
		this._sName = prm_sName;
	}
	/**
	 * setRecurring
	 */
	this.setRecurring = function(prm_isRecurring) {
		this._isRecurring = prm_isRecurring;
	}
	this.initialize();
}
/**
 * NuTaskManager
 */
function NuTaskManager() {
	this._hTasks = {};
	/**
	 * addTask
	 */
	this.addTask = function(prm_task) {
		var v_iDelaySeconds;
		var v_sTask;
		var v_hTimer;
		if (prm_task) {
			v_sTask = prm_task.getName();
			if (!v_sTask) {
				v_sTask = "Unnamed";
			}
			this._hTasks[v_sTask] = prm_task;
			v_iDelaySeconds = prm_task.getDelay();
			setTimeout("NuView.TaskManager._timerCallback('" + v_sTask + "');", v_iDelaySeconds * 1000);
		}
	}
	// private methods
	/**
	 * _timerCallback
	 */
	this._timerCallback = function(prm_sTask) {
		var v_iDelaySeconds;
		var v_objCallback;
		var v_sFuncCallback;
		var v_sTask;
		var v_task;
		v_sTask = prm_sTask;
		v_task = this._hTasks[v_sTask];
		if (v_task) {
			v_objCallback = v_task.getCallbackObject();
			v_sFuncCallback = v_task.getCallbackFunction();
			if (!v_objCallback[v_sFuncCallback]) {
				alert("Task: " + v_sTask + " does not have callback function: " + v_sFuncCallback);
			} else {
				v_objCallback[v_sFuncCallback](v_task);
				if (v_task.isRecurring()) {
					v_iDelaySeconds = v_task.getDelay();
					setTimeout("NuView.TaskManager._timerCallback('" + v_sTask + "');", v_iDelaySeconds * 1000);
				}
			}
		}
	}
}
/**
 * NuUser
 */
function NuUser() {
	this.Browser = "IE";
	this.BrowserVersion = "6.0";
	this.CalendarMonths = ["January","February","March","April","May","June","July","August","September","October","November","December"];
	this.CalendarDays = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
	this.FormatDate = "mm/dd/yyyy";
	this.FormatMoney = "1,000,000,000.0000";
	this.Profile = "Df"
	this.Theme = "Df";
	this.Debug;
	this._hMessageDefinitions = {};
	/**
	 * getPathImages
	 */
	this.getPathImages = function() {
		return "Themes/" + this.Theme + "/Images";
	}
	/**
	 * getPathStyles
	 */
	this.getPathStyles = function() {
		return "Themes/" + this.Theme + "/Styles";
	}
	/**
	 * isDebug
	 */
	this.isDebug = function() {
		if ((this.Debug == null) || (this.Debug.length == 0)) {
			return false;
		} else {
			return true;
		}
	}
	/**
	 * getMessageMerged
	 */
	this.getMessageMerged = function(prm_hMessage) {
		var v_Return;
		var v_isDone;
		var v_iPos1;
		var v_iPos2;
		var v_sMsg;
		var v_sParam;
		var v_sVal;
		var v_hMessageDef;
		v_sMsg = prm_hMessage["msg"];
		if (!v_sMsg) {
			v_sMsg = "MsgCodeNotFound";
		}
		v_Return = this._hMessageDefinitions[v_sMsg];
		if (v_Return == null) {
			v_Return = "No Message Found for message code: [msg]";
		}
		v_iPos1 = 0;
		v_isDone = false;
		while (!v_isDone) {
			v_iPos2 = v_Return.indexOf("[", v_iPos1);
			if (v_iPos2 < 0) {
				v_isDone = true;
			} else {
				v_iPos1 = v_iPos2;
				v_iPos2 = v_Return.indexOf("]", v_iPos1);
				if (v_iPos2 < 0) {
					v_isDone = true;
				} else {
					v_sParam = v_Return.substring(v_iPos1 + 1, v_iPos2);
					if (v_sParam.equalsIgnoreCase("msg")) {
						v_sVal = v_sMsg;
					} else {
						v_sVal = prm_hMessage[v_sParam];
						if (!v_sVal) {
							v_sVal = v_sParam;
						}
					}
					v_Return = v_Return.substring(0, v_iPos1) + v_sVal + v_Return.substring(v_iPos2 + 1);
				}
			}
		}
		return v_Return;
	}
	/**
	 * setMessageDefinition
	 */
	this.setMessageDefinition = function(prm_sMsg, prm_sMessageText) {
		this._hMessageDefinitions[prm_sMsg] = prm_sMessageText;
	}
}
/**
 * NuView Global Object
 */
function NuView() {}
	//
	// static items
	//
	NuView.BaseUrl = "WrkFlw.asp";
	NuView.Config = {};
	/// DocumentList - holds all inactive documents
	NuView.DocumentList = {};
	/// Document - the current document
	NuView.Document = new NuDocument();
	NuView.TaskManager = new NuTaskManager();
	NuView.User = new NuUser();
	NuView.Version = 4.11;
	NuView.User.setMessageDefinition("FldRequired", "You must enter a value for <b>[ctl]</b>.");
	NuView.getFullBaseUrl = function() {
		var v_Return;
		var v_iPos;
		v_Return = window.location.href;
		if (v_Return.indexOf(".") > 0) {
			v_iPos = v_Return.lastIndexOf("/");
			v_Return = v_Return.substring(0, v_iPos);
		}
		return v_Return;
	}
	NuView.isTest = false;

