updates for loader
This commit is contained in:
parent
13501e2da8
commit
7430ef1023
10 changed files with 429 additions and 192 deletions
|
@ -1,2 +1,3 @@
|
||||||
.DS_Store
|
.DS_Store
|
||||||
build/js/*
|
build/js/*
|
||||||
|
build/css
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
<head>
|
<head>
|
||||||
<title>ox.js calendar demo</title>
|
<title>ox.js calendar demo</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||||
<link rel="stylesheet" type="text/css" href="../../build/css/ox.ui.css"/>
|
|
||||||
<script type="text/javascript" src="../../build/js/OxUI.js"></script>
|
<script type="text/javascript" src="../../build/js/OxUI.js"></script>
|
||||||
<script type="text/javascript" src="js/calendar.js"></script>
|
<script type="text/javascript" src="js/calendar.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
|
@ -1,10 +1,17 @@
|
||||||
|
console.log('calling Ox.UI()')
|
||||||
|
//console.log('Ox =', Ox)
|
||||||
|
//console.log('Ox.UI =', Ox.UI)
|
||||||
|
|
||||||
Ox.UI(function() {
|
Ox.UI(function() {
|
||||||
|
|
||||||
|
console.log('running Ox.UI()')
|
||||||
|
//console.log('Ox =', Ox)
|
||||||
|
|
||||||
Ox.UI.ready(function() {
|
Ox.UI.ready(function() {
|
||||||
|
|
||||||
Ox.theme('modern');
|
Ox.theme('modern');
|
||||||
|
|
||||||
Ox.print('$$$$', Ox.Calendar)
|
//Ox.print('$$$$', Ox.Calendar)
|
||||||
|
|
||||||
new Ox.Calendar({
|
new Ox.Calendar({
|
||||||
date: new Date(0),
|
date: new Date(0),
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
@import url("ox.ui.classic.css");
|
@import url("OxUI.classic.css");
|
||||||
@import url("ox.ui.modern.css");
|
@import url("OxUI.modern.css");
|
||||||
@import url("ox.ui.future.css");
|
@import url("OxUI.future.css");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================================================================================
|
================================================================================
|
|
@ -926,7 +926,7 @@ Ox.getDateInWeek = function(date, weekday, utc) {
|
||||||
return date;
|
return date;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ox.getDayOfTheYear = function(date) {
|
Ox.getDayOfTheYear = function(date, utc) {
|
||||||
/*
|
/*
|
||||||
>>> Ox.getDayOfTheYear(new Date("12/31/2000"))
|
>>> Ox.getDayOfTheYear(new Date("12/31/2000"))
|
||||||
366
|
366
|
||||||
|
|
|
@ -1,66 +1,336 @@
|
||||||
//vim: et:ts=4:sw=4:sts=4:ft=js
|
//vim: et:ts=4:sw=4:sts=4:ft=js
|
||||||
|
|
||||||
|
/*
|
||||||
|
OxUI Loader
|
||||||
|
|
||||||
|
Provides function Ox.UI([options], callback) that fires when
|
||||||
|
OxUI.css, Ox.js und jquery.js have loaded
|
||||||
|
all images have loaded
|
||||||
|
the DOM is ready
|
||||||
|
*/
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
var path = Array.prototype.slice.apply(
|
var files = ['css/OxUI.css', 'js/Ox.js', 'js/jquery.js'],
|
||||||
|
path = Array.prototype.slice.apply(
|
||||||
document.getElementsByTagName('script')
|
document.getElementsByTagName('script')
|
||||||
).filter(function(script) {
|
).filter(function(element) {
|
||||||
return /OxUI\.js$/(script.src);
|
return /OxUI\.js$/(element.src);
|
||||||
})[0].src.replace('OxUI.js', ''),
|
})[0].src.replace('js/OxUI.js', ''),
|
||||||
scripts = [
|
head = document.getElementsByTagName('head')[0],
|
||||||
{ready: typeof Ox != 'undefined', src: 'Ox.js'},
|
oxUICallback = function() {},
|
||||||
{ready: typeof $ != 'undefined', src: 'jquery.js'}
|
oxUIFunction = function(options, callback) {
|
||||||
],
|
var defaults = {
|
||||||
uiCallback,
|
// 'classic', 'modern', 'verbose' or anything falsy
|
||||||
ready = false,
|
display: 'classic'
|
||||||
readyCallbacks = [];
|
};
|
||||||
|
oxUICallback = arguments.length == 2 ? callback : options;
|
||||||
|
oxUIOptions = arguments.length == 2 && options ? options : {};
|
||||||
|
},
|
||||||
|
oxUIOptions = {},
|
||||||
|
documentReady = false,
|
||||||
|
documentReadyCallbacks = [];
|
||||||
|
|
||||||
|
files.forEach(function(file, i) {
|
||||||
|
files[i] = {
|
||||||
|
ready: isIncluded(file),
|
||||||
|
src: file
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
Ox = typeof Ox != 'undefined' ? Ox : function() {};
|
Ox = typeof Ox != 'undefined' ? Ox : function() {};
|
||||||
Ox.UI = function(callback) {
|
Ox.UI = oxUIFunction;
|
||||||
uiCallback = callback;
|
|
||||||
};
|
|
||||||
|
|
||||||
scripts.forEach(function(script) {
|
waitForDocument();
|
||||||
var element;
|
waitForFiles();
|
||||||
if (!script.ready) {
|
|
||||||
element = document.createElement('script');
|
files.forEach(function(file) {
|
||||||
element.src = path + script.src;
|
var element,
|
||||||
element.type = 'text/javascript';
|
isCSS = isFileType(file.src, 'css');
|
||||||
element.onload = function() {
|
if (!file.ready) {
|
||||||
script.ready = true;
|
element = document.createElement(isCSS ? 'link' : 'script');
|
||||||
|
element[isCSS ? 'href' : 'src'] = path + file.src;
|
||||||
|
element.type = isCSS ? 'text/css' : 'text/javascript';
|
||||||
|
if (isCSS) {
|
||||||
|
element.rel = 'stylesheet';
|
||||||
|
waitForCSS();
|
||||||
|
} else {
|
||||||
|
element.onload = onload;
|
||||||
|
}
|
||||||
|
head.appendChild(element);
|
||||||
|
}
|
||||||
|
function onload() {
|
||||||
|
file.ready = true;
|
||||||
|
console.log(file.src, 'ready')
|
||||||
|
if (file.src == 'js/Ox.js') {
|
||||||
|
Ox.UI = oxUIFunction;
|
||||||
|
}
|
||||||
|
waitForFiles();
|
||||||
|
}
|
||||||
|
function waitForCSS() {
|
||||||
|
try {
|
||||||
|
element.sheet.cssRule;
|
||||||
onload();
|
onload();
|
||||||
};
|
} catch(e) {
|
||||||
document.getElementsByTagName('head')[0].appendChild(element);
|
setTimeout(waitForCSS, 25);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
onload();
|
function isFileType(src, type) {
|
||||||
|
return new RegExp('\.' + type + '$')(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isIncluded(src) {
|
||||||
|
var isCSS = isFileType(src);
|
||||||
|
return Array.prototype.slice.apply(
|
||||||
|
document.getElementsByTagName(isCSS ? 'link' : 'script')
|
||||||
|
).map(function(element) {
|
||||||
|
return element[isCSS ? 'href' : 'src'] == path + src;
|
||||||
|
}).reduce(function(prev, curr) {
|
||||||
|
return prev || curr;
|
||||||
|
}, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function waitForDocument() {
|
||||||
|
document.addEventListener('DOMContentLoaded', onload, false);
|
||||||
function onload() {
|
function onload() {
|
||||||
if (scripts.map(function(script) {
|
console.log('DOMContentLoaded')
|
||||||
return script.ready;
|
document.removeEventListener('DOMContentLoaded', onload, false);
|
||||||
|
bootOxUI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function waitForFiles() {
|
||||||
|
files.map(function(file) {
|
||||||
|
return file.ready;
|
||||||
}).reduce(function(pre, cur) {
|
}).reduce(function(pre, cur) {
|
||||||
return pre && cur;
|
return pre && cur;
|
||||||
})) {
|
}) && loadOxUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
function bootOxUI() {
|
||||||
|
|
||||||
|
var body = element('body'),
|
||||||
|
css = {
|
||||||
|
position: 'absolute',
|
||||||
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
margin: 'auto',
|
||||||
|
MozUserSelect: 'none',
|
||||||
|
WebkitUserSelect: 'none'
|
||||||
|
},
|
||||||
|
div = element('<div>')
|
||||||
|
.css({
|
||||||
|
position: 'absolute',
|
||||||
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
background: 'rgb(240, 240, 240)',
|
||||||
|
opacity: 1,
|
||||||
|
zIndex: 1000
|
||||||
|
})
|
||||||
|
.appendTo(body),
|
||||||
|
userAgents = [
|
||||||
|
{name: 'Chrome', url: 'http://www.google.com/chrome/'},
|
||||||
|
{name: 'Firefox', url: 'http://www.mozilla.org/firefox/'},
|
||||||
|
{name: 'Safari', url: 'http://www.apple.com/safari/'}
|
||||||
|
];
|
||||||
|
|
||||||
|
getUserAgent() ? start() : stop();
|
||||||
|
|
||||||
|
function getUserAgent() {
|
||||||
|
var userAgent = '';
|
||||||
|
userAgents.forEach(function(v) {
|
||||||
|
if (navigator.userAgent.indexOf(v.name) > -1) {
|
||||||
|
userAgent = v.name;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return userAgent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function element(str) {
|
||||||
|
// Generic HTML Element Object (mimics jQuery)
|
||||||
|
return {
|
||||||
|
0: str[0] == '<' ?
|
||||||
|
document.createElement(str.substr(1, str.length - 2)) :
|
||||||
|
document.getElementsByTagName(str)[0],
|
||||||
|
addClass: function(str) {
|
||||||
|
this[0].className = str;
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
append: function(element) {
|
||||||
|
this[0].appendChild(element[0]);
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
appendTo: function(element) {
|
||||||
|
element[0].appendChild(this[0]);
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
attr: function(obj) {
|
||||||
|
for (var key in obj) {
|
||||||
|
this[0].setAttribute(key, obj[key]);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
css: function(obj) {
|
||||||
|
for (var key in obj) {
|
||||||
|
this[0].style[key] = obj[key];
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
html: function(str) {
|
||||||
|
this[0].innerHTML = str;
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
mousedown: function(fn) {
|
||||||
|
this[0].onmousedown = fn;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function start() {
|
||||||
|
var image = new Image(),
|
||||||
|
src = path + 'svg/ox.ui.classic/symbolLoading.svg';
|
||||||
|
image.onload = function() {
|
||||||
|
element('<img>')
|
||||||
|
.attr({
|
||||||
|
src: src
|
||||||
|
})
|
||||||
|
.css(css)
|
||||||
|
.css({
|
||||||
|
width: '32px',
|
||||||
|
height: '32px'
|
||||||
|
})
|
||||||
|
.mousedown(function(e) {
|
||||||
|
e.preventDefault()
|
||||||
|
})
|
||||||
|
.appendTo(div);
|
||||||
|
};
|
||||||
|
image.src = src;
|
||||||
|
}
|
||||||
|
|
||||||
|
function stop() {
|
||||||
|
var counter = 0;
|
||||||
|
userAgents.forEach(function(userAgent) {
|
||||||
|
var image = new Image();
|
||||||
|
userAgent.src = path + 'png/ox.ui/browser' + userAgent.name + '128.png';
|
||||||
|
image.onload = function() {
|
||||||
|
++counter == userAgents.length && loaded();
|
||||||
|
}
|
||||||
|
image.src = userAgent.src;
|
||||||
|
});
|
||||||
|
function loaded() {
|
||||||
|
var box = element('<div>')
|
||||||
|
.css(css)
|
||||||
|
.appendTo(div);
|
||||||
|
userAgents.forEach(function(userAgent, i) {
|
||||||
|
var link = element('<a>')
|
||||||
|
.attr({
|
||||||
|
href: userAgents[name],
|
||||||
|
title: name
|
||||||
|
})
|
||||||
|
.css({
|
||||||
|
position: 'absolute',
|
||||||
|
left: (i * 72) + 'px',
|
||||||
|
width: '72px',
|
||||||
|
height: '72px',
|
||||||
|
})
|
||||||
|
.appendTo(box);
|
||||||
|
element('<img>')
|
||||||
|
.css(css)
|
||||||
|
.css({
|
||||||
|
width: '64px',
|
||||||
|
height: '64px',
|
||||||
|
border: 0,
|
||||||
|
cursor: 'pointer'
|
||||||
|
})
|
||||||
|
.mousedown(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
})
|
||||||
|
.appendTo(link);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadOxUI() {
|
||||||
|
|
||||||
Ox.UI = {};
|
Ox.UI = {};
|
||||||
Ox.UI.ready = function(callback) {
|
Ox.UI.ready = function(callback) {
|
||||||
if (!ready) {
|
if (!documentReady) {
|
||||||
readyCallbacks.push(callback);
|
documentReadyCallbacks.push(callback);
|
||||||
} else {
|
} else {
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$.getJSON(path + 'json/OxUI.json', function(data) {
|
||||||
|
|
||||||
|
var $head = $('head'),
|
||||||
|
promises = [waitForDocument()];
|
||||||
|
// fixme: find a better way to not wait for flags
|
||||||
|
data = data.filter(function(image) {
|
||||||
|
return !Ox.startsWith(image, 'svg/ox.map/');
|
||||||
|
});
|
||||||
|
data.forEach(function(src) {
|
||||||
|
promises.push(loadFile(src));
|
||||||
|
});
|
||||||
|
$.when.apply(null, promises)
|
||||||
|
.then(function() {
|
||||||
|
var $div = Ox.UI.$body.find('div');
|
||||||
|
Ox.UI.$body.find('img').remove();
|
||||||
|
$div.animate({
|
||||||
|
opacity: 0
|
||||||
|
}, 1000, function() {
|
||||||
|
$div.remove();
|
||||||
|
});
|
||||||
|
oxUICallback();
|
||||||
|
})
|
||||||
|
.fail(function() {
|
||||||
|
throw new Error('File not found.');
|
||||||
|
});
|
||||||
|
|
||||||
|
function loadFile(src) {
|
||||||
|
var dfd = new $.Deferred(),
|
||||||
|
isJS = isFileType(src, 'js'),
|
||||||
|
element = isJS ? document.createElement('script') : new Image();
|
||||||
|
element.onload = dfd.resolve;
|
||||||
|
element.src = path + src;
|
||||||
|
if (isJS) {
|
||||||
|
element.type = 'text/javascript';
|
||||||
|
head.appendChild(element)
|
||||||
|
} else {
|
||||||
|
// need to keep a reference to keep image in cache
|
||||||
|
Ox.UI.IMAGE_CACHE.push(src);
|
||||||
|
}
|
||||||
|
return dfd.promise();
|
||||||
|
}
|
||||||
|
|
||||||
|
function waitForDocument() {
|
||||||
|
var dfd = new $.Deferred();
|
||||||
$(function() {
|
$(function() {
|
||||||
Ox.UI.$body = $('body');
|
Ox.UI.$body = $('body');
|
||||||
Ox.UI.$document = $(document);
|
Ox.UI.$document = $(document);
|
||||||
Ox.UI.$head = $('head');
|
Ox.UI.$head = $('head');
|
||||||
Ox.UI.$window = $(window);
|
Ox.UI.$window = $(window);
|
||||||
ready = true;
|
documentReady = true;
|
||||||
readyCallbacks.forEach(function(callback) {
|
documentReadyCallbacks.forEach(function(callback) {
|
||||||
callback();
|
callback();
|
||||||
});
|
});
|
||||||
|
dfd.resolve();
|
||||||
});
|
});
|
||||||
|
return dfd.promise();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
Ox.UI.elements = {};
|
Ox.UI.elements = {};
|
||||||
Ox.UI.DEFAULT_THEME = 'classic';
|
Ox.UI.DEFAULT_THEME = 'classic';
|
||||||
|
@ -80,7 +350,7 @@
|
||||||
return Ox.UI.PATH + filename.split('.').pop() +
|
return Ox.UI.PATH + filename.split('.').pop() +
|
||||||
'/ox.ui.' + Ox.UI.theme() + '/' + filename;
|
'/ox.ui.' + Ox.UI.theme() + '/' + filename;
|
||||||
};
|
};
|
||||||
|
Ox.UI.IMAGE_CACHE = [];
|
||||||
Ox.UI.PATH = $('script[src*="OxUI.js"]')
|
Ox.UI.PATH = $('script[src*="OxUI.js"]')
|
||||||
.attr('src').replace('js/OxUI.js', '');
|
.attr('src').replace('js/OxUI.js', '');
|
||||||
Ox.UI.SCROLLBAR_SIZE = $.browser.mozilla ? 16 : 12;
|
Ox.UI.SCROLLBAR_SIZE = $.browser.mozilla ? 16 : 12;
|
||||||
|
@ -157,51 +427,6 @@
|
||||||
warning: '\u26A0',
|
warning: '\u26A0',
|
||||||
white_star: '\u2606'
|
white_star: '\u2606'
|
||||||
};
|
};
|
||||||
Ox.IMAGE_CACHE = [];
|
|
||||||
$.getJSON(Ox.UI.PATH + 'json/OxUI.json', function(data) {
|
|
||||||
|
|
||||||
function loadImage(src) {
|
|
||||||
var dfd = new $.Deferred();
|
|
||||||
var image = new Image();
|
|
||||||
image.onload = function() {
|
|
||||||
dfd.resolve();
|
|
||||||
};
|
|
||||||
image.src = Ox.UI.PATH + src;
|
|
||||||
Ox.IMAGE_CACHE.push(src);
|
|
||||||
return dfd.promise();
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadScript(src) {
|
|
||||||
// jQuery doesn't work here, does some unwanted magic
|
|
||||||
var dfd = new $.Deferred();
|
|
||||||
var script = document.createElement('script');
|
|
||||||
script.onload = function() {
|
|
||||||
dfd.resolve();
|
|
||||||
};
|
|
||||||
script.src = Ox.UI.PATH + src;
|
|
||||||
script.type = 'text/javascript';
|
|
||||||
document.getElementsByTagName('head')[0].appendChild(script);
|
|
||||||
return dfd.promise();
|
|
||||||
}
|
|
||||||
|
|
||||||
var $head = $('head'),
|
|
||||||
promises = [];
|
|
||||||
// fixme: find a better way to not wait for flags
|
|
||||||
data = data.filter(function(image) {
|
|
||||||
return !Ox.startsWith(image, 'svg/ox.map/');
|
|
||||||
});
|
|
||||||
data.forEach(function(src) {
|
|
||||||
if (/\.js$/(src)) {
|
|
||||||
promises.push(loadScript(src));
|
|
||||||
} else {
|
|
||||||
promises.push(loadImage(src));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$.when.apply(null, promises)
|
|
||||||
.done(uiCallback || []);
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,11 @@ for dirname, dirnames, filenames in os.walk(source_path + 'js/'):
|
||||||
elif not '_' in dirname and not filename.endswith('.min.js'):
|
elif not '_' in dirname and not filename.endswith('.min.js'):
|
||||||
files.append(os.path.join(dirname.replace(source_path , '../source/'), filename))
|
files.append(os.path.join(dirname.replace(source_path , '../source/'), filename))
|
||||||
|
|
||||||
|
for dirname, dirnames, filenames in os.walk(source_path + 'css'):
|
||||||
|
for filename in filenames:
|
||||||
|
if filename[:1] != '.':
|
||||||
|
write_link(os.path.join(dirname, filename), build_path + 'css/' + filename)
|
||||||
|
|
||||||
for dirname, dirnames, filenames in os.walk(build_path + 'png'):
|
for dirname, dirnames, filenames in os.walk(build_path + 'png'):
|
||||||
for filename in filenames:
|
for filename in filenames:
|
||||||
if filename[:1] != '.':
|
if filename[:1] != '.':
|
||||||
|
|
Loading…
Reference in a new issue