pox 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +10 -0
- data/lib/pox.rb +2 -0
- data/lib/pox/engine.rb +8 -0
- data/lib/pox/version.rb +3 -0
- data/pox.gemspec +20 -0
- data/vendor/assets/javascripts/agent/adaptor-cos.js +94 -0
- data/vendor/assets/javascripts/agent/adaptor-default.js +175 -0
- data/vendor/assets/javascripts/agent/adaptor-ipanel.js +127 -0
- data/vendor/assets/javascripts/agent/adaptor-vision.js +100 -0
- data/vendor/assets/javascripts/agent/core.js +12 -0
- data/vendor/assets/javascripts/build-in.js +161 -0
- data/vendor/assets/javascripts/pox.js +24 -0
- data/vendor/assets/javascripts/pox/ajax.js +68 -0
- data/vendor/assets/javascripts/pox/all.js +1 -0
- data/vendor/assets/javascripts/pox/animate.js +211 -0
- data/vendor/assets/javascripts/pox/browser.js +33 -0
- data/vendor/assets/javascripts/pox/core.js +289 -0
- data/vendor/assets/javascripts/pox/debugger.js +54 -0
- data/vendor/assets/javascripts/pox/dom.js +261 -0
- data/vendor/assets/javascripts/pox/transition.js +316 -0
- metadata +85 -0
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            //= require ./core
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            (function() {
         | 
| 4 | 
            +
            	"use strict";
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            	/**
         | 
| 7 | 
            +
            	 * @namespace
         | 
| 8 | 
            +
            	 */
         | 
| 9 | 
            +
            	Pox.Browser = (
         | 
| 10 | 
            +
            	/**
         | 
| 11 | 
            +
            	 * @lends Pox.Browser
         | 
| 12 | 
            +
            	 */
         | 
| 13 | 
            +
            	{
         | 
| 14 | 
            +
            		/**
         | 
| 15 | 
            +
            		 * 是否支持 WebkitTransition
         | 
| 16 | 
            +
            		 * @type boolean
         | 
| 17 | 
            +
            		 */
         | 
| 18 | 
            +
            		supportWebkitTransition: false,
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            		/**
         | 
| 21 | 
            +
            		 * 是否支持 WebkitTransform
         | 
| 22 | 
            +
            		 * @type boolean
         | 
| 23 | 
            +
            		 */
         | 
| 24 | 
            +
            		supportWebkitTransform: false
         | 
| 25 | 
            +
            	})
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            	if ('WebKitTransitionEvent' in window) {
         | 
| 28 | 
            +
            		Pox.extend(Pox.Browser, {
         | 
| 29 | 
            +
            			supportWebkitTransition: true,
         | 
| 30 | 
            +
            			supportWebkitTransform: true
         | 
| 31 | 
            +
            		})
         | 
| 32 | 
            +
            	}
         | 
| 33 | 
            +
            })()
         | 
| @@ -0,0 +1,289 @@ | |
| 1 | 
            +
            //= require_self
         | 
| 2 | 
            +
            //= require ./debugger
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            /**
         | 
| 5 | 
            +
             * Pox 基础类
         | 
| 6 | 
            +
             * @namespace Pox
         | 
| 7 | 
            +
             */
         | 
