Update of /var/cvs/contributions/didactor2/src/core/templates/core/js
In directory james.mmbase.org:/tmp/cvs-serv20119

Modified Files:
        Didactor.js 
Log Message:
Will move 'open content' javascript to object oriented and better documented 
Didactor.js


See also: 
http://cvs.mmbase.org/viewcvs/contributions/didactor2/src/core/templates/core/js


Index: Didactor.js
===================================================================
RCS file: 
/var/cvs/contributions/didactor2/src/core/templates/core/js/Didactor.js,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- Didactor.js 13 Nov 2008 11:17:15 -0000      1.17
+++ Didactor.js 5 Mar 2009 08:28:03 -0000       1.18
@@ -6,20 +6,34 @@
  * One global variable 'didactor' is automaticly created, which can be be 
referenced (as long as the di:head tag is used).
  * @since Didactor 2.3.0
  * @author Michiel Meeuwissen
- * @version $Id: Didactor.js,v 1.17 2008/11/13 11:17:15 michiel Exp $
+ * @version $Id: Didactor.js,v 1.18 2009/03/05 08:28:03 michiel Exp $
  */
 
 
-
-
 function Didactor() {
-    this.onlineReporter = this.getSetting("Didactor-OnlineReporter");
-    this.url            = this.getSetting("Didactor-URL");
-    this.lastCheck      = new Date();
-    this.pageReporter   = this.getSetting("Didactor-PageReporter") == "true";
-
-    this.questions      = {};
     var self = this;
+    $(document).ready(function() {
+        self.onlineReporter = self.getSetting("Didactor-OnlineReporter");
+        self.url            = self.getSetting("Didactor-URL");
+        self.root           = self.getSetting("Didactor-Root");
+        self.lastCheck      = new Date();
+        self.pageReporter   = self.getSetting("Didactor-PageReporter") == 
"true";
+        self.lastPage       = self.getSetting("Didactor-LastPage"); // not 
currently used
+        self.usedFrames     = {};
+        self.questions      = {};
+
+        self.fragments      = [];
+        {
+            var url = document.location.href;
+            var fragmentIndex = url.indexOf('#');
+            if (fragmentIndex > 0) {
+                self.fragments = url.substring(fragmentIndex + 1).split('_');
+            }
+            if (self.fragments.length > 0) {
+                self.openContent(self.fragments[0]);
+            }
+        }
+
 
     $.timer(500, function(timer) {
            self.reportOnline();
@@ -28,32 +42,82 @@
         if (interval < 10000) interval = 10000;
            timer.reset(self.pageReporter ? interval : 1000 * 60 * 2);
     });
-    if (this.pageReporter) {
+        if (self.pageReporter) {
            $(window).bind("beforeunload", function() {
                self.reportOnline(null, false);
            });
     }
 
-    this.content = null;
+        self.content = null;
     for (var i = 0; i < Didactor.contentParameters.length; i++) {
            var param = Didactor.contentParameters[i];
-           this.content = $.query.get(param);
+               self.content = $.query.get(param);
            $.query.REMOVE(param);
-           if (this.content != null) break;
+               if (self.content != null) break;
     }
-    this.block = this.content; // This is the content as defined by the URL. 
'block' will no be changed.
+        self.block = self.content; // This is the content as defined by the 
URL. 'block' will no be changed.
     for (var i = 0; i < Didactor.ignoredParameters.length; i++) {
            var param = Didactor.ignoredParameters[i];
            $.query.REMOVE(param);
     }
-    this.q = $.query.toString();
+        self.q = $.query.toString();
 
 
     for (var i = 0; i < Didactor.welcomeFiles.length; i++) {
            var welcomeFile = Didactor.welcomeFiles[i];
-           this.url = this.url.replace(new RegExp(welcomeFile + "$"), "");
+               self.url = self.url.replace(new RegExp(welcomeFile + "$"), "");
     }
 
+        $(document).bind("didactorContentLoaded",  function(ev, data) {
+            self.setContent(data.number);
+            self.resolveQuestions(data.loaded);
+        });
+        $(document).bind("didactorContent",  function(ev, data) {
+            self.setContent(data.number);
+            self.setUpQuestionEvents(data.loaded);
+        });
+
+        $(document).bind("didactorContentBeforeUnload",  function(ev, el) {
+        self.saveQuestions();
+        });
+        $(document).bind("beforeunload", function() {
+            self.saveQuestions();
+        });
+        // if this is a staticly loaded piece of html, there may be some 
questions already
+        self.resolveQuestions(document);
+
+
+
+        $(document).bind("didactorContent", function(ev, data) {
+            var url = document.location.href;
+            var fragmentIndex = url.indexOf('#');
+            var fragment = url.substring(fragmentIndex);
+            var i = fragment.indexOf('learnblock_');
+            if (i > -1) {
+                learnblock = fragment;
+            }
+            $(".subnavigationPage  ul.navigation li").each(function() {
+                var href = $(this).find("a")[0].href;
+                var i = href.indexOf('#');
+                var anchor = href.substring(i) + "_block";
+                if (learnblock == null) {
+                    learnblock = anchor;
+                }
+
+                $(this).click(function() {
+                    $(".subnavigationPage  ul.navigation 
li").removeClass("active");
+                    $(this).addClass("active");
+                    $(learnblock).hide();
+                    learnblock = anchor;
+                    $(learnblock).show();
+                    document.location.href = href;
+                    return false;
+                });
+
+            });
+        });
+
+    });
 }
 
 Didactor.contentParameters = ["learnobject", "openSub" ];
@@ -146,9 +210,6 @@
         $(this).remove();
     });
 
