tot - Check-in [2]
Not logged in
[Browse]  [Home]  [Login]  [Reports]  [Search]  [Timeline
  [Patchset
Check-in Number: 2
Date: 2007-Feb-14 17:33:03 (local)
2007-Feb-14 16:33:03 (UTC)
User:rse
Branch:
Comment: store my latest jQuery plugin hacks onto ToT
Tickets:
Inspections:
Files:
jquery/jquery.alternation.js      added-> 2
jquery/jquery.schedule.js      added-> 2
Added: jquery/jquery.alternation.js
===================================================================
--- jquery/jquery.alternation.js	                        (rev 0)
+++ jquery/jquery.alternation.js	2007-02-14 16:33:03 UTC (rev 2)
@@ -0,0 +1,107 @@
+/*
+**  jquery.alternation.js -- jQuery plugin for DOM element alternation
+**  Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 
+**  Copyright (c) 2006 Torsten Baldes
+**  Copyright (c) 2006 Matt Oakes
+**
+**  $LastChangedDate$
+**  $Rev$
+*/
+
+/*
+ *  <div class="alternation"> 
+ *      <div>content 1</div>
+ *      <div>content 2</div>
+ *      <div>content 3</div>
+ *  </div>
+ *
+ *  $('.alternation').alternation({
+ *      alternation: alternation type: "sequence" or "random"            (default: 'sequence')
+ *      timeout:     alternation time (in ms)                            (default: 2000)
+ *      animation:   animation type: "fade" or "slide"                   (default: "fade")
+ *      speed:       animation speed (in ms or "slow", "normal", "fast") (default: "normal")
+ *      class:       container element CSS class                         (default: "alternation") 
+ *      height:      container element CSS height                        (default: "auto")
+ *  });
+ */
+
+(function($) {
+
+    /* jQuery dynamic object method */
+    $.fn.alternation = function(options) {
+        return this.each(function() {   
+            $.alternation(this, options);
+        });
+    };
+
+    /* jQuery static function */
+    $.alternation = function(container, options) {
+        var settings = {
+            'alternation': 'sequence',
+            'timeout':     2000,
+            'animation':   'fade',
+            'speed':       'normal',
+            'class':       'alternation',
+            'height':      'auto'
+        };
+        if (options)
+            $.extend(settings, options);
+        var elements = $(container).children();
+        if (elements.length > 1) {
+            $(container).css('position', 'relative');
+            $(container).css('height', settings["height"]);
+            $(container).addClass(settings["class"]);
+            for (var i = 0; i < elements.length; i++) {
+                $(elements[i]).css('z-index', String(elements.length-i));
+                $(elements[i]).css('position', 'absolute');
+                $(elements[i]).hide();
+            };
+            if (settings["alternation"] == "sequence") {
+                setTimeout(function() {
+                    $.alternation._next(elements, settings, 1, 0);
+                }, settings.timeout);
+                $(elements[0]).show();
+            } else if (settings["alternation"] == "random") {
+                setTimeout(function() {
+                    do {
+                        current = Math.floor(Math.random() * elements.length);
+                    } while (current == 0)
+                    $.alternation._next(elements, settings, current, 0);
+                }, settings.timeout);
+                $(elements[0]).show();
+            } else
+                alert('jQuery: alternation: parameter "alternation" must either be "sequence" or "random"');
+        }
+    }
+
+    /* jQuery static function */
+    $.alternation._next = function(elements, settings, current, last) {
+        if (settings["animation"] == 'slide') {
+            $(elements[last]).slideUp(settings.speed,
+                $(elements[current]).slideDown(settings.speed));
+        } else if (settings["animation"] == 'fade') {
+            $(elements[last]).fadeOut(settings.speed);
+            $(elements[current]).fadeIn(settings.speed);
+        } else
+            alert('jQuery: alternation: parameter "animation" must either be "slide" or "fade"');
+        if (settings["alternation"] == "sequence") {
+            if ((current + 1) < elements.length) {
+                current = current + 1;
+                last = current - 1;
+            } else {
+                current = 0;
+                last = elements.length - 1;
+            }
+        } else if (settings["alternation"] == "random") {
+            last = current;
+            while (current == last)
+                current = Math.floor(Math.random() * elements.length);
+        } else
+            alert('jQuery: alternation: parameter "alternation" must either be "sequence" or "random"');
+        setTimeout((function() {
+            $.alternation._next(elements, settings, current, last);
+        }), settings.timeout);
+    };
+
+})(jQuery);
+

Added: jquery/jquery.schedule.js
===================================================================
--- jquery/jquery.schedule.js	                        (rev 0)
+++ jquery/jquery.schedule.js	2007-02-14 16:33:03 UTC (rev 2)
@@ -0,0 +1,206 @@
+/*
+**  jquery.schedule.js -- jQuery plugin for scheduled/deferred actions
+**  Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 
+**
+**  $LastChangedDate$
+**  $Rev$
+*/
+
+/*
+ *  <div id="button">TEST BUTTON</div>
+ *  <div id="test"></div>
+ *
+ *  <script type="text/javascript">
+ *     $(document).ready(
+ *     function(){
+ *         $('#button').click(function () {
+ *             $(this).css("color", "blue").schedule(2000, function (x) {
+ *                 $(this).css("color", "red");
+ *                 $("#test").html("test: x = " + x);
+ *             }, 42);
+ *         });
+ *     });
+ *  </script>
+ */
+
+/*  object constructor  */
+jQuery.scheduler = function () {
+    this.bucket = {};
+    return;
+};
+
+/*  object methods  */
+jQuery.scheduler.prototype = {
+    /*  schedule a task  */
+    schedule: function () {
+        /*  schedule context with default parameters */
+        var ctx = {
+            "_scheduler": this,         /* internal: back-reference to scheduler object */
+            "_handle":    null,         /* internal: unique handle of low-level task */
+            "id":         null,         /* unique identifier of high-level schedule */
+            "time":       1000,         /* time in milliseconds after which the task is run */
+            "repeat":     false,        /* whether schedule should be automatically repeated */
+            "protect":    false,        /* whether schedule should be protected from double scheduling */
+            "obj":        null,         /* function context object ("this") */
+            "func":       function(){}, /* function to call */
+            "args":       []            /* function arguments to pass */
+        };
+
+        /*  helper function for portable checking whether something is a function  */
+	    var isfn = function (fn) {
+            return (
+                   !!fn
+                && typeof fn != "string"
+                && typeof fn[0] == "undefined"
+                && RegExp("function", "i").test(fn + "")
+            );
+	    };
+
+        /*  parse arguments into context parameters (part 1/2):
+            support the flexible way of an associated array */
+        var i = 0;
+        if (typeof arguments[i] == "object") {
+            for (var option in arguments[i])
+                if (   typeof ctx[option] != "undefined"
+                    && option.substr(0, 1) != "_")
+                    ctx[option] = arguments[i][option];
+            i++;
+        }
+
+        /*  parse arguments into context parameters (part 2/2):
+            support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */
+        if (typeof arguments[i] == "number")
+            ctx["time"] = arguments[i++];
+        if (typeof arguments[i] == "boolean")
+            ctx["repeat"] = arguments[i++];
+        if (typeof arguments[i] == "boolean")
+            ctx["protect"] = arguments[i++];
+        if (   typeof arguments[i] == "object"
+            && typeof arguments[i+1] == "string"
+            && isfn(arguments[i][arguments[i+1]])) {
+            ctx["obj"] = arguments[i++];
+            ctx["func"] = arguments[i++];
+        }
+        else if (typeof arguments[i] != "undefined")
+            ctx["func"] = arguments[i++];
+        while (typeof arguments[i] != "undefined")
+            ctx["args"].push(arguments[i++]);
+
+        /*  determine unique identifier of task  */
+        if (ctx["id"] == null)
+            ctx["id"] = (  String(ctx["repeat"])  + ":"
+                         + String(ctx["protect"]) + ":"
+                         + String(ctx["time"])    + ":"
+                         + String(ctx["obj"])     + ":"
+                         + String(ctx["func"])    + ":"
+                         + String(ctx["args"])         );
+
+        /*  optionally protect from duplicate calls  */
+        if (ctx["protect"])
+            if (typeof this.bucket[ctx["id"]] != "undefined")
+                return this.bucket[ctx["id"]];
+
+        /*  support execution of methods by name and arbitrary scripts  */
+        if (!isfn(ctx["func"])) {
+            if (   ctx["obj"] != null
+                && typeof ctx["obj"] == "object"
+	            && typeof ctx["func"] == "string"
+                && isfn(ctx["obj"][ctx["func"]]))
+                /*  method by name  */
+                ctx["func"] = ctx["obj"][ctx["func"]];
+            else
+                /*  arbitrary script  */
+                ctx["func"] = eval("function () { " + ctx["func"] + " }");
+        }
+
+        /*  pass-through to internal scheduling operation  */
+        ctx["_handle"] = this._schedule(ctx);
+
+        /*  store context into bucket of scheduler object  */
+        this.bucket[ctx["id"]] = ctx;
+
+        /*  return context  */
+        return ctx;
+    },
+
+    /*  re-schedule a task  */
+    reschedule: function (ctx) {
+        if (typeof ctx == "string")
+            ctx = this.bucket[ctx];
+
+        /*  pass-through to internal scheduling operation  */
+        ctx["_handle"] = this._schedule(ctx);
+
+        /*  return context  */
+        return ctx;
+    },
+
+    /*  internal scheduling operation  */
+    _schedule: function (ctx) {
+        /*  closure to act as the call trampoline function  */
+        var trampoline = function () {
+            /*  jump into function  */
+            var obj = (ctx["obj"] != null ? ctx["obj"] : ctx);
+            (ctx["func"]).apply(obj, ctx["args"]);
+
+            /*  either repeat scheduling and keep in bucket or
+                just stop scheduling and delete from scheduler bucket  */
+            if (   /* not cancelled from inside... */
+                   typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined"
+                && /* ...and repeating requested */
+                   ctx["repeat"])
+                (ctx["_scheduler"])._schedule(ctx);
+            else
+                delete (ctx["_scheduler"]).bucket[ctx["id"]];
+        }
+
+        /*  schedule task and return handle  */
+        return setTimeout(trampoline, ctx["time"]);
+    },
+
+    /*  cancel a scheduled task  */
+    cancel: function (ctx) {
+        if (typeof ctx == "string")
+            ctx = this.bucket[ctx];
+
+        /*  cancel scheduled task  */
+        if (typeof ctx == "object") {
+            clearTimeout(ctx["_handle"]);
+            delete this.bucket[ctx["id"]];
+        }
+    }
+};
+
+/* ============================== */
+
+/* integrate a global instance of the scheduler into the global jQuery object */
+jQuery.extend({
+    scheduler$: new jQuery.scheduler(),
+	schedule:   function () { return jQuery.scheduler$.schedule.apply  (jQuery.scheduler$, arguments) },
+	reschedule: function () { return jQuery.scheduler$.reschedule.apply(jQuery.scheduler$, arguments) },
+	cancel:     function () { return jQuery.scheduler$.cancel.apply    (jQuery.scheduler$, arguments) }
+});
+
+/* integrate scheduling convinience method into all jQuery objects */
+jQuery.fn.extend({
+	schedule: function () {
+        var a = arguments;
+		return this.each(function () {
+            var time = a[0];
+            var func = a[1];
+            var args = [];
+            for (var i = 2; i < a.length; i++)
+                args.push(a[i]);
+            return jQuery.schedule({
+                id:      this,
+                repeat:  false,
+                protect: false,
+                time:    time,
+                obj:     this,
+                func:    func,
+                args:    args
+            });
+		});
+	}
+});
+