(function(window, undefined) { var plat4m, bootstrapList, compstrapList, document = window.document, location = window.location, navigator = window.navigator, _tri4m = window.tri4m, tri4m = function(selector, context) { return new tri4m.shell.init(selector, context, plat4m); }, ECMA_push = Array.prototype.push, ECMA_slice = Array.prototype.slice, ECMA_indexOf = Array.prototype.indexOf, ECMA_toString = Object.prototype.toString, ECMA_hasOwn = Object.prototype.hasOwnProperty, ECMA_trim = String.prototype.trim, ECMA_classType = {}, DOMContentLoaded = function() { if(document.addEventListener) { document.removeEventListener("DOMContentLoaded", DOMContentLoaded, false); tri4m.bootstrap(); } else if(document.readyState === "complete") { document.detachEvent("onreadystatechange", DOMContentLoaded); tri4m.bootstrap(); } }; var REGEX_V_MS_PREFIX = /^-ms-/; var REGEX_D_DASH_ALPHA = /-([\da-z])/gi; var REGEX_C_NOT_WHITE = /\S/; var REGEX_C_SPACE = /\s+/; var JQUERY_SRC = 'http://code.jquery.com/jquery-latest.min.js'; var JQUERY_INIT_TIME = 500; // idle for jQuery === undefined tri4m.shell = tri4m.prototype = { constructor: tri4m, init: function(selector, context, plat4m) { if(!selector) return this; if(selector.nodeType) { this.context = this[0] = selector; this.length = 1; return this; } if(typeof selector === "string") { tri4m.log('no jQuery - no selector support! (request: ' + selector + ')', 3); return this; } else if(tri4m.isFunction(selector)) { return plat4m.compstrap(selector); } if(typeof selector.selector !== 'undefined') { this.selector = selector.selector; this.context = selector.context; } return tri4m.makeArray(selector, this); }, selector: "", build: "1.8.3", minor: "1.8.2", major: "1.8.3", length: 0, size: function() { return this.length; }, toArray: function() { return ECMA_slice.call(this); }, get: function(num) { return num == null ? this.toArray() : (num < 0 ? this[this.length + num] : this[num]); }, pushStack: function(elems, name, selector) { var ret = tri4m.merge(this.constructor(), elems); ret.prevObject = this; ret.context = this.context; if(name === "find") { ret.selector = this.selector + (this.selector ? " " : "") + selector; } else if(name) { ret.selector = this.selector + "." + name + "(" + selector + ")"; } return ret; }, each: function(callback, args) { return tri4m.each(this, callback, args); }, bootstrap: function(fn) { tri4m.bootstrap.promise().done(fn); return this; }, compstrap: function(fn) { tri4m.compstrap.promise().done(fn); return this; }, eq: function(i) { i = +i; return i === -1 ? this.slice(i) : this.slice(i, i + 1); }, first: function() { return this.eq(0); }, last: function() { return this.eq(-1); }, slice: function() { return this.pushStack ( ECMA_slice.apply(this, arguments), "slice", ECMA_slice.call(arguments).join(",") ); }, map: function(callback) { return this.pushStack ( tri4m.map ( this, function(elem, i) { return callback.call(elem, i, elem); } ) ); }, end: function() { return this.prevObject || this.constructor(null); }, push: ECMA_push, sort: [].sort, splice: [].splice }; tri4m.shell.init.prototype = tri4m.shell; tri4m.extend = tri4m.shell.extend = function() { var opt, name, des, ref, refIsArray, clone, tar = arguments[0] || {}, i = 1, length = arguments.length, rec = false; if(typeof tar === "boolean") { rec = tar; tar = arguments[1] || {}; i = 2; } if(typeof tar !== "object" && !tri4m.isFunction(tar)) tar = {}; if(length === i) { tar = this; --i; } for(; i < length; i++) { if((opt = arguments[i]) == null) continue; for(name in opt) { des = tar[name]; ref = opt[name]; if(tar === ref) continue; if(rec && ref && (tri4m.isPlainObject(ref) || (refIsArray = tri4m.isArray(ref)))) { if(refIsArray) { refIsArray = false; clone = des && tri4m.isArray(des) ? des : []; } else { clone = des && tri4m.isPlainObject(des) ? des : {}; } tar[name] = tri4m.extend(rec, clone, ref); continue; } if(ref === undefined) continue; tar[name] = ref; } } return tar; }; tri4m.extend( { isBootstrapped: false, isCompstrapped: false, bootstrapWait: 1, compstrapWait: 1, holdBoot: function(hold) { if(hold) { tri4m.bootstrapWait++; } else { tri4m.bootstrap(true); } }, bootstrap: function(wait) { if(wait === true ? --tri4m.bootstrapWait : tri4m.isBootstrapped) return; if(!document.body) return setTimeout(tri4m.bootstrap, 1); tri4m.isBootstrapped = true; if(wait !== true && --tri4m.bootstrapWait > 0) return; bootstrapList.resolveWith(document, [tri4m]); tri4m.log('-- Bootstrap complete'); }, compstrap: function(wait) { if(wait === true ? --tri4m.compstrapWait : tri4m.isCompstrapped) return; if(!document.body) return setTimeout(tri4m.compstrap, 1); tri4m.isCompstrapped = true; if(wait !== true && --tri4m.compstrapWait > 0) return; compstrapList.resolveWith(document, [tri4m]); tri4m.log('-- Compstrap complete'); }, log : function(sText, sType, _bTimestamp) { var debugMode = true, useConsole = true, c = null, d = ['log', 'info', 'warn', 'error'], sType = sType || 0, n = d[sType]; if(typeof l == 'undefined') l = 0; if(false === debugMode) return this; if(null === c) c = (typeof console !== 'undefined' && typeof console.log !== 'undefined'); if(typeof(_bTimestamp) !== 'undefined' && _bTimestamp) sText = sText + ' | ' + new Date().getTime(); sText = 'tri4m: ' + sText; sType = d[sType]; l++; if(c && useConsole) { if(typeof console[sType] === 'undefined') sType = d[sType]; if(typeof console[sType] !== 'undefined') { console[sType](sText); } else { console.log(sText); } } return this; }, isFunction: function(obj) { return tri4m.type(obj) === "function"; }, isArray: Array.isArray || function(obj) { return tri4m.type(obj) === "array"; }, isWindow: function(obj) { return obj != null && obj == obj.window; }, isNumeric: function(obj) { return !isNaN(parseFloat(obj)) && isFinite(obj); }, type: function(obj) { return obj == null ? String(obj) : ECMA_classType[ECMA_toString.call(obj)] || "object"; }, isPlainObject: function(obj) { if(!obj || tri4m.type(obj) !== "object" || obj.nodeType || tri4m.isWindow(obj)) return false; try { if(obj.constructor && !ECMA_hasOwn.call(obj, "constructor") && !ECMA_hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) return false; } catch(e) { return false; } var key; for(key in obj) {} return key === undefined || ECMA_hasOwn.call(obj, key); }, isEmptyObject: function(obj) { var name; for(name in obj) return false; return true; }, stringToFlag: function(options, type) { var object = {}; var type = (type && type === true || type === false || type === null || type === 0 || type === 1 || type === 2) ? type : true; tri4m.each ( options.split(REGEX_C_SPACE), function(i, flag) { i++; if(type === 0) { object[flag] = i - 1; return; } if(type === 1) { object[flag] = i; return; } if(type === 2) { object[flag] = Math.pow(2, i); return; } object[flag] = type; } ); return object; }, objectToString : function(object, includeFunctions, fullPrintFunctions, tbl) { var incFunctions = includeFunctions || false, prntFunctions = fullPrintFunctions || false, tbl = tbl || false; var type = function(p, t, l) { var l = l || 0, s = tri4m.stringRepeat(' ', l), n = "\n" + s, d = n + '@prop ' + p + ': ', r; var space = n; var type = '[property] '; var name = p; var value = t; var scalar = true; switch(true) { case(typeof t === "undefined"): value = "undefined"; break; case(t === null): value = "null"; break; case(typeof t === "boolean"): value = (t === true) ? "true" : 'false'; type = "[boolean]"; break; case(t === NaN): value = "NaN" ; break; case(tri4m.isFunction(t)): internal = t.toString().match(/\[native code\]/g); type = "[function"+ ((internal !== null) ? "[internal: " + t.constructor.name + "]" : "") + "]"; value = (true === prntFunctions) ? t.toString() : null; break; case(tri4m.isArray(t) && t.length === 0): type = "[array]"; value = "[]"; break; case(tri4m.isArray(t)): var b = parse(t, (l + 1)).join(""); type = "[array]"; value = n + " [" + b + n + "], "; scalar = false; break; case (typeof t === "object" && tri4m.isEmptyObject(t)): type = "[object]"; value = "[]"; break; case (typeof t === "object"): var b = parse(t, (l + 1)).join(s); type = "[object]"; value = "[" + b + n +"], "; scalar = false; break; case (typeof t === "string"): type = "[string]"; value = "'" + t.toString() + "', "; break; default: type = "[" + (typeof t) + "]"; value = t.toString(); break; } return { space : space, type : type, name : name, value : value, scalar : scalar }; }; var parse = function(o, l) { var a = [], b = [], l = l || 1, tl = 0, nl = 0; for(var p in o) { if(typeof o.hasOwnProperty !== 'function') continue; if(!o.hasOwnProperty(p)) continue; var t = o[p]; if(false === incFunctions && tri4m.isFunction(t)) continue; a[a.length] = type(p, t, l); } for(var i in a) { var atl = a[i].type.length, anl = a[i].name.length; if(atl > tl) tl = atl; if(anl > nl) nl = anl; } for(var i in a) { var t = a[i], n = t.name, p = t.type, v = t.value; if(true === t.scalar && true === tbl) { n = tri4m.stringPadRight(t.name, " ", nl); p = tri4m.stringPadRight(t.type, " ", tl) } v = (null === v) ? "" : ": " + v; b[b.length] = t.space + p + " " + n + v; } return b; }; var r = parse(object).join(""); r = (r !== '') ? r + "\n" : 'null'; return "{{{!:" + r + ":!EOF}}}\n"; }, rand: function(numericScope) { if(!numericScope) var numericScope = Math.floor(Math.random()); return Math.floor(Math.random() * numericScope); }, sprintf: function(str) { for(var i = 1, len = arguments.length; i < len; ++i) str = str.replace("{" + (i - 1) + "}", arguments[i]); return str; }, sizeOf : function(subject) { if(tri4m.isArray(subject)) return subject.length; if(typeof subject === 'undefined') return; if(typeof subject === null) return; var c = 0; for(var i in subject) c++; return c; }, sleep : function(subject, time, callback) { var i = subject; i.queue(function() { setTimeout(function() { i.dequeue(); if(callback) callback(); return subject; }, time); }); return subject; }, stringFindNumber: function(string) { string = string.replace(/[^0-9]/gi, ''); if(!string || isNaN(string)) string = 0; return string; }, stringPadLeft: function(string, chr, width) { var result = string, length = width - result.toString().length, i = length - 1; if(width > 0 && i >= 0) do result = chr + result; while(i--); return result; }, stringPadRight: function(string, chr, width) { var result = string, length = width - result.toString().length, i = length - 1; if(width > 0 && i >= 0) do result = result + chr; while(i--); return result; }, stringRepeat: function(string, width) { var result = ''; for(var i = 0; i < width; i++) result += string; return result; }, stringToWrite : function(str, depth, width, chr) { var width = width || 8, depth = depth || 0, chr = chr || ' '; return tri4m.stringRepeat(chr, depth * width) + str + "\n"; }, trimChar: function(string, chr) { if(string.substr(0, 1) === chr) string = string.substr(1, (string.length - 1)); if(string.substr((string.length - 1), string.length) === chr) string = string.substr(0, (string.length - 1)); return string; }, trimCharsRight: function(string, charlist) { charlist = !charlist ? ' \\s\u00A0' : (charlist + '').replace(/([\[\]\(\)\.\?\/\*\{\}\+\tri4m\^\:])/g, '\\tri4m1'); return (string + '').replace(new RegExp('[' + charlist + ']+tri4m', 'g') , ''); }, zeroFill: function(number, width, includeDecimal) { if(typeof includeDecimal == 'undefined') includeDecimal = false; var result = parseFloat(number), negative = false, length = width - result.toString().length, i = length - 1; if(result < 0) { result = Math.abs(result); negative = true; length++; i = length - 1; } if(width > 0) { if(result.toString().indexOf('.') > 0) { if(!includeDecimal) length += result.toString().split('.')[1].length; length++; i = length - 1; } if(i >= 0) do result = '0' + result; while (i--); } return (true === negative) ? '-' + result : result; }, rgb2hex : function(dec) { var n = parseInt(dec), c = 'ABCDEF', b = n / 16, r = n % 16; b = b-(r/16); b = ((b >= 0) && (b <= 9)) ? b : c.charAt(b - 10); return ((r >= 0) && (r <= 9)) ? b + '' + r : b + '' + c.charAt(r - 10); }, dec2hex : function(d) { return Number(d).toString(16).toUpperCase(); }, dec2hexCode : function(dec, length) { if(!length) var length = 8; return '0x' + tri4m.stringPadLeft(tri4m.dec2hex(dec), '0', length); }, error: function(msg) { throw new Error(msg); }, noop: function() {}, globalEval: function(data) { if(data && ECMA_rnotwhite.test(data)) (window.execScript || function(data) { window["eval"].call(window, data); })(data); }, camelCase: function(string) { return string.replace(REGEX_V_MS_PREFIX, "ms-").replace(REGEX_D_DASH_ALPHA, fcamelCase); }, nodeName: function(elem, name) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }, each: function(obj, callback, args) { var name, i = 0, length = obj.length, isObj = length === undefined || tri4m.isFunction(obj); if(args) { if(isObj) { for(name in obj) if(callback.apply(obj[name], args) === false) break; } else { for(; i < length;) if(callback.apply(obj[i++], args) === false) break; } } else { if(isObj) { for(name in obj) if(callback.call(obj[name], name, obj[name]) === false) break; } else { for(; i < length;) if(callback.call(obj[i], i, obj[i++]) === false) break; } } return obj; }, trim: function(text) { if(ECMA_trim && !ECMA_trim.call("\uFEFF\xA0")) { return (function(text) { return text == null ? "" : ECMA_trim.call(text); })(text); } else { return (function(text) { return text == null ? "" : (text + "").replace(rtrim, ""); })(text); } }, makeArray: function(arr, results) { var type, ret = results || []; if(arr == null) return ret; type = tri4m.type(arr); if(arr.length == null || type === "string" || type === "function" || type === "regexp" || tri4m.isWindow(arr)) { ECMA_push.call(ret, arr); } else { tri4m.merge(ret, arr); } return ret; }, inArray: function(elem, arr, i) { var len; if(arr) { if(ECMA_indexOf) return ECMA_indexOf.call(arr, elem, i); len = arr.length; i = i ? i < 0 ? Math.max(0, len + i) : i : 0; for(; i < len; i++) if(i in arr && arr[i] === elem) return i; } return -1; }, merge: function(first, second) { var l = second.length, i = first.length, j = 0; if(typeof l === "number") { for(; j < l; j++) first[i++] = second[j]; } else { while(second[j] !== undefined) first[i++] = second[j++]; } first.length = i; return first; }, grep: function(elems, callback, inv) { var retVal, ret = [], i = 0, length = elems.length; inv = !!inv; for(; i < length; i++) { retVal = !!callback(elems[i], i); if(inv !== retVal) ret.push(elems[i]); } return ret; }, map: function(elems, callback, arg) { var value, key, ret = [], i = 0, length = elems.length, isArray = elems instanceof tri4m || length !== undefined && typeof length === "number" && ((length > 0 && elems[0] && elems[length -1]) || length === 0 || tri4m.isArray(elems)); if(isArray) { for(; i < length; i++) { value = callback(elems[i], i, arg); if(value != null) ret[ret.length] = value; } } else { for(key in elems) { value = callback(elems[key], key, arg); if(value != null) ret[ret.length] = value; } } return ret.concat.apply([], ret); }, guid: 1, proxy: function(fn, context) { var tmp, args, proxy; if(typeof context === "string") { tmp = fn[context]; context = fn; fn = tmp; } if(!tri4m.isFunction(fn)) return undefined; args = ECMA_slice.call(arguments, 2); proxy = function() { return fn.apply(context, args.concat(ECMA_slice.call(arguments))); }; proxy.guid = fn.guid = fn.guid || tri4m.guid++; return proxy; }, access: function(elems, fn, key, value, chainable, emptyGet, pass) { var exec, bulk = key == null, i = 0, length = elems.length; if(key && typeof key === "object") { for(i in key) tri4m.access(elems, fn, i, key[i], 1, emptyGet, value); chainable = 1; } else if(value !== undefined) { exec = pass === undefined && tri4m.isFunction(value); if(bulk) { if(exec) { exec = fn; fn = function(elem, key, value) { return exec.call(tri4m(elem), value); }; } else { fn.call(elems, value); fn = null; } } if(fn) for(; i < length; i++) fn(elems[i], key, exec ? value.call(elems[i], i, fn(elems[i], key)) : value, pass); chainable = 1; } return chainable ? elems : bulk ? fn.call(elems) : length ? fn(elems[0], key) : emptyGet; }, now: function() { return (new Date()).getTime(); }, loadScript: function(src, callback) { var head = document.getElementsByTagName('head')[0], script = document.createElement('script'); done = false; script.setAttribute('src', src); script.setAttribute('type', 'text/javascript'); script.setAttribute('charset', 'utf-8'); script.onload = script.onreadstatechange = function() { if(!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) { done = true; script.onload = script.onreadystatechange = null; if(callback) { callback(); } } }; head.insertBefore(script, head.firstChild); }, toRegister : { expr : { ':' : {} } } }); tri4m.bootstrap.promise = function(obj) { if(!bootstrapList) { bootstrapList = tri4m.Deferred(); if(document.readyState === "complete") { setTimeout(tri4m.bootstrap, 1); } else if(document.addEventListener) { document.addEventListener("DOMContentLoaded", DOMContentLoaded, false); window.addEventListener("load", tri4m.bootstrap, false); } else { document.attachEvent("onreadystatechange", DOMContentLoaded); window.attachEvent("onload", tri4m.bootstrap); var top = false; try { top = window.frameElement == null && document.documentElement; } catch(e) { } if(top && top.doScroll) { (function doScrollCheck() { if(!tri4m.isBootstrapped) { try { top.doScroll("left"); } catch(e) { return setTimeout(doScrollCheck, 50); } tri4m.bootstrap(); } })(); } } } return bootstrapList.promise(obj); }; tri4m.compstrap.promise = function(obj) { if(!compstrapList) compstrapList = tri4m.Deferred(); return compstrapList.promise(obj); }; tri4m.each ( "Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { ECMA_classType["[object " + name + "]"] = name.toLowerCase(); } ); plat4m = tri4m(document); var optionsCache = {}; var createOptions = function(options) { var object = optionsCache[options] = {}; tri4m.each ( options.split(REGEX_C_SPACE), function(_, flag) { object[flag] = true; } ); return object; }; tri4m.Callbacks = function(options) { options = typeof options === "string" ? (optionsCache[options] || createOptions(options)) : tri4m.extend({}, options); var memory, fired, firing, firingStart, firingLength, firingIndex, list = [], stack = !options.once && [], fire = function(data) { memory = options.memory && data; fired = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; firing = true; for(; list && firingIndex < firingLength; firingIndex++) { if(list[firingIndex].apply(data[0], data[1]) === false && options.stopOnFalse) { memory = false; break; } } firing = false; if(list) { if(stack) { if(stack.length) fire(stack.shift()); } else if(memory) { list = []; } else { self.disable(); } } }, self = { add : function() { if(list) { var start = list.length; (function add(args) { tri4m.each(args, function(_, arg) { var type = tri4m.type(arg); if(type === "function") { if(!options.unique || !self.has(arg)) list.push(arg); } else if(arg && arg.length && type !== "string") { add(arg); } }); })(arguments); if(firing) { firingLength = list.length; } else if(memory) { firingStart = start; fire(memory); } } return this; }, remove: function() { if(list) { tri4m.each ( arguments, function(_, arg) { var index; while((index = tri4m.inArray(arg, list, index)) > -1) { list.splice(index, 1); if(firing) { if(index <= firingLength) firingLength--; if(index <= firingIndex) firingIndex--; } } } ); } return this; }, has: function(fn) { return tri4m.inArray(fn, list) > -1; }, empty: function() { list = []; return this; }, disable: function() { list = stack = memory = undefined; return this; }, disabled: function() { return !list; }, lock: function() { stack = undefined; if(!memory) self.disable(); return this; }, locked: function() { return !stack; }, fireWith: function(context, args) { args = args || []; args = [context, args.slice ? args.slice() : args]; if(list && (!fired || stack)) { if(firing) { stack.push(args); } else { fire(args); } } return this; }, fire: function() { self.fireWith(this, arguments); return this; }, fired: function() { return !!fired; } }; return self; }; tri4m.extend( { Deferred: function(func) { var tuples = [ /* action, add listener, listener list, final state */ ["resolve", "done", tri4m.Callbacks("once memory"), "resolved"], ["reject", "fail", tri4m.Callbacks("once memory"), "rejected"], ["notify", "progress", tri4m.Callbacks("memory")] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done(arguments).fail(arguments); return this; }, then: function(/* fnDone, fnFail, fnProgress */) { var fns = arguments; return tri4m.Deferred(function(newDefer) { tri4m.each(tuples, function(i, tuple) { var action = tuple[0], fn = fns[i]; deferred[tuple[1]](tri4m.isFunction(fn) ? function() { var returned = fn.apply(this, arguments); if(returned && tri4m.isFunction(returned.promise)) { returned.promise() .done(newDefer.resolve) .fail(newDefer.reject) .progress(newDefer.notify); } else { newDefer[action + "With"](this === deferred ? newDefer : this, [returned]); } } : newDefer[action] ); }); fns = null; }).promise(); }, promise: function(obj) { return obj != null ? tri4m.extend(obj, promise) : promise; } }, deferred = {}; promise.pipe = promise.then; tri4m.each(tuples, function(i, tuple) { var list = tuple[2], stateString = tuple[3]; promise[tuple[1]] = list.add; if(stateString) { list.add ( function() { state = stateString; }, tuples[i ^ 1][2].disable, tuples[2][2].lock ); } deferred[tuple[0]] = list.fire; deferred[tuple[0] + "With"] = list.fireWith; }); promise.promise(deferred); if(func) func.call(deferred, deferred); return deferred; }, when: function(subordinate /* , ..., subordinateN */) { var i = 0, resolveValues = core_slice.call(arguments), length = resolveValues.length, remaining = length !== 1 || (subordinate && tri4m.isFunction(subordinate.promise)) ? length : 0, deferred = remaining === 1 ? subordinate : tri4m.Deferred(), updateFunc = function(i, contexts, values) { return function(value) { contexts[i] = this; values[i] = arguments.length > 1 ? core_slice.call(arguments) : value; if(values === progressValues) { deferred.notifyWith(contexts, values); } else if(!(--remaining)) { deferred.resolveWith(contexts, values); } }; }, progressValues, progressContexts, resolveContexts; if(length > 1) { progressValues = new Array(length); progressContexts = new Array(length); resolveContexts = new Array(length); for(; i < length; i++) { if(resolveValues[i] && tri4m.isFunction(resolveValues[i].promise)) { resolveValues[i].promise() .done(updateFunc(i, resolveContexts, resolveValues)) .fail(deferred.reject) .progress(updateFunc(i, progressContexts, progressValues)); } else { --remaining; } } } if(!remaining) deferred.resolveWith(resolveContexts, resolveValues); return deferred.promise(); } }); tri4m.extend ( { lib : { exception : { Throwable : function(name) { var name = name; var constructor = function(message) { //Error.apply(this, arguments); if(this == window) return new arguments.callee(message, level); this.message = message || ''; this.name = name + '.Exception'; }; constructor.name = name || 'tri4m.lib.exception.Throwable'; constructor.prototype.toString = Error.prototype.toString; return constructor; } }, loader : { /** * @param string src * @param object lfo the expected object * @param function onload * @param function callback */ Javascript : function(options) { this.name = 'tri4m.lib.loader.Javascript'; this.Exception = new tri4m.lib.exception.Throwable(this.name); var tried = false; var avail = false; var __settings = tri4m.extend( { src : null, lfo : null, success : null }, options); this.load = function() { if(true === tried) return this; tried = true; if(null === __settings.src) throw new this.Exception('src is null.'); /* NullReferenceError.... if(typeof __settings.lfo !== 'undefined' && __settings.lfo !== null) { tri4m.log('lfo is avail: ' + tri4m.objectToString(__settings.lfo)); avail = true; __settings.callback(this); return this; } */ tri4m.log('Load script ' + __settings.src); try { var head = document.getElementsByTagName('head')[0], script = document.createElement('script'); script.setAttribute('src', __settings.src); script.setAttribute('type', 'text/javascript'); script.setAttribute('charset', 'utf-8'); script.onload = script.onreadstatechange = function() { if(!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete') { script.onload = script.onreadystatechange = null; if(tri4m.isFunction(__settings.success)) __settings.success(__settings); } }; head.insertBefore(script, head.firstChild); } catch(e) { throw new this.Exception('Unable to append javasript ' + __settings.src) } return this; } }, /** * @param string src * @param object lfo the expected object * @param function onload * @param function callback */ Stylesheet : function(options) { this.name = 'tri4m.lib.loader.Stylesheet'; this.Exception = new tri4m.lib.exception.Throwable(this.name); var tried = false; var avail = false; var __settings = tri4m.extend( { src : null, lfo : null, success : null }, options); this.load = function() { if(true === tried) return this; tried = true; if(null === __settings.src) throw new this.Exception('src is null.'); /* NullReferenceError.... if(typeof __settings.lfo !== 'undefined' && __settings.lfo !== null) { tri4m.log('lfo is avail: ' + tri4m.objectToString(__settings.lfo)); avail = true; __settings.callback(this); return this; } */ tri4m.log('Load script ' + __settings.src); try { var head = document.getElementsByTagName('head')[0], script = document.createElement('link'); script.setAttribute('src', __settings.src); script.setAttribute('type', 'text/css'); script.setAttribute('media', 'all'); script.onload = script.onreadstatechange = function() { if(!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete') { script.onload = script.onreadystatechange = null; if(tri4m.isFunction(__settings.success)) __settings.success(__settings); } }; head.insertBefore(script, head.firstChild); } catch(e) { throw new this.Exception('Unable to append stylesheet ' + __settings.src) } return this; } }, /** * Queue-Loader based on Automation-Player * * * var Loader = new tri4m.lib.loader.Queue('Javascript'); * * var myComplete = function() { Loader.next(); alert('whohoo'); } * * Loader.push(new tri4m.lib.loader.Javascript({src : 'swfobject.js', success : Loader.next})) * Loader.push(new tri4m.lib.loader.Javascript({src : 'whoohooo.js', success : myComplete })); * Loader.push(new tri4m.lib.loader.Javascript({src : 'another.js', success : Loader.next })); * Loader.start(); * * * jQuery is ready before we init our plugins: * plat4m.bootstrap(function() * { * var JS = tri4m.lib.loader.Javascript, JSLoader = tri4m.lib.loader.Queue, * Compstrap = new JSLoader, * Bootstrap = new JSLoader({ success: Compstrap.start }); * * Bootstrap.push(new JS({ src : 'http://localfrost/wp-content/plugins/tri4m/jquery.js', success : Bootstrap.next })); * Compstrap.push(new JS({ src : 'http://localfrost/wp-content/plugins/tri4m/tri4mQtLoader/js/tri4m.QtLoader.js' })); * * setTimeout * ( * function() * { * typeof jQuery === 'undefined' * ? Bootstrap.start() * : Compstrap.start(); * } , 200 * ); * }); * * @note calling Loader.next() in File-callback is required * @see ri4m.lib.automation.Player */ Queue : function(options) { var __methods = new tri4m.lib.method.Hook, __player = new tri4m.lib.automation.Player(options); /** * @param tri4m.lib.loader.File File */ this.push = function(File) { __methods.push(File.load); return this; } /** * start */ this.start = function() { __player.setup(__methods).play(); return this; } /** * next */ this.next = function() { __player.next(); return this; } } }, property : { /** * value for value-queue * * overwrite is allowed or not * * @param value mixed * @param protect bool true: can not overwrite existing value */ Value : function(value, protect) { this.name = 'tri4m.lib.property.Value'; this.Exception = new tri4m.lib.exception.Throwable(this.name); var __value = value || null; var __protect = (protect === true) ? true : false; /** * get value * @return mixed */ this.get = function() { return __value; }; /** * set value * * this has no effect, if __protect is true * @return tri4m.lib.property.Value */ this.set = function(value) { if(__protect === true) throw new this.Exception(value + ' is protected', 3); __value = value; return this; }; /** * get variable as object * * @return object */ this.toObject = function() { return { value : __value, protect : __protect }; }; }, /** * value registry * * store vars with values * * // new value-queue * var foo = new tri4m.lib.property.Registry(); * * // var "baz" * foo.register('baz', 'baz: bar'); log.t100(foo.get('baz')); // baz: bar * foo.set('baz', 'baz: bar -> foo'); log.t100(foo.get('baz')); // baz: foo * * // protected var "foo" * foo.register('foo', 'foo: lol', true); log.t100(foo.get('foo')); // foo: lol * foo.set('foo', 'foo: lol -> rofl'); log.t100(foo.get('foo')); // foo: lol */ Registry : function() { this.name = 'tri4m.lib.property.Registry'; this.Exception = new tri4m.lib.exception.Throwable(this.name); var __data = {}; /** * register value-instance * * @param name string instance-name * @param value mixed * @param protect bool true: can not overwrite existing value * @see tri4m.lib.property.Value() * @return tri4m.lib.property.Registry */ this.register = function(name, value, protect) { if(this.isset(name) === true) throw new this.Exception('Unable to register existing property ' + name, 3); __data[name] = new tri4m.lib.property.Value(value, protect); return this; }; /** * unregister value-instance * * @param name string instance-name * @return tri4m.lib.property.Registry */ this.unregister = function(name) { if(this.isset(name) === false) return this; delete _data[name] return this; }; /** * isset instance * * @param name string instance-name * @return bool */ this.isset = function(name) { return (!__data[name]) ? false : true; }; /** * get value of instance * * @param name string instance-name * @see tri4m.lib.property.Value.get() * @return tri4m.lib.property.Value || null */ this.get = function(name) { return ((this.isset(name) === true) ? __data[name].get() : null); }; /** * set value of instance * * you must register your variable at first! * you can not use this registry as garbage dump! * * @param name string instance-name * @param value mixed * @see tri4m.lib.property.Value.set() * @return tri4m.lib.property.Registry */ this.set = function(name, value) { if(false === this.isset(name)) throw new this.Exception('Unable to update value for ' + name + ': not found', 3); try{ __data[name].set(value); } catch(e){ throw new this.Exception('Unable update value for ' + name, 3); } return this; }; /** * get queue as object * * @return tri4m.lib.property.Registry as propertyName:propertyValue object */ this.toObject = function() { var q = {}; for(i in __data) q[i] = __data[i].toObject(); return q; }; /** * get queue as value object * * @return tri4m.lib.property.Registry.__data as propertyValue object */ this.toValueObject = function() { var q = {}; for(i in __data) q[i] = __data[i].toObject().value; return q; }; /** * get queue as property object * * @return tri4m.lib.property.Registry.__data as propertyName object */ this.toPropertyObject = function() { var q = {}; var k = 0; for(i in __data) { q[k] = i; k++; } return q; }; } }, method : { /** * method FIFO * * @param runonce bool true: terminate queue on exec * * // some stuff * var test11 = function(){log.t100('test1.1')}; * var test12 = function(){log.t100('test1.2')}; * * // default queue * var bar = new tri4m.lib.method.Hook; * bar.push(test11).push(test12) * .execute() // test1.1 test1.2 * .execute(); // test1.1 test1.2 * * // run-once queue * var baz = new tri4m.lib.method.Hook(true); * baz.push(test11).push(test12) * .execute() // test1.1 test1.2 * .execute(); // nothing */ Hook : function(runonce) { this.name = 'tri4m.lib.method.Hook'; this.Exception = new tri4m.lib.exception.Throwable(this.name); var __hook = []; var __runonce = (runonce !== true) ? false : true; /** * add function to queue * * @param fn function * @return tri4m.lib.method.Hook */ this.push = function(fn) { __hook.push(fn); return this; }; /** * execute queue * * @return tri4m.lib.method.Hook */ this.execute = function() { if(__hook.length === 0) return this; if(__runonce === false) for(i in __hook) __hook[i](); else while(__hook.length > 0) (__hook.shift())(); return this; }; /** * terminate queue * * @return tri4m.lib.method.Hook */ this.reset = function() { __hook = []; return this; }; /** * get queue as array * * @return tri4m.lib.method.Hook.__hook... imho as copy */ this.toArray = function() { var a = __hook; return a; }; }, /** * method hook registry * * // some stuff * var test11 = function(){log.t100('test1.1')}; * var test12 = function(){log.t100('test1.2')}; * var test21 = function(){log.t100('test2.1')}; * var test22 = function(){log.t100('test2.2')}; * * // create registry queue * var foo = new tri4m.lib.method.Registry(); * * // default queue * foo.register('test1').push('test1', test11).push('test1', test12) * .execute('test1') // test1.1 test1.2 * .execute('test1'); // test1.1 test1.2 * * // run-once queue * foo.register('test2', true).push('test2', test11).push('test2', test12) * .execute('test2') // test2.1 test2.2 * .execute('test2'); // nothing * * * // shorthand: * // default queue * foo.get('test3').push(test21).push(test22) * .execute() // test2.1 test2.2 * .execute(); // test2.1 test2.2 * * // run-once queue * foo.get('test4', true).push(test21).push(test22) * .execute() // test2.1 test2.2 * .execute(); // nothing */ Registry : function() { this.name = 'tri4m.lib.method.Registry'; this.Exception = new tri4m.lib.exception.Throwable(this.name); var __hook = new tri4m.lib.property.Registry(); /** * register queue instance * * @param name string instance-name * @param runonce bool * @see tri4m.lib.method.Hook() * @see tri4m.lib.property.Registry.register() * @return tri4m.lib.method.Registry */ this.register = function(name, runonce) { __hook.register(name, new tri4m.lib.method.Hook(runonce), true); return this; }; /** * isset instance * * @param name string instance-name * @see tri4m.lib.property.Registry.isset() * @return bool tri4m.lib.property.Registry.isset() */ this.isset = function(name) { return __hook.isset(name); }; /** * get/create queue instance * * @param name string instance-name * @param runonce bool * @see tri4m.lib.method.Hook * @return tri4m.lib.method.Hook */ this.get = function(name, runonce) { //log.t100(__hook.get(name).className()); if(this.isset(name) === false) this.register(name, runonce); return __hook.get(name); }; /** * execute queue of instance * * @param name string instance-name * @see tri4m.lib.method.Hook.execute() * @return tri4m.lib.method.Registry */ this.execute = function(name) { if(this.isset(name) === true) this.get(name).execute(); return this; }; /** * terminate queue * * @see tri4m.lib.method.Hook.reset() * @return tri4m.lib.method.Registry */ this.reset = function(name) { if(this.isset(name) === true) this.get(name).reset(); return this; }; /** * add function to queue of instance * * @param name string instance-name * @param fn function * @see tri4m.lib.method.Hook.push() * @return tri4m.lib.method.Registry */ this.push = function(name, fn) { if(this.isset(name) === true) this.get(name).push(fn); return this; }; /** * get queue as object * * @return tri4m.lib.property.Registry.__hook as copy */ this.toObject = function() { return __hook.toObject(); }; /** * get queue as object * * @return tri4m.lib.property.Registry.__hook as copy */ this.getHook = function() { var q = __hook; return q; }; } }, automation : { /** * animation playlist player * * split methods from tri4m.lib.method.Hook * to partials * * @example tri4m.lib.loader.Queue * * * step 1: * create your methods: * * ... * Env : * { * Playlists : null, * Animation : * { * test10 : function(){ * log.t100('test10'); * tri4m('ul.list li').css({height: 5}); * tri4m.Env.Playlists.next('intro'); * }, * test11 : function(){ * log.t100('test11'); * tri4m('ul.list li').animate({height: 140}, 2200, function() * { * log.t100('test11 anim callback'); * tri4m.Env.Playlists.next('intro'); * }); * }, * test12 : function(){ * log.t100('test12'); * tri4m('ul.list li').css({width: 10}); * tri4m.Env.Playlists.next('intro'); * }, * test13 : function(){ * log.t100('test13'); * tri4m('ul.list li').animate({width: 140}, 2200); * tri4m.Env.Playlists.next('intro'); * } * } * }, * ... * * * step 2: * init the animation registry and register * the methods into sections, e.g. "intro" or "button-hover" * * ... * test : function() * { * tri4m.Env.Playlists = * new tri4m.lib.automation.Registry(); * * tri4m.Env.Playlists.register('intro') * .push(tri4m.Env.Animation.test10) * .push(tri4m.Env.Animation.test11) * .push(tri4m.Env.Animation.test12) * .push(tri4m.Env.Animation.test13) * ; * tri4m.Env.Playlists.play('intro'); * }, * ... * * * @todo lock, pause, start, stop not really implemented */ Player : function(options) { this.name = 'tri4m.lib.automation.Player'; this.Exception = new tri4m.lib.exception.Throwable(this.name); var __settings = tri4m.extend( { onPlayStart : tri4m.noop, onPlayNext : tri4m.noop, onPlayPause : tri4m.noop, onPlayStop : tri4m.noop, success : tri4m.noop }, options); /** * method registry queue */ var __registry = null; /** * __isPlaying bool status quo */ var __isPlaying = false; /** * translated registry as func-callback-object */ var __playlist = []; /** * working-copy of __playlist */ var __playqueue = []; /** * counter */ var __playedTimes = 0; /** * install method queue * * @param registry tri4m.lib.method.Hook * @return tri4m.lib.automation.Player */ this.setup = function(registry) { if(__registry !== null) return this; __registry = registry; var methods = __registry.toArray(); for(var i = 0; i < methods.length; i++) { var fn = methods[i]; if(typeof fn !== 'function') continue; var cb = function(){}; if((next = methods[i+1])) { if(typeof next !== 'function') continue; cb = next; } var item = { method: fn, callback : { method : cb } }; __playlist.push(item); } return this; }; /** * init playing * * @return tri4m.lib.automation.Player */ this.play = function() { if(true === this.isPlaying()) return false; if(__playqueue.length === 0) { __playedTimes++; __settings.onPlayStart(); } __isPlaying = true; __playqueue = __playlist; this.next(); return this; }; /** * play next method * * test11 : function(){ * log.t100('test11'); * tri4m('ul.list li').animate({height: 140}, 2200, function() * { * log.t100('test11 anim callback'); * tri4m.Env.Playlists.next('intro'); * }); * }, * * @return tri4m.lib.automation.Player */ this.next = function() { if(null === __playqueue) return this; var next = null; if(__playqueue.length > 0) next = __playqueue.shift(); if(!next) { this.stop(); __settings.success(); return this; } __settings.onPlayNext(); next.method(); return this; }; /** * pause * * @return tri4m.lib.automation.Player */ this.pause = function() { __isPlaying = false; __settings.onPlayPause(); return this; }; /** * stop/abort playing and delete working copy * * @return tri4m.lib.automation.Player */ this.stop = function() { __playqueue = []; __isPlaying = false; __settings.onPlayStop(); return this; }; /** * is playing status * * @return bool status quo */ this.isPlaying = function() { return __isPlaying; }; }, /** * playlist class * * holds a methodhook (playlist) and the player * */ Playlist : function() { this.name = 'tri4m.lib.automation.Playlist'; this.Exception = new tri4m.lib.exception.Throwable(this.name); /** * method queue/playlist */ var __playlist = new tri4m.lib.method.Hook(); /** * player */ var __player = new tri4m.lib.automation.Player(); /** * push method to __playlist * * @param function * @return tri4m.lib.automation.Playlist */ this.push = function(fn) { __playlist.push(fn); return this; }; /** * initialize player and start playing * * @return tri4m.lib.automation.Playlist */ this.play = function() { __player.setup(__playlist).play(); return this; }; /** * play next frame * * this is the callback-caller * * test11 : function(){ * log.t100('test11'); * tri4m('ul.list li').animate({height: 140}, 2200, function() * { * log.t100('test11 anim callback'); * tri4m.Env.Playlists.next('intro'); * }); * }, * * * @return tri4m.lib.automation.Playlist */ this.next = function() { __player.next(); return this; }; }, /** * playlist/player registry * * store animation-queues by event-name * */ Registry : function() { this.name = 'tri4m.lib.automation.Registry'; this.Exception = new tri4m.lib.exception.Throwable(this.name); var __queue = new tri4m.lib.property.Registry(); /** * craete a new playlist-instance * * @param string instance name * @return tri4m.lib.automation.Playlist */ this.register = function(name) { __queue.register(name, new tri4m.lib.automation.Playlist(), true); return __queue.get(name); }; /** * get playlist-instance * * @param string instance name * @return tri4m.lib.automation.Playlist */ this.get = function(name) { return __queue.get(name); }; /** * play a playlist-instance * * @param string instance name * @return tri4m.lib.automation.Registry */ this.play = function(name) { __queue.get(name).play(); return this; }; /** * play next callback * * @param string instance name * @return tri4m.lib.automation.Registry */ this.next = function(name) { __queue.get(name).next(); return this; }; } } } } ); tri4m.extend ( { append : { /** * head: * * (function(tri4m, undefined) * { * tri4m(function() * { * tri4m.append([ * 'plugin.js', * 'another.js' * ], * { * success : function() * { * tri4m.log('-- init my plugin'); * } * }); * }); * })(tri4m); */ Javascript : function(src, options, hold) { var __settings = tri4m.extend ( { success : tri4m.noop }, options ); if(typeof stack === 'undefined') stack = new tri4m.lib.loader.Queue({ success : __settings.success }); if(typeof src !== 'string') { var i = 0, l = src.length; for(var name in src) { i++; tri4m.append.Javascript(src[name], {}, i !== l) } return tri4m.com; } if(typeof cache === 'undefined') cache = []; for(var i in cache) if(src === cache[i]) return tri4m.com; cache.push(src); tri4m.log('append script ' + src); var cur = stack; stack.push(new tri4m.lib.loader.Javascript( { //src : src + '?' + Math.random(0, 100000000), src : src, success : cur.next })); if(!hold || hold !== true) stack.start(); return tri4m; }, Stylesheet : function(src, options, hold) { var __settings = tri4m.extend ( { success : tri4m.noop }, options ); if(typeof stack === 'undefined') stack = new tri4m.lib.loader.Queue({ success : __settings.success }); if(typeof src !== 'string') { var i = 0, l = src.length; for(var name in src) { i++; tri4m.append.Stylesheet(src[name], {}, i !== l) } return tri4m.com; } if(typeof cache === 'undefined') cache = []; for(var i in cache) if(src === cache[i]) return tri4m.com; cache.push(src); tri4m.log('append script ' + src); var cur = stack; stack.push(new tri4m.lib.loader.Stylesheet( { //src : src + '?' + Math.random(0, 100000000), src : src, success : cur.next })); if(!hold || hold !== true) stack.start(); return tri4m; } } } ); tri4m.com = function(name, base, prototype) { var fullName, existingConstructor, constructor, basePrototype, namespace = name.split(".")[0]; name = name.split(".")[1]; fullName = 'tri4m-' + namespace + "-" + name; if(!prototype) { prototype = base; base = tri4m.__Com; } tri4m.toRegister.expr[':'][fullName] = function(elem) { return !!jQuery.data(elem, fullName); }; tri4m[namespace] = tri4m[namespace] || {}; existingConstructor = tri4m[namespace][name]; constructor = tri4m[namespace][name] = function(options, element) { if(!this._create__Com) return new constructor(options, element); if(arguments.length) this._create__Com(options, element); }; tri4m.extend(constructor, existingConstructor, { version: prototype.version, _proto: tri4m.extend({}, prototype), _childConstructors: [] }); basePrototype = new base(); basePrototype.options = tri4m.com.extend({}, basePrototype.options); tri4m.each(prototype, function(prop, value) { if(tri4m.isFunction(value)) { prototype[prop] = (function() { var _super = function() { return base.prototype[prop].apply(this, arguments); }, _superApply = function(args) { return base.prototype[prop].apply(this, args); }; return function() { var __super = this._super, __superApply = this._superApply, returnValue; this._super = _super; this._superApply = _superApply; returnValue = value.apply(this, arguments); this._super = __super; this._superApply = __superApply; return returnValue; }; })(); } }); constructor.prototype = tri4m.com.extend ( basePrototype, { comEventPrefix: name }, prototype, { constructor: constructor, namespace: namespace, comName: name, comBaseClass: fullName, comFullName: fullName } ); if(existingConstructor) { tri4m.each(existingConstructor._childConstructors, function(i, child) { var childPrototype = child.prototype; tri4m.com(childPrototype.namespace + "." + childPrototype.comName, constructor, child._proto); }); delete existingConstructor._childConstructors; } else { base._childConstructors.push(constructor); } tri4m.com.bridge(name, constructor); }; tri4m.com.extend = function(target) { var input = ECMA_slice.call(arguments, 1), inputIndex = 0, inputLength = input.length, key, value; for( ; inputIndex < inputLength; inputIndex++) { for(key in input[inputIndex]) { value = input[inputIndex][key]; if(input[inputIndex].hasOwnProperty(key) && value !== undefined) { target[key] = tri4m.isPlainObject(value) ? tri4m.com.extend({}, target[key], value) : value; } } } return target; }; tri4m.com.bridge = function(name, object) { var fullName = object.prototype.comFullName; tri4m.shell[name] = function(options) { var isMethodCall = typeof options === "string", args = ECMA_slice.call(arguments, 1), returnValue = this; options = !isMethodCall && args.length ? tri4m.com.extend.apply(null, [options].concat(args)) : options; if(isMethodCall) { this.each(function() { var methodValue, instance = jQuery.data(this, fullName); if(!instance) return tri4m.log("cannot call methods on " + name + " prior to initialization; " + "attempted to call method '" + options + "'", 3); if(!tri4m.isFunction(instance[options]) || options.charAt(0) === "_") return tri4m.log("no such method '" + options + "' for " + name + " com instance", 3); methodValue = instance[options].apply(instance, args); if(methodValue !== instance && methodValue !== undefined) { returnValue = methodValue && methodValue.jquery ? returnValue.pushStack(methodValue.get()) : methodValue; return false; } }); } else { this.each(function() { var instance = tri4m.data(this, fullName); if(instance) { instance.option(options || {})._init(); } else { new object(options, this); } }); } return returnValue; }; }; var uuid = 0; tri4m.__Com = function(options, element) {}; tri4m.__Com._childConstructors = []; tri4m.__Com.prototype = { comName: "component", defaultElement: "