/* * Licensed to Jasig under one or more contributor license * agreements. See the NOTICE file distributed with this work * for additional information regarding copyright ownership. * Jasig licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a * copy of the License at the following location: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ (function (window, undefined) { var document = window.document, navigator = window.navigator, location = window.location; var jQuery = (function () { var jQuery = function (selector, context) { return new jQuery.fn.init(selector, context, rootjQuery) }, _jQuery = window.jQuery, _$ = window.$, rootjQuery, quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, rnotwhite = /\S/, trimLeft = /^\s+/, trimRight = /\s+$/, rdigit = /\d/, rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, rvalidchars = /^[\],:{}\s]*$/, rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, rwebkit = /(webkit)[ \/]([\w.]+)/, ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, rmsie = /(msie) ([\w.]+)/, rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, userAgent = navigator.userAgent, browserMatch, readyList, DOMContentLoaded, toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, push = Array.prototype.push, slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, class2type = {}; jQuery.fn = jQuery.prototype = { constructor : jQuery, init : function (selector, context, rootjQuery) { var match, elem, ret, doc; if (!selector) { return this } if (selector.nodeType) { this.context = this[0] = selector; this.length = 1; return this } if (selector === "body" && !context && document.body) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this } if (typeof selector === "string") { if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) { match = [null, selector, null] } else { match = quickExpr.exec(selector) } if (match && (match[1] || !context)) { if (match[1]) { context = context instanceof jQuery ? context[0] : context; doc = (context ? context.ownerDocument || context : document); ret = rsingleTag.exec(selector); if (ret) { if (jQuery.isPlainObject(context)) { selector = [document.createElement(ret[1])]; jQuery.fn.attr.call(selector, context, true) } else { selector = [doc.createElement(ret[1])] } } else { ret = jQuery.buildFragment([match[1]], [doc]); selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes } return jQuery.merge(this, selector) } else { elem = document.getElementById(match[2]); if (elem && elem.parentNode) { if (elem.id !== match[2]) { return rootjQuery.find(selector) } this.length = 1; this[0] = elem } this.context = document; this.selector = selector; return this } } else { if (!context || context.jquery) { return (context || rootjQuery).find(selector) } else { return this.constructor(context).find(selector) } } } else { if (jQuery.isFunction(selector)) { return rootjQuery.ready(selector) } } if (selector.selector !== undefined) { this.selector = selector.selector; this.context = selector.context } return jQuery.makeArray(selector, this) }, selector : "", jquery : "1.6.1", length : 0, size : function () { return this.length }, toArray : function () { return slice.call(this, 0) }, get : function (num) { return num == null ? this.toArray() : (num < 0 ? this[this.length + num] : this[num]) }, pushStack : function (elems, name, selector) { var ret = this.constructor(); if (jQuery.isArray(elems)) { push.apply(ret, elems) } else { jQuery.merge(ret, 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 jQuery.each(this, callback, args) }, ready : function (fn) { jQuery.bindReady(); readyList.done(fn); return this }, eq : function (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(slice.apply(this, arguments), "slice", slice.call(arguments).join(",")) }, map : function (callback) { return this.pushStack(jQuery.map(this, function (elem, i) { return callback.call(elem, i, elem) })) }, end : function () { return this.prevObject || this.constructor(null) }, push : push, sort : [].sort, splice : [].splice }; jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function () { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; if (typeof target === "boolean") { deep = target; target = arguments[1] || {}; i = 2 } if (typeof target !== "object" && !jQuery.isFunction(target)) { target = {} } if (length === i) { target = this; --i } for (; i < length; i++) { if ((options = arguments[i]) != null) { for (name in options) { src = target[name]; copy = options[name]; if (target === copy) { continue } if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) { if (copyIsArray) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : [] } else { clone = src && jQuery.isPlainObject(src) ? src : {} } target[name] = jQuery.extend(deep, clone, copy) } else { if (copy !== undefined) { target[name] = copy } } } } } return target }; jQuery.extend({ noConflict : function (deep) { if (window.$ === jQuery) { window.$ = _$ } if (deep && window.jQuery === jQuery) { window.jQuery = _jQuery } return jQuery }, isReady : false, readyWait : 1, holdReady : function (hold) { if (hold) { jQuery.readyWait++ } else { jQuery.ready(true) } }, ready : function (wait) { if ((wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady)) { if (!document.body) { return setTimeout(jQuery.ready, 1) } jQuery.isReady = true; if (wait !== true && --jQuery.readyWait > 0) { return } readyList.resolveWith(document, [jQuery]); if (jQuery.fn.trigger) { jQuery(document).trigger("ready").unbind("ready") } } }, bindReady : function () { if (readyList) { return } readyList = jQuery._Deferred(); if (document.readyState === "complete") { return setTimeout(jQuery.ready, 1) } if (document.addEventListener) { document.addEventListener("DOMContentLoaded", DOMContentLoaded, false); window.addEventListener("load", jQuery.ready, false) } else { if (document.attachEvent) { document.attachEvent("onreadystatechange", DOMContentLoaded); window.attachEvent("onload", jQuery.ready); var toplevel = false; try { toplevel = window.frameElement == null } catch (e) {} if (document.documentElement.doScroll && toplevel) { doScrollCheck() } } } }, isFunction : function (obj) { return jQuery.type(obj) === "function" }, isArray : Array.isArray || function (obj) { return jQuery.type(obj) === "array" }, isWindow : function (obj) { return obj && typeof obj === "object" && "setInterval" in obj }, isNaN : function (obj) { return obj == null || !rdigit.test(obj) || isNaN(obj) }, type : function (obj) { return obj == null ? String(obj) : class2type[toString.call(obj)] || "object" }, isPlainObject : function (obj) { if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) { return false } if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { return false } var key; for (key in obj) {} return key === undefined || hasOwn.call(obj, key) }, isEmptyObject : function (obj) { for (var name in obj) { return false } return true }, error : function (msg) { throw msg }, parseJSON : function (data) { if (typeof data !== "string" || !data) { return null } data = jQuery.trim(data); if (window.JSON && window.JSON.parse) { return window.JSON.parse(data) } if (rvalidchars.test(data.replace(rvalidescape, "@").replace(rvalidtokens, "]").replace(rvalidbraces, ""))) { return (new Function("return " + data))() } jQuery.error("Invalid JSON: " + data) }, parseXML : function (data, xml, tmp) { if (window.DOMParser) { tmp = new DOMParser(); xml = tmp.parseFromString(data, "text/xml") } else { xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async = "false"; xml.loadXML(data) } tmp = xml.documentElement; if (!tmp || !tmp.nodeName || tmp.nodeName === "parsererror") { jQuery.error("Invalid XML: " + data) } return xml }, noop : function () {}, globalEval : function (data) { if (data && rnotwhite.test(data)) { (window.execScript || function (data) { window.eval.call(window, data) })(data) } }, nodeName : function (elem, name) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase() }, each : function (object, callback, args) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction(object); if (args) { if (isObj) { for (name in object) { if (callback.apply(object[name], args) === false) { break } } } else { for (; i < length; ) { if (callback.apply(object[i++], args) === false) { break } } } } else { if (isObj) { for (name in object) { if (callback.call(object[name], name, object[name]) === false) { break } } } else { for (; i < length; ) { if (callback.call(object[i], i, object[i++]) === false) { break } } } } return object }, trim : trim ? function (text) { return text == null ? "" : trim.call(text) } : function (text) { return text == null ? "" : text.toString().replace(trimLeft, "").replace(trimRight, "") }, makeArray : function (array, results) { var ret = results || []; if (array != null) { var type = jQuery.type(array); if (array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow(array)) { push.call(ret, array) } else { jQuery.merge(ret, array) } } return ret }, inArray : function (elem, array) { if (indexOf) { return indexOf.call(array, elem) } for (var i = 0, length = array.length; i < length; i++) { if (array[i] === elem) { return i } } return -1 }, merge : function (first, second) { var i = first.length, j = 0; if (typeof second.length === "number") { for (var l = second.length; 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 ret = [], retVal; inv = !!inv; for (var i = 0, length = elems.length; 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 jQuery || length !== undefined && typeof length === "number" && ((length > 0 && elems[0] && elems[length - 1]) || length === 0 || jQuery.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) { if (typeof context === "string") { var tmp = fn[context]; context = fn; fn = tmp } if (!jQuery.isFunction(fn)) { return undefined } var args = slice.call(arguments, 2), proxy = function () { return fn.apply(context, args.concat(slice.call(arguments))) }; proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; return proxy }, access : function (elems, key, value, exec, fn, pass) { var length = elems.length; if (typeof key === "object") { for (var k in key) { jQuery.access(elems, k, key[k], exec, fn, value) } return elems } if (value !== undefined) { exec = !pass && exec && jQuery.isFunction(value); for (var i = 0; i < length; i++) { fn(elems[i], key, exec ? value.call(elems[i], i, fn(elems[i], key)) : value, pass) } return elems } return length ? fn(elems[0], key) : undefined }, now : function () { return (new Date()).getTime() }, uaMatch : function (ua) { ua = ua.toLowerCase(); var match = rwebkit.exec(ua) || ropera.exec(ua) || rmsie.exec(ua) || ua.indexOf("compatible") < 0 && rmozilla.exec(ua) || []; return { browser : match[1] || "", version : match[2] || "0" } }, sub : function () { function jQuerySub(selector, context) { return new jQuerySub.fn.init(selector, context) } jQuery.extend(true, jQuerySub, this); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init(selector, context) { if (context && context instanceof jQuery && !(context instanceof jQuerySub)) { context = jQuerySub(context) } return jQuery.fn.init.call(this, selector, context, rootjQuerySub) }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub }, browser : {} }); jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function (i, name) { class2type["[object " + name + "]"] = name.toLowerCase() }); browserMatch = jQuery.uaMatch(userAgent); if (browserMatch.browser) { jQuery.browser[browserMatch.browser] = true; jQuery.browser.version = browserMatch.version } if (jQuery.browser.webkit) { jQuery.browser.safari = true } if (rnotwhite.test("\xA0")) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/ } rootjQuery = jQuery(document); if (document.addEventListener) { DOMContentLoaded = function () { document.removeEventListener("DOMContentLoaded", DOMContentLoaded, false); jQuery.ready() } } else { if (document.attachEvent) { DOMContentLoaded = function () { if (document.readyState === "complete") { document.detachEvent("onreadystatechange", DOMContentLoaded); jQuery.ready() } } } } function doScrollCheck() { if (jQuery.isReady) { return } try { document.documentElement.doScroll("left") } catch (e) { setTimeout(doScrollCheck, 1); return } jQuery.ready() } return jQuery })(); var promiseMethods = "done fail isResolved isRejected promise then always pipe".split(" "), sliceDeferred = [].slice; jQuery.extend({ _Deferred : function () { var callbacks = [], fired, firing, cancelled, deferred = { done : function () { if (!cancelled) { var args = arguments, i, length, elem, type, _fired; if (fired) { _fired = fired; fired = 0 } for (i = 0, length = args.length; i < length; i++) { elem = args[i]; type = jQuery.type(elem); if (type === "array") { deferred.done.apply(deferred, elem) } else { if (type === "function") { callbacks.push(elem) } } } if (_fired) { deferred.resolveWith(_fired[0], _fired[1]) } } return this }, resolveWith : function (context, args) { if (!cancelled && !fired && !firing) { args = args || []; firing = 1; try { while (callbacks[0]) { callbacks.shift().apply(context, args) } } finally { fired = [context, args]; firing = 0 } } return this }, resolve : function () { deferred.resolveWith(this, arguments); return this }, isResolved : function () { return !!(firing || fired) }, cancel : function () { cancelled = 1; callbacks = []; return this } }; return deferred }, Deferred : function (func) { var deferred = jQuery._Deferred(), failDeferred = jQuery._Deferred(), promise; jQuery.extend(deferred, { then : function (doneCallbacks, failCallbacks) { deferred.done(doneCallbacks).fail(failCallbacks); return this }, always : function () { return deferred.done.apply(deferred, arguments).fail.apply(this, arguments) }, fail : failDeferred.done, rejectWith : failDeferred.resolveWith, reject : failDeferred.resolve, isRejected : failDeferred.isResolved, pipe : function (fnDone, fnFail) { return jQuery.Deferred(function (newDefer) { jQuery.each({ done : [fnDone, "resolve"], fail : [fnFail, "reject"] }, function (handler, data) { var fn = data[0], action = data[1], returned; if (jQuery.isFunction(fn)) { deferred[handler](function () { returned = fn.apply(this, arguments); if (returned && jQuery.isFunction(returned.promise)) { returned.promise().then(newDefer.resolve, newDefer.reject) } else { newDefer[action](returned) } }) } else { deferred[handler](newDefer[action]) } }) }).promise() }, promise : function (obj) { if (obj == null) { if (promise) { return promise } promise = obj = {} } var i = promiseMethods.length; while (i--) { obj[promiseMethods[i]] = deferred[promiseMethods[i]] } return obj } }); deferred.done(failDeferred.cancel).fail(deferred.cancel); delete deferred.cancel; if (func) { func.call(deferred, deferred) } return deferred }, when : function (firstParam) { var args = arguments, i = 0, length = args.length, count = length, deferred = length <= 1 && firstParam && jQuery.isFunction(firstParam.promise) ? firstParam : jQuery.Deferred(); function resolveFunc(i) { return function (value) { args[i] = arguments.length > 1 ? sliceDeferred.call(arguments, 0) : value; if (!(--count)) { deferred.resolveWith(deferred, sliceDeferred.call(args, 0)) } } } if (length > 1) { for (; i < length; i++) { if (args[i] && jQuery.isFunction(args[i].promise)) { args[i].promise().then(resolveFunc(i), deferred.reject) } else { --count } } if (!count) { deferred.resolveWith(deferred, args) } } else { if (deferred !== firstParam) { deferred.resolveWith(deferred, length ? [firstParam] : []) } } return deferred.promise() } }); jQuery.support = (function () { var div = document.createElement("div"), documentElement = document.documentElement, all, a, select, opt, input, marginDiv, support, fragment, body, bodyStyle, tds, events, eventName, i, isSupported; div.setAttribute("className", "t"); div.innerHTML = "
a"; all = div.getElementsByTagName("*"); a = div.getElementsByTagName("a")[0]; if (!all || !all.length || !a) { return {} } select = document.createElement("select"); opt = select.appendChild(document.createElement("option")); input = div.getElementsByTagName("input")[0]; support = { leadingWhitespace : (div.firstChild.nodeType === 3), tbody : !div.getElementsByTagName("tbody").length, htmlSerialize : !!div.getElementsByTagName("link").length, style : /top/.test(a.getAttribute("style")), hrefNormalized : (a.getAttribute("href") === "/a"), opacity : /^0.55$/.test(a.style.opacity), cssFloat : !!a.style.cssFloat, checkOn : (input.value === "on"), optSelected : opt.selected, getSetAttribute : div.className !== "t", submitBubbles : true, changeBubbles : true, focusinBubbles : false, deleteExpando : true, noCloneEvent : true, inlineBlockNeedsLayout : false, shrinkWrapBlocks : false, reliableMarginRight : true }; input.checked = true; support.noCloneChecked = input.cloneNode(true).checked; select.disabled = true; support.optDisabled = !opt.disabled; try { delete div.test } catch (e) { support.deleteExpando = false } if (!div.addEventListener && div.attachEvent && div.fireEvent) { div.attachEvent("onclick", function click() { support.noCloneEvent = false; div.detachEvent("onclick", click) }); div.cloneNode(true).fireEvent("onclick") } input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; input.setAttribute("checked", "checked"); div.appendChild(input); fragment = document.createDocumentFragment(); fragment.appendChild(div.firstChild); support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; div.innerHTML = ""; div.style.width = div.style.paddingLeft = "1px"; body = document.createElement("body"); bodyStyle = { visibility : "hidden", width : 0, height : 0, border : 0, margin : 0, background : "none" }; for (i in bodyStyle) { body.style[i] = bodyStyle[i] } body.appendChild(div); documentElement.insertBefore(body, documentElement.firstChild); support.appendChecked = input.checked; support.boxModel = div.offsetWidth === 2; if ("zoom" in div.style) { div.style.display = "inline"; div.style.zoom = 1; support.inlineBlockNeedsLayout = (div.offsetWidth === 2); div.style.display = ""; div.innerHTML = "
"; support.shrinkWrapBlocks = (div.offsetWidth !== 2) } div.innerHTML = "
t
"; tds = div.getElementsByTagName("td"); isSupported = (tds[0].offsetHeight === 0); tds[0].style.display = ""; tds[1].style.display = "none"; support.reliableHiddenOffsets = isSupported && (tds[0].offsetHeight === 0); div.innerHTML = ""; if (document.defaultView && document.defaultView.getComputedStyle) { marginDiv = document.createElement("div"); marginDiv.style.width = "0"; marginDiv.style.marginRight = "0"; div.appendChild(marginDiv); support.reliableMarginRight = (parseInt((document.defaultView.getComputedStyle(marginDiv, null) || { marginRight : 0 }).marginRight, 10) || 0) === 0 } body.innerHTML = ""; documentElement.removeChild(body); if (div.attachEvent) { for (i in { submit : 1, change : 1, focusin : 1 }) { eventName = "on" + i; isSupported = (eventName in div); if (!isSupported) { div.setAttribute(eventName, "return;"); isSupported = (typeof div[eventName] === "function") } support[i + "Bubbles"] = isSupported } } return support })(); jQuery.boxModel = jQuery.support.boxModel; var rbrace = /^(?:\{.*\}|\[.*\])$/, rmultiDash = /([a-z])([A-Z])/g; jQuery.extend({ cache : {}, uuid : 0, expando : "jQuery" + (jQuery.fn.jquery + Math.random()).replace(/\D/g, ""), noData : { embed : true, object : "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", applet : true }, hasData : function (elem) { elem = elem.nodeType ? jQuery.cache[elem[jQuery.expando]] : elem[jQuery.expando]; return !!elem && !isEmptyDataObject(elem) }, data : function (elem, name, data, pvt) { if (!jQuery.acceptData(elem)) { return } var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, isNode = elem.nodeType, cache = isNode ? jQuery.cache : elem, id = isNode ? elem[jQuery.expando] : elem[jQuery.expando] && jQuery.expando; if ((!id || (pvt && id && !cache[id][internalKey])) && getByName && data === undefined) { return } if (!id) { if (isNode) { elem[jQuery.expando] = id = ++jQuery.uuid } else { id = jQuery.expando } } if (!cache[id]) { cache[id] = {}; if (!isNode) { cache[id].toJSON = jQuery.noop } } if (typeof name === "object" || typeof name === "function") { if (pvt) { cache[id][internalKey] = jQuery.extend(cache[id][internalKey], name) } else { cache[id] = jQuery.extend(cache[id], name) } } thisCache = cache[id]; if (pvt) { if (!thisCache[internalKey]) { thisCache[internalKey] = {} } thisCache = thisCache[internalKey] } if (data !== undefined) { thisCache[jQuery.camelCase(name)] = data } if (name === "events" && !thisCache[name]) { return thisCache[internalKey] && thisCache[internalKey].events } return getByName ? thisCache[jQuery.camelCase(name)] : thisCache }, removeData : function (elem, name, pvt) { if (!jQuery.acceptData(elem)) { return } var internalKey = jQuery.expando, isNode = elem.nodeType, cache = isNode ? jQuery.cache : elem, id = isNode ? elem[jQuery.expando] : jQuery.expando; if (!cache[id]) { return } if (name) { var thisCache = pvt ? cache[id][internalKey] : cache[id]; if (thisCache) { delete thisCache[name]; if (!isEmptyDataObject(thisCache)) { return } } } if (pvt) { delete cache[id][internalKey]; if (!isEmptyDataObject(cache[id])) { return } } var internalCache = cache[id][internalKey]; if (jQuery.support.deleteExpando || cache != window) { delete cache[id] } else { cache[id] = null } if (internalCache) { cache[id] = {}; if (!isNode) { cache[id].toJSON = jQuery.noop } cache[id][internalKey] = internalCache } else { if (isNode) { if (jQuery.support.deleteExpando) { delete elem[jQuery.expando] } else { if (elem.removeAttribute) { elem.removeAttribute(jQuery.expando) } else { elem[jQuery.expando] = null } } } } }, _data : function (elem, name, data) { return jQuery.data(elem, name, data, true) }, acceptData : function (elem) { if (elem.nodeName) { var match = jQuery.noData[elem.nodeName.toLowerCase()]; if (match) { return !(match === true || elem.getAttribute("classid") !== match) } } return true } }); jQuery.fn.extend({ data : function (key, value) { var data = null; if (typeof key === "undefined") { if (this.length) { data = jQuery.data(this[0]); if (this[0].nodeType === 1) { var attr = this[0].attributes, name; for (var i = 0, l = attr.length; i < l; i++) { name = attr[i].name; if (name.indexOf("data-") === 0) { name = jQuery.camelCase(name.substring(5)); dataAttr(this[0], name, data[name]) } } } } return data } else { if (typeof key === "object") { return this.each(function () { jQuery.data(this, key) }) } } var parts = key.split("."); parts[1] = parts[1] ? "." + parts[1] : ""; if (value === undefined) { data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); if (data === undefined && this.length) { data = jQuery.data(this[0], key); data = dataAttr(this[0], key, data) } return data === undefined && parts[1] ? this.data(parts[0]) : data } else { return this.each(function () { var $this = jQuery(this), args = [parts[0], value]; $this.triggerHandler("setData" + parts[1] + "!", args); jQuery.data(this, key, value); $this.triggerHandler("changeData" + parts[1] + "!", args) }) } }, removeData : function (key) { return this.each(function () { jQuery.removeData(this, key) }) } }); function dataAttr(elem, key, data) { if (data === undefined && elem.nodeType === 1) { var name = "data-" + key.replace(rmultiDash, "$1-$2").toLowerCase(); data = elem.getAttribute(name); if (typeof data === "string") { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : !jQuery.isNaN(data) ? parseFloat(data) : rbrace.test(data) ? jQuery.parseJSON(data) : data } catch (e) {} jQuery.data(elem, key, data) } else { data = undefined } } return data } function isEmptyDataObject(obj) { for (var name in obj) { if (name !== "toJSON") { return false } } return true } function handleQueueMarkDefer(elem, type, src) { var deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", defer = jQuery.data(elem, deferDataKey, undefined, true); if (defer && (src === "queue" || !jQuery.data(elem, queueDataKey, undefined, true)) && (src === "mark" || !jQuery.data(elem, markDataKey, undefined, true))) { setTimeout(function () { if (!jQuery.data(elem, queueDataKey, undefined, true) && !jQuery.data(elem, markDataKey, undefined, true)) { jQuery.removeData(elem, deferDataKey, true); defer.resolve() } }, 0) } } jQuery.extend({ _mark : function (elem, type) { if (elem) { type = (type || "fx") + "mark"; jQuery.data(elem, type, (jQuery.data(elem, type, undefined, true) || 0) + 1, true) } }, _unmark : function (force, elem, type) { if (force !== true) { type = elem; elem = force; force = false } if (elem) { type = type || "fx"; var key = type + "mark", count = force ? 0 : ((jQuery.data(elem, key, undefined, true) || 1) - 1); if (count) { jQuery.data(elem, key, count, true) } else { jQuery.removeData(elem, key, true); handleQueueMarkDefer(elem, type, "mark") } } }, queue : function (elem, type, data) { if (elem) { type = (type || "fx") + "queue"; var q = jQuery.data(elem, type, undefined, true); if (data) { if (!q || jQuery.isArray(data)) { q = jQuery.data(elem, type, jQuery.makeArray(data), true) } else { q.push(data) } } return q || [] } }, dequeue : function (elem, type) { type = type || "fx"; var queue = jQuery.queue(elem, type), fn = queue.shift(), defer; if (fn === "inprogress") { fn = queue.shift() } if (fn) { if (type === "fx") { queue.unshift("inprogress") } fn.call(elem, function () { jQuery.dequeue(elem, type) }) } if (!queue.length) { jQuery.removeData(elem, type + "queue", true); handleQueueMarkDefer(elem, type, "queue") } } }); jQuery.fn.extend({ queue : function (type, data) { if (typeof type !== "string") { data = type; type = "fx" } if (data === undefined) { return jQuery.queue(this[0], type) } return this.each(function () { var queue = jQuery.queue(this, type, data); if (type === "fx" && queue[0] !== "inprogress") { jQuery.dequeue(this, type) } }) }, dequeue : function (type) { return this.each(function () { jQuery.dequeue(this, type) }) }, delay : function (time, type) { time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; type = type || "fx"; return this.queue(type, function () { var elem = this; setTimeout(function () { jQuery.dequeue(elem, type) }, time) }) }, clearQueue : function (type) { return this.queue(type || "fx", []) }, promise : function (type, object) { if (typeof type !== "string") { object = type; type = undefined } type = type || "fx"; var defer = jQuery.Deferred(), elements = this, i = elements.length, count = 1, deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", tmp; function resolve() { if (!(--count)) { defer.resolveWith(elements, [elements]) } } while (i--) { if ((tmp = jQuery.data(elements[i], deferDataKey, undefined, true) || (jQuery.data(elements[i], queueDataKey, undefined, true) || jQuery.data(elements[i], markDataKey, undefined, true)) && jQuery.data(elements[i], deferDataKey, jQuery._Deferred(), true))) { count++; tmp.done(resolve) } } resolve(); return defer.promise() } }); var rclass = /[\n\t\r]/g, rspace = /\s+/, rreturn = /\r/g, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, rinvalidChar = /\:/, formHook, boolHook; jQuery.fn.extend({ attr : function (name, value) { return jQuery.access(this, name, value, true, jQuery.attr) }, removeAttr : function (name) { return this.each(function () { jQuery.removeAttr(this, name) }) }, prop : function (name, value) { return jQuery.access(this, name, value, true, jQuery.prop) }, removeProp : function (name) { name = jQuery.propFix[name] || name; return this.each(function () { try { this[name] = undefined; delete this[name] } catch (e) {} }) }, addClass : function (value) { if (jQuery.isFunction(value)) { return this.each(function (i) { var self = jQuery(this); self.addClass(value.call(this, i, self.attr("class") || "")) }) } if (value && typeof value === "string") { var classNames = (value || "").split(rspace); for (var i = 0, l = this.length; i < l; i++) { var elem = this[i]; if (elem.nodeType === 1) { if (!elem.className) { elem.className = value } else { var className = " " + elem.className + " ", setClass = elem.className; for (var c = 0, cl = classNames.length; c < cl; c++) { if (className.indexOf(" " + classNames[c] + " ") < 0) { setClass += " " + classNames[c] } } elem.className = jQuery.trim(setClass) } } } } return this }, removeClass : function (value) { if (jQuery.isFunction(value)) { return this.each(function (i) { var self = jQuery(this); self.removeClass(value.call(this, i, self.attr("class"))) }) } if ((value && typeof value === "string") || value === undefined) { var classNames = (value || "").split(rspace); for (var i = 0, l = this.length; i < l; i++) { var elem = this[i]; if (elem.nodeType === 1 && elem.className) { if (value) { var className = (" " + elem.className + " ").replace(rclass, " "); for (var c = 0, cl = classNames.length; c < cl; c++) { className = className.replace(" " + classNames[c] + " ", " ") } elem.className = jQuery.trim(className) } else { elem.className = "" } } } } return this }, toggleClass : function (value, stateVal) { var type = typeof value, isBool = typeof stateVal === "boolean"; if (jQuery.isFunction(value)) { return this.each(function (i) { var self = jQuery(this); self.toggleClass(value.call(this, i, self.attr("class"), stateVal), stateVal) }) } return this.each(function () { if (type === "string") { var className, i = 0, self = jQuery(this), state = stateVal, classNames = value.split(rspace); while ((className = classNames[i++])) { state = isBool ? state : !self.hasClass(className); self[state ? "addClass" : "removeClass"](className) } } else { if (type === "undefined" || type === "boolean") { if (this.className) { jQuery._data(this, "__className__", this.className) } this.className = this.className || value === false ? "" : jQuery._data(this, "__className__") || "" } } }) }, hasClass : function (selector) { var className = " " + selector + " "; for (var i = 0, l = this.length; i < l; i++) { if ((" " + this[i].className + " ").replace(rclass, " ").indexOf(className) > -1) { return true } } return false }, val : function (value) { var hooks, ret, elem = this[0]; if (!arguments.length) { if (elem) { hooks = jQuery.valHooks[elem.nodeName.toLowerCase()] || jQuery.valHooks[elem.type]; if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) { return ret } return (elem.value || "").replace(rreturn, "") } return undefined } var isFunction = jQuery.isFunction(value); return this.each(function (i) { var self = jQuery(this), val; if (this.nodeType !== 1) { return } if (isFunction) { val = value.call(this, i, self.val()) } else { val = value } if (val == null) { val = "" } else { if (typeof val === "number") { val += "" } else { if (jQuery.isArray(val)) { val = jQuery.map(val, function (value) { return value == null ? "" : value + "" }) } } } hooks = jQuery.valHooks[this.nodeName.toLowerCase()] || jQuery.valHooks[this.type]; if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) { this.value = val } }) } }); jQuery.extend({ valHooks : { option : { get : function (elem) { var val = elem.attributes.value; return !val || val.specified ? elem.value : elem.text } }, select : { get : function (elem) { var value, index = elem.selectedIndex, values = [], options = elem.options, one = elem.type === "select-one"; if (index < 0) { return null } for (var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++) { var option = options[i]; if (option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) { value = jQuery(option).val(); if (one) { return value } values.push(value) } } if (one && !values.length && options.length) { return jQuery(options[index]).val() } return values }, set : function (elem, value) { var values = jQuery.makeArray(value); jQuery(elem).find("option").each(function () { this.selected = jQuery.inArray(jQuery(this).val(), values) >= 0 }); if (!values.length) { elem.selectedIndex = -1 } return values } } }, attrFn : { val : true, css : true, html : true, text : true, data : true, width : true, height : true, offset : true }, attrFix : { tabindex : "tabIndex" }, attr : function (elem, name, value, pass) { var nType = elem.nodeType; if (!elem || nType === 3 || nType === 8 || nType === 2) { return undefined } if (pass && name in jQuery.attrFn) { return jQuery(elem)[name](value) } if (!("getAttribute" in elem)) { return jQuery.prop(elem, name, value) } var ret, hooks, notxml = nType !== 1 || !jQuery.isXMLDoc(elem); name = notxml && jQuery.attrFix[name] || name; hooks = jQuery.attrHooks[name]; if (!hooks) { if (rboolean.test(name) && (typeof value === "boolean" || value === undefined || value.toLowerCase() === name.toLowerCase())) { hooks = boolHook } else { if (formHook && (jQuery.nodeName(elem, "form") || rinvalidChar.test(name))) { hooks = formHook } } } if (value !== undefined) { if (value === null) { jQuery.removeAttr(elem, name); return undefined } else { if (hooks && "set" in hooks && notxml && (ret = hooks.set(elem, value, name)) !== undefined) { return ret } else { elem.setAttribute(name, "" + value); return value } } } else { if (hooks && "get" in hooks && notxml) { return hooks.get(elem, name) } else { ret = elem.getAttribute(name); return ret === null ? undefined : ret } } }, removeAttr : function (elem, name) { var propName; if (elem.nodeType === 1) { name = jQuery.attrFix[name] || name; if (jQuery.support.getSetAttribute) { elem.removeAttribute(name) } else { jQuery.attr(elem, name, ""); elem.removeAttributeNode(elem.getAttributeNode(name)) } if (rboolean.test(name) && (propName = jQuery.propFix[name] || name)in elem) { elem[propName] = false } } }, attrHooks : { type : { set : function (elem, value) { if (rtype.test(elem.nodeName) && elem.parentNode) { jQuery.error("type property can't be changed") } else { if (!jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input")) { var val = elem.value; elem.setAttribute("type", value); if (val) { elem.value = val } return value } } } }, tabIndex : { get : function (elem) { var attributeNode = elem.getAttributeNode("tabIndex"); return attributeNode && attributeNode.specified ? parseInt(attributeNode.value, 10) : rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? 0 : undefined } } }, propFix : { tabindex : "tabIndex", readonly : "readOnly", "for" : "htmlFor", "class" : "className", maxlength : "maxLength", cellspacing : "cellSpacing", cellpadding : "cellPadding", rowspan : "rowSpan", colspan : "colSpan", usemap : "useMap", frameborder : "frameBorder", contenteditable : "contentEditable" }, prop : function (elem, name, value) { var nType = elem.nodeType; if (!elem || nType === 3 || nType === 8 || nType === 2) { return undefined } var ret, hooks, notxml = nType !== 1 || !jQuery.isXMLDoc(elem); name = notxml && jQuery.propFix[name] || name; hooks = jQuery.propHooks[name]; if (value !== undefined) { if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) { return ret } else { return (elem[name] = value) } } else { if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== undefined) { return ret } else { return elem[name] } } }, propHooks : {} }); boolHook = { get : function (elem, name) { return elem[jQuery.propFix[name] || name] ? name.toLowerCase() : undefined }, set : function (elem, value, name) { var propName; if (value === false) { jQuery.removeAttr(elem, name) } else { propName = jQuery.propFix[name] || name; if (propName in elem) { elem[propName] = value } elem.setAttribute(name, name.toLowerCase()) } return name } }; jQuery.attrHooks.value = { get : function (elem, name) { if (formHook && jQuery.nodeName(elem, "button")) { return formHook.get(elem, name) } return elem.value }, set : function (elem, value, name) { if (formHook && jQuery.nodeName(elem, "button")) { return formHook.set(elem, value, name) } elem.value = value } }; if (!jQuery.support.getSetAttribute) { jQuery.attrFix = jQuery.propFix; formHook = jQuery.attrHooks.name = jQuery.valHooks.button = { get : function (elem, name) { var ret; ret = elem.getAttributeNode(name); return ret && ret.nodeValue !== "" ? ret.nodeValue : undefined }, set : function (elem, value, name) { var ret = elem.getAttributeNode(name); if (ret) { ret.nodeValue = value; return value } } }; jQuery.each(["width", "height"], function (i, name) { jQuery.attrHooks[name] = jQuery.extend(jQuery.attrHooks[name], { set : function (elem, value) { if (value === "") { elem.setAttribute(name, "auto"); return value } } }) }) } if (!jQuery.support.hrefNormalized) { jQuery.each(["href", "src", "width", "height"], function (i, name) { jQuery.attrHooks[name] = jQuery.extend(jQuery.attrHooks[name], { get : function (elem) { var ret = elem.getAttribute(name, 2); return ret === null ? undefined : ret } }) }) } if (!jQuery.support.style) { jQuery.attrHooks.style = { get : function (elem) { return elem.style.cssText.toLowerCase() || undefined }, set : function (elem, value) { return (elem.style.cssText = "" + value) } } } if (!jQuery.support.optSelected) { jQuery.propHooks.selected = jQuery.extend(jQuery.propHooks.selected, { get : function (elem) { var parent = elem.parentNode; if (parent) { parent.selectedIndex; if (parent.parentNode) { parent.parentNode.selectedIndex } } } }) } if (!jQuery.support.checkOn) { jQuery.each(["radio", "checkbox"], function () { jQuery.valHooks[this] = { get : function (elem) { return elem.getAttribute("value") === null ? "on" : elem.value } } }) } jQuery.each(["radio", "checkbox"], function () { jQuery.valHooks[this] = jQuery.extend(jQuery.valHooks[this], { set : function (elem, value) { if (jQuery.isArray(value)) { return (elem.checked = jQuery.inArray(jQuery(elem).val(), value) >= 0) } } }) }); var hasOwn = Object.prototype.hasOwnProperty, rnamespaces = /\.(.*)$/, rformElems = /^(?:textarea|input|select)$/i, rperiod = /\./g, rspaces = / /g, rescape = /[^\w\s.|`]/g, fcleanup = function (nm) { return nm.replace(rescape, "\\$&") }; jQuery.event = { add : function (elem, types, handler, data) { if (elem.nodeType === 3 || elem.nodeType === 8) { return } if (handler === false) { handler = returnFalse } else { if (!handler) { return } } var handleObjIn, handleObj; if (handler.handler) { handleObjIn = handler; handler = handleObjIn.handler } if (!handler.guid) { handler.guid = jQuery.guid++ } var elemData = jQuery._data(elem); if (!elemData) { return } var events = elemData.events, eventHandle = elemData.handle; if (!events) { elemData.events = events = {} } if (!eventHandle) { elemData.handle = eventHandle = function (e) { return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.handle.apply(eventHandle.elem, arguments) : undefined } } eventHandle.elem = elem; types = types.split(" "); var type, i = 0, namespaces; while ((type = types[i++])) { handleObj = handleObjIn ? jQuery.extend({}, handleObjIn) : { handler : handler, data : data }; if (type.indexOf(".") > -1) { namespaces = type.split("."); type = namespaces.shift(); handleObj.namespace = namespaces.slice(0).sort().join(".") } else { namespaces = []; handleObj.namespace = "" } handleObj.type = type; if (!handleObj.guid) { handleObj.guid = handler.guid } var handlers = events[type], special = jQuery.event.special[type] || {}; if (!handlers) { handlers = events[type] = []; if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) { if (elem.addEventListener) { elem.addEventListener(type, eventHandle, false) } else { if (elem.attachEvent) { elem.attachEvent("on" + type, eventHandle) } } } } if (special.add) { special.add.call(elem, handleObj); if (!handleObj.handler.guid) { handleObj.handler.guid = handler.guid } } handlers.push(handleObj); jQuery.event.global[type] = true } elem = null }, global : {}, remove : function (elem, types, handler, pos) { if (elem.nodeType === 3 || elem.nodeType === 8) { return } if (handler === false) { handler = returnFalse } var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, elemData = jQuery.hasData(elem) && jQuery._data(elem), events = elemData && elemData.events; if (!elemData || !events) { return } if (types && types.type) { handler = types.handler; types = types.type } if (!types || typeof types === "string" && types.charAt(0) === ".") { types = types || ""; for (type in events) { jQuery.event.remove(elem, type + types) } return } types = types.split(" "); while ((type = types[i++])) { origType = type; handleObj = null; all = type.indexOf(".") < 0; namespaces = []; if (!all) { namespaces = type.split("."); type = namespaces.shift(); namespace = new RegExp("(^|\\.)" + jQuery.map(namespaces.slice(0).sort(), fcleanup).join("\\.(?:.*\\.)?") + "(\\.|$)") } eventType = events[type]; if (!eventType) { continue } if (!handler) { for (j = 0; j < eventType.length; j++) { handleObj = eventType[j]; if (all || namespace.test(handleObj.namespace)) { jQuery.event.remove(elem, origType, handleObj.handler, j); eventType.splice(j--, 1) } } continue } special = jQuery.event.special[type] || {}; for (j = pos || 0; j < eventType.length; j++) { handleObj = eventType[j]; if (handler.guid === handleObj.guid) { if (all || namespace.test(handleObj.namespace)) { if (pos == null) { eventType.splice(j--, 1) } if (special.remove) { special.remove.call(elem, handleObj) } } if (pos != null) { break } } } if (eventType.length === 0 || pos != null && eventType.length === 1) { if (!special.teardown || special.teardown.call(elem, namespaces) === false) { jQuery.removeEvent(elem, type, elemData.handle) } ret = null; delete events[type] } } if (jQuery.isEmptyObject(events)) { var handle = elemData.handle; if (handle) { handle.elem = null } delete elemData.events; delete elemData.handle; if (jQuery.isEmptyObject(elemData)) { jQuery.removeData(elem, undefined, true) } } }, customEvent : { getData : true, setData : true, changeData : true }, trigger : function (event, data, elem, onlyHandlers) { var type = event.type || event, namespaces = [], exclusive; if (type.indexOf("!") >= 0) { type = type.slice(0, -1); exclusive = true } if (type.indexOf(".") >= 0) { namespaces = type.split("."); type = namespaces.shift(); namespaces.sort() } if ((!elem || jQuery.event.customEvent[type]) && !jQuery.event.global[type]) { return } event = typeof event === "object" ? event[jQuery.expando] ? event : new jQuery.Event(type, event) : new jQuery.Event(type); event.type = type; event.exclusive = exclusive; event.namespace = namespaces.join("."); event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); if (onlyHandlers || !elem) { event.preventDefault(); event.stopPropagation() } if (!elem) { jQuery.each(jQuery.cache, function () { var internalKey = jQuery.expando, internalCache = this[internalKey]; if (internalCache && internalCache.events && internalCache.events[type]) { jQuery.event.trigger(event, data, internalCache.handle.elem) } }); return } if (elem.nodeType === 3 || elem.nodeType === 8) { return } event.result = undefined; event.target = elem; data = data ? jQuery.makeArray(data) : []; data.unshift(event); var cur = elem, ontype = type.indexOf(":") < 0 ? "on" + type : ""; do { var handle = jQuery._data(cur, "handle"); event.currentTarget = cur; if (handle) { handle.apply(cur, data) } if (ontype && jQuery.acceptData(cur) && cur[ontype] && cur[ontype].apply(cur, data) === false) { event.result = false; event.preventDefault() } cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window } while (cur && !event.isPropagationStopped()); if (!event.isDefaultPrevented()) { var old, special = jQuery.event.special[type] || {}; if ((!special._default || special._default.call(elem.ownerDocument, event) === false) && !(type === "click" && jQuery.nodeName(elem, "a")) && jQuery.acceptData(elem)) { try { if (ontype && elem[type]) { old = elem[ontype]; if (old) { elem[ontype] = null } jQuery.event.triggered = type; elem[type]() } } catch (ieError) {} if (old) { elem[ontype] = old } jQuery.event.triggered = undefined } } return event.result }, handle : function (event) { event = jQuery.event.fix(event || window.event); var handlers = ((jQuery._data(this, "events") || {})[event.type] || []).slice(0), run_all = !event.exclusive && !event.namespace, args = Array.prototype.slice.call(arguments, 0); args[0] = event; event.currentTarget = this; for (var j = 0, l = handlers.length; j < l; j++) { var handleObj = handlers[j]; if (run_all || event.namespace_re.test(handleObj.namespace)) { event.handler = handleObj.handler; event.data = handleObj.data; event.handleObj = handleObj; var ret = handleObj.handler.apply(this, args); if (ret !== undefined) { event.result = ret; if (ret === false) { event.preventDefault(); event.stopPropagation() } } if (event.isImmediatePropagationStopped()) { break } } } return event.result }, props : "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), fix : function (event) { if (event[jQuery.expando]) { return event } var originalEvent = event; event = jQuery.Event(originalEvent); for (var i = this.props.length, prop; i; ) { prop = this.props[--i]; event[prop] = originalEvent[prop] } if (!event.target) { event.target = event.srcElement || document } if (event.target.nodeType === 3) { event.target = event.target.parentNode } if (!event.relatedTarget && event.fromElement) { event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement } if (event.pageX == null && event.clientX != null) { var eventDocument = event.target.ownerDocument || document, doc = eventDocument.documentElement, body = eventDocument.body; event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0) } if (event.which == null && (event.charCode != null || event.keyCode != null)) { event.which = event.charCode != null ? event.charCode : event.keyCode } if (!event.metaKey && event.ctrlKey) { event.metaKey = event.ctrlKey } if (!event.which && event.button !== undefined) { event.which = (event.button & 1 ? 1 : (event.button & 2 ? 3 : (event.button & 4 ? 2 : 0))) } return event }, guid : 100000000, proxy : jQuery.proxy, special : { ready : { setup : jQuery.bindReady, teardown : jQuery.noop }, live : { add : function (handleObj) { jQuery.event.add(this, liveConvert(handleObj.origType, handleObj.selector), jQuery.extend({}, handleObj, { handler : liveHandler, guid : handleObj.handler.guid })) }, remove : function (handleObj) { jQuery.event.remove(this, liveConvert(handleObj.origType, handleObj.selector), handleObj) } }, beforeunload : { setup : function (data, namespaces, eventHandle) { if (jQuery.isWindow(this)) { this.onbeforeunload = eventHandle } }, teardown : function (namespaces, eventHandle) { if (this.onbeforeunload === eventHandle) { this.onbeforeunload = null } } } } }; jQuery.removeEvent = document.removeEventListener ? function (elem, type, handle) { if (elem.removeEventListener) { elem.removeEventListener(type, handle, false) } } : function (elem, type, handle) { if (elem.detachEvent) { elem.detachEvent("on" + type, handle) } }; jQuery.Event = function (src, props) { if (!this.preventDefault) { return new jQuery.Event(src, props) } if (src && src.type) { this.originalEvent = src; this.type = src.type; this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse } else { this.type = src } if (props) { jQuery.extend(this, props) } this.timeStamp = jQuery.now(); this[jQuery.expando] = true }; function returnFalse() { return false } function returnTrue() { return true } jQuery.Event.prototype = { preventDefault : function () { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if (!e) { return } if (e.preventDefault) { e.preventDefault() } else { e.returnValue = false } }, stopPropagation : function () { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if (!e) { return } if (e.stopPropagation) { e.stopPropagation() } e.cancelBubble = true }, stopImmediatePropagation : function () { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation() }, isDefaultPrevented : returnFalse, isPropagationStopped : returnFalse, isImmediatePropagationStopped : returnFalse }; var withinElement = function (event) { var parent = event.relatedTarget; event.type = event.data; try { if (parent && parent !== document && !parent.parentNode) { return } while (parent && parent !== this) { parent = parent.parentNode } if (parent !== this) { jQuery.event.handle.apply(this, arguments) } } catch (e) {} }, delegate = function (event) { event.type = event.data; jQuery.event.handle.apply(this, arguments) }; jQuery.each({ mouseenter : "mouseover", mouseleave : "mouseout" }, function (orig, fix) { jQuery.event.special[orig] = { setup : function (data) { jQuery.event.add(this, fix, data && data.selector ? delegate : withinElement, orig) }, teardown : function (data) { jQuery.event.remove(this, fix, data && data.selector ? delegate : withinElement) } } }); if (!jQuery.support.submitBubbles) { jQuery.event.special.submit = { setup : function (data, namespaces) { if (!jQuery.nodeName(this, "form")) { jQuery.event.add(this, "click.specialSubmit", function (e) { var elem = e.target, type = elem.type; if ((type === "submit" || type === "image") && jQuery(elem).closest("form").length) { trigger("submit", this, arguments) } }); jQuery.event.add(this, "keypress.specialSubmit", function (e) { var elem = e.target, type = elem.type; if ((type === "text" || type === "password") && jQuery(elem).closest("form").length && e.keyCode === 13) { trigger("submit", this, arguments) } }) } else { return false } }, teardown : function (namespaces) { jQuery.event.remove(this, ".specialSubmit") } } } if (!jQuery.support.changeBubbles) { var changeFilters, getVal = function (elem) { var type = elem.type, val = elem.value; if (type === "radio" || type === "checkbox") { val = elem.checked } else { if (type === "select-multiple") { val = elem.selectedIndex > -1 ? jQuery.map(elem.options, function (elem) { return elem.selected }).join("-") : "" } else { if (jQuery.nodeName(elem, "select")) { val = elem.selectedIndex } } } return val }, testChange = function testChange(e) { var elem = e.target, data, val; if (!rformElems.test(elem.nodeName) || elem.readOnly) { return } data = jQuery._data(elem, "_change_data"); val = getVal(elem); if (e.type !== "focusout" || elem.type !== "radio") { jQuery._data(elem, "_change_data", val) } if (data === undefined || val === data) { return } if (data != null || val) { e.type = "change"; e.liveFired = undefined; jQuery.event.trigger(e, arguments[1], elem) } }; jQuery.event.special.change = { filters : { focusout : testChange, beforedeactivate : testChange, click : function (e) { var elem = e.target, type = jQuery.nodeName(elem, "input") ? elem.type : ""; if (type === "radio" || type === "checkbox" || jQuery.nodeName(elem, "select")) { testChange.call(this, e) } }, keydown : function (e) { var elem = e.target, type = jQuery.nodeName(elem, "input") ? elem.type : ""; if ((e.keyCode === 13 && !jQuery.nodeName(elem, "textarea")) || (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || type === "select-multiple") { testChange.call(this, e) } }, beforeactivate : function (e) { var elem = e.target; jQuery._data(elem, "_change_data", getVal(elem)) } }, setup : function (data, namespaces) { if (this.type === "file") { return false } for (var type in changeFilters) { jQuery.event.add(this, type + ".specialChange", changeFilters[type]) } return rformElems.test(this.nodeName) }, teardown : function (namespaces) { jQuery.event.remove(this, ".specialChange"); return rformElems.test(this.nodeName) } }; changeFilters = jQuery.event.special.change.filters; changeFilters.focus = changeFilters.beforeactivate } function trigger(type, elem, args) { var event = jQuery.extend({}, args[0]); event.type = type; event.originalEvent = {}; event.liveFired = undefined; jQuery.event.handle.call(elem, event); if (event.isDefaultPrevented()) { args[0].preventDefault() } } if (!jQuery.support.focusinBubbles) { jQuery.each({ focus : "focusin", blur : "focusout" }, function (orig, fix) { var attaches = 0; jQuery.event.special[fix] = { setup : function () { if (attaches++ === 0) { document.addEventListener(orig, handler, true) } }, teardown : function () { if (--attaches === 0) { document.removeEventListener(orig, handler, true) } } }; function handler(donor) { var e = jQuery.event.fix(donor); e.type = fix; e.originalEvent = {}; jQuery.event.trigger(e, null, e.target); if (e.isDefaultPrevented()) { donor.preventDefault() } } }) } jQuery.each(["bind", "one"], function (i, name) { jQuery.fn[name] = function (type, data, fn) { var handler; if (typeof type === "object") { for (var key in type) { this[name](key, data, type[key], fn) } return this } if (arguments.length === 2 || data === false) { fn = data; data = undefined } if (name === "one") { handler = function (event) { jQuery(this).unbind(event, handler); return fn.apply(this, arguments) }; handler.guid = fn.guid || jQuery.guid++ } else { handler = fn } if (type === "unload" && name !== "one") { this.one(type, data, fn) } else { for (var i = 0, l = this.length; i < l; i++) { jQuery.event.add(this[i], type, handler, data) } } return this } }); jQuery.fn.extend({ unbind : function (type, fn) { if (typeof type === "object" && !type.preventDefault) { for (var key in type) { this.unbind(key, type[key]) } } else { for (var i = 0, l = this.length; i < l; i++) { jQuery.event.remove(this[i], type, fn) } } return this }, delegate : function (selector, types, data, fn) { return this.live(types, data, fn, selector) }, undelegate : function (selector, types, fn) { if (arguments.length === 0) { return this.unbind("live") } else { return this.die(types, null, fn, selector) } }, trigger : function (type, data) { return this.each(function () { jQuery.event.trigger(type, data, this) }) }, triggerHandler : function (type, data) { if (this[0]) { return jQuery.event.trigger(type, data, this[0], true) } }, toggle : function (fn) { var args = arguments, guid = fn.guid || jQuery.guid++, i = 0, toggler = function (event) { var lastToggle = (jQuery.data(this, "lastToggle" + fn.guid) || 0) % i; jQuery.data(this, "lastToggle" + fn.guid, lastToggle + 1); event.preventDefault(); return args[lastToggle].apply(this, arguments) || false }; toggler.guid = guid; while (i < args.length) { args[i++].guid = guid } return this.click(toggler) }, hover : function (fnOver, fnOut) { return this.mouseenter(fnOver).mouseleave(fnOut || fnOver) } }); var liveMap = { focus : "focusin", blur : "focusout", mouseenter : "mouseover", mouseleave : "mouseout" }; jQuery.each(["live", "die"], function (i, name) { jQuery.fn[name] = function (types, data, fn, origSelector) { var type, i = 0, match, namespaces, preType, selector = origSelector || this.selector, context = origSelector ? this : jQuery(this.context); if (typeof types === "object" && !types.preventDefault) { for (var key in types) { context[name](key, data, types[key], selector) } return this } if (name === "die" && !types && origSelector && origSelector.charAt(0) === ".") { context.unbind(origSelector); return this } if (data === false || jQuery.isFunction(data)) { fn = data || returnFalse; data = undefined } types = (types || "").split(" "); while ((type = types[i++]) != null) { match = rnamespaces.exec(type); namespaces = ""; if (match) { namespaces = match[0]; type = type.replace(rnamespaces, "") } if (type === "hover") { types.push("mouseenter" + namespaces, "mouseleave" + namespaces); continue } preType = type; if (liveMap[type]) { types.push(liveMap[type] + namespaces); type = type + namespaces } else { type = (liveMap[type] || type) + namespaces } if (name === "live") { for (var j = 0, l = context.length; j < l; j++) { jQuery.event.add(context[j], "live." + liveConvert(type, selector), { data : data, selector : selector, handler : fn, origType : type, origHandler : fn, preType : preType }) } } else { context.unbind("live." + liveConvert(type, selector), fn) } } return this } }); function liveHandler(event) { var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, elems = [], selectors = [], events = jQuery._data(this, "events"); if (event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click") { return } if (event.namespace) { namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)") } event.liveFired = this; var live = events.live.slice(0); for (j = 0; j < live.length; j++) { handleObj = live[j]; if (handleObj.origType.replace(rnamespaces, "") === event.type) { selectors.push(handleObj.selector) } else { live.splice(j--, 1) } } match = jQuery(event.target).closest(selectors, event.currentTarget); for (i = 0, l = match.length; i < l; i++) { close = match[i]; for (j = 0; j < live.length; j++) { handleObj = live[j]; if (close.selector === handleObj.selector && (!namespace || namespace.test(handleObj.namespace)) && !close.elem.disabled) { elem = close.elem; related = null; if (handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave") { event.type = handleObj.preType; related = jQuery(event.relatedTarget).closest(handleObj.selector)[0]; if (related && jQuery.contains(elem, related)) { related = elem } } if (!related || related !== elem) { elems.push({ elem : elem, handleObj : handleObj, level : close.level }) } } } } for (i = 0, l = elems.length; i < l; i++) { match = elems[i]; if (maxLevel && match.level > maxLevel) { break } event.currentTarget = match.elem; event.data = match.handleObj.data; event.handleObj = match.handleObj; ret = match.handleObj.origHandler.apply(match.elem, arguments); if (ret === false || event.isPropagationStopped()) { maxLevel = match.level; if (ret === false) { stop = false } if (event.isImmediatePropagationStopped()) { break } } } return stop } function liveConvert(type, selector) { return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&") } jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error").split(" "), function (i, name) { jQuery.fn[name] = function (data, fn) { if (fn == null) { fn = data; data = null } return arguments.length > 0 ? this.bind(name, data, fn) : this.trigger(name) }; if (jQuery.attrFn) { jQuery.attrFn[name] = true } }); /* * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function () { var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true, rBackslash = /\\/g, rNonWord = /\W/; [0, 0].sort(function () { baseHasDuplicate = false; return 0 }); var Sizzle = function (selector, context, results, seed) { results = results || []; context = context || document; var origContext = context; if (context.nodeType !== 1 && context.nodeType !== 9) { return [] } if (!selector || typeof selector !== "string") { return results } var m, set, checkSet, extra, ret, cur, pop, i, prune = true, contextXML = Sizzle.isXML(context), parts = [], soFar = selector; do { chunker.exec(""); m = chunker.exec(soFar); if (m) { soFar = m[3]; parts.push(m[1]); if (m[2]) { extra = m[3]; break } } } while (m); if (parts.length > 1 && origPOS.exec(selector)) { if (parts.length === 2 && Expr.relative[parts[0]]) { set = posProcess(parts[0] + parts[1], context) } else { set = Expr.relative[parts[0]] ? [context] : Sizzle(parts.shift(), context); while (parts.length) { selector = parts.shift(); if (Expr.relative[selector]) { selector += parts.shift() } set = posProcess(selector, set) } } } else { if (!seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1])) { ret = Sizzle.find(parts.shift(), context, contextXML); context = ret.expr ? Sizzle.filter(ret.expr, ret.set)[0] : ret.set[0] } if (context) { ret = seed ? { expr : parts.pop(), set : makeArray(seed) } : Sizzle.find(parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML); set = ret.expr ? Sizzle.filter(ret.expr, ret.set) : ret.set; if (parts.length > 0) { checkSet = makeArray(set) } else { prune = false } while (parts.length) { cur = parts.pop(); pop = cur; if (!Expr.relative[cur]) { cur = "" } else { pop = parts.pop() } if (pop == null) { pop = context } Expr.relative[cur](checkSet, pop, contextXML) } } else { checkSet = parts = [] } } if (!checkSet) { checkSet = set } if (!checkSet) { Sizzle.error(cur || selector) } if (toString.call(checkSet) === "[object Array]") { if (!prune) { results.push.apply(results, checkSet) } else { if (context && context.nodeType === 1) { for (i = 0; checkSet[i] != null; i++) { if (checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i]))) { results.push(set[i]) } } } else { for (i = 0; checkSet[i] != null; i++) { if (checkSet[i] && checkSet[i].nodeType === 1) { results.push(set[i]) } } } } } else { makeArray(checkSet, results) } if (extra) { Sizzle(extra, origContext, results, seed); Sizzle.uniqueSort(results) } return results }; Sizzle.uniqueSort = function (results) { if (sortOrder) { hasDuplicate = baseHasDuplicate; results.sort(sortOrder); if (hasDuplicate) { for (var i = 1; i < results.length; i++) { if (results[i] === results[i - 1]) { results.splice(i--, 1) } } } } return results }; Sizzle.matches = function (expr, set) { return Sizzle(expr, null, null, set) }; Sizzle.matchesSelector = function (node, expr) { return Sizzle(expr, null, null, [node]).length > 0 }; Sizzle.find = function (expr, context, isXML) { var set; if (!expr) { return [] } for (var i = 0, l = Expr.order.length; i < l; i++) { var match, type = Expr.order[i]; if ((match = Expr.leftMatch[type].exec(expr))) { var left = match[1]; match.splice(1, 1); if (left.substr(left.length - 1) !== "\\") { match[1] = (match[1] || "").replace(rBackslash, ""); set = Expr.find[type](match, context, isXML); if (set != null) { expr = expr.replace(Expr.match[type], ""); break } } } } if (!set) { set = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName("*") : [] } return { set : set, expr : expr } }; Sizzle.filter = function (expr, set, inplace, not) { var match, anyFound, old = expr, result = [], curLoop = set, isXMLFilter = set && set[0] && Sizzle.isXML(set[0]); while (expr && set.length) { for (var type in Expr.filter) { if ((match = Expr.leftMatch[type].exec(expr)) != null && match[2]) { var found, item, filter = Expr.filter[type], left = match[1]; anyFound = false; match.splice(1, 1); if (left.substr(left.length - 1) === "\\") { continue } if (curLoop === result) { result = [] } if (Expr.preFilter[type]) { match = Expr.preFilter[type](match, curLoop, inplace, result, not, isXMLFilter); if (!match) { anyFound = found = true } else { if (match === true) { continue } } } if (match) { for (var i = 0; (item = curLoop[i]) != null; i++) { if (item) { found = filter(item, match, i, curLoop); var pass = not^!!found; if (inplace && found != null) { if (pass) { anyFound = true } else { curLoop[i] = false } } else { if (pass) { result.push(item); anyFound = true } } } } } if (found !== undefined) { if (!inplace) { curLoop = result } expr = expr.replace(Expr.match[type], ""); if (!anyFound) { return [] } break } } } if (expr === old) { if (anyFound == null) { Sizzle.error(expr) } else { break } } old = expr } return curLoop }; Sizzle.error = function (msg) { throw "Syntax error, unrecognized expression: " + msg }; var Expr = Sizzle.selectors = { order : ["ID", "NAME", "TAG"], match : { ID : /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS : /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME : /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, ATTR : /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG : /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, CHILD : /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS : /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO : /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, leftMatch : {}, attrMap : { "class" : "className", "for" : "htmlFor" }, attrHandle : { href : function (elem) { return elem.getAttribute("href") }, type : function (elem) { return elem.getAttribute("type") } }, relative : { "+" : function (checkSet, part) { var isPartStr = typeof part === "string", isTag = isPartStr && !rNonWord.test(part), isPartStrNotTag = isPartStr && !isTag; if (isTag) { part = part.toLowerCase() } for (var i = 0, l = checkSet.length, elem; i < l; i++) { if ((elem = checkSet[i])) { while ((elem = elem.previousSibling) && elem.nodeType !== 1) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part } } if (isPartStrNotTag) { Sizzle.filter(part, checkSet, true) } }, ">" : function (checkSet, part) { var elem, isPartStr = typeof part === "string", i = 0, l = checkSet.length; if (isPartStr && !rNonWord.test(part)) { part = part.toLowerCase(); for (; i < l; i++) { elem = checkSet[i]; if (elem) { var parent = elem.parentNode; checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false } } } else { for (; i < l; i++) { elem = checkSet[i]; if (elem) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part } } if (isPartStr) { Sizzle.filter(part, checkSet, true) } } }, "" : function (checkSet, part, isXML) { var nodeCheck, doneName = done++, checkFn = dirCheck; if (typeof part === "string" && !rNonWord.test(part)) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck } checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML) }, "~" : function (checkSet, part, isXML) { var nodeCheck, doneName = done++, checkFn = dirCheck; if (typeof part === "string" && !rNonWord.test(part)) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck } checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML) } }, find : { ID : function (match, context, isXML) { if (typeof context.getElementById !== "undefined" && !isXML) { var m = context.getElementById(match[1]); return m && m.parentNode ? [m] : [] } }, NAME : function (match, context) { if (typeof context.getElementsByName !== "undefined") { var ret = [], results = context.getElementsByName(match[1]); for (var i = 0, l = results.length; i < l; i++) { if (results[i].getAttribute("name") === match[1]) { ret.push(results[i]) } } return ret.length === 0 ? null : ret } }, TAG : function (match, context) { if (typeof context.getElementsByTagName !== "undefined") { return context.getElementsByTagName(match[1]) } } }, preFilter : { CLASS : function (match, curLoop, inplace, result, not, isXML) { match = " " + match[1].replace(rBackslash, "") + " "; if (isXML) { return match } for (var i = 0, elem; (elem = curLoop[i]) != null; i++) { if (elem) { if (not^(elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0)) { if (!inplace) { result.push(elem) } } else { if (inplace) { curLoop[i] = false } } } } return false }, ID : function (match) { return match[1].replace(rBackslash, "") }, TAG : function (match, curLoop) { return match[1].replace(rBackslash, "").toLowerCase() }, CHILD : function (match) { if (match[1] === "nth") { if (!match[2]) { Sizzle.error(match[0]) } match[2] = match[2].replace(/^\+|\s*/g, ""); var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test(match[2]) && "0n+" + match[2] || match[2]); match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0 } else { if (match[2]) { Sizzle.error(match[0]) } } match[0] = done++; return match }, ATTR : function (match, curLoop, inplace, result, not, isXML) { var name = match[1] = match[1].replace(rBackslash, ""); if (!isXML && Expr.attrMap[name]) { match[1] = Expr.attrMap[name] } match[4] = (match[4] || match[5] || "").replace(rBackslash, ""); if (match[2] === "~=") { match[4] = " " + match[4] + " " } return match }, PSEUDO : function (match, curLoop, inplace, result, not) { if (match[1] === "not") { if ((chunker.exec(match[3]) || "").length > 1 || /^\w/.test(match[3])) { match[3] = Sizzle(match[3], null, null, curLoop) } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true^not); if (!inplace) { result.push.apply(result, ret) } return false } } else { if (Expr.match.POS.test(match[0]) || Expr.match.CHILD.test(match[0])) { return true } } return match }, POS : function (match) { match.unshift(true); return match } }, filters : { enabled : function (elem) { return elem.disabled === false && elem.type !== "hidden" }, disabled : function (elem) { return elem.disabled === true }, checked : function (elem) { return elem.checked === true }, selected : function (elem) { if (elem.parentNode) { elem.parentNode.selectedIndex } return elem.selected === true }, parent : function (elem) { return !!elem.firstChild }, empty : function (elem) { return !elem.firstChild }, has : function (elem, i, match) { return !!Sizzle(match[3], elem).length }, header : function (elem) { return (/h\d/i).test(elem.nodeName) }, text : function (elem) { var attr = elem.getAttribute("type"), type = elem.type; return elem.nodeName.toLowerCase() === "input" && "text" === type && (attr === type || attr === null) }, radio : function (elem) { return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type }, checkbox : function (elem) { return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type }, file : function (elem) { return elem.nodeName.toLowerCase() === "input" && "file" === elem.type }, password : function (elem) { return elem.nodeName.toLowerCase() === "input" && "password" === elem.type }, submit : function (elem) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "submit" === elem.type }, image : function (elem) { return elem.nodeName.toLowerCase() === "input" && "image" === elem.type }, reset : function (elem) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "reset" === elem.type }, button : function (elem) { var name = elem.nodeName.toLowerCase(); return name === "input" && "button" === elem.type || name === "button" }, input : function (elem) { return (/input|select|textarea|button/i).test(elem.nodeName) }, focus : function (elem) { return elem === elem.ownerDocument.activeElement } }, setFilters : { first : function (elem, i) { return i === 0 }, last : function (elem, i, match, array) { return i === array.length - 1 }, even : function (elem, i) { return i % 2 === 0 }, odd : function (elem, i) { return i % 2 === 1 }, lt : function (elem, i, match) { return i < match[3] - 0 }, gt : function (elem, i, match) { return i > match[3] - 0 }, nth : function (elem, i, match) { return match[3] - 0 === i }, eq : function (elem, i, match) { return match[3] - 0 === i } }, filter : { PSEUDO : function (elem, match, i, array) { var name = match[1], filter = Expr.filters[name]; if (filter) { return filter(elem, i, match, array) } else { if (name === "contains") { return (elem.textContent || elem.innerText || Sizzle.getText([elem]) || "").indexOf(match[3]) >= 0 } else { if (name === "not") { var not = match[3]; for (var j = 0, l = not.length; j < l; j++) { if (not[j] === elem) { return false } } return true } else { Sizzle.error(name) } } } }, CHILD : function (elem, match) { var type = match[1], node = elem; switch (type) { case "only": case "first": while ((node = node.previousSibling)) { if (node.nodeType === 1) { return false } } if (type === "first") { return true } node = elem; case "last": while ((node = node.nextSibling)) { if (node.nodeType === 1) { return false } } return true; case "nth": var first = match[2], last = match[3]; if (first === 1 && last === 0) { return true } var doneName = match[0], parent = elem.parentNode; if (parent && (parent.sizcache !== doneName || !elem.nodeIndex)) { var count = 0; for (node = parent.firstChild; node; node = node.nextSibling) { if (node.nodeType === 1) { node.nodeIndex = ++count } } parent.sizcache = doneName } var diff = elem.nodeIndex - last; if (first === 0) { return diff === 0 } else { return (diff % first === 0 && diff / first >= 0) } } }, ID : function (elem, match) { return elem.nodeType === 1 && elem.getAttribute("id") === match }, TAG : function (elem, match) { return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match }, CLASS : function (elem, match) { return (" " + (elem.className || elem.getAttribute("class")) + " ").indexOf(match) > -1 }, ATTR : function (elem, match) { var name = match[1], result = Expr.attrHandle[name] ? Expr.attrHandle[name](elem) : elem[name] != null ? elem[name] : elem.getAttribute(name), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false }, POS : function (elem, match, i, array) { var name = match[2], filter = Expr.setFilters[name]; if (filter) { return filter(elem, i, match, array) } } } }; var origPOS = Expr.match.POS, fescape = function (all, num) { return "\\" + (num - 0 + 1) }; for (var type in Expr.match) { Expr.match[type] = new RegExp(Expr.match[type].source + (/(?![^\[]*\])(?![^\(]*\))/.source)); Expr.leftMatch[type] = new RegExp(/(^(?:.|\r|\n)*?)/.source + Expr.match[type].source.replace(/\\(\d+)/g, fescape)) } var makeArray = function (array, results) { array = Array.prototype.slice.call(array, 0); if (results) { results.push.apply(results, array); return results } return array }; try { Array.prototype.slice.call(document.documentElement.childNodes, 0)[0].nodeType } catch (e) { makeArray = function (array, results) { var i = 0, ret = results || []; if (toString.call(array) === "[object Array]") { Array.prototype.push.apply(ret, array) } else { if (typeof array.length === "number") { for (var l = array.length; i < l; i++) { ret.push(array[i]) } } else { for (; array[i]; i++) { ret.push(array[i]) } } } return ret } } var sortOrder, siblingCheck; if (document.documentElement.compareDocumentPosition) { sortOrder = function (a, b) { if (a === b) { hasDuplicate = true; return 0 } if (!a.compareDocumentPosition || !b.compareDocumentPosition) { return a.compareDocumentPosition ? -1 : 1 } return a.compareDocumentPosition(b) & 4 ? -1 : 1 } } else { sortOrder = function (a, b) { if (a === b) { hasDuplicate = true; return 0 } else { if (a.sourceIndex && b.sourceIndex) { return a.sourceIndex - b.sourceIndex } } var al, bl, ap = [], bp = [], aup = a.parentNode, bup = b.parentNode, cur = aup; if (aup === bup) { return siblingCheck(a, b) } else { if (!aup) { return -1 } else { if (!bup) { return 1 } } } while (cur) { ap.unshift(cur); cur = cur.parentNode } cur = bup; while (cur) { bp.unshift(cur); cur = cur.parentNode } al = ap.length; bl = bp.length; for (var i = 0; i < al && i < bl; i++) { if (ap[i] !== bp[i]) { return siblingCheck(ap[i], bp[i]) } } return i === al ? siblingCheck(a, bp[i], -1) : siblingCheck(ap[i], b, 1) }; siblingCheck = function (a, b, ret) { if (a === b) { return ret } var cur = a.nextSibling; while (cur) { if (cur === b) { return -1 } cur = cur.nextSibling } return 1 } } Sizzle.getText = function (elems) { var ret = "", elem; for (var i = 0; elems[i]; i++) { elem = elems[i]; if (elem.nodeType === 3 || elem.nodeType === 4) { ret += elem.nodeValue } else { if (elem.nodeType !== 8) { ret += Sizzle.getText(elem.childNodes) } } } return ret }; (function () { var form = document.createElement("div"), id = "script" + (new Date()).getTime(), root = document.documentElement; form.innerHTML = ""; root.insertBefore(form, root.firstChild); if (document.getElementById(id)) { Expr.find.ID = function (match, context, isXML) { if (typeof context.getElementById !== "undefined" && !isXML) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [] } }; Expr.filter.ID = function (elem, match) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match } } root.removeChild(form); root = form = null })(); (function () { var div = document.createElement("div"); div.appendChild(document.createComment("")); if (div.getElementsByTagName("*").length > 0) { Expr.find.TAG = function (match, context) { var results = context.getElementsByTagName(match[1]); if (match[1] === "*") { var tmp = []; for (var i = 0; results[i]; i++) { if (results[i].nodeType === 1) { tmp.push(results[i]) } } results = tmp } return results } } div.innerHTML = ""; if (div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#") { Expr.attrHandle.href = function (elem) { return elem.getAttribute("href", 2) } } div = null })(); if (document.querySelectorAll) { (function () { var oldSizzle = Sizzle, div = document.createElement("div"), id = "__sizzle__"; div.innerHTML = "

"; if (div.querySelectorAll && div.querySelectorAll(".TEST").length === 0) { return } Sizzle = function (query, context, extra, seed) { context = context || document; if (!seed && !Sizzle.isXML(context)) { var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(query); if (match && (context.nodeType === 1 || context.nodeType === 9)) { if (match[1]) { return makeArray(context.getElementsByTagName(query), extra) } else { if (match[2] && Expr.find.CLASS && context.getElementsByClassName) { return makeArray(context.getElementsByClassName(match[2]), extra) } } } if (context.nodeType === 9) { if (query === "body" && context.body) { return makeArray([context.body], extra) } else { if (match && match[3]) { var elem = context.getElementById(match[3]); if (elem && elem.parentNode) { if (elem.id === match[3]) { return makeArray([elem], extra) } } else { return makeArray([], extra) } } } try { return makeArray(context.querySelectorAll(query), extra) } catch (qsaError) {} } else { if (context.nodeType === 1 && context.nodeName.toLowerCase() !== "object") { var oldContext = context, old = context.getAttribute("id"), nid = old || id, hasParent = context.parentNode, relativeHierarchySelector = /^\s*[+~]/.test(query); if (!old) { context.setAttribute("id", nid) } else { nid = nid.replace(/'/g, "\\$&") } if (relativeHierarchySelector && hasParent) { context = context.parentNode } try { if (!relativeHierarchySelector || hasParent) { return makeArray(context.querySelectorAll("[id='" + nid + "'] " + query), extra) } } catch (pseudoError) {} finally { if (!old) { oldContext.removeAttribute("id") } } } } } return oldSizzle(query, context, extra, seed) }; for (var prop in oldSizzle) { Sizzle[prop] = oldSizzle[prop] } div = null })() } (function () { var html = document.documentElement, matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; if (matches) { var disconnectedMatch = !matches.call(document.createElement("div"), "div"), pseudoWorks = false; try { matches.call(document.documentElement, "[test!='']:sizzle") } catch (pseudoError) { pseudoWorks = true } Sizzle.matchesSelector = function (node, expr) { expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); if (!Sizzle.isXML(node)) { try { if (pseudoWorks || !Expr.match.PSEUDO.test(expr) && !/!=/.test(expr)) { var ret = matches.call(node, expr); if (ret || !disconnectedMatch || node.document && node.document.nodeType !== 11) { return ret } } } catch (e) {} } return Sizzle(expr, null, null, [node]).length > 0 } } })(); (function () { var div = document.createElement("div"); div.innerHTML = "
"; if (!div.getElementsByClassName || div.getElementsByClassName("e").length === 0) { return } div.lastChild.className = "e"; if (div.getElementsByClassName("e").length === 1) { return } Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function (match, context, isXML) { if (typeof context.getElementsByClassName !== "undefined" && !isXML) { return context.getElementsByClassName(match[1]) } }; div = null })(); function dirNodeCheck(dir, cur, doneName, checkSet, nodeCheck, isXML) { for (var i = 0, l = checkSet.length; i < l; i++) { var elem = checkSet[i]; if (elem) { var match = false; elem = elem[dir]; while (elem) { if (elem.sizcache === doneName) { match = checkSet[elem.sizset]; break } if (elem.nodeType === 1 && !isXML) { elem.sizcache = doneName; elem.sizset = i } if (elem.nodeName.toLowerCase() === cur) { match = elem; break } elem = elem[dir] } checkSet[i] = match } } } function dirCheck(dir, cur, doneName, checkSet, nodeCheck, isXML) { for (var i = 0, l = checkSet.length; i < l; i++) { var elem = checkSet[i]; if (elem) { var match = false; elem = elem[dir]; while (elem) { if (elem.sizcache === doneName) { match = checkSet[elem.sizset]; break } if (elem.nodeType === 1) { if (!isXML) { elem.sizcache = doneName; elem.sizset = i } if (typeof cur !== "string") { if (elem === cur) { match = true; break } } else { if (Sizzle.filter(cur, [elem]).length > 0) { match = elem; break } } } elem = elem[dir] } checkSet[i] = match } } } if (document.documentElement.contains) { Sizzle.contains = function (a, b) { return a !== b && (a.contains ? a.contains(b) : true) } } else { if (document.documentElement.compareDocumentPosition) { Sizzle.contains = function (a, b) { return !!(a.compareDocumentPosition(b) & 16) } } else { Sizzle.contains = function () { return false } } } Sizzle.isXML = function (elem) { var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false }; var posProcess = function (selector, context) { var match, tmpSet = [], later = "", root = context.nodeType ? [context] : context; while ((match = Expr.match.PSEUDO.exec(selector))) { later += match[0]; selector = selector.replace(Expr.match.PSEUDO, "") } selector = Expr.relative[selector] ? selector + "*" : selector; for (var i = 0, l = root.length; i < l; i++) { Sizzle(selector, root[i], tmpSet) } return Sizzle.filter(later, tmpSet) }; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains })(); var runtil = /Until$/, rparentsprev = /^(?:parents|prevUntil|prevAll)/, rmultiselector = /,/, isSimple = /^.[^:#\[\.,]*$/, slice = Array.prototype.slice, POS = jQuery.expr.match.POS, guaranteedUnique = { children : true, contents : true, next : true, prev : true }; jQuery.fn.extend({ find : function (selector) { var self = this, i, l; if (typeof selector !== "string") { return jQuery(selector).filter(function () { for (i = 0, l = self.length; i < l; i++) { if (jQuery.contains(self[i], this)) { return true } } }) } var ret = this.pushStack("", "find", selector), length, n, r; for (i = 0, l = this.length; i < l; i++) { length = ret.length; jQuery.find(selector, this[i], ret); if (i > 0) { for (n = length; n < ret.length; n++) { for (r = 0; r < length; r++) { if (ret[r] === ret[n]) { ret.splice(n--, 1); break } } } } } return ret }, has : function (target) { var targets = jQuery(target); return this.filter(function () { for (var i = 0, l = targets.length; i < l; i++) { if (jQuery.contains(this, targets[i])) { return true } } }) }, not : function (selector) { return this.pushStack(winnow(this, selector, false), "not", selector) }, filter : function (selector) { return this.pushStack(winnow(this, selector, true), "filter", selector) }, is : function (selector) { return !!selector && (typeof selector === "string" ? jQuery.filter(selector, this).length > 0 : this.filter(selector).length > 0) }, closest : function (selectors, context) { var ret = [], i, l, cur = this[0]; if (jQuery.isArray(selectors)) { var match, selector, matches = {}, level = 1; if (cur && selectors.length) { for (i = 0, l = selectors.length; i < l; i++) { selector = selectors[i]; if (!matches[selector]) { matches[selector] = POS.test(selector) ? jQuery(selector, context || this.context) : selector } } while (cur && cur.ownerDocument && cur !== context) { for (selector in matches) { match = matches[selector]; if (match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match)) { ret.push({ selector : selector, elem : cur, level : level }) } } cur = cur.parentNode; level++ } } return ret } var pos = POS.test(selectors) || typeof selectors !== "string" ? jQuery(selectors, context || this.context) : 0; for (i = 0, l = this.length; i < l; i++) { cur = this[i]; while (cur) { if (pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors)) { ret.push(cur); break } else { cur = cur.parentNode; if (!cur || !cur.ownerDocument || cur === context || cur.nodeType === 11) { break } } } } ret = ret.length > 1 ? jQuery.unique(ret) : ret; return this.pushStack(ret, "closest", selectors) }, index : function (elem) { if (!elem || typeof elem === "string") { return jQuery.inArray(this[0], elem ? jQuery(elem) : this.parent().children()) } return jQuery.inArray(elem.jquery ? elem[0] : elem, this) }, add : function (selector, context) { var set = typeof selector === "string" ? jQuery(selector, context) : jQuery.makeArray(selector && selector.nodeType ? [selector] : selector), all = jQuery.merge(this.get(), set); return this.pushStack(isDisconnected(set[0]) || isDisconnected(all[0]) ? all : jQuery.unique(all)) }, andSelf : function () { return this.add(this.prevObject) } }); function isDisconnected(node) { return !node || !node.parentNode || node.parentNode.nodeType === 11 } jQuery.each({ parent : function (elem) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null }, parents : function (elem) { return jQuery.dir(elem, "parentNode") }, parentsUntil : function (elem, i, until) { return jQuery.dir(elem, "parentNode", until) }, next : function (elem) { return jQuery.nth(elem, 2, "nextSibling") }, prev : function (elem) { return jQuery.nth(elem, 2, "previousSibling") }, nextAll : function (elem) { return jQuery.dir(elem, "nextSibling") }, prevAll : function (elem) { return jQuery.dir(elem, "previousSibling") }, nextUntil : function (elem, i, until) { return jQuery.dir(elem, "nextSibling", until) }, prevUntil : function (elem, i, until) { return jQuery.dir(elem, "previousSibling", until) }, siblings : function (elem) { return jQuery.sibling(elem.parentNode.firstChild, elem) }, children : function (elem) { return jQuery.sibling(elem.firstChild) }, contents : function (elem) { return jQuery.nodeName(elem, "iframe") ? elem.contentDocument || elem.contentWindow.document : jQuery.makeArray(elem.childNodes) } }, function (name, fn) { jQuery.fn[name] = function (until, selector) { var ret = jQuery.map(this, fn, until), args = slice.call(arguments); if (!runtil.test(name)) { selector = until } if (selector && typeof selector === "string") { ret = jQuery.filter(selector, ret) } ret = this.length > 1 && !guaranteedUnique[name] ? jQuery.unique(ret) : ret; if ((this.length > 1 || rmultiselector.test(selector)) && rparentsprev.test(name)) { ret = ret.reverse() } return this.pushStack(ret, name, args.join(",")) } }); jQuery.extend({ filter : function (expr, elems, not) { if (not) { expr = ":not(" + expr + ")" } return elems.length === 1 ? jQuery.find.matchesSelector(elems[0], expr) ? [elems[0]] : [] : jQuery.find.matches(expr, elems) }, dir : function (elem, dir, until) { var matched = [], cur = elem[dir]; while (cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery(cur).is(until))) { if (cur.nodeType === 1) { matched.push(cur) } cur = cur[dir] } return matched }, nth : function (cur, result, dir, elem) { result = result || 1; var num = 0; for (; cur; cur = cur[dir]) { if (cur.nodeType === 1 && ++num === result) { break } } return cur }, sibling : function (n, elem) { var r = []; for (; n; n = n.nextSibling) { if (n.nodeType === 1 && n !== elem) { r.push(n) } } return r } }); function winnow(elements, qualifier, keep) { qualifier = qualifier || 0; if (jQuery.isFunction(qualifier)) { return jQuery.grep(elements, function (elem, i) { var retVal = !!qualifier.call(elem, i, elem); return retVal === keep }) } else { if (qualifier.nodeType) { return jQuery.grep(elements, function (elem, i) { return (elem === qualifier) === keep }) } else { if (typeof qualifier === "string") { var filtered = jQuery.grep(elements, function (elem) { return elem.nodeType === 1 }); if (isSimple.test(qualifier)) { return jQuery.filter(qualifier, filtered, !keep) } else { qualifier = jQuery.filter(qualifier, filtered) } } } } return jQuery.grep(elements, function (elem, i) { return (jQuery.inArray(elem, qualifier) >= 0) === keep }) } var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, rtagName = /<([\w:]+)/, rtbody = /", ""], legend : [1, "
", "
"], thead : [1, "", "
"], tr : [2, "", "
"], td : [3, "", "
"], col : [2, "", "
"], area : [1, "", ""], _default : [0, "", ""] }; wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; if (!jQuery.support.htmlSerialize) { wrapMap._default = [1, "div
", "
"] } jQuery.fn.extend({ text : function (text) { if (jQuery.isFunction(text)) { return this.each(function (i) { var self = jQuery(this); self.text(text.call(this, i, self.text())) }) } if (typeof text !== "object" && text !== undefined) { return this.empty().append((this[0] && this[0].ownerDocument || document).createTextNode(text)) } return jQuery.text(this) }, wrapAll : function (html) { if (jQuery.isFunction(html)) { return this.each(function (i) { jQuery(this).wrapAll(html.call(this, i)) }) } if (this[0]) { var wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true); if (this[0].parentNode) { wrap.insertBefore(this[0]) } wrap.map(function () { var elem = this; while (elem.firstChild && elem.firstChild.nodeType === 1) { elem = elem.firstChild } return elem }).append(this) } return this }, wrapInner : function (html) { if (jQuery.isFunction(html)) { return this.each(function (i) { jQuery(this).wrapInner(html.call(this, i)) }) } return this.each(function () { var self = jQuery(this), contents = self.contents(); if (contents.length) { contents.wrapAll(html) } else { self.append(html) } }) }, wrap : function (html) { return this.each(function () { jQuery(this).wrapAll(html) }) }, unwrap : function () { return this.parent().each(function () { if (!jQuery.nodeName(this, "body")) { jQuery(this).replaceWith(this.childNodes) } }).end() }, append : function () { return this.domManip(arguments, true, function (elem) { if (this.nodeType === 1) { this.appendChild(elem) } }) }, prepend : function () { return this.domManip(arguments, true, function (elem) { if (this.nodeType === 1) { this.insertBefore(elem, this.firstChild) } }) }, before : function () { if (this[0] && this[0].parentNode) { return this.domManip(arguments, false, function (elem) { this.parentNode.insertBefore(elem, this) }) } else { if (arguments.length) { var set = jQuery(arguments[0]); set.push.apply(set, this.toArray()); return this.pushStack(set, "before", arguments) } } }, after : function () { if (this[0] && this[0].parentNode) { return this.domManip(arguments, false, function (elem) { this.parentNode.insertBefore(elem, this.nextSibling) }) } else { if (arguments.length) { var set = this.pushStack(this, "after", arguments); set.push.apply(set, jQuery(arguments[0]).toArray()); return set } } }, remove : function (selector, keepData) { for (var i = 0, elem; (elem = this[i]) != null; i++) { if (!selector || jQuery.filter(selector, [elem]).length) { if (!keepData && elem.nodeType === 1) { jQuery.cleanData(elem.getElementsByTagName("*")); jQuery.cleanData([elem]) } if (elem.parentNode) { elem.parentNode.removeChild(elem) } } } return this }, empty : function () { for (var i = 0, elem; (elem = this[i]) != null; i++) { if (elem.nodeType === 1) { jQuery.cleanData(elem.getElementsByTagName("*")) } while (elem.firstChild) { elem.removeChild(elem.firstChild) } } return this }, clone : function (dataAndEvents, deepDataAndEvents) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map(function () { return jQuery.clone(this, dataAndEvents, deepDataAndEvents) }) }, html : function (value) { if (value === undefined) { return this[0] && this[0].nodeType === 1 ? this[0].innerHTML.replace(rinlinejQuery, "") : null } else { if (typeof value === "string" && !rnocache.test(value) && (jQuery.support.leadingWhitespace || !rleadingWhitespace.test(value)) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) { value = value.replace(rxhtmlTag, "<$1>"); try { for (var i = 0, l = this.length; i < l; i++) { if (this[i].nodeType === 1) { jQuery.cleanData(this[i].getElementsByTagName("*")); this[i].innerHTML = value } } } catch (e) { this.empty().append(value) } } else { if (jQuery.isFunction(value)) { this.each(function (i) { var self = jQuery(this); self.html(value.call(this, i, self.html())) }) } else { this.empty().append(value) } } } return this }, replaceWith : function (value) { if (this[0] && this[0].parentNode) { if (jQuery.isFunction(value)) { return this.each(function (i) { var self = jQuery(this), old = self.html(); self.replaceWith(value.call(this, i, old)) }) } if (typeof value !== "string") { value = jQuery(value).detach() } return this.each(function () { var next = this.nextSibling, parent = this.parentNode; jQuery(this).remove(); if (next) { jQuery(next).before(value) } else { jQuery(parent).append(value) } }) } else { return this.length ? this.pushStack(jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value) : this } }, detach : function (selector) { return this.remove(selector, true) }, domManip : function (args, table, callback) { var results, first, fragment, parent, value = args[0], scripts = []; if (!jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test(value)) { return this.each(function () { jQuery(this).domManip(args, table, callback, true) }) } if (jQuery.isFunction(value)) { return this.each(function (i) { var self = jQuery(this); args[0] = value.call(this, i, table ? self.html() : undefined); self.domManip(args, table, callback) }) } if (this[0]) { parent = value && value.parentNode; if (jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length) { results = { fragment : parent } } else { results = jQuery.buildFragment(args, this, scripts) } fragment = results.fragment; if (fragment.childNodes.length === 1) { first = fragment = fragment.firstChild } else { first = fragment.firstChild } if (first) { table = table && jQuery.nodeName(first, "tr"); for (var i = 0, l = this.length, lastIndex = l - 1; i < l; i++) { callback.call(table ? root(this[i], first) : this[i], results.cacheable || (l > 1 && i < lastIndex) ? jQuery.clone(fragment, true, true) : fragment) } } if (scripts.length) { jQuery.each(scripts, evalScript) } } return this } }); function root(elem, cur) { return jQuery.nodeName(elem, "table") ? (elem.getElementsByTagName("tbody")[0] || elem.appendChild(elem.ownerDocument.createElement("tbody"))) : elem } function cloneCopyEvent(src, dest) { if (dest.nodeType !== 1 || !jQuery.hasData(src)) { return } var internalKey = jQuery.expando, oldData = jQuery.data(src), curData = jQuery.data(dest, oldData); if ((oldData = oldData[internalKey])) { var events = oldData.events; curData = curData[internalKey] = jQuery.extend({}, oldData); if (events) { delete curData.handle; curData.events = {}; for (var type in events) { for (var i = 0, l = events[type].length; i < l; i++) { jQuery.event.add(dest, type + (events[type][i].namespace ? "." : "") + events[type][i].namespace, events[type][i], events[type][i].data) } } } } } function cloneFixAttributes(src, dest) { var nodeName; if (dest.nodeType !== 1) { return } if (dest.clearAttributes) { dest.clearAttributes() } if (dest.mergeAttributes) { dest.mergeAttributes(src) } nodeName = dest.nodeName.toLowerCase(); if (nodeName === "object") { dest.outerHTML = src.outerHTML } else { if (nodeName === "input" && (src.type === "checkbox" || src.type === "radio")) { if (src.checked) { dest.defaultChecked = dest.checked = src.checked } if (dest.value !== src.value) { dest.value = src.value } } else { if (nodeName === "option") { dest.selected = src.defaultSelected } else { if (nodeName === "input" || nodeName === "textarea") { dest.defaultValue = src.defaultValue } } } } dest.removeAttribute(jQuery.expando) } jQuery.buildFragment = function (args, nodes, scripts) { var fragment, cacheable, cacheresults, doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document); if (args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document && args[0].charAt(0) === "<" && !rnocache.test(args[0]) && (jQuery.support.checkClone || !rchecked.test(args[0]))) { cacheable = true; cacheresults = jQuery.fragments[args[0]]; if (cacheresults && cacheresults !== 1) { fragment = cacheresults } } if (!fragment) { fragment = doc.createDocumentFragment(); jQuery.clean(args, doc, fragment, scripts) } if (cacheable) { jQuery.fragments[args[0]] = cacheresults ? fragment : 1 } return { fragment : fragment, cacheable : cacheable } }; jQuery.fragments = {}; jQuery.each({ appendTo : "append", prependTo : "prepend", insertBefore : "before", insertAfter : "after", replaceAll : "replaceWith" }, function (name, original) { jQuery.fn[name] = function (selector) { var ret = [], insert = jQuery(selector), parent = this.length === 1 && this[0].parentNode; if (parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1) { insert[original](this[0]); return this } else { for (var i = 0, l = insert.length; i < l; i++) { var elems = (i > 0 ? this.clone(true) : this).get(); jQuery(insert[i])[original](elems); ret = ret.concat(elems) } return this.pushStack(ret, name, insert.selector) } } }); function getAll(elem) { if ("getElementsByTagName" in elem) { return elem.getElementsByTagName("*") } else { if ("querySelectorAll" in elem) { return elem.querySelectorAll("*") } else { return [] } } } function fixDefaultChecked(elem) { if (elem.type === "checkbox" || elem.type === "radio") { elem.defaultChecked = elem.checked } } function findInputs(elem) { if (jQuery.nodeName(elem, "input")) { fixDefaultChecked(elem) } else { if (elem.getElementsByTagName) { jQuery.grep(elem.getElementsByTagName("input"), fixDefaultChecked) } } } jQuery.extend({ clone : function (elem, dataAndEvents, deepDataAndEvents) { var clone = elem.cloneNode(true), srcElements, destElements, i; if ((!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) { cloneFixAttributes(elem, clone); srcElements = getAll(elem); destElements = getAll(clone); for (i = 0; srcElements[i]; ++i) { cloneFixAttributes(srcElements[i], destElements[i]) } } if (dataAndEvents) { cloneCopyEvent(elem, clone); if (deepDataAndEvents) { srcElements = getAll(elem); destElements = getAll(clone); for (i = 0; srcElements[i]; ++i) { cloneCopyEvent(srcElements[i], destElements[i]) } } } return clone }, clean : function (elems, context, fragment, scripts) { var checkScriptType; context = context || document; if (typeof context.createElement === "undefined") { context = context.ownerDocument || context[0] && context[0].ownerDocument || document } var ret = [], j; for (var i = 0, elem; (elem = elems[i]) != null; i++) { if (typeof elem === "number") { elem += "" } if (!elem) { continue } if (typeof elem === "string") { if (!rhtml.test(elem)) { elem = context.createTextNode(elem) } else { elem = elem.replace(rxhtmlTag, "<$1>"); var tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase(), wrap = wrapMap[tag] || wrapMap._default, depth = wrap[0], div = context.createElement("div"); div.innerHTML = wrap[1] + elem + wrap[2]; while (depth--) { div = div.lastChild } if (!jQuery.support.tbody) { var hasBody = rtbody.test(elem), tbody = tag === "table" && !hasBody ? div.firstChild && div.firstChild.childNodes : wrap[1] === "" && !hasBody ? div.childNodes : []; for (j = tbody.length - 1; j >= 0; --j) { if (jQuery.nodeName(tbody[j], "tbody") && !tbody[j].childNodes.length) { tbody[j].parentNode.removeChild(tbody[j]) } } } if (!jQuery.support.leadingWhitespace && rleadingWhitespace.test(elem)) { div.insertBefore(context.createTextNode(rleadingWhitespace.exec(elem)[0]), div.firstChild) } elem = div.childNodes } } var len; if (!jQuery.support.appendChecked) { if (elem[0] && typeof(len = elem.length) === "number") { for (j = 0; j < len; j++) { findInputs(elem[j]) } } else { findInputs(elem) } } if (elem.nodeType) { ret.push(elem) } else { ret = jQuery.merge(ret, elem) } } if (fragment) { checkScriptType = function (elem) { return !elem.type || rscriptType.test(elem.type) }; for (i = 0; ret[i]; i++) { if (scripts && jQuery.nodeName(ret[i], "script") && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript")) { scripts.push(ret[i].parentNode ? ret[i].parentNode.removeChild(ret[i]) : ret[i]) } else { if (ret[i].nodeType === 1) { var jsTags = jQuery.grep(ret[i].getElementsByTagName("script"), checkScriptType); ret.splice.apply(ret, [i + 1, 0].concat(jsTags)) } fragment.appendChild(ret[i]) } } } return ret }, cleanData : function (elems) { var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special, deleteExpando = jQuery.support.deleteExpando; for (var i = 0, elem; (elem = elems[i]) != null; i++) { if (elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) { continue } id = elem[jQuery.expando]; if (id) { data = cache[id] && cache[id][internalKey]; if (data && data.events) { for (var type in data.events) { if (special[type]) { jQuery.event.remove(elem, type) } else { jQuery.removeEvent(elem, type, data.handle) } } if (data.handle) { data.handle.elem = null } } if (deleteExpando) { delete elem[jQuery.expando] } else { if (elem.removeAttribute) { elem.removeAttribute(jQuery.expando) } } delete cache[id] } } } }); function evalScript(i, elem) { if (elem.src) { jQuery.ajax({ url : elem.src, async : false, dataType : "script" }) } else { jQuery.globalEval((elem.text || elem.textContent || elem.innerHTML || "").replace(rcleanScript, "/*$0*/")) } if (elem.parentNode) { elem.parentNode.removeChild(elem) } } var ralpha = /alpha\([^)]*\)/i, ropacity = /opacity=([^)]*)/, rdashAlpha = /-([a-z])/ig, rupper = /([A-Z]|^ms)/g, rnumpx = /^-?\d+(?:px)?$/i, rnum = /^-?\d/, rrelNum = /^[+\-]=/, rrelNumFilter = /[^+\-\.\de]+/g, cssShow = { position : "absolute", visibility : "hidden", display : "block" }, cssWidth = ["Left", "Right"], cssHeight = ["Top", "Bottom"], curCSS, getComputedStyle, currentStyle, fcamelCase = function (all, letter) { return letter.toUpperCase() }; jQuery.fn.css = function (name, value) { if (arguments.length === 2 && value === undefined) { return this } return jQuery.access(this, name, value, true, function (elem, name, value) { return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name) }) }; jQuery.extend({ cssHooks : { opacity : { get : function (elem, computed) { if (computed) { var ret = curCSS(elem, "opacity", "opacity"); return ret === "" ? "1" : ret } else { return elem.style.opacity } } } }, cssNumber : { zIndex : true, fontWeight : true, opacity : true, zoom : true, lineHeight : true, widows : true, orphans : true }, cssProps : { "float" : jQuery.support.cssFloat ? "cssFloat" : "styleFloat" }, style : function (elem, name, value, extra) { if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) { return } var ret, type, origName = jQuery.camelCase(name), style = elem.style, hooks = jQuery.cssHooks[origName]; name = jQuery.cssProps[origName] || origName; if (value !== undefined) { type = typeof value; if (type === "number" && isNaN(value) || value == null) { return } if (type === "string" && rrelNum.test(value)) { value = +value.replace(rrelNumFilter, "") + parseFloat(jQuery.css(elem, name)) } if (type === "number" && !jQuery.cssNumber[origName]) { value += "px" } if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value)) !== undefined) { try { style[name] = value } catch (e) {} } } else { if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) { return ret } return style[name] } }, css : function (elem, name, extra) { var ret, hooks; name = jQuery.camelCase(name); hooks = jQuery.cssHooks[name]; name = jQuery.cssProps[name] || name; if (name === "cssFloat") { name = "float" } if (hooks && "get" in hooks && (ret = hooks.get(elem, true, extra)) !== undefined) { return ret } else { if (curCSS) { return curCSS(elem, name) } } }, swap : function (elem, options, callback) { var old = {}; for (var name in options) { old[name] = elem.style[name]; elem.style[name] = options[name] } callback.call(elem); for (name in options) { elem.style[name] = old[name] } }, camelCase : function (string) { return string.replace(rdashAlpha, fcamelCase) } }); jQuery.curCSS = jQuery.css; jQuery.each(["height", "width"], function (i, name) { jQuery.cssHooks[name] = { get : function (elem, computed, extra) { var val; if (computed) { if (elem.offsetWidth !== 0) { val = getWH(elem, name, extra) } else { jQuery.swap(elem, cssShow, function () { val = getWH(elem, name, extra) }) } if (val <= 0) { val = curCSS(elem, name, name); if (val === "0px" && currentStyle) { val = currentStyle(elem, name, name) } if (val != null) { return val === "" || val === "auto" ? "0px" : val } } if (val < 0 || val == null) { val = elem.style[name]; return val === "" || val === "auto" ? "0px" : val } return typeof val === "string" ? val : val + "px" } }, set : function (elem, value) { if (rnumpx.test(value)) { value = parseFloat(value); if (value >= 0) { return value + "px" } } else { return value } } } }); if (!jQuery.support.opacity) { jQuery.cssHooks.opacity = { get : function (elem, computed) { return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ? (parseFloat(RegExp.$1) / 100) + "" : computed ? "1" : "" }, set : function (elem, value) { var style = elem.style, currentStyle = elem.currentStyle; style.zoom = 1; var opacity = jQuery.isNaN(value) ? "" : "alpha(opacity=" + value * 100 + ")", filter = currentStyle && currentStyle.filter || style.filter || ""; style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : filter + " " + opacity } } } jQuery(function () { if (!jQuery.support.reliableMarginRight) { jQuery.cssHooks.marginRight = { get : function (elem, computed) { var ret; jQuery.swap(elem, { display : "inline-block" }, function () { if (computed) { ret = curCSS(elem, "margin-right", "marginRight") } else { ret = elem.style.marginRight } }); return ret } } } }); if (document.defaultView && document.defaultView.getComputedStyle) { getComputedStyle = function (elem, name) { var ret, defaultView, computedStyle; name = name.replace(rupper, "-$1").toLowerCase(); if (!(defaultView = elem.ownerDocument.defaultView)) { return undefined } if ((computedStyle = defaultView.getComputedStyle(elem, null))) { ret = computedStyle.getPropertyValue(name); if (ret === "" && !jQuery.contains(elem.ownerDocument.documentElement, elem)) { ret = jQuery.style(elem, name) } } return ret } } if (document.documentElement.currentStyle) { currentStyle = function (elem, name) { var left, ret = elem.currentStyle && elem.currentStyle[name], rsLeft = elem.runtimeStyle && elem.runtimeStyle[name], style = elem.style; if (!rnumpx.test(ret) && rnum.test(ret)) { left = style.left; if (rsLeft) { elem.runtimeStyle.left = elem.currentStyle.left } style.left = name === "fontSize" ? "1em" : (ret || 0); ret = style.pixelLeft + "px"; style.left = left; if (rsLeft) { elem.runtimeStyle.left = rsLeft } } return ret === "" ? "auto" : ret } } curCSS = getComputedStyle || currentStyle; function getWH(elem, name, extra) { var which = name === "width" ? cssWidth : cssHeight, val = name === "width" ? elem.offsetWidth : elem.offsetHeight; if (extra === "border") { return val } jQuery.each(which, function () { if (!extra) { val -= parseFloat(jQuery.css(elem, "padding" + this)) || 0 } if (extra === "margin") { val += parseFloat(jQuery.css(elem, "margin" + this)) || 0 } else { val -= parseFloat(jQuery.css(elem, "border" + this + "Width")) || 0 } }); return val } if (jQuery.expr && jQuery.expr.filters) { jQuery.expr.filters.hidden = function (elem) { var width = elem.offsetWidth, height = elem.offsetHeight; return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css(elem, "display")) === "none") }; jQuery.expr.filters.visible = function (elem) { return !jQuery.expr.filters.hidden(elem) } } var r20 = /%20/g, rbracket = /\[\]$/, rCRLF = /\r?\n/g, rhash = /#.*$/, rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, rquery = /\?/, rscript = /)<[^<]*)*<\/script>/gi, rselectTextarea = /^(?:select|textarea)/i, rspacesAjax = /\s+/, rts = /([?&])_=[^&]*/, rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/, _load = jQuery.fn.load, prefilters = {}, transports = {}, ajaxLocation, ajaxLocParts; try { ajaxLocation = location.href } catch (e) { ajaxLocation = document.createElement("a"); ajaxLocation.href = ""; ajaxLocation = ajaxLocation.href } ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || []; function addToPrefiltersOrTransports(structure) { return function (dataTypeExpression, func) { if (typeof dataTypeExpression !== "string") { func = dataTypeExpression; dataTypeExpression = "*" } if (jQuery.isFunction(func)) { var dataTypes = dataTypeExpression.toLowerCase().split(rspacesAjax), i = 0, length = dataTypes.length, dataType, list, placeBefore; for (; i < length; i++) { dataType = dataTypes[i]; placeBefore = /^\+/.test(dataType); if (placeBefore) { dataType = dataType.substr(1) || "*" } list = structure[dataType] = structure[dataType] || []; list[placeBefore ? "unshift" : "push"](func) } } } } function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR, dataType, inspected) { dataType = dataType || options.dataTypes[0]; inspected = inspected || {}; inspected[dataType] = true; var list = structure[dataType], i = 0, length = list ? list.length : 0, executeOnly = (structure === prefilters), selection; for (; i < length && (executeOnly || !selection); i++) { selection = list[i](options, originalOptions, jqXHR); if (typeof selection === "string") { if (!executeOnly || inspected[selection]) { selection = undefined } else { options.dataTypes.unshift(selection); selection = inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR, selection, inspected) } } } if ((executeOnly || !selection) && !inspected["*"]) { selection = inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR, "*", inspected) } return selection } jQuery.fn.extend({ load : function (url, params, callback) { if (typeof url !== "string" && _load) { return _load.apply(this, arguments) } else { if (!this.length) { return this } } var off = url.indexOf(" "); if (off >= 0) { var selector = url.slice(off, url.length); url = url.slice(0, off) } var type = "GET"; if (params) { if (jQuery.isFunction(params)) { callback = params; params = undefined } else { if (typeof params === "object") { params = jQuery.param(params, jQuery.ajaxSettings.traditional); type = "POST" } } } var self = this; jQuery.ajax({ url : url, type : type, dataType : "html", data : params, complete : function (jqXHR, status, responseText) { responseText = jqXHR.responseText; if (jqXHR.isResolved()) { jqXHR.done(function (r) { responseText = r }); self.html(selector ? jQuery("
").append(responseText.replace(rscript, "")).find(selector) : responseText) } if (callback) { self.each(callback, [responseText, status, jqXHR]) } } }); return this }, serialize : function () { return jQuery.param(this.serializeArray()) }, serializeArray : function () { return this.map(function () { return this.elements ? jQuery.makeArray(this.elements) : this }).filter(function () { return this.name && !this.disabled && (this.checked || rselectTextarea.test(this.nodeName) || rinput.test(this.type)) }).map(function (i, elem) { var val = jQuery(this).val(); return val == null ? null : jQuery.isArray(val) ? jQuery.map(val, function (val, i) { return { name : elem.name, value : val.replace(rCRLF, "\r\n") } }) : { name : elem.name, value : val.replace(rCRLF, "\r\n") } }).get() } }); jQuery.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function (i, o) { jQuery.fn[o] = function (f) { return this.bind(o, f) } }); jQuery.each(["get", "post"], function (i, method) { jQuery[method] = function (url, data, callback, type) { if (jQuery.isFunction(data)) { type = type || callback; callback = data; data = undefined } return jQuery.ajax({ type : method, url : url, data : data, success : callback, dataType : type }) } }); jQuery.extend({ getScript : function (url, callback) { return jQuery.get(url, undefined, callback, "script") }, getJSON : function (url, data, callback) { return jQuery.get(url, data, callback, "json") }, ajaxSetup : function (target, settings) { if (!settings) { settings = target; target = jQuery.extend(true, jQuery.ajaxSettings, settings) } else { jQuery.extend(true, target, jQuery.ajaxSettings, settings) } for (var field in { context : 1, url : 1 }) { if (field in settings) { target[field] = settings[field] } else { if (field in jQuery.ajaxSettings) { target[field] = jQuery.ajaxSettings[field] } } } return target }, ajaxSettings : { url : ajaxLocation, isLocal : rlocalProtocol.test(ajaxLocParts[1]), global : true, type : "GET", contentType : "application/x-www-form-urlencoded", processData : true, async : true, accepts : { xml : "application/xml, text/xml", html : "text/html", text : "text/plain", json : "application/json, text/javascript", "*" : "*/*" }, contents : { xml : /xml/, html : /html/, json : /json/ }, responseFields : { xml : "responseXML", text : "responseText" }, converters : { "* text" : window.String, "text html" : true, "text json" : jQuery.parseJSON, "text xml" : jQuery.parseXML } }, ajaxPrefilter : addToPrefiltersOrTransports(prefilters), ajaxTransport : addToPrefiltersOrTransports(transports), ajax : function (url, options) { if (typeof url === "object") { options = url; url = undefined } options = options || {}; var s = jQuery.ajaxSetup({}, options), callbackContext = s.context || s, globalEventContext = callbackContext !== s && (callbackContext.nodeType || callbackContext instanceof jQuery) ? jQuery(callbackContext) : jQuery.event, deferred = jQuery.Deferred(), completeDeferred = jQuery._Deferred(), statusCode = s.statusCode || {}, ifModifiedKey, requestHeaders = {}, requestHeadersNames = {}, responseHeadersString, responseHeaders, transport, timeoutTimer, parts, state = 0, fireGlobals, i, jqXHR = { readyState : 0, setRequestHeader : function (name, value) { if (!state) { var lname = name.toLowerCase(); name = requestHeadersNames[lname] = requestHeadersNames[lname] || name; requestHeaders[name] = value } return this }, getAllResponseHeaders : function () { return state === 2 ? responseHeadersString : null }, getResponseHeader : function (key) { var match; if (state === 2) { if (!responseHeaders) { responseHeaders = {}; while ((match = rheaders.exec(responseHeadersString))) { responseHeaders[match[1].toLowerCase()] = match[2] } } match = responseHeaders[key.toLowerCase()] } return match === undefined ? null : match }, overrideMimeType : function (type) { if (!state) { s.mimeType = type } return this }, abort : function (statusText) { statusText = statusText || "abort"; if (transport) { transport.abort(statusText) } done(0, statusText); return this } }; function done(status, statusText, responses, headers) { if (state === 2) { return } state = 2; if (timeoutTimer) { clearTimeout(timeoutTimer) } transport = undefined; responseHeadersString = headers || ""; jqXHR.readyState = status ? 4 : 0; var isSuccess, success, error, response = responses ? ajaxHandleResponses(s, jqXHR, responses) : undefined, lastModified, etag; if (status >= 200 && status < 300 || status === 304) { if (s.ifModified) { if ((lastModified = jqXHR.getResponseHeader("Last-Modified"))) { jQuery.lastModified[ifModifiedKey] = lastModified } if ((etag = jqXHR.getResponseHeader("Etag"))) { jQuery.etag[ifModifiedKey] = etag } } if (status === 304) { statusText = "notmodified"; isSuccess = true } else { try { success = ajaxConvert(s, response); statusText = "success"; isSuccess = true } catch (e) { statusText = "parsererror"; error = e } } } else { error = statusText; if (!statusText || status) { statusText = "error"; if (status < 0) { status = 0 } } } jqXHR.status = status; jqXHR.statusText = statusText; if (isSuccess) { deferred.resolveWith(callbackContext, [success, statusText, jqXHR]) } else { deferred.rejectWith(callbackContext, [jqXHR, statusText, error]) } jqXHR.statusCode(statusCode); statusCode = undefined; if (fireGlobals) { globalEventContext.trigger("ajax" + (isSuccess ? "Success" : "Error"), [jqXHR, s, isSuccess ? success : error]) } completeDeferred.resolveWith(callbackContext, [jqXHR, statusText]); if (fireGlobals) { globalEventContext.trigger("ajaxComplete", [jqXHR, s]); if (!(--jQuery.active)) { jQuery.event.trigger("ajaxStop") } } } deferred.promise(jqXHR); jqXHR.success = jqXHR.done; jqXHR.error = jqXHR.fail; jqXHR.complete = completeDeferred.done; jqXHR.statusCode = function (map) { if (map) { var tmp; if (state < 2) { for (tmp in map) { statusCode[tmp] = [statusCode[tmp], map[tmp]] } } else { tmp = map[jqXHR.status]; jqXHR.then(tmp, tmp) } } return this }; s.url = ((url || s.url) + "").replace(rhash, "").replace(rprotocol, ajaxLocParts[1] + "//"); s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().split(rspacesAjax); if (s.crossDomain == null) { parts = rurl.exec(s.url.toLowerCase()); s.crossDomain = !!(parts && (parts[1] != ajaxLocParts[1] || parts[2] != ajaxLocParts[2] || (parts[3] || (parts[1] === "http:" ? 80 : 443)) != (ajaxLocParts[3] || (ajaxLocParts[1] === "http:" ? 80 : 443)))) } if (s.data && s.processData && typeof s.data !== "string") { s.data = jQuery.param(s.data, s.traditional) } inspectPrefiltersOrTransports(prefilters, s, options, jqXHR); if (state === 2) { return false } fireGlobals = s.global; s.type = s.type.toUpperCase(); s.hasContent = !rnoContent.test(s.type); if (fireGlobals && jQuery.active++ === 0) { jQuery.event.trigger("ajaxStart") } if (!s.hasContent) { if (s.data) { s.url += (rquery.test(s.url) ? "&" : "?") + s.data } ifModifiedKey = s.url; if (s.cache === false) { var ts = jQuery.now(), ret = s.url.replace(rts, "$1_=" + ts); s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "") } } if (s.data && s.hasContent && s.contentType !== false || options.contentType) { jqXHR.setRequestHeader("Content-Type", s.contentType) } if (s.ifModified) { ifModifiedKey = ifModifiedKey || s.url; if (jQuery.lastModified[ifModifiedKey]) { jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[ifModifiedKey]) } if (jQuery.etag[ifModifiedKey]) { jqXHR.setRequestHeader("If-None-Match", jQuery.etag[ifModifiedKey]) } } jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", */*; q=0.01" : "") : s.accepts["*"]); for (i in s.headers) { jqXHR.setRequestHeader(i, s.headers[i]) } if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || state === 2)) { jqXHR.abort(); return false } for (i in { success : 1, error : 1, complete : 1 }) { jqXHR[i](s[i]) } transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR); if (!transport) { done(-1, "No Transport") } else { jqXHR.readyState = 1; if (fireGlobals) { globalEventContext.trigger("ajaxSend", [jqXHR, s]) } if (s.async && s.timeout > 0) { timeoutTimer = setTimeout(function () { jqXHR.abort("timeout") }, s.timeout) } try { state = 1; transport.send(requestHeaders, done) } catch (e) { if (status < 2) { done(-1, e) } else { jQuery.error(e) } } } return jqXHR }, param : function (a, traditional) { var s = [], add = function (key, value) { value = jQuery.isFunction(value) ? value() : value; s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value) }; if (traditional === undefined) { traditional = jQuery.ajaxSettings.traditional } if (jQuery.isArray(a) || (a.jquery && !jQuery.isPlainObject(a))) { jQuery.each(a, function () { add(this.name, this.value) }) } else { for (var prefix in a) { buildParams(prefix, a[prefix], traditional, add) } } return s.join("&").replace(r20, "+") } }); function buildParams(prefix, obj, traditional, add) { if (jQuery.isArray(obj)) { jQuery.each(obj, function (i, v) { if (traditional || rbracket.test(prefix)) { add(prefix, v) } else { buildParams(prefix + "[" + (typeof v === "object" || jQuery.isArray(v) ? i : "") + "]", v, traditional, add) } }) } else { if (!traditional && obj != null && typeof obj === "object") { for (var name in obj) { buildParams(prefix + "[" + name + "]", obj[name], traditional, add) } } else { add(prefix, obj) } } } jQuery.extend({ active : 0, lastModified : {}, etag : {} }); function ajaxHandleResponses(s, jqXHR, responses) { var contents = s.contents, dataTypes = s.dataTypes, responseFields = s.responseFields, ct, type, finalDataType, firstDataType; for (type in responseFields) { if (type in responses) { jqXHR[responseFields[type]] = responses[type] } } while (dataTypes[0] === "*") { dataTypes.shift(); if (ct === undefined) { ct = s.mimeType || jqXHR.getResponseHeader("content-type") } } if (ct) { for (type in contents) { if (contents[type] && contents[type].test(ct)) { dataTypes.unshift(type); break } } } if (dataTypes[0]in responses) { finalDataType = dataTypes[0] } else { for (type in responses) { if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) { finalDataType = type; break } if (!firstDataType) { firstDataType = type } } finalDataType = finalDataType || firstDataType } if (finalDataType) { if (finalDataType !== dataTypes[0]) { dataTypes.unshift(finalDataType) } return responses[finalDataType] } } function ajaxConvert(s, response) { if (s.dataFilter) { response = s.dataFilter(response, s.dataType) } var dataTypes = s.dataTypes, converters = {}, i, key, length = dataTypes.length, tmp, current = dataTypes[0], prev, conversion, conv, conv1, conv2; for (i = 1; i < length; i++) { if (i === 1) { for (key in s.converters) { if (typeof key === "string") { converters[key.toLowerCase()] = s.converters[key] } } } prev = current; current = dataTypes[i]; if (current === "*") { current = prev } else { if (prev !== "*" && prev !== current) { conversion = prev + " " + current; conv = converters[conversion] || converters["* " + current]; if (!conv) { conv2 = undefined; for (conv1 in converters) { tmp = conv1.split(" "); if (tmp[0] === prev || tmp[0] === "*") { conv2 = converters[tmp[1] + " " + current]; if (conv2) { conv1 = converters[conv1]; if (conv1 === true) { conv = conv2 } else { if (conv2 === true) { conv = conv1 } } break } } } } if (!(conv || conv2)) { jQuery.error("No conversion from " + conversion.replace(" ", " to ")) } if (conv !== true) { response = conv ? conv(response) : conv2(conv1(response)) } } } } return response } var jsc = jQuery.now(), jsre = /(\=)\?(&|$)|\?\?/i; jQuery.ajaxSetup({ jsonp : "callback", jsonpCallback : function () { return jQuery.expando + "_" + (jsc++) } }); jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) { var inspectData = s.contentType === "application/x-www-form-urlencoded" && (typeof s.data === "string"); if (s.dataTypes[0] === "jsonp" || s.jsonp !== false && (jsre.test(s.url) || inspectData && jsre.test(s.data))) { var responseContainer, jsonpCallback = s.jsonpCallback = jQuery.isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback, previous = window[jsonpCallback], url = s.url, data = s.data, replace = "$1" + jsonpCallback + "$2"; if (s.jsonp !== false) { url = url.replace(jsre, replace); if (s.url === url) { if (inspectData) { data = data.replace(jsre, replace) } if (s.data === data) { url += (/\?/.test(url) ? "&" : "?") + s.jsonp + "=" + jsonpCallback } } } s.url = url; s.data = data; window[jsonpCallback] = function (response) { responseContainer = [response] }; jqXHR.always(function () { window[jsonpCallback] = previous; if (responseContainer && jQuery.isFunction(previous)) { window[jsonpCallback](responseContainer[0]) } }); s.converters["script json"] = function () { if (!responseContainer) { jQuery.error(jsonpCallback + " was not called") } return responseContainer[0] }; s.dataTypes[0] = "json"; return "script" } }); jQuery.ajaxSetup({ accepts : { script : "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" }, contents : { script : /javascript|ecmascript/ }, converters : { "text script" : function (text) { jQuery.globalEval(text); return text } } }); jQuery.ajaxPrefilter("script", function (s) { if (s.cache === undefined) { s.cache = false } if (s.crossDomain) { s.type = "GET"; s.global = false } }); jQuery.ajaxTransport("script", function (s) { if (s.crossDomain) { var script, head = document.head || document.getElementsByTagName("head")[0] || document.documentElement; return { send : function (_, callback) { script = document.createElement("script"); script.async = "async"; if (s.scriptCharset) { script.charset = s.scriptCharset } script.src = s.url; script.onload = script.onreadystatechange = function (_, isAbort) { if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) { script.onload = script.onreadystatechange = null; if (head && script.parentNode) { head.removeChild(script) } script = undefined; if (!isAbort) { callback(200, "success") } } }; head.insertBefore(script, head.firstChild) }, abort : function () { if (script) { script.onload(0, 1) } } } } }); var xhrOnUnloadAbort = window.ActiveXObject ? function () { for (var key in xhrCallbacks) { xhrCallbacks[key](0, 1) } } : false, xhrId = 0, xhrCallbacks; function createStandardXHR() { try { return new window.XMLHttpRequest() } catch (e) {} } function createActiveXHR() { try { return new window.ActiveXObject("Microsoft.XMLHTTP") } catch (e) {} } jQuery.ajaxSettings.xhr = window.ActiveXObject ? function () { return !this.isLocal && createStandardXHR() || createActiveXHR() } : createStandardXHR; (function (xhr) { jQuery.extend(jQuery.support, { ajax : !!xhr, cors : !!xhr && ("withCredentials" in xhr) }) })(jQuery.ajaxSettings.xhr()); if (jQuery.support.ajax) { jQuery.ajaxTransport(function (s) { if (!s.crossDomain || jQuery.support.cors) { var callback; return { send : function (headers, complete) { var xhr = s.xhr(), handle, i; if (s.username) { xhr.open(s.type, s.url, s.async, s.username, s.password) } else { xhr.open(s.type, s.url, s.async) } if (s.xhrFields) { for (i in s.xhrFields) { xhr[i] = s.xhrFields[i] } } if (s.mimeType && xhr.overrideMimeType) { xhr.overrideMimeType(s.mimeType) } if (!s.crossDomain && !headers["X-Requested-With"]) { headers["X-Requested-With"] = "XMLHttpRequest" } try { for (i in headers) { xhr.setRequestHeader(i, headers[i]) } } catch (_) {} xhr.send((s.hasContent && s.data) || null); callback = function (_, isAbort) { var status, statusText, responseHeaders, responses, xml; try { if (callback && (isAbort || xhr.readyState === 4)) { callback = undefined; if (handle) { xhr.onreadystatechange = jQuery.noop; if (xhrOnUnloadAbort) { delete xhrCallbacks[handle] } } if (isAbort) { if (xhr.readyState !== 4) { xhr.abort() } } else { status = xhr.status; responseHeaders = xhr.getAllResponseHeaders(); responses = {}; xml = xhr.responseXML; if (xml && xml.documentElement) { responses.xml = xml } responses.text = xhr.responseText; try { statusText = xhr.statusText } catch (e) { statusText = "" } if (!status && s.isLocal && !s.crossDomain) { status = responses.text ? 200 : 404 } else { if (status === 1223) { status = 204 } } } } } catch (firefoxAccessException) { if (!isAbort) { complete(-1, firefoxAccessException) } } if (responses) { complete(status, statusText, responses, responseHeaders) } }; if (!s.async || xhr.readyState === 4) { callback() } else { handle = ++xhrId; if (xhrOnUnloadAbort) { if (!xhrCallbacks) { xhrCallbacks = {}; jQuery(window).unload(xhrOnUnloadAbort) } xhrCallbacks[handle] = callback } xhr.onreadystatechange = callback } }, abort : function () { if (callback) { callback(0, 1) } } } } }) } var elemdisplay = {}, iframe, iframeDoc, rfxtypes = /^(?:toggle|show|hide)$/, rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i, timerId, fxAttrs = [["height", "marginTop", "marginBottom", "paddingTop", "paddingBottom"], ["width", "marginLeft", "marginRight", "paddingLeft", "paddingRight"], ["opacity"]], fxNow, requestAnimationFrame = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame; jQuery.fn.extend({ show : function (speed, easing, callback) { var elem, display; if (speed || speed === 0) { return this.animate(genFx("show", 3), speed, easing, callback) } else { for (var i = 0, j = this.length; i < j; i++) { elem = this[i]; if (elem.style) { display = elem.style.display; if (!jQuery._data(elem, "olddisplay") && display === "none") { display = elem.style.display = "" } if (display === "" && jQuery.css(elem, "display") === "none") { jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName)) } } } for (i = 0; i < j; i++) { elem = this[i]; if (elem.style) { display = elem.style.display; if (display === "" || display === "none") { elem.style.display = jQuery._data(elem, "olddisplay") || "" } } } return this } }, hide : function (speed, easing, callback) { if (speed || speed === 0) { return this.animate(genFx("hide", 3), speed, easing, callback) } else { for (var i = 0, j = this.length; i < j; i++) { if (this[i].style) { var display = jQuery.css(this[i], "display"); if (display !== "none" && !jQuery._data(this[i], "olddisplay")) { jQuery._data(this[i], "olddisplay", display) } } } for (i = 0; i < j; i++) { if (this[i].style) { this[i].style.display = "none" } } return this } }, _toggle : jQuery.fn.toggle, toggle : function (fn, fn2, callback) { var bool = typeof fn === "boolean"; if (jQuery.isFunction(fn) && jQuery.isFunction(fn2)) { this._toggle.apply(this, arguments) } else { if (fn == null || bool) { this.each(function () { var state = bool ? fn : jQuery(this).is(":hidden"); jQuery(this)[state ? "show" : "hide"]() }) } else { this.animate(genFx("toggle", 3), fn, fn2, callback) } } return this }, fadeTo : function (speed, to, easing, callback) { return this.filter(":hidden").css("opacity", 0).show().end().animate({ opacity : to }, speed, easing, callback) }, animate : function (prop, speed, easing, callback) { var optall = jQuery.speed(speed, easing, callback); if (jQuery.isEmptyObject(prop)) { return this.each(optall.complete, [false]) } prop = jQuery.extend({}, prop); return this[optall.queue === false ? "each" : "queue"](function () { if (optall.queue === false) { jQuery._mark(this) } var opt = jQuery.extend({}, optall), isElement = this.nodeType === 1, hidden = isElement && jQuery(this).is(":hidden"), name, val, p, display, e, parts, start, end, unit; opt.animatedProperties = {}; for (p in prop) { name = jQuery.camelCase(p); if (p !== name) { prop[name] = prop[p]; delete prop[p] } val = prop[name]; if (jQuery.isArray(val)) { opt.animatedProperties[name] = val[1]; val = prop[name] = val[0] } else { opt.animatedProperties[name] = opt.specialEasing && opt.specialEasing[name] || opt.easing || "swing" } if (val === "hide" && hidden || val === "show" && !hidden) { return opt.complete.call(this) } if (isElement && (name === "height" || name === "width")) { opt.overflow = [this.style.overflow, this.style.overflowX, this.style.overflowY]; if (jQuery.css(this, "display") === "inline" && jQuery.css(this, "float") === "none") { if (!jQuery.support.inlineBlockNeedsLayout) { this.style.display = "inline-block" } else { display = defaultDisplay(this.nodeName); if (display === "inline") { this.style.display = "inline-block" } else { this.style.display = "inline"; this.style.zoom = 1 } } } } } if (opt.overflow != null) { this.style.overflow = "hidden" } for (p in prop) { e = new jQuery.fx(this, opt, p); val = prop[p]; if (rfxtypes.test(val)) { e[val === "toggle" ? hidden ? "show" : "hide" : val]() } else { parts = rfxnum.exec(val); start = e.cur(); if (parts) { end = parseFloat(parts[2]); unit = parts[3] || (jQuery.cssNumber[p] ? "" : "px"); if (unit !== "px") { jQuery.style(this, p, (end || 1) + unit); start = ((end || 1) / e.cur()) * start; jQuery.style(this, p, start + unit) } if (parts[1]) { end = ((parts[1] === "-=" ? -1 : 1) * end) + start } e.custom(start, end, unit) } else { e.custom(start, val, "") } } } return true }) }, stop : function (clearQueue, gotoEnd) { if (clearQueue) { this.queue([]) } this.each(function () { var timers = jQuery.timers, i = timers.length; if (!gotoEnd) { jQuery._unmark(true, this) } while (i--) { if (timers[i].elem === this) { if (gotoEnd) { timers[i](true) } timers.splice(i, 1) } } }); if (!gotoEnd) { this.dequeue() } return this } }); function createFxNow() { setTimeout(clearFxNow, 0); return (fxNow = jQuery.now()) } function clearFxNow() { fxNow = undefined } function genFx(type, num) { var obj = {}; jQuery.each(fxAttrs.concat.apply([], fxAttrs.slice(0, num)), function () { obj[this] = type }); return obj } jQuery.each({ slideDown : genFx("show", 1), slideUp : genFx("hide", 1), slideToggle : genFx("toggle", 1), fadeIn : { opacity : "show" }, fadeOut : { opacity : "hide" }, fadeToggle : { opacity : "toggle" } }, function (name, props) { jQuery.fn[name] = function (speed, easing, callback) { return this.animate(props, speed, easing, callback) } }); jQuery.extend({ speed : function (speed, easing, fn) { var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : { complete : fn || !fn && easing || jQuery.isFunction(speed) && speed, duration : speed, easing : fn && easing || easing && !jQuery.isFunction(easing) && easing }; opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default; opt.old = opt.complete; opt.complete = function (noUnmark) { if (opt.queue !== false) { jQuery.dequeue(this) } else { if (noUnmark !== false) { jQuery._unmark(this) } } if (jQuery.isFunction(opt.old)) { opt.old.call(this) } }; return opt }, easing : { linear : function (p, n, firstNum, diff) { return firstNum + diff * p }, swing : function (p, n, firstNum, diff) { return ((-Math.cos(p * Math.PI) / 2) + 0.5) * diff + firstNum } }, timers : [], fx : function (elem, options, prop) { this.options = options; this.elem = elem; this.prop = prop; options.orig = options.orig || {} } }); jQuery.fx.prototype = { update : function () { if (this.options.step) { this.options.step.call(this.elem, this.now, this) } (jQuery.fx.step[this.prop] || jQuery.fx.step._default)(this) }, cur : function () { if (this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null)) { return this.elem[this.prop] } var parsed, r = jQuery.css(this.elem, this.prop); return isNaN(parsed = parseFloat(r)) ? !r || r === "auto" ? 0 : r : parsed }, custom : function (from, to, unit) { var self = this, fx = jQuery.fx, raf; this.startTime = fxNow || createFxNow(); this.start = from; this.end = to; this.unit = unit || this.unit || (jQuery.cssNumber[this.prop] ? "" : "px"); this.now = this.start; this.pos = this.state = 0; function t(gotoEnd) { return self.step(gotoEnd) } t.elem = this.elem; if (t() && jQuery.timers.push(t) && !timerId) { if (requestAnimationFrame) { timerId = 1; raf = function () { if (timerId) { requestAnimationFrame(raf); fx.tick() } }; requestAnimationFrame(raf) } else { timerId = setInterval(fx.tick, fx.interval) } } }, show : function () { this.options.orig[this.prop] = jQuery.style(this.elem, this.prop); this.options.show = true; this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur()); jQuery(this.elem).show() }, hide : function () { this.options.orig[this.prop] = jQuery.style(this.elem, this.prop); this.options.hide = true; this.custom(this.cur(), 0) }, step : function (gotoEnd) { var t = fxNow || createFxNow(), done = true, elem = this.elem, options = this.options, i, n; if (gotoEnd || t >= options.duration + this.startTime) { this.now = this.end; this.pos = this.state = 1; this.update(); options.animatedProperties[this.prop] = true; for (i in options.animatedProperties) { if (options.animatedProperties[i] !== true) { done = false } } if (done) { if (options.overflow != null && !jQuery.support.shrinkWrapBlocks) { jQuery.each(["", "X", "Y"], function (index, value) { elem.style["overflow" + value] = options.overflow[index] }) } if (options.hide) { jQuery(elem).hide() } if (options.hide || options.show) { for (var p in options.animatedProperties) { jQuery.style(elem, p, options.orig[p]) } } options.complete.call(elem) } return false } else { if (options.duration == Infinity) { this.now = t } else { n = t - this.startTime; this.state = n / options.duration; this.pos = jQuery.easing[options.animatedProperties[this.prop]](this.state, n, 0, 1, options.duration); this.now = this.start + ((this.end - this.start) * this.pos) } this.update() } return true } }; jQuery.extend(jQuery.fx, { tick : function () { for (var timers = jQuery.timers, i = 0; i < timers.length; ++i) { if (!timers[i]()) { timers.splice(i--, 1) } } if (!timers.length) { jQuery.fx.stop() } }, interval : 13, stop : function () { clearInterval(timerId); timerId = null }, speeds : { slow : 600, fast : 200, _default : 400 }, step : { opacity : function (fx) { jQuery.style(fx.elem, "opacity", fx.now) }, _default : function (fx) { if (fx.elem.style && fx.elem.style[fx.prop] != null) { fx.elem.style[fx.prop] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit } else { fx.elem[fx.prop] = fx.now } } } }); if (jQuery.expr && jQuery.expr.filters) { jQuery.expr.filters.animated = function (elem) { return jQuery.grep(jQuery.timers, function (fn) { return elem === fn.elem }).length } } function defaultDisplay(nodeName) { if (!elemdisplay[nodeName]) { var elem = jQuery("<" + nodeName + ">").appendTo("body"), display = elem.css("display"); elem.remove(); if (display === "none" || display === "") { if (!iframe) { iframe = document.createElement("iframe"); iframe.frameBorder = iframe.width = iframe.height = 0 } document.body.appendChild(iframe); if (!iframeDoc || !iframe.createElement) { iframeDoc = (iframe.contentWindow || iframe.contentDocument).document; iframeDoc.write("") } elem = iframeDoc.createElement(nodeName); iframeDoc.body.appendChild(elem); display = jQuery.css(elem, "display"); document.body.removeChild(iframe) } elemdisplay[nodeName] = display } return elemdisplay[nodeName] } var rtable = /^t(?:able|d|h)$/i, rroot = /^(?:body|html)$/i; if ("getBoundingClientRect" in document.documentElement) { jQuery.fn.offset = function (options) { var elem = this[0], box; if (options) { return this.each(function (i) { jQuery.offset.setOffset(this, options, i) }) } if (!elem || !elem.ownerDocument) { return null } if (elem === elem.ownerDocument.body) { return jQuery.offset.bodyOffset(elem) } try { box = elem.getBoundingClientRect() } catch (e) {} var doc = elem.ownerDocument, docElem = doc.documentElement; if (!box || !jQuery.contains(docElem, elem)) { return box ? { top : box.top, left : box.left } : { top : 0, left : 0 } } var body = doc.body, win = getWindow(doc), clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop, scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft, top = box.top + scrollTop - clientTop, left = box.left + scrollLeft - clientLeft; return { top : top, left : left } } } else { jQuery.fn.offset = function (options) { var elem = this[0]; if (options) { return this.each(function (i) { jQuery.offset.setOffset(this, options, i) }) } if (!elem || !elem.ownerDocument) { return null } if (elem === elem.ownerDocument.body) { return jQuery.offset.bodyOffset(elem) } jQuery.offset.initialize(); var computedStyle, offsetParent = elem.offsetParent, prevOffsetParent = elem, doc = elem.ownerDocument, docElem = doc.documentElement, body = doc.body, defaultView = doc.defaultView, prevComputedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle, top = elem.offsetTop, left = elem.offsetLeft; while ((elem = elem.parentNode) && elem !== body && elem !== docElem) { if (jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed") { break } computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle; top -= elem.scrollTop; left -= elem.scrollLeft; if (elem === offsetParent) { top += elem.offsetTop; left += elem.offsetLeft; if (jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName))) { top += parseFloat(computedStyle.borderTopWidth) || 0; left += parseFloat(computedStyle.borderLeftWidth) || 0 } prevOffsetParent = offsetParent; offsetParent = elem.offsetParent } if (jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible") { top += parseFloat(computedStyle.borderTopWidth) || 0; left += parseFloat(computedStyle.borderLeftWidth) || 0 } prevComputedStyle = computedStyle } if (prevComputedStyle.position === "relative" || prevComputedStyle.position === "static") { top += body.offsetTop; left += body.offsetLeft } if (jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed") { top += Math.max(docElem.scrollTop, body.scrollTop); left += Math.max(docElem.scrollLeft, body.scrollLeft) } return { top : top, left : left } } } jQuery.offset = { initialize : function () { var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat(jQuery.css(body, "marginTop")) || 0, html = "
"; jQuery.extend(container.style, { position : "absolute", top : 0, left : 0, margin : 0, border : 0, width : "1px", height : "1px", visibility : "hidden" }); container.innerHTML = html; body.insertBefore(container, body.firstChild); innerDiv = container.firstChild; checkDiv = innerDiv.firstChild; td = innerDiv.nextSibling.firstChild.firstChild; this.doesNotAddBorder = (checkDiv.offsetTop !== 5); this.doesAddBorderForTableAndCells = (td.offsetTop === 5); checkDiv.style.position = "fixed"; checkDiv.style.top = "20px"; this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15); checkDiv.style.position = checkDiv.style.top = ""; innerDiv.style.overflow = "hidden"; innerDiv.style.position = "relative"; this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop); body.removeChild(container); jQuery.offset.initialize = jQuery.noop }, bodyOffset : function (body) { var top = body.offsetTop, left = body.offsetLeft; jQuery.offset.initialize(); if (jQuery.offset.doesNotIncludeMarginInBodyOffset) { top += parseFloat(jQuery.css(body, "marginTop")) || 0; left += parseFloat(jQuery.css(body, "marginLeft")) || 0 } return { top : top, left : left } }, setOffset : function (elem, options, i) { var position = jQuery.css(elem, "position"); if (position === "static") { elem.style.position = "relative" } var curElem = jQuery(elem), curOffset = curElem.offset(), curCSSTop = jQuery.css(elem, "top"), curCSSLeft = jQuery.css(elem, "left"), calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, props = {}, curPosition = {}, curTop, curLeft; if (calculatePosition) { curPosition = curElem.position(); curTop = curPosition.top; curLeft = curPosition.left } else { curTop = parseFloat(curCSSTop) || 0; curLeft = parseFloat(curCSSLeft) || 0 } if (jQuery.isFunction(options)) { options = options.call(elem, i, curOffset) } if (options.top != null) { props.top = (options.top - curOffset.top) + curTop } if (options.left != null) { props.left = (options.left - curOffset.left) + curLeft } if ("using" in options) { options.using.call(elem, props) } else { curElem.css(props) } } }; jQuery.fn.extend({ position : function () { if (!this[0]) { return null } var elem = this[0], offsetParent = this.offsetParent(), offset = this.offset(), parentOffset = rroot.test(offsetParent[0].nodeName) ? { top : 0, left : 0 } : offsetParent.offset(); offset.top -= parseFloat(jQuery.css(elem, "marginTop")) || 0; offset.left -= parseFloat(jQuery.css(elem, "marginLeft")) || 0; parentOffset.top += parseFloat(jQuery.css(offsetParent[0], "borderTopWidth")) || 0; parentOffset.left += parseFloat(jQuery.css(offsetParent[0], "borderLeftWidth")) || 0; return { top : offset.top - parentOffset.top, left : offset.left - parentOffset.left } }, offsetParent : function () { return this.map(function () { var offsetParent = this.offsetParent || document.body; while (offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static")) { offsetParent = offsetParent.offsetParent } return offsetParent }) } }); jQuery.each(["Left", "Top"], function (i, name) { var method = "scroll" + name; jQuery.fn[method] = function (val) { var elem, win; if (val === undefined) { elem = this[0]; if (!elem) { return null } win = getWindow(elem); return win ? ("pageXOffset" in win) ? win[i ? "pageYOffset" : "pageXOffset"] : jQuery.support.boxModel && win.document.documentElement[method] || win.document.body[method] : elem[method] } return this.each(function () { win = getWindow(this); if (win) { win.scrollTo(!i ? val : jQuery(win).scrollLeft(), i ? val : jQuery(win).scrollTop()) } else { this[method] = val } }) } }); function getWindow(elem) { return jQuery.isWindow(elem) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false } jQuery.each(["Height", "Width"], function (i, name) { var type = name.toLowerCase(); jQuery.fn["inner" + name] = function () { return this[0] ? parseFloat(jQuery.css(this[0], type, "padding")) : null }; jQuery.fn["outer" + name] = function (margin) { return this[0] ? parseFloat(jQuery.css(this[0], type, margin ? "margin" : "border")) : null }; jQuery.fn[type] = function (size) { var elem = this[0]; if (!elem) { return size == null ? null : this } if (jQuery.isFunction(size)) { return this.each(function (i) { var self = jQuery(this); self[type](size.call(this, i, self[type]())) }) } if (jQuery.isWindow(elem)) { var docElemProp = elem.document.documentElement["client" + name]; return elem.document.compatMode === "CSS1Compat" && docElemProp || elem.document.body["client" + name] || docElemProp } else { if (elem.nodeType === 9) { return Math.max(elem.documentElement["client" + name], elem.body["scroll" + name], elem.documentElement["scroll" + name], elem.body["offset" + name], elem.documentElement["offset" + name]) } else { if (size === undefined) { var orig = jQuery.css(elem, type), ret = parseFloat(orig); return jQuery.isNaN(ret) ? orig : ret } else { return this.css(type, typeof size === "string" ? size : size + "px") } } } } }); window.jQuery = window.$ = jQuery })(window); /* * jQuery UI 1.8.12 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI */ (function ($, undefined) { $.ui = $.ui || {}; if ($.ui.version) { return } $.extend($.ui, { version : "1.8.12", keyCode : { ALT : 18, BACKSPACE : 8, CAPS_LOCK : 20, COMMA : 188, COMMAND : 91, COMMAND_LEFT : 91, COMMAND_RIGHT : 93, CONTROL : 17, DELETE : 46, DOWN : 40, END : 35, ENTER : 13, ESCAPE : 27, HOME : 36, INSERT : 45, LEFT : 37, MENU : 93, NUMPAD_ADD : 107, NUMPAD_DECIMAL : 110, NUMPAD_DIVIDE : 111, NUMPAD_ENTER : 108, NUMPAD_MULTIPLY : 106, NUMPAD_SUBTRACT : 109, PAGE_DOWN : 34, PAGE_UP : 33, PERIOD : 190, RIGHT : 39, SHIFT : 16, SPACE : 32, TAB : 9, UP : 38, WINDOWS : 91 } }); $.fn.extend({ _focus : $.fn.focus, focus : function (delay, fn) { return typeof delay === "number" ? this.each(function () { var elem = this; setTimeout(function () { $(elem).focus(); if (fn) { fn.call(elem) } }, delay) }) : this._focus.apply(this, arguments) }, scrollParent : function () { var scrollParent; if (($.browser.msie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) { scrollParent = this.parents().filter(function () { return (/(relative|absolute|fixed)/).test($.curCSS(this, "position", 1)) && (/(auto|scroll)/).test($.curCSS(this, "overflow", 1) + $.curCSS(this, "overflow-y", 1) + $.curCSS(this, "overflow-x", 1)) }).eq(0) } else { scrollParent = this.parents().filter(function () { return (/(auto|scroll)/).test($.curCSS(this, "overflow", 1) + $.curCSS(this, "overflow-y", 1) + $.curCSS(this, "overflow-x", 1)) }).eq(0) } return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent }, zIndex : function (zIndex) { if (zIndex !== undefined) { return this.css("zIndex", zIndex) } if (this.length) { var elem = $(this[0]), position, value; while (elem.length && elem[0] !== document) { position = elem.css("position"); if (position === "absolute" || position === "relative" || position === "fixed") { value = parseInt(elem.css("zIndex"), 10); if (!isNaN(value) && value !== 0) { return value } } elem = elem.parent() } } return 0 }, disableSelection : function () { return this.bind(($.support.selectstart ? "selectstart" : "mousedown") + ".ui-disableSelection", function (event) { event.preventDefault() }) }, enableSelection : function () { return this.unbind(".ui-disableSelection") } }); $.each(["Width", "Height"], function (i, name) { var side = name === "Width" ? ["Left", "Right"] : ["Top", "Bottom"], type = name.toLowerCase(), orig = { innerWidth : $.fn.innerWidth, innerHeight : $.fn.innerHeight, outerWidth : $.fn.outerWidth, outerHeight : $.fn.outerHeight }; function reduce(elem, size, border, margin) { $.each(side, function () { size -= parseFloat($.curCSS(elem, "padding" + this, true)) || 0; if (border) { size -= parseFloat($.curCSS(elem, "border" + this + "Width", true)) || 0 } if (margin) { size -= parseFloat($.curCSS(elem, "margin" + this, true)) || 0 } }); return size } $.fn["inner" + name] = function (size) { if (size === undefined) { return orig["inner" + name].call(this) } return this.each(function () { $(this).css(type, reduce(this, size) + "px") }) }; $.fn["outer" + name] = function (size, margin) { if (typeof size !== "number") { return orig["outer" + name].call(this, size) } return this.each(function () { $(this).css(type, reduce(this, size, true, margin) + "px") }) } }); function visible(element) { return !$(element).parents().andSelf().filter(function () { return $.curCSS(this, "visibility") === "hidden" || $.expr.filters.hidden(this) }).length } $.extend($.expr[":"], { data : function (elem, i, match) { return !!$.data(elem, match[3]) }, focusable : function (element) { var nodeName = element.nodeName.toLowerCase(), tabIndex = $.attr(element, "tabindex"); if ("area" === nodeName) { var map = element.parentNode, mapName = map.name, img; if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") { return false } img = $("img[usemap=#" + mapName + "]")[0]; return !!img && visible(img) } return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : "a" == nodeName ? element.href || !isNaN(tabIndex) : !isNaN(tabIndex)) && visible(element) }, tabbable : function (element) { var tabIndex = $.attr(element, "tabindex"); return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(":focusable") } }); $(function () { var body = document.body, div = body.appendChild(div = document.createElement("div")); $.extend(div.style, { minHeight : "100px", height : "auto", padding : 0, borderWidth : 0 }); $.support.minHeight = div.offsetHeight === 100; $.support.selectstart = "onselectstart" in div; body.removeChild(div).style.display = "none" }); $.extend($.ui, { plugin : { add : function (module, option, set) { var proto = $.ui[module].prototype; for (var i in set) { proto.plugins[i] = proto.plugins[i] || []; proto.plugins[i].push([option, set[i]]) } }, call : function (instance, name, args) { var set = instance.plugins[name]; if (!set || !instance.element[0].parentNode) { return } for (var i = 0; i < set.length; i++) { if (instance.options[set[i][0]]) { set[i][1].apply(instance.element, args) } } } }, contains : function (a, b) { return document.compareDocumentPosition ? a.compareDocumentPosition(b) & 16 : a !== b && a.contains(b) }, hasScroll : function (el, a) { if ($(el).css("overflow") === "hidden") { return false } var scroll = (a && a === "left") ? "scrollLeft" : "scrollTop", has = false; if (el[scroll] > 0) { return true } el[scroll] = 1; has = (el[scroll] > 0); el[scroll] = 0; return has }, isOverAxis : function (x, reference, size) { return (x > reference) && (x < (reference + size)) }, isOver : function (y, x, top, left, height, width) { return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width) } }) })(jQuery); /* * jQuery UI Widget 1.8.12 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Widget */ (function ($, undefined) { if ($.cleanData) { var _cleanData = $.cleanData; $.cleanData = function (elems) { for (var i = 0, elem; (elem = elems[i]) != null; i++) { $(elem).triggerHandler("remove") } _cleanData(elems) } } else { var _remove = $.fn.remove; $.fn.remove = function (selector, keepData) { return this.each(function () { if (!keepData) { if (!selector || $.filter(selector, [this]).length) { $("*", this).add([this]).each(function () { $(this).triggerHandler("remove") }) } } return _remove.call($(this), selector, keepData) }) } } $.widget = function (name, base, prototype) { var namespace = name.split(".")[0], fullName; name = name.split(".")[1]; fullName = namespace + "-" + name; if (!prototype) { prototype = base; base = $.Widget } $.expr[":"][fullName] = function (elem) { return !!$.data(elem, name) }; $[namespace] = $[namespace] || {}; $[namespace][name] = function (options, element) { if (arguments.length) { this._createWidget(options, element) } }; var basePrototype = new base(); basePrototype.options = $.extend(true, {}, basePrototype.options); $[namespace][name].prototype = $.extend(true, basePrototype, { namespace : namespace, widgetName : name, widgetEventPrefix : $[namespace][name].prototype.widgetEventPrefix || name, widgetBaseClass : fullName }, prototype); $.widget.bridge(name, $[namespace][name]) }; $.widget.bridge = function (name, object) { $.fn[name] = function (options) { var isMethodCall = typeof options === "string", args = Array.prototype.slice.call(arguments, 1), returnValue = this; options = !isMethodCall && args.length ? $.extend.apply(null, [true, options].concat(args)) : options; if (isMethodCall && options.charAt(0) === "_") { return returnValue } if (isMethodCall) { this.each(function () { var instance = $.data(this, name), methodValue = instance && $.isFunction(instance[options]) ? instance[options].apply(instance, args) : instance; if (methodValue !== instance && methodValue !== undefined) { returnValue = methodValue; return false } }) } else { this.each(function () { var instance = $.data(this, name); if (instance) { instance.option(options || {})._init() } else { $.data(this, name, new object(options, this)) } }) } return returnValue } }; $.Widget = function (options, element) { if (arguments.length) { this._createWidget(options, element) } }; $.Widget.prototype = { widgetName : "widget", widgetEventPrefix : "", options : { disabled : false }, _createWidget : function (options, element) { $.data(element, this.widgetName, this); this.element = $(element); this.options = $.extend(true, {}, this.options, this._getCreateOptions(), options); var self = this; this.element.bind("remove." + this.widgetName, function () { self.destroy() }); this._create(); this._trigger("create"); this._init() }, _getCreateOptions : function () { return $.metadata && $.metadata.get(this.element[0])[this.widgetName] }, _create : function () {}, _init : function () {}, destroy : function () { this.element.unbind("." + this.widgetName).removeData(this.widgetName); this.widget().unbind("." + this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass + "-disabled ui-state-disabled") }, widget : function () { return this.element }, option : function (key, value) { var options = key; if (arguments.length === 0) { return $.extend({}, this.options) } if (typeof key === "string") { if (value === undefined) { return this.options[key] } options = {}; options[key] = value } this._setOptions(options); return this }, _setOptions : function (options) { var self = this; $.each(options, function (key, value) { self._setOption(key, value) }); return this }, _setOption : function (key, value) { this.options[key] = value; if (key === "disabled") { this.widget()[value ? "addClass" : "removeClass"](this.widgetBaseClass + "-disabled ui-state-disabled").attr("aria-disabled", value) } return this }, enable : function () { return this._setOption("disabled", false) }, disable : function () { return this._setOption("disabled", true) }, _trigger : function (type, event, data) { var callback = this.options[type]; event = $.Event(event); event.type = (type === this.widgetEventPrefix ? type : this.widgetEventPrefix + type).toLowerCase(); data = data || {}; if (event.originalEvent) { for (var i = $.event.props.length, prop; i; ) { prop = $.event.props[--i]; event[prop] = event.originalEvent[prop] } } this.element.trigger(event, data); return !($.isFunction(callback) && callback.call(this.element[0], event, data) === false || event.isDefaultPrevented()) } } })(jQuery); /* * jQuery UI Mouse 1.8.12 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Mouse * * Depends: * jquery.ui.widget.js */ (function ($, undefined) { $.widget("ui.mouse", { options : { cancel : ":input,option", distance : 1, delay : 0 }, _mouseInit : function () { var self = this; this.element.bind("mousedown." + this.widgetName, function (event) { return self._mouseDown(event) }).bind("click." + this.widgetName, function (event) { if (true === $.data(event.target, self.widgetName + ".preventClickEvent")) { $.removeData(event.target, self.widgetName + ".preventClickEvent"); event.stopImmediatePropagation(); return false } }); this.started = false }, _mouseDestroy : function () { this.element.unbind("." + this.widgetName) }, _mouseDown : function (event) { event.originalEvent = event.originalEvent || {}; if (event.originalEvent.mouseHandled) { return } (this._mouseStarted && this._mouseUp(event)); this._mouseDownEvent = event; var self = this, btnIsLeft = (event.which == 1), elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false); if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { return true } this.mouseDelayMet = !this.options.delay; if (!this.mouseDelayMet) { this._mouseDelayTimer = setTimeout(function () { self.mouseDelayMet = true }, this.options.delay) } if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { this._mouseStarted = (this._mouseStart(event) !== false); if (!this._mouseStarted) { event.preventDefault(); return true } } if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { $.removeData(event.target, this.widgetName + ".preventClickEvent") } this._mouseMoveDelegate = function (event) { return self._mouseMove(event) }; this._mouseUpDelegate = function (event) { return self._mouseUp(event) }; $(document).bind("mousemove." + this.widgetName, this._mouseMoveDelegate).bind("mouseup." + this.widgetName, this._mouseUpDelegate); event.preventDefault(); event.originalEvent.mouseHandled = true; return true }, _mouseMove : function (event) { if ($.browser.msie && !(document.documentMode >= 9) && !event.button) { return this._mouseUp(event) } if (this._mouseStarted) { this._mouseDrag(event); return event.preventDefault() } if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { this._mouseStarted = (this._mouseStart(this._mouseDownEvent, event) !== false); (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)) } return !this._mouseStarted }, _mouseUp : function (event) { $(document).unbind("mousemove." + this.widgetName, this._mouseMoveDelegate).unbind("mouseup." + this.widgetName, this._mouseUpDelegate); if (this._mouseStarted) { this._mouseStarted = false; if (event.target == this._mouseDownEvent.target) { $.data(event.target, this.widgetName + ".preventClickEvent", true) } this._mouseStop(event) } return false }, _mouseDistanceMet : function (event) { return (Math.max(Math.abs(this._mouseDownEvent.pageX - event.pageX), Math.abs(this._mouseDownEvent.pageY - event.pageY)) >= this.options.distance) }, _mouseDelayMet : function (event) { return this.mouseDelayMet }, _mouseStart : function (event) {}, _mouseDrag : function (event) {}, _mouseStop : function (event) {}, _mouseCapture : function (event) { return true } }) })(jQuery); (function ($, undefined) { $.ui = $.ui || {}; var horizontalPositions = /left|center|right/, verticalPositions = /top|center|bottom/, center = "center", _position = $.fn.position, _offset = $.fn.offset; $.fn.position = function (options) { if (!options || !options.of) { return _position.apply(this, arguments) } options = $.extend({}, options); var target = $(options.of), targetElem = target[0], collision = (options.collision || "flip").split(" "), offset = options.offset ? options.offset.split(" ") : [0, 0], targetWidth, targetHeight, basePosition; if (targetElem.nodeType === 9) { targetWidth = target.width(); targetHeight = target.height(); basePosition = { top : 0, left : 0 } } else { if (targetElem.setTimeout) { targetWidth = target.width(); targetHeight = target.height(); basePosition = { top : target.scrollTop(), left : target.scrollLeft() } } else { if (targetElem.preventDefault) { options.at = "left top"; targetWidth = targetHeight = 0; basePosition = { top : options.of.pageY, left : options.of.pageX } } else { targetWidth = target.outerWidth(); targetHeight = target.outerHeight(); basePosition = target.offset() } } } $.each(["my", "at"], function () { var pos = (options[this] || "").split(" "); if (pos.length === 1) { pos = horizontalPositions.test(pos[0]) ? pos.concat([center]) : verticalPositions.test(pos[0]) ? [center].concat(pos) : [center, center] } pos[0] = horizontalPositions.test(pos[0]) ? pos[0] : center; pos[1] = verticalPositions.test(pos[1]) ? pos[1] : center; options[this] = pos }); if (collision.length === 1) { collision[1] = collision[0] } offset[0] = parseInt(offset[0], 10) || 0; if (offset.length === 1) { offset[1] = offset[0] } offset[1] = parseInt(offset[1], 10) || 0; if (options.at[0] === "right") { basePosition.left += targetWidth } else { if (options.at[0] === center) { basePosition.left += targetWidth / 2 } } if (options.at[1] === "bottom") { basePosition.top += targetHeight } else { if (options.at[1] === center) { basePosition.top += targetHeight / 2 } } basePosition.left += offset[0]; basePosition.top += offset[1]; return this.each(function () { var elem = $(this), elemWidth = elem.outerWidth(), elemHeight = elem.outerHeight(), marginLeft = parseInt($.curCSS(this, "marginLeft", true)) || 0, marginTop = parseInt($.curCSS(this, "marginTop", true)) || 0, collisionWidth = elemWidth + marginLeft + (parseInt($.curCSS(this, "marginRight", true)) || 0), collisionHeight = elemHeight + marginTop + (parseInt($.curCSS(this, "marginBottom", true)) || 0), position = $.extend({}, basePosition), collisionPosition; if (options.my[0] === "right") { position.left -= elemWidth } else { if (options.my[0] === center) { position.left -= elemWidth / 2 } } if (options.my[1] === "bottom") { position.top -= elemHeight } else { if (options.my[1] === center) { position.top -= elemHeight / 2 } } position.left = Math.round(position.left); position.top = Math.round(position.top); collisionPosition = { left : position.left - marginLeft, top : position.top - marginTop }; $.each(["left", "top"], function (i, dir) { if ($.ui.position[collision[i]]) { $.ui.position[collision[i]][dir](position, { targetWidth : targetWidth, targetHeight : targetHeight, elemWidth : elemWidth, elemHeight : elemHeight, collisionPosition : collisionPosition, collisionWidth : collisionWidth, collisionHeight : collisionHeight, offset : offset, my : options.my, at : options.at }) } }); if ($.fn.bgiframe) { elem.bgiframe() } elem.offset($.extend(position, { using : options.using })) }) }; $.ui.position = { fit : { left : function (position, data) { var win = $(window), over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(); position.left = over > 0 ? position.left - over : Math.max(position.left - data.collisionPosition.left, position.left) }, top : function (position, data) { var win = $(window), over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(); position.top = over > 0 ? position.top - over : Math.max(position.top - data.collisionPosition.top, position.top) } }, flip : { left : function (position, data) { if (data.at[0] === center) { return } var win = $(window), over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(), myOffset = data.my[0] === "left" ? -data.elemWidth : data.my[0] === "right" ? data.elemWidth : 0, atOffset = data.at[0] === "left" ? data.targetWidth : -data.targetWidth, offset = -2 * data.offset[0]; position.left += data.collisionPosition.left < 0 ? myOffset + atOffset + offset : over > 0 ? myOffset + atOffset + offset : 0 }, top : function (position, data) { if (data.at[1] === center) { return } var win = $(window), over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(), myOffset = data.my[1] === "top" ? -data.elemHeight : data.my[1] === "bottom" ? data.elemHeight : 0, atOffset = data.at[1] === "top" ? data.targetHeight : -data.targetHeight, offset = -2 * data.offset[1]; position.top += data.collisionPosition.top < 0 ? myOffset + atOffset + offset : over > 0 ? myOffset + atOffset + offset : 0 } } }; if (!$.offset.setOffset) { $.offset.setOffset = function (elem, options) { if (/static/.test($.curCSS(elem, "position"))) { elem.style.position = "relative" } var curElem = $(elem), curOffset = curElem.offset(), curTop = parseInt($.curCSS(elem, "top", true), 10) || 0, curLeft = parseInt($.curCSS(elem, "left", true), 10) || 0, props = { top : (options.top - curOffset.top) + curTop, left : (options.left - curOffset.left) + curLeft }; if ("using" in options) { options.using.call(elem, props) } else { curElem.css(props) } }; $.fn.offset = function (options) { var elem = this[0]; if (!elem || !elem.ownerDocument) { return null } if (options) { return this.each(function () { $.offset.setOffset(this, options) }) } return _offset.call(this) } } } (jQuery)); /* * Fluid Infusion v1.4 * * Infusion is distributed under the Educational Community License 2.0 and new BSD licenses: * http://wiki.fluidproject.org/display/fluid/Fluid+Licensing * * For information on copyright, see the individual Infusion source code files: * https://github.com/fluid-project/infusion/ */ var fluid_1_4 = fluid_1_4 || {}; var fluid = fluid || fluid_1_4; (function ($, fluid) { fluid.version = "Infusion 1.4"; fluid.environment = { fluid : fluid }; var globalObject = window || {}; var softFailure = [true]; fluid.describeActivity = function () { return [] }; fluid.fail = function (message) { fluid.setLogging(true); fluid.log.apply(null, ["ASSERTION FAILED: "].concat(fluid.makeArray(arguments)).concat(fluid.describeActivity())); if (softFailure[0]) { throw new Error(message) } else { message.fail() } }; fluid.pushSoftFailure = function (condition) { if (typeof(condition) === "boolean") { softFailure.unshift(condition) } else { if (condition === -1) { softFailure.shift() } } }; fluid.notrycatch = false; fluid.tryCatch = function (tryfun, catchfun, finallyfun) { finallyfun = finallyfun || fluid.identity; if (fluid.notrycatch) { var togo = tryfun(); finallyfun(); return togo } else { try { return tryfun() } catch (e) { if (catchfun) { catchfun(e) } else { throw(e) } } finally { finallyfun() } } }; fluid.expect = function (name, members, target) { fluid.transform(fluid.makeArray(members), function (key) { if (typeof target[key] === "undefined") { fluid.fail(name + " missing required parameter " + key) } }) }; var logging; fluid.isLogging = function () { return logging }; fluid.setLogging = function (enabled) { if (typeof enabled === "boolean") { logging = enabled } else { logging = false } }; fluid.applyHostFunction = function (obj, func, args) { if (func.apply) { func.apply(obj, args) } else { var applier = Function.prototype.bind.call(func, obj); applier.apply(obj, args) } }; fluid.log = function (message) { if (logging) { var arg0 = fluid.renderTimestamp(new Date()) + ": "; var args = [arg0].concat(fluid.makeArray(arguments)); var str = args.join(""); if (typeof(console) !== "undefined") { if (console.debug) { fluid.applyHostFunction(console, console.debug, args) } else { if (typeof(console.log) === "function") { fluid.applyHostFunction(console, console.log, args) } else { console.log(str) } } } else { if (typeof(YAHOO) !== "undefined") { YAHOO.log(str) } else { if (typeof(opera) !== "undefined") { opera.postError(str) } } } } }; fluid.wrap = function (obj) { return ((!obj || obj.jquery) ? obj : $(obj)) }; fluid.unwrap = function (obj) { return obj && obj.jquery && obj.length === 1 ? obj[0] : obj }; fluid.identity = function (arg) { return arg }; fluid.isValue = function (value) { return value !== undefined && value !== null }; fluid.isPrimitive = function (value) { var valueType = typeof(value); return !value || valueType === "string" || valueType === "boolean" || valueType === "number" || valueType === "function" }; fluid.isDOMNode = function (obj) { return obj && typeof(obj.nodeType) === "number" }; fluid.isArrayable = function (totest) { return totest && !fluid.isPrimitive(totest) && typeof(totest.length) === "number" }; fluid.freshContainer = function (tocopy) { return fluid.isArrayable(tocopy) ? [] : {} }; fluid.copy = function (tocopy) { if (fluid.isPrimitive(tocopy)) { return tocopy } return $.extend(true, fluid.freshContainer(tocopy), tocopy) }; fluid.makeArray = function (arg) { if (arg === null || arg === undefined) { return [] } else { return $.makeArray(arg) } }; function transformInternal(source, togo, key, args) { var transit = source[key]; for (var j = 0; j < args.length - 1; ++j) { transit = args[j + 1](transit, key) } togo[key] = transit } fluid.transform = function (source) { var togo = fluid.freshContainer(source); if (fluid.isArrayable(source)) { for (var i = 0; i < source.length; ++i) { transformInternal(source, togo, i, arguments) } } else { for (var key in source) { transformInternal(source, togo, key, arguments) } } return togo }; fluid.each = function (source, func) { if (fluid.isArrayable(source)) { for (var i = 0; i < source.length; ++i) { func(source[i], i) } } else { for (var key in source) { func(source[key], key) } } }; fluid.find = function (source, func, deflt) { var disp; if (fluid.isArrayable(source)) { for (var i = 0; i < source.length; ++i) { disp = func(source[i], i); if (disp !== undefined) { return disp } } } else { for (var key in source) { disp = func(source[key], key); if (disp !== undefined) { return disp } } } return deflt }; fluid.accumulate = function (list, fn, arg) { for (var i = 0; i < list.length; ++i) { arg = fn(list[i], arg, i) } return arg }; fluid.remove_if = function (source, fn) { if (fluid.isArrayable(source)) { for (var i = 0; i < source.length; ++i) { if (fn(source[i], i)) { source.splice(i, 1); --i } } } else { for (var key in source) { if (fn(source[key], key)) { delete source[key] } } } return source }; fluid.filterKeys = function (toFilter, keys, exclude) { return fluid.remove_if($.extend({}, toFilter), function (value, key) { return exclude^($.inArray(key, keys) === -1) }) }; fluid.censorKeys = function (toCensor, keys) { return fluid.filterKeys(toCensor, keys, true) }; fluid.keys = function (obj) { var togo = []; fluid.each(obj, function (value, key) { togo.push(key) }); return togo }; fluid.contains = function (obj, value) { return obj ? fluid.find(obj, function (thisValue, key) { if (value === thisValue) { return true } }) : undefined }; fluid.keyForValue = function (obj, value) { return fluid.find(obj, function (thisValue, key) { if (value === thisValue) { return key } }) }; fluid.findKeyInObject = fluid.keyForValue; fluid.arrayToHash = function (array) { var togo = {}; fluid.each(array, function (el) { togo[el] = true }); return togo }; fluid.clear = function (target) { if (fluid.isArrayable(target)) { target.length = 0 } else { for (var i in target) { delete target[i] } } }; fluid.model = {}; fluid.VALUE = { type : "fluid.marker", value : "VALUE" }; fluid.NO_VALUE = { type : "fluid.marker", value : "NO_VALUE" }; fluid.EXPAND = { type : "fluid.marker", value : "EXPAND" }; fluid.EXPAND_NOW = { type : "fluid.marker", value : "EXPAND_NOW" }; fluid.isMarker = function (totest, type) { if (!totest || typeof(totest) !== "object" || totest.type !== "fluid.marker") { return false } if (!type) { return true } return totest === type }; fluid.model.copyModel = function (target, source) { fluid.clear(target); $.extend(true, target, source) }; fluid.model.parseEL = function (EL) { return EL === "" ? [] : String(EL).split(".") }; fluid.model.composePath = function (prefix, suffix) { return prefix === "" ? suffix : (suffix === "" ? prefix : prefix + "." + suffix) }; fluid.model.composeSegments = function () { return $.makeArray(arguments).join(".") }; fluid.path = fluid.model.composeSegments; fluid.composePath = fluid.model.composePath; fluid.model.environmentStrategy = function (initEnvironment) { return { init : function () { var environment = initEnvironment; return function (root, segment, index) { var togo; if (environment && environment[segment]) { togo = environment[segment] } environment = null; return togo } } } }; fluid.model.defaultCreatorStrategy = function (root, segment) { if (root[segment] === undefined) { root[segment] = {}; return root[segment] } }; fluid.model.defaultFetchStrategy = function (root, segment) { return segment === "" ? root : root[segment] }; fluid.model.funcResolverStrategy = function (root, segment) { if (root.resolvePathSegment) { return root.resolvePathSegment(segment) } }; fluid.model.applyStrategy = function (strategy, root, segment, index) { if (typeof(strategy) === "function") { return strategy(root, segment, index) } else { if (strategy && strategy.next) { return strategy.next(root, segment, index) } } }; fluid.model.initStrategy = function (baseStrategy, index, oldStrategies) { return baseStrategy.init ? baseStrategy.init(oldStrategies ? oldStrategies[index] : undefined) : baseStrategy }; fluid.model.makeTrundler = function (root, config, oldStrategies) { var that = { root : root, strategies : fluid.isArrayable(config) ? config : fluid.transform(config.strategies, function (strategy, index) { return fluid.model.initStrategy(strategy, index, oldStrategies) }) }; that.trundle = function (EL, uncess) { uncess = uncess || 0; var newThat = fluid.model.makeTrundler(that.root, config, that.strategies); newThat.segs = fluid.model.parseEL(EL); newThat.index = 0; newThat.step(newThat.segs.length - uncess); return newThat }; that.next = function () { if (!that.root) { return } var accepted; for (var i = 0; i < that.strategies.length; ++i) { var value = fluid.model.applyStrategy(that.strategies[i], that.root, that.segs[that.index], that.index); if (accepted === undefined) { accepted = value } } if (accepted === fluid.NO_VALUE) { accepted = undefined } that.root = accepted; ++that.index }; that.step = function (limit) { for (var i = 0; i < limit; ++i) { that.next() } that.last = that.segs[that.index] }; return that }; fluid.model.defaultSetConfig = { strategies : [fluid.model.funcResolverStrategy, fluid.model.defaultFetchStrategy, fluid.model.defaultCreatorStrategy] }; fluid.model.trundleImpl = function (trundler, EL, config, uncess) { if (typeof(EL) === "string") { trundler = trundler.trundle(EL, uncess) } else { var key = EL.type || "default"; var resolver = config.resolvers[key]; if (!resolver) { fluid.fail("Unable to find resolver of type " + key) } trundler = resolver(EL, trundler) || {}; if (EL.path && trundler.trundle && trundler.root !== undefined) { trundler = fluid.model.trundleImpl(trundler, EL.path, config, uncess) } } return trundler }; fluid.model.trundle = function (root, EL, config, uncess) { EL = EL || ""; config = config || fluid.model.defaultGetConfig; var trundler = fluid.model.makeTrundler(root, config); return fluid.model.trundleImpl(trundler, EL, config, uncess) }; fluid.model.getPenultimate = function (root, EL, config) { return fluid.model.trundle(root, EL, config, 1) }; fluid.set = function (root, EL, newValue, config) { config = config || fluid.model.defaultSetConfig; var trundler = fluid.model.getPenultimate(root, EL, config); trundler.root[trundler.last] = newValue }; fluid.model.defaultGetConfig = { strategies : [fluid.model.funcResolverStrategy, fluid.model.defaultFetchStrategy] }; fluid.get = function (root, EL, config) { return fluid.model.trundle(root, EL, config).root }; fluid.model.setBeanValue = fluid.set; fluid.model.getBeanValue = fluid.get; fluid.getGlobalValue = function (path, env) { if (path) { env = env || fluid.environment; var envFetcher = fluid.model.environmentStrategy(env); return fluid.get(globalObject, path, { strategies : [envFetcher].concat(fluid.model.defaultGetConfig.strategies) }) } }; fluid.invokeGlobalFunction = function (functionPath, args, environment) { var func = fluid.getGlobalValue(functionPath, environment); if (!func) { fluid.fail("Error invoking global function: " + functionPath + " could not be located") } else { return func.apply(null, args) } }; fluid.registerGlobalFunction = function (functionPath, func, env) { env = env || fluid.environment; var envFetcher = fluid.model.environmentStrategy(env); fluid.set(globalObject, functionPath, func, { strategies : [envFetcher].concat(fluid.model.defaultSetConfig.strategies) }) }; fluid.setGlobalValue = fluid.registerGlobalFunction; fluid.registerNamespace = function (naimspace, env) { env = env || fluid.environment; var existing = fluid.getGlobalValue(naimspace, env); if (!existing) { existing = {}; fluid.setGlobalValue(naimspace, existing, env) } return existing }; fluid.dumpEl = fluid.identity; fluid.renderTimestamp = fluid.identity; fluid.registerNamespace("fluid.event"); fluid.generateUniquePrefix = function () { return (Math.floor(Math.random() * 1000000000000)).toString(36) + "-" }; var fluid_prefix = fluid.generateUniquePrefix(); var fluid_guid = 1; fluid.allocateGuid = function () { return fluid_prefix + (fluid_guid++) }; fluid.event.identifyListener = function (listener) { if (typeof(listener) === "string") { return listener } if (!listener.$$guid) { listener.$$guid = fluid.allocateGuid() } return listener.$$guid }; fluid.event.mapPriority = function (priority, count) { return (priority === null || priority === undefined ? -count : (priority === "last" ? -Number.MAX_VALUE : (priority === "first" ? Number.MAX_VALUE : priority))) }; fluid.event.listenerComparator = function (recA, recB) { return recB.priority - recA.priority }; fluid.event.sortListeners = function (listeners) { var togo = []; fluid.each(listeners, function (listener) { togo.push(listener) }); return togo.sort(fluid.event.listenerComparator) }; fluid.event.getEventFirer = function (unicast, preventable) { var listeners = {}; var sortedListeners = []; function fireToListeners(listeners, args, wrapper) { for (var i in listeners) { var lisrec = listeners[i]; var listener = lisrec.listener; if (typeof(listener) === "string") { var listenerFunc = fluid.getGlobalValue(listener); if (!listenerFunc) { fluid.fail("Unable to look up name " + listener + " as a global function") } else { listener = lisrec.listener = listenerFunc } } if (lisrec.predicate && !lisrec.predicate(listener, args)) { continue } var value = fluid.tryCatch(function () { var ret = (wrapper ? wrapper(listener) : listener).apply(null, args); if (preventable && ret === false) { return false } if (unicast) { return ret } }, function (e) { fluid.log("FireEvent received exception " + e.message + " e " + e + " firing to listener " + i); throw(e) }); if (value !== undefined) { return value } } } return { addListener : function (listener, namespace, predicate, priority) { if (!listener) { return } if (unicast) { namespace = "unicast" } if (!namespace) { namespace = fluid.event.identifyListener(listener) } listeners[namespace] = { listener : listener, predicate : predicate, priority : fluid.event.mapPriority(priority, sortedListeners.length) }; sortedListeners = fluid.event.sortListeners(listeners) }, removeListener : function (listener) { if (typeof(listener) === "string") { delete listeners[listener] } else { if (listener.$$guid) { delete listeners[listener.$$guid] } } sortedListeners = fluid.event.sortListeners(listeners) }, fireToListeners : function (listeners, args, wrapper) { return fireToListeners(listeners, args, wrapper) }, fire : function () { return fireToListeners(sortedListeners, arguments) } } }; fluid.event.addListenerToFirer = function (firer, value, namespace) { if (fluid.isArrayable(value)) { for (var i = 0; i < value.length; ++i) { fluid.event.addListenerToFirer(firer, value[i], namespace) } } else { if (typeof(value) === "function" || typeof(value) === "string") { firer.addListener(value, namespace) } else { if (value && typeof(value) === "object") { firer.addListener(value.listener, namespace || value.namespace, value.predicate, value.priority) } } } }; fluid.mergeListeners = function (that, events, listeners) { fluid.each(listeners, function (value, key) { var firer, namespace; if (key.charAt(0) === "{") { if (!fluid.expandOptions) { fluid.fail("fluid.expandOptions could not be loaded - please include FluidIoC.js in order to operate IoC-driven event with descriptor " + key) } firer = fluid.expandOptions(key, that) } else { var keydot = key.indexOf("."); if (keydot !== -1) { namespace = key.substring(keydot + 1); key = key.substring(0, keydot) } if (!events[key]) { fluid.fail("Listener registered for event " + key + " which is not defined for this component"); events[key] = fluid.event.getEventFirer() } firer = events[key] } fluid.event.addListenerToFirer(firer, value, namespace) }) }; function initEvents(that, events, pass) { fluid.each(events, function (eventSpec, eventKey) { var isIoCEvent = eventSpec && (typeof(eventSpec) !== "string" || eventSpec.charAt(0) === "{"); var event; if (isIoCEvent && pass === "IoC") { if (!fluid.event.resolveEvent) { fluid.fail("fluid.event.resolveEvent could not be loaded - please include FluidIoC.js in order to operate IoC-driven event with descriptor ", eventSpec) } else { event = fluid.event.resolveEvent(that, eventKey, eventSpec) } } else { if (pass === "flat") { event = fluid.event.getEventFirer(eventSpec === "unicast", eventSpec === "preventable") } } if (event) { that.events[eventKey] = event } }) } fluid.instantiateFirers = function (that, options) { that.events = {}; initEvents(that, options.events, "flat"); initEvents(that, options.events, "IoC"); var listeners = fluid.expandOptions ? fluid.expandOptions(options.listeners, that) : options.listeners; fluid.mergeListeners(that, that.events, listeners) }; fluid.mergeListenersPolicy = function (target, source) { var togo = target || {}; fluid.each(source, function (listeners, key) { togo[key] = fluid.makeArray(source[key]).concat(fluid.makeArray(listeners)) }); return togo }; var defaultsStore = {}; var resolveGradesImpl = function (gs, gradeNames) { gradeNames = fluid.makeArray(gradeNames); fluid.each(gradeNames, function (gradeName) { var options = fluid.rawDefaults(gradeName) || {}; gs.gradeHash[gradeName] = true; gs.gradeChain.push(gradeName); gs.optionsChain.push(options); fluid.each(options.gradeNames, function (parent) { if (!gs.gradeHash[parent]) { resolveGradesImpl(gs, parent) } }) }); return gs }; fluid.resolveGradeStructure = function (gradeNames) { var gradeStruct = { gradeChain : [], gradeHash : {}, optionsChain : [] }; return resolveGradesImpl(gradeStruct, gradeNames) }; fluid.lifecycleFunctions = { preInitFunction : true, postInitFunction : true, finalInitFunction : true }; fluid.mergeLifecycleFunction = function (target, source) { fluid.event.addListenerToFirer(target, source); return target }; fluid.rootMergePolicy = fluid.transform(fluid.lifecycleFunctions, function () { return fluid.mergeLifecycleFunction }); fluid.makeLifecycleFirers = function () { return fluid.transform(fluid.lifecycleFunctions, function () { return fluid.event.getEventFirer() }) }; fluid.resolveGrade = function (defaults, gradeNames) { var mergeArgs = [defaults]; if (gradeNames) { var gradeStruct = fluid.resolveGradeStructure(gradeNames); mergeArgs = gradeStruct.optionsChain.reverse().concat(mergeArgs).concat({ gradeNames : gradeStruct.gradeChain }) } mergeArgs = [fluid.rootMergePolicy, fluid.makeLifecycleFirers()].concat(mergeArgs); var mergedDefaults = fluid.merge.apply(null, mergeArgs); return mergedDefaults }; fluid.resolveGradedOptions = function (componentName) { var defaults = fluid.rawDefaults(componentName); if (!defaults) { return defaults } else { return fluid.resolveGrade(defaults, defaults.gradeNames) } }; fluid.rawDefaults = function (componentName, options) { if (options === undefined) { return defaultsStore[componentName] } else { defaultsStore[componentName] = options } }; fluid.hasGrade = function (options, gradeName) { return !options || !options.gradeNames ? false : fluid.contains(options.gradeNames, gradeName) }; fluid.defaults = function () { var offset = 0; if (typeof arguments[0] === "boolean") { offset = 1 } var componentName = (offset === 0 ? "" : "*.global-") + arguments[offset]; var options = arguments[offset + 1]; if (options === undefined) { return fluid.resolveGradedOptions(componentName) } else { if (options && options.options) { fluid.fail('Probable error in options structure with option named "options" - perhaps you meant to write these options at top level in fluid.defaults?') } fluid.rawDefaults(componentName, options); if (fluid.hasGrade(options, "autoInit")) { fluid.makeComponent(componentName, fluid.resolveGradedOptions(componentName)) } } }; fluid.makeComponent = function (componentName, options) { if (!options.initFunction || !options.gradeNames) { fluid.fail("Cannot autoInit component " + componentName + " which does not have an initFunction and gradeName defined") } var creator = function () { return fluid.initComponent(componentName, arguments) }; var existing = fluid.getGlobalValue(componentName); if (existing) { $.extend(creator, existing) } fluid.setGlobalValue(componentName, creator) }; fluid.makeComponents = function (components, env) { fluid.each(components, function (value, key) { var options = { gradeNames : fluid.makeArray(value).concat(["autoInit"]) }; fluid.defaults(key, options) }) }; fluid.defaults("fluid.littleComponent", { initFunction : "fluid.initLittleComponent", argumentMap : { options : 0 } }); fluid.defaults("fluid.eventedComponent", { gradeNames : ["fluid.littleComponent"], mergePolicy : { listeners : "fluid.mergeListenersPolicy" } }); fluid.preInitModelComponent = function (that) { that.model = that.options.model || {}; that.applier = that.options.applier || fluid.makeChangeApplier(that.model, that.options.changeApplierOptions) }; fluid.defaults("fluid.modelComponent", { gradeNames : ["fluid.littleComponent"], preInitFunction : { namespace : "preInitModelComponent", listener : "fluid.preInitModelComponent" }, mergePolicy : { model : "preserve", applier : "nomerge" } }); fluid.defaults("fluid.viewComponent", { gradeNames : ["fluid.littleComponent", "fluid.modelComponent", "fluid.eventedComponent"], initFunction : "fluid.initView", argumentMap : { container : 0, options : 1 } }); fluid.guardCircularity = function (seenIds, source, message1, message2) { if (source && source.id) { if (!seenIds[source.id]) { seenIds[source.id] = source } else { if (seenIds[source.id] === source) { fluid.fail("Circularity in options " + message1 + " - component with typename " + source.typeName + " and id " + source.id + " has already been seen" + message2) } } } }; fluid.mergePolicyIs = function (policy, test) { return typeof(policy) === "string" && $.inArray(test, policy.split(/\s*,\s*/)) !== -1 }; function mergeImpl(policy, basePath, target, source, thisPolicy, rec) { if (typeof(thisPolicy) === "function") { thisPolicy.call(null, target, source); return target } if (fluid.mergePolicyIs(thisPolicy, "replace")) { fluid.clear(target) } fluid.guardCircularity(rec.seenIds, source, "merging", " when evaluating path " + basePath + ' - please protect components from merging using the "nomerge" merge policy'); for (var name in source) { var path = (basePath ? basePath + "." : "") + name; var newPolicy = policy && typeof(policy) !== "string" ? policy[path] : policy; var thisTarget = target[name]; var thisSource = source[name]; var primitiveTarget = fluid.isPrimitive(thisTarget); if (thisSource !== undefined) { if (thisSource !== null && typeof(thisSource) === "object" && !fluid.isDOMNode(thisSource) && !thisSource.jquery && thisSource !== fluid.VALUE && !fluid.mergePolicyIs(newPolicy, "preserve") && !fluid.mergePolicyIs(newPolicy, "nomerge") && !fluid.mergePolicyIs(newPolicy, "noexpand")) { if (primitiveTarget) { target[name] = thisTarget = fluid.freshContainer(thisSource) } mergeImpl(policy, path, thisTarget, thisSource, newPolicy, rec) } else { if (typeof(newPolicy) === "function") { target[name] = newPolicy.call(null, thisTarget, thisSource, name) } else { if (!fluid.isValue(thisTarget) || !fluid.mergePolicyIs(newPolicy, "reverse")) { target[name] = fluid.isValue(thisTarget) && fluid.mergePolicyIs(newPolicy, "preserve") ? fluid.model.mergeModel(thisTarget, thisSource) : thisSource } } } } } return target } fluid.merge = function (policy, target) { var path = ""; for (var i = 2; i < arguments.length; ++i) { var source = arguments[i]; if (source !== null && source !== undefined) { mergeImpl(policy, path, target, source, policy ? policy[""] : null, { seenIds : {} }) } } if (policy && typeof(policy) !== "string") { for (var key in policy) { var elrh = policy[key]; if (typeof(elrh) === "string" && elrh !== "replace" && elrh !== "preserve") { var oldValue = fluid.get(target, key); if (oldValue === null || oldValue === undefined) { var value = fluid.get(target, elrh); fluid.set(target, key, value) } } } } return target }; fluid.transformOptions = function (mergeArgs, transRec) { fluid.expect("Options transformation record", ["transformer", "config"], transRec); var transFunc = fluid.getGlobalValue(transRec.transformer); var togo = fluid.transform(mergeArgs, function (value, key) { return key === 0 ? value : transFunc.call(null, value, transRec.config) }); return togo }; fluid.lastTransformationRecord = function (extraArgs) { for (var i = extraArgs.length - 1; i >= 0; --i) { if (extraArgs[i] && extraArgs[i].transformOptions) { return extraArgs[i].transformOptions } } }; fluid.mergeComponentOptions = function (that, componentName, userOptions, localOptions) { var defaults = fluid.defaults(componentName); var mergePolicy = $.extend({}, fluid.rootMergePolicy, defaults ? defaults.mergePolicy : {}); var defaultGrades = defaults && defaults.gradeNames; var mergeArgs; if (!defaultGrades) { defaults = fluid.censorKeys(defaults, fluid.keys(fluid.lifecycleFunctions)); mergeArgs = [mergePolicy, localOptions] } else { mergeArgs = [mergePolicy] } var extraArgs; if (fluid.expandComponentOptions) { extraArgs = fluid.expandComponentOptions(defaults, userOptions, that) } else { extraArgs = [defaults, userOptions] } var transRec = fluid.lastTransformationRecord(extraArgs); if (transRec) { extraArgs = fluid.transformOptions(extraArgs, transRec) } mergeArgs = mergeArgs.concat(extraArgs); that.options = fluid.merge.apply(null, mergeArgs) }; fluid.COMPONENT_OPTIONS = { type : "fluid.marker", value : "COMPONENT_OPTIONS" }; fluid.emptySubcomponent = function (options) { var that = {}; options = $.makeArray(options); var empty = function () {}; for (var i = 0; i < options.length; ++i) { that[options[i]] = empty } return that }; fluid.computeNickName = function (typeName) { var segs = fluid.model.parseEL(typeName); return segs[segs.length - 1] }; fluid.typeTag = function (name) { return name ? { typeName : name, id : fluid.allocateGuid() } : null }; fluid.typeFount = function (options) { var that = fluid.initLittleComponent("fluid.typeFount", options); return fluid.typeTag(that.options.targetTypeName) }; fluid.initLittleComponent = function (name, options, localOptions) { var that = fluid.typeTag(name); that.nickName = options && options.nickName ? options.nickName : fluid.computeNickName(that.typeName); localOptions = localOptions || { gradeNames : "fluid.littleComponent" }; localOptions = fluid.resolveGrade({}, localOptions.gradeNames); fluid.mergeComponentOptions(that, name, options, localOptions); that.options.preInitFunction.fire(that); if (fluid.hasGrade(that.options, "fluid.eventedComponent")) { fluid.instantiateFirers(that, that.options) } if (!fluid.hasGrade(that.options, "autoInit")) { fluid.clearLifecycleFunctions(that.options) } return that }; fluid.clearLifecycleFunctions = function (options) { fluid.each(fluid.lifecycleFunctions, function (value, key) { delete options[key] }); delete options.initFunction }; fluid.diagnoseFailedView = function (componentName, that, options, args) { if (!that && fluid.hasGrade(options, "fluid.viewComponent")) { var container = fluid.wrap(args[1]); var message1 = "Instantiation of autoInit component with type " + componentName + " failed, since "; if (container.length === 0) { fluid.fail(message1 + 'selector "', args[1], '" did not match any markup in the document') } else { fluid.fail(message1 + " component creator function did not return a value") } } }; fluid.initComponent = function (componentName, initArgs) { var options = fluid.defaults(componentName); if (!options.gradeNames) { fluid.fail("Cannot initialise component " + componentName + " which has no gradeName registered") } var args = [componentName].concat(fluid.makeArray(initArgs)); var that = fluid.invokeGlobalFunction(options.initFunction, args); fluid.diagnoseFailedView(componentName, that, options, args); that.options.postInitFunction.fire(that); if (fluid.initDependents) { fluid.initDependents(that) } that.options.finalInitFunction.fire(that); fluid.clearLifecycleFunctions(that.options); return that.options.returnedPath ? fluid.get(that, that.options.returnedPath) : that }; fluid.initSubcomponentImpl = function (that, entry, args) { var togo; if (typeof(entry) !== "function") { var entryType = typeof(entry) === "string" ? entry : entry.type; var globDef = fluid.defaults(true, entryType); fluid.merge("reverse", that.options, globDef); togo = entryType === "fluid.emptySubcomponent" ? fluid.emptySubcomponent(entry.options) : fluid.invokeGlobalFunction(entryType, args) } else { togo = entry.apply(null, args) } var returnedOptions = togo ? togo.returnedOptions : null; if (returnedOptions) { fluid.merge(that.options.mergePolicy, that.options, returnedOptions); if (returnedOptions.listeners) { fluid.mergeListeners(that, that.events, returnedOptions.listeners) } } return togo }; fluid.initSubcomponents = function (that, className, args) { var entry = that.options[className]; if (!entry) { return } var entries = $.makeArray(entry); var optindex = -1; var togo = []; args = $.makeArray(args); for (var i = 0; i < args.length; ++i) { if (args[i] === fluid.COMPONENT_OPTIONS) { optindex = i } } for (i = 0; i < entries.length; ++i) { entry = entries[i]; if (optindex !== -1) { args[optindex] = entry.options } togo[i] = fluid.initSubcomponentImpl(that, entry, args) } return togo }; fluid.initSubcomponent = function (that, className, args) { return fluid.initSubcomponents(that, className, args)[0] }; fluid.checkTryCatchParameter = function () { var location = window.location || { search : "", protocol : "file:" }; var GETParams = location.search.slice(1).split("&"); return fluid.contains(GETParams, "notrycatch") }; fluid.notrycatch = fluid.checkTryCatchParameter(); fluid.container = function (containerSpec, fallible) { var container = fluid.wrap(containerSpec); if (fallible && (!container || container.length === 0)) { return null } if (!container || !container.jquery || container.length !== 1) { if (typeof(containerSpec) !== "string") { containerSpec = container.selector } var count = container.length !== undefined ? container.length : 0; fluid.fail((count > 1 ? "More than one (" + count + ") container elements were" : "No container element was") + " found for selector " + containerSpec) } if (!fluid.isDOMNode(container[0])) { fluid.fail("fluid.container was supplied a non-jQueryable element") } return container }; fluid.createDomBinder = function (container, selectors) { var cache = {}, that = {}; function cacheKey(name, thisContainer) { return fluid.allocateSimpleId(thisContainer) + "-" + name } function record(name, thisContainer, result) { cache[cacheKey(name, thisContainer)] = result } that.locate = function (name, localContainer) { var selector, thisContainer, togo; selector = selectors[name]; thisContainer = localContainer ? localContainer : container; if (!thisContainer) { fluid.fail("DOM binder invoked for selector " + name + " without container") } if (!selector) { return thisContainer } if (typeof(selector) === "function") { togo = $(selector.call(null, fluid.unwrap(thisContainer))) } else { togo = $(selector, thisContainer) } if (togo.get(0) === document) { togo = [] } if (!togo.selector) { togo.selector = selector; togo.context = thisContainer } togo.selectorName = name; record(name, thisContainer, togo); return togo }; that.fastLocate = function (name, localContainer) { var thisContainer = localContainer ? localContainer : container; var key = cacheKey(name, thisContainer); var togo = cache[key]; return togo ? togo : that.locate(name, localContainer) }; that.clear = function () { cache = {} }; that.refresh = function (names, localContainer) { var thisContainer = localContainer ? localContainer : container; if (typeof names === "string") { names = [names] } if (thisContainer.length === undefined) { thisContainer = [thisContainer] } for (var i = 0; i < names.length; ++i) { for (var j = 0; j < thisContainer.length; ++j) { that.locate(names[i], thisContainer[j]) } } }; that.resolvePathSegment = that.locate; return that }; fluid.expectFilledSelector = function (result, message) { if (result && result.length === 0 && result.jquery) { fluid.fail(message + ': selector "' + result.selector + '" with name ' + result.selectorName + " returned no results in context " + fluid.dumpEl(result.context)) } }; fluid.initView = function (componentName, container, userOptions, localOptions) { fluid.expectFilledSelector(container, 'Error instantiating component with name "' + componentName); container = fluid.container(container, true); if (!container) { return null } var that = fluid.initLittleComponent(componentName, userOptions, localOptions || { gradeNames : ["fluid.viewComponent"] }); that.container = container; fluid.initDomBinder(that); return that }; fluid.initDomBinder = function (that) { that.dom = fluid.createDomBinder(that.container, that.options.selectors); that.locate = that.dom.locate }; fluid.findAncestor = function (element, test) { element = fluid.unwrap(element); while (element) { if (test(element)) { return element } element = element.parentNode } }; fluid.jById = function (id, dokkument) { dokkument = dokkument && dokkument.nodeType === 9 ? dokkument : document; var element = fluid.byId(id, dokkument); var togo = element ? $(element) : []; togo.selector = "#" + id; togo.context = dokkument; return togo }; fluid.byId = function (id, dokkument) { dokkument = dokkument && dokkument.nodeType === 9 ? dokkument : document; var el = dokkument.getElementById(id); if (el) { if (el.id !== id) { fluid.fail("Problem in document structure - picked up element " + fluid.dumpEl(el) + " for id " + id + " without this id - most likely the element has a name which conflicts with this id") } return el } else { return null } }; fluid.getId = function (element) { return fluid.unwrap(element).id }; fluid.allocateSimpleId = function (element) { var simpleId = "fluid-id-" + fluid.allocateGuid(); if (!element) { return simpleId } element = fluid.unwrap(element); if (!element.id) { element.id = simpleId } return element.id }; fluid.stringToRegExp = function (str, flags) { return new RegExp(str.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"), flags) }; fluid.stringTemplate = function (template, values) { var newString = template; for (var key in values) { var re = fluid.stringToRegExp("%" + key, "g"); newString = newString.replace(re, values[key]) } return newString }; fluid.messageResolver = function (options) { var that = fluid.initLittleComponent("fluid.messageResolver", options); that.messageBase = that.options.parseFunc(that.options.messageBase); that.lookup = function (messagecodes) { var resolved = fluid.messageResolver.resolveOne(that.messageBase, messagecodes); if (resolved === undefined) { return fluid.find(that.options.parents, function (parent) { return parent.lookup(messagecodes) }) } else { return { template : resolved, resolveFunc : that.options.resolveFunc } } }; that.resolve = function (messagecodes, args) { if (!messagecodes) { return "[No messagecodes provided]" } messagecodes = fluid.makeArray(messagecodes); var looked = that.lookup(messagecodes); return looked ? looked.resolveFunc(looked.template, args) : "[Message string for key " + messagecodes[0] + " not found]" }; return that }; fluid.defaults("fluid.messageResolver", { mergePolicy : { messageBase : "preserve" }, resolveFunc : fluid.stringTemplate, parseFunc : fluid.identity, messageBase : {}, parents : [] }); fluid.messageResolver.resolveOne = function (messageBase, messagecodes) { for (var i = 0; i < messagecodes.length; ++i) { var code = messagecodes[i]; var message = messageBase[code]; if (message !== undefined) { return message } } }; fluid.messageLocator = function (messageBase, resolveFunc) { var resolver = fluid.messageResolver({ messageBase : messageBase, resolveFunc : resolveFunc }); return function (messagecodes, args) { return resolver.resolve(messagecodes, args) } } })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { var NAMESPACE_KEY = "fluid-scoped-data"; fluid.getScopedData = function (target, key) { var data = $(target).data(NAMESPACE_KEY); return data ? data[key] : undefined }; fluid.setScopedData = function (target, key, value) { $(target).each(function () { var data = $.data(this, NAMESPACE_KEY) || {}; data[key] = value; $.data(this, NAMESPACE_KEY, data) }) }; var lastFocusedElement = null; $(document).bind("focusin", function (event) { lastFocusedElement = event.target }); fluid.getLastFocusedElement = function () { return lastFocusedElement }; var ENABLEMENT_KEY = "enablement"; fluid.enabled = function (target, state) { target = $(target); if (state === undefined) { return fluid.getScopedData(target, ENABLEMENT_KEY) !== false } else { $("*", target).add(target).each(function () { if (fluid.getScopedData(this, ENABLEMENT_KEY) !== undefined) { fluid.setScopedData(this, ENABLEMENT_KEY, state) } else { if (/select|textarea|input/i.test(this.nodeName)) { $(this).prop("disabled", !state) } } }); fluid.setScopedData(target, ENABLEMENT_KEY, state) } }; fluid.initEnablement = function (target) { fluid.setScopedData(target, ENABLEMENT_KEY, true) }; function applyOp(node, func) { node = $(node); node.trigger("fluid-" + func); node[func]() } $.each(["focus", "blur"], function (i, name) { fluid[name] = function (elem) { applyOp(elem, name) } }) })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { fluid.dom = fluid.dom || {}; var getNextNode = function (iterator) { if (iterator.node.firstChild) { iterator.node = iterator.node.firstChild; iterator.depth += 1; return iterator } while (iterator.node) { if (iterator.node.nextSibling) { iterator.node = iterator.node.nextSibling; return iterator } iterator.node = iterator.node.parentNode; iterator.depth -= 1 } return iterator }; fluid.dom.iterateDom = function (node, acceptor, allNodes) { var currentNode = { node : node, depth : 0 }; var prevNode = node; var condition; while (currentNode.node !== null && currentNode.depth >= 0 && currentNode.depth < fluid.dom.iterateDom.DOM_BAIL_DEPTH) { condition = null; if (currentNode.node.nodeType === 1 || allNodes) { condition = acceptor(currentNode.node, currentNode.depth) } if (condition) { if (condition === "delete") { currentNode.node.parentNode.removeChild(currentNode.node); currentNode.node = prevNode } else { if (condition === "stop") { return currentNode.node } } } prevNode = currentNode.node; currentNode = getNextNode(currentNode) } }; fluid.dom.iterateDom.DOM_BAIL_DEPTH = 256; fluid.dom.isContainer = function (container, containee) { for (; containee; containee = containee.parentNode) { if (container === containee) { return true } } return false }; fluid.dom.getElementText = function (element) { var nodes = element.childNodes; var text = ""; for (var i = 0; i < nodes.length; ++i) { var child = nodes[i]; if (child.nodeType === 3) { text = text + child.nodeValue } } return text } })(jQuery, fluid_1_4); fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { var unUnicode = /(\\u[\dabcdef]{4}|\\x[\dabcdef]{2})/g; fluid.unescapeProperties = function (string) { string = string.replace(unUnicode, function (match) { var code = match.substring(2); var parsed = parseInt(code, 16); return String.fromCharCode(parsed) }); var pos = 0; while (true) { var backpos = string.indexOf("\\", pos); if (backpos === -1) { break } if (backpos === string.length - 1) { return [string.substring(0, string.length - 1), true] } var replace = string.charAt(backpos + 1); if (replace === "n") { replace = "\n" } if (replace === "r") { replace = "\r" } if (replace === "t") { replace = "\t" } string = string.substring(0, backpos) + replace + string.substring(backpos + 2); pos = backpos + 1 } return [string, false] }; var breakPos = /[^\\][\s:=]/; fluid.parseJavaProperties = function (text) { var togo = {}; text = text.replace(/\r\n/g, "\n"); text = text.replace(/\r/g, "\n"); lines = text.split("\n"); var contin, key, valueComp, valueRaw, valueEsc; for (var i = 0; i < lines.length; ++i) { var line = $.trim(lines[i]); if (!line || line.charAt(0) === "#" || line.charAt(0) === "!") { continue } if (!contin) { valueComp = ""; var breakpos = line.search(breakPos); if (breakpos === -1) { key = line; valueRaw = "" } else { key = $.trim(line.substring(0, breakpos + 1)); valueRaw = $.trim(line.substring(breakpos + 2)); if (valueRaw.charAt(0) === ":" || valueRaw.charAt(0) === "=") { valueRaw = $.trim(valueRaw.substring(1)) } } key = fluid.unescapeProperties(key)[0]; valueEsc = fluid.unescapeProperties(valueRaw) } else { valueEsc = fluid.unescapeProperties(line) } contin = valueEsc[1]; if (!valueEsc[1]) { togo[key] = valueComp + valueEsc[0] } else { valueComp += valueEsc[0] } } return togo }; fluid.formatMessage = function (messageString, args) { if (!args) { return messageString } if (typeof(args) === "string") { args = [args] } for (var i = 0; i < args.length; ++i) { messageString = messageString.replace("{" + i + "}", args[i]) } return messageString } })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; var fluid = fluid || fluid_1_4; (function ($, fluid) { fluid.renderTimestamp = function (date) { var zeropad = function (num, width) { if (!width) { width = 2 } var numstr = (num == undefined ? "" : num.toString()); return "00000".substring(5 - width + numstr.length) + numstr }; return zeropad(date.getHours()) + ":" + zeropad(date.getMinutes()) + ":" + zeropad(date.getSeconds()) + "." + zeropad(date.getMilliseconds(), 3) }; fluid.detectStackStyle = function (e) { var style = "other"; var stackStyle = { offset : 0 }; if (e.arguments) { style = "chrome" } else { if (typeof window !== "undefined" && window.opera && e.stacktrace) { style = "opera10" } else { if (e.stack) { style = "firefox"; stackStyle.offset = e.stack.indexOf("Trace exception") === -1 ? 1 : 0 } else { if (typeof window !== "undefined" && window.opera && !("stacktrace" in e)) { style = "opera" } } } } stackStyle.style = style; return stackStyle }; fluid.obtainException = function () { try { throw new Error("Trace exception") } catch (e) { return e } }; var stackStyle = fluid.detectStackStyle(fluid.obtainException()); fluid.registerNamespace("fluid.exceptionDecoders"); fluid.decodeStack = function () { if (stackStyle.style !== "firefox") { return null } var e = fluid.obtainException(); return fluid.exceptionDecoders[stackStyle.style](e) }; fluid.exceptionDecoders.firefox = function (e) { var lines = e.stack.replace(/(?:\n@:0)?\s+$/m, "").replace(/^\(/gm, "{anonymous}(").split("\n"); return fluid.transform(lines, function (line) { var atind = line.indexOf("@"); return atind === -1 ? [line] : [line.substring(atind + 1), line.substring(0, atind)] }) }; fluid.getCallerInfo = function (atDepth) { atDepth = (atDepth || 3) - stackStyle.offset; var stack = fluid.decodeStack(); return stack ? stack[atDepth][0] : null }; function generate(c, count) { var togo = ""; for (var i = 0; i < count; ++i) { togo += c } return togo } function printImpl(obj, small, options) { var big = small + options.indentChars; if (obj === null) { return "null" } else { if (fluid.isPrimitive(obj)) { return JSON.stringify(obj) } else { var j = []; if (fluid.isArrayable(obj)) { if (obj.length === 0) { return "[]" } for (var i = 0; i < obj.length; ++i) { j[i] = printImpl(obj[i], big, options) } return "[\n" + big + j.join(",\n" + big) + "\n" + small + "]" } else { var i = 0; fluid.each(obj, function (value, key) { j[i++] = JSON.stringify(key) + ": " + printImpl(value, big, options) }); return "{\n" + big + j.join(",\n" + big) + "\n" + small + "}" } } } } fluid.prettyPrintJSON = function (obj, options) { options = $.extend({ indent : 4 }, options); options.indentChars = generate(" ", options.indent); return printImpl(obj, "", options) }; fluid.dumpEl = function (element) { var togo; if (!element) { return "null" } if (element.nodeType === 3 || element.nodeType === 8) { return "[data: " + element.data + "]" } if (element.nodeType === 9) { return "[document: location " + element.location + "]" } if (!element.nodeType && fluid.isArrayable(element)) { togo = "["; for (var i = 0; i < element.length; ++i) { togo += fluid.dumpEl(element[i]); if (i < element.length - 1) { togo += ", " } } return togo + "]" } element = $(element); togo = element.get(0).tagName; if (element.id) { togo += "#" + element.id } if (element.attr("class")) { togo += "." + element.attr("class") } return togo } })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { fluid.BINDING_ROOT_KEY = "fluid-binding-root"; fluid.findData = function (elem, name) { while (elem) { var data = $.data(elem, name); if (data) { return data } elem = elem.parentNode } }; fluid.bindFossils = function (node, data, fossils) { $.data(node, fluid.BINDING_ROOT_KEY, { data : data, fossils : fossils }) }; fluid.boundPathForNode = function (node, fossils) { node = fluid.unwrap(node); var key = node.name || node.id; var record = fossils[key]; return record ? record.EL : null }; fluid.findForm = function (node) { return fluid.findAncestor(node, function (element) { return element.nodeName.toLowerCase() === "form" }) }; fluid.value = function (nodeIn, newValue) { var node = fluid.unwrap(nodeIn); var multiple = false; if (node.nodeType === undefined && node.length > 1) { node = node[0]; multiple = true } if ("input" !== node.nodeName.toLowerCase() || !/radio|checkbox/.test(node.type)) { return newValue === undefined ? $(node).val() : $(node).val(newValue) } var name = node.name; if (name === undefined) { fluid.fail("Cannot acquire value from node " + fluid.dumpEl(node) + " which does not have name attribute set") } var elements; if (multiple) { elements = nodeIn } else { elements = document.getElementsByName(name); var scope = fluid.findForm(node); elements = $.grep(elements, function (element) { if (element.name !== name) { return false } return !scope || fluid.dom.isContainer(scope, element) }) } if (newValue !== undefined) { if (typeof(newValue) === "boolean") { newValue = (newValue ? "true" : "false") } $.each(elements, function () { this.checked = (newValue instanceof Array ? $.inArray(this.value, newValue) !== -1 : newValue === this.value) }) } else { var checked = $.map(elements, function (element) { return element.checked ? element.value : null }); return node.type === "radio" ? checked[0] : checked } }; fluid.applyChange = function (node, newValue, applier) { node = fluid.unwrap(node); if (newValue === undefined) { newValue = fluid.value(node) } if (node.nodeType === undefined && node.length > 0) { node = node[0] } var root = fluid.findData(node, fluid.BINDING_ROOT_KEY); if (!root) { fluid.fail("Bound data could not be discovered in any node above " + fluid.dumpEl(node)) } var name = node.name; var fossil = root.fossils[name]; if (!fossil) { fluid.fail("No fossil discovered for name " + name + " in fossil record above " + fluid.dumpEl(node)) } if (typeof(fossil.oldvalue) === "boolean") { newValue = newValue[0] ? true : false } var EL = root.fossils[name].EL; if (applier) { applier.fireChangeRequest({ path : EL, value : newValue, source : node.id }) } else { fluid.set(root.data, EL, newValue) } }; fluid.pathUtil = {}; var getPathSegmentImpl = function (accept, path, i) { var segment = null; if (accept) { segment = "" } var escaped = false; var limit = path.length; for (; i < limit; ++i) { var c = path.charAt(i); if (!escaped) { if (c === ".") { break } else { if (c === "\\") { escaped = true } else { if (segment !== null) { segment += c } } } } else { escaped = false; if (segment !== null) { accept += c } } } if (segment !== null) { accept[0] = segment } return i }; var globalAccept = []; fluid.pathUtil.getPathSegment = function (path, i) { getPathSegmentImpl(globalAccept, path, i); return globalAccept[0] }; fluid.pathUtil.getHeadPath = function (path) { return fluid.pathUtil.getPathSegment(path, 0) }; fluid.pathUtil.getFromHeadPath = function (path) { var firstdot = getPathSegmentImpl(null, path, 0); return firstdot === path.length ? null : path.substring(firstdot + 1) }; function lastDotIndex(path) { return path.lastIndexOf(".") } fluid.pathUtil.getToTailPath = function (path) { var lastdot = lastDotIndex(path); return lastdot === -1 ? null : path.substring(0, lastdot) }; fluid.pathUtil.getTailPath = function (path) { var lastdot = lastDotIndex(path); return fluid.pathUtil.getPathSegment(path, lastdot + 1) }; var composeSegment = function (prefix, toappend) { for (var i = 0; i < toappend.length; ++i) { var c = toappend.charAt(i); if (c === "." || c === "\\" || c === "}") { prefix += "\\" } prefix += c } return prefix }; fluid.pathUtil.composePath = function (prefix, suffix) { if (prefix.length !== 0) { prefix += "." } return composeSegment(prefix, suffix) }; fluid.pathUtil.matchPath = function (spec, path) { var togo = ""; while (true) { if (!spec || path === "") { break } if (!path) { return null } var spechead = fluid.pathUtil.getHeadPath(spec); var pathhead = fluid.pathUtil.getHeadPath(path); if (spechead !== "*" && spechead !== pathhead) { return null } togo = fluid.pathUtil.composePath(togo, pathhead); spec = fluid.pathUtil.getFromHeadPath(spec); path = fluid.pathUtil.getFromHeadPath(path) } return togo }; fluid.model.mergeModel = function (target, source, applier) { var copySource = fluid.copy(source); applier = applier || fluid.makeChangeApplier(source); if (!fluid.isPrimitive(target)) { applier.fireChangeRequest({ type : "ADD", path : "", value : target }) } applier.fireChangeRequest({ type : "MERGE", path : "", value : copySource }); return source }; fluid.model.isNullChange = function (model, request, resolverGetConfig) { if (request.type === "ADD") { var existing = fluid.get(model, request.path, resolverGetConfig); if (existing === request.value) { return true } } }; fluid.model.applyChangeRequest = function (model, request, resolverSetConfig) { var pen = fluid.model.getPenultimate(model, request.path, resolverSetConfig || fluid.model.defaultSetConfig); if (request.type === "ADD" || request.type === "MERGE") { if (request.path === "" || request.type === "MERGE") { if (request.type === "ADD") { fluid.clear(pen.root) } $.extend(true, request.path === "" ? pen.root : pen.root[pen.last], request.value) } else { pen.root[pen.last] = request.value } } else { if (request.type === "DELETE") { if (request.path === "") { fluid.clear(pen.root) } else { delete pen.root[pen.last] } } } }; function bindRequestChange(that) { that.requestChange = function (path, value, type) { var changeRequest = { path : path, value : value, type : type }; that.fireChangeRequest(changeRequest) } } fluid.makeChangeApplier = function (model, options) { options = options || {}; var baseEvents = { guards : fluid.event.getEventFirer(false, true), postGuards : fluid.event.getEventFirer(false, true), modelChanged : fluid.event.getEventFirer(false, false) }; var that = { model : model }; function makeGuardWrapper(cullUnchanged) { if (!cullUnchanged) { return null } var togo = function (guard) { return function (model, changeRequest, internalApplier) { var oldRet = guard(model, changeRequest, internalApplier); if (oldRet === false) { return false } else { if (fluid.model.isNullChange(model, changeRequest)) { togo.culled = true; return false } } } }; return togo } function wrapListener(listener, spec) { var pathSpec = spec; var transactional = false; var priority = Number.MAX_VALUE; if (typeof(spec) !== "string") { pathSpec = spec.path; transactional = spec.transactional; if (spec.priority !== undefined) { priority = spec.priority } } else { if (pathSpec.charAt(0) === "!") { transactional = true; pathSpec = pathSpec.substring(1) } } return function (changePath, fireSpec, accum) { var guid = fluid.event.identifyListener(listener); var exist = fireSpec.guids[guid]; if (!exist) { var match = fluid.pathUtil.matchPath(pathSpec, changePath); if (match !== null) { var record = { changePath : changePath, pathSpec : pathSpec, listener : listener, priority : priority, transactional : transactional }; if (accum) { record.accumulate = [accum] } fireSpec.guids[guid] = record; var collection = transactional ? "transListeners" : "listeners"; fireSpec[collection].push(record); fireSpec.all.push(record) } } else { if (accum) { if (!exist.accumulate) { exist.accumulate = [] } exist.accumulate.push(accum) } } } } function fireFromSpec(name, fireSpec, args, category, wrapper) { return baseEvents[name].fireToListeners(fireSpec[category], args, wrapper) } function fireComparator(recA, recB) { return recA.priority - recB.priority } function prepareFireEvent(name, changePath, fireSpec, accum) { baseEvents[name].fire(changePath, fireSpec, accum); fireSpec.all.sort(fireComparator); fireSpec.listeners.sort(fireComparator); fireSpec.transListeners.sort(fireComparator) } function makeFireSpec() { return { guids : {}, all : [], listeners : [], transListeners : [] } } function getFireSpec(name, changePath) { var fireSpec = makeFireSpec(); prepareFireEvent(name, changePath, fireSpec); return fireSpec } function fireEvent(name, changePath, args, wrapper) { var fireSpec = getFireSpec(name, changePath); return fireFromSpec(name, fireSpec, args, "all", wrapper) } function adaptListener(that, name) { that[name] = { addListener : function (spec, listener, namespace) { baseEvents[name].addListener(wrapListener(listener, spec), namespace) }, removeListener : function (listener) { baseEvents[name].removeListener(listener) } } } adaptListener(that, "guards"); adaptListener(that, "postGuards"); adaptListener(that, "modelChanged"); function preFireChangeRequest(changeRequest) { if (!changeRequest.type) { changeRequest.type = "ADD" } } var bareApplier = { fireChangeRequest : function (changeRequest) { that.fireChangeRequest(changeRequest, true) } }; bindRequestChange(bareApplier); that.fireChangeRequest = function (changeRequest, defeatGuards) { preFireChangeRequest(changeRequest); var guardFireSpec = defeatGuards ? null : getFireSpec("guards", changeRequest.path); if (guardFireSpec && guardFireSpec.transListeners.length > 0) { var ation = that.initiate(); ation.fireChangeRequest(changeRequest, guardFireSpec); ation.commit() } else { if (!defeatGuards) { var prevent = fireFromSpec("guards", guardFireSpec, [model, changeRequest, bareApplier], "listeners"); if (prevent === false) { return false } } var oldModel = model; if (!options.thin) { oldModel = {}; fluid.model.copyModel(oldModel, model) } fluid.model.applyChangeRequest(model, changeRequest, options.resolverSetConfig); fireEvent("modelChanged", changeRequest.path, [model, oldModel, [changeRequest]]) } }; bindRequestChange(that); function fireAgglomerated(eventName, formName, changes, args, accpos) { var fireSpec = makeFireSpec(); for (var i = 0; i < changes.length; ++i) { prepareFireEvent(eventName, changes[i].path, fireSpec, changes[i]) } for (var j = 0; j < fireSpec[formName].length; ++j) { var spec = fireSpec[formName][j]; if (accpos) { args[accpos] = spec.accumulate } var ret = spec.listener.apply(null, args); if (ret === false) { return false } } } that.initiate = function (newModel) { var cancelled = false; var changes = []; if (options.thin) { newModel = model } else { newModel = newModel || {}; fluid.model.copyModel(newModel, model) } var internalApplier = { fireChangeRequest : function (changeRequest) { preFireChangeRequest(changeRequest); fluid.model.applyChangeRequest(newModel, changeRequest, options.resolverSetConfig); changes.push(changeRequest) } }; bindRequestChange(internalApplier); var ation = { commit : function () { var oldModel; if (cancelled) { return false } var ret = fireAgglomerated("postGuards", "transListeners", changes, [newModel, null, internalApplier], 1); if (ret === false) { return false } if (options.thin) { oldModel = model } else { oldModel = {}; fluid.model.copyModel(oldModel, model); fluid.clear(model); fluid.model.copyModel(model, newModel) } fireAgglomerated("modelChanged", "all", changes, [model, oldModel, null], 2) }, fireChangeRequest : function (changeRequest) { preFireChangeRequest(changeRequest); if (options.cullUnchanged && fluid.model.isNullChange(model, changeRequest, options.resolverGetConfig)) { return } var wrapper = makeGuardWrapper(options.cullUnchanged); var prevent = fireEvent("guards", changeRequest.path, [newModel, changeRequest, internalApplier], wrapper); if (prevent === false && !(wrapper && wrapper.culled)) { cancelled = true } if (!cancelled) { if (!(wrapper && wrapper.culled)) { fluid.model.applyChangeRequest(newModel, changeRequest, options.resolverSetConfig); changes.push(changeRequest) } } } }; bindRequestChange(ation); return ation }; return that }; fluid.makeSuperApplier = function () { var subAppliers = []; var that = {}; that.addSubApplier = function (path, subApplier) { subAppliers.push({ path : path, subApplier : subApplier }) }; that.fireChangeRequest = function (request) { for (var i = 0; i < subAppliers.length; ++i) { var path = subAppliers[i].path; if (request.path.indexOf(path) === 0) { var subpath = request.path.substring(path.length + 1); var subRequest = fluid.copy(request); subRequest.path = subpath; subAppliers[i].subApplier.fireChangeRequest(subRequest) } } }; bindRequestChange(that); return that }; fluid.attachModel = function (baseModel, path, model) { var segs = fluid.model.parseEL(path); for (var i = 0; i < segs.length - 1; ++i) { var seg = segs[i]; var subModel = baseModel[seg]; if (!subModel) { baseModel[seg] = subModel = {} } baseModel = subModel } baseModel[segs[segs.length - 1]] = model }; fluid.assembleModel = function (modelSpec) { var model = {}; var superApplier = fluid.makeSuperApplier(); var togo = { model : model, applier : superApplier }; for (var path in modelSpec) { var rec = modelSpec[path]; fluid.attachModel(model, path, rec.model); if (rec.applier) { superApplier.addSubApplier(path, rec.applier) } } return togo } })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; var fluid = fluid || fluid_1_4; (function ($, fluid) { fluid.thatistBridge = function (name, peer) { var togo = function (funcname) { var segs = funcname.split("."); var move = peer; for (var i = 0; i < segs.length; ++i) { move = move[segs[i]] } var args = [this]; if (arguments.length === 2) { args = args.concat($.makeArray(arguments[1])) } var ret = move.apply(null, args); this.that = function () { return ret }; var type = typeof(ret); return !ret || type === "string" || type === "number" || type === "boolean" || ret && ret.length !== undefined ? ret : this }; $.fn[name] = togo; return togo }; fluid.thatistBridge("fluid", fluid); fluid.thatistBridge("fluid_1_4", fluid_1_4); var normalizeTabindexName = function () { return $.browser.msie ? "tabIndex" : "tabindex" }; var canHaveDefaultTabindex = function (elements) { if (elements.length <= 0) { return false } return $(elements[0]).is("a, input, button, select, area, textarea, object") }; var getValue = function (elements) { if (elements.length <= 0) { return undefined } if (!fluid.tabindex.hasAttr(elements)) { return canHaveDefaultTabindex(elements) ? Number(0) : undefined } var value = elements.attr(normalizeTabindexName()); return Number(value) }; var setValue = function (elements, toIndex) { return elements.each(function (i, item) { $(item).attr(normalizeTabindexName(), toIndex) }) }; fluid.tabindex = function (target, toIndex) { target = $(target); if (toIndex !== null && toIndex !== undefined) { return setValue(target, toIndex) } else { return getValue(target) } }; fluid.tabindex.remove = function (target) { target = $(target); return target.each(function (i, item) { $(item).removeAttr(normalizeTabindexName()) }) }; fluid.tabindex.hasAttr = function (target) { target = $(target); if (target.length <= 0) { return false } var togo = target.map(function () { var attributeNode = this.getAttributeNode(normalizeTabindexName()); return attributeNode ? attributeNode.specified : false }); return togo.length === 1 ? togo[0] : togo }; fluid.tabindex.has = function (target) { target = $(target); return fluid.tabindex.hasAttr(target) || canHaveDefaultTabindex(target) }; fluid.a11y = $.a11y || {}; fluid.a11y.orientation = { HORIZONTAL : 0, VERTICAL : 1, BOTH : 2 }; var UP_DOWN_KEYMAP = { next : $.ui.keyCode.DOWN, previous : $.ui.keyCode.UP }; var LEFT_RIGHT_KEYMAP = { next : $.ui.keyCode.RIGHT, previous : $.ui.keyCode.LEFT }; var unwrap = function (element) { return element.jquery ? element[0] : element }; var makeElementsTabFocussable = function (elements) { elements.each(function (idx, item) { item = $(item); if (!item.fluid("tabindex.has") || item.fluid("tabindex") < 0) { item.fluid("tabindex", 0) } }) }; fluid.tabbable = function (target) { target = $(target); makeElementsTabFocussable(target) }; var CONTEXT_KEY = "selectionContext"; var NO_SELECTION = -32768; var cleanUpWhenLeavingContainer = function (selectionContext) { if (selectionContext.activeItemIndex !== NO_SELECTION) { if (selectionContext.options.onLeaveContainer) { selectionContext.options.onLeaveContainer(selectionContext.selectables[selectionContext.activeItemIndex]) } else { if (selectionContext.options.onUnselect) { selectionContext.options.onUnselect(selectionContext.selectables[selectionContext.activeItemIndex]) } } } if (!selectionContext.options.rememberSelectionState) { selectionContext.activeItemIndex = NO_SELECTION } }; var drawSelection = function (elementToSelect, handler) { if (handler) { handler(elementToSelect) } }; var eraseSelection = function (selectedElement, handler) { if (handler && selectedElement) { handler(selectedElement) } }; var unselectElement = function (selectedElement, selectionContext) { eraseSelection(selectedElement, selectionContext.options.onUnselect) }; var selectElement = function (elementToSelect, selectionContext) { unselectElement(selectionContext.selectedElement(), selectionContext); elementToSelect = unwrap(elementToSelect); var newIndex = selectionContext.selectables.index(elementToSelect); if (newIndex === -1) { return } selectionContext.activeItemIndex = newIndex; drawSelection(elementToSelect, selectionContext.options.onSelect) }; var selectableFocusHandler = function (selectionContext) { return function (evt) { $(evt.target).fluid("tabindex", 0); selectElement(evt.target, selectionContext); return evt.stopPropagation() } }; var selectableBlurHandler = function (selectionContext) { return function (evt) { $(evt.target).fluid("tabindex", selectionContext.options.selectablesTabindex); unselectElement(evt.target, selectionContext); return evt.stopPropagation() } }; var reifyIndex = function (sc_that) { var elements = sc_that.selectables; if (sc_that.activeItemIndex >= elements.length) { sc_that.activeItemIndex = 0 } if (sc_that.activeItemIndex < 0 && sc_that.activeItemIndex !== NO_SELECTION) { sc_that.activeItemIndex = elements.length - 1 } if (sc_that.activeItemIndex >= 0) { fluid.focus(elements[sc_that.activeItemIndex]) } }; var prepareShift = function (selectionContext) { var selElm = selectionContext.selectedElement(); if (selElm) { fluid.blur(selElm) } unselectElement(selectionContext.selectedElement(), selectionContext); if (selectionContext.activeItemIndex === NO_SELECTION) { selectionContext.activeItemIndex = -1 } }; var focusNextElement = function (selectionContext) { prepareShift(selectionContext); ++selectionContext.activeItemIndex; reifyIndex(selectionContext) }; var focusPreviousElement = function (selectionContext) { prepareShift(selectionContext); --selectionContext.activeItemIndex; reifyIndex(selectionContext) }; var arrowKeyHandler = function (selectionContext, keyMap, userHandlers) { return function (evt) { if (evt.which === keyMap.next) { focusNextElement(selectionContext); evt.preventDefault() } else { if (evt.which === keyMap.previous) { focusPreviousElement(selectionContext); evt.preventDefault() } } } }; var getKeyMapForDirection = function (direction) { var keyMap; if (direction === fluid.a11y.orientation.HORIZONTAL) { keyMap = LEFT_RIGHT_KEYMAP } else { if (direction === fluid.a11y.orientation.VERTICAL) { keyMap = UP_DOWN_KEYMAP } } return keyMap }; var tabKeyHandler = function (selectionContext) { return function (evt) { if (evt.which !== $.ui.keyCode.TAB) { return } cleanUpWhenLeavingContainer(selectionContext); if (evt.shiftKey) { selectionContext.focusIsLeavingContainer = true } } }; var containerFocusHandler = function (selectionContext) { return function (evt) { var shouldOrig = selectionContext.options.autoSelectFirstItem; var shouldSelect = typeof(shouldOrig) === "function" ? shouldOrig() : shouldOrig; if (selectionContext.focusIsLeavingContainer) { shouldSelect = false } if (shouldSelect && evt.target === selectionContext.container.get(0)) { if (selectionContext.activeItemIndex === NO_SELECTION) { selectionContext.activeItemIndex = 0 } fluid.focus(selectionContext.selectables[selectionContext.activeItemIndex]) } return evt.stopPropagation() } }; var containerBlurHandler = function (selectionContext) { return function (evt) { selectionContext.focusIsLeavingContainer = false; return evt.stopPropagation() } }; var makeElementsSelectable = function (container, defaults, userOptions) { var options = $.extend(true, {}, defaults, userOptions); var keyMap = getKeyMapForDirection(options.direction); var selectableElements = options.selectableElements ? options.selectableElements : container.find(options.selectableSelector); var that = { container : container, activeItemIndex : NO_SELECTION, selectables : selectableElements, focusIsLeavingContainer : false, options : options }; that.selectablesUpdated = function (focusedItem) { if (typeof(that.options.selectablesTabindex) === "number") { that.selectables.fluid("tabindex", that.options.selectablesTabindex) } that.selectables.unbind("focus." + CONTEXT_KEY); that.selectables.unbind("blur." + CONTEXT_KEY); that.selectables.bind("focus." + CONTEXT_KEY, selectableFocusHandler(that)); that.selectables.bind("blur." + CONTEXT_KEY, selectableBlurHandler(that)); if (keyMap && that.options.noBubbleListeners) { that.selectables.unbind("keydown." + CONTEXT_KEY); that.selectables.bind("keydown." + CONTEXT_KEY, arrowKeyHandler(that, keyMap)) } if (focusedItem) { selectElement(focusedItem, that) } else { reifyIndex(that) } }; that.refresh = function () { if (!that.options.selectableSelector) { throw("Cannot refresh selectable context which was not initialised by a selector") } that.selectables = container.find(options.selectableSelector); that.selectablesUpdated() }; that.selectedElement = function () { return that.activeItemIndex < 0 ? null : that.selectables[that.activeItemIndex] }; if (keyMap && !that.options.noBubbleListeners) { container.keydown(arrowKeyHandler(that, keyMap)) } container.keydown(tabKeyHandler(that)); container.focus(containerFocusHandler(that)); container.blur(containerBlurHandler(that)); that.selectablesUpdated(); return that }; fluid.selectable = function (target, options) { target = $(target); var that = makeElementsSelectable(target, fluid.selectable.defaults, options); fluid.setScopedData(target, CONTEXT_KEY, that); return that }; fluid.selectable.select = function (target, toSelect) { fluid.focus(toSelect) }; fluid.selectable.selectNext = function (target) { target = $(target); focusNextElement(fluid.getScopedData(target, CONTEXT_KEY)) }; fluid.selectable.selectPrevious = function (target) { target = $(target); focusPreviousElement(fluid.getScopedData(target, CONTEXT_KEY)) }; fluid.selectable.currentSelection = function (target) { target = $(target); var that = fluid.getScopedData(target, CONTEXT_KEY); return $(that.selectedElement()) }; fluid.selectable.defaults = { direction : fluid.a11y.orientation.VERTICAL, selectablesTabindex : -1, autoSelectFirstItem : true, rememberSelectionState : true, selectableSelector : ".selectable", selectableElements : null, onSelect : null, onUnselect : null, onLeaveContainer : null }; var checkForModifier = function (binding, evt) { if (!binding.modifier) { return true } var modifierKey = binding.modifier; var isCtrlKeyPresent = modifierKey && evt.ctrlKey; var isAltKeyPresent = modifierKey && evt.altKey; var isShiftKeyPresent = modifierKey && evt.shiftKey; return isCtrlKeyPresent || isAltKeyPresent || isShiftKeyPresent }; var makeActivationHandler = function (binding) { return function (evt) { var target = evt.target; if (!fluid.enabled(evt.target)) { return } var code = evt.which ? evt.which : evt.keyCode; if (code === binding.key && binding.activateHandler && checkForModifier(binding, evt)) { var event = $.Event("fluid-activate"); $(evt.target).trigger(event, [binding.activateHandler]); if (event.isDefaultPrevented()) { evt.preventDefault() } } } }; var makeElementsActivatable = function (elements, onActivateHandler, defaultKeys, options) { var bindings = []; $(defaultKeys).each(function (index, key) { bindings.push({ modifier : null, key : key, activateHandler : onActivateHandler }) }); if (options && options.additionalBindings) { bindings = bindings.concat(options.additionalBindings) } fluid.initEnablement(elements); for (var i = 0; i < bindings.length; ++i) { var binding = bindings[i]; elements.keydown(makeActivationHandler(binding)) } elements.bind("fluid-activate", function (evt, handler) { handler = handler || onActivateHandler; return handler ? handler(evt) : null }) }; fluid.activatable = function (target, fn, options) { target = $(target); makeElementsActivatable(target, fn, fluid.activatable.defaults.keys, options) }; fluid.activate = function (target) { $(target).trigger("fluid-activate") }; fluid.activatable.defaults = { keys : [$.ui.keyCode.ENTER, $.ui.keyCode.SPACE] } })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { fluid.defaults("fluid.ariaLabeller", { labelAttribute : "aria-label", liveRegionMarkup : '
', liveRegionId : "fluid-ariaLabeller-liveRegion", invokers : { generateLiveElement : { funcName : "fluid.ariaLabeller.generateLiveElement", args : ["{ariaLabeller}"] } } }); fluid.ariaLabeller = function (element, options) { var that = fluid.initView("fluid.ariaLabeller", element, options); fluid.initDependents(that); that.update = function (newOptions) { newOptions = newOptions || that.options; that.container.attr(that.options.labelAttribute, newOptions.text); if (newOptions.dynamicLabel) { var live = fluid.jById(that.options.liveRegionId); if (live.length === 0) { live = that.generateLiveElement() } live.text(newOptions.text) } }; that.update(); return that }; fluid.ariaLabeller.generateLiveElement = function (that) { var liveEl = $(that.options.liveRegionMarkup); liveEl.prop("id", that.options.liveRegionId); $("body").append(liveEl); return liveEl }; var LABEL_KEY = "aria-labelling"; fluid.getAriaLabeller = function (element) { element = $(element); var that = fluid.getScopedData(element, LABEL_KEY); return that }; fluid.updateAriaLabel = function (element, text, options) { options = $.extend({}, options || {}, { text : text }); var that = fluid.getAriaLabeller(element); if (!that) { that = fluid.ariaLabeller(element, options); fluid.setScopedData(element, LABEL_KEY, that) } else { that.update(options) } return that }; fluid.deadMansBlur = function (control, options) { var that = fluid.initLittleComponent("fluid.deadMansBlur", options); that.blurPending = false; that.lastCancel = 0; $(control).bind("focusout", function (event) { fluid.log("Starting blur timer for element " + fluid.dumpEl(event.target)); var now = new Date().getTime(); fluid.log("back delay: " + (now - that.lastCancel)); if (now - that.lastCancel > that.options.backDelay) { that.blurPending = true } setTimeout(function () { if (that.blurPending) { that.options.handler(control) } }, that.options.delay) }); that.canceller = function (event) { fluid.log("Cancellation through " + event.type + " on " + fluid.dumpEl(event.target)); that.lastCancel = new Date().getTime(); that.blurPending = false }; fluid.each(that.options.exclusions, function (exclusion) { exclusion = $(exclusion); fluid.each(exclusion, function (excludeEl) { $(excludeEl).bind("focusin", that.canceller).bind("fluid-focus", that.canceller).click(that.canceller).mousedown(that.canceller) }) }); return that }; fluid.defaults("fluid.deadMansBlur", { delay : 150, backDelay : 100 }) })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { var inCreationMarker = "__CURRENTLY_IN_CREATION__"; fluid.isFireBreak = function (component) { return component.options && component.options["fluid.visitComponents.fireBreak"] }; fluid.visitComponentChildren = function (that, visitor, options, up, down) { options = options || {}; for (var name in that) { var component = that[name]; if (!component || !component.typeName || (component.id && options.visited && options.visited[component.id])) { continue } if (options.visited) { options.visited[component.id] = true } if (visitor(component, name, options, up, down)) { return true } if (!fluid.isFireBreak(component) && !options.flat) { fluid.visitComponentChildren(component, visitor, options, up, down + 1) } } }; var visitComponents = function (thatStack, visitor, options) { options = options || { visited : {}, flat : true }; var up = 0; for (var i = thatStack.length - 1; i >= 0; --i) { var that = thatStack[i]; if (fluid.isFireBreak(that)) { return } if (that.typeName) { options.visited[that.id] = true; if (visitor(that, "", options, 0, 0)) { return } } if (fluid.visitComponentChildren(that, visitor, options, up, 1)) { return } ++up } }; function makeGingerStrategy(instantiator, that, thatStack) { return function (component, thisSeg) { var atval = component[thisSeg]; if (atval === undefined) { var parentPath = instantiator.idToPath[component.id]; atval = instantiator.pathToComponent[fluid.composePath(parentPath, thisSeg)]; if (atval) { atval[inCreationMarker] = true } } if (atval !== undefined) { if (atval[inCreationMarker]) { fluid.fail("Component " + fluid.dumpThat(atval) + ' at path "' + thisSeg + '" of parent ' + fluid.dumpThat(component) + " cannot be used for lookup since it is still in creation. Please reorganise your dependencies so that they no longer contain circular references") } } else { if (fluid.get(component, fluid.path("options", "components", thisSeg, "type"))) { fluid.initDependent(component, thisSeg); atval = component[thisSeg] } } return atval } } fluid.dumpThat = function (that, instantiator) { return '{ typeName: "' + that.typeName + '" id: ' + that.id + "}" }; fluid.dumpThatStack = function (thatStack, instantiator) { var togo = fluid.transform(thatStack, function (that) { var path = instantiator.idToPath[that.id]; return fluid.dumpThat(that) + (path ? (" - path: " + path) : "") }); return togo.join("\n") }; fluid.describeActivity = function () { return fluid.threadLocal().activityStack || [] }; fluid.pushActivity = function (func, message) { if (!message) { return func() } var root = fluid.threadLocal(); if (!root.activityStack) { root.activityStack = [] } var frames = fluid.makeArray(message); frames.push("\n"); frames.unshift("\n"); root.activityStack = frames.concat(root.activityStack); return fluid.tryCatch(func, null, function () { root.activityStack = root.activityStack.slice(frames.length) }) }; fluid.wrapActivity = function (func, messageSpec) { return function () { var args = fluid.makeArray(arguments); var message = fluid.transform(fluid.makeArray(messageSpec), function (specEl) { if (specEl.indexOf("arguments.") === 0) { var el = specEl.substring("arguments.".length); return fluid.get(args, el) } else { return specEl } }); return fluid.pushActivity(function () { return func.apply(null, args) }, message) } }; var localRecordExpected = /arguments|options|container/; function makeStackFetcher(instantiator, parentThat, localRecord, expandOptions) { expandOptions = expandOptions || {}; var thatStack = instantiator.getFullStack(parentThat); var fetchStrategies = [fluid.model.funcResolverStrategy, makeGingerStrategy(instantiator, parentThat, thatStack)]; var fetcher = function (parsed) { var context = parsed.context; if (localRecord && localRecordExpected.test(context)) { var fetched = fluid.get(localRecord[context], parsed.path); return (context === "arguments" || expandOptions.direct) ? fetched : { marker : context === "options" ? fluid.EXPAND : fluid.EXPAND_NOW, value : fetched } } var foundComponent; visitComponents(thatStack, function (component, name, options, up, down) { if (context === name || context === component.typeName || context === component.nickName) { foundComponent = component; if (down > 1) { fluid.log("***WARNING: value resolution for context " + context + " found at depth " + down + ": this may not be supported in future") } return true } if (fluid.get(component, fluid.path("options", "components", context, "type")) && !component[context]) { foundComponent = fluid.get(component, context, { strategies : fetchStrategies }); return true } }); if (!foundComponent && parsed.path !== "") { var ref = fluid.renderContextReference(parsed); fluid.log("Failed to resolve reference " + ref + ": thatStack contains\n" + fluid.dumpThatStack(thatStack, instantiator)); fluid.fail("Failed to resolve reference " + ref + " - could not match context with name " + context + " from component root of type " + thatStack[0].typeName, "\ninstantiator contents: ", instantiator) } return fluid.get(foundComponent, parsed.path, fetchStrategies) }; return fetcher } function makeStackResolverOptions(instantiator, parentThat, localRecord, expandOptions) { return $.extend({}, fluid.defaults("fluid.resolveEnvironment"), { fetcher : makeStackFetcher(instantiator, parentThat, localRecord, expandOptions) }) } fluid.instantiator = function (freeInstantiator) { var preThat = { options : { "fluid.visitComponents.fireBreak" : true }, idToPath : {}, pathToComponent : {}, stackCount : 0, nickName : "instantiator" }; var that = fluid.typeTag("fluid.instantiator"); that = $.extend(that, preThat); that.stack = function (count) { return that.stackCount += count }; that.getThatStack = function (component) { var path = that.idToPath[component.id] || ""; var parsed = fluid.model.parseEL(path); var togo = fluid.transform(parsed, function (value, i) { var parentPath = fluid.model.composeSegments.apply(null, parsed.slice(0, i + 1)); return that.pathToComponent[parentPath] }); var root = that.pathToComponent[""]; if (root) { togo.unshift(root) } return togo }; that.getEnvironmentalStack = function () { var togo = [fluid.staticEnvironment]; if (!freeInstantiator) { togo.push(fluid.threadLocal()) } return togo }; that.getFullStack = function (component) { var thatStack = component ? that.getThatStack(component) : []; return that.getEnvironmentalStack().concat(thatStack) }; function recordComponent(component, path) { that.idToPath[component.id] = path; if (that.pathToComponent[path]) { fluid.fail("Error during instantiation - path " + path + " which has just created component " + fluid.dumpThat(component) + " has already been used for component " + fluid.dumpThat(that.pathToComponent[path]) + " - this is a circular instantiation or other oversight. Please clear the component using instantiator.clearComponent() before reusing the path.") } that.pathToComponent[path] = component } that.recordRoot = function (component) { if (component && component.id && !that.pathToComponent[""]) { recordComponent(component, "") } }; that.pushUpcomingInstantiation = function (parent, name) { that.expectedParent = parent; that.expectedName = name }; that.recordComponent = function (component) { if (that.expectedName) { that.recordKnownComponent(that.expectedParent, component, that.expectedName); delete that.expectedName; delete that.expectedParent } else { that.recordRoot(component) } }; that.clearComponent = function (component, name, child, options, noModTree) { options = options || { visited : {}, flat : true }; child = child || component[name]; fluid.visitComponentChildren(child, function (gchild, gchildname) { that.clearComponent(child, gchildname, null, options, noModTree) }, options); var path = that.idToPath[child.id]; delete that.idToPath[child.id]; delete that.pathToComponent[path]; if (!noModTree) { delete component[name] } }; that.recordKnownComponent = function (parent, component, name) { var parentPath = that.idToPath[parent.id] || ""; var path = fluid.model.composePath(parentPath, name); recordComponent(component, path) }; return that }; fluid.freeInstantiator = fluid.instantiator(true); fluid.argMapToDemands = function (argMap) { var togo = []; fluid.each(argMap, function (value, key) { togo[value] = "{" + key + "}" }); return togo }; fluid.makePassArgsSpec = function (initArgs) { return fluid.transform(initArgs, function (arg, index) { return "{arguments}." + index }) }; function mergeToMergeAll(options) { if (options && options.mergeOptions) { options.mergeAllOptions = ["{options}"].concat(fluid.makeArray(options.mergeOptions)) } } function upgradeMergeOptions(demandspec) { mergeToMergeAll(demandspec); if (demandspec.mergeAllOptions) { if (demandspec.options) { fluid.fail("demandspec ", demandspec, " is invalid - cannot specify literal options together with mergeOptions or mergeAllOptions") } demandspec.options = { mergeAllOptions : demandspec.mergeAllOptions } } if (demandspec.options) { delete demandspec.options.mergeOptions } } fluid.embodyDemands = function (instantiator, parentThat, demandspec, initArgs, options) { options = options || {}; upgradeMergeOptions(demandspec); var oldOptions = fluid.get(options, "componentRecord.options"); options.componentRecord = $.extend(true, {}, options.componentRecord, fluid.censorKeys(demandspec, ["args", "funcName", "registeredFrom"])); var mergeAllZero = fluid.get(options, "componentRecord.options.mergeAllOptions.0"); if (mergeAllZero === "{options}") { fluid.set(options, "componentRecord.options.mergeAllOptions.0", oldOptions) } var demands = $.makeArray(demandspec.args); var upDefaults = fluid.defaults(demandspec.funcName); var argMap = upDefaults ? upDefaults.argumentMap : null; var inferMap = false; if (!argMap && (upDefaults || (options && options.componentRecord)) && !options.passArgs) { inferMap = true; if (demands.length < 2) { argMap = fluid.rawDefaults("fluid.littleComponent").argumentMap } else { argMap = { options : demands.length - 1 } } } options = options || {}; if (demands.length === 0) { if (options.componentRecord && argMap) { demands = fluid.argMapToDemands(argMap) } else { if (options.passArgs) { demands = fluid.makePassArgsSpec(initArgs) } } } var localRecord = $.extend({ arguments : initArgs }, fluid.censorKeys(options.componentRecord, ["type"])); fluid.each(argMap, function (index, name) { if (initArgs.length > 0) { localRecord[name] = localRecord.arguments[index] } if (demandspec[name] !== undefined && localRecord[name] === undefined) { localRecord[name] = demandspec[name] } }); mergeToMergeAll(localRecord.options); mergeToMergeAll(argMap && demands[argMap.options]); var upstreamLocalRecord = $.extend({}, localRecord); if (options.componentRecord.options !== undefined) { upstreamLocalRecord.options = options.componentRecord.options } var expandOptions = makeStackResolverOptions(instantiator, parentThat, localRecord); var args = []; if (demands) { for (var i = 0; i < demands.length; ++i) { var arg = demands[i]; if (fluid.isMarker(arg) && arg.value === fluid.COMPONENT_OPTIONS.value) { arg = "{options}"; if (inferMap) { argMap = { options : i } } } if (typeof(arg) === "string") { if (arg.charAt(0) === "@") { var argpos = arg.substring(1); arg = "{arguments}." + argpos } } if (!argMap || argMap.options !== i) { args[i] = fluid.expander.expandLight(arg, expandOptions) } else { if (arg && typeof(arg) === "object" && !arg.targetTypeName) { arg.targetTypeName = demandspec.funcName } args[i] = { marker : fluid.EXPAND, value : fluid.copy(arg), localRecord : upstreamLocalRecord } } if (args[i] && fluid.isMarker(args[i].marker, fluid.EXPAND_NOW)) { args[i] = fluid.expander.expandLight(args[i].value, expandOptions) } } } else { args = initArgs ? initArgs : [] } var togo = { args : args, funcName : demandspec.funcName }; return togo }; var aliasTable = {}; fluid.alias = function (demandingName, aliasName) { if (aliasName) { aliasTable[demandingName] = aliasName } else { return aliasTable[demandingName] } }; var dependentStore = {}; function searchDemands(demandingName, contextNames) { var exist = dependentStore[demandingName] || []; outer : for (var i = 0; i < exist.length; ++i) { var rec = exist[i]; for (var j = 0; j < contextNames.length; ++j) { if (rec.contexts[j] !== contextNames[j]) { continue outer } } return rec.spec } } fluid.demands = function (demandingName, contextName, spec) { var contextNames = $.makeArray(contextName).sort(); if (!spec) { return searchDemands(demandingName, contextNames) } else { if (spec.length) { spec = { args : spec } } } if (fluid.getCallerInfo) { var callerInfo = fluid.getCallerInfo(5); if (callerInfo) { spec.registeredFrom = callerInfo } } var exist = dependentStore[demandingName]; if (!exist) { exist = []; dependentStore[demandingName] = exist } exist.push({ contexts : contextNames, spec : spec }) }; fluid.compareDemands = function (speca, specb) { var p1 = speca.uncess - specb.uncess; return p1 === 0 ? specb.intersect - speca.intersect : p1 }; fluid.isDemandLogging = function (demandingNames) { return fluid.isLogging() && demandingNames[0] !== "fluid.threadLocal" }; fluid.locateAllDemands = function (instantiator, parentThat, demandingNames) { var demandLogging = fluid.isDemandLogging(demandingNames); if (demandLogging) { fluid.log("Resolving demands for function names ", demandingNames, " in context of " + (parentThat ? "component " + parentThat.typeName : "no component")) } var contextNames = {}; var visited = []; var thatStack = instantiator.getFullStack(parentThat); visitComponents(thatStack, function (component, xname, options, up, down) { contextNames[component.typeName] = true; visited.push(component) }); if (demandLogging) { fluid.log("Components in scope for resolution:\n" + fluid.dumpThatStack(visited, instantiator)) } var matches = []; for (var i = 0; i < demandingNames.length; ++i) { var rec = dependentStore[demandingNames[i]] || []; for (var j = 0; j < rec.length; ++j) { var spec = rec[j]; var record = { spec : spec, intersect : 0, uncess : 0 }; for (var k = 0; k < spec.contexts.length; ++k) { record[contextNames[spec.contexts[k]] ? "intersect" : "uncess"] += 2 } if (spec.contexts.length === 0) { record.intersect++ } matches.push(record) } } matches.sort(fluid.compareDemands); return matches }; fluid.locateDemands = function (instantiator, parentThat, demandingNames) { var matches = fluid.locateAllDemands(instantiator, parentThat, demandingNames); var demandspec = matches.length === 0 || matches[0].intersect === 0 ? null : matches[0].spec.spec; if (fluid.isDemandLogging(demandingNames)) { if (demandspec) { fluid.log("Located " + matches.length + " potential match" + (matches.length === 1 ? "" : "es") + ", selected best match with " + matches[0].intersect + " matched context names: ", demandspec) } else { fluid.log("No matches found for demands, using direct implementation") } } return demandspec }; fluid.determineDemands = function (instantiator, parentThat, funcNames) { funcNames = $.makeArray(funcNames); var newFuncName = funcNames[0]; var demandspec = fluid.locateDemands(instantiator, parentThat, funcNames) || {}; if (demandspec.funcName) { newFuncName = demandspec.funcName } var aliasTo = fluid.alias(newFuncName); if (aliasTo) { newFuncName = aliasTo; fluid.log("Following redirect from function name " + newFuncName + " to " + aliasTo); var demandspec2 = fluid.locateDemands(instantiator, parentThat, [aliasTo]); if (demandspec2) { fluid.each(demandspec2, function (value, key) { if (localRecordExpected.test(key)) { fluid.fail("Error in demands block ", demandspec2, ' - content with key "' + key + '" is not supported since this demands block was resolved via an alias from "' + newFuncName + '"') } }); if (demandspec2.funcName) { newFuncName = demandspec2.funcName; fluid.log('Followed final inner demands to function name "' + newFuncName + '"') } } } return fluid.merge(null, { funcName : newFuncName, args : fluid.makeArray(demandspec.args) }, fluid.censorKeys(demandspec, ["funcName", "args"])) }; fluid.resolveDemands = function (instantiator, parentThat, funcNames, initArgs, options) { var demandspec = fluid.determineDemands(instantiator, parentThat, funcNames); return fluid.embodyDemands(instantiator, parentThat, demandspec, initArgs, options) }; fluid.invoke = function (functionName, args, that, environment) { args = fluid.makeArray(args); return fluid.withInstantiator(that, function (instantiator) { var invokeSpec = fluid.resolveDemands(instantiator, that, functionName, args, { passArgs : true }); return fluid.invokeGlobalFunction(invokeSpec.funcName, invokeSpec.args, environment) }) }; fluid.invoke = fluid.wrapActivity(fluid.invoke, [' while invoking function with name "', "arguments.0", '" from component', "arguments.2"]); fluid.makeFreeInvoker = function (functionName, environment) { var demandSpec = fluid.determineDemands(fluid.freeInstantiator, null, functionName); return function () { var invokeSpec = fluid.embodyDemands(fluid.freeInstantiator, null, demandSpec, arguments, { passArgs : true }); return fluid.invokeGlobalFunction(invokeSpec.funcName, invokeSpec.args, environment) } }; fluid.makeInvoker = function (instantiator, that, demandspec, functionName, environment) { demandspec = demandspec || fluid.determineDemands(instantiator, that, functionName); return function () { var args = arguments; return fluid.pushActivity(function () { var invokeSpec = fluid.embodyDemands(instantiator, that, demandspec, args, { passArgs : true }); return fluid.invokeGlobalFunction(invokeSpec.funcName, invokeSpec.args, environment) }, [" while invoking invoker with name " + functionName + " on component", that]) } }; fluid.event.dispatchListener = function (instantiator, that, listener, eventName, eventSpec) { return function () { var demandspec = fluid.determineDemands(instantiator, that, eventName); if (demandspec.args.length === 0 && eventSpec.args) { demandspec.args = eventSpec.args } var resolved = fluid.embodyDemands(instantiator, that, demandspec, arguments, { passArgs : true, componentOptions : eventSpec }); listener.apply(null, resolved.args) } }; fluid.event.resolveEvent = function (that, eventName, eventSpec) { return fluid.withInstantiator(that, function (instantiator) { if (typeof(eventSpec) === "string") { var firer = fluid.expandOptions(eventSpec, that); if (!firer) { fluid.fail("Error in fluid.event.resolveEvent - context path " + eventSpec + " could not be looked up to a valid event firer") } return firer } else { var event = eventSpec.event; var origin; if (!event) { fluid.fail("Event specification for event with name " + eventName + " does not include a base event specification") } if (event.charAt(0) === "{") { origin = fluid.expandOptions(event, that) } else { origin = that.events[event] } if (!origin) { fluid.fail("Error in event specification - could not resolve base event reference " + event + " to an event firer") } var firer = {}; fluid.each(["fire", "removeListener"], function (method) { firer[method] = function () { origin[method].apply(null, arguments) } }); firer.addListener = function (listener, namespace, predicate, priority) { origin.addListener(fluid.event.dispatchListener(instantiator, that, listener, eventName, eventSpec), namespace, predicate, priority) }; return firer } }) }; fluid.registerNamespace("fluid.expander"); fluid.expander.preserveFromExpansion = function (options) { var preserve = {}; var preserveList = fluid.arrayToHash(["mergePolicy", "mergeAllOptions", "components", "invokers", "events", "listeners", "transformOptions"]); fluid.each(options.mergePolicy, function (value, key) { if (fluid.mergePolicyIs(value, "noexpand")) { preserveList[key] = true } }); fluid.each(preserveList, function (xvalue, path) { var pen = fluid.model.getPenultimate(options, path); var value = pen.root[pen.last]; delete pen.root[pen.last]; fluid.set(preserve, path, value) }); return { restore : function (target) { fluid.each(preserveList, function (xvalue, path) { var preserved = fluid.get(preserve, path); if (preserved !== undefined) { fluid.set(target, path, preserved) } }) } } }; fluid.expandOptions = function (args, that, localRecord, outerExpandOptions) { if (!args) { return args } return fluid.withInstantiator(that, function (instantiator) { var expandOptions = makeStackResolverOptions(instantiator, that, localRecord, outerExpandOptions); expandOptions.noCopy = true; var pres; if (!fluid.isArrayable(args) && !fluid.isPrimitive(args)) { pres = fluid.expander.preserveFromExpansion(args) } var expanded = fluid.expander.expandLight(args, expandOptions); if (pres) { pres.restore(expanded) } return expanded }) }; fluid.locateTransformationRecord = function (that) { return fluid.withInstantiator(that, function (instantiator) { var matches = fluid.locateAllDemands(instantiator, that, ["fluid.transformOptions"]); return fluid.find(matches, function (match) { return match.uncess === 0 && fluid.contains(match.spec.contexts, that.typeName) ? match.spec.spec : undefined }) }) }; fluid.hashToArray = function (hash) { var togo = []; fluid.each(hash, function (value, key) { togo.push(key) }); return togo }; fluid.localRecordExpected = ["type", "options", "arguments", "mergeOptions", "mergeAllOptions", "createOnEvent", "priority"]; fluid.checkComponentRecord = function (defaults, localRecord) { var expected = fluid.arrayToHash(fluid.localRecordExpected); fluid.each(defaults.argumentMap, function (value, key) { expected[key] = true }); fluid.each(localRecord, function (value, key) { if (!expected[key]) { fluid.fail('Probable error in subcomponent record - key "' + key + '" found, where the only legal options are ' + fluid.hashToArray(expected).join(", ")) } }) }; fluid.expandComponentOptions = function (defaults, userOptions, that) { if (userOptions && userOptions.localRecord) { fluid.checkComponentRecord(defaults, userOptions.localRecord) } defaults = fluid.expandOptions(fluid.copy(defaults), that); var localRecord = {}; if (userOptions && userOptions.marker === fluid.EXPAND) { var localOptions = fluid.get(userOptions, "localRecord.options"); if (localOptions) { if (defaults && defaults.mergePolicy) { localOptions.mergePolicy = defaults.mergePolicy } localRecord.options = fluid.expandOptions(localOptions, that) } localRecord.arguments = fluid.get(userOptions, "localRecord.arguments"); var toExpand = userOptions.value; userOptions = fluid.expandOptions(toExpand, that, localRecord, { direct : true }) } localRecord.directOptions = userOptions; if (!localRecord.options) { localRecord.options = userOptions } var mergeOptions = (userOptions && userOptions.mergeAllOptions) || ["{directOptions}"]; var togo = fluid.transform(mergeOptions, function (path) { return path === "{directOptions}" ? localRecord.directOptions : fluid.expandOptions(path, that, localRecord, { direct : true }) }); var transRec = fluid.locateTransformationRecord(that); if (transRec) { togo[0].transformOptions = transRec.options } return [defaults].concat(togo) }; fluid.expandComponentOptions = fluid.wrapActivity(fluid.expandComponentOptions, [" while expanding component options ", "arguments.1.value", " with record ", "arguments.1", " for component ", "arguments.2"]); fluid.initDependent = function (that, name, userInstantiator, directArgs) { if (!that || that[name]) { return } fluid.log('Beginning instantiation of component with name "' + name + '" as child of ' + fluid.dumpThat(that)); directArgs = directArgs || []; var root = fluid.threadLocal(); if (userInstantiator) { var existing = root["fluid.instantiator"]; if (existing && existing !== userInstantiator) { fluid.fail("Error in initDependent: user instantiator supplied with id " + userInstantiator.id + " which differs from that for currently active instantiation with id " + existing.id) } else { root["fluid.instantiator"] = userInstantiator } } var component = that.options.components[name]; fluid.withInstantiator(that, function (instantiator) { if (typeof(component) === "string") { that[name] = fluid.expandOptions([component], that)[0] } else { if (component.type) { var invokeSpec = fluid.resolveDemands(instantiator, that, [component.type, name], directArgs, { componentRecord : component }); instantiator.pushUpcomingInstantiation(that, name); fluid.tryCatch(function () { that[inCreationMarker] = true; var instance = fluid.initSubcomponentImpl(that, { type : invokeSpec.funcName }, invokeSpec.args); var path = fluid.composePath(instantiator.idToPath[that.id] || "", name); var existing = instantiator.pathToComponent[path]; if (existing && existing !== instance) { instantiator.clearComponent(that, name, existing, null, true) } if (instance && instance.typeName && instance.id && instance !== existing) { instantiator.recordKnownComponent(that, instance, name) } that[name] = instance }, null, function () { delete that[inCreationMarker]; instantiator.pushUpcomingInstantiation() }) } else { that[name] = component } } }, [' while instantiating dependent component with name "' + name + '" with record ', component, " as child of ", that]); fluid.log('Finished instantiation of component with name "' + name + '" as child of ' + fluid.dumpThat(that)) }; fluid.withInstantiator = function (that, func, message) { var root = fluid.threadLocal(); var instantiator = root["fluid.instantiator"]; if (!instantiator) { instantiator = root["fluid.instantiator"] = fluid.instantiator() } return fluid.pushActivity(function () { return fluid.tryCatch(function () { if (that) { instantiator.recordComponent(that) } instantiator.stack(1); return func(instantiator) }, null, function () { var count = instantiator.stack(-1); if (count === 0) { delete root["fluid.instantiator"] } }) }, message) }; fluid.bindDeferredComponent = function (that, componentName, component, instantiator) { var events = fluid.makeArray(component.createOnEvent); fluid.each(events, function (eventName) { that.events[eventName].addListener(function () { if (that[componentName]) { instantiator.clearComponent(that, componentName) } fluid.initDependent(that, componentName, instantiator) }, null, null, component.priority) }) }; fluid.priorityForComponent = function (component) { return component.priority ? component.priority : (component.type === "fluid.typeFount" || fluid.hasGrade(fluid.defaults(component.type), "fluid.typeFount")) ? "first" : undefined }; fluid.initDependents = function (that) { var options = that.options; var components = options.components || {}; var componentSort = {}; fluid.withInstantiator(that, function (instantiator) { fluid.each(components, function (component, name) { if (!component.createOnEvent) { var priority = fluid.priorityForComponent(component); componentSort[name] = { key : name, priority : fluid.event.mapPriority(priority, 0) } } else { fluid.bindDeferredComponent(that, name, component, instantiator) } }); var componentList = fluid.event.sortListeners(componentSort); fluid.each(componentList, function (entry) { fluid.initDependent(that, entry.key) }); var invokers = options.invokers || {}; for (var name in invokers) { var invokerec = invokers[name]; var funcName = typeof(invokerec) === "string" ? invokerec : null; that[name] = fluid.withInstantiator(that, function (instantiator) { fluid.log('Beginning instantiation of invoker with name "' + name + '" as child of ' + fluid.dumpThat(that)); return fluid.makeInvoker(instantiator, that, funcName ? null : invokerec, funcName) }, [' while instantiating invoker with name "' + name + '" with record ', invokerec, " as child of ", that]); fluid.log('Finished instantiation of invoker with name "' + name + '" as child of ' + fluid.dumpThat(that)) } }) }; fluid.staticEnvironment = fluid.typeTag("fluid.staticEnvironment"); fluid.staticEnvironment.environmentClass = fluid.typeTag("fluid.browser"); fluid.demands("fluid.threadLocal", "fluid.browser", { funcName : "fluid.singleThreadLocal" }); var singleThreadLocal = fluid.typeTag("fluid.dynamicEnvironment"); fluid.singleThreadLocal = function () { return singleThreadLocal }; fluid.threadLocal = function () { var demands = fluid.locateDemands(fluid.freeInstantiator, null, ["fluid.threadLocal"]); return fluid.invokeGlobalFunction(demands.funcName, arguments) }; function applyLocalChange(applier, type, path, value) { var change = { type : type, path : path, value : value }; applier.fireChangeRequest(change) } fluid.withEnvironment = function (envAdd, func, prefix) { prefix = prefix || ""; var root = fluid.threadLocal(); var applier = fluid.makeChangeApplier(root, { thin : true }); return fluid.tryCatch(function () { for (var key in envAdd) { applyLocalChange(applier, "ADD", fluid.model.composePath(prefix, key), envAdd[key]) } $.extend(root, envAdd); return func() }, null, function () { for (var key in envAdd) { applyLocalChange(applier, "DELETE", fluid.model.composePath(prefix, key)) } }) }; fluid.makeEnvironmentFetcher = function (prefix, directModel) { return function (parsed) { var env = fluid.get(fluid.threadLocal(), prefix); return fluid.fetchContextReference(parsed, directModel, env) } }; fluid.extractEL = function (string, options) { if (options.ELstyle === "ALL") { return string } else { if (options.ELstyle.length === 1) { if (string.charAt(0) === options.ELstyle) { return string.substring(1) } } else { if (options.ELstyle === "${}") { var i1 = string.indexOf("${"); var i2 = string.lastIndexOf("}"); if (i1 === 0 && i2 !== -1) { return string.substring(2, i2) } } } } }; fluid.extractELWithContext = function (string, options) { var EL = fluid.extractEL(string, options); if (EL && EL.charAt(0) === "{") { return fluid.parseContextReference(EL, 0) } return EL ? { path : EL } : EL }; fluid.parseContextReference = function (reference, index, delimiter) { var endcpos = reference.indexOf("}", index + 1); if (endcpos === -1) { fluid.fail('Cannot parse context reference "' + reference + '": Malformed context reference without }') } var context = reference.substring(index + 1, endcpos); var endpos = delimiter ? reference.indexOf(delimiter, endcpos + 1) : reference.length; var path = reference.substring(endcpos + 1, endpos); if (path.charAt(0) === ".") { path = path.substring(1) } return { context : context, path : path, endpos : endpos } }; fluid.renderContextReference = function (parsed) { return "{" + parsed.context + "}" + parsed.path }; fluid.fetchContextReference = function (parsed, directModel, env) { var base = parsed.context ? env[parsed.context] : directModel; if (!base) { return base } return fluid.get(base, parsed.path) }; fluid.resolveContextValue = function (string, options) { if (options.bareContextRefs && string.charAt(0) === "{") { var parsed = fluid.parseContextReference(string, 0); return options.fetcher(parsed) } else { if (options.ELstyle && options.ELstyle !== "${}") { var parsed = fluid.extractELWithContext(string, options); if (parsed) { return options.fetcher(parsed) } } } while (typeof(string) === "string") { var i1 = string.indexOf("${"); var i2 = string.indexOf("}", i1 + 2); if (i1 !== -1 && i2 !== -1) { var parsed; if (string.charAt(i1 + 2) === "{") { parsed = fluid.parseContextReference(string, i1 + 2, "}"); i2 = parsed.endpos } else { parsed = { path : string.substring(i1 + 2, i2) } } var subs = options.fetcher(parsed); var all = (i1 === 0 && i2 === string.length - 1); if (subs === undefined || subs === null) { return subs } string = all ? subs : string.substring(0, i1) + subs + string.substring(i2 + 1) } else { break } } return string }; fluid.resolveContextValue = fluid.wrapActivity(fluid.resolveContextValue, [" while resolving context value ", "arguments.0"]); function resolveEnvironmentImpl(obj, options) { fluid.guardCircularity(options.seenIds, obj, "expansion", ' - please ensure options are not circularly connected, or protect from expansion using the "noexpand" policy or expander'); function recurse(arg) { return resolveEnvironmentImpl(arg, options) } if (typeof(obj) === "string" && !options.noValue) { return fluid.resolveContextValue(obj, options) } else { if (fluid.isPrimitive(obj) || obj.nodeType !== undefined || obj.jquery) { return obj } else { if (options.filter) { return options.filter(obj, recurse, options) } else { return (options.noCopy ? fluid.each : fluid.transform)(obj, function (value, key) { return resolveEnvironmentImpl(value, options) }) } } } } fluid.defaults("fluid.resolveEnvironment", { ELstyle : "${}", seenIds : {}, bareContextRefs : true }); fluid.resolveEnvironment = function (obj, options) { options = $.extend(true, {}, fluid.rawDefaults("fluid.resolveEnvironment"), options); return resolveEnvironmentImpl(obj, options) }; fluid.expander.deferredCall = function (target, source, recurse) { var expander = source.expander; var args = (!expander.args || fluid.isArrayable(expander.args)) ? expander.args : $.makeArray(expander.args); args = recurse(args); return fluid.invokeGlobalFunction(expander.func, args) }; fluid.deferredCall = fluid.expander.deferredCall; fluid.deferredInvokeCall = function (target, source, recurse) { var expander = source.expander; var args = (!expander.args || fluid.isArrayable(expander.args)) ? expander.args : $.makeArray(expander.args); args = recurse(args); return fluid.invoke(expander.func, args) }; fluid.expander.noexpand = function (target, source) { return $.extend(target, source.expander.tree) }; fluid.noexpand = fluid.expander.noexpand; fluid.expander.lightFilter = function (obj, recurse, options) { var togo; if (fluid.isArrayable(obj)) { togo = options.noCopy ? obj : []; fluid.each(obj, function (value, key) { togo[key] = recurse(value) }) } else { togo = options.noCopy ? obj : {}; for (var key in obj) { var value = obj[key]; var expander; if (key === "expander" && !(options.expandOnly && options.expandOnly[value.type])) { expander = fluid.getGlobalValue(value.type); if (expander) { return expander.call(null, togo, obj, recurse, options) } } if (key !== "expander" || !expander) { togo[key] = recurse(value) } } } return options.noCopy ? obj : togo }; fluid.expander.expandLight = function (source, expandOptions) { var options = $.extend({}, expandOptions); options.filter = fluid.expander.lightFilter; return fluid.resolveEnvironment(source, options) } })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { var resourceCache = {}; var pendingClass = {}; fluid.fetchResources = function (resourceSpecs, callback, options) { var that = fluid.initLittleComponent("fluid.fetchResources", options); that.resourceSpecs = resourceSpecs; that.callback = callback; that.operate = function () { fluid.fetchResources.fetchResourcesImpl(that) }; fluid.each(resourceSpecs, function (resourceSpec) { resourceSpec.recurseFirer = fluid.event.getEventFirer(); resourceSpec.recurseFirer.addListener(that.operate); if (resourceSpec.url && !resourceSpec.href) { resourceSpec.href = resourceSpec.url } }); if (that.options.amalgamateClasses) { fluid.fetchResources.amalgamateClasses(resourceSpecs, that.options.amalgamateClasses, that.operate) } that.operate(); return that }; fluid.fetchResources.amalgamateClasses = function (specs, classes, operator) { fluid.each(classes, function (clazz) { var pending = pendingClass[clazz]; fluid.each(pending, function (pendingrec, canon) { specs[clazz + "!" + canon] = pendingrec; pendingrec.recurseFirer.addListener(operator) }) }) }; fluid.fetchResources.timeSuccessCallback = function (resourceSpec) { if (resourceSpec.timeSuccess && resourceSpec.options && resourceSpec.options.success) { var success = resourceSpec.options.success; resourceSpec.options.success = function () { var startTime = new Date(); var ret = success.apply(null, arguments); fluid.log("External callback for URL " + resourceSpec.href + " completed - callback time: " + (new Date().getTime() - startTime.getTime()) + "ms"); return ret } } }; function canonUrl(url) { return url } fluid.fetchResources.clearResourceCache = function (url) { if (url) { delete resourceCache[canonUrl(url)] } else { fluid.clear(resourceCache) } }; fluid.fetchResources.handleCachedRequest = function (resourceSpec, response) { var canon = canonUrl(resourceSpec.href); var cached = resourceCache[canon]; if (cached.$$firer$$) { fluid.log("Handling request for " + canon + " from cache"); var fetchClass = resourceSpec.fetchClass; if (fetchClass && pendingClass[fetchClass]) { fluid.log("Clearing pendingClass entry for class " + fetchClass); delete pendingClass[fetchClass][canon] } resourceCache[canon] = response; cached.fire(response) } }; fluid.fetchResources.completeRequest = function (thisSpec, recurseCall) { thisSpec.queued = false; thisSpec.completeTime = new Date(); fluid.log("Request to URL " + thisSpec.href + " completed - total elapsed time: " + (thisSpec.completeTime.getTime() - thisSpec.initTime.getTime()) + "ms"); thisSpec.recurseFirer.fire() }; fluid.fetchResources.makeResourceCallback = function (thisSpec) { return { success : function (response) { thisSpec.resourceText = response; thisSpec.resourceKey = thisSpec.href; if (thisSpec.forceCache) { fluid.fetchResources.handleCachedRequest(thisSpec, response) } fluid.fetchResources.completeRequest(thisSpec) }, error : function (response, textStatus, errorThrown) { thisSpec.fetchError = { status : response.status, textStatus : response.textStatus, errorThrown : errorThrown }; fluid.fetchResources.completeRequest(thisSpec) } } }; fluid.fetchResources.issueCachedRequest = function (resourceSpec, options) { var canon = canonUrl(resourceSpec.href); var cached = resourceCache[canon]; if (!cached) { fluid.log("First request for cached resource with url " + canon); cached = fluid.event.getEventFirer(); cached.$$firer$$ = true; resourceCache[canon] = cached; var fetchClass = resourceSpec.fetchClass; if (fetchClass) { if (!pendingClass[fetchClass]) { pendingClass[fetchClass] = {} } pendingClass[fetchClass][canon] = resourceSpec } options.cache = false; $.ajax(options) } else { if (!cached.$$firer$$) { options.success(cached) } else { fluid.log("Request for cached resource which is in flight: url " + canon); cached.addListener(function (response) { options.success(response) }) } } }; fluid.fetchResources.composeCallbacks = function (internal, external) { return external ? function () { try { external.apply(null, arguments) } catch (e) { fluid.log("Exception applying external fetchResources callback: " + e) } internal.apply(null, arguments) } : internal }; fluid.fetchResources.composePolicy = function (target, source, key) { return fluid.fetchResources.composeCallbacks(target, source) }; fluid.defaults("fluid.fetchResources.issueRequest", { mergePolicy : { success : fluid.fetchResources.composePolicy, error : fluid.fetchResources.composePolicy, url : "reverse" } }); fluid.fetchResources.issueRequest = function (resourceSpec, key) { var thisCallback = fluid.fetchResources.makeResourceCallback(resourceSpec); var options = { url : resourceSpec.href, success : thisCallback.success, error : thisCallback.error, dataType : "text" }; fluid.fetchResources.timeSuccessCallback(resourceSpec); fluid.merge(fluid.defaults("fluid.fetchResources.issueRequest").mergePolicy, options, resourceSpec.options); resourceSpec.queued = true; resourceSpec.initTime = new Date(); fluid.log("Request with key " + key + " queued for " + resourceSpec.href); if (resourceSpec.forceCache) { fluid.fetchResources.issueCachedRequest(resourceSpec, options) } else { $.ajax(options) } }; fluid.fetchResources.fetchResourcesImpl = function (that) { var complete = true; var allSync = true; var resourceSpecs = that.resourceSpecs; for (var key in resourceSpecs) { var resourceSpec = resourceSpecs[key]; if (!resourceSpec.options || resourceSpec.options.async) { allSync = false } if (resourceSpec.href && !resourceSpec.completeTime) { if (!resourceSpec.queued) { fluid.fetchResources.issueRequest(resourceSpec, key) } if (resourceSpec.queued) { complete = false } } else { if (resourceSpec.nodeId && !resourceSpec.resourceText) { var node = document.getElementById(resourceSpec.nodeId); resourceSpec.resourceText = fluid.dom.getElementText(node); resourceSpec.resourceKey = resourceSpec.nodeId } } } if (complete && that.callback && !that.callbackCalled) { that.callbackCalled = true; if ($.browser.mozilla && !allSync) { setTimeout(function () { that.callback(resourceSpecs) }, 1) } else { that.callback(resourceSpecs) } } }; fluid.fetchResources.primeCacheFromResources = function (componentName) { var resources = fluid.defaults(componentName).resources; var that = { typeName : "fluid.fetchResources.primeCacheFromResources" }; var expanded = (fluid.expandOptions ? fluid.expandOptions : fluid.identity)(fluid.copy(resources), that); fluid.fetchResources(expanded) }; fluid.registerNamespace("fluid.expander"); fluid.expander.makeDefaultFetchOptions = function (successdisposer, failid, options) { return $.extend(true, { dataType : "text" }, options, { success : function (response, environmentdisposer) { var json = JSON.parse(response); environmentdisposer(successdisposer(json)) }, error : function (response, textStatus) { fluid.log("Error fetching " + failid + ": " + textStatus) } }) }; fluid.expander.makeFetchExpander = function (options) { return { expander : { type : "fluid.expander.deferredFetcher", href : options.url, options : fluid.expander.makeDefaultFetchOptions(options.disposer, options.url, options.options), resourceSpecCollector : "{resourceSpecCollector}", fetchKey : options.fetchKey } } }; fluid.expander.deferredFetcher = function (target, source, recurse, expandOptions) { var expander = source.expander; var spec = fluid.copy(expander); var collector = fluid.resolveEnvironment(expander.resourceSpecCollector, expandOptions); delete spec.type; delete spec.resourceSpecCollector; delete spec.fetchKey; var environmentdisposer = function (disposed) { $.extend(target, disposed) }; spec.options.success = function (response) { expander.options.success(response, environmentdisposer) }; var key = expander.fetchKey || fluid.allocateGuid(); collector[key] = spec; return target } })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { fluid.XMLP = function (strXML) { return fluid.XMLP.XMLPImpl(strXML) }; fluid.XMLP.closedTags = { abbr : true, br : true, col : true, img : true, input : true, link : true, meta : true, param : true, hr : true, area : true, embed : true }; fluid.XMLP._NONE = 0; fluid.XMLP._ELM_B = 1; fluid.XMLP._ELM_E = 2; fluid.XMLP._ELM_EMP = 3; fluid.XMLP._ATT = 4; fluid.XMLP._TEXT = 5; fluid.XMLP._ENTITY = 6; fluid.XMLP._PI = 7; fluid.XMLP._CDATA = 8; fluid.XMLP._COMMENT = 9; fluid.XMLP._DTD = 10; fluid.XMLP._ERROR = 11; fluid.XMLP._CONT_XML = 0; fluid.XMLP._CONT_ALT = 1; fluid.XMLP._ATT_NAME = 0; fluid.XMLP._ATT_VAL = 1; fluid.XMLP._STATE_PROLOG = 1; fluid.XMLP._STATE_DOCUMENT = 2; fluid.XMLP._STATE_MISC = 3; fluid.XMLP._errs = []; fluid.XMLP._errs[fluid.XMLP.ERR_CLOSE_PI = 0] = "PI: missing closing sequence"; fluid.XMLP._errs[fluid.XMLP.ERR_CLOSE_DTD = 1] = "DTD: missing closing sequence"; fluid.XMLP._errs[fluid.XMLP.ERR_CLOSE_COMMENT = 2] = "Comment: missing closing sequence"; fluid.XMLP._errs[fluid.XMLP.ERR_CLOSE_CDATA = 3] = "CDATA: missing closing sequence"; fluid.XMLP._errs[fluid.XMLP.ERR_CLOSE_ELM = 4] = "Element: missing closing sequence"; fluid.XMLP._errs[fluid.XMLP.ERR_CLOSE_ENTITY = 5] = "Entity: missing closing sequence"; fluid.XMLP._errs[fluid.XMLP.ERR_PI_TARGET = 6] = "PI: target is required"; fluid.XMLP._errs[fluid.XMLP.ERR_ELM_EMPTY = 7] = "Element: cannot be both empty and closing"; fluid.XMLP._errs[fluid.XMLP.ERR_ELM_NAME = 8] = 'Element: name must immediatly follow "<"'; fluid.XMLP._errs[fluid.XMLP.ERR_ELM_LT_NAME = 9] = 'Element: "<" not allowed in element names'; fluid.XMLP._errs[fluid.XMLP.ERR_ATT_VALUES = 10] = "Attribute: values are required and must be in quotes"; fluid.XMLP._errs[fluid.XMLP.ERR_ATT_LT_NAME = 11] = 'Element: "<" not allowed in attribute names'; fluid.XMLP._errs[fluid.XMLP.ERR_ATT_LT_VALUE = 12] = 'Attribute: "<" not allowed in attribute values'; fluid.XMLP._errs[fluid.XMLP.ERR_ATT_DUP = 13] = "Attribute: duplicate attributes not allowed"; fluid.XMLP._errs[fluid.XMLP.ERR_ENTITY_UNKNOWN = 14] = "Entity: unknown entity"; fluid.XMLP._errs[fluid.XMLP.ERR_INFINITELOOP = 15] = "Infinite loop"; fluid.XMLP._errs[fluid.XMLP.ERR_DOC_STRUCTURE = 16] = "Document: only comments, processing instructions, or whitespace allowed outside of document element"; fluid.XMLP._errs[fluid.XMLP.ERR_ELM_NESTING = 17] = "Element: must be nested correctly"; fluid.XMLP._checkStructure = function (that, iEvent) { var stack = that.m_stack; if (fluid.XMLP._STATE_PROLOG == that.m_iState) { that.m_iState = fluid.XMLP._STATE_DOCUMENT } if (fluid.XMLP._STATE_DOCUMENT === that.m_iState) { if ((fluid.XMLP._ELM_B == iEvent) || (fluid.XMLP._ELM_EMP == iEvent)) { that.m_stack[stack.length] = that.getName() } if ((fluid.XMLP._ELM_E == iEvent) || (fluid.XMLP._ELM_EMP == iEvent)) { if (stack.length === 0) { return fluid.XMLP._NONE } var strTop = stack[stack.length - 1]; that.m_stack.length--; if (strTop === null || strTop !== that.getName()) { return that._setErr(that, fluid.XMLP.ERR_ELM_NESTING) } } } return iEvent }; fluid.XMLP._parseCDATA = function (that, iB) { var iE = that.m_xml.indexOf("]]>", iB); if (iE == -1) { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_CLOSE_CDATA) } fluid.XMLP._setContent(that, fluid.XMLP._CONT_XML, iB, iE); that.m_iP = iE + 3; return fluid.XMLP._CDATA }; fluid.XMLP._parseComment = function (that, iB) { var iE = that.m_xml.indexOf("-->", iB); if (iE == -1) { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_CLOSE_COMMENT) } fluid.XMLP._setContent(that, fluid.XMLP._CONT_XML, iB - 4, iE + 3); that.m_iP = iE + 3; return fluid.XMLP._COMMENT }; fluid.XMLP._parseDTD = function (that, iB) { var iE, strClose, iInt, iLast; iE = that.m_xml.indexOf(">", iB); if (iE == -1) { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_CLOSE_DTD) } iInt = that.m_xml.indexOf("[", iB); strClose = ((iInt != -1) && (iInt < iE)) ? "]>" : ">"; while (true) { if (iE == iLast) { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_INFINITELOOP) } iLast = iE; iE = that.m_xml.indexOf(strClose, iB); if (iE == -1) { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_CLOSE_DTD) } if (that.m_xml.substring(iE - 1, iE + 2) != "]]>") { break } } that.m_iP = iE + strClose.length; return fluid.XMLP._DTD }; fluid.XMLP._parsePI = function (that, iB) { var iE, iTB, iTE, iCB, iCE; iE = that.m_xml.indexOf("?>", iB); if (iE == -1) { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_CLOSE_PI) } iTB = fluid.SAXStrings.indexOfNonWhitespace(that.m_xml, iB, iE); if (iTB == -1) { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_PI_TARGET) } iTE = fluid.SAXStrings.indexOfWhitespace(that.m_xml, iTB, iE); if (iTE == -1) { iTE = iE } iCB = fluid.SAXStrings.indexOfNonWhitespace(that.m_xml, iTE, iE); if (iCB == -1) { iCB = iE } iCE = fluid.SAXStrings.lastIndexOfNonWhitespace(that.m_xml, iCB, iE); if (iCE == -1) { iCE = iE - 1 } that.m_name = that.m_xml.substring(iTB, iTE); fluid.XMLP._setContent(that, fluid.XMLP._CONT_XML, iCB, iCE + 1); that.m_iP = iE + 2; return fluid.XMLP._PI }; fluid.XMLP._parseText = function (that, iB) { var iE = that.m_xml.indexOf("<", iB); if (iE == -1) { iE = that.m_xml.length } fluid.XMLP._setContent(that, fluid.XMLP._CONT_XML, iB, iE); that.m_iP = iE; return fluid.XMLP._TEXT }; fluid.XMLP._setContent = function (that, iSrc) { var args = arguments; if (fluid.XMLP._CONT_XML == iSrc) { that.m_cAlt = null; that.m_cB = args[2]; that.m_cE = args[3] } else { that.m_cAlt = args[2]; that.m_cB = 0; that.m_cE = args[2].length } that.m_cSrc = iSrc }; fluid.XMLP._setErr = function (that, iErr) { var strErr = fluid.XMLP._errs[iErr]; that.m_cAlt = strErr; that.m_cB = 0; that.m_cE = strErr.length; that.m_cSrc = fluid.XMLP._CONT_ALT; return fluid.XMLP._ERROR }; fluid.XMLP._parseElement = function (that, iB) { var iE, iDE, iRet; var iType, strN, iLast; iDE = iE = that.m_xml.indexOf(">", iB); if (iE == -1) { return that._setErr(that, fluid.XMLP.ERR_CLOSE_ELM) } if (that.m_xml.charAt(iB) == "/") { iType = fluid.XMLP._ELM_E; iB++ } else { iType = fluid.XMLP._ELM_B } if (that.m_xml.charAt(iE - 1) == "/") { if (iType == fluid.XMLP._ELM_E) { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_ELM_EMPTY) } iType = fluid.XMLP._ELM_EMP; iDE-- } that.nameRegex.lastIndex = iB; var nameMatch = that.nameRegex.exec(that.m_xml); if (!nameMatch) { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_ELM_NAME) } strN = nameMatch[1].toLowerCase(); if ("li" === strN && iType !== fluid.XMLP._ELM_E && that.m_stack.length > 0 && that.m_stack[that.m_stack.length - 1] === "li" && !that.m_emitSynthetic) { that.m_name = "li"; that.m_emitSynthetic = true; return fluid.XMLP._ELM_E } that.m_attributes = {}; that.m_cAlt = ""; if (that.nameRegex.lastIndex < iDE) { that.m_iP = that.nameRegex.lastIndex; while (that.m_iP < iDE) { that.attrStartRegex.lastIndex = that.m_iP; var attrMatch = that.attrStartRegex.exec(that.m_xml); if (!attrMatch) { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_ATT_VALUES) } var attrname = attrMatch[1].toLowerCase(); var attrval; if (that.m_xml.charCodeAt(that.attrStartRegex.lastIndex) === 61) { var valRegex = that.m_xml.charCodeAt(that.attrStartRegex.lastIndex + 1) === 34 ? that.attrValRegex : that.attrValIERegex; valRegex.lastIndex = that.attrStartRegex.lastIndex + 1; attrMatch = valRegex.exec(that.m_xml); if (!attrMatch) { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_ATT_VALUES) } attrval = attrMatch[1] } else { attrval = attrname; valRegex = that.attrStartRegex } if (!that.m_attributes[attrname]) { that.m_attributes[attrname] = attrval } else { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_ATT_DUP) } that.m_iP = valRegex.lastIndex } } if (strN.indexOf("<") != -1) { return fluid.XMLP._setErr(that, fluid.XMLP.ERR_ELM_LT_NAME) } that.m_name = strN; that.m_iP = iE + 1; if (fluid.XMLP.closedTags[strN]) { that.closeRegex.lastIndex = iE + 1; var closeMatch = that.closeRegex.exec; if (closeMatch) { var matchclose = that.m_xml.indexOf(strN, closeMatch.lastIndex); if (matchclose === closeMatch.lastIndex) { return iType } else { return fluid.XMLP._ELM_EMP } } } that.m_emitSynthetic = false; return iType }; fluid.XMLP._parse = function (that) { var iP = that.m_iP; var xml = that.m_xml; if (iP === xml.length) { return fluid.XMLP._NONE } var c = xml.charAt(iP); if (c === "<") { var c2 = xml.charAt(iP + 1); if (c2 === "?") { return fluid.XMLP._parsePI(that, iP + 2) } else { if (c2 === "!") { if (iP === xml.indexOf("]+)/g; that.attrStartRegex = /\s*([\w:_][\w:_\-\.]*)/gm; that.attrValRegex = /\"([^\"]*)\"\s*/gm; that.attrValIERegex = /([^\>\s]+)\s*/gm; that.closeRegex = /\s*<\//g; return that }; fluid.SAXStrings = {}; fluid.SAXStrings.WHITESPACE = " \t\n\r"; fluid.SAXStrings.QUOTES = "\"'"; fluid.SAXStrings.getColumnNumber = function (strD, iP) { if (!strD) { return -1 } iP = iP || strD.length; var arrD = strD.substring(0, iP).split("\n"); arrD.length--; var iLinePos = arrD.join("\n").length; return iP - iLinePos }; fluid.SAXStrings.getLineNumber = function (strD, iP) { if (!strD) { return -1 } iP = iP || strD.length; return strD.substring(0, iP).split("\n").length }; fluid.SAXStrings.indexOfNonWhitespace = function (strD, iB, iE) { if (!strD) { return -1 } iB = iB || 0; iE = iE || strD.length; for (var i = iB; i < iE; ++i) { var c = strD.charAt(i); if (c !== " " && c !== "\t" && c !== "\n" && c !== "\r") { return i } } return -1 }; fluid.SAXStrings.indexOfWhitespace = function (strD, iB, iE) { if (!strD) { return -1 } iB = iB || 0; iE = iE || strD.length; for (var i = iB; i < iE; i++) { if (fluid.SAXStrings.WHITESPACE.indexOf(strD.charAt(i)) != -1) { return i } } return -1 }; fluid.SAXStrings.lastIndexOfNonWhitespace = function (strD, iB, iE) { if (!strD) { return -1 } iB = iB || 0; iE = iE || strD.length; for (var i = iE - 1; i >= iB; i--) { if (fluid.SAXStrings.WHITESPACE.indexOf(strD.charAt(i)) == -1) { return i } } return -1 }; fluid.SAXStrings.replace = function (strD, iB, iE, strF, strR) { if (!strD) { return "" } iB = iB || 0; iE = iE || strD.length; return strD.substring(iB, iE).split(strF).join(strR) } })(jQuery, fluid_1_4); fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { fluid.parseTemplate = function (template, baseURL, scanStart, cutpoints_in, opts) { opts = opts || {}; if (!template) { fluid.fail("empty template supplied to fluid.parseTemplate") } var t; var parser; var tagstack; var lumpindex = 0; var nestingdepth = 0; var justended = false; var defstart = -1; var defend = -1; var debugMode = false; var cutpoints = []; var simpleClassCutpoints = {}; var cutstatus = []; var XMLLump = function (lumpindex, nestingdepth) { return { nestingdepth : nestingdepth, lumpindex : lumpindex, parent : t } }; function isSimpleClassCutpoint(tree) { return tree.length === 1 && tree[0].predList.length === 1 && tree[0].predList[0].clazz } function init(baseURLin, debugModeIn, cutpointsIn) { t.rootlump = XMLLump(0, -1); tagstack = [t.rootlump]; lumpindex = 0; nestingdepth = 0; justended = false; defstart = -1; defend = -1; baseURL = baseURLin; debugMode = debugModeIn; if (cutpointsIn) { for (var i = 0; i < cutpointsIn.length; ++i) { var tree = fluid.parseSelector(cutpointsIn[i].selector); var clazz = isSimpleClassCutpoint(tree); if (clazz) { simpleClassCutpoints[clazz] = cutpointsIn[i].id } else { cutstatus.push([]); cutpoints.push($.extend({}, cutpointsIn[i], { tree : tree })) } } } } function findTopContainer() { for (var i = tagstack.length - 1; i >= 0; --i) { var lump = tagstack[i]; if (lump.rsfID !== undefined) { return lump } } return t.rootlump } function newLump() { var togo = XMLLump(lumpindex, nestingdepth); if (debugMode) { togo.line = parser.getLineNumber(); togo.column = parser.getColumnNumber() } t.lumps[lumpindex] = togo; ++lumpindex; return togo } function addLump(mmap, ID, lump) { var list = mmap[ID]; if (!list) { list = []; mmap[ID] = list } list[list.length] = lump } function checkContribute(ID, lump) { if (ID.indexOf("scr=contribute-") !== -1) { var scr = ID.substring("scr=contribute-".length); addLump(t.collectmap, scr, lump) } } function debugLump(lump) { return "<" + lump.tagname + ">" } function hasCssClass(clazz, totest) { if (!totest) { return false } return (" " + totest + " ").indexOf(" " + clazz + " ") !== -1 } function matchNode(term, headlump, headclazz) { if (term.predList) { for (var i = 0; i < term.predList.length; ++i) { var pred = term.predList[i]; if (pred.id && headlump.attributemap.id !== pred.id) { return false } if (pred.clazz && !hasCssClass(pred.clazz, headclazz)) { return false } if (pred.tag && headlump.tagname !== pred.tag) { return false } } return true } } function tagStartCut(headlump) { var togo; var headclazz = headlump.attributemap["class"]; if (headclazz) { var split = headclazz.split(" "); for (var i = 0; i < split.length; ++i) { var simpleCut = simpleClassCutpoints[$.trim(split[i])]; if (simpleCut) { return simpleCut } } } for (var i = 0; i < cutpoints.length; ++i) { var cut = cutpoints[i]; var cutstat = cutstatus[i]; var nextterm = cutstat.length; if (nextterm < cut.tree.length) { var term = cut.tree[nextterm]; if (nextterm > 0) { if (cut.tree[nextterm - 1].child && cutstat[nextterm - 1] !== headlump.nestingdepth - 1) { continue } } var isMatch = matchNode(term, headlump, headclazz); if (isMatch) { cutstat[cutstat.length] = headlump.nestingdepth; if (cutstat.length === cut.tree.length) { if (togo !== undefined) { fluid.fail("Cutpoint specification error - node " + debugLump(headlump) + " has already matched with rsf:id of " + togo) } if (cut.id === undefined || cut.id === null) { fluid.fail("Error in cutpoints list - entry at position " + i + " does not have an id set") } togo = cut.id } } } } return togo } function tagEndCut() { if (cutpoints) { for (var i = 0; i < cutpoints.length; ++i) { var cutstat = cutstatus[i]; if (cutstat.length > 0 && cutstat[cutstat.length - 1] === nestingdepth) { cutstat.length-- } } } } function processTagEnd() { tagEndCut(); var endlump = newLump(); --nestingdepth; endlump.text = ""; var oldtop = tagstack[tagstack.length - 1]; oldtop.close_tag = t.lumps[lumpindex - 1]; tagstack.length--; justended = true } function processTagStart(isempty, text) { ++nestingdepth; if (justended) { justended = false; var backlump = newLump(); backlump.nestingdepth-- } if (t.firstdocumentindex === -1) { t.firstdocumentindex = lumpindex } var headlump = newLump(); var stacktop = tagstack[tagstack.length - 1]; headlump.uplump = stacktop; var tagname = parser.getName(); headlump.tagname = tagname; var attrs = headlump.attributemap = parser.m_attributes; var ID = attrs[fluid.ID_ATTRIBUTE]; if (ID === undefined) { ID = tagStartCut(headlump) } for (var attrname in attrs) { if (ID === undefined) { if (/href|src|codebase|action/.test(attrname)) { ID = "scr=rewrite-url" } else { if (ID === undefined && /for|headers/.test(attrname)) { ID = "scr=null" } } } } if (ID) { if (ID.charCodeAt(0) === 126) { ID = ID.substring(1); headlump.elide = true } checkContribute(ID, headlump); headlump.rsfID = ID; var downreg = findTopContainer(); if (!downreg.downmap) { downreg.downmap = {} } while (downreg) { if (downreg.downmap) { addLump(downreg.downmap, ID, headlump) } downreg = downreg.uplump } addLump(t.globalmap, ID, headlump); var colpos = ID.indexOf(":"); if (colpos !== -1) { var prefix = ID.substring(0, colpos); if (!stacktop.finallump) { stacktop.finallump = {} } stacktop.finallump[prefix] = headlump } } headlump.text = "<" + tagname + fluid.dumpAttributes(attrs) + (isempty && !ID ? "/>" : ">"); tagstack[tagstack.length] = headlump; if (isempty) { if (ID) { processTagEnd() } else { --nestingdepth; tagstack.length-- } } } function processDefaultTag() { if (defstart !== -1) { if (t.firstdocumentindex === -1) { t.firstdocumentindex = lumpindex } var text = parser.getContent().substr(defstart, defend - defstart); justended = false; var newlump = newLump(); newlump.text = text; defstart = -1 } } t = fluid.XMLViewTemplate(); init(baseURL, opts.debugMode, cutpoints_in); var idpos = template.indexOf(fluid.ID_ATTRIBUTE); if (scanStart) { var brackpos = template.indexOf(">", idpos); parser = fluid.XMLP(template.substring(brackpos + 1)) } else { parser = fluid.XMLP(template) } parseloop : while (true) { var iEvent = parser.next(); switch (iEvent) { case fluid.XMLP._ELM_B: processDefaultTag(); processTagStart(false, ""); break; case fluid.XMLP._ELM_E: processDefaultTag(); processTagEnd(); break; case fluid.XMLP._ELM_EMP: processDefaultTag(); processTagStart(true, ""); break; case fluid.XMLP._PI: case fluid.XMLP._DTD: defstart = -1; continue; case fluid.XMLP._TEXT: case fluid.XMLP._ENTITY: case fluid.XMLP._CDATA: case fluid.XMLP._COMMENT: if (defstart === -1) { defstart = parser.m_cB } defend = parser.m_cE; break; case fluid.XMLP._ERROR: fluid.setLogging(true); var message = "Error parsing template: " + parser.m_cAlt + " at line " + parser.getLineNumber(); fluid.log(message); fluid.log("Just read: " + parser.m_xml.substring(parser.m_iP - 30, parser.m_iP)); fluid.log("Still to read: " + parser.m_xml.substring(parser.m_iP, parser.m_iP + 30)); fluid.fail(message); break parseloop; case fluid.XMLP._NONE: break parseloop } } processDefaultTag(); var excess = tagstack.length - 1; if (excess) { fluid.fail("Error parsing template - unclosed tag(s) of depth " + (excess) + ": " + fluid.transform(tagstack.splice(1, excess), function (lump) { return debugLump(lump) }).join(", ")) } return t }; fluid.debugLump = function (lump) { var togo = lump.text; togo += " at "; togo += "lump line " + lump.line + " column " + lump.column + " index " + lump.lumpindex; togo += lump.parent.href === null ? "" : " in file " + lump.parent.href; return togo }; fluid.ID_ATTRIBUTE = "rsf:id"; fluid.getPrefix = function (id) { var colpos = id.indexOf(":"); return colpos === -1 ? id : id.substring(0, colpos) }; fluid.SplitID = function (id) { var that = {}; var colpos = id.indexOf(":"); if (colpos === -1) { that.prefix = id } else { that.prefix = id.substring(0, colpos); that.suffix = id.substring(colpos + 1) } return that }; fluid.XMLViewTemplate = function () { return { globalmap : {}, collectmap : {}, lumps : [], firstdocumentindex : -1 } }; fluid.XMLEncode = function (text) { return text.replace(/&/g, "&").replace(//g, ">").replace(/\"/g, """) }; fluid.dumpAttributes = function (attrcopy) { var togo = ""; for (var attrname in attrcopy) { var attrvalue = attrcopy[attrname]; if (attrvalue !== null && attrvalue !== undefined) { togo += " " + attrname + '="' + attrvalue + '"' } } return togo }; fluid.aggregateMMap = function (target, source) { for (var key in source) { var targhas = target[key]; if (!targhas) { target[key] = [] } target[key] = target[key].concat(source[key]) } }; fluid.parseTemplates = function (resourceSpec, templateList, opts) { var togo = []; opts = opts || {}; togo.globalmap = {}; for (var i = 0; i < templateList.length; ++i) { var resource = resourceSpec[templateList[i]]; var lastslash = resource.href.lastIndexOf("/"); var baseURL = lastslash === -1 ? "" : resource.href.substring(0, lastslash + 1); var template = fluid.parseTemplate(resource.resourceText, baseURL, opts.scanStart && i === 0, resource.cutpoints, opts); if (i === 0) { fluid.aggregateMMap(togo.globalmap, template.globalmap) } template.href = resource.href; template.baseURL = baseURL; template.resourceKey = resource.resourceKey; togo[i] = template; fluid.aggregateMMap(togo.globalmap, template.rootlump.downmap) } return togo }; var chars = "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)"; var quickClass = new RegExp("([#.]?)(" + chars + "+)", "g"); var childSeg = new RegExp("\\s*(>)?\\s*", "g"); fluid.parseSelector = function (selstring) { var togo = []; selstring = $.trim(selstring); quickClass.lastIndex = 0; var lastIndex = 0; while (true) { var atNode = []; while (true) { var segMatch = quickClass.exec(selstring); if (!segMatch || segMatch.index !== lastIndex) { break } var thisNode = {}; var text = segMatch[2]; if (segMatch[1] === "") { thisNode.tag = text } else { if (segMatch[1] === "#") { thisNode.id = text } else { if (segMatch[1] === ".") { thisNode.clazz = text } } } atNode[atNode.length] = thisNode; lastIndex = quickClass.lastIndex } childSeg.lastIndex = lastIndex; var fullAtNode = { predList : atNode }; var childMatch = childSeg.exec(selstring); if (!childMatch || childMatch.index !== lastIndex) { var remainder = selstring.substring(lastIndex); fluid.fail("Error in selector string - can not match child selector expression at " + remainder) } if (childMatch[1] === ">") { fullAtNode.child = true } togo[togo.length] = fullAtNode; if (childSeg.lastIndex >= selstring.length) { break } lastIndex = childSeg.lastIndex; quickClass.lastIndex = childSeg.lastIndex } return togo } })(jQuery, fluid_1_4); fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { function debugPosition(component) { return "as child of " + (component.parent.fullID ? "component with full ID " + component.parent.fullID : "root") } function computeFullID(component) { var togo = ""; var move = component; if (component.children === undefined) { togo = component.ID + (component.localID !== undefined ? component.localID : ""); move = component.parent } while (move.parent) { var parent = move.parent; if (move.fullID !== undefined) { togo = move.fullID + togo; return togo } if (move.noID === undefined) { var ID = move.ID; if (ID === undefined) { fluid.fail("Error in component tree - component found with no ID " + debugPosition(parent) + ": please check structure") } var colpos = ID.indexOf(":"); var prefix = colpos === -1 ? ID : ID.substring(0, colpos); togo = prefix + ":" + (move.localID === undefined ? "" : move.localID) + ":" + togo } move = parent } return togo } var renderer = {}; renderer.isBoundPrimitive = function (value) { return fluid.isPrimitive(value) || value instanceof Array && (value.length === 0 || typeof(value[0]) === "string") }; var unzipComponent; function processChild(value, key) { if (renderer.isBoundPrimitive(value)) { return { componentType : "UIBound", value : value, ID : key } } else { var unzip = unzipComponent(value); if (unzip.ID) { return { ID : key, componentType : "UIContainer", children : [unzip] } } else { unzip.ID = key; return unzip } } } function fixChildren(children) { if (!(children instanceof Array)) { var togo = []; for (var key in children) { var value = children[key]; if (value instanceof Array) { for (var i = 0; i < value.length; ++i) { var processed = processChild(value[i], key); togo[togo.length] = processed } } else { togo[togo.length] = processChild(value, key) } } return togo } else { return children } } function fixupValue(uibound, model, resolverGetConfig) { if (uibound.value === undefined && uibound.valuebinding !== undefined) { if (!model) { fluid.fail("Cannot perform value fixup for valuebinding " + uibound.valuebinding + " since no model was supplied to rendering") } uibound.value = fluid.get(model, uibound.valuebinding, resolverGetConfig) } } function upgradeBound(holder, property, model, resolverGetConfig) { if (holder[property] !== undefined) { if (renderer.isBoundPrimitive(holder[property])) { holder[property] = { value : holder[property] } } else { if (holder[property].messagekey) { holder[property].componentType = "UIMessage" } } } else { holder[property] = { value : null } } fixupValue(holder[property], model, resolverGetConfig) } renderer.duckMap = { children : "UIContainer", value : "UIBound", valuebinding : "UIBound", messagekey : "UIMessage", markup : "UIVerbatim", selection : "UISelect", target : "UILink", choiceindex : "UISelectChoice", functionname : "UIInitBlock" }; var boundMap = { UISelect : ["selection", "optionlist", "optionnames"], UILink : ["target", "linktext"], UIVerbatim : ["markup"], UIMessage : ["messagekey"] }; renderer.boundMap = fluid.transform(boundMap, fluid.arrayToHash); renderer.inferComponentType = function (component) { for (var key in renderer.duckMap) { if (component[key] !== undefined) { return renderer.duckMap[key] } } }; renderer.applyComponentType = function (component) { component.componentType = renderer.inferComponentType(component); if (component.componentType === undefined && component.ID !== undefined) { component.componentType = "UIBound" } }; unzipComponent = function (component, model, resolverGetConfig) { if (component) { renderer.applyComponentType(component) } if (!component || component.componentType === undefined) { var decorators = component.decorators; if (decorators) { delete component.decorators } component = { componentType : "UIContainer", children : component }; component.decorators = decorators } var cType = component.componentType; if (cType === "UIContainer") { component.children = fixChildren(component.children) } else { var map = renderer.boundMap[cType]; if (map) { fluid.each(map, function (value, key) { upgradeBound(component, key, model, resolverGetConfig) }) } } return component }; function fixupTree(tree, model, resolverGetConfig) { if (tree.componentType === undefined) { tree = unzipComponent(tree, model, resolverGetConfig) } if (tree.componentType !== "UIContainer" && !tree.parent) { tree = { children : [tree] } } if (tree.children) { tree.childmap = {}; for (var i = 0; i < tree.children.length; ++i) { var child = tree.children[i]; if (child.componentType === undefined) { child = unzipComponent(child, model, resolverGetConfig); tree.children[i] = child } child.parent = tree; if (child.ID === undefined) { fluid.fail("Error in component tree: component found with no ID " + debugPosition(child)) } tree.childmap[child.ID] = child; var colpos = child.ID.indexOf(":"); if (colpos === -1) {} else { var prefix = child.ID.substring(0, colpos); var childlist = tree.childmap[prefix]; if (!childlist) { childlist = []; tree.childmap[prefix] = childlist } if (child.localID === undefined && childlist.length !== 0) { child.localID = childlist.length } childlist[childlist.length] = child } child.fullID = computeFullID(child); var componentType = child.componentType; if (componentType === "UISelect") { child.selection.fullID = child.fullID + "-selection" } else { if (componentType === "UIInitBlock") { var call = child.functionname + "("; for (var j = 0; j < child.arguments.length; ++j) { if (child.arguments[j]instanceof fluid.ComponentReference) { child.arguments[j] = child.parent.fullID + child.arguments[j].reference } call += JSON.stringify(child.arguments[j]); if (j < child.arguments.length - 1) { call += ", " } } child.markup = { value : call + ")\n" }; child.componentType = "UIVerbatim" } else { if (componentType === "UIBound") { fixupValue(child, model, resolverGetConfig) } } } fixupTree(child, model, resolverGetConfig) } } return tree } fluid.NULL_STRING = "\u25a9null\u25a9"; var LINK_ATTRIBUTES = { a : "href", link : "href", img : "src", frame : "src", script : "src", style : "src", input : "src", embed : "src", form : "action", applet : "codebase", object : "codebase" }; renderer.decoratorComponentPrefix = "**-renderer-"; renderer.IDtoComponentName = function (ID, num) { return renderer.decoratorComponentPrefix + ID.replace(/\./g, "") + "-" + num }; renderer.invokeFluidDecorator = function (func, args, ID, num, options) { var that; if (options.instantiator && options.parentComponent) { var parent = options.parentComponent; var name = renderer.IDtoComponentName(ID, num); fluid.set(parent, fluid.path("options", "components", name), { type : func }); that = fluid.initDependent(options.parentComponent, name, options.instantiator, args) } else { that = fluid.invokeGlobalFunction(func, args) } return that }; fluid.renderer = function (templates, tree, options, fossilsIn) { options = options || {}; tree = tree || {}; var debugMode = options.debugMode; if (!options.messageLocator && options.messageSource) { options.messageLocator = fluid.resolveMessageSource(options.messageSource) } options.document = options.document || document; var directFossils = fossilsIn || {}; var globalmap = {}; var branchmap = {}; var rewritemap = {}; var seenset = {}; var collected = {}; var out = ""; var renderOptions = options; var decoratorQueue = []; var renderedbindings = {}; var usedIDs = {}; var that = {}; function getRewriteKey(template, parent, id) { return template.resourceKey + parent.fullID + id } function resolveInScope(searchID, defprefix, scope, child) { var deflump; var scopelook = scope ? scope[searchID] : null; if (scopelook) { for (var i = 0; i < scopelook.length; ++i) { var scopelump = scopelook[i]; if (!deflump && scopelump.rsfID === defprefix) { deflump = scopelump } if (scopelump.rsfID === searchID) { return scopelump } } } return deflump } function resolveCall(sourcescope, child) { var searchID = child.jointID ? child.jointID : child.ID; var split = fluid.SplitID(searchID); var defprefix = split.prefix + ":"; var match = resolveInScope(searchID, defprefix, sourcescope.downmap, child); if (match) { return match } if (child.children) { match = resolveInScope(searchID, defprefix, globalmap, child); if (match) { return match } } return null } function noteCollected(template) { if (!seenset[template.href]) { fluid.aggregateMMap(collected, template.collectmap); seenset[template.href] = true } } var fetchComponent; function resolveRecurse(basecontainer, parentlump) { for (var i = 0; i < basecontainer.children.length; ++i) { var branch = basecontainer.children[i]; if (branch.children) { var resolved = resolveCall(parentlump, branch); if (resolved) { branchmap[branch.fullID] = resolved; var id = resolved.attributemap.id; if (id !== undefined) { rewritemap[getRewriteKey(parentlump.parent, basecontainer, id)] = branch.fullID } noteCollected(resolved.parent); resolveRecurse(branch, resolved) } } } if (parentlump.downmap) { for (var id in parentlump.downmap) { var lumps = parentlump.downmap[id]; for (var i = 0; i < lumps.length; ++i) { var lump = lumps[i]; var lumpid = lump.attributemap.id; if (lumpid !== undefined && lump.rsfID !== undefined) { var resolved = fetchComponent(basecontainer, lump.rsfID); if (resolved !== null) { var resolveID = resolved.fullID; if (resolved.componentType === "UISelect") { resolveID = resolveID + "-selection" } rewritemap[getRewriteKey(parentlump.parent, basecontainer, lumpid)] = resolveID } } } } } } function resolveBranches(globalmapp, basecontainer, parentlump) { branchmap = {}; rewritemap = {}; seenset = {}; collected = {}; globalmap = globalmapp; branchmap[basecontainer.fullID] = parentlump; resolveRecurse(basecontainer, parentlump) } function dumpTillLump(lumps, start, limit) { for (; start < limit; ++start) { var text = lumps[start].text; if (text) { out += lumps[start].text } } } function dumpScan(lumps, renderindex, basedepth, closeparent, insideleaf) { var start = renderindex; while (true) { if (renderindex === lumps.length) { break } var lump = lumps[renderindex]; if (lump.nestingdepth < basedepth) { break } if (lump.rsfID !== undefined) { if (!insideleaf) { break } if (insideleaf && lump.nestingdepth > basedepth + (closeparent ? 0 : 1)) { fluid.log("Error in component tree - leaf component found to contain further components - at " + lump.toString()) } else { break } } ++renderindex } if (!closeparent && (renderindex === lumps.length || !lumps[renderindex].rsfID)) { --renderindex } dumpTillLump(lumps, start, renderindex); return renderindex } function isPlaceholder(value) { return false } function isValue(value) { return value !== null && value !== undefined && !isPlaceholder(value) } var trc = {}; function openTag() { if (!trc.iselide) { out += "<" + trc.uselump.tagname } } function closeTag() { if (!trc.iselide) { out += "" } } function renderUnchanged() { dumpTillLump(trc.uselump.parent.lumps, trc.uselump.lumpindex + 1, trc.close.lumpindex + (trc.iselide ? 0 : 1)) } function isSelfClose() { return trc.endopen.lumpindex === trc.close.lumpindex && fluid.XMLP.closedTags[trc.uselump.tagname] } function dumpTemplateBody() { if (isSelfClose()) { if (!trc.iselide) { out += "/>" } } else { if (!trc.iselide) { out += ">" } dumpTillLump(trc.uselump.parent.lumps, trc.endopen.lumpindex, trc.close.lumpindex + (trc.iselide ? 0 : 1)) } } function replaceAttributes() { if (!trc.iselide) { out += fluid.dumpAttributes(trc.attrcopy) } dumpTemplateBody() } function replaceAttributesOpen() { if (trc.iselide) { replaceAttributes() } else { out += fluid.dumpAttributes(trc.attrcopy); var selfClose = isSelfClose(); out += selfClose ? "/>" : ">"; trc.nextpos = selfClose ? trc.close.lumpindex + 1 : trc.endopen.lumpindex } } function replaceBody(value) { out += fluid.dumpAttributes(trc.attrcopy); if (!trc.iselide) { out += ">" } out += fluid.XMLEncode(value.toString()); closeTag() } function rewriteLeaf(value) { if (isValue(value)) { replaceBody(value) } else { replaceAttributes() } } function rewriteLeafOpen(value) { if (trc.iselide) { rewriteLeaf(trc.value) } else { if (isValue(value)) { replaceBody(value) } else { replaceAttributesOpen() } } } function rewriteUrl(template, url) { if (renderOptions.urlRewriter) { var rewritten = renderOptions.urlRewriter(url); if (rewritten) { return rewritten } } if (!renderOptions.rebaseURLs) { return url } var protpos = url.indexOf(":/"); if (url.charAt(0) === "/" || protpos !== -1 && protpos < 7) { return url } else { return renderOptions.baseURL + url } } function dumpHiddenField(todump) { out += '") } function renderDebugMessage(message) { out += ''; out += message; out += "
" } function reportPath(branch) { var path = branch.fullID; return !path ? "component tree root" : "full path " + path } function renderComponentSystem(context, torendero, lump) { var lumpindex = lump.lumpindex; var lumps = lump.parent.lumps; var nextpos = -1; var outerendopen = lumps[lumpindex + 1]; var outerclose = lump.close_tag; nextpos = outerclose.lumpindex + 1; var payloadlist = lump.downmap ? lump.downmap["payload-component"] : null; var payload = payloadlist ? payloadlist[0] : null; var iselide = lump.rsfID.charCodeAt(0) === 126; var endopen = outerendopen; var close = outerclose; var uselump = lump; var attrcopy = {}; $.extend(true, attrcopy, (payload === null ? lump : payload).attributemap); trc.attrcopy = attrcopy; trc.uselump = uselump; trc.endopen = endopen; trc.close = close; trc.nextpos = nextpos; trc.iselide = iselide; rewriteIDRelation(context); if (torendero === null) { if (lump.rsfID.indexOf("scr=") === (iselide ? 1 : 0)) { var scrname = lump.rsfID.substring(4 + (iselide ? 1 : 0)); if (scrname === "ignore") { nextpos = trc.close.lumpindex + 1 } else { if (scrname === "rewrite-url") { torendero = { componentType : "UILink", target : {} } } else { openTag(); replaceAttributesOpen(); nextpos = trc.endopen.lumpindex } } } } if (torendero !== null) { if (payload) { trc.endopen = lumps[payload.lumpindex + 1]; trc.close = payload.close_tag; trc.uselump = payload; dumpTillLump(lumps, lumpindex, payload.lumpindex); lumpindex = payload.lumpindex } adjustForID(attrcopy, torendero); openTag(); renderComponent(torendero); if (payload !== null) { if (trc.nextpos === nextpos) { dumpTillLump(lumps, trc.close.lumpindex + 1, outerclose.lumpindex + 1) } } nextpos = trc.nextpos } return nextpos } var renderRecurse; function renderContainer(child, targetlump) { var t2 = targetlump.parent; var firstchild = t2.lumps[targetlump.lumpindex + 1]; if (child.children !== undefined) { dumpBranchHead(child, targetlump) } else { renderComponentSystem(child.parent, child, targetlump) } renderRecurse(child, targetlump, firstchild) } fetchComponent = function (basecontainer, id, lump) { if (id.indexOf("msg=") === 0) { var key = id.substring(4); return { componentType : "UIMessage", messagekey : key } } while (basecontainer) { var togo = basecontainer.childmap[id]; if (togo) { return togo } basecontainer = basecontainer.parent } return null }; function fetchComponents(basecontainer, id) { var togo; while (basecontainer) { togo = basecontainer.childmap[id]; if (togo) { break } basecontainer = basecontainer.parent } return togo } function findChild(sourcescope, child) { var split = fluid.SplitID(child.ID); var headlumps = sourcescope.downmap[child.ID]; if (!headlumps) { headlumps = sourcescope.downmap[split.prefix + ":"] } return headlumps ? headlumps[0] : null } renderRecurse = function (basecontainer, parentlump, baselump) { var renderindex = baselump.lumpindex; var basedepth = parentlump.nestingdepth; var t1 = parentlump.parent; var rendered; if (debugMode) { rendered = {} } while (true) { renderindex = dumpScan(t1.lumps, renderindex, basedepth, !parentlump.elide, false); if (renderindex === t1.lumps.length) { break } var lump = t1.lumps[renderindex]; var id = lump.rsfID; if (lump.nestingdepth < basedepth || id === undefined) { break } if (id.charCodeAt(0) === 126) { id = id.substring(1) } if (id.indexOf(":") !== -1) { var prefix = fluid.getPrefix(id); var children = fetchComponents(basecontainer, prefix); var finallump = lump.uplump.finallump[prefix]; var closefinal = finallump.close_tag; if (children) { for (var i = 0; i < children.length; ++i) { var child = children[i]; if (child.children) { if (debugMode) { rendered[child.fullID] = true } var targetlump = branchmap[child.fullID]; if (targetlump) { if (debugMode) { renderComment("Branching for " + child.fullID + " from " + fluid.debugLump(lump) + " to " + fluid.debugLump(targetlump)) } renderContainer(child, targetlump); if (debugMode) { renderComment("Branch returned for " + child.fullID + fluid.debugLump(lump) + " to " + fluid.debugLump(targetlump)) } } else { if (debugMode) { renderDebugMessage("No matching template branch found for branch container with full ID " + child.fullID + " rendering from parent template branch " + fluid.debugLump(baselump)) } } } else { var targetlump = findChild(parentlump, child); if (!targetlump) { if (debugMode) { renderDebugMessage("Repetitive leaf with full ID " + child.fullID + " could not be rendered from parent template branch " + fluid.debugLump(baselump)) } continue } var renderend = renderComponentSystem(basecontainer, child, targetlump); var wasopentag = renderend < t1.lumps.lengtn && t1.lumps[renderend].nestingdepth >= targetlump.nestingdepth; var newbase = child.children ? child : basecontainer; if (wasopentag) { renderRecurse(newbase, targetlump, t1.lumps[renderend]); renderend = targetlump.close_tag.lumpindex + 1 } if (i !== children.length - 1) { if (renderend < closefinal.lumpindex) { dumpScan(t1.lumps, renderend, targetlump.nestingdepth - 1, false, false) } } else { dumpScan(t1.lumps, renderend, targetlump.nestingdepth, true, false) } } } } else { if (debugMode) { renderDebugMessage("No branch container with prefix " + prefix + ": found in container " + reportPath(basecontainer) + " rendering at template position " + fluid.debugLump(baselump) + ", skipping") } } renderindex = closefinal.lumpindex + 1; if (debugMode) { renderComment("Stack returned from branch for ID " + id + " to " + fluid.debugLump(baselump) + ": skipping from " + fluid.debugLump(lump) + " to " + fluid.debugLump(closefinal)) } } else { var component; if (id) { component = fetchComponent(basecontainer, id, lump); if (debugMode && component) { rendered[component.fullID] = true } } if (component && component.children !== undefined) { renderContainer(component); renderindex = lump.close_tag.lumpindex + 1 } else { renderindex = renderComponentSystem(basecontainer, component, lump) } } if (renderindex === t1.lumps.length) { break } } if (debugMode) { var children = basecontainer.children; for (var key = 0; key < children.length; ++key) { var child = children[key]; if (!rendered[child.fullID]) { renderDebugMessage("Component " + child.componentType + " with full ID " + child.fullID + " could not be found within template " + fluid.debugLump(baselump)) } } } }; function renderCollect(collump) { dumpTillLump(collump.parent.lumps, collump.lumpindex, collump.close_tag.lumpindex + 1) } function renderCollects() { for (var key in collected) { var collist = collected[key]; for (var i = 0; i < collist.length; ++i) { renderCollect(collist[i]) } } } function processDecoratorQueue() { for (var i = 0; i < decoratorQueue.length; ++i) { var decorator = decoratorQueue[i]; for (var j = 0; j < decorator.ids.length; ++j) { var id = decorator.ids[j]; var node = fluid.byId(id, renderOptions.document); if (!node) { fluid.fail("Error during rendering - component with id " + id + " which has a queued decorator was not found in the output markup") } if (decorator.type === "jQuery") { var jnode = $(node); jnode[decorator.func].apply(jnode, $.makeArray(decorator.args)) } else { if (decorator.type === "fluid") { var args = decorator.args; if (!args) { if (!decorator.container) { decorator.container = $(node) } else { decorator.container.push(node) } args = [node, decorator.options] } var that = renderer.invokeFluidDecorator(decorator.func, args, id, i, options); decorator.that = that } else { if (decorator.type === "event") { node[decorator.event] = decorator.handler } } } } } } that.renderTemplates = function () { tree = fixupTree(tree, options.model, options.resolverGetConfig); var template = templates[0]; resolveBranches(templates.globalmap, tree, template.rootlump); renderedbindings = {}; renderCollects(); renderRecurse(tree, template.rootlump, template.lumps[template.firstdocumentindex]); return out }; that.processDecoratorQueue = function () { processDecoratorQueue() }; return that }; jQuery.extend(true, fluid.renderer, renderer); fluid.ComponentReference = function (reference) { this.reference = reference }; fluid.explode = function (hash, basepath) { var togo = []; for (var key in hash) { var binding = basepath === undefined ? key : basepath + "." + key; togo[togo.length] = { ID : key, value : hash[key], valuebinding : binding } } return togo }; fluid.explodeSelectionToInputs = function (optionlist, opts) { return fluid.transform(optionlist, function (option, index) { return { ID : opts.rowID, children : [{ ID : opts.inputID, parentRelativeID : "..::" + opts.selectID, choiceindex : index }, { ID : opts.labelID, parentRelativeID : "..::" + opts.selectID, choiceindex : index } ] } }) }; fluid.resolveMessageSource = function (messageSource) { if (messageSource.type === "data") { if (messageSource.url === undefined) { return fluid.messageLocator(messageSource.messages, messageSource.resolveFunc) } else {} } else { if (messageSource.type === "resolver") { return messageSource.resolver.resolve } } }; fluid.renderTemplates = function (templates, tree, options, fossilsIn) { var renderer = fluid.renderer(templates, tree, options, fossilsIn); var rendered = renderer.renderTemplates(); return rendered }; fluid.reRender = function (templates, node, tree, options) { options = options || {}; node = fluid.unwrap(node); var lastFocusedElement = fluid.getLastFocusedElement ? fluid.getLastFocusedElement() : null; var lastId; if (lastFocusedElement && fluid.dom.isContainer(node, lastFocusedElement)) { lastId = lastFocusedElement.id } if ($.browser.msie) { $(node).empty() } else { node.innerHTML = "" } var fossils = options.fossils || {}; var renderer = fluid.renderer(templates, tree, options, fossils); var rendered = renderer.renderTemplates(); if (options.renderRaw) { rendered = fluid.XMLEncode(rendered); rendered = rendered.replace(/\n/g, "
") } if (options.model) { fluid.bindFossils(node, options.model, fossils) } if ($.browser.msie) { $(node).html(rendered) } else { node.innerHTML = rendered } renderer.processDecoratorQueue(); if (lastId) { var element = fluid.byId(lastId); if (element) { $(element).focus() } } return templates }; function findNodeValue(rootNode) { var node = fluid.dom.iterateDom(rootNode, function (node) { return node.nodeType === 8 || node.nodeType === 4 ? "stop" : null }, true); var value = node.nodeValue; if (value.indexOf("[CDATA[") === 0) { return value.substring(6, value.length - 2) } else { return value } } fluid.extractTemplate = function (node, armouring) { if (!armouring) { return node.innerHTML } else { return findNodeValue(node) } }; fluid.render = function (source, target, tree, options) { options = options || {}; var template = source; if (typeof(source) === "object") { template = fluid.extractTemplate(fluid.unwrap(source.node), source.armouring) } target = fluid.unwrap(target); var resourceSpec = { base : { resourceText : template, href : ".", resourceKey : ".", cutpoints : options.cutpoints } }; var templates = fluid.parseTemplates(resourceSpec, ["base"], options); return fluid.reRender(templates, target, tree, options) }; fluid.selfRender = function (node, tree, options) { options = options || {}; return fluid.render({ node : node, armouring : options.armouring }, node, tree, options) } })(jQuery, fluid_1_4); fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { if (!fluid.renderer) { fluid.fail("fluidRenderer.js is a necessary dependency of RendererUtilities") } fluid.iota = function (count, first) { first = first || 0; var togo = []; for (var i = 0; i < count; ++i) { togo[togo.length] = first++ } return togo }; fluid.renderer.visitDecorators = function (that, visitor) { fluid.visitComponentChildren(that, function (component, name) { if (name.indexOf(fluid.renderer.decoratorComponentPrefix) === 0) { visitor(component, name) } }, { flat : true }) }; fluid.renderer.clearDecorators = function (instantiator, that) { fluid.renderer.visitDecorators(that, function (component, name) { instantiator.clearComponent(that, name) }) }; fluid.renderer.getDecoratorComponents = function (that) { var togo = {}; fluid.renderer.visitDecorators(that, function (component, name) { togo[name] = component }); return togo }; fluid.renderer.modeliseOptions = function (options, defaults, baseOptions) { return $.extend({}, defaults, options, fluid.filterKeys(baseOptions, ["model", "applier"])) }; fluid.renderer.reverseMerge = function (target, source, names) { names = fluid.makeArray(names); fluid.each(names, function (name) { if (target[name] === undefined && source[name] !== undefined) { target[name] = source[name] } }) }; fluid.renderer.createRendererSubcomponent = function (container, selectors, options, baseObject, fossils) { options = options || {}; var source = options.templateSource ? options.templateSource : { node : $(container) }; var rendererOptions = fluid.renderer.modeliseOptions(options.rendererOptions, null, baseObject); rendererOptions.fossils = fossils || {}; var expanderOptions = fluid.renderer.modeliseOptions(options.expanderOptions, { ELstyle : "${}" }, baseObject); fluid.renderer.reverseMerge(expanderOptions, options, ["resolverGetConfig", "resolverSetConfig"]); var that = {}; if (!options.noexpand) { that.expander = fluid.renderer.makeProtoExpander(expanderOptions) } var templates = null; that.render = function (tree) { var cutpointFn = options.cutpointGenerator || "fluid.renderer.selectorsToCutpoints"; rendererOptions.cutpoints = rendererOptions.cutpoints || fluid.invokeGlobalFunction(cutpointFn, [selectors, options]); container = typeof(container) === "function" ? container() : $(container); if (templates) { fluid.clear(rendererOptions.fossils); fluid.reRender(templates, container, tree, rendererOptions) } else { if (typeof(source) === "function") { source = source() } templates = fluid.render(source, container, tree, rendererOptions) } }; return that }; fluid.defaults("fluid.rendererComponent", { gradeNames : ["fluid.viewComponent"], initFunction : "fluid.initRendererComponent", mergePolicy : { protoTree : "noexpand, replace" }, rendererOptions : { autoBind : true }, events : { prepareModelForRender : null, onRenderTree : null, afterRender : null, produceTree : "unicast" } }); fluid.initRendererComponent = function (componentName, container, options) { var that = fluid.initView(componentName, container, options, { gradeNames : ["fluid.rendererComponent"] }); fluid.fetchResources(that.options.resources); var rendererOptions = fluid.renderer.modeliseOptions(that.options.rendererOptions, null, that); if (!that.options.noUpgradeDecorators) { fluid.withInstantiator(that, function (currentInst) { rendererOptions.instantiator = currentInst; rendererOptions.parentComponent = that }) } var messageResolver; if (!rendererOptions.messageSource && that.options.strings) { messageResolver = fluid.messageResolver({ messageBase : that.options.strings, resolveFunc : that.options.messageResolverFunction, parents : fluid.makeArray(that.options.parentBundle) }); rendererOptions.messageSource = { type : "resolver", resolver : messageResolver } } fluid.renderer.reverseMerge(rendererOptions, that.options, ["resolverGetConfig", "resolverSetConfig"]); var rendererFnOptions = $.extend({}, that.options.rendererFnOptions, { rendererOptions : rendererOptions, repeatingSelectors : that.options.repeatingSelectors, selectorsToIgnore : that.options.selectorsToIgnore, expanderOptions : { envAdd : { styles : that.options.styles } } }); if (that.options.resources && that.options.resources.template) { rendererFnOptions.templateSource = function () { return that.options.resources.template.resourceText } } var produceTree = that.events.produceTree; produceTree.addListener(function () { return that.options.protoTree }); if (that.options.produceTree) { produceTree.addListener(that.options.produceTree) } fluid.renderer.reverseMerge(rendererFnOptions, that.options, ["resolverGetConfig", "resolverSetConfig"]); if (rendererFnOptions.rendererTargetSelector) { container = function () { return that.dom.locate(rendererFnOptions.rendererTargetSelector) } } var renderer = { fossils : {}, boundPathForNode : function (node) { return fluid.boundPathForNode(node, renderer.fossils) } }; var rendererSub = fluid.renderer.createRendererSubcomponent(container, that.options.selectors, rendererFnOptions, that, renderer.fossils); that.renderer = $.extend(renderer, rendererSub); if (messageResolver) { that.messageResolver = messageResolver } that.refreshView = renderer.refreshView = function () { if (rendererOptions.instantiator && rendererOptions.parentComponent) { fluid.renderer.clearDecorators(rendererOptions.instantiator, rendererOptions.parentComponent) } that.events.prepareModelForRender.fire(that.model, that.applier, that); var tree = produceTree.fire(that); if (that.renderer.expander) { tree = that.renderer.expander(tree) } that.events.onRenderTree.fire(that, tree); that.renderer.render(tree); that.events.afterRender.fire(that) }; if (that.options.renderOnInit) { that.refreshView() } return that }; var removeSelectors = function (selectors, selectorsToIgnore) { fluid.each(fluid.makeArray(selectorsToIgnore), function (selectorToIgnore) { delete selectors[selectorToIgnore] }); return selectors }; var markRepeated = function (selectorKey, repeatingSelectors) { if (repeatingSelectors) { fluid.each(repeatingSelectors, function (repeatingSelector) { if (selectorKey === repeatingSelector) { selectorKey = selectorKey + ":" } }) } return selectorKey }; fluid.renderer.selectorsToCutpoints = function (selectors, options) { var togo = []; options = options || {}; selectors = fluid.copy(selectors); if (options.selectorsToIgnore) { selectors = removeSelectors(selectors, options.selectorsToIgnore) } for (var selectorKey in selectors) { togo.push({ id : markRepeated(selectorKey, options.repeatingSelectors), selector : selectors[selectorKey] }) } return togo }; fluid.renderer.NO_COMPONENT = {}; fluid.renderer.mergeComponents = function (target, source) { for (var key in source) { target[key] = source[key] } return target }; fluid.registerNamespace("fluid.renderer.selection"); fluid.renderer.selection.inputs = function (options, container, key, config) { fluid.expect("Selection to inputs expander", ["selectID", "inputID", "labelID", "rowID"], options); var selection = config.expander(options.tree); var rows = fluid.transform(selection.optionlist.value, function (option, index) { var togo = {}; var element = { parentRelativeID : "..::" + options.selectID, choiceindex : index }; togo[options.inputID] = element; togo[options.labelID] = fluid.copy(element); return togo }); var togo = {}; togo[options.selectID] = selection; togo[options.rowID] = { children : rows }; togo = config.expander(togo); return togo }; fluid.renderer.repeat = function (options, container, key, config) { fluid.expect("Repetition expander", ["controlledBy", "tree"], options); var path = fluid.extractContextualPath(options.controlledBy, { ELstyle : "ALL" }, fluid.threadLocal()); var list = fluid.get(config.model, path, config.resolverGetConfig); var togo = {}; if (!list || list.length === 0) { return options.ifEmpty ? config.expander(options.ifEmpty) : togo } var expanded = []; fluid.each(list, function (element, i) { var EL = fluid.model.composePath(path, i); var envAdd = {}; if (options.pathAs) { envAdd[options.pathAs] = EL } if (options.valueAs) { envAdd[options.valueAs] = fluid.get(config.model, EL, config.resolverGetConfig) } var expandrow = fluid.withEnvironment(envAdd, function () { return config.expander(options.tree) }, "rendererEnvironment"); if (fluid.isArrayable(expandrow)) { if (expandrow.length > 0) { expanded.push({ children : expandrow }) } } else { if (expandrow !== fluid.renderer.NO_COMPONENT) { expanded.push(expandrow) } } }); var repeatID = options.repeatID; if (repeatID.indexOf(":") === -1) { repeatID = repeatID + ":" } fluid.each(expanded, function (entry) { entry.ID = repeatID }); return expanded }; fluid.renderer.condition = function (options, container, key, config) { fluid.expect("Selection to condition expander", ["condition"], options); var condition; if (options.condition.funcName) { var args = config.expandLight(options.condition.args); condition = fluid.invoke(options.condition.funcName, args) } else { if (options.condition.expander) { condition = config.expander(options.condition) } else { condition = config.expandLight(options.condition) } } var tree = (condition ? options.trueTree : options.falseTree); if (!tree) { tree = fluid.renderer.NO_COMPONENT } return config.expander(tree) }; fluid.extractContextualPath = function (string, options, env) { var parsed = fluid.extractELWithContext(string, options); if (parsed) { if (parsed.context) { var fetched = env[parsed.context]; if (typeof(fetched) !== "string") { fluid.fail("Could not look up context path named " + parsed.context + " to string value") } return fluid.model.composePath(fetched, parsed.path) } else { return parsed.path } } }; fluid.renderer.makeProtoExpander = function (expandOptions) { var options = $.extend({ ELstyle : "${}" }, expandOptions); options.fetcher = fluid.makeEnvironmentFetcher("rendererEnvironment", options.model); var IDescape = options.IDescape || "\\"; function fetchEL(string) { var env = fluid.threadLocal().rendererEnvironment; return fluid.extractContextualPath(string, options, env) } var expandLight = function (source) { return fluid.resolveEnvironment(source, options) }; var expandBound = function (value, concrete) { if (value.messagekey !== undefined) { return { componentType : "UIMessage", messagekey : expandBound(value.messagekey), args : expandLight(value.args) } } var proto; if (!fluid.isPrimitive(value) && !fluid.isArrayable(value)) { proto = $.extend({}, value); if (proto.decorators) { proto.decorators = expandLight(proto.decorators) } value = proto.value; delete proto.value } else { proto = {} } var EL = typeof(value) === "string" ? fetchEL(value) : null; if (EL) { proto.valuebinding = EL } else { if (value !== undefined) { proto.value = value } } if (options.model && proto.valuebinding && proto.value === undefined) { proto.value = fluid.get(options.model, proto.valuebinding, options.resolverGetConfig) } if (concrete) { proto.componentType = "UIBound" } return proto }; options.filter = fluid.expander.lightFilter; var expandCond; var expandLeafOrCond; var expandEntry = function (entry) { var comp = []; expandCond(entry, comp); return { children : comp } }; var expandExternal = function (entry) { if (entry === fluid.renderer.NO_COMPONENT) { return entry } var singleTarget; var target = []; var pusher = function (comp) { singleTarget = comp }; expandLeafOrCond(entry, target, pusher); return singleTarget || target }; var expandConfig = { model : options.model, resolverGetConfig : options.resolverGetConfig, resolverSetConfig : options.resolverSetConfig, expander : expandExternal, expandLight : expandLight }; var expandLeaf = function (leaf, componentType) { var togo = { componentType : componentType }; var map = fluid.renderer.boundMap[componentType] || {}; for (var key in leaf) { if (/decorators|args/.test(key)) { togo[key] = expandLight(leaf[key]); continue } else { if (map[key]) { togo[key] = expandBound(leaf[key]) } else { togo[key] = leaf[key] } } } return togo }; var expandChildren = function (entry, pusher) { var children = entry.children; for (var i = 0; i < children.length; ++i) { var target = []; var comp = { children : target }; var child = children[i]; var childPusher = function (comp) { target[target.length] = comp }; expandLeafOrCond(child, target, childPusher); if (comp.children.length === 1 && !comp.children[0].ID) { comp = comp.children[0] } pusher(comp) } }; function detectBareBound(entry) { return fluid.find(entry, function (value, key) { return key === "decorators" }) !== false } var expandLeafOrCond = function (entry, target, pusher) { var componentType = fluid.renderer.inferComponentType(entry); if (!componentType && (fluid.isPrimitive(entry) || detectBareBound(entry))) { componentType = "UIBound" } if (componentType) { pusher(componentType === "UIBound" ? expandBound(entry, true) : expandLeaf(entry, componentType)) } else { if (!target) { fluid.fail("Illegal cond->cond transition") } expandCond(entry, target) } }; expandCond = function (proto, target) { for (var key in proto) { var entry = proto[key]; if (key.charAt(0) === IDescape) { key = key.substring(1) } if (key === "expander") { var expanders = fluid.makeArray(entry); fluid.each(expanders, function (expander) { var expanded = fluid.invokeGlobalFunction(expander.type, [expander, proto, key, expandConfig]); if (expanded !== fluid.renderer.NO_COMPONENT) { fluid.each(expanded, function (el) { target[target.length] = el }) } }) } else { if (entry) { var condPusher = function (comp) { comp.ID = key; target[target.length] = comp }; if (entry.children) { if (key.indexOf(":") === -1) { key = key + ":" } expandChildren(entry, condPusher) } else { if (fluid.renderer.isBoundPrimitive(entry)) { condPusher(expandBound(entry, true)) } else { expandLeafOrCond(entry, null, condPusher) } } } } } }; return function (entry) { var initEnvironment = $.extend({}, options.envAdd); return fluid.withEnvironment({ rendererEnvironment : initEnvironment }, function () { return expandEntry(entry) }) } } })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { fluid.registerNamespace("fluid.browser"); fluid.browser.binaryXHR = function () { var canSendBinary = window.FormData || (window.XMLHttpRequest && window.XMLHttpRequest.prototype && window.XMLHttpRequest.prototype.sendAsBinary); return canSendBinary ? fluid.typeTag("fluid.browser.supportsBinaryXHR") : undefined }; fluid.browser.formData = function () { return window.FormData ? fluid.typeTag("fluid.browser.supportsFormData") : undefined }; fluid.browser.flash = function () { var hasModernFlash = (typeof(swfobject) !== "undefined") && (swfobject.getFlashPlayerVersion().major > 8); return hasModernFlash ? fluid.typeTag("fluid.browser.supportsFlash") : undefined }; fluid.progressiveChecker = function (options) { var that = fluid.initLittleComponent("fluid.progressiveChecker", options); return fluid.typeTag(fluid.find(that.options.checks, function (check) { if (check.feature) { return check.contextName } }, that.options.defaultContextName)) }; fluid.defaults("fluid.progressiveChecker", { gradeNames : "fluid.typeFount", checks : [], defaultContextName : undefined }); fluid.progressiveCheckerForComponent = function (options) { var that = fluid.initLittleComponent("fluid.progressiveCheckerForComponent", options); var defaults = fluid.defaults(that.options.componentName); return fluid.progressiveChecker(fluid.expandOptions(defaults.progressiveCheckerOptions, that)) }; fluid.defaults("fluid.progressiveCheckerForComponent", { gradeNames : "fluid.typeFount" }); $("head").append(""); var features = { supportsBinaryXHR : fluid.browser.binaryXHR(), supportsFormData : fluid.browser.formData(), supportsFlash : fluid.browser.flash() }; fluid.merge(null, fluid.staticEnvironment, features) })(jQuery, fluid_1_4); (function ($) { var increments = 0; $.widget("ui.tooltip", { options : { items : "[title]", content : function () { return $(this).attr("title") }, position : { my : "left center", at : "right center", offset : "15 0" } }, _create : function () { var self = this; this.tooltip = $("
").attr("id", "ui-tooltip-" + increments++).attr("role", "tooltip").attr("aria-hidden", "true").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content").appendTo(document.body).hide(); this.tooltipContent = $("
").addClass("ui-tooltip-content").appendTo(this.tooltip); this.opacity = this.tooltip.css("opacity"); this.element.bind("focus.tooltip mouseover.tooltip", function (event) { self.open(event) }).bind("blur.tooltip mouseout.tooltip", function (event) { self.close(event) }) }, enable : function () { this.options.disabled = false }, disable : function () { this.options.disabled = true }, destroy : function () { this.tooltip.remove(); $.Widget.prototype.destroy.apply(this, arguments) }, widget : function () { return this.element.pushStack(this.tooltip.get()) }, open : function (event) { var target = $(event && event.target || this.element).closest(this.options.items); if (this.current && this.current[0] == target[0]) { return } var self = this; this.current = target; this.currentTitle = target.attr("title"); var content = this.options.content.call(target[0], function (response) { setTimeout(function () { if (self.current == target) { self._show(event, target, response) } }, 13) }); if (content) { self._show(event, target, content) } }, _show : function (event, target, content) { if (!content) { return } target.attr("title", ""); if (this.options.disabled) { return } this.tooltipContent.html(content); this.tooltip.css({ top : 0, left : 0 }).show().position($.extend({ of : target }, this.options.position)).hide(); this.tooltip.attr("aria-hidden", "false"); target.attr("aria-describedby", this.tooltip.attr("id")); this.tooltip.stop(false, true).fadeIn(); this._trigger("open", event) }, close : function (event) { if (!this.current) { return } var current = this.current; this.current = null; current.attr("title", this.currentTitle); if (this.options.disabled) { return } current.removeAttr("aria-describedby"); this.tooltip.attr("aria-hidden", "true"); this.tooltip.stop(false, true).fadeOut(); this._trigger("close", event) } }) })(jQuery); var fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { var STATE_INITIAL = "state_initial", STATE_CHANGED = "state_changed", STATE_REVERTED = "state_reverted"; function defaultRenderer(that, targetContainer) { var str = that.options.strings; var markup = "" + str.undo + "" + str.redo + ""; var markupNode = $(markup).attr({ role : "region", "aria-live" : "polite", "aria-relevant" : "all" }); targetContainer.append(markupNode); return markupNode } function refreshView(that) { if (that.state === STATE_INITIAL) { that.locate("undoContainer").hide(); that.locate("redoContainer").hide() } else { if (that.state === STATE_CHANGED) { that.locate("undoContainer").show(); that.locate("redoContainer").hide() } else { if (that.state === STATE_REVERTED) { that.locate("undoContainer").hide(); that.locate("redoContainer").show() } } } } var bindHandlers = function (that) { that.locate("undoControl").click(function () { if (that.state !== STATE_REVERTED) { fluid.model.copyModel(that.extremalModel, that.component.model); that.component.updateModel(that.initialModel, that); that.state = STATE_REVERTED; refreshView(that); that.locate("redoControl").focus() } return false }); that.locate("redoControl").click(function () { if (that.state !== STATE_CHANGED) { that.component.updateModel(that.extremalModel, that); that.state = STATE_CHANGED; refreshView(that); that.locate("undoControl").focus() } return false }); return { modelChanged : function (newModel, oldModel, source) { if (source !== that) { that.state = STATE_CHANGED; fluid.model.copyModel(that.initialModel, oldModel); refreshView(that) } } } }; fluid.undoDecorator = function (component, userOptions) { var that = fluid.initLittleComponent("undo", userOptions); that.container = that.options.renderer(that, component.container); fluid.initDomBinder(that); fluid.tabindex(that.locate("undoControl"), 0); fluid.tabindex(that.locate("redoControl"), 0); that.component = component; that.initialModel = {}; that.extremalModel = {}; fluid.model.copyModel(that.initialModel, component.model); fluid.model.copyModel(that.extremalModel, component.model); that.state = STATE_INITIAL; refreshView(that); var listeners = bindHandlers(that); that.returnedOptions = { listeners : listeners }; return that }; fluid.defaults("undo", { selectors : { undoContainer : ".flc-undo-undoControl", undoControl : ".flc-undo-undoControl", redoContainer : ".flc-undo-redoControl", redoControl : ".flc-undo-redoControl" }, strings : { undo : "undo edit", redo : "redo edit" }, renderer : defaultRenderer }) })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { var createContentFunc = function (content) { return typeof content === "function" ? content : function () { return content } }; var setup = function (that) { that.container.tooltip({ content : createContentFunc(that.options.content), position : that.options.position, items : that.options.items, open : function (event) { var tt = $(event.target).tooltip("widget"); tt.stop(false, true); tt.hide(); if (that.options.delay) { tt.delay(that.options.delay).fadeIn("default", that.events.afterOpen.fire()) } else { tt.show(); that.events.afterOpen.fire() } }, close : function (event) { var tt = $(event.target).tooltip("widget"); tt.stop(false, true); tt.hide(); tt.clearQueue(); that.events.afterClose.fire() } }); that.elm = that.container.tooltip("widget"); that.elm.addClass(that.options.styles.tooltip) }; fluid.tooltip = function (container, options) { var that = fluid.initView("fluid.tooltip", container, options); that.updateContent = function (content) { that.container.tooltip("option", "content", createContentFunc(content)) }; that.destroy = function () { that.container.tooltip("destroy") }; that.open = function () { that.container.tooltip("open") }; that.close = function () { that.container.tooltip("close") }; setup(that); return that }; fluid.defaults("fluid.tooltip", { styles : { tooltip : "" }, events : { afterOpen : null, afterClose : null }, content : "", position : { my : "left top", at : "left bottom", offset : "0 5" }, items : "*", delay : 300 }) })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { function sendKey(control, event, virtualCode, charCode) { var kE = document.createEvent("KeyEvents"); kE.initKeyEvent(event, 1, 1, null, 0, 0, 0, 0, virtualCode, charCode); control.dispatchEvent(kE) } fluid.setCaretToEnd = function (control, value) { var pos = value ? value.length : 0; try { control.focus(); if (control.setSelectionRange) { control.setSelectionRange(pos, pos); if ($.browser.mozilla && pos > 0) { sendKey(control, "keypress", 92, 92); sendKey(control, "keydown", 8, 0); sendKey(control, "keypress", 8, 0) } } else { if (control.createTextRange) { var range = control.createTextRange(); range.move("character", pos); range.select() } } } catch (e) {} }; var switchToViewMode = function (that) { that.editContainer.hide(); that.displayModeRenderer.show() }; var cancel = function (that) { if (that.isEditing()) { setTimeout(function () { that.editView.value(that.model.value) }, 1); switchToViewMode(that); that.events.afterFinishEdit.fire(that.model.value, that.model.value, that.editField[0], that.viewEl[0]) } }; var finish = function (that) { var newValue = that.editView.value(); var oldValue = that.model.value; var viewNode = that.viewEl[0]; var editNode = that.editField[0]; var ret = that.events.onFinishEdit.fire(newValue, oldValue, editNode, viewNode); if (ret === false) { return } that.updateModelValue(newValue); that.events.afterFinishEdit.fire(newValue, oldValue, editNode, viewNode); switchToViewMode(that) }; var bindEditFinish = function (that) { if (that.options.submitOnEnter === undefined) { that.options.submitOnEnter = "textarea" !== fluid.unwrap(that.editField).nodeName.toLowerCase() } function keyCode(evt) { return evt.keyCode ? evt.keyCode : (evt.which ? evt.which : 0) } var escHandler = function (evt) { var code = keyCode(evt); if (code === $.ui.keyCode.ESCAPE) { that.textEditButton.focus(0); cancel(that); return false } }; var finishHandler = function (evt) { var code = keyCode(evt); if (code !== $.ui.keyCode.ENTER) { that.textEditButton.blur(); return true } else { finish(that); that.textEditButton.focus(0) } return false }; if (that.options.submitOnEnter) { that.editContainer.keypress(finishHandler) } that.editContainer.keydown(escHandler) }; var bindBlurHandler = function (that) { if (that.options.blurHandlerBinder) { that.options.blurHandlerBinder(that) } else { var blurHandler = function (evt) { if (that.isEditing()) { finish(that) } return false }; that.editField.blur(blurHandler) } }; var initializeEditView = function (that, initial) { if (!that.editInitialized) { fluid.inlineEdit.renderEditContainer(that, !that.options.lazyEditView || !initial); if (!that.options.lazyEditView || !initial) { that.editView = fluid.initSubcomponent(that, "editView", that.editField); $.extend(true, that.editView, fluid.initSubcomponent(that, "editAccessor", that.editField)); bindEditFinish(that); bindBlurHandler(that); that.editView.refreshView(that); that.editInitialized = true } } }; var edit = function (that) { initializeEditView(that, false); var viewEl = that.viewEl; var displayText = that.displayView.value(); that.updateModelValue(that.model.value === "" ? "" : displayText); if (that.options.applyEditPadding) { that.editField.width(Math.max(viewEl.width() + that.options.paddings.edit, that.options.paddings.minimumEdit)) } that.displayModeRenderer.hide(); that.editContainer.show(); setTimeout(function () { fluid.setCaretToEnd(that.editField[0], that.editView.value()); if (that.options.selectOnEdit) { that.editField[0].select() } }, 0); that.events.afterBeginEdit.fire() }; var clearEmptyViewStyles = function (textEl, styles, originalViewPadding) { textEl.removeClass(styles.defaultViewStyle); textEl.css("padding-right", originalViewPadding); textEl.removeClass(styles.emptyDefaultViewText) }; var showDefaultViewText = function (that) { that.displayView.value(that.options.defaultViewText); that.viewEl.css("padding-right", that.existingPadding); that.viewEl.addClass(that.options.styles.defaultViewStyle) }; var showNothing = function (that) { that.displayView.value(""); if ($.browser.msie) { if (that.viewEl.css("display") === "inline") { that.viewEl.css("display", "inline-block") } } }; var showEditedText = function (that) { that.displayView.value(that.model.value); clearEmptyViewStyles(that.viewEl, that.options.styles, that.existingPadding) }; var refreshView = function (that, source) { that.displayView.refreshView(that, source); if (that.editView) { that.editView.refreshView(that, source) } }; var initModel = function (that, value) { that.model.value = value; that.refreshView() }; var updateModelValue = function (that, newValue, source) { var comparator = that.options.modelComparator; var unchanged = comparator ? comparator(that.model.value, newValue) : that.model.value === newValue; if (!unchanged) { var oldModel = $.extend(true, {}, that.model); that.model.value = newValue; that.events.modelChanged.fire(that.model, oldModel, source); that.refreshView(source) } }; var makeIsEditing = function (that) { var isEditing = false; that.events.onBeginEdit.addListener(function () { isEditing = true }); that.events.afterFinishEdit.addListener(function () { isEditing = false }); return function () { return isEditing } }; var makeEditHandler = function (that) { return function () { var prevent = that.events.onBeginEdit.fire(); if (prevent === false) { return false } edit(that); return true } }; var initTooltips = function (that) { var tooltipOptions = { content : that.options.tooltipText, position : { my : "left top", at : "left bottom", offset : "0 5" }, target : "*", delay : that.options.tooltipDelay, styles : { tooltip : that.options.styles.tooltip } }; fluid.tooltip(that.viewEl, tooltipOptions); if (that.textEditButton) { fluid.tooltip(that.textEditButton, tooltipOptions) } }; var calculateInitialPadding = function (viewEl) { var padding = viewEl.css("padding-right"); return padding ? parseFloat(padding) : 0 }; var setupInlineEdit = function (componentContainer, that) { if (that.editContainer) { that.editContainer.hide() } if (that.tooltipEnabled()) { initTooltips(that) } that.decorators = fluid.initSubcomponents(that, "componentDecorators", [that, fluid.COMPONENT_OPTIONS]) }; var setupInlineEdits = function (editables, options) { var editors = []; editables.each(function (idx, editable) { editors.push(fluid.inlineEdit($(editable), options)) }); return editors }; fluid.inlineEdit = function (componentContainer, userOptions) { var that = fluid.initView("inlineEdit", componentContainer, userOptions); that.viewEl = fluid.inlineEdit.setupDisplayText(that); that.displayView = fluid.initSubcomponent(that, "displayView", that.viewEl); $.extend(true, that.displayView, fluid.initSubcomponent(that, "displayAccessor", that.viewEl)); that.model = { value : "" }; that.edit = makeEditHandler(that); that.isEditing = makeIsEditing(that); that.finish = function () { finish(that) }; that.cancel = function () { cancel(that) }; that.tooltipEnabled = function () { return that.options.useTooltip && $.fn.tooltip }; that.refreshView = function (source) { refreshView(that, source) }; that.updateModelValue = function (newValue, source) { updateModelValue(that, newValue, source) }; that.updateModel = function (newModel, source) { updateModelValue(that, newModel.value, source) }; that.existingPadding = calculateInitialPadding(that.viewEl); initModel(that, that.displayView.value()); that.displayModeRenderer = that.options.displayModeRenderer(that); initializeEditView(that, true); setupInlineEdit(componentContainer, that); return that }; fluid.inlineEdit.setupEditField = function (editStyle, editField) { var eField = $(editField); eField = eField.length ? eField : $(""); eField.addClass(editStyle); return eField }; fluid.inlineEdit.setupEditContainer = function (displayContainer, editField, editContainer) { var eContainer = $(editContainer); eContainer = eContainer.length ? eContainer : $(""); displayContainer.after(eContainer); eContainer.append(editField); return eContainer }; fluid.inlineEdit.defaultEditModeRenderer = function (that) { var editField = fluid.inlineEdit.setupEditField(that.options.styles.edit, that.editField); var editContainer = fluid.inlineEdit.setupEditContainer(that.displayModeRenderer, editField, that.editContainer); var editModeInstruction = fluid.inlineEdit.setupEditModeInstruction(that.options.styles.editModeInstruction, that.options.strings.editModeInstruction); var id = fluid.allocateSimpleId(editModeInstruction); editField.attr("aria-describedby", id); fluid.inlineEdit.positionEditModeInstruction(editModeInstruction, editContainer, editField); return { container : editContainer, field : editField } }; fluid.inlineEdit.renderEditContainer = function (that, lazyEditView) { that.editContainer = that.locate("editContainer"); that.editField = that.locate("edit"); if (that.editContainer.length !== 1) { if (that.editContainer.length > 1) { fluid.fail("InlineEdit did not find a unique container for selector " + that.options.selectors.editContainer + ": " + fluid.dumpEl(that.editContainer)) } } if (!lazyEditView) { return } var editElms = that.options.editModeRenderer(that); if (editElms) { that.editContainer = editElms.container; that.editField = editElms.field } }; fluid.inlineEdit.setupEditModeInstruction = function (editModeInstructionStyle, editModeInstructionText) { var editModeInstruction = $("

"); editModeInstruction.addClass(editModeInstructionStyle); editModeInstruction.text(editModeInstructionText); return editModeInstruction }; fluid.inlineEdit.positionEditModeInstruction = function (editModeInstruction, editContainer, editField) { editContainer.append(editModeInstruction); editField.focus(function () { editModeInstruction.show(); var editFieldPosition = editField.offset(); editModeInstruction.css({ left : editFieldPosition.left }); editModeInstruction.css({ top : editFieldPosition.top + editField.height() + 5 }) }) }; fluid.inlineEdit.setupDisplayModeContainer = function (styles, displayModeWrapper) { var displayModeContainer = $(displayModeWrapper); displayModeContainer = displayModeContainer.length ? displayModeContainer : $(""); displayModeContainer.addClass(styles.displayView); return displayModeContainer }; fluid.inlineEdit.setupDisplayText = function (that) { var viewEl = that.locate("text"); viewEl.attr("tabindex", "-1"); viewEl.addClass(that.options.styles.text); return viewEl }; fluid.inlineEdit.setupTextEditButton = function (that) { var opts = that.options; var textEditButton = that.locate("textEditButton"); if (textEditButton.length === 0) { var markup = $(""); markup.addClass(opts.styles.textEditButton); markup.text(opts.tooltipText); fluid.inlineEdit.updateTextEditButton(markup, that.model.value || opts.defaultViewText, opts.strings.textEditButton); that.events.modelChanged.addListener(function () { fluid.inlineEdit.updateTextEditButton(markup, that.model.value || opts.defaultViewText, opts.strings.textEditButton) }); that.locate("text").after(markup); textEditButton = that.locate("textEditButton") } return textEditButton }; fluid.inlineEdit.updateTextEditButton = function (textEditButton, value, stringTemplate) { var buttonText = fluid.stringTemplate(stringTemplate, { text : value }); textEditButton.text(buttonText) }; fluid.inlineEdit.bindHoverHandlers = function (displayModeRenderer, invitationStyle) { var over = function (evt) { displayModeRenderer.addClass(invitationStyle) }; var out = function (evt) { displayModeRenderer.removeClass(invitationStyle) }; displayModeRenderer.hover(over, out) }; fluid.inlineEdit.bindHighlightHandler = function (element, displayModeRenderer, styles) { element = $(element); var focusOn = function () { displayModeRenderer.addClass(styles.focus); displayModeRenderer.addClass(styles.invitation) }; var focusOff = function () { displayModeRenderer.removeClass(styles.focus); displayModeRenderer.removeClass(styles.invitation) }; element.focus(focusOn); element.blur(focusOff) }; fluid.inlineEdit.bindMouseHandlers = function (element, edit) { element = $(element); var triggerGuard = fluid.inlineEdit.makeEditTriggerGuard(element, edit); element.click(function (e) { triggerGuard(e); return false }) }; fluid.inlineEdit.bindKeyboardHandlers = function (element, edit) { element = $(element); element.attr("role", "button"); var guard = fluid.inlineEdit.makeEditTriggerGuard(element, edit); fluid.activatable(element, function (event) { return guard(event) }) }; fluid.inlineEdit.makeEditTriggerGuard = function (element, edit) { var selector = fluid.unwrap(element); return function (event) { var outer = fluid.findAncestor(event.target, function (elem) { if (/input|select|textarea|button|a/i.test(elem.nodeName) || elem === selector) { return true } }); if (outer === selector) { edit(); return false } } }; fluid.inlineEdit.defaultDisplayModeRenderer = function (that) { var styles = that.options.styles; var displayModeWrapper = fluid.inlineEdit.setupDisplayModeContainer(styles); var displayModeRenderer = that.viewEl.wrap(displayModeWrapper).parent(); that.textEditButton = fluid.inlineEdit.setupTextEditButton(that); displayModeRenderer.append(that.textEditButton); fluid.inlineEdit.bindHoverHandlers(displayModeRenderer, styles.invitation); fluid.inlineEdit.bindMouseHandlers(that.viewEl, that.edit); fluid.inlineEdit.bindMouseHandlers(that.textEditButton, that.edit); fluid.inlineEdit.bindKeyboardHandlers(that.textEditButton, that.edit); fluid.inlineEdit.bindHighlightHandler(that.viewEl, displayModeRenderer, styles); fluid.inlineEdit.bindHighlightHandler(that.textEditButton, displayModeRenderer, styles); return displayModeRenderer }; fluid.inlineEdit.standardAccessor = function (element) { var nodeName = element.nodeName.toLowerCase(); return { value : function (newValue) { return "input" === nodeName || "textarea" === nodeName ? fluid.value($(element), newValue) : $(element).text(newValue) } } }; fluid.inlineEdit.standardDisplayView = function (viewEl) { var that = { refreshView : function (componentThat, source) { if (componentThat.model.value) { showEditedText(componentThat) } else { if (componentThat.options.defaultViewText) { showDefaultViewText(componentThat) } else { showNothing(componentThat) } } if ($.trim(componentThat.viewEl.text()).length === 0) { componentThat.viewEl.addClass(componentThat.options.styles.emptyDefaultViewText); if (componentThat.existingPadding < componentThat.options.paddings.minimumView) { componentThat.viewEl.css("padding-right", componentThat.options.paddings.minimumView) } } } }; return that }; fluid.inlineEdit.standardEditView = function (editField) { var that = { refreshView : function (componentThat, source) { if (!source || (componentThat.editField && componentThat.editField.index(source) === -1)) { componentThat.editView.value(componentThat.model.value) } } }; $.extend(true, that, fluid.inlineEdit.standardAccessor(editField)); return that }; fluid.inlineEdits = function (componentContainer, options) { options = options || {}; var selectors = $.extend({}, fluid.defaults("inlineEdits").selectors, options.selectors); var container = fluid.container(componentContainer); var editables = $(selectors.editables, container); return setupInlineEdits(editables, options) }; fluid.defaults("inlineEdit", { selectors : { text : ".flc-inlineEdit-text", editContainer : ".flc-inlineEdit-editContainer", edit : ".flc-inlineEdit-edit", textEditButton : ".flc-inlineEdit-textEditButton" }, styles : { text : "fl-inlineEdit-text", edit : "fl-inlineEdit-edit", invitation : "fl-inlineEdit-invitation", defaultViewStyle : "fl-inlineEdit-emptyText-invitation", emptyDefaultViewText : "fl-inlineEdit-emptyDefaultViewText", focus : "fl-inlineEdit-focus", tooltip : "fl-inlineEdit-tooltip", editModeInstruction : "fl-inlineEdit-editModeInstruction", displayView : "fl-inlineEdit-simple-editableText fl-inlineEdit-textContainer", textEditButton : "fl-offScreen-hidden" }, events : { modelChanged : null, onBeginEdit : "preventable", afterBeginEdit : null, onFinishEdit : "preventable", afterFinishEdit : null, afterInitEdit : null }, strings : { textEditButton : "Edit text %text", editModeInstruction : "Escape to cancel, Enter or Tab when finished" }, paddings : { edit : 10, minimumEdit : 80, minimumView : 60 }, applyEditPadding : true, blurHandlerBinder : null, submitOnEnter : undefined, modelComparator : null, displayAccessor : { type : "fluid.inlineEdit.standardAccessor" }, displayView : { type : "fluid.inlineEdit.standardDisplayView" }, editAccessor : { type : "fluid.inlineEdit.standardAccessor" }, editView : { type : "fluid.inlineEdit.standardEditView" }, displayModeRenderer : fluid.inlineEdit.defaultDisplayModeRenderer, editModeRenderer : fluid.inlineEdit.defaultEditModeRenderer, lazyEditView : false, defaultViewText : "Click here to edit", useTooltip : true, tooltipText : "Select or press Enter to edit", tooltipDelay : 1000, selectOnEdit : false }); fluid.defaults("inlineEdits", { selectors : { editables : ".flc-inlineEditable" } }) })(jQuery, fluid_1_4); var fluid_1_4 = fluid_1_4 || {}; (function ($, fluid) { fluid.inlineEdit.makeViewAccessor = function (editorGetFn, setValueFn, getValueFn) { return function (editField) { return { value : function (newValue) { var editor = editorGetFn(editField); if (!editor) { if (newValue) { $(editField).val(newValue) } return "" } if (newValue) { setValueFn(editField, editor, newValue) } else { return getValueFn(editor) } } } } }; fluid.inlineEdit.richTextViewAccessor = function (element) { return { value : function (newValue) { return $(element).html(newValue) } } }; var configureInlineEdit = function (configurationName, container, options) { var defaults = fluid.defaults(configurationName); var assembleOptions = fluid.merge(defaults ? defaults.mergePolicy : null, {}, defaults, options); return fluid.inlineEdit(container, assembleOptions) }; fluid.inlineEdit.normalizeHTML = function (value) { var togo = $.trim(value.replace(/\s+/g, " ")); togo = togo.replace(/\s+<\//g, "/g, function (match) { return match.toLowerCase() }); return togo }; fluid.inlineEdit.htmlComparator = function (el1, el2) { return fluid.inlineEdit.normalizeHTML(el1) === fluid.inlineEdit.normalizeHTML(el2) }; fluid.inlineEdit.bindRichTextHighlightHandler = function (element, displayModeRenderer, invitationStyle) { element = $(element); var focusOn = function () { displayModeRenderer.addClass(invitationStyle) }; var focusOff = function () { displayModeRenderer.removeClass(invitationStyle) }; element.focus(focusOn); element.blur(focusOff) }; fluid.inlineEdit.setupRichTextEditButton = function (that) { var opts = that.options; var textEditButton = that.locate("textEditButton"); if (textEditButton.length === 0) { var markup = $(""); markup.text(opts.strings.textEditButton); that.locate("text").after(markup); textEditButton = that.locate("textEditButton") } return textEditButton }; fluid.inlineEdit.richTextDisplayModeRenderer = function (that) { var styles = that.options.styles; var displayModeWrapper = fluid.inlineEdit.setupDisplayModeContainer(styles); var displayModeRenderer = that.viewEl.wrap(displayModeWrapper).parent(); that.textEditButton = fluid.inlineEdit.setupRichTextEditButton(that); displayModeRenderer.append(that.textEditButton); displayModeRenderer.addClass(styles.focus); fluid.inlineEdit.bindHoverHandlers(displayModeRenderer, styles.invitation); fluid.inlineEdit.bindMouseHandlers(that.textEditButton, that.edit); fluid.inlineEdit.bindKeyboardHandlers(that.textEditButton, that.edit); fluid.inlineEdit.bindRichTextHighlightHandler(that.viewEl, displayModeRenderer, styles.invitation); fluid.inlineEdit.bindRichTextHighlightHandler(that.textEditButton, displayModeRenderer, styles.invitation); return displayModeRenderer }; fluid.inlineEdit.tinyMCE = function (container, options) { var inlineEditor = configureInlineEdit("fluid.inlineEdit.tinyMCE", container, options); tinyMCE.init(inlineEditor.options.tinyMCE); return inlineEditor }; fluid.inlineEdit.tinyMCE.getEditor = function (editField) { return tinyMCE.get(editField.id) }; fluid.inlineEdit.tinyMCE.setValue = function (editField, editor, value) { $(editField).val(value); editor.setContent(value, { format : "raw" }) }; fluid.inlineEdit.tinyMCE.getValue = function (editor) { return editor.getContent() }; var flTinyMCE = fluid.inlineEdit.tinyMCE; flTinyMCE.viewAccessor = fluid.inlineEdit.makeViewAccessor(flTinyMCE.getEditor, flTinyMCE.setValue, flTinyMCE.getValue); fluid.inlineEdit.tinyMCE.blurHandlerBinder = function (that) { function focusEditor(editor) { setTimeout(function () { tinyMCE.execCommand("mceFocus", false, that.editField[0].id); if ($.browser.mozilla && $.browser.version.substring(0, 3) === "1.8") { return } editor.selection.select(editor.getBody(), 1); editor.selection.collapse(0) }, 10) } that.events.afterInitEdit.addListener(function (editor) { focusEditor(editor); var editorBody = editor.getBody(); fluid.deadMansBlur(that.editField, { exclusions : { body : $(editorBody) }, handler : function () { that.cancel() } }) }); that.events.afterBeginEdit.addListener(function () { var editor = tinyMCE.get(that.editField[0].id); if (editor) { focusEditor(editor) } }) }; fluid.inlineEdit.tinyMCE.editModeRenderer = function (that) { var options = that.options.tinyMCE; options.elements = fluid.allocateSimpleId(that.editField); var oldinit = options.init_instance_callback; options.init_instance_callback = function (instance) { that.events.afterInitEdit.fire(instance); if (oldinit) { oldinit() } }; tinyMCE.init(options) }; fluid.defaults("fluid.inlineEdit.tinyMCE", { tinyMCE : { mode : "exact", theme : "simple" }, useTooltip : true, selectors : { edit : "textarea" }, styles : { invitation : "fl-inlineEdit-richText-invitation", displayView : "fl-inlineEdit-textContainer", text : "" }, strings : { textEditButton : "Edit" }, displayAccessor : { type : "fluid.inlineEdit.richTextViewAccessor" }, editAccessor : { type : "fluid.inlineEdit.tinyMCE.viewAccessor" }, lazyEditView : true, defaultViewText : "Click Edit", modelComparator : fluid.inlineEdit.htmlComparator, blurHandlerBinder : fluid.inlineEdit.tinyMCE.blurHandlerBinder, displayModeRenderer : fluid.inlineEdit.richTextDisplayModeRenderer, editModeRenderer : fluid.inlineEdit.tinyMCE.editModeRenderer }); fluid.inlineEdit.CKEditor = function (container, options) { return configureInlineEdit("fluid.inlineEdit.CKEditor", container, options) }; fluid.inlineEdit.CKEditor.getEditor = function (editField) { return CKEDITOR.instances[editField.id] }; fluid.inlineEdit.CKEditor.setValue = function (editField, editor, value) { editor.setData(value) }; fluid.inlineEdit.CKEditor.getValue = function (editor) { return editor.getData() }; var flCKEditor = fluid.inlineEdit.CKEditor; flCKEditor.viewAccessor = fluid.inlineEdit.makeViewAccessor(flCKEditor.getEditor, flCKEditor.setValue, flCKEditor.getValue); fluid.inlineEdit.CKEditor.focus = function (editor) { setTimeout(function () { editor.focus() }, 0) }; fluid.inlineEdit.CKEditor.normalizeHTML = function (value) { var togo = fluid.inlineEdit.normalizeHTML(value); var angpos = togo.indexOf(">"); if (angpos !== -1 && angpos < togo.length - 1) { if (togo.charAt(angpos + 1) !== " ") { togo = togo.substring(0, angpos + 1) + " " + togo.substring(angpos + 1) } } return togo }; fluid.inlineEdit.CKEditor.htmlComparator = function (el1, el2) { return fluid.inlineEdit.CKEditor.normalizeHTML(el1) === fluid.inlineEdit.CKEditor.normalizeHTML(el2) }; fluid.inlineEdit.CKEditor.blurHandlerBinder = function (that) { that.events.afterInitEdit.addListener(fluid.inlineEdit.CKEditor.focus); that.events.afterBeginEdit.addListener(function () { var editor = fluid.inlineEdit.CKEditor.getEditor(that.editField[0]); if (editor) { fluid.inlineEdit.CKEditor.focus(editor) } }) }; fluid.inlineEdit.CKEditor.editModeRenderer = function (that) { var id = fluid.allocateSimpleId(that.editField); $.data(fluid.unwrap(that.editField), "fluid.inlineEdit.CKEditor", that); var editor = CKEDITOR.replace(id, that.options.CKEditor); editor.on("instanceReady", function (e) { fluid.inlineEdit.CKEditor.focus(e.editor); that.events.afterInitEdit.fire(e.editor) }) }; fluid.defaults("fluid.inlineEdit.CKEditor", { selectors : { edit : "textarea" }, styles : { invitation : "fl-inlineEdit-richText-invitation", displayView : "fl-inlineEdit-textContainer", text : "" }, strings : { textEditButton : "Edit" }, displayAccessor : { type : "fluid.inlineEdit.richTextViewAccessor" }, editAccessor : { type : "fluid.inlineEdit.CKEditor.viewAccessor" }, lazyEditView : true, defaultViewText : "Click Edit", modelComparator : fluid.inlineEdit.CKEditor.htmlComparator, blurHandlerBinder : fluid.inlineEdit.CKEditor.blurHandlerBinder, displayModeRenderer : fluid.inlineEdit.richTextDisplayModeRenderer, editModeRenderer : fluid.inlineEdit.CKEditor.editModeRenderer, CKEditor : {} }); fluid.inlineEdit.dropdown = function (container, options) { return configureInlineEdit("fluid.inlineEdit.dropdown", container, options) }; fluid.inlineEdit.dropdown.editModeRenderer = function (that) { var id = fluid.allocateSimpleId(that.editField); that.editField.selectbox({ finishHandler : function () { that.finish() } }); return { container : that.editContainer, field : $("input.selectbox", that.editContainer) } }; fluid.inlineEdit.dropdown.blurHandlerBinder = function (that) { fluid.deadMansBlur(that.editField, { exclusions : { selectBox : $("div.selectbox-wrapper", that.editContainer) }, handler : function () { that.cancel() } }) }; fluid.defaults("fluid.inlineEdit.dropdown", { applyEditPadding : false, blurHandlerBinder : fluid.inlineEdit.dropdown.blurHandlerBinder, editModeRenderer : fluid.inlineEdit.dropdown.editModeRenderer }) })(jQuery, fluid_1_4); (function ($) { $.fn.bgIframe = $.fn.bgiframe = function (s) { if ($.browser.msie && parseInt($.browser.version) <= 6) { s = $.extend({ top : "auto", left : "auto", width : "auto", height : "auto", opacity : true, src : "javascript:false;" }, s || {}); var prop = function (n) { return n && n.constructor == Number ? n + "px" : n }, html = '