// SpryPagedView.js - version 0.7 - Spry Pre-Release 1.6 // // Copyright (c) 2007. Adobe Systems Incorporated. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Adobe Systems Incorporated nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. var Spry;if(!Spry)Spry={};if(!Spry.Data)Spry.Data={};Spry.Data.PagedView=function(ds,options) {Spry.Data.DataSet.call(this);this.ds=ds;this.pageSize=10;this.pageOffset=0;this.forceFullPages=false;this.pageFirstItemOffset=0;this.useZeroBasedIndexes=false;this.setCurrentRowOnPageChange=false;Spry.Utils.setOptions(this,options);this.adjustmentValue=1;if(!this.useZeroBasedIndexes) this.adjustmentValue=0;this.pageStop=this.pageOffset+this.pageSize;this.ds.addObserver(this);this.preProcessData();if(this.pageSize>0) this.filter(this.getFilterFunc());};Spry.Data.PagedView.prototype=new Spry.Data.DataSet();Spry.Data.PagedView.prototype.constructor=Spry.Data.PagedView;Spry.Data.PagedView.prototype.setCurrentRow=function(rowID) {if(this.ds) this.ds.setCurrentRow(rowID);};Spry.Data.PagedView.prototype.setCurrentRowNumber=function(rowNumber) {if(this.ds) this.ds.setCurrentRowNumber(rowNumber);};Spry.Data.PagedView.prototype.sort=function(columnNames,sortOrder) {if(!columnNames) return;if(typeof columnNames=="string") columnNames=[columnNames,"ds_RowID"];else if(columnNames.length<2&&columnNames[0]!="ds_RowID") columnNames.push("ds_RowID");if(!sortOrder) sortOrder="toggle";if(sortOrder=="toggle") {if(this.lastSortColumns.length>0&&this.lastSortColumns[0]==columnNames[0]&&this.lastSortOrder=="ascending") sortOrder="descending";else sortOrder="ascending";} var nData={oldSortColumns:this.lastSortColumns,oldSortOrder:this.lastSortOrder,newSortColumns:columnNames,newSortOrder:sortOrder};this.notifyObservers("onPreSort",nData);this.disableNotifications();Spry.Data.DataSet.prototype.sort.call(this,columnNames,sortOrder);this.updatePagerColumns();this.firstPage();this.enableNotifications();this.notifyObservers("onPostSort",nData);};Spry.Data.PagedView.prototype.loadData=function() {if(!this.ds||this.ds.getLoadDataRequestIsPending()) return;if(!this.ds.getDataWasLoaded()) {this.ds.loadData();return;} Spry.Data.DataSet.prototype.loadData.call(this);};Spry.Data.PagedView.prototype.onDataChanged=function(notifier,data) {this.setPageOffset(0);this.preProcessData();};Spry.Data.PagedView.prototype.onCurrentRowChanged=function(notifier,data) {var self=this;setTimeout(function(){self.notifyObservers("onCurrentRowChanged",data);},0);};Spry.Data.PagedView.prototype.onPostSort=Spry.Data.PagedView.prototype.onDataChanged;Spry.Data.PagedView.prototype.updatePagerColumns=function() {var rows=this.getData(true);if(!rows||rows.length<1) return;var numRows=rows.length;var pageSize=(this.pageSize>0)?this.pageSize:numRows;var firstItem=1;var lastItem=firstItem+pageSize-1;lastItem=(lastItemnumRows?numRows:lastItem);var pageNum=1;var pageCount=parseInt((numRows+pageSize-1)/pageSize);var pageItemCount=Math.min(numRows,pageSize);for(var i=0;ilastItem) {firstItem=itemIndex;lastItem=firstItem+this.pageSize-1;lastItem=(lastItem>numRows)?numRows:lastItem;pageItemCount=Math.min(lastItem-firstItem+1,pageSize);++pageNum;} var row=rows[i];if(row) {row.ds_PageNumber=pageNum;row.ds_PageSize=this.pageSize;row.ds_PageItemRowNumber=i;row.ds_PageItemNumber=itemIndex;row.ds_PageFirstItemNumber=firstItem;row.ds_PageLastItemNumber=lastItem;row.ds_PageItemCount=pageItemCount;row.ds_PageCount=pageCount;row.ds_PageTotalItemCount=numRows;}}};Spry.Data.PagedView.prototype.preProcessData=function() {if(!this.ds||!this.ds.getDataWasLoaded()) return;this.notifyObservers("onPreLoad");this.unfilteredData=null;this.data=[];this.dataHash={};var rows=this.ds.getData();if(rows) {var numRows=rows.length;for(var i=0;i0) this.curRowID=rows[0].ds_RowID;this.updatePagerColumns();} this.loadData();};Spry.Data.PagedView.prototype.getFilterFunc=function() {var self=this;return function(ds,row,rowNumber){if(rowNumber=self.pageStop) return null;return row;};};Spry.Data.PagedView.prototype.setPageOffset=function(offset) {var numRows=this.getData(true).length;this.pageFirstItemOffset=(offset<0)?0:offset;if(this.forceFullPages&&offset>(numRows-this.pageSize)) offset=numRows-this.pageSize;if(offset<0) offset=0;this.pageOffset=offset;this.pageStop=offset+this.pageSize;};Spry.Data.PagedView.prototype.filterDataSet=function(offset) {if(this.pageSize<1) return;this.setPageOffset(offset);var rows=this.getData(true);if(rows&&rows.length&&rows[this.pageFirstItemOffset]) this.curRowID=rows[this.pageFirstItemOffset].ds_RowID;if(this.setCurrentRowOnPageChange) this.ds.setCurrentRow(this.curRowID);this.filter(this.getFilterFunc());};Spry.Data.PagedView.prototype.getPageCount=function() {return parseInt((this.getData(true).length+this.pageSize-1)/this.pageSize);};Spry.Data.PagedView.prototype.getCurrentPage=function() {return parseInt((((this.pageFirstItemOffset!=this.pageOffset)?this.pageFirstItemOffset:this.pageOffset)+this.pageSize)/this.pageSize)-this.adjustmentValue;};Spry.Data.PagedView.prototype.goToPage=function(pageNum) {pageNum=parseInt(pageNum);var numPages=this.getPageCount();if((pageNum+this.adjustmentValue)<1||(pageNum+this.adjustmentValue)>numPages) return;var newOffset=(pageNum-1+this.adjustmentValue)*this.pageSize;this.filterDataSet(newOffset);};Spry.Data.PagedView.prototype.goToPageContainingRowID=function(rowID) {this.goToPageContainingRowNumber(this.getRowNumber(this.getRowByID(rowID),true));};Spry.Data.PagedView.prototype.goToPageContainingRowNumber=function(rowNumber) {this.goToPage(this.getPageForRowNumber(rowNumber));};Spry.Data.PagedView.prototype.goToPageContainingItemNumber=function(itemNumber) {this.goToPageContainingRowNumber(itemNumber-1);};Spry.Data.PagedView.prototype.firstPage=function() {this.goToPage(1-this.adjustmentValue);};Spry.Data.PagedView.prototype.lastPage=function() {this.goToPage(this.getPageCount()-this.adjustmentValue);};Spry.Data.PagedView.prototype.previousPage=function() {this.goToPage(this.getCurrentPage()-1);};Spry.Data.PagedView.prototype.nextPage=function() {this.goToPage(this.getCurrentPage()+1);};Spry.Data.PagedView.prototype.getPageForRowID=function(rowID) {return this.getPageForRowNumber(this.getRowNumber(this.getRowByID(rowID),true));};Spry.Data.PagedView.prototype.getPageForRowNumber=function(rowNumber) {return parseInt(rowNumber/this.pageSize)+1-this.adjustmentValue;};Spry.Data.PagedView.prototype.getPageForItemNumber=function(itemNumber) {return this.getPageForRowNumber(itemNumber-1);};Spry.Data.PagedView.prototype.getPageSize=function() {return this.pageSize;};Spry.Data.PagedView.prototype.setPageSize=function(pageSize) {if(this.pageSize==pageSize) return;if(pageSize<1) {this.pageSize=0;this.setPageOffset(0);this.updatePagerColumns();this.filter(null);} else if(this.pageSize<1) {this.pageSize=pageSize;this.setPageOffset(0);this.updatePagerColumns();this.filterDataSet(this.pageOffset);} else {this.pageSize=pageSize;this.updatePagerColumns();this.goToPage(this.getPageForRowNumber(this.pageFirstItemOffset));}};Spry.Data.PagedView.prototype.getPagingInfo=function() {return new Spry.Data.PagedView.PagingInfo(this);};Spry.Data.PagedView.PagingInfo=function(pagedView) {Spry.Data.DataSet.call(this);this.pagedView=pagedView;pagedView.addObserver(this);};Spry.Data.PagedView.PagingInfo.prototype=new Spry.Data.DataSet();Spry.Data.PagedView.PagingInfo.prototype.constructor=Spry.Data.PagedView.PagingInfo;Spry.Data.PagedView.PagingInfo.prototype.onDataChanged=function(notifier,data) {this.extractInfo();};Spry.Data.PagedView.PagingInfo.prototype.onPostSort=Spry.Data.PagedView.PagingInfo.prototype.onDataChanged;Spry.Data.PagedView.PagingInfo.prototype.extractInfo=function() {var pv=this.pagedView;if(!pv||!pv.getDataWasLoaded()) return;this.notifyObservers("onPreLoad");this.unfilteredData=null;this.data=[];this.dataHash={};var rows=pv.getData(true);if(rows) {var numRows=rows.length;var numPages=pv.getPageCount();var i=0;var id=0;while(i0) {var self=this;var func=function(notificationType,notifier,data){if(notificationType!="onPostLoad") return;self.removeObserver(func);self.setCurrentRowNumber(pv.getCurrentPage()-(pv.useZeroBasedIndexes?0:1));};this.addObserver(func);}} this.loadData();};