mirror of
https://github.com/wassname/fullcalendar.git
synced 2026-07-10 00:30:28 +08:00
edcd275c91
notably we have no side effects on the Moment prototype anymore. we subclass
281 lines
5.8 KiB
JavaScript
281 lines
5.8 KiB
JavaScript
|
|
fc.applyAll = applyAll;
|
|
|
|
|
|
|
|
// Create an object that has the given prototype.
|
|
// Just like Object.create
|
|
function createObject(proto) {
|
|
var f = function() {};
|
|
f.prototype = proto;
|
|
return new f();
|
|
}
|
|
|
|
// copy specifically-owned (non-protoype) properties of `b` onto `a`
|
|
function extend(a, b) {
|
|
for (var i in b) {
|
|
if (b.hasOwnProperty(i)) {
|
|
a[i] = b[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* Date
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
|
|
var dayIDs = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
|
|
|
|
|
|
// diffs the two moments into a Duration where full-days are recorded first,
|
|
// then the remaining time.
|
|
function dayishDiff(d1, d0) {
|
|
return moment.duration({
|
|
days: d1.clone().stripTime().diff(d0.clone().stripTime(), 'days'),
|
|
ms: d1.time() - d0.time()
|
|
});
|
|
}
|
|
|
|
|
|
function isNativeDate(input) {
|
|
return Object.prototype.toString.call(input) === '[object Date]' ||
|
|
input instanceof Date;
|
|
}
|
|
|
|
|
|
|
|
/* Event Element Binding
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
|
|
function lazySegBind(container, segs, bindHandlers) {
|
|
container.unbind('mouseover').mouseover(function(ev) {
|
|
var parent=ev.target, e,
|
|
i, seg;
|
|
while (parent != this) {
|
|
e = parent;
|
|
parent = parent.parentNode;
|
|
}
|
|
if ((i = e._fci) !== undefined) {
|
|
e._fci = undefined;
|
|
seg = segs[i];
|
|
bindHandlers(seg.event, seg.element, seg);
|
|
$(ev.target).trigger(ev);
|
|
}
|
|
ev.stopPropagation();
|
|
});
|
|
}
|
|
|
|
|
|
|
|
/* Element Dimensions
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
|
|
function setOuterWidth(element, width, includeMargins) {
|
|
for (var i=0, e; i<element.length; i++) {
|
|
e = $(element[i]);
|
|
e.width(Math.max(0, width - hsides(e, includeMargins)));
|
|
}
|
|
}
|
|
|
|
|
|
function setOuterHeight(element, height, includeMargins) {
|
|
for (var i=0, e; i<element.length; i++) {
|
|
e = $(element[i]);
|
|
e.height(Math.max(0, height - vsides(e, includeMargins)));
|
|
}
|
|
}
|
|
|
|
|
|
function hsides(element, includeMargins) {
|
|
return hpadding(element) + hborders(element) + (includeMargins ? hmargins(element) : 0);
|
|
}
|
|
|
|
|
|
function hpadding(element) {
|
|
return (parseFloat($.css(element[0], 'paddingLeft', true)) || 0) +
|
|
(parseFloat($.css(element[0], 'paddingRight', true)) || 0);
|
|
}
|
|
|
|
|
|
function hmargins(element) {
|
|
return (parseFloat($.css(element[0], 'marginLeft', true)) || 0) +
|
|
(parseFloat($.css(element[0], 'marginRight', true)) || 0);
|
|
}
|
|
|
|
|
|
function hborders(element) {
|
|
return (parseFloat($.css(element[0], 'borderLeftWidth', true)) || 0) +
|
|
(parseFloat($.css(element[0], 'borderRightWidth', true)) || 0);
|
|
}
|
|
|
|
|
|
function vsides(element, includeMargins) {
|
|
return vpadding(element) + vborders(element) + (includeMargins ? vmargins(element) : 0);
|
|
}
|
|
|
|
|
|
function vpadding(element) {
|
|
return (parseFloat($.css(element[0], 'paddingTop', true)) || 0) +
|
|
(parseFloat($.css(element[0], 'paddingBottom', true)) || 0);
|
|
}
|
|
|
|
|
|
function vmargins(element) {
|
|
return (parseFloat($.css(element[0], 'marginTop', true)) || 0) +
|
|
(parseFloat($.css(element[0], 'marginBottom', true)) || 0);
|
|
}
|
|
|
|
|
|
function vborders(element) {
|
|
return (parseFloat($.css(element[0], 'borderTopWidth', true)) || 0) +
|
|
(parseFloat($.css(element[0], 'borderBottomWidth', true)) || 0);
|
|
}
|
|
|
|
|
|
|
|
/* Misc Utils
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
|
|
//TODO: arraySlice
|
|
//TODO: isFunction, grep ?
|
|
|
|
|
|
function noop() { }
|
|
|
|
|
|
function dateCompare(a, b) { // works with moments too
|
|
return a - b;
|
|
}
|
|
|
|
|
|
function arrayMax(a) {
|
|
return Math.max.apply(Math, a);
|
|
}
|
|
|
|
|
|
function smartProperty(obj, name) { // get a camel-cased/namespaced property of an object
|
|
if (obj[name] !== undefined) {
|
|
return obj[name];
|
|
}
|
|
var parts = name.split(/(?=[A-Z])/),
|
|
i=parts.length-1, res;
|
|
for (; i>=0; i--) {
|
|
res = obj[parts[i].toLowerCase()];
|
|
if (res !== undefined) {
|
|
return res;
|
|
}
|
|
}
|
|
return obj['default'];
|
|
}
|
|
|
|
|
|
function htmlEscape(s) {
|
|
return (s + '').replace(/&/g, '&')
|
|
.replace(/</g, '<')
|
|
.replace(/>/g, '>')
|
|
.replace(/'/g, ''')
|
|
.replace(/"/g, '"')
|
|
.replace(/\n/g, '<br />');
|
|
}
|
|
|
|
|
|
function stripHTMLEntities(text) {
|
|
return text.replace(/&.*?;/g, '');
|
|
}
|
|
|
|
|
|
function disableTextSelection(element) {
|
|
element
|
|
.attr('unselectable', 'on')
|
|
.css('MozUserSelect', 'none')
|
|
.bind('selectstart.ui', function() { return false; });
|
|
}
|
|
|
|
|
|
/*
|
|
function enableTextSelection(element) {
|
|
element
|
|
.attr('unselectable', 'off')
|
|
.css('MozUserSelect', '')
|
|
.unbind('selectstart.ui');
|
|
}
|
|
*/
|
|
|
|
|
|
function markFirstLast(e) { // TODO: use CSS selectors instead
|
|
e.children()
|
|
.removeClass('fc-first fc-last')
|
|
.filter(':first-child')
|
|
.addClass('fc-first')
|
|
.end()
|
|
.filter(':last-child')
|
|
.addClass('fc-last');
|
|
}
|
|
|
|
|
|
function getSkinCss(event, opt) {
|
|
var source = event.source || {};
|
|
var eventColor = event.color;
|
|
var sourceColor = source.color;
|
|
var optionColor = opt('eventColor');
|
|
var backgroundColor =
|
|
event.backgroundColor ||
|
|
eventColor ||
|
|
source.backgroundColor ||
|
|
sourceColor ||
|
|
opt('eventBackgroundColor') ||
|
|
optionColor;
|
|
var borderColor =
|
|
event.borderColor ||
|
|
eventColor ||
|
|
source.borderColor ||
|
|
sourceColor ||
|
|
opt('eventBorderColor') ||
|
|
optionColor;
|
|
var textColor =
|
|
event.textColor ||
|
|
source.textColor ||
|
|
opt('eventTextColor');
|
|
var statements = [];
|
|
if (backgroundColor) {
|
|
statements.push('background-color:' + backgroundColor);
|
|
}
|
|
if (borderColor) {
|
|
statements.push('border-color:' + borderColor);
|
|
}
|
|
if (textColor) {
|
|
statements.push('color:' + textColor);
|
|
}
|
|
return statements.join(';');
|
|
}
|
|
|
|
|
|
function applyAll(functions, thisObj, args) {
|
|
if ($.isFunction(functions)) {
|
|
functions = [ functions ];
|
|
}
|
|
if (functions) {
|
|
var i;
|
|
var ret;
|
|
for (i=0; i<functions.length; i++) {
|
|
ret = functions[i].apply(thisObj, args) || ret;
|
|
}
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
function firstDefined() {
|
|
for (var i=0; i<arguments.length; i++) {
|
|
if (arguments[i] !== undefined) {
|
|
return arguments[i];
|
|
}
|
|
}
|
|
}
|
|
|