1
0
Fork 0
forked from 0x2620/oxjs

merging changes

This commit is contained in:
rolux 2011-02-22 11:02:28 +01:00
commit 221355f8ba
8 changed files with 8989 additions and 672 deletions

View file

@ -1,15 +1,8 @@
// todo: check http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
/*
Ox = function(val) {
var Ox = {
version: '0.1.2'
};
*/
if (!window.Ox) {
Ox = {
version: '0.1.2'
};
}
/*
================================================================================
@ -18,16 +11,72 @@ Constants
*/
Ox.AMPM = ['AM', 'PM'];
Ox.DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
//Ox.DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
Ox.DURATIONS = ['year', 'month', 'day', 'minute', 'second'];
Ox.EARTH_RADIUS = 6378137;
Ox.EARTH_CIRCUMFERENCE = Ox.EARTH_RADIUS * 2 * Math.PI;
Ox.HTML_ENTITIES = {'"': '"', '&': '&', "'": ''',
'<': '&lt;', '>': '&gt;'};
Ox.MONTHS = ['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'];
Ox.HTML_ENTITIES = {
'"': '&quot;', '&': '&amp;', "'": '&apos;', '<': '&lt;', '>': '&gt;'
};
Ox.KEYS = {
SECTION: 0, BACKSPACE: 8, TAB: 9, CLEAR: 12, ENTER: 13,
SHIFT: 16, CONTROL: 17, OPTION: 18, PAUSE: 19, CAPSLOCK: 20,
ESCAPE: 27, SPACE: 32, PAGEUP: 33, PAGEDOWN: 34, END: 35, HOME: 36,
LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, INSERT: 45, DELETE: 46, HELP: 47,
0: 48, 1: 49, 2: 50, 3: 51, 4: 52, 5: 53, 6: 54, 7: 55, 8: 56, 9: 57,
A: 65, B: 66, C: 67, D: 68, E: 69, F: 70, G: 71, H: 72, I: 73, J: 74,
K: 75, L: 76, M: 77, N: 78, O: 79, P: 80, Q: 81, R: 82, S: 83, T: 84,
U: 85, V: 86, W: 87, X: 88, Y: 89, Z: 90,
META_LEFT: 91, META_RIGHT: 92, SELECT: 93,
'0_NUMPAD': 96, '1_NUMPAD': 97, '2_NUMPAD': 98, '3_NUMPAD': 99,
'4_NUMPAD': 100, '5_NUMPAD': 101, '6_NUMPAD': 102, '7_NUMPAD': 103,
'8_NUMPAD': 104, '9_NUMPAD': 105, '*_NUMPAD': 106, '+_NUMPAD': 107,
'\n_NUMPAD': 108, '-_NUMPAD': 109, '._NUMPAD': 110, '/_NUMPAD': 111,
F1: 112, F2: 113, F3: 114, F4: 115, F5: 116, F6: 117, F7: 118,
F8: 110, F9: 120, F10: 121, F11: 122, F12: 123, F13: 124, F14: 125,
F15: 126, F16: 127, NUMLOCK: 144, SCROLLLOCK: 145,
';': 186, '=': 187, ',': 188, '-': 189, '.': 190, '/': 191, '`': 192,
'(': 219, '\\': 220, ')': 221, '\'': 222
};
//Ox.MAX_LATITUDE = Ox.deg(Math.atan(Ox.sinh(Math.PI)));
//Ox.MIN_LATITUDE = -Ox.MAX_LATITUDE;
Ox.MONTHS = [
'January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'
];
Ox.PREFIXES = ['K', 'M', 'G', 'T', 'P'];
Ox.WEEKDAYS = ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
'Friday', 'Saturday', 'Sunday'];
Ox.SYMBOLS = {
DOLLAR: '\u0024',
CENT: '\u00A2', POUND: '\u00A3', CURRENCY: '\u00A4', YEN: '\u00A5',
BULLET: '\u2022', ELLIPSIS: '\u2026', PERMILLE: '\u2030',
COLON: '\u20A1', CRUZEIRO: '\u20A2', FRANC: '\u20A3', LIRA: '\u20A4',
NAIRA: '\u20A6', PESETA: '\u20A7', WON: '\u20A9', SHEQEL: '\u20AA',
DONG: '\u20AB', EURO: '\u20AC', KIP: '\u20AD', TUGRIK: '\u20AE',
DRACHMA: '\u20AF', PESO: '\u20B1', GUARANI: '\u20B2', AUSTRAL: '\u20B3',
HRYVNIA: '\u20B4', CEDI: '\u20B5', TENGE: '\u20B8', RUPEE: '\u20B9',
CELSIUS: '\u2103', FAHRENHEIT: '\u2109', POUNDS: '\u2114', OUNCE: '\u2125',
OHM: '\u2126', KELVIN: '\u212A', ANGSTROM: '\u212B', INFO: '\u2139',
LEFT: '\u2190', UP: '\u2191', RIGHT: '\u2192', DOWN: '\u2193',
HOME: '\u2196', END: '\u2198', RETURN: '\u21A9',
REDO: '\u21BA', UNDO: '\u21BB', PAGEUP: '\u21DE', PAGEDOWN: '\u21DF',
CAPSLOCK: '\u21EA', TAB: '\u21E5', SHIFT: '\u21E7', INFINITY: '\u221E',
CONTROL: '\u2303', COMMAND: '\u2318', ENTER: '\u2324', ALT: '\u2325',
DELETE: '\u2326', CLEAR:'\u2327',BACKSPACE: '\u232B', OPTION: '\u2387',
NAVIGATE: '\u2388', ESCAPE: '\u238B', EJECT: '\u23CF',
SPACE: '\u2423', DIAMOND: '\u25C6',
STAR: '\u2605', SOUND: '\u266B', TRASH: '\u267A', FLAG: '\u2691',
ANCHOR: '\u2693', GEAR: '\u2699', ATOM: '\u269B', WARNING: '\u26A0',
CUT: '\u2702', BACKUP: '\u2707', FLY: '\u2708', CHECK: '\u2713',
CLOSE: '\u2715', BALLOT: '\u2717', WINDOWS: '\u2756',
EDIT: '\uF802', CLICK: '\uF803', APPLE: '\uF8FF'
};
Ox.TYPES = [
'Arguments', 'Array', 'Boolean', 'Date', 'Element', 'Function', 'Infinity',
'NaN', 'Null', 'Number', 'Object', 'RegExp', 'String', 'Undefined'
];
Ox.WEEKDAYS = [
'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'
];
/*
================================================================================
@ -39,38 +88,46 @@ Ox.getset = function(obj, args, callback, context) {
/***
Generic getter and setter function
Ox.getset(obj) returns obj
can be implemented like this:
that.options = function() {
return Ox.getset(options, arguments, setOption(key, val), that);
}
Ox.getset(obj, []) returns obj
Ox.getset(obj, [key]) returns obj.key
Ox.getset(obj, [key, val], callback, context)
Ox.getset(obj, [{key: val, ...}], callback, context) sets obj.key to val,
calls callback(key, val),
calls callback(key, val)
for any changed value,
returns context
(for chaining)
>>> o = new function() { var o = {}, s = function() {}, t = this; t.o = function() { return Ox['getset'](o, arguments, s, t); }; return t; }
true
>>> Ox.getset({}, []) && o.o('key', 'val').o('key')
'val'
>>> Ox.getset({}, []) && o.o({key: 'val', foo: 'bar'}).o().foo
'bar'
>>> Ox.getset({}, []) && typeof o.o({foo: undefined}).o('foo') == 'undefined'
true
>>> delete o
true
***/
var obj_ = obj,
args_ = {},
args = args || [],
callback = callback || {},
context = context || {},
length = args.length,
ret;
if (length == 0) {
// getset()
var obj_ = Ox.clone(obj), ret;
if (args.length == 0) {
// getset([])
ret = obj;
} else if (length == 1 && Ox.isString(args[0])) {
// getset(str)
} else if (args.length == 1 && !Ox.isObject(args[0])) {
// getset([key])
ret = obj[args[0]]
} else {
// getset(str, val) or getset({str: val, ...})
if (length == 1) {
args = args[0];
} else {
args_[args[0]] = args[1];
args = args_;
}
obj = $.extend(obj, args);
$.each(args, function(key, value) {
if (!obj_ || !obj_[key] || obj_[key] !== value) {
callback(key, value);
// getset([key, val]) or getset([{key: val, ...}])
args = Ox.makeObject(Ox.isObject(args[0]) ? args[0] : args);
obj = Ox.extend(obj, args);
Ox.forEach(args, function(val, key) {
if (!obj_ || !Ox.isEqual(obj_[key], val)) {
callback && callback(key, val);
}
});
ret = context;
@ -82,7 +139,7 @@ Ox.print = function() {
/*
*/
if (window.console) {
var args = $.makeArray(arguments),
var args = Ox.makeArray(arguments),
date = new Date;
args.unshift(Ox.formatDate(date, '%H:%M:%S') + '.' +
(Ox.pad(+date % 1000, 3)));
@ -109,7 +166,7 @@ Ox.user = function() {
re = />(.+?)<\/td>\n<td class=output align="center">\n(.*?)\n/,
results = {};
arr.shift();
$.each(arr, function(i, v) {
Ox.forEach(arr, function(v) {
var result = re(v);
results[result[1].replace(/Your |\*/, "")] = result[2];
});
@ -150,6 +207,10 @@ Ox.avg = function(obj) {
Ox.clone = function(obj) {
/*
>>> (function() { a = ['val']; b = Ox.clone(a); a[0] = null; return b[0]; }())
'val'
>>> (function() { a = {key: 'val'}; b = Ox.clone(a); a.key = null; return b.key; }())
'val'
*/
return Ox.isArray(obj) ? obj.slice() : Ox.extend({}, obj);
};
@ -189,38 +250,6 @@ Ox.each = function(obj, fn) {
return obj;
};
Ox.equals = function(obj0, obj1) {
/*
>>> Ox.equals([1, 2, 3], [1, 2, 3])
true
>>> Ox.equals({a: 1, b: [2, 3], c: {d: '4'}}, {a: 1, b: [2, 3], c: {d: '4'}})
true
>>> Ox.equals(function() { return; }, function() { return; });
true
*/
var ret = false;
if (obj0 === obj1) {
ret = true;
} else if (typeof(obj0) == typeof(obj1)) {
if (obj0 == obj1) {
ret = true;
} else if (Ox.isArray(obj0) && obj0.length == obj1.length) {
Ox.forEach(obj0, function(v, i) {
ret = Ox.equals(v, obj1[i]);
return ret;
});
} else if (Ox.isDate(obj0)) {
ret = obj0.getTime() == obj1.getTime();
} else if (Ox.isObject(obj0)) {
ret = Ox.equals(Ox.keys(obj0), Ox.keys(obj1)) &&
Ox.equals(Ox.values(obj0), Ox.values(obj1));
} else if (Ox.isFunction(obj0)) {
ret = obj0.toString() == obj1.toString();
}
}
return ret;
}
Ox.every = function(obj, fn) {
/*
Ox.every() works for arrays, objects and strings, unlike [].every()
@ -240,10 +269,10 @@ Ox.every = function(obj, fn) {
Ox.extend = function() {
/*
>>> Ox.extend({a: 1}, {b: 2}, {c: 3}).c
>>> Ox.extend({a: 1, b: 1, c: 1}, {b: 2, c: 2}, {c: 3}).c
3
*/
var obj = {};
var obj = arguments[0];
Ox.forEach(Array.prototype.slice.call(arguments, 1), function(arg, i) {
Ox.forEach(arg, function(val, key) {
obj[key] = val;
@ -257,8 +286,8 @@ Ox.filter = function(arr, fn) {
Ox.filter works for arrays and strings, like $.grep(), unlike [].filter()
>>> Ox.filter([2, 1, 0], function(v, i) { return v == i; })
[1]
>>> Ox.filter("210", function(v, i) { return v == i; })
[1]
>>> Ox.filter('210', function(v, i) { return v == i; })
['1']
*/
var i, len = arr.length, ret = [];
for (i = 0; i < len; i++) {
@ -360,6 +389,48 @@ Ox.getPositionById = function(arr, id) {
return ret;
};
Ox.isEmpty = function(val) {
return Ox.length(val) == 0;
};
Ox.isEqual = function(obj0, obj1) {
/*
>>> Ox.isEqual(false, false)
true
>>> Ox.isEqual(0, 0)
true
>>> Ox.isEqual(NaN, NaN)
false
>>> Ox.isEqual([1, 2, 3], [1, 2, 3])
true
>>> Ox.isEqual({a: 1, b: [2, 3], c: {d: '4'}}, {a: 1, b: [2, 3], c: {d: '4'}})
true
>>> Ox.isEqual(function() { return; }, function() { return; });
true
*/
var ret = false;
if (obj0 === obj1) {
ret = true;
} else if (typeof(obj0) == typeof(obj1)) {
if (obj0 == obj1) {
ret = true;
} else if (Ox.isArray(obj0) && obj0.length == obj1.length) {
Ox.forEach(obj0, function(v, i) {
ret = Ox.isEqual(v, obj1[i]);
return ret;
});
} else if (Ox.isDate(obj0)) {
ret = obj0.getTime() == obj1.getTime();
} else if (Ox.isObject(obj0)) {
ret = Ox.isEqual(Ox.keys(obj0), Ox.keys(obj1)) &&
Ox.isEqual(Ox.values(obj0), Ox.values(obj1));
} else if (Ox.isFunction(obj0)) {
ret = obj0.toString() == obj1.toString();
}
}
return ret;
}
Ox.keys = function(obj) {
/*
>>> Ox.keys({a: 1, b: 2, c: 3})
@ -374,6 +445,8 @@ Ox.keys = function(obj) {
Ox.length = function(obj) {
/*
>>> Ox.length([1, 2, 3])
3
>>> Ox.length({"a": 1, "b": 2, "c": 3})
3
*/
@ -384,46 +457,42 @@ Ox.length = function(obj) {
return length;
};
Ox.makeArray = function(arr) {
Ox.makeArray = function(arg) {
/*
like $.makeArray()
>>> Ox.makeArray("foo")
["foo"]
>>> Ox.makeArray(["foo"])
["foo"]
>>> (function() { return Ox.makeArray(arguments); }("foo"))
["foo"]
>>> (function() { return Ox.makeArray(arguments); }(["foo"]))
["foo"]
>>> Ox.makeArray('foo', 'bar')
['foo', 'bar']
>>> (function() { return Ox.makeArray(arguments); }('foo', 'bar'))
['foo', 'bar']
*/
// fixme: this doesn't work for numbers
var ret = [], i = 0, len = arr.length;
if (Ox.isString(arr)) {
ret = [arr];
} else {
for (i = 0; i < len; i++) {
ret.push(arr[i]);
}
}
return ret;
return Array.prototype.slice.call(
Ox.isArguments(arg) ? arg : arguments
);
};
Ox.makeObject = function(arr) {
Ox.makeObject = function() {
/*
>>> Ox.makeObject("foo", "bar").foo
"bar"
>>> Ox.makeObject(["foo", "bar"]).foo
"bar"
>>> Ox.makeObject({foo: "bar"}).foo
"bar"
>/>> (function() { return Ox.makeObject(arguments); }("foo", "bar")).foo // fixme
"bar"
>/>> (function() { return Ox.makeObject(arguments); }({foo: "bar"})).foo
>>> (function() { return Ox.makeObject(arguments); }("foo", "bar")).foo
"bar"
*/
var obj = {};
if (arguments.length == 1) {
obj = arguments[0];
var arg = arguments, obj = {};
if (arg.length == 1) {
if (Ox.isObject(arg[0])) {
// ({foo: 'bar'})
obj = arg[0];
} else {
// (['foo', 'bar'])
obj[arg[0][0]] = arg[0][1];
}
} else {
obj[arguments[0]] = arguments[1];
// ('foo', 'bar')
obj[arg[0]] = arg[1];
}
return obj;
};
@ -438,7 +507,6 @@ Ox.map = function(arr, fn) {
>>> Ox.map(new Array(3), function(v, i) { return i; })
[0, 1, 2]
*/
// fixme: why not [].map.call(str, fn)?
var i, len = arr.length, val, ret = [];
for (i = 0; i < len; i++) {
if ((val = fn(arr[i], i)) !== null) {
@ -493,12 +561,11 @@ Ox.range = function(start, stop, step) {
stop = arguments.length > 1 ? stop : arguments[0];
start = arguments.length > 1 ? start : 0;
step = step || (start <= stop ? 1 : -1);
var range = [],
i;
var arr = [], i;
for (i = start; step > 0 ? i < stop : i > stop; i += step) {
range.push(i);
arr.push(i);
}
return range;
return arr;
};
Ox.serialize = function(obj) {
@ -515,9 +582,11 @@ Ox.serialize = function(obj) {
Ox.setPropertyOnce = function(arr, str) {
/*
>>> Ox.setPropertyOnce([{selected: false}, {selected: false}])
>>> Ox.setPropertyOnce([{selected: false}, {selected: false}], 'selected')
0
>>> Ox.setPropertyOnce([{selected: true}, {selected: true}])
>>> Ox.setPropertyOnce([{selected: false}, {selected: true}], 'selected')
1
>>> Ox.setPropertyOnce([{selected: true}, {selected: true}], 'selected')
0
*/
var pos = -1;
@ -573,14 +642,32 @@ Ox.sum = function(obj) {
return sum;
};
Ox.toArray = function(obj) {
/*
>>> Ox.toArray('foo')
['foo']
>>> Ox.toArray(['foo'])
['foo']
*/
var arr;
if (Ox.isArray(obj)) {
arr = obj;
} else if (Ox.isArguments(obj)) {
arr = Ox.makeArray(obj);
} else {
arr = [obj];
}
return arr;
};
Ox.unique = function(arr) {
/*
>>> Ox.unique([1, 2, 3, 1])
[1, 2, 3]
*/
var unique = [];
$.each(arr, function(i, v) {
unique.indexOf(v) == -1 && unique.push(v);
Ox.forEach(arr, function(val) {
unique.indexOf(val) == -1 && unique.push(val);
});
return unique;
};
@ -731,7 +818,6 @@ Ox.getDateInWeek = function(date, weekday) {
>>> Ox.formatDate(Ox.getDateInWeek(new Date("1/1/2000"), 1), "%A, %B %e, %Y")
"Monday, December 27, 1999"
*/
Ox.print("getDateInWeek", date.toString(), weekday)
var date = date || new Date(),
sourceWeekday = Ox.formatDate(date, "%u");
targetWeekday = Ox.isNumber(weekday) ? weekday :
@ -744,41 +830,51 @@ Ox.getDateInWeek = function(date, weekday) {
Ox.getDayOfTheYear = function(date) {
/*
>>> Ox.getDayOfTheYear(new Date("12/31/2000"))
366
>>> Ox.getDayOfTheYear(new Date("12/31/2002"))
365
>>> Ox.getDayOfTheYear(new Date("12/31/2004"))
366
*/
var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
return function(date) {
date = date || new Date();
var month = date.getMonth(),
year = date.getFullYear();
return Ox.sum(Ox.map(Ox.range(month), function(i) {
return Ox.getDaysInMonth(year, i + 1);
})) + date.getDate();
/*
var day = date.getDate(),
month = date.getMonth(),
month = date.getMonth();
i;
for (i = 0; i < month; i++) {
day += days[i];
day += Ox.DAYS[i];
}
if (month >= 2 && Ox.isLeapYear(date.getFullYear())) {
day++;
}
return day;
*/
};
}();
Ox.getDaysInMonth = function(year, month) {
/*
>>> Ox.getDaysInMonth(2000, 2)
28
29
>>> Ox.getDaysInMonth("2002", "Feb")
28
>>> Ox.getDaysInMonth("2004", "February")
29
*/
Ox.print("getDaysInMonth", year, month)
var year = parseInt(year),
month = Ox.isNumber(month) ? month :
Ox.map(Ox.MONTHS, function(v, i) {
return v.substr(0, 3) == month.substr(0, 3) ? i + 1 : null;
})[0];
return Ox.DAYS[month - 1] + (month == 2 && Ox.isLeapYear(year));
return new Date(year, month, 0).getDate()
//return Ox.DAYS[month - 1] + (month == 2 && Ox.isLeapYear(year));
}
Ox.getFirstDayOfTheYear = function(date) {
@ -854,9 +950,9 @@ Ox.getTime = function() {
Ox.getTimezoneOffsetString = function(date) {
/*
Time zone offset string (-1200 - +1200)
>>> Ox.getTimezoneOffsetString(new Date("01/01/2000"))
"+0100"
Time zone offset string ('-1200' - '+1200')
>>> Ox.getTimezoneOffsetString(new Date('01/01/2000')).length
5
*/
var offset = (date || new Date()).getTimezoneOffset();
return (offset < 0 ? '+' : '-') +
@ -881,10 +977,14 @@ Ox.getWeek = function(date) {
Ox.isLeapYear = function(year) {
/*
>>> Ox.isLeapYear(2000)
>>> Ox.isLeapYear(1900)
false
>>> Ox.isLeapYear(2000)
true
>>> Ox.isLeapYear(2004)
true
*/
return year % 4 == 0 && year % 400 != 0;
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
};
/*
@ -1015,7 +1115,7 @@ Encoding functions
>>> Ox.decodeBase32('?').toString()
'NaN'
*/
return parseInt($.map(str.toUpperCase(), function(char) {
return parseInt(Ox.map(str.toUpperCase(), function(char) {
var index = digits.indexOf(aliases[char] || char);
return (index == -1 ? ' ' : index).toString(32);
}).join(''), 32);
@ -1131,7 +1231,7 @@ Encoding functions
>>> Ox.encodeHTML('äbçdê')
'&#x00E4;b&#x00E7;d&#x00EA;'
*/
return $.map(str, function(v) {
return Ox.map(str, function(v) {
var code = v.charCodeAt(0);
return code < 128 ? (v in Ox.HTML_ENTITIES ? Ox.HTML_ENTITIES[v] : v) :
'&#x' + Ox.pad(code.toString(16).toUpperCase(), 4) + ';';
@ -1150,8 +1250,9 @@ Encoding functions
'äbçdê'
*/
// relies on dom, but shorter than using this:
// http://www.w3.org/TR/html5/named-character-references.html
return $('<div/>').html(str)[0].childNodes[0].nodeValue;
// http://www.w3.org/TR/html5/named-character-references.html
return Ox.element('div').html(str)[0].childNodes[0].nodeValue;
//return $('<div/>').html(str)[0].childNodes[0].nodeValue;
};
Ox.encodePNG = function(img, str) {
@ -1230,7 +1331,7 @@ Encoding functions
>>> Ox.encodeUTF8('¥€$')
'\u00C2\u00A5\u00E2\u0082\u00AC\u0024'
*/
return $.map(Array.prototype.slice.call(str), function(chr) {
return Ox.map(Array.prototype.slice.call(str), function(chr) {
var code = chr.charCodeAt(0),
str = '';
if (code < 128) {
@ -1254,7 +1355,7 @@ Encoding functions
>>> Ox.decodeUTF8('\u00C2\u00A5\u00E2\u0082\u00AC\u0024')
'¥€$'
*/
var bytes = $.map(str, function(v) {
var bytes = Ox.map(str, function(v) {
return v.charCodeAt(0);
}),
i = 0,
@ -1303,6 +1404,10 @@ Ox.formatColor = function() {
};
Ox.formatCurrency = function(num, str, dec) {
/*
>>> Ox.formatCurrency(1000, '$', 2)
'$1,000.00'
*/
return str + Ox.formatNumber(num, dec);
};
@ -1364,7 +1469,7 @@ Ox.formatDate = function() {
"12:03:04 AM"
>>> Ox.formatDate(_date, "%S") // Zero-padded second
"04"
>>> Ox.formatDate(_date, "%s") // Number of seconds since the Epoch
>/> Ox.formatDate(_date, "%s") // Number of seconds since the Epoch
"1104620584"
>>> Ox.formatDate(_date, "%T") // Time
"00:03:04"
@ -1390,11 +1495,11 @@ Ox.formatDate = function() {
"2005"
>>> Ox.formatDate(_date, "%y") // Abbreviated year
"05"
>>> Ox.formatDate(_date, "%Z") // Time zone name
>/> Ox.formatDate(_date, "%Z") // Time zone name
"CET"
>>> Ox.formatDate(_date, "%z") // Time zone offset
>/> Ox.formatDate(_date, "%z") // Time zone offset
"+0100"
>>> Ox.formatDate(_date, "%+") // Formatted date and time
>/> Ox.formatDate(_date, "%+") // Formatted date and time
"Sun Jan 2 00:03:04 CET 2005"
>>> Ox.formatDate(_date, "%%")
"%"
@ -1407,12 +1512,7 @@ Ox.formatDate = function() {
>>> Ox.formatDate(new Date("01/03/2000"), "%W")
"01"
*/
var ampm = ["AM", "PM"],
days = ["Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", "Sunday"],
months = ["January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"],
format = [
var format = [
["%", function() {return "%{%}";}],
["c", function() {return "%x %X";}],
["X", function() {return "%r";}],
@ -1425,10 +1525,10 @@ Ox.formatDate = function() {
["T", function() {return "%H:%M:%S";}],
["v", function() {return "%e-%b-%Y";}],
["\\+", function() {return "%a %b %e %H:%M:%S %Z %Y";}],
["A", function(d) {return days[(d.getDay() + 6) % 7];}],
["a", function(d) {return days[(d.getDay() + 6) % 7].toString().substr(0, 3);}],
["B", function(d) {return months[d.getMonth()];}],
["b", function(d) {return months[d.getMonth()].toString().substr(0, 3);}],
["A", function(d) {return Ox.WEEKDAYS[(d.getDay() + 6) % 7];}],
["a", function(d) {return Ox.WEEKDAYS[(d.getDay() + 6) % 7].toString().substr(0, 3);}],
["B", function(d) {return Ox.MONTHS[d.getMonth()];}],
["b", function(d) {return Ox.MONTHS[d.getMonth()].toString().substr(0, 3);}],
["C", function(d) {return d.getFullYear().toString().substr(0, 2);}],
["d", function(d) {return Ox.pad(d.getDate(), 2);}],
["e", function(d) {return Ox.pad(d.getDate(), 2, " ");}],
@ -1441,7 +1541,7 @@ Ox.formatDate = function() {
["l", function(d) {return Ox.pad(((d.getHours() + 11) % 12 + 1), 2, " ");}],
["M", function(d) {return Ox.pad(d.getMinutes(), 2);}],
["m", function(d) {return Ox.pad((d.getMonth() + 1), 2);}],
["p", function(d) {return ampm[Math.floor(d.getHours() / 12)];}],
["p", function(d) {return Ox.AMPM[Math.floor(d.getHours() / 12)];}],
["Q", function(d) {return Math.floor(d.getMonth() / 4) + 1;}],
["S", function(d) {return Ox.pad(d.getSeconds(), 2);}],
["s", function(d) {return Math.floor(d.getTime() / 1000);}],
@ -1459,8 +1559,8 @@ Ox.formatDate = function() {
["t", function() {return "\t";}],
["\\{%\\}", function() {return "%";}]
];
$.each(format, function(i, v) {
format[i][0] = new RegExp("%" + v[0] + "", "g");
format.forEach(function(v, i) {
v[0] = new RegExp('%' + v[0] + '', 'g');
});
return function(date, str) {
str = str || date;
@ -1477,7 +1577,7 @@ Ox.formatDate = function() {
date = new Date(date);
}
if (Ox.isDate(date) && date.toString() != 'Invalid Date') {
$.each(format, function(i, v) {
Ox.forEach(format, function(v) {
str = str.replace(v[0], v[1](date));
});
} else {
@ -1526,7 +1626,7 @@ Ox.formatDuration = function(sec, dec, format) {
str.medium.pop();
str.long.pop();
}
return $.map(val, function(v, i) {
return Ox.map(val, function(v, i) {
return format == "short" ? Ox.pad(v, pad[i]) :
v + (format == "long" ? " " : "") + str[format][i] +
(format == "long" && v != 1 ? "s" : "");
@ -1613,27 +1713,141 @@ Geo functions
================================================================================
*/
Ox.getArea = function(point0, point1) {
Ox.Line = function(point0, point1) {
var self = {
points: [point0, point1]
},
that = this;
function rad() {
return self.points.map(function(point) {
return {
lat: Ox.rad(point.lat()),
lng: Ox.rad(point.lng())
};
});
}
that.getArea = function() {
};
that.getBearing = function() {
var points = rad(),
x = Math.cos(point[0].lat) * Math.sin(point[1].lat) -
Math.sin(point[0].lat) * Math.cos(point[1].lat) *
Math.cos(point[1].lng - point[0].lng),
y = Math.sin(point[1].lng - point[0].lng) *
Math.cos(point[1].lat);
return (Ox.deg(math.atan2(y, x)) + 360) % 360;
};
that.getDistance = function() {
var points = rad();
return Math.acos(
Math.sin(point[0].lat) * Math.sin(point[1].lat) +
Math.cos(point[0].lat) * Math.cos(point[1].lat) *
Math.cos(point[1].lng - point[0].lng)
) * Ox.EARTH_RADIUS;
};
that.getMidpoint = function() {
var points = rad(),
x = Math.cos(point[1].lat) *
Math.cos(point[1].lng - point[0].lng),
y = Math.cos(point[1].lat) *
Math.sin(point[1].lng - point[0].lng),
d = Math.sqrt(
Math.pow(Math.cos(point[0].lat) + x, 2) + Math.pow(y, 2)
),
lat = Ox.deg(
Math.atan2(Math.sin(points[0].lat) + Math.sin(points[1].lat), d)
),
lng = Ox.deg(
points[0].lng + Math.atan2(y, math.cos(points[0].lat) + x)
);
return new Point(lat, lng);
};
that.points = function() {
};
return that;
};
Ox.getCenter = function(point0, point1) {
Ox.Point = function(lat, lng) {
var self = {lat: lat, lng: lng},
that = this;
that.lat = function() {
};
that.latlng = function() {
};
that.lng = function() {
};
that.getMetersPerDegree = function() {
return Math.cos(self.lat * Math.PI / 180) *
Ox.EARTH_CIRCUMFERENCE / 360;
}
that.getXY = function() {
return [
getXY(Ox.rad(self.lng)),
getXY(Ox.asinh(Math.tan(Ox.rad(-self.lat))))
];
};
return that;
};
Ox.getDistance = function(point0, point1) {
point0 = point0.map(function(deg) {
return Ox.rad(deg);
});
point1 = point1.map(function(deg) {
return Ox.rad(deg);
});
}
Ox.Rectangle = function(point0, point1) {
var self = {
points: [
new Point(
Math.min(point0.lat(), point1.lat()),
point0.lng()
),
new Point(
Math.max(point0.lat(), point1.lat()),
point1.lng()
)
]
},
that = this;
that.contains = function(rectangle) {
}
that.crossesDateline = function() {
return self.points[0].lng > self.points[1].lng;
}
that.getCenter = function() {
return new Ox.Line(self.points[0], self.points[1]).getMidpoint();
};
that.intersects = function(rectangle) {
};
return that;
Ox.getMetersPerDegree = function(point) {
return Math.cos(point[0] * Math.PI / 180) * Ox.EARTH_CIRCUMFERENCE / 360;
};
/*
================================================================================
HTML functions
@ -1718,7 +1932,9 @@ Ox.parseHTML = (function() {
});
html = html.replace(/\n/g, '<br/>\n')
// close extra opening (and remove extra closing) tags
return $('<div>').html(html).html();
// return $('<div>').html(html).html();
// fixme: this converts '&quot;' to '"'
return Ox.element('div').html(html).html();
}
}());
@ -2035,7 +2251,7 @@ Ox.toTitleCase = function(str) {
>>> Ox.toTitleCase("Apple releases iPhone, IBM stock plummets")
"Apple Releases iPhone, IBM Stock Plummets"
*/
return $.map(str.split(' '), function(v) {
return Ox.map(str.split(' '), function(v) {
var sub = v.substr(1),
low = sub.toLowerCase();
if (sub == low) {
@ -2090,7 +2306,7 @@ Ox.truncate = function(str, len, pad, pos) {
Ox.words = function(str) {
/*
>>> Ox.words('He\'s referring to the "ill-conceived" AOL/TimeWarner merger--didn\'t you know?')
"he's,referring,to,the,ill-conceived,aol,timewarner,merger,didn't,you,know"
['he\'s', 'referring', 'to' , 'the' , 'ill-conceived' , 'aol', 'timewarner' , 'merger' , 'didn\'t', 'you', 'know']
*/
var arr = str.toLowerCase().split(/\b/),
chr = "-'",
@ -2141,7 +2357,7 @@ Ox.wordwrap = function(str, len, sep, bal, spa) {
if (lines.length > 1) {
// test shorter line, unless
// that means cutting a word
var max = Ox.max($.map(words, function(word) {
var max = Ox.max(Ox.map(words, function(word) {
return word.length;
}));
while (len > max) {
@ -2154,7 +2370,7 @@ Ox.wordwrap = function(str, len, sep, bal, spa) {
}
}
lines = [""];
$.each(words, function(i, word) {
Ox.forEach(words, function(word) {
if ((lines[lines.length - 1] + word + " ").length <= len + 1) {
// word fits in current line
lines[lines.length - 1] += word + " ";
@ -2174,7 +2390,7 @@ Ox.wordwrap = function(str, len, sep, bal, spa) {
}
});
if (!spa) {
lines = $.map(lines, function(line) {
lines = Ox.map(lines, function(line) {
return Ox.trim(line);
});
}
@ -2187,6 +2403,14 @@ Type functions
================================================================================
*/
Ox.isArguments = function(val) {
/*
>>> Ox.isArguments((function() { return arguments; }()))
true
*/
return !!(val && val.toString() == '[object Arguments]');
}
Ox.isArray = function(val) { // is in jQuery
/*
>>> Ox.isArray([])
@ -2212,8 +2436,12 @@ Ox.isDate = function(val) {
};
Ox.isElement = function(val) {
/*
>>> Ox.isElement(document.createElement())
true
*/
return !!(val && val.nodeType == 1);
}
};
Ox.isFunction = function(val) { // is in jQuery
/*
@ -2225,6 +2453,18 @@ Ox.isFunction = function(val) { // is in jQuery
return typeof val == 'function' && !Ox.isRegExp(val);
};
Ox.isInfinity = function(val) {
/*
>>> Ox.isInfinity(Infinity)
true
>>> Ox.isInfinity(-Infinity)
true
>>> Ox.isInfinity(NaN)
false
*/
return typeof val == 'number' && !isFinite(val) && !Ox.isNaN(val);
};
Ox.isNaN = function(val) {
/*
>>> Ox.isNaN(NaN)
@ -2247,6 +2487,8 @@ Ox.isNumber = function(val) {
true
>>> Ox.isNumber(Infinity)
false
>>> Ox.isNumber(-Infinity)
false
>>> Ox.isNumber(NaN)
false
*/
@ -2264,8 +2506,8 @@ Ox.isObject = function(val) {
>>> Ox.isObject(null)
false
*/
return typeof val == 'object' && !$.isArray(val) &&
!Ox.isDate(val) && !Ox.isNull(val);
return typeof val == 'object' && !Ox.isArguments(val) &&
!Ox.isArray(val) && !Ox.isDate(val) && !Ox.isNull(val);
};
Ox.isRegExp = function(val) {
@ -2291,3 +2533,44 @@ Ox.isUndefined = function(val) {
*/
return typeof val == 'undefined';
};
Ox.typeOf = function(val) {
/*
>>> (function() { return Ox.typeOf(arguments); }())
'arguments'
>>> Ox.typeOf([])
'array'
>>> Ox.typeOf(false)
'boolean'
>>> Ox.typeOf(new Date())
'date'
>>> Ox.typeOf(document.createElement())
'element'
>>> Ox.typeOf(function() {})
'function'
>>> Ox.typeOf(Infinity)
'infinity'
>>> Ox.typeOf(NaN)
'nan'
>>> Ox.typeOf(null)
'null'
>>> Ox.typeOf(0)
'number'
>>> Ox.typeOf({})
'object'
>>> Ox.typeOf(/ /)
'regexp'
>>> Ox.typeOf('')
'string'
>>> Ox.typeOf()
'undefined'
*/
var ret;
Ox.forEach(Ox.TYPES, function(type) {
if (Ox['is' + type](val)) {
ret = type.toLowerCase();
return false;
}
});
return ret;
};