
Spry.Data.HTMLDataSet=function(dataSetURL,sourceElementID,dataSetOptions){this.sourceElementID=sourceElementID;this.sourceElement=null;this.sourceWasInitialized=false;this.usesExternalFile=(dataSetURL!=null)?true:false;this.firstRowAsHeaders=true;this.useColumnsAsRows=false;this.columnNames=null;this.hideDataSourceElement=true;this.rowSelector=null;this.dataSelector=null;this.removeUnbalancedRows=true;this.tableModeEnabled=true;Spry.Data.HTTPSourceDataSet.call(this,dataSetURL,dataSetOptions);};Spry.Data.HTMLDataSet.prototype=new Spry.Data.HTTPSourceDataSet();Spry.Data.HTMLDataSet.prototype.constructor=Spry.Data.HTMLDataSet;Spry.Data.HTMLDataSet.prototype.getDataRefStrings=function(){var dep=[];if(this.url)dep.push(this.url);if(typeof this.sourceElementID=="string")dep.push(this.sourceElementID);return dep;};Spry.Data.HTMLDataSet.prototype.setDisplay=function(ele,display){if(ele)ele.style.display=display;};Spry.Data.HTMLDataSet.prototype.initDataSource=function(callLoadData){if(!this.loadDependentDataSets())return;if(!this.usesExternalFile){this.setSourceElement();if(this.hideDataSourceElement)this.setDisplay(this.sourceElement,"none");}};Spry.Data.HTMLDataSet.prototype.setSourceElement=function(externalDataElement){this.sourceElement=null;if(!this.sourceElementID){if(externalDataElement)this.sourceElement=externalDataElement;else
{this.hideDataSourceElement=false;this.sourceElement=document.body;}return;}var sourceElementID=Spry.Data.Region.processDataRefString(null,this.sourceElementID,this.dataSetsForDataRefStrings);if(!this.usesExternalFile)this.sourceElement=Spry.$(sourceElementID);else
if(externalDataElement){var foundElement=false;var sources=Spry.Utils.getNodesByFunc(externalDataElement,function(node){if(foundElement)return false;if(node.nodeType!=1)return false;if(node.id&&node.id.toLowerCase()==sourceElementID.toLowerCase()){foundElement=true;return true;}});this.sourceElement=sources[0];}if(!this.sourceElement)Spry.Debug.reportError("Spry.Data.HTMLDataSet: '"+sourceElementID+"' is not a valid element ID");};Spry.Data.HTMLDataSet.prototype.getSourceElement=function(){return this.sourceElement;};Spry.Data.HTMLDataSet.prototype.getSourceElementID=function(){return this.sourceElementID;};Spry.Data.HTMLDataSet.prototype.setSourceElementID=function(sourceElementID){if(this.sourceElementID!=sourceElementID){this.sourceElementID=sourceElementID;this.recalculateDataSetDependencies();this.dataWasLoaded=false;}};Spry.Data.HTMLDataSet.prototype.getDataSelector=function(){return this.dataSelector;};Spry.Data.HTMLDataSet.prototype.setDataSelector=function(dataSelector){if(this.dataSelector!=dataSelector){this.dataSelector=dataSelector;this.dataWasLoaded=false;}};Spry.Data.HTMLDataSet.prototype.getRowSelector=function(){return this.rowSelector;};Spry.Data.HTMLDataSet.prototype.setRowSelector=function(rowSelector){if(this.rowSelector!=rowSelector){this.rowSelector=rowSelector;this.dataWasLoaded=false;}};Spry.Data.HTMLDataSet.prototype.loadDataIntoDataSet=function(rawDataDoc){var responseText=rawDataDoc;responseText=Spry.Data.HTMLDataSet.cleanupSource(responseText);var div=document.createElement("div");div.id="htmlsource"+this.internalID;div.innerHTML=responseText;this.setSourceElement(div);if(this.sourceElement){var parsedStructure=this.getDataFromSourceElement();if(parsedStructure){this.dataHash=parsedStructure.dataHash;this.data=parsedStructure.data;}}this.dataWasLoaded=true;div=null;};Spry.Data.HTMLDataSet.prototype.loadDependentDataSets=function(){if(this.hasDataRefStrings){var allDataSetsReady=true;for(var i=0;i<this.dataSetsForDataRefStrings.length;i++){var ds=this.dataSetsForDataRefStrings[i];if(ds.getLoadDataRequestIsPending())allDataSetsReady=false;else if(!ds.getDataWasLoaded()){ds.loadData();allDataSetsReady=false;}}if(!allDataSetsReady)return false;}return true;};Spry.Data.HTMLDataSet.prototype.loadData=function(){this.cancelLoadData();this.initDataSource();var self=this;if(!this.usesExternalFile){this.notifyObservers("onPreLoad");this.dataHash=new Object;this.data=new Array;this.dataWasLoaded=false;this.unfilteredData=null;this.curRowID=0;this.pendingRequest=new Object;this.pendingRequest.timer=setTimeout(function(){self.pendingRequest=null;var parsedStructure=self.getDataFromSourceElement();if(parsedStructure){self.dataHash=parsedStructure.dataHash;self.data=parsedStructure.data;}self.dataWasLoaded=true;self.disableNotifications();self.filterAndSortData();self.enableNotifications();self.notifyObservers("onPostLoad");self.notifyObservers("onDataChanged");},0);}else
{var url=Spry.Data.Region.processDataRefString(null,this.url,this.dataSetsForDataRefStrings);var postData=this.requestInfo.postData;if(postData&&(typeof postData)=="string")postData=Spry.Data.Region.processDataRefString(null,postData,this.dataSetsForDataRefStrings);this.notifyObservers("onPreLoad");this.dataHash=new Object;this.data=new Array;this.dataWasLoaded=false;this.unfilteredData=null;this.curRowID=0;var req=this.requestInfo.clone();req.url=url;req.postData=postData;this.pendingRequest=new Object;this.pendingRequest.data=Spry.Data.HTTPSourceDataSet.LoadManager.loadData(req,this,this.useCache);}};Spry.Data.HTMLDataSet.cleanupSource=function(source){source=source.replace(/<(img|script|link|frame|iframe|input)([^>]+)>/gi,function(a,b,c){return'<'+b+c.replace(/\b(src|href)\s*=/gi,function(a,b){return'spry_'+b+'=';})+'>';});return source;};Spry.Data.HTMLDataSet.undoCleanupSource=function(source){source=source.replace(/<(img|script|link|frame|iframe|input)([^>]+)>/gi,function(a,b,c){return'<'+b+c.replace(/\bspry_(src|href)\s*=/gi,function(a,b){return b+'=';})+'>';});return source;};Spry.Data.HTMLDataSet.normalizeColumnName=function(colName){if(colName){colName=colName.replace(/(?:^[\s\t]+|[\s\t]+$)/gi,"");colName=colName.replace(/<\/?([a-z]+)([^>]+)>/gi,"");colName=colName.replace(/[\s\t]+/gi,"_");}return colName;};Spry.Data.HTMLDataSet.prototype.getDataFromSourceElement=function(){if(!this.sourceElement)return null;var extractedData;var usesTable=(this.tableModeEnabled&&this.sourceElement.nodeName.toLowerCase()=="table");if(usesTable)extractedData=this.getDataFromHTMLTable();else
extractedData=this.getDataFromNestedStructure();if(!extractedData)return null;if(this.useColumnsAsRows){var flipedData=new Array;for(var rowIdx=0;rowIdx<extractedData.length;rowIdx++){var row=extractedData[rowIdx];for(var colIdx=0;colIdx<row.length;colIdx++){if(!flipedData[colIdx])flipedData[colIdx]=new Array;flipedData[colIdx][rowIdx]=row[colIdx];}}extractedData=flipedData;}var parsedStructure=new Object();parsedStructure.dataHash=new Object;parsedStructure.data=new Array;if(extractedData.length==0)return parsedStructure;var maxColumnCount=0;for(var i=0;i<extractedData.length;i++){var len=extractedData[i].length;if(maxColumnCount<len)maxColumnCount=len;}var columnNames=new Array;var firstRowOfData=extractedData[0];for(var colIdx=0;colIdx<maxColumnCount;colIdx++){if(usesTable&&this.firstRowAsHeaders)columnNames[colIdx]=Spry.Data.HTMLDataSet.normalizeColumnName(firstRowOfData[colIdx]);if(!columnNames[colIdx])columnNames[colIdx]="column"+colIdx;}if(this.columnNames&&this.columnNames.length){var numCols=(maxColumnCount<this.columnNames.length)?maxColumnCount:this.columnNames.length;for(var i=0;i<numCols;i++){if(this.columnNames[i])columnNames[i]=this.columnNames[i];}}var nextID=0;var firstDataRowIndex=(usesTable&&this.firstRowAsHeaders)?1:0;for(var rowIdx=firstDataRowIndex;rowIdx<extractedData.length;rowIdx++){var row=extractedData[rowIdx];if(this.removeUnbalancedRows&&columnNames.length!=row.length){continue;}var rowObj={};for(var colIdx=0;colIdx<columnNames.length;colIdx++){var colValue=row[colIdx];rowObj[columnNames[colIdx]]=(typeof colValue=="undefined")?"":colValue;}rowObj['ds_RowID']=nextID++;parsedStructure.dataHash[rowObj['ds_RowID']]=rowObj;parsedStructure.data.push(rowObj);}return parsedStructure;};Spry.Data.HTMLDataSet.getElementChildren=function(element){var children=[];var child=element.firstChild;while(child){if(child.nodeType==1)children.push(child);child=child.nextSibling;}return children;};Spry.Data.HTMLDataSet.prototype.getDataFromHTMLTable=function(){var tHead=this.sourceElement.tHead;var tBody=this.sourceElement.tBodies[0];var rowsHead=[];var rowsBody=[];if(tHead)rowsHead=Spry.Data.HTMLDataSet.getElementChildren(tHead);if(tBody)rowsBody=Spry.Data.HTMLDataSet.getElementChildren(tBody);var extractedData=new Array;var rows=rowsHead.concat(rowsBody);if(this.rowSelector)rows=Spry.Data.HTMLDataSet.applySelector(rows,this.rowSelector);for(var rowIdx=0;rowIdx<rows.length;rowIdx++){var row=rows[rowIdx];var dataRow;if(extractedData[rowIdx])dataRow=extractedData[rowIdx];else dataRow=new Array;var offset=0;var cells=row.cells;if(this.dataSelector)cells=Spry.Data.HTMLDataSet.applySelector(cells,this.dataSelector);for(var cellIdx=0;cellIdx<cells.length;cellIdx++){var cell=cells[cellIdx];var nextCellIndex=cellIdx+offset;while(dataRow[nextCellIndex]){offset++;nextCellIndex++;}var cellValue=Spry.Data.HTMLDataSet.undoCleanupSource(cell.innerHTML);dataRow[nextCellIndex]=cellValue;var colspan=cell.colSpan;if(colspan==0)colspan=1;var startOffset=offset;for(var offIdx=1;offIdx<colspan;offIdx++){offset++;nextCellIndex=cellIdx+offset;dataRow[nextCellIndex]=cellValue;}var rowspan=cell.rowSpan;if(rowspan==0)rowspan=1;for(var rowOffIdx=1;rowOffIdx<rowspan;rowOffIdx++){nextRowIndex=rowIdx+rowOffIdx;var nextDataRow;if(extractedData[nextRowIndex])nextDataRow=extractedData[nextRowIndex];else nextDataRow=new Array;var rowSpanCellOffset=startOffset;for(var offIdx=0;offIdx<colspan;offIdx++){nextCellIndex=cellIdx+rowSpanCellOffset;nextDataRow[nextCellIndex]=cellValue;rowSpanCellOffset++;}extractedData[nextRowIndex]=nextDataRow;}}extractedData[rowIdx]=dataRow;}return extractedData;};Spry.Data.HTMLDataSet.prototype.getDataFromNestedStructure=function(){var extractedData=new Array;if(this.sourceElementID&&!this.rowSelector&&!this.dataSelector){extractedData[0]=[Spry.Data.HTMLDataSet.undoCleanupSource(this.sourceElement.innerHTML)];return extractedData;}var self=this;var rows=[];if(!this.rowSelector)rows=[this.sourceElement];else
rows=Spry.Utils.getNodesByFunc(this.sourceElement,function(node){return Spry.Data.HTMLDataSet.evalSelector(node,self.sourceElement,self.rowSelector);});for(var rowIdx=0;rowIdx<rows.length;rowIdx++){var row=rows[rowIdx];var cells=[];if(!this.dataSelector)cells=[row];else
cells=Spry.Utils.getNodesByFunc(row,function(node){return Spry.Data.HTMLDataSet.evalSelector(node,row,self.dataSelector);});extractedData[rowIdx]=new Array;for(var cellIdx=0;cellIdx<cells.length;cellIdx++)extractedData[rowIdx][cellIdx]=Spry.Data.HTMLDataSet.undoCleanupSource(cells[cellIdx].innerHTML);}return extractedData;};Spry.Data.HTMLDataSet.applySelector=function(collection,selector,root){var newCollection=[];for(var idx=0;idx<collection.length;idx++){var node=collection[idx];if(Spry.Data.HTMLDataSet.evalSelector(node,root?root:node.parentNode,selector))newCollection.push(node);}return newCollection;};Spry.Data.HTMLDataSet.evalSelector=function(node,root,selector){if(node.nodeType!=1)return false;if(node==root)return false;var selectors=selector.split(",");for(var idx=0;idx<selectors.length;idx++){var currentSelector=selectors[idx].replace(/^\s+/,"").replace(/\s+$/,"");var tagName=null;var className=null;var id=null;var selected=true;if(currentSelector.substring(0,1)==">"){if(node.parentNode!=root)selected=false;else
currentSelector=currentSelector.substring(1).replace(/^\s+/,"");}if(selected){tagName=currentSelector.toLowerCase();if(currentSelector.indexOf(".")!=-1){var parts=currentSelector.split(".");tagName=parts[0];className=parts[1];}else if(currentSelector.indexOf("#")!=-1){var parts=currentSelector.split("#");tagName=parts[0];id=parts[1];}}if(selected&&tagName!=''&&tagName!='*')if(node.nodeName.toLowerCase()!=tagName)selected=false;if(selected&&id&&node.id!=id)selected=false;if(selected&&className&&node.className.search(new RegExp('\\b'+className+'\\b','i'))==-1)selected=false;if(selected)return true;}return false;};
