// Nice overview: // http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html if (typeof AdiUserscriptLib != 'object') (function(public){ public.interpolate = function (s, a) { // Oh, well... http://stackoverflow.com/a/16804092 for (var x in a) { var token = '{' + x + '}' var i = 0 while ( (i = s.indexOf(token, i)) >= 0) s = s.replace(token, a[x]) } return s } public.pad = function (x, len, char) { x = x.toString() while (x.length < len) x = char + x return x } public.bind3 = function (fn, arg1, arg2, arg3) { return function (a4,a5,a6) { return fn(arg1,arg2,arg3,a4,a5,a6) } } public.binder3 = function (fn, callback) { return function (arg1, arg2, arg3) { var bound = public.bind3(fn, arg1, arg2, arg3) if (callback) callback(bound) } } public.doWhenReady = function (fn) { $(document).ready(fn) } public.makeDoWhenReadyFn = function (fn) { return public.binder3(fn, public.doWhenReady) } public.addButton = (function () { var left = 12 var top = 64 var space = 32 var makeDoAndRemoveFn = function (fn, el) { return function () { fn() el.text(el.text() + ' ✓') } } var fn = function (name, fn) { var el = $('') .css('position', 'fixed') .css('top', top) .css('left', left) .css('z-index', 1000) el.click(makeDoAndRemoveFn(fn, el)) $(document.body).append(el) top = top + space } return public.makeDoWhenReadyFn(fn) }()) }(AdiUserscriptLib = {}))