Automatic installer.php lang files by installer_builder (20070726)
[moodle-linuxchix.git] / lib / ajax / section_classes.js
blob64b2f107968cf3f0126fb80b210c739e7ed0be10
1 /**
2  * library for ajaxcourse formats, the classes and related functions for
3  * sections and resources.
4  *
5  * This library requires a 'main' object created in calling document.
6  *
7  * Drag and drop notes:
8  *
9  *   Dropping an activity or resource on a section will always add the activity
10  *   or resource at the end of that section.
11  *
12  *   Dropping an activity or resource on another activity or resource will
13  *   always move the former just above the latter.
14  *
15  * $Id$
16  */
19 /**
20  * section_class
21  */
22 function section_class(id, group, config, isDraggable) {
23     this.init_section(id, group, config, isDraggable);
26 YAHOO.extend(section_class, YAHOO.util.DDProxy);
29 section_class.prototype.debug = false;
32 section_class.prototype.init_section = function(id, group, config, isDraggable) {
34     if (!id) {
35         return;
36     }
38     this.is = 'section';
39     this.sectionId = null; // Section number. This is NOT the section id from
40                             // the database.
42     if (!isDraggable) {
43         this.initTarget(id, group, config);
44         this.removeFromGroup('sections');
45     } else {
46         this.init(id, group, config);
47         this.handle = null;
48     }
50     this.createFrame();
51     this.isTarget = true;
53     this.resources = [];
54     this.numberDisplay = null; // Used to display the section number on the top left
55                                 // of the section. Not used in all course formats.
56     this.summary = null;
57     this.content_td = null;
58     this.hidden = false;
59     this.highlighted = false;
60     this.showOnly = false;
61     this.resources_ul = null;
62     this.process_section();
64     this.viewButton = null;
65     this.highlightButton = null;
66     this.showOnlyButton = null;
67     this.init_buttons();
69     if (isDraggable) {
70         this.add_handle();
71     }
72     if (this.debug) {
73         YAHOO.log("init_section "+id+" draggable="+isDraggable);
74     }
75     if (YAHOO.util.Dom.hasClass(this.getEl(),'hidden')) {
76         this.toggle_hide(null,null,true);
77     }
81 section_class.prototype.init_buttons = function() {      
82     var commandContainer = this.getEl().childNodes[2];
84     //clear all but show only button
85     var commandContainerCount = commandContainer.childNodes.length;
87     for (var i=(commandContainerCount-1); i>0; i--) {
88         commandContainer.removeChild(commandContainer.childNodes[i])
89     }
91     if (!this.isWeekFormat) {        
92         var highlightbutton = main.mk_button('div', '/i/marker.gif');
93         YAHOO.util.Event.addListener(highlightbutton, 'click', this.mk_marker, this, true);
94         commandContainer.appendChild(highlightbutton); 
95         this.highlightButton = highlightbutton;            
96     }
97     var viewbutton = main.mk_button('div', '/i/hide.gif');
98     YAHOO.util.Event.addListener(viewbutton, 'click', this.toggle_hide, this,true);
99     commandContainer.appendChild(viewbutton);
100     this.viewButton = viewbutton;
104 section_class.prototype.add_handle = function() {
105     var handleRef = main.mk_button('a', '/i/move_2d.gif',
106             [['style','cursor:move'], ['title', main.portal.strings['move']]]);
108     YAHOO.util.Dom.generateId(handleRef, 'sectionHandle');
110     this.handle = handleRef;
112     this.getEl().childNodes[0].appendChild(handleRef);
113     this.setHandleElId(this.handle.id);
117 section_class.prototype.process_section = function() {
118     this.content_td = this.getEl().childNodes[1];
120     if (YAHOO.util.Dom.hasClass(this.getEl(),'current')) {
121         this.highlighted = true;
122         main.marker = this;
123     }
125     // Create holder for display number for access later
127     this.numberDisplay = document.createElement('div');
128     this.numberDisplay.innerHTML = this.getEl().childNodes[0].innerHTML;
129     this.getEl().childNodes[0].innerHTML = '';
130     this.getEl().childNodes[0].appendChild(this.numberDisplay);  
132     this.sectionId = this.id.replace(/section-/i, ''); // Okay, we will have to change this if we
133     // ever change the id attributes format
134     // for the sections.
135     if (this.debug) {
136         YAHOO.log("Creating section "+this.getEl().id+" in position "+this.sectionId);
137     }
139     // Find/edit resources
140     this.resources_ul = this.content_td.getElementsByTagName('ul')[0];
141     if (!this.resources_ul) {
142         this.resources_ul = document.createElement('ul');
143         this.resources_ul.className='section';
144         this.content_td.insertBefore(this.resources_ul, this.content_td.lastChild);
145     }
146     var resource_count = this.resources_ul.getElementsByTagName('li').length;
148     for (var i=0;i<resource_count;i++) {
149         var resource = this.resources_ul.getElementsByTagName('li')[i];
150         this.resources[this.resources.length] = new resource_class(resource.id, 'resources', null, this);
151     }
152     this.summary = YAHOO.util.Dom.getElementsByClassName('summary', null, this.getEl())[0].firstChild.data || '';
156 section_class.prototype.startDrag = function(x, y) {
157     //operates in point mode
158     YAHOO.util.DDM.mode = YAHOO.util.DDM.POINT;
160     //remove from resources group temporarily
161     this.removeFromGroup('resources');
163     //reinitialize dd element
164     this.getDragEl().innerHTML = '';
166     var targets = YAHOO.util.DDM.getRelated(this, true);
168     if (this.debug) {
169         YAHOO.log(this.id + " startDrag, "+targets.length + " targets");
170     }
174 section_class.prototype.onDragDrop = function(e, id) {
175     // get the drag and drop object that was targeted
176     var target = YAHOO.util.DDM.getDDById(id);
178     if (this.debug) {
179         YAHOO.log("Section dropped on id="+id+" (I am "+this.getEl().id+") x="
180                 +YAHOO.util.Dom.getXY(this.getDragEl()));
181     }
182     this.move_to_section(target);
184     //add back to resources group
185     this.addToGroup('resources');
189 section_class.prototype.endDrag = function() {
190     //nessicary to defeat default action
192     //add back to resources group
193     this.addToGroup('resources');
194 }    
197 section_class.prototype.move_to_section = function(target) {
198     var tempTd = document.createElement('td');
199     var tempStore = null;
200     var sectionCount = main.sections.length;
201     var found = null;
203     //determine if original is above or below target and adjust loop
204     var oIndex = main.get_section_index(this);
205     var tIndex = main.get_section_index(target);
207     if (this.debug) {
208         YAHOO.log("original is at: "+oIndex+" target is at:"+tIndex+" of "+(sectionCount-1));
209     }
210     if (oIndex < tIndex) {
211         var loopCondition = 'i<sectionCount';
212         var loopStart = 1;
213         var loopInc = 'i++';
214         var loopmodifier = 'i - 1'; 
215     } else {
216         var loopCondition = 'i > 0';
217         var loopStart = sectionCount - 1;  
218         var loopInc = 'i--'; 
219         var loopmodifier = 'i + 1';       
220     }
222     //move on backend
223     main.connect('POST','class=section&field=move',null,'id='+this.sectionId+'&value='
224             +(target.sectionId - this.sectionId));
226     //move on front end
227     for (var i=loopStart; eval(loopCondition); eval(loopInc)) {
229         if ((main.sections[i] == this) && !found) {
230             //enounter with original node
231             if (this.debug) {
232                 YAHOO.log("Found Original "+main.sections[i].getEl().id);
233             }
234             if (main.sections[i] == this) {
235                 found = true;
236             }
237         } else if (main.sections[i] == target) {
238             //encounter with target node
239             if (this.debug) {
240                 YAHOO.log("Found target "+main.sections[i].getEl().id);
241             }
242             main.sections[i].swap_with_section(main.sections[eval(loopmodifier)]);
243             found = false;
244             break;
245         } else if (found) {
246             //encounter with nodes inbetween
247             main.sections[i].swap_with_section(main.sections[eval(loopmodifier)]);
248         }
249     }
253 section_class.prototype.swap_with_section = function(sectionIn) {    
254     var tmpStore = null;
256     thisIndex = main.get_section_index(this);
257     targetIndex = main.get_section_index(sectionIn);
258     main.sections[targetIndex] = this;
259     main.sections[thisIndex] = sectionIn;
261     this.changeId(targetIndex);
262     sectionIn.changeId(thisIndex);
264     if (this.debug) {
265         YAHOO.log("Swapping "+this.getEl().id+" with "+sectionIn.getEl().id);
266     }
267     // Swap the sections.
268     YAHOO.util.DDM.swapNode(this.getEl(), sectionIn.getEl());
270     // Sections contain forms to add new resources/activities. These forms
271     // have not been updated to reflect the new positions of the sections that
272     // we have swapped. Let's swap the two sections' forms around.
273     if (this.getEl().getElementsByTagName('form')[0].parentNode
274             && sectionIn.getEl().getElementsByTagName('form')[0].parentNode) {
276         YAHOO.util.DDM.swapNode(this.getEl().getElementsByTagName('form')[0].parentNode,
277                 sectionIn.getEl().getElementsByTagName('form')[0].parentNode);
278     } else {
279         YAHOO.log("Swapping sections: form not present in one or both sections", "warn");
280     }
284 section_class.prototype.toggle_hide = function(e,target,superficial) {
285     if (this.hidden) {  
286         YAHOO.util.Dom.removeClass(this.getEl(), 'hidden');
287         this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/show.gif/i, 'hide.gif');          
288         this.hidden = false;
290         if (!superficial) {
291             main.connect('POST', 'class=section&field=visible', null, 'value=1&id='+this.sectionId);
292             for (var x=0; x<this.resources.length; x++) {                                
293                 this.resources[x].toggle_hide(null, null, true, this.resources[x].hiddenStored);
294                 this.resources[x].hiddenStored = null;
295             }
296         }
298     } else {
299         YAHOO.util.Dom.addClass(this.getEl(), 'hidden');
300         this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/hide.gif/i, 'show.gif');           
301         this.hidden = true;
303         if (!superficial) {
304             main.connect('POST', 'class=section&field=visible', null, 'value=0&id='+this.sectionId);
305             for (var x=0; x<this.resources.length; x++) {
306                 this.resources[x].hiddenStored = this.resources[x].hidden;                                
307                 this.resources[x].toggle_hide(null, null, true, true);
308             }
309         }
310     }
314 section_class.prototype.toggle_highlight = function() {
315     if (this.highlighted) {  
316         YAHOO.util.Dom.removeClass(this.getEl(), 'current');
317         this.highlighted = false;
318     } else {
319         YAHOO.util.Dom.addClass(this.getEl(), 'current');
320         this.highlighted = true;
321     }
325 section_class.prototype.mk_marker = function() {
326     if (main.marker != this) {
327         main.update_marker(this);
328     } else {
329         // If currently the marker
330         main.marker = null;
332         main.connect('POST', 'class=course&field=marker', null, 'value=0');
333         this.toggle_highlight();
334     }
338 section_class.prototype.changeId = function(newId) {                       
339     this.sectionId = newId;       
340     this.numberDisplay.firstChild.data = newId;
342     //main.connectQueue_add('POST','class=section&field=all',null,'id='+newId+"&summary="+main.mk_safe_for_transport(this.summary)+"&sequence="+this.write_sequence_list(true)+'&visible='+(this.hidden?0:1))           
344     if (main.marker == this) {
345         main.update_marker(this);
346     }
347 }     
350 section_class.prototype.get_resource_index = function(el) {
351     for (var x=0; x<this.resources.length; x++) {
352         if (this.resources[x] == el) {
353             return x;
354         }
355     }
356     YAHOO.log("Could not find resource to remove "+el.getEl().id, "error");
357     return -1;
361 section_class.prototype.remove_resource = function(el) {
363     var resourceEl = el.getEl();
364     var parentEl = resourceEl.parentNode;
365     if (!parentEl) {
366         return false;
367     }
369     var resourceCount = this.resources.length;
371     if (resourceCount == 1) {
372         if (this.resources[0] == el) {
373             this.resources = new Array();
374         }
375     } else {
376         var found = false;
377         for (var i=0; i<resourceCount; i++) {
378             if (found) {
379                 this.resources[i - 1] = this.resources[i];         
380                 if (i == resourceCount - 1) {
381                     this.resources = this.resources.slice(0, -1);
382                     resourceCount--;
383                 }
384                 this.resources[i - 1].update_index(i - 1);
385             } else if (this.resources[i] == el) {
386                 found = true;
387             }
388         }
389     }
390     // Remove any extra text nodes to keep DOM clean.
391     var kids = parentEl.childNodes;
393     for (var i=0; i<kids.length; i++) {
394         if (kids[i].nodeType == 3) {
395             YAHOO.log('Removed extra text node.');
396             parentEl.removeChild(kids[i]);
397         }
398     }
399     parentEl.removeChild(resourceEl);
401     this.write_sequence_list();
402     return true;
406 section_class.prototype.insert_resource = function(el, targetel) {
407     var resourcecount = this.resources.length;
408     var found = false;
409     var tempStore = nextStore = null;
411     //update in backend
412     var targetId = '';
413     if (targetel) {
414         targetId = targetel.id;
415     }
416     if (this.debug) {
417         YAHOO.log('id='+el.id+', beforeId='+targetId+', sectionId='+this.sectionId);
418     }
419     main.connect('POST', 'class=resource&field=move', null,
420             'id='+el.id+'&beforeId='+targetId+'&sectionId='+this.sectionId);
422     //if inserting into a hidden resource hide
423     if (this.hidden) {
424         el.hiddenStored = el.hidden; 
425         el.toggle_hide(null, null, true, true);           
426     } else {
427         if (el.hiddenStored != null) {
428             el.toggle_hide(null, null, true, el.hiddenStored);
429             el.hiddenStored = null;
430         }
431     }
432     //update model
433     if (!targetel) {
434         this.resources[this.resources.length] = el;
435     } else {
436         for (var i=0; i<resourcecount; i++) {
437             if (found) {
438                 tempStore = this.resources[i];
439                 this.resources[i] = nextStore;
440                 nextStore = tempStore;
442                 if (nextStore != null)     
443                     nextStore.update_index(i+1); 
445             } else if (this.resources[i] == targetel) {
446                 found = true;
447                 nextStore = this.resources[i];
448                 this.resources[i] = el;               
449                 resourcecount++;
451                 this.resources[i].update_index(i, this.ident);
452                 nextStore.update_index(i + 1); 
453             }                              
454         }
455     }
456     //update on frontend
457     if (targetel) {
458         this.resources_ul.insertBefore(el.getEl(), targetel.getEl());
459         //this.resources_ul.insertBefore(document.createTextNode(' '), targetel.getEl());
460     } else {
461         this.resources_ul.appendChild(el.getEl());
462         //this.resources_ul.appendChild(document.createTextNode(' '));
463     }    
464     el.parentObj = this;       
465 }    
468 section_class.prototype.write_sequence_list = function(toReturn) {
469     var listOutput = '';
471     for (var i=0; i<this.resources.length; i++) {
472         listOutput += this.resources[i].id;
473         if (i != (this.resources.length-1)) {
474             listOutput += ',';
475         }
476     }
477     if (toReturn) {
478         return listOutput;
479     }
486  * resource_class extends util.DDProxy
487  */
488 function resource_class(id,group,config,parentObj) {
489     this.init_resource(id,group,config,parentObj);
492 YAHOO.extend(resource_class, YAHOO.util.DDProxy);
495 resource_class.prototype.debug = false;
498 resource_class.prototype.init_resource = function(id, group, config, parentObj) {
499     if (!id) { 
500         YAHOO.log("Init resource, NO ID FOUND!", 'error');
501         return; 
502     }
504     // Some constants.
505     this.NOGROUPS = 0;
506     this.SEPARATEGROUPS = 1;
507     this.VISIBLEGROUPS = 2;
509     this.is = 'resource';  
510     this.init(id, group, config);
511     this.createFrame();     
512     this.isTarget = true;
514     this.id = this.getEl().id.replace(/module-/i, '');
516     this.hidden = false;
517     if (YAHOO.util.Dom.hasClass(this.getEl().getElementsByTagName('a')[0], 'dimmed')) {
518         this.hidden = true;
519     }
520     this.hiddenStored = null;
522     this.groupmode = null;  // Can be null (i.e. does not apply), 0, 1 or 2.
524     this.linkContainer = this.getEl().getElementsByTagName('a')[0];
526     this.commandContainer = null;
527     this.indentLeftButton = null;
528     this.indentRightButton = null;
529     this.viewButton = null;
530     this.groupButton = null;
531     this.handle = null;
532     this.init_buttons();
534     this.parentObj = parentObj;
536     if (this.debug) {
537         YAHOO.log("init_resource "+id+" parent = "+parentObj.getEl().id);
538     }
543  * The current strategy is to look at the DOM tree to get information on the
544  * resource and it's current mode. This is bad since we are dependant on
545  * the html that is output from serverside logic. Seemingly innocuous changes
546  * like changing the language string for the title of a button will break
547  * our JavaScript here. This is brittle.
549  * First, we clear the buttons container. Then:
550  *   We need to add the new-style move handle.
551  *   The old style move button (up/down) needs to be removed.
552  *   Move left button (if any) needs an event handler.
553  *   Move right button (if any) needs an event handler.
554  *   Update button stays as it is. Add it back.
555  *   Delete button needs an event handler.
556  *   Visible button is a toggle. It needs an event handler too.
557  *   Group mode button is a toggle. It needs an event handler too.
558  */
559 resource_class.prototype.init_buttons = function() {
561     var commandContainer = YAHOO.util.Dom.getElementsByClassName('commands',
562             'span', this.getEl())[0];
564     if (commandContainer == null) {
565         YAHOO.log('Cannot find command container for '+this.getEl().id, 'error');
566         return;
567     }
569     // Language strings.
570     var strgroupsnone = main.portal.strings['groupsnone']+' ('+main.portal.strings['clicktochange']+')';
571     var strgroupsseparate = main.portal.strings['groupsseparate']+' ('+main.portal.strings['clicktochange']+')';
572     var strgroupsvisible = main.portal.strings['groupsvisible']+' ('+main.portal.strings['clicktochange']+')';
574     this.commandContainer = commandContainer;
575     var buttons = commandContainer.getElementsByTagName('a');
577     // Buttons that we might need to add back in.
578     var moveLeft = false;
579     var moveRight = false;
580     var updateButton = null;
582     for (var x=0; x<buttons.length; x++) {
583         if (buttons[x].className == 'editing_moveleft') {
584             moveLeft = true;
585         } else if (buttons[x].className == 'editing_moveright') {
586             moveRight = true;
587         } else if (buttons[x].className == 'editing_update') {
588             updateButton = buttons[x].cloneNode(true);
589         } else if (buttons[x].className == 'editing_groupsnone') {
590             this.groupmode = this.NOGROUPS;
591         } else if (buttons[x].className == 'editing_groupsseparate') {
592             this.groupmode = this.SEPARATEGROUPS;
593         } else if (buttons[x].className == 'editing_groupsvisible') {
594             this.groupmode = this.VISIBLEGROUPS;
595         }
596     }
598     if (updateButton == null) {
599         // Update button must always be present.
600         YAHOO.log('Cannot find updateButton for '+this.getEl().id, 'error');
601     }
603     // Clear all the buttons.
604     commandContainer.innerHTML = '';
606     // Add move-handle for drag and drop.
607     var handleRef = main.mk_button('a', '/i/move_2d.gif',
608             [['style', 'cursor:move'], ['title', main.portal.strings['move']]],
609             [['height', '11'], ['width', '11'], ['style', 'margin-right:3px; border:0;']]);
611     YAHOO.util.Dom.generateId(handleRef, 'sectionHandle');
612     this.handle = handleRef;
613     commandContainer.appendChild(handleRef);
614     this.setHandleElId(this.handle.id);
616     // Add indentation buttons if needed (move left, move right).
617     if (moveLeft) {
618         var button = main.mk_button('a', '/t/left.gif', [['title', main.portal.strings['moveleft']],
619                 ['class', 'editing_moveleft']]);
620         YAHOO.util.Event.addListener(button, 'click', this.indent_left, this, true);
621         commandContainer.appendChild(button);
622         this.indentLeftButton = button;
623     }
625     if (moveRight) {
626         var button = main.mk_button('a', '/t/right.gif', [['title', main.portal.strings['moveright']],
627                 ['class', 'editing_moveright']]);
628         YAHOO.util.Event.addListener(button, 'click', this.indent_right, this, true);
629         commandContainer.appendChild(button);
630         this.indentRightButton = button;
631     }
633     // Add edit button back in.
634     commandContainer.appendChild(updateButton);
636     // Add the delete button.
637     var button = main.mk_button('a', '/t/delete.gif');
638     YAHOO.util.Event.addListener(button, 'click', this.delete_button, this, true);
639     commandContainer.appendChild(button);
641     // Add the hide or show button.
642     if (this.hidden) {
643         var button = main.mk_button('a', '/t/show.gif');
644     } else {
645         var button = main.mk_button('a', '/t/hide.gif');
646     }
647     YAHOO.util.Event.addListener(button, 'click', this.toggle_hide, this, true);
648     commandContainer.appendChild(button);
649     this.viewButton = button;
651     // Add the groupmode button if needed.
652     if (this.groupmode != null) {
653         if (this.groupmode == this.NOGROUPS) {
654             var button = main.mk_button('a', '/t/groupn.gif', [['title', strgroupsnone]]);
655         } else if (this.groupmode == this.SEPARATEGROUPS) {
656             var button = main.mk_button('a', '/t/groups.gif', [['title', strgroupsseparate]]);
657         } else {
658             var button = main.mk_button('a', '/t/groupv.gif', [['title', strgroupsvisible]]);
659         }
660         YAHOO.util.Event.addListener(button, 'click', this.toggle_groupmode, this, true);
661         commandContainer.appendChild(button);
662         this.groupButton = button;
663     }
664 }    
667 resource_class.prototype.indent_left = function() {
669     var spacer = YAHOO.util.Dom.getElementsByClassName('spacer',
670             'img', this.getEl())[0];
671     if (!spacer) {
672         if (this.debug) {
673             YAHOO.log('Could not indent left: spacer image does not exist', 'error');
674         }
675         return false;
676     }
677     if (spacer.width > 20) {
678         spacer.width -= 20;
679     } else {
680         // Remove the spacer.
681         resource = this.getEl();
682         resource.removeChild(spacer);
684         // Remove the indent left button as well.
685         var commandContainer = YAHOO.util.Dom.getElementsByClassName('commands',
686                 'span', this.getEl())[0];
688         commandContainer.removeChild(this.indentLeftButton);
689         this.indentLeftButton = null;
690     }
691     main.connect('POST', 'class=resource&field=indentleft', null, 'id='+this.id);
692     return true;
696 resource_class.prototype.indent_right = function() {
698     var spacer = YAHOO.util.Dom.getElementsByClassName('spacer',
699             'img', this.getEl())[0];
700     if (!spacer) {
701         var spacer = document.createElement('img');
703         spacer.setAttribute('src', main.portal.strings['pixpath']+'/spacer.gif');
704         spacer.className = 'spacer';
705         spacer.setAttribute('width', '20');
706         spacer.setAttribute('height', '12');
708         var resource = this.getEl();
709         resource.insertBefore(spacer, resource.childNodes[0]);
710     } else {
711         spacer.width += 20;
712     }
713     // Add a indent left button if none is present.
714     var commandContainer = YAHOO.util.Dom.getElementsByClassName('commands',
715             'span', this.getEl())[0];
717     if (!this.indentLeftButton) {
718         var button = main.mk_button('a', '/t/left.gif', [['title', main.portal.strings['moveleft']],
719                 ['class', 'editing_moveleft']]);
720         YAHOO.util.Event.addListener(button, 'click', this.indent_left, this, true);
721         commandContainer.insertBefore(button, this.indentRightButton);
722         this.indentLeftButton = button;
723     }
724     main.connect('POST', 'class=resource&field=indentright', null, 'id='+this.id);
725     return true;
729 resource_class.prototype.toggle_hide = function(target, e, superficial, force) {
730     if (force != null) {
731         if (this.debug) {
732             YAHOO.log("Resource "+this.getEl().id+" forced to "+force);
733         }
734         this.hidden = !force;           
735     }
736     if (this.hidden) {
737         YAHOO.util.Dom.removeClass(this.linkContainer, 'dimmed');
738         this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/show.gif/i, 'hide.gif');
739         this.hidden = false;  
741         if (!superficial) {
742             main.connect('POST', 'class=resource&field=visible', null, 'value=1&id='+this.id);
743         }
744     } else {
745         YAHOO.util.Dom.addClass(this.linkContainer, 'dimmed');
746         this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/hide.gif/i, 'show.gif');
747         this.hidden = true;
749         if (!superficial) {
750             main.connect('POST', 'class=resource&field=visible', null, 'value=0&id='+this.id);
751         }
752     }
756 resource_class.prototype.groupImages = ['/t/groupn.gif', '/t/groups.gif', '/t/groupv.gif'];
759 resource_class.prototype.toggle_groupmode = function() {
760     this.groupmode++;
761     if (this.groupmode > 2) {
762         this.groupmode = 0;
763     }
765     var newtitle = this.groupButton.getElementsByTagName('img')[0].title;
767     switch (this.groupmode) {
768         case 0:
769             newtitle = main.portal.strings['groupsnone']+' ('+main.portal.strings['clicktochange']+')';
770             break;
771         case 1:
772             newtitle = main.portal.strings['groupsseparate']+' ('+main.portal.strings['clicktochange']+')';
773             break;
774         case 2:
775             newtitle = main.portal.strings['groupsvisible']+' ('+main.portal.strings['clicktochange']+')';
776             break;
777     }
778     
779     this.groupButton.getElementsByTagName('img')[0].title = newtitle;         
781     this.groupButton.getElementsByTagName('img')[0].src = main.portal.strings['pixpath']+this.groupImages[this.groupmode];
782     main.connect('POST', 'class=resource&field=groupmode', null, 'value='+this.groupmode+'&id='+this.id);
786 resource_class.prototype.delete_button = function() {
787     if (this.debug) {
788     YAHOO.log("Deleting "+this.getEl().id+" from parent "+this.parentObj.getEl().id);
789     }
790     if (!confirm(main.getString('deletecheck', main.getString(this.is)+" "+this.id))) {
791         return false;
792     }
793     this.parentObj.remove_resource(this);
794     main.connect('DELETE', 'class=resource&id='+this.id);
798 resource_class.prototype.update_index = function(index) {
799     if (this.debug) {
800         YAHOO.log("Updating Index for resource "+this.getEl().id+" to "+index);
801     }
805 resource_class.prototype.startDrag = function(x, y) {
806     YAHOO.util.DDM.mode = YAHOO.util.DDM.INTERSECT;
808     //reinitialize dd element
809     this.getDragEl().innerHTML = '';
811     var targets = YAHOO.util.DDM.getRelated(this, true);
812     if (this.debug) {
813         YAHOO.log(this.id + " startDrag "+targets.length + " targets");
814     }
818 resource_class.prototype.clear_move_markers = function(target) {
819     if (target.is == 'section') {
820         resources = target.resources;
821     } else {
822         resources = target.parentObj.resources;
823     }
824     for (var i=0; i<resources.length; i++) {
825         YAHOO.util.Dom.setStyle(resources[i].getEl().id, 'border', 'none');
826     }
830 resource_class.prototype.onDragOver = function(e, ids) {
831     var target = YAHOO.util.DDM.getBestMatch(ids);
833     this.clear_move_markers(target);
835     if (target != this && (target.is == 'resource' || target.is == 'activity')) {
836         // Add a top border to show where the drop will place the resource.
837         YAHOO.util.Dom.setStyle(target.getEl().id, 'border-top', '1px solid #BBB');
838     } else if (target.is == 'section' && target.resources.length > 0) {
839         // We need to have a border at the bottom of the last activity in
840         // that section.
841         YAHOO.util.Dom.setStyle(target.resources[target.resources.length - 1].getEl().id,
842                 'border-bottom', '1px solid #BBB');
843     }
847 resource_class.prototype.onDragOut = function(e, ids) {
848     var target = YAHOO.util.DDM.getBestMatch(ids);
849     if (target) {
850         this.clear_move_markers(target);
851     }
855 resource_class.prototype.onDragDrop = function(e, ids) {
856     var target = YAHOO.util.DDM.getBestMatch(ids);
857     if (!target) {
858         YAHOO.log('onDragDrop: Target is not valid!', 'error');
859     }
861     if (this.debug) {
862         YAHOO.log("Dropped on section id="+target.sectionId
863                 +", el="+this.getEl().id
864                 +", x="+YAHOO.util.Dom.getXY( this.getDragEl() ));
865     }
866     this.parentObj.remove_resource(this);
868     if (target.is == 'resource' || target.is == 'activity') {
869         target.parentObj.insert_resource(this, target);
870     } else if (target.is == 'section') {
871         target.insert_resource(this);
872     }
873     this.clear_move_markers(target);
874     return;
878 resource_class.prototype.endDrag = function() {
879     // Eliminates default action