var PageTable = Class.create();

PageTable.prototype = {

	initialize: function(expanded) {
		this.expandedRows = expanded;
	},

	extractLevel: function(row) {
		if (/level-(\d+)/i.test(row.className))
		return parseInt(RegExp.$1);
	},

	extractPageId: function(row) {
		if (/page-(\d+)/i.test(row.id))
		return parseInt(RegExp.$1);
	},

	isExpanded: function(row) {
		return /\bchildren-visible\b/i.test(row.className);
	},

	isRow: function(element) {
		return element.tagName && (element.tagName == 'TR');
	},

	getExpanderImageForRow: function(row) {
		var images = $A(row.getElementsByTagName('img', row));
		var expanders = [];

		images.each(function(image){
			expanders.push(image);
		}.bind(this));

		return expanders.first();
	},     

	saveExpandedCookie: function() {
 		document.cookie = "expanded_rows=" + this.expandedRows.uniq().join(",") + "; path=/admin";
	},

	hideBranch: function(row, img) {

		var level = this.extractLevel(row);
		var sibling = row.nextSibling;
		
		while(sibling != null) {
			if (this.isRow(sibling)) {
				if (this.extractLevel(sibling) <= level) break;
				Element.hide(sibling);
			}
			sibling = sibling.nextSibling;
		}

		var pageId = this.extractPageId(row);
		var newExpanded = [];
		for(i = 0; i < this.expandedRows.length; i++)
			if(this.expandedRows[i] != pageId)
				newExpanded.push(this.expandedRows[i]);

		this.expandedRows = newExpanded;
		this.saveExpandedCookie();

		if (img == null)
			img = this.getExpanderImageForRow(row);
		img.src = img.src.replace(/close/, 'open');
		Element.removeClassName(row, 'children-visible');
		Element.addClassName(row, 'children-hidden');
	},

	showBranchInternal: function(row, img) {
		var level = this.extractLevel(row);
		var sibling = row.nextSibling;
		var children = false;
		var childOwningSiblings = [];        

		while(sibling != null) {
			if (this.isRow(sibling)) {
				var siblingLevel = this.extractLevel(sibling);
				if (siblingLevel <= level) break;
				if (siblingLevel == level + 1) {
					Element.show(sibling);
					if(sibling.className.match(/children-visible/)) {
						childOwningSiblings.push(sibling);
					} else {
						this.hideBranch(sibling);
					}
				}
				children = true;
			}
			sibling = sibling.nextSibling;
		}

		if (img == null)
			img = this.getExpanderImageForRow(row);          

		img.src = img.src.replace(/open/, 'close');

		for(i=0; i < childOwningSiblings.length; i++) {
			this.showBranch(childOwningSiblings[i], null);            
		}        

		Element.removeClassName(row, 'children-hidden');
		Element.addClassName(row, 'children-visible');
	},

	showBranch: function(row, img) {
		this.showBranchInternal(row, img);
		this.expandedRows.push(this.extractPageId(row));
		this.saveExpandedCookie();
	},

	toggleBranch: function(row, img) {
		if (this.isExpanded(row)) {
			this.hideBranch(row, img);
		} else {
			this.showBranch(row, img);
		}
	}
	
};

Event.addBehavior({

	'tr': function () {
		this.observe('click', function(event) {
			var element = Event.element(event);

			if (element.tagName == 'IMG' && element.hasClassName('expander')) {
				var row = Event.findElement(event, 'tr')
				tbl.toggleBranch(row, element);
			}
		})
	}
});
