
WL.Controls.PageControl=WL.Class(WL.Controls.Control,function(base)
{this.constructor=function()
{base.constructor.call(this);this.pagesCount=0;this.pagesPerLine=10;this.currentPage=-1;this.href="#";this.onPageSelect=new WL.Event();this.onPageCountChange=new WL.Event();}
this.ongenerate=function()
{var c=WL.$(this.c_id);for(var i=c.childNodes.length-1;i>=0;--i)
if(c.childNodes[i].nodeType!=1)c.removeChild(c.childNodes[i]);}
this.setCssClass=function(cssClass)
{var c=WL.$(this.c_id);if(c)WL.Utils.setNew(c,"className",cssClass);}
this.linkTo=function(pc)
{this.pagesPerLine=pc.pagesPerLine;this.href=pc.href.indexOf("#")>=0?pc.href:pc.href+'#';pc.onPageSelect.add(this,function(s,e){this.selectPage(e.page,{skipInvoke:true});});pc.onPageCountChange.add(this,function(s,e){this.setPagesCount(e.pages,{skipInvoke:true});});this.onPageSelect.add(this,function(s,e){pc.selectPage(e.page);});this.setPagesCount(pc.pagesCount,{skipInvoke:true});this.selectPage(pc.currentPage,{skipInvoke:true});}
this.setPagesCount=function(pagesCount,p)
{if(this.pagesCount==pagesCount)return;if(!p)p={skipInvoke:false};this.pagesCount=pagesCount;if(!p.skipInvoke)
this.onPageCountChange.invoke(this,{pages:pagesCount});if(this.currentPage==-1){this.selectPage(Math.min(0,this.pagesCount-1),p);return;}
if(this.currentPage>=this.pagesCount){this.selectPage(this.pagesCount-1,p);return;}
this.update();}
this.update=function()
{var c=WL.$(this.c_id);var bPrev=true;var bNext=true;resizeChildren.call(this,c,Math.min(this.pagesCount,this.pagesPerLine)+(bPrev?1:0)+(bNext?1:0));if(this.pagesCount==0)return;var handler=pageSelect.bind(this);var pi=0;if(bPrev)updatePage.call(this,c.childNodes[pi++],this.currentPage-1,"Previous Page",handler);var shl=Math.floor((this.pagesPerLine-2)/2);var p=Math.max(0,Math.min(this.pagesCount-this.pagesPerLine,this.currentPage-shl));updatePage.call(this,c.childNodes[pi++],0,p++>0?"&lt;&lt;":null,handler);if(p<this.pagesCount)
{var prev=p-this.pagesPerLine+shl+3;if(prev>0)
updatePage.call(this,c.childNodes[pi++],prev,"&lt;",handler);else
updatePage.call(this,c.childNodes[pi++],p,null,handler);p++;}
for(;pi<c.childNodes.length-(bNext?3:2);++pi,++p)
updatePage.call(this,c.childNodes[pi],p,null,handler);if(p<this.pagesCount)
{if(p<this.pagesCount-(bNext?3:2))
updatePage.call(this,c.childNodes[pi++],p,"&gt;",handler);else
updatePage.call(this,c.childNodes[pi++],p,null,handler);p++;}
if(p<this.pagesCount)
updatePage.call(this,c.childNodes[pi++],this.pagesCount-1,p<this.pagesCount-1?"&gt;&gt;":null,handler);if(bNext)updatePage.call(this,c.childNodes[pi++],this.currentPage+1,"Next Page",handler);}
this.selectPage=function(pageNumber,p)
{if(this.currentPage==pageNumber||this.isDisabled())return false;if(!p)p={skipInvoke:false};this.currentPage=pageNumber;if(!p.skipInvoke)this.onPageSelect.invoke(this,{page:pageNumber});if(!p.skipUpdate)this.update();return true;}
this.selectLastPage=function(p){this.selectPage(Math.max(0,this.pagesCount-1),p);}
var resizeChildren=function(el,size)
{var dist=size-el.childNodes.length;if(dist>0)while(dist-->0)el.appendChild(WL.$e("a"));else
if(dist<0)while(dist++<0)el.removeChild(el.lastChild);}
var updatePage=function(a,number,text,handler)
{if(!a)return;WL.Utils.setNew(a,"className",number==this.currentPage?"page-current":"");if(number<0)number=0;if(number>=this.pagesCount)number=this.pagesCount-1;a.href=String.format(this.href,number+1);a.onclick=handler;a.pageNumber=number;a.title=number+1;a.innerHTML=text||(number+1).toString();}
var pageSelect=function(e)
{e=WL.getEvent(e);var cancel=!this.selectPage(e.target.pageNumber,{skipUpdate:true});if(e){try
{if(e.target.href.indexOf("#")>=0)cancel=true;e.target.blur();}catch(ex){}
if(cancel)return WL.returnEvent(e,false);}
window.setTimeout(this.update.bind(this),0);}});