mirror of
https://github.com/swc-project/swc.git
synced 2024-12-22 13:11:31 +03:00
4529 lines
266 KiB
JavaScript
4529 lines
266 KiB
JavaScript
!function(window1, document1, undefined) {
|
|
'use strict';
|
|
function minErr(module) {
|
|
return function() {
|
|
var obj, message, i, code = arguments[0], template = arguments[1], templateArgs = arguments;
|
|
for(i = 2, message = (message = '[' + (module ? module + ':' : '') + code + '] ' + template.replace(/\{\d+\}/g, function(match) {
|
|
var arg, index = +match.slice(1, -1);
|
|
return index + 2 < templateArgs.length ? 'function' == typeof (arg = templateArgs[index + 2]) ? arg.toString().replace(/ ?\{[\s\S]*$/, '') : void 0 === arg ? 'undefined' : 'string' != typeof arg ? toJson(arg) : arg : match;
|
|
})) + '\nhttp://errors.angularjs.org/1.2.5/' + (module ? module + '/' : '') + code; i < arguments.length; i++)message = message + (2 == i ? '?' : '&') + 'p' + (i - 2) + '=' + encodeURIComponent((obj = arguments[i], 'function' == typeof obj ? obj.toString().replace(/ \{[\s\S]*$/, '') : void 0 === obj ? 'undefined' : 'string' != typeof obj ? JSON.stringify(obj) : obj));
|
|
return new Error(message);
|
|
};
|
|
}
|
|
var promiseWarning, msie, jqLite, jQuery, angularModule, nodeName_, lowercase = function(string) {
|
|
return isString(string) ? string.toLowerCase() : string;
|
|
}, uppercase = function(string) {
|
|
return isString(string) ? string.toUpperCase() : string;
|
|
}, slice = [].slice, push = [].push, toString = Object.prototype.toString, ngMinErr1 = minErr('ng'), angular1 = (window1.angular, window1.angular || (window1.angular = {})), uid = [
|
|
'0',
|
|
'0',
|
|
'0'
|
|
];
|
|
function isArrayLike(obj) {
|
|
if (null == obj || isWindow(obj)) return !1;
|
|
var length = obj.length;
|
|
return 1 === obj.nodeType && !!length || isString(obj) || isArray(obj) || 0 === length || 'number' == typeof length && length > 0 && length - 1 in obj;
|
|
}
|
|
function forEach(obj, iterator, context) {
|
|
var key;
|
|
if (obj) {
|
|
if (isFunction(obj)) for(key in obj)'prototype' != key && 'length' != key && 'name' != key && obj.hasOwnProperty(key) && iterator.call(context, obj[key], key);
|
|
else if (obj.forEach && obj.forEach !== forEach) obj.forEach(iterator, context);
|
|
else if (isArrayLike(obj)) for(key = 0; key < obj.length; key++)iterator.call(context, obj[key], key);
|
|
else for(key in obj)obj.hasOwnProperty(key) && iterator.call(context, obj[key], key);
|
|
}
|
|
return obj;
|
|
}
|
|
function sortedKeys(obj) {
|
|
var keys = [];
|
|
for(var key in obj)obj.hasOwnProperty(key) && keys.push(key);
|
|
return keys.sort();
|
|
}
|
|
function reverseParams(iteratorFn) {
|
|
return function(value, key) {
|
|
iteratorFn(key, value);
|
|
};
|
|
}
|
|
function nextUid() {
|
|
for(var digit, index = uid.length; index;){
|
|
if (57 == (digit = uid[--index].charCodeAt(0))) return uid[index] = 'A', uid.join('');
|
|
if (90 != digit) return uid[index] = String.fromCharCode(digit + 1), uid.join('');
|
|
uid[index] = '0';
|
|
}
|
|
return uid.unshift('0'), uid.join('');
|
|
}
|
|
function setHashKey(obj, h) {
|
|
h ? obj.$$hashKey = h : delete obj.$$hashKey;
|
|
}
|
|
function extend(dst) {
|
|
var h = dst.$$hashKey;
|
|
return forEach(arguments, function(obj) {
|
|
obj !== dst && forEach(obj, function(value, key) {
|
|
dst[key] = value;
|
|
});
|
|
}), setHashKey(dst, h), dst;
|
|
}
|
|
function int(str) {
|
|
return parseInt(str, 10);
|
|
}
|
|
function inherit(parent, extra) {
|
|
return extend(new (extend(function() {}, {
|
|
prototype: parent
|
|
}))(), extra);
|
|
}
|
|
function noop() {}
|
|
function identity($) {
|
|
return $;
|
|
}
|
|
function valueFn1(value) {
|
|
return function() {
|
|
return value;
|
|
};
|
|
}
|
|
function isUndefined(value) {
|
|
return void 0 === value;
|
|
}
|
|
function isDefined(value) {
|
|
return void 0 !== 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 isArray(value) {
|
|
return '[object Array]' === 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.document && obj.location && obj.alert && obj.setInterval;
|
|
}
|
|
function isScope(obj) {
|
|
return obj && obj.$evalAsync && obj.$watch;
|
|
}
|
|
isNaN(msie = int((/msie (\d+)/.exec(lowercase(navigator.userAgent)) || [])[1])) && (msie = int((/trident\/.*; rv:(\d+)/.exec(lowercase(navigator.userAgent)) || [])[1])), noop.$inject = [], identity.$inject = [];
|
|
var trim1 = String.prototype.trim ? function(value) {
|
|
return isString(value) ? value.trim() : value;
|
|
} : function(value) {
|
|
return isString(value) ? value.replace(/^\s\s*/, '').replace(/\s\s*$/, '') : value;
|
|
};
|
|
function isElement(node) {
|
|
return !!(node && (node.nodeName || node.on && node.find));
|
|
}
|
|
function indexOf(array, obj) {
|
|
if (array.indexOf) return array.indexOf(obj);
|
|
for(var i = 0; i < array.length; i++)if (obj === array[i]) return i;
|
|
return -1;
|
|
}
|
|
function arrayRemove(array, value) {
|
|
var index = indexOf(array, value);
|
|
return index >= 0 && array.splice(index, 1), value;
|
|
}
|
|
function copy(source, destination) {
|
|
if (isWindow(source) || isScope(source)) throw ngMinErr1('cpws', "Can't copy! Making copies of Window or Scope instances is not supported.");
|
|
if (destination) {
|
|
if (source === destination) throw ngMinErr1('cpi', "Can't copy! Source and destination are identical.");
|
|
if (isArray(source)) {
|
|
destination.length = 0;
|
|
for(var i = 0; i < source.length; i++)destination.push(copy(source[i]));
|
|
} else {
|
|
var h = destination.$$hashKey;
|
|
for(var key1 in forEach(destination, function(value, key) {
|
|
delete destination[key];
|
|
}), source)destination[key1] = copy(source[key1]);
|
|
setHashKey(destination, h);
|
|
}
|
|
} else destination = source, source && (isArray(source) ? destination = copy(source, []) : isDate(source) ? destination = new Date(source.getTime()) : isRegExp(source) ? destination = new RegExp(source.source) : isObject(source) && (destination = copy(source, {})));
|
|
return destination;
|
|
}
|
|
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;
|
|
if (t1 == typeof o2 && 'object' == t1) {
|
|
if (isArray(o1)) {
|
|
if (!isArray(o2)) return !1;
|
|
if ((length = o1.length) == o2.length) {
|
|
for(key = 0; key < length; key++)if (!equals(o1[key], o2[key])) return !1;
|
|
return !0;
|
|
}
|
|
} else {
|
|
if (isDate(o1)) return isDate(o2) && o1.getTime() == o2.getTime();
|
|
if (isRegExp(o1) && isRegExp(o2)) return o1.toString() == o2.toString();
|
|
if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return !1;
|
|
for(key in keySet = {}, 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) && undefined !== o2[key] && !isFunction(o2[key])) return !1;
|
|
return !0;
|
|
}
|
|
}
|
|
return !1;
|
|
}
|
|
function csp() {
|
|
return document1.securityPolicy && document1.securityPolicy.isActive || document1.querySelector && !!(document1.querySelector('[ng-csp]') || document1.querySelector('[data-ng-csp]'));
|
|
}
|
|
function concat1(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, curryArgs.concat(slice.call(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) ? val = undefined : isWindow(value) ? val = '$WINDOW' : value && document1 === value ? val = '$DOCUMENT' : isScope(value) && (val = '$SCOPE'), val;
|
|
}
|
|
function toJson(obj, pretty) {
|
|
if (void 0 !== obj) return JSON.stringify(obj, toJsonReplacer, pretty ? ' ' : null);
|
|
}
|
|
function fromJson(json) {
|
|
return isString(json) ? JSON.parse(json) : json;
|
|
}
|
|
function toBoolean(value) {
|
|
if (value && 0 !== value.length) {
|
|
var v = lowercase("" + value);
|
|
value = !('f' == v || '0' == v || 'false' == v || 'no' == v || 'n' == v || '[]' == v);
|
|
} else value = !1;
|
|
return value;
|
|
}
|
|
function startingTag(element) {
|
|
element = jqLite(element).clone();
|
|
try {
|
|
element.empty();
|
|
} catch (e) {}
|
|
var elemHtml = jqLite('<div>').append(element).html();
|
|
try {
|
|
return 3 === element[0].nodeType ? lowercase(elemHtml) : elemHtml.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/, function(match, nodeName) {
|
|
return '<' + lowercase(nodeName);
|
|
});
|
|
} catch (e1) {
|
|
return lowercase(elemHtml);
|
|
}
|
|
}
|
|
function tryDecodeURIComponent(value) {
|
|
try {
|
|
return decodeURIComponent(value);
|
|
} catch (e) {}
|
|
}
|
|
function parseKeyValue(keyValue1) {
|
|
var key_value, key, obj = {};
|
|
return forEach((keyValue1 || "").split('&'), function(keyValue) {
|
|
if (keyValue && isDefined(key = tryDecodeURIComponent((key_value = keyValue.split('='))[0]))) {
|
|
var val = !isDefined(key_value[1]) || tryDecodeURIComponent(key_value[1]);
|
|
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) + (!0 === arrayValue ? '' : '=' + encodeUriQuery(arrayValue, !0)));
|
|
}) : parts.push(encodeUriQuery(key, !0) + (!0 === value ? '' : '=' + 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(/%20/g, pctEncodeSpaces ? '%20' : '+');
|
|
}
|
|
function bootstrap1(element1, modules) {
|
|
var doBootstrap = function() {
|
|
if ((element1 = jqLite(element1)).injector()) throw ngMinErr1('btstrpd', "App Already Bootstrapped with this Element '{0}'", element1[0] === document1 ? 'document' : startingTag(element1));
|
|
(modules = modules || []).unshift([
|
|
'$provide',
|
|
function($provide) {
|
|
$provide.value('$rootElement', element1);
|
|
}
|
|
]), modules.unshift('ng');
|
|
var injector1 = createInjector(modules);
|
|
return injector1.invoke([
|
|
'$rootScope',
|
|
'$rootElement',
|
|
'$compile',
|
|
'$injector',
|
|
'$animate',
|
|
function(scope, element, compile, injector, animate) {
|
|
scope.$apply(function() {
|
|
element.data('$injector', injector), compile(element)(scope);
|
|
});
|
|
}
|
|
]), injector1;
|
|
}, NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;
|
|
if (window1 && !NG_DEFER_BOOTSTRAP.test(window1.name)) return doBootstrap();
|
|
window1.name = window1.name.replace(NG_DEFER_BOOTSTRAP, ''), angular1.resumeBootstrap = function(extraModules) {
|
|
forEach(extraModules, function(module) {
|
|
modules.push(module);
|
|
}), doBootstrap();
|
|
};
|
|
}
|
|
nodeName_ = msie < 9 ? function(element) {
|
|
return (element = element.nodeName ? element : element[0]).scopeName && 'HTML' != element.scopeName ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName;
|
|
} : function(element) {
|
|
return element.nodeName ? element.nodeName : element[0].nodeName;
|
|
};
|
|
var SNAKE_CASE_REGEXP = /[A-Z]/g;
|
|
function snake_case(name, separator) {
|
|
return separator = separator || '_', name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {
|
|
return (pos ? separator : '') + letter.toLowerCase();
|
|
});
|
|
}
|
|
function assertArg(arg, name, reason) {
|
|
if (!arg) throw ngMinErr1('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 ngMinErr1('badname', "hasOwnProperty is not a valid {0} name", context);
|
|
}
|
|
function getter1(obj, path, bindFnToScope) {
|
|
if (!path) return obj;
|
|
for(var key, keys = path.split('.'), lastInstance = obj, len = keys.length, i = 0; i < len; i++)key = keys[i], obj && (obj = (lastInstance = obj)[key]);
|
|
return !bindFnToScope && isFunction(obj) ? bind(lastInstance, obj) : obj;
|
|
}
|
|
function getBlockElements(nodes) {
|
|
var startNode = nodes[0], endNode = nodes[nodes.length - 1];
|
|
if (startNode === endNode) return jqLite(startNode);
|
|
var element = startNode, elements = [
|
|
element
|
|
];
|
|
do {
|
|
if (!(element = element.nextSibling)) break;
|
|
elements.push(element);
|
|
}while (element !== endNode)
|
|
return jqLite(elements);
|
|
}
|
|
var version = {
|
|
full: '1.2.5',
|
|
major: 1,
|
|
minor: 2,
|
|
dot: 5,
|
|
codeName: 'singularity-expansion'
|
|
}, jqCache = JQLite.cache = {}, jqName = JQLite.expando = 'ng-' + new Date().getTime(), jqId = 1, addEventListenerFn = window1.document.addEventListener ? function(element, type, fn) {
|
|
element.addEventListener(type, fn, !1);
|
|
} : function(element, type, fn) {
|
|
element.attachEvent('on' + type, fn);
|
|
}, removeEventListenerFn = window1.document.removeEventListener ? function(element, type, fn) {
|
|
element.removeEventListener(type, fn, !1);
|
|
} : function(element, type, fn) {
|
|
element.detachEvent('on' + type, fn);
|
|
}, SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g, MOZ_HACK_REGEXP = /^moz([A-Z])/, jqLiteMinErr = minErr('jqLite');
|
|
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 jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments) {
|
|
var originalJqFn = jQuery.fn[name];
|
|
function removePatch(param) {
|
|
var set, setIndex, setLength, element, childIndex, childLength, children, list = filterElems && param ? [
|
|
this.filter(param)
|
|
] : [
|
|
this
|
|
], fireEvent = dispatchThis;
|
|
if (!getterIfNoArguments || null != param) for(; list.length;)for(setIndex = 0, setLength = (set = list.shift()).length; setIndex < setLength; setIndex++)for(element = jqLite(set[setIndex]), fireEvent ? element.triggerHandler('$destroy') : fireEvent = !fireEvent, childIndex = 0, childLength = (children = element.children()).length; childIndex < childLength; childIndex++)list.push(jQuery(children[childIndex]));
|
|
return originalJqFn.apply(this, arguments);
|
|
}
|
|
originalJqFn = originalJqFn.$original || originalJqFn, removePatch.$original = originalJqFn, jQuery.fn[name] = removePatch;
|
|
}
|
|
function JQLite(element) {
|
|
if (element instanceof JQLite) return element;
|
|
if (!(this instanceof JQLite)) {
|
|
if (isString(element) && '<' != 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);
|
|
}
|
|
if (isString(element)) {
|
|
var div = document1.createElement('div');
|
|
div.innerHTML = '<div> </div>' + element, div.removeChild(div.firstChild), jqLiteAddNodes(this, div.childNodes), jqLite(document1.createDocumentFragment()).append(this);
|
|
} else jqLiteAddNodes(this, element);
|
|
}
|
|
function jqLiteClone(element) {
|
|
return element.cloneNode(!0);
|
|
}
|
|
function jqLiteDealoc(element) {
|
|
jqLiteRemoveData(element);
|
|
for(var i = 0, children = element.childNodes || []; i < children.length; i++)jqLiteDealoc(children[i]);
|
|
}
|
|
function jqLiteOff(element, type1, fn, unsupported) {
|
|
if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument');
|
|
var events = jqLiteExpandoStore(element, 'events');
|
|
jqLiteExpandoStore(element, 'handle') && (isUndefined(type1) ? forEach(events, function(eventHandler, type) {
|
|
removeEventListenerFn(element, type, eventHandler), delete events[type];
|
|
}) : forEach(type1.split(' '), function(type) {
|
|
isUndefined(fn) ? (removeEventListenerFn(element, type, events[type]), delete events[type]) : arrayRemove(events[type] || [], fn);
|
|
}));
|
|
}
|
|
function jqLiteRemoveData(element, name) {
|
|
var expandoId = element[jqName], expandoStore = jqCache[expandoId];
|
|
if (expandoStore) {
|
|
if (name) {
|
|
delete jqCache[expandoId].data[name];
|
|
return;
|
|
}
|
|
expandoStore.handle && (expandoStore.events.$destroy && expandoStore.handle({}, '$destroy'), jqLiteOff(element)), delete jqCache[expandoId], element[jqName] = undefined;
|
|
}
|
|
}
|
|
function jqLiteExpandoStore(element, key, value) {
|
|
var expandoId = element[jqName], expandoStore = jqCache[expandoId || -1];
|
|
if (!isDefined(value)) return expandoStore && expandoStore[key];
|
|
expandoStore || (element[jqName] = expandoId = ++jqId, expandoStore = jqCache[expandoId] = {}), expandoStore[key] = value;
|
|
}
|
|
function jqLiteData(element, key, value) {
|
|
var data = jqLiteExpandoStore(element, 'data'), isSetter = isDefined(value), keyDefined = !isSetter && isDefined(key), isSimpleGetter = keyDefined && !isObject(key);
|
|
if (data || isSimpleGetter || jqLiteExpandoStore(element, 'data', data = {}), isSetter) data[key] = value;
|
|
else {
|
|
if (!keyDefined) 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;
|
|
}
|
|
function jqLiteRemoveClass(element, cssClasses) {
|
|
cssClasses && element.setAttribute && forEach(cssClasses.split(' '), function(cssClass) {
|
|
element.setAttribute('class', trim1((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " ").replace(" " + trim1(cssClass) + " ", " ")));
|
|
});
|
|
}
|
|
function jqLiteAddClass(element, cssClasses) {
|
|
if (cssClasses && element.setAttribute) {
|
|
var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ').replace(/[\n\t]/g, " ");
|
|
forEach(cssClasses.split(' '), function(cssClass) {
|
|
cssClass = trim1(cssClass), -1 === existingClasses.indexOf(' ' + cssClass + ' ') && (existingClasses += cssClass + ' ');
|
|
}), element.setAttribute('class', trim1(existingClasses));
|
|
}
|
|
}
|
|
function jqLiteAddNodes(root, elements) {
|
|
if (elements) {
|
|
elements = !elements.nodeName && isDefined(elements.length) && !isWindow(elements) ? elements : [
|
|
elements
|
|
];
|
|
for(var i = 0; i < elements.length; i++)root.push(elements[i]);
|
|
}
|
|
}
|
|
function jqLiteController(element, name) {
|
|
return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller');
|
|
}
|
|
function jqLiteInheritedData(element, name, value) {
|
|
9 == (element = jqLite(element))[0].nodeType && (element = element.find('html'));
|
|
for(var names = isArray(name) ? name : [
|
|
name
|
|
]; element.length;){
|
|
for(var i = 0, ii = names.length; i < ii; i++)if (undefined !== (value = element.data(names[i]))) return value;
|
|
element = element.parent();
|
|
}
|
|
}
|
|
function jqLiteEmpty(element) {
|
|
for(var i = 0, childNodes = element.childNodes; i < childNodes.length; i++)jqLiteDealoc(childNodes[i]);
|
|
for(; element.firstChild;)element.removeChild(element.firstChild);
|
|
}
|
|
var JQLitePrototype = JQLite.prototype = {
|
|
ready: function(fn) {
|
|
var fired = !1;
|
|
function trigger() {
|
|
fired || (fired = !0, fn());
|
|
}
|
|
'complete' === document1.readyState ? setTimeout(trigger) : (this.on('DOMContentLoaded', trigger), JQLite(window1).on('load', trigger));
|
|
},
|
|
toString: function() {
|
|
var value = [];
|
|
return forEach(this, function(e) {
|
|
value.push('' + e);
|
|
}), '[' + value.join(', ') + ']';
|
|
},
|
|
eq: function(index) {
|
|
return index >= 0 ? jqLite(this[index]) : jqLite(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 = {};
|
|
function getBooleanAttrName(element, name) {
|
|
var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];
|
|
return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr;
|
|
}
|
|
function hashKey(obj) {
|
|
var key, objType = typeof obj;
|
|
return 'object' == objType && null !== obj ? 'function' == typeof (key = obj.$$hashKey) ? key = obj.$$hashKey() : key === undefined && (key = obj.$$hashKey = nextUid()) : key = obj, objType + ':' + key;
|
|
}
|
|
function HashMap(array) {
|
|
forEach(array, this.put, this);
|
|
}
|
|
forEach('input,select,option,textarea,button,form,details'.split(','), function(value) {
|
|
BOOLEAN_ELEMENTS[uppercase(value)] = !0;
|
|
}), forEach({
|
|
data: jqLiteData,
|
|
inheritedData: jqLiteInheritedData,
|
|
scope: function(element) {
|
|
return jqLite(element).data('$scope') || jqLiteInheritedData(element.parentNode || element, [
|
|
'$isolateScope',
|
|
'$scope'
|
|
]);
|
|
},
|
|
isolateScope: function(element) {
|
|
return jqLite(element).data('$isolateScope') || jqLite(element).data('$isolateScopeNoTemplate');
|
|
},
|
|
controller: jqLiteController,
|
|
injector: function(element) {
|
|
return jqLiteInheritedData(element, '$injector');
|
|
},
|
|
removeAttr: function(element, name) {
|
|
element.removeAttribute(name);
|
|
},
|
|
hasClass: jqLiteHasClass,
|
|
css: function(element, name, value) {
|
|
if (name = camelCase(name), isDefined(value)) element.style[name] = value;
|
|
else {
|
|
var val;
|
|
return msie <= 8 && '' === (val = element.currentStyle && element.currentStyle[name]) && (val = 'auto'), val = val || element.style[name], msie <= 8 && (val = '' === val ? undefined : val), val;
|
|
}
|
|
},
|
|
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) {
|
|
if (!isDefined(value)) return element[name];
|
|
element[name] = value;
|
|
},
|
|
text: function() {
|
|
var NODE_TYPE_TEXT_PROPERTY = [];
|
|
return msie < 9 ? (NODE_TYPE_TEXT_PROPERTY[1] = 'innerText', NODE_TYPE_TEXT_PROPERTY[3] = 'nodeValue') : NODE_TYPE_TEXT_PROPERTY[1] = NODE_TYPE_TEXT_PROPERTY[3] = 'textContent', getText.$dv = '', getText;
|
|
function getText(element, value) {
|
|
var textProp = NODE_TYPE_TEXT_PROPERTY[element.nodeType];
|
|
if (isUndefined(value)) return textProp ? element[textProp] : '';
|
|
element[textProp] = value;
|
|
}
|
|
}(),
|
|
val: function(element, value) {
|
|
if (isUndefined(value)) {
|
|
if ('SELECT' === nodeName_(element) && element.multiple) {
|
|
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) {
|
|
if (isUndefined(value)) return element.innerHTML;
|
|
for(var i = 0, childNodes = element.childNodes; i < childNodes.length; i++)jqLiteDealoc(childNodes[i]);
|
|
element.innerHTML = value;
|
|
},
|
|
empty: jqLiteEmpty
|
|
}, function(fn, name) {
|
|
JQLite.prototype[name] = function(arg1, arg2) {
|
|
var i, key;
|
|
if (fn !== jqLiteEmpty && (2 == fn.length && fn !== jqLiteHasClass && fn !== jqLiteController ? arg1 : arg2) === undefined) {
|
|
if (isObject(arg1)) {
|
|
for(i = 0; i < this.length; 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(this.length, 1) : this.length, j = 0; j < jj; j++){
|
|
var nodeValue = fn(this[j], arg1, arg2);
|
|
value = value ? value + nodeValue : nodeValue;
|
|
}
|
|
return value;
|
|
}
|
|
for(i = 0; i < this.length; i++)fn(this[i], arg1, arg2);
|
|
return this;
|
|
};
|
|
}), forEach({
|
|
removeData: jqLiteRemoveData,
|
|
dealoc: jqLiteDealoc,
|
|
on: function onFn(element, type2, fn1, unsupported) {
|
|
if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');
|
|
var element2, events, eventHandler, events1 = jqLiteExpandoStore(element, 'events'), handle = jqLiteExpandoStore(element, 'handle');
|
|
events1 || jqLiteExpandoStore(element, 'events', events1 = {}), handle || jqLiteExpandoStore(element, 'handle', handle = (element2 = element, events = events1, (eventHandler = function(event, type) {
|
|
if (event.preventDefault || (event.preventDefault = function() {
|
|
event.returnValue = !1;
|
|
}), event.stopPropagation || (event.stopPropagation = function() {
|
|
event.cancelBubble = !0;
|
|
}), event.target || (event.target = event.srcElement || document1), isUndefined(event.defaultPrevented)) {
|
|
var prevent = event.preventDefault;
|
|
event.preventDefault = function() {
|
|
event.defaultPrevented = !0, prevent.call(event);
|
|
}, event.defaultPrevented = !1;
|
|
}
|
|
event.isDefaultPrevented = function() {
|
|
return event.defaultPrevented || !1 === event.returnValue;
|
|
}, forEach(events[type || event.type], function(fn) {
|
|
fn.call(element2, event);
|
|
}), msie <= 8 ? (event.preventDefault = null, event.stopPropagation = null, event.isDefaultPrevented = null) : (delete event.preventDefault, delete event.stopPropagation, delete event.isDefaultPrevented);
|
|
}).elem = element2, eventHandler)), forEach(type2.split(' '), function(type) {
|
|
var eventFns = events1[type];
|
|
if (!eventFns) {
|
|
if ('mouseenter' == type || 'mouseleave' == type) {
|
|
var contains = document1.body.contains || document1.body.compareDocumentPosition ? function(a, b) {
|
|
var adown = 9 === a.nodeType ? a.documentElement : a, bup = b && b.parentNode;
|
|
return a === bup || !!(bup && 1 === bup.nodeType && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && 16 & a.compareDocumentPosition(bup)));
|
|
} : function(a, b) {
|
|
if (b) {
|
|
for(; b = b.parentNode;)if (b === a) return !0;
|
|
}
|
|
return !1;
|
|
};
|
|
events1[type] = [], onFn(element, {
|
|
mouseleave: "mouseout",
|
|
mouseenter: "mouseover"
|
|
}[type], function(event) {
|
|
var target = this, related = event.relatedTarget;
|
|
related && (related === target || contains(target, related)) || handle(event, type);
|
|
});
|
|
} else addEventListenerFn(element, type, handle), events1[type] = [];
|
|
eventFns = events1[type];
|
|
}
|
|
eventFns.push(fn1);
|
|
});
|
|
},
|
|
off: jqLiteOff,
|
|
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(element3) {
|
|
var children = [];
|
|
return forEach(element3.childNodes, function(element) {
|
|
1 === element.nodeType && children.push(element);
|
|
}), children;
|
|
},
|
|
contents: function(element) {
|
|
return element.childNodes || [];
|
|
},
|
|
append: function(element, node) {
|
|
forEach(new JQLite(node), function(child) {
|
|
(1 === element.nodeType || 11 === element.nodeType) && element.appendChild(child);
|
|
});
|
|
},
|
|
prepend: function(element, node) {
|
|
if (1 === element.nodeType) {
|
|
var index = element.firstChild;
|
|
forEach(new JQLite(node), function(child) {
|
|
element.insertBefore(child, index);
|
|
});
|
|
}
|
|
},
|
|
wrap: function(element, wrapNode) {
|
|
wrapNode = jqLite(wrapNode)[0];
|
|
var parent = element.parentNode;
|
|
parent && parent.replaceChild(wrapNode, element), wrapNode.appendChild(element);
|
|
},
|
|
remove: function(element) {
|
|
jqLiteDealoc(element);
|
|
var parent = element.parentNode;
|
|
parent && parent.removeChild(element);
|
|
},
|
|
after: function(element, newElement) {
|
|
var index = element, parent = element.parentNode;
|
|
forEach(new JQLite(newElement), function(node) {
|
|
parent.insertBefore(node, index.nextSibling), index = node;
|
|
});
|
|
},
|
|
addClass: jqLiteAddClass,
|
|
removeClass: jqLiteRemoveClass,
|
|
toggleClass: function(element, selector, condition) {
|
|
isUndefined(condition) && (condition = !jqLiteHasClass(element, selector)), (condition ? jqLiteAddClass : jqLiteRemoveClass)(element, selector);
|
|
},
|
|
parent: function(element) {
|
|
var parent = element.parentNode;
|
|
return parent && 11 !== parent.nodeType ? parent : null;
|
|
},
|
|
next: function(element) {
|
|
if (element.nextElementSibling) return element.nextElementSibling;
|
|
for(var elm = element.nextSibling; null != elm && 1 !== elm.nodeType;)elm = elm.nextSibling;
|
|
return elm;
|
|
},
|
|
find: function(element, selector) {
|
|
return element.getElementsByTagName ? element.getElementsByTagName(selector) : [];
|
|
},
|
|
clone: jqLiteClone,
|
|
triggerHandler: function(element, eventName, eventData) {
|
|
var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];
|
|
eventData = eventData || [];
|
|
var event = [
|
|
{
|
|
preventDefault: noop,
|
|
stopPropagation: noop
|
|
}
|
|
];
|
|
forEach(eventFns, function(fn) {
|
|
fn.apply(element, event.concat(eventData));
|
|
});
|
|
}
|
|
}, function(fn, name) {
|
|
JQLite.prototype[name] = function(arg1, arg2, arg3) {
|
|
for(var value, i = 0; i < this.length; i++)isUndefined(value) ? isDefined(value = fn(this[i], arg1, arg2, arg3)) && (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)] = value;
|
|
},
|
|
get: function(key) {
|
|
return this[hashKey(key)];
|
|
},
|
|
remove: function(key) {
|
|
var value = this[key = hashKey(key)];
|
|
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]*?\*\/))/mg, $injectorMinErr1 = minErr('$injector');
|
|
function annotate(fn) {
|
|
var $inject, last;
|
|
return 'function' == typeof fn ? ($inject = fn.$inject) || ($inject = [], fn.length && forEach(fn.toString().replace(STRIP_COMMENTS, '').match(FN_ARGS)[1].split(FN_ARG_SPLIT), function(arg) {
|
|
arg.replace(FN_ARG, function(all, underscore, name) {
|
|
$inject.push(name);
|
|
});
|
|
}), fn.$inject = $inject) : isArray(fn) ? (last = fn.length - 1, assertArgFn(fn[last], 'fn'), $inject = fn.slice(0, last)) : assertArgFn(fn, 'fn', !0), $inject;
|
|
}
|
|
function createInjector(modulesToLoad1) {
|
|
var INSTANTIATING = {}, providerSuffix = 'Provider', path = [], loadedModules = new HashMap(), providerCache = {
|
|
$provide: {
|
|
provider: supportObject(provider1),
|
|
factory: supportObject(factory1),
|
|
service: supportObject(function(name, constructor) {
|
|
return factory1(name, [
|
|
'$injector',
|
|
function($injector) {
|
|
return $injector.instantiate(constructor);
|
|
}
|
|
]);
|
|
}),
|
|
value: supportObject(function(name, val) {
|
|
return factory1(name, valueFn1(val));
|
|
}),
|
|
constant: supportObject(function(name, value) {
|
|
assertNotHasOwnProperty(name, 'constant'), providerCache[name] = value, instanceCache[name] = value;
|
|
}),
|
|
decorator: function(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
|
|
});
|
|
};
|
|
}
|
|
}
|
|
}, providerInjector = providerCache.$injector = createInternalInjector(providerCache, function() {
|
|
throw $injectorMinErr1('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);
|
|
});
|
|
return forEach(loadModules(modulesToLoad1), function(fn) {
|
|
instanceInjector.invoke(fn || noop);
|
|
}), instanceInjector;
|
|
function supportObject(delegate) {
|
|
return function(key, value) {
|
|
if (!isObject(key)) return delegate(key, value);
|
|
forEach(key, reverseParams(delegate));
|
|
};
|
|
}
|
|
function provider1(name, provider_) {
|
|
if (assertNotHasOwnProperty(name, 'service'), (isFunction(provider_) || isArray(provider_)) && (provider_ = providerInjector.instantiate(provider_)), !provider_.$get) throw $injectorMinErr1('pget', "Provider '{0}' must define $get factory method.", name);
|
|
return providerCache[name + providerSuffix] = provider_;
|
|
}
|
|
function factory1(name, factoryFn) {
|
|
return provider1(name, {
|
|
$get: factoryFn
|
|
});
|
|
}
|
|
function loadModules(modulesToLoad) {
|
|
var moduleFn, invokeQueue, i, ii, runBlocks = [];
|
|
return forEach(modulesToLoad, function(module) {
|
|
if (!loadedModules.get(module)) {
|
|
loadedModules.put(module, !0);
|
|
try {
|
|
if (isString(module)) for(moduleFn = angularModule(module), runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks), invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++){
|
|
var invokeArgs = invokeQueue[i], provider = providerInjector.get(invokeArgs[0]);
|
|
provider[invokeArgs[1]].apply(provider, invokeArgs[2]);
|
|
}
|
|
else 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), $injectorMinErr1('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 $injectorMinErr1('cdep', 'Circular dependency found: {0}', path.join(' <- '));
|
|
return cache[serviceName];
|
|
}
|
|
try {
|
|
return path.unshift(serviceName), cache[serviceName] = INSTANTIATING, cache[serviceName] = factory(serviceName);
|
|
} finally{
|
|
path.shift();
|
|
}
|
|
}
|
|
function invoke(fn, self, locals) {
|
|
var length, i, key, args = [], $inject = annotate(fn);
|
|
for(i = 0, length = $inject.length; i < length; i++){
|
|
if ('string' != typeof (key = $inject[i])) throw $injectorMinErr1('itkn', 'Incorrect injection token! Expected service name as string, got {0}', key);
|
|
args.push(locals && locals.hasOwnProperty(key) ? locals[key] : getService(key));
|
|
}
|
|
return fn.$inject || (fn = fn[length]), fn.apply(self, args);
|
|
}
|
|
return {
|
|
invoke: invoke,
|
|
instantiate: function(Type, locals) {
|
|
var instance, returnedValue, Constructor = function() {};
|
|
return Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype, isObject(returnedValue = invoke(Type, instance = new Constructor(), locals)) || isFunction(returnedValue) ? returnedValue : instance;
|
|
},
|
|
get: getService,
|
|
annotate: annotate,
|
|
has: function(name) {
|
|
return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);
|
|
}
|
|
};
|
|
}
|
|
}
|
|
function $AnchorScrollProvider() {
|
|
var autoScrollingEnabled = !0;
|
|
this.disableAutoScrolling = function() {
|
|
autoScrollingEnabled = !1;
|
|
}, this.$get = [
|
|
'$window',
|
|
'$location',
|
|
'$rootScope',
|
|
function($window, $location, $rootScope) {
|
|
var document = $window.document;
|
|
function scroll() {
|
|
var list, result, elm, hash = $location.hash();
|
|
hash ? (elm = document.getElementById(hash)) ? elm.scrollIntoView() : (elm = (list = document.getElementsByName(hash), result = null, forEach(list, function(element) {
|
|
result || 'a' !== lowercase(element.nodeName) || (result = element);
|
|
}), result)) ? elm.scrollIntoView() : 'top' === hash && $window.scrollTo(0, 0) : $window.scrollTo(0, 0);
|
|
}
|
|
return autoScrollingEnabled && $rootScope.$watch(function() {
|
|
return $location.hash();
|
|
}, function() {
|
|
$rootScope.$evalAsync(scroll);
|
|
}), scroll;
|
|
}
|
|
];
|
|
}
|
|
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.$get = [
|
|
'$timeout',
|
|
function($timeout) {
|
|
return {
|
|
enter: function(element, parent, after, done) {
|
|
after ? after.after(element) : (parent && parent[0] || (parent = after.parent()), parent.append(element)), done && $timeout(done, 0, !1);
|
|
},
|
|
leave: function(element, done) {
|
|
element.remove(), done && $timeout(done, 0, !1);
|
|
},
|
|
move: function(element, parent, after, done) {
|
|
this.enter(element, parent, after, done);
|
|
},
|
|
addClass: function(element4, className, done) {
|
|
className = isString(className) ? className : isArray(className) ? className.join(' ') : '', forEach(element4, function(element) {
|
|
jqLiteAddClass(element, className);
|
|
}), done && $timeout(done, 0, !1);
|
|
},
|
|
removeClass: function(element5, className, done) {
|
|
className = isString(className) ? className : isArray(className) ? className.join(' ') : '', forEach(element5, function(element) {
|
|
jqLiteRemoveClass(element, className);
|
|
}), done && $timeout(done, 0, !1);
|
|
},
|
|
enabled: noop
|
|
};
|
|
}
|
|
];
|
|
}
|
|
];
|
|
function Browser(window, document, $log, $sniffer) {
|
|
var self = this, rawDocument = document[0], location = window.location, history = window.history, setTimeout1 = window.setTimeout, clearTimeout = window.clearTimeout, pendingDeferIds = {};
|
|
self.isMock = !1;
|
|
var outstandingRequestCount = 0, outstandingRequestCallbacks = [];
|
|
function completeOutstandingRequest(fn) {
|
|
try {
|
|
fn.apply(null, sliceArgs(arguments, 1));
|
|
} finally{
|
|
if (0 == --outstandingRequestCount) for(; outstandingRequestCallbacks.length;)try {
|
|
outstandingRequestCallbacks.pop()();
|
|
} catch (e) {
|
|
$log.error(e);
|
|
}
|
|
}
|
|
}
|
|
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) {
|
|
var setTimeout;
|
|
return isUndefined(pollTimeout) && (setTimeout = setTimeout1, forEach(pollFns, function(pollFn) {
|
|
pollFn();
|
|
}), pollTimeout = setTimeout(check, 100)), pollFns.push(fn), fn;
|
|
};
|
|
var lastBrowserUrl = location.href, baseElement = document.find('base'), newLocation = null;
|
|
self.url = function(url, replace) {
|
|
return (location !== window.location && (location = window.location), url) ? lastBrowserUrl != url ? (lastBrowserUrl = url, $sniffer.history ? replace ? history.replaceState(null, '', url) : (history.pushState(null, '', url), baseElement.attr('href', baseElement.attr('href'))) : (newLocation = url, replace ? location.replace(url) : location.href = url), self) : void 0 : newLocation || location.href.replace(/%27/g, "'");
|
|
};
|
|
var urlChangeListeners = [], urlChangeInit = !1;
|
|
function fireUrlChange() {
|
|
newLocation = null, lastBrowserUrl != self.url() && (lastBrowserUrl = self.url(), forEach(urlChangeListeners, function(listener) {
|
|
listener(self.url());
|
|
}));
|
|
}
|
|
self.onUrlChange = function(callback) {
|
|
return urlChangeInit || ($sniffer.history && jqLite(window).on('popstate', fireUrlChange), $sniffer.hashchange ? jqLite(window).on('hashchange', fireUrlChange) : self.addPollFn(fireUrlChange), urlChangeInit = !0), urlChangeListeners.push(callback), callback;
|
|
}, 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) value === undefined ? rawDocument.cookie = escape(name) + "=;path=" + cookiePath + ";expires=Thu, 01 Jan 1970 00:00:00 GMT" : isString(value) && (cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) + ';path=' + cookiePath).length + 1) > 4096 && $log.warn("Cookie '" + name + "' possibly not set or overflowed because it was too large (" + cookieLength + " > 4096 bytes)!");
|
|
else {
|
|
if (rawDocument.cookie !== lastCookieString) for(i = 0, cookieArray = (lastCookieString = rawDocument.cookie).split("; "), lastCookies = {}; i < cookieArray.length; i++)(index = (cookie = cookieArray[i]).indexOf('=')) > 0 && undefined === lastCookies[name = unescape(cookie.substring(0, index))] && (lastCookies[name] = unescape(cookie.substring(index + 1)));
|
|
return lastCookies;
|
|
}
|
|
}, self.defer = function(fn, delay) {
|
|
var timeoutId;
|
|
return outstandingRequestCount++, pendingDeferIds[timeoutId = setTimeout1(function() {
|
|
delete pendingDeferIds[timeoutId], completeOutstandingRequest(fn);
|
|
}, delay || 0)] = !0, timeoutId;
|
|
}, self.defer.cancel = function(deferId) {
|
|
return !!pendingDeferIds[deferId] && (delete pendingDeferIds[deferId], clearTimeout(deferId), completeOutstandingRequest(noop), !0);
|
|
};
|
|
}
|
|
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() {
|
|
var caches = {};
|
|
function cacheFactory(cacheId, options) {
|
|
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 (refresh(lruHash[key] || (lruHash[key] = {
|
|
key: key
|
|
})), !isUndefined(value)) return !(key in data) && size++, data[key] = value, size > capacity && this.remove(staleEnd.key), value;
|
|
},
|
|
get: function(key) {
|
|
var lruEntry = lruHash[key];
|
|
if (lruEntry) return refresh(lruEntry), data[key];
|
|
},
|
|
remove: function(key) {
|
|
var lruEntry = lruHash[key];
|
|
lruEntry && (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
|
|
});
|
|
}
|
|
};
|
|
function refresh(entry) {
|
|
entry != freshEnd && (staleEnd ? staleEnd == entry && (staleEnd = entry.n) : staleEnd = entry, link(entry.n, entry.p), link(entry, freshEnd), (freshEnd = entry).n = null);
|
|
}
|
|
function link(nextEntry, prevEntry) {
|
|
nextEntry != prevEntry && (nextEntry && (nextEntry.p = prevEntry), prevEntry && (prevEntry.n = nextEntry));
|
|
}
|
|
}
|
|
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');
|
|
}
|
|
];
|
|
}
|
|
var $compileMinErr = minErr('$compile');
|
|
function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
var hasDirectives = {}, Suffix = 'Directive', COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/, CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/, EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;
|
|
this.directive = function registerDirective(name, directiveFactory1) {
|
|
return assertNotHasOwnProperty(name, 'directive'), isString(name) ? (assertArg(directiveFactory1, '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: valueFn1(directive)
|
|
} : !directive.compile && directive.link && (directive.compile = valueFn1(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 || 'A', directives.push(directive);
|
|
} catch (e) {
|
|
$exceptionHandler(e);
|
|
}
|
|
}), directives;
|
|
}
|
|
])), hasDirectives[name].push(directiveFactory1)) : 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();
|
|
}, this.$get = [
|
|
'$injector',
|
|
'$interpolate',
|
|
'$exceptionHandler',
|
|
'$http',
|
|
'$templateCache',
|
|
'$parse',
|
|
'$controller',
|
|
'$rootScope',
|
|
'$document',
|
|
'$sce',
|
|
'$animate',
|
|
'$$sanitizeUri',
|
|
function($injector, $interpolate, $exceptionHandler, $http, $templateCache, $parse, $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri) {
|
|
var Attributes = function(element, attr) {
|
|
this.$$element = element, this.$attr = attr || {};
|
|
};
|
|
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) {
|
|
this.$removeClass(tokenDifference(oldClasses, newClasses)), this.$addClass(tokenDifference(newClasses, oldClasses));
|
|
},
|
|
$set: function(key, value, writeAttr, attrName) {
|
|
var nodeName, booleanKey = getBooleanAttrName(this.$$element[0], key);
|
|
booleanKey && (this.$$element.prop(key, value), attrName = booleanKey), this[key] = value, attrName ? this.$attr[key] = attrName : (attrName = this.$attr[key]) || (this.$attr[key] = attrName = snake_case(key, '-')), ('A' === (nodeName = nodeName_(this.$$element)) && 'href' === key || 'IMG' === nodeName && 'src' === key) && (this[key] = value = $$sanitizeUri(value, 'src' === key)), !1 !== writeAttr && (null === value || value === undefined ? this.$$element.removeAttr(attrName) : this.$$element.attr(attrName, value));
|
|
var $$observers = this.$$observers;
|
|
$$observers && forEach($$observers[key], function(fn) {
|
|
try {
|
|
fn(value);
|
|
} catch (e) {
|
|
$exceptionHandler(e);
|
|
}
|
|
});
|
|
},
|
|
$observe: function(key, fn) {
|
|
var attrs = this, $$observers = attrs.$$observers || (attrs.$$observers = {}), listeners = $$observers[key] || ($$observers[key] = []);
|
|
return listeners.push(fn), $rootScope.$evalAsync(function() {
|
|
listeners.$$inter || fn(attrs[key]);
|
|
}), 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;
|
|
function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext) {
|
|
$compileNodes instanceof jqLite || ($compileNodes = jqLite($compileNodes)), forEach($compileNodes, function(node, index) {
|
|
3 == node.nodeType && node.nodeValue.match(/\S+/) && ($compileNodes[index] = node = jqLite(node).wrap('<span></span>').parent()[0]);
|
|
});
|
|
var compositeLinkFn = compileNodes($compileNodes, transcludeFn, $compileNodes, maxPriority, ignoreDirective, previousCompileContext);
|
|
return function(scope, cloneConnectFn, transcludeControllers) {
|
|
assertArg(scope, 'scope');
|
|
var $linkNode = cloneConnectFn ? JQLitePrototype.clone.call($compileNodes) : $compileNodes;
|
|
forEach(transcludeControllers, function(instance, name) {
|
|
$linkNode.data('$' + name + 'Controller', instance);
|
|
});
|
|
for(var i = 0, ii = $linkNode.length; i < ii; i++){
|
|
var node = $linkNode[i];
|
|
(1 == node.nodeType || 9 == node.nodeType) && $linkNode.eq(i).data('$scope', scope);
|
|
}
|
|
return safeAddClass($linkNode, 'ng-scope'), cloneConnectFn && cloneConnectFn($linkNode, scope), compositeLinkFn && compositeLinkFn(scope, $linkNode, $linkNode), $linkNode;
|
|
};
|
|
}
|
|
function safeAddClass($element, className) {
|
|
try {
|
|
$element.addClass(className);
|
|
} catch (e) {}
|
|
}
|
|
function compileNodes(nodeList1, transcludeFn, $rootElement1, maxPriority, ignoreDirective, previousCompileContext) {
|
|
for(var nodeLinkFn1, childLinkFn1, directives, attrs, linkFnFound, linkFns = [], i1 = 0; i1 < nodeList1.length; i1++)attrs = new Attributes(), childLinkFn1 = (nodeLinkFn1 = (directives = collectDirectives(nodeList1[i1], [], attrs, 0 === i1 ? maxPriority : undefined, ignoreDirective)).length ? applyDirectivesToNode(directives, nodeList1[i1], attrs, transcludeFn, $rootElement1, null, [], [], previousCompileContext) : null) && nodeLinkFn1.terminal || !nodeList1[i1].childNodes || !nodeList1[i1].childNodes.length ? null : compileNodes(nodeList1[i1].childNodes, nodeLinkFn1 ? nodeLinkFn1.transclude : transcludeFn), linkFns.push(nodeLinkFn1), linkFns.push(childLinkFn1), linkFnFound = linkFnFound || nodeLinkFn1 || childLinkFn1, previousCompileContext = null;
|
|
return linkFnFound ? function(scope, nodeList, $rootElement, boundTranscludeFn) {
|
|
var nodeLinkFn, childLinkFn, node, $node, childScope, childTranscludeFn, i, ii, n, stableNodeList = [];
|
|
for(i = 0, ii = nodeList.length; i < ii; i++)stableNodeList.push(nodeList[i]);
|
|
for(i = 0, n = 0, ii = linkFns.length; i < ii; n++)node = stableNodeList[n], nodeLinkFn = linkFns[i++], childLinkFn = linkFns[i++], $node = jqLite(node), nodeLinkFn ? (nodeLinkFn.scope ? (childScope = scope.$new(), $node.data('$scope', childScope), safeAddClass($node, 'ng-scope')) : childScope = scope, childTranscludeFn = nodeLinkFn.transclude, nodeLinkFn(childLinkFn, childScope, node, $rootElement, childTranscludeFn || !boundTranscludeFn && transcludeFn ? createBoundTranscludeFn(scope, childTranscludeFn || transcludeFn) : boundTranscludeFn)) : childLinkFn && childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn);
|
|
} : null;
|
|
}
|
|
function createBoundTranscludeFn(scope, transcludeFn) {
|
|
return function(transcludedScope, cloneFn, controllers) {
|
|
var scopeCreated = !1;
|
|
transcludedScope || ((transcludedScope = scope.$new()).$$transcluded = !0, scopeCreated = !0);
|
|
var clone = transcludeFn(transcludedScope, cloneFn, controllers);
|
|
return scopeCreated && clone.on('$destroy', bind(transcludedScope, transcludedScope.$destroy)), clone;
|
|
};
|
|
}
|
|
function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) {
|
|
var match, className, nodeType = node.nodeType, attrsMap = attrs.$attr;
|
|
switch(nodeType){
|
|
case 1:
|
|
addDirective(directives, directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority, ignoreDirective);
|
|
for(var attr, name, nName, ngAttrName, value, nAttrs = node.attributes, j = 0, jj = nAttrs && nAttrs.length; j < jj; j++){
|
|
var attrStartName = !1, attrEndName = !1;
|
|
if (attr = nAttrs[j], !msie || msie >= 8 || attr.specified) {
|
|
ngAttrName = directiveNormalize(name = attr.name), NG_ATTR_BINDING.test(ngAttrName) && (name = snake_case(ngAttrName.substr(6), '-'));
|
|
var directiveNName = ngAttrName.replace(/(Start|End)$/, '');
|
|
ngAttrName === directiveNName + 'Start' && (attrStartName = name, attrEndName = name.substr(0, name.length - 5) + 'end', name = name.substr(0, name.length - 6)), attrsMap[nName = directiveNormalize(name.toLowerCase())] = name, attrs[nName] = value = trim1(msie && 'href' == name ? decodeURIComponent(node.getAttribute(name, 2)) : attr.value), getBooleanAttrName(node, nName) && (attrs[nName] = !0), addAttrInterpolateDirective(node, directives, value, nName), addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName, attrEndName);
|
|
}
|
|
}
|
|
if (isString(className = node.className) && '' !== className) for(; match = CLASS_DIRECTIVE_REGEXP.exec(className);)addDirective(directives, nName = directiveNormalize(match[2]), 'C', maxPriority, ignoreDirective) && (attrs[nName] = trim1(match[3])), className = className.substr(match.index + match[0].length);
|
|
break;
|
|
case 3:
|
|
addTextInterpolateDirective(directives, node.nodeValue);
|
|
break;
|
|
case 8:
|
|
try {
|
|
(match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue)) && (nName = directiveNormalize(match[1]), addDirective(directives, nName, 'M', maxPriority, ignoreDirective) && (attrs[nName] = trim1(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);
|
|
1 == node.nodeType && (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 linkFn(scope, element = groupScan(element[0], attrStart, attrEnd), attrs, controllers, transcludeFn);
|
|
};
|
|
}
|
|
function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn1, jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, previousCompileContext) {
|
|
previousCompileContext = previousCompileContext || {};
|
|
for(var newScopeDirective, directive1, directiveName, $template, linkFn1, directiveValue, terminalPriority = -Number.MAX_VALUE, controllerDirectives = previousCompileContext.controllerDirectives, newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, templateDirective = previousCompileContext.templateDirective, nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, hasTranscludeDirective = !1, hasElementTranscludeDirective = !1, $compileNode = templateAttrs.$$element = jqLite(compileNode), replaceDirective = originalReplaceDirective, childTranscludeFn = transcludeFn1, i2 = 0, ii1 = directives.length; i2 < ii1; i2++){
|
|
var attrStart = (directive1 = directives[i2]).$$start, attrEnd = directive1.$$end;
|
|
if (attrStart && ($compileNode = groupScan(compileNode, attrStart, attrEnd)), $template = undefined, terminalPriority > directive1.priority) break;
|
|
if ((directiveValue = directive1.scope) && (newScopeDirective = newScopeDirective || directive1, !directive1.templateUrl && (assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive1, $compileNode), isObject(directiveValue) && (newIsolateScopeDirective = directive1))), directiveName = directive1.name, !directive1.templateUrl && directive1.controller && (directiveValue = directive1.controller, assertNoDuplicate("'" + directiveName + "' controller", (controllerDirectives = controllerDirectives || {})[directiveName], directive1, $compileNode), controllerDirectives[directiveName] = directive1), (directiveValue = directive1.transclude) && (hasTranscludeDirective = !0, directive1.$$tlb || (assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive1, $compileNode), nonTlbTranscludeDirective = directive1), 'element' == directiveValue ? (hasElementTranscludeDirective = !0, terminalPriority = directive1.priority, $template = groupScan(compileNode, attrStart, attrEnd), compileNode = ($compileNode = templateAttrs.$$element = jqLite(document1.createComment(' ' + directiveName + ': ' + templateAttrs[directiveName] + ' ')))[0], replaceWith(jqCollection, jqLite(sliceArgs($template)), compileNode), childTranscludeFn = compile($template, transcludeFn1, terminalPriority, replaceDirective && replaceDirective.name, {
|
|
nonTlbTranscludeDirective: nonTlbTranscludeDirective
|
|
})) : ($template = jqLite(jqLiteClone(compileNode)).contents(), $compileNode.empty(), childTranscludeFn = compile($template, transcludeFn1))), directive1.template) if (assertNoDuplicate('template', templateDirective, directive1, $compileNode), templateDirective = directive1, directiveValue = isFunction(directive1.template) ? directive1.template($compileNode, templateAttrs) : directive1.template, directiveValue = denormalizeTemplate(directiveValue), directive1.replace) {
|
|
if (replaceDirective = directive1, compileNode = ($template = jqLite('<div>' + trim1(directiveValue) + '</div>').contents())[0], 1 != $template.length || 1 !== compileNode.nodeType) 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(i2 + 1, directives.length - (i2 + 1));
|
|
newIsolateScopeDirective && markDirectivesAsIsolate(templateDirectives), directives = directives.concat(templateDirectives).concat(unprocessedDirectives), mergeTemplateAttributes(templateAttrs, newTemplateAttrs), ii1 = directives.length;
|
|
} else $compileNode.html(directiveValue);
|
|
if (directive1.templateUrl) assertNoDuplicate('template', templateDirective, directive1, $compileNode), templateDirective = directive1, directive1.replace && (replaceDirective = directive1), nodeLinkFn = compileTemplateUrl(directives.splice(i2, directives.length - i2), $compileNode, templateAttrs, jqCollection, childTranscludeFn, preLinkFns, postLinkFns, {
|
|
controllerDirectives: controllerDirectives,
|
|
newIsolateScopeDirective: newIsolateScopeDirective,
|
|
templateDirective: templateDirective,
|
|
nonTlbTranscludeDirective: nonTlbTranscludeDirective
|
|
}), ii1 = directives.length;
|
|
else if (directive1.compile) try {
|
|
linkFn1 = directive1.compile($compileNode, templateAttrs, childTranscludeFn), isFunction(linkFn1) ? addLinkFns(null, linkFn1, attrStart, attrEnd) : linkFn1 && addLinkFns(linkFn1.pre, linkFn1.post, attrStart, attrEnd);
|
|
} catch (e) {
|
|
$exceptionHandler(e, startingTag($compileNode));
|
|
}
|
|
directive1.terminal && (nodeLinkFn.terminal = !0, terminalPriority = Math.max(terminalPriority, directive1.priority));
|
|
}
|
|
return nodeLinkFn.scope = newScopeDirective && !0 === newScopeDirective.scope, nodeLinkFn.transclude = hasTranscludeDirective && childTranscludeFn, nodeLinkFn;
|
|
function addLinkFns(pre, post, attrStart, attrEnd) {
|
|
pre && (attrStart && (pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd)), pre.require = directive1.require, (newIsolateScopeDirective === directive1 || directive1.$$isolateScope) && (pre = cloneAndAnnotateFn(pre, {
|
|
isolateScope: !0
|
|
})), preLinkFns.push(pre)), post && (attrStart && (post = groupElementsLinkFnWrapper(post, attrStart, attrEnd)), post.require = directive1.require, (newIsolateScopeDirective === directive1 || directive1.$$isolateScope) && (post = cloneAndAnnotateFn(post, {
|
|
isolateScope: !0
|
|
})), postLinkFns.push(post));
|
|
}
|
|
function getControllers(require1, $element, elementControllers) {
|
|
var value, retrievalMethod = 'data', optional = !1;
|
|
if (isString(require1)) {
|
|
for(; '^' == (value = require1.charAt(0)) || '?' == value;)require1 = require1.substr(1), '^' == value && (retrievalMethod = 'inheritedData'), optional = optional || '?' == value;
|
|
if (value = null, elementControllers && 'data' === retrievalMethod && (value = elementControllers[require1]), !(value = value || $element[retrievalMethod]('$' + require1 + 'Controller')) && !optional) throw $compileMinErr('ctreq', "Controller '{0}', required by directive '{1}', can't be found!", require1, directiveName);
|
|
return value;
|
|
}
|
|
return isArray(require1) && (value = [], forEach(require1, function(require) {
|
|
value.push(getControllers(require, $element, elementControllers));
|
|
})), value;
|
|
}
|
|
function nodeLinkFn(childLinkFn, scope1, linkNode, $rootElement, boundTranscludeFn) {
|
|
var attrs, $element, i, ii, linkFn, controller, isolateScope, transcludeFn, elementControllers = {};
|
|
if ($element = (attrs = compileNode === linkNode ? templateAttrs : function(src, dst) {
|
|
for(var key in dst = dst || {}, src)src.hasOwnProperty(key) && '$$' !== key.substr(0, 2) && (dst[key] = src[key]);
|
|
return dst;
|
|
}(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr))).$$element, newIsolateScopeDirective) {
|
|
var LOCAL_REGEXP = /^\s*([@=&])(\??)\s*(\w*)\s*$/, $linkNode = jqLite(linkNode);
|
|
isolateScope = scope1.$new(!0), templateDirective && templateDirective === newIsolateScopeDirective.$$originalDirective ? $linkNode.data('$isolateScope', isolateScope) : $linkNode.data('$isolateScopeNoTemplate', isolateScope), safeAddClass($linkNode, 'ng-isolate-scope'), forEach(newIsolateScopeDirective.scope, function(definition, scopeName) {
|
|
var lastValue, parentGet, parentSet, compare, match = definition.match(LOCAL_REGEXP) || [], attrName = match[3] || scopeName, optional = '?' == match[2], mode = match[1];
|
|
switch(isolateScope.$$isolateBindings[scopeName] = mode + attrName, mode){
|
|
case '@':
|
|
attrs.$observe(attrName, function(value) {
|
|
isolateScope[scopeName] = value;
|
|
}), attrs.$$observers[attrName].$$scope = scope1, attrs[attrName] && (isolateScope[scopeName] = $interpolate(attrs[attrName])(scope1));
|
|
break;
|
|
case '=':
|
|
if (optional && !attrs[attrName]) return;
|
|
compare = (parentGet = $parse(attrs[attrName])).literal ? equals : function(a, b) {
|
|
return a === b;
|
|
}, parentSet = parentGet.assign || function() {
|
|
throw lastValue = isolateScope[scopeName] = parentGet(scope1), $compileMinErr('nonassign', "Expression '{0}' used with directive '{1}' is non-assignable!", attrs[attrName], newIsolateScopeDirective.name);
|
|
}, lastValue = isolateScope[scopeName] = parentGet(scope1), isolateScope.$watch(function() {
|
|
var parentValue = parentGet(scope1);
|
|
return compare(parentValue, isolateScope[scopeName]) || (compare(parentValue, lastValue) ? parentSet(scope1, parentValue = isolateScope[scopeName]) : isolateScope[scopeName] = parentValue), lastValue = parentValue;
|
|
}, null, parentGet.literal);
|
|
break;
|
|
case '&':
|
|
parentGet = $parse(attrs[attrName]), isolateScope[scopeName] = function(locals) {
|
|
return parentGet(scope1, locals);
|
|
};
|
|
break;
|
|
default:
|
|
throw $compileMinErr('iscp', "Invalid isolate scope definition for directive '{0}'. Definition: {... {1}: '{2}' ...}", newIsolateScopeDirective.name, scopeName, definition);
|
|
}
|
|
});
|
|
}
|
|
for(transcludeFn = boundTranscludeFn && function(scope, cloneAttachFn) {
|
|
var transcludeControllers;
|
|
return arguments.length < 2 && (cloneAttachFn = scope, scope = undefined), hasElementTranscludeDirective && (transcludeControllers = elementControllers), boundTranscludeFn(scope, cloneAttachFn, transcludeControllers);
|
|
}, controllerDirectives && forEach(controllerDirectives, function(directive) {
|
|
var controllerInstance, locals = {
|
|
$scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope1,
|
|
$element: $element,
|
|
$attrs: attrs,
|
|
$transclude: transcludeFn
|
|
};
|
|
'@' == (controller = directive.controller) && (controller = attrs[directive.name]), controllerInstance = $controller(controller, locals), elementControllers[directive.name] = controllerInstance, hasElementTranscludeDirective || $element.data('$' + directive.name + 'Controller', controllerInstance), directive.controllerAs && (locals.$scope[directive.controllerAs] = controllerInstance);
|
|
}), i = 0, ii = preLinkFns.length; i < ii; i++)try {
|
|
(linkFn = preLinkFns[i])(linkFn.isolateScope ? isolateScope : scope1, $element, attrs, linkFn.require && getControllers(linkFn.require, $element, elementControllers), transcludeFn);
|
|
} catch (e) {
|
|
$exceptionHandler(e, startingTag($element));
|
|
}
|
|
var scopeToChild = scope1;
|
|
for(newIsolateScopeDirective && (newIsolateScopeDirective.template || null === newIsolateScopeDirective.templateUrl) && (scopeToChild = isolateScope), childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn), i = postLinkFns.length - 1; i >= 0; i--)try {
|
|
(linkFn = postLinkFns[i])(linkFn.isolateScope ? isolateScope : scope1, $element, attrs, linkFn.require && getControllers(linkFn.require, $element, elementControllers), transcludeFn);
|
|
} catch (e2) {
|
|
$exceptionHandler(e2, startingTag($element));
|
|
}
|
|
}
|
|
}
|
|
function markDirectivesAsIsolate(directives) {
|
|
for(var j = 0, jj = directives.length; j < jj; 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; i < ii; 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 mergeTemplateAttributes(dst, src) {
|
|
var srcAttr = src.$attr, dstAttr = dst.$attr, $element = dst.$$element;
|
|
forEach(dst, function(value, key) {
|
|
'$' != key.charAt(0) && (src[key] && (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;
|
|
return $compileNode.empty(), $http.get($sce.getTrustedResourceUrl(templateUrl), {
|
|
cache: $templateCache
|
|
}).success(function(content) {
|
|
var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn;
|
|
if (content = denormalizeTemplate(content), origAsyncDirective.replace) {
|
|
if (compileNode = ($template = jqLite('<div>' + trim1(content) + '</div>').contents())[0], 1 != $template.length || 1 !== compileNode.nodeType) 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];
|
|
beforeTemplateLinkNode !== beforeTemplateCompileNode && (linkNode = jqLiteClone(compileNode), replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode)), childBoundTranscludeFn = afterTemplateNodeLinkFn.transclude ? createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude) : boundTranscludeFn, afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, childBoundTranscludeFn);
|
|
}
|
|
linkQueue = null;
|
|
}).error(function(response, code, headers, config) {
|
|
throw $compileMinErr('tpload', 'Failed to load template: {0}', config.url);
|
|
}), function(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {
|
|
linkQueue ? (linkQueue.push(scope), linkQueue.push(node), linkQueue.push(rootElement), linkQueue.push(boundTranscludeFn)) : afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, boundTranscludeFn);
|
|
};
|
|
}
|
|
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: valueFn1(function(scope, node) {
|
|
var parent = node.parent(), bindings = parent.data('$binding') || [];
|
|
bindings.push(interpolateFn), safeAddClass(parent.data('$binding', bindings), 'ng-binding'), scope.$watch(interpolateFn, function(value) {
|
|
node[0].nodeValue = value;
|
|
});
|
|
})
|
|
});
|
|
}
|
|
function addAttrInterpolateDirective(node1, directives, value, name) {
|
|
var interpolateFn = $interpolate(value, !0);
|
|
if (interpolateFn) {
|
|
if ("multiple" === name && "SELECT" === nodeName_(node1)) throw $compileMinErr("selmulti", "Binding to the 'multiple' attribute is not supported. Element: {0}", startingTag(node1));
|
|
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.");
|
|
(interpolateFn = $interpolate(attr[name], !0, function(node, attrNormalizedName) {
|
|
if ("srcdoc" == attrNormalizedName) return $sce.HTML;
|
|
var tag = nodeName_(node);
|
|
if ("xlinkHref" == attrNormalizedName || "FORM" == tag && "action" == attrNormalizedName || "IMG" != tag && ("src" == attrNormalizedName || "ngSrc" == attrNormalizedName)) return $sce.RESOURCE_URL;
|
|
}(node1, name))) && (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; i < ii; i++)if ($rootElement[i] == firstElementToRemove) {
|
|
$rootElement[i++] = newNode;
|
|
for(var j = i, j2 = j + removeCount - 1, jj = $rootElement.length; j < jj; j++, j2++)j2 < jj ? $rootElement[j] = $rootElement[j2] : delete $rootElement[j];
|
|
$rootElement.length -= removeCount - 1;
|
|
break;
|
|
}
|
|
}
|
|
parent && parent.replaceChild(newNode, firstElementToRemove);
|
|
var fragment = document1.createDocumentFragment();
|
|
fragment.appendChild(firstElementToRemove), newNode[jqLite.expando] = firstElementToRemove[jqLite.expando];
|
|
for(var k = 1, kk = elementsToRemove.length; k < kk; 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);
|
|
}
|
|
}
|
|
];
|
|
}
|
|
$CompileProvider.$inject = [
|
|
'$provide',
|
|
'$$sanitizeUriProvider'
|
|
];
|
|
var PREFIX_REGEXP = /^(x[\:\-_]|data[\:\-_])/i;
|
|
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 $ControllerProvider() {
|
|
var controllers = {}, CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/;
|
|
this.register = function(name, constructor) {
|
|
assertNotHasOwnProperty(name, 'controller'), isObject(name) ? extend(controllers, name) : controllers[name] = constructor;
|
|
}, this.$get = [
|
|
'$injector',
|
|
'$window',
|
|
function($injector, $window) {
|
|
return function(expression, locals) {
|
|
var instance, match, constructor, identifier;
|
|
if (isString(expression) && (constructor = (match = expression.match(CNTRL_REG))[1], identifier = match[3], assertArgFn(expression = controllers.hasOwnProperty(constructor) ? controllers[constructor] : getter1(locals.$scope, constructor, !0) || getter1($window, constructor, !0), constructor, !0)), instance = $injector.instantiate(expression, locals), identifier) {
|
|
if (!(locals && 'object' == typeof locals.$scope)) throw minErr('$controller')('noscp', "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", constructor || expression.name, identifier);
|
|
locals.$scope[identifier] = instance;
|
|
}
|
|
return instance;
|
|
};
|
|
}
|
|
];
|
|
}
|
|
function $DocumentProvider() {
|
|
this.$get = [
|
|
'$window',
|
|
function(window) {
|
|
return jqLite(window.document);
|
|
}
|
|
];
|
|
}
|
|
function $ExceptionHandlerProvider() {
|
|
this.$get = [
|
|
'$log',
|
|
function($log) {
|
|
return function(exception, cause) {
|
|
$log.error.apply($log, arguments);
|
|
};
|
|
}
|
|
];
|
|
}
|
|
function parseHeaders(headers) {
|
|
var key, val, i, parsed = {};
|
|
return headers && forEach(headers.split('\n'), function(line) {
|
|
i = line.indexOf(':'), key = lowercase(trim1(line.substr(0, i))), val = trim1(line.substr(i + 1)), key && (parsed[key] ? parsed[key] += ', ' + val : parsed[key] = val);
|
|
}), parsed;
|
|
}
|
|
function headersGetter(headers) {
|
|
var headersObj = isObject(headers) ? headers : undefined;
|
|
return function(name) {
|
|
return (headersObj || (headersObj = parseHeaders(headers)), name) ? headersObj[lowercase(name)] || null : headersObj;
|
|
};
|
|
}
|
|
function transformData(data, headers, fns) {
|
|
return isFunction(fns) ? fns(data, headers) : (forEach(fns, function(fn) {
|
|
data = fn(data, headers);
|
|
}), data);
|
|
}
|
|
function $HttpProvider() {
|
|
var JSON_START = /^\s*(\[|\{[^\{])/, JSON_END = /[\}\]]\s*$/, PROTECTION_PREFIX = /^\)\]\}',?\n/, CONTENT_TYPE_APPLICATION_JSON = {
|
|
'Content-Type': 'application/json;charset=utf-8'
|
|
}, defaults = this.defaults = {
|
|
transformResponse: [
|
|
function(data) {
|
|
return isString(data) && (data = data.replace(PROTECTION_PREFIX, ''), JSON_START.test(data) && JSON_END.test(data) && (data = fromJson(data))), data;
|
|
}
|
|
],
|
|
transformRequest: [
|
|
function(d) {
|
|
var obj;
|
|
return isObject(d) && (obj = d, '[object File]' !== toString.call(obj)) ? toJson(d) : d;
|
|
}
|
|
],
|
|
headers: {
|
|
common: {
|
|
Accept: 'application/json, text/plain, */*'
|
|
},
|
|
post: CONTENT_TYPE_APPLICATION_JSON,
|
|
put: CONTENT_TYPE_APPLICATION_JSON,
|
|
patch: CONTENT_TYPE_APPLICATION_JSON
|
|
},
|
|
xsrfCookieName: 'XSRF-TOKEN',
|
|
xsrfHeaderName: 'X-XSRF-TOKEN'
|
|
}, interceptorFactories = this.interceptors = [], responseInterceptorFactories = this.responseInterceptors = [];
|
|
this.$get = [
|
|
'$httpBackend',
|
|
'$browser',
|
|
'$cacheFactory',
|
|
'$rootScope',
|
|
'$q',
|
|
'$injector',
|
|
function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {
|
|
var defaultCache = $cacheFactory('$http'), reversedInterceptors = [];
|
|
function $http(requestConfig) {
|
|
var config1 = {
|
|
transformRequest: defaults.transformRequest,
|
|
transformResponse: defaults.transformResponse
|
|
}, headers1 = function(config) {
|
|
var defHeaderName, lowercaseDefHeaderName, reqHeaderName, defHeaders = defaults.headers, reqHeaders = extend({}, config.headers);
|
|
execHeaders(defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)])), execHeaders(reqHeaders);
|
|
defaultHeadersIteration: for(defHeaderName in defHeaders){
|
|
for(reqHeaderName in lowercaseDefHeaderName = lowercase(defHeaderName), reqHeaders)if (lowercase(reqHeaderName) === lowercaseDefHeaderName) continue defaultHeadersIteration;
|
|
reqHeaders[defHeaderName] = defHeaders[defHeaderName];
|
|
}
|
|
return reqHeaders;
|
|
function execHeaders(headers) {
|
|
var headerContent;
|
|
forEach(headers, function(headerFn, header) {
|
|
isFunction(headerFn) && (null != (headerContent = headerFn()) ? headers[header] = headerContent : delete headers[header]);
|
|
});
|
|
}
|
|
}(requestConfig);
|
|
extend(config1, requestConfig), config1.headers = headers1, config1.method = uppercase(config1.method);
|
|
var xsrfValue = urlIsSameOrigin(config1.url) ? $browser.cookies()[config1.xsrfCookieName || defaults.xsrfCookieName] : undefined;
|
|
xsrfValue && (headers1[config1.xsrfHeaderName || defaults.xsrfHeaderName] = xsrfValue);
|
|
var chain = [
|
|
function(config) {
|
|
headers1 = config.headers;
|
|
var reqData = transformData(config.data, headersGetter(headers1), config.transformRequest);
|
|
return isUndefined(config.data) && forEach(headers1, function(value, header) {
|
|
'content-type' === lowercase(header) && delete headers1[header];
|
|
}), isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials) && (config.withCredentials = defaults.withCredentials), sendReq(config, reqData, headers1).then(transformResponse, transformResponse);
|
|
},
|
|
undefined
|
|
], promise = $q.when(config1);
|
|
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, config1);
|
|
}), promise;
|
|
}, promise.error = function(fn) {
|
|
return promise.then(null, function(response) {
|
|
fn(response.data, response.status, response.headers, config1);
|
|
}), promise;
|
|
}, promise;
|
|
function transformResponse(response) {
|
|
var status, resp = extend({}, response, {
|
|
data: transformData(response.data, response.headers, config1.transformResponse)
|
|
});
|
|
return 200 <= (status = response.status) && status < 300 ? resp : $q.reject(resp);
|
|
}
|
|
}
|
|
return forEach(interceptorFactories, function(interceptorFactory) {
|
|
reversedInterceptors.unshift(isString(interceptorFactory) ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));
|
|
}), forEach(responseInterceptorFactories, function(interceptorFactory, index) {
|
|
var responseFn = isString(interceptorFactory) ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory);
|
|
reversedInterceptors.splice(index, 0, {
|
|
response: function(response) {
|
|
return responseFn($q.when(response));
|
|
},
|
|
responseError: function(response) {
|
|
return responseFn($q.reject(response));
|
|
}
|
|
});
|
|
}), $http.pendingRequests = [], function(names) {
|
|
forEach(arguments, function(name) {
|
|
$http[name] = function(url, config) {
|
|
return $http(extend(config || {}, {
|
|
method: name,
|
|
url: url
|
|
}));
|
|
};
|
|
});
|
|
}('get', 'delete', 'head', 'jsonp'), function(name1) {
|
|
forEach(arguments, function(name) {
|
|
$http[name] = function(url, data, config) {
|
|
return $http(extend(config || {}, {
|
|
method: name,
|
|
url: url,
|
|
data: data
|
|
}));
|
|
};
|
|
});
|
|
}('post', 'put'), $http.defaults = defaults, $http;
|
|
function sendReq(config, reqData, reqHeaders) {
|
|
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) && !1 !== config.cache && 'GET' == config.method && (cache = isObject(config.cache) ? config.cache : isObject(defaults.cache) ? defaults.cache : defaultCache), cache) if (isDefined(cachedResp = cache.get(url))) {
|
|
if (cachedResp.then) return cachedResp.then(removePendingReq, removePendingReq), cachedResp;
|
|
isArray(cachedResp) ? resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2])) : resolvePromise(cachedResp, 200, {});
|
|
} else cache.put(url, promise);
|
|
return isUndefined(cachedResp) && $httpBackend(config.method, url, reqData, function(status, response, headersString) {
|
|
if (cache) {
|
|
var status1;
|
|
200 <= (status1 = status) && status1 < 300 ? cache.put(url, [
|
|
status,
|
|
response,
|
|
parseHeaders(headersString)
|
|
]) : cache.remove(url);
|
|
}
|
|
resolvePromise(response, status, headersString), $rootScope.$$phase || $rootScope.$apply();
|
|
}, reqHeaders, config.timeout, config.withCredentials, config.responseType), promise;
|
|
function resolvePromise(response, status, headers) {
|
|
var status2;
|
|
(200 <= (status2 = status = Math.max(status, 0)) && status2 < 300 ? deferred.resolve : deferred.reject)({
|
|
data: response,
|
|
status: status,
|
|
headers: headersGetter(headers),
|
|
config: config
|
|
});
|
|
}
|
|
function removePendingReq() {
|
|
var idx = indexOf($http.pendingRequests, config);
|
|
-1 !== idx && $http.pendingRequests.splice(idx, 1);
|
|
}
|
|
}
|
|
function buildUrl(url, params) {
|
|
if (!params) return url;
|
|
var parts = [];
|
|
return function(obj, iterator, context) {
|
|
for(var keys = sortedKeys(obj), i = 0; i < keys.length; i++)iterator.call(void 0, obj[keys[i]], keys[i]);
|
|
}(params, function(value, key) {
|
|
null === value || isUndefined(value) || (isArray(value) || (value = [
|
|
value
|
|
]), forEach(value, function(v) {
|
|
isObject(v) && (v = toJson(v)), parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(v));
|
|
}));
|
|
}), url + (-1 == url.indexOf('?') ? '?' : '&') + parts.join('&');
|
|
}
|
|
}
|
|
];
|
|
}
|
|
var XHR1 = window1.XMLHttpRequest || function() {
|
|
try {
|
|
return new ActiveXObject("Msxml2.XMLHTTP.6.0");
|
|
} catch (e1) {}
|
|
try {
|
|
return new ActiveXObject("Msxml2.XMLHTTP.3.0");
|
|
} catch (e2) {}
|
|
try {
|
|
return new ActiveXObject("Msxml2.XMLHTTP");
|
|
} catch (e3) {}
|
|
throw minErr('$httpBackend')('noxhr', "This browser does not support XMLHttpRequest.");
|
|
};
|
|
function $HttpBackendProvider() {
|
|
this.$get = [
|
|
'$browser',
|
|
'$window',
|
|
'$document',
|
|
function($browser, $window, $document) {
|
|
return createHttpBackend($browser, XHR1, $browser.defer, $window.angular.callbacks, $document[0]);
|
|
}
|
|
];
|
|
}
|
|
function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawDocument) {
|
|
return function(method, url, post, callback1, headers, timeout, withCredentials, responseType) {
|
|
var status3;
|
|
if ($browser.$$incOutstandingRequestCount(), url = url || $browser.url(), 'jsonp' == lowercase(method)) {
|
|
var callbackId = '_' + (callbacks.counter++).toString(36);
|
|
callbacks[callbackId] = function(data) {
|
|
callbacks[callbackId].data = data;
|
|
};
|
|
var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), function() {
|
|
callbacks[callbackId].data ? completeRequest(callback1, 200, callbacks[callbackId].data) : completeRequest(callback1, status3 || -2), delete callbacks[callbackId];
|
|
});
|
|
} else {
|
|
var xhr = new XHR();
|
|
xhr.open(method, url, !0), forEach(headers, function(value, key) {
|
|
isDefined(value) && xhr.setRequestHeader(key, value);
|
|
}), xhr.onreadystatechange = function() {
|
|
if (4 == xhr.readyState) {
|
|
var responseHeaders = null, response = null;
|
|
-1 !== status3 && (responseHeaders = xhr.getAllResponseHeaders(), response = xhr.responseType ? xhr.response : xhr.responseText), completeRequest(callback1, status3 || xhr.status, response, responseHeaders);
|
|
}
|
|
}, withCredentials && (xhr.withCredentials = !0), responseType && (xhr.responseType = responseType), xhr.send(post || null);
|
|
}
|
|
if (timeout > 0) var timeoutId = $browserDefer(timeoutRequest, timeout);
|
|
else timeout && timeout.then && timeout.then(timeoutRequest);
|
|
function timeoutRequest() {
|
|
status3 = -1, jsonpDone && jsonpDone(), xhr && xhr.abort();
|
|
}
|
|
function completeRequest(callback, status, response, headersString) {
|
|
var protocol = urlResolve(url).protocol;
|
|
timeoutId && $browserDefer.cancel(timeoutId), jsonpDone = xhr = null, callback(status = 1223 == (status = 'file' == protocol && 0 === status ? response ? 200 : 404 : status) ? 204 : status, response, headersString), $browser.$$completeOutstandingRequest(noop);
|
|
}
|
|
};
|
|
function jsonpReq(url, done) {
|
|
var script = rawDocument.createElement('script'), doneWrapper = function() {
|
|
script.onreadystatechange = script.onload = script.onerror = null, rawDocument.body.removeChild(script), done && done();
|
|
};
|
|
return script.type = 'text/javascript', script.src = url, msie && msie <= 8 ? script.onreadystatechange = function() {
|
|
/loaded|complete/.test(script.readyState) && doneWrapper();
|
|
} : script.onload = script.onerror = function() {
|
|
doneWrapper();
|
|
}, rawDocument.body.appendChild(script), doneWrapper;
|
|
}
|
|
}
|
|
var $interpolateMinErr = minErr('$interpolate');
|
|
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) {
|
|
var startSymbolLength = startSymbol.length, endSymbolLength = endSymbol.length;
|
|
function $interpolate(text, mustHaveExpression, trustedContext) {
|
|
for(var startIndex, endIndex, fn, exp, index = 0, parts = [], length = text.length, hasInterpolation = !1, concat = []; index < length;)-1 != (startIndex = text.indexOf(startSymbol, index)) && -1 != (endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) ? (index != startIndex && parts.push(text.substring(index, startIndex)), parts.push(fn = $parse(exp = text.substring(startIndex + startSymbolLength, endIndex))), fn.exp = exp, index = endIndex + endSymbolLength, hasInterpolation = !0) : (index != length && parts.push(text.substring(index)), index = length);
|
|
if ((length = parts.length) || (parts.push(''), length = 1), trustedContext && parts.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 || hasInterpolation) return concat.length = length, (fn = function(context) {
|
|
try {
|
|
for(var part, i = 0, ii = length; i < ii; i++)'function' == typeof (part = parts[i]) && (part = part(context), part = trustedContext ? $sce.getTrusted(trustedContext, part) : $sce.valueOf(part), null === part || isUndefined(part) ? part = '' : 'string' != typeof part && (part = toJson(part))), concat[i] = part;
|
|
return concat.join('');
|
|
} catch (err) {
|
|
$exceptionHandler($interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, err.toString()));
|
|
}
|
|
}).exp = text, fn.parts = parts, fn;
|
|
}
|
|
return $interpolate.startSymbol = function() {
|
|
return startSymbol;
|
|
}, $interpolate.endSymbol = function() {
|
|
return endSymbol;
|
|
}, $interpolate;
|
|
}
|
|
];
|
|
}
|
|
function $IntervalProvider() {
|
|
this.$get = [
|
|
'$rootScope',
|
|
'$window',
|
|
'$q',
|
|
function($rootScope, $window, $q) {
|
|
var intervals = {};
|
|
function interval(fn, delay, count, invokeApply) {
|
|
var setInterval = $window.setInterval, clearInterval = $window.clearInterval, deferred = $q.defer(), promise = deferred.promise, iteration = 0, skipApply = isDefined(invokeApply) && !invokeApply;
|
|
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;
|
|
}
|
|
return interval.cancel = function(promise) {
|
|
return !!promise && promise.$$intervalId in intervals && (intervals[promise.$$intervalId].reject('canceled'), clearInterval(promise.$$intervalId), delete intervals[promise.$$intervalId], !0);
|
|
}, 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: '\u00A4',
|
|
posSuf: '',
|
|
negPre: '(\u00A4',
|
|
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';
|
|
}
|
|
};
|
|
};
|
|
}
|
|
var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, DEFAULT_PORTS = {
|
|
http: 80,
|
|
https: 443,
|
|
ftp: 21
|
|
}, $locationMinErr = minErr('$location');
|
|
function encodePath(path) {
|
|
for(var segments = path.split('/'), i = segments.length; i--;)segments[i] = encodeUriSegment(segments[i]);
|
|
return segments.join('/');
|
|
}
|
|
function parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {
|
|
var parsedUrl = urlResolve(absoluteUrl, appBase);
|
|
locationObj.$$protocol = parsedUrl.protocol, locationObj.$$host = parsedUrl.hostname, locationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;
|
|
}
|
|
function parseAppUrl(relativeUrl, locationObj, appBase) {
|
|
var prefixed = '/' !== relativeUrl.charAt(0);
|
|
prefixed && (relativeUrl = '/' + relativeUrl);
|
|
var match = urlResolve(relativeUrl, appBase);
|
|
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) {
|
|
if (0 === whole.indexOf(begin)) return whole.substr(begin.length);
|
|
}
|
|
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 LocationHtml5Url(appBase, basePrefix) {
|
|
this.$$html5 = !0, basePrefix = basePrefix || '';
|
|
var appBaseNoFile = stripFile(appBase);
|
|
parseAbsoluteUrl(appBase, this, appBase), 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, appBase), 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.$$rewrite = function(url) {
|
|
var appUrl, prevAppUrl;
|
|
return undefined !== (appUrl = beginsWith(appBase, url)) ? (prevAppUrl = appUrl, undefined !== (appUrl = beginsWith(basePrefix, appUrl))) ? appBaseNoFile + (beginsWith('/', appUrl) || appUrl) : appBase + prevAppUrl : undefined !== (appUrl = beginsWith(appBaseNoFile, url)) ? appBaseNoFile + appUrl : appBaseNoFile == url + '/' ? appBaseNoFile : void 0;
|
|
};
|
|
}
|
|
function LocationHashbangUrl(appBase, hashPrefix) {
|
|
var appBaseNoFile = stripFile(appBase);
|
|
parseAbsoluteUrl(appBase, this, appBase), this.$$parse = function(url) {
|
|
var path, url1, base, firstPathSegmentMatch, windowsFilePathExp, 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, appBase), this.$$path = (path = this.$$path, url1 = withoutHashUrl, base = appBase, windowsFilePathExp = /^\/?.*?:(\/.*)/, (0 === url1.indexOf(base) && (url1 = url1.replace(base, '')), windowsFilePathExp.exec(url1)) ? path : (firstPathSegmentMatch = windowsFilePathExp.exec(path)) ? firstPathSegmentMatch[1] : 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 = appBase + (this.$$url ? hashPrefix + this.$$url : '');
|
|
}, this.$$rewrite = function(url) {
|
|
if (stripHash(appBase) == stripHash(url)) return url;
|
|
};
|
|
}
|
|
function LocationHashbangInHtml5Url(appBase, hashPrefix) {
|
|
this.$$html5 = !0, LocationHashbangUrl.apply(this, arguments);
|
|
var appBaseNoFile = stripFile(appBase);
|
|
this.$$rewrite = function(url) {
|
|
var appUrl;
|
|
return appBase == stripHash(url) ? url : (appUrl = beginsWith(appBaseNoFile, url)) ? appBase + hashPrefix + appUrl : appBaseNoFile === url + '/' ? appBaseNoFile : void 0;
|
|
};
|
|
}
|
|
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 = !1;
|
|
this.hashPrefix = function(prefix) {
|
|
return isDefined(prefix) ? (hashPrefix = prefix, this) : hashPrefix;
|
|
}, this.html5Mode = function(mode) {
|
|
return isDefined(mode) ? (html5Mode = mode, this) : html5Mode;
|
|
}, this.$get = [
|
|
'$rootScope',
|
|
'$browser',
|
|
'$sniffer',
|
|
'$rootElement',
|
|
function($rootScope, $browser, $sniffer, $rootElement) {
|
|
var url, $location, LocationMode, appBase, baseHref = $browser.baseHref(), initialUrl = $browser.url();
|
|
html5Mode ? (appBase = (url = initialUrl).substring(0, url.indexOf('/', url.indexOf('//') + 2)) + (baseHref || '/'), LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url) : (appBase = stripHash(initialUrl), LocationMode = LocationHashbangUrl), ($location = new LocationMode(appBase, '#' + hashPrefix)).$$parse($location.$$rewrite(initialUrl)), $rootElement.on('click', function(event) {
|
|
if (!event.ctrlKey && !event.metaKey && 2 != event.which) {
|
|
for(var elm = jqLite(event.target); 'a' !== lowercase(elm[0].nodeName);)if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;
|
|
var absHref = elm.prop('href'), rewrittenUrl = $location.$$rewrite(absHref);
|
|
absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented() && (event.preventDefault(), rewrittenUrl != $browser.url() && ($location.$$parse(rewrittenUrl), $rootScope.$apply(), window1.angular['ff-684208-preventDefault'] = !0));
|
|
}
|
|
}), $location.absUrl() != initialUrl && $browser.url($location.absUrl(), !0), $browser.onUrlChange(function(newUrl) {
|
|
if ($location.absUrl() != newUrl) {
|
|
if ($rootScope.$broadcast('$locationChangeStart', newUrl, $location.absUrl()).defaultPrevented) {
|
|
$browser.url($location.absUrl());
|
|
return;
|
|
}
|
|
$rootScope.$evalAsync(function() {
|
|
var oldUrl = $location.absUrl();
|
|
$location.$$parse(newUrl), afterLocationChange(oldUrl);
|
|
}), $rootScope.$$phase || $rootScope.$digest();
|
|
}
|
|
});
|
|
var changeCounter = 0;
|
|
return $rootScope.$watch(function() {
|
|
var oldUrl = $browser.url(), currentReplace = $location.$$replace;
|
|
return changeCounter && oldUrl == $location.absUrl() || (changeCounter++, $rootScope.$evalAsync(function() {
|
|
$rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).defaultPrevented ? $location.$$parse(oldUrl) : ($browser.url($location.absUrl(), currentReplace), afterLocationChange(oldUrl));
|
|
})), $location.$$replace = !1, changeCounter;
|
|
}), $location;
|
|
function afterLocationChange(oldUrl) {
|
|
$rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl);
|
|
}
|
|
}
|
|
];
|
|
}
|
|
function $LogProvider() {
|
|
var debug = !0, self = this;
|
|
this.debugEnabled = function(flag) {
|
|
return isDefined(flag) ? (debug = flag, this) : debug;
|
|
}, this.$get = [
|
|
'$window',
|
|
function($window) {
|
|
var fn;
|
|
return {
|
|
log: consoleLog('log'),
|
|
info: consoleLog('info'),
|
|
warn: consoleLog('warn'),
|
|
error: consoleLog('error'),
|
|
debug: (fn = consoleLog('debug'), function() {
|
|
debug && fn.apply(self, arguments);
|
|
})
|
|
};
|
|
function consoleLog(type) {
|
|
var console = $window.console || {}, logFn = console[type] || console.log || noop;
|
|
return logFn.apply ? function() {
|
|
var args = [];
|
|
return forEach(arguments, function(arg) {
|
|
var arg4;
|
|
args.push(((arg4 = arg) instanceof Error && (arg4.stack ? arg4 = arg4.message && -1 === arg4.stack.indexOf(arg4.message) ? 'Error: ' + arg4.message + '\n' + arg4.stack : arg4.stack : arg4.sourceURL && (arg4 = arg4.message + '\n' + arg4.sourceURL + ':' + arg4.line)), arg4));
|
|
}), logFn.apply(console, args);
|
|
} : function(arg1, arg2) {
|
|
logFn(arg1, null == arg2 ? '' : arg2);
|
|
};
|
|
}
|
|
}
|
|
];
|
|
}
|
|
LocationHashbangInHtml5Url.prototype = LocationHashbangUrl.prototype = LocationHtml5Url.prototype = {
|
|
$$html5: !1,
|
|
$$replace: !1,
|
|
absUrl: locationGetter('$$absUrl'),
|
|
url: function(url, replace) {
|
|
if (isUndefined(url)) return this.$$url;
|
|
var match = PATH_MATCH.exec(url);
|
|
return match[1] && this.path(decodeURIComponent(match[1])), (match[2] || match[1]) && this.search(match[3] || ''), this.hash(match[5] || '', replace), this;
|
|
},
|
|
protocol: locationGetter('$$protocol'),
|
|
host: locationGetter('$$host'),
|
|
port: locationGetter('$$port'),
|
|
path: locationGetterSetter('$$path', function(path) {
|
|
return '/' == path.charAt(0) ? path : '/' + path;
|
|
}),
|
|
search: function(search, paramValue) {
|
|
switch(arguments.length){
|
|
case 0:
|
|
return this.$$search;
|
|
case 1:
|
|
if (isString(search)) this.$$search = parseKeyValue(search);
|
|
else if (isObject(search)) this.$$search = search;
|
|
else throw $locationMinErr('isrcharg', 'The first argument of the `$location#search()` call must be a string or an object.');
|
|
break;
|
|
default:
|
|
isUndefined(paramValue) || null === paramValue ? delete this.$$search[search] : this.$$search[search] = paramValue;
|
|
}
|
|
return this.$$compose(), this;
|
|
},
|
|
hash: locationGetterSetter('$$hash', identity),
|
|
replace: function() {
|
|
return this.$$replace = !0, this;
|
|
}
|
|
};
|
|
var $parseMinErr = minErr('$parse'), promiseWarningCache = {};
|
|
function ensureSafeMemberName(name, fullExpression) {
|
|
if ("constructor" === name) throw $parseMinErr('isecfld', 'Referencing "constructor" field in Angular expressions is disallowed! 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.document && obj.location && obj.alert && obj.setInterval) throw $parseMinErr('isecwindow', 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', fullExpression);
|
|
if (obj.children && (obj.nodeName || obj.on && obj.find)) throw $parseMinErr('isecdom', 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', fullExpression);
|
|
}
|
|
return obj;
|
|
}
|
|
var OPERATORS = {
|
|
'null': function() {
|
|
return null;
|
|
},
|
|
'true': function() {
|
|
return !0;
|
|
},
|
|
'false': function() {
|
|
return !1;
|
|
},
|
|
undefined: noop,
|
|
'+': 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);
|
|
},
|
|
'=': noop,
|
|
'===': 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 b(self, locals)(self, locals, a(self, locals));
|
|
},
|
|
'!': function(self, locals, a) {
|
|
return !a(self, locals);
|
|
}
|
|
}, ESCAPE = {
|
|
n: "\n",
|
|
f: "\f",
|
|
r: "\r",
|
|
t: "\t",
|
|
v: "\v",
|
|
"'": "'",
|
|
'"': '"'
|
|
}, Lexer = function(options) {
|
|
this.options = options;
|
|
};
|
|
Lexer.prototype = {
|
|
constructor: Lexer,
|
|
lex: function(text) {
|
|
this.text = text, this.index = 0, this.ch = undefined, this.lastCh = ':', this.tokens = [];
|
|
for(var token, json = []; this.index < this.text.length;){
|
|
if (this.ch = this.text.charAt(this.index), this.is('"\'')) this.readString(this.ch);
|
|
else if (this.isNumber(this.ch) || this.is('.') && this.isNumber(this.peek())) this.readNumber();
|
|
else if (this.isIdent(this.ch)) this.readIdent(), this.was('{,') && '{' === json[0] && (token = this.tokens[this.tokens.length - 1]) && (token.json = -1 === token.text.indexOf('.'));
|
|
else if (this.is('(){}[].,;:?')) this.tokens.push({
|
|
index: this.index,
|
|
text: this.ch,
|
|
json: this.was(':[,') && this.is('{[') || this.is('}]:,')
|
|
}), this.is('{[') && json.unshift(this.ch), this.is('}]') && json.shift(), this.index++;
|
|
else if (this.isWhitespace(this.ch)) {
|
|
this.index++;
|
|
continue;
|
|
} else {
|
|
var ch2 = this.ch + this.peek(), ch3 = ch2 + this.peek(2), fn = OPERATORS[this.ch], fn2 = OPERATORS[ch2], fn3 = OPERATORS[ch3];
|
|
fn3 ? (this.tokens.push({
|
|
index: this.index,
|
|
text: ch3,
|
|
fn: fn3
|
|
}), this.index += 3) : fn2 ? (this.tokens.push({
|
|
index: this.index,
|
|
text: ch2,
|
|
fn: fn2
|
|
}), this.index += 2) : fn ? (this.tokens.push({
|
|
index: this.index,
|
|
text: this.ch,
|
|
fn: fn,
|
|
json: this.was('[,:') && this.is('+-')
|
|
}), this.index += 1) : this.throwError('Unexpected next character ', this.index, this.index + 1);
|
|
}
|
|
this.lastCh = this.ch;
|
|
}
|
|
return this.tokens;
|
|
},
|
|
is: function(chars) {
|
|
return -1 !== chars.indexOf(this.ch);
|
|
},
|
|
was: function(chars) {
|
|
return -1 !== chars.indexOf(this.lastCh);
|
|
},
|
|
peek: function(i) {
|
|
var num = i || 1;
|
|
return this.index + num < this.text.length && this.text.charAt(this.index + num);
|
|
},
|
|
isNumber: function(ch) {
|
|
return '0' <= ch && ch <= '9';
|
|
},
|
|
isWhitespace: function(ch) {
|
|
return ' ' === ch || '\r' === ch || '\t' === ch || '\n' === ch || '\v' === ch || '\u00A0' === ch;
|
|
},
|
|
isIdent: function(ch) {
|
|
return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || '_' === ch || '$' === ch;
|
|
},
|
|
isExpOperator: function(ch) {
|
|
return '-' === ch || '+' === ch || this.isNumber(ch);
|
|
},
|
|
throwError: function(error, start, end) {
|
|
throw end = end || this.index, $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].', error, isDefined(start) ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']' : ' ' + end, 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;
|
|
else this.throwError('Invalid exponent');
|
|
}
|
|
this.index++;
|
|
}
|
|
number *= 1, this.tokens.push({
|
|
index: start,
|
|
text: number,
|
|
json: !0,
|
|
fn: function() {
|
|
return number;
|
|
}
|
|
});
|
|
},
|
|
readIdent: function() {
|
|
for(var lastDot, peekIndex, methodName, ch, parser = this, ident = '', start = this.index; this.index < this.text.length && ('.' === (ch = this.text.charAt(this.index)) || this.isIdent(ch) || this.isNumber(ch));)'.' === ch && (lastDot = this.index), ident += ch, this.index++;
|
|
if (lastDot) for(peekIndex = this.index; peekIndex < this.text.length;){
|
|
if ('(' === (ch = this.text.charAt(peekIndex))) {
|
|
methodName = ident.substr(lastDot - start + 1), ident = ident.substr(0, lastDot - start), this.index = peekIndex;
|
|
break;
|
|
}
|
|
if (this.isWhitespace(ch)) peekIndex++;
|
|
else break;
|
|
}
|
|
var token = {
|
|
index: start,
|
|
text: ident
|
|
};
|
|
if (OPERATORS.hasOwnProperty(ident)) token.fn = OPERATORS[ident], token.json = OPERATORS[ident];
|
|
else {
|
|
var getter = getterFn(ident, this.options, this.text);
|
|
token.fn = extend(function(self, locals) {
|
|
return getter(self, locals);
|
|
}, {
|
|
assign: function(self, value) {
|
|
return setter(self, ident, value, parser.text, parser.options);
|
|
}
|
|
});
|
|
}
|
|
this.tokens.push(token), methodName && (this.tokens.push({
|
|
index: lastDot,
|
|
text: '.',
|
|
json: !1
|
|
}), this.tokens.push({
|
|
index: lastDot + 1,
|
|
text: methodName,
|
|
json: !1
|
|
}));
|
|
},
|
|
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];
|
|
rep ? string += rep : string += ch;
|
|
}
|
|
escape = !1;
|
|
} else if ('\\' === ch) escape = !0;
|
|
else if (ch === quote) {
|
|
this.index++, this.tokens.push({
|
|
index: start,
|
|
text: rawString,
|
|
string: string,
|
|
json: !0,
|
|
fn: function() {
|
|
return string;
|
|
}
|
|
});
|
|
return;
|
|
} else string += ch;
|
|
this.index++;
|
|
}
|
|
this.throwError('Unterminated quote', start);
|
|
}
|
|
};
|
|
var Parser = function(lexer, $filter, options) {
|
|
this.lexer = lexer, this.$filter = $filter, this.options = options;
|
|
};
|
|
function setter(obj, path, setValue, fullExp, options) {
|
|
options = options || {};
|
|
for(var key, element = path.split('.'), i = 0; element.length > 1; i++){
|
|
var propertyObj = obj[key = ensureSafeMemberName(element.shift(), fullExp)];
|
|
propertyObj || (propertyObj = {}, obj[key] = propertyObj), (obj = propertyObj).then && options.unwrapPromises && (promiseWarning(fullExp), "$$v" in obj || function(promise) {
|
|
promise.then(function(val) {
|
|
promise.$$v = val;
|
|
});
|
|
}(obj), undefined === obj.$$v && (obj.$$v = {}), obj = obj.$$v);
|
|
}
|
|
return obj[key = ensureSafeMemberName(element.shift(), fullExp)] = setValue, setValue;
|
|
}
|
|
Parser.ZERO = function() {
|
|
return 0;
|
|
}, Parser.prototype = {
|
|
constructor: Parser,
|
|
parse: function(text, json) {
|
|
this.text = text, this.json = json, this.tokens = this.lexer.lex(text), json && (this.assignment = this.logicalOR, this.functionCall = this.fieldAccess = this.objectIndex = this.filterChain = function() {
|
|
this.throwError('is not valid json', {
|
|
text: text,
|
|
index: 0
|
|
});
|
|
});
|
|
var value = json ? this.primary() : 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() {
|
|
if (this.expect('(')) primary = this.filterChain(), this.consume(')');
|
|
else if (this.expect('[')) primary = this.arrayDeclaration();
|
|
else if (this.expect('{')) primary = this.object();
|
|
else {
|
|
var primary, next, context, token = this.expect();
|
|
(primary = token.fn) || this.throwError('not a primary expression', token), token.json && (primary.constant = !0, primary.literal = !0);
|
|
}
|
|
for(; 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) {
|
|
if (this.tokens.length > 0) {
|
|
var token = this.tokens[0], 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.json && !token.json && this.throwError('is not valid json', token), this.tokens.shift(), token);
|
|
},
|
|
consume: function(e1) {
|
|
this.expect(e1) || this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());
|
|
},
|
|
unaryFn: function(fn, right) {
|
|
return extend(function(self, locals) {
|
|
return fn(self, locals, right);
|
|
}, {
|
|
constant: right.constant
|
|
});
|
|
},
|
|
ternaryFn: function(left, middle, right) {
|
|
return extend(function(self, locals) {
|
|
return left(self, locals) ? middle(self, locals) : right(self, locals);
|
|
}, {
|
|
constant: left.constant && middle.constant && right.constant
|
|
});
|
|
},
|
|
binaryFn: function(left, fn, right) {
|
|
return extend(function(self, locals) {
|
|
return fn(self, locals, left, right);
|
|
}, {
|
|
constant: left.constant && right.constant
|
|
});
|
|
},
|
|
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; i < statements.length; i++){
|
|
var statement = statements[i];
|
|
statement && (value = statement(self, locals));
|
|
}
|
|
return value;
|
|
};
|
|
},
|
|
filterChain: function() {
|
|
for(var token, left = this.expression();;){
|
|
if (!(token = this.expect('|'))) return left;
|
|
left = this.binaryFn(left, token.fn, this.filter());
|
|
}
|
|
},
|
|
filter: function() {
|
|
for(var token = this.expect(), fn = this.$filter(token.text), argsFn = [];;)if (token = this.expect(':')) argsFn.push(this.expression());
|
|
else {
|
|
var fnInvoke = function(self, locals, input) {
|
|
for(var args = [
|
|
input
|
|
], i = 0; i < argsFn.length; i++)args.push(argsFn[i](self, locals));
|
|
return fn.apply(self, args);
|
|
};
|
|
return function() {
|
|
return fnInvoke;
|
|
};
|
|
}
|
|
},
|
|
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(), function(scope, locals) {
|
|
return left.assign(scope, right(scope, locals), locals);
|
|
}) : left;
|
|
},
|
|
ternary: function() {
|
|
var middle, token, left = this.logicalOR();
|
|
return (token = this.expect('?')) ? (middle = this.ternary(), token = this.expect(':')) ? this.ternaryFn(left, middle, this.ternary()) : void this.throwError('expected :', token) : left;
|
|
},
|
|
logicalOR: function() {
|
|
for(var token, left = this.logicalAND();;){
|
|
if (!(token = this.expect('||'))) return left;
|
|
left = this.binaryFn(left, token.fn, this.logicalAND());
|
|
}
|
|
},
|
|
logicalAND: function() {
|
|
var token, left = this.equality();
|
|
return (token = this.expect('&&')) && (left = this.binaryFn(left, token.fn, this.logicalAND())), left;
|
|
},
|
|
equality: function() {
|
|
var token, left = this.relational();
|
|
return (token = this.expect('==', '!=', '===', '!==')) && (left = this.binaryFn(left, token.fn, this.equality())), left;
|
|
},
|
|
relational: function() {
|
|
var token, left = this.additive();
|
|
return (token = this.expect('<', '>', '<=', '>=')) && (left = this.binaryFn(left, token.fn, this.relational())), left;
|
|
},
|
|
additive: function() {
|
|
for(var token, left = this.multiplicative(); token = this.expect('+', '-');)left = this.binaryFn(left, token.fn, this.multiplicative());
|
|
return left;
|
|
},
|
|
multiplicative: function() {
|
|
for(var token, left = this.unary(); token = this.expect('*', '/', '%');)left = this.binaryFn(left, token.fn, this.unary());
|
|
return left;
|
|
},
|
|
unary: function() {
|
|
var token;
|
|
return this.expect('+') ? this.primary() : (token = this.expect('-')) ? this.binaryFn(Parser.ZERO, token.fn, this.unary()) : (token = this.expect('!')) ? this.unaryFn(token.fn, this.unary()) : this.primary();
|
|
},
|
|
fieldAccess: function(object) {
|
|
var parser = this, field = this.expect().text, getter = getterFn(field, this.options, this.text);
|
|
return extend(function(scope, locals, self) {
|
|
return getter(self || object(scope, locals), locals);
|
|
}, {
|
|
assign: function(scope, value, locals) {
|
|
return setter(object(scope, locals), field, value, parser.text, parser.options);
|
|
}
|
|
});
|
|
},
|
|
objectIndex: function(obj) {
|
|
var parser = this, indexFn = this.expression();
|
|
return this.consume(']'), extend(function(self, locals) {
|
|
var v, p, o = obj(self, locals), i = indexFn(self, locals);
|
|
if (o) return (v = ensureSafeObject(o[i], parser.text)) && v.then && parser.options.unwrapPromises && (p = v, '$$v' in v || (p.$$v = undefined, p.then(function(val) {
|
|
p.$$v = val;
|
|
})), v = v.$$v), v;
|
|
}, {
|
|
assign: function(self, value, locals) {
|
|
var key = indexFn(self, locals), safe = ensureSafeObject(obj(self, locals), parser.text);
|
|
return safe[key] = value;
|
|
}
|
|
});
|
|
},
|
|
functionCall: function(fn, contextGetter) {
|
|
var argsFn = [];
|
|
if (')' !== this.peekToken().text) do argsFn.push(this.expression());
|
|
while (this.expect(','))
|
|
this.consume(')');
|
|
var parser = this;
|
|
return function(scope, locals) {
|
|
for(var args = [], context = contextGetter ? contextGetter(scope, locals) : scope, i = 0; i < argsFn.length; i++)args.push(argsFn[i](scope, locals));
|
|
var fnPtr = fn(scope, locals, context) || noop;
|
|
return ensureSafeObject(context, parser.text), ensureSafeObject(fnPtr, parser.text), ensureSafeObject(fnPtr.apply ? fnPtr.apply(context, args) : fnPtr(args[0], args[1], args[2], args[3], args[4]), parser.text);
|
|
};
|
|
},
|
|
arrayDeclaration: function() {
|
|
var elementFns = [], allConstant = !0;
|
|
if (']' !== this.peekToken().text) do {
|
|
var elementFn = this.expression();
|
|
elementFns.push(elementFn), elementFn.constant || (allConstant = !1);
|
|
}while (this.expect(','))
|
|
return this.consume(']'), extend(function(self, locals) {
|
|
for(var array = [], i = 0; i < elementFns.length; i++)array.push(elementFns[i](self, locals));
|
|
return array;
|
|
}, {
|
|
literal: !0,
|
|
constant: allConstant
|
|
});
|
|
},
|
|
object: function() {
|
|
var keyValues = [], allConstant = !0;
|
|
if ('}' !== this.peekToken().text) do {
|
|
var token = this.expect(), key = token.string || token.text;
|
|
this.consume(':');
|
|
var value = this.expression();
|
|
keyValues.push({
|
|
key: key,
|
|
value: value
|
|
}), value.constant || (allConstant = !1);
|
|
}while (this.expect(','))
|
|
return this.consume('}'), extend(function(self, locals) {
|
|
for(var object = {}, i = 0; i < keyValues.length; i++){
|
|
var keyValue = keyValues[i];
|
|
object[keyValue.key] = keyValue.value(self, locals);
|
|
}
|
|
return object;
|
|
}, {
|
|
literal: !0,
|
|
constant: allConstant
|
|
});
|
|
}
|
|
};
|
|
var getterFnCache = {};
|
|
function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {
|
|
return ensureSafeMemberName(key0, fullExp), ensureSafeMemberName(key1, fullExp), ensureSafeMemberName(key2, fullExp), ensureSafeMemberName(key3, fullExp), ensureSafeMemberName(key4, fullExp), options.unwrapPromises ? function(scope, locals) {
|
|
var promise, pathVal = locals && locals.hasOwnProperty(key0) ? locals : scope;
|
|
return null === pathVal || pathVal === undefined || ((pathVal = pathVal[key0]) && pathVal.then && (promiseWarning(fullExp), "$$v" in pathVal || ((promise = pathVal).$$v = undefined, promise.then(function(val) {
|
|
promise.$$v = val;
|
|
})), pathVal = pathVal.$$v), key1 && null !== pathVal && pathVal !== undefined && ((pathVal = pathVal[key1]) && pathVal.then && (promiseWarning(fullExp), "$$v" in pathVal || ((promise = pathVal).$$v = undefined, promise.then(function(val) {
|
|
promise.$$v = val;
|
|
})), pathVal = pathVal.$$v), key2 && null !== pathVal && pathVal !== undefined && ((pathVal = pathVal[key2]) && pathVal.then && (promiseWarning(fullExp), "$$v" in pathVal || ((promise = pathVal).$$v = undefined, promise.then(function(val) {
|
|
promise.$$v = val;
|
|
})), pathVal = pathVal.$$v), key3 && null !== pathVal && pathVal !== undefined && ((pathVal = pathVal[key3]) && pathVal.then && (promiseWarning(fullExp), "$$v" in pathVal || ((promise = pathVal).$$v = undefined, promise.then(function(val) {
|
|
promise.$$v = val;
|
|
})), pathVal = pathVal.$$v), key4 && null !== pathVal && pathVal !== undefined && (pathVal = pathVal[key4]) && pathVal.then && (promiseWarning(fullExp), "$$v" in pathVal || ((promise = pathVal).$$v = undefined, promise.then(function(val) {
|
|
promise.$$v = val;
|
|
})), pathVal = pathVal.$$v))))), pathVal;
|
|
} : function(scope, locals) {
|
|
var pathVal = locals && locals.hasOwnProperty(key0) ? locals : scope;
|
|
return null === pathVal || pathVal === undefined ? pathVal : (pathVal = pathVal[key0], key1 && null !== pathVal && pathVal !== undefined && (pathVal = pathVal[key1], key2 && null !== pathVal && pathVal !== undefined && (pathVal = pathVal[key2], key3 && null !== pathVal && pathVal !== undefined && (pathVal = pathVal[key3], key4 && null !== pathVal && pathVal !== undefined)))) ? pathVal = pathVal[key4] : pathVal;
|
|
};
|
|
}
|
|
function getterFn(path, options, fullExp) {
|
|
if (getterFnCache.hasOwnProperty(path)) return getterFnCache[path];
|
|
var fn, pathKeys = path.split('.'), pathKeysLength = pathKeys.length;
|
|
if (options.csp) fn = pathKeysLength < 6 ? cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp, options) : function(scope, locals) {
|
|
var val, i = 0;
|
|
do val = cspSafeGetterFn(pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++], fullExp, options)(scope, locals), locals = undefined, scope = val;
|
|
while (i < pathKeysLength)
|
|
return val;
|
|
};
|
|
else {
|
|
var code = 'var l, fn, p;\n';
|
|
forEach(pathKeys, function(key, index) {
|
|
ensureSafeMemberName(key, fullExp), code += "if(s === null || s === undefined) return s;\nl=s;\ns=" + (index ? 's' : '((k&&k.hasOwnProperty("' + key + '"))?k:s)') + '["' + key + '"];\n' + (options.unwrapPromises ? 'if (s && s.then) {\n pw("' + fullExp.replace(/(["\r\n])/g, '\\$1') + '");\n if (!("$$v" in s)) {\n p=s;\n p.$$v = undefined;\n p.then(function(v) {p.$$v=v;});\n}\n s=s.$$v\n}\n' : '');
|
|
}), code += 'return s;';
|
|
var evaledFnGetter = new Function('s', 'k', 'pw', code);
|
|
evaledFnGetter.toString = function() {
|
|
return code;
|
|
}, fn = function(scope, locals) {
|
|
return evaledFnGetter(scope, locals, promiseWarning);
|
|
};
|
|
}
|
|
return 'hasOwnProperty' !== path && (getterFnCache[path] = fn), fn;
|
|
}
|
|
function $ParseProvider() {
|
|
var cache = {}, $parseOptions = {
|
|
csp: !1,
|
|
unwrapPromises: !1,
|
|
logPromiseWarnings: !0
|
|
};
|
|
this.unwrapPromises = function(value) {
|
|
return isDefined(value) ? ($parseOptions.unwrapPromises = !!value, this) : $parseOptions.unwrapPromises;
|
|
}, this.logPromiseWarnings = function(value) {
|
|
return isDefined(value) ? ($parseOptions.logPromiseWarnings = value, this) : $parseOptions.logPromiseWarnings;
|
|
}, this.$get = [
|
|
'$filter',
|
|
'$sniffer',
|
|
'$log',
|
|
function($filter, $sniffer, $log) {
|
|
return $parseOptions.csp = $sniffer.csp, promiseWarning = function(fullExp) {
|
|
!$parseOptions.logPromiseWarnings || promiseWarningCache.hasOwnProperty(fullExp) || (promiseWarningCache[fullExp] = !0, $log.warn('[$parse] Promise found in the expression `' + fullExp + "`. Automatic unwrapping of promises in Angular expressions is deprecated."));
|
|
}, function(exp) {
|
|
var parsedExpression;
|
|
switch(typeof exp){
|
|
case 'string':
|
|
if (cache.hasOwnProperty(exp)) return cache[exp];
|
|
var lexer = new Lexer($parseOptions);
|
|
return parsedExpression = new Parser(lexer, $filter, $parseOptions).parse(exp, !1), 'hasOwnProperty' !== exp && (cache[exp] = parsedExpression), parsedExpression;
|
|
case 'function':
|
|
return exp;
|
|
default:
|
|
return noop;
|
|
}
|
|
};
|
|
}
|
|
];
|
|
}
|
|
function $QProvider() {
|
|
this.$get = [
|
|
'$rootScope',
|
|
'$exceptionHandler',
|
|
function($rootScope, $exceptionHandler) {
|
|
return qFactory(function(callback) {
|
|
$rootScope.$evalAsync(callback);
|
|
}, $exceptionHandler);
|
|
}
|
|
];
|
|
}
|
|
function qFactory(nextTick, exceptionHandler) {
|
|
var defer = function() {
|
|
var value1, deferred, pending = [];
|
|
return deferred = {
|
|
resolve: function(val) {
|
|
if (pending) {
|
|
var callbacks = pending;
|
|
pending = undefined, value1 = ref(val), callbacks.length && nextTick(function() {
|
|
for(var callback, i = 0, ii = callbacks.length; i < ii; i++)callback = callbacks[i], value1.then(callback[0], callback[1], callback[2]);
|
|
});
|
|
}
|
|
},
|
|
reject: function(reason) {
|
|
deferred.resolve(reject(reason));
|
|
},
|
|
notify: function(progress) {
|
|
if (pending) {
|
|
var callbacks = pending;
|
|
pending.length && nextTick(function() {
|
|
for(var i = 0, ii = callbacks.length; i < ii; i++)(0, callbacks[i])[2](progress);
|
|
});
|
|
}
|
|
},
|
|
promise: {
|
|
then: function(callback, errback, progressback) {
|
|
var result = defer(), wrappedCallback = function(value) {
|
|
try {
|
|
result.resolve((isFunction(callback) ? callback : defaultCallback)(value));
|
|
} catch (e) {
|
|
result.reject(e), exceptionHandler(e);
|
|
}
|
|
}, wrappedErrback = function(reason) {
|
|
try {
|
|
result.resolve((isFunction(errback) ? errback : defaultErrback)(reason));
|
|
} catch (e) {
|
|
result.reject(e), exceptionHandler(e);
|
|
}
|
|
}, wrappedProgressback = function(progress) {
|
|
try {
|
|
result.notify((isFunction(progressback) ? progressback : defaultCallback)(progress));
|
|
} catch (e) {
|
|
exceptionHandler(e);
|
|
}
|
|
};
|
|
return pending ? pending.push([
|
|
wrappedCallback,
|
|
wrappedErrback,
|
|
wrappedProgressback
|
|
]) : value1.then(wrappedCallback, wrappedErrback, wrappedProgressback), result.promise;
|
|
},
|
|
"catch": function(callback) {
|
|
return this.then(null, callback);
|
|
},
|
|
"finally": function(callback) {
|
|
function makePromise(value, resolved) {
|
|
var result = defer();
|
|
return resolved ? result.resolve(value) : result.reject(value), result.promise;
|
|
}
|
|
function handleCallback(value, isResolved) {
|
|
var callbackOutput = null;
|
|
try {
|
|
callbackOutput = (callback || defaultCallback)();
|
|
} catch (e) {
|
|
return makePromise(e, !1);
|
|
}
|
|
return callbackOutput && isFunction(callbackOutput.then) ? callbackOutput.then(function() {
|
|
return makePromise(value, isResolved);
|
|
}, function(error) {
|
|
return makePromise(error, !1);
|
|
}) : makePromise(value, isResolved);
|
|
}
|
|
return this.then(function(value) {
|
|
return handleCallback(value, !0);
|
|
}, function(error) {
|
|
return handleCallback(error, !1);
|
|
});
|
|
}
|
|
}
|
|
};
|
|
}, ref = function(value) {
|
|
return value && isFunction(value.then) ? value : {
|
|
then: function(callback) {
|
|
var result = defer();
|
|
return nextTick(function() {
|
|
result.resolve(callback(value));
|
|
}), result.promise;
|
|
}
|
|
};
|
|
}, reject = function(reason) {
|
|
return {
|
|
then: function(callback, errback) {
|
|
var result = defer();
|
|
return nextTick(function() {
|
|
try {
|
|
result.resolve((isFunction(errback) ? errback : defaultErrback)(reason));
|
|
} catch (e) {
|
|
result.reject(e), exceptionHandler(e);
|
|
}
|
|
}), result.promise;
|
|
}
|
|
};
|
|
};
|
|
function defaultCallback(value) {
|
|
return value;
|
|
}
|
|
function defaultErrback(reason) {
|
|
return reject(reason);
|
|
}
|
|
return {
|
|
defer: defer,
|
|
reject: reject,
|
|
when: function(value2, callback, errback, progressback) {
|
|
var done, result = defer(), wrappedCallback = function(value) {
|
|
try {
|
|
return (isFunction(callback) ? callback : defaultCallback)(value);
|
|
} catch (e) {
|
|
return exceptionHandler(e), reject(e);
|
|
}
|
|
}, wrappedErrback = function(reason) {
|
|
try {
|
|
return (isFunction(errback) ? errback : defaultErrback)(reason);
|
|
} catch (e) {
|
|
return exceptionHandler(e), reject(e);
|
|
}
|
|
}, wrappedProgressback = function(progress) {
|
|
try {
|
|
return (isFunction(progressback) ? progressback : defaultCallback)(progress);
|
|
} catch (e) {
|
|
exceptionHandler(e);
|
|
}
|
|
};
|
|
return nextTick(function() {
|
|
ref(value2).then(function(value) {
|
|
done || (done = !0, result.resolve(ref(value).then(wrappedCallback, wrappedErrback, wrappedProgressback)));
|
|
}, function(reason) {
|
|
done || (done = !0, result.resolve(wrappedErrback(reason)));
|
|
}, function(progress) {
|
|
done || result.notify(wrappedProgressback(progress));
|
|
});
|
|
}), result.promise;
|
|
},
|
|
all: function(promises) {
|
|
var deferred = defer(), counter = 0, results = isArray(promises) ? [] : {};
|
|
return forEach(promises, function(promise, key) {
|
|
counter++, ref(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;
|
|
}
|
|
};
|
|
}
|
|
function $RootScopeProvider() {
|
|
var TTL = 10, $rootScopeMinErr = minErr('$rootScope'), lastDirtyWatch = 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.this = this.$root = this, this.$$destroyed = !1, this.$$asyncQueue = [], this.$$postDigestQueue = [], this.$$listeners = {}, this.$$isolateBindings = {};
|
|
}
|
|
Scope.prototype = {
|
|
constructor: Scope,
|
|
$new: function(isolate) {
|
|
var ChildScope, child;
|
|
return isolate ? ((child = new Scope()).$root = this.$root, child.$$asyncQueue = this.$$asyncQueue, child.$$postDigestQueue = this.$$postDigestQueue) : ((ChildScope = function() {}).prototype = this, (child = new ChildScope()).$id = nextUid()), child.this = child, child.$$listeners = {}, child.$parent = this, child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null, child.$$prevSibling = this.$$childTail, this.$$childHead ? (this.$$childTail.$$nextSibling = child, this.$$childTail = child) : this.$$childHead = this.$$childTail = child, child;
|
|
},
|
|
$watch: function(watchExp, listener, objectEquality) {
|
|
var scope2 = this, get = compileToFn(watchExp, 'watch'), array = scope2.$$watchers, watcher = {
|
|
fn: listener,
|
|
last: initWatchVal,
|
|
get: get,
|
|
exp: watchExp,
|
|
eq: !!objectEquality
|
|
};
|
|
if (lastDirtyWatch = null, !isFunction(listener)) {
|
|
var listenFn = compileToFn(listener || noop, 'listener');
|
|
watcher.fn = function(newVal, oldVal, scope) {
|
|
listenFn(scope);
|
|
};
|
|
}
|
|
if ('string' == typeof watchExp && get.constant) {
|
|
var originalFn = watcher.fn;
|
|
watcher.fn = function(newVal, oldVal, scope) {
|
|
originalFn.call(this, newVal, oldVal, scope), arrayRemove(array, watcher);
|
|
};
|
|
}
|
|
return array || (array = scope2.$$watchers = []), array.unshift(watcher), function() {
|
|
arrayRemove(array, watcher);
|
|
};
|
|
},
|
|
$watchCollection: function(obj, listener) {
|
|
var oldValue, newValue, self = this, changeDetected = 0, objGetter = $parse(obj), internalArray = [], internalObject = {}, oldLength = 0;
|
|
return this.$watch(function() {
|
|
if (isObject(newValue = objGetter(self))) {
|
|
if (isArrayLike(newValue)) {
|
|
oldValue !== internalArray && (oldLength = (oldValue = internalArray).length = 0, changeDetected++), oldLength !== (newLength = newValue.length) && (changeDetected++, oldValue.length = oldLength = newLength);
|
|
for(var newLength, key, i = 0; i < newLength; i++)oldValue[i] !== newValue[i] && (changeDetected++, oldValue[i] = newValue[i]);
|
|
} else {
|
|
for(key in oldValue !== internalObject && (oldValue = internalObject = {}, oldLength = 0, changeDetected++), newLength = 0, newValue)newValue.hasOwnProperty(key) && (newLength++, oldValue.hasOwnProperty(key) ? oldValue[key] !== newValue[key] && (changeDetected++, oldValue[key] = newValue[key]) : (oldLength++, oldValue[key] = newValue[key], changeDetected++));
|
|
if (oldLength > newLength) for(key in changeDetected++, oldValue)oldValue.hasOwnProperty(key) && !newValue.hasOwnProperty(key) && (oldLength--, delete oldValue[key]);
|
|
}
|
|
} else oldValue !== newValue && (oldValue = newValue, changeDetected++);
|
|
return changeDetected;
|
|
}, function() {
|
|
listener(newValue, oldValue, self);
|
|
});
|
|
},
|
|
$digest: function() {
|
|
var watch, value, last, watchers, length, dirty, next, current, logIdx, logMsg, asyncTask, asyncQueue = this.$$asyncQueue, postDigestQueue = this.$$postDigestQueue, ttl = TTL, watchLog = [];
|
|
beginPhase('$digest'), lastDirtyWatch = null;
|
|
do {
|
|
for(dirty = !1, current = this; asyncQueue.length;){
|
|
try {
|
|
(asyncTask = asyncQueue.shift()).scope.$eval(asyncTask.expression);
|
|
} catch (e) {
|
|
clearPhase(), $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) : value, watch.fn(value, last === initWatchVal ? value : last, current), ttl < 5 && (watchLog[logIdx = 4 - ttl] || (watchLog[logIdx] = []), logMsg = isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp, logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last), watchLog[logIdx].push(logMsg));
|
|
}
|
|
} catch (e) {
|
|
clearPhase(), $exceptionHandler(e);
|
|
}
|
|
if (!(next = current.$$childHead || current !== this && current.$$nextSibling)) for(; current !== this && !(next = current.$$nextSibling);)current = current.$parent;
|
|
}while (current = next)
|
|
if (dirty && !ttl--) throw clearPhase(), $rootScopeMinErr('infdig', "{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}", TTL, toJson(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;
|
|
this.$broadcast('$destroy'), this.$$destroyed = !0, this !== $rootScope && (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.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = this.$$childTail = null);
|
|
}
|
|
},
|
|
$eval: function(expr, locals) {
|
|
return $parse(expr)(this, locals);
|
|
},
|
|
$evalAsync: function(expr) {
|
|
$rootScope.$$phase || $rootScope.$$asyncQueue.length || $browser.defer(function() {
|
|
$rootScope.$$asyncQueue.length && $rootScope.$digest();
|
|
}), this.$$asyncQueue.push({
|
|
scope: this,
|
|
expression: expr
|
|
});
|
|
},
|
|
$$postDigest: function(fn) {
|
|
this.$$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;
|
|
}
|
|
}
|
|
},
|
|
$on: function(name, listener) {
|
|
var namedListeners = this.$$listeners[name];
|
|
return namedListeners || (this.$$listeners[name] = namedListeners = []), namedListeners.push(listener), function() {
|
|
namedListeners[indexOf(namedListeners, listener)] = null;
|
|
};
|
|
},
|
|
$emit: function(name, args) {
|
|
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 = concat1([
|
|
event
|
|
], arguments, 1);
|
|
do {
|
|
for(i = 0, namedListeners = scope.$$listeners[name] || empty, event.currentScope = scope, length = namedListeners.length; i < length; i++){
|
|
if (!namedListeners[i]) {
|
|
namedListeners.splice(i, 1), i--, length--;
|
|
continue;
|
|
}
|
|
try {
|
|
namedListeners[i].apply(null, listenerArgs);
|
|
} catch (e) {
|
|
$exceptionHandler(e);
|
|
}
|
|
}
|
|
if (stopPropagation) return event;
|
|
scope = scope.$parent;
|
|
}while (scope)
|
|
return event;
|
|
},
|
|
$broadcast: function(name, args) {
|
|
var listeners, i, length, target = this, current = target, next = target, event = {
|
|
name: name,
|
|
targetScope: target,
|
|
preventDefault: function() {
|
|
event.defaultPrevented = !0;
|
|
},
|
|
defaultPrevented: !1
|
|
}, listenerArgs = concat1([
|
|
event
|
|
], arguments, 1);
|
|
do {
|
|
for(i = 0, current = next, event.currentScope = current, length = (listeners = current.$$listeners[name] || []).length; i < length; i++){
|
|
if (!listeners[i]) {
|
|
listeners.splice(i, 1), i--, length--;
|
|
continue;
|
|
}
|
|
try {
|
|
listeners[i].apply(null, listenerArgs);
|
|
} catch (e) {
|
|
$exceptionHandler(e);
|
|
}
|
|
}
|
|
if (!(next = current.$$childHead || current !== target && current.$$nextSibling)) for(; current !== target && !(next = current.$$nextSibling);)current = current.$parent;
|
|
}while (current = next)
|
|
return event;
|
|
}
|
|
};
|
|
var $rootScope = new Scope();
|
|
return $rootScope;
|
|
function beginPhase(phase) {
|
|
if ($rootScope.$$phase) throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);
|
|
$rootScope.$$phase = phase;
|
|
}
|
|
function clearPhase() {
|
|
$rootScope.$$phase = null;
|
|
}
|
|
function compileToFn(exp, name) {
|
|
var fn = $parse(exp);
|
|
return assertArgFn(fn, name), fn;
|
|
}
|
|
function initWatchVal() {}
|
|
}
|
|
];
|
|
}
|
|
function $$SanitizeUriProvider() {
|
|
var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, imgSrcSanitizationWhitelist = /^\s*(https?|ftp|file):|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;
|
|
return msie && !(msie >= 8) || '' === (normalizedVal = urlResolve(uri).href) || normalizedVal.match(isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist) ? uri : 'unsafe:' + normalizedVal;
|
|
};
|
|
};
|
|
}
|
|
var $sceMinErr = minErr('$sce'), SCE_CONTEXTS = {
|
|
HTML: 'html',
|
|
CSS: 'css',
|
|
URL: 'url',
|
|
RESOURCE_URL: 'resourceUrl',
|
|
JS: 'js'
|
|
};
|
|
function adjustMatchers(matchers) {
|
|
var adjustedMatchers = [];
|
|
return isDefined(matchers) && forEach(matchers, function(matcher1) {
|
|
adjustedMatchers.push(function(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 = matcher.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1').replace(/\x08/g, '\\x08').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');
|
|
}(matcher1));
|
|
}), 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) {
|
|
var htmlSanitizer = function(html) {
|
|
throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');
|
|
};
|
|
function matchUrl(matcher, parsedUrl) {
|
|
return 'self' === matcher ? urlIsSameOrigin(parsedUrl) : !!matcher.exec(parsedUrl.href);
|
|
}
|
|
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;
|
|
}
|
|
$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: function(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);
|
|
},
|
|
getTrusted: function(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 (function(url) {
|
|
var i, n, parsedUrl = urlResolve(url.toString()), allowed = !1;
|
|
for(i = 0, n = resourceUrlWhitelist.length; i < n; i++)if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) {
|
|
allowed = !0;
|
|
break;
|
|
}
|
|
if (allowed) {
|
|
for(i = 0, n = resourceUrlBlacklist.length; i < n; i++)if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) {
|
|
allowed = !1;
|
|
break;
|
|
}
|
|
}
|
|
return allowed;
|
|
}(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.');
|
|
},
|
|
valueOf: function(maybeTrusted) {
|
|
return maybeTrusted instanceof trustedValueHolderBase ? maybeTrusted.$$unwrapTrustedValue() : maybeTrusted;
|
|
}
|
|
};
|
|
}
|
|
];
|
|
}
|
|
function $SceProvider() {
|
|
var enabled = !0;
|
|
this.enabled = function(value) {
|
|
return arguments.length && (enabled = !!value), enabled;
|
|
}, this.$get = [
|
|
'$parse',
|
|
'$sniffer',
|
|
'$sceDelegate',
|
|
function($parse, $sniffer, $sceDelegate) {
|
|
if (enabled && $sniffer.msie && $sniffer.msieDocumentMode < 8) throw $sceMinErr('iequirks', "Strict Contextual Escaping does not support Internet Explorer version < 9 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 = copy(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 : function(self, locals) {
|
|
return sce.getTrusted(type, parsed(self, locals));
|
|
};
|
|
};
|
|
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] || {}, documentMode = document.documentMode, vendorRegex = /^(Moz|webkit|O|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 = (vendorPrefix = match[0]).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 && !(android < 4) && !boxee),
|
|
hashchange: 'onhashchange' in $window && (!documentMode || documentMode > 7),
|
|
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,
|
|
msie: msie,
|
|
msieDocumentMode: documentMode
|
|
};
|
|
}
|
|
];
|
|
}
|
|
function $TimeoutProvider() {
|
|
this.$get = [
|
|
'$rootScope',
|
|
'$browser',
|
|
'$q',
|
|
'$exceptionHandler',
|
|
function($rootScope, $browser, $q, $exceptionHandler) {
|
|
var deferreds = {};
|
|
function timeout(fn, delay, invokeApply) {
|
|
var timeoutId, deferred = $q.defer(), promise = deferred.promise, skipApply = isDefined(invokeApply) && !invokeApply;
|
|
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;
|
|
}
|
|
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));
|
|
}, timeout;
|
|
}
|
|
];
|
|
}
|
|
var urlParsingNode = document1.createElement("a"), originUrl = urlResolve(window1.location.href, !0);
|
|
function urlResolve(url, base) {
|
|
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 = valueFn1(window1);
|
|
}
|
|
function $FilterProvider($provide) {
|
|
var suffix = 'Filter';
|
|
function register(name, factory) {
|
|
if (!isObject(name)) return $provide.factory(name + suffix, factory);
|
|
var filters = {};
|
|
return forEach(name, function(filter, key) {
|
|
filters[key] = register(key, filter);
|
|
}), filters;
|
|
}
|
|
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) {
|
|
for(var j = 0; j < predicates.length; j++)if (!predicates[j](value)) return !1;
|
|
return !0;
|
|
}, 'function' !== comparatorType && (comparator = 'boolean' === comparatorType && comparator ? function(obj, text) {
|
|
return angular1.equals(obj, text);
|
|
} : function(obj, text) {
|
|
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":
|
|
if ("object" == typeof text) return comparator(obj, text);
|
|
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)'$' == key ? function() {
|
|
if (expression[key]) {
|
|
var path = key;
|
|
predicates.push(function(value) {
|
|
return search(value, expression[path]);
|
|
});
|
|
}
|
|
}() : function() {
|
|
if (void 0 !== expression[key]) {
|
|
var path = key;
|
|
predicates.push(function(value) {
|
|
return search(getter1(value, path), expression[path]);
|
|
});
|
|
}
|
|
}();
|
|
break;
|
|
case 'function':
|
|
predicates.push(expression);
|
|
break;
|
|
default:
|
|
return array;
|
|
}
|
|
for(var filtered = [], j1 = 0; j1 < array.length; j1++){
|
|
var value3 = array[j1];
|
|
predicates.check(value3) && filtered.push(value3);
|
|
}
|
|
return filtered;
|
|
};
|
|
}
|
|
function currencyFilter($locale) {
|
|
var formats = $locale.NUMBER_FORMATS;
|
|
return function(amount, currencySymbol) {
|
|
return isUndefined(currencySymbol) && (currencySymbol = formats.CURRENCY_SYM), formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2).replace(/\u00A4/g, currencySymbol);
|
|
};
|
|
}
|
|
function numberFilter($locale) {
|
|
var formats = $locale.NUMBER_FORMATS;
|
|
return function(number, fractionSize) {
|
|
return formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize);
|
|
};
|
|
}
|
|
$FilterProvider.$inject = [
|
|
'$provide'
|
|
], currencyFilter.$inject = [
|
|
'$locale'
|
|
], numberFilter.$inject = [
|
|
'$locale'
|
|
];
|
|
var DECIMAL_SEP = '.';
|
|
function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
if (isNaN(number) || !isFinite(number)) return '';
|
|
var isNegative = number < 0, numStr = (number = Math.abs(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' : (formatedText = numStr, hasExponent = !0);
|
|
}
|
|
if (hasExponent) fractionSize > 0 && number > -1 && number < 1 && (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));
|
|
var pow = Math.pow(10, fractionSize), fraction = ('' + (number = Math.round(number * pow) / pow)).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(i = 0, pos = whole.length - lgroup; i < pos; 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), parts.push(formatedText), parts.push(isNegative ? pattern.negSuf : pattern.posSuf), parts.join('');
|
|
}
|
|
function padNumber(num, digits, trim) {
|
|
var neg = '';
|
|
for(num < 0 && (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]();
|
|
return formats[uppercase(shortForm ? 'SHORT' + name : name)][value];
|
|
};
|
|
}
|
|
var 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: function(date, formats) {
|
|
return 12 > date.getHours() ? formats.AMPMS[0] : formats.AMPMS[1];
|
|
},
|
|
Z: function(date) {
|
|
var zone = -1 * date.getTimezoneOffset();
|
|
return (zone >= 0 ? "+" : "") + (padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + padNumber(Math.abs(zone % 60), 2));
|
|
}
|
|
}, DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/, NUMBER_STRING = /^\-?\d+$/;
|
|
function dateFilter($locale) {
|
|
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(date1, format) {
|
|
var fn, match1, text = '', parts = [];
|
|
if (format = format || 'mediumDate', format = $locale.DATETIME_FORMATS[format] || format, isString(date1) && (date1 = NUMBER_STRING.test(date1) ? int(date1) : function(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(1000 * parseFloat('0.' + (match[7] || 0)));
|
|
return timeSetter.call(date, h, m, s, ms), date;
|
|
}
|
|
return string;
|
|
}(date1)), isNumber(date1) && (date1 = new Date(date1)), !isDate(date1)) return date1;
|
|
for(; format;)(match1 = DATE_FORMATS_SPLIT.exec(format)) ? format = (parts = concat1(parts, match1, 1)).pop() : (parts.push(format), format = null);
|
|
return forEach(parts, function(value) {
|
|
text += (fn = DATE_FORMATS[value]) ? fn(date1, $locale.DATETIME_FORMATS) : value.replace(/(^'|'$)/g, '').replace(/''/g, "'");
|
|
}), text;
|
|
};
|
|
}
|
|
function jsonFilter() {
|
|
return function(object) {
|
|
return toJson(object, !0);
|
|
};
|
|
}
|
|
dateFilter.$inject = [
|
|
'$locale'
|
|
];
|
|
var lowercaseFilter = valueFn1(lowercase), uppercaseFilter = valueFn1(uppercase);
|
|
function limitToFilter() {
|
|
return function(input, limit) {
|
|
if (!isArray(input) && !isString(input)) return input;
|
|
if (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); i < n; i++)out.push(input[i]);
|
|
return out;
|
|
};
|
|
}
|
|
function orderByFilter($parse) {
|
|
return function(array, sortPredicate, reverseOrder) {
|
|
if (!isArray(array)) return array;
|
|
if (!sortPredicate) return array;
|
|
sortPredicate = function(obj, iterator, context) {
|
|
var results = [];
|
|
return forEach(obj, function(value, index, list) {
|
|
results.push(iterator.call(void 0, value, index, list));
|
|
}), results;
|
|
}(sortPredicate = isArray(sortPredicate) ? sortPredicate : [
|
|
sortPredicate
|
|
], function(predicate) {
|
|
var descending = !1, get = predicate || identity;
|
|
return isString(predicate) && (('+' == predicate.charAt(0) || '-' == predicate.charAt(0)) && (descending = '-' == predicate.charAt(0), predicate = predicate.substring(1)), get = $parse(predicate)), reverseComparator(function(a, b) {
|
|
return compare(get(a), get(b));
|
|
}, descending);
|
|
});
|
|
for(var arrayCopy = [], i3 = 0; i3 < array.length; i3++)arrayCopy.push(array[i3]);
|
|
return arrayCopy.sort(reverseComparator(function(o1, o2) {
|
|
for(var i = 0; i < sortPredicate.length; i++){
|
|
var comp = sortPredicate[i](o1, o2);
|
|
if (0 !== comp) return comp;
|
|
}
|
|
return 0;
|
|
}, reverseOrder));
|
|
function reverseComparator(comp, descending) {
|
|
return toBoolean(descending) ? function(a, b) {
|
|
return comp(b, a);
|
|
} : comp;
|
|
}
|
|
function compare(v1, v2) {
|
|
var t1 = typeof v1, t2 = typeof v2;
|
|
return t1 != t2 ? t1 < t2 ? -1 : 1 : ("string" == t1 && (v1 = v1.toLowerCase(), v2 = v2.toLowerCase()), v1 === v2) ? 0 : v1 < v2 ? -1 : 1;
|
|
}
|
|
};
|
|
}
|
|
function ngDirective(directive) {
|
|
return isFunction(directive) && (directive = {
|
|
link: directive
|
|
}), directive.restrict = directive.restrict || 'AC', valueFn1(directive);
|
|
}
|
|
orderByFilter.$inject = [
|
|
'$parse'
|
|
];
|
|
var htmlAnchorDirective = valueFn1({
|
|
restrict: 'E',
|
|
compile: function(element6, attr) {
|
|
if (msie <= 8 && (attr.href || attr.name || attr.$set('href', ''), element6.append(document1.createComment('IE fix'))), !attr.href && !attr.name) return function(scope, element) {
|
|
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 {
|
|
priority: 100,
|
|
compile: function() {
|
|
return function(scope, element, attr) {
|
|
scope.$watch(attr[normalized], function(value) {
|
|
attr.$set(attrName, !!value);
|
|
});
|
|
};
|
|
}
|
|
};
|
|
};
|
|
}
|
|
}), forEach([
|
|
'src',
|
|
'srcset',
|
|
'href'
|
|
], function(attrName) {
|
|
var normalized = directiveNormalize('ng-' + attrName);
|
|
ngAttributeAliasDirectives[normalized] = function() {
|
|
return {
|
|
priority: 99,
|
|
link: function(scope, element, attr) {
|
|
attr.$observe(normalized, function(value) {
|
|
value && (attr.$set(attrName, value), msie && element.prop(attrName, attr[attrName]));
|
|
});
|
|
}
|
|
};
|
|
};
|
|
});
|
|
var nullFormCtrl = {
|
|
$addControl: noop,
|
|
$removeControl: noop,
|
|
$setValidity: noop,
|
|
$setDirty: noop,
|
|
$setPristine: noop
|
|
};
|
|
function FormController(element, attrs) {
|
|
var form = this, parentForm = element.parent().controller('form') || nullFormCtrl, invalidCount = 0, errors = form.$error = {}, controls = [];
|
|
function toggleValidCss(isValid, validationErrorKey) {
|
|
validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '', element.removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey).addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);
|
|
}
|
|
form.$name = attrs.name || attrs.ngForm, form.$dirty = !1, form.$pristine = !0, form.$valid = !0, form.$invalid = !1, parentForm.$addControl(form), element.addClass(PRISTINE_CLASS), toggleValidCss(!0), form.$addControl = function(control) {
|
|
assertNotHasOwnProperty(control.$name, 'input'), controls.push(control), control.$name && (form[control.$name] = control);
|
|
}, form.$removeControl = function(control) {
|
|
control.$name && form[control.$name] === control && delete form[control.$name], forEach(errors, function(queue, validationToken) {
|
|
form.$setValidity(validationToken, !0, control);
|
|
}), arrayRemove(controls, control);
|
|
}, form.$setValidity = function(validationToken, isValid, control) {
|
|
var queue = errors[validationToken];
|
|
if (isValid) queue && (arrayRemove(queue, control), queue.length || (--invalidCount || (toggleValidCss(isValid), form.$valid = !0, form.$invalid = !1), errors[validationToken] = !1, toggleValidCss(!0, validationToken), parentForm.$setValidity(validationToken, !0, form)));
|
|
else {
|
|
if (invalidCount || toggleValidCss(isValid), queue) {
|
|
if (-1 != indexOf(queue, control)) return;
|
|
} else errors[validationToken] = queue = [], invalidCount++, toggleValidCss(!1, validationToken), parentForm.$setValidity(validationToken, !1, form);
|
|
queue.push(control), form.$valid = !1, form.$invalid = !0;
|
|
}
|
|
}, form.$setDirty = function() {
|
|
element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS), form.$dirty = !0, form.$pristine = !1, parentForm.$setDirty();
|
|
}, form.$setPristine = function() {
|
|
element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS), form.$dirty = !1, form.$pristine = !0, forEach(controls, function(control) {
|
|
control.$setPristine();
|
|
});
|
|
};
|
|
}
|
|
FormController.$inject = [
|
|
'$element',
|
|
'$attrs',
|
|
'$scope'
|
|
];
|
|
var formDirectiveFactory = function(isNgForm) {
|
|
return [
|
|
'$timeout',
|
|
function($timeout) {
|
|
return {
|
|
name: 'form',
|
|
restrict: isNgForm ? 'EAC' : 'E',
|
|
controller: FormController,
|
|
compile: function() {
|
|
return {
|
|
pre: function(scope, formElement, attr, controller) {
|
|
if (!attr.action) {
|
|
var preventDefaultListener = function(event) {
|
|
event.preventDefault ? event.preventDefault() : event.returnValue = !1;
|
|
};
|
|
addEventListenerFn(formElement[0], 'submit', preventDefaultListener), formElement.on('$destroy', function() {
|
|
$timeout(function() {
|
|
removeEventListenerFn(formElement[0], 'submit', preventDefaultListener);
|
|
}, 0, !1);
|
|
});
|
|
}
|
|
var parentFormCtrl = formElement.parent().controller('form'), alias = attr.name || attr.ngForm;
|
|
alias && setter(scope, alias, controller, alias), parentFormCtrl && formElement.on('$destroy', function() {
|
|
parentFormCtrl.$removeControl(controller), alias && setter(scope, alias, undefined, alias), extend(controller, nullFormCtrl);
|
|
});
|
|
}
|
|
};
|
|
}
|
|
};
|
|
}
|
|
];
|
|
}, formDirective = formDirectiveFactory(), ngFormDirective = formDirectiveFactory(!0), URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/, EMAIL_REGEXP = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/, NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/, inputType = {
|
|
text: textInputType,
|
|
number: function(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
if (textInputType(scope, element, attr, ctrl, $sniffer, $browser), ctrl.$parsers.push(function(value) {
|
|
var empty = ctrl.$isEmpty(value);
|
|
if (empty || NUMBER_REGEXP.test(value)) return ctrl.$setValidity('number', !0), '' === value ? null : empty ? value : parseFloat(value);
|
|
ctrl.$setValidity('number', !1);
|
|
}), ctrl.$formatters.push(function(value) {
|
|
return ctrl.$isEmpty(value) ? '' : '' + value;
|
|
}), attr.min) {
|
|
var minValidator = function(value) {
|
|
var min = parseFloat(attr.min);
|
|
if (ctrl.$isEmpty(value) || !(value < min)) return ctrl.$setValidity('min', !0), value;
|
|
ctrl.$setValidity('min', !1);
|
|
};
|
|
ctrl.$parsers.push(minValidator), ctrl.$formatters.push(minValidator);
|
|
}
|
|
if (attr.max) {
|
|
var maxValidator = function(value) {
|
|
var max = parseFloat(attr.max);
|
|
if (ctrl.$isEmpty(value) || !(value > max)) return ctrl.$setValidity('max', !0), value;
|
|
ctrl.$setValidity('max', !1);
|
|
};
|
|
ctrl.$parsers.push(maxValidator), ctrl.$formatters.push(maxValidator);
|
|
}
|
|
ctrl.$formatters.push(function(value) {
|
|
if (ctrl.$isEmpty(value) || isNumber(value)) return ctrl.$setValidity('number', !0), value;
|
|
ctrl.$setValidity('number', !1);
|
|
});
|
|
},
|
|
url: function(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
textInputType(scope, element, attr, ctrl, $sniffer, $browser);
|
|
var urlValidator = function(value) {
|
|
if (ctrl.$isEmpty(value) || URL_REGEXP.test(value)) return ctrl.$setValidity('url', !0), value;
|
|
ctrl.$setValidity('url', !1);
|
|
};
|
|
ctrl.$formatters.push(urlValidator), ctrl.$parsers.push(urlValidator);
|
|
},
|
|
email: function(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
textInputType(scope, element, attr, ctrl, $sniffer, $browser);
|
|
var emailValidator = function(value) {
|
|
if (ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value)) return ctrl.$setValidity('email', !0), value;
|
|
ctrl.$setValidity('email', !1);
|
|
};
|
|
ctrl.$formatters.push(emailValidator), ctrl.$parsers.push(emailValidator);
|
|
},
|
|
radio: function(scope, element, attr, ctrl) {
|
|
isUndefined(attr.name) && element.attr('name', nextUid()), element.on('click', function() {
|
|
element[0].checked && scope.$apply(function() {
|
|
ctrl.$setViewValue(attr.value);
|
|
});
|
|
}), ctrl.$render = function() {
|
|
var value = attr.value;
|
|
element[0].checked = value == ctrl.$viewValue;
|
|
}, attr.$observe('value', ctrl.$render);
|
|
},
|
|
checkbox: function(scope, element, attr, ctrl) {
|
|
var trueValue = attr.ngTrueValue, falseValue = attr.ngFalseValue;
|
|
isString(trueValue) || (trueValue = !0), isString(falseValue) || (falseValue = !1), element.on('click', function() {
|
|
scope.$apply(function() {
|
|
ctrl.$setViewValue(element[0].checked);
|
|
});
|
|
}), ctrl.$render = function() {
|
|
element[0].checked = ctrl.$viewValue;
|
|
}, ctrl.$isEmpty = function(value) {
|
|
return value !== trueValue;
|
|
}, ctrl.$formatters.push(function(value) {
|
|
return value === trueValue;
|
|
}), ctrl.$parsers.push(function(value) {
|
|
return value ? trueValue : falseValue;
|
|
});
|
|
},
|
|
hidden: noop,
|
|
button: noop,
|
|
submit: noop,
|
|
reset: noop
|
|
};
|
|
function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
var composing = !1;
|
|
element.on('compositionstart', function() {
|
|
composing = !0;
|
|
}), element.on('compositionend', function() {
|
|
composing = !1;
|
|
});
|
|
var listener = function() {
|
|
if (!composing) {
|
|
var value = element.val();
|
|
toBoolean(attr.ngTrim || 'T') && (value = trim1(value)), ctrl.$viewValue !== value && scope.$apply(function() {
|
|
ctrl.$setViewValue(value);
|
|
});
|
|
}
|
|
};
|
|
if ($sniffer.hasEvent('input')) element.on('input', listener);
|
|
else {
|
|
var timeout, deferListener = function() {
|
|
timeout || (timeout = $browser.defer(function() {
|
|
listener(), timeout = null;
|
|
}));
|
|
};
|
|
element.on('keydown', function(event) {
|
|
var key = event.keyCode;
|
|
91 === key || 15 < key && key < 19 || 37 <= key && key <= 40 || deferListener();
|
|
}), $sniffer.hasEvent('paste') && element.on('paste cut', deferListener);
|
|
}
|
|
element.on('change', listener), ctrl.$render = function() {
|
|
element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);
|
|
};
|
|
var patternValidator, match, pattern = attr.ngPattern, validate = function(regexp, value) {
|
|
if (ctrl.$isEmpty(value) || regexp.test(value)) return ctrl.$setValidity('pattern', !0), value;
|
|
ctrl.$setValidity('pattern', !1);
|
|
};
|
|
if (pattern && ((match = pattern.match(/^\/(.*)\/([gim]*)$/)) ? (pattern = new RegExp(match[1], match[2]), patternValidator = function(value) {
|
|
return validate(pattern, value);
|
|
}) : patternValidator = function(value) {
|
|
var patternObj = scope.$eval(pattern);
|
|
if (!patternObj || !patternObj.test) throw minErr('ngPattern')('noregexp', 'Expected {0} to be a RegExp but was {1}. Element: {2}', pattern, patternObj, startingTag(element));
|
|
return validate(patternObj, value);
|
|
}, ctrl.$formatters.push(patternValidator), ctrl.$parsers.push(patternValidator)), attr.ngMinlength) {
|
|
var minlength = int(attr.ngMinlength), minLengthValidator = function(value) {
|
|
if (ctrl.$isEmpty(value) || !(value.length < minlength)) return ctrl.$setValidity('minlength', !0), value;
|
|
ctrl.$setValidity('minlength', !1);
|
|
};
|
|
ctrl.$parsers.push(minLengthValidator), ctrl.$formatters.push(minLengthValidator);
|
|
}
|
|
if (attr.ngMaxlength) {
|
|
var maxlength = int(attr.ngMaxlength), maxLengthValidator = function(value) {
|
|
if (ctrl.$isEmpty(value) || !(value.length > maxlength)) return ctrl.$setValidity('maxlength', !0), value;
|
|
ctrl.$setValidity('maxlength', !1);
|
|
};
|
|
ctrl.$parsers.push(maxLengthValidator), ctrl.$formatters.push(maxLengthValidator);
|
|
}
|
|
}
|
|
var inputDirective = [
|
|
'$browser',
|
|
'$sniffer',
|
|
function($browser, $sniffer) {
|
|
return {
|
|
restrict: 'E',
|
|
require: '?ngModel',
|
|
link: function(scope, element, attr, ctrl) {
|
|
ctrl && (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrl, $sniffer, $browser);
|
|
}
|
|
};
|
|
}
|
|
], VALID_CLASS = 'ng-valid', INVALID_CLASS = 'ng-invalid', PRISTINE_CLASS = 'ng-pristine', DIRTY_CLASS = 'ng-dirty', NgModelController = [
|
|
'$scope',
|
|
'$exceptionHandler',
|
|
'$attrs',
|
|
'$element',
|
|
'$parse',
|
|
function($scope, $exceptionHandler, $attr, $element, $parse) {
|
|
this.$viewValue = Number.NaN, this.$modelValue = Number.NaN, this.$parsers = [], this.$formatters = [], this.$viewChangeListeners = [], this.$pristine = !0, this.$dirty = !1, this.$valid = !0, this.$invalid = !1, this.$name = $attr.name;
|
|
var ngModelGet = $parse($attr.ngModel), ngModelSet = ngModelGet.assign;
|
|
if (!ngModelSet) throw minErr('ngModel')('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, invalidCount = 0, $error = this.$error = {};
|
|
function toggleValidCss(isValid, validationErrorKey) {
|
|
validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '', $element.removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey).addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);
|
|
}
|
|
$element.addClass(PRISTINE_CLASS), toggleValidCss(!0), this.$setValidity = function(validationErrorKey, isValid) {
|
|
!isValid !== $error[validationErrorKey] && (isValid ? ($error[validationErrorKey] && invalidCount--, invalidCount || (toggleValidCss(!0), this.$valid = !0, this.$invalid = !1)) : (toggleValidCss(!1), this.$invalid = !0, this.$valid = !1, invalidCount++), $error[validationErrorKey] = !isValid, toggleValidCss(isValid, validationErrorKey), parentForm.$setValidity(validationErrorKey, isValid, this));
|
|
}, this.$setPristine = function() {
|
|
this.$dirty = !1, this.$pristine = !0, $element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS);
|
|
}, this.$setViewValue = function(value) {
|
|
this.$viewValue = value, this.$pristine && (this.$dirty = !0, this.$pristine = !1, $element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS), parentForm.$setDirty()), forEach(this.$parsers, function(fn) {
|
|
value = fn(value);
|
|
}), this.$modelValue !== value && (this.$modelValue = value, ngModelSet($scope, value), forEach(this.$viewChangeListeners, function(listener) {
|
|
try {
|
|
listener();
|
|
} catch (e) {
|
|
$exceptionHandler(e);
|
|
}
|
|
}));
|
|
};
|
|
var ctrl = this;
|
|
$scope.$watch(function() {
|
|
var value = ngModelGet($scope);
|
|
if (ctrl.$modelValue !== value) {
|
|
var formatters = ctrl.$formatters, idx = formatters.length;
|
|
for(ctrl.$modelValue = value; idx--;)value = formatters[idx](value);
|
|
ctrl.$viewValue !== value && (ctrl.$viewValue = value, ctrl.$render());
|
|
}
|
|
return value;
|
|
});
|
|
}
|
|
], ngModelDirective = function() {
|
|
return {
|
|
require: [
|
|
'ngModel',
|
|
'^?form'
|
|
],
|
|
controller: NgModelController,
|
|
link: function(scope, element, attr, ctrls) {
|
|
var modelCtrl = ctrls[0], formCtrl = ctrls[1] || nullFormCtrl;
|
|
formCtrl.$addControl(modelCtrl), scope.$on('$destroy', function() {
|
|
formCtrl.$removeControl(modelCtrl);
|
|
});
|
|
}
|
|
};
|
|
}, ngChangeDirective = valueFn1({
|
|
require: 'ngModel',
|
|
link: function(scope, element, attr, ctrl) {
|
|
ctrl.$viewChangeListeners.push(function() {
|
|
scope.$eval(attr.ngChange);
|
|
});
|
|
}
|
|
}), requiredDirective = function() {
|
|
return {
|
|
require: '?ngModel',
|
|
link: function(scope, elm, attr, ctrl) {
|
|
if (ctrl) {
|
|
attr.required = !0;
|
|
var validator = function(value) {
|
|
if (!(attr.required && ctrl.$isEmpty(value))) return ctrl.$setValidity('required', !0), value;
|
|
ctrl.$setValidity('required', !1);
|
|
};
|
|
ctrl.$formatters.push(validator), ctrl.$parsers.unshift(validator), attr.$observe('required', function() {
|
|
validator(ctrl.$viewValue);
|
|
});
|
|
}
|
|
}
|
|
};
|
|
}, ngListDirective = function() {
|
|
return {
|
|
require: 'ngModel',
|
|
link: function(scope, element, attr, ctrl) {
|
|
var match = /\/(.*)\//.exec(attr.ngList), separator = match && new RegExp(match[1]) || attr.ngList || ',';
|
|
ctrl.$parsers.push(function(viewValue) {
|
|
if (!isUndefined(viewValue)) {
|
|
var list = [];
|
|
return viewValue && forEach(viewValue.split(separator), function(value) {
|
|
value && list.push(trim1(value));
|
|
}), list;
|
|
}
|
|
}), ctrl.$formatters.push(function(value) {
|
|
if (isArray(value)) return value.join(', ');
|
|
}), ctrl.$isEmpty = function(value) {
|
|
return !value || !value.length;
|
|
};
|
|
}
|
|
};
|
|
}, CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/, ngBindDirective = ngDirective(function(scope, element, attr) {
|
|
element.addClass('ng-binding').data('$binding', attr.ngBind), scope.$watch(attr.ngBind, function(value) {
|
|
element.text(value == undefined ? '' : value);
|
|
});
|
|
}), ngBindTemplateDirective = [
|
|
'$interpolate',
|
|
function($interpolate) {
|
|
return function(scope, element, attr) {
|
|
var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));
|
|
element.addClass('ng-binding').data('$binding', interpolateFn), attr.$observe('ngBindTemplate', function(value) {
|
|
element.text(value);
|
|
});
|
|
};
|
|
}
|
|
], ngBindHtmlDirective = [
|
|
'$sce',
|
|
'$parse',
|
|
function($sce, $parse) {
|
|
return function(scope, element, attr) {
|
|
element.addClass('ng-binding').data('$binding', attr.ngBindHtml);
|
|
var parsed = $parse(attr.ngBindHtml);
|
|
scope.$watch(function() {
|
|
return (parsed(scope) || '').toString();
|
|
}, function(value) {
|
|
element.html($sce.getTrustedHtml(parsed(scope)) || '');
|
|
});
|
|
};
|
|
}
|
|
];
|
|
function classDirective(name, selector) {
|
|
return name = 'ngClass' + name, function() {
|
|
return {
|
|
restrict: 'AC',
|
|
link: function(scope, element, attr) {
|
|
var oldVal;
|
|
function ngClassWatchAction(newVal) {
|
|
if (!0 === selector || scope.$index % 2 === selector) {
|
|
var newClasses = flattenClasses(newVal || '');
|
|
oldVal ? equals(newVal, oldVal) || attr.$updateClass(newClasses, flattenClasses(oldVal)) : attr.$addClass(newClasses);
|
|
}
|
|
oldVal = copy(newVal);
|
|
}
|
|
function flattenClasses(classVal) {
|
|
if (isArray(classVal)) return classVal.join(' ');
|
|
if (isObject(classVal)) {
|
|
var classes = [];
|
|
return forEach(classVal, function(v, k) {
|
|
v && classes.push(k);
|
|
}), classes.join(' ');
|
|
}
|
|
return classVal;
|
|
}
|
|
scope.$watch(attr[name], ngClassWatchAction, !0), attr.$observe('class', function(value) {
|
|
ngClassWatchAction(scope.$eval(attr[name]));
|
|
}), 'ngClass' !== name && scope.$watch('$index', function($index, old$index) {
|
|
var mod = 1 & $index;
|
|
if (mod !== old$index & 1) {
|
|
var classes = flattenClasses(scope.$eval(attr[name]));
|
|
mod === selector ? attr.$addClass(classes) : attr.$removeClass(classes);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
};
|
|
}
|
|
var 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 {
|
|
scope: !0,
|
|
controller: '@',
|
|
priority: 500
|
|
};
|
|
}
|
|
], ngEventDirectives = {};
|
|
forEach('click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '), function(name) {
|
|
var directiveName = directiveNormalize('ng-' + name);
|
|
ngEventDirectives[directiveName] = [
|
|
'$parse',
|
|
function($parse) {
|
|
return {
|
|
compile: function($element, attr) {
|
|
var fn = $parse(attr[directiveName]);
|
|
return function(scope, element, attr) {
|
|
element.on(lowercase(name), function(event) {
|
|
scope.$apply(function() {
|
|
fn(scope, {
|
|
$event: event
|
|
});
|
|
});
|
|
});
|
|
};
|
|
}
|
|
};
|
|
}
|
|
];
|
|
});
|
|
var ngIfDirective = [
|
|
'$animate',
|
|
function($animate) {
|
|
return {
|
|
transclude: 'element',
|
|
priority: 600,
|
|
terminal: !0,
|
|
restrict: 'A',
|
|
$$tlb: !0,
|
|
link: function($scope, $element, $attr, ctrl, $transclude) {
|
|
var block, childScope;
|
|
$scope.$watch($attr.ngIf, function(value) {
|
|
toBoolean(value) ? childScope || $transclude(childScope = $scope.$new(), function(clone) {
|
|
clone[clone.length++] = document1.createComment(' end ngIf: ' + $attr.ngIf + ' '), block = {
|
|
clone: clone
|
|
}, $animate.enter(clone, $element.parent(), $element);
|
|
}) : (childScope && (childScope.$destroy(), childScope = null), block && ($animate.leave(getBlockElements(block.clone)), block = null));
|
|
});
|
|
}
|
|
};
|
|
}
|
|
], ngIncludeDirective = [
|
|
'$http',
|
|
'$templateCache',
|
|
'$anchorScroll',
|
|
'$animate',
|
|
'$sce',
|
|
function($http, $templateCache, $anchorScroll, $animate, $sce) {
|
|
return {
|
|
restrict: 'ECA',
|
|
priority: 400,
|
|
terminal: !0,
|
|
transclude: 'element',
|
|
controller: angular1.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, currentElement, changeCounter = 0, cleanupLastIncludeContent = function() {
|
|
currentScope && (currentScope.$destroy(), currentScope = null), currentElement && ($animate.leave(currentElement), currentElement = null);
|
|
};
|
|
scope.$watch($sce.parseAsResourceUrl(srcExp), function(src) {
|
|
var afterAnimation = function() {
|
|
isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp)) && $anchorScroll();
|
|
}, thisChangeId = ++changeCounter;
|
|
src ? ($http.get(src, {
|
|
cache: $templateCache
|
|
}).success(function(response) {
|
|
if (thisChangeId === changeCounter) {
|
|
var newScope = scope.$new();
|
|
ctrl.template = response;
|
|
var clone1 = $transclude(newScope, function(clone) {
|
|
cleanupLastIncludeContent(), $animate.enter(clone, null, $element, afterAnimation);
|
|
});
|
|
currentScope = newScope, currentElement = clone1, currentScope.$emit('$includeContentLoaded'), scope.$eval(onloadExp);
|
|
}
|
|
}).error(function() {
|
|
thisChangeId === changeCounter && cleanupLastIncludeContent();
|
|
}), scope.$emit('$includeContentRequested')) : (cleanupLastIncludeContent(), ctrl.template = null);
|
|
});
|
|
};
|
|
}
|
|
};
|
|
}
|
|
], ngIncludeFillContentDirective = [
|
|
'$compile',
|
|
function($compile) {
|
|
return {
|
|
restrict: 'ECA',
|
|
priority: -400,
|
|
require: 'ngInclude',
|
|
link: function(scope, $element, $attr, ctrl) {
|
|
$element.html(ctrl.template), $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: 1000
|
|
}), ngPluralizeDirective = [
|
|
'$locale',
|
|
'$interpolate',
|
|
function($locale, $interpolate) {
|
|
var BRACE = /{}/g;
|
|
return {
|
|
restrict: 'EA',
|
|
link: function(scope, element, attr) {
|
|
var 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(), isWhen = /^when(Minus)?(.+)$/;
|
|
forEach(attr, function(expression, attributeName) {
|
|
isWhen.test(attributeName) && (whens[lowercase(attributeName.replace('when', '').replace('Minus', '-'))] = element.attr(attr.$attr[attributeName]));
|
|
}), forEach(whens, function(expression, key) {
|
|
whensExpFns[key] = $interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' + offset + endSymbol));
|
|
}), scope.$watch(function() {
|
|
var value = parseFloat(scope.$eval(numberExp));
|
|
return isNaN(value) ? '' : (value in whens || (value = $locale.pluralCat(value - offset)), whensExpFns[value](scope, element, !0));
|
|
}, function(newVal) {
|
|
element.text(newVal);
|
|
});
|
|
}
|
|
};
|
|
}
|
|
], ngRepeatDirective = [
|
|
'$parse',
|
|
'$animate',
|
|
function($parse, $animate) {
|
|
var NG_REMOVED = '$$NG_REMOVED', ngRepeatMinErr = minErr('ngRepeat');
|
|
return {
|
|
transclude: 'element',
|
|
priority: 1000,
|
|
terminal: !0,
|
|
$$tlb: !0,
|
|
link: function($scope, $element, $attr, ctrl, $transclude) {
|
|
var trackByExp, trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn, lhs, rhs, valueIdentifier, keyIdentifier, expression = $attr.ngRepeat, match = expression.match(/^\s*(.+)\s+in\s+(.*?)\s*(\s+track\s+by\s+(.+)\s*)?$/), hashFnLocals = {
|
|
$id: hashKey
|
|
};
|
|
if (!match) throw ngRepeatMinErr('iexp', "Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.", expression);
|
|
if (lhs = match[1], rhs = match[2], trackByExp = match[4], trackByExp ? (trackByExpGetter = $parse(trackByExp), trackByIdExpFn = function(key, value, index) {
|
|
return keyIdentifier && (hashFnLocals[keyIdentifier] = key), hashFnLocals[valueIdentifier] = value, hashFnLocals.$index = index, trackByExpGetter($scope, hashFnLocals);
|
|
}) : (trackByIdArrayFn = function(key, value) {
|
|
return hashKey(value);
|
|
}, trackByIdObjFn = function(key) {
|
|
return key;
|
|
}), 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);
|
|
valueIdentifier = match[3] || match[1], keyIdentifier = match[2];
|
|
var lastBlockMap = {};
|
|
$scope.$watchCollection(rhs, function(collection) {
|
|
var index, length, nextNode, arrayLength, childScope, key, value, trackById, trackByIdFn, collectionKeys, block1, elementsToRemove, previousNode = $element[0], nextBlockMap = {}, nextBlockOrder = [];
|
|
if (isArrayLike(collection)) collectionKeys = collection, trackByIdFn = trackByIdExpFn || trackByIdArrayFn;
|
|
else {
|
|
for(key in trackByIdFn = trackByIdExpFn || trackByIdObjFn, collectionKeys = [], collection)collection.hasOwnProperty(key) && '$' != key.charAt(0) && collectionKeys.push(key);
|
|
collectionKeys.sort();
|
|
}
|
|
for(index = 0, arrayLength = collectionKeys.length, length = nextBlockOrder.length = collectionKeys.length; index < length; index++)if (key = collection === collectionKeys ? index : collectionKeys[index], value = collection[key], trackById = trackByIdFn(key, value, index), assertNotHasOwnProperty(trackById, '`track by` id'), lastBlockMap.hasOwnProperty(trackById)) block1 = lastBlockMap[trackById], delete lastBlockMap[trackById], nextBlockMap[trackById] = block1, nextBlockOrder[index] = block1;
|
|
else if (nextBlockMap.hasOwnProperty(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}", expression, trackById);
|
|
else nextBlockOrder[index] = {
|
|
id: trackById
|
|
}, nextBlockMap[trackById] = !1;
|
|
for(key in lastBlockMap)lastBlockMap.hasOwnProperty(key) && (elementsToRemove = getBlockElements((block1 = lastBlockMap[key]).clone), $animate.leave(elementsToRemove), forEach(elementsToRemove, function(element) {
|
|
element[NG_REMOVED] = !0;
|
|
}), block1.scope.$destroy());
|
|
for(index = 0, length = collectionKeys.length; index < length; index++){
|
|
if (key = collection === collectionKeys ? index : collectionKeys[index], value = collection[key], block1 = nextBlockOrder[index], nextBlockOrder[index - 1] && (previousNode = getBlockEnd(nextBlockOrder[index - 1])), block1.scope) {
|
|
childScope = block1.scope, nextNode = previousNode;
|
|
do nextNode = nextNode.nextSibling;
|
|
while (nextNode && nextNode[NG_REMOVED])
|
|
getBlockStart(block1) != nextNode && $animate.move(getBlockElements(block1.clone), null, jqLite(previousNode)), previousNode = getBlockEnd(block1);
|
|
} else childScope = $scope.$new();
|
|
childScope[valueIdentifier] = value, keyIdentifier && (childScope[keyIdentifier] = key), childScope.$index = index, childScope.$first = 0 === index, childScope.$last = index === arrayLength - 1, childScope.$middle = !(childScope.$first || childScope.$last), childScope.$odd = !(childScope.$even = (1 & index) == 0), block1.scope || $transclude(childScope, function(clone) {
|
|
clone[clone.length++] = document1.createComment(' end ngRepeat: ' + expression + ' '), $animate.enter(clone, null, jqLite(previousNode)), previousNode = clone, block1.scope = childScope, block1.clone = clone, nextBlockMap[block1.id] = block1;
|
|
});
|
|
}
|
|
lastBlockMap = nextBlockMap;
|
|
});
|
|
}
|
|
};
|
|
function getBlockStart(block) {
|
|
return block.clone[0];
|
|
}
|
|
function getBlockEnd(block) {
|
|
return block.clone[block.clone.length - 1];
|
|
}
|
|
}
|
|
], ngShowDirective = [
|
|
'$animate',
|
|
function($animate) {
|
|
return function(scope, element, attr) {
|
|
scope.$watch(attr.ngShow, function(value) {
|
|
$animate[toBoolean(value) ? 'removeClass' : 'addClass'](element, 'ng-hide');
|
|
});
|
|
};
|
|
}
|
|
], ngHideDirective = [
|
|
'$animate',
|
|
function($animate) {
|
|
return function(scope, element, attr) {
|
|
scope.$watch(attr.ngHide, function(value) {
|
|
$animate[toBoolean(value) ? 'addClass' : 'removeClass'](element, 'ng-hide');
|
|
});
|
|
};
|
|
}
|
|
], 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 selectedTranscludes, selectedElements, watchExpr = attr.ngSwitch || attr.on, selectedScopes = [];
|
|
scope.$watch(watchExpr, function(value) {
|
|
for(var i = 0, ii = selectedScopes.length; i < ii; i++)selectedScopes[i].$destroy(), $animate.leave(selectedElements[i]);
|
|
selectedElements = [], selectedScopes = [], (selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?']) && (scope.$eval(attr.change), forEach(selectedTranscludes, function(selectedTransclude) {
|
|
var selectedScope = scope.$new();
|
|
selectedScopes.push(selectedScope), selectedTransclude.transclude(selectedScope, function(caseElement) {
|
|
var anchor = selectedTransclude.element;
|
|
selectedElements.push(caseElement), $animate.enter(caseElement, anchor.parent(), anchor);
|
|
});
|
|
}));
|
|
});
|
|
}
|
|
};
|
|
}
|
|
], ngSwitchWhenDirective = ngDirective({
|
|
transclude: 'element',
|
|
priority: 800,
|
|
require: '^ngSwitch',
|
|
compile: function(element7, attrs) {
|
|
return function(scope, element, attr, ctrl, $transclude) {
|
|
ctrl.cases['!' + attrs.ngSwitchWhen] = ctrl.cases['!' + attrs.ngSwitchWhen] || [], ctrl.cases['!' + attrs.ngSwitchWhen].push({
|
|
transclude: $transclude,
|
|
element: element
|
|
});
|
|
};
|
|
}
|
|
}), ngSwitchDefaultDirective = ngDirective({
|
|
transclude: 'element',
|
|
priority: 800,
|
|
require: '^ngSwitch',
|
|
link: function(scope, element, attr, ctrl, $transclude) {
|
|
ctrl.cases['?'] = ctrl.cases['?'] || [], ctrl.cases['?'].push({
|
|
transclude: $transclude,
|
|
element: element
|
|
});
|
|
}
|
|
}), ngTranscludeDirective = ngDirective({
|
|
controller: [
|
|
'$element',
|
|
'$transclude',
|
|
function($element, $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));
|
|
this.$transclude = $transclude;
|
|
}
|
|
],
|
|
link: function($scope, $element, $attrs, controller) {
|
|
controller.$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 = valueFn1({
|
|
terminal: !0
|
|
}), selectDirective = [
|
|
'$compile',
|
|
'$parse',
|
|
function($compile, $parse) {
|
|
var NG_OPTIONS_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\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) {
|
|
assertNotHasOwnProperty(value, '"option value"'), optionsMap[value] = !0, ngModelCtrl.$viewValue == value && ($element.val(value), unknownOption.parent() && unknownOption.remove());
|
|
}, 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(scope5, element8, attr, ctrls) {
|
|
if (ctrls[1]) {
|
|
for(var scope3, selectElement2, ctrl1, lastView, scope4, selectElement1, ngModelCtrl, selectCtrl, emptyOption, selectCtrl1 = ctrls[0], ngModelCtrl1 = ctrls[1], multiple = attr.multiple, optionsExp = attr.ngOptions, nullOption = !1, optionTemplate = jqLite(document1.createElement('option')), optGroupTemplate = jqLite(document1.createElement('optgroup')), unknownOption = optionTemplate.clone(), i = 0, children = element8.children(), ii = children.length; i < ii; i++)if ('' === children[i].value) {
|
|
emptyOption = nullOption = children.eq(i);
|
|
break;
|
|
}
|
|
if (selectCtrl1.init(ngModelCtrl1, nullOption, unknownOption), multiple && (attr.required || attr.ngRequired)) {
|
|
var requiredValidator = function(value) {
|
|
return ngModelCtrl1.$setValidity('required', !attr.required || value && value.length), value;
|
|
};
|
|
ngModelCtrl1.$parsers.push(requiredValidator), ngModelCtrl1.$formatters.unshift(requiredValidator), attr.$observe('required', function() {
|
|
requiredValidator(ngModelCtrl1.$viewValue);
|
|
});
|
|
}
|
|
optionsExp ? function(scope, selectElement, ctrl) {
|
|
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 match, displayFn = $parse(match[2] || match[1]), valueName = match[4] || match[6], keyName = match[5], groupByFn = $parse(match[3] || ''), valueFn = $parse(match[2] ? match[1] : valueName), valuesFn = $parse(match[7]), trackFn = match[8] ? $parse(match[8]) : null, optionGroupsCache = [
|
|
[
|
|
{
|
|
element: selectElement,
|
|
label: ''
|
|
}
|
|
]
|
|
];
|
|
function render() {
|
|
var optionGroupName, optionGroup, option, existingParent, existingOptions, existingOption, key, groupLength, length, groupIndex, index, selected, lastElement, element, label, optionGroups = {
|
|
'': []
|
|
}, optionGroupNames = [
|
|
''
|
|
], modelValue = ctrl.$modelValue, values = valuesFn(scope) || [], keys = keyName ? sortedKeys(values) : values, locals = {}, selectedSet = !1;
|
|
if (multiple) {
|
|
if (trackFn && isArray(modelValue)) {
|
|
selectedSet = new HashMap([]);
|
|
for(var trackIndex = 0; trackIndex < modelValue.length; trackIndex++)locals[valueName] = modelValue[trackIndex], selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);
|
|
} else selectedSet = new HashMap(modelValue);
|
|
}
|
|
for(index = 0; index < (length = keys.length); index++){
|
|
if (key = index, keyName) {
|
|
if ('$' === (key = keys[index]).charAt(0)) continue;
|
|
locals[keyName] = key;
|
|
}
|
|
if (locals[valueName] = values[key], (optionGroup = optionGroups[optionGroupName = groupByFn(scope, locals) || '']) || (optionGroup = optionGroups[optionGroupName] = [], optionGroupNames.push(optionGroupName)), multiple) selected = isDefined(selectedSet.remove(trackFn ? trackFn(scope, locals) : valueFn(scope, locals)));
|
|
else {
|
|
if (trackFn) {
|
|
var modelCast = {};
|
|
modelCast[valueName] = modelValue, selected = trackFn(scope, modelCast) === trackFn(scope, locals);
|
|
} else selected = modelValue === valueFn(scope, locals);
|
|
selectedSet = selectedSet || selected;
|
|
}
|
|
label = isDefined(label = displayFn(scope, locals)) ? label : '', optionGroup.push({
|
|
id: trackFn ? trackFn(scope, locals) : keyName ? keys[index] : index,
|
|
label: label,
|
|
selected: selected
|
|
});
|
|
}
|
|
for(multiple || (nullOption || null === modelValue ? optionGroups[''].unshift({
|
|
id: '',
|
|
label: '',
|
|
selected: !selectedSet
|
|
}) : selectedSet || optionGroups[''].unshift({
|
|
id: '?',
|
|
label: '',
|
|
selected: !0
|
|
})), groupIndex = 0, groupLength = optionGroupNames.length; groupIndex < groupLength; groupIndex++){
|
|
for(optionGroup = optionGroups[optionGroupName = optionGroupNames[groupIndex]], optionGroupsCache.length <= groupIndex ? (existingOptions = [
|
|
existingParent = {
|
|
element: optGroupTemplate.clone().attr('label', optionGroupName),
|
|
label: optionGroup.label
|
|
}
|
|
], optionGroupsCache.push(existingOptions), selectElement.append(existingParent.element)) : (existingParent = (existingOptions = optionGroupsCache[groupIndex])[0]).label != optionGroupName && existingParent.element.attr('label', existingParent.label = optionGroupName), lastElement = null, index = 0, length = optionGroup.length; index < length; index++)option = optionGroup[index], (existingOption = existingOptions[index + 1]) ? (lastElement = existingOption.element, existingOption.label !== option.label && lastElement.text(existingOption.label = option.label), existingOption.id !== option.id && lastElement.val(existingOption.id = option.id), lastElement[0].selected !== option.selected && lastElement.prop('selected', existingOption.selected = option.selected)) : ('' === option.id && nullOption ? element = nullOption : (element = optionTemplate.clone()).val(option.id).attr('selected', option.selected).text(option.label), existingOptions.push(existingOption = {
|
|
element: element,
|
|
label: option.label,
|
|
id: option.id,
|
|
selected: option.selected
|
|
}), lastElement ? lastElement.after(element) : existingParent.element.append(element), lastElement = element);
|
|
for(index++; existingOptions.length > index;)existingOptions.pop().element.remove();
|
|
}
|
|
for(; optionGroupsCache.length > groupIndex;)optionGroupsCache.pop()[0].element.remove();
|
|
}
|
|
nullOption && ($compile(nullOption)(scope), nullOption.removeClass('ng-scope'), nullOption.remove()), selectElement.empty(), selectElement.on('change', function() {
|
|
scope.$apply(function() {
|
|
var optionGroup, key, value, optionElement, index, groupIndex, length, groupLength, trackIndex, collection = valuesFn(scope) || [], locals = {};
|
|
if (multiple) {
|
|
for(groupIndex = 0, value = [], groupLength = optionGroupsCache.length; groupIndex < groupLength; groupIndex++)for(index = 1, length = (optionGroup = optionGroupsCache[groupIndex]).length; index < length; index++)if ((optionElement = optionGroup[index].element)[0].selected) {
|
|
if (key = optionElement.val(), keyName && (locals[keyName] = key), trackFn) for(trackIndex = 0; trackIndex < collection.length && (locals[valueName] = collection[trackIndex], trackFn(scope, locals) != key); trackIndex++);
|
|
else locals[valueName] = collection[key];
|
|
value.push(valueFn(scope, locals));
|
|
}
|
|
} else if ('?' == (key = selectElement.val())) value = undefined;
|
|
else if ('' === key) value = null;
|
|
else if (trackFn) {
|
|
for(trackIndex = 0; trackIndex < collection.length; trackIndex++)if (locals[valueName] = collection[trackIndex], trackFn(scope, locals) == key) {
|
|
value = valueFn(scope, locals);
|
|
break;
|
|
}
|
|
} else locals[valueName] = collection[key], keyName && (locals[keyName] = key), value = valueFn(scope, locals);
|
|
ctrl.$setViewValue(value);
|
|
});
|
|
}), ctrl.$render = render, scope.$watch(render);
|
|
}(scope5, element8, ngModelCtrl1) : multiple ? (scope3 = scope5, selectElement2 = element8, (ctrl1 = ngModelCtrl1).$render = function() {
|
|
var items = new HashMap(ctrl1.$viewValue);
|
|
forEach(selectElement2.find('option'), function(option) {
|
|
option.selected = isDefined(items.get(option.value));
|
|
});
|
|
}, scope3.$watch(function() {
|
|
equals(lastView, ctrl1.$viewValue) || (lastView = copy(ctrl1.$viewValue), ctrl1.$render());
|
|
}), selectElement2.on('change', function() {
|
|
scope3.$apply(function() {
|
|
var array = [];
|
|
forEach(selectElement2.find('option'), function(option) {
|
|
option.selected && array.push(option.value);
|
|
}), ctrl1.$setViewValue(array);
|
|
});
|
|
})) : (scope4 = scope5, selectElement1 = element8, ngModelCtrl = ngModelCtrl1, selectCtrl = selectCtrl1, ngModelCtrl.$render = function() {
|
|
var viewValue = ngModelCtrl.$viewValue;
|
|
selectCtrl.hasOption(viewValue) ? (unknownOption.parent() && unknownOption.remove(), selectElement1.val(viewValue), '' === viewValue && emptyOption.prop('selected', !0)) : isUndefined(viewValue) && emptyOption ? selectElement1.val('') : selectCtrl.renderUnknownOption(viewValue);
|
|
}, selectElement1.on('change', function() {
|
|
scope4.$apply(function() {
|
|
unknownOption.parent() && unknownOption.remove(), ngModelCtrl.$setViewValue(selectElement1.val());
|
|
});
|
|
}));
|
|
}
|
|
}
|
|
};
|
|
}
|
|
], optionDirective = [
|
|
'$interpolate',
|
|
function($interpolate) {
|
|
var nullSelectCtrl = {
|
|
addOption: noop,
|
|
removeOption: noop
|
|
};
|
|
return {
|
|
restrict: 'E',
|
|
priority: 100,
|
|
compile: function(element9, attr1) {
|
|
if (isUndefined(attr1.value)) {
|
|
var interpolateFn = $interpolate(element9.text(), !0);
|
|
interpolateFn || attr1.$set('value', element9.text());
|
|
}
|
|
return function(scope, element, attr) {
|
|
var selectCtrlName = '$selectController', parent = element.parent(), selectCtrl = parent.data(selectCtrlName) || parent.parent().data(selectCtrlName);
|
|
selectCtrl && selectCtrl.databound ? element.prop('selected', !1) : selectCtrl = nullSelectCtrl, interpolateFn ? scope.$watch(interpolateFn, function(newVal, oldVal) {
|
|
attr.$set('value', newVal), newVal !== oldVal && selectCtrl.removeOption(oldVal), selectCtrl.addOption(newVal);
|
|
}) : selectCtrl.addOption(attr.value), element.on('$destroy', function() {
|
|
selectCtrl.removeOption(attr.value);
|
|
});
|
|
};
|
|
}
|
|
};
|
|
}
|
|
], styleDirective = valueFn1({
|
|
restrict: 'E',
|
|
terminal: !0
|
|
});
|
|
(jQuery = window1.jQuery) ? (jqLite = jQuery, extend(jQuery.fn, {
|
|
scope: JQLitePrototype.scope,
|
|
isolateScope: JQLitePrototype.isolateScope,
|
|
controller: JQLitePrototype.controller,
|
|
injector: JQLitePrototype.injector,
|
|
inheritedData: JQLitePrototype.inheritedData
|
|
}), jqLitePatchJQueryRemove('remove', !0, !0, !1), jqLitePatchJQueryRemove('empty', !1, !1, !1), jqLitePatchJQueryRemove('html', !1, !1, !0)) : jqLite = JQLite, angular1.element = jqLite, function(angular2) {
|
|
extend(angular2, {
|
|
bootstrap: bootstrap1,
|
|
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
|
|
},
|
|
'$$minErr': minErr,
|
|
'$$csp': csp
|
|
}), angularModule = function(window) {
|
|
var $injectorMinErr = minErr('$injector'), ngMinErr = minErr('ng');
|
|
function ensure(obj, name, factory) {
|
|
return obj[name] || (obj[name] = factory());
|
|
}
|
|
var angular = ensure(window, 'angular', Object);
|
|
return angular.$$minErr = angular.$$minErr || minErr, ensure(angular, 'module', function() {
|
|
var modules = {};
|
|
return function(name2, requires, configFn) {
|
|
return function(name, context) {
|
|
if ('hasOwnProperty' === name) throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);
|
|
}(name2, 'module'), requires && modules.hasOwnProperty(name2) && (modules[name2] = null), ensure(modules, name2, function() {
|
|
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.", name2);
|
|
var invokeQueue = [], runBlocks = [], config = invokeLater('$injector', 'invoke'), moduleInstance = {
|
|
_invokeQueue: invokeQueue,
|
|
_runBlocks: runBlocks,
|
|
requires: requires,
|
|
name: name2,
|
|
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 invokeLater(provider, method, insertMethod) {
|
|
return function() {
|
|
return invokeQueue[insertMethod || 'push']([
|
|
provider,
|
|
method,
|
|
arguments
|
|
]), moduleInstance;
|
|
};
|
|
}
|
|
});
|
|
};
|
|
});
|
|
}(window1);
|
|
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,
|
|
required: requiredDirective,
|
|
ngRequired: requiredDirective,
|
|
ngValue: function() {
|
|
return {
|
|
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);
|
|
});
|
|
};
|
|
}
|
|
};
|
|
}
|
|
}).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,
|
|
$sce: $SceProvider,
|
|
$sceDelegate: $SceDelegateProvider,
|
|
$sniffer: $SnifferProvider,
|
|
$templateCache: $TemplateCacheProvider,
|
|
$timeout: $TimeoutProvider,
|
|
$window: $WindowProvider
|
|
});
|
|
}
|
|
]);
|
|
}(angular1), jqLite(document1).ready(function() {
|
|
!function(element10, bootstrap) {
|
|
var appElement, module, elements = [
|
|
element10
|
|
], names = [
|
|
'ng:app',
|
|
'ng-app',
|
|
'x-ng-app',
|
|
'data-ng-app'
|
|
], NG_APP_CLASS_REGEXP = /\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;
|
|
function append(element) {
|
|
element && elements.push(element);
|
|
}
|
|
forEach(names, function(name) {
|
|
names[name] = !0, append(document1.getElementById(name)), name = name.replace(':', '\\:'), element10.querySelectorAll && (forEach(element10.querySelectorAll('.' + name), append), forEach(element10.querySelectorAll('.' + name + '\\:'), append), forEach(element10.querySelectorAll('[' + name + ']'), append));
|
|
}), forEach(elements, function(element) {
|
|
if (!appElement) {
|
|
var className = ' ' + element.className + ' ', match = NG_APP_CLASS_REGEXP.exec(className);
|
|
match ? (appElement = element, module = (match[2] || '').replace(/\s+/g, ',')) : forEach(element.attributes, function(attr) {
|
|
!appElement && names[attr.name] && (appElement = element, module = attr.value);
|
|
});
|
|
}
|
|
}), appElement && bootstrap(appElement, module ? [
|
|
module
|
|
] : []);
|
|
}(document1, bootstrap1);
|
|
});
|
|
}(window, document), angular.$$csp() || 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{display:none !important;}ng\\:form{display:block;}.ng-animate-start{border-spacing:1px 1px;-ms-zoom:1.0001;}.ng-animate-active{border-spacing:0px 0px;-ms-zoom:1;}</style>');
|