var scrollView = function () {
var scrollview = $.extend(true,{}, $.fn.datagrid.defaults.view, {
render: function (target, container, frozen) {
var state = $.data(target, 'datagrid');
var opts = state.options;
var rows = this.rows || [];
if (!rows.length) {
return;
}
var fields = $(target).datagrid('getColumnFields', frozen);
if (frozen) {
if (!(opts.rownumbers || (opts.frozenColumns && opts.frozenColumns.length))) {
return;
}
}
var index = this.index;
var table = ['
'];
for (var i = 0; i < rows.length; i++) {
var css = opts.rowStyler ? opts.rowStyler.call(target, index, rows[i]) : '';
var classValue = '';
var styleValue = '';
if (typeof css == 'string') {
styleValue = css;
} else if (css) {
classValue = css['class'] || '';
styleValue = css['style'] || '';
}
var cls = 'class="datagrid-row ' + (index % 2 && opts.striped ? 'datagrid-row-alt ' : ' ') + classValue + '"';
var style = styleValue ? 'style="' + styleValue + '"' : '';
// get the class and style attributes for this row
// var cls = (index % 2 && opts.striped) ? 'class="datagrid-row datagrid-row-alt"' : 'class="datagrid-row"';
// var styleValue = opts.rowStyler ? opts.rowStyler.call(target, index, rows[i]) : '';
// var style = styleValue ? 'style="' + styleValue + '"' : '';
var rowId = state.rowIdPrefix + '-' + (frozen ? 1 : 2) + '-' + index;
table.push('');
table.push(this.renderRow.call(this, target, fields, frozen, index, rows[i]));
table.push('
');
index++;
}
table.push('
');
$(container).html(table.join(''));
},
onBeforeRender: function (target) {
var state = $.data(target, 'datagrid');
var opts = state.options;
var dc = state.dc;
var view = this;
// erase the onLoadSuccess event, make sure it can't be triggered
state.onLoadSuccess = opts.onLoadSuccess;
opts.onLoadSuccess = function () { };
opts.finder.getRow = function (t, p) {
var index = (typeof p == 'object') ? p.attr('datagrid-row-index') : p;
var row = $.data(t, 'datagrid').data.rows[index];
if (!row) {
var v = $(t).datagrid('options').view;
row = v.rows[index - v.index];
}
return row;
};
dc.body1.add(dc.body2).empty();
this.rows = undefined; // the rows to be rendered
this.r1 = this.r2 = []; // the first part and last part of rows
dc.body2.unbind('.datagrid').bind('scroll.datagrid', function (e) {
if (state.onLoadSuccess) {
opts.onLoadSuccess = state.onLoadSuccess; // restore the onLoadSuccess event
state.onLoadSuccess = undefined;
}
if (view.scrollTimer) {
clearTimeout(view.scrollTimer);
}
view.scrollTimer = setTimeout(function () {
scrolling.call(view);
}, 50);
//scrolling.call(view);
});
function scrolling() {
if (dc.body2.is(':empty')) {
if (state.data.total ==0) return;
reload.call(this);
} else {
var firstTr = opts.finder.getTr(target, this.index, 'body', 2);
var lastTr = opts.finder.getTr(target, 0, 'last', 2);
var headerHeight = dc.view2.children('div.datagrid-header').outerHeight();
var top = firstTr.position().top - headerHeight;
var bottom = lastTr.position().top + lastTr.outerHeight() - headerHeight;
if (top > dc.body2.height() || bottom < 0) {
reload.call(this);
} else if (top > 0) {
var page = Math.floor(this.index / opts.pageSize);
this.getRows.call(this, target, page, function (rows) {
this.r2 = this.r1;
this.r1 = rows;
this.index = (page - 1) * opts.pageSize;
this.rows = this.r1.concat(this.r2);
this.populate.call(this, target);
});
} else if (bottom < dc.body2.height()) {
var page = Math.floor(this.index / opts.pageSize) + 2;
if (this.r2.length) {
page++;
}
this.getRows.call(this, target, page, function (rows) {
if (!this.r2.length) {
this.r2 = rows;
} else {
this.r1 = this.r2;
this.r2 = rows;
this.index += opts.pageSize;
}
this.rows = this.r1.concat(this.r2);
this.populate.call(this, target);
});
}
}
function reload() {
var top = $(dc.body2).scrollTop();
var index = Math.floor(top / 25);
var page = Math.floor(index / opts.pageSize) + 1;
this.getRows.call(this, target, page, function (rows) {
this.index = (page - 1) * opts.pageSize;
this.rows = rows;
this.r1 = rows;
this.r2 = [];
this.populate.call(this, target);
dc.body2.triggerHandler('scroll.datagrid');
});
}
}
},
getRows: function (target, page, callback) {
var state = $.data(target, 'datagrid');
var opts = state.options;
var index = (page - 1) * opts.pageSize;
var rows = state.data.rows.slice(index, index + opts.pageSize);
if (rows.length) {
callback.call(this, rows);
} else {
var param = $.extend({}, opts.queryParams, {
page: page,
rows: opts.pageSize
});
if (opts.sortName) {
$.extend(param, {
sort: opts.sortName,
order: opts.sortOrder
});
}
if (opts.onBeforeLoad.call(target, param) == false) return;
$(target).datagrid('loading');
var result = opts.loader.call(target, param, function (data) {
$(target).datagrid('loaded');
var data = opts.loadFilter.call(target, data);
callback.call(opts.view, data.rows);
// opts.onLoadSuccess.call(target, data);
}, function () {
$(target).datagrid('loaded');
opts.onLoadError.apply(target, arguments);
});
if (result == false) {
$(target).datagrid('loaded');
}
}
},
populate: function (target) {
var state = $.data(target, 'datagrid');
var opts = state.options;
var dc = state.dc;
var rowHeight = 25;
if (this.rows.length) {
opts.view.render.call(opts.view, target, dc.body2, false);
opts.view.render.call(opts.view, target, dc.body1, true);
dc.body1.add(dc.body2).children('table.datagrid-btable').css({
paddingTop: this.index * rowHeight,
paddingBottom: state.data.total * rowHeight - this.rows.length * rowHeight - this.index * rowHeight
});
opts.onLoadSuccess.call(target, {
total: state.data.total,
rows: this.rows
});
}
}
});
return scrollview;
};