1 /*2 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions3 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com>4 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>5 **6 ** $LastChangedDate$7 ** $LastChangedRevision$8 */910 /*11 * <div id="button">TEST BUTTON</div>12 * <div id="test"></div>13 *14 * <script type="text/javascript">15 * $(document).ready(16 * function(){17 * $('#button').click(function () {18 * $(this).css("color", "blue").schedule(2000, function (x) {19 * $(this).css("color", "red");20 * $("#test").html("test: x = " + x);21 * }, 42);22 * });23 * });24 * </script>25 */2627 (function($) {2829 /* object constructor */30 $.scheduler = function () {31 this.bucket = {};32 return;33 };3435 /* object methods */36 $.scheduler.prototype = {37 /* schedule a task */38 schedule: function () {39 /* schedule context with default parameters */40 var ctx = {41 "id": null, /* unique identifier of high-level schedule */42 "time": 1000, /* time in milliseconds after which the task is run */43 "repeat": false, /* whether schedule should be automatically repeated */44 "protect": false, /* whether schedule should be protected from double scheduling */45 "obj": null, /* function context object ("this") */46 "func": function(){}, /* function to call */47 "args": [] /* function arguments to pass */48 };4950 /* helper function: portable checking whether something is a function */51 function _isfn (fn) {52 return (53 !!fn54 && typeof fn != "string"55 && typeof fn[0] == "undefined"56 && RegExp("function", "i").test(fn + "")57 );58 };5960 /* parse arguments into context parameters (part 1/4):61 detect an override object (special case to support jQuery method) */62 var i = 0;63 var override = false;64 if (typeof arguments[i] == "object" && arguments.length > 1) {65 override = true;66 i++;67 }6869 /* parse arguments into context parameters (part 2/4):70 support the flexible way of an associated array */71 if (typeof arguments[i] == "object") {72 for (var option in arguments[i])73 if (typeof ctx[option] != "undefined")74 ctx[option] = arguments[i][option];75 i++;76 }7778 /* parse arguments into context parameters (part 3/4):79 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */80 if ( typeof arguments[i] == "number"81 || ( typeof arguments[i] == "string"82 && arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))83 ctx["time"] = arguments[i++];84 if (typeof arguments[i] == "boolean")85 ctx["repeat"] = arguments[i++];86 if (typeof arguments[i] == "boolean")87 ctx["protect"] = arguments[i++];88 if ( typeof arguments[i] == "object"89 && typeof arguments[i+1] == "string"90 && _isfn(arguments[i][arguments[i+1]])) {91 ctx["obj"] = arguments[i++];92 ctx["func"] = arguments[i++];93 }94 else if ( typeof arguments[i] != "undefined"95 && ( _isfn(arguments[i])96 || typeof arguments[i] == "string"))97 ctx["func"] = arguments[i++];98 while (typeof arguments[i] != "undefined")99 ctx["args"].push(arguments[i++]);100101 /* parse arguments into context parameters (part 4/4):102 apply parameters from override object */103 if (override) {104 if (typeof arguments[1] == "object") {105 for (var option in arguments[0])106 if ( typeof ctx[option] != "undefined"107 && typeof arguments[1][option] == "undefined")108 ctx[option] = arguments[0][option];109 }110 else {111 for (var option in arguments[0])112 if (typeof ctx[option] != "undefined")113 ctx[option] = arguments[0][option];114 }115 i++;116 }117118 /* annotate context with internals */119 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */120 ctx["_handle"] = null; /* internal: unique handle of low-level task */121122 /* determine time value in milliseconds */123 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));124 if (match && match[0] != "undefined" && match[1] != "undefined")125 ctx["time"] = String(parseInt(match[1]) *126 { s: 1000, m: 1000*60, h: 1000*60*60,127 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);128129 /* determine unique identifier of task */130 if (ctx["id"] == null)131 ctx["id"] = ( String(ctx["repeat"]) + ":"132 + String(ctx["protect"]) + ":"133 + String(ctx["time"]) + ":"134 + String(ctx["obj"]) + ":"135 + String(ctx["func"]) + ":"136 + String(ctx["args"]) );137138 /* optionally protect from duplicate calls */139 if (ctx["protect"])140 if (typeof this.bucket[ctx["id"]] != "undefined")141 return this.bucket[ctx["id"]];142143 /* support execution of methods by name and arbitrary scripts */144 if (!_isfn(ctx["func"])) {145 if ( ctx["obj"] != null146 && typeof ctx["obj"] == "object"147 && typeof ctx["func"] == "string"148 && _isfn(ctx["obj"][ctx["func"]]))149 /* method by name */150 ctx["func"] = ctx["obj"][ctx["func"]];151 else152 /* arbitrary script */153 ctx["func"] = eval("function () { " + ctx["func"] + " }");154 }155156 /* pass-through to internal scheduling operation */157 ctx["_handle"] = this._schedule(ctx);158159 /* store context into bucket of scheduler object */160 this.bucket[ctx["id"]] = ctx;161162 /* return context */163 return ctx;164 },165166 /* re-schedule a task */167 reschedule: function (ctx) {168 if (typeof ctx == "string")169 ctx = this.bucket[ctx];170171 /* pass-through to internal scheduling operation */172 ctx["_handle"] = this._schedule(ctx);173174 /* return context */175 return ctx;176 },177178 /* internal scheduling operation */179 _schedule: function (ctx) {180 /* closure to act as the call trampoline function */181 var trampoline = function () {182 /* jump into function */183 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx);184 (ctx["func"]).apply(obj, ctx["args"]);185186 /* either repeat scheduling and keep in bucket or187 just stop scheduling and delete from scheduler bucket */188 if ( /* not cancelled from inside... */189 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined"190 && /* ...and repeating requested */191 ctx["repeat"])192 (ctx["_scheduler"])._schedule(ctx);193 else194 delete (ctx["_scheduler"]).bucket[ctx["id"]];195 };196197 /* schedule task and return handle */198 return setTimeout(trampoline, ctx["time"]);199 },200201 /* cancel a scheduled task */202 cancel: function (ctx) {203 if (typeof ctx == "string")204 ctx = this.bucket[ctx];205206 /* cancel scheduled task */207 if (typeof ctx == "object") {208 clearTimeout(ctx["_handle"]);209 delete this.bucket[ctx["id"]];210 }211 }212 };213214 /* integrate a global instance of the scheduler into the global jQuery object */215 $.extend({216 scheduler$: new $.scheduler(),217 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) },218 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },219 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) }220 });221222 /* integrate scheduling convinience method into all jQuery objects */223 $.fn.extend({224 schedule: function () {225 var a = [ {} ];226 for (var i = 0; i < arguments.length; i++)227 a.push(arguments[i]);228 return this.each(function () {229 a[0] = { "id": this, "obj": this };230 return $.schedule.apply($, a);231 });232 }233 });234235 })(jQuery);236237 /*238 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions239 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com>240 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>241 **242 ** $LastChangedDate$243 ** $LastChangedRevision$244 */245246 /*247 * <div id="button">TEST BUTTON</div>248 * <div id="test"></div>249 *250 * <script type="text/javascript">251 * $(document).ready(252 * function(){253 * $('#button').click(function () {254 * $(this).css("color", "blue").schedule(2000, function (x) {255 * $(this).css("color", "red");256 * $("#test").html("test: x = " + x);257 * }, 42);258 * });259 * });260 * </script>261 */262263 (function($) {264265 /* object constructor */266 $.scheduler = function () {267 this.bucket = {};268 return;269 };270271 /* object methods */272 $.scheduler.prototype = {273 /* schedule a task */274 schedule: function () {275 /* schedule context with default parameters */276 var ctx = {277 "id": null, /* unique identifier of high-level schedule */278 "time": 1000, /* time in milliseconds after which the task is run */279 "repeat": false, /* whether schedule should be automatically repeated */280 "protect": false, /* whether schedule should be protected from double scheduling */281 "obj": null, /* function context object ("this") */282 "func": function(){}, /* function to call */283 "args": [] /* function arguments to pass */284 };285286 /* helper function: portable checking whether something is a function */287 function _isfn (fn) {288 return (289 !!fn290 && typeof fn != "string"291 && typeof fn[0] == "undefined"292 && RegExp("function", "i").test(fn + "")293 );294 };295296 /* parse arguments into context parameters (part 1/4):297 detect an override object (special case to support jQuery method) */298 var i = 0;299 var override = false;300 if (typeof arguments[i] == "object" && arguments.length > 1) {301 override = true;302 i++;303 }304305 /* parse arguments into context parameters (part 2/4):306 support the flexible way of an associated array */307 if (typeof arguments[i] == "object") {308 for (var option in arguments[i])309 if (typeof ctx[option] != "undefined")310 ctx[option] = arguments[i][option];311 i++;312 }313314 /* parse arguments into context parameters (part 3/4):315 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */316 if ( typeof arguments[i] == "number"317 || ( typeof arguments[i] == "string"318 && arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))319 ctx["time"] = arguments[i++];320 if (typeof arguments[i] == "boolean")321 ctx["repeat"] = arguments[i++];322 if (typeof arguments[i] == "boolean")323 ctx["protect"] = arguments[i++];324 if ( typeof arguments[i] == "object"325 && typeof arguments[i+1] == "string"326 && _isfn(arguments[i][arguments[i+1]])) {327 ctx["obj"] = arguments[i++];328 ctx["func"] = arguments[i++];329 }330 else if ( typeof arguments[i] != "undefined"331 && ( _isfn(arguments[i])332 || typeof arguments[i] == "string"))333 ctx["func"] = arguments[i++];334 while (typeof arguments[i] != "undefined")335 ctx["args"].push(arguments[i++]);336337 /* parse arguments into context parameters (part 4/4):338 apply parameters from override object */339 if (override) {340 if (typeof arguments[1] == "object") {341 for (var option in arguments[0])342 if ( typeof ctx[option] != "undefined"343 && typeof arguments[1][option] == "undefined")344 ctx[option] = arguments[0][option];345 }346 else {347 for (var option in arguments[0])348 if (typeof ctx[option] != "undefined")349 ctx[option] = arguments[0][option];350 }351 i++;352 }353354 /* annotate context with internals */355 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */356 ctx["_handle"] = null; /* internal: unique handle of low-level task */357358 /* determine time value in milliseconds */359 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));360 if (match && match[0] != "undefined" && match[1] != "undefined")361 ctx["time"] = String(parseInt(match[1]) *362 { s: 1000, m: 1000*60, h: 1000*60*60,363 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);364365 /* determine unique identifier of task */366 if (ctx["id"] == null)367 ctx["id"] = ( String(ctx["repeat"]) + ":"368 + String(ctx["protect"]) + ":"369 + String(ctx["time"]) + ":"370 + String(ctx["obj"]) + ":"371 + String(ctx["func"]) + ":"372 + String(ctx["args"]) );373374 /* optionally protect from duplicate calls */375 if (ctx["protect"])376 if (typeof this.bucket[ctx["id"]] != "undefined")377 return this.bucket[ctx["id"]];378379 /* support execution of methods by name and arbitrary scripts */380 if (!_isfn(ctx["func"])) {381 if ( ctx["obj"] != null382 && typeof ctx["obj"] == "object"383 && typeof ctx["func"] == "string"384 && _isfn(ctx["obj"][ctx["func"]]))385 /* method by name */386 ctx["func"] = ctx["obj"][ctx["func"]];387 else388 /* arbitrary script */389 ctx["func"] = eval("function () { " + ctx["func"] + " }");390 }391392 /* pass-through to internal scheduling operation */393 ctx["_handle"] = this._schedule(ctx);394395 /* store context into bucket of scheduler object */396 this.bucket[ctx["id"]] = ctx;397398 /* return context */399 return ctx;400 },401402 /* re-schedule a task */403 reschedule: function (ctx) {404 if (typeof ctx == "string")405 ctx = this.bucket[ctx];406407 /* pass-through to internal scheduling operation */408 ctx["_handle"] = this._schedule(ctx);409410 /* return context */411 return ctx;412 },413414 /* internal scheduling operation */415 _schedule: function (ctx) {416 /* closure to act as the call trampoline function */417 var trampoline = function () {418 /* jump into function */419 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx);420 (ctx["func"]).apply(obj, ctx["args"]);421422 /* either repeat scheduling and keep in bucket or423 just stop scheduling and delete from scheduler bucket */424 if ( /* not cancelled from inside... */425 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined"426 && /* ...and repeating requested */427 ctx["repeat"])428 (ctx["_scheduler"])._schedule(ctx);429 else430 delete (ctx["_scheduler"]).bucket[ctx["id"]];431 };432433 /* schedule task and return handle */434 return setTimeout(trampoline, ctx["time"]);435 },436437 /* cancel a scheduled task */438 cancel: function (ctx) {439 if (typeof ctx == "string")440 ctx = this.bucket[ctx];441442 /* cancel scheduled task */443 if (typeof ctx == "object") {444 clearTimeout(ctx["_handle"]);445 delete this.bucket[ctx["id"]];446 }447 }448 };449450 /* integrate a global instance of the scheduler into the global jQuery object */451 $.extend({452 scheduler$: new $.scheduler(),453 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) },454 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },455 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) }456 });457458 /* integrate scheduling convinience method into all jQuery objects */459 $.fn.extend({460 schedule: function () {461 var a = [ {} ];462 for (var i = 0; i < arguments.length; i++)463 a.push(arguments[i]);464 return this.each(function () {465 a[0] = { "id": this, "obj": this };466 return $.schedule.apply($, a);467 });468 }469 });470471 })(jQuery);472473 /*474 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions475 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com>476 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>477 **478 ** $LastChangedDate$479 ** $LastChangedRevision$480 */481482 /*483 * <div id="button">TEST BUTTON</div>484 * <div id="test"></div>485 *486 * <script type="text/javascript">487 * $(document).ready(488 * function(){489 * $('#button').click(function () {490 * $(this).css("color", "blue").schedule(2000, function (x) {491 * $(this).css("color", "red");492 * $("#test").html("test: x = " + x);493 * }, 42);494 * });495 * });496 * </script>497 */498499 (function($) {500501 /* object constructor */502 $.scheduler = function () {503 this.bucket = {};504 return;505 };506507 /* object methods */508 $.scheduler.prototype = {509 /* schedule a task */510 schedule: function () {511 /* schedule context with default parameters */512 var ctx = {513 "id": null, /* unique identifier of high-level schedule */514 "time": 1000, /* time in milliseconds after which the task is run */515 "repeat": false, /* whether schedule should be automatically repeated */516 "protect": false, /* whether schedule should be protected from double scheduling */517 "obj": null, /* function context object ("this") */518 "func": function(){}, /* function to call */519 "args": [] /* function arguments to pass */520 };521522 /* helper function: portable checking whether something is a function */523 function _isfn (fn) {524 return (525 !!fn526 && typeof fn != "string"527 && typeof fn[0] == "undefined"528 && RegExp("function", "i").test(fn + "")529 );530 };531532 /* parse arguments into context parameters (part 1/4):533 detect an override object (special case to support jQuery method) */534 var i = 0;535 var override = false;536 if (typeof arguments[i] == "object" && arguments.length > 1) {537 override = true;538 i++;539 }540541 /* parse arguments into context parameters (part 2/4):542 support the flexible way of an associated array */543 if (typeof arguments[i] == "object") {544 for (var option in arguments[i])545 if (typeof ctx[option] != "undefined")546 ctx[option] = arguments[i][option];547 i++;548 }549550 /* parse arguments into context parameters (part 3/4):551 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */552 if ( typeof arguments[i] == "number"553 || ( typeof arguments[i] == "string"554 && arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))555 ctx["time"] = arguments[i++];556 if (typeof arguments[i] == "boolean")557 ctx["repeat"] = arguments[i++];558 if (typeof arguments[i] == "boolean")559 ctx["protect"] = arguments[i++];560 if ( typeof arguments[i] == "object"561 && typeof arguments[i+1] == "string"562 && _isfn(arguments[i][arguments[i+1]])) {563 ctx["obj"] = arguments[i++];564 ctx["func"] = arguments[i++];565 }566 else if ( typeof arguments[i] != "undefined"567 && ( _isfn(arguments[i])568 || typeof arguments[i] == "string"))569 ctx["func"] = arguments[i++];570 while (typeof arguments[i] != "undefined")571 ctx["args"].push(arguments[i++]);572573 /* parse arguments into context parameters (part 4/4):574 apply parameters from override object */575 if (override) {576 if (typeof arguments[1] == "object") {577 for (var option in arguments[0])578 if ( typeof ctx[option] != "undefined"579 && typeof arguments[1][option] == "undefined")580 ctx[option] = arguments[0][option];581 }582 else {583 for (var option in arguments[0])584 if (typeof ctx[option] != "undefined")585 ctx[option] = arguments[0][option];586 }587 i++;588 }589590 /* annotate context with internals */591 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */592 ctx["_handle"] = null; /* internal: unique handle of low-level task */593594 /* determine time value in milliseconds */595 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));596 if (match && match[0] != "undefined" && match[1] != "undefined")597 ctx["time"] = String(parseInt(match[1]) *598 { s: 1000, m: 1000*60, h: 1000*60*60,599 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);600601 /* determine unique identifier of task */602 if (ctx["id"] == null)603 ctx["id"] = ( String(ctx["repeat"]) + ":"604 + String(ctx["protect"]) + ":"605 + String(ctx["time"]) + ":"606 + String(ctx["obj"]) + ":"607 + String(ctx["func"]) + ":"608 + String(ctx["args"]) );609610 /* optionally protect from duplicate calls */611 if (ctx["protect"])612 if (typeof this.bucket[ctx["id"]] != "undefined")613 return this.bucket[ctx["id"]];614615 /* support execution of methods by name and arbitrary scripts */616 if (!_isfn(ctx["func"])) {617 if ( ctx["obj"] != null618 && typeof ctx["obj"] == "object"619 && typeof ctx["func"] == "string"620 && _isfn(ctx["obj"][ctx["func"]]))621 /* method by name */622 ctx["func"] = ctx["obj"][ctx["func"]];623 else624 /* arbitrary script */625 ctx["func"] = eval("function () { " + ctx["func"] + " }");626 }627628 /* pass-through to internal scheduling operation */629 ctx["_handle"] = this._schedule(ctx);630631 /* store context into bucket of scheduler object */632 this.bucket[ctx["id"]] = ctx;633634 /* return context */635 return ctx;636 },637638 /* re-schedule a task */639 reschedule: function (ctx) {640 if (typeof ctx == "string")641 ctx = this.bucket[ctx];642643 /* pass-through to internal scheduling operation */644 ctx["_handle"] = this._schedule(ctx);645646 /* return context */647 return ctx;648 },649650 /* internal scheduling operation */651 _schedule: function (ctx) {652 /* closure to act as the call trampoline function */653 var trampoline = function () {654 /* jump into function */655 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx);656 (ctx["func"]).apply(obj, ctx["args"]);657658 /* either repeat scheduling and keep in bucket or659 just stop scheduling and delete from scheduler bucket */660 if ( /* not cancelled from inside... */661 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined"662 && /* ...and repeating requested */663 ctx["repeat"])664 (ctx["_scheduler"])._schedule(ctx);665 else666 delete (ctx["_scheduler"]).bucket[ctx["id"]];667 };668669 /* schedule task and return handle */670 return setTimeout(trampoline, ctx["time"]);671 },672673 /* cancel a scheduled task */674 cancel: function (ctx) {675 if (typeof ctx == "string")676 ctx = this.bucket[ctx];677678 /* cancel scheduled task */679 if (typeof ctx == "object") {680 clearTimeout(ctx["_handle"]);681 delete this.bucket[ctx["id"]];682 }683 }684 };685686 /* integrate a global instance of the scheduler into the global jQuery object */687 $.extend({688 scheduler$: new $.scheduler(),689 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) },690 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },691 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) }692 });693694 /* integrate scheduling convinience method into all jQuery objects */695 $.fn.extend({696 schedule: function () {697 var a = [ {} ];698 for (var i = 0; i < arguments.length; i++)699 a.push(arguments[i]);700 return this.each(function () {701 a[0] = { "id": this, "obj": this };702 return $.schedule.apply($, a);703 });704 }705 });706707 })(jQuery);7081 /* 2 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions 3 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 4 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt> 5 ** 6 ** $LastChangedDate$ 7 ** $LastChangedRevision$ 8 */ 9 10 /* 11 * <div id="button">TEST BUTTON</div> 12 * <div id="test"></div> 13 * 14 * <script type="text/javascript"> 15 * $(document).ready( 16 * function(){ 17 * $('#button').click(function () { 18 * $(this).css("color", "blue").schedule(2000, function (x) { 19 * $(this).css("color", "red"); 20 * $("#test").html("test: x = " + x); 21 * }, 42); 22 * }); 23 * }); 24 * </script> 25 */ 26 27 (function($) { 28 29 /* object constructor */ 30 $.scheduler = function () { 31 this.bucket = {}; 32 return; 33 }; 34 35 /* object methods */ 36 $.scheduler.prototype = { 37 /* schedule a task */ 38 schedule: function () { 39 /* schedule context with default parameters */ 40 var ctx = { 41 "id": null, /* unique identifier of high-level schedule */ 42 "time": 1000, /* time in milliseconds after which the task is run */ 43 "repeat": false, /* whether schedule should be automatically repeated */ 44 "protect": false, /* whether schedule should be protected from double scheduling */ 45 "obj": null, /* function context object ("this") */ 46 "func": function(){}, /* function to call */ 47 "args": [] /* function arguments to pass */ 48 }; 49 50 /* helper function: portable checking whether something is a function */ 51 function _isfn (fn) { 52 return ( 53 !!fn 54 && typeof fn != "string" 55 && typeof fn[0] == "undefined" 56 && RegExp("function", "i").test(fn + "") 57 ); 58 }; 59 60 /* parse arguments into context parameters (part 1/4): 61 detect an override object (special case to support jQuery method) */ 62 var i = 0; 63 var override = false; 64 if (typeof arguments[i] == "object" && arguments.length > 1) { 65 override = true; 66 i++; 67 } 68 69 /* parse arguments into context parameters (part 2/4): 70 support the flexible way of an associated array */ 71 if (typeof arguments[i] == "object") { 72 for (var option in arguments[i]) 73 if (typeof ctx[option] != "undefined") 74 ctx[option] = arguments[i][option]; 75 i++; 76 } 77 78 /* parse arguments into context parameters (part 3/4): 79 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */ 80 if ( typeof arguments[i] == "number" 81 || ( typeof arguments[i] == "string" 82 && arguments[i].match(RegExp("^[0-9]+[smhdw]$")))) 83 ctx["time"] = arguments[i++]; 84 if (typeof arguments[i] == "boolean") 85 ctx["repeat"] = arguments[i++]; 86 if (typeof arguments[i] == "boolean") 87 ctx["protect"] = arguments[i++]; 88 if ( typeof arguments[i] == "object" 89 && typeof arguments[i+1] == "string" 90 && _isfn(arguments[i][arguments[i+1]])) { 91 ctx["obj"] = arguments[i++]; 92 ctx["func"] = arguments[i++]; 93 } 94 else if ( typeof arguments[i] != "undefined" 95 && ( _isfn(arguments[i]) 96 || typeof arguments[i] == "string")) 97 ctx["func"] = arguments[i++]; 98 while (typeof arguments[i] != "undefined") 99 ctx["args"].push(arguments[i++]); 100 101 /* parse arguments into context parameters (part 4/4): 102 apply parameters from override object */ 103 if (override) { 104 if (typeof arguments[1] == "object") { 105 for (var option in arguments[0]) 106 if ( typeof ctx[option] != "undefined" 107 && typeof arguments[1][option] == "undefined") 108 ctx[option] = arguments[0][option]; 109 } 110 else { 111 for (var option in arguments[0]) 112 if (typeof ctx[option] != "undefined") 113 ctx[option] = arguments[0][option]; 114 } 115 i++; 116 } 117 118 /* annotate context with internals */ 119 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */ 120 ctx["_handle"] = null; /* internal: unique handle of low-level task */ 121 122 /* determine time value in milliseconds */ 123 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$")); 124 if (match && match[0] != "undefined" && match[1] != "undefined") 125 ctx["time"] = String(parseInt(match[1]) * 126 { s: 1000, m: 1000*60, h: 1000*60*60, 127 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]); 128 129 /* determine unique identifier of task */ 130 if (ctx["id"] == null) 131 ctx["id"] = ( String(ctx["repeat"]) + ":" 132 + String(ctx["protect"]) + ":" 133 + String(ctx["time"]) + ":" 134 + String(ctx["obj"]) + ":" 135 + String(ctx["func"]) + ":" 136 + String(ctx["args"]) ); 137 138 /* optionally protect from duplicate calls */ 139 if (ctx["protect"]) 140 if (typeof this.bucket[ctx["id"]] != "undefined") 141 return this.bucket[ctx["id"]]; 142 143 /* support execution of methods by name and arbitrary scripts */ 144 if (!_isfn(ctx["func"])) { 145 if ( ctx["obj"] != null 146 && typeof ctx["obj"] == "object" 147 && typeof ctx["func"] == "string" 148 && _isfn(ctx["obj"][ctx["func"]])) 149 /* method by name */ 150 ctx["func"] = ctx["obj"][ctx["func"]]; 151 else 152 /* arbitrary script */ 153 ctx["func"] = eval("function () { " + ctx["func"] + " }"); 154 } 155 156 /* pass-through to internal scheduling operation */ 157 ctx["_handle"] = this._schedule(ctx); 158 159 /* store context into bucket of scheduler object */ 160 this.bucket[ctx["id"]] = ctx; 161 162 /* return context */ 163 return ctx; 164 }, 165 166 /* re-schedule a task */ 167 reschedule: function (ctx) { 168 if (typeof ctx == "string") 169 ctx = this.bucket[ctx]; 170 171 /* pass-through to internal scheduling operation */ 172 ctx["_handle"] = this._schedule(ctx); 173 174 /* return context */ 175 return ctx; 176 }, 177 178 /* internal scheduling operation */ 179 _schedule: function (ctx) { 180 /* closure to act as the call trampoline function */ 181 var trampoline = function () { 182 /* jump into function */ 183 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx); 184 (ctx["func"]).apply(obj, ctx["args"]); 185 186 /* either repeat scheduling and keep in bucket or 187 just stop scheduling and delete from scheduler bucket */ 188 if ( /* not cancelled from inside... */ 189 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined" 190 && /* ...and repeating requested */ 191 ctx["repeat"]) 192 (ctx["_scheduler"])._schedule(ctx); 193 else 194 delete (ctx["_scheduler"]).bucket[ctx["id"]]; 195 }; 196 197 /* schedule task and return handle */ 198 return setTimeout(trampoline, ctx["time"]); 199 }, 200 201 /* cancel a scheduled task */ 202 cancel: function (ctx) { 203 if (typeof ctx == "string") 204 ctx = this.bucket[ctx]; 205 206 /* cancel scheduled task */ 207 if (typeof ctx == "object") { 208 clearTimeout(ctx["_handle"]); 209 delete this.bucket[ctx["id"]]; 210 } 211 } 212 }; 213 214 /* integrate a global instance of the scheduler into the global jQuery object */ 215 $.extend({ 216 scheduler$: new $.scheduler(), 217 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) }, 218 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) }, 219 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) } 220 }); 221 222 /* integrate scheduling convinience method into all jQuery objects */ 223 $.fn.extend({ 224 schedule: function () { 225 var a = [ {} ]; 226 for (var i = 0; i < arguments.length; i++) 227 a.push(arguments[i]); 228 return this.each(function () { 229 a[0] = { "id": this, "obj": this }; 230 return $.schedule.apply($, a); 231 }); 232 } 233 }); 234 235 })(jQuery); 236 237 /* 238 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions 239 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 240 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt> 241 ** 242 ** $LastChangedDate$ 243 ** $LastChangedRevision$ 244 */ 245 246 /* 247 * <div id="button">TEST BUTTON</div> 248 * <div id="test"></div> 249 * 250 * <script type="text/javascript"> 251 * $(document).ready( 252 * function(){ 253 * $('#button').click(function () { 254 * $(this).css("color", "blue").schedule(2000, function (x) { 255 * $(this).css("color", "red"); 256 * $("#test").html("test: x = " + x); 257 * }, 42); 258 * }); 259 * }); 260 * </script> 261 */ 262 263 (function($) { 264 265 /* object constructor */ 266 $.scheduler = function () { 267 this.bucket = {}; 268 return; 269 }; 270 271 /* object methods */ 272 $.scheduler.prototype = { 273 /* schedule a task */ 274 schedule: function () { 275 /* schedule context with default parameters */ 276 var ctx = { 277 "id": null, /* unique identifier of high-level schedule */ 278 "time": 1000, /* time in milliseconds after which the task is run */ 279 "repeat": false, /* whether schedule should be automatically repeated */ 280 "protect": false, /* whether schedule should be protected from double scheduling */ 281 "obj": null, /* function context object ("this") */ 282 "func": function(){}, /* function to call */ 283 "args": [] /* function arguments to pass */ 284 }; 285 286 /* helper function: portable checking whether something is a function */ 287 function _isfn (fn) { 288 return ( 289 !!fn 290 && typeof fn != "string" 291 && typeof fn[0] == "undefined" 292 && RegExp("function", "i").test(fn + "") 293 ); 294 }; 295 296 /* parse arguments into context parameters (part 1/4): 297 detect an override object (special case to support jQuery method) */ 298 var i = 0; 299 var override = false; 300 if (typeof arguments[i] == "object" && arguments.length > 1) { 301 override = true; 302 i++; 303 } 304 305 /* parse arguments into context parameters (part 2/4): 306 support the flexible way of an associated array */ 307 if (typeof arguments[i] == "object") { 308 for (var option in arguments[i]) 309 if (typeof ctx[option] != "undefined") 310 ctx[option] = arguments[i][option]; 311 i++; 312 } 313 314 /* parse arguments into context parameters (part 3/4): 315 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */ 316 if ( typeof arguments[i] == "number" 317 || ( typeof arguments[i] == "string" 318 && arguments[i].match(RegExp("^[0-9]+[smhdw]$")))) 319 ctx["time"] = arguments[i++]; 320 if (typeof arguments[i] == "boolean") 321 ctx["repeat"] = arguments[i++]; 322 if (typeof arguments[i] == "boolean") 323 ctx["protect"] = arguments[i++]; 324 if ( typeof arguments[i] == "object" 325 && typeof arguments[i+1] == "string" 326 && _isfn(arguments[i][arguments[i+1]])) { 327 ctx["obj"] = arguments[i++]; 328 ctx["func"] = arguments[i++]; 329 } 330 else if ( typeof arguments[i] != "undefined" 331 && ( _isfn(arguments[i]) 332 || typeof arguments[i] == "string")) 333 ctx["func"] = arguments[i++]; 334 while (typeof arguments[i] != "undefined") 335 ctx["args"].push(arguments[i++]); 336 337 /* parse arguments into context parameters (part 4/4): 338 apply parameters from override object */ 339 if (override) { 340 if (typeof arguments[1] == "object") { 341 for (var option in arguments[0]) 342 if ( typeof ctx[option] != "undefined" 343 && typeof arguments[1][option] == "undefined") 344 ctx[option] = arguments[0][option]; 345 } 346 else { 347 for (var option in arguments[0]) 348 if (typeof ctx[option] != "undefined") 349 ctx[option] = arguments[0][option]; 350 } 351 i++; 352 } 353 354 /* annotate context with internals */ 355 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */ 356 ctx["_handle"] = null; /* internal: unique handle of low-level task */ 357 358 /* determine time value in milliseconds */ 359 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$")); 360 if (match && match[0] != "undefined" && match[1] != "undefined") 361 ctx["time"] = String(parseInt(match[1]) * 362 { s: 1000, m: 1000*60, h: 1000*60*60, 363 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]); 364 365 /* determine unique identifier of task */ 366 if (ctx["id"] == null) 367 ctx["id"] = ( String(ctx["repeat"]) + ":" 368 + String(ctx["protect"]) + ":" 369 + String(ctx["time"]) + ":" 370 + String(ctx["obj"]) + ":" 371 + String(ctx["func"]) + ":" 372 + String(ctx["args"]) ); 373 374 /* optionally protect from duplicate calls */ 375 if (ctx["protect"]) 376 if (typeof this.bucket[ctx["id"]] != "undefined") 377 return this.bucket[ctx["id"]]; 378 379 /* support execution of methods by name and arbitrary scripts */ 380 if (!_isfn(ctx["func"])) { 381 if ( ctx["obj"] != null 382 && typeof ctx["obj"] == "object" 383 && typeof ctx["func"] == "string" 384 && _isfn(ctx["obj"][ctx["func"]])) 385 /* method by name */ 386 ctx["func"] = ctx["obj"][ctx["func"]]; 387 else 388 /* arbitrary script */ 389 ctx["func"] = eval("function () { " + ctx["func"] + " }"); 390 } 391 392 /* pass-through to internal scheduling operation */ 393 ctx["_handle"] = this._schedule(ctx); 394 395 /* store context into bucket of scheduler object */ 396 this.bucket[ctx["id"]] = ctx; 397 398 /* return context */ 399 return ctx; 400 }, 401 402 /* re-schedule a task */ 403 reschedule: function (ctx) { 404 if (typeof ctx == "string") 405 ctx = this.bucket[ctx]; 406 407 /* pass-through to internal scheduling operation */ 408 ctx["_handle"] = this._schedule(ctx); 409 410 /* return context */ 411 return ctx; 412 }, 413 414 /* internal scheduling operation */ 415 _schedule: function (ctx) { 416 /* closure to act as the call trampoline function */ 417 var trampoline = function () { 418 /* jump into function */ 419 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx); 420 (ctx["func"]).apply(obj, ctx["args"]); 421 422 /* either repeat scheduling and keep in bucket or 423 just stop scheduling and delete from scheduler bucket */ 424 if ( /* not cancelled from inside... */ 425 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined" 426 && /* ...and repeating requested */ 427 ctx["repeat"]) 428 (ctx["_scheduler"])._schedule(ctx); 429 else 430 delete (ctx["_scheduler"]).bucket[ctx["id"]]; 431 }; 432 433 /* schedule task and return handle */ 434 return setTimeout(trampoline, ctx["time"]); 435 }, 436 437 /* cancel a scheduled task */ 438 cancel: function (ctx) { 439 if (typeof ctx == "string") 440 ctx = this.bucket[ctx]; 441 442 /* cancel scheduled task */ 443 if (typeof ctx == "object") { 444 clearTimeout(ctx["_handle"]); 445 delete this.bucket[ctx["id"]]; 446 } 447 } 448 }; 449 450 /* integrate a global instance of the scheduler into the global jQuery object */ 451 $.extend({ 452 scheduler$: new $.scheduler(), 453 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) }, 454 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) }, 455 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) } 456 }); 457 458 /* integrate scheduling convinience method into all jQuery objects */ 459 $.fn.extend({ 460 schedule: function () { 461 var a = [ {} ]; 462 for (var i = 0; i < arguments.length; i++) 463 a.push(arguments[i]); 464 return this.each(function () { 465 a[0] = { "id": this, "obj": this }; 466 return $.schedule.apply($, a); 467 }); 468 } 469 }); 470 471 })(jQuery); 472 473 /* 474 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions 475 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 476 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt> 477 ** 478 ** $LastChangedDate$ 479 ** $LastChangedRevision$ 480 */ 481 482 /* 483 * <div id="button">TEST BUTTON</div> 484 * <div id="test"></div> 485 * 486 * <script type="text/javascript"> 487 * $(document).ready( 488 * function(){ 489 * $('#button').click(function () { 490 * $(this).css("color", "blue").schedule(2000, function (x) { 491 * $(this).css("color", "red"); 492 * $("#test").html("test: x = " + x); 493 * }, 42); 494 * }); 495 * }); 496 * </script> 497 */ 498 499 (function($) { 500 501 /* object constructor */ 502 $.scheduler = function () { 503 this.bucket = {}; 504 return; 505 }; 506 507 /* object methods */ 508 $.scheduler.prototype = { 509 /* schedule a task */ 510 schedule: function () { 511 /* schedule context with default parameters */ 512 var ctx = { 513 "id": null, /* unique identifier of high-level schedule */ 514 "time": 1000, /* time in milliseconds after which the task is run */ 515 "repeat": false, /* whether schedule should be automatically repeated */ 516 "protect": false, /* whether schedule should be protected from double scheduling */ 517 "obj": null, /* function context object ("this") */ 518 "func": function(){}, /* function to call */ 519 "args": [] /* function arguments to pass */ 520 }; 521 522 /* helper function: portable checking whether something is a function */ 523 function _isfn (fn) { 524 return ( 525 !!fn 526 && typeof fn != "string" 527 && typeof fn[0] == "undefined" 528 && RegExp("function", "i").test(fn + "") 529 ); 530 }; 531 532 /* parse arguments into context parameters (part 1/4): 533 detect an override object (special case to support jQuery method) */ 534 var i = 0; 535 var override = false; 536 if (typeof arguments[i] == "object" && arguments.length > 1) { 537 override = true; 538 i++; 539 } 540 541 /* parse arguments into context parameters (part 2/4): 542 support the flexible way of an associated array */ 543 if (typeof arguments[i] == "object") { 544 for (var option in arguments[i]) 545 if (typeof ctx[option] != "undefined") 546 ctx[option] = arguments[i][option]; 547 i++; 548 } 549 550 /* parse arguments into context parameters (part 3/4): 551 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */ 552 if ( typeof arguments[i] == "number" 553 || ( typeof arguments[i] == "string" 554 && arguments[i].match(RegExp("^[0-9]+[smhdw]$")))) 555 ctx["time"] = arguments[i++]; 556 if (typeof arguments[i] == "boolean") 557 ctx["repeat"] = arguments[i++]; 558 if (typeof arguments[i] == "boolean") 559 ctx["protect"] = arguments[i++]; 560 if ( typeof arguments[i] == "object" 561 && typeof arguments[i+1] == "string" 562 && _isfn(arguments[i][arguments[i+1]])) { 563 ctx["obj"] = arguments[i++]; 564 ctx["func"] = arguments[i++]; 565 } 566 else if ( typeof arguments[i] != "undefined" 567 && ( _isfn(arguments[i]) 568 || typeof arguments[i] == "string")) 569 ctx["func"] = arguments[i++]; 570 while (typeof arguments[i] != "undefined") 571 ctx["args"].push(arguments[i++]); 572 573 /* parse arguments into context parameters (part 4/4): 574 apply parameters from override object */ 575 if (override) { 576 if (typeof arguments[1] == "object") { 577 for (var option in arguments[0]) 578 if ( typeof ctx[option] != "undefined" 579 && typeof arguments[1][option] == "undefined") 580 ctx[option] = arguments[0][option]; 581 } 582 else { 583 for (var option in arguments[0]) 584 if (typeof ctx[option] != "undefined") 585 ctx[option] = arguments[0][option]; 586 } 587 i++; 588 } 589 590 /* annotate context with internals */ 591 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */ 592 ctx["_handle"] = null; /* internal: unique handle of low-level task */ 593 594 /* determine time value in milliseconds */ 595 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$")); 596 if (match && match[0] != "undefined" && match[1] != "undefined") 597 ctx["time"] = String(parseInt(match[1]) * 598 { s: 1000, m: 1000*60, h: 1000*60*60, 599 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]); 600 601 /* determine unique identifier of task */ 602 if (ctx["id"] == null) 603 ctx["id"] = ( String(ctx["repeat"]) + ":" 604 + String(ctx["protect"]) + ":" 605 + String(ctx["time"]) + ":" 606 + String(ctx["obj"]) + ":" 607 + String(ctx["func"]) + ":" 608 + String(ctx["args"]) ); 609 610 /* optionally protect from duplicate calls */ 611 if (ctx["protect"]) 612 if (typeof this.bucket[ctx["id"]] != "undefined") 613 return this.bucket[ctx["id"]]; 614 615 /* support execution of methods by name and arbitrary scripts */ 616 if (!_isfn(ctx["func"])) { 617 if ( ctx["obj"] != null 618 && typeof ctx["obj"] == "object" 619 && typeof ctx["func"] == "string" 620 && _isfn(ctx["obj"][ctx["func"]])) 621 /* method by name */ 622 ctx["func"] = ctx["obj"][ctx["func"]]; 623 else 624 /* arbitrary script */ 625 ctx["func"] = eval("function () { " + ctx["func"] + " }"); 626 } 627 628 /* pass-through to internal scheduling operation */ 629 ctx["_handle"] = this._schedule(ctx); 630 631 /* store context into bucket of scheduler object */ 632 this.bucket[ctx["id"]] = ctx; 633 634 /* return context */ 635 return ctx; 636 }, 637 638 /* re-schedule a task */ 639 reschedule: function (ctx) { 640 if (typeof ctx == "string") 641 ctx = this.bucket[ctx]; 642 643 /* pass-through to internal scheduling operation */ 644 ctx["_handle"] = this._schedule(ctx); 645 646 /* return context */ 647 return ctx; 648 }, 649 650 /* internal scheduling operation */ 651 _schedule: function (ctx) { 652 /* closure to act as the call trampoline function */ 653 var trampoline = function () { 654 /* jump into function */ 655 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx); 656 (ctx["func"]).apply(obj, ctx["args"]); 657 658 /* either repeat scheduling and keep in bucket or 659 just stop scheduling and delete from scheduler bucket */ 660 if ( /* not cancelled from inside... */ 661 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined" 662 && /* ...and repeating requested */ 663 ctx["repeat"]) 664 (ctx["_scheduler"])._schedule(ctx); 665 else 666 delete (ctx["_scheduler"]).bucket[ctx["id"]]; 667 }; 668 669 /* schedule task and return handle */ 670 return setTimeout(trampoline, ctx["time"]); 671 }, 672 673 /* cancel a scheduled task */ 674 cancel: function (ctx) { 675 if (typeof ctx == "string") 676 ctx = this.bucket[ctx]; 677 678 /* cancel scheduled task */ 679 if (typeof ctx == "object") { 680 clearTimeout(ctx["_handle"]); 681 delete this.bucket[ctx["id"]]; 682 } 683 } 684 }; 685 686 /* integrate a global instance of the scheduler into the global jQuery object */ 687 $.extend({ 688 scheduler$: new $.scheduler(), 689 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) }, 690 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) }, 691 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) } 692 }); 693 694 /* integrate scheduling convinience method into all jQuery objects */ 695 $.fn.extend({ 696 schedule: function () { 697 var a = [ {} ]; 698 for (var i = 0; i < arguments.length; i++) 699 a.push(arguments[i]); 700 return this.each(function () { 701 a[0] = { "id": this, "obj": this }; 702 return $.schedule.apply($, a); 703 }); 704 } 705 }); 706 707 })(jQuery); 7081 /* 2 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions 3 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 4 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt> 5 ** 6 ** $LastChangedDate$ 7 ** $LastChangedRevision$ 8 */ 9 10 /* 11 * <div id="button">TEST BUTTON</div> 12 * <div id="test"></div> 13 * 14 * <script type="text/javascript"> 15 * $(document).ready( 16 * function(){ 17 * $('#button').click(function () { 18 * $(this).css("color", "blue").schedule(2000, function (x) { 19 * $(this).css("color", "red"); 20 * $("#test").html("test: x = " + x); 21 * }, 42); 22 * }); 23 * }); 24 * </script> 25 */ 26 27 (function($) { 28 29 /* object constructor */ 30 $.scheduler = function () { 31 this.bucket = {}; 32 return; 33 }; 34 35 /* object methods */ 36 $.scheduler.prototype = { 37 /* schedule a task */ 38 schedule: function () { 39 /* schedule context with default parameters */ 40 var ctx = { 41 "id": null, /* unique identifier of high-level schedule */ 42 "time": 1000, /* time in milliseconds after which the task is run */ 43 "repeat": false, /* whether schedule should be automatically repeated */ 44 "protect": false, /* whether schedule should be protected from double scheduling */ 45 "obj": null, /* function context object ("this") */ 46 "func": function(){}, /* function to call */ 47 "args": [] /* function arguments to pass */ 48 }; 49 50 /* helper function: portable checking whether something is a function */ 51 function _isfn (fn) { 52 return ( 53 !!fn 54 && typeof fn != "string" 55 && typeof fn[0] == "undefined" 56 && RegExp("function", "i").test(fn + "") 57 ); 58 }; 59 60 /* parse arguments into context parameters (part 1/4): 61 detect an override object (special case to support jQuery method) */ 62 var i = 0; 63 var override = false; 64 if (typeof arguments[i] == "object" && arguments.length > 1) { 65 override = true; 66 i++; 67 } 68 69 /* parse arguments into context parameters (part 2/4): 70 support the flexible way of an associated array */ 71 if (typeof arguments[i] == "object") { 72 for (var option in arguments[i]) 73 if (typeof ctx[option] != "undefined") 74 ctx[option] = arguments[i][option]; 75 i++; 76 } 77 78 /* parse arguments into context parameters (part 3/4): 79 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */ 80 if ( typeof arguments[i] == "number" 81 || ( typeof arguments[i] == "string" 82 && arguments[i].match(RegExp("^[0-9]+[smhdw]$")))) 83 ctx["time"] = arguments[i++]; 84 if (typeof arguments[i] == "boolean") 85 ctx["repeat"] = arguments[i++]; 86 if (typeof arguments[i] == "boolean") 87 ctx["protect"] = arguments[i++]; 88 if ( typeof arguments[i] == "object" 89 && typeof arguments[i+1] == "string" 90 && _isfn(arguments[i][arguments[i+1]])) { 91 ctx["obj"] = arguments[i++]; 92 ctx["func"] = arguments[i++]; 93 } 94 else if ( typeof arguments[i] != "undefined" 95 && ( _isfn(arguments[i]) 96 || typeof arguments[i] == "string")) 97 ctx["func"] = arguments[i++]; 98 while (typeof arguments[i] != "undefined") 99 ctx["args"].push(arguments[i++]); 100 101 /* parse arguments into context parameters (part 4/4): 102 apply parameters from override object */ 103 if (override) { 104 if (typeof arguments[1] == "object") { 105 for (var option in arguments[0]) 106 if ( typeof ctx[option] != "undefined" 107 && typeof arguments[1][option] == "undefined") 108 ctx[option] = arguments[0][option]; 109 } 110 else { 111 for (var option in arguments[0]) 112 if (typeof ctx[option] != "undefined") 113 ctx[option] = arguments[0][option]; 114 } 115 i++; 116 } 117 118 /* annotate context with internals */ 119 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */ 120 ctx["_handle"] = null; /* internal: unique handle of low-level task */ 121 122 /* determine time value in milliseconds */ 123 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$")); 124 if (match && match[0] != "undefined" && match[1] != "undefined") 125 ctx["time"] = String(parseInt(match[1]) * 126 { s: 1000, m: 1000*60, h: 1000*60*60, 127 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]); 128 129 /* determine unique identifier of task */ 130 if (ctx["id"] == null) 131 ctx["id"] = ( String(ctx["repeat"]) + ":" 132 + String(ctx["protect"]) + ":" 133 + String(ctx["time"]) + ":" 134 + String(ctx["obj"]) + ":" 135 + String(ctx["func"]) + ":" 136 + String(ctx["args"]) ); 137 138 /* optionally protect from duplicate calls */ 139 if (ctx["protect"]) 140 if (typeof this.bucket[ctx["id"]] != "undefined") 141 return this.bucket[ctx["id"]]; 142 143 /* support execution of methods by name and arbitrary scripts */ 144 if (!_isfn(ctx["func"])) { 145 if ( ctx["obj"] != null 146 && typeof ctx["obj"] == "object" 147 && typeof ctx["func"] == "string" 148 && _isfn(ctx["obj"][ctx["func"]])) 149 /* method by name */ 150 ctx["func"] = ctx["obj"][ctx["func"]]; 151 else 152 /* arbitrary script */ 153 ctx["func"] = eval("function () { " + ctx["func"] + " }"); 154 } 155 156 /* pass-through to internal scheduling operation */ 157 ctx["_handle"] = this._schedule(ctx); 158 159 /* store context into bucket of scheduler object */ 160 this.bucket[ctx["id"]] = ctx; 161 162 /* return context */ 163 return ctx; 164 }, 165 166 /* re-schedule a task */ 167 reschedule: function (ctx) { 168 if (typeof ctx == "string") 169 ctx = this.bucket[ctx]; 170 171 /* pass-through to internal scheduling operation */ 172 ctx["_handle"] = this._schedule(ctx); 173 174 /* return context */ 175 return ctx; 176 }, 177 178 /* internal scheduling operation */ 179 _schedule: function (ctx) { 180 /* closure to act as the call trampoline function */ 181 var trampoline = function () { 182 /* jump into function */ 183 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx); 184 (ctx["func"]).apply(obj, ctx["args"]); 185 186 /* either repeat scheduling and keep in bucket or 187 just stop scheduling and delete from scheduler bucket */ 188 if ( /* not cancelled from inside... */ 189 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined" 190 && /* ...and repeating requested */ 191 ctx["repeat"]) 192 (ctx["_scheduler"])._schedule(ctx); 193 else 194 delete (ctx["_scheduler"]).bucket[ctx["id"]]; 195 }; 196 197 /* schedule task and return handle */ 198 return setTimeout(trampoline, ctx["time"]); 199 }, 200 201 /* cancel a scheduled task */ 202 cancel: function (ctx) { 203 if (typeof ctx == "string") 204 ctx = this.bucket[ctx]; 205 206 /* cancel scheduled task */ 207 if (typeof ctx == "object") { 208 clearTimeout(ctx["_handle"]); 209 delete this.bucket[ctx["id"]]; 210 } 211 } 212 }; 213 214 /* integrate a global instance of the scheduler into the global jQuery object */ 215 $.extend({ 216 scheduler$: new $.scheduler(), 217 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) }, 218 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) }, 219 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) } 220 }); 221 222 /* integrate scheduling convinience method into all jQuery objects */ 223 $.fn.extend({ 224 schedule: function () { 225 var a = [ {} ]; 226 for (var i = 0; i < arguments.length; i++) 227 a.push(arguments[i]); 228 return this.each(function () { 229 a[0] = { "id": this, "obj": this }; 230 return $.schedule.apply($, a); 231 }); 232 } 233 }); 234 235 })(jQuery); 236 237 /* 238 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions 239 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 240 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt> 241 ** 242 ** $LastChangedDate$ 243 ** $LastChangedRevision$ 244 */ 245 246 /* 247 * <div id="button">TEST BUTTON</div> 248 * <div id="test"></div> 249 * 250 * <script type="text/javascript"> 251 * $(document).ready( 252 * function(){ 253 * $('#button').click(function () { 254 * $(this).css("color", "blue").schedule(2000, function (x) { 255 * $(this).css("color", "red"); 256 * $("#test").html("test: x = " + x); 257 * }, 42); 258 * }); 259 * }); 260 * </script> 261 */ 262 263 (function($) { 264 265 /* object constructor */ 266 $.scheduler = function () { 267 this.bucket = {}; 268 return; 269 }; 270 271 /* object methods */ 272 $.scheduler.prototype = { 273 /* schedule a task */ 274 schedule: function () { 275 /* schedule context with default parameters */ 276 var ctx = { 277 "id": null, /* unique identifier of high-level schedule */ 278 "time": 1000, /* time in milliseconds after which the task is run */ 279 "repeat": false, /* whether schedule should be automatically repeated */ 280 "protect": false, /* whether schedule should be protected from double scheduling */ 281 "obj": null, /* function context object ("this") */ 282 "func": function(){}, /* function to call */ 283 "args": [] /* function arguments to pass */ 284 }; 285 286 /* helper function: portable checking whether something is a function */ 287 function _isfn (fn) { 288 return ( 289 !!fn 290 && typeof fn != "string" 291 && typeof fn[0] == "undefined" 292 && RegExp("function", "i").test(fn + "") 293 ); 294 }; 295 296 /* parse arguments into context parameters (part 1/4): 297 detect an override object (special case to support jQuery method) */ 298 var i = 0; 299 var override = false; 300 if (typeof arguments[i] == "object" && arguments.length > 1) { 301 override = true; 302 i++; 303 } 304 305 /* parse arguments into context parameters (part 2/4): 306 support the flexible way of an associated array */ 307 if (typeof arguments[i] == "object") { 308 for (var option in arguments[i]) 309 if (typeof ctx[option] != "undefined") 310 ctx[option] = arguments[i][option]; 311 i++; 312 } 313 314 /* parse arguments into context parameters (part 3/4): 315 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */ 316 if ( typeof arguments[i] == "number" 317 || ( typeof arguments[i] == "string" 318 && arguments[i].match(RegExp("^[0-9]+[smhdw]$")))) 319 ctx["time"] = arguments[i++]; 320 if (typeof arguments[i] == "boolean") 321 ctx["repeat"] = arguments[i++]; 322 if (typeof arguments[i] == "boolean") 323 ctx["protect"] = arguments[i++]; 324 if ( typeof arguments[i] == "object" 325 && typeof arguments[i+1] == "string" 326 && _isfn(arguments[i][arguments[i+1]])) { 327 ctx["obj"] = arguments[i++]; 328 ctx["func"] = arguments[i++]; 329 } 330 else if ( typeof arguments[i] != "undefined" 331 && ( _isfn(arguments[i]) 332 || typeof arguments[i] == "string")) 333 ctx["func"] = arguments[i++]; 334 while (typeof arguments[i] != "undefined") 335 ctx["args"].push(arguments[i++]); 336 337 /* parse arguments into context parameters (part 4/4): 338 apply parameters from override object */ 339 if (override) { 340 if (typeof arguments[1] == "object") { 341 for (var option in arguments[0]) 342 if ( typeof ctx[option] != "undefined" 343 && typeof arguments[1][option] == "undefined") 344 ctx[option] = arguments[0][option]; 345 } 346 else { 347 for (var option in arguments[0]) 348 if (typeof ctx[option] != "undefined") 349 ctx[option] = arguments[0][option]; 350 } 351 i++; 352 } 353 354 /* annotate context with internals */ 355 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */ 356 ctx["_handle"] = null; /* internal: unique handle of low-level task */ 357 358 /* determine time value in milliseconds */ 359 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$")); 360 if (match && match[0] != "undefined" && match[1] != "undefined") 361 ctx["time"] = String(parseInt(match[1]) * 362 { s: 1000, m: 1000*60, h: 1000*60*60, 363 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]); 364 365 /* determine unique identifier of task */ 366 if (ctx["id"] == null) 367 ctx["id"] = ( String(ctx["repeat"]) + ":" 368 + String(ctx["protect"]) + ":" 369 + String(ctx["time"]) + ":" 370 + String(ctx["obj"]) + ":" 371 + String(ctx["func"]) + ":" 372 + String(ctx["args"]) ); 373 374 /* optionally protect from duplicate calls */ 375 if (ctx["protect"]) 376 if (typeof this.bucket[ctx["id"]] != "undefined") 377 return this.bucket[ctx["id"]]; 378 379 /* support execution of methods by name and arbitrary scripts */ 380 if (!_isfn(ctx["func"])) { 381 if ( ctx["obj"] != null 382 && typeof ctx["obj"] == "object" 383 && typeof ctx["func"] == "string" 384 && _isfn(ctx["obj"][ctx["func"]])) 385 /* method by name */ 386 ctx["func"] = ctx["obj"][ctx["func"]]; 387 else 388 /* arbitrary script */ 389 ctx["func"] = eval("function () { " + ctx["func"] + " }"); 390 } 391 392 /* pass-through to internal scheduling operation */ 393 ctx["_handle"] = this._schedule(ctx); 394 395 /* store context into bucket of scheduler object */ 396 this.bucket[ctx["id"]] = ctx; 397 398 /* return context */ 399 return ctx; 400 }, 401 402 /* re-schedule a task */ 403 reschedule: function (ctx) { 404 if (typeof ctx == "string") 405 ctx = this.bucket[ctx]; 406 407 /* pass-through to internal scheduling operation */ 408 ctx["_handle"] = this._schedule(ctx); 409 410 /* return context */ 411 return ctx; 412 }, 413 414 /* internal scheduling operation */ 415 _schedule: function (ctx) { 416 /* closure to act as the call trampoline function */ 417 var trampoline = function () { 418 /* jump into function */ 419 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx); 420 (ctx["func"]).apply(obj, ctx["args"]); 421 422 /* either repeat scheduling and keep in bucket or 423 just stop scheduling and delete from scheduler bucket */ 424 if ( /* not cancelled from inside... */ 425 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined" 426 && /* ...and repeating requested */ 427 ctx["repeat"]) 428 (ctx["_scheduler"])._schedule(ctx); 429 else 430 delete (ctx["_scheduler"]).bucket[ctx["id"]]; 431 }; 432 433 /* schedule task and return handle */ 434 return setTimeout(trampoline, ctx["time"]); 435 }, 436 437 /* cancel a scheduled task */ 438 cancel: function (ctx) { 439 if (typeof ctx == "string") 440 ctx = this.bucket[ctx]; 441 442 /* cancel scheduled task */ 443 if (typeof ctx == "object") { 444 clearTimeout(ctx["_handle"]); 445 delete this.bucket[ctx["id"]]; 446 } 447 } 448 }; 449 450 /* integrate a global instance of the scheduler into the global jQuery object */ 451 $.extend({ 452 scheduler$: new $.scheduler(), 453 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) }, 454 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) }, 455 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) } 456 }); 457 458 /* integrate scheduling convinience method into all jQuery objects */ 459 $.fn.extend({ 460 schedule: function () { 461 var a = [ {} ]; 462 for (var i = 0; i < arguments.length; i++) 463 a.push(arguments[i]); 464 return this.each(function () { 465 a[0] = { "id": this, "obj": this }; 466 return $.schedule.apply($, a); 467 }); 468 } 469 }); 470 471 })(jQuery); 472 473 /* 474 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions 475 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 476 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt> 477 ** 478 ** $LastChangedDate$ 479 ** $LastChangedRevision$ 480 */ 481 482 /* 483 * <div id="button">TEST BUTTON</div> 484 * <div id="test"></div> 485 * 486 * <script type="text/javascript"> 487 * $(document).ready( 488 * function(){ 489 * $('#button').click(function () { 490 * $(this).css("color", "blue").schedule(2000, function (x) { 491 * $(this).css("color", "red"); 492 * $("#test").html("test: x = " + x); 493 * }, 42); 494 * }); 495 * }); 496 * </script> 497 */ 498 499 (function($) { 500 501 /* object constructor */ 502 $.scheduler = function () { 503 this.bucket = {}; 504 return; 505 }; 506 507 /* object methods */ 508 $.scheduler.prototype = { 509 /* schedule a task */ 510 schedule: function () { 511 /* schedule context with default parameters */ 512 var ctx = { 513 "id": null, /* unique identifier of high-level schedule */ 514 "time": 1000, /* time in milliseconds after which the task is run */ 515 "repeat": false, /* whether schedule should be automatically repeated */ 516 "protect": false, /* whether schedule should be protected from double scheduling */ 517 "obj": null, /* function context object ("this") */ 518 "func": function(){}, /* function to call */ 519 "args": [] /* function arguments to pass */ 520 }; 521 522 /* helper function: portable checking whether something is a function */ 523 function _isfn (fn) { 524 return ( 525 !!fn 526 && typeof fn != "string" 527 && typeof fn[0] == "undefined" 528 && RegExp("function", "i").test(fn + "") 529 ); 530 }; 531 532 /* parse arguments into context parameters (part 1/4): 533 detect an override object (special case to support jQuery method) */ 534 var i = 0; 535 var override = false; 536 if (typeof arguments[i] == "object" && arguments.length > 1) { 537 override = true; 538 i++; 539 } 540 541 /* parse arguments into context parameters (part 2/4): 542 support the flexible way of an associated array */ 543 if (typeof arguments[i] == "object") { 544 for (var option in arguments[i]) 545 if (typeof ctx[option] != "undefined") 546 ctx[option] = arguments[i][option]; 547 i++; 548 } 549 550 /* parse arguments into context parameters (part 3/4): 551 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */ 552 if ( typeof arguments[i] == "number" 553 || ( typeof arguments[i] == "string" 554 && arguments[i].match(RegExp("^[0-9]+[smhdw]$")))) 555 ctx["time"] = arguments[i++]; 556 if (typeof arguments[i] == "boolean") 557 ctx["repeat"] = arguments[i++]; 558 if (typeof arguments[i] == "boolean") 559 ctx["protect"] = arguments[i++]; 560 if ( typeof arguments[i] == "object" 561 && typeof arguments[i+1] == "string" 562 && _isfn(arguments[i][arguments[i+1]])) { 563 ctx["obj"] = arguments[i++]; 564 ctx["func"] = arguments[i++]; 565 } 566 else if ( typeof arguments[i] != "undefined" 567 && ( _isfn(arguments[i]) 568 || typeof arguments[i] == "string")) 569 ctx["func"] = arguments[i++]; 570 while (typeof arguments[i] != "undefined") 571 ctx["args"].push(arguments[i++]); 572 573 /* parse arguments into context parameters (part 4/4): 574 apply parameters from override object */ 575 if (override) { 576 if (typeof arguments[1] == "object") { 577 for (var option in arguments[0]) 578 if ( typeof ctx[option] != "undefined" 579 && typeof arguments[1][option] == "undefined") 580 ctx[option] = arguments[0][option]; 581 } 582 else { 583 for (var option in arguments[0]) 584 if (typeof ctx[option] != "undefined") 585 ctx[option] = arguments[0][option]; 586 } 587 i++; 588 } 589 590 /* annotate context with internals */ 591 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */ 592 ctx["_handle"] = null; /* internal: unique handle of low-level task */ 593 594 /* determine time value in milliseconds */ 595 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$")); 596 if (match && match[0] != "undefined" && match[1] != "undefined") 597 ctx["time"] = String(parseInt(match[1]) * 598 { s: 1000, m: 1000*60, h: 1000*60*60, 599 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]); 600 601 /* determine unique identifier of task */ 602 if (ctx["id"] == null) 603 ctx["id"] = ( String(ctx["repeat"]) + ":" 604 + String(ctx["protect"]) + ":" 605 + String(ctx["time"]) + ":" 606 + String(ctx["obj"]) + ":" 607 + String(ctx["func"]) + ":" 608 + String(ctx["args"]) ); 609 610 /* optionally protect from duplicate calls */ 611 if (ctx["protect"]) 612 if (typeof this.bucket[ctx["id"]] != "undefined") 613 return this.bucket[ctx["id"]]; 614 615 /* support execution of methods by name and arbitrary scripts */ 616 if (!_isfn(ctx["func"])) { 617 if ( ctx["obj"] != null 618 && typeof ctx["obj"] == "object" 619 && typeof ctx["func"] == "string" 620 && _isfn(ctx["obj"][ctx["func"]])) 621 /* method by name */ 622 ctx["func"] = ctx["obj"][ctx["func"]]; 623 else 624 /* arbitrary script */ 625 ctx["func"] = eval("function () { " + ctx["func"] + " }"); 626 } 627 628 /* pass-through to internal scheduling operation */ 629 ctx["_handle"] = this._schedule(ctx); 630 631 /* store context into bucket of scheduler object */ 632 this.bucket[ctx["id"]] = ctx; 633 634 /* return context */ 635 return ctx; 636 }, 637 638 /* re-schedule a task */ 639 reschedule: function (ctx) { 640 if (typeof ctx == "string") 641 ctx = this.bucket[ctx]; 642 643 /* pass-through to internal scheduling operation */ 644 ctx["_handle"] = this._schedule(ctx); 645 646 /* return context */ 647 return ctx; 648 }, 649 650 /* internal scheduling operation */ 651 _schedule: function (ctx) { 652 /* closure to act as the call trampoline function */ 653 var trampoline = function () { 654 /* jump into function */ 655 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx); 656 (ctx["func"]).apply(obj, ctx["args"]); 657 658 /* either repeat scheduling and keep in bucket or 659 just stop scheduling and delete from scheduler bucket */ 660 if ( /* not cancelled from inside... */ 661 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined" 662 && /* ...and repeating requested */ 663 ctx["repeat"]) 664 (ctx["_scheduler"])._schedule(ctx); 665 else 666 delete (ctx["_scheduler"]).bucket[ctx["id"]]; 667 }; 668 669 /* schedule task and return handle */ 670 return setTimeout(trampoline, ctx["time"]); 671 }, 672 673 /* cancel a scheduled task */ 674 cancel: function (ctx) { 675 if (typeof ctx == "string") 676 ctx = this.bucket[ctx]; 677 678 /* cancel scheduled task */ 679 if (typeof ctx == "object") { 680 clearTimeout(ctx["_handle"]); 681 delete this.bucket[ctx["id"]]; 682 } 683 } 684 }; 685 686 /* integrate a global instance of the scheduler into the global jQuery object */ 687 $.extend({ 688 scheduler$: new $.scheduler(), 689 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) }, 690 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) }, 691 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) } 692 }); 693 694 /* integrate scheduling convinience method into all jQuery objects */ 695 $.fn.extend({ 696 schedule: function () { 697 var a = [ {} ]; 698 for (var i = 0; i < arguments.length; i++) 699 a.push(arguments[i]); 700 return this.each(function () { 701 a[0] = { "id": this, "obj": this }; 702 return $.schedule.apply($, a); 703 }); 704 } 705 }); 706 707 })(jQuery); 708
联系我们 |
---|
文章看不懂?联系我们为您免费解答!免费助力个人,小企站点! |
① 电话:020-2206-9892 |
② QQ咨询:1025174874 |
③ 邮件:info@361sale.com |
④ 工作时间:周一至周五,9:30-18:30,节假日休息 |
THE END
暂无评论内容