Eliminate duplication in and minify jquery.schedule.js. fixes #5620
git-svn-id: http://svn.automattic.com/wordpress/trunk@6590 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
ce884496e1
commit
1f71b9227d
|
@ -1,708 +1,36 @@
|
||||||
/*
|
|
||||||
** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions
|
|
||||||
** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com>
|
|
||||||
** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
|
|
||||||
**
|
|
||||||
** $LastChangedDate$
|
|
||||||
** $LastChangedRevision$
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* <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>
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function($) {
|
|
||||||
|
|
||||||
/* object constructor */
|
|
||||||
$.scheduler = function () {
|
|
||||||
this.bucket = {};
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* object methods */
|
|
||||||
$.scheduler.prototype = {
|
|
||||||
/* schedule a task */
|
|
||||||
schedule: function () {
|
|
||||||
/* schedule context with default parameters */
|
|
||||||
var ctx = {
|
|
||||||
"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: portable checking whether something is a function */
|
|
||||||
function _isfn (fn) {
|
|
||||||
return (
|
|
||||||
!!fn
|
|
||||||
&& typeof fn != "string"
|
|
||||||
&& typeof fn[0] == "undefined"
|
|
||||||
&& RegExp("function", "i").test(fn + "")
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* parse arguments into context parameters (part 1/4):
|
|
||||||
detect an override object (special case to support jQuery method) */
|
|
||||||
var i = 0;
|
|
||||||
var override = false;
|
|
||||||
if (typeof arguments[i] == "object" && arguments.length > 1) {
|
|
||||||
override = true;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parse arguments into context parameters (part 2/4):
|
|
||||||
support the flexible way of an associated array */
|
|
||||||
if (typeof arguments[i] == "object") {
|
|
||||||
for (var option in arguments[i])
|
|
||||||
if (typeof ctx[option] != "undefined")
|
|
||||||
ctx[option] = arguments[i][option];
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parse arguments into context parameters (part 3/4):
|
|
||||||
support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */
|
|
||||||
if ( typeof arguments[i] == "number"
|
|
||||||
|| ( typeof arguments[i] == "string"
|
|
||||||
&& arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))
|
|
||||||
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"
|
|
||||||
&& ( _isfn(arguments[i])
|
|
||||||
|| typeof arguments[i] == "string"))
|
|
||||||
ctx["func"] = arguments[i++];
|
|
||||||
while (typeof arguments[i] != "undefined")
|
|
||||||
ctx["args"].push(arguments[i++]);
|
|
||||||
|
|
||||||
/* parse arguments into context parameters (part 4/4):
|
|
||||||
apply parameters from override object */
|
|
||||||
if (override) {
|
|
||||||
if (typeof arguments[1] == "object") {
|
|
||||||
for (var option in arguments[0])
|
|
||||||
if ( typeof ctx[option] != "undefined"
|
|
||||||
&& typeof arguments[1][option] == "undefined")
|
|
||||||
ctx[option] = arguments[0][option];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (var option in arguments[0])
|
|
||||||
if (typeof ctx[option] != "undefined")
|
|
||||||
ctx[option] = arguments[0][option];
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* annotate context with internals */
|
|
||||||
ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */
|
|
||||||
ctx["_handle"] = null; /* internal: unique handle of low-level task */
|
|
||||||
|
|
||||||
/* determine time value in milliseconds */
|
|
||||||
var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));
|
|
||||||
if (match && match[0] != "undefined" && match[1] != "undefined")
|
|
||||||
ctx["time"] = String(parseInt(match[1]) *
|
|
||||||
{ s: 1000, m: 1000*60, h: 1000*60*60,
|
|
||||||
d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);
|
|
||||||
|
|
||||||
/* 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 */
|
|
||||||
$.extend({
|
|
||||||
scheduler$: new $.scheduler(),
|
|
||||||
schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) },
|
|
||||||
reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },
|
|
||||||
cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) }
|
|
||||||
});
|
|
||||||
|
|
||||||
/* integrate scheduling convinience method into all jQuery objects */
|
|
||||||
$.fn.extend({
|
|
||||||
schedule: function () {
|
|
||||||
var a = [ {} ];
|
|
||||||
for (var i = 0; i < arguments.length; i++)
|
|
||||||
a.push(arguments[i]);
|
|
||||||
return this.each(function () {
|
|
||||||
a[0] = { "id": this, "obj": this };
|
|
||||||
return $.schedule.apply($, a);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
})(jQuery);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions
|
|
||||||
** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com>
|
|
||||||
** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
|
|
||||||
**
|
|
||||||
** $LastChangedDate$
|
|
||||||
** $LastChangedRevision$
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* <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>
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function($) {
|
|
||||||
|
|
||||||
/* object constructor */
|
|
||||||
$.scheduler = function () {
|
|
||||||
this.bucket = {};
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* object methods */
|
|
||||||
$.scheduler.prototype = {
|
|
||||||
/* schedule a task */
|
|
||||||
schedule: function () {
|
|
||||||
/* schedule context with default parameters */
|
|
||||||
var ctx = {
|
|
||||||
"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: portable checking whether something is a function */
|
|
||||||
function _isfn (fn) {
|
|
||||||
return (
|
|
||||||
!!fn
|
|
||||||
&& typeof fn != "string"
|
|
||||||
&& typeof fn[0] == "undefined"
|
|
||||||
&& RegExp("function", "i").test(fn + "")
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* parse arguments into context parameters (part 1/4):
|
|
||||||
detect an override object (special case to support jQuery method) */
|
|
||||||
var i = 0;
|
|
||||||
var override = false;
|
|
||||||
if (typeof arguments[i] == "object" && arguments.length > 1) {
|
|
||||||
override = true;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parse arguments into context parameters (part 2/4):
|
|
||||||
support the flexible way of an associated array */
|
|
||||||
if (typeof arguments[i] == "object") {
|
|
||||||
for (var option in arguments[i])
|
|
||||||
if (typeof ctx[option] != "undefined")
|
|
||||||
ctx[option] = arguments[i][option];
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parse arguments into context parameters (part 3/4):
|
|
||||||
support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */
|
|
||||||
if ( typeof arguments[i] == "number"
|
|
||||||
|| ( typeof arguments[i] == "string"
|
|
||||||
&& arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))
|
|
||||||
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"
|
|
||||||
&& ( _isfn(arguments[i])
|
|
||||||
|| typeof arguments[i] == "string"))
|
|
||||||
ctx["func"] = arguments[i++];
|
|
||||||
while (typeof arguments[i] != "undefined")
|
|
||||||
ctx["args"].push(arguments[i++]);
|
|
||||||
|
|
||||||
/* parse arguments into context parameters (part 4/4):
|
|
||||||
apply parameters from override object */
|
|
||||||
if (override) {
|
|
||||||
if (typeof arguments[1] == "object") {
|
|
||||||
for (var option in arguments[0])
|
|
||||||
if ( typeof ctx[option] != "undefined"
|
|
||||||
&& typeof arguments[1][option] == "undefined")
|
|
||||||
ctx[option] = arguments[0][option];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (var option in arguments[0])
|
|
||||||
if (typeof ctx[option] != "undefined")
|
|
||||||
ctx[option] = arguments[0][option];
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* annotate context with internals */
|
|
||||||
ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */
|
|
||||||
ctx["_handle"] = null; /* internal: unique handle of low-level task */
|
|
||||||
|
|
||||||
/* determine time value in milliseconds */
|
|
||||||
var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));
|
|
||||||
if (match && match[0] != "undefined" && match[1] != "undefined")
|
|
||||||
ctx["time"] = String(parseInt(match[1]) *
|
|
||||||
{ s: 1000, m: 1000*60, h: 1000*60*60,
|
|
||||||
d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);
|
|
||||||
|
|
||||||
/* 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 */
|
|
||||||
$.extend({
|
|
||||||
scheduler$: new $.scheduler(),
|
|
||||||
schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) },
|
|
||||||
reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },
|
|
||||||
cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) }
|
|
||||||
});
|
|
||||||
|
|
||||||
/* integrate scheduling convinience method into all jQuery objects */
|
|
||||||
$.fn.extend({
|
|
||||||
schedule: function () {
|
|
||||||
var a = [ {} ];
|
|
||||||
for (var i = 0; i < arguments.length; i++)
|
|
||||||
a.push(arguments[i]);
|
|
||||||
return this.each(function () {
|
|
||||||
a[0] = { "id": this, "obj": this };
|
|
||||||
return $.schedule.apply($, a);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
})(jQuery);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions
|
|
||||||
** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com>
|
|
||||||
** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
|
|
||||||
**
|
|
||||||
** $LastChangedDate$
|
|
||||||
** $LastChangedRevision$
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* <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>
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function($) {
|
|
||||||
|
|
||||||
/* object constructor */
|
|
||||||
$.scheduler = function () {
|
|
||||||
this.bucket = {};
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* object methods */
|
|
||||||
$.scheduler.prototype = {
|
|
||||||
/* schedule a task */
|
|
||||||
schedule: function () {
|
|
||||||
/* schedule context with default parameters */
|
|
||||||
var ctx = {
|
|
||||||
"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: portable checking whether something is a function */
|
|
||||||
function _isfn (fn) {
|
|
||||||
return (
|
|
||||||
!!fn
|
|
||||||
&& typeof fn != "string"
|
|
||||||
&& typeof fn[0] == "undefined"
|
|
||||||
&& RegExp("function", "i").test(fn + "")
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* parse arguments into context parameters (part 1/4):
|
|
||||||
detect an override object (special case to support jQuery method) */
|
|
||||||
var i = 0;
|
|
||||||
var override = false;
|
|
||||||
if (typeof arguments[i] == "object" && arguments.length > 1) {
|
|
||||||
override = true;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parse arguments into context parameters (part 2/4):
|
|
||||||
support the flexible way of an associated array */
|
|
||||||
if (typeof arguments[i] == "object") {
|
|
||||||
for (var option in arguments[i])
|
|
||||||
if (typeof ctx[option] != "undefined")
|
|
||||||
ctx[option] = arguments[i][option];
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parse arguments into context parameters (part 3/4):
|
|
||||||
support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */
|
|
||||||
if ( typeof arguments[i] == "number"
|
|
||||||
|| ( typeof arguments[i] == "string"
|
|
||||||
&& arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))
|
|
||||||
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"
|
|
||||||
&& ( _isfn(arguments[i])
|
|
||||||
|| typeof arguments[i] == "string"))
|
|
||||||
ctx["func"] = arguments[i++];
|
|
||||||
while (typeof arguments[i] != "undefined")
|
|
||||||
ctx["args"].push(arguments[i++]);
|
|
||||||
|
|
||||||
/* parse arguments into context parameters (part 4/4):
|
|
||||||
apply parameters from override object */
|
|
||||||
if (override) {
|
|
||||||
if (typeof arguments[1] == "object") {
|
|
||||||
for (var option in arguments[0])
|
|
||||||
if ( typeof ctx[option] != "undefined"
|
|
||||||
&& typeof arguments[1][option] == "undefined")
|
|
||||||
ctx[option] = arguments[0][option];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (var option in arguments[0])
|
|
||||||
if (typeof ctx[option] != "undefined")
|
|
||||||
ctx[option] = arguments[0][option];
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* annotate context with internals */
|
|
||||||
ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */
|
|
||||||
ctx["_handle"] = null; /* internal: unique handle of low-level task */
|
|
||||||
|
|
||||||
/* determine time value in milliseconds */
|
|
||||||
var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));
|
|
||||||
if (match && match[0] != "undefined" && match[1] != "undefined")
|
|
||||||
ctx["time"] = String(parseInt(match[1]) *
|
|
||||||
{ s: 1000, m: 1000*60, h: 1000*60*60,
|
|
||||||
d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);
|
|
||||||
|
|
||||||
/* 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 */
|
|
||||||
$.extend({
|
|
||||||
scheduler$: new $.scheduler(),
|
|
||||||
schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) },
|
|
||||||
reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },
|
|
||||||
cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) }
|
|
||||||
});
|
|
||||||
|
|
||||||
/* integrate scheduling convinience method into all jQuery objects */
|
|
||||||
$.fn.extend({
|
|
||||||
schedule: function () {
|
|
||||||
var a = [ {} ];
|
|
||||||
for (var i = 0; i < arguments.length; i++)
|
|
||||||
a.push(arguments[i]);
|
|
||||||
return this.each(function () {
|
|
||||||
a[0] = { "id": this, "obj": this };
|
|
||||||
return $.schedule.apply($, a);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
})(jQuery);
|
|
||||||
|
|
||||||
|
(function($){$.scheduler=function(){this.bucket={};return;};$.scheduler.prototype={schedule:function(){var ctx={"id":null,"time":1000,"repeat":false,"protect":false,"obj":null,"func":function(){},"args":[]};function _isfn(fn){return(!!fn&&typeof fn!="string"&&typeof fn[0]=="undefined"&&RegExp("function","i").test(fn+""));};var i=0;var override=false;if(typeof arguments[i]=="object"&&arguments.length>1){override=true;i++;}
|
||||||
|
if(typeof arguments[i]=="object"){for(var option in arguments[i])
|
||||||
|
if(typeof ctx[option]!="undefined")
|
||||||
|
ctx[option]=arguments[i][option];i++;}
|
||||||
|
if(typeof arguments[i]=="number"||(typeof arguments[i]=="string"&&arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))
|
||||||
|
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"&&(_isfn(arguments[i])||typeof arguments[i]=="string"))
|
||||||
|
ctx["func"]=arguments[i++];while(typeof arguments[i]!="undefined")
|
||||||
|
ctx["args"].push(arguments[i++]);if(override){if(typeof arguments[1]=="object"){for(var option in arguments[0])
|
||||||
|
if(typeof ctx[option]!="undefined"&&typeof arguments[1][option]=="undefined")
|
||||||
|
ctx[option]=arguments[0][option];}
|
||||||
|
else{for(var option in arguments[0])
|
||||||
|
if(typeof ctx[option]!="undefined")
|
||||||
|
ctx[option]=arguments[0][option];}
|
||||||
|
i++;}
|
||||||
|
ctx["_scheduler"]=this;ctx["_handle"]=null;var match=String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));if(match&&match[0]!="undefined"&&match[1]!="undefined")
|
||||||
|
ctx["time"]=String(parseInt(match[1])*{s:1000,m:1000*60,h:1000*60*60,d:1000*60*60*24,w:1000*60*60*24*7}[match[2]]);if(ctx["id"]==null)
|
||||||
|
ctx["id"]=(String(ctx["repeat"])+":"
|
||||||
|
+String(ctx["protect"])+":"
|
||||||
|
+String(ctx["time"])+":"
|
||||||
|
+String(ctx["obj"])+":"
|
||||||
|
+String(ctx["func"])+":"
|
||||||
|
+String(ctx["args"]));if(ctx["protect"])
|
||||||
|
if(typeof this.bucket[ctx["id"]]!="undefined")
|
||||||
|
return this.bucket[ctx["id"]];if(!_isfn(ctx["func"])){if(ctx["obj"]!=null&&typeof ctx["obj"]=="object"&&typeof ctx["func"]=="string"&&_isfn(ctx["obj"][ctx["func"]]))
|
||||||
|
ctx["func"]=ctx["obj"][ctx["func"]];else
|
||||||
|
ctx["func"]=eval("function () { "+ctx["func"]+" }");}
|
||||||
|
ctx["_handle"]=this._schedule(ctx);this.bucket[ctx["id"]]=ctx;return ctx;},reschedule:function(ctx){if(typeof ctx=="string")
|
||||||
|
ctx=this.bucket[ctx];ctx["_handle"]=this._schedule(ctx);return ctx;},_schedule:function(ctx){var trampoline=function(){var obj=(ctx["obj"]!=null?ctx["obj"]:ctx);(ctx["func"]).apply(obj,ctx["args"]);if(typeof(ctx["_scheduler"]).bucket[ctx["id"]]!="undefined"&&ctx["repeat"])
|
||||||
|
(ctx["_scheduler"])._schedule(ctx);else
|
||||||
|
delete(ctx["_scheduler"]).bucket[ctx["id"]];};return setTimeout(trampoline,ctx["time"]);},cancel:function(ctx){if(typeof ctx=="string")
|
||||||
|
ctx=this.bucket[ctx];if(typeof ctx=="object"){clearTimeout(ctx["_handle"]);delete this.bucket[ctx["id"]];}}};$.extend({scheduler$:new $.scheduler(),schedule:function(){return $.scheduler$.schedule.apply($.scheduler$,arguments)},reschedule:function(){return $.scheduler$.reschedule.apply($.scheduler$,arguments)},cancel:function(){return $.scheduler$.cancel.apply($.scheduler$,arguments)}});$.fn.extend({schedule:function(){var a=[{}];for(var i=0;i<arguments.length;i++)
|
||||||
|
a.push(arguments[i]);return this.each(function(){a[0]={"id":this,"obj":this};return $.schedule.apply($,a);});}});})(jQuery);
|
Loading…
Reference in New Issue