b29a25024e00ed7689cfb5989c48f1221b739223
[moodle.git] / lib / ajax / ajaxcourse.js
1 /**
2  * Contains Main class and supporting functions for ajax course layout
3  */
6 //hide content body until done loading (manipulation looks ugly elsewise)
7 //document.getElementById('content').style.display = 'none';
9 // If firebug console is undefined, define a fake one here
10 if (window.console) {
11     console.vardump = function(data) {
12         retval = '';
13         for (key in data) {
14             retval += key+' = '+data[key] + "\n";
15         }
16         console.log(retval);
17     };
18 }
20 //onload object for handling scripts on page load, this insures they run in my order
21 function onload_class() {
22     this.scripts = new Array();
23     this.debug = true;
24 }
27 onload_class.prototype.add = function(script) {
28     if (this.debug) {
29         YAHOO.log("onloadobj.add - adding "+script, "junk");
30     }
31     this.scripts[this.scripts.length] = script;
32 };
35 onload_class.prototype.load = function() {
36     var scriptcount = this.scripts.length;
37     if (this.debug) {
38         YAHOO.log("onloadobj.load - loading "+scriptcount+" scripts", "info");
39     }
40     for (i=0; i<scriptcount; i++) {
41         eval(this.scripts[i]);
42     }
43 };
46 var onloadobj = new onload_class();
49 //main page object
50 function main_class() {
51     this.debug = true;
52     this.portal = new php_portal_class();
54     this.blocks = new Array();
55     this.sections = new Array();
56     this.sectiondates = {};
57     this.leftcolumn = null;
58     this.rightcolumn = null;
59     this.adminBlock = null;
60     this.tempBlock = null;
61     this.icons = [];
62     this.courseformat = null;
63     this.marker = null;
64     this.numsections = null;
66     //things to process onload
67     onloadobj.add('main.process_document();');
68     onloadobj.add("if (document.getElementById('content')) document.getElementById('content').style.display='block';");
70     //connection queue allows xhttp requests to be sent in order
71     this.connectQueue = [];
72     this.connectQueueHead = 0;
73     this.connectQueueConnection = null;
74 }
77 main_class.prototype.process_blocks = function() {
78     //remove unneeded icons (old school position icons and delete/hide
79     //although they will be read)
80     var rmIconClasses = ['icon up', 'icon down', 'icon right', 'icon left', 'icon delete', 'icon hide'];
81     for (var c=0; c<rmIconClasses.length; c++) {
82         els = YAHOO.util.Dom.getElementsByClassName(rmIconClasses[c]);
84         for (var x=0; x<els.length; x++) {
85             els[x].parentNode.removeChild(els[x]);
86         }
87     }
88     //process the block ids passed from php
89     var blockcount = this.portal.blocks.length;
90     YAHOO.log("main.processBlocks - processing "+blockcount+" blocks", "info");
92     for (i=0; i<blockcount; i++) {
93         this.blocks[i] = new block_class(this.portal.blocks[i][1], "blocks");
95         //put in correct side array also
96         if (this.portal.blocks[i][0] == 'l') {
97             main.leftcolumn.add_block(this.blocks[i]);
98         } else if (this.portal.blocks[i][0] == 'r') {
99             main.rightcolumn.add_block(this.blocks[i]);
100         }
102         //hide if called for
103         if (this.portal.blocks[i][2] == 1) {
104             this.blocks[i].toggle_hide(null, null, true);
105         }
106     }
107 };
110 main_class.prototype.process_document = function() {
111     //process the document to get important containers
112     YAHOO.log("Processing Document", "info");
114     //process columns for blocks
115     this.leftcolumn = new column_class('left-column', "blocks", null, 'l');
116     this.rightcolumn = new column_class('right-column', "blocks", null, 'r');
118     //process sections
119     //var ct = 0;
120     //while (document.getElementById('section-'+ct) != null) {
121     var maxct = this.portal.numsections;
122     this.courseformat = this.portal.courseformat;
123     for(var ct=0; ct <= maxct; ct++){
124         if(document.getElementById('section-'+ct) != null) {
125             this.sections[ct] = new section_class('section-'+ct, "sections", null, ct!=0?true:false);
126             this.sections[ct].addToGroup('resources');
127             if (ct > 0) {
128                 var sectiontitle = YAHOO.util.Selector.query('#section-'+ct+' h3.weekdates')[0];
129                 if (undefined !== sectiontitle) { // Only save date for weekly format
130                     this.sectiondates[ct] = sectiontitle.innerHTML;
131                 }
132             }
133         }
134         //ct++;
135     }
136     if (this.debug) {
137         YAHOO.log("Processed "+ct+" sections");
138     }
140     this.adminBlock = YAHOO.util.Dom.getElementsByClassName('block_adminblock')[0];
141     this.tempBlock = YAHOO.util.Dom.getElementsByClassName('tempblockhandler')[0];
142 };
145 main_class.prototype.mk_safe_for_transport = function(input) {
146     return input.replace(/&/i, '_.amp._');
147 };
150 //return block by id
151 main_class.prototype.get_block_index = function(el) {
152     var blockcount = this.blocks.length;
153     for (i=0; i<blockcount; i++) {
154         if (this.blocks[i] == el) {
155             return i;
156         }
157     }
158 };
161 main_class.prototype.get_section_index = function(el) {
162     var sectioncount = this.sections.length;
163     for (i=0; i<sectioncount; i++) {
164         if (this.sections[i] == el) {
165             return i;
166         }
167     }
168 };
170 main_class.prototype.mk_button = function(tag, imgSrc, text, attributes, imgAttributes) {
171     //Create button and return object.
172     //Set the text: the container TITLE or image ALT attributes can be overridden, eg.
173     //  main.mk_button('a', main.portal.icons['move_2d'], strmove, [['title', strmoveshort]]);
174     var container = document.createElement(tag);
175     container.style.cursor = 'pointer';
176     container.setAttribute('title', text);
177     var image = document.createElement('img');
179     image.setAttribute('src', imgSrc);
180     image.setAttribute('alt', text);
181     //image.setAttribute('title', '');
182     container.appendChild(image);
184     if (attributes != null) {
185         for (var c=0; c<attributes.length; c++) {
186             if (attributes[c][0] == 'title' && this.is_ie()) {
187                 image.setAttribute(attributes[c][0], attributes[c][1]); //IE hack: transfer 'title'.
188             } else {
189                 container.setAttribute(attributes[c][0], attributes[c][1]);
190             }
191         }
192     }
193     if (imgAttributes != null) {
194         for (var c=0; c<imgAttributes.length; c++) {
195             image.setAttribute(imgAttributes[c][0], imgAttributes[c][1]);
196         }
197     }
198     image.setAttribute('hspace', '3');
199     return container;
200 };
203 main_class.prototype.connect = function(method, urlStub, callback, body) {
204     if (this.debug) {
205         YAHOO.log("Making "+method+" connection to /course/rest.php?courseId="+main.portal.id+"&"+urlStub);
206     }
207     if (callback == null) {
208         if (this.debug) {
209             callback = {
210                 success: function(response) {
211                     YAHOO.log("Response from the Request: " + response.statusText + ": " + response.responseText, 'info');
212                 },
213                 failure: function() {
214                     YAHOO.log("Response from the Request: " + response.statusText + ": " + response.responseText, 'error');
215                 }
216             };
217         } else {
218             callback = {};
219         }
220     }
221     return YAHOO.util.Connect.asyncRequest(method, this.portal.strings['wwwroot']+"/course/rest.php?courseId="+main.portal.id+"&sesskey="+this.portal.strings['sesskey']+"&"+urlStub, callback, body);
222 };
225 main_class.prototype.connectQueue_add = function(method, urlStub, callback, body) {
226     var Qlength = main.connectQueue.length;
227     main.connectQueue[Qlength] = [];
228     main.connectQueue[Qlength]['method'] = method;
229     main.connectQueue[Qlength]['urlStub'] = urlStub;
230     main.connectQueue[Qlength]['body'] = body;
232     if (main.connectQueueConnection == null || !YAHOO.util.Connect.isCallInProgress(main.connectQueueConnection)) {
233         main.connectQueue_fireNext();
234     }
235 };
238 main_class.prototype.connectQueue_fireNext = function() {
239     var head = main.connectQueueHead;
240     if (head >= main.connectQueue.length) {
241         return;
242     }
243     var callback = {
244     success: function(){
245              main.connectQueue_fireNext();
246         }
247     };
248     main.connectQueueConnection = main.connect(main.connectQueue[head]['method'],
249             main.connectQueue[head]['urlStub'],
250             callback,
251             main.connectQueue[head]['body']);
252     main.connectQueueHead++;
253 };
256 main_class.prototype.update_marker = function(newMarker) {
257     if (this.marker != null) {
258         this.marker.toggle_highlight();
259     }
260     this.marker = newMarker;
261     this.marker.toggle_highlight();
263     this.connect('post', 'class=course&field=marker', null, 'value='+this.marker.sectionId);
264 };
267 main_class.prototype.getString = function(identifier, variable) {
268     if (this.portal.strings[identifier]) {
269         return this.portal.strings[identifier].replace(/_var_/, variable);
270     }
271 };
273 main_class.prototype.is_ie = function() {
274     var agent = navigator.userAgent.toLowerCase();
275     if ((agent.indexOf('msie') != -1)) {
276         return true;
277     }
278     return false;
279 };
282 var main = new main_class();
285 function php_portal_class() {
286     //portal to php data
287     this.id = null;
288     this.debug = null;
290     //array of id's of blocks set at end of page load by php
291     this.blocks = new Array();
292     this.imagePath = null;
294     //flag for week fomat
295     this.isWeek = false;
297     //strings
298     this.strings = [];
300     //icons
301     this.icons = [];
303     YAHOO.log("Instantiated php_portal_class", "info");