jui.define("manager", [ "util.base" ], function(_) { /** * @class manager * @alias UIManager * @private * @singleton */ var UIManager = new function() { var instances = [], classes = []; /** * @method add * Adds a component object created * * @param {Object} ui UI instance */ this.add = function(uiIns) { instances.push(uiIns); } /** * @method emit * Generates a custom event to an applicable component * * @param {String} key Selector or UI type * @param {String} type Event type * @param {Array} args Event arguments */ this.emit = function(key, type, args) { var targets = []; for(var i = 0; i < instances.length; i++) { var uiSet = instances[i]; if(key == uiSet.selector || key == uiSet.type) { targets.push(uiSet); } } for(var i = 0; i < targets.length; i++) { var uiSet = targets[i]; for(var j = 0; j < uiSet.length; j++) { uiSet[j].emit(type, args); } } } /** * @method get * Gets a component currently created * * @param {Integer/String} key * @returns {Object/Array} UI instance */ this.get = function(key) { if(_.typeCheck("integer", key)) { return instances[key]; } else if(_.typeCheck("string", key)) { // 셀렉터 객체 검색 for(var i = 0; i < instances.length; i++) { var uiSet = instances[i]; if(key == uiSet.selector) { return (uiSet.length == 1) ? uiSet[0] : uiSet; } } // 모듈 객체 검색 var result = []; for(var i = 0; i < instances.length; i++) { var uiSet = instances[i]; if(key == uiSet.type) { result.push(uiSet); } } return result; } } /** * @method getAll * Gets all components currently created * * @return {Array} UI instances */ this.getAll = function() { return instances; } /** * @method remove * Removes a component object in an applicable index from the list * * @param {Integer} index * @return {Object} Removed instance */ this.remove = function(index) { if(_.typeCheck("integer", index)) { // UI 객체 인덱스 return instances.splice(index, 1)[0]; } } /** * @method shift * Removes the last component object from the list * * @return {Object} Removed instance */ this.shift = function() { return instances.shift(); } /** * @method pop * Removes the first component object from the list * * @return {Object} Removed instance */ this.pop = function() { return instances.pop(); } /** * @method size * Gets the number of objects currently created * * @return {Number} */ this.size = function() { return instances.length; } /** * @method debug * * @param {Object} uiObj UI instance * @param {Number} i * @param {Number} j * @param {Function} callback */ this.debug = function(uiObj, i, j, callback) { if(!uiObj.__proto__) return; var exFuncList = [ "emit", "on", "addEvent", "addValid", "callBefore", "callAfter", "callDelay", "setTpl", "setVo", "setOption" ]; for(var key in uiObj) { var func = uiObj[key]; if(typeof(func) == "function" && _.inArray(key, exFuncList) == -1) { (function(funcName, funcObj, funcIndex, funcChildIndex) { uiObj.__proto__[funcName] = function() { var nStart = Date.now(); var resultObj = funcObj.apply(this, arguments); var nEnd = Date.now(); if(typeof(callback) == "function") { callback({ type: jui.get(i).type, name: funcName, c_index: funcIndex, u_index: funcChildIndex, time: nEnd - nStart }, arguments); } else { if(!isNaN(funcIndex) && !isNaN(funcChildIndex)) { console.log( "TYPE(" + jui.get(i).type + "), " + "NAME(" + funcName + "), " + "INDEX(" + funcIndex + ":" + funcChildIndex + "), " + "TIME(" + (nEnd - nStart) + "ms), " + "ARGUMENTS..." ); } else { console.log( "NAME(" + funcName + "), " + "TIME(" + (nEnd - nStart) + "ms), " + "ARGUMENTS..." ); } console.log(arguments); console.log(""); } return resultObj; } })(key, func, i, j); } } } /** * @method debugAll * debugs all component objects currently existing * * @param {Function} callback */ this.debugAll = function(callback) { for(var i = 0; i < instances.length; i++) { var uiList = instances[i]; for(var j = 0; j < uiList.length; j++) { this.debug(uiList[j], i, j, callback); } } } /** * @method addClass * Adds a component class * * @param {Object} uiCls UI Class */ this.addClass = function(uiCls) { classes.push(uiCls); } /** * @method getClass * Gets a component class * * @param {String/Integer} key * @return {Object} */ this.getClass = function(key) { if(_.typeCheck("integer", key)) { return classes[key]; } else if(_.typeCheck("string", key)) { for(var i = 0; i < classes.length; i++) { if(key == classes[i].type) { return classes[i]; } } } return null; } /** * @method getClassAll * Gets all component classes * * @return {Array} */ this.getClassAll = function() { return classes; } /** * @method create * It is possible to create a component dynamically after the ready point * * @param {String} type UI type * @param {String/DOMElement} selector * @param {Object} options * @return {Object} */ this.create = function(type, selector, options) { var cls = UIManager.getClass(type); if(_.typeCheck("null", cls)) { throw new Error("JUI_CRITICAL_ERR: '" + type + "' does not exist"); } return cls["class"](selector, options); } }; return UIManager; });