aboutsummaryrefslogtreecommitdiffstats
path: root/src/API.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/API.js')
-rw-r--r--src/API.js318
1 files changed, 318 insertions, 0 deletions
diff --git a/src/API.js b/src/API.js
new file mode 100644
index 00000000..c51fe01d
--- /dev/null
+++ b/src/API.js
@@ -0,0 +1,318 @@
+angular.Global = {
+ typeOf:function(obj){
+ var type = typeof obj;
+ switch(type) {
+ case "object":
+ if (obj === null) return "null";
+ if (obj instanceof Array) return "array";
+ if (obj instanceof Date) return "date";
+ if (obj.nodeType == 1) return "element";
+ }
+ return type;
+ }
+};
+
+angular.Collection = {};
+angular.Object = {};
+angular.Array = {
+ includeIf:function(array, value, condition) {
+ var index = _.indexOf(array, value);
+ if (condition) {
+ if (index == -1)
+ array.push(value);
+ } else {
+ array.splice(index, 1);
+ }
+ return array;
+ },
+ sum:function(array, expression) {
+ var fn = angular.Function.compile(expression);
+ var sum = 0;
+ for (var i = 0; i < array.length; i++) {
+ var value = 1 * fn(array[i]);
+ if (!isNaN(value)){
+ sum += value;
+ }
+ }
+ return sum;
+ },
+ remove:function(array, value) {
+ var index = _.indexOf(array, value);
+ if (index >=0)
+ array.splice(index, 1);
+ return value;
+ },
+ find:function(array, condition, defaultValue) {
+ if (!condition) return undefined;
+ var fn = angular.Function.compile(condition);
+ _.detect(array, function($){
+ if (fn($)){
+ defaultValue = $;
+ return true;
+ }
+ });
+ return defaultValue;
+ },
+ findById:function(array, id) {
+ return angular.Array.find(array, function($){return $.$id == id;}, null);
+ },
+ filter:function(array, expression) {
+ var predicates = [];
+ predicates.check = function(value) {
+ for (var j = 0; j < predicates.length; j++) {
+ if(!predicates[j](value)) {
+ return false;
+ }
+ }
+ return true;
+ };
+ var getter = nglr.Scope.getter;
+ var search = function(obj, text){
+ if (text.charAt(0) === '!') {
+ return !search(obj, text.substr(1));
+ }
+ switch (typeof obj) {
+ case "boolean":
+ case "number":
+ case "string":
+ return ('' + obj).toLowerCase().indexOf(text) > -1;
+ case "object":
+ for ( var objKey in obj) {
+ if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
+ return true;
+ }
+ }
+ return false;
+ case "array":
+ for ( var i = 0; i < obj.length; i++) {
+ if (search(obj[i], text)) {
+ return true;
+ }
+ }
+ return false;
+ default:
+ return false;
+ }
+ };
+ switch (typeof expression) {
+ case "boolean":
+ case "number":
+ case "string":
+ expression = {$:expression};
+ case "object":
+ for (var key in expression) {
+ if (key == '$') {
+ (function(){
+ var text = (''+expression[key]).toLowerCase();
+ if (!text) return;
+ predicates.push(function(value) {
+ return search(value, text);
+ });
+ })();
+ } else {
+ (function(){
+ var path = key;
+ var text = (''+expression[key]).toLowerCase();
+ if (!text) return;
+ predicates.push(function(value) {
+ return search(getter(value, path), text);
+ });
+ })();
+ }
+ }
+ break;
+ case "function":
+ predicates.push(expression);
+ break;
+ default:
+ return array;
+ }
+ var filtered = [];
+ for ( var j = 0; j < array.length; j++) {
+ var value = array[j];
+ if (predicates.check(value)) {
+ filtered.push(value);
+ }
+ }
+ return filtered;
+ },
+ add:function(array, value) {
+ array.push(_.isUndefined(value)? {} : value);
+ return array;
+ },
+ count:function(array, condition) {
+ if (!condition) return array.length;
+ var fn = angular.Function.compile(condition);
+ return _.reduce(array, 0, function(count, $){return count + (fn($)?1:0);});
+ },
+ orderBy:function(array, expression, descend) {
+ function reverse(comp, descending) {
+ return nglr.toBoolean(descending) ?
+ function(a,b){return comp(b,a);} : comp;
+ }
+ function compare(v1, v2){
+ var t1 = typeof v1;
+ var t2 = typeof v2;
+ if (t1 == t2) {
+ if (t1 == "string") v1 = v1.toLowerCase();
+ if (t1 == "string") v2 = v2.toLowerCase();
+ if (v1 === v2) return 0;
+ return v1 < v2 ? -1 : 1;
+ } else {
+ return t1 < t2 ? -1 : 1;
+ }
+ }
+ expression = _.isArray(expression) ? expression: [expression];
+ expression = _.map(expression, function($){
+ var descending = false;
+ if (typeof $ == "string" && ($.charAt(0) == '+' || $.charAt(0) == '-')) {
+ descending = $.charAt(0) == '-';
+ $ = $.substring(1);
+ }
+ var get = $ ? angular.Function.compile($) : _.identity;
+ return reverse(function(a,b){
+ return compare(get(a),get(b));
+ }, descending);
+ });
+ var comparator = function(o1, o2){
+ for ( var i = 0; i < expression.length; i++) {
+ var comp = expression[i](o1, o2);
+ if (comp != 0) return comp;
+ }
+ return 0;
+ };
+ return _.clone(array).sort(reverse(comparator, descend));
+ },
+ orderByToggle:function(predicate, attribute) {
+ var STRIP = /^([+|-])?(.*)/;
+ var ascending = false;
+ var index = -1;
+ _.detect(predicate, function($, i){
+ if ($ == attribute) {
+ ascending = true;
+ index = i;
+ return true;
+ }
+ if (($.charAt(0)=='+'||$.charAt(0)=='-') && $.substring(1) == attribute) {
+ ascending = $.charAt(0) == '+';
+ index = i;
+ return true;
+ };
+ });
+ if (index >= 0) {
+ predicate.splice(index, 1);
+ }
+ predicate.unshift((ascending ? "-" : "+") + attribute);
+ return predicate;
+ },
+ orderByDirection:function(predicate, attribute, ascend, descend) {
+ ascend = ascend || 'ng-ascend';
+ descend = descend || 'ng-descend';
+ var att = predicate[0] || '';
+ var direction = true;
+ if (att.charAt(0) == '-') {
+ att = att.substring(1);
+ direction = false;
+ } else if(att.charAt(0) == '+') {
+ att = att.substring(1);
+ }
+ return att == attribute ? (direction ? ascend : descend) : "";
+ },
+ merge:function(array, index, mergeValue) {
+ var value = array[index];
+ if (!value) {
+ value = {};
+ array[index] = value;
+ }
+ nglr.merge(mergeValue, value);
+ return array;
+ }
+};
+angular.String = {
+ quote:function(string) {
+ return '"' + string.replace(/\\/g, '\\\\').
+ replace(/"/g, '\\"').
+ replace(/\n/g, '\\n').
+ replace(/\f/g, '\\f').
+ replace(/\r/g, '\\r').
+ replace(/\t/g, '\\t').
+ replace(/\v/g, '\\v') +
+ '"';
+ },
+ quoteUnicode:function(string) {
+ var str = angular.String.quote(string);
+ var chars = [];
+ for ( var i = 0; i < str.length; i++) {
+ var ch = str.charCodeAt(i);
+ if (ch < 128) {
+ chars.push(str.charAt(i));
+ } else {
+ var encode = "000" + ch.toString(16);
+ chars.push("\\u" + encode.substring(encode.length - 4));
+ }
+ }
+ return chars.join('');
+ },
+ toDate:function(string){
+ var match;
+ if (typeof string == 'string' &&
+ (match = string.match(/^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)Z$/))){
+ var date = new Date(0);
+ date.setUTCFullYear(match[1], match[2] - 1, match[3]);
+ date.setUTCHours(match[4], match[5], match[6], 0);
+ return date;
+ }
+ return string;
+ }
+};
+angular.Date = {
+ toString:function(date){
+ function pad(n) { return n < 10 ? "0" + n : n; }
+ return (date.getUTCFullYear()) + '-' +
+ pad(date.getUTCMonth() + 1) + '-' +
+ pad(date.getUTCDate()) + 'T' +
+ pad(date.getUTCHours()) + ':' +
+ pad(date.getUTCMinutes()) + ':' +
+ pad(date.getUTCSeconds()) + 'Z';
+ }
+ };
+angular.Function = {
+ compile:function(expression) {
+ if (_.isFunction(expression)){
+ return expression;
+ } else if (expression){
+ var scope = new nglr.Scope();
+ return function($) {
+ scope.state = $;
+ return scope.eval(expression);
+ };
+ } else {
+ return function($){return $;};
+ }
+ }
+};
+
+(function(){
+ function extend(dst, src, names){
+ _.extend(dst, src);
+ _.each((names||[]), function(name){
+ dst[name] = _[name];
+ });
+ };
+ extend(angular.Global, {},
+ ['extend', 'clone','isEqual',
+ 'isElement', 'isArray', 'isFunction', 'isUndefined']);
+ extend(angular.Collection, angular.Global,
+ ['each', 'map', 'reduce', 'reduceRight', 'detect',
+ 'select', 'reject', 'all', 'any', 'include',
+ 'invoke', 'pluck', 'max', 'min', 'sortBy',
+ 'sortedIndex', 'toArray', 'size']);
+ extend(angular.Array, angular.Collection,
+ ['first', 'last', 'compact', 'flatten', 'without',
+ 'uniq', 'intersect', 'zip', 'indexOf', 'lastIndexOf']);
+ extend(angular.Object, angular.Collection,
+ ['keys', 'values']);
+ extend(angular.String, angular.Global);
+ extend(angular.Function, angular.Global,
+ ['bind', 'bindAll', 'delay', 'defer', 'wrap', 'compose']);
+})(); \ No newline at end of file