Created
March 1, 2016 20:14
-
-
Save calvez/8a23a9be3bad291592e2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
! function(window, document, undefined) { | |
"use strict"; | |
function minErr(module, ErrorConstructor) { | |
return ErrorConstructor = ErrorConstructor || Error, | |
function() { | |
var message, i, code = arguments[0], | |
prefix = "[" + (module ? module + ":" : "") + code + "] ", | |
template = arguments[1], | |
templateArgs = arguments; | |
for (message = prefix + template.replace(/\{\d+\}/g, function(match) { | |
var index = +match.slice(1, -1); | |
return index + 2 < templateArgs.length ? toDebugString(templateArgs[index + 2]) : match }), message = message + "\nhttp://errors.angularjs.org/1.3.5/" + (module ? module + "/" : "") + code, i = 2; i < arguments.length; i++) message = message + (2 == i ? "?" : "&") + "p" + (i - 2) + "=" + encodeURIComponent(toDebugString(arguments[i])); | |
return new ErrorConstructor(message) } } | |
function isArrayLike(obj) { | |
if (null == obj || isWindow(obj)) return !1; | |
var length = obj.length; | |
return obj.nodeType === NODE_TYPE_ELEMENT && length ? !0 : isString(obj) || isArray(obj) || 0 === length || "number" == typeof length && length > 0 && length - 1 in obj } | |
function forEach(obj, iterator, context) { | |
var key, length; | |
if (obj) | |
if (isFunction(obj)) | |
for (key in obj) "prototype" == key || "length" == key || "name" == key || obj.hasOwnProperty && !obj.hasOwnProperty(key) || iterator.call(context, obj[key], key, obj); | |
else if (isArray(obj) || isArrayLike(obj)) { | |
var isPrimitive = "object" != typeof obj; | |
for (key = 0, length = obj.length; length > key; key++)(isPrimitive || key in obj) && iterator.call(context, obj[key], key, obj) } else if (obj.forEach && obj.forEach !== forEach) obj.forEach(iterator, context, obj); | |
else | |
for (key in obj) obj.hasOwnProperty(key) && iterator.call(context, obj[key], key, obj); | |
return obj } | |
function sortedKeys(obj) { | |
return Object.keys(obj).sort() } | |
function forEachSorted(obj, iterator, context) { | |
for (var keys = sortedKeys(obj), i = 0; i < keys.length; i++) iterator.call(context, obj[keys[i]], keys[i]); | |
return keys } | |
function reverseParams(iteratorFn) { | |
return function(value, key) { iteratorFn(key, value) } } | |
function nextUid() { | |
return ++uid } | |
function setHashKey(obj, h) { h ? obj.$$hashKey = h : delete obj.$$hashKey } | |
function extend(dst) { | |
for (var h = dst.$$hashKey, i = 1, ii = arguments.length; ii > i; i++) { | |
var obj = arguments[i]; | |
if (obj) | |
for (var keys = Object.keys(obj), j = 0, jj = keys.length; jj > j; j++) { | |
var key = keys[j]; | |
dst[key] = obj[key] } } | |
return setHashKey(dst, h), dst } | |
function int(str) { | |
return parseInt(str, 10) } | |
function inherit(parent, extra) { | |
return extend(Object.create(parent), extra) } | |
function noop() {} | |
function identity($) { | |
return $ } | |
function valueFn(value) { | |
return function() { | |
return value } } | |
function isUndefined(value) { | |
return "undefined" == typeof value } | |
function isDefined(value) { | |
return "undefined" != typeof value } | |
function isObject(value) { | |
return null !== value && "object" == typeof value } | |
function isString(value) { | |
return "string" == typeof value } | |
function isNumber(value) { | |
return "number" == typeof value } | |
function isDate(value) { | |
return "[object Date]" === toString.call(value) } | |
function isFunction(value) { | |
return "function" == typeof value } | |
function isRegExp(value) { | |
return "[object RegExp]" === toString.call(value) } | |
function isWindow(obj) { | |
return obj && obj.window === obj } | |
function isScope(obj) { | |
return obj && obj.$evalAsync && obj.$watch } | |
function isFile(obj) { | |
return "[object File]" === toString.call(obj) } | |
function isBlob(obj) { | |
return "[object Blob]" === toString.call(obj) } | |
function isBoolean(value) { | |
return "boolean" == typeof value } | |
function isPromiseLike(obj) { | |
return obj && isFunction(obj.then) } | |
function isElement(node) { | |
return !(!node || !(node.nodeName || node.prop && node.attr && node.find)) } | |
function makeMap(str) { | |
var i, obj = {}, | |
items = str.split(","); | |
for (i = 0; i < items.length; i++) obj[items[i]] = !0; | |
return obj } | |
function nodeName_(element) { | |
return lowercase(element.nodeName || element[0] && element[0].nodeName) } | |
function arrayRemove(array, value) { | |
var index = array.indexOf(value); | |
return index >= 0 && array.splice(index, 1), value } | |
function copy(source, destination, stackSource, stackDest) { | |
if (isWindow(source) || isScope(source)) throw ngMinErr("cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); | |
if (destination) { | |
if (source === destination) throw ngMinErr("cpi", "Can't copy! Source and destination are identical."); | |
if (stackSource = stackSource || [], stackDest = stackDest || [], isObject(source)) { | |
var index = stackSource.indexOf(source); | |
if (-1 !== index) return stackDest[index]; | |
stackSource.push(source), stackDest.push(destination) } | |
var result; | |
if (isArray(source)) { destination.length = 0; | |
for (var i = 0; i < source.length; i++) result = copy(source[i], null, stackSource, stackDest), isObject(source[i]) && (stackSource.push(source[i]), stackDest.push(result)), destination.push(result) } else { | |
var h = destination.$$hashKey; | |
isArray(destination) ? destination.length = 0 : forEach(destination, function(value, key) { delete destination[key] }); | |
for (var key in source) source.hasOwnProperty(key) && (result = copy(source[key], null, stackSource, stackDest), isObject(source[key]) && (stackSource.push(source[key]), stackDest.push(result)), destination[key] = result); | |
setHashKey(destination, h) } } else if (destination = source, source) | |
if (isArray(source)) destination = copy(source, [], stackSource, stackDest); | |
else if (isDate(source)) destination = new Date(source.getTime()); | |
else if (isRegExp(source)) destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]), destination.lastIndex = source.lastIndex; | |
else if (isObject(source)) { | |
var emptyObject = Object.create(Object.getPrototypeOf(source)); | |
destination = copy(source, emptyObject, stackSource, stackDest) } | |
return destination } | |
function shallowCopy(src, dst) { | |
if (isArray(src)) { dst = dst || []; | |
for (var i = 0, ii = src.length; ii > i; i++) dst[i] = src[i] } else if (isObject(src)) { dst = dst || {}; | |
for (var key in src)("$" !== key.charAt(0) || "$" !== key.charAt(1)) && (dst[key] = src[key]) } | |
return dst || src } | |
function equals(o1, o2) { | |
if (o1 === o2) return !0; | |
if (null === o1 || null === o2) return !1; | |
if (o1 !== o1 && o2 !== o2) return !0; | |
var length, key, keySet, t1 = typeof o1, | |
t2 = typeof o2; | |
if (t1 == t2 && "object" == t1) { | |
if (!isArray(o1)) { | |
if (isDate(o1)) return isDate(o2) ? equals(o1.getTime(), o2.getTime()) : !1; | |
if (isRegExp(o1) && isRegExp(o2)) return o1.toString() == o2.toString(); | |
if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return !1; | |
keySet = {}; | |
for (key in o1) | |
if ("$" !== key.charAt(0) && !isFunction(o1[key])) { | |
if (!equals(o1[key], o2[key])) return !1; | |
keySet[key] = !0 } | |
for (key in o2) | |
if (!keySet.hasOwnProperty(key) && "$" !== key.charAt(0) && o2[key] !== undefined && !isFunction(o2[key])) return !1; | |
return !0 } | |
if (!isArray(o2)) return !1; | |
if ((length = o1.length) == o2.length) { | |
for (key = 0; length > key; key++) | |
if (!equals(o1[key], o2[key])) return !1; | |
return !0 } } | |
return !1 } | |
function concat(array1, array2, index) { | |
return array1.concat(slice.call(array2, index)) } | |
function sliceArgs(args, startIndex) { | |
return slice.call(args, startIndex || 0) } | |
function bind(self, fn) { | |
var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : []; | |
return !isFunction(fn) || fn instanceof RegExp ? fn : curryArgs.length ? function() { | |
return arguments.length ? fn.apply(self, concat(curryArgs, arguments, 0)) : fn.apply(self, curryArgs) } : function() { | |
return arguments.length ? fn.apply(self, arguments) : fn.call(self) } } | |
function toJsonReplacer(key, value) { | |
var val = value; | |
return "string" == typeof key && "$" === key.charAt(0) && "$" === key.charAt(1) ? val = undefined : isWindow(value) ? val = "$WINDOW" : value && document === value ? val = "$DOCUMENT" : isScope(value) && (val = "$SCOPE"), val } | |
function toJson(obj, pretty) { | |
return "undefined" == typeof obj ? undefined : JSON.stringify(obj, toJsonReplacer, pretty ? " " : null) } | |
function fromJson(json) { | |
return isString(json) ? JSON.parse(json) : json } | |
function startingTag(element) { element = jqLite(element).clone(); | |
try { element.empty() } catch (e) {} | |
var elemHtml = jqLite("<div>").append(element).html(); | |
try { | |
return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) : elemHtml.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/, function(match, nodeName) { | |
return "<" + lowercase(nodeName) }) } catch (e) { | |
return lowercase(elemHtml) } } | |
function tryDecodeURIComponent(value) { | |
try { | |
return decodeURIComponent(value) } catch (e) {} } | |
function parseKeyValue(keyValue) { | |
var key_value, key, obj = {}; | |
return forEach((keyValue || "").split("&"), function(keyValue) { | |
if (keyValue && (key_value = keyValue.replace(/\+/g, "%20").split("="), key = tryDecodeURIComponent(key_value[0]), isDefined(key))) { | |
var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : !0; | |
hasOwnProperty.call(obj, key) ? isArray(obj[key]) ? obj[key].push(val) : obj[key] = [obj[key], val] : obj[key] = val } }), obj } | |
function toKeyValue(obj) { | |
var parts = []; | |
return forEach(obj, function(value, key) { isArray(value) ? forEach(value, function(arrayValue) { parts.push(encodeUriQuery(key, !0) + (arrayValue === !0 ? "" : "=" + encodeUriQuery(arrayValue, !0))) }) : parts.push(encodeUriQuery(key, !0) + (value === !0 ? "" : "=" + encodeUriQuery(value, !0))) }), parts.length ? parts.join("&") : "" } | |
function encodeUriSegment(val) { | |
return encodeUriQuery(val, !0).replace(/%26/gi, "&").replace(/%3D/gi, "=").replace(/%2B/gi, "+") } | |
function encodeUriQuery(val, pctEncodeSpaces) { | |
return encodeURIComponent(val).replace(/%40/gi, "@").replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%3B/gi, ";").replace(/%20/g, pctEncodeSpaces ? "%20" : "+") } | |
function getNgAttribute(element, ngAttr) { | |
var attr, i, ii = ngAttrPrefixes.length; | |
for (element = jqLite(element), i = 0; ii > i; ++i) | |
if (attr = ngAttrPrefixes[i] + ngAttr, isString(attr = element.attr(attr))) return attr; | |
return null } | |
function angularInit(element, bootstrap) { | |
var appElement, module, config = {}; | |
forEach(ngAttrPrefixes, function(prefix) { | |
var name = prefix + "app";!appElement && element.hasAttribute && element.hasAttribute(name) && (appElement = element, module = element.getAttribute(name)) }), forEach(ngAttrPrefixes, function(prefix) { | |
var candidate, name = prefix + "app";!appElement && (candidate = element.querySelector("[" + name.replace(":", "\\:") + "]")) && (appElement = candidate, module = candidate.getAttribute(name)) }), appElement && (config.strictDi = null !== getNgAttribute(appElement, "strict-di"), bootstrap(appElement, module ? [module] : [], config)) } | |
function bootstrap(element, modules, config) { isObject(config) || (config = {}); | |
var defaultConfig = { strictDi: !1 }; | |
config = extend(defaultConfig, config); | |
var doBootstrap = function() { | |
if (element = jqLite(element), element.injector()) { | |
var tag = element[0] === document ? "document" : startingTag(element); | |
throw ngMinErr("btstrpd", "App Already Bootstrapped with this Element '{0}'", tag.replace(/</, "<").replace(/>/, ">")) } | |
modules = modules || [], modules.unshift(["$provide", function($provide) { $provide.value("$rootElement", element) }]), config.debugInfoEnabled && modules.push(["$compileProvider", function($compileProvider) { $compileProvider.debugInfoEnabled(!0) }]), modules.unshift("ng"); | |
var injector = createInjector(modules, config.strictDi); | |
return injector.invoke(["$rootScope", "$rootElement", "$compile", "$injector", function(scope, element, compile, injector) { scope.$apply(function() { element.data("$injector", injector), compile(element)(scope) }) }]), injector }, | |
NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/, | |
NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; | |
return window && NG_ENABLE_DEBUG_INFO.test(window.name) && (config.debugInfoEnabled = !0, window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, "")), window && !NG_DEFER_BOOTSTRAP.test(window.name) ? doBootstrap() : (window.name = window.name.replace(NG_DEFER_BOOTSTRAP, ""), void(angular.resumeBootstrap = function(extraModules) { forEach(extraModules, function(module) { modules.push(module) }), doBootstrap() })) } | |
function reloadWithDebugInfo() { window.name = "NG_ENABLE_DEBUG_INFO!" + window.name, window.location.reload() } | |
function getTestability(rootElement) { | |
return angular.element(rootElement).injector().get("$$testability") } | |
function snake_case(name, separator) { | |
return separator = separator || "_", name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { | |
return (pos ? separator : "") + letter.toLowerCase() }) } | |
function bindJQuery() { | |
var originalCleanData; | |
bindJQueryFired || (jQuery = window.jQuery, jQuery && jQuery.fn.on ? (jqLite = jQuery, extend(jQuery.fn, { scope: JQLitePrototype.scope, isolateScope: JQLitePrototype.isolateScope, controller: JQLitePrototype.controller, injector: JQLitePrototype.injector, inheritedData: JQLitePrototype.inheritedData }), originalCleanData = jQuery.cleanData, jQuery.cleanData = function(elems) { | |
var events; | |
if (skipDestroyOnNextJQueryCleanData) skipDestroyOnNextJQueryCleanData = !1; | |
else | |
for (var elem, i = 0; null != (elem = elems[i]); i++) events = jQuery._data(elem, "events"), events && events.$destroy && jQuery(elem).triggerHandler("$destroy"); | |
originalCleanData(elems) }) : jqLite = JQLite, angular.element = jqLite, bindJQueryFired = !0) } | |
function assertArg(arg, name, reason) { | |
if (!arg) throw ngMinErr("areq", "Argument '{0}' is {1}", name || "?", reason || "required"); | |
return arg } | |
function assertArgFn(arg, name, acceptArrayAnnotation) { | |
return acceptArrayAnnotation && isArray(arg) && (arg = arg[arg.length - 1]), assertArg(isFunction(arg), name, "not a function, got " + (arg && "object" == typeof arg ? arg.constructor.name || "Object" : typeof arg)), arg } | |
function assertNotHasOwnProperty(name, context) { | |
if ("hasOwnProperty" === name) throw ngMinErr("badname", "hasOwnProperty is not a valid {0} name", context) } | |
function getter(obj, path, bindFnToScope) { | |
if (!path) return obj; | |
for (var key, keys = path.split("."), lastInstance = obj, len = keys.length, i = 0; len > i; i++) key = keys[i], obj && (obj = (lastInstance = obj)[key]); | |
return !bindFnToScope && isFunction(obj) ? bind(lastInstance, obj) : obj } | |
function getBlockNodes(nodes) { | |
var node = nodes[0], | |
endNode = nodes[nodes.length - 1], | |
blockNodes = [node]; | |
do { | |
if (node = node.nextSibling, !node) break; | |
blockNodes.push(node) } while (node !== endNode); | |
return jqLite(blockNodes) } | |
function createMap() { | |
return Object.create(null) } | |
function setupModuleLoader(window) { | |
function ensure(obj, name, factory) { | |
return obj[name] || (obj[name] = factory()) } | |
var $injectorMinErr = minErr("$injector"), | |
ngMinErr = minErr("ng"), | |
angular = ensure(window, "angular", Object); | |
return angular.$$minErr = angular.$$minErr || minErr, ensure(angular, "module", function() { | |
var modules = {}; | |
return function(name, requires, configFn) { | |
var assertNotHasOwnProperty = function(name, context) { | |
if ("hasOwnProperty" === name) throw ngMinErr("badname", "hasOwnProperty is not a valid {0} name", context) }; | |
return assertNotHasOwnProperty(name, "module"), requires && modules.hasOwnProperty(name) && (modules[name] = null), ensure(modules, name, function() { | |
function invokeLater(provider, method, insertMethod, queue) { | |
return queue || (queue = invokeQueue), | |
function() { | |
return queue[insertMethod || "push"]([provider, method, arguments]), moduleInstance } } | |
if (!requires) throw $injectorMinErr("nomod", "Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.", name); | |
var invokeQueue = [], | |
configBlocks = [], | |
runBlocks = [], | |
config = invokeLater("$injector", "invoke", "push", configBlocks), | |
moduleInstance = { _invokeQueue: invokeQueue, _configBlocks: configBlocks, _runBlocks: runBlocks, requires: requires, name: name, provider: invokeLater("$provide", "provider"), factory: invokeLater("$provide", "factory"), service: invokeLater("$provide", "service"), value: invokeLater("$provide", "value"), constant: invokeLater("$provide", "constant", "unshift"), animation: invokeLater("$animateProvider", "register"), filter: invokeLater("$filterProvider", "register"), controller: invokeLater("$controllerProvider", "register"), directive: invokeLater("$compileProvider", "directive"), config: config, run: function(block) { | |
return runBlocks.push(block), this } }; | |
return configFn && config(configFn), moduleInstance }) } }) } | |
function serializeObject(obj) { | |
var seen = []; | |
return JSON.stringify(obj, function(key, val) { | |
if (val = toJsonReplacer(key, val), isObject(val)) { | |
if (seen.indexOf(val) >= 0) return "<<already seen>>"; | |
seen.push(val) } | |
return val }) } | |
function toDebugString(obj) { | |
return "function" == typeof obj ? obj.toString().replace(/ \{[\s\S]*$/, "") : "undefined" == typeof obj ? "undefined" : "string" != typeof obj ? serializeObject(obj) : obj } | |
function publishExternalAPI(angular) { extend(angular, { bootstrap: bootstrap, copy: copy, extend: extend, equals: equals, element: jqLite, forEach: forEach, injector: createInjector, noop: noop, bind: bind, toJson: toJson, fromJson: fromJson, identity: identity, isUndefined: isUndefined, isDefined: isDefined, isString: isString, isFunction: isFunction, isObject: isObject, isNumber: isNumber, isElement: isElement, isArray: isArray, version: version, isDate: isDate, lowercase: lowercase, uppercase: uppercase, callbacks: { counter: 0 }, getTestability: getTestability, $$minErr: minErr, $$csp: csp, reloadWithDebugInfo: reloadWithDebugInfo }), angularModule = setupModuleLoader(window); | |
try { angularModule("ngLocale") } catch (e) { angularModule("ngLocale", []).provider("$locale", $LocaleProvider) } | |
angularModule("ng", ["ngLocale"], ["$provide", function($provide) { $provide.provider({ $$sanitizeUri: $$SanitizeUriProvider }), $provide.provider("$compile", $CompileProvider).directive({ a: htmlAnchorDirective, input: inputDirective, textarea: inputDirective, form: formDirective, script: scriptDirective, select: selectDirective, style: styleDirective, option: optionDirective, ngBind: ngBindDirective, ngBindHtml: ngBindHtmlDirective, ngBindTemplate: ngBindTemplateDirective, ngClass: ngClassDirective, ngClassEven: ngClassEvenDirective, ngClassOdd: ngClassOddDirective, ngCloak: ngCloakDirective, ngController: ngControllerDirective, ngForm: ngFormDirective, ngHide: ngHideDirective, ngIf: ngIfDirective, ngInclude: ngIncludeDirective, ngInit: ngInitDirective, ngNonBindable: ngNonBindableDirective, ngPluralize: ngPluralizeDirective, ngRepeat: ngRepeatDirective, ngShow: ngShowDirective, ngStyle: ngStyleDirective, ngSwitch: ngSwitchDirective, ngSwitchWhen: ngSwitchWhenDirective, ngSwitchDefault: ngSwitchDefaultDirective, ngOptions: ngOptionsDirective, ngTransclude: ngTranscludeDirective, ngModel: ngModelDirective, ngList: ngListDirective, ngChange: ngChangeDirective, pattern: patternDirective, ngPattern: patternDirective, required: requiredDirective, ngRequired: requiredDirective, minlength: minlengthDirective, ngMinlength: minlengthDirective, maxlength: maxlengthDirective, ngMaxlength: maxlengthDirective, ngValue: ngValueDirective, ngModelOptions: ngModelOptionsDirective }).directive({ ngInclude: ngIncludeFillContentDirective }).directive(ngAttributeAliasDirectives).directive(ngEventDirectives), $provide.provider({ $anchorScroll: $AnchorScrollProvider, $animate: $AnimateProvider, $browser: $BrowserProvider, $cacheFactory: $CacheFactoryProvider, $controller: $ControllerProvider, $document: $DocumentProvider, $exceptionHandler: $ExceptionHandlerProvider, $filter: $FilterProvider, $interpolate: $InterpolateProvider, $interval: $IntervalProvider, $http: $HttpProvider, $httpBackend: $HttpBackendProvider, $location: $LocationProvider, $log: $LogProvider, $parse: $ParseProvider, $rootScope: $RootScopeProvider, $q: $QProvider, $$q: $$QProvider, $sce: $SceProvider, $sceDelegate: $SceDelegateProvider, $sniffer: $SnifferProvider, $templateCache: $TemplateCacheProvider, $templateRequest: $TemplateRequestProvider, $$testability: $$TestabilityProvider, $timeout: $TimeoutProvider, $window: $WindowProvider, $$rAF: $$RAFProvider, $$asyncCallback: $$AsyncCallbackProvider }) }]) } | |
function jqNextId() { | |
return ++jqId } | |
function camelCase(name) { | |
return name.replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { | |
return offset ? letter.toUpperCase() : letter }).replace(MOZ_HACK_REGEXP, "Moz$1") } | |
function jqLiteIsTextNode(html) { | |
return !HTML_REGEXP.test(html) } | |
function jqLiteAcceptsData(node) { | |
var nodeType = node.nodeType; | |
return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT } | |
function jqLiteBuildFragment(html, context) { | |
var tmp, tag, wrap, i, fragment = context.createDocumentFragment(), | |
nodes = []; | |
if (jqLiteIsTextNode(html)) nodes.push(context.createTextNode(html)); | |
else { | |
for (tmp = tmp || fragment.appendChild(context.createElement("div")), tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(), wrap = wrapMap[tag] || wrapMap._default, tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1></$2>") + wrap[2], i = wrap[0]; i--;) tmp = tmp.lastChild; | |
nodes = concat(nodes, tmp.childNodes), tmp = fragment.firstChild, tmp.textContent = "" } | |
return fragment.textContent = "", fragment.innerHTML = "", forEach(nodes, function(node) { fragment.appendChild(node) }), fragment } | |
function jqLiteParseHTML(html, context) { context = context || document; | |
var parsed; | |
return (parsed = SINGLE_TAG_REGEXP.exec(html)) ? [context.createElement(parsed[1])] : (parsed = jqLiteBuildFragment(html, context)) ? parsed.childNodes : [] } | |
function JQLite(element) { | |
if (element instanceof JQLite) return element; | |
var argIsString; | |
if (isString(element) && (element = trim(element), argIsString = !0), !(this instanceof JQLite)) { | |
if (argIsString && "<" != element.charAt(0)) throw jqLiteMinErr("nosel", "Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element"); | |
return new JQLite(element) } | |
argIsString ? jqLiteAddNodes(this, jqLiteParseHTML(element)) : jqLiteAddNodes(this, element) } | |
function jqLiteClone(element) { | |
return element.cloneNode(!0) } | |
function jqLiteDealoc(element, onlyDescendants) { | |
if (onlyDescendants || jqLiteRemoveData(element), element.querySelectorAll) | |
for (var descendants = element.querySelectorAll("*"), i = 0, l = descendants.length; l > i; i++) jqLiteRemoveData(descendants[i]) } | |
function jqLiteOff(element, type, fn, unsupported) { | |
if (isDefined(unsupported)) throw jqLiteMinErr("offargs", "jqLite#off() does not support the `selector` argument"); | |
var expandoStore = jqLiteExpandoStore(element), | |
events = expandoStore && expandoStore.events, | |
handle = expandoStore && expandoStore.handle; | |
if (handle) | |
if (type) forEach(type.split(" "), function(type) { | |
if (isDefined(fn)) { | |
var listenerFns = events[type]; | |
if (arrayRemove(listenerFns || [], fn), listenerFns && listenerFns.length > 0) return } | |
removeEventListenerFn(element, type, handle), delete events[type] }); | |
else | |
for (type in events) "$destroy" !== type && removeEventListenerFn(element, type, handle), delete events[type] } | |
function jqLiteRemoveData(element, name) { | |
var expandoId = element.ng339, | |
expandoStore = expandoId && jqCache[expandoId]; | |
if (expandoStore) { | |
if (name) return void delete expandoStore.data[name]; | |
expandoStore.handle && (expandoStore.events.$destroy && expandoStore.handle({}, "$destroy"), jqLiteOff(element)), delete jqCache[expandoId], element.ng339 = undefined } } | |
function jqLiteExpandoStore(element, createIfNecessary) { | |
var expandoId = element.ng339, | |
expandoStore = expandoId && jqCache[expandoId]; | |
return createIfNecessary && !expandoStore && (element.ng339 = expandoId = jqNextId(), expandoStore = jqCache[expandoId] = { events: {}, data: {}, handle: undefined }), expandoStore } | |
function jqLiteData(element, key, value) { | |
if (jqLiteAcceptsData(element)) { | |
var isSimpleSetter = isDefined(value), | |
isSimpleGetter = !isSimpleSetter && key && !isObject(key), | |
massGetter = !key, | |
expandoStore = jqLiteExpandoStore(element, !isSimpleGetter), | |
data = expandoStore && expandoStore.data; | |
if (isSimpleSetter) data[key] = value; | |
else { | |
if (massGetter) return data; | |
if (isSimpleGetter) return data && data[key]; | |
extend(data, key) } } } | |
function jqLiteHasClass(element, selector) { | |
return element.getAttribute ? (" " + (element.getAttribute("class") || "") + " ").replace(/[\n\t]/g, " ").indexOf(" " + selector + " ") > -1 : !1 } | |
function jqLiteRemoveClass(element, cssClasses) { cssClasses && element.setAttribute && forEach(cssClasses.split(" "), function(cssClass) { element.setAttribute("class", trim((" " + (element.getAttribute("class") || "") + " ").replace(/[\n\t]/g, " ").replace(" " + trim(cssClass) + " ", " "))) }) } | |
function jqLiteAddClass(element, cssClasses) { | |
if (cssClasses && element.setAttribute) { | |
var existingClasses = (" " + (element.getAttribute("class") || "") + " ").replace(/[\n\t]/g, " "); | |
forEach(cssClasses.split(" "), function(cssClass) { cssClass = trim(cssClass), -1 === existingClasses.indexOf(" " + cssClass + " ") && (existingClasses += cssClass + " ") }), element.setAttribute("class", trim(existingClasses)) } } | |
function jqLiteAddNodes(root, elements) { | |
if (elements) | |
if (elements.nodeType) root[root.length++] = elements; | |
else { | |
var length = elements.length; | |
if ("number" == typeof length && elements.window !== elements) { | |
if (length) | |
for (var i = 0; length > i; i++) root[root.length++] = elements[i] } else root[root.length++] = elements } } | |
function jqLiteController(element, name) { | |
return jqLiteInheritedData(element, "$" + (name || "ngController") + "Controller") } | |
function jqLiteInheritedData(element, name, value) { element.nodeType == NODE_TYPE_DOCUMENT && (element = element.documentElement); | |
for (var names = isArray(name) ? name : [name]; element;) { | |
for (var i = 0, ii = names.length; ii > i; i++) | |
if ((value = jqLite.data(element, names[i])) !== undefined) return value; | |
element = element.parentNode || element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host } } | |
function jqLiteEmpty(element) { | |
for (jqLiteDealoc(element, !0); element.firstChild;) element.removeChild(element.firstChild) } | |
function jqLiteRemove(element, keepData) { keepData || jqLiteDealoc(element); | |
var parent = element.parentNode; | |
parent && parent.removeChild(element) } | |
function jqLiteDocumentLoaded(action, win) { win = win || window, "complete" === win.document.readyState ? win.setTimeout(action) : jqLite(win).on("load", action) } | |
function getBooleanAttrName(element, name) { | |
var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; | |
return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr } | |
function getAliasedAttrName(element, name) { | |
var nodeName = element.nodeName; | |
return ("INPUT" === nodeName || "TEXTAREA" === nodeName) && ALIASED_ATTR[name] } | |
function createEventHandler(element, events) { | |
var eventHandler = function(event, type) { event.isDefaultPrevented = function() { | |
return event.defaultPrevented }; | |
var eventFns = events[type || event.type], | |
eventFnsLength = eventFns ? eventFns.length : 0; | |
if (eventFnsLength) { | |
if (isUndefined(event.immediatePropagationStopped)) { | |
var originalStopImmediatePropagation = event.stopImmediatePropagation; | |
event.stopImmediatePropagation = function() { event.immediatePropagationStopped = !0, event.stopPropagation && event.stopPropagation(), originalStopImmediatePropagation && originalStopImmediatePropagation.call(event) } } | |
event.isImmediatePropagationStopped = function() { | |
return event.immediatePropagationStopped === !0 }, eventFnsLength > 1 && (eventFns = shallowCopy(eventFns)); | |
for (var i = 0; eventFnsLength > i; i++) event.isImmediatePropagationStopped() || eventFns[i].call(element, event) } }; | |
return eventHandler.elem = element, eventHandler } | |
function hashKey(obj, nextUidFn) { | |
var key = obj && obj.$$hashKey; | |
if (key) return "function" == typeof key && (key = obj.$$hashKey()), key; | |
var objType = typeof obj; | |
return key = "function" == objType || "object" == objType && null !== obj ? obj.$$hashKey = objType + ":" + (nextUidFn || nextUid)() : objType + ":" + obj } | |
function HashMap(array, isolatedUid) { | |
if (isolatedUid) { | |
var uid = 0; | |
this.nextUid = function() { | |
return ++uid } } | |
forEach(array, this.put, this) } | |
function anonFn(fn) { | |
var fnText = fn.toString().replace(STRIP_COMMENTS, ""), | |
args = fnText.match(FN_ARGS); | |
return args ? "function(" + (args[1] || "").replace(/[\s\r\n]+/, " ") + ")" : "fn" } | |
function annotate(fn, strictDi, name) { | |
var $inject, fnText, argDecl, last; | |
if ("function" == typeof fn) { | |
if (!($inject = fn.$inject)) { | |
if ($inject = [], fn.length) { | |
if (strictDi) throw isString(name) && name || (name = fn.name || anonFn(fn)), $injectorMinErr("strictdi", "{0} is not using explicit annotation and cannot be invoked in strict mode", name); | |
fnText = fn.toString().replace(STRIP_COMMENTS, ""), argDecl = fnText.match(FN_ARGS), forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) { arg.replace(FN_ARG, function(all, underscore, name) { $inject.push(name) }) }) } | |
fn.$inject = $inject } } else isArray(fn) ? (last = fn.length - 1, assertArgFn(fn[last], "fn"), $inject = fn.slice(0, last)) : assertArgFn(fn, "fn", !0); | |
return $inject } | |
function createInjector(modulesToLoad, strictDi) { | |
function supportObject(delegate) { | |
return function(key, value) { | |
return isObject(key) ? void forEach(key, reverseParams(delegate)) : delegate(key, value) } } | |
function provider(name, provider_) { | |
if (assertNotHasOwnProperty(name, "service"), (isFunction(provider_) || isArray(provider_)) && (provider_ = providerInjector.instantiate(provider_)), !provider_.$get) throw $injectorMinErr("pget", "Provider '{0}' must define $get factory method.", name); | |
return providerCache[name + providerSuffix] = provider_ } | |
function enforceReturnValue(name, factory) { | |
return function() { | |
var result = instanceInjector.invoke(factory, this, undefined, name); | |
if (isUndefined(result)) throw $injectorMinErr("undef", "Provider '{0}' must return a value from $get factory method.", name); | |
return result } } | |
function factory(name, factoryFn, enforce) { | |
return provider(name, { $get: enforce !== !1 ? enforceReturnValue(name, factoryFn) : factoryFn }) } | |
function service(name, constructor) { | |
return factory(name, ["$injector", function($injector) { | |
return $injector.instantiate(constructor) }]) } | |
function value(name, val) { | |
return factory(name, valueFn(val), !1) } | |
function constant(name, value) { assertNotHasOwnProperty(name, "constant"), providerCache[name] = value, instanceCache[name] = value } | |
function decorator(serviceName, decorFn) { | |
var origProvider = providerInjector.get(serviceName + providerSuffix), | |
orig$get = origProvider.$get; | |
origProvider.$get = function() { | |
var origInstance = instanceInjector.invoke(orig$get, origProvider); | |
return instanceInjector.invoke(decorFn, null, { $delegate: origInstance }) } } | |
function loadModules(modulesToLoad) { | |
var moduleFn, runBlocks = []; | |
return forEach(modulesToLoad, function(module) { | |
function runInvokeQueue(queue) { | |
var i, ii; | |
for (i = 0, ii = queue.length; ii > i; i++) { | |
var invokeArgs = queue[i], | |
provider = providerInjector.get(invokeArgs[0]); | |
provider[invokeArgs[1]].apply(provider, invokeArgs[2]) } } | |
if (!loadedModules.get(module)) { loadedModules.put(module, !0); | |
try { isString(module) ? (moduleFn = angularModule(module), runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks), runInvokeQueue(moduleFn._invokeQueue), runInvokeQueue(moduleFn._configBlocks)) : isFunction(module) ? runBlocks.push(providerInjector.invoke(module)) : isArray(module) ? runBlocks.push(providerInjector.invoke(module)) : assertArgFn(module, "module") } catch (e) { | |
throw isArray(module) && (module = module[module.length - 1]), e.message && e.stack && -1 == e.stack.indexOf(e.message) && (e = e.message + "\n" + e.stack), $injectorMinErr("modulerr", "Failed to instantiate module {0} due to:\n{1}", module, e.stack || e.message || e) } } }), runBlocks } | |
function createInternalInjector(cache, factory) { | |
function getService(serviceName) { | |
if (cache.hasOwnProperty(serviceName)) { | |
if (cache[serviceName] === INSTANTIATING) throw $injectorMinErr("cdep", "Circular dependency found: {0}", serviceName + " <- " + path.join(" <- ")); | |
return cache[serviceName] } | |
try { | |
return path.unshift(serviceName), cache[serviceName] = INSTANTIATING, cache[serviceName] = factory(serviceName) } catch (err) { | |
throw cache[serviceName] === INSTANTIATING && delete cache[serviceName], err } finally { path.shift() } } | |
function invoke(fn, self, locals, serviceName) { "string" == typeof locals && (serviceName = locals, locals = null); | |
var length, i, key, args = [], | |
$inject = annotate(fn, strictDi, serviceName); | |
for (i = 0, length = $inject.length; length > i; i++) { | |
if (key = $inject[i], "string" != typeof key) throw $injectorMinErr("itkn", "Incorrect injection token! Expected service name as string, got {0}", key); | |
args.push(locals && locals.hasOwnProperty(key) ? locals[key] : getService(key)) } | |
return isArray(fn) && (fn = fn[length]), fn.apply(self, args) } | |
function instantiate(Type, locals, serviceName) { | |
var instance = Object.create((isArray(Type) ? Type[Type.length - 1] : Type).prototype), | |
returnedValue = invoke(Type, instance, locals, serviceName); | |
return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance } | |
return { invoke: invoke, instantiate: instantiate, get: getService, annotate: annotate, has: function(name) { | |
return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name) } } } | |
strictDi = strictDi === !0; | |
var INSTANTIATING = {}, | |
providerSuffix = "Provider", | |
path = [], | |
loadedModules = new HashMap([], !0), | |
providerCache = { $provide: { provider: supportObject(provider), factory: supportObject(factory), service: supportObject(service), value: supportObject(value), constant: supportObject(constant), decorator: decorator } }, | |
providerInjector = providerCache.$injector = createInternalInjector(providerCache, function() { | |
throw $injectorMinErr("unpr", "Unknown provider: {0}", path.join(" <- ")) }), | |
instanceCache = {}, | |
instanceInjector = instanceCache.$injector = createInternalInjector(instanceCache, function(servicename) { | |
var provider = providerInjector.get(servicename + providerSuffix); | |
return instanceInjector.invoke(provider.$get, provider, undefined, servicename) }); | |
return forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop) }), instanceInjector } | |
function $AnchorScrollProvider() { | |
var autoScrollingEnabled = !0; | |
this.disableAutoScrolling = function() { autoScrollingEnabled = !1 }, this.$get = ["$window", "$location", "$rootScope", function($window, $location, $rootScope) { | |
function getFirstAnchor(list) { | |
var result = null; | |
return Array.prototype.some.call(list, function(element) { | |
return "a" === nodeName_(element) ? (result = element, !0) : void 0 }), result } | |
function getYOffset() { | |
var offset = scroll.yOffset; | |
if (isFunction(offset)) offset = offset(); | |
else if (isElement(offset)) { | |
var elem = offset[0], | |
style = $window.getComputedStyle(elem); | |
offset = "fixed" !== style.position ? 0 : elem.getBoundingClientRect().bottom } else isNumber(offset) || (offset = 0); | |
return offset } | |
function scrollTo(elem) { | |
if (elem) { | |
elem.scrollIntoView(); | |
var offset = getYOffset(); | |
if (offset) { | |
var elemTop = elem.getBoundingClientRect().top; | |
$window.scrollBy(0, elemTop - offset) | |
} | |
} else $window.scrollTo(0, 0) | |
} | |
function scroll() { | |
var elm, hash = $location.hash(); | |
hash ? (elm = document.getElementById(hash)) ? scrollTo(elm) : (elm = getFirstAnchor(document.getElementsByName(hash))) ? scrollTo(elm) : "top" === hash && scrollTo(null) : scrollTo(null) } | |
var document = $window.document; | |
return autoScrollingEnabled && $rootScope.$watch(function() { | |
return $location.hash() }, function(newVal, oldVal) { | |
(newVal !== oldVal || "" !== newVal) && jqLiteDocumentLoaded(function() { $rootScope.$evalAsync(scroll) }) }), scroll | |
}] | |
} | |
function $$AsyncCallbackProvider() { this.$get = ["$$rAF", "$timeout", function($$rAF, $timeout) { | |
return $$rAF.supported ? function(fn) { | |
return $$rAF(fn) } : function(fn) { | |
return $timeout(fn, 0, !1) } }] } | |
function Browser(window, document, $log, $sniffer) { | |
function completeOutstandingRequest(fn) { | |
try { fn.apply(null, sliceArgs(arguments, 1)) } finally { | |
if (outstandingRequestCount--, 0 === outstandingRequestCount) | |
for (; outstandingRequestCallbacks.length;) try { outstandingRequestCallbacks.pop()() } catch (e) { $log.error(e) } } } | |
function startPoller(interval, setTimeout) {! function check() { forEach(pollFns, function(pollFn) { pollFn() }), pollTimeout = setTimeout(check, interval) }() } | |
function cacheStateAndFireUrlChange() { cacheState(), fireUrlChange() } | |
function cacheState() { cachedState = window.history.state, cachedState = isUndefined(cachedState) ? null : cachedState, equals(cachedState, lastCachedState) && (cachedState = lastCachedState), lastCachedState = cachedState } | |
function fireUrlChange() { | |
(lastBrowserUrl !== self.url() || lastHistoryState !== cachedState) && (lastBrowserUrl = self.url(), lastHistoryState = cachedState, forEach(urlChangeListeners, function(listener) { listener(self.url(), cachedState) })) } | |
function safeDecodeURIComponent(str) { | |
try { | |
return decodeURIComponent(str) } catch (e) { | |
return str } } | |
var self = this, | |
rawDocument = document[0], | |
location = window.location, | |
history = window.history, | |
setTimeout = window.setTimeout, | |
clearTimeout = window.clearTimeout, | |
pendingDeferIds = {}; | |
self.isMock = !1; | |
var outstandingRequestCount = 0, | |
outstandingRequestCallbacks = []; | |
self.$$completeOutstandingRequest = completeOutstandingRequest, self.$$incOutstandingRequestCount = function() { outstandingRequestCount++ }, self.notifyWhenNoOutstandingRequests = function(callback) { forEach(pollFns, function(pollFn) { pollFn() }), 0 === outstandingRequestCount ? callback() : outstandingRequestCallbacks.push(callback) }; | |
var pollTimeout, pollFns = []; | |
self.addPollFn = function(fn) { | |
return isUndefined(pollTimeout) && startPoller(100, setTimeout), pollFns.push(fn), fn }; | |
var cachedState, lastHistoryState, lastBrowserUrl = location.href, | |
baseElement = document.find("base"), | |
reloadLocation = null; | |
cacheState(), lastHistoryState = cachedState, self.url = function(url, replace, state) { | |
if (isUndefined(state) && (state = null), location !== window.location && (location = window.location), history !== window.history && (history = window.history), url) { | |
var sameState = lastHistoryState === state; | |
if (lastBrowserUrl === url && (!$sniffer.history || sameState)) return self; | |
var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url); | |
return lastBrowserUrl = url, lastHistoryState = state, !$sniffer.history || sameBase && sameState ? (sameBase || (reloadLocation = url), replace ? location.replace(url) : location.href = url) : (history[replace ? "replaceState" : "pushState"](state, "", url), cacheState(), lastHistoryState = cachedState), self } | |
return reloadLocation || location.href.replace(/%27/g, "'") }, self.state = function() { | |
return cachedState }; | |
var urlChangeListeners = [], | |
urlChangeInit = !1, | |
lastCachedState = null; | |
self.onUrlChange = function(callback) { | |
return urlChangeInit || ($sniffer.history && jqLite(window).on("popstate", cacheStateAndFireUrlChange), jqLite(window).on("hashchange", cacheStateAndFireUrlChange), urlChangeInit = !0), urlChangeListeners.push(callback), callback }, self.$$checkUrlChange = fireUrlChange, self.baseHref = function() { | |
var href = baseElement.attr("href"); | |
return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, "") : "" }; | |
var lastCookies = {}, | |
lastCookieString = "", | |
cookiePath = self.baseHref(); | |
self.cookies = function(name, value) { | |
var cookieLength, cookieArray, cookie, i, index; | |
if (!name) { | |
if (rawDocument.cookie !== lastCookieString) | |
for (lastCookieString = rawDocument.cookie, cookieArray = lastCookieString.split("; "), lastCookies = {}, i = 0; i < cookieArray.length; i++) cookie = cookieArray[i], index = cookie.indexOf("="), index > 0 && (name = safeDecodeURIComponent(cookie.substring(0, index)), lastCookies[name] === undefined && (lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1)))); | |
return lastCookies } | |
value === undefined ? rawDocument.cookie = encodeURIComponent(name) + "=;path=" + cookiePath + ";expires=Thu, 01 Jan 1970 00:00:00 GMT" : isString(value) && (cookieLength = (rawDocument.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value) + ";path=" + cookiePath).length + 1, cookieLength > 4096 && $log.warn("Cookie '" + name + "' possibly not set or overflowed because it was too large (" + cookieLength + " > 4096 bytes)!")) }, self.defer = function(fn, delay) { | |
var timeoutId; | |
return outstandingRequestCount++, timeoutId = setTimeout(function() { delete pendingDeferIds[timeoutId], completeOutstandingRequest(fn) }, delay || 0), pendingDeferIds[timeoutId] = !0, timeoutId }, self.defer.cancel = function(deferId) { | |
return pendingDeferIds[deferId] ? (delete pendingDeferIds[deferId], clearTimeout(deferId), completeOutstandingRequest(noop), !0) : !1 } } | |
function $BrowserProvider() { this.$get = ["$window", "$log", "$sniffer", "$document", function($window, $log, $sniffer, $document) { | |
return new Browser($window, $document, $log, $sniffer) }] } | |
function $CacheFactoryProvider() { this.$get = function() { | |
function cacheFactory(cacheId, options) { | |
function refresh(entry) { entry != freshEnd && (staleEnd ? staleEnd == entry && (staleEnd = entry.n) : staleEnd = entry, link(entry.n, entry.p), link(entry, freshEnd), freshEnd = entry, freshEnd.n = null) } | |
function link(nextEntry, prevEntry) { nextEntry != prevEntry && (nextEntry && (nextEntry.p = prevEntry), prevEntry && (prevEntry.n = nextEntry)) } | |
if (cacheId in caches) throw minErr("$cacheFactory")("iid", "CacheId '{0}' is already taken!", cacheId); | |
var size = 0, | |
stats = extend({}, options, { id: cacheId }), | |
data = {}, | |
capacity = options && options.capacity || Number.MAX_VALUE, | |
lruHash = {}, | |
freshEnd = null, | |
staleEnd = null; | |
return caches[cacheId] = { put: function(key, value) { | |
if (capacity < Number.MAX_VALUE) { | |
var lruEntry = lruHash[key] || (lruHash[key] = { key: key }); | |
refresh(lruEntry) } | |
if (!isUndefined(value)) return key in data || size++, data[key] = value, size > capacity && this.remove(staleEnd.key), value }, get: function(key) { | |
if (capacity < Number.MAX_VALUE) { | |
var lruEntry = lruHash[key]; | |
if (!lruEntry) return; | |
refresh(lruEntry) } | |
return data[key] }, remove: function(key) { | |
if (capacity < Number.MAX_VALUE) { | |
var lruEntry = lruHash[key]; | |
if (!lruEntry) return; | |
lruEntry == freshEnd && (freshEnd = lruEntry.p), lruEntry == staleEnd && (staleEnd = lruEntry.n), link(lruEntry.n, lruEntry.p), delete lruHash[key] } | |
delete data[key], size-- }, removeAll: function() { data = {}, size = 0, lruHash = {}, freshEnd = staleEnd = null }, destroy: function() { data = null, stats = null, lruHash = null, delete caches[cacheId] }, info: function() { | |
return extend({}, stats, { size: size }) } } } | |
var caches = {}; | |
return cacheFactory.info = function() { | |
var info = {}; | |
return forEach(caches, function(cache, cacheId) { info[cacheId] = cache.info() }), info }, cacheFactory.get = function(cacheId) { | |
return caches[cacheId] }, cacheFactory } } | |
function $TemplateCacheProvider() { this.$get = ["$cacheFactory", function($cacheFactory) { | |
return $cacheFactory("templates") }] } | |
function $CompileProvider($provide, $$sanitizeUriProvider) { | |
function parseIsolateBindings(scope, directiveName) { | |
var LOCAL_REGEXP = /^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*$/, | |
bindings = {}; | |
return forEach(scope, function(definition, scopeName) { | |
var match = definition.match(LOCAL_REGEXP); | |
if (!match) throw $compileMinErr("iscp", "Invalid isolate scope definition for directive '{0}'. Definition: {... {1}: '{2}' ...}", directiveName, scopeName, definition); | |
bindings[scopeName] = { mode: match[1][0], collection: "*" === match[2], optional: "?" === match[3], attrName: match[4] || scopeName } }), bindings } | |
var hasDirectives = {}, | |
Suffix = "Directive", | |
COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\w\-]+)\s+(.*)$/, | |
CLASS_DIRECTIVE_REGEXP = /(([\w\-]+)(?:\:([^;]+))?;?)/, | |
ALL_OR_NOTHING_ATTRS = makeMap("ngSrc,ngSrcset,src,srcset"), | |
REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/, | |
EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/; | |
this.directive = function registerDirective(name, directiveFactory) { | |
return assertNotHasOwnProperty(name, "directive"), isString(name) ? (assertArg(directiveFactory, "directiveFactory"), hasDirectives.hasOwnProperty(name) || (hasDirectives[name] = [], $provide.factory(name + Suffix, ["$injector", "$exceptionHandler", function($injector, $exceptionHandler) { | |
var directives = []; | |
return forEach(hasDirectives[name], function(directiveFactory, index) { | |
try { | |
var directive = $injector.invoke(directiveFactory); | |
isFunction(directive) ? directive = { compile: valueFn(directive) } : !directive.compile && directive.link && (directive.compile = valueFn(directive.link)), directive.priority = directive.priority || 0, directive.index = index, directive.name = directive.name || name, directive.require = directive.require || directive.controller && directive.name, directive.restrict = directive.restrict || "EA", isObject(directive.scope) && (directive.$$isolateBindings = parseIsolateBindings(directive.scope, directive.name)), directives.push(directive) } catch (e) { $exceptionHandler(e) } }), directives }])), hasDirectives[name].push(directiveFactory)) : forEach(name, reverseParams(registerDirective)), this }, this.aHrefSanitizationWhitelist = function(regexp) { | |
return isDefined(regexp) ? ($$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp), this) : $$sanitizeUriProvider.aHrefSanitizationWhitelist() }, this.imgSrcSanitizationWhitelist = function(regexp) { | |
return isDefined(regexp) ? ($$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp), this) : $$sanitizeUriProvider.imgSrcSanitizationWhitelist() }; | |
var debugInfoEnabled = !0; | |
this.debugInfoEnabled = function(enabled) { | |
return isDefined(enabled) ? (debugInfoEnabled = enabled, this) : debugInfoEnabled }, this.$get = ["$injector", "$interpolate", "$exceptionHandler", "$templateRequest", "$parse", "$controller", "$rootScope", "$document", "$sce", "$animate", "$$sanitizeUri", function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse, $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri) { | |
function safeAddClass($element, className) { | |
try { $element.addClass(className) } catch (e) {} } | |
function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext) { $compileNodes instanceof jqLite || ($compileNodes = jqLite($compileNodes)), forEach($compileNodes, function(node, index) { node.nodeType == NODE_TYPE_TEXT && node.nodeValue.match(/\S+/) && ($compileNodes[index] = jqLite(node).wrap("<span></span>").parent()[0]) }); | |
var compositeLinkFn = compileNodes($compileNodes, transcludeFn, $compileNodes, maxPriority, ignoreDirective, previousCompileContext); | |
compile.$$addScopeClass($compileNodes); | |
var namespace = null; | |
return function(scope, cloneConnectFn, options) { assertArg(scope, "scope"), options = options || {}; | |
var parentBoundTranscludeFn = options.parentBoundTranscludeFn, | |
transcludeControllers = options.transcludeControllers, | |
futureParentElement = options.futureParentElement; | |
parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude && (parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude), namespace || (namespace = detectNamespaceForChildElements(futureParentElement)); | |
var $linkNode; | |
if ($linkNode = "html" !== namespace ? jqLite(wrapTemplate(namespace, jqLite("<div>").append($compileNodes).html())) : cloneConnectFn ? JQLitePrototype.clone.call($compileNodes) : $compileNodes, transcludeControllers) | |
for (var controllerName in transcludeControllers) $linkNode.data("$" + controllerName + "Controller", transcludeControllers[controllerName].instance); | |
return compile.$$addScopeInfo($linkNode, scope), cloneConnectFn && cloneConnectFn($linkNode, scope), compositeLinkFn && compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn), $linkNode } } | |
function detectNamespaceForChildElements(parentElement) { | |
var node = parentElement && parentElement[0]; | |
return node && "foreignobject" !== nodeName_(node) && node.toString().match(/SVG/) ? "svg" : "html" } | |
function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective, previousCompileContext) { | |
function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) { | |
var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn, stableNodeList; | |
if (nodeLinkFnFound) { | |
var nodeListLength = nodeList.length; | |
for (stableNodeList = new Array(nodeListLength), i = 0; i < linkFns.length; i += 3) idx = linkFns[i], stableNodeList[idx] = nodeList[idx] } else stableNodeList = nodeList; | |
for (i = 0, ii = linkFns.length; ii > i;) node = stableNodeList[linkFns[i++]], nodeLinkFn = linkFns[i++], childLinkFn = linkFns[i++], nodeLinkFn ? (nodeLinkFn.scope ? (childScope = scope.$new(), compile.$$addScopeInfo(jqLite(node), childScope)) : childScope = scope, childBoundTranscludeFn = nodeLinkFn.transcludeOnThisElement ? createBoundTranscludeFn(scope, nodeLinkFn.transclude, parentBoundTranscludeFn, nodeLinkFn.elementTranscludeOnThisElement) : !nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn ? parentBoundTranscludeFn : !parentBoundTranscludeFn && transcludeFn ? createBoundTranscludeFn(scope, transcludeFn) : null, nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn)) : childLinkFn && childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn) } | |
for (var attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound, linkFns = [], i = 0; i < nodeList.length; i++) attrs = new Attributes, directives = collectDirectives(nodeList[i], [], attrs, 0 === i ? maxPriority : undefined, ignoreDirective), nodeLinkFn = directives.length ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement, null, [], [], previousCompileContext) : null, nodeLinkFn && nodeLinkFn.scope && compile.$$addScopeClass(attrs.$$element), childLinkFn = nodeLinkFn && nodeLinkFn.terminal || !(childNodes = nodeList[i].childNodes) || !childNodes.length ? null : compileNodes(childNodes, nodeLinkFn ? (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement) && nodeLinkFn.transclude : transcludeFn), (nodeLinkFn || childLinkFn) && (linkFns.push(i, nodeLinkFn, childLinkFn), linkFnFound = !0, nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn), previousCompileContext = null; | |
return linkFnFound ? compositeLinkFn : null } | |
function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) { | |
var boundTranscludeFn = function(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) { | |
return transcludedScope || (transcludedScope = scope.$new(!1, containingScope), transcludedScope.$$transcluded = !0), transcludeFn(transcludedScope, cloneFn, { parentBoundTranscludeFn: previousBoundTranscludeFn, transcludeControllers: controllers, futureParentElement: futureParentElement }) }; | |
return boundTranscludeFn } | |
function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) { | |
var match, className, nodeType = node.nodeType, | |
attrsMap = attrs.$attr; | |
switch (nodeType) { | |
case NODE_TYPE_ELEMENT: | |
addDirective(directives, directiveNormalize(nodeName_(node)), "E", maxPriority, ignoreDirective); | |
for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes, j = 0, jj = nAttrs && nAttrs.length; jj > j; j++) { | |
var attrStartName = !1, | |
attrEndName = !1; | |
attr = nAttrs[j], name = attr.name, value = trim(attr.value), ngAttrName = directiveNormalize(name), (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) && (name = snake_case(ngAttrName.substr(6), "-")); | |
var directiveNName = ngAttrName.replace(/(Start|End)$/, ""); | |
directiveIsMultiElement(directiveNName) && ngAttrName === directiveNName + "Start" && (attrStartName = name, attrEndName = name.substr(0, name.length - 5) + "end", name = name.substr(0, name.length - 6)), nName = directiveNormalize(name.toLowerCase()), attrsMap[nName] = name, (isNgAttr || !attrs.hasOwnProperty(nName)) && (attrs[nName] = value, getBooleanAttrName(node, nName) && (attrs[nName] = !0)), addAttrInterpolateDirective(node, directives, value, nName, isNgAttr), addDirective(directives, nName, "A", maxPriority, ignoreDirective, attrStartName, attrEndName) } | |
if (className = node.className, isString(className) && "" !== className) | |
for (; match = CLASS_DIRECTIVE_REGEXP.exec(className);) nName = directiveNormalize(match[2]), addDirective(directives, nName, "C", maxPriority, ignoreDirective) && (attrs[nName] = trim(match[3])), className = className.substr(match.index + match[0].length); | |
break; | |
case NODE_TYPE_TEXT: | |
addTextInterpolateDirective(directives, node.nodeValue); | |
break; | |
case NODE_TYPE_COMMENT: | |
try { match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue), match && (nName = directiveNormalize(match[1]), addDirective(directives, nName, "M", maxPriority, ignoreDirective) && (attrs[nName] = trim(match[2]))) } catch (e) {} } | |
return directives.sort(byPriority), directives } | |
function groupScan(node, attrStart, attrEnd) { | |
var nodes = [], | |
depth = 0; | |
if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) { do { | |
if (!node) throw $compileMinErr("uterdir", "Unterminated attribute, found '{0}' but no matching '{1}' found.", attrStart, attrEnd); | |
node.nodeType == NODE_TYPE_ELEMENT && (node.hasAttribute(attrStart) && depth++, node.hasAttribute(attrEnd) && depth--), nodes.push(node), node = node.nextSibling } while (depth > 0) } else nodes.push(node); | |
return jqLite(nodes) } | |
function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) { | |
return function(scope, element, attrs, controllers, transcludeFn) { | |
return element = groupScan(element[0], attrStart, attrEnd), linkFn(scope, element, attrs, controllers, transcludeFn) } } | |
function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, previousCompileContext) { | |
function addLinkFns(pre, post, attrStart, attrEnd) { pre && (attrStart && (pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd)), pre.require = directive.require, pre.directiveName = directiveName, (newIsolateScopeDirective === directive || directive.$$isolateScope) && (pre = cloneAndAnnotateFn(pre, { isolateScope: !0 })), preLinkFns.push(pre)), post && (attrStart && (post = groupElementsLinkFnWrapper(post, attrStart, attrEnd)), post.require = directive.require, post.directiveName = directiveName, (newIsolateScopeDirective === directive || directive.$$isolateScope) && (post = cloneAndAnnotateFn(post, { isolateScope: !0 })), postLinkFns.push(post)) } | |
function getControllers(directiveName, require, $element, elementControllers) { | |
var value, match, retrievalMethod = "data", | |
optional = !1, | |
$searchElement = $element; | |
if (isString(require)) { | |
if (match = require.match(REQUIRE_PREFIX_REGEXP), require = require.substring(match[0].length), match[3] && (match[1] ? match[3] = null : match[1] = match[3]), "^" === match[1] ? retrievalMethod = "inheritedData" : "^^" === match[1] && (retrievalMethod = "inheritedData", $searchElement = $element.parent()), "?" === match[2] && (optional = !0), value = null, elementControllers && "data" === retrievalMethod && (value = elementControllers[require]) && (value = value.instance), value = value || $searchElement[retrievalMethod]("$" + require + "Controller"), !value && !optional) throw $compileMinErr("ctreq", "Controller '{0}', required by directive '{1}', can't be found!", require, directiveName); | |
return value || null } | |
return isArray(require) && (value = [], forEach(require, function(require) { value.push(getControllers(directiveName, require, $element, elementControllers)) })), value } | |
function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) { | |
function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement) { | |
var transcludeControllers; | |
return isScope(scope) || (futureParentElement = cloneAttachFn, cloneAttachFn = scope, scope = undefined), hasElementTranscludeDirective && (transcludeControllers = elementControllers), futureParentElement || (futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element), boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild) } | |
var i, ii, linkFn, controller, isolateScope, elementControllers, transcludeFn, $element, attrs; | |
if (compileNode === linkNode ? (attrs = templateAttrs, $element = templateAttrs.$$element) : ($element = jqLite(linkNode), attrs = new Attributes($element, templateAttrs)), newIsolateScopeDirective && (isolateScope = scope.$new(!0)), boundTranscludeFn && (transcludeFn = controllersBoundTransclude, transcludeFn.$$boundTransclude = boundTranscludeFn), controllerDirectives && (controllers = {}, elementControllers = {}, forEach(controllerDirectives, function(directive) { | |
var controllerInstance, locals = { $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope, $element: $element, $attrs: attrs, $transclude: transcludeFn }; | |
controller = directive.controller, "@" == controller && (controller = attrs[directive.name]), controllerInstance = $controller(controller, locals, !0, directive.controllerAs), elementControllers[directive.name] = controllerInstance, hasElementTranscludeDirective || $element.data("$" + directive.name + "Controller", controllerInstance.instance), controllers[directive.name] = controllerInstance })), newIsolateScopeDirective) { compile.$$addScopeInfo($element, isolateScope, !0, !(templateDirective && (templateDirective === newIsolateScopeDirective || templateDirective === newIsolateScopeDirective.$$originalDirective))), compile.$$addScopeClass($element, !0); | |
var isolateScopeController = controllers && controllers[newIsolateScopeDirective.name], | |
isolateBindingContext = isolateScope; | |
isolateScopeController && isolateScopeController.identifier && newIsolateScopeDirective.bindToController === !0 && (isolateBindingContext = isolateScopeController.instance), forEach(isolateScope.$$isolateBindings = newIsolateScopeDirective.$$isolateBindings, function(definition, scopeName) { | |
var lastValue, parentGet, parentSet, compare, attrName = definition.attrName, | |
optional = definition.optional, | |
mode = definition.mode; | |
switch (mode) { | |
case "@": | |
attrs.$observe(attrName, function(value) { isolateBindingContext[scopeName] = value }), attrs.$$observers[attrName].$$scope = scope, attrs[attrName] && (isolateBindingContext[scopeName] = $interpolate(attrs[attrName])(scope)); | |
break; | |
case "=": | |
if (optional && !attrs[attrName]) return; | |
parentGet = $parse(attrs[attrName]), compare = parentGet.literal ? equals : function(a, b) { | |
return a === b || a !== a && b !== b }, parentSet = parentGet.assign || function() { | |
throw lastValue = isolateBindingContext[scopeName] = parentGet(scope), $compileMinErr("nonassign", "Expression '{0}' used with directive '{1}' is non-assignable!", attrs[attrName], newIsolateScopeDirective.name) }, lastValue = isolateBindingContext[scopeName] = parentGet(scope); | |
var parentValueWatch = function(parentValue) { | |
return compare(parentValue, isolateBindingContext[scopeName]) || (compare(parentValue, lastValue) ? parentSet(scope, parentValue = isolateBindingContext[scopeName]) : isolateBindingContext[scopeName] = parentValue), lastValue = parentValue }; | |
parentValueWatch.$stateful = !0; | |
var unwatch; | |
unwatch = definition.collection ? scope.$watchCollection(attrs[attrName], parentValueWatch) : scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal), isolateScope.$on("$destroy", unwatch); | |
break; | |
case "&": | |
parentGet = $parse(attrs[attrName]), isolateBindingContext[scopeName] = function(locals) { | |
return parentGet(scope, locals) } } }) } | |
for (controllers && (forEach(controllers, function(controller) { controller() }), controllers = null), i = 0, ii = preLinkFns.length; ii > i; i++) linkFn = preLinkFns[i], invokeLinkFn(linkFn, linkFn.isolateScope ? isolateScope : scope, $element, attrs, linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn); | |
var scopeToChild = scope; | |
for (newIsolateScopeDirective && (newIsolateScopeDirective.template || null === newIsolateScopeDirective.templateUrl) && (scopeToChild = isolateScope), childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn), i = postLinkFns.length - 1; i >= 0; i--) linkFn = postLinkFns[i], invokeLinkFn(linkFn, linkFn.isolateScope ? isolateScope : scope, $element, attrs, linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn) } | |
previousCompileContext = previousCompileContext || {}; | |
for (var newScopeDirective, controllers, directive, directiveName, $template, linkFn, directiveValue, terminalPriority = -Number.MAX_VALUE, controllerDirectives = previousCompileContext.controllerDirectives, newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, templateDirective = previousCompileContext.templateDirective, nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, hasTranscludeDirective = !1, hasTemplate = !1, hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective, $compileNode = templateAttrs.$$element = jqLite(compileNode), replaceDirective = originalReplaceDirective, childTranscludeFn = transcludeFn, i = 0, ii = directives.length; ii > i; i++) { directive = directives[i]; | |
var attrStart = directive.$$start, | |
attrEnd = directive.$$end; | |
if (attrStart && ($compileNode = groupScan(compileNode, attrStart, attrEnd)), $template = undefined, terminalPriority > directive.priority) break; | |
if ((directiveValue = directive.scope) && (directive.templateUrl || (isObject(directiveValue) ? (assertNoDuplicate("new/isolated scope", newIsolateScopeDirective || newScopeDirective, directive, $compileNode), newIsolateScopeDirective = directive) : assertNoDuplicate("new/isolated scope", newIsolateScopeDirective, directive, $compileNode)), newScopeDirective = newScopeDirective || directive), directiveName = directive.name, !directive.templateUrl && directive.controller && (directiveValue = directive.controller, controllerDirectives = controllerDirectives || {}, assertNoDuplicate("'" + directiveName + "' controller", controllerDirectives[directiveName], directive, $compileNode), controllerDirectives[directiveName] = directive), (directiveValue = directive.transclude) && (hasTranscludeDirective = !0, directive.$$tlb || (assertNoDuplicate("transclusion", nonTlbTranscludeDirective, directive, $compileNode), nonTlbTranscludeDirective = directive), "element" == directiveValue ? (hasElementTranscludeDirective = !0, terminalPriority = directive.priority, $template = $compileNode, $compileNode = templateAttrs.$$element = jqLite(document.createComment(" " + directiveName + ": " + templateAttrs[directiveName] + " ")), compileNode = $compileNode[0], replaceWith(jqCollection, sliceArgs($template), compileNode), childTranscludeFn = compile($template, transcludeFn, terminalPriority, replaceDirective && replaceDirective.name, { nonTlbTranscludeDirective: nonTlbTranscludeDirective })) : ($template = jqLite(jqLiteClone(compileNode)).contents(), $compileNode.empty(), childTranscludeFn = compile($template, transcludeFn))), directive.template) | |
if (hasTemplate = !0, assertNoDuplicate("template", templateDirective, directive, $compileNode), templateDirective = directive, directiveValue = isFunction(directive.template) ? directive.template($compileNode, templateAttrs) : directive.template, directiveValue = denormalizeTemplate(directiveValue), directive.replace) { | |
if (replaceDirective = directive, $template = jqLiteIsTextNode(directiveValue) ? [] : removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue))), compileNode = $template[0], 1 != $template.length || compileNode.nodeType !== NODE_TYPE_ELEMENT) throw $compileMinErr("tplrt", "Template for directive '{0}' must have exactly one root element. {1}", directiveName, ""); | |
replaceWith(jqCollection, $compileNode, compileNode); | |
var newTemplateAttrs = { $attr: {} }, | |
templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs), | |
unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1)); | |
newIsolateScopeDirective && markDirectivesAsIsolate(templateDirectives), directives = directives.concat(templateDirectives).concat(unprocessedDirectives), mergeTemplateAttributes(templateAttrs, newTemplateAttrs), ii = directives.length } else $compileNode.html(directiveValue); | |
if (directive.templateUrl) hasTemplate = !0, assertNoDuplicate("template", templateDirective, directive, $compileNode), templateDirective = directive, directive.replace && (replaceDirective = directive), nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode, templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, { controllerDirectives: controllerDirectives, newIsolateScopeDirective: newIsolateScopeDirective, templateDirective: templateDirective, nonTlbTranscludeDirective: nonTlbTranscludeDirective }), ii = directives.length; | |
else if (directive.compile) try { linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn), isFunction(linkFn) ? addLinkFns(null, linkFn, attrStart, attrEnd) : linkFn && addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd) } catch (e) { $exceptionHandler(e, startingTag($compileNode)) } | |
directive.terminal && (nodeLinkFn.terminal = !0, terminalPriority = Math.max(terminalPriority, directive.priority)) } | |
return nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === !0, nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective, nodeLinkFn.elementTranscludeOnThisElement = hasElementTranscludeDirective, nodeLinkFn.templateOnThisElement = hasTemplate, nodeLinkFn.transclude = childTranscludeFn, previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective, nodeLinkFn } | |
function markDirectivesAsIsolate(directives) { | |
for (var j = 0, jj = directives.length; jj > j; j++) directives[j] = inherit(directives[j], { $$isolateScope: !0 }) } | |
function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName, endAttrName) { | |
if (name === ignoreDirective) return null; | |
var match = null; | |
if (hasDirectives.hasOwnProperty(name)) | |
for (var directive, directives = $injector.get(name + Suffix), i = 0, ii = directives.length; ii > i; i++) try { directive = directives[i], (maxPriority === undefined || maxPriority > directive.priority) && -1 != directive.restrict.indexOf(location) && (startAttrName && (directive = inherit(directive, { $$start: startAttrName, $$end: endAttrName })), tDirectives.push(directive), match = directive) } catch (e) { $exceptionHandler(e) } | |
return match } | |
function directiveIsMultiElement(name) { | |
if (hasDirectives.hasOwnProperty(name)) | |
for (var directive, directives = $injector.get(name + Suffix), i = 0, ii = directives.length; ii > i; i++) | |
if (directive = directives[i], directive.multiElement) return !0; | |
return !1 } | |
function mergeTemplateAttributes(dst, src) { | |
var srcAttr = src.$attr, | |
dstAttr = dst.$attr, | |
$element = dst.$$element; | |
forEach(dst, function(value, key) { "$" != key.charAt(0) && (src[key] && src[key] !== value && (value += ("style" === key ? ";" : " ") + src[key]), dst.$set(key, value, !0, srcAttr[key])) }), forEach(src, function(value, key) { "class" == key ? (safeAddClass($element, value), dst["class"] = (dst["class"] ? dst["class"] + " " : "") + value) : "style" == key ? ($element.attr("style", $element.attr("style") + ";" + value), dst.style = (dst.style ? dst.style + ";" : "") + value) : "$" == key.charAt(0) || dst.hasOwnProperty(key) || (dst[key] = value, dstAttr[key] = srcAttr[key]) }) } | |
function compileTemplateUrl(directives, $compileNode, tAttrs, $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) { | |
var afterTemplateNodeLinkFn, afterTemplateChildLinkFn, linkQueue = [], | |
beforeTemplateCompileNode = $compileNode[0], | |
origAsyncDirective = directives.shift(), | |
derivedSyncDirective = extend({}, origAsyncDirective, { templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective }), | |
templateUrl = isFunction(origAsyncDirective.templateUrl) ? origAsyncDirective.templateUrl($compileNode, tAttrs) : origAsyncDirective.templateUrl, | |
templateNamespace = origAsyncDirective.templateNamespace; | |
return $compileNode.empty(), $templateRequest($sce.getTrustedResourceUrl(templateUrl)).then(function(content) { | |
var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn; | |
if (content = denormalizeTemplate(content), origAsyncDirective.replace) { | |
if ($template = jqLiteIsTextNode(content) ? [] : removeComments(wrapTemplate(templateNamespace, trim(content))), compileNode = $template[0], 1 != $template.length || compileNode.nodeType !== NODE_TYPE_ELEMENT) throw $compileMinErr("tplrt", "Template for directive '{0}' must have exactly one root element. {1}", origAsyncDirective.name, templateUrl); | |
tempTemplateAttrs = { $attr: {} }, replaceWith($rootElement, $compileNode, compileNode); | |
var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs); | |
isObject(origAsyncDirective.scope) && markDirectivesAsIsolate(templateDirectives), directives = templateDirectives.concat(directives), mergeTemplateAttributes(tAttrs, tempTemplateAttrs) } else compileNode = beforeTemplateCompileNode, $compileNode.html(content); | |
for (directives.unshift(derivedSyncDirective), afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns, previousCompileContext), forEach($rootElement, function(node, i) { node == compileNode && ($rootElement[i] = $compileNode[0]) }), afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); linkQueue.length;) { | |
var scope = linkQueue.shift(), | |
beforeTemplateLinkNode = linkQueue.shift(), | |
linkRootElement = linkQueue.shift(), | |
boundTranscludeFn = linkQueue.shift(), | |
linkNode = $compileNode[0]; | |
if (!scope.$$destroyed) { | |
if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { | |
var oldClasses = beforeTemplateLinkNode.className; | |
previousCompileContext.hasElementTranscludeDirective && origAsyncDirective.replace || (linkNode = jqLiteClone(compileNode)), replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode), safeAddClass(jqLite(linkNode), oldClasses) | |
} | |
childBoundTranscludeFn = afterTemplateNodeLinkFn.transcludeOnThisElement ? createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn) : boundTranscludeFn, afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, childBoundTranscludeFn) | |
} | |
} | |
linkQueue = null | |
}), | |
function(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) { | |
var childBoundTranscludeFn = boundTranscludeFn; | |
scope.$$destroyed || (linkQueue ? linkQueue.push(scope, node, rootElement, childBoundTranscludeFn) : (afterTemplateNodeLinkFn.transcludeOnThisElement && (childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn)), afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn))) } | |
} | |
function byPriority(a, b) { | |
var diff = b.priority - a.priority; | |
return 0 !== diff ? diff : a.name !== b.name ? a.name < b.name ? -1 : 1 : a.index - b.index } | |
function assertNoDuplicate(what, previousDirective, directive, element) { | |
if (previousDirective) throw $compileMinErr("multidir", "Multiple directives [{0}, {1}] asking for {2} on: {3}", previousDirective.name, directive.name, what, startingTag(element)) } | |
function addTextInterpolateDirective(directives, text) { | |
var interpolateFn = $interpolate(text, !0); | |
interpolateFn && directives.push({ priority: 0, compile: function(templateNode) { | |
var templateNodeParent = templateNode.parent(), | |
hasCompileParent = !!templateNodeParent.length; | |
return hasCompileParent && compile.$$addBindingClass(templateNodeParent), | |
function(scope, node) { | |
var parent = node.parent(); | |
hasCompileParent || compile.$$addBindingClass(parent), compile.$$addBindingInfo(parent, interpolateFn.expressions), scope.$watch(interpolateFn, function(value) { node[0].nodeValue = value }) } } }) } | |
function wrapTemplate(type, template) { | |
switch (type = lowercase(type || "html")) { | |
case "svg": | |
case "math": | |
var wrapper = document.createElement("div"); | |
return wrapper.innerHTML = "<" + type + ">" + template + "</" + type + ">", wrapper.childNodes[0].childNodes; | |
default: | |
return template } } | |
function getTrustedContext(node, attrNormalizedName) { | |
if ("srcdoc" == attrNormalizedName) return $sce.HTML; | |
var tag = nodeName_(node); | |
return "xlinkHref" == attrNormalizedName || "form" == tag && "action" == attrNormalizedName || "img" != tag && ("src" == attrNormalizedName || "ngSrc" == attrNormalizedName) ? $sce.RESOURCE_URL : void 0 } | |
function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) { | |
var interpolateFn = $interpolate(value, !0); | |
if (interpolateFn) { | |
if ("multiple" === name && "select" === nodeName_(node)) throw $compileMinErr("selmulti", "Binding to the 'multiple' attribute is not supported. Element: {0}", startingTag(node)); | |
directives.push({ priority: 100, compile: function() { | |
return { pre: function(scope, element, attr) { | |
var $$observers = attr.$$observers || (attr.$$observers = {}); | |
if (EVENT_HANDLER_ATTR_REGEXP.test(name)) throw $compileMinErr("nodomevents", "Interpolations for HTML DOM event attributes are disallowed. Please use the ng- versions (such as ng-click instead of onclick) instead."); | |
attr[name] && (interpolateFn = $interpolate(attr[name], !0, getTrustedContext(node, name), ALL_OR_NOTHING_ATTRS[name] || allOrNothing), interpolateFn && (attr[name] = interpolateFn(scope), ($$observers[name] || ($$observers[name] = [])).$$inter = !0, (attr.$$observers && attr.$$observers[name].$$scope || scope).$watch(interpolateFn, function(newValue, oldValue) { "class" === name && newValue != oldValue ? attr.$updateClass(newValue, oldValue) : attr.$set(name, newValue) }))) } } } }) } } | |
function replaceWith($rootElement, elementsToRemove, newNode) { | |
var i, ii, firstElementToRemove = elementsToRemove[0], | |
removeCount = elementsToRemove.length, | |
parent = firstElementToRemove.parentNode; | |
if ($rootElement) | |
for (i = 0, ii = $rootElement.length; ii > i; i++) | |
if ($rootElement[i] == firstElementToRemove) { $rootElement[i++] = newNode; | |
for (var j = i, j2 = j + removeCount - 1, jj = $rootElement.length; jj > j; j++, j2++) jj > j2 ? $rootElement[j] = $rootElement[j2] : delete $rootElement[j]; | |
$rootElement.length -= removeCount - 1, $rootElement.context === firstElementToRemove && ($rootElement.context = newNode); | |
break } | |
parent && parent.replaceChild(newNode, firstElementToRemove); | |
var fragment = document.createDocumentFragment(); | |
fragment.appendChild(firstElementToRemove), jqLite(newNode).data(jqLite(firstElementToRemove).data()), jQuery ? (skipDestroyOnNextJQueryCleanData = !0, jQuery.cleanData([firstElementToRemove])) : delete jqLite.cache[firstElementToRemove[jqLite.expando]]; | |
for (var k = 1, kk = elementsToRemove.length; kk > k; k++) { | |
var element = elementsToRemove[k]; | |
jqLite(element).remove(), fragment.appendChild(element), delete elementsToRemove[k] } | |
elementsToRemove[0] = newNode, elementsToRemove.length = 1 } | |
function cloneAndAnnotateFn(fn, annotation) { | |
return extend(function() { | |
return fn.apply(null, arguments) }, fn, annotation) } | |
function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) { | |
try { linkFn(scope, $element, attrs, controllers, transcludeFn) } catch (e) { $exceptionHandler(e, startingTag($element)) } } | |
var Attributes = function(element, attributesToCopy) { | |
if (attributesToCopy) { | |
var i, l, key, keys = Object.keys(attributesToCopy); | |
for (i = 0, l = keys.length; l > i; i++) key = keys[i], this[key] = attributesToCopy[key] } else this.$attr = {}; | |
this.$$element = element }; | |
Attributes.prototype = { $normalize: directiveNormalize, $addClass: function(classVal) { classVal && classVal.length > 0 && $animate.addClass(this.$$element, classVal) }, $removeClass: function(classVal) { classVal && classVal.length > 0 && $animate.removeClass(this.$$element, classVal) }, $updateClass: function(newClasses, oldClasses) { | |
var toAdd = tokenDifference(newClasses, oldClasses); | |
toAdd && toAdd.length && $animate.addClass(this.$$element, toAdd); | |
var toRemove = tokenDifference(oldClasses, newClasses); | |
toRemove && toRemove.length && $animate.removeClass(this.$$element, toRemove) }, $set: function(key, value, writeAttr, attrName) { | |
var nodeName, node = this.$$element[0], | |
booleanKey = getBooleanAttrName(node, key), | |
aliasedKey = getAliasedAttrName(node, key), | |
observer = key; | |
if (booleanKey ? (this.$$element.prop(key, value), attrName = booleanKey) : aliasedKey && (this[aliasedKey] = value, observer = aliasedKey), this[key] = value, attrName ? this.$attr[key] = attrName : (attrName = this.$attr[key], attrName || (this.$attr[key] = attrName = snake_case(key, "-"))), nodeName = nodeName_(this.$$element), "a" === nodeName && "href" === key || "img" === nodeName && "src" === key) this[key] = value = $$sanitizeUri(value, "src" === key); | |
else if ("img" === nodeName && "srcset" === key) { | |
for (var result = "", trimmedSrcset = trim(value), srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/, pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/, rawUris = trimmedSrcset.split(pattern), nbrUrisWith2parts = Math.floor(rawUris.length / 2), i = 0; nbrUrisWith2parts > i; i++) { | |
var innerIdx = 2 * i; | |
result += $$sanitizeUri(trim(rawUris[innerIdx]), !0), result += " " + trim(rawUris[innerIdx + 1]) } | |
var lastTuple = trim(rawUris[2 * i]).split(/\s/); | |
result += $$sanitizeUri(trim(lastTuple[0]), !0), 2 === lastTuple.length && (result += " " + trim(lastTuple[1])), this[key] = value = result } | |
writeAttr !== !1 && (null === value || value === undefined ? this.$$element.removeAttr(attrName) : this.$$element.attr(attrName, value)); | |
var $$observers = this.$$observers; | |
$$observers && forEach($$observers[observer], function(fn) { | |
try { fn(value) } catch (e) { $exceptionHandler(e) } }) }, $observe: function(key, fn) { | |
var attrs = this, | |
$$observers = attrs.$$observers || (attrs.$$observers = createMap()), | |
listeners = $$observers[key] || ($$observers[key] = []); | |
return listeners.push(fn), $rootScope.$evalAsync(function() {!listeners.$$inter && attrs.hasOwnProperty(key) && fn(attrs[key]) }), | |
function() { arrayRemove(listeners, fn) } } }; | |
var startSymbol = $interpolate.startSymbol(), | |
endSymbol = $interpolate.endSymbol(), | |
denormalizeTemplate = "{{" == startSymbol || "}}" == endSymbol ? identity : function(template) { | |
return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol) }, | |
NG_ATTR_BINDING = /^ngAttr[A-Z]/; | |
return compile.$$addBindingInfo = debugInfoEnabled ? function($element, binding) { | |
var bindings = $element.data("$binding") || []; | |
isArray(binding) ? bindings = bindings.concat(binding) : bindings.push(binding), $element.data("$binding", bindings) } : noop, compile.$$addBindingClass = debugInfoEnabled ? function($element) { safeAddClass($element, "ng-binding") } : noop, compile.$$addScopeInfo = debugInfoEnabled ? function($element, scope, isolated, noTemplate) { | |
var dataName = isolated ? noTemplate ? "$isolateScopeNoTemplate" : "$isolateScope" : "$scope"; | |
$element.data(dataName, scope) } : noop, compile.$$addScopeClass = debugInfoEnabled ? function($element, isolated) { safeAddClass($element, isolated ? "ng-isolate-scope" : "ng-scope") } : noop, compile | |
}] | |
} | |
function directiveNormalize(name) { | |
return camelCase(name.replace(PREFIX_REGEXP, "")) } | |
function tokenDifference(str1, str2) { | |
var values = "", | |
tokens1 = str1.split(/\s+/), | |
tokens2 = str2.split(/\s+/); | |
outer: for (var i = 0; i < tokens1.length; i++) { | |
for (var token = tokens1[i], j = 0; j < tokens2.length; j++) | |
if (token == tokens2[j]) continue outer; | |
values += (values.length > 0 ? " " : "") + token } | |
return values } | |
function removeComments(jqNodes) { jqNodes = jqLite(jqNodes); | |
var i = jqNodes.length; | |
if (1 >= i) return jqNodes; | |
for (; i--;) { | |
var node = jqNodes[i]; | |
node.nodeType === NODE_TYPE_COMMENT && splice.call(jqNodes, i, 1) } | |
return jqNodes } | |
function $ControllerProvider() { | |
var controllers = {}, | |
globals = !1, | |
CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/; | |
this.register = function(name, constructor) { assertNotHasOwnProperty(name, "controller"), isObject(name) ? extend(controllers, name) : controllers[name] = constructor }, this.allowGlobals = function() { globals = !0 }, this.$get = ["$injector", "$window", function($injector, $window) { | |
function addIdentifier(locals, identifier, instance, name) { | |
if (!locals || !isObject(locals.$scope)) throw minErr("$controller")("noscp", "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", name, identifier); | |
locals.$scope[identifier] = instance } | |
return function(expression, locals, later, ident) { | |
var instance, match, constructor, identifier; | |
if (later = later === !0, ident && isString(ident) && (identifier = ident), isString(expression) && (match = expression.match(CNTRL_REG), constructor = match[1], identifier = identifier || match[3], expression = controllers.hasOwnProperty(constructor) ? controllers[constructor] : getter(locals.$scope, constructor, !0) || (globals ? getter($window, constructor, !0) : undefined), assertArgFn(expression, constructor, !0)), later) { | |
var controllerPrototype = (isArray(expression) ? expression[expression.length - 1] : expression).prototype; | |
return instance = Object.create(controllerPrototype), identifier && addIdentifier(locals, identifier, instance, constructor || expression.name), extend(function() { | |
return $injector.invoke(expression, instance, locals, constructor), instance }, { instance: instance, identifier: identifier }) } | |
return instance = $injector.instantiate(expression, locals, constructor), identifier && addIdentifier(locals, identifier, instance, constructor || expression.name), instance } }] } | |
function $DocumentProvider() { this.$get = ["$window", function(window) { | |
return jqLite(window.document) }] } | |
function $ExceptionHandlerProvider() { this.$get = ["$log", function($log) { | |
return function() { $log.error.apply($log, arguments) } }] } | |
function defaultHttpResponseTransform(data, headers) { | |
if (isString(data)) { data = data.replace(JSON_PROTECTION_PREFIX, ""); | |
var contentType = headers("Content-Type"); | |
(contentType && 0 === contentType.indexOf(APPLICATION_JSON) && data.trim() || JSON_START.test(data) && JSON_END.test(data)) && (data = fromJson(data)) } | |
return data } | |
function parseHeaders(headers) { | |
var key, val, i, parsed = createMap(); | |
return headers ? (forEach(headers.split("\n"), function(line) { i = line.indexOf(":"), key = lowercase(trim(line.substr(0, i))), val = trim(line.substr(i + 1)), key && (parsed[key] = parsed[key] ? parsed[key] + ", " + val : val) }), parsed) : parsed } | |
function headersGetter(headers) { | |
var headersObj = isObject(headers) ? headers : undefined; | |
return function(name) { | |
if (headersObj || (headersObj = parseHeaders(headers)), name) { | |
var value = headersObj[lowercase(name)]; | |
return void 0 === value && (value = null), value } | |
return headersObj } } | |
function transformData(data, headers, fns) { | |
return isFunction(fns) ? fns(data, headers) : (forEach(fns, function(fn) { data = fn(data, headers) }), data) } | |
function isSuccess(status) { | |
return status >= 200 && 300 > status } | |
function $HttpProvider() { | |
var defaults = this.defaults = { transformResponse: [defaultHttpResponseTransform], transformRequest: [function(d) { | |
return !isObject(d) || isFile(d) || isBlob(d) ? d : toJson(d) }], headers: { common: { Accept: "application/json, text/plain, */*" }, post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON) }, xsrfCookieName: "XSRF-TOKEN", xsrfHeaderName: "X-XSRF-TOKEN" }, | |
useApplyAsync = !1; | |
this.useApplyAsync = function(value) { | |
return isDefined(value) ? (useApplyAsync = !!value, this) : useApplyAsync }; | |
var interceptorFactories = this.interceptors = []; | |
this.$get = ["$httpBackend", "$browser", "$cacheFactory", "$rootScope", "$q", "$injector", function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) { | |
function $http(requestConfig) { | |
function transformResponse(response) { | |
var resp = extend({}, response); | |
return resp.data = response.data ? transformData(response.data, response.headers, config.transformResponse) : response.data, isSuccess(response.status) ? resp : $q.reject(resp) } | |
function mergeHeaders(config) { | |
function execHeaders(headers) { | |
var headerContent; | |
forEach(headers, function(headerFn, header) { isFunction(headerFn) && (headerContent = headerFn(), null != headerContent ? headers[header] = headerContent : delete headers[header]) }) } | |
var defHeaderName, lowercaseDefHeaderName, reqHeaderName, defHeaders = defaults.headers, | |
reqHeaders = extend({}, config.headers); | |
defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]); | |
defaultHeadersIteration: for (defHeaderName in defHeaders) { lowercaseDefHeaderName = lowercase(defHeaderName); | |
for (reqHeaderName in reqHeaders) | |
if (lowercase(reqHeaderName) === lowercaseDefHeaderName) continue defaultHeadersIteration; | |
reqHeaders[defHeaderName] = defHeaders[defHeaderName] } | |
return execHeaders(reqHeaders), reqHeaders } | |
var config = { method: "get", transformRequest: defaults.transformRequest, transformResponse: defaults.transformResponse }, | |
headers = mergeHeaders(requestConfig); | |
if (!angular.isObject(requestConfig)) throw minErr("$http")("badreq", "Http request configuration must be an object. Received: {0}", requestConfig); | |
extend(config, requestConfig), config.headers = headers, config.method = uppercase(config.method); | |
var serverRequest = function(config) { headers = config.headers; | |
var reqData = transformData(config.data, headersGetter(headers), config.transformRequest); | |
return isUndefined(reqData) && forEach(headers, function(value, header) { "content-type" === lowercase(header) && delete headers[header] }), isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials) && (config.withCredentials = defaults.withCredentials), sendReq(config, reqData, headers).then(transformResponse, transformResponse) }, | |
chain = [serverRequest, undefined], | |
promise = $q.when(config); | |
for (forEach(reversedInterceptors, function(interceptor) { | |
(interceptor.request || interceptor.requestError) && chain.unshift(interceptor.request, interceptor.requestError), (interceptor.response || interceptor.responseError) && chain.push(interceptor.response, interceptor.responseError) }); chain.length;) { | |
var thenFn = chain.shift(), | |
rejectFn = chain.shift(); | |
promise = promise.then(thenFn, rejectFn) } | |
return promise.success = function(fn) { | |
return promise.then(function(response) { fn(response.data, response.status, response.headers, config) }), promise }, promise.error = function(fn) { | |
return promise.then(null, function(response) { fn(response.data, response.status, response.headers, config) }), promise }, promise } | |
function createShortMethods() { forEach(arguments, function(name) { $http[name] = function(url, config) { | |
return $http(extend(config || {}, { method: name, url: url })) } }) } | |
function createShortMethodsWithData() { forEach(arguments, function(name) { $http[name] = function(url, data, config) { | |
return $http(extend(config || {}, { method: name, url: url, data: data })) } }) } | |
function sendReq(config, reqData, reqHeaders) { | |
function done(status, response, headersString, statusText) { | |
function resolveHttpPromise() { resolvePromise(response, status, headersString, statusText) } | |
cache && (isSuccess(status) ? cache.put(url, [status, response, parseHeaders(headersString), statusText]) : cache.remove(url)), useApplyAsync ? $rootScope.$applyAsync(resolveHttpPromise) : (resolveHttpPromise(), $rootScope.$$phase || $rootScope.$apply()) } | |
function resolvePromise(response, status, headers, statusText) { status = Math.max(status, 0), (isSuccess(status) ? deferred.resolve : deferred.reject)({ data: response, status: status, headers: headersGetter(headers), config: config, statusText: statusText }) } | |
function removePendingReq() { | |
var idx = $http.pendingRequests.indexOf(config); - 1 !== idx && $http.pendingRequests.splice(idx, 1) } | |
var cache, cachedResp, deferred = $q.defer(), | |
promise = deferred.promise, | |
url = buildUrl(config.url, config.params); | |
if ($http.pendingRequests.push(config), promise.then(removePendingReq, removePendingReq), !config.cache && !defaults.cache || config.cache === !1 || "GET" !== config.method && "JSONP" !== config.method || (cache = isObject(config.cache) ? config.cache : isObject(defaults.cache) ? defaults.cache : defaultCache), cache) | |
if (cachedResp = cache.get(url), isDefined(cachedResp)) { | |
if (isPromiseLike(cachedResp)) return cachedResp.then(removePendingReq, removePendingReq), cachedResp; | |
isArray(cachedResp) ? resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]) : resolvePromise(cachedResp, 200, {}, "OK") } else cache.put(url, promise); | |
if (isUndefined(cachedResp)) { | |
var xsrfValue = urlIsSameOrigin(config.url) ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName] : undefined; | |
xsrfValue && (reqHeaders[config.xsrfHeaderName || defaults.xsrfHeaderName] = xsrfValue), $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, config.withCredentials, config.responseType) } | |
return promise } | |
function buildUrl(url, params) { | |
if (!params) return url; | |
var parts = []; | |
return forEachSorted(params, function(value, key) { null === value || isUndefined(value) || (isArray(value) || (value = [value]), forEach(value, function(v) { isObject(v) && (v = isDate(v) ? v.toISOString() : toJson(v)), parts.push(encodeUriQuery(key) + "=" + encodeUriQuery(v)) })) }), parts.length > 0 && (url += (-1 == url.indexOf("?") ? "?" : "&") + parts.join("&")), url } | |
var defaultCache = $cacheFactory("$http"), | |
reversedInterceptors = []; | |
return forEach(interceptorFactories, function(interceptorFactory) { reversedInterceptors.unshift(isString(interceptorFactory) ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory)) }), $http.pendingRequests = [], createShortMethods("get", "delete", "head", "jsonp"), createShortMethodsWithData("post", "put", "patch"), $http.defaults = defaults, $http }] } | |
function createXhr() { | |
return new window.XMLHttpRequest } | |
function $HttpBackendProvider() { this.$get = ["$browser", "$window", "$document", function($browser, $window, $document) { | |
return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]) }] } | |
function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) { | |
function jsonpReq(url, callbackId, done) { | |
var script = rawDocument.createElement("script"), | |
callback = null; | |
return script.type = "text/javascript", script.src = url, script.async = !0, callback = function(event) { removeEventListenerFn(script, "load", callback), removeEventListenerFn(script, "error", callback), rawDocument.body.removeChild(script), script = null; | |
var status = -1, | |
text = "unknown"; | |
event && ("load" !== event.type || callbacks[callbackId].called || (event = { type: "error" }), text = event.type, status = "error" === event.type ? 404 : 200), done && done(status, text) }, addEventListenerFn(script, "load", callback), addEventListenerFn(script, "error", callback), rawDocument.body.appendChild(script), callback } | |
return function(method, url, post, callback, headers, timeout, withCredentials, responseType) { | |
function timeoutRequest() { jsonpDone && jsonpDone(), xhr && xhr.abort() } | |
function completeRequest(callback, status, response, headersString, statusText) { timeoutId !== undefined && $browserDefer.cancel(timeoutId), jsonpDone = xhr = null, callback(status, response, headersString, statusText), $browser.$$completeOutstandingRequest(noop) } | |
if ($browser.$$incOutstandingRequestCount(), url = url || $browser.url(), "jsonp" == lowercase(method)) { | |
var callbackId = "_" + (callbacks.counter++).toString(36); | |
callbacks[callbackId] = function(data) { callbacks[callbackId].data = data, callbacks[callbackId].called = !0 }; | |
var jsonpDone = jsonpReq(url.replace("JSON_CALLBACK", "angular.callbacks." + callbackId), callbackId, function(status, text) { completeRequest(callback, status, callbacks[callbackId].data, "", text), callbacks[callbackId] = noop }) } else { | |
var xhr = createXhr(); | |
xhr.open(method, url, !0), forEach(headers, function(value, key) { isDefined(value) && xhr.setRequestHeader(key, value) }), xhr.onload = function() { | |
var statusText = xhr.statusText || "", | |
response = "response" in xhr ? xhr.response : xhr.responseText, | |
status = 1223 === xhr.status ? 204 : xhr.status; | |
0 === status && (status = response ? 200 : "file" == urlResolve(url).protocol ? 404 : 0), completeRequest(callback, status, response, xhr.getAllResponseHeaders(), statusText) }; | |
var requestError = function() { completeRequest(callback, -1, null, null, "") }; | |
if (xhr.onerror = requestError, xhr.onabort = requestError, withCredentials && (xhr.withCredentials = !0), responseType) try { xhr.responseType = responseType } catch (e) { | |
if ("json" !== responseType) throw e } | |
xhr.send(post || null) } | |
if (timeout > 0) var timeoutId = $browserDefer(timeoutRequest, timeout); | |
else isPromiseLike(timeout) && timeout.then(timeoutRequest) } } | |
function $InterpolateProvider() { | |
var startSymbol = "{{", | |
endSymbol = "}}"; | |
this.startSymbol = function(value) { | |
return value ? (startSymbol = value, this) : startSymbol }, this.endSymbol = function(value) { | |
return value ? (endSymbol = value, this) : endSymbol }, this.$get = ["$parse", "$exceptionHandler", "$sce", function($parse, $exceptionHandler, $sce) { | |
function escape(ch) { | |
return "\\\\\\" + ch } | |
function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) { | |
function unescapeText(text) { | |
return text.replace(escapedStartRegexp, startSymbol).replace(escapedEndRegexp, endSymbol) } | |
function parseStringifyInterceptor(value) { | |
try { | |
return value = getValue(value), allOrNothing && !isDefined(value) ? value : stringify(value) } catch (err) { | |
var newErr = $interpolateMinErr("interr", "Can't interpolate: {0}\n{1}", text, err.toString()); | |
$exceptionHandler(newErr) } } | |
allOrNothing = !!allOrNothing; | |
for (var startIndex, endIndex, exp, index = 0, expressions = [], parseFns = [], textLength = text.length, concat = [], expressionPositions = []; textLength > index;) { | |
if (-1 == (startIndex = text.indexOf(startSymbol, index)) || -1 == (endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength))) { index !== textLength && concat.push(unescapeText(text.substring(index))); | |
break } | |
index !== startIndex && concat.push(unescapeText(text.substring(index, startIndex))), exp = text.substring(startIndex + startSymbolLength, endIndex), expressions.push(exp), parseFns.push($parse(exp, parseStringifyInterceptor)), index = endIndex + endSymbolLength, expressionPositions.push(concat.length), concat.push("") } | |
if (trustedContext && concat.length > 1) throw $interpolateMinErr("noconcat", "Error while interpolating: {0}\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required. See http://docs.angularjs.org/api/ng.$sce", text); | |
if (!mustHaveExpression || expressions.length) { | |
var compute = function(values) { | |
for (var i = 0, ii = expressions.length; ii > i; i++) { | |
if (allOrNothing && isUndefined(values[i])) return; | |
concat[expressionPositions[i]] = values[i] } | |
return concat.join("") }, | |
getValue = function(value) { | |
return trustedContext ? $sce.getTrusted(trustedContext, value) : $sce.valueOf(value) }, | |
stringify = function(value) { | |
if (null == value) return ""; | |
switch (typeof value) { | |
case "string": | |
break; | |
case "number": | |
value = "" + value; | |
break; | |
default: | |
value = toJson(value) } | |
return value }; | |
return extend(function(context) { | |
var i = 0, | |
ii = expressions.length, | |
values = new Array(ii); | |
try { | |
for (; ii > i; i++) values[i] = parseFns[i](context); | |
return compute(values) } catch (err) { | |
var newErr = $interpolateMinErr("interr", "Can't interpolate: {0}\n{1}", text, err.toString()); | |
$exceptionHandler(newErr) } }, { exp: text, expressions: expressions, $$watchDelegate: function(scope, listener, objectEquality) { | |
var lastValue; | |
return scope.$watchGroup(parseFns, function(values, oldValues) { | |
var currValue = compute(values); | |
isFunction(listener) && listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope), lastValue = currValue }, objectEquality) } }) } } | |
var startSymbolLength = startSymbol.length, | |
endSymbolLength = endSymbol.length, | |
escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), "g"), | |
escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), "g"); | |
return $interpolate.startSymbol = function() { | |
return startSymbol }, $interpolate.endSymbol = function() { | |
return endSymbol }, $interpolate }] } | |
function $IntervalProvider() { this.$get = ["$rootScope", "$window", "$q", "$$q", function($rootScope, $window, $q, $$q) { | |
function interval(fn, delay, count, invokeApply) { | |
var setInterval = $window.setInterval, | |
clearInterval = $window.clearInterval, | |
iteration = 0, | |
skipApply = isDefined(invokeApply) && !invokeApply, | |
deferred = (skipApply ? $$q : $q).defer(), | |
promise = deferred.promise; | |
return count = isDefined(count) ? count : 0, promise.then(null, null, fn), promise.$$intervalId = setInterval(function() { deferred.notify(iteration++), count > 0 && iteration >= count && (deferred.resolve(iteration), clearInterval(promise.$$intervalId), delete intervals[promise.$$intervalId]), skipApply || $rootScope.$apply() }, delay), intervals[promise.$$intervalId] = deferred, promise } | |
var intervals = {}; | |
return interval.cancel = function(promise) { | |
return promise && promise.$$intervalId in intervals ? (intervals[promise.$$intervalId].reject("canceled"), $window.clearInterval(promise.$$intervalId), delete intervals[promise.$$intervalId], !0) : !1 }, interval }] } | |
function $LocaleProvider() { this.$get = function() { | |
return { id: "en-us", NUMBER_FORMATS: { DECIMAL_SEP: ".", GROUP_SEP: ",", PATTERNS: [{ minInt: 1, minFrac: 0, maxFrac: 3, posPre: "", posSuf: "", negPre: "-", negSuf: "", gSize: 3, lgSize: 3 }, { minInt: 1, minFrac: 2, maxFrac: 2, posPre: "¤", posSuf: "", negPre: "(¤", negSuf: ")", gSize: 3, lgSize: 3 }], CURRENCY_SYM: "$" }, DATETIME_FORMATS: { MONTH: "January,February,March,April,May,June,July,August,September,October,November,December".split(","), SHORTMONTH: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","), DAY: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","), SHORTDAY: "Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(","), AMPMS: ["AM", "PM"], medium: "MMM d, y h:mm:ss a", "short": "M/d/yy h:mm a", fullDate: "EEEE, MMMM d, y", longDate: "MMMM d, y", mediumDate: "MMM d, y", shortDate: "M/d/yy", mediumTime: "h:mm:ss a", shortTime: "h:mm a" }, pluralCat: function(num) { | |
return 1 === num ? "one" : "other" } } } } | |
function encodePath(path) { | |
for (var segments = path.split("/"), i = segments.length; i--;) segments[i] = encodeUriSegment(segments[i]); | |
return segments.join("/") } | |
function parseAbsoluteUrl(absoluteUrl, locationObj) { | |
var parsedUrl = urlResolve(absoluteUrl); | |
locationObj.$$protocol = parsedUrl.protocol, locationObj.$$host = parsedUrl.hostname, locationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null } | |
function parseAppUrl(relativeUrl, locationObj) { | |
var prefixed = "/" !== relativeUrl.charAt(0); | |
prefixed && (relativeUrl = "/" + relativeUrl); | |
var match = urlResolve(relativeUrl); | |
locationObj.$$path = decodeURIComponent(prefixed && "/" === match.pathname.charAt(0) ? match.pathname.substring(1) : match.pathname), locationObj.$$search = parseKeyValue(match.search), locationObj.$$hash = decodeURIComponent(match.hash), locationObj.$$path && "/" != locationObj.$$path.charAt(0) && (locationObj.$$path = "/" + locationObj.$$path) } | |
function beginsWith(begin, whole) { | |
return 0 === whole.indexOf(begin) ? whole.substr(begin.length) : void 0 } | |
function stripHash(url) { | |
var index = url.indexOf("#"); | |
return -1 == index ? url : url.substr(0, index) } | |
function stripFile(url) { | |
return url.substr(0, stripHash(url).lastIndexOf("/") + 1) } | |
function serverBase(url) { | |
return url.substring(0, url.indexOf("/", url.indexOf("//") + 2)) } | |
function LocationHtml5Url(appBase, basePrefix) { this.$$html5 = !0, basePrefix = basePrefix || ""; | |
var appBaseNoFile = stripFile(appBase); | |
parseAbsoluteUrl(appBase, this), this.$$parse = function(url) { | |
var pathUrl = beginsWith(appBaseNoFile, url); | |
if (!isString(pathUrl)) throw $locationMinErr("ipthprfx", 'Invalid url "{0}", missing path prefix "{1}".', url, appBaseNoFile); | |
parseAppUrl(pathUrl, this), this.$$path || (this.$$path = "/"), this.$$compose() }, this.$$compose = function() { | |
var search = toKeyValue(this.$$search), | |
hash = this.$$hash ? "#" + encodeUriSegment(this.$$hash) : ""; | |
this.$$url = encodePath(this.$$path) + (search ? "?" + search : "") + hash, this.$$absUrl = appBaseNoFile + this.$$url.substr(1) }, this.$$parseLinkUrl = function(url, relHref) { | |
if (relHref && "#" === relHref[0]) return this.hash(relHref.slice(1)), !0; | |
var appUrl, prevAppUrl, rewrittenUrl; | |
return (appUrl = beginsWith(appBase, url)) !== undefined ? (prevAppUrl = appUrl, rewrittenUrl = (appUrl = beginsWith(basePrefix, appUrl)) !== undefined ? appBaseNoFile + (beginsWith("/", appUrl) || appUrl) : appBase + prevAppUrl) : (appUrl = beginsWith(appBaseNoFile, url)) !== undefined ? rewrittenUrl = appBaseNoFile + appUrl : appBaseNoFile == url + "/" && (rewrittenUrl = appBaseNoFile), rewrittenUrl && this.$$parse(rewrittenUrl), !!rewrittenUrl } } | |
function LocationHashbangUrl(appBase, hashPrefix) { | |
var appBaseNoFile = stripFile(appBase); | |
parseAbsoluteUrl(appBase, this), this.$$parse = function(url) { | |
function removeWindowsDriveName(path, url, base) { | |
var firstPathSegmentMatch, windowsFilePathExp = /^\/[A-Z]:(\/.*)/; | |
return 0 === url.indexOf(base) && (url = url.replace(base, "")), windowsFilePathExp.exec(url) ? path : (firstPathSegmentMatch = windowsFilePathExp.exec(path), firstPathSegmentMatch ? firstPathSegmentMatch[1] : path) } | |
var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url), | |
withoutHashUrl = "#" == withoutBaseUrl.charAt(0) ? beginsWith(hashPrefix, withoutBaseUrl) : this.$$html5 ? withoutBaseUrl : ""; | |
if (!isString(withoutHashUrl)) throw $locationMinErr("ihshprfx", 'Invalid url "{0}", missing hash prefix "{1}".', url, hashPrefix); | |
parseAppUrl(withoutHashUrl, this), this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase), this.$$compose() }, this.$$compose = function() { | |
var search = toKeyValue(this.$$search), | |
hash = this.$$hash ? "#" + encodeUriSegment(this.$$hash) : ""; | |
this.$$url = encodePath(this.$$path) + (search ? "?" + search : "") + hash, this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : "") }, this.$$parseLinkUrl = function(url) { | |
return stripHash(appBase) == stripHash(url) ? (this.$$parse(url), !0) : !1 } } | |
function LocationHashbangInHtml5Url(appBase, hashPrefix) { this.$$html5 = !0, LocationHashbangUrl.apply(this, arguments); | |
var appBaseNoFile = stripFile(appBase); | |
this.$$parseLinkUrl = function(url, relHref) { | |
if (relHref && "#" === relHref[0]) return this.hash(relHref.slice(1)), !0; | |
var rewrittenUrl, appUrl; | |
return appBase == stripHash(url) ? rewrittenUrl = url : (appUrl = beginsWith(appBaseNoFile, url)) ? rewrittenUrl = appBase + hashPrefix + appUrl : appBaseNoFile === url + "/" && (rewrittenUrl = appBaseNoFile), rewrittenUrl && this.$$parse(rewrittenUrl), !!rewrittenUrl }, this.$$compose = function() { | |
var search = toKeyValue(this.$$search), | |
hash = this.$$hash ? "#" + encodeUriSegment(this.$$hash) : ""; | |
this.$$url = encodePath(this.$$path) + (search ? "?" + search : "") + hash, this.$$absUrl = appBase + hashPrefix + this.$$url } } | |
function locationGetter(property) { | |
return function() { | |
return this[property] } } | |
function locationGetterSetter(property, preprocess) { | |
return function(value) { | |
return isUndefined(value) ? this[property] : (this[property] = preprocess(value), this.$$compose(), this) } } | |
function $LocationProvider() { | |
var hashPrefix = "", | |
html5Mode = { enabled: !1, requireBase: !0, rewriteLinks: !0 }; | |
this.hashPrefix = function(prefix) { | |
return isDefined(prefix) ? (hashPrefix = prefix, this) : hashPrefix }, this.html5Mode = function(mode) { | |
return isBoolean(mode) ? (html5Mode.enabled = mode, this) : isObject(mode) ? (isBoolean(mode.enabled) && (html5Mode.enabled = mode.enabled), isBoolean(mode.requireBase) && (html5Mode.requireBase = mode.requireBase), isBoolean(mode.rewriteLinks) && (html5Mode.rewriteLinks = mode.rewriteLinks), this) : html5Mode }, this.$get = ["$rootScope", "$browser", "$sniffer", "$rootElement", function($rootScope, $browser, $sniffer, $rootElement) { | |
function setBrowserUrlWithFallback(url, replace, state) { | |
var oldUrl = $location.url(), | |
oldState = $location.$$state; | |
try { $browser.url(url, replace, state), $location.$$state = $browser.state() } catch (e) { | |
throw $location.url(oldUrl), $location.$$state = oldState, e } } | |
function afterLocationChange(oldUrl, oldState) { $rootScope.$broadcast("$locationChangeSuccess", $location.absUrl(), oldUrl, $location.$$state, oldState) } | |
var $location, LocationMode, appBase, baseHref = $browser.baseHref(), | |
initialUrl = $browser.url(); | |
if (html5Mode.enabled) { | |
if (!baseHref && html5Mode.requireBase) throw $locationMinErr("nobase", "$location in HTML5 mode requires a <base> tag to be present!"); | |
appBase = serverBase(initialUrl) + (baseHref || "/"), LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url } else appBase = stripHash(initialUrl), LocationMode = LocationHashbangUrl; | |
$location = new LocationMode(appBase, "#" + hashPrefix), $location.$$parseLinkUrl(initialUrl, initialUrl), $location.$$state = $browser.state(); | |
var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i; | |
$rootElement.on("click", function(event) { | |
if (html5Mode.rewriteLinks && !event.ctrlKey && !event.metaKey && 2 != event.which) { | |
for (var elm = jqLite(event.target); | |
"a" !== nodeName_(elm[0]);) | |
if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; | |
var absHref = elm.prop("href"), | |
relHref = elm.attr("href") || elm.attr("xlink:href"); | |
isObject(absHref) && "[object SVGAnimatedString]" === absHref.toString() && (absHref = urlResolve(absHref.animVal).href), IGNORE_URI_REGEXP.test(absHref) || !absHref || elm.attr("target") || event.isDefaultPrevented() || $location.$$parseLinkUrl(absHref, relHref) && (event.preventDefault(), $location.absUrl() != $browser.url() && ($rootScope.$apply(), window.angular["ff-684208-preventDefault"] = !0)) } }), $location.absUrl() != initialUrl && $browser.url($location.absUrl(), !0); | |
var initializing = !0; | |
return $browser.onUrlChange(function(newUrl, newState) { $rootScope.$evalAsync(function() { | |
var defaultPrevented, oldUrl = $location.absUrl(), | |
oldState = $location.$$state; | |
$location.$$parse(newUrl), $location.$$state = newState, defaultPrevented = $rootScope.$broadcast("$locationChangeStart", newUrl, oldUrl, newState, oldState).defaultPrevented, $location.absUrl() === newUrl && (defaultPrevented ? ($location.$$parse(oldUrl), $location.$$state = oldState, setBrowserUrlWithFallback(oldUrl, !1, oldState)) : (initializing = !1, afterLocationChange(oldUrl, oldState))) }), $rootScope.$$phase || $rootScope.$digest() }), $rootScope.$watch(function() { | |
var oldUrl = $browser.url(), | |
oldState = $browser.state(), | |
currentReplace = $location.$$replace, | |
urlOrStateChanged = oldUrl !== $location.absUrl() || $location.$$html5 && $sniffer.history && oldState !== $location.$$state; | |
(initializing || urlOrStateChanged) && (initializing = !1, $rootScope.$evalAsync(function() { | |
var newUrl = $location.absUrl(), | |
defaultPrevented = $rootScope.$broadcast("$locationChangeStart", newUrl, oldUrl, $location.$$state, oldState).defaultPrevented; | |
$location.absUrl() === newUrl && (defaultPrevented ? ($location.$$parse(oldUrl), $location.$$state = oldState) : (urlOrStateChanged && setBrowserUrlWithFallback(newUrl, currentReplace, oldState === $location.$$state ? null : $location.$$state), afterLocationChange(oldUrl, oldState))) })), $location.$$replace = !1 }), $location | |
}] | |
} | |
function $LogProvider() { | |
var debug = !0, | |
self = this; | |
this.debugEnabled = function(flag) { | |
return isDefined(flag) ? (debug = flag, this) : debug }, this.$get = ["$window", function($window) { | |
function formatError(arg) { | |
return arg instanceof Error && (arg.stack ? arg = arg.message && -1 === arg.stack.indexOf(arg.message) ? "Error: " + arg.message + "\n" + arg.stack : arg.stack : arg.sourceURL && (arg = arg.message + "\n" + arg.sourceURL + ":" + arg.line)), arg } | |
function consoleLog(type) { | |
var console = $window.console || {}, | |
logFn = console[type] || console.log || noop, | |
hasApply = !1; | |
try { hasApply = !!logFn.apply } catch (e) {} | |
return hasApply ? function() { | |
var args = []; | |
return forEach(arguments, function(arg) { args.push(formatError(arg)) }), logFn.apply(console, args) } : function(arg1, arg2) { logFn(arg1, null == arg2 ? "" : arg2) } } | |
return { log: consoleLog("log"), info: consoleLog("info"), warn: consoleLog("warn"), error: consoleLog("error"), debug: function() { | |
var fn = consoleLog("debug"); | |
return function() { debug && fn.apply(self, arguments) } }() } }] } | |
function ensureSafeMemberName(name, fullExpression) { | |
if ("__defineGetter__" === name || "__defineSetter__" === name || "__lookupGetter__" === name || "__lookupSetter__" === name || "__proto__" === name) throw $parseMinErr("isecfld", "Attempting to access a disallowed field in Angular expressions! Expression: {0}", fullExpression); | |
return name } | |
function ensureSafeObject(obj, fullExpression) { | |
if (obj) { | |
if (obj.constructor === obj) throw $parseMinErr("isecfn", "Referencing Function in Angular expressions is disallowed! Expression: {0}", fullExpression); | |
if (obj.window === obj) throw $parseMinErr("isecwindow", "Referencing the Window in Angular expressions is disallowed! Expression: {0}", fullExpression); | |
if (obj.children && (obj.nodeName || obj.prop && obj.attr && obj.find)) throw $parseMinErr("isecdom", "Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}", fullExpression); | |
if (obj === Object) throw $parseMinErr("isecobj", "Referencing Object in Angular expressions is disallowed! Expression: {0}", fullExpression) } | |
return obj } | |
function ensureSafeFunction(obj, fullExpression) { | |
if (obj) { | |
if (obj.constructor === obj) throw $parseMinErr("isecfn", "Referencing Function in Angular expressions is disallowed! Expression: {0}", fullExpression); | |
if (obj === CALL || obj === APPLY || obj === BIND) throw $parseMinErr("isecff", "Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}", fullExpression) } } | |
function isConstant(exp) { | |
return exp.constant } | |
function setter(obj, path, setValue, fullExp) { ensureSafeObject(obj, fullExp); | |
for (var key, element = path.split("."), i = 0; element.length > 1; i++) { key = ensureSafeMemberName(element.shift(), fullExp); | |
var propertyObj = ensureSafeObject(obj[key], fullExp); | |
propertyObj || (propertyObj = {}, obj[key] = propertyObj), obj = propertyObj } | |
return key = ensureSafeMemberName(element.shift(), fullExp), ensureSafeObject(obj[key], fullExp), obj[key] = setValue, setValue } | |
function isPossiblyDangerousMemberName(name) { | |
return "constructor" == name } | |
function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, expensiveChecks) { ensureSafeMemberName(key0, fullExp), ensureSafeMemberName(key1, fullExp), ensureSafeMemberName(key2, fullExp), ensureSafeMemberName(key3, fullExp), ensureSafeMemberName(key4, fullExp); | |
var eso = function(o) { | |
return ensureSafeObject(o, fullExp) }, | |
eso0 = expensiveChecks || isPossiblyDangerousMemberName(key0) ? eso : identity, | |
eso1 = expensiveChecks || isPossiblyDangerousMemberName(key1) ? eso : identity, | |
eso2 = expensiveChecks || isPossiblyDangerousMemberName(key2) ? eso : identity, | |
eso3 = expensiveChecks || isPossiblyDangerousMemberName(key3) ? eso : identity, | |
eso4 = expensiveChecks || isPossiblyDangerousMemberName(key4) ? eso : identity; | |
return function(scope, locals) { | |
var pathVal = locals && locals.hasOwnProperty(key0) ? locals : scope; | |
return null == pathVal ? pathVal : (pathVal = eso0(pathVal[key0]), key1 ? null == pathVal ? undefined : (pathVal = eso1(pathVal[key1]), key2 ? null == pathVal ? undefined : (pathVal = eso2(pathVal[key2]), key3 ? null == pathVal ? undefined : (pathVal = eso3(pathVal[key3]), key4 ? null == pathVal ? undefined : pathVal = eso4(pathVal[key4]) : pathVal) : pathVal) : pathVal) : pathVal) } } | |
function getterFnWithEnsureSafeObject(fn, fullExpression) { | |
return function(s, l) { | |
return fn(s, l, ensureSafeObject, fullExpression) } } | |
function getterFn(path, options, fullExp) { | |
var expensiveChecks = options.expensiveChecks, | |
getterFnCache = expensiveChecks ? getterFnCacheExpensive : getterFnCacheDefault, | |
fn = getterFnCache[path]; | |
if (fn) return fn; | |
var pathKeys = path.split("."), | |
pathKeysLength = pathKeys.length; | |
if (options.csp) fn = 6 > pathKeysLength ? cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp, expensiveChecks) : function(scope, locals) { | |
var val, i = 0; | |
do val = cspSafeGetterFn(pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++], fullExp, expensiveChecks)(scope, locals), locals = undefined, scope = val; while (pathKeysLength > i); | |
return val }; | |
else { | |
var code = ""; | |
expensiveChecks && (code += "s = eso(s, fe);\nl = eso(l, fe);\n"); | |
var needsEnsureSafeObject = expensiveChecks; | |
forEach(pathKeys, function(key, index) { ensureSafeMemberName(key, fullExp); | |
var lookupJs = (index ? "s" : '((l&&l.hasOwnProperty("' + key + '"))?l:s)') + "." + key; | |
(expensiveChecks || isPossiblyDangerousMemberName(key)) && (lookupJs = "eso(" + lookupJs + ", fe)", needsEnsureSafeObject = !0), code += "if(s == null) return undefined;\ns=" + lookupJs + ";\n" }), code += "return s;"; | |
var evaledFnGetter = new Function("s", "l", "eso", "fe", code); | |
evaledFnGetter.toString = valueFn(code), needsEnsureSafeObject && (evaledFnGetter = getterFnWithEnsureSafeObject(evaledFnGetter, fullExp)), fn = evaledFnGetter } | |
return fn.sharedGetter = !0, fn.assign = function(self, value) { | |
return setter(self, path, value, path) }, getterFnCache[path] = fn, fn } | |
function getValueOf(value) { | |
return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value) } | |
function $ParseProvider() { | |
var cacheDefault = createMap(), | |
cacheExpensive = createMap(); | |
this.$get = ["$filter", "$sniffer", function($filter, $sniffer) { | |
function wrapSharedExpression(exp) { | |
var wrapped = exp; | |
return exp.sharedGetter && (wrapped = function(self, locals) { | |
return exp(self, locals) }, wrapped.literal = exp.literal, wrapped.constant = exp.constant, wrapped.assign = exp.assign), wrapped } | |
function collectExpressionInputs(inputs, list) { | |
for (var i = 0, ii = inputs.length; ii > i; i++) { | |
var input = inputs[i]; | |
input.constant || (input.inputs ? collectExpressionInputs(input.inputs, list) : -1 === list.indexOf(input) && list.push(input)) } | |
return list } | |
function expressionInputDirtyCheck(newValue, oldValueOfValue) { | |
return null == newValue || null == oldValueOfValue ? newValue === oldValueOfValue : "object" == typeof newValue && (newValue = getValueOf(newValue), "object" == typeof newValue) ? !1 : newValue === oldValueOfValue || newValue !== newValue && oldValueOfValue !== oldValueOfValue } | |
function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression) { | |
var lastResult, inputExpressions = parsedExpression.$$inputs || (parsedExpression.$$inputs = collectExpressionInputs(parsedExpression.inputs, [])); | |
if (1 === inputExpressions.length) { | |
var oldInputValue = expressionInputDirtyCheck; | |
return inputExpressions = inputExpressions[0], scope.$watch(function(scope) { | |
var newInputValue = inputExpressions(scope); | |
return expressionInputDirtyCheck(newInputValue, oldInputValue) || (lastResult = parsedExpression(scope), oldInputValue = newInputValue && getValueOf(newInputValue)), lastResult }, listener, objectEquality) } | |
for (var oldInputValueOfValues = [], i = 0, ii = inputExpressions.length; ii > i; i++) oldInputValueOfValues[i] = expressionInputDirtyCheck; | |
return scope.$watch(function(scope) { | |
for (var changed = !1, i = 0, ii = inputExpressions.length; ii > i; i++) { | |
var newInputValue = inputExpressions[i](scope); | |
(changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) && (oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue)) } | |
return changed && (lastResult = parsedExpression(scope)), lastResult }, listener, objectEquality) } | |
function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) { | |
var unwatch, lastValue; | |
return unwatch = scope.$watch(function(scope) { | |
return parsedExpression(scope) }, function(value, old, scope) { lastValue = value, isFunction(listener) && listener.apply(this, arguments), isDefined(value) && scope.$$postDigest(function() { isDefined(lastValue) && unwatch() }) }, objectEquality) } | |
function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) { | |
function isAllDefined(value) { | |
var allDefined = !0; | |
return forEach(value, function(val) { isDefined(val) || (allDefined = !1) }), allDefined } | |
var unwatch, lastValue; | |
return unwatch = scope.$watch(function(scope) { | |
return parsedExpression(scope) }, function(value, old, scope) { lastValue = value, isFunction(listener) && listener.call(this, value, old, scope), isAllDefined(value) && scope.$$postDigest(function() { isAllDefined(lastValue) && unwatch() }) }, objectEquality) } | |
function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) { | |
var unwatch; | |
return unwatch = scope.$watch(function(scope) { | |
return parsedExpression(scope) }, function() { isFunction(listener) && listener.apply(this, arguments), unwatch() }, objectEquality) } | |
function addInterceptor(parsedExpression, interceptorFn) { | |
if (!interceptorFn) return parsedExpression; | |
var watchDelegate = parsedExpression.$$watchDelegate, | |
regularWatch = watchDelegate !== oneTimeLiteralWatchDelegate && watchDelegate !== oneTimeWatchDelegate, | |
fn = regularWatch ? function(scope, locals) { | |
var value = parsedExpression(scope, locals); | |
return interceptorFn(value, scope, locals) } : function(scope, locals) { | |
var value = parsedExpression(scope, locals), | |
result = interceptorFn(value, scope, locals); | |
return isDefined(value) ? result : value }; | |
return parsedExpression.$$watchDelegate && parsedExpression.$$watchDelegate !== inputsWatchDelegate ? fn.$$watchDelegate = parsedExpression.$$watchDelegate : interceptorFn.$stateful || (fn.$$watchDelegate = inputsWatchDelegate, fn.inputs = [parsedExpression]), fn } | |
var $parseOptions = { csp: $sniffer.csp, expensiveChecks: !1 }, | |
$parseOptionsExpensive = { csp: $sniffer.csp, expensiveChecks: !0 }; | |
return function(exp, interceptorFn, expensiveChecks) { | |
var parsedExpression, oneTime, cacheKey; | |
switch (typeof exp) { | |
case "string": | |
cacheKey = exp = exp.trim(); | |
var cache = expensiveChecks ? cacheExpensive : cacheDefault; | |
if (parsedExpression = cache[cacheKey], !parsedExpression) { ":" === exp.charAt(0) && ":" === exp.charAt(1) && (oneTime = !0, exp = exp.substring(2)); | |
var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions, | |
lexer = new Lexer(parseOptions), | |
parser = new Parser(lexer, $filter, parseOptions); | |
parsedExpression = parser.parse(exp), parsedExpression.constant ? parsedExpression.$$watchDelegate = constantWatchDelegate : oneTime ? (parsedExpression = wrapSharedExpression(parsedExpression), parsedExpression.$$watchDelegate = parsedExpression.literal ? oneTimeLiteralWatchDelegate : oneTimeWatchDelegate) : parsedExpression.inputs && (parsedExpression.$$watchDelegate = inputsWatchDelegate), cache[cacheKey] = parsedExpression } | |
return addInterceptor(parsedExpression, interceptorFn); | |
case "function": | |
return addInterceptor(exp, interceptorFn); | |
default: | |
return addInterceptor(noop, interceptorFn) } } }] } | |
function $QProvider() { this.$get = ["$rootScope", "$exceptionHandler", function($rootScope, $exceptionHandler) { | |
return qFactory(function(callback) { $rootScope.$evalAsync(callback) }, $exceptionHandler) }] } | |
function $$QProvider() { this.$get = ["$browser", "$exceptionHandler", function($browser, $exceptionHandler) { | |
return qFactory(function(callback) { $browser.defer(callback) }, $exceptionHandler) }] } | |
function qFactory(nextTick, exceptionHandler) { | |
function callOnce(self, resolveFn, rejectFn) { | |
function wrap(fn) { | |
return function(value) { called || (called = !0, fn.call(self, value)) } } | |
var called = !1; | |
return [wrap(resolveFn), wrap(rejectFn)] } | |
function Promise() { this.$$state = { status: 0 } } | |
function simpleBind(context, fn) { | |
return function(value) { fn.call(context, value) } } | |
function processQueue(state) { | |
var fn, promise, pending; | |
pending = state.pending, state.processScheduled = !1, state.pending = undefined; | |
for (var i = 0, ii = pending.length; ii > i; ++i) { promise = pending[i][0], fn = pending[i][state.status]; | |
try { isFunction(fn) ? promise.resolve(fn(state.value)) : 1 === state.status ? promise.resolve(state.value) : promise.reject(state.value) } catch (e) { promise.reject(e), exceptionHandler(e) } } } | |
function scheduleProcessQueue(state) {!state.processScheduled && state.pending && (state.processScheduled = !0, nextTick(function() { processQueue(state) })) } | |
function Deferred() { this.promise = new Promise, this.resolve = simpleBind(this, this.resolve), this.reject = simpleBind(this, this.reject), this.notify = simpleBind(this, this.notify) } | |
function all(promises) { | |
var deferred = new Deferred, | |
counter = 0, | |
results = isArray(promises) ? [] : {}; | |
return forEach(promises, function(promise, key) { counter++, when(promise).then(function(value) { results.hasOwnProperty(key) || (results[key] = value, --counter || deferred.resolve(results)) }, function(reason) { results.hasOwnProperty(key) || deferred.reject(reason) }) }), 0 === counter && deferred.resolve(results), deferred.promise } | |
var $qMinErr = minErr("$q", TypeError), | |
defer = function() { | |
return new Deferred }; | |
Promise.prototype = { then: function(onFulfilled, onRejected, progressBack) { | |
var result = new Deferred; | |
return this.$$state.pending = this.$$state.pending || [], this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]), this.$$state.status > 0 && scheduleProcessQueue(this.$$state), result.promise }, "catch": function(callback) { | |
return this.then(null, callback) }, "finally": function(callback, progressBack) { | |
return this.then(function(value) { | |
return handleCallback(value, !0, callback) }, function(error) { | |
return handleCallback(error, !1, callback) }, progressBack) } }, Deferred.prototype = { resolve: function(val) { this.promise.$$state.status || (val === this.promise ? this.$$reject($qMinErr("qcycle", "Expected promise to be resolved with value other than itself '{0}'", val)) : this.$$resolve(val)) }, $$resolve: function(val) { | |
var then, fns; | |
fns = callOnce(this, this.$$resolve, this.$$reject); | |
try { | |
(isObject(val) || isFunction(val)) && (then = val && val.then), isFunction(then) ? (this.promise.$$state.status = -1, then.call(val, fns[0], fns[1], this.notify)) : (this.promise.$$state.value = val, this.promise.$$state.status = 1, scheduleProcessQueue(this.promise.$$state)) } catch (e) { fns[1](e), exceptionHandler(e) } }, reject: function(reason) { this.promise.$$state.status || this.$$reject(reason) }, $$reject: function(reason) { this.promise.$$state.value = reason, this.promise.$$state.status = 2, scheduleProcessQueue(this.promise.$$state) }, notify: function(progress) { | |
var callbacks = this.promise.$$state.pending; | |
this.promise.$$state.status <= 0 && callbacks && callbacks.length && nextTick(function() { | |
for (var callback, result, i = 0, ii = callbacks.length; ii > i; i++) { result = callbacks[i][0], callback = callbacks[i][3]; | |
try { result.notify(isFunction(callback) ? callback(progress) : progress) } catch (e) { exceptionHandler(e) } } }) } }; | |
var reject = function(reason) { | |
var result = new Deferred; | |
return result.reject(reason), result.promise }, | |
makePromise = function(value, resolved) { | |
var result = new Deferred; | |
return resolved ? result.resolve(value) : result.reject(value), result.promise }, | |
handleCallback = function(value, isResolved, callback) { | |
var callbackOutput = null; | |
try { isFunction(callback) && (callbackOutput = callback()) } catch (e) { | |
return makePromise(e, !1) } | |
return isPromiseLike(callbackOutput) ? callbackOutput.then(function() { | |
return makePromise(value, isResolved) }, function(error) { | |
return makePromise(error, !1) }) : makePromise(value, isResolved) }, | |
when = function(value, callback, errback, progressBack) { | |
var result = new Deferred; | |
return result.resolve(value), result.promise.then(callback, errback, progressBack) }, | |
$Q = function Q(resolver) { | |
function resolveFn(value) { deferred.resolve(value) } | |
function rejectFn(reason) { deferred.reject(reason) } | |
if (!isFunction(resolver)) throw $qMinErr("norslvr", "Expected resolverFn, got '{0}'", resolver); | |
if (!(this instanceof Q)) return new Q(resolver); | |
var deferred = new Deferred; | |
return resolver(resolveFn, rejectFn), deferred.promise }; | |
return $Q.defer = defer, $Q.reject = reject, $Q.when = when, $Q.all = all, $Q } | |
function $$RAFProvider() { this.$get = ["$window", "$timeout", function($window, $timeout) { | |
var requestAnimationFrame = $window.requestAnimationFrame || $window.webkitRequestAnimationFrame || $window.mozRequestAnimationFrame, | |
cancelAnimationFrame = $window.cancelAnimationFrame || $window.webkitCancelAnimationFrame || $window.mozCancelAnimationFrame || $window.webkitCancelRequestAnimationFrame, | |
rafSupported = !!requestAnimationFrame, | |
raf = rafSupported ? function(fn) { | |
var id = requestAnimationFrame(fn); | |
return function() { cancelAnimationFrame(id) } } : function(fn) { | |
var timer = $timeout(fn, 16.66, !1); | |
return function() { $timeout.cancel(timer) } }; | |
return raf.supported = rafSupported, raf }] } | |
function $RootScopeProvider() { | |
var TTL = 10, | |
$rootScopeMinErr = minErr("$rootScope"), | |
lastDirtyWatch = null, | |
applyAsyncId = null; | |
this.digestTtl = function(value) { | |
return arguments.length && (TTL = value), TTL }, this.$get = ["$injector", "$exceptionHandler", "$parse", "$browser", function($injector, $exceptionHandler, $parse, $browser) { | |
function Scope() { this.$id = nextUid(), this.$$phase = this.$parent = this.$$watchers = this.$$nextSibling = this.$$prevSibling = this.$$childHead = this.$$childTail = null, this.$root = this, this.$$destroyed = !1, this.$$listeners = {}, this.$$listenerCount = {}, this.$$isolateBindings = null } | |
function beginPhase(phase) { | |
if ($rootScope.$$phase) throw $rootScopeMinErr("inprog", "{0} already in progress", $rootScope.$$phase); | |
$rootScope.$$phase = phase } | |
function clearPhase() { $rootScope.$$phase = null } | |
function decrementListenerCount(current, count, name) { do current.$$listenerCount[name] -= count, 0 === current.$$listenerCount[name] && delete current.$$listenerCount[name]; while (current = current.$parent) } | |
function initWatchVal() {} | |
function flushApplyAsync() { | |
for (; applyAsyncQueue.length;) try { applyAsyncQueue.shift()() } catch (e) { $exceptionHandler(e) } | |
applyAsyncId = null } | |
function scheduleApplyAsync() { null === applyAsyncId && (applyAsyncId = $browser.defer(function() { $rootScope.$apply(flushApplyAsync) })) } | |
Scope.prototype = { constructor: Scope, $new: function(isolate, parent) { | |
function destroyChild() { child.$$destroyed = !0 } | |
var child; | |
return parent = parent || this, isolate ? (child = new Scope, child.$root = this.$root) : (this.$$ChildScope || (this.$$ChildScope = function() { this.$$watchers = this.$$nextSibling = this.$$childHead = this.$$childTail = null, this.$$listeners = {}, this.$$listenerCount = {}, this.$id = nextUid(), this.$$ChildScope = null }, this.$$ChildScope.prototype = this), child = new this.$$ChildScope), child.$parent = parent, child.$$prevSibling = parent.$$childTail, parent.$$childHead ? (parent.$$childTail.$$nextSibling = child, parent.$$childTail = child) : parent.$$childHead = parent.$$childTail = child, (isolate || parent != this) && child.$on("$destroy", destroyChild), child }, $watch: function(watchExp, listener, objectEquality) { | |
var get = $parse(watchExp); | |
if (get.$$watchDelegate) return get.$$watchDelegate(this, listener, objectEquality, get); | |
var scope = this, | |
array = scope.$$watchers, | |
watcher = { fn: listener, last: initWatchVal, get: get, exp: watchExp, eq: !!objectEquality }; | |
return lastDirtyWatch = null, isFunction(listener) || (watcher.fn = noop), array || (array = scope.$$watchers = []), array.unshift(watcher), | |
function() { arrayRemove(array, watcher), lastDirtyWatch = null } }, $watchGroup: function(watchExpressions, listener) { | |
function watchGroupAction() { changeReactionScheduled = !1, firstRun ? (firstRun = !1, listener(newValues, newValues, self)) : listener(newValues, oldValues, self) } | |
var oldValues = new Array(watchExpressions.length), | |
newValues = new Array(watchExpressions.length), | |
deregisterFns = [], | |
self = this, | |
changeReactionScheduled = !1, | |
firstRun = !0; | |
if (!watchExpressions.length) { | |
var shouldCall = !0; | |
return self.$evalAsync(function() { shouldCall && listener(newValues, newValues, self) }), | |
function() { shouldCall = !1 } } | |
return 1 === watchExpressions.length ? this.$watch(watchExpressions[0], function(value, oldValue, scope) { newValues[0] = value, oldValues[0] = oldValue, listener(newValues, value === oldValue ? newValues : oldValues, scope) }) : (forEach(watchExpressions, function(expr, i) { | |
var unwatchFn = self.$watch(expr, function(value, oldValue) { newValues[i] = value, oldValues[i] = oldValue, changeReactionScheduled || (changeReactionScheduled = !0, self.$evalAsync(watchGroupAction)) }); | |
deregisterFns.push(unwatchFn) }), function() { | |
for (; deregisterFns.length;) deregisterFns.shift()() }) }, $watchCollection: function(obj, listener) { | |
function $watchCollectionInterceptor(_value) { newValue = _value; | |
var newLength, key, bothNaN, newItem, oldItem; | |
if (!isUndefined(newValue)) { | |
if (isObject(newValue)) | |
if (isArrayLike(newValue)) { oldValue !== internalArray && (oldValue = internalArray, oldLength = oldValue.length = 0, changeDetected++), newLength = newValue.length, oldLength !== newLength && (changeDetected++, oldValue.length = oldLength = newLength); | |
for (var i = 0; newLength > i; i++) oldItem = oldValue[i], newItem = newValue[i], bothNaN = oldItem !== oldItem && newItem !== newItem, bothNaN || oldItem === newItem || (changeDetected++, oldValue[i] = newItem) } else { oldValue !== internalObject && (oldValue = internalObject = {}, oldLength = 0, changeDetected++), newLength = 0; | |
for (key in newValue) newValue.hasOwnProperty(key) && (newLength++, newItem = newValue[key], oldItem = oldValue[key], key in oldValue ? (bothNaN = oldItem !== oldItem && newItem !== newItem, bothNaN || oldItem === newItem || (changeDetected++, oldValue[key] = newItem)) : (oldLength++, oldValue[key] = newItem, changeDetected++)); | |
if (oldLength > newLength) { changeDetected++; | |
for (key in oldValue) newValue.hasOwnProperty(key) || (oldLength--, delete oldValue[key]) } } | |
else oldValue !== newValue && (oldValue = newValue, changeDetected++); | |
return changeDetected } } | |
function $watchCollectionAction() { | |
if (initRun ? (initRun = !1, listener(newValue, newValue, self)) : listener(newValue, veryOldValue, self), trackVeryOldValue) | |
if (isObject(newValue)) | |
if (isArrayLike(newValue)) { veryOldValue = new Array(newValue.length); | |
for (var i = 0; i < newValue.length; i++) veryOldValue[i] = newValue[i] } else { veryOldValue = {}; | |
for (var key in newValue) hasOwnProperty.call(newValue, key) && (veryOldValue[key] = newValue[key]) } | |
else veryOldValue = newValue } | |
$watchCollectionInterceptor.$stateful = !0; | |
var newValue, oldValue, veryOldValue, self = this, | |
trackVeryOldValue = listener.length > 1, | |
changeDetected = 0, | |
changeDetector = $parse(obj, $watchCollectionInterceptor), | |
internalArray = [], | |
internalObject = {}, | |
initRun = !0, | |
oldLength = 0; | |
return this.$watch(changeDetector, $watchCollectionAction) }, $digest: function() { | |
var watch, value, last, watchers, length, dirty, next, current, logIdx, asyncTask, ttl = TTL, | |
target = this, | |
watchLog = []; | |
beginPhase("$digest"), $browser.$$checkUrlChange(), this === $rootScope && null !== applyAsyncId && ($browser.defer.cancel(applyAsyncId), flushApplyAsync()), lastDirtyWatch = null; | |
do { | |
for (dirty = !1, current = target; asyncQueue.length;) { | |
try { asyncTask = asyncQueue.shift(), asyncTask.scope.$eval(asyncTask.expression) } catch (e) { $exceptionHandler(e) } | |
lastDirtyWatch = null } | |
traverseScopesLoop: do { | |
if (watchers = current.$$watchers) | |
for (length = watchers.length; length--;) try { | |
if (watch = watchers[length]) | |
if ((value = watch.get(current)) === (last = watch.last) || (watch.eq ? equals(value, last) : "number" == typeof value && "number" == typeof last && isNaN(value) && isNaN(last))) { | |
if (watch === lastDirtyWatch) { dirty = !1; | |
break traverseScopesLoop } } else dirty = !0, lastDirtyWatch = watch, watch.last = watch.eq ? copy(value, null) : value, watch.fn(value, last === initWatchVal ? value : last, current), 5 > ttl && (logIdx = 4 - ttl, watchLog[logIdx] || (watchLog[logIdx] = []), watchLog[logIdx].push({ msg: isFunction(watch.exp) ? "fn: " + (watch.exp.name || watch.exp.toString()) : watch.exp, newVal: value, oldVal: last })) } catch (e) { $exceptionHandler(e) } | |
if (!(next = current.$$childHead || current !== target && current.$$nextSibling)) | |
for (; current !== target && !(next = current.$$nextSibling);) current = current.$parent } while (current = next); | |
if ((dirty || asyncQueue.length) && !ttl--) throw clearPhase(), $rootScopeMinErr("infdig", "{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}", TTL, watchLog) } while (dirty || asyncQueue.length); | |
for (clearPhase(); postDigestQueue.length;) try { postDigestQueue.shift()() } catch (e) { $exceptionHandler(e) } }, $destroy: function() { | |
if (!this.$$destroyed) { | |
var parent = this.$parent; | |
if (this.$broadcast("$destroy"), this.$$destroyed = !0, this !== $rootScope) { | |
for (var eventName in this.$$listenerCount) decrementListenerCount(this, this.$$listenerCount[eventName], eventName); | |
parent.$$childHead == this && (parent.$$childHead = this.$$nextSibling), parent.$$childTail == this && (parent.$$childTail = this.$$prevSibling), this.$$prevSibling && (this.$$prevSibling.$$nextSibling = this.$$nextSibling), this.$$nextSibling && (this.$$nextSibling.$$prevSibling = this.$$prevSibling), this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop, this.$on = this.$watch = this.$watchGroup = function() { | |
return noop }, this.$$listeners = {}, this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = this.$$childTail = this.$root = this.$$watchers = null } } }, $eval: function(expr, locals) { | |
return $parse(expr)(this, locals) }, $evalAsync: function(expr) { $rootScope.$$phase || asyncQueue.length || $browser.defer(function() { asyncQueue.length && $rootScope.$digest() }), asyncQueue.push({ scope: this, expression: expr }) }, $$postDigest: function(fn) { postDigestQueue.push(fn) }, $apply: function(expr) { | |
try { | |
return beginPhase("$apply"), this.$eval(expr) } catch (e) { $exceptionHandler(e) } finally { clearPhase(); | |
try { $rootScope.$digest() } catch (e) { | |
throw $exceptionHandler(e), e } } }, $applyAsync: function(expr) { | |
function $applyAsyncExpression() { scope.$eval(expr) } | |
var scope = this; | |
expr && applyAsyncQueue.push($applyAsyncExpression), scheduleApplyAsync() }, $on: function(name, listener) { | |
var namedListeners = this.$$listeners[name]; | |
namedListeners || (this.$$listeners[name] = namedListeners = []), namedListeners.push(listener); | |
var current = this; | |
do current.$$listenerCount[name] || (current.$$listenerCount[name] = 0), current.$$listenerCount[name]++; while (current = current.$parent); | |
var self = this; | |
return function() { | |
var indexOfListener = namedListeners.indexOf(listener); - 1 !== indexOfListener && (namedListeners[indexOfListener] = null, decrementListenerCount(self, 1, name)) } }, $emit: function(name) { | |
var namedListeners, i, length, empty = [], | |
scope = this, | |
stopPropagation = !1, | |
event = { name: name, targetScope: scope, stopPropagation: function() { stopPropagation = !0 }, preventDefault: function() { event.defaultPrevented = !0 }, defaultPrevented: !1 }, | |
listenerArgs = concat([event], arguments, 1); | |
do { | |
for (namedListeners = scope.$$listeners[name] || empty, event.currentScope = scope, i = 0, length = namedListeners.length; length > i; i++) | |
if (namedListeners[i]) try { namedListeners[i].apply(null, listenerArgs) } catch (e) { $exceptionHandler(e) } else namedListeners.splice(i, 1), i--, length--; | |
if (stopPropagation) return event.currentScope = null, event; | |
scope = scope.$parent } while (scope); | |
return event.currentScope = null, event }, $broadcast: function(name) { | |
var target = this, | |
current = target, | |
next = target, | |
event = { name: name, targetScope: target, preventDefault: function() { event.defaultPrevented = !0 }, defaultPrevented: !1 }; | |
if (!target.$$listenerCount[name]) return event; | |
for (var listeners, i, length, listenerArgs = concat([event], arguments, 1); current = next;) { | |
for (event.currentScope = current, listeners = current.$$listeners[name] || [], i = 0, length = listeners.length; length > i; i++) | |
if (listeners[i]) try { listeners[i].apply(null, listenerArgs) } catch (e) { $exceptionHandler(e) } else listeners.splice(i, 1), i--, length--; | |
if (!(next = current.$$listenerCount[name] && current.$$childHead || current !== target && current.$$nextSibling)) | |
for (; current !== target && !(next = current.$$nextSibling);) current = current.$parent } | |
return event.currentScope = null, event } }; | |
var $rootScope = new Scope, | |
asyncQueue = $rootScope.$$asyncQueue = [], | |
postDigestQueue = $rootScope.$$postDigestQueue = [], | |
applyAsyncQueue = $rootScope.$$applyAsyncQueue = []; | |
return $rootScope }] } | |
function $$SanitizeUriProvider() { | |
var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, | |
imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/; | |
this.aHrefSanitizationWhitelist = function(regexp) { | |
return isDefined(regexp) ? (aHrefSanitizationWhitelist = regexp, this) : aHrefSanitizationWhitelist }, this.imgSrcSanitizationWhitelist = function(regexp) { | |
return isDefined(regexp) ? (imgSrcSanitizationWhitelist = regexp, this) : imgSrcSanitizationWhitelist }, this.$get = function() { | |
return function(uri, isImage) { | |
var normalizedVal, regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist; | |
return normalizedVal = urlResolve(uri).href, "" === normalizedVal || normalizedVal.match(regex) ? uri : "unsafe:" + normalizedVal } } } | |
function adjustMatcher(matcher) { | |
if ("self" === matcher) return matcher; | |
if (isString(matcher)) { | |
if (matcher.indexOf("***") > -1) throw $sceMinErr("iwcard", "Illegal sequence *** in string matcher. String: {0}", matcher); | |
return matcher = escapeForRegexp(matcher).replace("\\*\\*", ".*").replace("\\*", "[^:/.?&;]*"), new RegExp("^" + matcher + "$") } | |
if (isRegExp(matcher)) return new RegExp("^" + matcher.source + "$"); | |
throw $sceMinErr("imatcher", 'Matchers may only be "self", string patterns or RegExp objects') } | |
function adjustMatchers(matchers) { | |
var adjustedMatchers = []; | |
return isDefined(matchers) && forEach(matchers, function(matcher) { adjustedMatchers.push(adjustMatcher(matcher)) }), adjustedMatchers } | |
function $SceDelegateProvider() { | |
this.SCE_CONTEXTS = SCE_CONTEXTS; | |
var resourceUrlWhitelist = ["self"], | |
resourceUrlBlacklist = []; | |
this.resourceUrlWhitelist = function(value) { | |
return arguments.length && (resourceUrlWhitelist = adjustMatchers(value)), resourceUrlWhitelist }, this.resourceUrlBlacklist = function(value) { | |
return arguments.length && (resourceUrlBlacklist = adjustMatchers(value)), resourceUrlBlacklist }, this.$get = ["$injector", function($injector) { | |
function matchUrl(matcher, parsedUrl) { | |
return "self" === matcher ? urlIsSameOrigin(parsedUrl) : !!matcher.exec(parsedUrl.href) } | |
function isResourceUrlAllowedByPolicy(url) { | |
var i, n, parsedUrl = urlResolve(url.toString()), | |
allowed = !1; | |
for (i = 0, n = resourceUrlWhitelist.length; n > i; i++) | |
if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) { allowed = !0; | |
break } | |
if (allowed) | |
for (i = 0, n = resourceUrlBlacklist.length; n > i; i++) | |
if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) { allowed = !1; | |
break } | |
return allowed } | |
function generateHolderType(Base) { | |
var holderType = function(trustedValue) { this.$$unwrapTrustedValue = function() { | |
return trustedValue } }; | |
return Base && (holderType.prototype = new Base), holderType.prototype.valueOf = function() { | |
return this.$$unwrapTrustedValue() }, holderType.prototype.toString = function() { | |
return this.$$unwrapTrustedValue().toString() }, holderType } | |
function trustAs(type, trustedValue) { | |
var Constructor = byType.hasOwnProperty(type) ? byType[type] : null; | |
if (!Constructor) throw $sceMinErr("icontext", "Attempted to trust a value in invalid context. Context: {0}; Value: {1}", type, trustedValue); | |
if (null === trustedValue || trustedValue === undefined || "" === trustedValue) return trustedValue; | |
if ("string" != typeof trustedValue) throw $sceMinErr("itype", "Attempted to trust a non-string value in a content requiring a string: Context: {0}", type); | |
return new Constructor(trustedValue) | |
} | |
function valueOf(maybeTrusted) { | |
return maybeTrusted instanceof trustedValueHolderBase ? maybeTrusted.$$unwrapTrustedValue() : maybeTrusted } | |
function getTrusted(type, maybeTrusted) { | |
if (null === maybeTrusted || maybeTrusted === undefined || "" === maybeTrusted) return maybeTrusted; | |
var constructor = byType.hasOwnProperty(type) ? byType[type] : null; | |
if (constructor && maybeTrusted instanceof constructor) return maybeTrusted.$$unwrapTrustedValue(); | |
if (type === SCE_CONTEXTS.RESOURCE_URL) { | |
if (isResourceUrlAllowedByPolicy(maybeTrusted)) return maybeTrusted; | |
throw $sceMinErr("insecurl", "Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}", maybeTrusted.toString()) } | |
if (type === SCE_CONTEXTS.HTML) return htmlSanitizer(maybeTrusted); | |
throw $sceMinErr("unsafe", "Attempting to use an unsafe value in a safe context.") } | |
var htmlSanitizer = function() { | |
throw $sceMinErr("unsafe", "Attempting to use an unsafe value in a safe context.") }; | |
$injector.has("$sanitize") && (htmlSanitizer = $injector.get("$sanitize")); | |
var trustedValueHolderBase = generateHolderType(), | |
byType = {}; | |
return byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase), byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase), byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase), byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase), byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]), { trustAs: trustAs, getTrusted: getTrusted, valueOf: valueOf } | |
}] | |
} | |
function $SceProvider() { | |
var enabled = !0; | |
this.enabled = function(value) { | |
return arguments.length && (enabled = !!value), enabled }, this.$get = ["$parse", "$sceDelegate", function($parse, $sceDelegate) { | |
if (enabled && 8 > msie) throw $sceMinErr("iequirks", "Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks mode. You can fix this by adding the text <!doctype html> to the top of your HTML document. See http://docs.angularjs.org/api/ng.$sce for more information."); | |
var sce = shallowCopy(SCE_CONTEXTS); | |
sce.isEnabled = function() { | |
return enabled }, sce.trustAs = $sceDelegate.trustAs, sce.getTrusted = $sceDelegate.getTrusted, sce.valueOf = $sceDelegate.valueOf, enabled || (sce.trustAs = sce.getTrusted = function(type, value) { | |
return value }, sce.valueOf = identity), sce.parseAs = function(type, expr) { | |
var parsed = $parse(expr); | |
return parsed.literal && parsed.constant ? parsed : $parse(expr, function(value) { | |
return sce.getTrusted(type, value) }) }; | |
var parse = sce.parseAs, | |
getTrusted = sce.getTrusted, | |
trustAs = sce.trustAs; | |
return forEach(SCE_CONTEXTS, function(enumValue, name) { | |
var lName = lowercase(name); | |
sce[camelCase("parse_as_" + lName)] = function(expr) { | |
return parse(enumValue, expr) }, sce[camelCase("get_trusted_" + lName)] = function(value) { | |
return getTrusted(enumValue, value) }, sce[camelCase("trust_as_" + lName)] = function(value) { | |
return trustAs(enumValue, value) } }), sce }] } | |
function $SnifferProvider() { this.$get = ["$window", "$document", function($window, $document) { | |
var vendorPrefix, match, eventSupport = {}, | |
android = int((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), | |
boxee = /Boxee/i.test(($window.navigator || {}).userAgent), | |
document = $document[0] || {}, | |
vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/, | |
bodyStyle = document.body && document.body.style, | |
transitions = !1, | |
animations = !1; | |
if (bodyStyle) { | |
for (var prop in bodyStyle) | |
if (match = vendorRegex.exec(prop)) { vendorPrefix = match[0], vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1); | |
break } | |
vendorPrefix || (vendorPrefix = "WebkitOpacity" in bodyStyle && "webkit"), transitions = !!("transition" in bodyStyle || vendorPrefix + "Transition" in bodyStyle), animations = !!("animation" in bodyStyle || vendorPrefix + "Animation" in bodyStyle), !android || transitions && animations || (transitions = isString(document.body.style.webkitTransition), animations = isString(document.body.style.webkitAnimation)) } | |
return { history: !(!$window.history || !$window.history.pushState || 4 > android || boxee), hasEvent: function(event) { | |
if ("input" == event && 9 == msie) return !1; | |
if (isUndefined(eventSupport[event])) { | |
var divElm = document.createElement("div"); | |
eventSupport[event] = "on" + event in divElm } | |
return eventSupport[event] }, csp: csp(), vendorPrefix: vendorPrefix, transitions: transitions, animations: animations, android: android } }] } | |
function $TemplateRequestProvider() { this.$get = ["$templateCache", "$http", "$q", function($templateCache, $http, $q) { | |
function handleRequestFn(tpl, ignoreRequestError) { | |
function handleError(resp) { | |
if (self.totalPendingRequests--, !ignoreRequestError) throw $compileMinErr("tpload", "Failed to load template: {0}", tpl); | |
return $q.reject(resp) } | |
var self = handleRequestFn; | |
self.totalPendingRequests++; | |
var transformResponse = $http.defaults && $http.defaults.transformResponse; | |
isArray(transformResponse) ? transformResponse = transformResponse.filter(function(transformer) { | |
return transformer !== defaultHttpResponseTransform }) : transformResponse === defaultHttpResponseTransform && (transformResponse = null); | |
var httpOptions = { cache: $templateCache, transformResponse: transformResponse }; | |
return $http.get(tpl, httpOptions).then(function(response) { | |
var html = response.data; | |
return self.totalPendingRequests--, $templateCache.put(tpl, html), html }, handleError) } | |
return handleRequestFn.totalPendingRequests = 0, handleRequestFn }] } | |
function $$TestabilityProvider() { this.$get = ["$rootScope", "$browser", "$location", function($rootScope, $browser, $location) { | |
var testability = {}; | |
return testability.findBindings = function(element, expression, opt_exactMatch) { | |
var bindings = element.getElementsByClassName("ng-binding"), | |
matches = []; | |
return forEach(bindings, function(binding) { | |
var dataBinding = angular.element(binding).data("$binding"); | |
dataBinding && forEach(dataBinding, function(bindingName) { | |
if (opt_exactMatch) { | |
var matcher = new RegExp("(^|\\s)" + escapeForRegexp(expression) + "(\\s|\\||$)"); | |
matcher.test(bindingName) && matches.push(binding) } else -1 != bindingName.indexOf(expression) && matches.push(binding) }) }), matches }, testability.findModels = function(element, expression, opt_exactMatch) { | |
for (var prefixes = ["ng-", "data-ng-", "ng\\:"], p = 0; p < prefixes.length; ++p) { | |
var attributeEquals = opt_exactMatch ? "=" : "*=", | |
selector = "[" + prefixes[p] + "model" + attributeEquals + '"' + expression + '"]', | |
elements = element.querySelectorAll(selector); | |
if (elements.length) return elements } }, testability.getLocation = function() { | |
return $location.url() }, testability.setLocation = function(url) { url !== $location.url() && ($location.url(url), $rootScope.$digest()) }, testability.whenStable = function(callback) { $browser.notifyWhenNoOutstandingRequests(callback) }, testability }] } | |
function $TimeoutProvider() { this.$get = ["$rootScope", "$browser", "$q", "$$q", "$exceptionHandler", function($rootScope, $browser, $q, $$q, $exceptionHandler) { | |
function timeout(fn, delay, invokeApply) { | |
var timeoutId, skipApply = isDefined(invokeApply) && !invokeApply, | |
deferred = (skipApply ? $$q : $q).defer(), | |
promise = deferred.promise; | |
return timeoutId = $browser.defer(function() { | |
try { deferred.resolve(fn()) } catch (e) { deferred.reject(e), $exceptionHandler(e) } finally { delete deferreds[promise.$$timeoutId] } | |
skipApply || $rootScope.$apply() }, delay), promise.$$timeoutId = timeoutId, deferreds[timeoutId] = deferred, promise } | |
var deferreds = {}; | |
return timeout.cancel = function(promise) { | |
return promise && promise.$$timeoutId in deferreds ? (deferreds[promise.$$timeoutId].reject("canceled"), delete deferreds[promise.$$timeoutId], $browser.defer.cancel(promise.$$timeoutId)) : !1 }, timeout }] } | |
function urlResolve(url) { | |
var href = url; | |
return msie && (urlParsingNode.setAttribute("href", href), href = urlParsingNode.href), urlParsingNode.setAttribute("href", href), { href: urlParsingNode.href, protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, "") : "", host: urlParsingNode.host, search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, "") : "", hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, "") : "", hostname: urlParsingNode.hostname, port: urlParsingNode.port, pathname: "/" === urlParsingNode.pathname.charAt(0) ? urlParsingNode.pathname : "/" + urlParsingNode.pathname } } | |
function urlIsSameOrigin(requestUrl) { | |
var parsed = isString(requestUrl) ? urlResolve(requestUrl) : requestUrl; | |
return parsed.protocol === originUrl.protocol && parsed.host === originUrl.host } | |
function $WindowProvider() { this.$get = valueFn(window) } | |
function $FilterProvider($provide) { | |
function register(name, factory) { | |
if (isObject(name)) { | |
var filters = {}; | |
return forEach(name, function(filter, key) { filters[key] = register(key, filter) }), filters } | |
return $provide.factory(name + suffix, factory) } | |
var suffix = "Filter"; | |
this.register = register, this.$get = ["$injector", function($injector) { | |
return function(name) { | |
return $injector.get(name + suffix) } }], register("currency", currencyFilter), register("date", dateFilter), register("filter", filterFilter), register("json", jsonFilter), register("limitTo", limitToFilter), register("lowercase", lowercaseFilter), register("number", numberFilter), register("orderBy", orderByFilter), register("uppercase", uppercaseFilter) } | |
function filterFilter() { | |
return function(array, expression, comparator) { | |
if (!isArray(array)) return array; | |
var comparatorType = typeof comparator, | |
predicates = []; | |
predicates.check = function(value, index) { | |
for (var j = 0; j < predicates.length; j++) | |
if (!predicates[j](value, index)) return !1; | |
return !0 }, "function" !== comparatorType && (comparator = "boolean" === comparatorType && comparator ? function(obj, text) { | |
return angular.equals(obj, text) } : function(obj, text) { | |
if (obj && text && "object" == typeof obj && "object" == typeof text) { | |
for (var objKey in obj) | |
if ("$" !== objKey.charAt(0) && hasOwnProperty.call(obj, objKey) && comparator(obj[objKey], text[objKey])) return !0; | |
return !1 } | |
return text = ("" + text).toLowerCase(), ("" + obj).toLowerCase().indexOf(text) > -1 }); | |
var search = function(obj, text) { | |
if ("string" == typeof text && "!" === text.charAt(0)) return !search(obj, text.substr(1)); | |
switch (typeof obj) { | |
case "boolean": | |
case "number": | |
case "string": | |
return comparator(obj, text); | |
case "object": | |
switch (typeof text) { | |
case "object": | |
return comparator(obj, text); | |
default: | |
for (var objKey in obj) | |
if ("$" !== objKey.charAt(0) && search(obj[objKey], text)) return !0 } | |
return !1; | |
case "array": | |
for (var i = 0; i < obj.length; i++) | |
if (search(obj[i], text)) return !0; | |
return !1; | |
default: | |
return !1 } }; | |
switch (typeof expression) { | |
case "boolean": | |
case "number": | |
case "string": | |
expression = { $: expression }; | |
case "object": | |
for (var key in expression) ! function(path) { "undefined" != typeof expression[path] && predicates.push(function(value) { | |
return search("$" == path ? value : value && value[path], expression[path]) }) }(key); | |
break; | |
case "function": | |
predicates.push(expression); | |
break; | |
default: | |
return array } | |
for (var filtered = [], j = 0; j < array.length; j++) { | |
var value = array[j]; | |
predicates.check(value, j) && filtered.push(value) } | |
return filtered } } | |
function currencyFilter($locale) { | |
var formats = $locale.NUMBER_FORMATS; | |
return function(amount, currencySymbol, fractionSize) { | |
return isUndefined(currencySymbol) && (currencySymbol = formats.CURRENCY_SYM), isUndefined(fractionSize) && (fractionSize = formats.PATTERNS[1].maxFrac), null == amount ? amount : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize).replace(/\u00A4/g, currencySymbol) } } | |
function numberFilter($locale) { | |
var formats = $locale.NUMBER_FORMATS; | |
return function(number, fractionSize) { | |
return null == number ? number : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize) } } | |
function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { | |
if (!isFinite(number) || isObject(number)) return ""; | |
var isNegative = 0 > number; | |
number = Math.abs(number); | |
var numStr = number + "", | |
formatedText = "", | |
parts = [], | |
hasExponent = !1; | |
if (-1 !== numStr.indexOf("e")) { | |
var match = numStr.match(/([\d\.]+)e(-?)(\d+)/); | |
match && "-" == match[2] && match[3] > fractionSize + 1 ? (numStr = "0", number = 0) : (formatedText = numStr, hasExponent = !0) } | |
if (hasExponent) fractionSize > 0 && number > -1 && 1 > number && (formatedText = number.toFixed(fractionSize)); | |
else { | |
var fractionLen = (numStr.split(DECIMAL_SEP)[1] || "").length; | |
isUndefined(fractionSize) && (fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac)), number = +(Math.round(+(number.toString() + "e" + fractionSize)).toString() + "e" + -fractionSize), 0 === number && (isNegative = !1); | |
var fraction = ("" + number).split(DECIMAL_SEP), | |
whole = fraction[0]; | |
fraction = fraction[1] || ""; | |
var i, pos = 0, | |
lgroup = pattern.lgSize, | |
group = pattern.gSize; | |
if (whole.length >= lgroup + group) | |
for (pos = whole.length - lgroup, i = 0; pos > i; i++)(pos - i) % group === 0 && 0 !== i && (formatedText += groupSep), formatedText += whole.charAt(i); | |
for (i = pos; i < whole.length; i++)(whole.length - i) % lgroup === 0 && 0 !== i && (formatedText += groupSep), formatedText += whole.charAt(i); | |
for (; fraction.length < fractionSize;) fraction += "0"; | |
fractionSize && "0" !== fractionSize && (formatedText += decimalSep + fraction.substr(0, fractionSize)) } | |
return parts.push(isNegative ? pattern.negPre : pattern.posPre, formatedText, isNegative ? pattern.negSuf : pattern.posSuf), parts.join("") } | |
function padNumber(num, digits, trim) { | |
var neg = ""; | |
for (0 > num && (neg = "-", num = -num), num = "" + num; num.length < digits;) num = "0" + num; | |
return trim && (num = num.substr(num.length - digits)), neg + num } | |
function dateGetter(name, size, offset, trim) { | |
return offset = offset || 0, | |
function(date) { | |
var value = date["get" + name](); | |
return (offset > 0 || value > -offset) && (value += offset), 0 === value && -12 == offset && (value = 12), padNumber(value, size, trim) } } | |
function dateStrGetter(name, shortForm) { | |
return function(date, formats) { | |
var value = date["get" + name](), | |
get = uppercase(shortForm ? "SHORT" + name : name); | |
return formats[get][value] } } | |
function timeZoneGetter(date) { | |
var zone = -1 * date.getTimezoneOffset(), | |
paddedZone = zone >= 0 ? "+" : ""; | |
return paddedZone += padNumber(Math[zone > 0 ? "floor" : "ceil"](zone / 60), 2) + padNumber(Math.abs(zone % 60), 2) } | |
function getFirstThursdayOfYear(year) { | |
var dayOfWeekOnFirst = new Date(year, 0, 1).getDay(); | |
return new Date(year, 0, (4 >= dayOfWeekOnFirst ? 5 : 12) - dayOfWeekOnFirst) } | |
function getThursdayThisWeek(datetime) { | |
return new Date(datetime.getFullYear(), datetime.getMonth(), datetime.getDate() + (4 - datetime.getDay())) } | |
function weekGetter(size) { | |
return function(date) { | |
var firstThurs = getFirstThursdayOfYear(date.getFullYear()), | |
thisThurs = getThursdayThisWeek(date), | |
diff = +thisThurs - +firstThurs, | |
result = 1 + Math.round(diff / 6048e5); | |
return padNumber(result, size) } } | |
function ampmGetter(date, formats) { | |
return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1] } | |
function dateFilter($locale) { | |
function jsonStringToDate(string) { | |
var match; | |
if (match = string.match(R_ISO8601_STR)) { | |
var date = new Date(0), | |
tzHour = 0, | |
tzMin = 0, | |
dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, | |
timeSetter = match[8] ? date.setUTCHours : date.setHours; | |
match[9] && (tzHour = int(match[9] + match[10]), tzMin = int(match[9] + match[11])), dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3])); | |
var h = int(match[4] || 0) - tzHour, | |
m = int(match[5] || 0) - tzMin, | |
s = int(match[6] || 0), | |
ms = Math.round(1e3 * parseFloat("0." + (match[7] || 0))); | |
return timeSetter.call(date, h, m, s, ms), date } | |
return string } | |
var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; | |
return function(date, format, timezone) { | |
var fn, match, text = "", | |
parts = []; | |
if (format = format || "mediumDate", format = $locale.DATETIME_FORMATS[format] || format, isString(date) && (date = NUMBER_STRING.test(date) ? int(date) : jsonStringToDate(date)), isNumber(date) && (date = new Date(date)), !isDate(date)) return date; | |
for (; format;) match = DATE_FORMATS_SPLIT.exec(format), match ? (parts = concat(parts, match, 1), format = parts.pop()) : (parts.push(format), format = null); | |
return timezone && "UTC" === timezone && (date = new Date(date.getTime()), date.setMinutes(date.getMinutes() + date.getTimezoneOffset())), forEach(parts, function(value) { fn = DATE_FORMATS[value], text += fn ? fn(date, $locale.DATETIME_FORMATS) : value.replace(/(^'|'$)/g, "").replace(/''/g, "'") }), text } } | |
function jsonFilter() { | |
return function(object) { | |
return toJson(object, !0) } } | |
function limitToFilter() { | |
return function(input, limit) { | |
if (isNumber(input) && (input = input.toString()), !isArray(input) && !isString(input)) return input; | |
if (limit = 1 / 0 === Math.abs(Number(limit)) ? Number(limit) : int(limit), isString(input)) return limit ? limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length) : ""; | |
var i, n, out = []; | |
for (limit > input.length ? limit = input.length : limit < -input.length && (limit = -input.length), limit > 0 ? (i = 0, n = limit) : (i = input.length + limit, n = input.length); n > i; i++) out.push(input[i]); | |
return out } } | |
function orderByFilter($parse) { | |
return function(array, sortPredicate, reverseOrder) { | |
function comparator(o1, o2) { | |
for (var i = 0; i < sortPredicate.length; i++) { | |
var comp = sortPredicate[i](o1, o2); | |
if (0 !== comp) return comp } | |
return 0 } | |
function reverseComparator(comp, descending) { | |
return descending ? function(a, b) { | |
return comp(b, a) } : comp } | |
function compare(v1, v2) { | |
var t1 = typeof v1, | |
t2 = typeof v2; | |
return t1 == t2 ? (isDate(v1) && isDate(v2) && (v1 = v1.valueOf(), v2 = v2.valueOf()), "string" == t1 && (v1 = v1.toLowerCase(), v2 = v2.toLowerCase()), v1 === v2 ? 0 : v2 > v1 ? -1 : 1) : t2 > t1 ? -1 : 1 } | |
return isArrayLike(array) ? (sortPredicate = isArray(sortPredicate) ? sortPredicate : [sortPredicate], 0 === sortPredicate.length && (sortPredicate = ["+"]), sortPredicate = sortPredicate.map(function(predicate) { | |
var descending = !1, | |
get = predicate || identity; | |
if (isString(predicate)) { | |
if (("+" == predicate.charAt(0) || "-" == predicate.charAt(0)) && (descending = "-" == predicate.charAt(0), predicate = predicate.substring(1)), "" === predicate) return reverseComparator(function(a, b) { | |
return compare(a, b) }, descending); | |
if (get = $parse(predicate), get.constant) { | |
var key = get(); | |
return reverseComparator(function(a, b) { | |
return compare(a[key], b[key]) }, descending) } } | |
return reverseComparator(function(a, b) { | |
return compare(get(a), get(b)) }, descending) }), slice.call(array).sort(reverseComparator(comparator, reverseOrder))) : array } } | |
function ngDirective(directive) { | |
return isFunction(directive) && (directive = { link: directive }), directive.restrict = directive.restrict || "AC", valueFn(directive) } | |
function nullFormRenameControl(control, name) { control.$name = name } | |
function FormController(element, attrs, $scope, $animate, $interpolate) { | |
var form = this, | |
controls = [], | |
parentForm = form.$$parentForm = element.parent().controller("form") || nullFormCtrl; | |
form.$error = {}, form.$$success = {}, form.$pending = undefined, form.$name = $interpolate(attrs.name || attrs.ngForm || "")($scope), form.$dirty = !1, form.$pristine = !0, form.$valid = !0, form.$invalid = !1, form.$submitted = !1, parentForm.$addControl(form), form.$rollbackViewValue = function() { forEach(controls, function(control) { control.$rollbackViewValue() }) }, form.$commitViewValue = function() { forEach(controls, function(control) { control.$commitViewValue() }) }, form.$addControl = function(control) { assertNotHasOwnProperty(control.$name, "input"), controls.push(control), control.$name && (form[control.$name] = control) }, form.$$renameControl = function(control, newName) { | |
var oldName = control.$name; | |
form[oldName] === control && delete form[oldName], form[newName] = control, control.$name = newName }, form.$removeControl = function(control) { control.$name && form[control.$name] === control && delete form[control.$name], forEach(form.$pending, function(value, name) { form.$setValidity(name, null, control) }), forEach(form.$error, function(value, name) { form.$setValidity(name, null, control) }), arrayRemove(controls, control) }, addSetValidityMethod({ ctrl: this, $element: element, set: function(object, property, control) { | |
var list = object[property]; | |
if (list) { | |
var index = list.indexOf(control); - 1 === index && list.push(control) } else object[property] = [control] }, unset: function(object, property, control) { | |
var list = object[property]; | |
list && (arrayRemove(list, control), 0 === list.length && delete object[property]) }, parentForm: parentForm, $animate: $animate }), form.$setDirty = function() { $animate.removeClass(element, PRISTINE_CLASS), $animate.addClass(element, DIRTY_CLASS), form.$dirty = !0, form.$pristine = !1, parentForm.$setDirty() }, form.$setPristine = function() { $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + " " + SUBMITTED_CLASS), form.$dirty = !1, form.$pristine = !0, form.$submitted = !1, forEach(controls, function(control) { control.$setPristine() }) }, form.$setUntouched = function() { forEach(controls, function(control) { control.$setUntouched() }) }, form.$setSubmitted = function() { $animate.addClass(element, SUBMITTED_CLASS), form.$submitted = !0, parentForm.$setSubmitted() } } | |
function stringBasedInputType(ctrl) { ctrl.$formatters.push(function(value) { | |
return ctrl.$isEmpty(value) ? value : value.toString() }) } | |
function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { baseInputType(scope, element, attr, ctrl, $sniffer, $browser), stringBasedInputType(ctrl) } | |
function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { | |
var placeholder = element[0].placeholder, | |
noevent = {}, | |
type = lowercase(element[0].type); | |
if (!$sniffer.android) { | |
var composing = !1; | |
element.on("compositionstart", function() { composing = !0 }), element.on("compositionend", function() { composing = !1, listener() }) } | |
var listener = function(ev) { | |
if (!composing) { | |
var value = element.val(), | |
event = ev && ev.type; | |
if (msie && "input" === (ev || noevent).type && element[0].placeholder !== placeholder) return void(placeholder = element[0].placeholder); "password" === type || attr.ngTrim && "false" === attr.ngTrim || (value = trim(value)), (ctrl.$viewValue !== value || "" === value && ctrl.$$hasNativeValidators) && ctrl.$setViewValue(value, event) } }; | |
if ($sniffer.hasEvent("input")) element.on("input", listener); | |
else { | |
var timeout, deferListener = function(ev) { timeout || (timeout = $browser.defer(function() { listener(ev), timeout = null })) }; | |
element.on("keydown", function(event) { | |
var key = event.keyCode; | |
91 === key || key > 15 && 19 > key || key >= 37 && 40 >= key || deferListener(event) }), $sniffer.hasEvent("paste") && element.on("paste cut", deferListener) } | |
element.on("change", listener), ctrl.$render = function() { element.val(ctrl.$isEmpty(ctrl.$viewValue) ? "" : ctrl.$viewValue) } } | |
function weekParser(isoWeek, existingDate) { | |
if (isDate(isoWeek)) return isoWeek; | |
if (isString(isoWeek)) { WEEK_REGEXP.lastIndex = 0; | |
var parts = WEEK_REGEXP.exec(isoWeek); | |
if (parts) { | |
var year = +parts[1], | |
week = +parts[2], | |
hours = 0, | |
minutes = 0, | |
seconds = 0, | |
milliseconds = 0, | |
firstThurs = getFirstThursdayOfYear(year), | |
addDays = 7 * (week - 1); | |
return existingDate && (hours = existingDate.getHours(), minutes = existingDate.getMinutes(), seconds = existingDate.getSeconds(), milliseconds = existingDate.getMilliseconds()), new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds) } } | |
return 0 / 0 } | |
function createDateParser(regexp, mapping) { | |
return function(iso, date) { | |
var parts, map; | |
if (isDate(iso)) return iso; | |
if (isString(iso)) { | |
if ('"' == iso.charAt(0) && '"' == iso.charAt(iso.length - 1) && (iso = iso.substring(1, iso.length - 1)), ISO_DATE_REGEXP.test(iso)) return new Date(iso); | |
if (regexp.lastIndex = 0, parts = regexp.exec(iso)) return parts.shift(), map = date ? { yyyy: date.getFullYear(), MM: date.getMonth() + 1, dd: date.getDate(), HH: date.getHours(), mm: date.getMinutes(), ss: date.getSeconds(), sss: date.getMilliseconds() / 1e3 } : { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 }, forEach(parts, function(part, index) { index < mapping.length && (map[mapping[index]] = +part) }), new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, 1e3 * map.sss || 0) } | |
return 0 / 0 } } | |
function createDateInputType(type, regexp, parseDate, format) { | |
return function(scope, element, attr, ctrl, $sniffer, $browser, $filter) { | |
function isValidDate(value) { | |
return value && !(value.getTime && value.getTime() !== value.getTime()) } | |
function parseObservedDateValue(val) { | |
return isDefined(val) ? isDate(val) ? val : parseDate(val) : undefined } | |
badInputChecker(scope, element, attr, ctrl), baseInputType(scope, element, attr, ctrl, $sniffer, $browser); | |
var previousDate, timezone = ctrl && ctrl.$options && ctrl.$options.timezone; | |
if (ctrl.$$parserName = type, ctrl.$parsers.push(function(value) { | |
if (ctrl.$isEmpty(value)) return null; | |
if (regexp.test(value)) { | |
var parsedDate = parseDate(value, previousDate); | |
return "UTC" === timezone && parsedDate.setMinutes(parsedDate.getMinutes() - parsedDate.getTimezoneOffset()), parsedDate } | |
return undefined }), ctrl.$formatters.push(function(value) { | |
if (value && !isDate(value)) throw $ngModelMinErr("datefmt", "Expected `{0}` to be a date", value); | |
if (isValidDate(value)) { | |
if (previousDate = value, previousDate && "UTC" === timezone) { | |
var timezoneOffset = 6e4 * previousDate.getTimezoneOffset(); | |
previousDate = new Date(previousDate.getTime() + timezoneOffset) } | |
return $filter("date")(value, format, timezone) } | |
return previousDate = null, "" }), isDefined(attr.min) || attr.ngMin) { | |
var minVal; | |
ctrl.$validators.min = function(value) { | |
return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal }, attr.$observe("min", function(val) { minVal = parseObservedDateValue(val), ctrl.$validate() }) } | |
if (isDefined(attr.max) || attr.ngMax) { | |
var maxVal; | |
ctrl.$validators.max = function(value) { | |
return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal }, attr.$observe("max", function(val) { maxVal = parseObservedDateValue(val), ctrl.$validate() }) } } } | |
function badInputChecker(scope, element, attr, ctrl) { | |
var node = element[0], | |
nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity); | |
nativeValidation && ctrl.$parsers.push(function(value) { | |
var validity = element.prop(VALIDITY_STATE_PROPERTY) || {}; | |
return validity.badInput && !validity.typeMismatch ? undefined : value }) } | |
function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { | |
if (badInputChecker(scope, element, attr, ctrl), baseInputType(scope, element, attr, ctrl, $sniffer, $browser), ctrl.$$parserName = "number", ctrl.$parsers.push(function(value) { | |
return ctrl.$isEmpty(value) ? null : NUMBER_REGEXP.test(value) ? parseFloat(value) : undefined }), ctrl.$formatters.push(function(value) { | |
if (!ctrl.$isEmpty(value)) { | |
if (!isNumber(value)) throw $ngModelMinErr("numfmt", "Expected `{0}` to be a number", value); | |
value = value.toString() } | |
return value }), attr.min || attr.ngMin) { | |
var minVal; | |
ctrl.$validators.min = function(value) { | |
return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal }, attr.$observe("min", function(val) { isDefined(val) && !isNumber(val) && (val = parseFloat(val, 10)), minVal = isNumber(val) && !isNaN(val) ? val : undefined, ctrl.$validate() }) } | |
if (attr.max || attr.ngMax) { | |
var maxVal; | |
ctrl.$validators.max = function(value) { | |
return ctrl.$isEmpty(value) || isUndefined(maxVal) || maxVal >= value }, attr.$observe("max", function(val) { isDefined(val) && !isNumber(val) && (val = parseFloat(val, 10)), maxVal = isNumber(val) && !isNaN(val) ? val : undefined, ctrl.$validate() }) } } | |
function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { baseInputType(scope, element, attr, ctrl, $sniffer, $browser), stringBasedInputType(ctrl), ctrl.$$parserName = "url", ctrl.$validators.url = function(modelValue, viewValue) { | |
var value = modelValue || viewValue; | |
return ctrl.$isEmpty(value) || URL_REGEXP.test(value) } } | |
function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) { baseInputType(scope, element, attr, ctrl, $sniffer, $browser), stringBasedInputType(ctrl), ctrl.$$parserName = "email", ctrl.$validators.email = function(modelValue, viewValue) { | |
var value = modelValue || viewValue; | |
return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value) } } | |
function radioInputType(scope, element, attr, ctrl) { isUndefined(attr.name) && element.attr("name", nextUid()); | |
var listener = function(ev) { element[0].checked && ctrl.$setViewValue(attr.value, ev && ev.type) }; | |
element.on("click", listener), ctrl.$render = function() { | |
var value = attr.value; | |
element[0].checked = value == ctrl.$viewValue }, attr.$observe("value", ctrl.$render) } | |
function parseConstantExpr($parse, context, name, expression, fallback) { | |
var parseFn; | |
if (isDefined(expression)) { | |
if (parseFn = $parse(expression), !parseFn.constant) throw minErr("ngModel")("constexpr", "Expected constant expression for `{0}`, but saw `{1}`.", name, expression); | |
return parseFn(context) } | |
return fallback } | |
function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) { | |
var trueValue = parseConstantExpr($parse, scope, "ngTrueValue", attr.ngTrueValue, !0), | |
falseValue = parseConstantExpr($parse, scope, "ngFalseValue", attr.ngFalseValue, !1), | |
listener = function(ev) { ctrl.$setViewValue(element[0].checked, ev && ev.type) }; | |
element.on("click", listener), ctrl.$render = function() { element[0].checked = ctrl.$viewValue }, ctrl.$isEmpty = function(value) { | |
return value === !1 }, ctrl.$formatters.push(function(value) { | |
return equals(value, trueValue) }), ctrl.$parsers.push(function(value) { | |
return value ? trueValue : falseValue }) } | |
function addSetValidityMethod(context) { | |
function setValidity(validationErrorKey, state, options) { state === undefined ? createAndSet("$pending", validationErrorKey, options) : unsetAndCleanup("$pending", validationErrorKey, options), isBoolean(state) ? state ? (unset(ctrl.$error, validationErrorKey, options), set(ctrl.$$success, validationErrorKey, options)) : (set(ctrl.$error, validationErrorKey, options), unset(ctrl.$$success, validationErrorKey, options)) : (unset(ctrl.$error, validationErrorKey, options), unset(ctrl.$$success, validationErrorKey, options)), ctrl.$pending ? (cachedToggleClass(PENDING_CLASS, !0), ctrl.$valid = ctrl.$invalid = undefined, toggleValidationCss("", null)) : (cachedToggleClass(PENDING_CLASS, !1), ctrl.$valid = isObjectEmpty(ctrl.$error), ctrl.$invalid = !ctrl.$valid, toggleValidationCss("", ctrl.$valid)); | |
var combinedState; | |
combinedState = ctrl.$pending && ctrl.$pending[validationErrorKey] ? undefined : ctrl.$error[validationErrorKey] ? !1 : ctrl.$$success[validationErrorKey] ? !0 : null, toggleValidationCss(validationErrorKey, combinedState), parentForm.$setValidity(validationErrorKey, combinedState, ctrl) } | |
function createAndSet(name, value, options) { ctrl[name] || (ctrl[name] = {}), set(ctrl[name], value, options) } | |
function unsetAndCleanup(name, value, options) { ctrl[name] && unset(ctrl[name], value, options), isObjectEmpty(ctrl[name]) && (ctrl[name] = undefined) } | |
function cachedToggleClass(className, switchValue) { switchValue && !classCache[className] ? ($animate.addClass($element, className), classCache[className] = !0) : !switchValue && classCache[className] && ($animate.removeClass($element, className), classCache[className] = !1) } | |
function toggleValidationCss(validationErrorKey, isValid) { validationErrorKey = validationErrorKey ? "-" + snake_case(validationErrorKey, "-") : "", cachedToggleClass(VALID_CLASS + validationErrorKey, isValid === !0), cachedToggleClass(INVALID_CLASS + validationErrorKey, isValid === !1) } | |
var ctrl = context.ctrl, | |
$element = context.$element, | |
classCache = {}, | |
set = context.set, | |
unset = context.unset, | |
parentForm = context.parentForm, | |
$animate = context.$animate; | |
classCache[INVALID_CLASS] = !(classCache[VALID_CLASS] = $element.hasClass(VALID_CLASS)), ctrl.$setValidity = setValidity } | |
function isObjectEmpty(obj) { | |
if (obj) | |
for (var prop in obj) return !1; | |
return !0 } | |
function classDirective(name, selector) { | |
return name = "ngClass" + name, ["$animate", function($animate) { | |
function arrayDifference(tokens1, tokens2) { | |
var values = []; | |
outer: for (var i = 0; i < tokens1.length; i++) { | |
for (var token = tokens1[i], j = 0; j < tokens2.length; j++) | |
if (token == tokens2[j]) continue outer; | |
values.push(token) } | |
return values } | |
function arrayClasses(classVal) { | |
if (isArray(classVal)) return classVal; | |
if (isString(classVal)) return classVal.split(" "); | |
if (isObject(classVal)) { | |
var classes = []; | |
return forEach(classVal, function(v, k) { v && (classes = classes.concat(k.split(" "))) }), classes } | |
return classVal } | |
return { restrict: "AC", link: function(scope, element, attr) { | |
function addClasses(classes) { | |
var newClasses = digestClassCounts(classes, 1); | |
attr.$addClass(newClasses) } | |
function removeClasses(classes) { | |
var newClasses = digestClassCounts(classes, -1); | |
attr.$removeClass(newClasses) } | |
function digestClassCounts(classes, count) { | |
var classCounts = element.data("$classCounts") || {}, | |
classesToUpdate = []; | |
return forEach(classes, function(className) { | |
(count > 0 || classCounts[className]) && (classCounts[className] = (classCounts[className] || 0) + count, classCounts[className] === +(count > 0) && classesToUpdate.push(className)) }), element.data("$classCounts", classCounts), classesToUpdate.join(" ") } | |
function updateClasses(oldClasses, newClasses) { | |
var toAdd = arrayDifference(newClasses, oldClasses), | |
toRemove = arrayDifference(oldClasses, newClasses); | |
toAdd = digestClassCounts(toAdd, 1), toRemove = digestClassCounts(toRemove, -1), toAdd && toAdd.length && $animate.addClass(element, toAdd), toRemove && toRemove.length && $animate.removeClass(element, toRemove) } | |
function ngClassWatchAction(newVal) { | |
if (selector === !0 || scope.$index % 2 === selector) { | |
var newClasses = arrayClasses(newVal || []); | |
if (oldVal) { | |
if (!equals(newVal, oldVal)) { | |
var oldClasses = arrayClasses(oldVal); | |
updateClasses(oldClasses, newClasses) } } else addClasses(newClasses) } | |
oldVal = shallowCopy(newVal) } | |
var oldVal; | |
scope.$watch(attr[name], ngClassWatchAction, !0), attr.$observe("class", function() { ngClassWatchAction(scope.$eval(attr[name])) }), "ngClass" !== name && scope.$watch("$index", function($index, old$index) { | |
var mod = 1 & $index; | |
if (mod !== (1 & old$index)) { | |
var classes = arrayClasses(scope.$eval(attr[name])); | |
mod === selector ? addClasses(classes) : removeClasses(classes) } }) } } }] } | |
var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/, | |
VALIDITY_STATE_PROPERTY = "validity", | |
lowercase = function(string) { | |
return isString(string) ? string.toLowerCase() : string }, | |
hasOwnProperty = Object.prototype.hasOwnProperty, | |
uppercase = function(string) { | |
return isString(string) ? string.toUpperCase() : string }, | |
manualLowercase = function(s) { | |
return isString(s) ? s.replace(/[A-Z]/g, function(ch) { | |
return String.fromCharCode(32 | ch.charCodeAt(0)) | |
}) : s | |
}, | |
manualUppercase = function(s) { | |
return isString(s) ? s.replace(/[a-z]/g, function(ch) { | |
return String.fromCharCode(-33 & ch.charCodeAt(0)) }) : s }; | |
"i" !== "I".toLowerCase() && (lowercase = manualLowercase, uppercase = manualUppercase); | |
var msie, jqLite, jQuery, angularModule, slice = [].slice, | |
splice = [].splice, | |
push = [].push, | |
toString = Object.prototype.toString, | |
ngMinErr = minErr("ng"), | |
angular = window.angular || (window.angular = {}), | |
uid = 0; | |
msie = document.documentMode, noop.$inject = [], identity.$inject = []; | |
var skipDestroyOnNextJQueryCleanData, isArray = Array.isArray, | |
trim = function(value) { | |
return isString(value) ? value.trim() : value }, | |
escapeForRegexp = function(s) { | |
return s.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, "\\$1").replace(/\x08/g, "\\x08") }, | |
csp = function() { | |
if (isDefined(csp.isActive_)) return csp.isActive_; | |
var active = !(!document.querySelector("[ng-csp]") && !document.querySelector("[data-ng-csp]")); | |
if (!active) try { new Function("") } catch (e) { active = !0 } | |
return csp.isActive_ = active }, | |
ngAttrPrefixes = ["ng-", "data-ng-", "ng:", "x-ng-"], | |
SNAKE_CASE_REGEXP = /[A-Z]/g, | |
bindJQueryFired = !1, | |
NODE_TYPE_ELEMENT = 1, | |
NODE_TYPE_TEXT = 3, | |
NODE_TYPE_COMMENT = 8, | |
NODE_TYPE_DOCUMENT = 9, | |
NODE_TYPE_DOCUMENT_FRAGMENT = 11, | |
version = { full: "1.3.5", major: 1, minor: 3, dot: 5, codeName: "cybernetic-mercantilism" }; | |
JQLite.expando = "ng339"; | |
var jqCache = JQLite.cache = {}, | |
jqId = 1, | |
addEventListenerFn = function(element, type, fn) { element.addEventListener(type, fn, !1) }, | |
removeEventListenerFn = function(element, type, fn) { element.removeEventListener(type, fn, !1) }; | |
JQLite._data = function(node) { | |
return this.cache[node[this.expando]] || {} }; | |
var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g, | |
MOZ_HACK_REGEXP = /^moz([A-Z])/, | |
MOUSE_EVENT_MAP = { mouseleave: "mouseout", mouseenter: "mouseover" }, | |
jqLiteMinErr = minErr("jqLite"), | |
SINGLE_TAG_REGEXP = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, | |
HTML_REGEXP = /<|&#?\w+;/, | |
TAG_NAME_REGEXP = /<([\w:]+)/, | |
XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, | |
wrapMap = { option: [1, '<select multiple="multiple">', "</select>"], thead: [1, "<table>", "</table>"], col: [2, "<table><colgroup>", "</colgroup></table>"], tr: [2, "<table><tbody>", "</tbody></table>"], td: [3, "<table><tbody><tr>", "</tr></tbody></table>"], _default: [0, "", ""] }; | |
wrapMap.optgroup = wrapMap.option, wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead, wrapMap.th = wrapMap.td; | |
var JQLitePrototype = JQLite.prototype = { ready: function(fn) { | |
function trigger() { fired || (fired = !0, fn()) } | |
var fired = !1; "complete" === document.readyState ? setTimeout(trigger) : (this.on("DOMContentLoaded", trigger), JQLite(window).on("load", trigger)) }, toString: function() { | |
var value = []; | |
return forEach(this, function(e) { value.push("" + e) }), "[" + value.join(", ") + "]" }, eq: function(index) { | |
return jqLite(index >= 0 ? this[index] : this[this.length + index]) }, length: 0, push: push, sort: [].sort, splice: [].splice }, | |
BOOLEAN_ATTR = {}; | |
forEach("multiple,selected,checked,disabled,readOnly,required,open".split(","), function(value) { BOOLEAN_ATTR[lowercase(value)] = value }); | |
var BOOLEAN_ELEMENTS = {}; | |
forEach("input,select,option,textarea,button,form,details".split(","), function(value) { BOOLEAN_ELEMENTS[value] = !0 }); | |
var ALIASED_ATTR = { ngMinlength: "minlength", ngMaxlength: "maxlength", ngMin: "min", ngMax: "max", ngPattern: "pattern" }; | |
forEach({ data: jqLiteData, removeData: jqLiteRemoveData }, function(fn, name) { JQLite[name] = fn }), forEach({ data: jqLiteData, inheritedData: jqLiteInheritedData, scope: function(element) { | |
return jqLite.data(element, "$scope") || jqLiteInheritedData(element.parentNode || element, ["$isolateScope", "$scope"]) }, isolateScope: function(element) { | |
return jqLite.data(element, "$isolateScope") || jqLite.data(element, "$isolateScopeNoTemplate") }, controller: jqLiteController, injector: function(element) { | |
return jqLiteInheritedData(element, "$injector") }, removeAttr: function(element, name) { element.removeAttribute(name) }, hasClass: jqLiteHasClass, css: function(element, name, value) { | |
return name = camelCase(name), isDefined(value) ? void(element.style[name] = value) : element.style[name] }, attr: function(element, name, value) { | |
var lowercasedName = lowercase(name); | |
if (BOOLEAN_ATTR[lowercasedName]) { | |
if (!isDefined(value)) return element[name] || (element.attributes.getNamedItem(name) || noop).specified ? lowercasedName : undefined; | |
value ? (element[name] = !0, element.setAttribute(name, lowercasedName)) : (element[name] = !1, element.removeAttribute(lowercasedName)) } else if (isDefined(value)) element.setAttribute(name, value); | |
else if (element.getAttribute) { | |
var ret = element.getAttribute(name, 2); | |
return null === ret ? undefined : ret } }, prop: function(element, name, value) { | |
return isDefined(value) ? void(element[name] = value) : element[name] }, text: function() { | |
function getText(element, value) { | |
if (isUndefined(value)) { | |
var nodeType = element.nodeType; | |
return nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT ? element.textContent : "" } | |
element.textContent = value } | |
return getText.$dv = "", getText }(), val: function(element, value) { | |
if (isUndefined(value)) { | |
if (element.multiple && "select" === nodeName_(element)) { | |
var result = []; | |
return forEach(element.options, function(option) { option.selected && result.push(option.value || option.text) }), 0 === result.length ? null : result } | |
return element.value } | |
element.value = value }, html: function(element, value) { | |
return isUndefined(value) ? element.innerHTML : (jqLiteDealoc(element, !0), void(element.innerHTML = value)) }, empty: jqLiteEmpty }, function(fn, name) { JQLite.prototype[name] = function(arg1, arg2) { | |
var i, key, nodeCount = this.length; | |
if (fn !== jqLiteEmpty && (2 == fn.length && fn !== jqLiteHasClass && fn !== jqLiteController ? arg1 : arg2) === undefined) { | |
if (isObject(arg1)) { | |
for (i = 0; nodeCount > i; i++) | |
if (fn === jqLiteData) fn(this[i], arg1); | |
else | |
for (key in arg1) fn(this[i], key, arg1[key]); | |
return this } | |
for (var value = fn.$dv, jj = value === undefined ? Math.min(nodeCount, 1) : nodeCount, j = 0; jj > j; j++) { | |
var nodeValue = fn(this[j], arg1, arg2); | |
value = value ? value + nodeValue : nodeValue } | |
return value } | |
for (i = 0; nodeCount > i; i++) fn(this[i], arg1, arg2); | |
return this } }), forEach({ removeData: jqLiteRemoveData, on: function jqLiteOn(element, type, fn, unsupported) { | |
if (isDefined(unsupported)) throw jqLiteMinErr("onargs", "jqLite#on() does not support the `selector` or `eventData` parameters"); | |
if (jqLiteAcceptsData(element)) { | |
var expandoStore = jqLiteExpandoStore(element, !0), | |
events = expandoStore.events, | |
handle = expandoStore.handle; | |
handle || (handle = expandoStore.handle = createEventHandler(element, events)); | |
for (var types = type.indexOf(" ") >= 0 ? type.split(" ") : [type], i = types.length; i--;) { type = types[i]; | |
var eventFns = events[type]; | |
eventFns || (events[type] = [], "mouseenter" === type || "mouseleave" === type ? jqLiteOn(element, MOUSE_EVENT_MAP[type], function(event) { | |
var target = this, | |
related = event.relatedTarget; | |
(!related || related !== target && !target.contains(related)) && handle(event, type) }) : "$destroy" !== type && addEventListenerFn(element, type, handle), eventFns = events[type]), eventFns.push(fn) } } }, off: jqLiteOff, one: function(element, type, fn) { element = jqLite(element), element.on(type, function onFn() { element.off(type, fn), element.off(type, onFn) }), element.on(type, fn) }, replaceWith: function(element, replaceNode) { | |
var index, parent = element.parentNode; | |
jqLiteDealoc(element), forEach(new JQLite(replaceNode), function(node) { index ? parent.insertBefore(node, index.nextSibling) : parent.replaceChild(node, element), index = node }) }, children: function(element) { | |
var children = []; | |
return forEach(element.childNodes, function(element) { element.nodeType === NODE_TYPE_ELEMENT && children.push(element) }), children }, contents: function(element) { | |
return element.contentDocument || element.childNodes || [] }, append: function(element, node) { | |
var nodeType = element.nodeType; | |
if (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_DOCUMENT_FRAGMENT) { node = new JQLite(node); | |
for (var i = 0, ii = node.length; ii > i; i++) { | |
var child = node[i]; | |
element.appendChild(child) } } }, prepend: function(element, node) { | |
if (element.nodeType === NODE_TYPE_ELEMENT) { | |
var index = element.firstChild; | |
forEach(new JQLite(node), function(child) { element.insertBefore(child, index) }) } }, wrap: function(element, wrapNode) { wrapNode = jqLite(wrapNode).eq(0).clone()[0]; | |
var parent = element.parentNode; | |
parent && parent.replaceChild(wrapNode, element), wrapNode.appendChild(element) }, remove: jqLiteRemove, detach: function(element) { jqLiteRemove(element, !0) }, after: function(element, newElement) { | |
var index = element, | |
parent = element.parentNode; | |
newElement = new JQLite(newElement); | |
for (var i = 0, ii = newElement.length; ii > i; i++) { | |
var node = newElement[i]; | |
parent.insertBefore(node, index.nextSibling), index = node } }, addClass: jqLiteAddClass, removeClass: jqLiteRemoveClass, toggleClass: function(element, selector, condition) { selector && forEach(selector.split(" "), function(className) { | |
var classCondition = condition; | |
isUndefined(classCondition) && (classCondition = !jqLiteHasClass(element, className)), (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className) }) }, parent: function(element) { | |
var parent = element.parentNode; | |
return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null }, next: function(element) { | |
return element.nextElementSibling }, find: function(element, selector) { | |
return element.getElementsByTagName ? element.getElementsByTagName(selector) : [] }, clone: jqLiteClone, triggerHandler: function(element, event, extraParameters) { | |
var dummyEvent, eventFnsCopy, handlerArgs, eventName = event.type || event, | |
expandoStore = jqLiteExpandoStore(element), | |
events = expandoStore && expandoStore.events, | |
eventFns = events && events[eventName]; | |
eventFns && (dummyEvent = { preventDefault: function() { this.defaultPrevented = !0 }, isDefaultPrevented: function() { | |
return this.defaultPrevented === !0 }, stopImmediatePropagation: function() { this.immediatePropagationStopped = !0 }, isImmediatePropagationStopped: function() { | |
return this.immediatePropagationStopped === !0 }, stopPropagation: noop, type: eventName, target: element }, event.type && (dummyEvent = extend(dummyEvent, event)), eventFnsCopy = shallowCopy(eventFns), handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent], forEach(eventFnsCopy, function(fn) { dummyEvent.isImmediatePropagationStopped() || fn.apply(element, handlerArgs) })) } }, function(fn, name) { JQLite.prototype[name] = function(arg1, arg2, arg3) { | |
for (var value, i = 0, ii = this.length; ii > i; i++) isUndefined(value) ? (value = fn(this[i], arg1, arg2, arg3), isDefined(value) && (value = jqLite(value))) : jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3)); | |
return isDefined(value) ? value : this }, JQLite.prototype.bind = JQLite.prototype.on, JQLite.prototype.unbind = JQLite.prototype.off }), HashMap.prototype = { put: function(key, value) { this[hashKey(key, this.nextUid)] = value }, get: function(key) { | |
return this[hashKey(key, this.nextUid)] }, remove: function(key) { | |
var value = this[key = hashKey(key, this.nextUid)]; | |
return delete this[key], value } }; | |
var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m, | |
FN_ARG_SPLIT = /,/, | |
FN_ARG = /^\s*(_?)(\S+?)\1\s*$/, | |
STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm, | |
$injectorMinErr = minErr("$injector"); | |
createInjector.$$annotate = annotate; | |
var $animateMinErr = minErr("$animate"), | |
$AnimateProvider = ["$provide", function($provide) { this.$$selectors = {}, this.register = function(name, factory) { | |
var key = name + "-animation"; | |
if (name && "." != name.charAt(0)) throw $animateMinErr("notcsel", "Expecting class selector starting with '.' got '{0}'.", name); | |
this.$$selectors[name.substr(1)] = key, $provide.factory(key, factory) }, this.classNameFilter = function(expression) { | |
return 1 === arguments.length && (this.$$classNameFilter = expression instanceof RegExp ? expression : null), this.$$classNameFilter }, this.$get = ["$$q", "$$asyncCallback", "$rootScope", function($$q, $$asyncCallback, $rootScope) { | |
function runAnimationPostDigest(fn) { | |
var cancelFn, defer = $$q.defer(); | |
return defer.promise.$$cancelFn = function() { cancelFn && cancelFn() }, $rootScope.$$postDigest(function() { cancelFn = fn(function() { defer.resolve() }) }), defer.promise } | |
function resolveElementClasses(element, classes) { | |
var toAdd = [], | |
toRemove = [], | |
hasClasses = createMap(); | |
return forEach((element.attr("class") || "").split(/\s+/), function(className) { hasClasses[className] = !0 }), forEach(classes, function(status, className) { | |
var hasClass = hasClasses[className]; | |
status === !1 && hasClass ? toRemove.push(className) : status !== !0 || hasClass || toAdd.push(className) }), toAdd.length + toRemove.length > 0 && [toAdd.length ? toAdd : null, toRemove.length ? toRemove : null] } | |
function cachedClassManipulation(cache, classes, op) { | |
for (var i = 0, ii = classes.length; ii > i; ++i) { | |
var className = classes[i]; | |
cache[className] = op } } | |
function asyncPromise() { | |
return currentDefer || (currentDefer = $$q.defer(), $$asyncCallback(function() { currentDefer.resolve(), currentDefer = null })), currentDefer.promise } | |
function applyStyles(element, options) { | |
if (angular.isObject(options)) { | |
var styles = extend(options.from || {}, options.to || {}); | |
element.css(styles) } } | |
var currentDefer; | |
return { animate: function(element, from, to) { | |
return applyStyles(element, { from: from, to: to }), asyncPromise() }, enter: function(element, parent, after, options) { | |
return applyStyles(element, options), after ? after.after(element) : parent.prepend(element), asyncPromise() }, leave: function(element) { | |
return element.remove(), asyncPromise() }, move: function(element, parent, after, options) { | |
return this.enter(element, parent, after, options) }, addClass: function(element, className, options) { | |
return this.setClass(element, className, [], options) }, $$addClassImmediately: function(element, className, options) { | |
return element = jqLite(element), className = isString(className) ? className : isArray(className) ? className.join(" ") : "", forEach(element, function(element) { jqLiteAddClass(element, className) }), applyStyles(element, options), asyncPromise() }, removeClass: function(element, className, options) { | |
return this.setClass(element, [], className, options) }, $$removeClassImmediately: function(element, className, options) { | |
return element = jqLite(element), className = isString(className) ? className : isArray(className) ? className.join(" ") : "", forEach(element, function(element) { jqLiteRemoveClass(element, className) }), applyStyles(element, options), asyncPromise() }, setClass: function(element, add, remove, options) { | |
var self = this, | |
STORAGE_KEY = "$$animateClasses", | |
createdCache = !1; | |
element = jqLite(element); | |
var cache = element.data(STORAGE_KEY); | |
cache ? options && cache.options && (cache.options = angular.extend(cache.options || {}, options)) : (cache = { classes: {}, options: options }, createdCache = !0); | |
var classes = cache.classes; | |
return add = isArray(add) ? add : add.split(" "), remove = isArray(remove) ? remove : remove.split(" "), cachedClassManipulation(classes, add, !0), cachedClassManipulation(classes, remove, !1), createdCache && (cache.promise = runAnimationPostDigest(function(done) { | |
var cache = element.data(STORAGE_KEY); | |
if (element.removeData(STORAGE_KEY), cache) { | |
var classes = resolveElementClasses(element, cache.classes); | |
classes && self.$$setClassImmediately(element, classes[0], classes[1], cache.options) } | |
done() }), element.data(STORAGE_KEY, cache)), cache.promise }, $$setClassImmediately: function(element, add, remove, options) { | |
return add && this.$$addClassImmediately(element, add), remove && this.$$removeClassImmediately(element, remove), applyStyles(element, options), asyncPromise() }, enabled: noop, cancel: noop } }] }], | |
$compileMinErr = minErr("$compile"); | |
$CompileProvider.$inject = ["$provide", "$$sanitizeUriProvider"]; | |
var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i, | |
APPLICATION_JSON = "application/json", | |
CONTENT_TYPE_APPLICATION_JSON = { "Content-Type": APPLICATION_JSON + ";charset=utf-8" }, | |
JSON_START = /^\s*(\[|\{[^\{])/, | |
JSON_END = /[\}\]]\s*$/, | |
JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/, | |
$interpolateMinErr = minErr("$interpolate"), | |
PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, | |
DEFAULT_PORTS = { http: 80, https: 443, ftp: 21 }, | |
$locationMinErr = minErr("$location"), | |
locationPrototype = { $$html5: !1, $$replace: !1, absUrl: locationGetter("$$absUrl"), url: function(url) { | |
if (isUndefined(url)) return this.$$url; | |
var match = PATH_MATCH.exec(url); | |
return (match[1] || "" === url) && this.path(decodeURIComponent(match[1])), (match[2] || match[1] || "" === url) && this.search(match[3] || ""), this.hash(match[5] || ""), this }, protocol: locationGetter("$$protocol"), host: locationGetter("$$host"), port: locationGetter("$$port"), path: locationGetterSetter("$$path", function(path) { | |
return path = null !== path ? path.toString() : "", "/" == path.charAt(0) ? path : "/" + path }), search: function(search, paramValue) { | |
switch (arguments.length) { | |
case 0: | |
return this.$$search; | |
case 1: | |
if (isString(search) || isNumber(search)) search = search.toString(), this.$$search = parseKeyValue(search); | |
else { | |
if (!isObject(search)) throw $locationMinErr("isrcharg", "The first argument of the `$location#search()` call must be a string or an object."); | |
search = copy(search, {}), forEach(search, function(value, key) { null == value && delete search[key] }), this.$$search = search } | |
break; | |
default: | |
isUndefined(paramValue) || null === paramValue ? delete this.$$search[search] : this.$$search[search] = paramValue } | |
return this.$$compose(), this }, hash: locationGetterSetter("$$hash", function(hash) { | |
return null !== hash ? hash.toString() : "" }), replace: function() { | |
return this.$$replace = !0, this } }; | |
forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) { Location.prototype = Object.create(locationPrototype), Location.prototype.state = function(state) { | |
if (!arguments.length) return this.$$state; | |
if (Location !== LocationHtml5Url || !this.$$html5) throw $locationMinErr("nostate", "History API state support is available only in HTML5 mode and only in browsers supporting HTML5 History API"); | |
return this.$$state = isUndefined(state) ? null : state, this } }); | |
var $parseMinErr = minErr("$parse"), | |
CALL = Function.prototype.call, | |
APPLY = Function.prototype.apply, | |
BIND = Function.prototype.bind, | |
CONSTANTS = createMap(); | |
forEach({ "null": function() { | |
return null }, "true": function() { | |
return !0 }, "false": function() { | |
return !1 }, undefined: function() {} }, function(constantGetter, name) { constantGetter.constant = constantGetter.literal = constantGetter.sharedGetter = !0, CONSTANTS[name] = constantGetter }), CONSTANTS["this"] = function(self) { | |
return self }, CONSTANTS["this"].sharedGetter = !0; | |
var OPERATORS = extend(createMap(), { "+": function(self, locals, a, b) { | |
return a = a(self, locals), b = b(self, locals), isDefined(a) ? isDefined(b) ? a + b : a : isDefined(b) ? b : undefined }, "-": function(self, locals, a, b) { | |
return a = a(self, locals), b = b(self, locals), (isDefined(a) ? a : 0) - (isDefined(b) ? b : 0) }, "*": function(self, locals, a, b) { | |
return a(self, locals) * b(self, locals) }, "/": function(self, locals, a, b) { | |
return a(self, locals) / b(self, locals) }, "%": function(self, locals, a, b) { | |
return a(self, locals) % b(self, locals) }, "===": function(self, locals, a, b) { | |
return a(self, locals) === b(self, locals) }, "!==": function(self, locals, a, b) { | |
return a(self, locals) !== b(self, locals) }, "==": function(self, locals, a, b) { | |
return a(self, locals) == b(self, locals) }, "!=": function(self, locals, a, b) { | |
return a(self, locals) != b(self, locals) }, "<": function(self, locals, a, b) { | |
return a(self, locals) < b(self, locals) }, ">": function(self, locals, a, b) { | |
return a(self, locals) > b(self, locals) }, "<=": function(self, locals, a, b) { | |
return a(self, locals) <= b(self, locals) }, ">=": function(self, locals, a, b) { | |
return a(self, locals) >= b(self, locals) }, "&&": function(self, locals, a, b) { | |
return a(self, locals) && b(self, locals) }, "||": function(self, locals, a, b) { | |
return a(self, locals) || b(self, locals) }, "!": function(self, locals, a) { | |
return !a(self, locals) }, "=": !0, "|": !0 }), | |
ESCAPE = { n: "\n", f: "\f", r: "\r", t: " ", v: "", "'": "'", '"': '"' }, | |
Lexer = function(options) { this.options = options }; | |
Lexer.prototype = { constructor: Lexer, lex: function(text) { | |
for (this.text = text, this.index = 0, this.tokens = []; this.index < this.text.length;) { | |
var ch = this.text.charAt(this.index); | |
if ('"' === ch || "'" === ch) this.readString(ch); | |
else if (this.isNumber(ch) || "." === ch && this.isNumber(this.peek())) this.readNumber(); | |
else if (this.isIdent(ch)) this.readIdent(); | |
else if (this.is(ch, "(){}[].,;:?")) this.tokens.push({ index: this.index, text: ch }), this.index++; | |
else if (this.isWhitespace(ch)) this.index++; | |
else { | |
var ch2 = ch + this.peek(), | |
ch3 = ch2 + this.peek(2), | |
op1 = OPERATORS[ch], | |
op2 = OPERATORS[ch2], | |
op3 = OPERATORS[ch3]; | |
if (op1 || op2 || op3) { | |
var token = op3 ? ch3 : op2 ? ch2 : ch; | |
this.tokens.push({ index: this.index, text: token, operator: !0 }), this.index += token.length } else this.throwError("Unexpected next character ", this.index, this.index + 1) } } | |
return this.tokens }, is: function(ch, chars) { | |
return -1 !== chars.indexOf(ch) }, peek: function(i) { | |
var num = i || 1; | |
return this.index + num < this.text.length ? this.text.charAt(this.index + num) : !1 }, isNumber: function(ch) { | |
return ch >= "0" && "9" >= ch && "string" == typeof ch }, isWhitespace: function(ch) { | |
return " " === ch || "\r" === ch || " " === ch || "\n" === ch || "" === ch || " " === ch }, isIdent: function(ch) { | |
return ch >= "a" && "z" >= ch || ch >= "A" && "Z" >= ch || "_" === ch || "$" === ch }, isExpOperator: function(ch) { | |
return "-" === ch || "+" === ch || this.isNumber(ch) }, throwError: function(error, start, end) { end = end || this.index; | |
var colStr = isDefined(start) ? "s " + start + "-" + this.index + " [" + this.text.substring(start, end) + "]" : " " + end; | |
throw $parseMinErr("lexerr", "Lexer Error: {0} at column{1} in expression [{2}].", error, colStr, this.text) }, readNumber: function() { | |
for (var number = "", start = this.index; this.index < this.text.length;) { | |
var ch = lowercase(this.text.charAt(this.index)); | |
if ("." == ch || this.isNumber(ch)) number += ch; | |
else { | |
var peekCh = this.peek(); | |
if ("e" == ch && this.isExpOperator(peekCh)) number += ch; | |
else if (this.isExpOperator(ch) && peekCh && this.isNumber(peekCh) && "e" == number.charAt(number.length - 1)) number += ch; | |
else { | |
if (!this.isExpOperator(ch) || peekCh && this.isNumber(peekCh) || "e" != number.charAt(number.length - 1)) break; | |
this.throwError("Invalid exponent") } } | |
this.index++ } | |
this.tokens.push({ index: start, text: number, constant: !0, value: Number(number) }) }, readIdent: function() { | |
for (var start = this.index; this.index < this.text.length;) { | |
var ch = this.text.charAt(this.index); | |
if (!this.isIdent(ch) && !this.isNumber(ch)) break; | |
this.index++ } | |
this.tokens.push({ index: start, text: this.text.slice(start, this.index), identifier: !0 }) }, readString: function(quote) { | |
var start = this.index; | |
this.index++; | |
for (var string = "", rawString = quote, escape = !1; this.index < this.text.length;) { | |
var ch = this.text.charAt(this.index); | |
if (rawString += ch, escape) { | |
if ("u" === ch) { | |
var hex = this.text.substring(this.index + 1, this.index + 5); | |
hex.match(/[\da-f]{4}/i) || this.throwError("Invalid unicode escape [\\u" + hex + "]"), this.index += 4, string += String.fromCharCode(parseInt(hex, 16)) } else { | |
var rep = ESCAPE[ch]; | |
string += rep || ch } | |
escape = !1 } else if ("\\" === ch) escape = !0; | |
else { | |
if (ch === quote) return this.index++, void this.tokens.push({ index: start, text: rawString, constant: !0, value: string }); | |
string += ch } | |
this.index++ } | |
this.throwError("Unterminated quote", start) } }; | |
var Parser = function(lexer, $filter, options) { this.lexer = lexer, this.$filter = $filter, this.options = options }; | |
Parser.ZERO = extend(function() { | |
return 0 }, { sharedGetter: !0, constant: !0 }), Parser.prototype = { constructor: Parser, parse: function(text) { this.text = text, this.tokens = this.lexer.lex(text); | |
var value = this.statements(); | |
return 0 !== this.tokens.length && this.throwError("is an unexpected token", this.tokens[0]), value.literal = !!value.literal, value.constant = !!value.constant, value }, primary: function() { | |
var primary; | |
this.expect("(") ? (primary = this.filterChain(), this.consume(")")) : this.expect("[") ? primary = this.arrayDeclaration() : this.expect("{") ? primary = this.object() : this.peek().identifier ? primary = this.identifier() : this.peek().constant ? primary = this.constant() : this.throwError("not a primary expression", this.peek()); | |
for (var next, context; next = this.expect("(", "[", ".");) "(" === next.text ? (primary = this.functionCall(primary, context), context = null) : "[" === next.text ? (context = primary, primary = this.objectIndex(primary)) : "." === next.text ? (context = primary, primary = this.fieldAccess(primary)) : this.throwError("IMPOSSIBLE"); | |
return primary }, throwError: function(msg, token) { | |
throw $parseMinErr("syntax", "Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].", token.text, msg, token.index + 1, this.text, this.text.substring(token.index)) }, peekToken: function() { | |
if (0 === this.tokens.length) throw $parseMinErr("ueoe", "Unexpected end of expression: {0}", this.text); | |
return this.tokens[0] }, peek: function(e1, e2, e3, e4) { | |
return this.peekAhead(0, e1, e2, e3, e4) }, peekAhead: function(i, e1, e2, e3, e4) { | |
if (this.tokens.length > i) { | |
var token = this.tokens[i], | |
t = token.text; | |
if (t === e1 || t === e2 || t === e3 || t === e4 || !e1 && !e2 && !e3 && !e4) return token } | |
return !1 }, expect: function(e1, e2, e3, e4) { | |
var token = this.peek(e1, e2, e3, e4); | |
return token ? (this.tokens.shift(), token) : !1 }, consume: function(e1) { | |
if (0 === this.tokens.length) throw $parseMinErr("ueoe", "Unexpected end of expression: {0}", this.text); | |
var token = this.expect(e1); | |
return token || this.throwError("is unexpected, expecting [" + e1 + "]", this.peek()), token }, unaryFn: function(op, right) { | |
var fn = OPERATORS[op]; | |
return extend(function(self, locals) { | |
return fn(self, locals, right) }, { constant: right.constant, inputs: [right] }) }, binaryFn: function(left, op, right, isBranching) { | |
var fn = OPERATORS[op]; | |
return extend(function(self, locals) { | |
return fn(self, locals, left, right) }, { constant: left.constant && right.constant, inputs: !isBranching && [left, right] }) }, identifier: function() { | |
for (var id = this.consume().text; this.peek(".") && this.peekAhead(1).identifier && !this.peekAhead(2, "(");) id += this.consume().text + this.consume().text; | |
return CONSTANTS[id] || getterFn(id, this.options, this.text) }, constant: function() { | |
var value = this.consume().value; | |
return extend(function() { | |
return value }, { constant: !0, literal: !0 }) }, statements: function() { | |
for (var statements = [];;) | |
if (this.tokens.length > 0 && !this.peek("}", ")", ";", "]") && statements.push(this.filterChain()), !this.expect(";")) return 1 === statements.length ? statements[0] : function(self, locals) { | |
for (var value, i = 0, ii = statements.length; ii > i; i++) value = statements[i](self, locals); | |
return value } }, filterChain: function() { | |
for (var token, left = this.expression(); token = this.expect("|");) left = this.filter(left); | |
return left }, filter: function(inputFn) { | |
var argsFn, args, fn = this.$filter(this.consume().text); | |
if (this.peek(":")) | |
for (argsFn = [], args = []; this.expect(":");) argsFn.push(this.expression()); | |
var inputs = [inputFn].concat(argsFn || []); | |
return extend(function(self, locals) { | |
var input = inputFn(self, locals); | |
if (args) { args[0] = input; | |
for (var i = argsFn.length; i--;) args[i + 1] = argsFn[i](self, locals); | |
return fn.apply(undefined, args) } | |
return fn(input) }, { constant: !fn.$stateful && inputs.every(isConstant), inputs: !fn.$stateful && inputs }) }, expression: function() { | |
return this.assignment() }, assignment: function() { | |
var right, token, left = this.ternary(); | |
return (token = this.expect("=")) ? (left.assign || this.throwError("implies assignment but [" + this.text.substring(0, token.index) + "] can not be assigned to", token), right = this.ternary(), extend(function(scope, locals) { | |
return left.assign(scope, right(scope, locals), locals) }, { inputs: [left, right] })) : left }, ternary: function() { | |
var middle, token, left = this.logicalOR(); | |
if ((token = this.expect("?")) && (middle = this.assignment(), this.consume(":"))) { | |
var right = this.assignment(); | |
return extend(function(self, locals) { | |
return left(self, locals) ? middle(self, locals) : right(self, locals) }, { constant: left.constant && middle.constant && right.constant }) } | |
return left }, logicalOR: function() { | |
for (var token, left = this.logicalAND(); token = this.expect("||");) left = this.binaryFn(left, token.text, this.logicalAND(), !0); | |
return left }, logicalAND: function() { | |
var token, left = this.equality(); | |
return (token = this.expect("&&")) && (left = this.binaryFn(left, token.text, this.logicalAND(), !0)), left }, equality: function() { | |
var token, left = this.relational(); | |
return (token = this.expect("==", "!=", "===", "!==")) && (left = this.binaryFn(left, token.text, this.equality())), left }, relational: function() { | |
var token, left = this.additive(); | |
return (token = this.expect("<", ">", "<=", ">=")) && (left = this.binaryFn(left, token.text, this.relational())), left }, additive: function() { | |
for (var token, left = this.multiplicative(); token = this.expect("+", "-");) left = this.binaryFn(left, token.text, this.multiplicative()); | |
return left }, multiplicative: function() { | |
for (var token, left = this.unary(); token = this.expect("*", "/", "%");) left = this.binaryFn(left, token.text, this.unary()); | |
return left }, unary: function() { | |
var token; | |
return this.expect("+") ? this.primary() : (token = this.expect("-")) ? this.binaryFn(Parser.ZERO, token.text, this.unary()) : (token = this.expect("!")) ? this.unaryFn(token.text, this.unary()) : this.primary() }, fieldAccess: function(object) { | |
var expression = this.text, | |
field = this.consume().text, | |
getter = getterFn(field, this.options, expression); | |
return extend(function(scope, locals, self) { | |
return getter(self || object(scope, locals)) }, { assign: function(scope, value, locals) { | |
var o = object(scope, locals); | |
return o || object.assign(scope, o = {}), setter(o, field, value, expression) } }) }, objectIndex: function(obj) { | |
var expression = this.text, | |
indexFn = this.expression(); | |
return this.consume("]"), extend(function(self, locals) { | |
var v, o = obj(self, locals), | |
i = indexFn(self, locals); | |
return ensureSafeMemberName(i, expression), o ? v = ensureSafeObject(o[i], expression) : undefined }, { assign: function(self, value, locals) { | |
var key = ensureSafeMemberName(indexFn(self, locals), expression), | |
o = ensureSafeObject(obj(self, locals), expression); | |
return o || obj.assign(self, o = {}), o[key] = value } }) }, functionCall: function(fnGetter, contextGetter) { | |
var argsFn = []; | |
if (")" !== this.peekToken().text) | |
do argsFn.push(this.expression()); while (this.expect(",")); | |
this.consume(")"); | |
var expressionText = this.text, | |
args = argsFn.length ? [] : null; | |
return function(scope, locals) { | |
var context = contextGetter ? contextGetter(scope, locals) : scope, | |
fn = fnGetter(scope, locals, context) || noop; | |
if (args) | |
for (var i = argsFn.length; i--;) args[i] = ensureSafeObject(argsFn[i](scope, locals), expressionText); | |
ensureSafeObject(context, expressionText), ensureSafeFunction(fn, expressionText); | |
var v = fn.apply ? fn.apply(context, args) : fn(args[0], args[1], args[2], args[3], args[4]); | |
return ensureSafeObject(v, expressionText) } }, arrayDeclaration: function() { | |
var elementFns = []; | |
if ("]" !== this.peekToken().text) | |
do { | |
if (this.peek("]")) break; | |
elementFns.push(this.expression()) } while (this.expect(",")); | |
return this.consume("]"), extend(function(self, locals) { | |
for (var array = [], i = 0, ii = elementFns.length; ii > i; i++) array.push(elementFns[i](self, locals)); | |
return array }, { literal: !0, constant: elementFns.every(isConstant), inputs: elementFns }) }, object: function() { | |
var keys = [], | |
valueFns = []; | |
if ("}" !== this.peekToken().text) | |
do { | |
if (this.peek("}")) break; | |
var token = this.consume(); | |
token.constant ? keys.push(token.value) : token.identifier ? keys.push(token.text) : this.throwError("invalid key", token), this.consume(":"), valueFns.push(this.expression()) } while (this.expect(",")); | |
return this.consume("}"), extend(function(self, locals) { | |
for (var object = {}, i = 0, ii = valueFns.length; ii > i; i++) object[keys[i]] = valueFns[i](self, locals); | |
return object }, { literal: !0, constant: valueFns.every(isConstant), inputs: valueFns }) } }; | |
var getterFnCacheDefault = createMap(), | |
getterFnCacheExpensive = createMap(), | |
objectValueOf = Object.prototype.valueOf, | |
$sceMinErr = minErr("$sce"), | |
SCE_CONTEXTS = { HTML: "html", CSS: "css", URL: "url", RESOURCE_URL: "resourceUrl", JS: "js" }, | |
$compileMinErr = minErr("$compile"), | |
urlParsingNode = document.createElement("a"), | |
originUrl = urlResolve(window.location.href); | |
$FilterProvider.$inject = ["$provide"], currencyFilter.$inject = ["$locale"], numberFilter.$inject = ["$locale"]; | |
var DECIMAL_SEP = ".", | |
DATE_FORMATS = { yyyy: dateGetter("FullYear", 4), yy: dateGetter("FullYear", 2, 0, !0), y: dateGetter("FullYear", 1), MMMM: dateStrGetter("Month"), MMM: dateStrGetter("Month", !0), MM: dateGetter("Month", 2, 1), M: dateGetter("Month", 1, 1), dd: dateGetter("Date", 2), d: dateGetter("Date", 1), HH: dateGetter("Hours", 2), H: dateGetter("Hours", 1), hh: dateGetter("Hours", 2, -12), h: dateGetter("Hours", 1, -12), mm: dateGetter("Minutes", 2), m: dateGetter("Minutes", 1), ss: dateGetter("Seconds", 2), s: dateGetter("Seconds", 1), sss: dateGetter("Milliseconds", 3), EEEE: dateStrGetter("Day"), EEE: dateStrGetter("Day", !0), a: ampmGetter, Z: timeZoneGetter, ww: weekGetter(2), w: weekGetter(1) }, | |
DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/, | |
NUMBER_STRING = /^\-?\d+$/; | |
dateFilter.$inject = ["$locale"]; | |
var lowercaseFilter = valueFn(lowercase), | |
uppercaseFilter = valueFn(uppercase); | |
orderByFilter.$inject = ["$parse"]; | |
var htmlAnchorDirective = valueFn({ restrict: "E", compile: function(element, attr) { | |
return attr.href || attr.xlinkHref || attr.name ? void 0 : function(scope, element) { | |
var href = "[object SVGAnimatedString]" === toString.call(element.prop("href")) ? "xlink:href" : "href"; | |
element.on("click", function(event) { element.attr(href) || event.preventDefault() }) } } }), | |
ngAttributeAliasDirectives = {}; | |
forEach(BOOLEAN_ATTR, function(propName, attrName) { | |
if ("multiple" != propName) { | |
var normalized = directiveNormalize("ng-" + attrName); | |
ngAttributeAliasDirectives[normalized] = function() { | |
return { restrict: "A", priority: 100, link: function(scope, element, attr) { scope.$watch(attr[normalized], function(value) { attr.$set(attrName, !!value) }) } } } } }), forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) { | |
ngAttributeAliasDirectives[ngAttr] = function() { | |
return { | |
priority: 100, | |
link: function(scope, element, attr) { | |
if ("ngPattern" === ngAttr && "/" == attr.ngPattern.charAt(0)) { | |
var match = attr.ngPattern.match(REGEX_STRING_REGEXP); | |
if (match) return void attr.$set("ngPattern", new RegExp(match[1], match[2])) | |
} | |
scope.$watch(attr[ngAttr], function(value) { attr.$set(ngAttr, value) }) | |
} | |
} | |
} | |
}), forEach(["src", "srcset", "href"], function(attrName) { | |
var normalized = directiveNormalize("ng-" + attrName); | |
ngAttributeAliasDirectives[normalized] = function() { | |
return { priority: 99, link: function(scope, element, attr) { | |
var propName = attrName, | |
name = attrName; "href" === attrName && "[object SVGAnimatedString]" === toString.call(element.prop("href")) && (name = "xlinkHref", attr.$attr[name] = "xlink:href", propName = null), attr.$observe(normalized, function(value) { | |
return value ? (attr.$set(name, value), void(msie && propName && element.prop(propName, attr[name]))) : void("href" === attrName && attr.$set(name, null)) }) } } } }); | |
var nullFormCtrl = { $addControl: noop, $$renameControl: nullFormRenameControl, $removeControl: noop, $setValidity: noop, $setDirty: noop, $setPristine: noop, $setSubmitted: noop }, | |
SUBMITTED_CLASS = "ng-submitted"; | |
FormController.$inject = ["$element", "$attrs", "$scope", "$animate", "$interpolate"]; | |
var formDirectiveFactory = function(isNgForm) { | |
return ["$timeout", function($timeout) { | |
var formDirective = { name: "form", restrict: isNgForm ? "EAC" : "E", controller: FormController, compile: function(formElement) { | |
return formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS), { pre: function(scope, formElement, attr, controller) { | |
if (!("action" in attr)) { | |
var handleFormSubmission = function(event) { scope.$apply(function() { controller.$commitViewValue(), controller.$setSubmitted() }), event.preventDefault() }; | |
addEventListenerFn(formElement[0], "submit", handleFormSubmission), formElement.on("$destroy", function() { $timeout(function() { removeEventListenerFn(formElement[0], "submit", handleFormSubmission) }, 0, !1) }) } | |
var parentFormCtrl = controller.$$parentForm, | |
alias = controller.$name; | |
alias && (setter(scope, alias, controller, alias), attr.$observe(attr.name ? "name" : "ngForm", function(newValue) { alias !== newValue && (setter(scope, alias, undefined, alias), alias = newValue, setter(scope, alias, controller, alias), parentFormCtrl.$$renameControl(controller, alias)) })), formElement.on("$destroy", function() { parentFormCtrl.$removeControl(controller), alias && setter(scope, alias, undefined, alias), extend(controller, nullFormCtrl) }) } } } }; | |
return formDirective }] }, | |
formDirective = formDirectiveFactory(), | |
ngFormDirective = formDirectiveFactory(!0), | |
ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/, | |
URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/, | |
EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i, | |
NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/, | |
DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/, | |
DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/, | |
WEEK_REGEXP = /^(\d{4})-W(\d\d)$/, | |
MONTH_REGEXP = /^(\d{4})-(\d\d)$/, | |
TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/, | |
DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/, | |
$ngModelMinErr = new minErr("ngModel"), | |
inputType = { text: textInputType, date: createDateInputType("date", DATE_REGEXP, createDateParser(DATE_REGEXP, ["yyyy", "MM", "dd"]), "yyyy-MM-dd"), "datetime-local": createDateInputType("datetimelocal", DATETIMELOCAL_REGEXP, createDateParser(DATETIMELOCAL_REGEXP, ["yyyy", "MM", "dd", "HH", "mm", "ss", "sss"]), "yyyy-MM-ddTHH:mm:ss.sss"), time: createDateInputType("time", TIME_REGEXP, createDateParser(TIME_REGEXP, ["HH", "mm", "ss", "sss"]), "HH:mm:ss.sss"), week: createDateInputType("week", WEEK_REGEXP, weekParser, "yyyy-Www"), month: createDateInputType("month", MONTH_REGEXP, createDateParser(MONTH_REGEXP, ["yyyy", "MM"]), "yyyy-MM"), number: numberInputType, url: urlInputType, email: emailInputType, radio: radioInputType, checkbox: checkboxInputType, hidden: noop, button: noop, submit: noop, reset: noop, file: noop }, | |
inputDirective = ["$browser", "$sniffer", "$filter", "$parse", function($browser, $sniffer, $filter, $parse) { | |
return { restrict: "E", require: ["?ngModel"], link: { pre: function(scope, element, attr, ctrls) { ctrls[0] && (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer, $browser, $filter, $parse) } } } }], | |
VALID_CLASS = "ng-valid", | |
INVALID_CLASS = "ng-invalid", | |
PRISTINE_CLASS = "ng-pristine", | |
DIRTY_CLASS = "ng-dirty", | |
UNTOUCHED_CLASS = "ng-untouched", | |
TOUCHED_CLASS = "ng-touched", | |
PENDING_CLASS = "ng-pending", | |
NgModelController = ["$scope", "$exceptionHandler", "$attrs", "$element", "$parse", "$animate", "$timeout", "$rootScope", "$q", "$interpolate", function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate) { this.$viewValue = Number.NaN, this.$modelValue = Number.NaN, this.$$rawModelValue = undefined, this.$validators = {}, this.$asyncValidators = {}, this.$parsers = [], this.$formatters = [], this.$viewChangeListeners = [], this.$untouched = !0, this.$touched = !1, this.$pristine = !0, this.$dirty = !1, this.$valid = !0, this.$invalid = !1, this.$error = {}, this.$$success = {}, this.$pending = undefined, this.$name = $interpolate($attr.name || "", !1)($scope); | |
var parsedNgModel = $parse($attr.ngModel), | |
parsedNgModelAssign = parsedNgModel.assign, | |
ngModelGet = parsedNgModel, | |
ngModelSet = parsedNgModelAssign, | |
pendingDebounce = null, | |
ctrl = this; | |
this.$$setOptions = function(options) { | |
if (ctrl.$options = options, options && options.getterSetter) { | |
var invokeModelGetter = $parse($attr.ngModel + "()"), | |
invokeModelSetter = $parse($attr.ngModel + "($$$p)"); | |
ngModelGet = function($scope) { | |
var modelValue = parsedNgModel($scope); | |
return isFunction(modelValue) && (modelValue = invokeModelGetter($scope)), modelValue }, ngModelSet = function($scope) { isFunction(parsedNgModel($scope)) ? invokeModelSetter($scope, { $$$p: ctrl.$modelValue }) : parsedNgModelAssign($scope, ctrl.$modelValue) } } else if (!parsedNgModel.assign) throw $ngModelMinErr("nonassign", "Expression '{0}' is non-assignable. Element: {1}", $attr.ngModel, startingTag($element)) }, this.$render = noop, this.$isEmpty = function(value) { | |
return isUndefined(value) || "" === value || null === value || value !== value }; | |
var parentForm = $element.inheritedData("$formController") || nullFormCtrl, | |
currentValidationRunId = 0; | |
addSetValidityMethod({ ctrl: this, $element: $element, set: function(object, property) { object[property] = !0 }, unset: function(object, property) { delete object[property] }, parentForm: parentForm, $animate: $animate }), this.$setPristine = function() { ctrl.$dirty = !1, ctrl.$pristine = !0, $animate.removeClass($element, DIRTY_CLASS), $animate.addClass($element, PRISTINE_CLASS) }, this.$setDirty = function() { ctrl.$dirty = !0, ctrl.$pristine = !1, $animate.removeClass($element, PRISTINE_CLASS), $animate.addClass($element, DIRTY_CLASS), parentForm.$setDirty() }, this.$setUntouched = function() { ctrl.$touched = !1, ctrl.$untouched = !0, $animate.setClass($element, UNTOUCHED_CLASS, TOUCHED_CLASS) }, this.$setTouched = function() { ctrl.$touched = !0, ctrl.$untouched = !1, $animate.setClass($element, TOUCHED_CLASS, UNTOUCHED_CLASS) }, this.$rollbackViewValue = function() { $timeout.cancel(pendingDebounce), ctrl.$viewValue = ctrl.$$lastCommittedViewValue, ctrl.$render() }, this.$validate = function() { | |
if (!isNumber(ctrl.$modelValue) || !isNaN(ctrl.$modelValue)) { | |
var viewValue = ctrl.$$lastCommittedViewValue, | |
modelValue = ctrl.$$rawModelValue, | |
parserName = ctrl.$$parserName || "parse", | |
parserValid = ctrl.$error[parserName] ? !1 : undefined, | |
prevValid = ctrl.$valid, | |
prevModelValue = ctrl.$modelValue, | |
allowInvalid = ctrl.$options && ctrl.$options.allowInvalid; | |
ctrl.$$runValidators(parserValid, modelValue, viewValue, function(allValid) { allowInvalid || prevValid === allValid || (ctrl.$modelValue = allValid ? modelValue : undefined, ctrl.$modelValue !== prevModelValue && ctrl.$$writeModelToScope()) }) } }, this.$$runValidators = function(parseValid, modelValue, viewValue, doneCallback) { | |
function processParseErrors(parseValid) { | |
var errorKey = ctrl.$$parserName || "parse"; | |
if (parseValid === undefined) setValidity(errorKey, null); | |
else if (setValidity(errorKey, parseValid), !parseValid) return forEach(ctrl.$validators, function(v, name) { setValidity(name, null) }), forEach(ctrl.$asyncValidators, function(v, name) { setValidity(name, null) }), !1; | |
return !0 } | |
function processSyncValidators() { | |
var syncValidatorsValid = !0; | |
return forEach(ctrl.$validators, function(validator, name) { | |
var result = validator(modelValue, viewValue); | |
syncValidatorsValid = syncValidatorsValid && result, setValidity(name, result) }), syncValidatorsValid ? !0 : (forEach(ctrl.$asyncValidators, function(v, name) { setValidity(name, null) }), !1) } | |
function processAsyncValidators() { | |
var validatorPromises = [], | |
allValid = !0; | |
forEach(ctrl.$asyncValidators, function(validator, name) { | |
var promise = validator(modelValue, viewValue); | |
if (!isPromiseLike(promise)) throw $ngModelMinErr("$asyncValidators", "Expected asynchronous validator to return a promise but got '{0}' instead.", promise); | |
setValidity(name, undefined), validatorPromises.push(promise.then(function() { setValidity(name, !0) }, function() { allValid = !1, setValidity(name, !1) })) }), validatorPromises.length ? $q.all(validatorPromises).then(function() { validationDone(allValid) }, noop) : validationDone(!0) } | |
function setValidity(name, isValid) { localValidationRunId === currentValidationRunId && ctrl.$setValidity(name, isValid) } | |
function validationDone(allValid) { localValidationRunId === currentValidationRunId && doneCallback(allValid) } | |
currentValidationRunId++; | |
var localValidationRunId = currentValidationRunId; | |
return processParseErrors(parseValid) && processSyncValidators() ? void processAsyncValidators() : void validationDone(!1) }, this.$commitViewValue = function() { | |
var viewValue = ctrl.$viewValue; | |
$timeout.cancel(pendingDebounce), (ctrl.$$lastCommittedViewValue !== viewValue || "" === viewValue && ctrl.$$hasNativeValidators) && (ctrl.$$lastCommittedViewValue = viewValue, ctrl.$pristine && this.$setDirty(), this.$$parseAndValidate()) }, this.$$parseAndValidate = function() { | |
function writeToModelIfNeeded() { ctrl.$modelValue !== prevModelValue && ctrl.$$writeModelToScope() } | |
var viewValue = ctrl.$$lastCommittedViewValue, | |
modelValue = viewValue, | |
parserValid = isUndefined(modelValue) ? undefined : !0; | |
if (parserValid) | |
for (var i = 0; i < ctrl.$parsers.length; i++) | |
if (modelValue = ctrl.$parsers[i](modelValue), isUndefined(modelValue)) { parserValid = !1; | |
break } | |
isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue) && (ctrl.$modelValue = ngModelGet($scope)); | |
var prevModelValue = ctrl.$modelValue, | |
allowInvalid = ctrl.$options && ctrl.$options.allowInvalid; | |
ctrl.$$rawModelValue = modelValue, allowInvalid && (ctrl.$modelValue = modelValue, writeToModelIfNeeded()), ctrl.$$runValidators(parserValid, modelValue, viewValue, function(allValid) { allowInvalid || (ctrl.$modelValue = allValid ? modelValue : undefined, writeToModelIfNeeded()) }) }, this.$$writeModelToScope = function() { ngModelSet($scope, ctrl.$modelValue), forEach(ctrl.$viewChangeListeners, function(listener) { | |
try { listener() } catch (e) { $exceptionHandler(e) } }) }, this.$setViewValue = function(value, trigger) { ctrl.$viewValue = value, (!ctrl.$options || ctrl.$options.updateOnDefault) && ctrl.$$debounceViewValueCommit(trigger) }, this.$$debounceViewValueCommit = function(trigger) { | |
var debounce, debounceDelay = 0, | |
options = ctrl.$options; | |
options && isDefined(options.debounce) && (debounce = options.debounce, isNumber(debounce) ? debounceDelay = debounce : isNumber(debounce[trigger]) ? debounceDelay = debounce[trigger] : isNumber(debounce["default"]) && (debounceDelay = debounce["default"])), $timeout.cancel(pendingDebounce), debounceDelay ? pendingDebounce = $timeout(function() { ctrl.$commitViewValue() }, debounceDelay) : $rootScope.$$phase ? ctrl.$commitViewValue() : $scope.$apply(function() { ctrl.$commitViewValue() }) }, $scope.$watch(function() { | |
var modelValue = ngModelGet($scope); | |
if (modelValue !== ctrl.$modelValue) { ctrl.$modelValue = ctrl.$$rawModelValue = modelValue; | |
for (var formatters = ctrl.$formatters, idx = formatters.length, viewValue = modelValue; idx--;) viewValue = formatters[idx](viewValue); | |
ctrl.$viewValue !== viewValue && (ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue, ctrl.$render(), ctrl.$$runValidators(undefined, modelValue, viewValue, noop)) } | |
return modelValue }) }], | |
ngModelDirective = ["$rootScope", function($rootScope) { | |
return { restrict: "A", require: ["ngModel", "^?form", "^?ngModelOptions"], controller: NgModelController, priority: 1, compile: function(element) { | |
return element.addClass(PRISTINE_CLASS).addClass(UNTOUCHED_CLASS).addClass(VALID_CLASS), { pre: function(scope, element, attr, ctrls) { | |
var modelCtrl = ctrls[0], | |
formCtrl = ctrls[1] || nullFormCtrl; | |
modelCtrl.$$setOptions(ctrls[2] && ctrls[2].$options), formCtrl.$addControl(modelCtrl), attr.$observe("name", function(newValue) { modelCtrl.$name !== newValue && formCtrl.$$renameControl(modelCtrl, newValue) }), scope.$on("$destroy", function() { formCtrl.$removeControl(modelCtrl) }) }, post: function(scope, element, attr, ctrls) { | |
var modelCtrl = ctrls[0]; | |
modelCtrl.$options && modelCtrl.$options.updateOn && element.on(modelCtrl.$options.updateOn, function(ev) { modelCtrl.$$debounceViewValueCommit(ev && ev.type) }), element.on("blur", function() { modelCtrl.$touched || ($rootScope.$$phase ? scope.$evalAsync(modelCtrl.$setTouched) : scope.$apply(modelCtrl.$setTouched)) }) } } } } }], | |
ngChangeDirective = valueFn({ restrict: "A", require: "ngModel", link: function(scope, element, attr, ctrl) { ctrl.$viewChangeListeners.push(function() { scope.$eval(attr.ngChange) }) } }), | |
requiredDirective = function() { | |
return { restrict: "A", require: "?ngModel", link: function(scope, elm, attr, ctrl) { ctrl && (attr.required = !0, ctrl.$validators.required = function(modelValue, viewValue) { | |
return !attr.required || !ctrl.$isEmpty(viewValue) }, attr.$observe("required", function() { ctrl.$validate() })) } } }, | |
patternDirective = function() { | |
return { restrict: "A", require: "?ngModel", link: function(scope, elm, attr, ctrl) { | |
if (ctrl) { | |
var regexp, patternExp = attr.ngPattern || attr.pattern; | |
attr.$observe("pattern", function(regex) { | |
if (isString(regex) && regex.length > 0 && (regex = new RegExp("^" + regex + "$")), regex && !regex.test) throw minErr("ngPattern")("noregexp", "Expected {0} to be a RegExp but was {1}. Element: {2}", patternExp, regex, startingTag(elm)); | |
regexp = regex || undefined, ctrl.$validate() }), ctrl.$validators.pattern = function(value) { | |
return ctrl.$isEmpty(value) || isUndefined(regexp) || regexp.test(value) } } } } }, | |
maxlengthDirective = function() { | |
return { restrict: "A", require: "?ngModel", link: function(scope, elm, attr, ctrl) { | |
if (ctrl) { | |
var maxlength = -1; | |
attr.$observe("maxlength", function(value) { | |
var intVal = int(value); | |
maxlength = isNaN(intVal) ? -1 : intVal, ctrl.$validate() }), ctrl.$validators.maxlength = function(modelValue, viewValue) { | |
return 0 > maxlength || ctrl.$isEmpty(modelValue) || viewValue.length <= maxlength } } } } }, | |
minlengthDirective = function() { | |
return { restrict: "A", require: "?ngModel", link: function(scope, elm, attr, ctrl) { | |
if (ctrl) { | |
var minlength = 0; | |
attr.$observe("minlength", function(value) { minlength = int(value) || 0, ctrl.$validate() }), ctrl.$validators.minlength = function(modelValue, viewValue) { | |
return ctrl.$isEmpty(viewValue) || viewValue.length >= minlength } } } } }, | |
ngListDirective = function() { | |
return { restrict: "A", priority: 100, require: "ngModel", link: function(scope, element, attr, ctrl) { | |
var ngList = element.attr(attr.$attr.ngList) || ", ", | |
trimValues = "false" !== attr.ngTrim, | |
separator = trimValues ? trim(ngList) : ngList, | |
parse = function(viewValue) { | |
if (!isUndefined(viewValue)) { | |
var list = []; | |
return viewValue && forEach(viewValue.split(separator), function(value) { value && list.push(trimValues ? trim(value) : value) }), list } }; | |
ctrl.$parsers.push(parse), ctrl.$formatters.push(function(value) { | |
return isArray(value) ? value.join(ngList) : undefined }), ctrl.$isEmpty = function(value) { | |
return !value || !value.length } } } }, | |
CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/, | |
ngValueDirective = function() { | |
return { restrict: "A", priority: 100, compile: function(tpl, tplAttr) { | |
return CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue) ? function(scope, elm, attr) { attr.$set("value", scope.$eval(attr.ngValue)) } : function(scope, elm, attr) { scope.$watch(attr.ngValue, function(value) { attr.$set("value", value) }) } } } }, | |
ngModelOptionsDirective = function() { | |
return { restrict: "A", controller: ["$scope", "$attrs", function($scope, $attrs) { | |
var that = this; | |
this.$options = $scope.$eval($attrs.ngModelOptions), this.$options.updateOn !== undefined ? (this.$options.updateOnDefault = !1, this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() { | |
return that.$options.updateOnDefault = !0, " " }))) : this.$options.updateOnDefault = !0 }] } }, | |
ngBindDirective = ["$compile", function($compile) { | |
return { restrict: "AC", compile: function(templateElement) { | |
return $compile.$$addBindingClass(templateElement), | |
function(scope, element, attr) { $compile.$$addBindingInfo(element, attr.ngBind), element = element[0], scope.$watch(attr.ngBind, function(value) { element.textContent = value === undefined ? "" : value }) } } } }], | |
ngBindTemplateDirective = ["$interpolate", "$compile", function($interpolate, $compile) { | |
return { compile: function(templateElement) { | |
return $compile.$$addBindingClass(templateElement), | |
function(scope, element, attr) { | |
var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate)); | |
$compile.$$addBindingInfo(element, interpolateFn.expressions), element = element[0], attr.$observe("ngBindTemplate", function(value) { element.textContent = value === undefined ? "" : value }) } } } }], | |
ngBindHtmlDirective = ["$sce", "$parse", "$compile", function($sce, $parse, $compile) { | |
return { restrict: "A", compile: function(tElement, tAttrs) { | |
var ngBindHtmlGetter = $parse(tAttrs.ngBindHtml), | |
ngBindHtmlWatch = $parse(tAttrs.ngBindHtml, function(value) { | |
return (value || "").toString() }); | |
return $compile.$$addBindingClass(tElement), | |
function(scope, element, attr) { $compile.$$addBindingInfo(element, attr.ngBindHtml), scope.$watch(ngBindHtmlWatch, function() { element.html($sce.getTrustedHtml(ngBindHtmlGetter(scope)) || "") }) } } } }], | |
ngClassDirective = classDirective("", !0), | |
ngClassOddDirective = classDirective("Odd", 0), | |
ngClassEvenDirective = classDirective("Even", 1), | |
ngCloakDirective = ngDirective({ compile: function(element, attr) { attr.$set("ngCloak", undefined), element.removeClass("ng-cloak") } }), | |
ngControllerDirective = [function() { | |
return { restrict: "A", scope: !0, controller: "@", priority: 500 } }], | |
ngEventDirectives = {}, | |
forceAsyncEvents = { blur: !0, focus: !0 }; | |
forEach("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "), function(eventName) { | |
var directiveName = directiveNormalize("ng-" + eventName); | |
ngEventDirectives[directiveName] = ["$parse", "$rootScope", function($parse, $rootScope) { | |
return { restrict: "A", compile: function($element, attr) { | |
var fn = $parse(attr[directiveName], null, !0); | |
return function(scope, element) { element.on(eventName, function(event) { | |
var callback = function() { fn(scope, { $event: event }) }; | |
forceAsyncEvents[eventName] && $rootScope.$$phase ? scope.$evalAsync(callback) : scope.$apply(callback) }) } } } }] }); | |
var ngIfDirective = ["$animate", function($animate) { | |
return { multiElement: !0, transclude: "element", priority: 600, terminal: !0, restrict: "A", $$tlb: !0, link: function($scope, $element, $attr, ctrl, $transclude) { | |
var block, childScope, previousElements; | |
$scope.$watch($attr.ngIf, function(value) { value ? childScope || $transclude(function(clone, newScope) { childScope = newScope, clone[clone.length++] = document.createComment(" end ngIf: " + $attr.ngIf + " "), block = { clone: clone }, $animate.enter(clone, $element.parent(), $element) }) : (previousElements && (previousElements.remove(), previousElements = null), childScope && (childScope.$destroy(), childScope = null), block && (previousElements = getBlockNodes(block.clone), $animate.leave(previousElements).then(function() { previousElements = null }), block = null)) }) } } }], | |
ngIncludeDirective = ["$templateRequest", "$anchorScroll", "$animate", "$sce", function($templateRequest, $anchorScroll, $animate, $sce) { | |
return { restrict: "ECA", priority: 400, terminal: !0, transclude: "element", controller: angular.noop, compile: function(element, attr) { | |
var srcExp = attr.ngInclude || attr.src, | |
onloadExp = attr.onload || "", | |
autoScrollExp = attr.autoscroll; | |
return function(scope, $element, $attr, ctrl, $transclude) { | |
var currentScope, previousElement, currentElement, changeCounter = 0, | |
cleanupLastIncludeContent = function() { previousElement && (previousElement.remove(), previousElement = null), currentScope && (currentScope.$destroy(), currentScope = null), currentElement && ($animate.leave(currentElement).then(function() { previousElement = null }), previousElement = currentElement, currentElement = null) }; | |
scope.$watch($sce.parseAsResourceUrl(srcExp), function(src) { | |
var afterAnimation = function() {!isDefined(autoScrollExp) || autoScrollExp && !scope.$eval(autoScrollExp) || $anchorScroll() }, | |
thisChangeId = ++changeCounter; | |
src ? ($templateRequest(src, !0).then(function(response) { | |
if (thisChangeId === changeCounter) { | |
var newScope = scope.$new(); | |
ctrl.template = response; | |
var clone = $transclude(newScope, function(clone) { cleanupLastIncludeContent(), $animate.enter(clone, null, $element).then(afterAnimation) }); | |
currentScope = newScope, currentElement = clone, currentScope.$emit("$includeContentLoaded", src), scope.$eval(onloadExp) } }, function() { thisChangeId === changeCounter && (cleanupLastIncludeContent(), scope.$emit("$includeContentError", src)) }), scope.$emit("$includeContentRequested", src)) : (cleanupLastIncludeContent(), ctrl.template = null) }) } } } }], | |
ngIncludeFillContentDirective = ["$compile", function($compile) { | |
return { restrict: "ECA", priority: -400, require: "ngInclude", link: function(scope, $element, $attr, ctrl) { | |
return /SVG/.test($element[0].toString()) ? ($element.empty(), void $compile(jqLiteBuildFragment(ctrl.template, document).childNodes)(scope, function(clone) { $element.append(clone) }, { futureParentElement: $element })) : ($element.html(ctrl.template), void $compile($element.contents())(scope)) } } }], | |
ngInitDirective = ngDirective({ priority: 450, compile: function() { | |
return { pre: function(scope, element, attrs) { scope.$eval(attrs.ngInit) } } } }), | |
ngNonBindableDirective = ngDirective({ terminal: !0, priority: 1e3 }), | |
ngPluralizeDirective = ["$locale", "$interpolate", function($locale, $interpolate) { | |
var BRACE = /{}/g, | |
IS_WHEN = /^when(Minus)?(.+)$/; | |
return { restrict: "EA", link: function(scope, element, attr) { | |
function updateElementText(newText) { element.text(newText || "") } | |
var lastCount, numberExp = attr.count, | |
whenExp = attr.$attr.when && element.attr(attr.$attr.when), | |
offset = attr.offset || 0, | |
whens = scope.$eval(whenExp) || {}, | |
whensExpFns = {}, | |
startSymbol = $interpolate.startSymbol(), | |
endSymbol = $interpolate.endSymbol(), | |
braceReplacement = startSymbol + numberExp + "-" + offset + endSymbol, | |
watchRemover = angular.noop; | |
forEach(attr, function(expression, attributeName) { | |
var tmpMatch = IS_WHEN.exec(attributeName); | |
if (tmpMatch) { | |
var whenKey = (tmpMatch[1] ? "-" : "") + lowercase(tmpMatch[2]); | |
whens[whenKey] = element.attr(attr.$attr[attributeName]) } }), forEach(whens, function(expression, key) { whensExpFns[key] = $interpolate(expression.replace(BRACE, braceReplacement)) }), scope.$watch(numberExp, function(newVal) { | |
var count = parseFloat(newVal), | |
countIsNaN = isNaN(count); | |
countIsNaN || count in whens || (count = $locale.pluralCat(count - offset)), count === lastCount || countIsNaN && isNaN(lastCount) || (watchRemover(), watchRemover = scope.$watch(whensExpFns[count], updateElementText), lastCount = count) }) } } }], | |
ngRepeatDirective = ["$parse", "$animate", function($parse, $animate) { | |
var NG_REMOVED = "$$NG_REMOVED", | |
ngRepeatMinErr = minErr("ngRepeat"), | |
updateScope = function(scope, index, valueIdentifier, value, keyIdentifier, key, arrayLength) { scope[valueIdentifier] = value, keyIdentifier && (scope[keyIdentifier] = key), scope.$index = index, scope.$first = 0 === index, scope.$last = index === arrayLength - 1, scope.$middle = !(scope.$first || scope.$last), scope.$odd = !(scope.$even = 0 === (1 & index)) }, | |
getBlockStart = function(block) { | |
return block.clone[0] }, | |
getBlockEnd = function(block) { | |
return block.clone[block.clone.length - 1] }; | |
return { restrict: "A", multiElement: !0, transclude: "element", priority: 1e3, terminal: !0, $$tlb: !0, compile: function($element, $attr) { | |
var expression = $attr.ngRepeat, | |
ngRepeatEndComment = document.createComment(" end ngRepeat: " + expression + " "), | |
match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/); | |
if (!match) throw ngRepeatMinErr("iexp", "Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.", expression); | |
var lhs = match[1], | |
rhs = match[2], | |
aliasAs = match[3], | |
trackByExp = match[4]; | |
if (match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/), !match) throw ngRepeatMinErr("iidexp", "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.", lhs); | |
var valueIdentifier = match[3] || match[1], | |
keyIdentifier = match[2]; | |
if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) || /^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent)$/.test(aliasAs))) throw ngRepeatMinErr("badident", "alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.", aliasAs); | |
var trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn, hashFnLocals = { $id: hashKey }; | |
return trackByExp ? trackByExpGetter = $parse(trackByExp) : (trackByIdArrayFn = function(key, value) { | |
return hashKey(value) }, trackByIdObjFn = function(key) { | |
return key }), | |
function($scope, $element, $attr, ctrl, $transclude) { trackByExpGetter && (trackByIdExpFn = function(key, value, index) { | |
return keyIdentifier && (hashFnLocals[keyIdentifier] = key), hashFnLocals[valueIdentifier] = value, hashFnLocals.$index = index, trackByExpGetter($scope, hashFnLocals) }); | |
var lastBlockMap = createMap(); | |
$scope.$watchCollection(rhs, function(collection) { | |
var index, length, nextNode, collectionLength, key, value, trackById, trackByIdFn, collectionKeys, block, nextBlockOrder, elementsToRemove, previousNode = $element[0], | |
nextBlockMap = createMap(); | |
if (aliasAs && ($scope[aliasAs] = collection), isArrayLike(collection)) collectionKeys = collection, trackByIdFn = trackByIdExpFn || trackByIdArrayFn; | |
else { trackByIdFn = trackByIdExpFn || trackByIdObjFn, collectionKeys = []; | |
for (var itemKey in collection) collection.hasOwnProperty(itemKey) && "$" != itemKey.charAt(0) && collectionKeys.push(itemKey); | |
collectionKeys.sort() } | |
for (collectionLength = collectionKeys.length, nextBlockOrder = new Array(collectionLength), index = 0; collectionLength > index; index++) | |
if (key = collection === collectionKeys ? index : collectionKeys[index], value = collection[key], trackById = trackByIdFn(key, value, index), lastBlockMap[trackById]) block = lastBlockMap[trackById], delete lastBlockMap[trackById], nextBlockMap[trackById] = block, nextBlockOrder[index] = block; | |
else { | |
if (nextBlockMap[trackById]) throw forEach(nextBlockOrder, function(block) { block && block.scope && (lastBlockMap[block.id] = block) }), ngRepeatMinErr("dupes", "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}", expression, trackById, value); | |
nextBlockOrder[index] = { id: trackById, scope: undefined, clone: undefined }, nextBlockMap[trackById] = !0 } | |
for (var blockKey in lastBlockMap) { | |
if (block = lastBlockMap[blockKey], elementsToRemove = getBlockNodes(block.clone), $animate.leave(elementsToRemove), elementsToRemove[0].parentNode) | |
for (index = 0, length = elementsToRemove.length; length > index; index++) elementsToRemove[index][NG_REMOVED] = !0; | |
block.scope.$destroy() } | |
for (index = 0; collectionLength > index; index++) | |
if (key = collection === collectionKeys ? index : collectionKeys[index], value = collection[key], block = nextBlockOrder[index], block.scope) { nextNode = previousNode; | |
do nextNode = nextNode.nextSibling; while (nextNode && nextNode[NG_REMOVED]); | |
getBlockStart(block) != nextNode && $animate.move(getBlockNodes(block.clone), null, jqLite(previousNode)), previousNode = getBlockEnd(block), updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength) } else $transclude(function(clone, scope) { block.scope = scope; | |
var endNode = ngRepeatEndComment.cloneNode(!1); | |
clone[clone.length++] = endNode, $animate.enter(clone, null, jqLite(previousNode)), previousNode = endNode, block.clone = clone, nextBlockMap[block.id] = block, updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength) }); | |
lastBlockMap = nextBlockMap }) } } } }], | |
NG_HIDE_CLASS = "ng-hide", | |
NG_HIDE_IN_PROGRESS_CLASS = "ng-hide-animate", | |
ngShowDirective = ["$animate", function($animate) { | |
return { restrict: "A", multiElement: !0, link: function(scope, element, attr) { scope.$watch(attr.ngShow, function(value) { $animate[value ? "removeClass" : "addClass"](element, NG_HIDE_CLASS, { tempClasses: NG_HIDE_IN_PROGRESS_CLASS }) }) } } }], | |
ngHideDirective = ["$animate", function($animate) { | |
return { restrict: "A", multiElement: !0, link: function(scope, element, attr) { scope.$watch(attr.ngHide, function(value) { $animate[value ? "addClass" : "removeClass"](element, NG_HIDE_CLASS, { tempClasses: NG_HIDE_IN_PROGRESS_CLASS }) }) } } }], | |
ngStyleDirective = ngDirective(function(scope, element, attr) { scope.$watch(attr.ngStyle, function(newStyles, oldStyles) { oldStyles && newStyles !== oldStyles && forEach(oldStyles, function(val, style) { element.css(style, "") }), newStyles && element.css(newStyles) }, !0) }), | |
ngSwitchDirective = ["$animate", function($animate) { | |
return { restrict: "EA", require: "ngSwitch", controller: ["$scope", function() { this.cases = {} }], link: function(scope, element, attr, ngSwitchController) { | |
var watchExpr = attr.ngSwitch || attr.on, | |
selectedTranscludes = [], | |
selectedElements = [], | |
previousLeaveAnimations = [], | |
selectedScopes = [], | |
spliceFactory = function(array, index) { | |
return function() { array.splice(index, 1) } }; | |
scope.$watch(watchExpr, function(value) { | |
var i, ii; | |
for (i = 0, ii = previousLeaveAnimations.length; ii > i; ++i) $animate.cancel(previousLeaveAnimations[i]); | |
for (previousLeaveAnimations.length = 0, i = 0, ii = selectedScopes.length; ii > i; ++i) { | |
var selected = getBlockNodes(selectedElements[i].clone); | |
selectedScopes[i].$destroy(); | |
var promise = previousLeaveAnimations[i] = $animate.leave(selected); | |
promise.then(spliceFactory(previousLeaveAnimations, i)) } | |
selectedElements.length = 0, selectedScopes.length = 0, (selectedTranscludes = ngSwitchController.cases["!" + value] || ngSwitchController.cases["?"]) && forEach(selectedTranscludes, function(selectedTransclude) { selectedTransclude.transclude(function(caseElement, selectedScope) { selectedScopes.push(selectedScope); | |
var anchor = selectedTransclude.element; | |
caseElement[caseElement.length++] = document.createComment(" end ngSwitchWhen: "); | |
var block = { clone: caseElement }; | |
selectedElements.push(block), $animate.enter(caseElement, anchor.parent(), anchor) }) }) }) } } }], | |
ngSwitchWhenDirective = ngDirective({ transclude: "element", priority: 1200, require: "^ngSwitch", multiElement: !0, link: function(scope, element, attrs, ctrl, $transclude) { ctrl.cases["!" + attrs.ngSwitchWhen] = ctrl.cases["!" + attrs.ngSwitchWhen] || [], ctrl.cases["!" + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element }) } }), | |
ngSwitchDefaultDirective = ngDirective({ transclude: "element", priority: 1200, require: "^ngSwitch", multiElement: !0, link: function(scope, element, attr, ctrl, $transclude) { ctrl.cases["?"] = ctrl.cases["?"] || [], ctrl.cases["?"].push({ transclude: $transclude, element: element }) } }), | |
ngTranscludeDirective = ngDirective({ restrict: "EAC", link: function($scope, $element, $attrs, controller, $transclude) { | |
if (!$transclude) throw minErr("ngTransclude")("orphan", "Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}", startingTag($element)); | |
$transclude(function(clone) { $element.empty(), $element.append(clone) }) } }), | |
scriptDirective = ["$templateCache", function($templateCache) { | |
return { restrict: "E", terminal: !0, compile: function(element, attr) { | |
if ("text/ng-template" == attr.type) { | |
var templateUrl = attr.id, | |
text = element[0].text; | |
$templateCache.put(templateUrl, text) } } } }], | |
ngOptionsMinErr = minErr("ngOptions"), | |
ngOptionsDirective = valueFn({ restrict: "A", terminal: !0 }), | |
selectDirective = ["$compile", "$parse", function($compile, $parse) { | |
var NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/, | |
nullModelCtrl = { $setViewValue: noop }; | |
return { | |
restrict: "E", | |
require: ["select", "?ngModel"], | |
controller: ["$element", "$scope", "$attrs", function($element, $scope, $attrs) { | |
var nullOption, unknownOption, self = this, | |
optionsMap = {}, | |
ngModelCtrl = nullModelCtrl; | |
self.databound = $attrs.ngModel, self.init = function(ngModelCtrl_, nullOption_, unknownOption_) { ngModelCtrl = ngModelCtrl_, nullOption = nullOption_, unknownOption = unknownOption_ }, self.addOption = function(value, element) { assertNotHasOwnProperty(value, '"option value"'), optionsMap[value] = !0, ngModelCtrl.$viewValue == value && ($element.val(value), unknownOption.parent() && unknownOption.remove()), element && element[0].hasAttribute("selected") && (element[0].selected = !0) }, self.removeOption = function(value) { this.hasOption(value) && (delete optionsMap[value], ngModelCtrl.$viewValue === value && this.renderUnknownOption(value)) }, self.renderUnknownOption = function(val) { | |
var unknownVal = "? " + hashKey(val) + " ?"; | |
unknownOption.val(unknownVal), $element.prepend(unknownOption), $element.val(unknownVal), unknownOption.prop("selected", !0) }, self.hasOption = function(value) { | |
return optionsMap.hasOwnProperty(value) }, $scope.$on("$destroy", function() { self.renderUnknownOption = noop }) }], | |
link: function(scope, element, attr, ctrls) { | |
function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) { | |
ngModelCtrl.$render = function() { | |
var viewValue = ngModelCtrl.$viewValue; | |
selectCtrl.hasOption(viewValue) ? (unknownOption.parent() && unknownOption.remove(), selectElement.val(viewValue), "" === viewValue && emptyOption.prop("selected", !0)) : isUndefined(viewValue) && emptyOption ? selectElement.val("") : selectCtrl.renderUnknownOption(viewValue) | |
}, selectElement.on("change", function() { scope.$apply(function() { unknownOption.parent() && unknownOption.remove(), ngModelCtrl.$setViewValue(selectElement.val()) }) }) | |
} | |
function setupAsMultiple(scope, selectElement, ctrl) { | |
var lastView; | |
ctrl.$render = function() { | |
var items = new HashMap(ctrl.$viewValue); | |
forEach(selectElement.find("option"), function(option) { option.selected = isDefined(items.get(option.value)) }) }, scope.$watch(function() { equals(lastView, ctrl.$viewValue) || (lastView = shallowCopy(ctrl.$viewValue), ctrl.$render()) }), selectElement.on("change", function() { scope.$apply(function() { | |
var array = []; | |
forEach(selectElement.find("option"), function(option) { option.selected && array.push(option.value) }), ctrl.$setViewValue(array) }) }) } | |
function setupAsOptions(scope, selectElement, ctrl) { | |
function callExpression(exprFn, key, value) { | |
return locals[valueName] = value, keyName && (locals[keyName] = key), exprFn(scope, locals) } | |
function selectionChanged() { scope.$apply(function() { | |
var viewValue, collection = valuesFn(scope) || []; | |
if (multiple) viewValue = [], forEach(selectElement.val(), function(selectedKey) { selectedKey = trackFn ? trackKeysCache[selectedKey] : selectedKey, viewValue.push(getViewValue(selectedKey, collection[selectedKey])) }); | |
else { | |
var selectedKey = trackFn ? trackKeysCache[selectElement.val()] : selectElement.val(); | |
viewValue = getViewValue(selectedKey, collection[selectedKey]) } | |
ctrl.$setViewValue(viewValue), render() }) } | |
function getViewValue(key, value) { | |
if ("?" === key) return undefined; | |
if ("" === key) return null; | |
var viewValueFn = selectAsFn ? selectAsFn : valueFn; | |
return callExpression(viewValueFn, key, value) } | |
function getLabels() { | |
var toDisplay, values = valuesFn(scope); | |
if (values && isArray(values)) { toDisplay = new Array(values.length); | |
for (var i = 0, ii = values.length; ii > i; i++) toDisplay[i] = callExpression(displayFn, i, values[i]); | |
return toDisplay } | |
if (values) { toDisplay = {}; | |
for (var prop in values) values.hasOwnProperty(prop) && (toDisplay[prop] = callExpression(displayFn, prop, values[prop])) } | |
return toDisplay } | |
function createIsSelectedFn(viewValue) { | |
var selectedSet; | |
if (multiple) | |
if (trackFn && isArray(viewValue)) { selectedSet = new HashMap([]); | |
for (var trackIndex = 0; trackIndex < viewValue.length; trackIndex++) selectedSet.put(callExpression(trackFn, null, viewValue[trackIndex]), !0) } else selectedSet = new HashMap(viewValue); | |
else trackFn && (viewValue = callExpression(trackFn, null, viewValue)); | |
return function(key, value) { | |
var compareValueFn; | |
return compareValueFn = trackFn ? trackFn : selectAsFn ? selectAsFn : valueFn, multiple ? isDefined(selectedSet.remove(callExpression(compareValueFn, key, value))) : viewValue === callExpression(compareValueFn, key, value) } } | |
function scheduleRendering() { renderScheduled || (scope.$$postDigest(render), renderScheduled = !0) } | |
function updateLabelMap(labelMap, label, added) { labelMap[label] = labelMap[label] || 0, labelMap[label] += added ? 1 : -1 } | |
function render() { renderScheduled = !1; | |
var optionGroupName, optionGroup, option, existingParent, existingOptions, existingOption, key, value, groupLength, length, groupIndex, index, selected, lastElement, element, label, optionId, optionGroups = { "": [] }, | |
optionGroupNames = [""], | |
viewValue = ctrl.$viewValue, | |
values = valuesFn(scope) || [], | |
keys = keyName ? sortedKeys(values) : values, | |
labelMap = {}, | |
isSelected = createIsSelectedFn(viewValue), | |
anySelected = !1; | |
for (trackKeysCache = {}, index = 0; length = keys.length, length > index; index++) key = index, keyName && (key = keys[index], "$" === key.charAt(0)) || (value = values[key], optionGroupName = callExpression(groupByFn, key, value) || "", (optionGroup = optionGroups[optionGroupName]) || (optionGroup = optionGroups[optionGroupName] = [], optionGroupNames.push(optionGroupName)), selected = isSelected(key, value), anySelected = anySelected || selected, label = callExpression(displayFn, key, value), label = isDefined(label) ? label : "", optionId = trackFn ? trackFn(scope, locals) : keyName ? keys[index] : index, trackFn && (trackKeysCache[optionId] = key), optionGroup.push({ id: optionId, label: label, selected: selected })); | |
for (multiple || (nullOption || null === viewValue ? optionGroups[""].unshift({ id: "", label: "", selected: !anySelected }) : anySelected || optionGroups[""].unshift({ id: "?", label: "", selected: !0 })), groupIndex = 0, groupLength = optionGroupNames.length; groupLength > groupIndex; groupIndex++) { | |
for (optionGroupName = optionGroupNames[groupIndex], optionGroup = optionGroups[optionGroupName], optionGroupsCache.length <= groupIndex ? (existingParent = { element: optGroupTemplate.clone().attr("label", optionGroupName), label: optionGroup.label }, existingOptions = [existingParent], optionGroupsCache.push(existingOptions), selectElement.append(existingParent.element)) : (existingOptions = optionGroupsCache[groupIndex], existingParent = existingOptions[0], existingParent.label != optionGroupName && existingParent.element.attr("label", existingParent.label = optionGroupName)), lastElement = null, index = 0, length = optionGroup.length; length > index; index++) option = optionGroup[index], (existingOption = existingOptions[index + 1]) ? (lastElement = existingOption.element, existingOption.label !== option.label && (updateLabelMap(labelMap, existingOption.label, !1), updateLabelMap(labelMap, option.label, !0), lastElement.text(existingOption.label = option.label), lastElement.prop("label", existingOption.label)), existingOption.id !== option.id && lastElement.val(existingOption.id = option.id), lastElement[0].selected !== option.selected && (lastElement.prop("selected", existingOption.selected = option.selected), msie && lastElement.prop("selected", existingOption.selected))) : ("" === option.id && nullOption ? element = nullOption : (element = optionTemplate.clone()).val(option.id).prop("selected", option.selected).attr("selected", option.selected).prop("label", option.label).text(option.label), existingOptions.push(existingOption = { element: element, label: option.label, id: option.id, selected: option.selected }), updateLabelMap(labelMap, option.label, !0), lastElement ? lastElement.after(element) : existingParent.element.append(element), lastElement = element); | |
for (index++; existingOptions.length > index;) option = existingOptions.pop(), updateLabelMap(labelMap, option.label, !1), option.element.remove() } | |
for (; optionGroupsCache.length > groupIndex;) { | |
for (optionGroup = optionGroupsCache.pop(), index = 1; index < optionGroup.length; ++index) updateLabelMap(labelMap, optionGroup[index].label, !1); | |
optionGroup[0].element.remove() } | |
forEach(labelMap, function(count, label) { count > 0 ? selectCtrl.addOption(label) : 0 > count && selectCtrl.removeOption(label) }) } | |
var match; | |
if (!(match = optionsExp.match(NG_OPTIONS_REGEXP))) throw ngOptionsMinErr("iexp", "Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}", optionsExp, startingTag(selectElement)); | |
var displayFn = $parse(match[2] || match[1]), | |
valueName = match[4] || match[6], | |
selectAs = / as /.test(match[0]) && match[1], | |
selectAsFn = selectAs ? $parse(selectAs) : null, | |
keyName = match[5], | |
groupByFn = $parse(match[3] || ""), | |
valueFn = $parse(match[2] ? match[1] : valueName), | |
valuesFn = $parse(match[7]), | |
track = match[8], | |
trackFn = track ? $parse(match[8]) : null, | |
trackKeysCache = {}, | |
optionGroupsCache = [ | |
[{ element: selectElement, label: "" }] | |
], | |
locals = {}; | |
nullOption && ($compile(nullOption)(scope), nullOption.removeClass("ng-scope"), nullOption.remove()), selectElement.empty(), selectElement.on("change", selectionChanged), ctrl.$render = render, scope.$watchCollection(valuesFn, scheduleRendering), scope.$watchCollection(getLabels, scheduleRendering), multiple && scope.$watchCollection(function() { | |
return ctrl.$modelValue }, scheduleRendering) } | |
if (ctrls[1]) { | |
for (var emptyOption, selectCtrl = ctrls[0], ngModelCtrl = ctrls[1], multiple = attr.multiple, optionsExp = attr.ngOptions, nullOption = !1, renderScheduled = !1, optionTemplate = jqLite(document.createElement("option")), optGroupTemplate = jqLite(document.createElement("optgroup")), unknownOption = optionTemplate.clone(), i = 0, children = element.children(), ii = children.length; ii > i; i++) | |
if ("" === children[i].value) { emptyOption = nullOption = children.eq(i); | |
break } | |
selectCtrl.init(ngModelCtrl, nullOption, unknownOption), multiple && (ngModelCtrl.$isEmpty = function(value) { | |
return !value || 0 === value.length }), optionsExp ? setupAsOptions(scope, element, ngModelCtrl) : multiple ? setupAsMultiple(scope, element, ngModelCtrl) : setupAsSingle(scope, element, ngModelCtrl, selectCtrl) } | |
} | |
} | |
}], | |
optionDirective = ["$interpolate", function($interpolate) { | |
var nullSelectCtrl = { addOption: noop, removeOption: noop }; | |
return { restrict: "E", priority: 100, compile: function(element, attr) { | |
if (isUndefined(attr.value)) { | |
var interpolateFn = $interpolate(element.text(), !0); | |
interpolateFn || attr.$set("value", element.text()) } | |
return function(scope, element, attr) { | |
var selectCtrlName = "$selectController", | |
parent = element.parent(), | |
selectCtrl = parent.data(selectCtrlName) || parent.parent().data(selectCtrlName); | |
selectCtrl && selectCtrl.databound || (selectCtrl = nullSelectCtrl), interpolateFn ? scope.$watch(interpolateFn, function(newVal, oldVal) { attr.$set("value", newVal), oldVal !== newVal && selectCtrl.removeOption(oldVal), selectCtrl.addOption(newVal, element) }) : selectCtrl.addOption(attr.value, element), element.on("$destroy", function() { selectCtrl.removeOption(attr.value) }) } } } }], | |
styleDirective = valueFn({ restrict: "E", terminal: !1 }); | |
return window.angular.bootstrap ? void console.log("WARNING: Tried to load angular more than once.") : (bindJQuery(), publishExternalAPI(angular), void jqLite(document).ready(function() { angularInit(document, bootstrap) })) | |
}(window, document), !window.angular.$$csp() && window.angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}</style>'); | |
! function(window, angular, undefined) { "use strict"; | |
angular.module("ngAnimate", ["ng"]).directive("ngAnimateChildren", function() { | |
var NG_ANIMATE_CHILDREN = "$$ngAnimateChildren"; | |
return function(scope, element, attrs) { | |
var val = attrs.ngAnimateChildren; | |
angular.isString(val) && 0 === val.length ? element.data(NG_ANIMATE_CHILDREN, !0) : scope.$watch(val, function(value) { element.data(NG_ANIMATE_CHILDREN, !!value) }) } }).factory("$$animateReflow", ["$$rAF", "$document", function($$rAF, $document) { | |
var bod = $document[0].body; | |
return function(fn) { | |
return $$rAF(function() { bod.offsetWidth + 1; | |
fn() }) } }]).config(["$provide", "$animateProvider", function($provide, $animateProvider) { | |
function extractElementNode(element) { | |
for (var i = 0; i < element.length; i++) { | |
var elm = element[i]; | |
if (elm.nodeType == ELEMENT_NODE) return elm } } | |
function prepareElement(element) { | |
return element && angular.element(element) } | |
function stripCommentsFromElement(element) { | |
return angular.element(extractElementNode(element)) } | |
function isMatchingElement(elm1, elm2) { | |
return extractElementNode(elm1) == extractElementNode(elm2) } | |
var noop = angular.noop, | |
forEach = angular.forEach, | |
selectors = $animateProvider.$$selectors, | |
isArray = angular.isArray, | |
isString = angular.isString, | |
isObject = angular.isObject, | |
ELEMENT_NODE = 1, | |
NG_ANIMATE_STATE = "$$ngAnimateState", | |
NG_ANIMATE_CHILDREN = "$$ngAnimateChildren", | |
NG_ANIMATE_CLASS_NAME = "ng-animate", | |
rootAnimateState = { running: !0 }; | |
$provide.decorator("$animate", ["$delegate", "$$q", "$injector", "$sniffer", "$rootElement", "$$asyncCallback", "$rootScope", "$document", "$templateRequest", function($delegate, $$q, $injector, $sniffer, $rootElement, $$asyncCallback, $rootScope, $document, $templateRequest) { | |
function classBasedAnimationsBlocked(element, setter) { | |
var data = element.data(NG_ANIMATE_STATE) || {}; | |
return setter && (data.running = !0, data.structural = !0, element.data(NG_ANIMATE_STATE, data)), data.disabled || data.running && data.structural } | |
function runAnimationPostDigest(fn) { | |
var cancelFn, defer = $$q.defer(); | |
return defer.promise.$$cancelFn = function() { cancelFn && cancelFn() }, $rootScope.$$postDigest(function() { cancelFn = fn(function() { defer.resolve() }) }), defer.promise } | |
function parseAnimateOptions(options) { | |
return isObject(options) ? (options.tempClasses && isString(options.tempClasses) && (options.tempClasses = options.tempClasses.split(/\s+/)), options) : void 0 } | |
function resolveElementClasses(element, cache, runningAnimations) { runningAnimations = runningAnimations || {}; | |
var lookup = {}; | |
forEach(runningAnimations, function(data, selector) { forEach(selector.split(" "), function(s) { lookup[s] = data }) }); | |
var hasClasses = Object.create(null); | |
forEach((element.attr("class") || "").split(/\s+/), function(className) { hasClasses[className] = !0 }); | |
var toAdd = [], | |
toRemove = []; | |
return forEach(cache && cache.classes || [], function(status, className) { | |
var hasClass = hasClasses[className], | |
matchingAnimation = lookup[className] || {}; | |
status === !1 ? (hasClass || "addClass" == matchingAnimation.event) && toRemove.push(className) : status === !0 && (hasClass && "removeClass" != matchingAnimation.event || toAdd.push(className)) }), toAdd.length + toRemove.length > 0 && [toAdd.join(" "), toRemove.join(" ")] } | |
function lookup(name) { | |
if (name) { | |
var matches = [], | |
flagMap = {}, | |
classes = name.substr(1).split("."); | |
($sniffer.transitions || $sniffer.animations) && matches.push($injector.get(selectors[""])); | |
for (var i = 0; i < classes.length; i++) { | |
var klass = classes[i], | |
selectorFactoryName = selectors[klass]; | |
selectorFactoryName && !flagMap[klass] && (matches.push($injector.get(selectorFactoryName)), flagMap[klass] = !0) } | |
return matches } } | |
function animationRunner(element, animationEvent, className, options) { | |
function registerAnimation(animationFactory, event) { | |
var afterFn = animationFactory[event], | |
beforeFn = animationFactory["before" + event.charAt(0).toUpperCase() + event.substr(1)]; | |
return afterFn || beforeFn ? ("leave" == event && (beforeFn = afterFn, afterFn = null), after.push({ event: event, fn: afterFn }), before.push({ event: event, fn: beforeFn }), !0) : void 0 } | |
function run(fns, cancellations, allCompleteFn) { | |
function afterAnimationComplete(index) { | |
if (cancellations) { | |
if ((cancellations[index] || noop)(), ++count < animations.length) return; | |
cancellations = null } | |
allCompleteFn() } | |
var animations = []; | |
forEach(fns, function(animation) { animation.fn && animations.push(animation) }); | |
var count = 0; | |
forEach(animations, function(animation, index) { | |
var progress = function() { afterAnimationComplete(index) }; | |
switch (animation.event) { | |
case "setClass": | |
cancellations.push(animation.fn(element, classNameAdd, classNameRemove, progress, options)); | |
break; | |
case "animate": | |
cancellations.push(animation.fn(element, className, options.from, options.to, progress)); | |
break; | |
case "addClass": | |
cancellations.push(animation.fn(element, classNameAdd || className, progress, options)); | |
break; | |
case "removeClass": | |
cancellations.push(animation.fn(element, classNameRemove || className, progress, options)); | |
break; | |
default: | |
cancellations.push(animation.fn(element, progress, options)) } }), cancellations && 0 === cancellations.length && allCompleteFn() } | |
var node = element[0]; | |
if (node) { options && (options.to = options.to || {}, options.from = options.from || {}); | |
var classNameAdd, classNameRemove; | |
isArray(className) && (classNameAdd = className[0], classNameRemove = className[1], classNameAdd ? classNameRemove ? className = classNameAdd + " " + classNameRemove : (className = classNameAdd, animationEvent = "addClass") : (className = classNameRemove, animationEvent = "removeClass")); | |
var isSetClassOperation = "setClass" == animationEvent, | |
isClassBased = isSetClassOperation || "addClass" == animationEvent || "removeClass" == animationEvent || "animate" == animationEvent, | |
currentClassName = element.attr("class"), | |
classes = currentClassName + " " + className; | |
if (isAnimatableClassName(classes)) { | |
var beforeComplete = noop, | |
beforeCancel = [], | |
before = [], | |
afterComplete = noop, | |
afterCancel = [], | |
after = [], | |
animationLookup = (" " + classes).replace(/\s+/g, "."); | |
return forEach(lookup(animationLookup), function(animationFactory) { | |
var created = registerAnimation(animationFactory, animationEvent);!created && isSetClassOperation && (registerAnimation(animationFactory, "addClass"), registerAnimation(animationFactory, "removeClass")) }), { node: node, event: animationEvent, className: className, isClassBased: isClassBased, isSetClassOperation: isSetClassOperation, applyStyles: function() { options && element.css(angular.extend(options.from || {}, options.to || {})) }, before: function(allCompleteFn) { beforeComplete = allCompleteFn, run(before, beforeCancel, function() { beforeComplete = noop, allCompleteFn() }) }, after: function(allCompleteFn) { afterComplete = allCompleteFn, run(after, afterCancel, function() { afterComplete = noop, allCompleteFn() }) }, cancel: function() { beforeCancel && (forEach(beforeCancel, function(cancelFn) { | |
(cancelFn || noop)(!0) }), beforeComplete(!0)), afterCancel && (forEach(afterCancel, function(cancelFn) { | |
(cancelFn || noop)(!0) }), afterComplete(!0)) } } } } } | |
function performAnimation(animationEvent, className, element, parentElement, afterElement, domOperation, options, doneCallback) { | |
function fireDOMCallback(animationPhase) { | |
var eventName = "$animate:" + animationPhase; | |
elementEvents && elementEvents[eventName] && elementEvents[eventName].length > 0 && $$asyncCallback(function() { element.triggerHandler(eventName, { event: animationEvent, className: className }) }) } | |
function fireBeforeCallbackAsync() { fireDOMCallback("before") } | |
function fireAfterCallbackAsync() { fireDOMCallback("after") } | |
function fireDoneCallbackAsync() { fireDOMCallback("close"), doneCallback() } | |
function fireDOMOperation() { fireDOMOperation.hasBeenRun || (fireDOMOperation.hasBeenRun = !0, domOperation()) } | |
function closeAnimation() { | |
if (!closeAnimation.hasBeenRun) { runner && runner.applyStyles(), closeAnimation.hasBeenRun = !0, options && options.tempClasses && forEach(options.tempClasses, function(className) { element.removeClass(className) }); | |
var data = element.data(NG_ANIMATE_STATE); | |
data && (runner && runner.isClassBased ? cleanup(element, className) : ($$asyncCallback(function() { | |
var data = element.data(NG_ANIMATE_STATE) || {}; | |
localAnimationCount == data.index && cleanup(element, className, animationEvent) }), element.data(NG_ANIMATE_STATE, data))), fireDoneCallbackAsync() } } | |
var noopCancel = noop, | |
runner = animationRunner(element, animationEvent, className, options); | |
if (!runner) return fireDOMOperation(), fireBeforeCallbackAsync(), fireAfterCallbackAsync(), closeAnimation(), noopCancel; | |
animationEvent = runner.event, className = runner.className; | |
var elementEvents = angular.element._data(runner.node); | |
if (elementEvents = elementEvents && elementEvents.events, parentElement || (parentElement = afterElement ? afterElement.parent() : element.parent()), animationsDisabled(element, parentElement)) return fireDOMOperation(), fireBeforeCallbackAsync(), fireAfterCallbackAsync(), closeAnimation(), noopCancel; | |
var ngAnimateState = element.data(NG_ANIMATE_STATE) || {}, | |
runningAnimations = ngAnimateState.active || {}, | |
totalActiveAnimations = ngAnimateState.totalActive || 0, | |
lastAnimation = ngAnimateState.last, | |
skipAnimation = !1; | |
if (totalActiveAnimations > 0) { | |
var animationsToCancel = []; | |
if (runner.isClassBased) { | |
if ("setClass" == lastAnimation.event) animationsToCancel.push(lastAnimation), cleanup(element, className); | |
else if (runningAnimations[className]) { | |
var current = runningAnimations[className]; | |
current.event == animationEvent ? skipAnimation = !0 : (animationsToCancel.push(current), cleanup(element, className)) } } else if ("leave" == animationEvent && runningAnimations["ng-leave"]) skipAnimation = !0; | |
else { | |
for (var klass in runningAnimations) animationsToCancel.push(runningAnimations[klass]); | |
ngAnimateState = {}, cleanup(element, !0) } | |
animationsToCancel.length > 0 && forEach(animationsToCancel, function(operation) { operation.cancel() }) } | |
if (!runner.isClassBased || runner.isSetClassOperation || "animate" == animationEvent || skipAnimation || (skipAnimation = "addClass" == animationEvent == element.hasClass(className)), skipAnimation) return fireDOMOperation(), fireBeforeCallbackAsync(), fireAfterCallbackAsync(), fireDoneCallbackAsync(), noopCancel; | |
runningAnimations = ngAnimateState.active || {}, totalActiveAnimations = ngAnimateState.totalActive || 0, "leave" == animationEvent && element.one("$destroy", function() { | |
var element = angular.element(this), | |
state = element.data(NG_ANIMATE_STATE); | |
if (state) { | |
var activeLeaveAnimation = state.active["ng-leave"]; | |
activeLeaveAnimation && (activeLeaveAnimation.cancel(), cleanup(element, "ng-leave")) } }), element.addClass(NG_ANIMATE_CLASS_NAME), options && options.tempClasses && forEach(options.tempClasses, function(className) { element.addClass(className) }); | |
var localAnimationCount = globalAnimationCounter++; | |
return totalActiveAnimations++, runningAnimations[className] = runner, element.data(NG_ANIMATE_STATE, { last: runner, active: runningAnimations, index: localAnimationCount, totalActive: totalActiveAnimations }), fireBeforeCallbackAsync(), runner.before(function(cancelled) { | |
var data = element.data(NG_ANIMATE_STATE); | |
cancelled = cancelled || !data || !data.active[className] || runner.isClassBased && data.active[className].event != animationEvent, fireDOMOperation(), cancelled === !0 ? closeAnimation() : (fireAfterCallbackAsync(), runner.after(closeAnimation)) }), runner.cancel } | |
function cancelChildAnimations(element) { | |
var node = extractElementNode(element); | |
if (node) { | |
var nodes = angular.isFunction(node.getElementsByClassName) ? node.getElementsByClassName(NG_ANIMATE_CLASS_NAME) : node.querySelectorAll("." + NG_ANIMATE_CLASS_NAME); | |
forEach(nodes, function(element) { element = angular.element(element); | |
var data = element.data(NG_ANIMATE_STATE); | |
data && data.active && forEach(data.active, function(runner) { runner.cancel() }) }) } } | |
function cleanup(element, className) { | |
if (isMatchingElement(element, $rootElement)) rootAnimateState.disabled || (rootAnimateState.running = !1, rootAnimateState.structural = !1); | |
else if (className) { | |
var data = element.data(NG_ANIMATE_STATE) || {}, | |
removeAnimations = className === !0;!removeAnimations && data.active && data.active[className] && (data.totalActive--, delete data.active[className]), (removeAnimations || !data.totalActive) && (element.removeClass(NG_ANIMATE_CLASS_NAME), element.removeData(NG_ANIMATE_STATE)) } } | |
function animationsDisabled(element, parentElement) { | |
if (rootAnimateState.disabled) return !0; | |
if (isMatchingElement(element, $rootElement)) return rootAnimateState.running; | |
var allowChildAnimations, parentRunningAnimation, hasParent; | |
do { | |
if (0 === parentElement.length) break; | |
var isRoot = isMatchingElement(parentElement, $rootElement), | |
state = isRoot ? rootAnimateState : parentElement.data(NG_ANIMATE_STATE) || {}; | |
if (state.disabled) return !0; | |
if (isRoot && (hasParent = !0), allowChildAnimations !== !1) { | |
var animateChildrenFlag = parentElement.data(NG_ANIMATE_CHILDREN); | |
angular.isDefined(animateChildrenFlag) && (allowChildAnimations = animateChildrenFlag) } | |
parentRunningAnimation = parentRunningAnimation || state.running || state.last && !state.last.isClassBased } while (parentElement = parentElement.parent()); | |
return !hasParent || !allowChildAnimations && parentRunningAnimation } | |
$rootElement.data(NG_ANIMATE_STATE, rootAnimateState); | |
var deregisterWatch = $rootScope.$watch(function() { | |
return $templateRequest.totalPendingRequests }, function(val) { 0 === val && (deregisterWatch(), $rootScope.$$postDigest(function() { $rootScope.$$postDigest(function() { rootAnimateState.running = !1 }) })) }), | |
globalAnimationCounter = 0, | |
classNameFilter = $animateProvider.classNameFilter(), | |
isAnimatableClassName = classNameFilter ? function(className) { | |
return classNameFilter.test(className) } : function() { | |
return !0 }; | |
return { animate: function(element, from, to, className, options) { | |
return className = className || "ng-inline-animate", options = parseAnimateOptions(options) || {}, options.from = to ? from : null, options.to = to ? to : from, runAnimationPostDigest(function(done) { | |
return performAnimation("animate", className, stripCommentsFromElement(element), null, null, noop, options, done) }) }, enter: function(element, parentElement, afterElement, options) { | |
return options = parseAnimateOptions(options), element = angular.element(element), parentElement = prepareElement(parentElement), afterElement = prepareElement(afterElement), classBasedAnimationsBlocked(element, !0), $delegate.enter(element, parentElement, afterElement), runAnimationPostDigest(function(done) { | |
return performAnimation("enter", "ng-enter", stripCommentsFromElement(element), parentElement, afterElement, noop, options, done) }) }, leave: function(element, options) { | |
return options = parseAnimateOptions(options), element = angular.element(element), cancelChildAnimations(element), classBasedAnimationsBlocked(element, !0), runAnimationPostDigest(function(done) { | |
return performAnimation("leave", "ng-leave", stripCommentsFromElement(element), null, null, function() { $delegate.leave(element) }, options, done) }) }, move: function(element, parentElement, afterElement, options) { | |
return options = parseAnimateOptions(options), element = angular.element(element), parentElement = prepareElement(parentElement), afterElement = prepareElement(afterElement), cancelChildAnimations(element), classBasedAnimationsBlocked(element, !0), $delegate.move(element, parentElement, afterElement), runAnimationPostDigest(function(done) { | |
return performAnimation("move", "ng-move", stripCommentsFromElement(element), parentElement, afterElement, noop, options, done) }) }, addClass: function(element, className, options) { | |
return this.setClass(element, className, [], options) }, removeClass: function(element, className, options) { | |
return this.setClass(element, [], className, options) }, setClass: function(element, add, remove, options) { options = parseAnimateOptions(options); | |
var STORAGE_KEY = "$$animateClasses"; | |
if (element = angular.element(element), element = stripCommentsFromElement(element), classBasedAnimationsBlocked(element)) return $delegate.$$setClassImmediately(element, add, remove, options); | |
var classes, cache = element.data(STORAGE_KEY), | |
hasCache = !!cache; | |
return cache || (cache = {}, cache.classes = {}), classes = cache.classes, add = isArray(add) ? add : add.split(" "), forEach(add, function(c) { c && c.length && (classes[c] = !0) }), remove = isArray(remove) ? remove : remove.split(" "), forEach(remove, function(c) { c && c.length && (classes[c] = !1) }), hasCache ? (options && cache.options && (cache.options = angular.extend(cache.options || {}, options)), cache.promise) : (element.data(STORAGE_KEY, cache = { classes: classes, options: options }), cache.promise = runAnimationPostDigest(function(done) { | |
var parentElement = element.parent(), | |
elementNode = extractElementNode(element), | |
parentNode = elementNode.parentNode; | |
if (!parentNode || parentNode.$$NG_REMOVED || elementNode.$$NG_REMOVED) return void done(); | |
var cache = element.data(STORAGE_KEY); | |
element.removeData(STORAGE_KEY); | |
var state = element.data(NG_ANIMATE_STATE) || {}, | |
classes = resolveElementClasses(element, cache, state.active); | |
return classes ? performAnimation("setClass", classes, element, parentElement, null, function() { classes[0] && $delegate.$$addClassImmediately(element, classes[0]), classes[1] && $delegate.$$removeClassImmediately(element, classes[1]) }, cache.options, done) : done() })) }, cancel: function(promise) { promise.$$cancelFn() }, enabled: function(value, element) { | |
switch (arguments.length) { | |
case 2: | |
if (value) cleanup(element); | |
else { | |
var data = element.data(NG_ANIMATE_STATE) || {}; | |
data.disabled = !0, element.data(NG_ANIMATE_STATE, data) } | |
break; | |
case 1: | |
rootAnimateState.disabled = !value; | |
break; | |
default: | |
value = !rootAnimateState.disabled } | |
return !!value } } }]), $animateProvider.register("", ["$window", "$sniffer", "$timeout", "$$animateReflow", function($window, $sniffer, $timeout, $$animateReflow) { | |
function clearCacheAfterReflow() { cancelAnimationReflow || (cancelAnimationReflow = $$animateReflow(function() { animationReflowQueue = [], cancelAnimationReflow = null, lookupCache = {} })) } | |
function afterReflow(element, callback) { cancelAnimationReflow && cancelAnimationReflow(), animationReflowQueue.push(callback), cancelAnimationReflow = $$animateReflow(function() { forEach(animationReflowQueue, function(fn) { fn() }), animationReflowQueue = [], cancelAnimationReflow = null, lookupCache = {} }) } | |
function animationCloseHandler(element, totalTime) { | |
var node = extractElementNode(element); | |
element = angular.element(node), animationElementQueue.push(element); | |
var futureTimestamp = Date.now() + totalTime; | |
closingTimestamp >= futureTimestamp || ($timeout.cancel(closingTimer), closingTimestamp = futureTimestamp, closingTimer = $timeout(function() { closeAllAnimations(animationElementQueue), animationElementQueue = [] }, totalTime, !1)) } | |
function closeAllAnimations(elements) { forEach(elements, function(element) { | |
var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY); | |
elementData && forEach(elementData.closeAnimationFns, function(fn) { fn() }) }) } | |
function getElementAnimationDetails(element, cacheKey) { | |
var data = cacheKey ? lookupCache[cacheKey] : null; | |
if (!data) { | |
var transitionDuration = 0, | |
transitionDelay = 0, | |
animationDuration = 0, | |
animationDelay = 0; | |
forEach(element, function(element) { | |
if (element.nodeType == ELEMENT_NODE) { | |
var elementStyles = $window.getComputedStyle(element) || {}, | |
transitionDurationStyle = elementStyles[TRANSITION_PROP + DURATION_KEY]; | |
transitionDuration = Math.max(parseMaxTime(transitionDurationStyle), transitionDuration); | |
var transitionDelayStyle = elementStyles[TRANSITION_PROP + DELAY_KEY]; | |
transitionDelay = Math.max(parseMaxTime(transitionDelayStyle), transitionDelay); { elementStyles[ANIMATION_PROP + DELAY_KEY] } | |
animationDelay = Math.max(parseMaxTime(elementStyles[ANIMATION_PROP + DELAY_KEY]), animationDelay); | |
var aDuration = parseMaxTime(elementStyles[ANIMATION_PROP + DURATION_KEY]); | |
aDuration > 0 && (aDuration *= parseInt(elementStyles[ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY], 10) || 1), animationDuration = Math.max(aDuration, animationDuration) } }), data = { total: 0, transitionDelay: transitionDelay, transitionDuration: transitionDuration, animationDelay: animationDelay, animationDuration: animationDuration }, cacheKey && (lookupCache[cacheKey] = data) } | |
return data } | |
function parseMaxTime(str) { | |
var maxValue = 0, | |
values = isString(str) ? str.split(/\s*,\s*/) : []; | |
return forEach(values, function(value) { maxValue = Math.max(parseFloat(value) || 0, maxValue) }), maxValue } | |
function getCacheKey(element) { | |
var parentElement = element.parent(), | |
parentID = parentElement.data(NG_ANIMATE_PARENT_KEY); | |
return parentID || (parentElement.data(NG_ANIMATE_PARENT_KEY, ++parentCounter), parentID = parentCounter), parentID + "-" + extractElementNode(element).getAttribute("class") } | |
function animateSetup(animationEvent, element, className, styles) { | |
var structural = ["ng-enter", "ng-leave", "ng-move"].indexOf(className) >= 0, | |
cacheKey = getCacheKey(element), | |
eventCacheKey = cacheKey + " " + className, | |
itemIndex = lookupCache[eventCacheKey] ? ++lookupCache[eventCacheKey].total : 0, | |
stagger = {}; | |
if (itemIndex > 0) { | |
var staggerClassName = className + "-stagger", | |
staggerCacheKey = cacheKey + " " + staggerClassName, | |
applyClasses = !lookupCache[staggerCacheKey]; | |
applyClasses && element.addClass(staggerClassName), stagger = getElementAnimationDetails(element, staggerCacheKey), applyClasses && element.removeClass(staggerClassName) } | |
element.addClass(className); | |
var formerData = element.data(NG_ANIMATE_CSS_DATA_KEY) || {}, | |
timings = getElementAnimationDetails(element, eventCacheKey), | |
transitionDuration = timings.transitionDuration, | |
animationDuration = timings.animationDuration; | |
if (structural && 0 === transitionDuration && 0 === animationDuration) return element.removeClass(className), !1; | |
var blockTransition = styles || structural && transitionDuration > 0, | |
blockAnimation = animationDuration > 0 && stagger.animationDelay > 0 && 0 === stagger.animationDuration, | |
closeAnimationFns = formerData.closeAnimationFns || []; | |
element.data(NG_ANIMATE_CSS_DATA_KEY, { stagger: stagger, cacheKey: eventCacheKey, running: formerData.running || 0, itemIndex: itemIndex, blockTransition: blockTransition, closeAnimationFns: closeAnimationFns }); | |
var node = extractElementNode(element); | |
return blockTransition && (blockTransitions(node, !0), styles && element.css(styles)), blockAnimation && blockAnimations(node, !0), !0 } | |
function animateRun(animationEvent, element, className, activeAnimationComplete, styles) { | |
function onEnd() { element.off(css3AnimationEvents, onAnimationProgress), element.removeClass(activeClassName), element.removeClass(pendingClassName), staggerTimeout && $timeout.cancel(staggerTimeout), animateClose(element, className); | |
var node = extractElementNode(element); | |
for (var i in appliedStyles) node.style.removeProperty(appliedStyles[i]) } | |
function onAnimationProgress(event) { event.stopPropagation(); | |
var ev = event.originalEvent || event, | |
timeStamp = ev.$manualTimeStamp || ev.timeStamp || Date.now(), | |
elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES)); | |
Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration && activeAnimationComplete() } | |
var node = extractElementNode(element), | |
elementData = element.data(NG_ANIMATE_CSS_DATA_KEY); | |
if (-1 == node.getAttribute("class").indexOf(className) || !elementData) return void activeAnimationComplete(); | |
var activeClassName = "", | |
pendingClassName = ""; | |
forEach(className.split(" "), function(klass, i) { | |
var prefix = (i > 0 ? " " : "") + klass; | |
activeClassName += prefix + "-active", pendingClassName += prefix + "-pending" }); | |
var style = "", | |
appliedStyles = [], | |
itemIndex = elementData.itemIndex, | |
stagger = elementData.stagger, | |
staggerTime = 0; | |
if (itemIndex > 0) { | |
var transitionStaggerDelay = 0; | |
stagger.transitionDelay > 0 && 0 === stagger.transitionDuration && (transitionStaggerDelay = stagger.transitionDelay * itemIndex); | |
var animationStaggerDelay = 0; | |
stagger.animationDelay > 0 && 0 === stagger.animationDuration && (animationStaggerDelay = stagger.animationDelay * itemIndex, appliedStyles.push(CSS_PREFIX + "animation-play-state")), staggerTime = Math.round(100 * Math.max(transitionStaggerDelay, animationStaggerDelay)) / 100 } | |
staggerTime || (element.addClass(activeClassName), elementData.blockTransition && blockTransitions(node, !1)); | |
var eventCacheKey = elementData.cacheKey + " " + activeClassName, | |
timings = getElementAnimationDetails(element, eventCacheKey), | |
maxDuration = Math.max(timings.transitionDuration, timings.animationDuration); | |
if (0 === maxDuration) return element.removeClass(activeClassName), animateClose(element, className), void activeAnimationComplete();!staggerTime && styles && (timings.transitionDuration || (element.css("transition", timings.animationDuration + "s linear all"), appliedStyles.push("transition")), element.css(styles)); | |
var maxDelay = Math.max(timings.transitionDelay, timings.animationDelay), | |
maxDelayTime = maxDelay * ONE_SECOND; | |
if (appliedStyles.length > 0) { | |
var oldStyle = node.getAttribute("style") || ""; ";" !== oldStyle.charAt(oldStyle.length - 1) && (oldStyle += ";"), node.setAttribute("style", oldStyle + " " + style) } | |
var staggerTimeout, startTime = Date.now(), | |
css3AnimationEvents = ANIMATIONEND_EVENT + " " + TRANSITIONEND_EVENT, | |
animationTime = (maxDelay + maxDuration) * CLOSING_TIME_BUFFER, | |
totalTime = (staggerTime + animationTime) * ONE_SECOND; | |
return staggerTime > 0 && (element.addClass(pendingClassName), staggerTimeout = $timeout(function() { staggerTimeout = null, timings.transitionDuration > 0 && blockTransitions(node, !1), timings.animationDuration > 0 && blockAnimations(node, !1), element.addClass(activeClassName), element.removeClass(pendingClassName), styles && (0 === timings.transitionDuration && element.css("transition", timings.animationDuration + "s linear all"), element.css(styles), appliedStyles.push("transition")) }, staggerTime * ONE_SECOND, !1)), element.on(css3AnimationEvents, onAnimationProgress), elementData.closeAnimationFns.push(function() { onEnd(), activeAnimationComplete() }), elementData.running++, animationCloseHandler(element, totalTime), onEnd } | |
function blockTransitions(node, bool) { node.style[TRANSITION_PROP + PROPERTY_KEY] = bool ? "none" : "" } | |
function blockAnimations(node, bool) { node.style[ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY] = bool ? "paused" : "" } | |
function animateBefore(animationEvent, element, className, styles) { | |
return animateSetup(animationEvent, element, className, styles) ? function(cancelled) { cancelled && animateClose(element, className) } : void 0 } | |
function animateAfter(animationEvent, element, className, afterAnimationComplete, styles) { | |
return element.data(NG_ANIMATE_CSS_DATA_KEY) ? animateRun(animationEvent, element, className, afterAnimationComplete, styles) : (animateClose(element, className), void afterAnimationComplete()) } | |
function animate(animationEvent, element, className, animationComplete, options) { | |
var preReflowCancellation = animateBefore(animationEvent, element, className, options.from); | |
if (!preReflowCancellation) return clearCacheAfterReflow(), void animationComplete(); | |
var cancel = preReflowCancellation; | |
return afterReflow(element, function() { cancel = animateAfter(animationEvent, element, className, animationComplete, options.to) }), | |
function(cancelled) { | |
(cancel || noop)(cancelled) } } | |
function animateClose(element, className) { element.removeClass(className); | |
var data = element.data(NG_ANIMATE_CSS_DATA_KEY); | |
data && (data.running && data.running--, data.running && 0 !== data.running || element.removeData(NG_ANIMATE_CSS_DATA_KEY)) } | |
function suffixClasses(classes, suffix) { | |
var className = ""; | |
return classes = isArray(classes) ? classes : classes.split(/\s+/), forEach(classes, function(klass, i) { klass && klass.length > 0 && (className += (i > 0 ? " " : "") + klass + suffix) }), className } | |
var TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT, CSS_PREFIX = ""; | |
window.ontransitionend === undefined && window.onwebkittransitionend !== undefined ? (CSS_PREFIX = "-webkit-", TRANSITION_PROP = "WebkitTransition", TRANSITIONEND_EVENT = "webkitTransitionEnd transitionend") : (TRANSITION_PROP = "transition", TRANSITIONEND_EVENT = "transitionend"), window.onanimationend === undefined && window.onwebkitanimationend !== undefined ? (CSS_PREFIX = "-webkit-", ANIMATION_PROP = "WebkitAnimation", ANIMATIONEND_EVENT = "webkitAnimationEnd animationend") : (ANIMATION_PROP = "animation", ANIMATIONEND_EVENT = "animationend"); | |
var cancelAnimationReflow, DURATION_KEY = "Duration", | |
PROPERTY_KEY = "Property", | |
DELAY_KEY = "Delay", | |
ANIMATION_ITERATION_COUNT_KEY = "IterationCount", | |
ANIMATION_PLAYSTATE_KEY = "PlayState", | |
NG_ANIMATE_PARENT_KEY = "$$ngAnimateKey", | |
NG_ANIMATE_CSS_DATA_KEY = "$$ngAnimateCSS3Data", | |
ELAPSED_TIME_MAX_DECIMAL_PLACES = 3, | |
CLOSING_TIME_BUFFER = 1.5, | |
ONE_SECOND = 1e3, | |
lookupCache = {}, | |
parentCounter = 0, | |
animationReflowQueue = [], | |
closingTimer = null, | |
closingTimestamp = 0, | |
animationElementQueue = []; | |
return { animate: function(element, className, from, to, animationCompleted, options) { | |
return options = options || {}, options.from = from, options.to = to, animate("animate", element, className, animationCompleted, options) }, enter: function(element, animationCompleted, options) { | |
return options = options || {}, animate("enter", element, "ng-enter", animationCompleted, options) }, leave: function(element, animationCompleted, options) { | |
return options = options || {}, animate("leave", element, "ng-leave", animationCompleted, options) }, move: function(element, animationCompleted, options) { | |
return options = options || {}, animate("move", element, "ng-move", animationCompleted, options) }, beforeSetClass: function(element, add, remove, animationCompleted, options) { options = options || {}; | |
var className = suffixClasses(remove, "-remove") + " " + suffixClasses(add, "-add"), | |
cancellationMethod = animateBefore("setClass", element, className, options.from); | |
return cancellationMethod ? (afterReflow(element, animationCompleted), cancellationMethod) : (clearCacheAfterReflow(), void animationCompleted()) }, beforeAddClass: function(element, className, animationCompleted, options) { options = options || {}; | |
var cancellationMethod = animateBefore("addClass", element, suffixClasses(className, "-add"), options.from); | |
return cancellationMethod ? (afterReflow(element, animationCompleted), cancellationMethod) : (clearCacheAfterReflow(), void animationCompleted()) }, beforeRemoveClass: function(element, className, animationCompleted, options) { options = options || {}; | |
var cancellationMethod = animateBefore("removeClass", element, suffixClasses(className, "-remove"), options.from); | |
return cancellationMethod ? (afterReflow(element, animationCompleted), cancellationMethod) : (clearCacheAfterReflow(), void animationCompleted()) }, setClass: function(element, add, remove, animationCompleted, options) { options = options || {}, remove = suffixClasses(remove, "-remove"), add = suffixClasses(add, "-add"); | |
var className = remove + " " + add; | |
return animateAfter("setClass", element, className, animationCompleted, options.to) }, addClass: function(element, className, animationCompleted, options) { | |
return options = options || {}, animateAfter("addClass", element, suffixClasses(className, "-add"), animationCompleted, options.to) }, removeClass: function(element, className, animationCompleted, options) { | |
return options = options || {}, animateAfter("removeClass", element, suffixClasses(className, "-remove"), animationCompleted, options.to) } } }]) }]) }(window, window.angular); | |
"undefined" != typeof module && "undefined" != typeof exports && module.exports === exports && (module.exports = "ui.router"), | |
function(window, angular, undefined) { | |
"use strict"; | |
function inherit(parent, extra) { | |
return extend(new(extend(function() {}, { prototype: parent })), extra) } | |
function merge(dst) { | |
return forEach(arguments, function(obj) { obj !== dst && forEach(obj, function(value, key) { dst.hasOwnProperty(key) || (dst[key] = value) }) }), dst } | |
function ancestors(first, second) { | |
var path = []; | |
for (var n in first.path) { | |
if (first.path[n] !== second.path[n]) break; | |
path.push(first.path[n]) } | |
return path } | |
function objectKeys(object) { | |
if (Object.keys) return Object.keys(object); | |
var result = []; | |
return angular.forEach(object, function(val, key) { result.push(key) }), result } | |
function indexOf(array, value) { | |
if (Array.prototype.indexOf) return array.indexOf(value, Number(arguments[2]) || 0); | |
var len = array.length >>> 0, | |
from = Number(arguments[2]) || 0; | |
for (from = 0 > from ? Math.ceil(from) : Math.floor(from), 0 > from && (from += len); len > from; from++) | |
if (from in array && array[from] === value) return from; | |
return -1 } | |
function inheritParams(currentParams, newParams, $current, $to) { | |
var parentParams, parents = ancestors($current, $to), | |
inherited = {}, | |
inheritList = []; | |
for (var i in parents) | |
if (parents[i].params && (parentParams = objectKeys(parents[i].params), parentParams.length)) | |
for (var j in parentParams) indexOf(inheritList, parentParams[j]) >= 0 || (inheritList.push(parentParams[j]), inherited[parentParams[j]] = currentParams[parentParams[j]]); | |
return extend({}, inherited, newParams) } | |
function equalForKeys(a, b, keys) { | |
if (!keys) { keys = []; | |
for (var n in a) keys.push(n) } | |
for (var i = 0; i < keys.length; i++) { | |
var k = keys[i]; | |
if (a[k] != b[k]) return !1 } | |
return !0 } | |
function filterByKeys(keys, values) { | |
var filtered = {}; | |
return forEach(keys, function(name) { filtered[name] = values[name] }), filtered } | |
function omit(obj) { | |
var copy = {}, | |
keys = Array.prototype.concat.apply(Array.prototype, Array.prototype.slice.call(arguments, 1)); | |
for (var key in obj) - 1 == indexOf(keys, key) && (copy[key] = obj[key]); | |
return copy } | |
function filter(collection, callback) { | |
var array = isArray(collection), | |
result = array ? [] : {}; | |
return forEach(collection, function(val, i) { callback(val, i) && (result[array ? result.length : i] = val) }), result } | |
function map(collection, callback) { | |
var result = isArray(collection) ? [] : {}; | |
return forEach(collection, function(val, i) { result[i] = callback(val, i) }), result } | |
function $Resolve($q, $injector) { | |
var VISIT_IN_PROGRESS = 1, | |
VISIT_DONE = 2, | |
NOTHING = {}, | |
NO_DEPENDENCIES = [], | |
NO_LOCALS = NOTHING, | |
NO_PARENT = extend($q.when(NOTHING), { $$promises: NOTHING, $$values: NOTHING }); | |
this.study = function(invocables) { | |
function visit(value, key) { | |
if (visited[key] !== VISIT_DONE) { | |
if (cycle.push(key), visited[key] === VISIT_IN_PROGRESS) throw cycle.splice(0, indexOf(cycle, key)), new Error("Cyclic dependency: " + cycle.join(" -> ")); | |
if (visited[key] = VISIT_IN_PROGRESS, isString(value)) plan.push(key, [function() { | |
return $injector.get(value) }], NO_DEPENDENCIES); | |
else { | |
var params = $injector.annotate(value); | |
forEach(params, function(param) { param !== key && invocables.hasOwnProperty(param) && visit(invocables[param], param) }), plan.push(key, value, params) } | |
cycle.pop(), visited[key] = VISIT_DONE } } | |
function isResolve(value) { | |
return isObject(value) && value.then && value.$$promises } | |
if (!isObject(invocables)) throw new Error("'invocables' must be an object"); | |
var invocableKeys = objectKeys(invocables || {}), | |
plan = [], | |
cycle = [], | |
visited = {}; | |
return forEach(invocables, visit), invocables = cycle = visited = null, | |
function(locals, parent, self) { | |
function done() {--wait || (merged || merge(values, parent.$$values), result.$$values = values, result.$$promises = result.$$promises || !0, delete result.$$inheritedValues, resolution.resolve(values)) } | |
function fail(reason) { result.$$failure = reason, resolution.reject(reason) } | |
function invoke(key, invocable, params) { | |
function onfailure(reason) { invocation.reject(reason), fail(reason) } | |
function proceed() { | |
if (!isDefined(result.$$failure)) try { invocation.resolve($injector.invoke(invocable, self, values)), invocation.promise.then(function(result) { values[key] = result, done() }, onfailure) } catch (e) { onfailure(e) } } | |
var invocation = $q.defer(), | |
waitParams = 0; | |
forEach(params, function(dep) { promises.hasOwnProperty(dep) && !locals.hasOwnProperty(dep) && (waitParams++, promises[dep].then(function(result) { values[dep] = result, --waitParams || proceed() }, onfailure)) }), waitParams || proceed(), promises[key] = invocation.promise } | |
if (isResolve(locals) && self === undefined && (self = parent, parent = locals, locals = null), locals) { | |
if (!isObject(locals)) throw new Error("'locals' must be an object") } else locals = NO_LOCALS; | |
if (parent) { | |
if (!isResolve(parent)) throw new Error("'parent' must be a promise returned by $resolve.resolve()") } else parent = NO_PARENT; | |
var resolution = $q.defer(), | |
result = resolution.promise, | |
promises = result.$$promises = {}, | |
values = extend({}, locals), | |
wait = 1 + plan.length / 3, | |
merged = !1; | |
if (isDefined(parent.$$failure)) return fail(parent.$$failure), result; | |
parent.$$inheritedValues && merge(values, omit(parent.$$inheritedValues, invocableKeys)), extend(promises, parent.$$promises), parent.$$values ? (merged = merge(values, omit(parent.$$values, invocableKeys)), result.$$inheritedValues = omit(parent.$$values, invocableKeys), done()) : (parent.$$inheritedValues && (result.$$inheritedValues = omit(parent.$$inheritedValues, invocableKeys)), parent.then(done, fail)); | |
for (var i = 0, ii = plan.length; ii > i; i += 3) locals.hasOwnProperty(plan[i]) ? done() : invoke(plan[i], plan[i + 1], plan[i + 2]); | |
return result } }, this.resolve = function(invocables, locals, parent, self) { | |
return this.study(invocables)(locals, parent, self) } } | |
function $TemplateFactory($http, $templateCache, $injector) { this.fromConfig = function(config, params, locals) { | |
return isDefined(config.template) ? this.fromString(config.template, params) : isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) : isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) : null }, this.fromString = function(template, params) { | |
return isFunction(template) ? template(params) : template }, this.fromUrl = function(url, params) { | |
return isFunction(url) && (url = url(params)), null == url ? null : $http.get(url, { cache: $templateCache, headers: { Accept: "text/html" } }).then(function(response) { | |
return response.data }) }, this.fromProvider = function(provider, params, locals) { | |
return $injector.invoke(provider, null, locals || { params: params }) } } | |
function UrlMatcher(pattern, config, parentMatcher) { | |
function addParameter(id, type, config, location) { | |
if (paramNames.push(id), parentParams[id]) return parentParams[id]; | |
if (!/^\w+(-+\w+)*(?:\[\])?$/.test(id)) throw new Error("Invalid parameter name '" + id + "' in pattern '" + pattern + "'"); | |
if (params[id]) throw new Error("Duplicate parameter name '" + id + "' in pattern '" + pattern + "'"); | |
return params[id] = new $$UMFP.Param(id, type, config, location), params[id] } | |
function quoteRegExp(string, pattern, squash) { | |
var surroundPattern = ["", ""], | |
result = string.replace(/[\\\[\]\^$*+?.()|{}]/g, "\\$&"); | |
if (!pattern) return result; | |
switch (squash) { | |
case !1: | |
surroundPattern = ["(", ")"]; | |
break; | |
case !0: | |
surroundPattern = ["?(", ")?"]; | |
break; | |
default: | |
surroundPattern = ["(" + squash + "|", ")?"] } | |
return result + surroundPattern[0] + pattern + surroundPattern[1] } | |
function matchDetails(m, isSearch) { | |
var id, regexp, segment, type, cfg; | |
return id = m[2] || m[3], cfg = config.params[id], segment = pattern.substring(last, m.index), regexp = isSearch ? m[4] : m[4] || ("*" == m[1] ? ".*" : null), type = $$UMFP.type(regexp || "string") || inherit($$UMFP.type("string"), { pattern: new RegExp(regexp) }), { id: id, regexp: regexp, segment: segment, type: type, cfg: cfg } } | |
config = extend({ params: {} }, isObject(config) ? config : {}); | |
var m, placeholder = /([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g, | |
searchPlaceholder = /([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g, | |
compiled = "^", | |
last = 0, | |
segments = this.segments = [], | |
parentParams = parentMatcher ? parentMatcher.params : {}, | |
params = this.params = parentMatcher ? parentMatcher.params.$$new() : new $$UMFP.ParamSet, | |
paramNames = []; | |
this.source = pattern; | |
for (var p, param, segment; | |
(m = placeholder.exec(pattern)) && (p = matchDetails(m, !1), !(p.segment.indexOf("?") >= 0));) param = addParameter(p.id, p.type, p.cfg, "path"), compiled += quoteRegExp(p.segment, param.type.pattern.source, param.squash), segments.push(p.segment), last = placeholder.lastIndex; | |
segment = pattern.substring(last); | |
var i = segment.indexOf("?"); | |
if (i >= 0) { | |
var search = this.sourceSearch = segment.substring(i); | |
if (segment = segment.substring(0, i), this.sourcePath = pattern.substring(0, last + i), search.length > 0) | |
for (last = 0; m = searchPlaceholder.exec(search);) p = matchDetails(m, !0), param = addParameter(p.id, p.type, p.cfg, "search"), last = placeholder.lastIndex } else this.sourcePath = pattern, this.sourceSearch = ""; | |
compiled += quoteRegExp(segment) + (config.strict === !1 ? "/?" : "") + "$", segments.push(segment), this.regexp = new RegExp(compiled, config.caseInsensitive ? "i" : undefined), this.prefix = segments[0], this.$$paramNames = paramNames } | |
function Type(config) { extend(this, config) } | |
function $UrlMatcherFactory() { | |
function valToString(val) { | |
return null != val ? val.toString().replace(/\//g, "%2F") : val } | |
function valFromString(val) { | |
return null != val ? val.toString().replace(/%2F/g, "/") : val } | |
function regexpMatches(val) { | |
return this.pattern.test(val) } | |
function getDefaultConfig() { | |
return { strict: isStrictMode, caseInsensitive: isCaseInsensitive } } | |
function isInjectable(value) { | |
return isFunction(value) || isArray(value) && isFunction(value[value.length - 1]) } | |
function flushTypeQueue() { | |
for (; typeQueue.length;) { | |
var type = typeQueue.shift(); | |
if (type.pattern) throw new Error("You cannot override a type's .pattern at runtime."); | |
angular.extend($types[type.name], injector.invoke(type.def)) } } | |
function ParamSet(params) { extend(this, params || {}) } | |
$$UMFP = this; | |
var injector, isCaseInsensitive = !1, | |
isStrictMode = !0, | |
defaultSquashPolicy = !1, | |
$types = {}, | |
enqueue = !0, | |
typeQueue = [], | |
defaultTypes = { string: { encode: valToString, decode: valFromString, is: regexpMatches, pattern: /[^/]*/ }, "int": { encode: valToString, decode: function(val) { | |
return parseInt(val, 10) }, is: function(val) { | |
return isDefined(val) && this.decode(val.toString()) === val }, pattern: /\d+/ }, bool: { encode: function(val) { | |
return val ? 1 : 0 }, decode: function(val) { | |
return 0 !== parseInt(val, 10) }, is: function(val) { | |
return val === !0 || val === !1 }, pattern: /0|1/ }, date: { encode: function(val) { | |
return this.is(val) ? [val.getFullYear(), ("0" + (val.getMonth() + 1)).slice(-2), ("0" + val.getDate()).slice(-2)].join("-") : undefined }, decode: function(val) { | |
if (this.is(val)) return val; | |
var match = this.capture.exec(val); | |
return match ? new Date(match[1], match[2] - 1, match[3]) : undefined }, is: function(val) { | |
return val instanceof Date && !isNaN(val.valueOf()) }, equals: function(a, b) { | |
return this.is(a) && this.is(b) && a.toISOString() === b.toISOString() }, pattern: /[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/, capture: /([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/ }, json: { encode: angular.toJson, decode: angular.fromJson, is: angular.isObject, equals: angular.equals, pattern: /[^/]*/ }, any: { encode: angular.identity, decode: angular.identity, is: angular.identity, equals: angular.equals, pattern: /.*/ } }; | |
$UrlMatcherFactory.$$getDefaultValue = function(config) { | |
if (!isInjectable(config.value)) return config.value; | |
if (!injector) throw new Error("Injectable functions cannot be called at configuration time"); | |
return injector.invoke(config.value) }, this.caseInsensitive = function(value) { | |
return isDefined(value) && (isCaseInsensitive = value), isCaseInsensitive }, this.strictMode = function(value) { | |
return isDefined(value) && (isStrictMode = value), isStrictMode }, this.defaultSquashPolicy = function(value) { | |
if (!isDefined(value)) return defaultSquashPolicy; | |
if (value !== !0 && value !== !1 && !isString(value)) throw new Error("Invalid squash policy: " + value + ". Valid policies: false, true, arbitrary-string"); | |
return defaultSquashPolicy = value, value }, this.compile = function(pattern, config) { | |
return new UrlMatcher(pattern, extend(getDefaultConfig(), config)) }, this.isMatcher = function(o) { | |
if (!isObject(o)) return !1; | |
var result = !0; | |
return forEach(UrlMatcher.prototype, function(val, name) { isFunction(val) && (result = result && isDefined(o[name]) && isFunction(o[name])) }), result }, this.type = function(name, definition, definitionFn) { | |
if (!isDefined(definition)) return $types[name]; | |
if ($types.hasOwnProperty(name)) throw new Error("A type named '" + name + "' has already been defined."); | |
return $types[name] = new Type(extend({ name: name }, definition)), definitionFn && (typeQueue.push({ name: name, def: definitionFn }), enqueue || flushTypeQueue()), this }, forEach(defaultTypes, function(type, name) { $types[name] = new Type(extend({ name: name }, type)) }), $types = inherit($types, {}), this.$get = ["$injector", function($injector) { | |
return injector = $injector, enqueue = !1, flushTypeQueue(), forEach(defaultTypes, function(type, name) { $types[name] || ($types[name] = new Type(type)) }), this }], this.Param = function(id, type, config, location) { | |
function unwrapShorthand(config) { | |
var keys = isObject(config) ? objectKeys(config) : [], | |
isShorthand = -1 === indexOf(keys, "value") && -1 === indexOf(keys, "type") && -1 === indexOf(keys, "squash") && -1 === indexOf(keys, "array"); | |
return isShorthand && (config = { value: config }), config.$$fn = isInjectable(config.value) ? config.value : function() { | |
return config.value }, config } | |
function getType(config, urlType, location) { | |
if (config.type && urlType) throw new Error("Param '" + id + "' has two type configurations."); | |
return urlType ? urlType : config.type ? config.type instanceof Type ? config.type : new Type(config.type) : "config" === location ? $types.any : $types.string } | |
function getArrayMode() { | |
var arrayDefaults = { array: "search" === location ? "auto" : !1 }, | |
arrayParamNomenclature = id.match(/\[\]$/) ? { array: !0 } : {}; | |
return extend(arrayDefaults, arrayParamNomenclature, config).array } | |
function getSquashPolicy(config, isOptional) { | |
var squash = config.squash; | |
if (!isOptional || squash === !1) return !1; | |
if (!isDefined(squash) || null == squash) return defaultSquashPolicy; | |
if (squash === !0 || isString(squash)) return squash; | |
throw new Error("Invalid squash policy: '" + squash + "'. Valid policies: false, true, or arbitrary string") } | |
function getReplace(config, arrayMode, isOptional, squash) { | |
var replace, configuredKeys, defaultPolicy = [{ from: "", to: isOptional || arrayMode ? undefined : "" }, { from: null, to: isOptional || arrayMode ? undefined : "" }]; | |
return replace = isArray(config.replace) ? config.replace : [], isString(squash) && replace.push({ from: squash, to: undefined }), configuredKeys = map(replace, function(item) { | |
return item.from }), filter(defaultPolicy, function(item) { | |
return -1 === indexOf(configuredKeys, item.from) }).concat(replace) } | |
function $$getDefaultValue() { | |
if (!injector) throw new Error("Injectable functions cannot be called at configuration time"); | |
return injector.invoke(config.$$fn) } | |
function $value(value) { | |
function hasReplaceVal(val) { | |
return function(obj) { | |
return obj.from === val } } | |
function $replace(value) { | |
var replacement = map(filter(self.replace, hasReplaceVal(value)), function(obj) { | |
return obj.to }); | |
return replacement.length ? replacement[0] : value } | |
return value = $replace(value), isDefined(value) ? self.type.decode(value) : $$getDefaultValue() } | |
function toString() { | |
return "{Param:" + id + " " + type + " squash: '" + squash + "' optional: " + isOptional + "}" } | |
var self = this; | |
config = unwrapShorthand(config), type = getType(config, type, location); | |
var arrayMode = getArrayMode(); | |
type = arrayMode ? type.$asArray(arrayMode, "search" === location) : type, "string" !== type.name || arrayMode || "path" !== location || config.value !== undefined || (config.value = ""); | |
var isOptional = config.value !== undefined, | |
squash = getSquashPolicy(config, isOptional), | |
replace = getReplace(config, arrayMode, isOptional, squash); | |
extend(this, { id: id, type: type, location: location, array: arrayMode, squash: squash, replace: replace, isOptional: isOptional, value: $value, dynamic: undefined, config: config, toString: toString }) }, ParamSet.prototype = { $$new: function() { | |
return inherit(this, extend(new ParamSet, { $$parent: this })) }, $$keys: function() { | |
for (var keys = [], chain = [], parent = this, ignore = objectKeys(ParamSet.prototype); parent;) chain.push(parent), parent = parent.$$parent; | |
return chain.reverse(), forEach(chain, function(paramset) { forEach(objectKeys(paramset), function(key) {-1 === indexOf(keys, key) && -1 === indexOf(ignore, key) && keys.push(key) }) }), keys }, $$values: function(paramValues) { | |
var values = {}, | |
self = this; | |
return forEach(self.$$keys(), function(key) { values[key] = self[key].value(paramValues && paramValues[key]) }), values }, $$equals: function(paramValues1, paramValues2) { | |
var equal = !0, | |
self = this; | |
return forEach(self.$$keys(), function(key) { | |
var left = paramValues1 && paramValues1[key], | |
right = paramValues2 && paramValues2[key]; | |
self[key].type.equals(left, right) || (equal = !1) }), equal }, $$validates: function(paramValues) { | |
var isOptional, val, param, result = !0, | |
self = this; | |
return forEach(this.$$keys(), function(key) { param = self[key], val = paramValues[key], isOptional = !val && param.isOptional, result = result && (isOptional || !!param.type.is(val)) }), result }, $$parent: undefined }, this.ParamSet = ParamSet } | |
function $UrlRouterProvider($locationProvider, $urlMatcherFactory) { | |
function regExpPrefix(re) { | |
var prefix = /^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(re.source); | |
return null != prefix ? prefix[1].replace(/\\(.)/g, "$1") : "" } | |
function interpolate(pattern, match) { | |
return pattern.replace(/\$(\$|\d{1,2})/, function(m, what) { | |
return match["$" === what ? 0 : Number(what)] }) } | |
function handleIfMatch($injector, handler, match) { | |
if (!match) return !1; | |
var result = $injector.invoke(handler, handler, { $match: match }); | |
return isDefined(result) ? result : !0 } | |
function $get($location, $rootScope, $injector, $browser) { | |
function appendBasePath(url, isHtml5, absolute) { | |
return "/" === baseHref ? url : isHtml5 ? baseHref.slice(0, -1) + url : absolute ? baseHref.slice(1) + url : url } | |
function update(evt) { | |
function check(rule) { | |
var handled = rule($injector, $location); | |
return handled ? (isString(handled) && $location.replace().url(handled), !0) : !1 } | |
if (!evt || !evt.defaultPrevented) { | |
var ignoreUpdate = lastPushedUrl && $location.url() === lastPushedUrl; | |
if (lastPushedUrl = undefined, ignoreUpdate) return !0; | |
var i, n = rules.length; | |
for (i = 0; n > i; i++) | |
if (check(rules[i])) return; | |
otherwise && check(otherwise) } } | |
function listen() { | |
return listener = listener || $rootScope.$on("$locationChangeSuccess", update) } | |
var lastPushedUrl, baseHref = $browser.baseHref(), | |
location = $location.url(); | |
return interceptDeferred || listen(), { sync: function() { update() }, listen: function() { | |
return listen() }, update: function(read) { | |
return read ? void(location = $location.url()) : void($location.url() !== location && ($location.url(location), $location.replace())) }, push: function(urlMatcher, params, options) { $location.url(urlMatcher.format(params || {})), lastPushedUrl = options && options.$$avoidResync ? $location.url() : undefined, options && options.replace && $location.replace() }, href: function(urlMatcher, params, options) { | |
if (!urlMatcher.validates(params)) return null; | |
var isHtml5 = $locationProvider.html5Mode(); | |
angular.isObject(isHtml5) && (isHtml5 = isHtml5.enabled); | |
var url = urlMatcher.format(params); | |
if (options = options || {}, isHtml5 || null === url || (url = "#" + $locationProvider.hashPrefix() + url), url = appendBasePath(url, isHtml5, options.absolute), !options.absolute || !url) return url; | |
var slash = !isHtml5 && url ? "/" : "", | |
port = $location.port(); | |
return port = 80 === port || 443 === port ? "" : ":" + port, [$location.protocol(), "://", $location.host(), port, slash, url].join("") } } } | |
var listener, rules = [], | |
otherwise = null, | |
interceptDeferred = !1; | |
this.rule = function(rule) { | |
if (!isFunction(rule)) throw new Error("'rule' must be a function"); | |
return rules.push(rule), this }, this.otherwise = function(rule) { | |
if (isString(rule)) { | |
var redirect = rule; | |
rule = function() { | |
return redirect } } else if (!isFunction(rule)) throw new Error("'rule' must be a function"); | |
return otherwise = rule, this }, this.when = function(what, handler) { | |
var redirect, handlerIsString = isString(handler); | |
if (isString(what) && (what = $urlMatcherFactory.compile(what)), !handlerIsString && !isFunction(handler) && !isArray(handler)) throw new Error("invalid 'handler' in when()"); | |
var strategies = { matcher: function(what, handler) { | |
return handlerIsString && (redirect = $urlMatcherFactory.compile(handler), handler = ["$match", function($match) { | |
return redirect.format($match) }]), extend(function($injector, $location) { | |
return handleIfMatch($injector, handler, what.exec($location.path(), $location.search())) }, { prefix: isString(what.prefix) ? what.prefix : "" }) }, regex: function(what, handler) { | |
if (what.global || what.sticky) throw new Error("when() RegExp must not be global or sticky"); | |
return handlerIsString && (redirect = handler, handler = ["$match", function($match) { | |
return interpolate(redirect, $match) }]), extend(function($injector, $location) { | |
return handleIfMatch($injector, handler, what.exec($location.path())) }, { prefix: regExpPrefix(what) }) } }, | |
check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp }; | |
for (var n in check) | |
if (check[n]) return this.rule(strategies[n](what, handler)); | |
throw new Error("invalid 'what' in when()") }, this.deferIntercept = function(defer) { defer === undefined && (defer = !0), interceptDeferred = defer }, this.$get = $get, $get.$inject = ["$location", "$rootScope", "$injector", "$browser"] } | |
function $StateProvider($urlRouterProvider, $urlMatcherFactory) { | |
function isRelative(stateName) { | |
return 0 === stateName.indexOf(".") || 0 === stateName.indexOf("^") } | |
function findState(stateOrName, base) { | |
if (!stateOrName) return undefined; | |
var isStr = isString(stateOrName), | |
name = isStr ? stateOrName : stateOrName.name, | |
path = isRelative(name); | |
if (path) { | |
if (!base) throw new Error("No reference point given for path '" + name + "'"); | |
base = findState(base); | |
for (var rel = name.split("."), i = 0, pathLength = rel.length, current = base; pathLength > i; i++) | |
if ("" !== rel[i] || 0 !== i) { | |
if ("^" !== rel[i]) break; | |
if (!current.parent) throw new Error("Path '" + name + "' not valid for state '" + base.name + "'"); | |
current = current.parent } else current = base; | |
rel = rel.slice(i).join("."), name = current.name + (current.name && rel ? "." : "") + rel } | |
var state = states[name]; | |
return !state || !isStr && (isStr || state !== stateOrName && state.self !== stateOrName) ? undefined : state } | |
function queueState(parentName, state) { queue[parentName] || (queue[parentName] = []), queue[parentName].push(state) } | |
function flushQueuedChildren(parentName) { | |
for (var queued = queue[parentName] || []; queued.length;) registerState(queued.shift()) } | |
function registerState(state) { state = inherit(state, { self: state, resolve: state.resolve || {}, toString: function() { | |
return this.name } }); | |
var name = state.name; | |
if (!isString(name) || name.indexOf("@") >= 0) throw new Error("State must have a valid name"); | |
if (states.hasOwnProperty(name)) throw new Error("State '" + name + "'' is already defined"); | |
var parentName = -1 !== name.indexOf(".") ? name.substring(0, name.lastIndexOf(".")) : isString(state.parent) ? state.parent : isObject(state.parent) && isString(state.parent.name) ? state.parent.name : ""; | |
if (parentName && !states[parentName]) return queueState(parentName, state.self); | |
for (var key in stateBuilder) isFunction(stateBuilder[key]) && (state[key] = stateBuilder[key](state, stateBuilder.$delegates[key])); | |
return states[name] = state, !state[abstractKey] && state.url && $urlRouterProvider.when(state.url, ["$match", "$stateParams", function($match, $stateParams) { $state.$current.navigable == state && equalForKeys($match, $stateParams) || $state.transitionTo(state, $match, { inherit: !0, location: !1 }) }]), flushQueuedChildren(name), state } | |
function isGlob(text) { | |
return text.indexOf("*") > -1 } | |
function doesStateMatchGlob(glob) { | |
var globSegments = glob.split("."), | |
segments = $state.$current.name.split("."); | |
if ("**" === globSegments[0] && (segments = segments.slice(indexOf(segments, globSegments[1])), segments.unshift("**")), "**" === globSegments[globSegments.length - 1] && (segments.splice(indexOf(segments, globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE), segments.push("**")), globSegments.length != segments.length) return !1; | |
for (var i = 0, l = globSegments.length; l > i; i++) "*" === globSegments[i] && (segments[i] = "*"); | |
return segments.join("") === globSegments.join("") } | |
function decorator(name, func) { | |
return isString(name) && !isDefined(func) ? stateBuilder[name] : isFunction(func) && isString(name) ? (stateBuilder[name] && !stateBuilder.$delegates[name] && (stateBuilder.$delegates[name] = stateBuilder[name]), stateBuilder[name] = func, this) : this } | |
function state(name, definition) { | |
return isObject(name) ? definition = name : definition.name = name, registerState(definition), this } | |
function $get($rootScope, $q, $view, $injector, $resolve, $stateParams, $urlRouter) { | |
function handleRedirect(redirect, state, params, options) { | |
var evt = $rootScope.$broadcast("$stateNotFound", redirect, state, params); | |
if (evt.defaultPrevented) return $urlRouter.update(), TransitionAborted; | |
if (!evt.retry) return null; | |
if (options.$retry) return $urlRouter.update(), TransitionFailed; | |
var retryTransition = $state.transition = $q.when(evt.retry); | |
return retryTransition.then(function() { | |
return retryTransition !== $state.transition ? TransitionSuperseded : (redirect.options.$retry = !0, $state.transitionTo(redirect.to, redirect.toParams, redirect.options)) }, function() { | |
return TransitionAborted }), $urlRouter.update(), retryTransition } | |
function resolveState(state, params, paramsAreFiltered, inherited, dst, options) { | |
var $stateParams = paramsAreFiltered ? params : filterByKeys(state.params.$$keys(), params), | |
locals = { $stateParams: $stateParams }; | |
dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state); | |
var promises = [dst.resolve.then(function(globals) { dst.globals = globals })]; | |
return inherited && promises.push(inherited), forEach(state.views, function(view, name) { | |
var injectables = view.resolve && view.resolve !== state.resolve ? view.resolve : {}; | |
injectables.$template = [function() { | |
return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: options.notify }) || "" }], promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function(result) { | |
if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) { | |
var injectLocals = angular.extend({}, injectables, locals); | |
result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals) } else result.$$controller = view.controller; | |
result.$$state = state, result.$$controllerAs = view.controllerAs, dst[name] = result })) }), $q.all(promises).then(function() { | |
return dst }) } | |
var TransitionSuperseded = $q.reject(new Error("transition superseded")), | |
TransitionPrevented = $q.reject(new Error("transition prevented")), | |
TransitionAborted = $q.reject(new Error("transition aborted")), | |
TransitionFailed = $q.reject(new Error("transition failed")); | |
return root.locals = { resolve: null, globals: { $stateParams: {} } }, $state = { params: {}, current: root.self, $current: root, transition: null }, $state.reload = function() { | |
return $state.transitionTo($state.current, $stateParams, { reload: !0, inherit: !1, notify: !0 }) }, $state.go = function(to, params, options) { | |
return $state.transitionTo(to, params, extend({ inherit: !0, relative: $state.$current }, options)) }, $state.transitionTo = function(to, toParams, options) { toParams = toParams || {}, options = extend({ location: !0, inherit: !1, relative: null, notify: !0, reload: !1, $retry: !1 }, options || {}); | |
var evt, from = $state.$current, | |
fromParams = $state.params, | |
fromPath = from.path, | |
toState = findState(to, options.relative); | |
if (!isDefined(toState)) { | |
var redirect = { to: to, toParams: toParams, options: options }, | |
redirectResult = handleRedirect(redirect, from.self, fromParams, options); | |
if (redirectResult) return redirectResult; | |
if (to = redirect.to, toParams = redirect.toParams, options = redirect.options, toState = findState(to, options.relative), !isDefined(toState)) { | |
if (!options.relative) throw new Error("No such state '" + to + "'"); | |
throw new Error("Could not resolve '" + to + "' from state '" + options.relative + "'") } } | |
if (toState[abstractKey]) throw new Error("Cannot transition to abstract state '" + to + "'"); | |
if (options.inherit && (toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState)), !toState.params.$$validates(toParams)) return TransitionFailed; | |
toParams = toState.params.$$values(toParams), to = toState; | |
var toPath = to.path, | |
keep = 0, | |
state = toPath[keep], | |
locals = root.locals, | |
toLocals = []; | |
if (!options.reload) | |
for (; state && state === fromPath[keep] && state.ownParams.$$equals(toParams, fromParams);) locals = toLocals[keep] = state.locals, keep++, state = toPath[keep]; | |
if (shouldTriggerReload(to, from, locals, options)) return to.self.reloadOnSearch !== !1 && $urlRouter.update(), $state.transition = null, $q.when($state.current); | |
if (toParams = filterByKeys(to.params.$$keys(), toParams || {}), options.notify && $rootScope.$broadcast("$stateChangeStart", to.self, toParams, from.self, fromParams).defaultPrevented) return $urlRouter.update(), TransitionPrevented; | |
for (var resolved = $q.when(locals), l = keep; l < toPath.length; l++, state = toPath[l]) locals = toLocals[l] = inherit(locals), resolved = resolveState(state, toParams, state === to, resolved, locals, options); | |
var transition = $state.transition = resolved.then(function() { | |
var l, entering, exiting; | |
if ($state.transition !== transition) return TransitionSuperseded; | |
for (l = fromPath.length - 1; l >= keep; l--) exiting = fromPath[l], exiting.self.onExit && $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals), exiting.locals = null; | |
for (l = keep; l < toPath.length; l++) entering = toPath[l], entering.locals = toLocals[l], entering.self.onEnter && $injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals); | |
return $state.transition !== transition ? TransitionSuperseded : ($state.$current = to, $state.current = to.self, $state.params = toParams, copy($state.params, $stateParams), $state.transition = null, options.location && to.navigable && $urlRouter.push(to.navigable.url, to.navigable.locals.globals.$stateParams, { $$avoidResync: !0, replace: "replace" === options.location }), options.notify && $rootScope.$broadcast("$stateChangeSuccess", to.self, toParams, from.self, fromParams), $urlRouter.update(!0), $state.current) }, function(error) { | |
return $state.transition !== transition ? TransitionSuperseded : ($state.transition = null, evt = $rootScope.$broadcast("$stateChangeError", to.self, toParams, from.self, fromParams, error), evt.defaultPrevented || $urlRouter.update(), $q.reject(error)) }); | |
return transition }, $state.is = function(stateOrName, params, options) { options = extend({ relative: $state.$current }, options || {}); | |
var state = findState(stateOrName, options.relative); | |
return isDefined(state) ? $state.$current !== state ? !1 : params ? equalForKeys(state.params.$$values(params), $stateParams) : !0 : undefined }, $state.includes = function(stateOrName, params, options) { | |
if (options = extend({ relative: $state.$current }, options || {}), isString(stateOrName) && isGlob(stateOrName)) { | |
if (!doesStateMatchGlob(stateOrName)) return !1; | |
stateOrName = $state.$current.name } | |
var state = findState(stateOrName, options.relative); | |
return isDefined(state) ? isDefined($state.$current.includes[state.name]) ? params ? equalForKeys(state.params.$$values(params), $stateParams, objectKeys(params)) : !0 : !1 : undefined }, $state.href = function(stateOrName, params, options) { options = extend({ lossy: !0, inherit: !0, absolute: !1, relative: $state.$current }, options || {}); | |
var state = findState(stateOrName, options.relative); | |
if (!isDefined(state)) return null; | |
options.inherit && (params = inheritParams($stateParams, params || {}, $state.$current, state)); | |
var nav = state && options.lossy ? state.navigable : state; | |
return nav && nav.url !== undefined && null !== nav.url ? $urlRouter.href(nav.url, filterByKeys(state.params.$$keys(), params || {}), { absolute: options.absolute }) : null }, $state.get = function(stateOrName, context) { | |
if (0 === arguments.length) return map(objectKeys(states), function(name) { | |
return states[name].self }); | |
var state = findState(stateOrName, context || $state.$current); | |
return state && state.self ? state.self : null }, $state } | |
function shouldTriggerReload(to, from, locals, options) { | |
return to !== from || (locals !== from.locals || options.reload) && to.self.reloadOnSearch !== !1 ? void 0 : !0 } | |
var root, $state, states = {}, | |
queue = {}, | |
abstractKey = "abstract", | |
stateBuilder = { | |
parent: function(state) { | |
if (isDefined(state.parent) && state.parent) return findState(state.parent); | |
var compositeName = /^(.+)\.[^.]+$/.exec(state.name); | |
return compositeName ? findState(compositeName[1]) : root }, | |
data: function(state) { | |
return state.parent && state.parent.data && (state.data = state.self.data = extend({}, state.parent.data, state.data)), state.data }, | |
url: function(state) { | |
var url = state.url, | |
config = { params: state.params || {} }; | |
if (isString(url)) return "^" == url.charAt(0) ? $urlMatcherFactory.compile(url.substring(1), config) : (state.parent.navigable || root).url.concat(url, config); | |
if (!url || $urlMatcherFactory.isMatcher(url)) return url; | |
throw new Error("Invalid url '" + url + "' in state '" + state + "'") }, | |
navigable: function(state) { | |
return state.url ? state : state.parent ? state.parent.navigable : null }, | |
ownParams: function(state) { | |
var params = state.url && state.url.params || new $$UMFP.ParamSet; | |
return forEach(state.params || {}, function(config, id) { params[id] || (params[id] = new $$UMFP.Param(id, null, config, "config")) }), params }, | |
params: function(state) { | |
return state.parent && state.parent.params ? extend(state.parent.params.$$new(), state.ownParams) : new $$UMFP.ParamSet }, | |
views: function(state) { | |
var views = {}; | |
return forEach(isDefined(state.views) ? state.views : { "": state }, function(view, name) { | |
name.indexOf("@") < 0 && (name += "@" + state.parent.name), views[name] = view | |
}), views | |
}, | |
path: function(state) { | |
return state.parent ? state.parent.path.concat(state) : [] }, | |
includes: function(state) { | |
var includes = state.parent ? extend({}, state.parent.includes) : {}; | |
return includes[state.name] = !0, includes }, | |
$delegates: {} | |
}; | |
root = registerState({ name: "", url: "^", views: null, "abstract": !0 }), root.navigable = null, this.decorator = decorator, this.state = state, this.$get = $get, $get.$inject = ["$rootScope", "$q", "$view", "$injector", "$resolve", "$stateParams", "$urlRouter", "$location", "$urlMatcherFactory"] | |
} | |
function $ViewProvider() { | |
function $get($rootScope, $templateFactory) { | |
return { load: function(name, options) { | |
var result, defaults = { template: null, controller: null, view: null, locals: null, notify: !0, async: !0, params: {} }; | |
return options = extend(defaults, options), options.view && (result = $templateFactory.fromConfig(options.view, options.params, options.locals)), result && options.notify && $rootScope.$broadcast("$viewContentLoading", options), result } } } | |
this.$get = $get, $get.$inject = ["$rootScope", "$templateFactory"] } | |
function $ViewScrollProvider() { | |
var useAnchorScroll = !1; | |
this.useAnchorScroll = function() { useAnchorScroll = !0 }, this.$get = ["$anchorScroll", "$timeout", function($anchorScroll, $timeout) { | |
return useAnchorScroll ? $anchorScroll : function($element) { $timeout(function() { $element[0].scrollIntoView() }, 0, !1) } }] } | |
function $ViewDirective($state, $injector, $uiViewScroll, $interpolate) { | |
function getService() { | |
return $injector.has ? function(service) { | |
return $injector.has(service) ? $injector.get(service) : null } : function(service) { | |
try { | |
return $injector.get(service) } catch (e) { | |
return null } } } | |
function getRenderer(attrs, scope) { | |
var statics = function() { | |
return { enter: function(element, target, cb) { target.after(element), cb() }, leave: function(element, cb) { element.remove(), cb() } } }; | |
if ($animate) return { enter: function(element, target, cb) { | |
var promise = $animate.enter(element, null, target, cb); | |
promise && promise.then && promise.then(cb) }, leave: function(element, cb) { | |
var promise = $animate.leave(element, cb); | |
promise && promise.then && promise.then(cb) } }; | |
if ($animator) { | |
var animate = $animator && $animator(scope, attrs); | |
return { enter: function(element, target, cb) { animate.enter(element, null, target), cb() }, leave: function(element, cb) { animate.leave(element), cb() } } } | |
return statics() } | |
var service = getService(), | |
$animator = service("$animator"), | |
$animate = service("$animate"), | |
directive = { restrict: "ECA", terminal: !0, priority: 400, transclude: "element", compile: function(tElement, tAttrs, $transclude) { | |
return function(scope, $element, attrs) { | |
function cleanupLastView() { previousEl && (previousEl.remove(), previousEl = null), currentScope && (currentScope.$destroy(), currentScope = null), currentEl && (renderer.leave(currentEl, function() { previousEl = null }), previousEl = currentEl, currentEl = null) } | |
function updateView(firstTime) { | |
var newScope, name = getUiViewName(scope, attrs, $element, $interpolate), | |
previousLocals = name && $state.$current && $state.$current.locals[name]; | |
if (firstTime || previousLocals !== latestLocals) { newScope = scope.$new(), latestLocals = $state.$current.locals[name]; | |
var clone = $transclude(newScope, function(clone) { renderer.enter(clone, $element, function() { currentScope && currentScope.$emit("$viewContentAnimationEnded"), (angular.isDefined(autoScrollExp) && !autoScrollExp || scope.$eval(autoScrollExp)) && $uiViewScroll(clone) }), cleanupLastView() }); | |
currentEl = clone, currentScope = newScope, currentScope.$emit("$viewContentLoaded"), currentScope.$eval(onloadExp) } } | |
var previousEl, currentEl, currentScope, latestLocals, onloadExp = attrs.onload || "", | |
autoScrollExp = attrs.autoscroll, | |
renderer = getRenderer(attrs, scope); | |
scope.$on("$stateChangeSuccess", function() { updateView(!1) }), scope.$on("$viewContentLoading", function() { updateView(!1) }), updateView(!0) } } }; | |
return directive } | |
function $ViewDirectiveFill($compile, $controller, $state, $interpolate) { | |
return { restrict: "ECA", priority: -400, compile: function(tElement) { | |
var initial = tElement.html(); | |
return function(scope, $element, attrs) { | |
var current = $state.$current, | |
name = getUiViewName(scope, attrs, $element, $interpolate), | |
locals = current && current.locals[name]; | |
if (locals) { $element.data("$uiView", { name: name, state: locals.$$state }), $element.html(locals.$template ? locals.$template : initial); | |
var link = $compile($element.contents()); | |
if (locals.$$controller) { locals.$scope = scope; | |
var controller = $controller(locals.$$controller, locals); | |
locals.$$controllerAs && (scope[locals.$$controllerAs] = controller), $element.data("$ngControllerController", controller), $element.children().data("$ngControllerController", controller) } | |
link(scope) } } } } } | |
function getUiViewName(scope, attrs, element, $interpolate) { | |
var name = $interpolate(attrs.uiView || attrs.name || "")(scope), | |
inherited = element.inheritedData("$uiView"); | |
return name.indexOf("@") >= 0 ? name : name + "@" + (inherited ? inherited.state.name : "") } | |
function parseStateRef(ref, current) { | |
var parsed, preparsed = ref.match(/^\s*({[^}]*})\s*$/); | |
if (preparsed && (ref = current + "(" + preparsed[1] + ")"), parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/), !parsed || 4 !== parsed.length) throw new Error("Invalid state ref '" + ref + "'"); | |
return { state: parsed[1], paramExpr: parsed[3] || null } } | |
function stateContext(el) { | |
var stateData = el.parent().inheritedData("$uiView"); | |
return stateData && stateData.state && stateData.state.name ? stateData.state : void 0 } | |
function $StateRefDirective($state, $timeout) { | |
var allowedOptions = ["location", "inherit", "reload"]; | |
return { restrict: "A", require: ["?^uiSrefActive", "?^uiSrefActiveEq"], link: function(scope, element, attrs, uiSrefActive) { | |
var ref = parseStateRef(attrs.uiSref, $state.current.name), | |
params = null, | |
base = stateContext(element) || $state.$current, | |
newHref = null, | |
isAnchor = "A" === element.prop("tagName"), | |
isForm = "FORM" === element[0].nodeName, | |
attr = isForm ? "action" : "href", | |
nav = !0, | |
options = { relative: base, inherit: !0 }, | |
optionsOverride = scope.$eval(attrs.uiSrefOpts) || {}; | |
angular.forEach(allowedOptions, function(option) { option in optionsOverride && (options[option] = optionsOverride[option]) }); | |
var update = function(newVal) { | |
if (newVal && (params = angular.copy(newVal)), nav) { newHref = $state.href(ref.state, params, options); | |
var activeDirective = uiSrefActive[1] || uiSrefActive[0]; | |
return activeDirective && activeDirective.$$setStateInfo(ref.state, params), null === newHref ? (nav = !1, !1) : void attrs.$set(attr, newHref) } }; | |
ref.paramExpr && (scope.$watch(ref.paramExpr, function(newVal) { newVal !== params && update(newVal) }, !0), params = angular.copy(scope.$eval(ref.paramExpr))), update(), isForm || element.bind("click", function(e) { | |
var button = e.which || e.button; | |
if (!(button > 1 || e.ctrlKey || e.metaKey || e.shiftKey || element.attr("target"))) { | |
var transition = $timeout(function() { $state.go(ref.state, params, options) }); | |
e.preventDefault(); | |
var ignorePreventDefaultCount = isAnchor && !newHref ? 1 : 0; | |
e.preventDefault = function() { ignorePreventDefaultCount-- <= 0 && $timeout.cancel(transition) } } }) } } } | |
function $StateRefActiveDirective($state, $stateParams, $interpolate) { | |
return { restrict: "A", controller: ["$scope", "$element", "$attrs", function($scope, $element, $attrs) { | |
function update() { isMatch() ? $element.addClass(activeClass) : $element.removeClass(activeClass) } | |
function isMatch() { | |
return "undefined" != typeof $attrs.uiSrefActiveEq ? state && $state.is(state.name, params) : state && $state.includes(state.name, params) } | |
var state, params, activeClass; | |
activeClass = $interpolate($attrs.uiSrefActiveEq || $attrs.uiSrefActive || "", !1)($scope), this.$$setStateInfo = function(newState, newParams) { state = $state.get(newState, stateContext($element)), params = newParams, update() }, $scope.$on("$stateChangeSuccess", update) }] } } | |
function $IsStateFilter($state) { | |
var isFilter = function(state) { | |
return $state.is(state) }; | |
return isFilter.$stateful = !0, isFilter } | |
function $IncludedByStateFilter($state) { | |
var includesFilter = function(state) { | |
return $state.includes(state) }; | |
return includesFilter.$stateful = !0, includesFilter } | |
var isDefined = angular.isDefined, | |
isFunction = angular.isFunction, | |
isString = angular.isString, | |
isObject = angular.isObject, | |
isArray = angular.isArray, | |
forEach = angular.forEach, | |
extend = angular.extend, | |
copy = angular.copy; | |
angular.module("ui.router.util", ["ng"]), angular.module("ui.router.router", ["ui.router.util"]), angular.module("ui.router.state", ["ui.router.router", "ui.router.util"]), angular.module("ui.router", ["ui.router.state"]), angular.module("ui.router.compat", ["ui.router"]), $Resolve.$inject = ["$q", "$injector"], angular.module("ui.router.util").service("$resolve", $Resolve), $TemplateFactory.$inject = ["$http", "$templateCache", "$injector"], angular.module("ui.router.util").service("$templateFactory", $TemplateFactory); | |
var $$UMFP; | |
UrlMatcher.prototype.concat = function(pattern, config) { | |
var defaultConfig = { caseInsensitive: $$UMFP.caseInsensitive(), strict: $$UMFP.strictMode(), squash: $$UMFP.defaultSquashPolicy() }; | |
return new UrlMatcher(this.sourcePath + pattern + this.sourceSearch, extend(defaultConfig, config), this) }, UrlMatcher.prototype.toString = function() { | |
return this.source }, UrlMatcher.prototype.exec = function(path, searchParams) { | |
function decodePathArray(string) { | |
function reverseString(str) { | |
return str.split("").reverse().join("") } | |
function unquoteDashes(str) { | |
return str.replace(/\\-/, "-") } | |
var split = reverseString(string).split(/-(?!\\)/), | |
allReversed = map(split, reverseString); | |
return map(allReversed, unquoteDashes).reverse() } | |
var m = this.regexp.exec(path); | |
if (!m) return null; | |
searchParams = searchParams || {}; | |
var i, j, paramName, paramNames = this.parameters(), | |
nTotal = paramNames.length, | |
nPath = this.segments.length - 1, | |
values = {}; | |
if (nPath !== m.length - 1) throw new Error("Unbalanced capture group in route '" + this.source + "'"); | |
for (i = 0; nPath > i; i++) { paramName = paramNames[i]; | |
var param = this.params[paramName], | |
paramVal = m[i + 1]; | |
for (j = 0; j < param.replace; j++) param.replace[j].from === paramVal && (paramVal = param.replace[j].to); | |
paramVal && param.array === !0 && (paramVal = decodePathArray(paramVal)), values[paramName] = param.value(paramVal) } | |
for (; nTotal > i; i++) paramName = paramNames[i], values[paramName] = this.params[paramName].value(searchParams[paramName]); | |
return values }, UrlMatcher.prototype.parameters = function(param) { | |
return isDefined(param) ? this.params[param] || null : this.$$paramNames }, UrlMatcher.prototype.validates = function(params) { | |
return this.params.$$validates(params) }, UrlMatcher.prototype.format = function(values) { | |
function encodeDashes(str) { | |
return encodeURIComponent(str).replace(/-/g, function(c) { | |
return "%5C%" + c.charCodeAt(0).toString(16).toUpperCase() }) } | |
values = values || {}; | |
var segments = this.segments, | |
params = this.parameters(), | |
paramset = this.params; | |
if (!this.validates(values)) return null; | |
var i, search = !1, | |
nPath = segments.length - 1, | |
nTotal = params.length, | |
result = segments[0]; | |
for (i = 0; nTotal > i; i++) { | |
var isPathParam = nPath > i, | |
name = params[i], | |
param = paramset[name], | |
value = param.value(values[name]), | |
isDefaultValue = param.isOptional && param.type.equals(param.value(), value), | |
squash = isDefaultValue ? param.squash : !1, | |
encoded = param.type.encode(value); | |
if (isPathParam) { | |
var nextSegment = segments[i + 1]; | |
if (squash === !1) null != encoded && (result += isArray(encoded) ? map(encoded, encodeDashes).join("-") : encodeURIComponent(encoded)), result += nextSegment; | |
else if (squash === !0) { | |
var capture = result.match(/\/$/) ? /\/?(.*)/ : /(.*)/; | |
result += nextSegment.match(capture)[1] } else isString(squash) && (result += squash + nextSegment) } else { | |
if (null == encoded || isDefaultValue && squash !== !1) continue; | |
isArray(encoded) || (encoded = [encoded]), encoded = map(encoded, encodeURIComponent).join("&" + name + "="), result += (search ? "&" : "?") + (name + "=" + encoded), search = !0 } } | |
return result }, Type.prototype.is = function() { | |
return !0 }, Type.prototype.encode = function(val) { | |
return val }, Type.prototype.decode = function(val) { | |
return val }, Type.prototype.equals = function(a, b) { | |
return a == b }, Type.prototype.$subPattern = function() { | |
var sub = this.pattern.toString(); | |
return sub.substr(1, sub.length - 2) }, Type.prototype.pattern = /.*/, Type.prototype.toString = function() { | |
return "{Type:" + this.name + "}" }, Type.prototype.$asArray = function(mode, isSearch) { | |
function ArrayType(type, mode) { | |
function bindTo(type, callbackName) { | |
return function() { | |
return type[callbackName].apply(type, arguments) } } | |
function arrayWrap(val) { | |
return isArray(val) ? val : isDefined(val) ? [val] : [] } | |
function arrayUnwrap(val) { | |
switch (val.length) { | |
case 0: | |
return undefined; | |
case 1: | |
return "auto" === mode ? val[0] : val; | |
default: | |
return val } } | |
function falsey(val) { | |
return !val } | |
function arrayHandler(callback, allTruthyMode) { | |
return function(val) { val = arrayWrap(val); | |
var result = map(val, callback); | |
return allTruthyMode === !0 ? 0 === filter(result, falsey).length : arrayUnwrap(result) } } | |
function arrayEqualsHandler(callback) { | |
return function(val1, val2) { | |
var left = arrayWrap(val1), | |
right = arrayWrap(val2); | |
if (left.length !== right.length) return !1; | |
for (var i = 0; i < left.length; i++) | |
if (!callback(left[i], right[i])) return !1; | |
return !0 } } | |
this.encode = arrayHandler(bindTo(type, "encode")), this.decode = arrayHandler(bindTo(type, "decode")), this.is = arrayHandler(bindTo(type, "is"), !0), this.equals = arrayEqualsHandler(bindTo(type, "equals")), this.pattern = type.pattern, this.$arrayMode = mode } | |
if (!mode) return this; | |
if ("auto" === mode && !isSearch) throw new Error("'auto' array mode is for query parameters only"); | |
return new ArrayType(this, mode) }, angular.module("ui.router.util").provider("$urlMatcherFactory", $UrlMatcherFactory), angular.module("ui.router.util").run(["$urlMatcherFactory", function() {}]), $UrlRouterProvider.$inject = ["$locationProvider", "$urlMatcherFactoryProvider"], angular.module("ui.router.router").provider("$urlRouter", $UrlRouterProvider), $StateProvider.$inject = ["$urlRouterProvider", "$urlMatcherFactoryProvider"], angular.module("ui.router.state").value("$stateParams", {}).provider("$state", $StateProvider), $ViewProvider.$inject = [], angular.module("ui.router.state").provider("$view", $ViewProvider), angular.module("ui.router.state").provider("$uiViewScroll", $ViewScrollProvider), $ViewDirective.$inject = ["$state", "$injector", "$uiViewScroll", "$interpolate"], $ViewDirectiveFill.$inject = ["$compile", "$controller", "$state", "$interpolate"], angular.module("ui.router.state").directive("uiView", $ViewDirective), angular.module("ui.router.state").directive("uiView", $ViewDirectiveFill), $StateRefDirective.$inject = ["$state", "$timeout"], $StateRefActiveDirective.$inject = ["$state", "$stateParams", "$interpolate"], angular.module("ui.router.state").directive("uiSref", $StateRefDirective).directive("uiSrefActive", $StateRefActiveDirective).directive("uiSrefActiveEq", $StateRefActiveDirective), $IsStateFilter.$inject = ["$state"], $IncludedByStateFilter.$inject = ["$state"], angular.module("ui.router.state").filter("isState", $IsStateFilter).filter("includedByState", $IncludedByStateFilter) | |
}(window, window.angular); | |
var app = angular.module("application", ["ui.router", "ngAnimate", "markdown", "foundation.init", "foundation.init.state", "foundation.common.services", "foundation.common.directives", "foundation.common.animations", "foundation.accordion", "foundation.actionsheet", "foundation.interchange", "foundation.modal | |
"," | |
foundation.notification "," | |
foundation.offcanvas "," | |
foundation.panel "," | |
foundation.popup "," | |
foundation.tabs "," | |
foundation.iconic "]).config([" | |
$FoundationStateProvider "," | |
$urlRouterProvider "," | |
$locationProvider ",function(FoundationStateProvider,$urlProvider,$locationProvider){$urlProvider.otherwise(" / "),FoundationStateProvider.registerDynamicRoutes(),$locationProvider.html5Mode({enabled:!1,requireBase:!1}),$locationProvider.hashPrefix("!")}]).run([" | |
FoundationInit "," | |
$rootScope "," | |
$state "," | |
$stateParams ",function(foundationInit,$rootScope,$state,$stateParams){foundationInit.init(),$rootScope.$state=$state,$rootScope.$stateParams=$stateParams}]); | |
angular.module("application").controller("DefaultController", ["$scope", "$stateParams", "$state", function($scope, $stateParams, $state) { | |
var params = []; | |
angular.forEach($stateParams, function(value, key) { params[key] = value }), $scope.params = params, $scope.current = $state.current.name, $state.current.views ? ($scope.vars = $state.current.data.vars, $scope.composed = $state.current.data.vars.children) : $scope.vars = $state.current.data.vars }]), angular.module("application").controller("NavController", ["$scope", "$state", function($scope, $state) { $scope.current = $state.current.name; | |
var routes = angular.copy(foundationRoutes); | |
$scope.routing = [], $scope.typedText = "", foundationRoutes && angular.forEach(routes, function(r) { | |
var title = r.title || r.name.replace(".", " "); | |
$scope.routing.push(title) }), $scope.selectRoute = function(routeName) { | |
var name = routeName.replace(" ", "."); | |
angular.forEach(routes, function(r) { | |
return r.title && r.title === routeName ? void $state.go(r.name) : name === r.name ? void $state.go(r.name) : void 0 }) } }]), angular.module("application").controller("MotionUIController", ["$scope", "$state", "FoundationApi", "$animate", "$window", function($scope, $state, FoundationApi, $animate, $window) { $scope.current = $state.current.name, $scope.element = {}, $scope.speeds = ["linear", "ease", "easeIn", "easeOut", "easeInOut", "bounceIn", "bounceOut", "bounceInOut"], $scope.transitions = [{ direction: "enter", type: "Slide", classes: ["slideInDown", "slideInUp", "slideInLeft", "slideInRight"] }, { direction: "leave", type: "Slide", classes: ["slideOutBottom", "slideOutUp", "slideOutLeft", "slideOutRight"] }, { direction: "enter", type: "Fade", classes: ["fadeIn"] }, { direction: "leave", type: "Fade", classes: ["fadeOut"] }, { direction: "enter", type: "Hinge", classes: ["hingeInFromTop", "hingeInFromBottom", "hingeInFromRight", "hingeInFromLeft", "hingeInFromMiddleX", "hingeInFromMiddleY"] }, { direction: "leave", type: "Hinge", classes: ["hingeOutFromTop", "hingeOutFromBottom", "hingeOutFromRight", "hingeOutFromLeft", "hingeOutFromMiddleX", "hingeOutFromMiddleY"] }, { direction: "enter", type: "Scale", classes: ["zoomIn"] }, { direction: "leave", type: "Scale", classes: ["zoomOut"] }, { direction: "enter", type: "Spin", classes: ["spinIn", "spinInCCW"] }, { direction: "leave", type: "Spin", classes: ["spinOut", "spinOutCCW"] }], $scope.update = function() { | |
var kitty = angular.element('<img id="kitty" src="http://placekitten.com/g/600/300" />'), | |
presentKitty = $window.document.getElementById("kitty"), | |
demoElementParent = $window.document.getElementById("demo-card-parent"), | |
animationClasses = ""; | |
for (prop in $scope.element) "default" !== $scope.element[prop] && "undefined" !== $scope.element[prop] && (animationClasses += $scope.element[prop] + " "); | |
kitty.addClass(animationClasses), "enter" === $scope.animationFilter ? (presentKitty && presentKitty.remove(), $animate.enter(kitty, demoElementParent).then(function() { kitty.removeClass(animationClasses) })) : ($animate.enter(kitty, demoElementParent), $animate.leave(kitty), presentKitty && presentKitty.remove()) } }]); | |
angular.module("foundation.common.animations", ["ngAnimate"]), angular.module("foundation.common.animations").animation(".ui-animation", ["$state", "$rootScope", function($state, $rootScope) { | |
var events = ["webkitAnimationEnd", "mozAnimationEnd", "MSAnimationEnd", "oanimationend", "animationend", "webkitTransitionEnd", "otransitionend", "transitionend"], | |
parentStyle = "position-absolute"; | |
return { enter: function(element, done) { | |
var scope = element.scope(); | |
if (scope.vars && scope.vars.animationIn) { | |
var animationIn = scope.vars.animationIn, | |
animationOut = scope.vars.animationOut || "", | |
initial = "ng-enter", | |
activate = "ng-enter-active"; | |
element.parent().addClass(parentStyle), element.removeClass(activate + " " + initial + " " + animationIn + " " + animationOut), element[0].style.transitionDuration = 0, element.addClass(animationIn), element.addClass(initial), $rootScope.$digest(), element[0].style.transitionDuration = "", element.addClass(activate), element.one(events.join(" "), function() { element.parent().removeClass(parentStyle), element.removeClass(activate + " " + initial + " " + animationIn + " " + animationOut), done() }) } else done(); | |
return function() {} }, leave: function(element, done) { | |
var scope = element.scope(); | |
if (scope.vars && scope.vars.animationOut) { | |
var animationIn = scope.vars.animationIn || "", | |
animationOut = scope.vars.animationOut, | |
initial = "ng-leave", | |
activate = "ng-leave-active"; | |
element.removeClass(activate + " " + initial + " " + animationIn + " " + animationOut), element[0].style.transitionDuration = 0, element.addClass(animationOut), element.addClass(initial), $rootScope.$digest(), element[0].style.transitionDuration = "", element.addClass(activate), element.one(events.join(" "), function() { element.removeClass(activate + " " + initial + " " + animationIn + " " + animationOut), element.parent().removeClass(parentStyle), done() }) } else done(); | |
return function() {} } } }]); | |
angular.module("foundation.common.directives", []), angular.module("foundation.common.directives").directive("zfClose", ["FoundationApi", function(foundationApi) { | |
return { restrict: "A", link: function(scope, element) { | |
for (var parentElement = !1, tempElement = element.parent(); parentElement === !1;) "BODY" == tempElement[0].nodeName && (parentElement = ""), "undefined" != typeof tempElement.attr("zf-closable") && tempElement.attr("zf-closable") !== !1 && (parentElement = tempElement), tempElement = tempElement.parent(); | |
element.on("click", function(e) { foundationApi.publish(parentElement.attr("id"), "close"), e.preventDefault() }) } } }]), angular.module("foundation.common.directives").directive("zfOpen", ["FoundationApi", function(foundationApi) { | |
return { restrict: "A", link: function(scope, element, attrs) { element.on("click", function(e) { foundationApi.publish(attrs.zfOpen, "open"), e.preventDefault() }) } } }]), angular.module("foundation.common.directives").directive("zfToggle", ["FoundationApi", function(foundationApi) { | |
return { restrict: "A", link: function(scope, element, attrs) { element.on("click", function(e) { foundationApi.publish(attrs.zfToggle, "toggle"), e.preventDefault() }) } } }]), angular.module("foundation.common.directives").directive("zfHardToggle", ["FoundationApi", function(foundationApi) { | |
return { restrict: "A", link: function(scope, element, attrs) { element.on("click", function(e) { | |
var activeElements = document.querySelectorAll(".is-active[zf-closable]"); | |
activeElements.length && angular.forEach(activeElements, function(el) { foundationApi.publish(el.id, "close") }), foundationApi.publish(attrs.zfHardToggle, "toggle"), e.preventDefault() }) } } }]), angular.module("foundation.common.directives").directive("zfAnimate", ["FoundationApi", function(foundationApi) { | |
return { restrict: "A", priority: 100, link: function(scope, element, attrs) { | |
var isActive = !1, | |
animationIn = attrs.animationIn, | |
animationOut = attrs.animationOut, | |
activeClass = "is-active", | |
reflow = function() { | |
return element[0].offsetWidth }, | |
reset = function() { element[0].style.transitionDuration = 0, element.removeClass(activeClass + " " + animationIn + " " + animationOut) }, | |
animate = function(animationClass, activation) { reset(), element.addClass(animationClass), reflow(), element[0].style.transitionDuration = "", element.addClass(activeClass), isActive = activation }; | |
foundationApi.subscribe(attrs.id, function(msg) { | |
if ("show" === msg || "open" === msg) animate(animationIn, !0); | |
else if ("hide" === msg || "close" === msg) animate(animationOut, !1); | |
else if ("toggle" === msg) { | |
var newState = !isActive, | |
newAnimation = newState ? animationIn : animationOut; | |
setTimeout(function() { animate(newAnimation, newState) }, 1) } }) } } }]); | |
angular.module("foundation.common.services", []), angular.module("foundation.common.services").service("FoundationApi", function() { | |
var listeners = [], | |
settings = {}, | |
uniqueIds = []; | |
return { subscribe: function(name, callback) { | |
return listeners[name] || (listeners[name] = []), listeners[name].push(callback), !0 }, publish: function(name, msg) { listeners[name] || (listeners[name] = []), listeners[name].forEach(function(cb) { cb(msg) }) }, getSettings: function() { | |
return settings }, modifySettings: function(tree) { | |
return settings = angular.extend(settings, tree) }, generateUuid: function() { | |
var uuid = ""; | |
do { uuid += "zf-uuid-"; | |
for (var i = 0; 15 > i; i++) uuid += Math.floor(16 * Math.random()).toString(16) } while (!uniqueIds.indexOf(uuid)); | |
return uniqueIds.push(uuid), uuid }, toggleAnimation: function(element, futureState) { | |
var activeClass = "is-active"; | |
futureState ? element.addClass(activeClass) : element.removeClass(activeClass) }, animate: function(element, futureState, animationIn, animationOut) { | |
var initClasses = ["ng-enter", "ng-leave"], | |
activeClasses = ["ng-enter-active", "ng-leave-active"], | |
activeGenericClass = "is-active", | |
events = ["webkitAnimationEnd", "mozAnimationEnd", "MSAnimationEnd", "oanimationend", "animationend", "webkitTransitionEnd", "otransitionend", "transitionend"], | |
reflow = function() { | |
return element[0].offsetWidth }, | |
reset = function() { element[0].style.transitionDuration = 0, element.removeClass(initClasses.join(" ") + " " + activeClasses.join(" ") + " " + animationIn + " " + animationOut) }, | |
animate = function(animationClass, activation) { | |
var initClass = activation ? initClasses[0] : initClasses[1], | |
activeClass = activation ? activeClasses[0] : activeClasses[1]; | |
reset(), element.addClass(animationClass), element.addClass(initClass), element.addClass(activeGenericClass), reflow(), element[0].style.transitionDuration = "", element.addClass(activeClass), element.one(events.join(" "), function() { reset(), element.removeClass(activation ? "" : activeGenericClass), reflow() }) }; | |
animate(futureState ? animationIn : animationOut, futureState) } } }), angular.module("foundation.common.services").filter("prepareRoute", function() { | |
return function(input) { | |
return "route-" + input.replace(/\./, "-").toLowerCase() } }), angular.module("foundation.common.services").factory("Utils", function() { | |
return { prepareRoute: function(input) { | |
return "route-" + input.replace(/\./, "-").toLowerCase() }, throttle: function(func, delay) { | |
var timer = null; | |
return function() { | |
var context = this, | |
args = arguments; | |
null === timer && (timer = setTimeout(function() { func.apply(context, args), timer = null }, delay)) } } } }); | |
angular.module("foundation.init", ["foundation.common.services"]), angular.module("foundation.init").factory("FoundationInit", ["helpers", "FoundationApi", "Utils", function(helpers, foundationApi, u) { | |
return { init: function() { | |
var mediaQueries, extractedMedia; | |
helpers.headerHelper(["foundation-mq"]), extractedMedia = helpers.getStyle(".foundation-mq", "font-family"), mediaQueries = helpers.processStyleToJSON(extractedMedia); | |
for (var key in mediaQueries) mediaQueries[key] = "only screen and (min-width: " + mediaQueries[key].replace("rem", "em") + ")"; | |
foundationApi.modifySettings({ media_queries: mediaQueries }), window.addEventListener("resize", u.throttle(function() { foundationApi.publish("resize", "window resized") }, 50)) } } }]), angular.module("foundation.init").factory("helpers", function() { | |
return { headerHelper: function(classArray) { | |
for (var i = classArray.length, head = angular.element(document.querySelectorAll("head")); i--;) head.append('<meta class="' + classArray[i] + '" />') }, getStyle: function(selector) { | |
var elem = document.querySelectorAll(selector)[0], | |
style = window.getComputedStyle(elem, null); | |
return style.getPropertyValue("font-family") }, processStyleToJSON: function(str) { | |
var clean = str.replace(/\'/g, ""); | |
try { | |
return JSON.parse(clean) } catch (e) { | |
return JSON.parse(clean.slice(1, -1)) } } } }), angular.module("foundation.init.state", ["ui.router"]).provider("$FoundationState", ["$stateProvider", function($stateProvider) { | |
var complexViews = {}; | |
this.registerDynamicRoutes = function(routes) { | |
var dynamicRoutes = routes || foundationRoutes; | |
angular.forEach(dynamicRoutes, function(page) { | |
if (page.hasComposed === !0) angular.isDefined(complexViews[page.parent]) || (complexViews[page.parent] = { children: {} }), complexViews[page.parent].children[page.name] = page; | |
else if (page.composed === !0) angular.isDefined(complexViews[page.name]) || (complexViews[page.name] = { children: {} }), angular.extend(complexViews[page.name], page); | |
else { | |
var state = { url: page.url, templateUrl: page.path, parent: page.parent || "", controller: page.controller || "DefaultController", data: { vars: page } }; | |
$stateProvider.state(page.name, state) } }), angular.forEach(complexViews, function(page) { | |
var state = { url: page.url, parent: page.parent || "", data: { vars: page }, views: { "": { templateUrl: page.path, controller: page.controller || "DefaultController" } } }; | |
angular.forEach(page.children, function(sub) { state.views[sub.name + "@" + page.name] = { templateUrl: sub.path, controller: page.controller || "DefaultController" } }), $stateProvider.state(page.name, state) }) }, this.$get = function() { | |
return {} } }]); | |
angular.module("foundation.accordion", []), angular.module("foundation.accordion").controller("ZfAccordionController", ["$scope", function($scope) { | |
var controller = this, | |
sections = controller.sections = $scope.sections = [], | |
autoOpen = (controller.multiOpen = !1, controller.autoOpen = $scope.autoOpen = $scope.autoOpen || "true"); | |
controller.select = function(selectSection) { sections.forEach(function(section) { controller.multiOpen ? section.scope === selectSection && (section.scope.active = !section.scope.active) : (section.scope.active = !1, section.scope === selectSection && (section.scope.active = !0)) }) }, controller.addSection = function(sectionScope) { sections.push({ scope: sectionScope }), 1 === sections.length && "true" === autoOpen && (sections[0].active = !0, sections[0].scope.active = !0) }, controller.closeAll = function() { sections.forEach(function(section) { section.scope.active = !1 }) } }]), angular.module("foundation.accordion").directive("zfAccordion", function() { | |
return { restrict: "EA", transclude: "true", replace: !0, templateUrl: "partials/accordion.html", controller: "ZfAccordionController", scope: { multiOpen: "@?", autoOpen: "@?" }, link: function(scope, element, attrs, controller) { controller.multiOpen = "true" === scope.multiOpen ? !0 : !1 } } }), angular.module("foundation.accordion").directive("zfAccordionItem", function() { | |
return { restrict: "EA", templateUrl: "partials/accordion-item.html", transclude: !0, scope: { title: "@" }, require: "^zfAccordion", replace: !0, controller: function() {}, link: function(scope, element, attrs, controller) { scope.active = !1, controller.addSection(scope), scope.activate = function() { controller.select(scope) } } } }); | |
angular.module("foundation.actionsheet", ["foundation.common.services"]), angular.module("foundation.actionsheet").controller("ZfActionSheetController", ["$scope", "FoundationApi", function($scope) { | |
var controller = this, | |
content = controller.content = $scope.content; | |
controller.registerContent = function(scope) { content = scope, content.active = !1 }, controller.toggle = function() { content.toggle(), content.$apply() }, controller.hide = function() { content.hide(), content.$apply() } }]), angular.module("foundation.actionsheet").directive("zfActionSheet", ["FoundationApi", function(foundationApi) { | |
return { restrict: "A", transclude: !0, replace: !0, templateUrl: "partials/actionsheet.html", controller: "ZfActionSheetController", compile: function() { | |
return { pre: function(scope, iElement, iAttrs) { iAttrs.$set("zf-closable", "actionsheet") }, post: function(scope, element, attrs, controller) { foundationApi.subscribe(attrs.id, function(msg) { "toggle" == msg && controller.toggle(), ("hide" === msg || "close" === msg) && controller.hide() }) } } } } }]), angular.module("foundation.actionsheet").directive("zfAsContent", ["FoundationApi", function() { | |
return { restrict: "EA", transclude: !0, replace: !0, templateUrl: "partials/actionsheet-content.html", require: "^zfActionSheet", scope: { position: "@?" }, link: function(scope, element, attrs, controller) { scope.active = !1, scope.position = scope.position || "bottom", controller.registerContent(scope), scope.toggle = function() { scope.active = !scope.active }, scope.hide = function() { scope.active = !1 } } } }]), angular.module("foundation.actionsheet").directive("zfAsButton", ["FoundationApi", function() { | |
return { restrict: "EA", transclude: !0, replace: !0, templateUrl: "partials/actionsheet-button.html", require: "^zfActionSheet", scope: { title: "@?" }, link: function(scope, element, attrs, controller) { element.on("click", function(e) { controller.toggle(), e.preventDefault() }) } } }]); | |
angular.module("foundation.iconic", []), angular.module("foundation.iconic").service("Iconic", function() { | |
var iconic = IconicJS(); | |
return { getAccess: function() { | |
return iconic } } }), angular.module("foundation.iconic").directive("zfIconic", ["Iconic", function(iconic) { | |
return { restrict: "A", link: function(scope, element) { | |
var ico = iconic.getAccess(); | |
ico.inject(element[0]) } } }]); | |
angular.module("foundation.interchange", ["foundation.common.services"]), angular.module("foundation.interchange").directive("zfInterchange", ["FoundationApi", "$compile", "$http", "$templateCache", "$animate", function(foundationApi, $compile, $http, $templateCache) { | |
var templateLoader = function(templateUrl) { | |
return $http.get(templateUrl, { cache: $templateCache }) }; | |
return { restrict: "EA", transclude: "element", scope: { position: "@" }, replace: !0, template: "<div></div>", link: function(scope, element, attrs, ctrl, transclude) { | |
var childScope, current, scenarios, innerTemplates, named_queries = { "default": "only screen", landscape: "only screen and (orientation: landscape)", portrait: "only screen and (orientation: portrait)", retina: "only screen and (-webkit-min-device-pixel-ratio: 2),only screen and (min--moz-device-pixel-ratio: 2),only screen and (-o-min-device-pixel-ratio: 2/1),only screen and (min-device-pixel-ratio: 2),only screen and (min-resolution: 192dpi),only screen and (min-resolution: 2dppx)" }, | |
globalQueries = foundationApi.getSettings().media_queries; | |
named_queries = angular.extend(named_queries, globalQueries); | |
var matched = function() { | |
var count = scenarios.length, | |
matches = []; | |
if (count > 0) | |
for (; count--;) { | |
var mq, rule = scenarios[count].media; | |
mq = matchMedia(named_queries[rule] ? named_queries[rule] : rule), mq.matches && matches.push({ ind: count }) } | |
return matches }, | |
collectInformation = function(parentElement) { scenarios = [], innerTemplates = []; | |
var elements = parentElement.children(), | |
i = 0; | |
angular.forEach(elements, function(el) { | |
var elem = angular.element(el); | |
elem.attr("src") && elem.attr("src").match(/.html$/) ? scenarios[i] = { media: elem.attr("media"), src: elem.attr("src") } : (innerTemplates[i] = elem, scenarios[i] = { media: elem.attr("media"), templ: i }), i++ }) }, | |
checkScenario = function(scenario) { | |
return !current || current !== scenario }; | |
foundationApi.subscribe("resize", function() { transclude(function(clone, newScope) { scenarios && innerTemplates || collectInformation(clone); | |
var ruleMatches = matched(), | |
scenario = 0 === ruleMatches.length ? null : scenarios[ruleMatches[0].ind]; | |
if (scenario && checkScenario(scenario)) { | |
if (childScope && (childScope.$destroy(), childScope = null), "undefined" != typeof scenario.templ) { childScope = newScope; | |
var tmp = document.createElement("div"); | |
tmp.appendChild(innerTemplates[scenario.templ][0]), element.html(tmp.innerHTML), $compile(element.contents())(childScope), current = scenario } else { | |
var loader = templateLoader(scenario.src); | |
loader.success(function(html) { childScope = newScope, element.html(html) }).then(function() { $compile(element.contents())(childScope), current = scenario }) } } }) }), foundationApi.publish("resize", "initial resize") } } }]); | |
angular.module("foundation.modal", ["foundation.common.services"]), angular.module("foundation.modal").directive("zfModal", ["FoundationApi", function(foundationApi) { | |
return { restrict: "EA", templateUrl: "partials/modal.html", transclude: !0, scope: { overlay: "@", overlayClose: "@" }, replace: !0, compile: function() { | |
var type = "modal"; | |
return { pre: function(scope, iElement, iAttrs) { iAttrs.$set("zf-closable", type) }, post: function(scope, element, attrs) { | |
var dialog = angular.element(element.children()[0]); | |
scope.active = !1, scope.overlay = scope.overlay || scope.overlayClose || !1, scope.overlayClose = scope.overlayClose || !1; | |
var animationIn = attrs.animationIn || "fadeIn", | |
animationOut = attrs.animationOut || "fadeOut", | |
overlayIn = "fadeIn", | |
overlayOut = "fadeOut"; | |
foundationApi.subscribe(attrs.id, function(msg) { "show" == msg || "open" == msg ? scope.show() : "close" == msg || "hide" == msg ? scope.hide() : "toggle" == msg && scope.toggle(), scope.$apply() }); | |
var animate = function() { scope.overlay ? (foundationApi.animate(element, scope.active, overlayIn, overlayOut), foundationApi.animate(dialog, scope.active, animationIn, animationOut)) : foundationApi.animate(element, scope.active, overlayIn, overlayOut) }; | |
scope.hide = function() { scope.active = !1, animate() }, scope.show = function() { scope.active = !0, animate() }, scope.toggle = function() { scope.active = !scope.active, animate() } } } } } }]); | |
angular.module("foundation.notification", ["foundation.common.services"]), angular.module("foundation.notification").controller("ZfNotificationController", ["$scope", "FoundationApi", function($scope, foundationApi) { | |
var controller = this, | |
notifications = controller.notifications = $scope.notifications = []; | |
controller.addNotification = function(info) { | |
var id = foundationApi.generateUuid(); | |
info.id = id, notifications.push(info) }, controller.removeNotification = function(id) { notifications.forEach(function(notification) { | |
if (notification.id === id) { | |
var ind = notifications.indexOf(notification); | |
notifications.splice(ind, 1) } }) }, controller.clearAll = function() { notifications = [] } }]), angular.module("foundation.notification").directive("zfNotificationSet", ["FoundationApi", function(foundationApi) { | |
return { restrict: "EA", templateUrl: "partials/notification-set.html", controller: "ZfNotificationController", scope: !0, link: function(scope, element, attrs, controller) { foundationApi.subscribe(attrs.id, function(msg) { "clearall" === msg ? controller.clearAll() : controller.addNotification(msg), scope.$apply() }) } } }]), angular.module("foundation.notification").directive("zfNotification", ["FoundationApi", function(foundationApi) { | |
return { restrict: "EA", templateUrl: "partials/notification.html", replace: !0, transclude: !0, require: "^zfNotificationSet", controller: function() {}, scope: { title: "=?", content: "=?", image: "=?", notifId: "=", position: "=?", color: "=?" }, compile: function() { | |
return { pre: function(scope, iElement, iAttrs) { iAttrs.$set("zf-closable", "notification") }, post: function(scope, element, attrs, controller) { scope.active = !1, scope.position = scope.position ? scope.position.split(" ").join("-") : "top-right"; | |
var animationIn = attrs.animationIn || "fadeIn", | |
animationOut = attrs.animationOut || "fadeOut"; | |
setTimeout(function() { scope.active = !0, foundationApi.animate(element, scope.active, animationIn, animationOut) }, 50), scope.remove = function() { scope.active = !1, foundationApi.animate(element, scope.active, animationIn, animationOut), setTimeout(function() { controller.removeNotification(scope.notifId) }, 50) } } } } } }]), angular.module("foundation.notification").directive("zfNotificationStatic", ["FoundationApi", function(foundationApi) { | |
return { restrict: "EA", templateUrl: "partials/notification.html", replace: !0, transclude: !0, scope: { title: "@?", content: "@?", image: "@?", position: "@?", color: "@?" }, compile: function() { | |
var type = "notification"; | |
return { pre: function(scope, iElement, iAttrs) { iAttrs.$set("zf-closable", type) }, post: function(scope, element, attrs) { scope.position = scope.position ? scope.position.split(" ").join("-") : "top-right"; | |
var animationIn = attrs.animationIn || "fadeIn", | |
animationOut = attrs.animationOut || "fadeOut"; | |
foundationApi.subscribe(attrs.id, function(msg) { "show" == msg || "open" == msg ? scope.show() : "close" == msg || "hide" == msg ? scope.hide() : "toggle" == msg && scope.toggle(), scope.$apply() }), scope.hide = function() { scope.active = !1, foundationApi.animate(element, scope.active, animationIn, animationOut) }, scope.remove = function() { scope.hide(), foundationApi.animate(element, scope.active, animationIn, animationOut) }, scope.show = function() { scope.active = !0, foundationApi.animate(element, scope.active, animationIn, animationOut) }, scope.toggle = function() { scope.active = !scope.active, foundationApi.animate(element, scope.active, animationIn, animationOut) } } } } } }]), angular.module("foundation.notification").directive("zfNotify", ["FoundationApi", function(foundationApi) { | |
return { restrict: "A", scope: { title: "@?", content: "@?", position: "@?", color: "@?", image: "@?" }, link: function(scope, element, attrs) { element.on("click", function(e) { e.preventDefault(), foundationApi.publish(attrs.zfNotify, { title: scope.title, content: scope.content, position: scope.position, color: scope.color, image: scope.image }) }) } } }]); | |
angular.module("foundation.offcanvas", ["foundation.common.services"]), angular.module("foundation.offcanvas").directive("zfOffcanvas", ["FoundationApi", function(foundationApi) { | |
return { restrict: "EA", templateUrl: "partials/offcanvas.html", transclude: !0, scope: { position: "@" }, replace: !0, compile: function() { | |
var type = "offcanvas"; | |
return { pre: function(scope, iElement, iAttrs) { iAttrs.$set("zf-closable", type), document.body.classList.add("has-off-canvas") }, post: function(scope, element, attrs) { scope.position = scope.position || "left", scope.active = !1, foundationApi.subscribe(attrs.id, function(msg) { "show" == msg || "open" == msg ? scope.show() : "close" == msg || "hide" == msg ? scope.hide() : "toggle" == msg && scope.toggle(), scope.$apply() }), scope.hide = function() { scope.active = !1 }, scope.show = function() { scope.active = !0 }, scope.toggle = function() { scope.active = !scope.active } } } }, link: function(scope, elem) { elem.on("click", function() { console.log("hello") }) } } }]); | |
angular.module("foundation.panel", ["foundation.common.services"]), angular.module("foundation.panel").directive("zfPanel", ["FoundationApi", function(foundationApi) { | |
return { restrict: "EA", templateUrl: "partials/panel.html", transclude: !0, scope: { position: "@?" }, replace: !0, compile: function() { | |
var type = "panel"; | |
return { pre: function(scope, iElement, iAttrs) { iAttrs.$set("zf-closable", type) }, post: function(scope, element, attrs) { | |
var animationIn, animationOut; | |
scope.position = scope.position || "left", scope.active = !1, "left" === scope.position ? (animationIn = attrs.animationIn || "slideInRight", animationOut = attrs.animationOut || "slideOutLeft") : "right" === scope.position ? (animationIn = attrs.animationIn || "slideInLeft", animationOut = attrs.animationOut || "slideOutRight") : "top" === scope.position ? (animationIn = attrs.animationIn || "slideInDown", animationOut = attrs.animationOut || "slideOutUp") : "bottom" === scope.position && (animationIn = attrs.animationIn || "slideInUp", animationOut = attrs.animationOut || "slideOutBottom"), foundationApi.subscribe(attrs.id, function(msg) { "show" == msg || "open" == msg ? scope.show() : "close" == msg || "hide" == msg ? scope.hide() : "toggle" == msg && scope.toggle(), foundationApi.animate(element, scope.active, animationIn, animationOut), scope.$apply() }), scope.hide = function() { scope.active = !1 }, scope.show = function() { scope.active = !0 }, scope.toggle = function() { scope.active = !scope.active } } } } } }]); | |
angular.module("foundation.popup", ["foundation.common.services"]), angular.module("foundation.popup").directive("zfPopup", ["FoundationApi", function(foundationApi) { | |
return { restrict: "EA", transclude: !0, replace: !0, templateUrl: "partials/popup.html", scope: { pinTo: "@?", pinAt: "@?" }, link: function(scope, element, attrs) { scope.active = !1, scope.target = scope.target || !1, attrs.$set("zf-closeable", "popup"); | |
var attachment = scope.pinTo || "top center", | |
tetherInit = !1, | |
tether = {}, | |
tetherElement = function(target) { tetherInit || (scope.target = document.getElementById(scope.target ? scope.target : target), tether = new Tether({ element: element[0], target: scope.target, attachment: attachment, enable: !1 }), tetherInit = !0) }; | |
foundationApi.subscribe(attrs.id, function(msg) { "show" === msg[0] || "open" === msg[0] ? scope.show(msg[1]) : "close" === msg[0] || "hide" === msg[0] ? scope.hide() : "toggle" === msg[0] && scope.toggle(msg[1]), scope.$apply() }), scope.hide = function() { scope.active = !1, tetherElement(newTarget), tether.disable() }, scope.show = function(newTarget) { scope.active = !0, tetherElement(newTarget), tether.enable() }, scope.toggle = function(newTarget) { scope.active = !scope.active, tetherElement(newTarget), scope.active ? tether.enable() : tether.disable() } } } }]), angular.module("foundation.popup").directive("zfPopupToggle", ["FoundationApi", function(foundationApi) { | |
return { restrict: "A", link: function(scope, element, attrs) { | |
var target = attrs.zfPopupToggle, | |
id = attrs.id || foundationApi.generateUuid(); | |
attrs.$set("id", id), element.on("click", function(e) { foundationApi.publish(target, ["toggle", id]), e.preventDefault() }) } } }]); | |
angular.module("foundation.tabs", ["foundation.common.services"]), angular.module("foundation.tabs").controller("ZfTabsController", ["$scope", "FoundationApi", function($scope, foundationApi) { | |
var controller = this, | |
tabs = controller.tabs = $scope.tabs = [], | |
id = ""; | |
controller.select = function(selectTab) { tabs.forEach(function(tab) { tab.active = !1, tab.scope.active = !1, tab.scope == selectTab && (foundationApi.publish(id, ["activate", tab]), tab.active = !0, tab.scope.active = !0) }) }, controller.addTab = function(tabScope) { tabs.push({ scope: tabScope, active: !1, parentContent: controller.id }), 1 === tabs.length && (tabs[0].active = !0, tabScope.active = !0) }, controller.getId = function() { | |
return id }, controller.setId = function(newId) { id = newId } }]), angular.module("foundation.tabs").directive("zfTabs", ["FoundationApi", function(foundationApi) { | |
return { restrict: "EA", transclude: "true", replace: !0, templateUrl: "partials/tabs.html", controller: "ZfTabsController", scope: { displaced: "@?" }, link: function(scope, element, attrs, controller) { scope.id = attrs.id || foundationApi.generateUuid(), scope.showTabContent = "true" !== scope.displaced, attrs.$set("id", scope.id), controller.setId(scope.id); | |
var updateTabs = function() { foundationApi.publish(scope.id + "-tabs", scope.tabs) }; | |
foundationApi.subscribe(scope.id + "-get-tabs", function() { updateTabs() }) } } }]), angular.module("foundation.tabs").directive("zfTabContent", ["FoundationApi", function(foundationApi) { | |
return { restrict: "A", transclude: "true", replace: !0, scope: { tabs: "=?", target: "@" }, templateUrl: "partials/tab-content.html", link: function(scope) { scope.tabs = scope.tabs || []; | |
var id = scope.target; | |
foundationApi.subscribe(id, function(msg) { | |
if ("activate" == msg[0]) { | |
{ msg[1] } | |
scope.tabs.forEach(function(tab) { tab.scope.active = !1, tab.active = !1, tab.scope.id === id && (tab.scope.active = !0, tab.active = !0) }) } }), 0 === scope.tabs.length && (foundationApi.subscribe(id + "-tabs", function(tabs) { scope.tabs = tabs }), foundationApi.publish(id + "-get-tabs", "")) } } }]), angular.module("foundation.tabs").directive("zfTab", ["FoundationApi", function(foundationApi) { | |
return { restrict: "EA", templateUrl: "partials/tab.html", transclude: !0, scope: { title: "@" }, require: "^zfTabs", replace: !0, link: function(scope, element, attrs, controller, transclude) { scope.id = attrs.id || foundationApi.generateUuid(), scope.active = !1, scope.transcludeFn = transclude, controller.addTab(scope), foundationApi.subscribe(scope.id, function(msg) { | |
("show" === msg || "open" === msg || "activate" === msg) && scope.makeActive() }), scope.makeActive = function() { controller.select(scope) } } } }]), angular.module("foundation.tabs").directive("zfTabIndividual", ["FoundationApi", function(foundationApi) { | |
return { restrict: "EA", transclude: "true", link: function(scope, element, attrs) { | |
{ | |
var tab = scope.$eval(attrs.tab); | |
tab.scope.id } | |
tab.scope.transcludeFn(tab.scope, function(tabContent) { element.append(tabContent) }), foundationApi.subscribe(tab.scope.id, function() { foundationApi.publish(tab.parentContent, ["activate", tab.scope.id]), scope.$apply() }) } } }]), angular.module("foundation.tabs").directive("zfTabHref", ["FoundationApi", function(foundationApi) { | |
return { restrict: "A", replace: !1, link: function(scope, element, attrs) { | |
var target = attrs.zfTabHref, | |
makeActive = function() { element.parent().children().removeClass("is-active"), element.addClass("is-active") }; | |
foundationApi.subscribe(target, function(msg) { | |
("activate" === msg || "show" === msg || "open" === msg) && makeActive() }), element.on("click", function(e) { foundationApi.publish(target, "activate"), makeActive(), e.preventDefault() }) } } }]), angular.module("foundation.tabs").directive("zfTabCustom", ["FoundationApi", function() { | |
return { restrict: "A", replace: !1, link: function(scope, element) { | |
var children = element.children(); | |
angular.element(children[0]).addClass("is-active") } } }]), angular.module("foundation.tabs").directive("zfTabContentCustom", ["FoundationApi", function(foundationApi) { | |
return { restrict: "A", link: function(scope, element) { | |
var tabs = [], | |
children = element.children(), | |
activateTabs = function(tabId) { | |
var tabNodes = element.children(); | |
angular.forEach(tabNodes, function(node) { | |
var el = angular.element(node); | |
el.removeClass("is-active"), el.attr("id") === tabId && el.addClass("is-active") }) }; | |
angular.forEach(children, function(node) { | |
if (node.id) { | |
var tabId = node.id; | |
if (tabs.push(tabId), foundationApi.subscribe(tabId, function(msg) { | |
("activate" === msg || "show" === msg || "open" === msg) && activateTabs(tabId) }), 1 === tabs.length) { | |
var el = angular.element(node); | |
el.addClass("is-active") } } }) } } }]); | |
angular.module("markdown", []).directive("markdown", function() { | |
return { restrict: "A", link: function(scope, element) { element.html(marked(element.html())) } } }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment