/** * A truncated version of essential classes in the Xdn namespace. * Requires Xdn.Class. * @author Xedin Unknown */ ;(function($, window, document, undefined) { // This is the base, top level namespace window.Xdn = window.Xdn || {}; // Allows easy namespacing of classes Xdn.assignNamespace = function (object, ns, overwrite) { if( !object ) return; if( (typeof object) === 'string' && !ns ) { ns = object; object = this; } ns = ns.split('.'); var obj, base; for( var i=0; i<(ns.length-1); i++ ) { base = i ? obj : window; base[ns[i]] = base[ns[i]] || {}; obj = base[ns[i]]; } if( obj && !overwrite && obj[ns[i]] && $.isPlainObject(obj[ns[i]]) ) { object = $.extend(object, obj[ns[i]]); } obj[ns[i]] = object; }; // Prevents errors in browsers that do not have a `console` global !window.console && (window.console = { log: function() {}, info: function() {}, warn: function() {}, error: function() {} }); })(jQuery, top, document); /* Xdn.Object */ ;(function($, window, document, undefined) { var Xdn_Object = Xdn.Class.extend( /** * @lends Xdn.Object */ { _data: {}, init: function(data) { this._data = {}; data && (this._data = data); }, getData: function(key) { return key ? this._data[key] : this._data; }, setData: function(key, value) { if( !value ) { this._data = key; return this; } this._data[key.toString()] = value; return this; }, unsData: function(key) { if( !key ) { this._data = {}; return this; } delete this._data[key]; }, addData: function(key, value) { if( value ) { this.setData(key, value); return this; } this.setData($.extend({}, this.getData(), key)); }, clone: function(additionalData) { var newObject = new Xdn.Object(this.getData()); additionalData && newObject.addData(additionalData); return newObject; }, _beforeMix: function(mixin) { return mixin; }, _afterMix: function(mixin) { return this; }, mix: function(mixin) { var self = this; mixin = mixin instanceof Array ? mixin : [mixin]; mixin = this._beforeMix(mixin); $.each(mixin, function(i, mixin) { if( (/boolean|number|string|array/).test(typeof mixin) ) return true; Xdn.Object.augment(self, mixin); }); this._afterMix(mixin); return this; }, // Dummy function for mixin initialization. To be implemented in mixin _mix: function() { } }); Xdn_Object.find = function(object, value, one) { one = one && true; var result = []; $.each(object, function(k, v) { var end = v == value && result.push(k) > 1 && one; if( end ) return false; }); return one ? result : result[0]; }; Xdn_Object.augment = function(destination, source) { for(var prop in source) { if( !source.hasOwnProperty(prop) ) continue; destination[prop] = typeof(destination[prop]) !== 'undefined' ? (function(prop) { var fn = source[prop], _super = destination[prop]; return function() { // Save any _super variable that already existed var tmp = this._super, result; this._super = _super; result = fn.apply(this, arguments); // Restore _super this._super = tmp; return result; }; })(prop) : source[prop]; } return destination; }; /** * @name Xdn.Object * @class */ Xdn.assignNamespace(Xdn_Object, 'Xdn.Object'); Xdn.Object.camelize = function(string, separator) { separator = separator || '_'; var ex = new RegExp(separator+'([a-zA-Z])', 'g'); return string.replace(ex, function (g) { return g[1].toUpperCase(); }); } })(jQuery, top, document); /* Xdn.Options */ ;(function($, window, document, undefined) { var Xdn_Options = Xdn.Object.extend({ read: function(key) { return this.getData(key); }, write: function(key, value) { this.setData(key, value); return this; }, unset: function(key) { this.unsData(key); return this; }, extend: function(key, value) { this.addData(key, value); return this; }, configure: function(key, value, deep) { if( value && !$.isPlainObject(key) ) { key = (function(key, value) { var newKey = {}; newKey[key] = value; return newKey; })(key, value); } var args = [{}, key, this.read()]; deep && args.unshift(true); this.write($.extend.apply($, args)); } }); Xdn.assignNamespace(Xdn_Options, 'Xdn.Options'); })(jQuery, top, document); /* Xdn.Object.Configurable */ ;(function($, window, document, undefined) { var Xdn_Object_Configurable = Xdn.Object.extend({ _options: null, init: function(options) { this._super(); this._options = new Xdn.Options(); $.isPlainObject(options) && this.setOptions(options); this._init(); }, _init: function() { }, getOptions: function(key) { return key ? this._options.read(key) : this._options; }, setOptions: function(key, value) { this.getOptions().write(key, value); return this; }, unsetOptions: function(key) { this.getOptions().unset(key); return this; }, mix: function(mixin) { mixin = mixin || this.getOption('mixins'); this._super(mixin); return this; } }); Xdn.assignNamespace(Xdn_Object_Configurable, 'Xdn.Object.Configurable'); })(jQuery, top, document);