// JavaScript Document

function cls_hexDataSet() {
	var dctDataSet 	= new hexDictionary 
	var dctDSN		= new hexDictionary 
	this.root 		= ""
	
	this.dataFilePath = "library/hex/DataSet/"
	this.getXmlFileName		= "_getXMLData.asp"
	this.getSchemaFileName 	= "_getXMLschema.asp"
	this.updateXmlFileName	= "_updateXMLData.asp"
	this.insertXmlFileName	= "_insertXMLData.asp"
	this.deleteXmlFileName	= "_deleteXMLData.asp"
	
	this.init = function () {
		//hexAjax.prototype.Data = this
		//hexAjax.prototype.DataSet = this.data
		for (var objItem in dctDataSet.keys()) {
			if (dctDataSet.exists(objItem) && (!dctDataSet.lookup(objItem).global)) {
				dctDataSet.remove(objItem)
			}
		}
		//hex.events.onUnload.add("DataSetClear",this.clear)
	}

	this.data = function _data(strDataID) {
		return dctDataSet.lookup(strDataID)
	}
	
	this.add = function (strDSName) {
		var objTempDS = new dataSet
		objTempDS.ID = strDSName
		objTempDS.root = this.root
		objTempDS.dataFilePath 		= this.dataFilePath
		
		objTempDS.getXmlFileName = this.getXmlFileName		
		objTempDS.getSchemaFileName = this.getSchemaFileName 
		objTempDS.updateXmlFileName = this.updateXmlFileName
		objTempDS.insertXmlFileName = this.insertXmlFileName
		objTempDS.deleteXmlFileName = this.deleteXmlFileName
		dctDataSet.add(strDSName,objTempDS)
		objTempDS = null
	}
	
	this.addDsn = function (strName,strValue) {
		dctDSN.add(strName,strValue)
	}
	this.dsn = function (strName) {
		return (dctDSN.exists(strName)) ? dctDSN.lookup(strName) : ""
	}
	
	this.ds = function (strDSName) {
		return dctDataSet.lookup(strDSName)
	}
	function getDsn (strName) {
		return (dctDSN.exists(strName)) ? dctDSN.lookup(strName) : ""
	}
	
	this.clear = function () {
		for (var objItem in dctDataSet.keys()) {
			if (dctDataSet.exists(objItem) && (!dctDataSet.lookup(objItem).global)) {
				dctDataSet.remove(objItem)
			}
		}
	}
	
	dataSet.prototype.saveData 			=  _updateDataSet
	dataSet.prototype.processSave		= _processUpdate
	dataSet.prototype.reloadAllRows		= _reloadAllRows
	dataSet.prototype.insertData		= _insertDataSet
	dataSet.prototype.insertComplete	= _insertComplete
	dataSet.prototype.deleteData		= _deleteData
	dataSet.prototype.deleteComplete	= _deleteComplete
	
	function dataSet() {
		var intRowNum = 0
		var intColNum = 0
		
		var arrCols = new Array()
		var arrRows = new Array()
		var arrIndex = new Array()
		
		var arrCustomCols = new Array()
		
		var objDctOrder		= new hexDictionary
		var objDctFilter 	= new hexDictionary 
		var dctDataTranform = new hexDictionary
		
		var blnFilter 	= false
		var blnOrder	= false
		
		var blnUseIndex = false
		var blnDebug = false
		
		this.ID
		this.sql			= ""
		this.sqlVars		= ""
		this.sqlWhere		= null
		this.dsn			= ""
		this.dbs			= null
		this.file			= ""
		
		this.updateValue	= null
		this.updateTable	= null
		this.updateID		= null
		this.updateField	= null
		this.updateOnUpdate	= null
		this.updateReloadRow = true
		
		this.updatedRowID	= null
		
		this.insertTable	= null
		this.insertFields	= null
		this.insertValues	= null
		this.insertReturn	= 0
		this.insertReturnFields	= null
		this.insertReturnOrder	= null
		this.insertOnInsert	= null
		this.insertReloadRow = false
		
		this.deleteTable	= null
		this.deleteWhere
		this.deleteField	= null
		this.deleteValue	= null
		
		
		this.onDeleted		= null
		this.onDeletedVars	= null
		
		this.lastInsertReturn = null
		
		this.loaded			= false
		
		this.global 		= false
		
		//this.debug			= false
		
		this.debug = function debug(blnValue) {
			if (blnValue != null) {
				blnDebug = blnValue
			}else{
				return blnDebug
			}
		}
		
		
		this.onloadVars		= ""
		
		this.dataFilePath	= ""
		
		this.getXmlFileName		= "_getXMLData.asp"
		this.getSchemaFileName 	= "_getXMLschema.asp"
		this.updateXmlFileName	= "_updateXMLData.asp"
		this.insertXmlFileName	= "_insertXMLData.asp"
		this.deleteXmlFileName	= "_deleteXMLData.asp"
		
		this.getXmlPath		= function () {return this.root + this.dataFilePath + this.getXmlFileName}
		this.getSchemaPath	= function () {return this.root + this.dataFilePath + this.getSchemaFileName}
		this.updateXmlPath	= function () {return this.root + this.dataFilePath + this.updateXmlFileName}
		this.insertXmlPath 	= function () {return this.root + this.dataFilePath + this.insertXmlFileName}
		this.deleteXmlPath 	= function () {return this.root + this.dataFilePath + this.deleteXmlFileName}
		
		
		this.primaryField	= ""
		
		this.useFilter		= false
		this.useOrder		= false
		var strLastFilter	= ""
		var strLastOrder	= ""
		
		this.setFilter		= function (strFilter) {
			if (objDctFilter.exists(strFilter)){
				this.useFilter = true
				strLastFilter = strFilter
			}
		}
		this.setOrder		= function (strOrder) {
			if (objDctOrder.exists(strOrder)){
				this.useOrder = true
				strLastOrder = strOrder
			}
		}
		
		this.clearFilter	= function () {
			useFilter = false
			strLastFilter = ""
		}
		this.clearOrder		= function () {
			useOrder = false
			strLastOrder = ""
		}
		
		this.clearData		= function() {
			arrCols = new Array()
			arrRows = new Array()
			arrIndex = new Array()
		}
		
		this.rows = function(strFilter) {
			if ((strFilter != null) || (this.useFilter && strLastFilter !="")) {
				if (strFilter == null) { strFilter = strLastFilter}
				return (objDctFilter.lookup(strFilter)).length
			}else{
				return arrRows.length
			}
		}
		this.cols = function() {return arrCols.length}
		
		this.addCol = function(strName,objDefault) {
			arrCustomCols.push(new Array(strName,objDefault))
		}
		
		this.addTranform = function(strCol,objFunction) {
			if (strCol != null && objFunction != null) {
				if (dctDataTranform.exists(getColIndex(strCol))) {
					dctDataTranform[getColIndex(strCol)] = objFunction
				}else{
					dctDataTranform.add(getColIndex(strCol),objFunction)
				 }
			}
		}
		
		var objOnloaded 	= new objEvents.clsEvent()
		var objOnUpdate 	= new objEvents.clsEvent()
		var objOnFilter 	= new objEvents.clsEvent()
		var objOnOrder 		= new objEvents.clsEvent()
		var objOnRefresh	= new objEvents.clsEvent()
		var objOnRefreshRow	= new objEvents.clsEvent()
		
		this.onLoaded 		= objOnloaded.events
		this.onUpdate		= objOnUpdate.events
		this.onFilter		= objOnFilter.events
		this.onOrder		= objOnOrder.events
		this.onRefresh		= objOnRefresh.events
		this.onRefreshRow	= objOnRefreshRow.events
	
		this.addOnLoad 		= function (strRef,objFunc,strVars) {objOnloaded.add(strRef,objFunc,strVars); if (this.loaded) {objOnloaded.events();}}
		this.addOnUpdate	= function (strRef,objFunc,strVars) {objOnUpdate.add(strRef,objFunc,strVars)}
		this.addOnFilter	= function (strRef,objFunc,strVars) {objOnFilter.add(strRef,objFunc,strVars)}
		this.addOnOrder		= function (strRef,objFunc,strVars) {objOnOrder.add(strRef,objFunc,strVars)}
		this.addOnRefresh	= function (strRef,objFunc,strVars) {objOnRefresh.add(strRef,objFunc,strVars)}
		this.addOnRefreshRow= function (strRef,objFunc,strVars) {objOnRefreshRow.add(strRef,objFunc,strVars)}
		
		this.status			= 0
	
		this.update = function () {
			objOnUpdate.events()
		}
		
		this.loadData = function loadData(objXml) {
			this.clearData()
			if (objXml == null) {
				if (this.sql == "" && this.file != "") {
					var strFullFileSrc = this.file
					strFullFileSrc += (strFullFileSrc.indexOf("?")>-1) ? "&" : "?"
					strFullFileSrc += "rID=" + Math.floor(Math.random()*10000) + "&rID2=" + Math.floor(Math.random()*10000) 
					this.getHexXmlData(strFullFileSrc,this.processData)
				}else{
					var strDsn = (this.dbs != null ) ? getDsn(this.dbs) : this.dsn
					var strFullFileSrc = this.getXmlPath()
					strFullFileSrc += (strFullFileSrc.indexOf("?")>-1) ? "&" : "?"
					strFullFileSrc += "rID=" + Math.floor(Math.random()*10000) + "&rID2=" + Math.floor(Math.random()*10000) 				
					var strVars  = "sqlDsn|"  + strDsn
					strVars 	+= "|sqlFull|" + this.sql
					strVars		+= (this.sqlWhere !=null) ? " WHERE " + this.sqlWhere : ""
					//alert(strFullFileSrc)
					this.sendHexXmlData(strFullFileSrc,this.processData,strVars,"")
				}
			}else{
				processData(objXml)
			}
			objXml 		= ""
		}
		
		
		
		this.processData = function processData(objXml) {
			if (blnDebug) {
				if (document.getElementById("debugdiv")) {
					document.getElementById("debugdiv").innerHTML = objXml.responseText
				}else{
					alert(objXml.responseText)
				}
			}
			var objHeaders 	= ""
			var objRows		= ""
			var objCols		= ""

			objXml = objXml.responseXML
			
			var objStatus = objXml.getElementsByTagName("status")
			
			if (objStatus != null && (objStatus.length > 0 && (parseInt(objStatus[0].text) == 1))) {
				var objHeaders = objXml.getElementsByTagName("headers")
				var objHeader	= objHeaders[0].getElementsByTagName("col")
				for (var i = 0; i < objHeader.length; i++){
					var intColID = objHeader[i].attributes.getNamedItem("colnum").nodeValue
					if (objHeader[i].childNodes[0] != null) {
						var strColName = objHeader[i].childNodes[0].text
						arrCols[intColID] = strColName
						
					}
				}
				
				for (var i = 0; i < arrCustomCols.length; i++) {
					arrCols.push(arrCustomCols[i][0])
				}
				
				var objItemRows = objXml.getElementsByTagName("items")	
				var objItems  = objItemRows[0].getElementsByTagName("item")	
				
				for (var i = 0; i < objItems.length; i ++) {
					var arrTempCol 	= new Array()
					var intRowID	= objItems[i].attributes.getNamedItem("row").nodeValue
					objCols = objItems[i].getElementsByTagName("col")
					
					for (var n = 0; n < objCols.length; n ++) {
						var intColID = objCols[n].attributes.getNamedItem("colnum").nodeValue
						var strColValue = ""
						if (objCols[n] != null && (objCols[n].hasChildNodes && (objCols[n].childNodes[0] != null))) {
							strColValue = objCols[n].childNodes[0].text
						}
						arrTempCol[intColID] = strColValue
					}
	
					for (var n = 0; n < arrCustomCols.length; n++) {
						arrTempCol.push(arrCustomCols[n][1])
					}
					arrRows[intRowID] = arrTempCol
					arrTempCol = ""
				}
				intColID = ""
				strColName = ""
				this.status = 1
			}
			this.loaded = true
			objOnloaded.events()

			objHeaders 	= ""
			objRows		= ""
			objCols		= ""
			intColID 	= ""
			strColName 	= ""
			arrTempCol = ""
			strColValue = ""
			objXml = null
		}
		
		this.setData = function (intRow,intCol,objValue) {
			intCol = getColIndex(intCol)
			if (intRow != null && (arrRows[intRow] != null && (arrRows[intRow][intCol] != null))) {
				arrRows[intRow][intCol] = objValue
			}
		}
		
		this.getData = function (intRow,intCol,strFilter,strOrder) {
			var blnUseFilter = false
			var blnUseOrder  = false
			
			if ((strFilter != null) || (this.useFilter && strLastFilter !="")) {
				if (strFilter == null) { strFilter = strLastFilter}
				blnUseFilter = true
			}
			if (strOrder != null || (this.useOrder && strLastOrder != "")) {
				if (strOrder == null) { strOrder = strLastOrder}
				blnUseOrder = true
			}
			
			if (blnUseFilter && !blnUseOrder) {
				intRow = objDctFilter.lookup(strFilter)[intRow]
			}
			if (!blnUseFilter && blnUseOrder) {
				intRow = objDctOrder.lookup(strOrder)[intRow]
			}
			if (blnUseFilter && blnUseOrder) {
				var arrTemp = new Array()
				var arrTempOrder = objDctOrder.lookup(strOrder)
				var arrTempFilter = objDctFilter.lookup(strFilter)
				for (var i=0;i < arrTempOrder.length; i++) {
					for (var n=0; n <arrTempFilter.length; n++) {
						if (arrTempOrder[i] == arrTempFilter[n]) {
							arrTemp.push(arrTempFilter[n]);
							break
						}
					}
				}
				intRow = arrTemp[intRow]
				arrTemp = ""; arrTempOrder = ""; arrTempFilter = "";
			}
			intCol = getColIndex(intCol)
			if (arrRows != null) {
				
				return (dctDataTranform.exists(intCol)) ? dctDataTranform.lookup(intCol)(arrRows[intRow][intCol],intRow,intCol) : arrRows[intRow][intCol]
			}
			
		}
		
		function getColIndex(intCol) {
			if (isNaN(intCol)) {
				for (var i = 0; i < arrCols.length; i ++) {
					if (arrCols[i] == intCol) {
						intCol = i;
						break;
					}
				}
				if (isNaN(intCol) && intCol.indexOf(".") > -1) {	
					intCol = intCol.split(".")[1]
					for (var i = 0; i < arrCols.length; i ++) {
						if (arrCols[i] == intCol) {
							intCol = i;
							break;
						}
					}
				}
			}
			return intCol
		}
		
		this.search = function (strField,strValue,blnUseFilter) {
			intColIndex = getColIndex(strField)
			if (blnUseFilter && (strLastFilter != null && (objDctFilter.exists(strLastFilter)))) {
				var arrTempRow = objDctFilter.lookup(strLastFilter)
				for (var i=0;i<arrTempRow.length; i++){
					if (arrRows[arrTempRow[i]][intColIndex] == strValue) {
						return arrTempRow[i];
					break;
					}
				}
			}else{
			for (var i=0;i<arrRows.length; i++){
				if (arrRows[i][intColIndex] == strValue) {
					return i;
					break;
				}
			}
			}
			return -1
		}
		
		this.filter = function (strFilter,arrFilters) {
			if (arrFilters != null && (arrFilters[0] != null)) {
			var arrTempIndex = new Array()
			

			for (var i=0;i<arrRows.length; i++){
				var blnAddRow = true
				
				for (var n=0; n < arrFilters.length; n+=3){
					var intColIndex = getColIndex(arrFilters[n])
					var objValue = (dctDataTranform.exists(intColIndex)) ? dctDataTranform.lookup(intColIndex)(arrRows[i][intColIndex],i,intColIndex) : arrRows[i][intColIndex]
					switch (arrFilters[n+1]) {
						case "=":
							if ((arrFilters[n+2] == objValue) == false){blnAddRow = false}
						break
						case "<=":
							
							if (!isNaN(objValue)) {
								if ((parseInt(arrFilters[n+2]) < objValue) == false){blnAddRow = false}
							}else{
								if ((arrFilters[n+2] < objValue) == false){blnAddRow = false}
							}
						break
						case "like":
							if ((eval(arrFilters[n+2]).test(objValue)) == false) {blnAddRow = false}
						break
						case "First":
							if (arrRows[i][intColIndex] != "") {
							for (var r = 0; r < arrTempIndex.length; r++) {
								if (arrRows[arrTempIndex[r]][intColIndex] == objValue) {
									blnAddRow = false
									break;
								}
							}}else{
								blnAddRow = false
							}
							//if (this.search(arrFilters[n],arrRows[i][intColIndex],true) > -1) {blnAddRow = false}
						break
						default:
							if ((eval("'" + objValue + "' " + arrFilters[n+1] + " '" + arrFilters[n+2] + "'")) == false) {blnAddRow = false}
						break
					}
				}
				if (blnAddRow) {
					arrTempIndex.push(i)
				}
			}
			objDctFilter.add(strFilter,arrTempIndex)
			strLastFilter = strFilter
			
			}
			objOnFilter.events()
		}
	
		this.order = function (strOrderID,arrOrder) {
			var arrTempIndex = new Array()
			var intColIndex = getColIndex(arrOrder[0])
			
			
			var arrTempArray = new Array
			for (var i=0;i<arrRows.length; i++){
				arrTempArray.push(arrRows[i])
				arrTempArray[i].push(i)
			}
			sortArray = function (a,b) {
				var objX = (dctDataTranform.exists(intColIndex)) ? dctDataTranform.lookup(intColIndex)(a[intColIndex].toLowerCase()) : a[intColIndex].toLowerCase()
				var objY = (dctDataTranform.exists(intColIndex)) ? dctDataTranform.lookup(intColIndex)(b[intColIndex].toLowerCase()) : b[intColIndex].toLowerCase()			
				
				if (isNaN(objX) || isNaN(objY)) {
					
					
					var intReturn = ((objX < objY) ? -1 : ((objY < objX) ? 1 : 0))
				}else{
					var intReturn =  parseInt(objX)-parseInt(objY)
				}
				if (isNaN(intReturn)) {
					intReturn = 0
				}
				return intReturn
			}

			arrTempArray.sort(sortArray)
			if (arrOrder[1] != null) {
				if (arrOrder[1] == -1) {
					arrTempArray.reverse()
				}
			}
			for (var i=0; i < arrTempArray.length; i++) {
				arrTempIndex.push(arrTempArray[i][arrTempArray[i].length-1])
			}
			if (objDctOrder.exists(strOrderID)) {
				objDctOrder[strOrderID] = arrTempIndex
			}else{
				objDctOrder.add(strOrderID,arrTempIndex)
			}
			strLastOrder = strOrderID
			objOnOrder.events()
		}
		
		this.getHexXmlData = function getHexXmlData(strfile,objOnloadFunction,strFuncVars){
			var xmlObj = null;
			if(window.XMLHttpRequest){
				xmlObj = new XMLHttpRequest();
			} else if(window.ActiveXObject){
				xmlObj = new ActiveXObject("Microsoft.XMLHTTP");
			} else {
				return;
			}
			xmlObj.onreadystatechange = function(){		
				if(xmlObj.readyState == 4){			
					objOnloadFunction(xmlObj,strFuncVars)
				}
			}
			xmlObj.open ('GET', strfile, true);
			xmlObj.send ('');
		}
	
		this.sendHexXmlData = function sendHexXmlData(strFile,objOnloadFunction,strVars,strFuncVars) {	
			var xmlObj = null;
			if (strVars.indexOf("|")>-1) {
				var arrVars = strVars.split("|")
				strVars = ""
				for (var i =0; i < arrVars.length; i+=2) {
					if (strVars != "") { strVars += "&"}
					strVars += arrVars[i] + "=" + escape(arrVars[i+1])
				}
			}else{
				strVars = encodeURI(strVars)
			}
			
			if(window.XMLHttpRequest){
				xmlObj = new XMLHttpRequest();
			} else if(window.ActiveXObject){
				xmlObj = new ActiveXObject("MSXML2.XMLHTTP.3.0");
			} else {
				return;
			}
			xmlObj.open ('POST', strFile, true);
			xmlObj.onreadystatechange = function(){		
				if(xmlObj.readyState == 4){
					objOnloadFunction(xmlObj,strFuncVars)
				}
			}
			xmlObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');	
			xmlObj.send (strVars);
		}
	}
	function _updateDataSet() {

		var strDsn = (this.dbs != null ) ? getDsn(this.dbs) : this.dsn
		var strFullFileSrc = this.updateXmlPath()
		strFullFileSrc += (strFullFileSrc.indexOf("?")>-1) ? "&" : "?"
		strFullFileSrc += "rID=" + Math.floor(Math.random()*10000) + "&rID2=" + Math.floor(Math.random()*10000) 				
		
		var strVars  = "sqlDsn|"  + strDsn
		strVars 	+= "|sqlTable|" + this.updateTable
		strVars		+= "|sqlValues|" + this.updateValues
		strVars		+= "|sqlIDValues|" + this.updateField + "=" + this.updateID	

		if ((this.updateOnUpdate != null)) {
			this.sendHexXmlData(strFullFileSrc,this.updateOnUpdate,strVars,"")
		}else{
			/*var objTempFunc = (function (strID) {return function () {
											objData.DataSet(strID).processSave(); 
											}})(this.ID)
			this.sendHexXmlData(strFullFileSrc,objTempFunc,strVars,"")*/
		}
	}
	function _insertDataSet() {

		var strDsn = (this.dbs != null ) ? getDsn(this.dbs) : this.dsn
		var strFullFileSrc = this.insertXmlPath()
		strFullFileSrc += (strFullFileSrc.indexOf("?")>-1) ? "&" : "?"
		strFullFileSrc += "rID=" + Math.floor(Math.random()*10000) + "&rID2=" + Math.floor(Math.random()*10000) 				
		
		var strVars  = "sqlDsn|"  		+ strDsn
		strVars 	+= "|sqlTable|" 	+ this.insertTable
		strVars		+= "|sqlFields|" 	+ this.insertFields
		strVars		+= "|sqlValues|" 	+ this.insertValues
		strVars		+= "|return|" 		+ this.insertReturn
		strVars		+= "|sqlReturnFields|" + this.insertReturnFields
		strVars		+= "|sqlReturnOrder|" + this.insertReturnOrder
		
		var objTempFunc = (function (strID) {return function () {
											objData.DataSet(strID).processData(); 
											}})(this.ID)
		
		this.sendHexXmlData(strFullFileSrc,this.processData,strVars,"")
		

/*var strFullFileSrc = "library/ajax/_insertXMLData.asp" + "?rID=" + Math.floor(Math.random()*10000)
			var strVars  = "sqlDsn=<%=replace(strPMADsn,"\","\\")%>"
			strVars 	+= "&sqlFields=ProjectID,Title,Duration,ResourceTypeID"
			strVars 	+= "&sqlValues=" + intCurJobID + ",'" + strTempTitle + "',0," + intType + ""
			strVars		+= "&sqlTable=tbl_tasks"
			strVars		+= "&return=1"	
			strVars		+= "&sqlReturnFields=ID,ProjectID,Title"	*/

		

		
	}
	
	function _deleteData () {
		var strDsn = (this.dbs != null ) ? getDsn(this.dbs) : this.dsn
		var strFullFileSrc = this.deleteXmlPath()
		strFullFileSrc += (strFullFileSrc.indexOf("?")>-1) ? "&" : "?"
		strFullFileSrc += "rID=" + Math.floor(Math.random()*10000) + "&rID2=" + Math.floor(Math.random()*10000) 				
		
		var strVars  = "sqlDsn|"  		+ strDsn
		strVars 	+= "|sqlTable|" 	+ this.deleteTable
		strVars		+= "|sqlWhere|" 	+ this.deleteWhere
/*		strVars		+= "|sqlValues|" 	+ this.insertValues
		strVars		+= "|return|" 		+ this.insertReturn
		strVars		+= "|sqlReturnFields|" + this.insertReturnFields*/
		

		/*var objTempFunc = (function (strID) {return function () {
											hex.DataSet(strID).deleteComplete(); 
											}})(this.ID)*/
		this.sendHexXmlData(strFullFileSrc,this.onDeleted,strVars,"")
		

		
		//this.onDeleted		= null
		//this.deleteXmlPath 
	}
	
	function  _deleteComplete(objXml) {
		if (this.onDeleted != null) {
			this.onDeleted(this.onDeletedVars)
		}
	}
	
	function _insertComplete (objXml) {
		if (this.insertReturn == 1) {
			this.processData(objXml)
		}
		this.lastInsertReturn = ""
		if (this.insertOnInsert != null) {
			this.insertOnInsert()
		}else{
			/*var objTempFunc = (function (strID) {return function () {
							hex.DataSet(strID).processSave(); 
											}})(this.ID)
			objTempFunc()*/
		}
	}
	
	function _processUpdate(objXml) {
		if (this.updateReloadRow) {
			this.reloadAllRows()
		}		
	}
	function _reloadAllRows() {
		this.loaded = false
		this.loadData()
		if (this.updateOnUpdate !=null) {
			this.updateOnUpdate()
		}
	}
}