text: (function(exports) {
  	var core = null, ui = {}, uix = {};
  	
  	/**
  	 * Private Classes
  	 * 
  	 */
  	var QuickSort = function(array, isClone) { // isClone이면, 해당 배열을 참조하지 않고 복사해서 처리
          var compareFunc = null,
          	array = (isClone) ? array.slice(0) : array;
    
          function swap(indexA, indexB) {
              var temp = array[indexA];
              
              array[indexA] = array[indexB];
              array[indexB] = temp;
          }
  
          function partition(pivot, left, right) {
              var storeIndex = left, pivotValue = array[pivot];
              swap(pivot, right);
  
              for(var v = left; v < right; v++) {
              	if(compareFunc(array[v], pivotValue) || !compareFunc(pivotValue, array[v]) && v%2 == 1) {
                  	swap(v, storeIndex);
                      storeIndex++;
                  }
              }
      
              swap(right, storeIndex);
  
              return storeIndex;
          }
    
          this.setCompare = function(func) {
          	compareFunc = func;
          }
  
          this.run = function(left, right) {
              var pivot = null;
  
              if (typeof left !== 'number') {
                  left = 0;
              }
  
              if (typeof right !== 'number') {
                  right = array.length - 1;
              }
  
              if (left < right) {
                  pivot = left + Math.ceil((right - left) * 0.5);
                  newPivot = partition(pivot, left, right);
  
                  this.run(left, newPivot - 1);
                  this.run(newPivot + 1, right);
              }
              
              return array;
          }
  	}
  	
  	var IndexParser = function() {
  		this.isIndexDepth = function(index) {
  			if(typeof(index) == "string" && index.indexOf(".") != -1) {
  				return true;
  			}
  			
  			return false;
  		}
  		
  		this.getIndexList = function(index) { // 트리 구조의 모든 키를 배열 형태로 반환
  			var resIndex = [], strIndex = "" + index;
  			
  			if(strIndex.length == 1) {
  				resIndex[0] = parseInt(index);
  			} else {
  				var keys = strIndex.split(".");
  				
  				for(var i = 0; i < keys.length; i++) {
  					resIndex[i] = parseInt(keys[i]);
  				}
  			}
  			
  			return resIndex;
  		}
  		
  		this.changeIndex = function(index, targetIndex, rootIndex) {
  			var rootIndexLen = this.getIndexList(rootIndex).length,
  				indexList = this.getIndexList(index),
  				tIndexList = this.getIndexList(targetIndex);
  			
  			for(var i = 0; i < rootIndexLen; i++) {
  				indexList.shift();
  			}
  
  			return tIndexList.concat(indexList).join(".");
  		}
  		
  		this.getNextIndex = function(index) { // 현재 인덱스에서 +1
  			var indexList = this.getIndexList(index),
  				no = indexList.pop() + 1;
  				
  			indexList.push(no);
  			return indexList.join(".");
  		}
  		
  		this.getParentIndex = function(index) {
  			if(!this.isIndexDepth(index)) return null;
  			var keys = this.getIndexList(index);
  			
  			if(keys.length == 2) {
  				return "" + keys[0];
  			} else if(keys.length > 2) {
  				keys.pop();
  				return keys.join(".");
  			}
  		}
  	}
  	
  	/**
  	 * Private Static Classes
  	 * 
  	 */
  	var Base64 = {
  			 
  	    // private property
  	    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
  	 
  	    // public method for encoding
  	    encode : function (input) {
  	        var output = "";
  	        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
  	        var i = 0;
  	 
  	        input = Base64._utf8_encode(input);
  	 
  	        while (i < input.length) {
  	 
  	            chr1 = input.charCodeAt(i++);
  	            chr2 = input.charCodeAt(i++);
  	            chr3 = input.charCodeAt(i++);
  	 
  	            enc1 = chr1 >> 2;
  	            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
  	            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
  	            enc4 = chr3 & 63;
  	 
  	            if (isNaN(chr2)) {
  	                enc3 = enc4 = 64;
  	            } else if (isNaN(chr3)) {
  	                enc4 = 64;
  	            }
  	 
  	            output = output +
  	            Base64._keyStr.charAt(enc1) + Base64._keyStr.charAt(enc2) +
  	            Base64._keyStr.charAt(enc3) + Base64._keyStr.charAt(enc4);
  	 
  	        }
  	 
  	        return output;
  	    },
  	 
  	    // public method for decoding
  	    decode : function (input) {
  	        var output = "";
  	        var chr1, chr2, chr3;
  	        var enc1, enc2, enc3, enc4;
  	        var i = 0;
  	 
  	        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
  	 
  	        while (i < input.length) {
  	 
  	            enc1 = Base64._keyStr.indexOf(input.charAt(i++));
  	            enc2 = Base64._keyStr.indexOf(input.charAt(i++));
  	            enc3 = Base64._keyStr.indexOf(input.charAt(i++));
  	            enc4 = Base64._keyStr.indexOf(input.charAt(i++));
  	 
  	            chr1 = (enc1 << 2) | (enc2 >> 4);
  	            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
  	            chr3 = ((enc3 & 3) << 6) | enc4;
  	 
  	            output = output + String.fromCharCode(chr1);
  	 
  	            if (enc3 != 64) {
  	                output = output + String.fromCharCode(chr2);
  	            }
  	            if (enc4 != 64) {
  	                output = output + String.fromCharCode(chr3);
  	            }
  	 
  	        }
  	 
  	        output = Base64._utf8_decode(output);
  	 
  	        return output;
  	 
  	    },
  	 
  	    // private method for UTF-8 encoding
  	    _utf8_encode : function (string) {
  	        string = string.replace(/\r\n/g,"\n");
  	        var utftext = "";
  	 
  	        for (var n = 0; n < string.length; n++) {
  	 
  	            var c = string.charCodeAt(n);
  	 
  	            if (c < 128) {
  	                utftext += String.fromCharCode(c);
  	            }
  	            else if((c > 127) && (c < 2048)) {
  	                utftext += String.fromCharCode((c >> 6) | 192);
  	                utftext += String.fromCharCode((c & 63) | 128);
  	            }
  	            else {
  	                utftext += String.fromCharCode((c >> 12) | 224);
  	                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
  	                utftext += String.fromCharCode((c & 63) | 128);
  	            }
  	 
  	        }
  	 
  	        return utftext;
  	    },
  	 
  	    // private method for UTF-8 decoding
  	    _utf8_decode : function (utftext) {
  	        var string = "";
  	        var i = 0;
  	        var c = c1 = c2 = 0;
  	 
  	        while ( i < utftext.length ) {
  	 
  	            c = utftext.charCodeAt(i);
  	 
  	            if (c < 128) {
  	                string += String.fromCharCode(c);
  	                i++;
  	            }
  	            else if((c > 191) && (c < 224)) {
  	                c2 = utftext.charCodeAt(i+1);
  	                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
  	                i += 2;
  	            }
  	            else {
  	                c2 = utftext.charCodeAt(i+1);
  	                c3 = utftext.charCodeAt(i+2);
  	                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
  	                i += 3;
  	            }
  	 
  	        }
  	 
  	        return string;
  	    }
  	}
  	
  	/**
  	 * Private Functions
  	 * 
  	 */
  	var template = function(text, data, settings) {
  		var _ = {},
  			breaker = {};
  	
  		var ArrayProto = Array.prototype,
  			slice = ArrayProto.slice,
  			nativeForEach = ArrayProto.forEach;
  		
  		var escapes = {
  			'\\' : '\\',
  			"'" : "'",
  			'r' : '\r',
  			'n' : '\n',
  			't' : '\t',
  			'u2028' : '\u2028',
  			'u2029' : '\u2029'
  		};
  	
  		for (var p in escapes)
  		escapes[escapes[p]] = p;
  		
  		var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g,
  			unescaper = /\\(\\|'|r|n|t|u2028|u2029)/g,
  			noMatch = /.^/;
  		
  		var unescape = function(code) {
  			return code.replace(unescaper, function(match, escape) {
  				return escapes[escape];
  			});
  		};
  	
  		var each = _.each = _.forEach = function(obj, iterator, context) {
  			if (obj == null)
  				return;
  			if (nativeForEach && obj.forEach === nativeForEach) {
  				obj.forEach(iterator, context);
  			} else if (obj.length === +obj.length) {
  				for (var i = 0, l = obj.length; i < l; i++) {
  					if ( i in obj && iterator.call(context, obj[i], i, obj) === breaker)
  						return;
  				}
  			} else {
  				for (var key in obj) {
  					if (_.has(obj, key)) {
  						if (iterator.call(context, obj[key], key, obj) === breaker)
  							return;
  					}
  				}
  			}
  		};
  	
  		_.has = function(obj, key) {
  			return hasOwnProperty.call(obj, key);
  		};
  	
  		_.defaults = function(obj) {
  			each(slice.call(arguments, 1), function(source) {
  				for (var prop in source) {
  					if (obj[prop] == null)
  						obj[prop] = source[prop];
  				}
  			});
  			return obj;
  		};
  	
  		_.templateSettings = {
  			evaluate : /<\!([\s\S]+?)\!>/g,
  			interpolate : /<\!=([\s\S]+?)\!>/g,
  			escape : /<\!-([\s\S]+?)\!>/g
  		};
  	
  		_.template = function(text, data, settings) {
  			settings = _.defaults(settings || {}, _.templateSettings);
  	
  			var source = "__p+='" + text.replace(escaper, function(match) {
  				return '\\' + escapes[match];
  			}).replace(settings.escape || noMatch, function(match, code) {
  				return "'+\n_.escape(" + unescape(code) + ")+\n'";
  			}).replace(settings.interpolate || noMatch, function(match, code) {
  				return "'+\n(" + unescape(code) + ")+\n'";
  			}).replace(settings.evaluate || noMatch, function(match, code) {
  				return "';\n" + unescape(code) + "\n;__p+='";
  			}) + "';\n";
  	
  			if (!settings.variable)
  				source = 'with(obj||{}){\n' + source + '}\n';
  	
  			source = "var __p='';" + "var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n" + source + "return __p;\n";
  	
  			var render = new Function(settings.variable || 'obj', '_', source);
  			if (data)
  				return render(data, _);
  			var template = function(data) {
  				return render.call(this, data, _);
  			};
  	
  			template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
  	
  			return template;
  		};
  		
  		return _.template(text, data, settings);
  	}
  	
  	
  	/**
  	 * Public Utility Classes
  	 * 
  	 */
  	var utility = {
  			
  		//-- Properties
  		browser: {
  			webkit: (window.webkitURL) ? true : false,
  			mozilla: (window.mozInnerScreenX) ? true : false,
  			msie: (navigator.userAgent.indexOf("Trident") != -1) ? true : false
  		},
  		isTouch: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),
  				
  		//-- Functions
  		scrollWidth: function() {
  			var isJUI = ($(".jui").size() > 0 && this.browser.webkit) ? true : false;
  			
  			var div = $('<div style="width:50px;height:50px;overflow:hidden;position:absolute;top:-200px;left:-200px;"><div style="height:100px;"></div></div>'); 
  			$('body').append(div); 
  			var w1 = $('div', div).innerWidth(); 
  			div.css('overflow-y', 'auto'); 
  			var w2 = $('div', div).innerWidth(); 
  			$(div).remove(); 
  		    
  			return (isJUI) ? 10 : (w1 - w2);
  		},
  		inherit: function(ctor, superCtor) {
  			ctor.super_ = superCtor;
  			ctor.prototype = new superCtor;
  			ctor.prototype.constructor = ctor;
  		},
  		extend: function(origin, add) {
  			// Don't do anything if add isn't an object
  			if (!add || typeof add !== 'object') return origin;
  			
  			var keys = Object.keys(add);
  			var i = keys.length;
  			while (i--) {
  				origin[keys[i]] = add[keys[i]];
  			}
  			
  			return origin;
  		},
  		pxToInt: function(px) {
  			if(typeof(px) == "string" && px.indexOf("px") != -1) {
  				return parseInt(px.split("px").join(""));
  			}
  			
  			return px;
  		},
  		clone: function(obj) {
  			var clone = ($.isArray(obj)) ? [] : {};
  			
  	        for(var i in obj) {
  	            if(typeof(obj[i]) == "object")
  	                clone[i] = this.clone(obj[i]);
  	            else
  	                clone[i] = obj[i];
  	        }
  	        
  	        return clone;
  		},
  		sort: function(array) {
  			return new QuickSort(array);
  		},
  		runtime: function(name, callback) {
  			var nStart = new Date().getTime();
  			callback();
  			var nEnd = new Date().getTime(); 
  			
  			console.log(name + " : " + (nEnd - nStart) + "ms");
  		},
  		template: function(html, obj) {
  			if(!obj) return template(html);
  			else return template(html, obj);
  		},
  		resize: function(callback, ms) {
  			var after_resize = (function(){
  				var timer = 0;
  				
  				return function() {
  				    clearTimeout(timer);
  				    timer = setTimeout(callback, ms);
  				}
  			})();
  			
  			$(window).resize(function() {
  				after_resize();
  			});
  		},
  		index: function() {
  			return new IndexParser();
  		},
  		chunk: function(arr, len) {
  		  var chunks = [],
  		      i = 0,
  		      n = arr.length;
  		
  		  while (i < n) {
  		    chunks.push(arr.slice(i, i += len));
  		  }
  		
  		  return chunks;
  		},
  		typeCheck: function(t, v) {
  			function check(type, value) {
  				return {
  					"string": (typeof(value) == "string") ? true : false,
  					"integer": (typeof(value) == "number" && value % 1 == 0) ? true : false,
  					"float": (typeof(value) == "number" && value % 1 != 0) ? true : false,
  					"number": (typeof(value) == "number") ? true : false,
  					"object": (typeof(value) == "object") ? true : false,
  					"function": (typeof(value) == "function") ? true : false,
  					"array": (value != null && typeof(value) == "object" && typeof(value.length) == "number") ? true : false,
  					"boolean"	: (typeof(value) == "boolean") ? true : false, 
  					"undefined": (typeof(value) == "undefined") ? true: false,
  					"null": (value === null) ? true : false
  				}[type];
  			}
  			
  			if(typeof(t) == "object" && t.length) {
  				var typeList = t;
  				
  				for(var i = 0; i < typeList.length; i++) {
  					if(check(typeList[i], v)) return true;
  				}
  				
  				return false;
  			} else {
  				return check(t, v);
  			}
  		},
  		typeCheckObj: function(uiObj, list) {
  			if(typeof(uiObj) != "object") return;
  			var self = this;
  			
  			for(var key in uiObj) {
  				var func = uiObj[key];
  				
  				if(typeof(func) == "function") {
  					(function(funcName, funcObj) {
  						uiObj[funcName] = function() {
  							var args = arguments,
  								params = list[funcName];
  							
  							for(var i = 0; i < args.length; i++) {
  								if(!self.typeCheck(params[i], args[i])) {
  									throw new Error("JUI_CRITICAL_ERR: the " + i + "th parameter is not a " + params[i] + " (" + name + ")");
  								}
  							}
  							
  							return funcObj.apply(this, args);
  						}
  					})(key, func);
  				}
  			}
  		},
  		dataToCsv: function(keys, dataList, dataSize) {
  			var csv = "", len = (!dataSize) ? dataList.length : dataSize;
  			
  			for(var i = -1; i < len; i++) {
  				var tmpArr = [];
  				
  				for(var j = 0; j < keys.length; j++) {
  					if(keys[j]) {
  						if(i == -1) {
  							tmpArr.push(keys[j]);
  						} else {
  							tmpArr.push(dataList[i][keys[j]]);
  						}
  					}
  				}
  				
  				csv += tmpArr.join(",") + "\n";
  			}
  			
  			return csv;
  		},
  		dataToCsv2: function(options) {
  			var csv = "";
  			var opts = $.extend({
  				fields: null, // required
  				rows: null, // required
  				names: null,
  				count: (this.typeCheck("integer", options.count)) ? options.count : options.rows.length
  			}, options);
  			
  			for(var i = -1; i < opts.count; i++) {
  				var tmpArr = [];
  				
  				for(var j = 0; j < opts.fields.length; j++) {
  					if(opts.fields[j]) {
  						if(i == -1) {
  							if(opts.names && opts.names[j]) {
  								tmpArr.push(opts.names[j]);
  							} else {
  								tmpArr.push(opts.fields[j]);
  							}
  						} else {
  							tmpArr.push(opts.rows[i][opts.fields[j]]);
  						}
  					}
  				}
  				
  				csv += tmpArr.join(",") + "\n";
  			}
  			
  			return csv;
  		},
  		fileToCsv: function(file, callback) {
  			var reader = new FileReader();
  			
  	        reader.onload = function(readerEvt) {
  	            if(typeof(callback) == "function") {
  	            	callback(readerEvt.target.result);
  	            }
  	        };
  	
  	        reader.readAsText(file);
  		},
  		csvToBase64: function(csv) {
  			return "data:application/octet-stream;base64," + Base64.encode(csv);
  		},
  		csvToData: function(keys, csv) {
  			var dataList = [],
  				tmpRowArr = csv.split("\n");
  				
  			for(var i = 1; i < tmpRowArr.length; i++) {
  				if(tmpRowArr[i] != "") {
  					var tmpArr = tmpRowArr[i].split(","),
  						data = {};
  					
  					for(var j = 0; j < keys.length; j++) {
  						data[keys[j]] = tmpArr[j];
  					}
  					
  					dataList.push(data);
  				}
  			}
  			
  			return dataList;
  		},
  		getCsvFields: function(fields, csvFields) {
  			var tmpFields = (csvFields) ? csvFields : fields;
  			
  			for(var i = 0; i < tmpFields.length; i++) {
  				if(!isNaN(tmpFields[i])) {
  					tmpFields[i] = fields[tmpFields[i]];
  				}
  			}
  			
  			return tmpFields;
  		},
          dateFormat: function(date, format, utc) {
              var MMMM = ["\x00", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
              var MMMM = ["\x00", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
              var MMMM = ["\x00", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
              var MMM = ["\x01", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
              var dddd = ["\x02", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
              var ddd = ["\x03", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
  
              function ii(i, len) {
                  var s = i + "";
                  len = len || 2;
                  while (s.length < len) s = "0" + s;
                  return s;
              }
  
              var y = utc ? date.getUTCFullYear() : date.getFullYear();
              format = format.replace(/(^|[^\\])yyyy+/g, "$1" + y);
              format = format.replace(/(^|[^\\])yy/g, "$1" + y.toString().substr(2, 2));
              format = format.replace(/(^|[^\\])y/g, "$1" + y);
  
              var M = (utc ? date.getUTCMonth() : date.getMonth()) + 1;
              format = format.replace(/(^|[^\\])MMMM+/g, "$1" + MMMM[0]);
              format = format.replace(/(^|[^\\])MMM/g, "$1" + MMM[0]);
              format = format.replace(/(^|[^\\])MM/g, "$1" + ii(M));
              format = format.replace(/(^|[^\\])M/g, "$1" + M);
  
              var d = utc ? date.getUTCDate() : date.getDate();
              format = format.replace(/(^|[^\\])dddd+/g, "$1" + dddd[0]);
              format = format.replace(/(^|[^\\])ddd/g, "$1" + ddd[0]);
              format = format.replace(/(^|[^\\])dd/g, "$1" + ii(d));
              format = format.replace(/(^|[^\\])d/g, "$1" + d);
  
              var H = utc ? date.getUTCHours() : date.getHours();
              format = format.replace(/(^|[^\\])HH+/g, "$1" + ii(H));
              format = format.replace(/(^|[^\\])H/g, "$1" + H);
  
              var h = H > 12 ? H - 12 : H == 0 ? 12 : H;
              format = format.replace(/(^|[^\\])hh+/g, "$1" + ii(h));
              format = format.replace(/(^|[^\\])h/g, "$1" + h);
  
              var m = utc ? date.getUTCMinutes() : date.getMinutes();
              format = format.replace(/(^|[^\\])mm+/g, "$1" + ii(m));
              format = format.replace(/(^|[^\\])m/g, "$1" + m);
  
              var s = utc ? date.getUTCSeconds() : date.getSeconds();
              format = format.replace(/(^|[^\\])ss+/g, "$1" + ii(s));
              format = format.replace(/(^|[^\\])s/g, "$1" + s);
  
              var f = utc ? date.getUTCMilliseconds() : date.getMilliseconds();
              format = format.replace(/(^|[^\\])fff+/g, "$1" + ii(f, 3));
              f = Math.round(f / 10);
              format = format.replace(/(^|[^\\])ff/g, "$1" + ii(f));
              f = Math.round(f / 10);
              format = format.replace(/(^|[^\\])f/g, "$1" + f);
  
              var T = H < 12 ? "AM" : "PM";
              format = format.replace(/(^|[^\\])TT+/g, "$1" + T);
              format = format.replace(/(^|[^\\])T/g, "$1" + T.charAt(0));
  
              var t = T.toLowerCase();
              format = format.replace(/(^|[^\\])tt+/g, "$1" + t);
              format = format.replace(/(^|[^\\])t/g, "$1" + t.charAt(0));
  
              var tz = -date.getTimezoneOffset();
              var K = utc || !tz ? "Z" : tz > 0 ? "+" : "-";
              if (!utc) {
                  tz = Math.abs(tz);
                  var tzHrs = Math.floor(tz / 60);
                  var tzMin = tz % 60;
                  K += ii(tzHrs) + ":" + ii(tzMin);
              }
              format = format.replace(/(^|[^\\])K/g, "$1" + K);
  
              var day = (utc ? date.getUTCDay() : date.getDay()) + 1;
              format = format.replace(new RegExp(dddd[0], "g"), dddd[day]);
              format = format.replace(new RegExp(ddd[0], "g"), ddd[day]);
  
              format = format.replace(new RegExp(MMMM[0], "g"), MMMM[M]);
              format = format.replace(new RegExp(MMM[0], "g"), MMM[M]);
  
              format = format.replace(/\\(.)/g, "$1");
  
              return format;
          },
          btoa: Base64.encode,
          atob: Base64.decode
  	}
  	
  	var getDepends = function(depends, level) {
  		var args = [];
  		
  		for(var i = 0; i < depends.length; i++) {
  			if(level > 0 && depends[i] == "util") {
  				args[i] = utility;
  			} 
  			
  			if(level > 1 && depends[i] == "ui") {
  				args[i] = ui;
  			} 
  			
  			if(level > 1 && depends[i].indexOf("ui.") != -1) {
  				var uiKey = depends[i].replace("ui.", ""),
  					uiObj = ui[uiKey];
  				
  				if(!uiObj) {
  					throw new Error("JUI_CRITICAL_ERR: UI(" + depends[i] + ") is not loaded");
  				}
  				
  				args[i] = uiObj;
  			}
  			
  			if(level > 2 && depends[i] == "uix") {
  				args[i] = uix;
  			} 
  			
  			if(level > 2 && depends[i].indexOf("uix.") != -1) {
  				var uiKey = depends[i].replace("uix.", ""),
  					uiObj = uix[uiKey];
  				
  				if(!uiObj) {
  					throw new Error("JUI_CRITICAL_ERR: UIX(" + depends[i] + ") is not loaded");
  				}
  				
  				args[i] = uiObj;
  			}
  		}
  		
  		return args;
  	}
  	
  	
  	/**
  	 * Global Object
  	 * 
  	 */
  	exports.jui = {
  		ready: function() {
  			var args = [],
  				callback = (arguments.length == 2) ? arguments[1] : arguments[0],
  				depends = (arguments.length == 2) ? arguments[0] : null;
  
  			$(function() { 
  				if(depends) {
  					args = getDepends(depends, 3);
  				} else {
  					args = [ ui, uix, utility ];
  				}
  				
  				callback.apply(null, args);
  			});
  		},
  		define: function() {
  			var tmpUi = [], tmpUix = [];
  			
  			var name = arguments[0],
  				callback = (arguments.length == 3) ? arguments[2] : arguments[1],
  				depends = (arguments.length == 3) ? arguments[1] : null;
  				
  			// Core 객체 생성
  			if(name == "core") { 
  				core = callback(utility);
  			}
  			
  			// UI 함수 추가
  			if(name.indexOf("ui.") != -1) {
  				var args = [], 
  					key = name.replace("ui.", "");
  				
  				// UIX에 UI 디펜던시 추가
  				if(depends) {
  					args = getDepends(depends, 1);
  				} else {
  					args = [ utility ];
  				}
  					
  				ui[key] = core.init({ type: key, func: callback.apply(null, args) });
  			} 
  			
  			// UIX 함수 추가
  			if(name.indexOf("uix.") != -1) {
  				var args = [],
  					key = name.replace("uix.", "");
  				
  				// UIX에 UI 디펜던시 추가
  				if(depends) {
  					args = getDepends(depends, 2);
  				} else {
  					args = [ utility, ui ];
  				}
  				
  				uix[key] = core.init({ type: key, func: callback.apply(null, args) });
  			}
  		},
  		log: function() {
  			var jui_mng = window.open(
  	    		this.logUrl, 
  	    		"JUIM",
  	    		"width=800, height=600, toolbar=no, menubar=no, resizable=yes"
  	    	);
  	    	
  	    	jui.debugAll(function(log, str) {
  	    		jui_mng.log(log, str);
  	    	});
  	    	
  	    	return jui_mng;
  		},
  		logUrl: "jui.mng.html"
  	};
  })(window);