/**
 * MusicMiner Web Server
 * www.soundminer.com
 * Copyright 2006-2008 Soundminer, Inc. All Rights Reserved.
 **/
var DEBUG=true;function trace(){}
function debug(){}
function onDebug(){E.show('fvlogger');return false;}
function trueFunc(){return true;}
function $$$(selector,root){return document.getElementsBySelector(selector,root);}
function htmlspecialchars(str){return str.replace(/&/g,'&amp;').replace(/"/g,'&quot;').replace(/</g,'&lt;').replace(/>/g,'&gt;');}
var Mlib={getTpl:function(name,root){trace('getTpl( '+name+' )',1);name='tpl-'+name;var tpl=$(name);if(!tpl){if(!root)root=document;if($(root))root=$(root);tpls=E.find(root,'div','tpls');if(tpls)tpl=E.find(tpls,'div',name);}
if(tpl){var i=0;for(i=0;i<tpl.childNodes.length&&tpl.childNodes[i].nodeType!=1;i++);if(i<tpl.childNodes.length)tpl=tpl.childNodes[i].cloneNode(true);else tpl=null;}
trace('getTpl()',-1);return tpl;},murl:function(url){return _root+url;},parseJsonHtml:function(text){trace('Mlib.parseJsonHtml()');var delim='\n\b\n';var index1=text.indexOf(delim);if(index1>=0){index1+=delim.length;var index2=text.indexOf(delim,index1);if(index2>=0)return{'json':text.substring(index1,index2).evalJSON(),'html':text.substring(index2+delim.length)};else return{'json':result.substring(index1).evalJSON(),'html':null};}
else return{'json':null,html:text};},onRemoteError:function(resp,text,tag){if(typeof(text)=='object')alert(text.text);else alert(text);},onRemoteCommand:function(resp,text,tag){var cmds=text.evalJSON();if(!(cmds instanceof Array))cmds=[cmds];for(var i=0;i<cmds.length;i++){switch(cmds[i].command){case 'alert':alert(cmds[i].message);break;case 'confirm':if(!confirm(cmds[i].message))return;break;case 'redirect':window.location=cmds[i].location;break;case 'refresh':window.location.reload();break;}}},remotePost:function(url,params,callback,render,tag){trace('Mlib.remotePost( '+url+' )',1);if(url===undefined)url='';if(params===undefined)params=null;if(!render)render='json';var func=function(response){var text=response.responseText;var mime=request.header('Content-Type');var resp={'mime':mime,'error':!request.responseIsSuccess(),'success':request.responseIsSuccess(),'status':response.status,'text':text,'params':params,'render':render,'tag':tag}
if(mime=='application/mlib')return Mlib.onRemoteCommand(resp,text,tag);else if(mime=='application/jsonhtml')text=Mlib.parseJsonHtml(text);else if(/application\/json/.test(mime))text=text.evalJSON();if((!callback||!callback(resp,text,tag))&&resp.error&&Mlib.onRemoteError)Mlib.onRemoteError(resp,text,tag);}
var request=new Ajax.Request(Mlib.murl(url),{method:'post',asynchronous:true,onComplete:func,parameters:typeof(params)=='object'?H.query(params):params,requestHeaders:['X_MLIB_RENDER',render,'X_MLIB_MRL',1]});trace('Mlib.remotePost()',-1);},iframe:function(url){var frm=document.createElement('iframe');frm.style.visibility='hidden';document.body.appendChild(frm);frm.src=this.murl(url);},heartbeat:function(interval,url,params,callback,tag){this.remotePost(this.murl(url||'/heartbeat'),params,callback,null,tag);setInterval(function(){this.remotePost(this.murl(url||'/heartbeat'),params,callback,null,tag);}.bind(this),(interval||60)*1000);},uniqueId:function(prefix){if(!prefix)prefix='id';var now=new Date();now=now.getTime();return prefix+'_'+now+'_'+Math.random()*Math.pow(10,19);},pluralize:function(word){if(word.charAt(word.length-1)=='y')return word.substring(0,word.length-1)+'ies';return word+'s';},plurality:function(count,word){if(count!=1)return Mlib.pluralize(word);return word;},place:function(element,anchor,client,place){var point,crect,rect,wrect;if(anchor instanceof Array)point=anchor;else{point=Position.actualOffset(anchor);point[1]+=anchor.offsetHeight+1;}
rect={left:point[0],top:point[1],width:element.offsetWidth,height:element.offsetHeight};wrect={left:0,top:0,width:window.getWidth(),height:window.getHeight()};if(client){var cpoint=Position.actualOffset(client);crect={left:cpoint[0],top:cpoint[1],width:client.offsetWidth,height:client.offsetHeight};}
else crect=wrect;do{if(rect.left<crect.left)rect.left=crect.left;if(rect.left+rect.width>crect.left+crect.width){if(anchor instanceof Array)rect.left-=rect.width;else rect.left=rect.left+anchor.offsetWidth-rect.width;}
if(rect.top<crect.top)rect.top=crect.top;if(rect.top+rect.height>crect.top+crect.height){if(anchor instanceof Array)rect.top-=rect.height;else rect.top=rect.top-anchor.offsetHeight-rect.height;if(rect.top<crect.top)rect.top=crect.top+crect.height-rect.height;if(rect.top<crect.top)rect.top=crect.top;}}while(crect!=wrect&&(crect=wrect));if(place)E.setPosition(element,[rect.left,rect.top]);return[rect.left,rect.top];},place_size:function(element,anchor,client,size){var point,crect,rect,wrect;trace('client: '+client);if(anchor instanceof Array)point=anchor;else{point=Position.actualOffset(anchor);point[1]+=anchor.offsetHeight+1;}
rect={left:point[0],top:point[1],width:element.offsetWidth,height:element.offsetHeight};wrect={left:0,top:0,width:window.getWidth(),height:window.getHeight()};if(client){var cpoint=Position.actualOffset(client);crect={left:cpoint[0],top:cpoint[1],width:client.offsetWidth,height:client.offsetHeight};}
else crect=wrect;if(rect.left<crect.left)rect.left=crect.left;if(rect.left+rect.width>crect.left+crect.width){if(anchor instanceof Array)rect.left-=rect.width;else rect.left=rect.left+anchor.offsetWidth-rect.width;}
if(rect.top<crect.top)rect.top=crect.top;if(rect.top+rect.height>crect.top+crect.height){if(size){if(rect.top+rect.height>crect.top+crect.height)rect.height=crect.top+crect.height-rect.top;else{rect.height=null;rect.width=null;}}
else{if(anchor instanceof Array)rect.top-=rect.height;else rect.top=rect.top-anchor.offsetHeight-rect.height;if(rect.top<crect.top)rect.top=crect.top+crect.height-rect.height;if(rect.top<crect.top)rect.top=crect.top;}}
trace('crect: '+Json.encode(crect));trace('rect: '+Json.encode(rect));return rect;}}
var Control=Class.create({mrl:null,parent:null,url:'',wrap:null,view:null,type:false,copy:null,defaults:{},validation:{},_onAction:null,action_refresh:'index',action_update:'update',update_return:'status',auto_form:false,val_method:'defaults',initialize:function(parent,view,type,onAction,mrl){trace('Control.initialize( '+this.mrl+', '+view+', '+type+' )',1);this.parent=parent;switch(type){case 'wrap':this.wrap=$(view);break;case 'append':this.wrap=$(view);break;default:this.view=$(view);}
this.type=type;this.url=mrl||this.mrl;this._onAction=onAction;this.__create();this.build(null);this.place();this.apply();trace('Control.initialize()',-1);},build:function(html){this.__build(html);this.__built();},apply:function(element,rules,skip_root){trace('apply');var start=(new Date()).getTime();this.__apply(element,rules,skip_root);trace('time: '+(((new Date()).getTime()-start))/1000.0);},murl:function(url){if(!url||url.length==0)return this.url;if(url[0]=='/')return url;else return this.url+'/'+url;},open:function(options){return this.__open(options);},place:function(anchor){this.__place(anchor);},close:function(result){this.__close(result);},setClose:function(func){this.onClose=func;},remove:function(){this.__remove();},focus:function(){trace('Control.focus(): '+this.view);Focus.focus(this.view);},blur:function(){trace('Control.blur(): '+this.view);Focus.blur(this.view);},focused:function(){return Focus.focused(this.view);},loaded:function(){return!!this.view;},action:function(action,tag){return this.__action(action,tag);},showing:function(){return this.__showing();},flash:function(msg,good){var divs=this.view.getElementsByTagName('div');for(var i=divs.length-1;i>=0;i--){if(E.hasClassName(divs[i],'flash')||divs[i].id=='flash'){E.setClassData(divs[i],'flash-',good?'good':'bad');divs[i].innerHTML=msg;divs[i].style.display='block';}}},unflash:function(){var divs=this.view.getElementsByTagName('div');for(var i=divs.length-1;i>=0;i--)if(E.hasClassName(divs[i],'flash')||divs[i].id=='flash')divs[i].style.display='none';},__create:function(){},__build:function(html){trace('Control.__build()',1);if(html){if(this.wrap){if(this.type=='append'){var div=document.createElement('div');div.innerHTML=html;if(div.childNodes.length==0)this.view=null;else if(div.childNodes.length==1)this.view=div.removeChild(div.childNodes[0]);else alert('Error: The AJAX returned HTML expands to more than a single-rooted DOM node.');if(this.view)this.wrap.appendChild(this.view);}
else{this.wrap.innerHTML=html;this.view=E.first(this.wrap);}}
else{var div=document.createElement('div');div.innerHTML=html;if(this.view&&this.view.parentNode){if(div.childNodes.length==0){this.view.parentNode.removeChild(this.view);this.view=null;}
else if(div.childNodes.length==1){view=div.childNodes[0];this.view.parentNode.replaceChild(view,this.view);this.view=view;}
else alert('Error: The AJAX returned HTML expands to more than a single-rooted DOM node.');}
else if(div.childNodes.length==0)this.view=null;else if(div.childNodes.length==1)this.view=div.removeChild(div.childNodes[0]);else alert('Error: The AJAX returned HTML expands to more than a single-rooted DOM node.');}}
else this.view=this.wrap?E.first(this.wrap):(this.view?this.view:null);if(this.auto_form&&this.view)this.url=this.url||this.view.action;trace('Control.__build()',-1);},__built:function(){if(this.auto_form&&this.view){this.copy=this.clone();this.defaults=this.extract(true);}},__apply:function(element,rules,skip_root){trace('Control.__apply()',1);if(!rules&&this.rules)rules=this.rules;if(!element)element=this.view;if(element)Behaviour.assign(rules,element,this,skip_root);trace('Control.__apply()',-1);},__place:function(){},__open:function(options){this.action('open');},__close:function(result){this.action('close',result);},__remove:function(){if(this.view){if(this.view.parentNode)E.remove(this.view);this.view=null;}},__showing:function(){if(!this.loaded())this.refresh();},__action:function(action,tag){if(this._onAction)return this._onAction(this,action,tag);return null;},refresh:function(action,params,tag){this.__refresh(action,params,tag);},__refresh:function(action,params,tag){trace('Control.__refresh( '+action+' )');if(this.view)E.addClassName(this.view,'refreshing');else if(this.wrap)E.addClassName(this.wrap,'loading');this.action('refresh-begin',tag);this.remote(action,params,this.__backRefresh.bind(this),'ctrl',tag);},__backRefresh:function(resp,html,tag){trace('Control.__backRefresh()',1);if(this.view)E.removeClassName(this.view,'refreshing');else if(this.wrap)E.removeClassName(this.wrap,'loading');if(resp.success){this.build(html);this.place();this.apply();this.action('refreshed',tag);}
else this.action('refresh-failed',tag);this.action('refresh-end',tag);trace('Control.__backRefresh()',-1);},__backFlash:function(resp,html,tag){var fx=new FxColor({'duration':1000,'from':resp.success?0x55ff55:0xff5555,'to':0xeeeeee,'element':this.view,'style':'background','clear':'transparent','auto':true});},encode:function(params){if(typeof params=='object'&&!(params instanceof Array)){for(var prop in params)if(typeof params[prop]=='object')params[prop]=Json.encode(params[prop]);}
return params;},update:function(action,params,validate){if(validate){var result=this.validates(params);if(result.length){alert('Validation Error\n\n'+result[1].join('\n'));}}
if(!validate||!result.length)this.__update(action,params)},__update:function(action,params){var copy=this.clone(true);E.addClassName(this.view,'updating');this.remote(action,this.encode(params),'__backUpdate',this.update_return,{'copy':copy,'params':params});},__backUpdate:function(resp,json,tag){if(resp.success){var copy=tag.copy;this.view.parentNode.replaceChild(copy,this.view);this.view=copy;this.__backUpdateX(resp,json,tag);this.copy=this.clone();this.build();this.apply();this.action('updated',tag.params);}
E.removeClassName(this.view,'updating');var fx=new FxColor({'duration':1000,'from':resp.success?0x55ff55:0xff5555,'to':0xeeeeee,'element':this.view,'style':'background','clear':'','auto':true});},__backUpdateX:function(resp,json,tag){},reset:function(){this.__reset();},__reset:function(){var copy=E.clone(this.copy);this.view.parentNode.replaceChild(copy,this.view);this.view=copy;this.build();this.apply();},extract:function(defaults){return this.__extract(defaults);},__extract:function(defaults){return MForm.extract_params(this.view);},clone:function(clean){return this.__clone(clean);},__clone:function(clean){var clone=E.clone(this.view);if(clean){for(var tag in E.field_tags){var fields=clone.getElementsByTagName(tag);if(tag=='INPUT'){for(var i=fields.length-1;i>=0;i--){if(fields[i].type=='password')fields[i].value='';E.removeClassPrefixed(fields[i],'v-');}}
else for(var i=fields.length-1;i>=0;i--)E.removeClassPrefixed(fields[i],'v-');}}
return clone;},defs:function(){for(var i=0;i<this.view.elements.length;i++)this.view.elements[i].def=E.value(this.view.elements[i]);},validating:function(field){return this.__validating(field);},__validating:function(field){var name=field.name;var value=E.value(field);var rule=this.validation[name];if(!rule)rule=this.validation[E.getClassData(field,'val-')];if(rule)return MForm.validating(rule,field,field.def!==undefined?field.def:(this.defaults?this.defaults[name]:undefined),this);},validate:function(name,value,rule){return MForm.validate(rule,value,this);},validates:function(params,rules){if(!rules)rules=this.validation;var names=[];var complaints=[];for(var name in rules){if(this.validate(name,params[name],rules[name])===false){names.push(name);complaints.push(rules[name].msg?rules[name].msg:false);}}
if(names.length)return[names,complaints];return[];},_getTpl:function(name){return Mlib.getTpl(name,this.view);},remote:function(url,params,callback,render,tag){if(typeof(callback)=='string')callback=this[callback].bind(this);return Mlib.remotePost(this.murl(url),params,callback,render,tag);},_remotePost:function(url,params,callback,render,tag){return this.remote(url,params,callback,render,tag);},onFocus:function(event){trace(Event.element(event).tagName+'.'+Event.element(event).className);E.addClassName(this.view,'focused');},onBlur:function(event){E.removeClassName(this.view,'focused');},onFieldChange:function(event){this.validating(Event.element(event));},onSubmit:function(event){Event.stop(event);this.update(this.action_update,this.extract(),true);},onRefresh:function(event){Event.stop(event);this.refresh();},onReset:function(event){Event.stop(event);this.reset();}});var FormCtrl=Control.extend({rules:{'form input:keyup, form input:change, form textarea:keyup, form textarea:change':'onFieldChange','form:submit':'onSubmit','form:reset':'onReload'}});var DialogCtrl=Control.extend({_dialog:true,anchor:null,client:null,_onDocMouseDown:null,_onDocKeyDown:null,_onDocMouseMove:null,_onDocMouseOver:null,place:function(anchor,client){if(anchor)this.anchor=anchor;if(client)this.client=client;this.sup();},open:function(anchor,client){this.place(anchor,client);this.sup();},__open:function(){trace('DialogCtrl.__open()');if(this._dialog){if(!this._onDocMouseDown){Event.observe(document,'mousedown',this._onDocMouseDown=this.onDocMouseDown.bind(this),true);Event.observe(document,'keydown',this._onDocKeyDown=this.onDocKeyDown.bind(this));Event.observe(document,'mousemove',this._onDocMouseMove=this.onKillEvent.bind(this),true);Event.observe(document,'mouseover',this._onDocMouseOver=this.onKillEvent.bind(this),true);}
Fix.floatOn(document.body);this.view.style.display="block";this.view.style.visibility="visible";setTimeout(function(){this.focus();}.bind(this),0);}
this.sup();},__place:function(){trace('DialogCtrl.__place()');this.sup();if(this.anchor)Mlib.place(this.view,this.anchor,this.client?this.client:null,true);},__close:function(result){trace('DialogCtrl.__close()');if(this._dialog){this.blur();Event.stopObserving(document,'mousedown',this._onDocMouseDown,true);Event.stopObserving(document,'keydown',this._onDocKeyDown);Event.stopObserving(document,'mousemove',this._onDocMouseMove,true);Event.stopObserving(document,'mouseover',this._onDocMouseOver,true);this._onDocMouseDown=null;this._onDocKeyDown=null;this._onDocMouseMove=null;this._onDocMouseOver=null;if(this.view)this.view.style.display='none';Fix.floatOff(document.body);}
return this.sup(result);},onDocMouseDown:function(event){trace('DialogCtrl.onDocMouseDown()');if(!E.childOf(Event.element(event),this.view)){trace('CHILD OF');Event.stop(event);this.close(false);}},onKillEvent:function(event){if(!E.childOf(Event.element(event),this.view))Event.stop(event);},onDocKeyDown:function(event){switch(event.keyCode){case Event.KEY_ESC:Event.stop(event);this.close(false);break;}}});var Popup=DialogCtrl.extend({props:null,selected:null,rules:{':focus':'onFocus',':blur':'onBlur',':keypress':'onKeyPress','li:mousedown':'onMouseDown','li:mouseup':'onMouseUp','li input:click':'onInputClick','li:mouseover':'onMouseOver'},initialize:function(props){this.props=props;this.anchor=props.anchor;if(props.client)this.client=props.client;this.sup(null,null,null,props.onClose);if(props.open)this.open();},__build:function(html){if(!this.view){if(typeof(this.props.element)=='function')this.view=this.props.element();else if(typeof(this.props.element)=='string')this.view=Mlib.getTpl(this.props.element,document.body,true);$('wrap').appendChild(this.view);if(this.props.onBuild)this.props.onBuild(this);}
this.sup(html);},__place:function(){if(this.anchor){this.view.style.visibility='hidden';this.view.style.display='block';var rect=Mlib.place_size(this.view,this.anchor,this.client?this.client:null,this.props.size);E.setPosition(this.view,[rect.left,rect.top]);if(rect.height)E.setDimensions(E.first(this.view),rect,true);}},__close:function(result){this.sup(result);if(this.selected)E.removeClassName(this.selected,'selected');this.selected=null;},select:function(li){if(li!=this.selected){if(this.selected)E.removeClassName(this.selected,'selected');this.selected=li;if(this.selected)E.addClassName(this.selected,'selected');}},click:function(li){var input=E.find(li,'input');if(input)input.checked=!input.checked;this.close(li);},onFocus:function(event){Event.stop(event);E.addClassName(Event.element(event),'focused');},onBlur:function(event){Event.stop(event);E.removeClassName(Event.element(event),'focused');},allow_click:false,onMouseDown:function(event){if(Event.element(event).tagName.toUpperCase()=='INPUT')this.allow_click=true;},onMouseUp:function(event){if(!this.allow_click){Event.stop(event);this.click(E.findUp(Event.element(event),'li'));}
this.allow_click=false;},onInputClick:function(event){this.close(E.findUp(Event.element(event),'li'));},onMouseOver:function(event){Event.stop(event);this.select(E.findUp(Event.element(event),'li'));},onKeyPress:function(event){switch(Event.keyCode(event)){case Event.KEY_SPACE:case Event.KEY_RETURN:if(this.selected){Event.stop(event);this.click(this.selected);break;}
case Event.KEY_ESC:Event.stop(event);this.close(false);break;case Event.KEY_DOWN:Event.stop(event);if(this.selected){var next=E.next(this.selected,'li');if(next)this.select(next);}
else this.select(E.first(E.find(this.view,'ul'),'li'));break;case Event.KEY_UP:Event.stop(event);if(this.selected){var prev=E.prev(this.selected,'li');if(prev)this.select(prev);}
else this.select(E.last(E.find(this.view,'ul'),'li'));break;}}});var TableCtrl=Control.extend({div:null,table:null,thead:null,tbody:null,single_select:false,_rules:{':mousedown':['onMouseDown',true],':xfocus':'onFocus',':xblur':'onBlur',':keypress':'onKeyPress','tbody:mousedown':'onTableDown','tbody:click':'onTableClick','tbody:dblclick':'onTableDbl'},getTr:function(elem){return E.findUp(elem,'tr');},getId:function(tr){return tr.id.split('-')[1];},getIds:function(trs){var ids=[];for(var i=0;i<trs.length;i++)ids.push(this.getId(trs[i]));return ids;},ids:function(trs){var ids=[];for(var i=0;i<trs.length;i++)ids.push(this.getId(trs[i]));return ids;},getSelected:function(){return this.selecteds();},selecteds:function(){var trs=[];var tr=E.first(this.tbody,'tr');while(tr){if(this.selected(tr))trs.push(tr);tr=E.next(tr,'tr');}
return trs;},selected:function(tr){if(tr)return E.hasClassName(tr,'selected');return this.selectedFirst();},selectedFirst:function(){return E.first(this.tbody,'tr','selected');},selectedLast:function(){return E.last(this.tbody,'tr','selected');},_selectedOnly:function(){var tr=this.selectedFirst();if(!tr){tr=E.first(this.tbody,'tr');if(tr)this.select(tr);}
if(tr)E.scrollToTarget(this.div,tr);return tr;},_select:function(tr,select){if(E.hasClassName(tr,'selected')!=select){if(select)E._addClassName(tr,'selected');else E.removeClassName(tr,'selected');return true;}
return false;},_selectAll:function(skip,select){var changed=false;var tr=E.first(this.tbody,'tr');while(tr){if(tr!=skip)changed|=this._select(tr,select);tr=E.next(tr,'tr');}
return changed;},_selectShift:function(tr){this._select(tr,true);var found=[];var last=false;var tr=this.selectedFirst();while(tr){if(this.selected(tr))last=tr;found.push(tr);tr=E.next(tr,'tr');}
if(found.length){for(var i=0;i<found.length;i++){this._select(found[i],true);if(found[i]===last)break;}}},deselect:function(tr){if(!tr)this._selectAll(null,false);else this._select(tr,false);},select:function(tr,meta,shift,up){var changed=false;if(this.single_select){if(!up&&!this.selected(tr)){this._select(tr,true);this._selectAll(tr,false);changed=true;}}
else{if(!up){if(meta){this._select(tr,!this.selected(tr));changed=true;}
else if(shift){this._selectShift(tr);changed=true;}
else if(!this.selected(tr)){this._select(tr,true);this._selectAll(tr,false);changed=true;}}
else if(!meta&&!shift)changed=this._selectAll(tr,false);}
if(changed)this.action('select',{'tr':tr,'meta':meta,'shift':shift,'up':up});},first:function(){var tr=E.first(this.tbody,'tr');while(tr&&!E.visible(tr))tr=E.next(tr,'tr');return tr;},last:function(){var tr=E.last(this.tbody,'tr');while(tr&&!E.visible(tr))tr=E.prev(tr,'tr');return tr;},prev:function(tr){if(!tr)return this.last();while((tr=E.prev(tr,'tr'))&&!E.visible(tr));return tr;},next:function(tr){if(!tr)return this.first();while((tr=E.next(tr,'tr'))&&!E.visible(tr));return tr;},__build:function(html){trace('TableCtrl.__build()',1);this.sup(html);if(this.view){this.table=E.find(this.view,'table','table')||E.find(this.view,'table','mtable');if(this.table){this.div=this.table.offsetParent;this.thead=E.first(this.table,'thead');this.tbody=E.first(this.table,'tbody');this.single_select=E.hasClassName(this.table,'single-select');}
else this.div=this.thead=this.tbody=null;}
trace('TableCtrl.__build()',-1);},__apply:function(element,rules){trace('TableCtrl.__apply()',1);if(!rules){var _element=element;if(!_element)_element=this.view;if(_element)Behaviour.apply(this._rules,_element,this);}
this.sup(element,rules);trace('TableCtrl.__apply()',-1);},onFocus:function(event){this.sup(event);var trs=this.selecteds();},shift:false,onKeyPress:function(event){if(Element.isField(Event.element(event)))return;switch(Event.keyCode(event)){case Event.KEY_UP:Event.stop(event);var tr=this.prev(this.selectedFirst());if(tr)this.select(tr,false,event.shiftKey);else if(!event.shiftKey)this.select(this.first(),false,false,true);if(tr){if(E.prev(tr,'tr'))E.scrollToTarget(this.div,tr)
else E.scrollToTarget(this.div,this.thead);}
break;case Event.KEY_DOWN:Event.stop(event);var tr=this.next(this.selectedLast());if(tr)this.select(tr,false,event.shiftKey);else if(!event.shiftKey)this.select(this.last(),false,false,true);if(tr){if(E.prev(tr,'tr'))E.scrollToTarget(this.div,tr)
else E.scrollToTarget(this.div,this.thead);}
break;case 16:this.shift=true;return;case 0:case Event.KEY_TAB:break;case Event.KEY_ESC:this.deselect();break;}
if(this.shift)this.shift=false;},onMouseDown:function(event){if(Element.isField(Event.element(event)))return;trace('TableCtrl.onMouseDown');this.focus();},onTableDown:function(event){if(Element.isField(Event.element(event)))return;Fix.selectionMouseDown(event);var tr=this.getTr(Event.element(event));this.allowTextClick=tr&&this.selected(tr)&&this.selecteds().length==1&&!(event.ctrlKey||event.metaKey);if(tr){trace('TableCtrl.onTableDown()');Fix.selectionMouseDown(event);this.select(tr,event.metaKey||event.ctrlKey,event.shiftKey);}},onTableClick:function(event){if(Element.isField(Event.element(event)))return;var tr=this.getTr(Event.element(event));if(tr)this.select(tr,event.metaKey||event.ctrlKey,event.shiftKey,true);},onTableDbl:function(event){}});