Ox.load.UI = function(options, callback) { options = Ox.extend({ debug: false, hideScreen: true, loadImages: true, showScreen: false, theme: 'classic' }, options); var browsers = [ { name: 'Chrome', regexp: /Chrome\/(\d+)\./, url: 'http://www.google.com/chrome/', version: 10 }, { name: 'Firefox', regexp: /Firefox\/(\d+)\./, url: 'http://www.mozilla.org/firefox/', version: 4 }, { name: 'Safari', regexp: /Version\/(\d+).*? Safari/, url: 'http://www.apple.com/safari/', version: 5 } ], browserSupported = false, loadingInterval; browsers.forEach(function(browser) { // fixme: check if this remains broken in wekbit nightlies // var match = browser.regexp(navigator.userAgent); var match = browser.regexp.exec(navigator.userAgent); if (match && match[1] >= browser.version) { browserSupported = true; } }); Ox.documentReady(function() { Ox.element('body') .addClass('OxTheme' + Ox.toTitleCase(options.theme || 'classic')); options.showScreen && showScreen(); }); loadFiles(); function showScreen() { var body = Ox.element('body'), css = { position: 'absolute', left: 0, top: 0, right: 0, bottom: 0, margin: 'auto', MozUserSelect: 'none', WebkitUserSelect: 'none' }, div = Ox.element('
') .addClass('OxLoadingScreen') .css({ position: 'absolute', left: 0, top: 0, right: 0, bottom: 0, padding: '4px', background: 'rgb(' + ( options.theme == 'classic' ? '240, 240, 240' : '16, 16, 16') + ')', opacity: 1, zIndex: 1000 }) .appendTo(body); browserSupported ? showIcon() : showWarning(); function showIcon() { // SVG transform performs worse than CSS transform /* var src = Ox.PATH + 'Ox.UI/themes/' + options.theme + '/svg/symbolLoadingAnimated.svg' Ox.loadFile(src, function() { Ox.element('') .attr({ src: src }) .css(Ox.extend({ width: '32px', height: '32px' }, css)) .mousedown(function(e) { e.preventDefault() }) .appendTo(div); }); */ var deg = 0, element, src = Ox.PATH + 'Ox.UI/themes/' + options.theme + '/svg/symbolLoading.svg' Ox.loadFile(src, function() { element = Ox.element('') .attr({ src: src }) .css(Ox.extend({ width: '32px', height: '32px' }, css)) .mousedown(function(e) { e.preventDefault() }) .appendTo(div); loadingInterval = setInterval(function() { deg = (deg + 30) % 360; element.css({ MozTransform: 'rotate(' + deg + 'deg)', WebkitTransform: 'rotate(' + deg + 'deg)' }); }, 83); }); } function showWarning() { //Ox.print('showWarning') var counter = 0, message = 'Browser not supported, use ' + browsers.map(function(browser, i) { return browser.name + ( i == browsers.length - 1 ? '.' : i == browsers.length - 2 ? ' or' : ',' ); }).join(' '); div.addClass('OxError'); browsers.forEach(function(browser) { browser.src = Ox.PATH + 'Ox.UI/png/browser' + browser.name + '128.png'; Ox.loadFile(browser.src, function() { ++counter == browsers.length && showIcons(); }); }); function showIcons() { var box = Ox.element('
') .css(Ox.extend({ width: (browsers.length * 72) + 'px', height: '72px' }, css)) .appendTo(div); browsers.forEach(function(browser, i) { var link = Ox.element('') .attr({ href: browser.url, title: browser.name + ' ' + browser.version }) .css({ position: 'absolute', left: (i * 72) + 'px', width: '72px', height: '72px', }) .appendTo(box); Ox.element('') .attr({ src: browser.src }) .css(Ox.extend({ width: '64px', height: '64px', border: 0, cursor: 'pointer' }, css)) .mousedown(function(e) { e.preventDefault(); }) .appendTo(link); }); } } } function loadFiles() { Ox.loadFile(Ox.PATH + 'jquery/jquery' + (options.debug ? '' : '.min') + '.js', function() { initUI(); $.getJSON(Ox.UI.PATH + 'json/Ox.UI.json', function(files) { var promises = []; if (options.debug == false) { files = files.filter(function(file) { return !Ox.startsWith(file, 'Ox.UI/js/'); }); files.push('Ox.UI/js/Ox.UI.js'); } if (options.loadImages == false) { files = files.filter(function(file) { return ['png', 'svg'].indexOf(file.split('.').pop()) == -1; }); } files.forEach(function(file) { // fixme: opera doesnt fire onload for svg if ($.browser.opera && Ox.endsWith(file, '.svg')) { return; } //Ox.print('load', file) var dfd = new $.Deferred(); Ox.loadFile(Ox.PATH + file, function() { dfd.resolve(); }); promises.push(dfd.promise()); }); //Ox.print('promises.length', promises.length) $.when.apply(null, promises) .done(function() { //Ox.print('promises done') $(function() { if (options.showScreen && options.hideScreen) { Ox.UI.hideLoadingScreen(); } callback(browserSupported); }); }) .fail(function() { throw new Error('File not found.') }); }); }); } function initUI() { Ox.UI = {}; Ox.UI.ready = (function() { var callbacks = []; $(function() { Ox.UI.$body = $('body'); Ox.UI.$document = $(document); Ox.UI.$head = $('head'); Ox.UI.$window = $(window); callbacks.forEach(function(callback) { callback(); }); delete callbacks; }); return function(callback) { if (Ox.UI.$window) { callback(); } else { callbacks.push(callback); } } }()); Ox.UI.DEFAULT_THEME = 'classic'; // fixme: needed? Ox.UI.DIMENSIONS = { horizontal: ['width', 'height'], vertical: ['height', 'width'] }; Ox.UI.EDGES = { horizontal: ['left', 'right', 'top', 'bottom'], vertical: ['top', 'bottom', 'left', 'right'] }; Ox.UI.elements = {}; Ox.UI.getImagePath = function(filename) { // fixme: not the best idea to do this here if (filename == 'symbolPlay.svg') { filename = 'symbolRight.svg'; } return Ox.UI.PATH + 'themes/' + Ox.Theme() + '/' + filename.split('.').pop() + '/' + filename; }; Ox.UI.hideLoadingScreen = function() { //Ox.print('hideLoadingScreen') var $div = $('.OxLoadingScreen'), error = $div.is('.OxError'); //$div.find('img').remove(); $div.animate({ opacity: error ? 0.9 : 0 }, 1000, function() { if (error) { $div.click(function() { $div.remove(); }); } else { clearInterval(loadingInterval); $div.remove(); } }); }; Ox.UI.IMAGE_CACHE = []; Ox.UI.PATH = Ox.PATH + 'Ox.UI/'; Ox.UI.SCROLLBAR_SIZE = $.browser.mozilla ? 16 : 12; // fixme: the follwing should be deprecated Ox.UI.getBarSize = function(size) { var sizes = { small: 20, medium: 24, large: 28 }; return sizes[size]; }; Ox.UI.symbols = { alt: '\u2325', apple: '\uF8FF', arrow_down: '\u2193', arrow_left: '\u2190', arrow_right: '\u2192', arrow_up: '\u2191', backspace: '\u232B', backup: '\u2707', ballot: '\u2717', black_star: '\u2605', burn: '\u2622', caps_lock: '\u21EA', check: '\u2713', //clear: '\u2327', clear: '\u00D7', click: '\uF803', close: '\u2715', command: '\u2318', control: '\u2303', cut: '\u2702', 'delete': '\u2326', diamond: '\u25C6', edit: '\uF802', eject: '\u23CF', escape: '\u238B', end: '\u2198', enter: '\u2324', fly: '\u2708', gear: '\u2699', home: '\u2196', info: '\u24D8', navigate: '\u2388', option: '\u2387', page_up: '\u21DE', page_down: '\u21DF', redo: '\u21BA', 'return': '\u21A9', //select: '\u21D5', select: '\u25BE', shift: '\u21E7', sound: '\u266B', space: '\u2423', tab: '\u21E5', trash: '\u267A', triangle_down: '\u25BC', triangle_left: '\u25C0', triangle_right: '\u25BA', triangle_up: '\u25B2', undo: '\u21BB', voltage: '\u26A1', warning: '\u26A0', white_star: '\u2606' }; } };