// Author: R. Hill, except where noted. Anybody is free to use/adapt this for their own purpose.
//=========================================================
function Object_lib_page_browser(){
var me=this;
// collect useful dom elements
var els=document.getElementsByTagName('*');
for (var i=0,l=els.length; i<l; i++){
	var el=els[i];
	if (el.id.search(/^lib\w+$/)!==0){continue;}
	this[el.id]=el;
	}
this.otable=document.getElementById("lib-table");
this.oform=document.getElementById("lib-form-browse");
this.opgnumtop=document.getElementById("lib-pgnumtop");
this.opgnumbottom=document.getElementById("lib-pgnumbottom");
this.opgcount=document.getElementById("lib_pgcount");
this.mustShowDetails=function(){
	var notags=readCookie('lib-notags');
	return (notags===null || +notags===0);
	};
// we wants links to open in another window, since back button doesn't work with dhtml
this.updateitemlinks=function(){
	var reitem=/(^| )lib-item( |$)/;
	var retitle=/(^| )lib-itemtitle( |$)/;
	for (var i=0,il=this.otable.rows.length; i<il; i++){
		var tr=this.otable.rows[i];
		if (reitem.test(tr.className)){
			for (var j=0,jl=tr.cells.length; j<jl; j++){
				var td=tr.cells[j];
				if (retitle.test(td.className)){
					var atags=td.getElementsByTagName("a");
					for (var k=0,kl=atags.length; k<kl; k++) {
						if (atags[k].href.search('library.php?')>=0) {continue;}
						atags[k].target="_blank"; //"ruTCJn"
						}
					break;
					}
				}
			}
		}
	};
// load specific page
this.loadpage=function(pg){
	var oinput=this.oform.getElementsByTagName("input");
	var oparms={};
	for (var i=0;i<oinput.length;i++){
		oparms[oinput[i].name]=oinput[i].value;
		}
	var qry="mf="+oparms.mf+"&yf="+oparms.yf+"&mt="+oparms.mt+"&yt="+oparms.yt+"&t="+oparms.t+"&limit="+oparms.ppg+"&offset=";
	var ppg=Number(oparms.ppg);
	qry+=(pg-1)*ppg;
	qry+='&notags='+(me.mustShowDetails()?'0':'1');
	if (pg>0 && pg<=parseInt(this.opgcount.firstChild.nodeValue,10)){
		sendRequest("library-do.php?"+'command=fetchLibraryPage&'+encodeURI(qry),me.pagereqhandler);
		}
	};
// turn one or more page
this.turnpage=function(dir){
	var pg=Number(this.opgnumbottom.firstChild.nodeValue);
	if (dir===0){pg=1;}
	else if (dir===-1){pg--;}
	else if (dir===1){pg++;}
	else{pg=Number(this.opgcount.firstChild.nodeValue);}
	this.loadpage(pg);
	};
// synchronize controls with displayed page
this.updatecontrols=function(pg){
	if (this.opgnumtop){
		var pgobj=this.opgnumbottom.firstChild;
		if (typeof pg=='undefined'){pg=Number(pgobj.nodeValue);}
		else {pgobj.nodeValue=pg;}
		this.opgnumtop.value=pg;
		var enabled=(pg>1);
		this.libPageFirstTop.onclick=this.libPageFirstBot.onclick=enabled?function(){me.turnpage(0);}:null;
		this.libPagePrevTop.onclick=this.libPagePrevBot.onclick=enabled?function(){me.turnpage(-1);}:null;
		this.libPageFirstTop.className=this.libPageFirstBot.className=
		this.libPagePrevTop.className=this.libPagePrevBot.className='lib-jsbutton'+(enabled?'':'-disabled');
		enabled=(pg<this.opgnumtop.length);
		this.libPageNextTop.onclick=this.libPageNextBot.onclick=enabled?function(){me.turnpage(1);}:null;
		this.libPageLastTop.onclick=this.libPageLastBot.onclick=enabled?function(){me.turnpage(2);}:null;
		this.libPageNextTop.className=this.libPageNextBot.className=
		this.libPageLastTop.className=this.libPageLastBot.className='lib-jsbutton'+(enabled?'':'-disabled');
		}
	};
// handle response from server
this.pagereqhandler=function(req){
	// prepare
	var reclass=/(^| )lib-item( |$)/;
	var i,j;
	var ctr,item;
	// split into items
	var libcart=JSON.parse(req.responseText);
	// replace old rows with new rows
	for (i=0,j=0; i<me.otable.rows.length && j<libcart.items.length; i++){
		ctr=me.otable.rows[i];
		if (reclass.test(ctr.className)){
			item=libcart.items[j++];
			ctr.cells[0].innerHTML=item.publishedon;
			ctr.cells[1].innerHTML=item.detailstoggler;
			ctr.cells[2].innerHTML=item.title;
			ctr.id=item.itemid;
			}
		}
	// delete extraneous rows
	while (i<me.otable.rows.length-1){
		me.otable.deleteRow(me.otable.rows.length-2);
		}
	// add missing rows
	if (j<libcart.items.length){
		var ctd;
		var cltr=me.otable.rows[me.otable.rows.length-2];
		while (j<libcart.items.length){
			ctr=me.otable.insertRow(cltr.rowIndex+1);
			ctr.className=cltr.className.search("f9rs0")<0?cltr.className.replace("f9rs1","f9rs0"):cltr.className.replace("f9rs0","f9rs1");
			for (var cell=0; cell<cltr.cells.length; cell++){
				ctd=ctr.insertCell(cell);
				ctd.className=cltr.cells[cell].className;
				}
			item=libcart.items[j++];
			ctr.cells[0].innerHTML=item.publishedon;
			ctr.cells[1].innerHTML=item.detailstoggler;
			ctr.cells[2].innerHTML=item.title;
			ctr.id=item.itemid;
			cltr=ctr;
			}
		}
	me.initializetagcells(me.mustShowDetails()); // new tag cells were added, we need to initialize these
	// update page number, buttons
	me.updatecontrols(libcart.offset/libcart.limit+1);
	// item urls open in new window
	me.updateitemlinks();
	// update permalink
	//if (fields.length>2) { // necessary until caches are clear
	//	var atag=document.getElementById("lib-permalink"); // permalink
	//	atag.href=fields[2];
	//	atag.style.display="inline";
	//	}
	};
this.mouseOverDetailsToggler=function(){
	me.expandDetails(this.id.substr('lib-detailstoggler-'.length));
	};
this.mouseOverDetailsTogglerDelayHandler=function(){
	var id=me.detailsToggler.id;
	delete me.detailsToggler;
	me.expandDetails(id);
	};
this.mouseOverDetailsTogglerDelay=function(){
	// expand details only if mouse has been hovering
	// expand button for more than half a second
	if (me.detailsToggler){
		clearTimeout(me.detailsToggler.timer);
		delete me.detailsToggler;
		}
	me.detailsToggler={
		id:this.id.substr('lib-detailstoggler-'.length),
		timer:setTimeout(me.mouseOverDetailsTogglerDelayHandler,500)
		};
	};
this.expandDetails=function(id){
	var el=document.getElementById('lib-itemdetails-'+id);
	if (el){el.style.display='';}
	};
this.collapseDetailsAnimated=function(id){
	var el=document.getElementById('lib-itemdetails-'+id);
	if (!el){return;}
	var h=el.offsetHeight-(el.offsetHeight>>1);
	if (h>2){
		el.style.height=String(h)+'px';
		setTimeout(function(){me.collapseDetailsAnimated(id);},100);
		}
	else{
		el.style.display='none';
		el.style.height='';
		}
	};
this.collapseDetails=function(id){
	var el=document.getElementById('lib-itemdetails-'+id);
	if (el){
		el.style.display='none';
		el.style.height='';
		}
	};
this.showhideDetailsPersistently=function(id,show){
	var el=document.getElementById('lib-itemdetails-'+id);
	el.style.display=show?'':'none';
	el.style.height='';
	el=document.getElementById('lib-detailstoggler-'+id);
	el.className='lib-detailstoggler'+(show?'1':'0');
	};
this.mouseOutDetailsToggler=function(e){
	// cancel expand timer if not expanded yet
	if (me.detailsToggler){
		clearTimeout(me.detailsToggler.timer);
		delete me.detailsToggler;
		return;
		}
	// once expanded, collapse only if mouse pointer is outside
	// expand and details cells
	var cell1=this.cells[1];
	var cell2=this.cells[2];
	if (!e){e=window.event;}
	var toEl=e.relatedTarget || e.toElement;
	while (toEl && toEl!=cell1 && toEl!=cell2){
		toEl=toEl.parentNode;
		}
	if (toEl!==null){return;}
	var itemid=this.id.substr('i'.length);
	var domDetailsToggler=document.getElementById('lib-detailstoggler-'+itemid);
	if (domDetailsToggler.className=='lib-detailstoggler0'){
		me.collapseDetailsAnimated(itemid);
		}
	};
this.mouseClickDetailsToggler=function(){
	var itemid=this.id.substr('lib-detailstoggler-'.length);
	var opened=(this.className.search('lib-detailstoggler1')>=0);
	this.className='lib-detailstoggler'+(opened?'0':'1');
	if (opened){
		me.collapseDetails(itemid);
		}
	else{
		me.expandDetails(itemid);
		}
	};
this.updatetagtoggler=function(){
	var notags=!this.mustShowDetails();
	this.libTagToggler.title=(notags?'Show':'Hide')+' all details';
	this.libTagToggler.className='lib-detailstoggler'+(notags?'0':'1');
	this.libTagToggler.onclick=notags?function(){me.expandAllDetails();}:function(){me.collapseAllDetails();};
	};
this.collapseAllDetails=function(){
	var els=document.getElementsByTagName('div');
	for (var i=0,length=els.length; i<length; i++){
		var el=els[i];
		if (el.id.search(/^lib-detailstoggler-\d+$/)<0){continue;}
		this.showhideDetailsPersistently(el.id.substr('lib-detailstoggler-'.length),false);
		}
	createCookie("lib-notags",1,7,"/news");
	this.updatetagtoggler();
	return false;
	};
this.expandAllDetails=function(){
	var els=document.getElementsByTagName('div');
	for (var i=0,length=els.length; i<length; i++){
		var el=els[i];
		if (el.id.search(/^lib-detailstoggler-\d+$/)<0){continue;}
		this.showhideDetailsPersistently(el.id.substr('lib-detailstoggler-'.length),true);
		}
	createCookie("lib-notags",0,7,"/news");
	this.updatetagtoggler();
	return false;
	};
this.initializetagcells=function(expand){
	var els=this.otable.getElementsByTagName('div');
	var i,el;
	for (i=0; i<els.length; i++){
		el=els[i];
		if (el.id.search(/^lib-detailstoggler-\d+$/)<0){continue;}
		el.onmouseover=me.mouseOverDetailsTogglerDelay;
		el.onclick=me.mouseClickDetailsToggler;
		}
	els=this.otable.getElementsByTagName('tr');
	for (i=0; i<els.length; i++){
		el=els[i];
		if (el.id.search(/^i\d+$/)<0){continue;}
		el.onmouseout=me.mouseOutDetailsToggler;
		}
	};
this.replaceChildWithGrandchild=function(el,tag){
	var gcs=el.getElementsByTagName(tag);
	if (gcs && gcs.length){
		el.replaceChild(gcs[0].firstChild,gcs[0]);
		}
	};
// initialize all
this.initialize=function(){
	// page browser
	if (this.opgnumtop){ // only if we have more than one page
		var ids=[
			'libPageFirstTop',
			'libPageFirstBot',
			'libPagePrevTop',
			'libPagePrevBot',
			'libPageNextTop',
			'libPageNextBot',
			'libPageLastTop',
			'libPageLastBot'
			];
		var func=function(p,o){
			p.replaceChildWithGrandchild(o,'a');
			preventSelection(o);
			};
		for (var i=0; i<ids.length; i++){
			func(this,this[ids[i]]);
			}
		this.opgnumtop.onchange=function(){
			var opts=this.getElementsByTagName("option");
			me.loadpage(Number(opts[this.selectedIndex].value));
			};
		this.updatecontrols();
		}
	this.updateitemlinks();
	// tags column
	this.initializetagcells(this.mustShowDetails());
	this.updatetagtoggler();
	};
this.initialize();
}
var lib_page_browser;
addLoadEvent(function(){if (document.getElementById("lib-table")){lib_page_browser=new Object_lib_page_browser();}});
