/*
 ---

script: tornLog.js

description: MooTools powered heavily customizable UI based logging class.

license: MIT-style license.

copyright: Copyright (c) 2010-2011 [William Baumbach](http://torntech.com/).

authors:
- fyrye

requires:
	core:1.2.4:
		- Class.Extras
		- Element.Event
		- Element.Style
		- Element.Dimensions
		- Selectors
		- Fx.Tween
	MooTools.More:1.2.4.4:
		- Date
		- Drag.Move
		- HtmlTable.Zebra
		- HTMLTable.Sort

provides: [TornLog]
 ...
 */
var TornLog=new Class({version:"1.1.1.0",build:""});(function(){var i,a,e,f;var h,b;var d={tornLogUI:null,tornLogScroller:null,tornLogTable:null,tornLogMenu:null,tornLogDrag:null};var c={num:{content:"id",properties:{"class":"num"}},tm:{content:"time",properties:{"class":"tm"}},msg:{content:"msg",properties:{"class":"msg"}},dur:{content:"dur",properties:{"class":"dur"}}};var g={status:new Element("div",{"class":"button statusE",title:"Disable",events:{click:function(){i.toggleStatus(this)}}}),clrLog:new Element("div",{"class":"button clr",title:"Clear Log",events:{click:function(){i.clearLog()}}}),killUI:new Element("div",{"class":"button ui kill",title:"Close",events:{click:function(){i.killUI()}}}),hideUI:new Element("div",{"class":"button ui hide",title:"Hide",events:{click:function(){i.toggleUI(this)}}}),lockUI:new Element("div",{"class":"button ui lock",title:"Lock",events:{click:function(){i.toggleLockUI(this)}}})};TornLog.implement({logged:[],Implements:[Events,Options,Chain],options:{useMooLog:true,enabled:true,ui:{enabled:true,placement:"top",style:"top:1px;right:1px;",movable:true,sizable:true,opacity:1,clasName:"tornLog",wrapper:"div",container:false,lockoriginalsize:true,keepincontainer:true,minSize:{x:150,y:100}},line:{start:1,numbers:true,dates:true,dateFormat:"[%m-%d-%y %H:%M:%S]",durations:true,append:"",prepend:""},onInit:$empty,onEnable:$empty,onDisable:$empty,onClearLog:$empty,onSendLog:$empty,onShow:$empty,onHide:$empty},isMooLog:!(typeof(Log)=="undefined"),initialize:function(j){i=this;i.options.ui.container=document.body;i.setOptions(j);a=i.options;e=i.logged;i.fireEvent("init");f=a.line.start;if(a.useMooLog&&i.isMooLog){i.MooLog=new Log}a.enabled?i.enable():i.disable()},addHeaders:function(){if(!$defined(d.tornLogUI)||!i.created){return i.createUI()}var j={num:a.line.numbers,tm:a.line.dates,msg:true,dur:a.line.durations};var k=[];$each(j,function(m,l){if(m){k.push(c[l])}});return k},addButtons:function(){var j=function(){var k=[];$each(g,function(l){k.push(l)});return k};d.tornLogMenu.adopt(j())},stopEvent:function(j){return j.stop()},createUI:function(){i.killUI();i.created=true;i.originalSize=false;d.tornLogUI=new Element(a.ui.wrapper,{id:a.ui.clasName,"class":"wrapper",style:a.ui.style});d.tornLogScroller=new Element("div",{"class":"scroller"});d.tornLogTable=new HtmlTable({properties:{id:a.ui.clasName+"Table",border:0,cellspacing:0,cellpadding:1,"class":"log"},headers:i.addHeaders()});d.tornLogMenu=new Element("div",{id:a.ui.clasName+"Menu"});d.tornLogDrag=new Element("div",{id:a.ui.clasName+"Drag",events:{mousedown:function(j){j.stopPropagation();d.tornLogUI.addEvent("selectstart",i.stopEvent)},mouseup:function(j){d.tornLogUI.removeEvent("selectstart",i.stopEvent)},contextmenu:i.stopEvent}});i.addHeaders();i.addButtons();i.insertUI();i.toggleLockUI()},getContainer:function(){return a.ui.keepincontainer?Browser.Engine.trident?false:a.ui.container:false},getOriginalSize:function(j){return i.originalSize=!i.originalSize?j.getSize():i.originalSize},getScrollerSize:function(){return i.scrollOrigSize=!i.scrollOrigSize?d.tornLogScroller.getSize().y:i.scrollOrigSize},toggleStatus:function(j){if(!j){j=$$("#"+a.ui.clasName+" .statusE")||$$("#"+a.ui.clasName+" .statusD")}if(j.hasClass("statusE")){i.disable();j.removeClass("statusE");j.addClass("statusD");j.setAttribute("title","Enable")}else{i.enable();j.removeClass("statusD");j.addClass("statusE");j.setAttribute("title","Disable")}},toggleLockUI:function(j){if(!j){j=$$("#"+a.ui.clasName+" .lock")||$$("#"+a.ui.clasName+" .unlock")}if(a.ui.movable){if($chk(j)){j.removeClass("unlock");j.addClass("lock");j.set("title","Lock");d.tornLogMenu.setStyle("cursor","move");d.tornLogDrag.setStyle("cursor","se-resize")}b.attach();h.attach()}else{if($chk(j)){j.removeClass("lock");j.addClass("unlock");j.set("title","Unlock");d.tornLogMenu.setStyle("cursor","default");d.tornLogDrag.setStyle("cursor","default")}b.detach();h.detach()}return a.ui.movable=!a.ui.movable},lockSize:function(j){var k=a.ui.lockoriginalsize?i.getOriginalSize(j):a.ui.minSize;if(j.getSize().y<k.y){j.setStyle("height",k.y)}if(j.getSize().x<k.x){j.setStyle("width",k.x)}},addSizer:function(){i.addDragger();i.lockSize(d.tornLogUI)},addDragger:function(){d.tornLogScroller.addEvent("selectstart",i.stopEvent);d.tornLogScroller.setStyle("MozUserSelect","none")},addComplete:function(){d.tornLogScroller.removeEvent("selectstart",i.stopEvent);d.tornLogScroller.setStyle("MozUserSelect","text")},insertUI:function(){d.tornLogUI.inject(a.ui.container,a.ui.placement).adopt(d.tornLogMenu,d.tornLogScroller.adopt(d.tornLogTable,d.tornLogDrag));b=d.tornLogUI.makeDraggable({container:i.getContainer(),handle:$(a.ui.clasName+"Menu"),onDrag:i.addDragger,onComplete:i.addComplete});h=d.tornLogUI.makeResizable({handle:d.tornLogDrag,onDrag:i.addSizer,onComplete:i.addComplete});d.tornLogUI.set("opacity",a.ui.opacity)},killUI:function(){if($chk($(a.ui.clasName))){$(a.ui.clasName).dispose()}$each(d,function(j,k){d[k]=null});i.originalSize=false;i.created=false},showUI:function(){if(!$chk($(a.ui.clasName))){return false}if(Fx.Tween){d.tornLogScroller.fade("in")}else{d.tornLogScroller.setStyle("disply","")}return i.fireEvent("show")},hideUI:function(){if(!$chk($(a.ui.clasName))){return false}if(Fx.Tween){d.tornLogScroller.fade("out")}else{d.tornLogScroller.setStyle("display","none")}return i.fireEvent("hide")},toggleUI:function(j){if(!i.uiHidden){if($chk($(j))){j.removeClass("hide");j.addClass("show");j.setAttribute("title","Show")}i.hideUI()}else{if($chk($(j))){j.removeClass("show");j.addClass("hide");j.setAttribute("title","Hide")}i.showUI()}return i.uiHidden=!i.uiHidden},disable:function(j){i.fireEvent("disable");if(a.useMooLog&&i.isMooLog){i.MooLog.disableLog()}if(a.ui.enabled&&j){i.killUI()}i.send=i.disabled;i.send("Logging disabled")},enable:function(){i.fireEvent("enable");if(a.useMooLog&&i.isMooLog){i.MooLog.enableLog()}if(a.ui.enabled){addEvent("domready",function(){i.createUI()})}i.send=i.enabled;e.each(function(j){i.send.apply(i,j)});return i.clearLog(true)},disabled:function(){e.push(arguments);return this},enabled:function(k,j,l){i.curTime=i.getDate();i.fireEvent("sendLog");k=a.line.prepend+k+a.line.append;typeof(j)=="function"?i.preFire(k,j):i.addMsg(k);if(typeof(l)=="function"){l.run()}},preFire:function(k,j){return i.chain(j.run(),i.addMsg(k))},addMsg:function(m){if(a.useMooLog&&i.isMooLog&&m){i.MooLog.log(m)}if(!a.ui.enabled||!$chk($(a.ui.clasName))){return false}var k={num:{content:f+++")",properties:{"class":"num"}},tm:{content:i.formatDate(),properties:{"class":"tm"}},msg:{content:m,properties:{"class":"msg"}},dur:{content:i.duration(i.curTime)+" ms",properties:{"class":"dur"}}};var l={num:a.line.numbers,tm:a.line.dates,msg:true,dur:a.line.durations};var j=[];$each(l,function(o,n){if(o){j.push(k[n])}});d.tornLogTable.push(j,{"class":"line"});if(Fx.Scroll&&!i.fxScroll){i.fxScroll=new Fx.Scroll(d.tornLogScroller)}else{if(Fx.Scroll){i.fxScroll.toBottom()}}},clearLog:function(j){if(!j){i.fireEvent("clearLog");f=a.line.start;d.tornLogTable.empty()}e.empty();return i.send("Log initialized")},getDate:function(){return new Date()},duration:function(j){return !j?0:(i.getDate()-j)},formatDate:function(j){if(!j){j=i.getDate()}return j.format(a.line.dateFormat)}})})();
