
if(typeof CavKit==='undefined')
{var CavKit={};}
CavKit.Logger=function()
{var log=this;this.visible=false;this.items=[];this.options={perPage:10};this.paginator=new CavKit.Paginator({items:this.items,perPage:this.options.perPage,afterToPage:function(i)
{log.update();}});this.init();};CavKit.Logger.prototype={init:function()
{var log=this;if(!this.element)
{this.element=$('\
            <div id="cavkit-debugger" style="display: none;">\
                <h1>CavKit Debugger</h1>\
                <div class="log">\
                    <ol></ol>\
                </div>\
                <div class="scrollbar">\
                    <span class="up"></span>\
                    <span class="bar"></span>\
                    <span class="down"></span>\
                </div>\
            </div>\
            ');$('body').append(this.element);this.element.click(function(e)
{log.click(e);});}
this.show();},add:function(str)
{var now=new Date(),level=arguments[1]||'info',entry=new CavKit.LogEntry(str,level,now);this.items.push(entry);this.paginator.add(entry);},click:function(e)
{var target=$(e.target);if(target.is('.up'))
{this.paginator.prevPage();return;}
else if(target.is('.down'))
{this.paginator.nextPage();return;}},show:function()
{this.element.show();},hide:function()
{this.element.hide();},update:function()
{var list=this.element.find('ol'),items=arguments[0]||this.paginator.currentPageItems();list.find('li').remove().end();for(var i=0,l=items.length;i<l;i++)
{list.append(items[i].toHTML());}},info:function(str)
{this.add(str);if(this.items.length<this.options.perPage)
{this.update();}},debug:function(str)
{this.add(str,'debug');if(this.items.length<this.options.perPage)
{this.update();}},warn:function(str)
{this.add(str,'warn');if(this.items.length<this.options.perPage)
{this.update();}},error:function(str)
{this.add(str,'error');if(this.items.length<this.options.perPage)
{this.update();}}};CavKit.LogEntry=function(str,level,date)
{if(typeof level==='undefined')
{level='info';}
if(typeof date==='undefined')
{date=new Date();}
return{msg:str,date:date,level:level,toString:function()
{return str;},toHTML:function()
{return'<li class="'+level+'">'+str+'</li>';}}};CavKit.Paginator=function(options)
{var paginator=this;this.list=options.items;this.perPage=options.perPage;this.currentPage=0;this.currentItem=0;this.beforeToPage=options.beforeToPage||null;this.afterInit=options.afterInit||null;this.afterToItem=options.afterToItem||null;this.afterToPage=options.afterToPage||null;this.afterPrevPage=options.afterPrevPage||null;this.afterNextPage=options.afterNextPage||null;this.afterPrevItem=options.afterPrevItem||null;this.afterNextItem=options.afterNextItem||null;this.paginate();if(this.afterInit){this.afterInit();}};CavKit.Paginator.prototype={paginate:function()
{this.numPages=Math.ceil(this.list.length/this.perPage);this.pages=[];for(var i=0,l=this.numPages;i<l;i++)
{this.pages.push(this.list.slice(i*this.perPage,i*this.perPage+this.perPage));}},add:function(item)
{this.paginate();},findItem:function(item)
{for(var i=0,l=this.list.length;i<l;i++)
{if(this.list[i]===item){return i;}}
return null;},currentPageItems:function()
{var list=[],pageItems=this.pages[this.currentPage];for(var i=0,l=pageItems.length;i<l;i++)
{list.push(pageItems[i]);}
return list;},toItem:function(item)
{this.currentItem=item;if(this.afterToItem){this.afterToItem();}},prevItem:function()
{if(!this.hasPrevItem()){return false;}
this.toItem(this.currentItem-1);if(this.lastOnPage(this.currentItem)){this.currentPage--;}
if(this.afterPrevItem){this.afterPrevItem();}},nextItem:function()
{if(!this.hasNextItem()){return false;}
this.toItem(this.currentItem+1);if(this.firstOnPage(this.currentItem)){this.currentPage++;}
if(this.afterNextItem){this.afterNextItem();}},toPage:function(page)
{if(this.currentPage===page){return;}
if(this.beforeToPage){this.beforeToPage();}
this.currentPage=page;if(this.afterToPage){this.afterToPage();}},prevPage:function()
{if(!this.hasPrevPage()){return false;}
this.toPage(this.currentPage-1);if(this.afterPrevPage){this.afterPrevPage();}},nextPage:function()
{if(!this.hasNextPage()){return false;}
this.toPage(this.currentPage+1);if(this.afterNextPage){this.afterNextPage();}},hasPrevItem:function(){return this.currentItem-1>=0;},hasNextItem:function(){return this.currentItem+1<this.list.length;},hasPrevPage:function(){return this.currentPage-1>=0;},hasNextPage:function(){return this.currentPage+1<this.pages.length;},firstOnPage:function(itemNumber)
{var item=this.list[itemNumber];for(var i=0,l=this.pages.length;i<l;i++)
{if(this.pages[i][0]===item)
{return true;}}
return false;},lastOnPage:function(itemNumber)
{var item=this.list[itemNumber];for(var i=0,l=this.pages.length;i<l;i++)
{if(this.pages[i][this.pages[i].length-1]===item)
{return true;}}
return false;}};