Ox.load(function() { var app = { $ui: {}, animate: function() { var home = !app.url.get(); if (home) { app.$ui.logo.attr({ src: app.getSRC('logo') }); app.$ui.screen.show(); app.$ui.label.show(); app.$ui.menu.options({value: ''}).show(); app.$ui.panel.find('.OxButtonGroup').css({opacity: 0}); } else { app.$ui.menu.options({value: app.user('url').split('/')[0]}); } [ 'screen', 'logo', 'label', 'menu', 'switch' ].forEach(function(element) { app.$ui[element].stop().animate( app.getCSS(element), 1000, element == 'screen' ? function() { if (!home) { app.$ui.logo.attr({ src: app.getSRC('logo') }); app.$ui.panel.find('.OxButtonGroup').css({opacity: 1}); app.$ui.screen.hide(); app.$ui.label.hide(); app.$ui.menu.hide().options({value: ''}); } } : void 0 ); }); }, data: { sections: [ {id: 'about', title: 'About'}, {id: 'readme', title: 'Readme'}, {id: 'examples', title: 'Examples'}, {id: 'doc', title: 'Documentation'}, {id: 'downloads', title: 'Downloads'}, {id: 'development', title: 'Development'} ] }, getCSS: function(element) { var css = {}, home = !app.url.get(), center = Math.floor(window.innerWidth / 2), middle = Math.floor(window.innerHeight / 2); if (element == 'label') { css = home ? { top: middle + 16 + 'px', left: center - 128 + 'px', width: '240px', fontSize: '11px', opacity: 1 } : { top: '26px', left: '4px', width: '32px', fontSize: '1px', opacity: 0 } } else if (element == 'loading') { css.top = middle + 40 + 'px' } else if (element == 'logo') { css = home || !app.loaded ? { left: center - 128 + 'px', top: middle - 128 + 'px', width: '256px', height: '128px' } : { top: '8px', left: '8px', width: '32px', height: '16px' }; } else if (element == 'menu') { css = home ? { top: middle + 48 + 'px', left: Math.ceil(center - app.$ui.menu.width() / 2) + 'px' } : { top: '8px', left: Math.ceil(center - app.$ui.menu.width() / 2) + 'px' }; } else if (element == 'screen') { css.opacity = home ? 1 : 0; } else if (element == 'switch') { css = home ? { top: middle + 80 + 'px', right: Math.floor(center - app.$ui.switch.width() / 2) + 'px' } : { top: '8px', right: '8px' }; } else if (element == 'warning') { css = { left: center - 128 + 'px', top: middle + 16 + 'px', }; } return css; }, getSRC: function(element) { var src, home = !app.url.get(), theme = app.user('theme'); if (element == 'icon') { src = 'source/Ox.UI/themes/' + theme + '/png/icon16.png'; } else if (element == 'loading') { src = 'source/Ox.UI/themes/' + theme + '/svg/symbolLoadingAnimated.svg' } else if (element == 'logo') { src = 'source/Ox.UI/themes/' + theme + '/png/logo' + (home || !app.loaded ? 128 : 16) + '.png' } return src; }, init: function() { app.loadScreen(function() { app.loadData(function() { Ox.load({UI: {theme: app.theme}}, app.load); }); }); }, load: function(browserSupported) { var url = app.url.get(); if (url) { app.user({url: url}) } else if (!app.user('url')) { app.user({url: 'about'}); } app.$ui.panel = app.ui.panel() .select(app.user('url')) .appendTo(Ox.$body); // jqueryfy so that we can animate ['screen', 'logo', 'loading'].forEach(function(element) { app.$ui[element] = $('.' + element); }); app.$ui.loading.animate({opacity: 0}, 500, function() { app.$ui.loading.remove(); }); if (!browserSupported) { app.$ui.warning = app.ui.warning() .css(app.getCSS('warning')) .appendTo(Ox.$body); app.$ui.logo .css({cursor: 'pointer'}) .one({ click: function() { app.$ui.warning.remove(); app.load(true); } }); } else if (!url) { app.$ui.logo .css({cursor: 'pointer'}) .bind({ click: function() { app.url.set(app.url.get() ? '' : app.user('url')); } }); ['label', 'menu', 'switch'].forEach(function(element) { app.$ui[element] = app.ui[element]() .css({opacity: 0}) .appendTo(Ox.$body); app.$ui[element] .css(app.getCSS(element)) .animate({opacity: 1}, 500); }); } else { ['label', 'menu', 'switch'].forEach(function(element) { app.$ui[element] = app.ui[element]().appendTo(Ox.$body); app.$ui[element].css(app.getCSS(element)); }); app.$ui.menu.hide(); app.$ui.screen.animate({opacity: 0}, 500, function() { app.$ui.screen.hide(); }); app.$ui.logo.animate({opacity: 0}, 500, function() { app.$ui.logo .attr({src: app.getSRC('logo')}) .css(app.getCSS('logo')) .animate({opacity: 1}, 500, function() { app.$ui.logo .css({cursor: 'pointer'}) .bind({ click: function() { app.url.set(app.url.get() ? '' : app.user('url')); } }); }); }); } Ox.$window.bind({ hashchange: app.urlchange }); app.loaded = true; }, loadData: function(callback) { Ox.getJSON('index.json', function(data) { app.data = Ox.extend(app.data, data); callback(); }); }, loaded: false, loadScreen: function(callback) { app.setTheme(app.user('theme') || 'classic'); app.$ui.screen = app.ui.screen(); app.$ui.loading = app.ui.loading(); app.$ui.logo = app.ui.logo() .bindOnce({ load: function() { Ox.$('body') .append(app.$ui.screen) .append(app.$ui.logo) .append(app.$ui.loading); callback(); } }); Ox.$(window).bind({ resize: app.resize }); }, previousURL: '', re: { code: [ new RegExp( 'Ox' + '(\.' + 'UI)?' + '\.' + '([\\$\\w]+)<\/span>', 'g' ), function (str) { return '' + str + ''; } ], comment: [ /\b(Ox\.\w+)\b/g, '$1' ], version: [ '{version}', function() { return ( /:\/\/oxjs.org\//.test(window.location.href) ? 'The latest version is' : 'You\'re currently running version' ) + ' ' + app.data.version + '.' } ] }, resize: function() { [ 'logo', 'loading', 'label', 'menu', 'switch' ].forEach(function(element) { app.$ui[element] && app.$ui[element].css(app.getCSS(element)); }); }, setTheme: function(theme) { app.user({theme: theme}); (Ox.$('#icon') || Ox.$('').attr({ id: 'icon', rel: 'shortcut icon', type: 'image/png' }).appendTo(Ox.$('head'))).attr({ href: app.getSRC('icon') }); app.$ui.logo && app.$ui.logo .attr({src: app.getSRC('logo')}) .css(app.getCSS('logo')); Ox.Theme ? Ox.Theme(theme) : Ox.$('body').addClass('OxTheme' + Ox.toTitleCase(theme) ); }, ui: { doc: function() { return Ox.DocPanel({ files: app.data.documentation, getModule: function(item) { var file = item.file.replace(/^dev\//, ''); return file.split('/')[0]; }, getSection: function(item) { var file = item.file.replace(/^dev\//, ''); return item.section || file.split('/')[2].split('.')[0]; }, path: 'dev/', replace: [app.re.code], }); }, examples: function() { return Ox.ExamplePanel({ examples: app.data.examples, keywords: /\b(Ox\.[\w]+)\b/g, path: 'examples/', replaceCode: [app.re.code], replaceComment: [app.re.comment], selected: '' }) .bindEvent({ select: function(data) { app.url.push( 'examples' + (data.id ? '/' + data.id : '') ) } }); }, label: function() { return Ox.Label({ textAlign: 'center', title: 'A JavaScript Library for Web Applications', width: 256 }) .addClass('label animate') .bindEvent({ anyclick: function() { app.url.set(app.url.get() ? '' : app.user('url')); } }); }, loading: function() { return Ox.$('') .addClass('loading') .attr({src: app.getSRC('loading')}) .css(app.getCSS('loading')); }, logo: function() { return Ox.$('') .addClass('logo animate') .attr({src: app.getSRC('logo')}) .css(app.getCSS('logo')); }, menu: function() { return Ox.ButtonGroup({ buttons: app.data.sections, min: 0, selectable: true, }) .addClass('menu animate') .bindEvent({ change: function(data) { data.value && app.url.set(data.value); } }) }, page: function(page, replace) { var $element = Ox.Container(); Ox.get('readme/html/_' + page + '.html', function(html) { $('
') .addClass('OxSerif page') .html(html.replace(app.re.version[0], app.re.version[1])) .appendTo($element); }); return $element; }, panel: function() { return Ox.TabPanel({ content: function(id) { return app.ui[id] ? app.ui[id]() : app.ui.page(id); }, size: 32, tabs: app.data.sections }) .bindEvent({ change: function(data) { app.url.push(data.selected); } }); }, readme: function() { var $list = Ox.Container().css({overflowY: 'scroll'}), $text = Ox.Container().addClass('OxSerif text'), $panel = Ox.SplitPanel({ elements: [ {element: $list, size: 256}, {element: $text} ], orientation: 'horizontal' }) .addClass('readme'); app.data.readme.forEach(function(item, i) { var $item = $('
') .addClass('item') .css({ width: 224 - Ox.UI.SCROLLBAR_SIZE + 'px' }) .bind({ click: function(e) { var $this = $(this); if (!$this.is('.selected')) { selectItem(item.id, $this); } else if (e.metaKey) { selectItem(null, $this); } } }) .appendTo($list); $('
') .addClass('OxSerif title') .html(item.title) .appendTo($item); $('
') .addClass('OxSerif OxLight date') .html(Ox.formatDate(item.date, '%B %e, %Y', true)) .appendTo($item); }); function selectItem(id, $element) { $('.readme .item.selected').removeClass('selected'); if (id) { $element.addClass('selected'); Ox.get('readme/html/' + id + '.html', function(html) { $text.html(html); $text.find('.code').each(function() { var $this = $(this); $this.replaceWith( Ox.SyntaxHighlighter({ source: $this.text() }) .attr({id: $this.attr('id')}) /* .css({ border: '1px solid rgb(192, 192, 192)' }) */ ); }); }); app.url.push('readme/' + id); } else { $text.empty(); app.url.push('readme'); } } return $panel; }, screen: function() { return Ox.$('
').addClass('screen animate'); }, switch: function() { return Ox.ButtonGroup({ buttons: [ {id: 'classic', title: 'Light'}, {id: 'modern', title: 'Dark'} ], selectable: true, value: app.user('theme') }) .addClass('switch animate') .bindEvent({ change: function(data) { app.setTheme(data.value); } }); }, warning: function() { return $('
') .addClass('warning') .html( 'Aw, snap! This website requires an up-to-date, HTML5-compliant web browser. ' + 'It should work fine in current versions of Chrome, Firefox and Safari, ' + 'or Internet Explorer with Chrome Frame installed. ' + 'To proceed at your own risk, click on the logo above.' ); } }, url: { get: function() { return window.location.hash.substr(1); }, push: function(url) { history.pushState({}, '', '#' + url); url && app.user({url: url}); return app; }, set: function() { window.location.hash = '#' + arguments[0]; return app; } }, urlchange: function() { var url = app.url.get(), section = url.split('/')[0]; url && app.user({url: url}); Ox.print( 'url', url, 'section', section, 'prev', app.previousURL, 'sect', app.previousURL.split('/')[0], 'user url', app.user('url') ); if (section != app.previousURL.split('/')[0]) { app.$ui.panel.select(section); } app[!url || !app.previousURL ? 'animate' : 'void'](function() { app.previousURL = url; }); }, user: Ox.localStorage('OxJS'), void: function(callback) { callback(); } }; app.init(); window.oxjs = app; });