YAHOO.ext.grid.LoadableDataModel = function(dataType){
YAHOO.ext.grid.LoadableDataModel.superclass.constructor.call(this, []);
this.onLoad = new YAHOO.util.CustomEvent('load');
this.onLoadException = new YAHOO.util.CustomEvent('loadException');
this.events['load'] = this.onLoad;
this.events['beforeload'] = new YAHOO.util.CustomEvent('beforeload');
this.events['loadexception'] = this.onLoadException;
this.dataType = dataType;
this.preprocessors = [];
this.postprocessors = [];
this.loadedPage = 1;
this.remoteSort = false;
this.pageSize = 0;
this.pageUrl = null;
this.baseParams = {};
this.paramMap = {'page':'page', 'pageSize':'pageSize', 'sortColumn':'sortColumn', 'sortDir':'sortDir'};
};
YAHOO.extendX(YAHOO.ext.grid.LoadableDataModel, YAHOO.ext.grid.DefaultDataModel);
YAHOO.ext.grid.LoadableDataModel.prototype.setLoadedPage = function(pageNum, userCallback){
this.loadedPage = pageNum;
if(typeof userCallback == 'function'){
userCallback();
}
};
YAHOO.ext.grid.LoadableDataModel.prototype.isPaged = function(){
return this.pageSize > 0;
};
YAHOO.ext.grid.LoadableDataModel.prototype.getTotalRowCount = function(){
return this.totalCount || this.getRowCount();
};
YAHOO.ext.grid.LoadableDataModel.prototype.getPageSize = function(){
return this.pageSize;
};
YAHOO.ext.grid.LoadableDataModel.prototype.getTotalPages = function(){
if(this.getPageSize() == 0 || this.getTotalRowCount() == 0){
return 1;
}
return Math.ceil(this.getTotalRowCount()/this.getPageSize());
};
/** Initializes paging for this model. */
YAHOO.ext.grid.LoadableDataModel.prototype.initPaging = function(url, pageSize, baseParams){
this.pageUrl = url;
this.pageSize = pageSize;
this.remoteSort = true;
if(baseParams) this.baseParams = baseParams;
};
/** @ignore */
YAHOO.ext.grid.LoadableDataModel.prototype.createParams = function(pageNum, sortColumn, sortDir){
var params = {}, map = this.paramMap;
for(var key in this.baseParams){
if(typeof this.baseParams[key] != 'function'){
params[key] = this.baseParams[key];
}
}
params[map['page']] = pageNum;
params[map['pageSize']] = this.getPageSize();
params[map['sortColumn']] = (typeof sortColumn == 'undefined' ? '' : sortColumn);
params[map['sortDir']] = sortDir || '';
return params;
};
YAHOO.ext.grid.LoadableDataModel.prototype.loadPage = function(pageNum, callback, keepExisting){
var sort = this.getSortState();
var params = this.createParams(pageNum, sort.column, sort.direction);
this.load(this.pageUrl, params, this.setLoadedPage.createDelegate(this, [pageNum, callback]),
keepExisting ? (pageNum-1) * this.pageSize : null);
};
/** @ignore */
YAHOO.ext.grid.LoadableDataModel.prototype.applySort = function(suppressEvent){
if(!this.remoteSort){
YAHOO.ext.grid.LoadableDataModel.superclass.applySort.apply(this, arguments);
}else if(!suppressEvent){
var sort = this.getSortState();
if(sort.column){
this.fireRowsSorted(sort.column, sort.direction, true);
}
}
};
/** @ignore */
YAHOO.ext.grid.LoadableDataModel.prototype.resetPaging = function(){
this.loadedPage = 1;
};
/** Overridden sort method to use remote sorting if turned on */
YAHOO.ext.grid.LoadableDataModel.prototype.sort = function(sortInfo, columnIndex, direction, suppressEvent){
if(!this.remoteSort){
YAHOO.ext.grid.LoadableDataModel.superclass.sort.apply(this, arguments);
}else{
this.sortInfo = sortInfo;
this.sortColumn = columnIndex;
this.sortDir = direction;
var params = this.createParams(this.loadedPage, columnIndex, direction);
this.load(this.pageUrl, params, this.fireRowsSorted.createDelegate(this, [columnIndex, direction, true]));
}
}
/**
* Initiates the loading of the data from the specified URL - Failed load attempts will
* fire the {@link #onLoadException} event.
* @param {Object/String} url The url from which the data can be loaded
* @param {<i>String/Object</i>} params (optional) The parameters to pass as either a url encoded string "param1=1&param2=2" or as an object {param1: 1, param2: 2}
* @param {<i>Function</i>} callback (optional) Callback when load is complete - called with signature (this, rowCountLoaded)
* @param {<i>Number</i>} insertIndex (optional) if present, loaded data is inserted at the specified index instead of overwriting existing data
*/
YAHOO.ext.grid.LoadableDataModel.prototype.load = function(url, params, callback, insertIndex){
this.fireEvent('beforeload');
if(params && typeof params != 'string'){ var buf = [];
for(var key in params){
if(typeof params[key] != 'function'){
buf.push(encodeURIComponent(key), '=', encodeURIComponent(params[key]), '&');
}
}
delete buf[buf.length-1];
params = buf.join('');
}
var cb = {
success: this.processResponse,
failure: this.processException,
scope: this,
argument: {callback: callback, insertIndex: insertIndex}
};
var method = params ? 'POST' : 'GET';
YAHOO.util.Connect.asyncRequest(method, url, cb, params);
};
YAHOO.ext.grid.LoadableDataModel.prototype.processResponse = function(response){
var cb = response.argument.callback;
var keepExisting = (typeof response.argument.insertIndex == 'number');
var insertIndex = response.argument.insertIndex;
switch(this.dataType){
case YAHOO.ext.grid.LoadableDataModel.XML:
this.loadData(response.responseXML, cb, keepExisting, insertIndex);
break;
case YAHOO.ext.grid.LoadableDataModel.JSON:
var rtext = response.responseText;
try { while(rtext.substring(0,1) == " ") {
rtext = rtext.substring(1, rtext.length);
}
if(rtext.indexOf("{") < 0) {
throw "Invalid JSON response";
}
if(rtext.indexOf("{}") === 0) {
this.loadData({}, response.argument.callback);
return;
}
var jsonObjRaw = eval("(" + rtext + ")");
if(!jsonObjRaw) {
throw "Error evaling JSON response";
}
this.loadData(jsonObjRaw, cb, keepExisting, insertIndex);
} catch(e) {
this.fireLoadException(e, response);
if(typeof callback == 'function'){
callback(this, false);
}
}
break;
case YAHOO.ext.grid.LoadableDataModel.TEXT:
this.loadData(response.responseText, cb, keepExisting, insertIndex);
break;
};
};
YAHOO.ext.grid.LoadableDataModel.prototype.processException = function(response){
this.fireLoadException(null, response);
if(typeof response.argument.callback == 'function'){
response.argument.callback(this, false);
}
};
YAHOO.ext.grid.LoadableDataModel.prototype.fireLoadException = function(e, responseObj){
this.onLoadException.fireDirect(this, e, responseObj);
};
YAHOO.ext.grid.LoadableDataModel.prototype.fireLoadEvent = function(){
this.fireEvent('load', this.loadedPage, this.getTotalPages());
};
YAHOO.ext.grid.LoadableDataModel.prototype.addPreprocessor = function(columnIndex, fn){
this.preprocessors[columnIndex] = fn;
};
YAHOO.ext.grid.LoadableDataModel.prototype.getPreprocessor = function(columnIndex){
return this.preprocessors[columnIndex];
};
YAHOO.ext.grid.LoadableDataModel.prototype.removePreprocessor = function(columnIndex){
this.preprocessors[columnIndex] = null;
};
YAHOO.ext.grid.LoadableDataModel.prototype.addPostprocessor = function(columnIndex, fn){
this.postprocessors[columnIndex] = fn;
};
YAHOO.ext.grid.LoadableDataModel.prototype.getPostprocessor = function(columnIndex){
return this.postprocessors[columnIndex];
};
YAHOO.ext.grid.LoadableDataModel.prototype.removePostprocessor = function(columnIndex){
this.postprocessors[columnIndex] = null;
};
YAHOO.ext.grid.LoadableDataModel.prototype.loadData = function(data, callback, keepExisting, insertIndex){
};
YAHOO.ext.grid.LoadableDataModel.XML = 'xml';
YAHOO.ext.grid.LoadableDataModel.JSON = 'json';
YAHOO.ext.grid.LoadableDataModel.TEXT = 'text';