M.core_dock={count:0,totalcount:0,items:[],earlybinds:[],Y:null,initialised:false,delayedevent:null,preventevent:null,holdingarea:null};M.core_dock.nodes={dock:null,body:null,panel:null};M.core_dock.cfg={buffer:10,position:'left',orientation:'vertical',spacebeforefirstitem:10,removeallicon:M.util.image_url('t/dock_to_block','moodle')};M.core_dock.css={dock:'dock',dockspacer:'dockspacer',controls:'controls',body:'has_dock',buttonscontainer:'buttons_container',dockeditem:'dockeditem',dockeditemcontainer:'dockeditem_container',dockedtitle:'dockedtitle',activeitem:'activeitem'};M.core_dock.init=function(Y){if(this.initialised){return true;} var css=this.css;this.initialised=true;this.Y=Y;this.nodes.body=Y.one(document.body);Y.augment(this.item,Y.EventTarget);Y.augment(this,Y.EventTarget,true);Y.Event.define("dock:actionkey",{_event:(Y.UA.webkit||Y.UA.ie)?'keydown':'keypress',_keys:{'37':'collapse','39':'expand','32':'toggle','13':'enter'},_keyHandler:function(e,notifier,args){if(!args.actions){var actObj={collapse:true,expand:true,toggle:true,enter:true};}else{var actObj=args.actions;} if(this._keys[e.keyCode]&&actObj[this._keys[e.keyCode]]){e.action=this._keys[e.keyCode];notifier.fire(e);}},on:function(node,sub,notifier){if(sub.args==null){sub._detacher=node.on(this._event,this._keyHandler,this,notifier,{actions:false});}else{sub._detacher=node.on(this._event,this._keyHandler,this,notifier,sub.args[0]);}},detach:function(node,sub,notifier){sub._detacher.detach();},delegate:function(node,sub,notifier,filter){if(sub.args==null){sub._delegateDetacher=node.delegate(this._event,this._keyHandler,filter,this,notifier,{actions:false});}else{sub._delegateDetacher=node.delegate(this._event,this._keyHandler,filter,this,notifier,sub.args[0]);}},detachDelegate:function(node,sub,notifier){sub._delegateDetacher.detach();}});this.publish('dock:beforedraw',{prefix:'dock'});this.publish('dock:beforeshow',{prefix:'dock'});this.publish('dock:shown',{prefix:'dock'});this.publish('dock:hidden',{prefix:'dock'});this.publish('dock:initialised',{prefix:'dock'});this.publish('dock:itemadded',{prefix:'dock'});this.publish('dock:itemremoved',{prefix:'dock'});this.publish('dock:itemschanged',{prefix:'dock'});this.publish('dock:panelgenerated',{prefix:'dock'});this.publish('dock:panelresizestart',{prefix:'dock'});this.publish('dock:resizepanelcomplete',{prefix:'dock'});this.publish('dock:starting',{prefix:'dock',broadcast:2,emitFacade:true});this.fire('dock:starting');this.applyBinds();if(typeof(customise_dock_for_theme)==='function'){try{customise_dock_for_theme();}catch(exception){}} var dock=Y.one('#dock');if(!dock){dock=Y.Node.create('
').append(Y.Node.create('
').append(Y.Node.create('
')));this.nodes.body.append(dock);}else{dock.addClass(css.dock+'_'+this.cfg.position+'_'+this.cfg.orientation);} this.holdingarea=Y.Node.create('
').setStyles({display:'none'});this.nodes.body.append(this.holdingarea);if(Y.UA.ie>0&&Y.UA.ie<7){dock.setStyle('height',dock.get('winHeight')+'px');} this.nodes.dock=dock;this.nodes.buttons=dock.one('.'+css.buttonscontainer);this.nodes.container=this.nodes.buttons.one('.'+css.dockeditemcontainer);if(Y.all('.block.dock_on_load').size()==0){dock.addClass('nothingdocked');}else{this.nodes.body.addClass(this.css.body).addClass(this.css.body+'_'+this.cfg.position+'_'+this.cfg.orientation);} this.fire('dock:beforedraw');var removeall=Y.Node.create(''+M.str.block.undockall+'');removeall.setAttribute('src',this.cfg.removeallicon);removeall.on('removeall|click',this.remove_all,this);removeall.on('dock:actionkey',this.remove_all,this,{actions:{enter:true}});this.nodes.buttons.appendChild(Y.Node.create('
').append(removeall));new(function(Y){return{enabled:false,init:function(){M.core_dock.on('dock:itemschanged',this.checkSizing,this);Y.on('windowresize',this.checkSizing,this);},checkSizing:function(){var dock=M.core_dock;var possibleheight=dock.nodes.dock.get('offsetHeight')-dock.nodes.dock.one('.controls').get('offsetHeight')-(dock.cfg.buffer*3)-(dock.items.length*2);var totalheight=0;for(var id in dock.items){var dockedtitle=Y.one(dock.items[id].title).ancestor('.'+dock.css.dockedtitle);if(dockedtitle){if(this.enabled){dockedtitle.setStyle('height','auto');} totalheight+=dockedtitle.get('offsetHeight')||0;}} if(totalheight>possibleheight){this.enable(possibleheight);}},enable:function(possibleheight){var dock=M.core_dock;var runningcount=0;var usedheight=0;this.enabled=true;for(var id in dock.items){var itemtitle=Y.one(dock.items[id].title).ancestor('.'+dock.css.dockedtitle);if(!itemtitle){continue;} var itemheight=Math.floor((possibleheight-usedheight)/(dock.count-runningcount));var offsetheight=itemtitle.get('offsetHeight');itemtitle.setStyle('overflow','hidden');if(offsetheight>itemheight){itemtitle.setStyle('height',itemheight+'px');usedheight+=itemheight;}else{usedheight+=offsetheight;} runningcount++;}}};})(Y).init();Y.delegate('click',this.handleEvent,this.nodes.dock,'.'+this.css.dockedtitle,this,{cssselector:'.'+this.css.dockedtitle,delay:0});Y.delegate('mouseenter',this.handleEvent,this.nodes.dock,'.'+this.css.dockedtitle,this,{cssselector:'.'+this.css.dockedtitle,delay:0.5,iscontained:true,preventevent:'click',preventdelay:3});this.nodes.dock.on('mouseleave',this.handleEvent,this,{cssselector:'#dock',delay:0.5,iscontained:false});this.nodes.body.on('click',this.handleEvent,this,{cssselector:'body',delay:0});this.on('dock:itemschanged',this.resizeBlockSpace,this);this.on('dock:itemschanged',this.checkDockVisibility,this);this.on('dock:itemschanged',this.resetFirstItem,this);this.fire('dock:initialised');return true;};M.core_dock.getPanel=function(){if(this.nodes.panel===null){this.nodes.panel=(function(Y,parent){var dockpanel=Y.Node.create('
');Y.augment(dockpanel,Y.EventTarget);dockpanel.publish('dockpanel:beforeshow',{prefix:'dockpanel'});dockpanel.publish('dockpanel:shown',{prefix:'dockpanel'});dockpanel.publish('dockpanel:beforehide',{prefix:'dockpanel'});dockpanel.publish('dockpanel:hidden',{prefix:'dockpanel'});dockpanel.publish('dockpanel:visiblechange',{prefix:'dockpanel'});dockpanel.contentNode=dockpanel.one('.dockeditempanel_content');dockpanel.contentHeader=dockpanel.contentNode.one('.dockeditempanel_hd');dockpanel.contentBody=dockpanel.contentNode.one('.dockeditempanel_bd');dockpanel.visible=false;dockpanel.show=function(){this.fire('dockpanel:beforeshow');this.visible=true;this.removeClass('dockitempanel_hidden');this.fire('dockpanel:shown');this.fire('dockpanel:visiblechange');};dockpanel.hide=function(){this.fire('dockpanel:beforehide');this.visible=false;this.addClass('dockitempanel_hidden');this.fire('dockpanel:hidden');this.fire('dockpanel:visiblechange');};dockpanel.setHeader=function(content){this.contentHeader.setContent(content);if(arguments.length>1){for(var i=1;i0&&Y.UA.ie<7){this.setY(newtop);}else{this.setStyle('top',newtop.toString()+'px');} return;};dockpanel.correctWidth=function(){var bd=this.one('.dockeditempanel_bd');var w=bd.get('clientWidth');var s=bd.get('scrollWidth');var ow=this.get('offsetWidth');var nw=w;var mw=Math.round(this.get('winWidth')*0.8);if(s>w){nw=w+(s-w)+((ow-w)*2)+10;} if(nw>mw){nw=mw;} if(nw>ow){this.setStyle('width',nw+'px');}} parent.append(dockpanel);return dockpanel;})(this.Y,this.nodes.dock);this.nodes.panel.on('panel:visiblechange',this.resize,this);this.Y.on('windowresize',this.resize,this);this.fire('dock:panelgenerated');} return this.nodes.panel;};M.core_dock.handleEvent=function(e,options){var item=this.getActiveItem();if(options.cssselector=='body'){if(!this.nodes.dock.contains(e.target)){if(item){item.hide();}}}else{var target;if(e.target.test(options.cssselector)){target=e.target;}else{target=e.target.ancestor(options.cssselector);} if(!target){return true;} if(this.preventevent!==null&&e.type===this.preventevent){return true;} if(options.preventevent){this.preventevent=options.preventevent;if(options.preventdelay){setTimeout(function(){M.core_dock.preventevent=null;},options.preventdelay*1000);}} if(this.delayedevent&&this.delayedevent.timeout){clearTimeout(this.delayedevent.timeout);this.delayedevent.event.detach();this.delayedevent=null;} if(options.delay>0){return this.delayEvent(e,options,target);} var targetid=target.get('id');if(targetid.match(/^dock_item_(\d+)_title$/)){item=this.items[targetid.replace(/^dock_item_(\d+)_title$/,'$1')];if(item.active){item.hide();}else{item.show();}}else if(item){item.hide();}} return true;};M.core_dock.delayEvent=function(event,options,target){var self=this;self.delayedevent=(function(){return{target:target,event:self.nodes.body.on('mousemove',function(e){self.delayedevent.target=e.target;}),timeout:null};})(self);self.delayedevent.timeout=setTimeout(function(){self.delayedevent.timeout=null;self.delayedevent.event.detach();if(options.iscontained==self.nodes.dock.contains(self.delayedevent.target)){self.handleEvent(event,{cssselector:options.cssselector,delay:0,iscontained:options.iscontained});}},options.delay*1000);return true;};M.core_dock.fixTitleOrientation=function(item,title,text){var Y=this.Y;var title=Y.one(title);if(M.core_dock.cfg.orientation!='vertical'){title.setContent(text);return title} if(Y.UA.ie>0&&Y.UA.ie<8){M.str.langconfig.thisdirectionvertical='ver';} var clockwise=false;switch(M.str.langconfig.thisdirectionvertical){case'ver':return title.setContent(text.split('').join('
'));case'ttb':clockwise=true;break;case'btt':clockwise=false;break;} if(Y.UA.ie>7){title.setContent(text);title.setAttribute('style','writing-mode: tb-rl; filter: flipV flipH;display:inline;');title.addClass('filterrotate');return title;} var test=Y.Node.create('

'+text+'

');this.nodes.body.append(test);var height=test.one('span').get('offsetWidth')+4;var width=test.one('span').get('offsetHeight')*2;var qwidth=width/4;test.remove();var txt=document.createElementNS('http://www.w3.org/2000/svg','text');txt.setAttribute('font-size','10px');if(clockwise){txt.setAttribute('transform','rotate(90 '+(qwidth/2)+' '+qwidth+')');}else{txt.setAttribute('y',height);txt.setAttribute('transform','rotate(270 '+qwidth+' '+(height-qwidth)+')');} txt.appendChild(document.createTextNode(text));var svg=document.createElementNS('http://www.w3.org/2000/svg','svg');svg.setAttribute('version','1.1');svg.setAttribute('height',height);svg.setAttribute('width',width);svg.appendChild(txt);title.append(svg);item.on('dockeditem:drawcomplete',function(txt,title){txt.setAttribute('fill',Y.one(title).getStyle('color'));},item,txt,title);return title;};M.core_dock.resizeBlockSpace=function(node){if(this.Y.all('.block.dock_on_load').size()>0){return;} var blockregions=[];var populatedblockregions=0;this.Y.all('.block-region').each(function(region){var hasblocks=(region.all('.block').size()>0);if(hasblocks){populatedblockregions++;} blockregions[region.get('id')]={hasblocks:hasblocks,bodyclass:region.get('id').replace(/^region\-/,'side-')+'-only'};});var bodynode=M.core_dock.nodes.body;var showregions=false;if(bodynode.hasClass('blocks-moving')){showregions=true;} var noblocksbodyclass='content-only';var i=null;if(populatedblockregions==0&&showregions==false){bodynode.addClass(noblocksbodyclass);for(i in blockregions){bodynode.removeClass(blockregions[i].bodyclass);}}else if(populatedblockregions==1&&showregions==false){bodynode.removeClass(noblocksbodyclass);for(i in blockregions){if(!blockregions[i].hasblocks){bodynode.removeClass(blockregions[i].bodyclass);}else{bodynode.addClass(blockregions[i].bodyclass);}}}else{bodynode.removeClass(noblocksbodyclass);for(i in blockregions){bodynode.removeClass(blockregions[i].bodyclass);}}};M.core_dock.add=function(item){item.id=this.totalcount;this.count++;this.totalcount++;this.items[item.id]=item;this.items[item.id].draw();this.fire('dock:itemadded',item);this.fire('dock:itemschanged',item);};M.core_dock.append=function(docknode){this.nodes.container.append(docknode);};M.core_dock.init_genericblock=function(Y,id){if(!this.initialised){this.init(Y);} new this.genericblock(id).initialise_block(Y,Y.one('#inst'+id));};M.core_dock.remove=function(uid){if(!this.items[uid]){return false;} this.items[uid].remove();delete this.items[uid];this.count--;this.fire('dock:itemremoved',uid);this.fire('dock:itemschanged',uid);return true;};M.core_dock.resetFirstItem=function(){this.nodes.dock.all('.'+this.css.dockeditem+'.firstdockitem').removeClass('firstdockeditem');if(this.nodes.dock.one('.'+this.css.dockeditem)){this.nodes.dock.one('.'+this.css.dockeditem).addClass('firstdockitem');}};M.core_dock.remove_all=function(e){for(var i in this.items){this.remove(i);} return true;};M.core_dock.hideActive=function(){var item=this.getActiveItem();if(item){item.hide();}};M.core_dock.checkDockVisibility=function(){if(!this.count){this.nodes.dock.addClass('nothingdocked');this.nodes.body.removeClass(this.css.body).removeClass(this.css.body+'_'+this.cfg.position+'_'+this.cfg.orientation);this.fire('dock:hidden');}else{this.fire('dock:beforeshow');this.nodes.dock.removeClass('nothingdocked');this.nodes.body.addClass(this.css.body).addClass(this.css.body+'_'+this.cfg.position+'_'+this.cfg.orientation);this.fire('dock:shown');}};M.core_dock.on=function(event,callback){this.earlybinds.push({event:event,callback:callback});};M.core_dock.applyBinds=function(){for(var i in this.earlybinds){var bind=this.earlybinds[i];this.on(bind.event,bind.callback);} this.earlybinds=[];};M.core_dock.resize=function(){this.fire('dock:panelresizestart');var panel=this.getPanel();var item=this.getActiveItem();if(!panel.visible||!item){return;} if(this.cfg.orientation=='vertical'){var buffer=this.cfg.buffer;var screenheight=parseInt(this.nodes.body.get('winHeight'))-(buffer*2);var docky=this.nodes.dock.getY();var titletop=item.nodes.docktitle.getY()-docky-buffer;var containery=this.nodes.container.getY();var containerheight=containery-docky+this.nodes.buttons.get('offsetHeight');var scrolltop=panel.contentBody.get('scrollTop');panel.contentBody.setStyle('height','auto');panel.removeClass('oversized_content');var panelheight=panel.get('offsetHeight');if(this.Y.UA.ie>0&&this.Y.UA.ie<7){panel.setTop(item.nodes.docktitle.getY());}else if(panelheight>screenheight){panel.setTop(buffer-containerheight);panel.contentBody.setStyle('height',(screenheight-panel.contentHeader.get('offsetHeight'))+'px');panel.addClass('oversized_content');}else if(panelheight>(screenheight-(titletop-buffer))){var difference=panelheight-(screenheight-titletop);panel.setTop(titletop-containerheight-difference+buffer);}else{panel.setTop(titletop-containerheight+buffer);} if(scrolltop){panel.contentBody.set('scrollTop',scrolltop);}} if(this.cfg.position=='right'){panel.setStyle('left',-panel.get('offsetWidth')+'px');}else if(this.cfg.position=='top'){var dockx=this.nodes.dock.getX();var titleleft=item.nodes.docktitle.getX()-dockx;panel.setStyle('left',titleleft+'px');} this.fire('dock:resizepanelcomplete');return;};M.core_dock.getActiveItem=function(){for(var i in this.items){if(this.items[i].active){return this.items[i];}} return false;};M.core_dock.genericblock=function(id){if(id){this.id=id;}};M.core_dock.genericblock.prototype={Y:null,id:null,cachedcontentnode:null,blockspacewidth:null,skipsetposition:false,isdocked:false,initialise_block:function(Y,node){M.core_dock.init(Y);this.Y=Y;if(!node){return false;} var commands=node.one('.header .title .commands');if(!commands){commands=this.Y.Node.create('
');if(node.one('.header .title')){node.one('.header .title').append(commands);}} var moveto=Y.Node.create('');moveto.setAttribute('src',M.util.image_url('t/block_to_dock','moodle'));moveto.on('movetodock|click',this.move_to_dock,this,commands);var blockaction=node.one('.block_action');if(blockaction){blockaction.prepend(moveto);}else{commands.append(moveto);} if(node.hasClass('dock_on_load')){node.removeClass('dock_on_load');this.skipsetposition=true;this.move_to_dock(null,commands);} return this;},move_to_dock:function(e,commands){if(e){e.halt(true);} var Y=this.Y;var dock=M.core_dock;var node=Y.one('#inst'+this.id);var blockcontent=node.one('.content');if(!blockcontent){return;} var blockclass=(function(classes){var r=/(^|\s)(block_[a-zA-Z0-9_]+)(\s|$)/;var m=r.exec(classes);return(m)?m[2]:m;})(node.getAttribute('className').toString());this.cachedcontentnode=node;node.replace(Y.Node.getDOMNode(Y.Node.create('
')));M.core_dock.holdingarea.append(node);node=null;var blocktitle=Y.Node.getDOMNode(this.cachedcontentnode.one('.title h2')).cloneNode(true);var blockcommands=this.cachedcontentnode.one('.title .commands');if(!blockcommands){blockcommands=Y.Node.create('
');this.cachedcontentnode.one('.title').append(blockcommands);} var movetoimg=Y.Node.create(''+M.str.block.undockitem+'');movetoimg.setAttribute('src',M.util.image_url('t/dock_to_block','moodle'));var moveto=Y.Node.create('').append(movetoimg);if(location.href.match(/\?/)){moveto.set('href',location.href+'&dock='+this.id);}else{moveto.set('href',location.href+'?dock='+this.id);} blockcommands.append(moveto);var dockitem=new dock.item(Y,this.id,blocktitle,blockcontent,blockcommands,blockclass);dockitem.on('dockeditem:drawcomplete',function(e){this.contents.all('.moveto').on('returntoblock|click',function(e){e.halt();dock.remove(this.id);},this);this.commands.all('.moveto').on('returntoblock|click',function(e){e.halt();dock.remove(this.id);},this);var closeicon=Y.Node.create('');closeicon.one('img').setAttribute('src',M.util.image_url('t/dockclose','moodle'));closeicon.on('forceclose|click',this.hide,this);closeicon.on('dock:actionkey',this.hide,this,{actions:{enter:true,toggle:true}});this.commands.append(closeicon);},dockitem);dockitem.on('dockeditem:itemremoved',this.return_to_block,this,dockitem);dock.add(dockitem);if(!this.skipsetposition){M.util.set_user_preference('docked_block_instance_'+this.id,1);}else{this.skipsetposition=false;} this.isdocked=true;},return_to_block:function(dockitem){var placeholder=this.Y.one('#content_placeholder_'+this.id);if(this.cachedcontentnode.one('.header')){this.cachedcontentnode.one('.header').insert(dockitem.contents,'after');}else{this.cachedcontentnode.insert(dockitem.contents);} placeholder.replace(this.Y.Node.getDOMNode(this.cachedcontentnode));this.cachedcontentnode=this.Y.one('#'+this.cachedcontentnode.get('id'));var commands=this.cachedcontentnode.one('.title .commands');if(commands){commands.all('.hidepanelicon').remove();commands.all('.moveto').remove();commands.remove();} this.cachedcontentnode.one('.title').append(commands);this.cachedcontentnode=null;M.util.set_user_preference('docked_block_instance_'+this.id,0);this.isdocked=false;return true;}};M.core_dock.item=function(Y,uid,title,contents,commands,blockclass){this.Y=Y;this.publish('dockeditem:drawstart',{prefix:'dockeditem'});this.publish('dockeditem:drawcomplete',{prefix:'dockeditem'});this.publish('dockeditem:showstart',{prefix:'dockeditem'});this.publish('dockeditem:showcomplete',{prefix:'dockeditem'});this.publish('dockeditem:hidestart',{prefix:'dockeditem'});this.publish('dockeditem:hidecomplete',{prefix:'dockeditem'});this.publish('dockeditem:itemremoved',{prefix:'dockeditem'});if(uid&&this.id==null){this.id=uid;} if(title&&this.title==null){this.titlestring=title.cloneNode(true);this.title=document.createElement(title.nodeName);M.core_dock.fixTitleOrientation(this,this.title,this.titlestring.firstChild.nodeValue);} if(contents&&this.contents==null){this.contents=contents;} if(commands&&this.commands==null){this.commands=commands;} if(blockclass&&this.blockclass==null){this.blockclass=blockclass;} this.nodes=(function(){return{docktitle:null,dockitem:null,container:null};})();};M.core_dock.item.prototype={Y:null,id:null,name:null,title:null,titlestring:null,contents:null,commands:null,active:false,blockclass:null,nodes:null,draw:function(){this.fire('dockeditem:drawstart');var Y=this.Y;var css=M.core_dock.css;this.nodes.docktitle=Y.Node.create('
');this.nodes.docktitle.append(this.title);this.nodes.dockitem=Y.Node.create('
');this.nodes.dockitem.on('dock:actionkey',this.toggle,this);if(M.core_dock.count===1){this.nodes.dockitem.addClass('firstdockitem');} this.nodes.dockitem.append(this.nodes.docktitle);M.core_dock.append(this.nodes.dockitem);this.fire('dockeditem:drawcomplete');return true;},show:function(){M.core_dock.hideActive();var Y=this.Y;var css=M.core_dock.css;var panel=M.core_dock.getPanel();this.fire('dockeditem:showstart');panel.setHeader(this.titlestring,this.commands);panel.setBody(Y.Node.create('
').append(this.contents));panel.show();panel.correctWidth();this.active=true;this.nodes.docktitle.addClass(css.activeitem);this.fire('dockeditem:showcomplete');M.core_dock.resize();return true;},hide:function(){var css=M.core_dock.css;this.fire('dockeditem:hidestart');this.active=false;this.nodes.docktitle.removeClass(css.activeitem);M.core_dock.getPanel().hide();this.fire('dockeditem:hidecomplete');},toggle:function(e){var css=M.core_dock.css;if(this.nodes.docktitle.hasClass(css.activeitem)&&!(e.type=='dock:actionkey'&&e.action=='expand')){this.hide();}else if(!this.nodes.docktitle.hasClass(css.activeitem)&&!(e.type=='dock:actionkey'&&e.action=='collapse')){this.show();}},remove:function(){this.hide();this.nodes.dockitem.remove();this.fire('dockeditem:itemremoved');}};