﻿// JScript File

if(!Control) var Control = {};

Control.Listing = Class.create();

Control.Listing.prototype = {
	initialize: function(table, options) {
		//alert('listing initialize');
		this.recordcount=0;
		this.table=table;
		this.tbody=table.getElementsByTagName('tbody');
		this.options = options || {};
		
		// paging
		if (this.options.paging) {
			this.enablePaging();
		}
		
		this.selectedNodes=new Array();
//		this.buildTree(this.root);
		this.eventClick=this.clickNode.bindAsEventListener(this)
		for (var i=0; i<this.tbody.length; i++)
			Event.observe(this.tbody[i], "click", this.eventClick);
	},
	
	selectRow: function(row) {
		row.selected=true;
		this.selectedNodes.push(row);
		Element.addClassName(row, "selected");
		if (typeof this.onSelectRow == "function")
			this.onSelectRow(row);
	},
	
	deselectRow: function(row) {
		row.selected=false;
		Element.removeClassName(row, "selected");
		for (var i=0; i<this.selectedNodes.length; i++) {
			if (this.selectedNodes[i]==row)
			{ this.selectedNodes.splice(i, 1); break; }
		}
	},
	
	onSelectRow: function(node) { },
	
	clickNode: function (event) {
		var handle = Event.element(event);
		var row=handle.parentNode;
		while (row.tagName!='TR')
			row=row.parentNode;
			
		if (row.selected)
			this.deselectRow(row);
		else {
			if (this.options.single) this.deselectAll();
			this.selectRow(row);
		}
	},
	
	recur: function() {
		var f=arguments[0];
		for (var j=0; j<this.tbody.length; j++) {
			var rows=this.tbody[j].childNodes;
			for (var i=0; i<rows.length; i++) {
				if (rows[i].tagName=="TR") f(rows[i]);
			}
		}
	},
	
	deselectAll: function () {		
		for (var i=0; i<this.selectedNodes.length; i++) {
			var row=this.selectedNodes[i];
			row.selected=false;
			Element.removeClassName(row, "selected");
		}

		this.selectedNodes.splice(0, this.selectedNodes.length);
	},
	
	selectAll: function () {
		var s=this.selectedNodes;
		this.recur(function(node) { node.selected=true;
		Element.addClassName(node, "selected"); s.push(node); });
	},
	
	// clear contents of the listing
	clear: function () { this.updateBody(null); },
	
	// method stub to refresh listing contents
	refresh: function () { },
	
	refreshFeed: function (afterupdate) { 
		if (!this.feedstop) this.getUpdatedBody2(this.filterdata, this.orderby, this.recordcount, (function(res) {
			var newrecords=this.feedBody(res.value);
			if (newrecords==0) this.feedstop=true;
			afterupdate();
		}).bindAsEventListener(this)); 
	},
	
	// update listing HTML body
	updateBody: function(htmlx) {
		this.feedstop=false;
		this.tbody=this.table.getElementsByTagName('tbody');
		var x=document.createElement('div');
		x.innerHTML='<table>' + (htmlx==null ? '<tbody></tbody>' : htmlx) + '</table>';
		try { Event.stopObserving(this.tbody[0], "click", this.eventClick); } catch (ex) { }
		var n=this.tbody[0].parentNode;
		var la=x.childNodes[0].childNodes[0];
		var x=this.tbody[0];
		this.tbody=[ la ];
		n.replaceChild(la, x);
		this.recordcount=$A(this.tbody[0].getElementsByTagName('tr')).length
		Event.observe(la, "click", this.eventClick);
		if (this.options.paging) {
			this.updatePages();
		}
	},
	
	feedBody: function(htmlx) {
		//alert('feedBody');
		this.tbody=this.table.getElementsByTagName('tbody');
		var x=document.createElement('div');
		x.innerHTML='<table>' + (htmlx==null ? '<tbody></tbody>' : htmlx) + '</table>';
		var la=$A(x.childNodes[0].childNodes[0].getElementsByTagName('tr'));
		this.recordcount+=la.length;
		// append new nodes
		for (var i=0; i<la.length; i++)
			this.tbody[0].appendChild(la[i]);
			
		if (this.options.paging) {
			this.updatePages();
		}
		
		return la.length;
	},
	
	setFilter: function(filterdata) {
		rm.clearTabs();
		this.refresh(filterdata);
		if (document.PageState!=null)
			document.PageState.setMyState('l', 'keys', null);
	},
	
	mergeTBody: function () {
		var tbody=this.tbody[0];
		for (var i=0; i<this.tbody.length; i++) {
			var tb=this.tbody[i];
			if (i>0) {
				var rec=tb.getElementsByTagName('tr');
				for (var j=0; j<rec.length; j++)
					tbody.appendChild(rec.length);
				Element.removeElement(tb);
			}
		}
		this.tbody=[ tbody ];
	},
	
	enablePaging: function() {
		if (!this.options.paging) this.options.paging=true;
		if (!this.options.pagesize) this.options.pagesize=20;
		this.page=0;
		this.pages=1;
		
		// merge tbody
		var tbody=this.tbody[0];
		this.mergeTBody();
		// update pages
		this.updatePages();
	},
	
	updatePages: function() {
		var tbody=this.tbody[0];
		var tbodystyle=Element.getStyle(tbody, 'display');
		Element.setStyle(tbody, { display: "none" });
		var records=$A(tbody.getElementsByTagName('tr'));
		if (this.options.pagesize==0) {
			this.page=0; this.pages=1;
			for (var i=0; i<records.length; i++) {
				if (document.all) Element.setStyle(records[i], { display: "block" });
				else Element.setStyle(records[i], { display: "table-row" });
			}
		} else {
			this.pages=Math.floor(records.length/this.options.pagesize) + (records.length%this.options.pagesize==0 ? 0 : 1);
			if (this.page>=this.pages) this.page=this.pages==0 ? 0 : this.pages;
			for (var i=0; i<this.pages; i++)
				if (this.page==i) this.showPage(i); else this.hidePage(i);
		}
		Element.setStyle(tbody, { display: tbodystyle });
		this.pagingChanged(this.page, this.pages);		
	},
	
	hidePage: function(page) {
		var tbody=this.tbody[0];		
		var records=$A(tbody.getElementsByTagName('tr'));
		var foo=(page+1)*this.options.pagesize;
		if (foo>records.length) foo=records.length;
		for (var i=page*this.options.pagesize; i<foo; i++) {			
			Element.setStyle(records[i], { display: "none" });
		}
	},
	
	showPage: function(page) {
		var tbody=this.tbody[0];
		var records=$A(tbody.getElementsByTagName('tr'));
		var foo=(page+1)*this.options.pagesize;
		if (foo>records.length) foo=records.length;
		for (var i=page*this.options.pagesize; i<foo; i++) {
			if (document.all) Element.setStyle(records[i], { display: "block" });
			else Element.setStyle(records[i], { display: "table-row" });
		}
	},
	
	toPage: function(page) {
		//alert('topage: ' + page);
		if (!this.options.paging) { alert('Paging not enabled!'); return; }
		if (page<0) { return; }
		//alert(this.pages);
		if (!this.feedstop && this.recordcount>0 && page>=this.pages-1 && this.recordcount%this.options.pagesize==0) { 
			if (!this.options.autofeed) return; 
			if (this.feedstop) return;
			this.refreshFeed((function() { if (page<this.pages) this.toPage(page); }).bind(this));
			return;
		}
		if (page>=this.pages) return;
		this.hidePage(this.page);
		this.page=page;
		this.showPage(this.page);
		this.pagingChanged(this.page, this.pages);
	},
	
	pagingChanged: function(page, pages) { },
	
	// set sort order, but don't refresh data (used at startup)
	setsortorder: function(fieldname, ascending) {
		if (!this.orderby) this.orderby=[];
		// add sort
		this.orderby.unshift({ Field: fieldname, Sort: ascending ? 'ASC' : 'DESC' });
		// cleanup this array
		for (var i=1; i<this.orderby.length; i++) {
			var x=this.orderby[i];
			for (var j=i-1; j>=0; j--) {
				if (x.Field==this.orderby[j].Field) {
					this.orderby.splice(i, 1);
					i--;
					break;
				}
			}
		}
	},
	
	sortbycolumn: function(column, fieldname) {
		var table=column.offsetParent;
		column.asc==null ? column.asc= true : column.asc=!column.asc;
		this.setsortorder(fieldname, column.asc);
		this.refresh();
	}
}
