/* ################################################################################ ox.ui.js requires jquery-1.4.js ox.js ################################################################################ */ // also see test.js, in demos ... (function() { var oxui = { defaultTheme: "classic", elements: {}, getDimensions: function(orientation) { return orientation == "horizontal" ? ["width", "height"] : ["height", "width"]; }, getEdges: function(orientation) { return orientation == "horizontal" ? ["left", "right", "top", "bottom"] : ["top", "bottom", "left", "right"]; }, getBarSize: function(size) { var sizes = { xsmall: 16, small: 24, medium: 28, large: 32, xlarge: 40 }; return sizes[size]; }, jQueryFunctions: function() { var functions = [], $element = $("
"); //delete $element.length; Ox.each($element, function(k, v) { if (typeof v == "function") { functions.push(k); } }); return functions.sort(); }(), path: $("script[src*=ox.ui.js]").attr("src") .replace("js/ox.ui.js", ""), stack: [] }, $window, $document, $body; $(function() { $window = $(window), $document = $(document), $body = $("body"); Ox.theme(oxui.defaultTheme); }) /* ============================================================================ Application ============================================================================ */ /* ---------------------------------------------------------------------------- Ox.App ---------------------------------------------------------------------------- */ Ox.App = function() { /* options: requestTimeout requestType requestURL */ return function(options) { options = options || {}; var self = {}, that = this; self.options = $.extend({ requestTimeout: oxui.requestTimeout, requestType: oxui.requestType, requestURL: oxui.requestURL }, options); self.change = function() { }; that.launch = function() { $.ajaxSetup({ timeout: self.options.requestTimeout, type: self.options.requestType, url: self.options.requestURL }); }; that.options = function() { return Ox.getset(self.options, Array.slice.call(arguments), self.change, that); }; return that; }; }(); /* ---------------------------------------------------------------------------- Ox.Cache ---------------------------------------------------------------------------- */ // currently part of Ox.Request /* ---------------------------------------------------------------------------- Ox.Event ---------------------------------------------------------------------------- naming convention for event/trigger verb.id.namespace, i.e. verb.sourceId.targetId (?) ... bind("keydown.shift+dot.numpad", function() { // ... }) keyboard handler then would: $.each(stack, function(i, v) { elements[v].trigger("keydown.shift+0.numpad"); }); and the element would implement this.trigger(event, data) { } ... keyboard handler also triggers keydown.buffer */ // use dom elements / jquery instead Ox.Event = function() { var events = {}; return { // make these bind, trigger, unbind publish: function(event, data) { console.log("publish", event, data); if (events[event]) { $.each(events[event], function(i, v) { setTimeout(function() { v(data); }, 0); }); } }, subscribe: function(event, callback) { console.log("subscribe", event, callback); if (events[event]) { events[event].push(callback); } else { events[event] = [callback]; } }, unsubscribe: function(event, callback) { console.log("unsubscribe", event, callback); $.each(events[event], function(i, v) { if (Ox.startsWith(callback.toString(), v.toString())) { events[event].splice(i, 1); } }); } }; }(); /* ---------------------------------------------------------------------------- Ox.Focus ---------------------------------------------------------------------------- */ Ox.Focus = function() { var stack = []; return { focus: function(id) { var index = stack.indexOf(id); if (index > -1) { oxui.stack.splice(i, 1); } oxui.stack.push(id); }, blur: function(id) { oxui.stack.pop(); } }; }(); /* ---------------------------------------------------------------------------- Ox.History ---------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------------- Ox.Keyboard ---------------------------------------------------------------------------- */ (function() { var buffer = "", bufferTime = 0, bufferTimeout = 1000, keyNames = function() { return { 0: "section", 8: "backspace", 9: "tab", 12: "clear", 13: "enter", 16: "shift", 17: "control", 18: "alt", 20: "capslock", 27: "escape", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home", 37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "delete", 47: "help", 48: "0", 49: "1", 50: "2", 51: "3", 52: "4", 53: "5", 54: "6", 55: "7", 56: "8", 57: "9", 65: "A", 66: "B", 67: "C", 68: "D", 69: "E", 70: "F", 71: "G", 72: "H", 73: "I", 74: "J", 75: "K", 76: "L", 77: "M", 78: "N", 79: "O", 80: "P", 81: "Q", 82: "R", 83: "S", 84: "T", 85: "U", 86: "V", 87: "W", 88: "X", 89: "Y", 90: "Z", 91: "meta.left", 92: "meta.right", 93: "select", 96: "0.numpad", 97: "1.numpad", 98: "2.numpad", 99: "3.numpad", 100: "4.numpad", 101: "5.numpad", 102: "6.numpad", 103: "7.numpad", 104: "8.numpad", 105: "9.numpad", 106: "asterisk.numpad", 107: "plus.numpad", 109: "minus.numpad", 108: "enter.numpad", 110: "dot.numpad", 111: "slash.numpad", 112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8", 120: "f9", 121: "f10", 122: "f11", 123: "f12", 124: "f13", 125: "f14", 126: "f15", 127: "f16", 144: "numlock", 145: "scrolllock", 186: "semicolon", 187: "equal", 188: "comma", 189: "minus", 190: "dot", 191: "slash", 192: "backtick", 219: "openbracket", 220: "backslash", 221: "closebracket", 222: "quote" // see dojo, for ex. }; }(), modifierNames = { altKey: "alt", // mac: option ctrlKey: "control", metaKey: "meta", // mac: command shiftKey: "shift" }; return function() { document.keydown(keydown); function keydown(e) { var key = [], ret = true, time; $.each(modifierNames, function(k, v) { if (e[k]) { key.push(v); } }); // avoid pushing modifier twice if (keyNames[e.keyCode] && keys.indexOf(keyNames[e.keyCode]) == -1) { key.push(keyNames[e.keyCode]); } key = key.join(" "); if (key.match(/^[\w\d-]$|SPACE/)) { time = Ox.time(); if (time - bufferTime > bufferTimeout) { buffer = ""; } buffer += key == "SPACE" ? " " : key; bufferTime = time; } $.each(stack, function(i, v) { // fixme: we dont get the return value! ret = Ox.event.publish(keyboard + Ox.toCamelCase(key) + "." + v); return ret; }); } }; })(); /* ---------------------------------------------------------------------------- Ox.Mouse (??) ---------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------------- Ox.Request ---------------------------------------------------------------------------- */ Ox.Request = function() { var cache = {}, pending = {}, requests = {}, self = { options: { timeout: 15000, type: "POST", url: "api" } }; return { cancel: function() { var index; if (arguments.length == 0) { requests = {}; } else if (Ox.isFunction(arguments[0])) { // cancel with function $.each(requests, function(id, req) { if (arguments[0](req)) { delete requests[id]; } }) } else { // cancel by id delete requests[arguments[0]] } }, emptyCache: function() { cache = {}; }, options: function(options) { return Ox.getset(self.options, options, $.noop(), this); }, send: function(options) { options = $.extend({ age: -1, callback: function() {}, id: Ox.uid(), timeout: self.options.timeout, type: self.options.type, url: self.options.url }, options); var req = JSON.stringify({ url: options.url, data: options.data }); function callback(data, callback) { delete requests[options.id]; callback(data); } function error(request, status, error) { var $dialog = new Ox.Dialog({ title: "Error: Remote request failed.", buttons: [ new Ox.Button({ value: "Details", click: function() { var $iframe = $("