Merge branch 'MDL-35423-master' of git://github.com/andrewnicols/moodle
[moodle.git] / course / yui / src / modchooser / js / modchooser.js
1 /**
2  * The activity chooser dialogue for courses.
3  *
4  * @moodle-course-modchooser
5  */
7 var CSS = {
8     PAGECONTENT : 'body',
9     SECTION : 'li.section',
10     SECTIONMODCHOOSER : 'span.section-modchooser-link',
11     SITEMENU : 'div.block_site_main_menu',
12     SITETOPIC : 'div.sitetopic'
13 };
15 var MODCHOOSERNAME = 'course-modchooser';
17 /**
18  * The activity chooser dialogue for courses.
19  *
20  * @constructor
21  * @class M.course.modchooser
22  * @extends M.core.chooserdialogue
23  */
24 var MODCHOOSER = function() {
25     MODCHOOSER.superclass.constructor.apply(this, arguments);
26 };
28 Y.extend(MODCHOOSER, M.core.chooserdialogue, {
29     // The current section ID
30     sectionid : null,
32     initializer : function() {
33         var dialogue = Y.one('.chooserdialoguebody');
34         var header = Y.one('.choosertitle');
35         var params = {};
36         this.setup_chooser_dialogue(dialogue, header, params);
38         // Initialize existing sections and register for dynamically created sections
39         this.setup_for_section();
40         M.course.coursebase.register_module(this);
42         // Catch the page toggle
43         Y.all('.block_settings #settingsnav .type_course .modchoosertoggle a').on('click', this.toggle_mod_chooser, this);
44     },
45     /**
46      * Update any section areas within the scope of the specified
47      * selector with AJAX equivalents
48      *
49      * @param baseselector The selector to limit scope to
50      * @return void
51      */
52     setup_for_section : function(baseselector) {
53         if (!baseselector) {
54             baseselector = CSS.PAGECONTENT;
55         }
57         // Setup for site topics
58         Y.one(baseselector).all(CSS.SITETOPIC).each(function(section) {
59             this._setup_for_section(section);
60         }, this);
62         // Setup for standard course topics
63         Y.one(baseselector).all(CSS.SECTION).each(function(section) {
64             this._setup_for_section(section);
65         }, this);
67         // Setup for the block site menu
68         Y.one(baseselector).all(CSS.SITEMENU).each(function(section) {
69             this._setup_for_section(section);
70         }, this);
71     },
72     _setup_for_section : function(section) {
73         var chooserspan = section.one(CSS.SECTIONMODCHOOSER);
74         if (!chooserspan) {
75             return;
76         }
77         var chooserlink = Y.Node.create("<a href='#' />");
78         chooserspan.get('children').each(function(node) {
79             chooserlink.appendChild(node);
80         });
81         chooserspan.insertBefore(chooserlink);
82         chooserlink.on('click', this.display_mod_chooser, this);
83     },
84     /**
85         * Display the module chooser
86         *
87         * @param e Event Triggering Event
88         * @param secitonid integer The ID of the section triggering the dialogue
89         * @return void
90         */
91     display_mod_chooser : function (e) {
92         // Set the section for this version of the dialogue
93         if (e.target.ancestor(CSS.SITETOPIC)) {
94             // The site topic has a sectionid of 1
95             this.sectionid = 1;
96         } else if (e.target.ancestor(CSS.SECTION)) {
97             var section = e.target.ancestor(CSS.SECTION);
98             this.sectionid = section.get('id').replace('section-', '');
99         } else if (e.target.ancestor(CSS.SITEMENU)) {
100             // The block site menu has a sectionid of 0
101             this.sectionid = 0;
102         }
103         this.display_chooser(e);
104     },
105     toggle_mod_chooser : function(e) {
106         // Get the add section link
107         var modchooserlinks = Y.all('div.addresourcemodchooser');
109         // Get the dropdowns
110         var dropdowns = Y.all('div.addresourcedropdown');
112         if (modchooserlinks.size() === 0) {
113             // Continue with non-js action if there are no modchoosers to add
114             return;
115         }
117         // We need to update the text and link
118         var togglelink = Y.one('.block_settings #settingsnav .type_course .modchoosertoggle a');
120         // The actual text is in the last child
121         var toggletext = togglelink.get('lastChild');
123         var usemodchooser;
124         // Determine whether they're currently hidden
125         if (modchooserlinks.item(0).hasClass('visibleifjs')) {
126             // The modchooser is currently visible, hide it
127             usemodchooser = 0;
128             modchooserlinks
129                 .removeClass('visibleifjs')
130                 .addClass('hiddenifjs');
131             dropdowns
132                 .addClass('visibleifjs')
133                 .removeClass('hiddenifjs');
134             toggletext.set('data', M.util.get_string('modchooserenable', 'moodle'));
135             togglelink.set('href', togglelink.get('href').replace('off', 'on'));
136         } else {
137             // The modchooser is currently not visible, show it
138             usemodchooser = 1;
139             modchooserlinks
140                 .addClass('visibleifjs')
141                 .removeClass('hiddenifjs');
142             dropdowns
143                 .removeClass('visibleifjs')
144                 .addClass('hiddenifjs');
145             toggletext.set('data', M.util.get_string('modchooserdisable', 'moodle'));
146             togglelink.set('href', togglelink.get('href').replace('on', 'off'));
147         }
149         M.util.set_user_preference('usemodchooser', usemodchooser);
151         // Prevent the page from reloading
152         e.preventDefault();
153     },
154     option_selected : function(thisoption) {
155         // Add the sectionid to the URL.
156         this.hiddenRadioValue.setAttrs({
157             name: 'jump',
158             value: thisoption.get('value') + '&section=' + this.sectionid
159         });
160     }
161 },
163     NAME : MODCHOOSERNAME,
164     ATTRS : {
165         maxheight : {
166             value : 800
167         }
168     }
169 });
170 M.course = M.course || {};
171 M.course.init_chooser = function(config) {
172     return new MODCHOOSER(config);
173 };