f2a828eb5e636327f873769e2c8b41a432b2a7e2
[moodle.git] / lib / ajax / section_classes.js
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  */
17 /**
18  * section_class
19  */
20 function section_class(id, group, config, isDraggable) {
21     this.init_section(id, group, config, isDraggable);
22 }
24 YAHOO.extend(section_class, YAHOO.util.DDProxy);
27 section_class.prototype.debug = false;
30 section_class.prototype.init_section = function(id, group, config, isDraggable) {
32     if (!id) {
33         return;
34     }
36     this.is = 'section';
37     this.sectionId = null; // Section number. This is NOT the section id from
38                             // the database.
40     if (!isDraggable) {
41         this.initTarget(id, group, config);
42         this.removeFromGroup('sections');
43     } else {
44         this.init(id, group, config);
45         this.handle = null;
46     }
48     this.createFrame();
49     this.isTarget = true;
51     this.resources = [];
52     this.numberDisplay = null; // Used to display the section number on the top left
53                                 // of the section. Not used in all course formats.
54     this.summary = null;
55     this.content_div = null;
56     this.hidden = false;
57     this.highlighted = false;
58     this.showOnly = false;
59     this.resources_ul = null;
60     this.process_section();
62     this.viewButton = null;
63     this.highlightButton = null;
64     this.showOnlyButton = null;
65     this.init_buttons();
67     if (isDraggable) {
68         this.add_handle();
69     }
70     if (this.debug) {
71         YAHOO.log("init_section "+id+" draggable="+isDraggable);
72     }
73     if (YAHOO.util.Dom.hasClass(this.getEl(),'hidden')) {
74         this.toggle_hide(null,null,true);
75     }
76 };
79 section_class.prototype.init_buttons = function() {
80     var commandContainer = YAHOO.util.Dom.getElementsByClassName('right',null,this.getEl())[0];
82     //clear all but show only button
83     var commandContainerCount = commandContainer.childNodes.length;
85     for (var i=(commandContainerCount-1); i>0; i--) {
86         commandContainer.removeChild(commandContainer.childNodes[i])
87     }
89     if (main.getString('courseformat', this.sectionId) != "weeks" && this.sectionId > 0) {
90         var highlightbutton = main.mk_button('div', main.portal.icons['marker'], main.getString('marker', this.sectionId));
91         YAHOO.util.Event.addListener(highlightbutton, 'click', this.mk_marker, this, true);
92         commandContainer.appendChild(highlightbutton);
93         this.highlightButton = highlightbutton;
94     }
95     if (this.sectionId > 0 ) {
96         var viewbutton = main.mk_button('div', main.portal.icons['hide'], main.getString('hidesection', this.sectionId),
97                 [['title', main.portal.strings['hide'] ]]);
98         YAHOO.util.Event.addListener(viewbutton, 'click', this.toggle_hide, this,true);
99         commandContainer.appendChild(viewbutton);
100         this.viewButton = viewbutton;
101     }
102 };
105 section_class.prototype.add_handle = function() {
106     var handleRef = main.mk_button('a', main.portal.icons['move_2d'], main.getString('movesection', this.sectionId),
107             [['title', main.portal.strings['move'] ], ['style','cursor:move']]);
109     YAHOO.util.Dom.generateId(handleRef, 'sectionHandle');
111     this.handle = handleRef;
113     this.getEl().childNodes[0].appendChild(handleRef);
114     this.setHandleElId(this.handle.id);
115 };
118 section_class.prototype.process_section = function() {
119     this.content_div = YAHOO.util.Dom.getElementsByClassName('content',null,this.getEl())[0];
121     if (YAHOO.util.Dom.hasClass(this.getEl(),'current')) {
122         this.highlighted = true;
123         main.marker = this;
124     }
126     // Create holder for display number for access later
128     this.numberDisplay = document.createElement('div');
129     this.numberDisplay.innerHTML = this.getEl().childNodes[0].innerHTML;
130     this.getEl().childNodes[0].innerHTML = '';
131     this.getEl().childNodes[0].appendChild(this.numberDisplay);
133     this.sectionId = this.id.replace(/section-/i, ''); // Okay, we will have to change this if we
134     // ever change the id attributes format
135     // for the sections.
136     if (this.debug) {
137         YAHOO.log("Creating section "+this.getEl().id+" in position "+this.sectionId);
138     }
140     // Find/edit resources
141     this.resources_ul = this.content_div.getElementsByTagName('ul')[0];
142     if (!this.resources_ul) {
143         this.resources_ul = document.createElement('ul');
144         this.resources_ul.className='section';
145         this.content_div.insertBefore(this.resources_ul, this.content_div.lastChild);
146     }
147     var resource_count = this.resources_ul.getElementsByTagName('li').length;
149     for (var i=0;i<resource_count;i++) {
150         var resource = this.resources_ul.getElementsByTagName('li')[i];
151         this.resources[this.resources.length] = new resource_class(resource.id, 'resources', null, this);
152     }
153     this.summary = YAHOO.util.Dom.getElementsByClassName('summary', null, this.getEl())[0].firstChild.data || '';
154 };
157 section_class.prototype.startDrag = function(x, y) {
158     //operates in point mode
159     YAHOO.util.DDM.mode = YAHOO.util.DDM.POINT;
161     //remove from resources group temporarily
162     this.removeFromGroup('resources');
164     //reinitialize dd element
165     this.getDragEl().innerHTML = '';
167     var targets = YAHOO.util.DDM.getRelated(this, true);
169     if (this.debug) {
170         YAHOO.log(this.id + " startDrag, "+targets.length + " targets");
171     }
172 };
175 section_class.prototype.onDragDrop = function(e, id) {
176     // get the drag and drop object that was targeted
177     var target = YAHOO.util.DDM.getDDById(id);
179     if (this.debug) {
180         YAHOO.log("Section dropped on id="+id+" (I am "+this.getEl().id+") x="
181                 +YAHOO.util.Dom.getXY(this.getDragEl()));
182     }
183     this.move_to_section(target);
185     //add back to resources group
186     this.addToGroup('resources');
187 };
190 section_class.prototype.endDrag = function() {
191     //nessicary to defeat default action
193     //add back to resources group
194     this.addToGroup('resources');
195 };
198 section_class.prototype.move_to_section = function(target) {
199     var tempDiv = document.createElement('div');
200     var tempStore = null;
201     var sectionCount = main.sections.length;
202     var found = null;
204     //determine if original is above or below target and adjust loop
205     var oIndex = main.get_section_index(this);
206     var tIndex = main.get_section_index(target);
208     if (this.debug) {
209         YAHOO.log("original is at: "+oIndex+" target is at:"+tIndex+" of "+(sectionCount-1));
210     }
211     if (oIndex < tIndex) {
212         var loopCondition = 'i<sectionCount';
213         var loopStart = 1;
214         var loopInc = 'i++';
215         var loopmodifier = 'i - 1';
216         var targetOffset = 0;
217     } else {
218         var loopCondition = 'i > 0';
219         var loopStart = sectionCount - 1;
220         var loopInc = 'i--';
221         var loopmodifier = 'i + 1';
222         var targetOffset = 1;
223     }
225     //move on backend
226     main.connect('POST','class=section&field=move',null,'id='+this.sectionId+'&value=' + (target.sectionId - targetOffset));
228     //move on front end
229     for (var i=loopStart; eval(loopCondition); eval(loopInc)) {
231         if ((main.sections[i] == this) && !found) {
232             //encounter with original node
233             if (this.debug) {
234                 YAHOO.log("Found Original "+main.sections[i].getEl().id);
235             }
236             if (main.sections[i] == this) {
237                 found = true;
238             }
239         } else if (main.sections[i] == target) {
240             //encounter with target node
241             if (this.debug) {
242                 YAHOO.log("Found target "+main.sections[i].getEl().id);
243             }
244             main.sections[i].swap_with_section(main.sections[eval(loopmodifier)]);
245             main.sections[i].swap_dates(main.sections[eval(loopmodifier)]);
246             found = false;
247             break;
248         } else if (found) {
249             //encounter with nodes inbetween
250             main.sections[i].swap_with_section(main.sections[eval(loopmodifier)]);
251             main.sections[i].swap_dates(main.sections[eval(loopmodifier)]);
252         }
253     }
254 };
257 section_class.prototype.swap_with_section = function(sectionIn) {
258     var tmpStore = null;
260     thisIndex = main.get_section_index(this);
261     targetIndex = main.get_section_index(sectionIn);
262     main.sections[targetIndex] = this;
263     main.sections[thisIndex] = sectionIn;
265     this.changeId(targetIndex);
266     sectionIn.changeId(thisIndex);
268     if (this.debug) {
269         YAHOO.log("Swapping "+this.getEl().id+" with "+sectionIn.getEl().id);
270     }
271     // Swap the sections.
272     YAHOO.util.DDM.swapNode(this.getEl(), sectionIn.getEl());
274     // Sections contain forms to add new resources/activities. These forms
275     // have not been updated to reflect the new positions of the sections that
276     // we have swapped. Let's swap the two sections' forms around.
277     if (this.getEl().getElementsByTagName('form')[0].parentNode
278             && sectionIn.getEl().getElementsByTagName('form')[0].parentNode) {
280         YAHOO.util.DDM.swapNode(this.getEl().getElementsByTagName('form')[0].parentNode,
281                 sectionIn.getEl().getElementsByTagName('form')[0].parentNode);
282     } else {
283         YAHOO.log("Swapping sections: form not present in one or both sections", "warn");
284     }
285 };
288 section_class.prototype.toggle_hide = function(e,target,superficial) {
289     var strhide = main.portal.strings['hide'];
290     var strshow = main.portal.strings['show'];
291     if (this.hidden) {
292         YAHOO.util.Dom.removeClass(this.getEl(), 'hidden');
293         this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/show/i, 'hide');
294         this.viewButton.childNodes[0].alt = this.viewButton.childNodes[0].alt.replace(strshow, strhide);
295         this.viewButton.childNodes[0].title = this.viewButton.childNodes[0].title.replace(strshow, strhide); //IE hack.
296         this.viewButton.title = this.viewButton.title.replace(strshow, strhide);
297         this.hidden = false;
299         if (!superficial) {
300             main.connect('POST', 'class=section&field=visible', null, 'value=1&id='+this.sectionId);
301             for (var x=0; x<this.resources.length; x++) {
302                 this.resources[x].toggle_hide(null, null, true, this.resources[x].hiddenStored);
303                 this.resources[x].hiddenStored = null;
304             }
305         }
307     } else {
308         YAHOO.util.Dom.addClass(this.getEl(), 'hidden');
309         this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/hide/i, 'show');
310         this.viewButton.childNodes[0].alt = this.viewButton.childNodes[0].alt.replace(strhide, strshow);
311         this.viewButton.childNodes[0].title = this.viewButton.childNodes[0].title.replace(strhide, strshow); //IE hack.
312         this.viewButton.title = this.viewButton.title.replace(strhide, strshow);
313         this.hidden = true;
315         if (!superficial) {
316             main.connect('POST', 'class=section&field=visible', null, 'value=0&id='+this.sectionId);
317             for (var x=0; x<this.resources.length; x++) {
318                 this.resources[x].hiddenStored = this.resources[x].hidden;
319                 this.resources[x].toggle_hide(null, null, true, true);
320             }
321         }
322     }
323 };
326 section_class.prototype.toggle_highlight = function() {
327     if (this.highlighted) {
328         YAHOO.util.Dom.removeClass(this.getEl(), 'current');
329         this.highlighted = false;
330     } else {
331         YAHOO.util.Dom.addClass(this.getEl(), 'current');
332         this.highlighted = true;
333     }
334 };
337 section_class.prototype.mk_marker = function() {
338     if (main.marker != this) {
339         main.update_marker(this);
340     } else {
341         // If currently the marker
342         main.marker = null;
344         main.connect('POST', 'class=course&field=marker', null, 'value=0');
345         this.toggle_highlight();
346     }
347 };
350 section_class.prototype.changeId = function(newId) {
351     this.sectionId = newId;
352     this.numberDisplay.firstChild.data = newId;
354     //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))
356     if (main.marker == this) {
357         main.update_marker(this);
358     }
359 };
362 section_class.prototype.get_resource_index = function(el) {
363     for (var x=0; x<this.resources.length; x++) {
364         if (this.resources[x] == el) {
365             return x;
366         }
367     }
368     YAHOO.log("Could not find resource to remove "+el.getEl().id, "error");
369     return -1;
370 };
373 section_class.prototype.remove_resource = function(el) {
375     var resourceEl = el.getEl();
376     var parentEl = resourceEl.parentNode;
377     if (!parentEl) {
378         return false;
379     }
381     var resourceCount = this.resources.length;
383     if (resourceCount == 1) {
384         if (this.resources[0] == el) {
385             this.resources = new Array();
386         }
387     } else {
388         var found = false;
389         for (var i=0; i<resourceCount; i++) {
390             if (found) {
391                 this.resources[i - 1] = this.resources[i];
392                 if (i == resourceCount - 1) {
393                     this.resources = this.resources.slice(0, -1);
394                     resourceCount--;
395                 }
396                 this.resources[i - 1].update_index(i - 1);
397             } else if (this.resources[i] == el) {
398                 found = true;
399             }
400         }
401     }
402     // Remove any extra text nodes to keep DOM clean.
403     var kids = parentEl.childNodes;
405     for (var i=0; i<kids.length; i++) {
406         if (kids[i].nodeType == 3) {
407             YAHOO.log('Removed extra text node.');
408             parentEl.removeChild(kids[i]);
409         }
410     }
411     parentEl.removeChild(resourceEl);
413     this.write_sequence_list();
414     return true;
415 };
418 section_class.prototype.insert_resource = function(el, targetel) {
419     var resourcecount = this.resources.length;
420     var found = false;
421     var tempStore = nextStore = null;
423     //update in backend
424     var targetId = '';
425     if (targetel) {
426         targetId = targetel.id;
427     }
428     if (this.debug) {
429         YAHOO.log('id='+el.id+', beforeId='+targetId+', sectionId='+this.sectionId);
430     }
431     main.connect('POST', 'class=resource&field=move', null,
432             'id='+el.id+'&beforeId='+targetId+'&sectionId='+this.sectionId);
434     //if inserting into a hidden resource hide
435     if (this.hidden) {
436         el.hiddenStored = el.hidden;
437         el.toggle_hide(null, null, true, true);
438     } else {
439         if (el.hiddenStored != null) {
440             el.toggle_hide(null, null, true, el.hiddenStored);
441             el.hiddenStored = null;
442         }
443     }
444     //update model
445     if (!targetel) {
446         this.resources[this.resources.length] = el;
447     } else {
448         for (var i=0; i<resourcecount; i++) {
449             if (found) {
450                 tempStore = this.resources[i];
451                 this.resources[i] = nextStore;
452                 nextStore = tempStore;
454                 if (nextStore != null)
455                     nextStore.update_index(i+1);
457             } else if (this.resources[i] == targetel) {
458                 found = true;
459                 nextStore = this.resources[i];
460                 this.resources[i] = el;
461                 resourcecount++;
463                 this.resources[i].update_index(i, this.ident);
464                 nextStore.update_index(i + 1);
465             }
466         }
467     }
468     //update on frontend
469     if (targetel) {
470         this.resources_ul.insertBefore(el.getEl(), targetel.getEl());
471         //this.resources_ul.insertBefore(document.createTextNode(' '), targetel.getEl());
472     } else {
473         this.resources_ul.appendChild(el.getEl());
474         //this.resources_ul.appendChild(document.createTextNode(' '));
475     }
476     el.parentObj = this;
477 };
480 section_class.prototype.write_sequence_list = function(toReturn) {
481     var listOutput = '';
483     for (var i=0; i<this.resources.length; i++) {
484         listOutput += this.resources[i].id;
485         if (i != (this.resources.length-1)) {
486             listOutput += ',';
487         }
488     }
489     if (toReturn) {
490         return listOutput;
491     }
492 };
497 /**
498  * resource_class extends util.DDProxy
499  */
500 function resource_class(id,group,config,parentObj) {
501     this.init_resource(id,group,config,parentObj);
504 YAHOO.extend(resource_class, YAHOO.util.DDProxy);
507 resource_class.prototype.debug = false;
510 resource_class.prototype.init_resource = function(id, group, config, parentObj) {
511     if (!id) {
512         YAHOO.log("Init resource, NO ID FOUND!", 'error');
513         return;
514     }
516     // Some constants.
517     this.NOGROUPS = 0;
518     this.SEPARATEGROUPS = 1;
519     this.VISIBLEGROUPS = 2;
521     this.is = 'resource';
522     this.init(id, group, config);
523     this.createFrame();
524     this.isTarget = true;
526     this.id = this.getEl().id.replace(/module-/i, '');
528     this.hidden = false;
529     if (YAHOO.util.Dom.hasClass(this.getEl().getElementsByTagName('a')[0], 'dimmed') ||
530         YAHOO.util.Dom.hasClass(this.getEl().getElementsByTagName('div')[0], 'dimmed_text')) {
531         this.hidden = true;
532     }
533     this.hiddenStored = null;
535     this.groupmode = null;  // Can be null (i.e. does not apply), 0, 1 or 2.
537     this.linkContainer = this.getEl().getElementsByTagName('a')[0];
538     this.divContainer = this.getEl().getElementsByTagName('div')[0];
540     this.commandContainer = null;
541     this.indentLeftButton = null;
542     this.indentRightButton = null;
543     this.viewButton = null;
544     this.groupButton = null;
545     this.handle = null;
546     this.init_buttons();
548     this.parentObj = parentObj;
550     if (this.debug) {
551         YAHOO.log("init_resource "+id+" parent = "+parentObj.getEl().id);
552     }
553 };
556 /**
557  * The current strategy is to look at the DOM tree to get information on the
558  * resource and it's current mode. This is bad since we are dependant on
559  * the html that is output from serverside logic. Seemingly innocuous changes
560  * like changing the language string for the title of a button will break
561  * our JavaScript here. This is brittle.
562  *
563  * First, we clear the buttons container. Then:
564  *   We need to add the new-style move handle.
565  *   The old style move button (up/down) needs to be removed.
566  *   Move left button (if any) needs an event handler.
567  *   Move right button (if any) needs an event handler.
568  *   Update button stays as it is. Add it back.
569  *   Delete button needs an event handler.
570  *   Visible button is a toggle. It needs an event handler too.
571  *   Group mode button is a toggle. It needs an event handler too.
572  */
573 resource_class.prototype.init_buttons = function() {
575     var commandContainer = YAHOO.util.Dom.getElementsByClassName('commands',
576             'span', this.getEl())[0];
578     if (commandContainer == null) {
579         YAHOO.log('Cannot find command container for '+this.getEl().id, 'error');
580         return;
581     }
583     // Language strings.
584     var strgroupsnone = main.portal.strings['groupsnone']+' ('+main.portal.strings['clicktochange']+')';
585     var strgroupsseparate = main.portal.strings['groupsseparate']+' ('+main.portal.strings['clicktochange']+')';
586     var strgroupsvisible = main.portal.strings['groupsvisible']+' ('+main.portal.strings['clicktochange']+')';
588     this.commandContainer = commandContainer;
589     var buttons = commandContainer.getElementsByTagName('a');
591     // Buttons that we might need to add back in.
592     var moveLeft = false;
593     var moveRight = false;
594     var updateButton = null;
596     // for RTL support
597     var isrtl = (document.getElementsByTagName("html")[0].dir=="rtl");
599     for (var x=0; x<buttons.length; x++) {
600         if (buttons[x].className == 'editing_moveleft') {
601             moveLeft = true;
602         } else if (buttons[x].className == 'editing_moveright') {
603             moveRight = true;
604         } else if (buttons[x].className == 'editing_update') {
605             updateButton = buttons[x].cloneNode(true);
606         } else if (buttons[x].className == 'editing_groupsnone') {
607             this.groupmode = this.NOGROUPS;
608         } else if (buttons[x].className == 'editing_groupsseparate') {
609             this.groupmode = this.SEPARATEGROUPS;
610         } else if (buttons[x].className == 'editing_groupsvisible') {
611             this.groupmode = this.VISIBLEGROUPS;
612         }
613     }
615     if (updateButton == null) {
616         // Update button must always be present.
617         YAHOO.log('Cannot find updateButton for '+this.getEl().id, 'error');
618     }
620     // Clear all the buttons.
621     commandContainer.innerHTML = '';
623     // Add move-handle for drag and drop.
624     var handleRef = main.mk_button('a', main.portal.icons['move_2d'], main.portal.strings['move'],
625             [['style', 'cursor:move']],
626             [['height', '11'], ['width', '11'], ['style', 'margin-right:3px; border:0;']]);
628     YAHOO.util.Dom.generateId(handleRef, 'sectionHandle');
629     this.handle = handleRef;
630     commandContainer.appendChild(handleRef);
631     this.setHandleElId(this.handle.id);
633     // Add indentation buttons if needed (move left, move right).
634     if (moveLeft) {
635         var button = main.mk_button('a', main.portal.icons['backwards'], main.portal.strings['moveleft'],
636                 [['class', 'editing_moveleft']]);
637         YAHOO.util.Event.addListener(button, 'click', this.indent_left, this, true);
638         commandContainer.appendChild(button);
639         this.indentLeftButton = button;
640     }
642     if (moveRight) {
643         var button = main.mk_button('a', main.portal.icons['forwards'], main.portal.strings['moveright'],
644                 [['class', 'editing_moveright']]);
645         YAHOO.util.Event.addListener(button, 'click', this.indent_right, this, true);
646         commandContainer.appendChild(button);
647         this.indentRightButton = button;
648     }
650     // Add edit button back in.
651     commandContainer.appendChild(updateButton);
653     // Add the delete button.
654     var button = main.mk_button('a', main.portal.icons['delete'], main.portal.strings['delete']);
655     YAHOO.util.Event.addListener(button, 'click', this.delete_button, this, true);
656     commandContainer.appendChild(button);
658     // Add the hide or show button.
659     if (this.hidden) {
660         var button = main.mk_button('a', main.portal.icons['show'], main.portal.strings['show']);
661     } else {
662         var button = main.mk_button('a', main.portal.icons['hide'], main.portal.strings['hide']);
663     }
664     YAHOO.util.Event.addListener(button, 'click', this.toggle_hide, this, true);
665     commandContainer.appendChild(button);
666     this.viewButton = button;
668     // Add the groupmode button if needed.
669     if (this.groupmode != null) {
670         if (this.groupmode == this.NOGROUPS) {
671             var button = main.mk_button('a', main.portal.icons['groupn'], strgroupsnone);
672         } else if (this.groupmode == this.SEPARATEGROUPS) {
673             var button = main.mk_button('a', main.portal.icons['groups'], strgroupsseparate);
674         } else {
675             var button = main.mk_button('a', main.portal.icons['groupv'], strgroupsvisible);
676         }
677         YAHOO.util.Event.addListener(button, 'click', this.toggle_groupmode, this, true);
678         commandContainer.appendChild(button);
679         this.groupButton = button;
680     }
681 };
684 resource_class.prototype.indent_left = function() {
686     var spacer = YAHOO.util.Dom.getElementsByClassName('spacer',
687             'img', this.getEl())[0];
688     if (!spacer) {
689         if (this.debug) {
690             YAHOO.log('Could not indent left: spacer image does not exist', 'error');
691         }
692         return false;
693     }
694     if (spacer.width > 20) {
695         spacer.width -= 20;
696     } else {
697         // Remove the spacer.
698         resource = this.getEl();
699         resource.removeChild(spacer);
701         // Remove the indent left button as well.
702         var commandContainer = YAHOO.util.Dom.getElementsByClassName('commands',
703                 'span', this.getEl())[0];
705         commandContainer.removeChild(this.indentLeftButton);
706         this.indentLeftButton = null;
707     }
708     main.connect('POST', 'class=resource&field=indentleft', null, 'id='+this.id);
709     return true;
710 };
713 resource_class.prototype.indent_right = function() {
715     // for RTL support
716     var isrtl = (document.getElementsByTagName("html")[0].dir=="rtl");
718     var spacer = YAHOO.util.Dom.getElementsByClassName('spacer',
719             'img', this.getEl())[0];
720     if (!spacer) {
721         var spacer = document.createElement('img');
723         spacer.setAttribute('src', main.portal.icons['spacerimg']);
724         spacer.className = 'spacer';
725         spacer.setAttribute('alt', '');
726         spacer.setAttribute('width', '20');
727         spacer.setAttribute('height', '12');
729         var resource = this.getEl();
730         resource.insertBefore(spacer, resource.childNodes[0]);
731     } else {
732         spacer.width += 20;
733     }
734     // Add a indent left button if none is present.
735     var commandContainer = YAHOO.util.Dom.getElementsByClassName('commands',
736             'span', this.getEl())[0];
738     if (!this.indentLeftButton) {
739         var button = main.mk_button('a', main.portal.icons['backwards'], main.portal.strings['moveleft'],
740                 [['class', 'editing_moveleft']]);
741         YAHOO.util.Event.addListener(button, 'click', this.indent_left, this, true);
742         commandContainer.insertBefore(button, this.indentRightButton);
743         this.indentLeftButton = button;
744     }
745     main.connect('POST', 'class=resource&field=indentright', null, 'id='+this.id);
746     return true;
747 };
750 resource_class.prototype.toggle_hide = function(target, e, superficial, force) {
751     var strhide = main.portal.strings['hide'];
752     var strshow = main.portal.strings['show'];
753     if (force != null) {
754         if (this.debug) {
755             YAHOO.log("Resource "+this.getEl().id+" forced to "+force);
756         }
757         this.hidden = !force;
758     }
759     if (this.hidden) {
760         YAHOO.util.Dom.removeClass(this.linkContainer, 'dimmed');
761         YAHOO.util.Dom.removeClass(this.divContainer, 'dimmed_text');
762         this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/show/i, 'hide');
763         this.viewButton.childNodes[0].alt = this.viewButton.childNodes[0].alt.replace(strshow, strhide);
764         this.viewButton.title = this.viewButton.title.replace(strshow, strhide);
765         this.hidden = false;
767         if (!superficial) {
768             main.connect('POST', 'class=resource&field=visible', null, 'value=1&id='+this.id);
769         }
770     } else {
771         YAHOO.util.Dom.addClass(this.linkContainer, 'dimmed');
772         YAHOO.util.Dom.addClass(this.divContainer, 'dimmed_text');
773         this.viewButton.childNodes[0].src = this.viewButton.childNodes[0].src.replace(/hide/i, 'show');
774         this.viewButton.childNodes[0].alt = this.viewButton.childNodes[0].alt.replace(strhide, strshow);
775         this.viewButton.title = this.viewButton.title.replace(strhide, strshow);
776         this.hidden = true;
778         if (!superficial) {
779             main.connect('POST', 'class=resource&field=visible', null, 'value=0&id='+this.id);
780         }
781     }
782 };
785 resource_class.prototype.groupImages = ['groupn', 'groups', 'groupv'];
788 resource_class.prototype.toggle_groupmode = function() {
789     this.groupmode++;
790     if (this.groupmode > 2) {
791         this.groupmode = 0;
792     }
794     var newtitle = this.groupButton.title;
796     switch (this.groupmode) {
797         case 0:
798             newtitle = main.portal.strings['groupsnone']+' ('+main.portal.strings['clicktochange']+')';
799             break;
800         case 1:
801             newtitle = main.portal.strings['groupsseparate']+' ('+main.portal.strings['clicktochange']+')';
802             break;
803         case 2:
804             newtitle = main.portal.strings['groupsvisible']+' ('+main.portal.strings['clicktochange']+')';
805             break;
806     }
808     this.groupButton.getElementsByTagName('img')[0].alt = newtitle;
809     this.groupButton.title = newtitle;
811     this.groupButton.getElementsByTagName('img')[0].src = main.portal.icons[this.groupImages[this.groupmode]];
812     main.connect('POST', 'class=resource&field=groupmode', null, 'value='+this.groupmode+'&id='+this.id);
813 };
816 resource_class.prototype.delete_button = function() {
817     if (this.debug) {
818     YAHOO.log("Deleting "+this.getEl().id+" from parent "+this.parentObj.getEl().id);
819     }
820     if (!confirm(main.getString('deletecheck', main.getString(this.is)+" "+this.id))) {
821         return false;
822     }
823     this.parentObj.remove_resource(this);
824     main.connect('POST', 'class=resource&action=DELETE&id='+this.id);
825 };
828 resource_class.prototype.update_index = function(index) {
829     if (this.debug) {
830         YAHOO.log("Updating Index for resource "+this.getEl().id+" to "+index);
831     }
832 };
835 resource_class.prototype.startDrag = function(x, y) {
836     YAHOO.util.DDM.mode = YAHOO.util.DDM.INTERSECT;
838     //reinitialize dd element
839     this.getDragEl().innerHTML = '';
841     var targets = YAHOO.util.DDM.getRelated(this, true);
842     if (this.debug) {
843         YAHOO.log(this.id + " startDrag "+targets.length + " targets");
844     }
845 };
848 resource_class.prototype.clear_move_markers = function(target) {
849     if (target.is == 'section') {
850         resources = target.resources;
851     } else {
852         resources = target.parentObj.resources;
853     }
854     for (var i=0; i<resources.length; i++) {
855         if (resources[i].getEl() != null) {
856             YAHOO.util.Dom.setStyle(resources[i].getEl().id, 'border', 'none');
857         }
858     }
859 };
862 resource_class.prototype.onDragOver = function(e, ids) {
863     var target = YAHOO.util.DDM.getBestMatch(ids);
865     this.clear_move_markers(target);
867     if (target != this && (target.is == 'resource' || target.is == 'activity')) {
868         // Add a top border to show where the drop will place the resource.
869         YAHOO.util.Dom.setStyle(target.getEl().id, 'border-top', '1px solid #BBB');
870     } else if (target.is == 'section' && target.resources.length > 0) {
871         // We need to have a border at the bottom of the last activity in
872         // that section.
873         if (target.resources[target.resources.length - 1].getEl() != null) {
874             YAHOO.util.Dom.setStyle(target.resources[target.resources.length - 1].getEl().id,
875                 'border-bottom', '1px solid #BBB');
876         }
877     }
878 };
881 resource_class.prototype.onDragOut = function(e, ids) {
882     var target = YAHOO.util.DDM.getBestMatch(ids);
883     if (target) {
884         this.clear_move_markers(target);
885     }
886 };
889 resource_class.prototype.onDragDrop = function(e, ids) {
890     var target = YAHOO.util.DDM.getBestMatch(ids);
891     if (!target) {
892         YAHOO.log('onDragDrop: Target is not valid!', 'error');
893     }
895     if (this.debug) {
896         YAHOO.log("Dropped on section id="+target.sectionId
897                 +", el="+this.getEl().id
898                 +", x="+YAHOO.util.Dom.getXY( this.getDragEl() ));
899     }
900     this.parentObj.remove_resource(this);
902     if (target.is == 'resource' || target.is == 'activity') {
903         target.parentObj.insert_resource(this, target);
904     } else if (target.is == 'section') {
905         target.insert_resource(this);
906     }
907     this.clear_move_markers(target);
908     return;
909 };
912 resource_class.prototype.endDrag = function() {
913     // Eliminates default action
914 };
916 section_class.prototype.swap_dates = function(el){
917     var i=1;
918     var divs = YAHOO.util.Selector.query('div .weekdates');
920     for (div in divs) {
921         divs[div].innerHTML = main.sectiondates[i];
922         i++;
923     }
924 };