-
-
-
 }
 
 Didactor.prototype.saveQuestions = function() {
@@ -165,27 +226,120 @@
 }
 
 
-var didactor;
-$(document).ready(function() {
-    didactor = new Didactor();
+/**
+ * Request content using AJAX from the server
+ */
+Didactor.prototype.requestContent = function(href, number) {
+    var contentEl = document.getElementById('contentFrame');
+    $(document).trigger("didactorContentBeforeUnload",  { unloaded: contentEl 
});
     var self = this;
-    $(document).bind("didactorContentLoaded",  function(ev, data) {
-        didactor.setContent(data.number);
-        didactor.resolveQuestions(data.loaded);
-    });
-    $(document).bind("didactorContent",  function(ev, data) {
-        didactor.setContent(data.number);
-        didactor.setUpQuestionEvents(data.loaded);
+    var content = this.usedFrames[href];
+    if (content == null) {
+        loadIconOn();
+        $.ajax({async: true, url: href, type: "GET", dataType: "xml", data: 
null,
+                    complete: function(res, status){
+                    loadIconOff();
+                    if (status == "success") {
+                        $(contentEl).empty();
+                        $(document).trigger("didactorContentBeforeLoaded",  { 
response: res, number: number });
+                        $(contentEl).append(res.responseText);
+                        // console.log("updating " + contentEl + "with" + 
xmlhttp.responseXML);
+                        contentEl.validator = new MMBaseValidator();
+                        //contentEl.validator.logEnabled = true;
+                        //contentEl.validator.traceEnabled = true;
+                        contentEl.validator.validateHook = function(valid) {
+                            var buttons = 
$(contentEl).find("input.formbutton");
+                            for (i = 0; i < buttons.length; i++) {
+                                var disabled = 
(contentEl.validator.invalidElements > 0);
+                                buttons[i].disabled = disabled;
+                                // just because IE does not recognize 
input[disabled]
+                                // IE SUCKS
+                                buttons[i].className = "formbutton " + 
(disabled ? "disabled" : "enabled");
+                            }
+                        };
+                        contentEl.validator.validatePage(false, contentEl);
+                        contentEl.validator.addValidation(contentEl);
+                        
check(res.responseXML.documentElement.getAttribute('class'));
+                        document.href_frame = href;
+                        var array = [];
+                        // in case it is more than one element (e.g. comments 
or so), store all childnodes.
+
+                        try {
+                            for (var i = 0; i < contentEl.childNodes.length; 
i++) {
+                                array.push(contentEl.childNodes[i]);
+                            }
+                        } catch (ex) {
+                            alert(ex);
+                        }
+                        self.usedFrames[href] = array;
+                        if ($.browser.msie) {
+                            if ($.browser.version.substr(0, 3) <= 6.0) {
+                                // alert("IE 6 is a horrible browser which 
cannot do this correctly at once
+                                setTimeout(function() {
+                                        $(contentEl).empty();
+                                        for (var i=0; i < array.length; i++) {
+                                            contentEl.appendChild(array[i]);
+                                        }
+                                        
$(document).trigger("didactorContentLoaded",  { loaded: contentEl, number: 
number });
+                                        $(document).trigger("didactorContent", 
 { loaded: contentEl, number: number });
+                                    }, 500);
+                            }
+                        } else {
+                            $(document).trigger("didactorContentLoaded",  { 
loaded: contentEl, number: number });
+                            $(document).trigger("didactorContent",  { loaded: 
contentEl, number: number });
+                        }
+
+                    }
+                }
     });
+   } else {
+       $(contentEl).empty();
+       for (var i = 0; i < content.length; i++) {
+           contentEl.appendChild(content[i]);
+       }
+       document.href_frame = href;
+       $(document).trigger("didactorContent",  { loaded: contentEl, number: 
number });
+   }
+    //scrollToTop();
+};
 
-    $(document).bind("didactorContentBeforeUnload",  function(ev, el) {
-        didactor.saveQuestions();
 
-    });
-    $(window).bind("beforeunload", function() {
-        didactor.saveQuestions();
-    });
 
-    // if this is a staticly loaded piece of html, there may be some questions 
already
-    didactor.resolveQuestions(document);
-});
+
+/**
+ * Opens content with a certain number
+ * @param type (optional, is supposed to be absent if first argument numeric). 
The type of the content.
+ * @param number MMBase object number as an integer.
+ * @param navigationElement (option) The element which was used to open this 
content. It'll receive a class
+ * 'active'
+ */
+Didactor.prototype.openContent = function(type, number, navigationElement) {
+    // The 'type' argument is optional.
+    // So, of the first argument is numeric. Interpret that has the 'number".
+    if (/^[+-]?\d+$/.test(type)) {
+        navigationElement = number;
+        number = type;
+        type = null;
+    }
+    if (this.currentNavigationElement != null) {
+        $(this.currentNavigationElement).removeClass("active");
+    }
+
+    if ( number > 0 ) {
+        currentnumber = number;
+    }
+
+    var href = addParameter(this.root + 'content/', 'object=' + number);
+    if (type != null && type != '') {
+        href = addParameter(href, 'type=' + type);
+    }
+    this.requestContent(href, number);
+    this.currentNavigationElement = navigationElement;
+    if (this.currentNavigationElement != null) {
+        $(this.currentNavigationElement).addClass("active");
+    }
+
+};
+
+
+var didactor = new Didactor();
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to