| 8 | 
            +
            window.Pox = {};
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            (function() {
         | 
| 11 | 
            +
            	"use strict";
         | 
| 12 | 
            +
            	
         | 
| 13 | 
            +
            	/** @lends Pox */
         | 
| 14 | 
            +
            	var Basic = {
         | 
| 15 | 
            +
            		/**
         | 
| 16 | 
            +
            		 * @param {object} target
         | 
| 17 | 
            +
            		 * @param {object} exts
         | 
| 18 | 
            +
            		 * @returns {object} target
         | 
| 19 | 
            +
            		 */
         | 
| 20 | 
            +
            		extend: function(target, exts) {
         | 
| 21 | 
            +
            			exts = exts || {};
         | 
| 22 | 
            +
            			for(var m in exts) {
         | 
| 23 | 
            +
            				target[m] = exts[m];
         | 
| 24 | 
            +
            			}
         | 
| 25 | 
            +
            			return target;
         | 
| 26 | 
            +
            		},
         | 
| 27 | 
            +
            		
         | 
| 28 | 
            +
            		/**
         | 
| 29 | 
            +
            		 * 注册在 window 对象 onload 完成后执行的回调
         | 
| 30 | 
            +
            		 * @param {function} callback
         | 
| 31 | 
            +
            		 */
         | 
| 32 | 
            +
            		ready: function(callback) {
         | 
| 33 | 
            +
            			if (this._doReadyed) {
         | 
| 34 | 
            +
            				callback();
         | 
| 35 | 
            +
            			} else {
         | 
| 36 | 
            +
            				this._readyCallbacks = this._readyCallbacks || [];
         | 
| 37 | 
            +
            				this._readyCallbacks.push(callback);
         | 
| 38 | 
            +
            			}
         | 
| 39 | 
            +
            		},
         | 
| 40 | 
            +
            		
         | 
| 41 | 
            +
            		/**
         | 
| 42 | 
            +
            		 * 执行在 window 对象 onload 事件上绑定的回调
         | 
| 43 | 
            +
            		 * @example <caption>Example usage of doReady.</caption>
         | 
| 44 | 
            +
            		 * <pre><body onload="Pox.doReady()">
         | 
| 45 | 
            +
            		 * </body></pre>
         | 
| 46 | 
            +
            		 */
         | 
| 47 | 
            +
            		doReady: function() {
         | 
| 48 | 
            +
            			this._doReadyed = true;
         | 
| 49 | 
            +
            			if (this._readyCallbacks) {
         | 
| 50 | 
            +
            				for(var i = 0; i < this._readyCallbacks.length; i++) {
         | 
| 51 | 
            +
            					this._readyCallbacks[i]();
         | 
| 52 | 
            +
            					this._readyCallbacks[i] = null;
         | 
| 53 | 
            +
            				}
         | 
| 54 | 
            +
            				
         | 
| 55 | 
            +
            				this._readyCallbacks = null;
         | 
| 56 | 
            +
            			}
         | 
| 57 | 
            +
            		},
         | 
| 58 | 
            +
             | 
| 59 | 
            +
            		/**
         | 
| 60 | 
            +
            		 * 在 window 对象 unload 完成后执行的回调
         | 
| 61 | 
            +
            		 * @param {function} callback
         | 
| 62 | 
            +
            		 */
         | 
| 63 | 
            +
            		leave: function(callback) {
         | 
| 64 | 
            +
            			this._unloadCallbacks = this._unloadCallbacks || [];
         | 
| 65 | 
            +
            			this._unloadCallbacks.push(callback);
         | 
| 66 | 
            +
            		},
         | 
| 67 | 
            +
            		
         | 
| 68 | 
            +
            		doLeave: function() {
         | 
| 69 | 
            +
            			this._unloadCallbacks = this._unloadCallbacks || [];
         | 
| 70 | 
            +
            			for(var i = 0; i < this._unloadCallbacks.length; i++) {
         | 
| 71 | 
            +
            				this._unloadCallbacks[i]();
         | 
| 72 | 
            +
            			}
         | 
| 73 | 
            +
            		},
         | 
| 74 | 
            +
            		
         | 
| 75 | 
            +
            		
         | 
| 76 | 
            +
            		/**
         | 
| 77 | 
            +
            		 * 页面跳转
         | 
| 78 | 
            +
            		 * @param {String} url
         | 
| 79 | 
            +
            		 */
         | 
| 80 | 
            +
            		goto: function(url) {
         | 
| 81 | 
            +
            			if (url.indexOf("://")) {
         | 
| 82 | 
            +
            				location.href = url;
         | 
| 83 | 
            +
            			} else {
         | 
| 84 | 
            +
            				var fullUrl = location.protocol + "//" + location.hostname + ":" + location.port + url;
         | 
| 85 | 
            +
            				location.href = fullUrl;
         | 
| 86 | 
            +
            			}
         | 
| 87 | 
            +
            		},
         | 
| 88 | 
            +
            		
         | 
| 89 | 
            +
            		
         | 
| 90 | 
            +
            		/**
         | 
| 91 | 
            +
            		 * 根据 Class 创建类
         | 
| 92 | 
            +
            		 * @param {Class} fn1
         | 
| 93 | 
            +
            		 * @param {Class} fn2
         | 
| 94 | 
            +
            		 * @param {Class} fn3
         | 
| 95 | 
            +
            		 * @param {...Class} fnN
         | 
| 96 | 
            +
            		 * @returns {Function}
         | 
| 97 | 
            +
            		 */
         | 
| 98 | 
            +
             | 
| 99 | 
            +
            		clazz: function(fn1, fn2, fn3, fn4, fn5, fn6) {
         | 
| 100 | 
            +
            			// ipanel don't full support "arguments" object
         | 
| 101 | 
            +
            			var clz = function(pm1, pm2, pm3, pm4, pm5, pm6) {
         | 
| 102 | 
            +
            				if (this.init) {
         | 
| 103 | 
            +
            					this.init.call(this, pm1, pm2, pm3, pm4, pm5, pm6);
         | 
| 104 | 
            +
            				}
         | 
| 105 | 
            +
            			}
         | 
| 106 | 
            +
            			
         | 
| 107 | 
            +
            			var args = [ fn1, fn2, fn3, fn4, fn5, fn6 ];
         | 
| 108 | 
            +
            			for (var i = 0; i < args.length; i++) {
         | 
| 109 | 
            +
            				var obj = args[i];
         | 
| 110 | 
            +
            				if (obj == null) { continue; }
         | 
| 111 | 
            +
            				
         | 
| 112 | 
            +
            				if (this.isFunction(obj)) {
         | 
| 113 | 
            +
            					this.extend(clz.prototype, obj.prototype);
         | 
| 114 | 
            +
            				} else {
         | 
| 115 | 
            +
            					this.extend(clz.prototype, obj);
         | 
| 116 | 
            +
            				}
         | 
| 117 | 
            +
            			};
         | 
| 118 | 
            +
            			
         | 
| 119 | 
            +
            			return clz;
         | 
| 120 | 
            +
            		},
         | 
| 121 | 
            +
            		
         | 
| 122 | 
            +
            		/**
         | 
| 123 | 
            +
            		 * 根据 Class 创建对象
         | 
| 124 | 
            +
            		 * @param {Class} fn1
         | 
| 125 | 
            +
            		 * @param {Class} fn2
         | 
| 126 | 
            +
            		 * @param {Class} fn3
         | 
| 127 | 
            +
            		 * @param {...Class} fnN
         | 
| 128 | 
            +
            		 * @returns {object}
         | 
| 129 | 
            +
            		 */
         | 
| 130 | 
            +
            		instance: function(fn1, fn2, fn3, fn4, fn5, fn6) {
         | 
| 131 | 
            +
            			var ins = {};
         | 
| 132 | 
            +
            			// ipanel don't full support "arguments" object
         | 
| 133 | 
            +
            			var args = [ fn1, fn2, fn3, fn4, fn5, fn6 ];
         | 
| 134 | 
            +
            			for (var i = 0; i < args.length; i++) {
         | 
| 135 | 
            +
            				var obj = args[i];
         | 
| 136 | 
            +
            				if (obj == null) { continue; }
         | 
| 137 | 
            +
            				
         | 
| 138 | 
            +
            				if (this.isFunction(obj)) {
         | 
| 139 | 
            +
            					this.extend(ins, obj.prototype);
         | 
| 140 | 
            +
            				} else {
         | 
| 141 | 
            +
            					this.extend(ins, obj);
         | 
| 142 | 
            +
            				}
         | 
| 143 | 
            +
            			};
         | 
| 144 | 
            +
            			
         | 
| 145 | 
            +
            			return ins;
         | 
| 146 | 
            +
            		},
         | 
| 147 | 
            +
            		
         | 
| 148 | 
            +
            		/**
         | 
| 149 | 
            +
            		 * 判断是否为函数
         | 
| 150 | 
            +
            		 * @param {object} obj
         | 
| 151 | 
            +
            		 * @returns {boolean}
         | 
| 152 | 
            +
            		 */
         | 
| 153 | 
            +
            		isFunction: function(obj) {
         | 
| 154 | 
            +
            			return typeof obj == "function";
         | 
| 155 | 
            +
            		},
         | 
| 156 | 
            +
            		
         | 
| 157 | 
            +
            		/**
         | 
| 158 | 
            +
            		 * 绑定函数的执行对象
         | 
| 159 | 
            +
            		 * @param {object} context
         | 
| 160 | 
            +
            		 * @param {Function} fn
         | 
| 161 | 
            +
            		 * @returns {Function}
         | 
| 162 | 
            +
            		 */
         | 
| 163 | 
            +
            		proxy: function(context, fn) {
         | 
| 164 | 
            +
            			return function() {
         | 
| 165 | 
            +
            				fn.apply(context, arguments);
         | 
| 166 | 
            +
            			}
         | 
| 167 | 
            +
            		},
         | 
| 168 | 
            +
            		
         | 
| 169 | 
            +
            		/**
         | 
| 170 | 
            +
            		 * 当前时间
         | 
| 171 | 
            +
            		 * @returns {Date} returns date.
         | 
| 172 | 
            +
            		 */
         | 
| 173 | 
            +
            		now: function() {
         | 
| 174 | 
            +
            			if (this._nowBaseLine) {
         | 
| 175 | 
            +
            				var current = new Date();
         | 
| 176 | 
            +
            				var offset = current.getTime() - this._nowActual.getTime();
         | 
| 177 | 
            +
            				var time = this._nowBaseLine.getTime() + offset;
         | 
| 178 | 
            +
            				var result = new Date();
         | 
| 179 | 
            +
            				result.setTime(time);
         | 
| 180 | 
            +
            				return result;
         | 
| 181 | 
            +
            			}
         | 
| 182 | 
            +
            			return new Date();
         | 
| 183 | 
            +
            		},
         | 
| 184 | 
            +
            		
         | 
| 185 | 
            +
            		nowBaseline: function(dateStr) {
         | 
| 186 | 
            +
            			this._nowActual = new Date();
         | 
| 187 | 
            +
            			this._nowBaseLine = this.parseIso8601(dateStr);
         | 
| 188 | 
            +
            		},
         | 
| 189 | 
            +
            		
         | 
| 190 | 
            +
            		/**
         | 
| 191 | 
            +
            		 * 把格式为iso8601的字符串转换为Date对象
         | 
| 192 | 
            +
            		 * @param {string} str
         | 
| 193 | 
            +
            		 * @returns {Date}
         | 
| 194 | 
            +
            		 */
         | 
| 195 | 
            +
            		parseIso8601: function(str) {
         | 
| 196 | 
            +
            			var block = str.split("T")
         | 
| 197 | 
            +
            			var dateStr = block[0];
         | 
| 198 | 
            +
            			var timeWithZoneStr = block[1];
         | 
| 199 | 
            +
            			
         | 
| 200 | 
            +
            			var year = 0;
         | 
| 201 | 
            +
            			var month = 0;
         | 
| 202 | 
            +
            			var day = 1;
         | 
| 203 | 
            +
            			
         | 
| 204 | 
            +
            			if (dateStr) {
         | 
| 205 | 
            +
            				var d = dateStr.split("-");
         | 
| 206 | 
            +
            				year = parseInt(d[0] || "0", 10);
         | 
| 207 | 
            +
            				month = parseInt(d[1] || "1", 10) - 1;
         | 
| 208 | 
            +
            				day = parseInt(d[2] || "1", 10);
         | 
| 209 | 
            +
            			}
         | 
| 210 | 
            +
            			
         | 
| 211 | 
            +
            			var hours = 0;
         | 
| 212 | 
            +
            			var minutes = 0;
         | 
| 213 | 
            +
            			var seconds = 0;
         | 
| 214 | 
            +
            			var milliseconds = 0;
         | 
| 215 | 
            +
            			var minutesOffset = 0;
         | 
| 216 | 
            +
            			
         | 
| 217 | 
            +
            			if (timeWithZoneStr) {
         | 
| 218 | 
            +
            				var m = timeWithZoneStr.match(/([^\+\-|Z]+)(Z|[\-\+].+)?/)
         | 
| 219 | 
            +
            				var time = m[1];
         | 
| 220 | 
            +
            				var zone = m[2];
         | 
| 221 | 
            +
            				
         | 
| 222 | 
            +
            				var t = time.match(/(\d{2}):?(\d{2})?:?(\d{2})?(\.\d+)?/)
         | 
| 223 | 
            +
            				if (t[1]) {
         | 
| 224 | 
            +
            					hours = parseInt(t[1] || "0", 10);
         | 
| 225 | 
            +
            				}
         | 
| 226 | 
            +
            				if (t[2]) {
         | 
| 227 | 
            +
            					minutes = parseInt(t[2] || "0", 10);
         | 
| 228 | 
            +
            				}
         | 
| 229 | 
            +
            				if (t[3]) {
         | 
| 230 | 
            +
            					seconds = parseInt(t[3] || "0", 10);
         | 
| 231 | 
            +
            				}
         | 
| 232 | 
            +
            				if (t[4]) {
         | 
| 233 | 
            +
            					milliseconds = parseInt(t[4].substing(1) || "0", 10);
         | 
| 234 | 
            +
            				}
         | 
| 235 | 
            +
            				
         | 
| 236 | 
            +
            				if (zone && zone[0] != "Z") {
         | 
| 237 | 
            +
            					var z = zone.match(/([\+\-])(\d{2}):?(\d+)/);
         | 
| 238 | 
            +
            					minutesOffset = parseInt(z[2], 10) * 60 + parseInt(z[3] || "0", 10);
         | 
| 239 | 
            +
            					if (z[1] == "+") {
         | 
| 240 | 
            +
            						minutesOffset = 0 - minutesOffset;
         | 
| 241 | 
            +
            					}
         | 
| 242 | 
            +
            				}
         | 
| 243 | 
            +
            			}
         | 
| 244 | 
            +
            			
         | 
| 245 | 
            +
            			var localMinutesOffset = minutesOffset - new Date().getTimezoneOffset();
         | 
| 246 | 
            +
            			var date = new Date(year, month, day, hours, minutes, seconds)
         | 
| 247 | 
            +
            			var time = date.getTime() + localMinutesOffset * 60 * 1000;
         | 
| 248 | 
            +
            			date.setTime(time);
         | 
| 249 | 
            +
            			return date;
         | 
| 250 | 
            +
            		},
         | 
| 251 | 
            +
             | 
| 252 | 
            +
            		/**
         | 
| 253 | 
            +
            		 * 判断数组是否含有该对象
         | 
| 254 | 
            +
            		 * @param {array} array
         | 
| 255 | 
            +
            		 * @param {object} obj
         | 
| 256 | 
            +
            		 * @returns {boolean}
         | 
| 257 | 
            +
            		 */
         | 
| 258 | 
            +
            		contains: function(array, obj) {
         | 
| 259 | 
            +
            			for(var i=0; i < array.length; i++){
         | 
| 260 | 
            +
            				if (array[i] == obj) {
         | 
| 261 | 
            +
            					return true;
         | 
| 262 | 
            +
            				}
         | 
| 263 | 
            +
            			}
         | 
| 264 | 
            +
            			return false;
         | 
| 265 | 
            +
            		},
         | 
| 266 | 
            +
            		
         | 
| 267 | 
            +
            		/**
         | 
| 268 | 
            +
            		 * 判断对象是否为空
         | 
| 269 | 
            +
            		 * @todo 需要支持数组
         | 
| 270 | 
            +
            		 * @param {object} hash
         | 
| 271 | 
            +
            		 * @returns {boolean}
         | 
| 272 | 
            +
            		 */
         | 
| 273 | 
            +
            		isEmpty: function(hash) {
         | 
| 274 | 
            +
            			for (var name in hash) {
         | 
| 275 | 
            +
            				return false;
         | 
| 276 | 
            +
            			}
         | 
| 277 | 
            +
            			
         | 
| 278 | 
            +
            			return true;
         | 
| 279 | 
            +
            		},
         | 
| 280 | 
            +
            		
         | 
| 281 | 
            +
            		debug: function(msg) {
         | 
| 282 | 
            +
             | 
| 283 | 
            +
            		}
         | 
| 284 | 
            +
            	}
         | 
| 285 | 
            +
            	
         | 
| 286 | 
            +
             | 
| 287 | 
            +
             | 
| 288 | 
            +
            	Basic.extend(Pox, Basic);
         | 
| 289 | 
            +
            })();
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            (function() {
         | 
| 2 | 
            +
            	"use strict";
         | 
| 3 | 
            +
            	
         | 
| 4 | 
            +
            	var Debugger = {
         | 
| 5 | 
            +
            		messages: [],
         | 
| 6 | 
            +
            		ready: false,
         | 
| 7 | 
            +
            		enabled: true,
         | 
| 8 | 
            +
            		element: null,
         | 
| 9 | 
            +
            		sequence: 1,
         | 
| 10 | 
            +
            		
         | 
| 11 | 
            +
            		debug: function(msg) {
         | 
| 12 | 
            +
            			if (this.enabled) {
         | 
| 13 | 
            +
            				var message = "<li>" + this.sequence + " : " + (msg || "") + "</li>";
         | 
| 14 | 
            +
            				this.sequence += 1;
         | 
| 15 | 
            +
            				this.messages.unshift(message);
         | 
| 16 | 
            +
            				this.flush();
         | 
| 17 | 
            +
            			}
         | 
| 18 | 
            +
            		},
         | 
| 19 | 
            +
            		
         | 
| 20 | 
            +
            		disable: function() {
         | 
| 21 | 
            +
            			this.enabled = false;
         | 
| 22 | 
            +
            			this.messages = [];
         | 
| 23 | 
            +
            		},
         | 
| 24 | 
            +
            		
         | 
| 25 | 
            +
            		flush: function() {
         | 
| 26 | 
            +
            			if (!this.ready) { return; }
         | 
| 27 | 
            +
            			
         | 
| 28 | 
            +
            			var output = Array.prototype.slice.call(this.messages, 0, 20);
         | 
| 29 | 
            +
            			this.element.innerHTML = output.join("\n");
         | 
| 30 | 
            +
            		}
         | 
| 31 | 
            +
            	}
         | 
| 32 | 
            +
            	
         | 
| 33 | 
            +
            	Pox.ready(function() {
         | 
| 34 | 
            +
            		var box = Pox.getById("debug");
         | 
| 35 | 
            +
            		if (box) {
         | 
| 36 | 
            +
            			Debugger.element = box;
         | 
| 37 | 
            +
            			Debugger.ready = true;
         | 
| 38 | 
            +
            			Debugger.flush();
         | 
| 39 | 
            +
            		} else {
         | 
| 40 | 
            +
            			Debugger.disable();
         | 
| 41 | 
            +
            		}
         | 
| 42 | 
            +
            	});
         | 
| 43 | 
            +
            	
         | 
| 44 | 
            +
            	/** @lends Pox */
         | 
| 45 | 
            +
            	Pox.extend(Pox, {
         | 
| 46 | 
            +
            		/**
         | 
| 47 | 
            +
            		 * 输出调试日志
         | 
| 48 | 
            +
            		 * @param {string} msg
         | 
| 49 | 
            +
            		 */
         | 
| 50 | 
            +
            		debug: function(msg) {
         | 
| 51 | 
            +
            			Debugger.debug(msg);
         | 
| 52 | 
            +
            		}
         | 
| 53 | 
            +
            	});
         | 
| 54 | 
            +
            })();
         | 
| @@ -0,0 +1,261 @@ | |
| 1 | 
            +
            //= require ./core
         | 
| 2 | 
            +
            (function() {
         | 
| 3 | 
            +
            	"use strict";
         | 
| 4 | 
            +
            	
         | 
| 5 | 
            +
            	/** @lends Pox */
         | 
| 6 | 
            +
            	var PoxDom = {
         | 
| 7 | 
            +
            		
         | 
| 8 | 
            +
            		/**
         | 
| 9 | 
            +
            		 * 增加 dom 对象的 样式
         | 
| 10 | 
            +
            		 * @param {HTMLElement} element
         | 
| 11 | 
            +
            		 * @param {string} className
         | 
| 12 | 
            +
            		 */
         | 
| 13 | 
            +
            		addClassName: function(element, className) {
         | 
| 14 | 
            +
            			if (this.hasClassName(element, className)) { return; }
         | 
| 15 | 
            +
            			
         | 
| 16 | 
            +
            			var classNames = element.className || "";
         | 
| 17 | 
            +
            			classNames += " " + className;
         | 
| 18 | 
            +
            			element.className = classNames;
         | 
| 19 | 
            +
            		},
         | 
| 20 | 
            +
            		
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            		
         | 
| 23 | 
            +
            		/**
         | 
| 24 | 
            +
            		 * 删除 dom 对象的 样式
         | 
| 25 | 
            +
            		 * @param {HTMLElement} element
         | 
| 26 | 
            +
            		 * @param {string} className
         | 
| 27 | 
            +
            		 */
         | 
| 28 | 
            +
            		removeClassName: function(element, className) {
         | 
| 29 | 
            +
            			var classList = this.getClassNames(element);
         | 
| 30 | 
            +
            			var newClassList = [];
         | 
| 31 | 
            +
            			for (var i = 0; i < classList.length; i++) {
         | 
| 32 | 
            +
            				var theClassName = classList[i];
         | 
| 33 | 
            +
            				if (theClassName != "" && theClassName != className) {
         | 
| 34 | 
            +
            					newClassList.push(theClassName)
         | 
| 35 | 
            +
            				}
         | 
| 36 | 
            +
            			}
         | 
| 37 | 
            +
            			
         | 
| 38 | 
            +
            			element.className = newClassList.join(" ");
         | 
| 39 | 
            +
            		},
         | 
| 40 | 
            +
            		
         | 
| 41 | 
            +
            		/**
         | 
| 42 | 
            +
            		 * @param {HTMLElement} element
         | 
| 43 | 
            +
            		 * @param {string} className
         | 
| 44 | 
            +
            		 * @param {boolean} toggle
         | 
| 45 | 
            +
            		 */
         | 
| 46 | 
            +
            		toggleClassName: function(element, className, toggle) {
         | 
| 47 | 
            +
            			if (toggle) {
         | 
| 48 | 
            +
            				this.addClassName(element, className);
         | 
| 49 | 
            +
            			} else {
         | 
| 50 | 
            +
            				this.removeClassName(element, className);
         | 
| 51 | 
            +
            			}
         | 
| 52 | 
            +
            		},
         | 
| 53 | 
            +
            		
         | 
| 54 | 
            +
            		/**
         | 
| 55 | 
            +
            		 * 获取dom对象的样式
         | 
| 56 | 
            +
            		 * @param {HTMLElement} element
         | 
| 57 | 
            +
            		 * @param {string} className
         | 
| 58 | 
            +
            		 * @param {boolean} toggle
         | 
| 59 | 
            +
            		 * @returns {string}
         | 
| 60 | 
            +
            		 */
         | 
| 61 | 
            +
            		getClassNames: function(element) {
         | 
| 62 | 
            +
            			var classNames = element.className || "";
         | 
| 63 | 
            +
            			return classNames.split(" ");
         | 
| 64 | 
            +
            		},
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            		/**
         | 
| 67 | 
            +
            		 * 判断dom对象是否含有该样式
         | 
| 68 | 
            +
            		 * @param {HTMLElement} element
         | 
| 69 | 
            +
            		 * @param {string} className
         | 
| 70 | 
            +
            		 * @returns {boolean}
         | 
| 71 | 
            +
            		 */
         | 
| 72 | 
            +
            		hasClassName: function(element, className) {
         | 
| 73 | 
            +
            			var classList = this.getClassNames(element);
         | 
| 74 | 
            +
            			for (var i = 0; i < classList.length; i++) {
         | 
| 75 | 
            +
            				if (classList[i] == className) {
         | 
| 76 | 
            +
            					return true;
         | 
| 77 | 
            +
            				}
         | 
| 78 | 
            +
            			}
         | 
| 79 | 
            +
            			return false;
         | 
| 80 | 
            +
            		},
         | 
| 81 | 
            +
            		
         | 
| 82 | 
            +
            		/**
         | 
| 83 | 
            +
            		 * 删除dom对象
         | 
| 84 | 
            +
            		 * @param {HTMLElement} element
         | 
| 85 | 
            +
            		 * @returns {object}
         | 
| 86 | 
            +
            		 */
         | 
| 87 | 
            +
            		remove: function(element) {
         | 
| 88 | 
            +
            			element.parentNode.removeChild(element);
         | 
| 89 | 
            +
            		},
         | 
| 90 | 
            +
             | 
| 91 | 
            +
            		/**
         | 
| 92 | 
            +
            		 * 通过class查询dom元素
         | 
| 93 | 
            +
            		 * @param {HTMLElement} element
         | 
| 94 | 
            +
            		 * @param {string} className
         | 
| 95 | 
            +
            		 * @returns {Array}
         | 
| 96 | 
            +
            		 */
         | 
| 97 | 
            +
            		queryByClass: function(element, className) {
         | 
| 98 | 
            +
            			if (element.getElementsByClassName) {
         | 
| 99 | 
            +
            				return element.getElementsByClassName(className);
         | 
| 100 | 
            +
            			}
         | 
| 101 | 
            +
             | 
| 102 | 
            +
            			var tags = element.getElementsByTagName("*");
         | 
| 103 | 
            +
            			var result = [];
         | 
| 104 | 
            +
            			
         | 
| 105 | 
            +
            			for (var i = 0; i < tags.length; i++) {
         | 
| 106 | 
            +
            				if (this.hasClassName(tags[i], className)) {
         | 
| 107 | 
            +
            					result.push(tags[i]);
         | 
| 108 | 
            +
            				}
         | 
| 109 | 
            +
            			}
         | 
| 110 | 
            +
            			
         | 
| 111 | 
            +
            			return result;
         | 
| 112 | 
            +
            		},
         | 
| 113 | 
            +
            		
         | 
| 114 | 
            +
            		/**
         | 
| 115 | 
            +
            		 * 通过class查询第一个符合条件的dom元素
         | 
| 116 | 
            +
            		 * @param {HTMLElement} element
         | 
| 117 | 
            +
            		 * @param {string} className
         | 
| 118 | 
            +
            		 * @returns {HTMLElement}
         | 
| 119 | 
            +
            		 */
         | 
| 120 | 
            +
            		findByClass: function(element, className) {
         | 
| 121 | 
            +
            			var els = this.queryByClass(element, className) || [];
         | 
| 122 | 
            +
            			return els[0];
         | 
| 123 | 
            +
            		},
         | 
| 124 | 
            +
            		
         | 
| 125 | 
            +
            		/**
         | 
| 126 | 
            +
            		 * 通过id查询dom元素
         | 
| 127 | 
            +
            		 * @param {string} id
         | 
| 128 | 
            +
            		 * @returns {HTMLElement}
         | 
| 129 | 
            +
            		 */
         | 
| 130 | 
            +
            		getById: function(id) {
         | 
| 131 | 
            +
            			return document.getElementById(id);
         | 
| 132 | 
            +
            		},
         | 
| 133 | 
            +
            		
         | 
| 134 | 
            +
            		/**
         | 
| 135 | 
            +
            		 * 切换dom元素的显示与隐藏状态
         | 
| 136 | 
            +
            		 * @param {HTMLElement} element
         | 
| 137 | 
            +
            		 * @param {boolean} flag
         | 
| 138 | 
            +
            		 */
         | 
| 139 | 
            +
            		toggle: function(element, flag){
         | 
| 140 | 
            +
            			if (flag) {
         | 
| 141 | 
            +
            				element.style.display = "block";
         | 
| 142 | 
            +
            			} else {
         | 
| 143 | 
            +
            				element.style.display = "none";
         | 
| 144 | 
            +
            			}
         | 
| 145 | 
            +
            		},
         | 
| 146 | 
            +
            		
         | 
| 147 | 
            +
            		/**
         | 
| 148 | 
            +
            		 * <del>获得style的属性值</del>
         | 
| 149 | 
            +
            		 * @deprecated 因为有些机顶盒会返回非 string 类型的值, 所以请用 {@linkcode Pox.getComputedStyle getComputedStyle} 代替
         | 
| 150 | 
            +
            		 * @param {HTMLElement} element
         | 
| 151 | 
            +
            		 * @param {string} cssProperty
         | 
| 152 | 
            +
            		 * @returns {*}
         | 
| 153 | 
            +
            		 */
         | 
| 154 | 
            +
            		getStyle: function(element, cssProperty) {
         | 
| 155 | 
            +
            			if (!element) {
         | 
| 156 | 
            +
            				return null;
         | 
| 157 | 
            +
            			}
         | 
| 158 | 
            +
             | 
| 159 | 
            +
            			if (element.currentStyle) {
         | 
| 160 | 
            +
            				return element.currentStyle[cssProperty];
         | 
| 161 | 
            +
            			} else {
         | 
| 162 | 
            +
            				return window.getComputedStyle(element)[cssProperty];
         | 
| 163 | 
            +
            			}
         | 
| 164 | 
            +
            		},
         | 
| 165 | 
            +
             | 
| 166 | 
            +
            		/**
         | 
| 167 | 
            +
            		 * 获得计算后的属性值
         | 
| 168 | 
            +
            		 * @param {HTMLElement} element
         | 
| 169 | 
            +
            		 * @param {string} cssProperty
         | 
| 170 | 
            +
            		 * @returns {string}
         | 
| 171 | 
            +
            		 */
         | 
| 172 | 
            +
            		getComputedStyle: function(element, cssProperty) {
         | 
| 173 | 
            +
            			var value = this.getStyle(element, cssProperty);
         | 
| 174 | 
            +
            			
         | 
| 175 | 
            +
            			if (cssProperty == "opacity" && typeof value == "number") {
         | 
| 176 | 
            +
            				return (value / 100.0).toString();
         | 
| 177 | 
            +
            			}
         | 
| 178 | 
            +
            			
         | 
| 179 | 
            +
            			if (typeof value == "number") {
         | 
| 180 | 
            +
            				if (value > 100000000) { //茁壮盒子会将auto返回为undefined,百分比返回一个很大的数字
         | 
| 181 | 
            +
            					return null;
         | 
| 182 | 
            +
            				}
         | 
| 183 | 
            +
            				
         | 
| 184 | 
            +
            				return value + "px";
         | 
| 185 | 
            +
            			}
         | 
| 186 | 
            +
            			
         | 
| 187 | 
            +
            			return value;
         | 
| 188 | 
            +
            		},
         | 
| 189 | 
            +
             | 
| 190 | 
            +
            		/**
         | 
| 191 | 
            +
            		 * 设置style的属性值
         | 
| 192 | 
            +
            		 * @param {HTMLElement} element
         | 
| 193 | 
            +
            		 * @param {string} cssProperty
         | 
| 194 | 
            +
            		 * @param {string} cssValue
         | 
| 195 | 
            +
            		 */
         | 
| 196 | 
            +
            		setStyle: function(element, cssProperty, cssValue) {
         | 
| 197 | 
            +
            			if (!element) {
         | 
| 198 | 
            +
            				return null;
         | 
| 199 | 
            +
            			}
         | 
| 200 | 
            +
             | 
| 201 | 
            +
            			element.style[cssProperty] = cssValue;
         | 
| 202 | 
            +
            		},
         | 
| 203 | 
            +
             | 
| 204 | 
            +
             | 
| 205 | 
            +
            		/**
         | 
| 206 | 
            +
            		 * @typedef {object} DimensionReturn
         | 
| 207 | 
            +
            		 * @property {number} top
         | 
| 208 | 
            +
            		 * @property {number} left
         | 
| 209 | 
            +
            		 * @property {number} width
         | 
| 210 | 
            +
            		 * @property {number} height
         | 
| 211 | 
            +
            		 */
         | 
| 212 | 
            +
            		/**
         | 
| 213 | 
            +
            		 * 获得element相对于屏幕的座标和高宽
         | 
| 214 | 
            +
            		 * @param {HTMLElement} element
         | 
| 215 | 
            +
            		 * @returns {DimensionReturn}
         | 
| 216 | 
            +
            		 */
         | 
| 217 | 
            +
            		getScreenDimension: function(element) {
         | 
| 218 | 
            +
            			var dimension = {
         | 
| 219 | 
            +
            				top: element.offsetTop,
         | 
| 220 | 
            +
            				left: element.offsetLeft,
         | 
| 221 | 
            +
            				width: element.offsetWidth,
         | 
| 222 | 
            +
            				height: element.offsetHeight
         | 
| 223 | 
            +
            			}
         | 
| 224 | 
            +
             | 
| 225 | 
            +
            			var parentElement = element.offsetParent;
         | 
| 226 | 
            +
            			while (parentElement) {
         | 
| 227 | 
            +
            				dimension.top  += parentElement.offsetTop;
         | 
| 228 | 
            +
            				dimension.left += parentElement.offsetLeft;
         | 
| 229 | 
            +
            				parentElement = parentElement.offsetParent;
         | 
| 230 | 
            +
            			}
         | 
| 231 | 
            +
             | 
| 232 | 
            +
            			return dimension;
         | 
| 233 | 
            +
            		},
         | 
| 234 | 
            +
             | 
| 235 | 
            +
            		/**
         | 
| 236 | 
            +
            		 * 创建dom对象
         | 
| 237 | 
            +
            		 * @param {string} html
         | 
| 238 | 
            +
            		 * @returns {HTMLElement}
         | 
| 239 | 
            +
            		 */
         | 
| 240 | 
            +
            		createElement: function(html) {
         | 
| 241 | 
            +
            			var div = document.createElement('div')
         | 
| 242 | 
            +
            			div.innerHTML = html
         | 
| 243 | 
            +
            			return div.children[0];
         | 
| 244 | 
            +
            		},
         | 
| 245 | 
            +
            		
         | 
| 246 | 
            +
            		/**
         | 
| 247 | 
            +
            		 * 切换是否隐藏
         | 
| 248 | 
            +
            		 * @param {HTMLElement} element
         | 
| 249 | 
            +
            		 * @param {boolean} toggle
         | 
| 250 | 
            +
            		 */
         | 
| 251 | 
            +
            		toggleVisibility: function(element, toggle) {
         | 
| 252 | 
            +
            			if (toggle) {
         | 
| 253 | 
            +
            				element.style.visibility = "visible";
         | 
| 254 | 
            +
            			} else {
         | 
| 255 | 
            +
            				element.style.visibility = "hidden";
         | 
| 256 | 
            +
            			}
         | 
| 257 | 
            +
            		}
         | 
| 258 | 
            +
            	}
         | 
| 259 | 
            +
            	
         | 
| 260 | 
            +
            	Pox.extend(Pox, PoxDom);
         | 
| 261 | 
            +
            })();
         |