| 1 | // timestamp: Sun, 03 Feb 2008 19:26:22 | 
|---|
| 2 | /* | 
|---|
| 3 |   IE7/IE8.js - copyright 2004-2008, Dean Edwards | 
|---|
| 4 |   http://dean.edwards.name/IE7/ | 
|---|
| 5 |   http://www.opensource.org/licenses/mit-license.php | 
|---|
| 6 | */ | 
|---|
| 7 |  | 
|---|
| 8 | /* W3C compliance for Microsoft Internet Explorer */ | 
|---|
| 9 |  | 
|---|
| 10 | /* credits/thanks: | 
|---|
| 11 |   Shaggy, Martijn Wargers, Jimmy Cerra, Mark D Anderson, | 
|---|
| 12 |   Lars Dieckow, Erik Arvidsson, Gellért Gyuris, James Denny, | 
|---|
| 13 |   Unknown W Brackets, Benjamin Westfarer, Rob Eberhardt, | 
|---|
| 14 |   Bill Edney, Kevin Newman, James Crompton, Matthew Mastracci, | 
|---|
| 15 |   Doug Wright, Richard York, Kenneth Kolano, MegaZone, | 
|---|
| 16 |   Thomas Verelst, Mark 'Tarquin' Wilton-Jones, Rainer Åhlfors, | 
|---|
| 17 |   David Zulaica, Ken Kolano, Kevin Newman | 
|---|
| 18 | */ | 
|---|
| 19 |  | 
|---|
| 20 | // ======================================================================= | 
|---|
| 21 | // TO DO | 
|---|
| 22 | // ======================================================================= | 
|---|
| 23 |  | 
|---|
| 24 | // PNG - unclickable content | 
|---|
| 25 |  | 
|---|
| 26 | // ======================================================================= | 
|---|
| 27 | // TEST/BUGGY | 
|---|
| 28 | // ======================================================================= | 
|---|
| 29 |  | 
|---|
| 30 | // hr{margin:1em auto} (doesn't look right in IE5) | 
|---|
| 31 |  | 
|---|
| 32 | (function() { | 
|---|
| 33 |  | 
|---|
| 34 | IE7 = { | 
|---|
| 35 |   toString: function(){return "IE7 version 2.0 (beta2)"} | 
|---|
| 36 | }; | 
|---|
| 37 | var appVersion = IE7.appVersion = navigator.appVersion.match(/MSIE (\d\.\d)/)[1]; | 
|---|
| 38 |  | 
|---|
| 39 | if (/ie7_off/.test(top.location.search) || appVersion < 5) return; | 
|---|
| 40 |  | 
|---|
| 41 | var Undefined = K(); | 
|---|
| 42 | var quirksMode = document.compatMode != "CSS1Compat"; | 
|---|
| 43 | var documentElement = document.documentElement, body, viewport; | 
|---|
| 44 | var ANON = "!"; | 
|---|
| 45 | var HEADER = ":link{ie7-link:link}:visited{ie7-link:visited}"; | 
|---|
| 46 |  | 
|---|
| 47 | // ----------------------------------------------------------------------- | 
|---|
| 48 | // external | 
|---|
| 49 | // ----------------------------------------------------------------------- | 
|---|
| 50 |  | 
|---|
| 51 | var RELATIVE = /^[\w\.]+[^:]*$/; | 
|---|
| 52 | function makePath(href, path) { | 
|---|
| 53 |   if (RELATIVE.test(href)) href = (path || "") + href; | 
|---|
| 54 |   return href; | 
|---|
| 55 | }; | 
|---|
| 56 |  | 
|---|
| 57 | function getPath(href, path) { | 
|---|
| 58 |   href = makePath(href, path); | 
|---|
| 59 |   return href.slice(0, href.lastIndexOf("/") + 1); | 
|---|
| 60 | }; | 
|---|
| 61 |  | 
|---|
| 62 | // get the path to this script | 
|---|
| 63 | var script = document.scripts[document.scripts.length - 1]; | 
|---|
| 64 | var path = getPath(script.src); | 
|---|
| 65 |  | 
|---|
| 66 | // we'll use microsoft's http request object to load external files | 
|---|
| 67 | try { | 
|---|
| 68 |   var httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); | 
|---|
| 69 | } catch (e) { | 
|---|
| 70 |   // ActiveX disabled | 
|---|
| 71 | } | 
|---|
| 72 |  | 
|---|
| 73 | var fileCache = {}; | 
|---|
| 74 | function loadFile(href, path) { | 
|---|
| 75 | try { | 
|---|
| 76 |   href = makePath(href, path); | 
|---|
| 77 |   if (!fileCache[href]) { | 
|---|
| 78 |     // easy to load a file huh? | 
|---|
| 79 |     httpRequest.open("GET", href, false); | 
|---|
| 80 |     httpRequest.send(); | 
|---|
| 81 |     if (httpRequest.status == 0 || httpRequest.status == 200) { | 
|---|
| 82 |       fileCache[href] = httpRequest.responseText; | 
|---|
| 83 |     } | 
|---|
| 84 |   } | 
|---|
| 85 | } catch (e) { | 
|---|
| 86 |   // ignore errors | 
|---|
| 87 | } finally { | 
|---|
| 88 |   return fileCache[href] || ""; | 
|---|
| 89 | }}; | 
|---|
| 90 |  | 
|---|
| 91 | // ----------------------------------------------------------------------- | 
|---|
| 92 | // IE5.0 compatibility | 
|---|
| 93 | // ----------------------------------------------------------------------- | 
|---|
| 94 |  | 
|---|
| 95 |  | 
|---|
| 96 | if (appVersion < 5.5) { | 
|---|
| 97 |   undefined = Undefined(); | 
|---|
| 98 |  | 
|---|
| 99 |   ANON = "HTML:!"; // for anonymous content | 
|---|
| 100 |    | 
|---|
| 101 |   // Fix String.replace (Safari1.x/IE5.0). | 
|---|
| 102 |   var GLOBAL = /(g|gi)$/; | 
|---|
| 103 |   var _String_replace = String.prototype.replace;  | 
|---|
| 104 |   String.prototype.replace = function(expression, replacement) { | 
|---|
| 105 |     if (typeof replacement == "function") { // Safari doesn't like functions | 
|---|
| 106 |       if (expression && expression.constructor == RegExp) { | 
|---|
| 107 |         var regexp = expression; | 
|---|
| 108 |         var global = regexp.global; | 
|---|
| 109 |         if (global == null) global = GLOBAL.test(regexp); | 
|---|
| 110 |         // we have to convert global RexpExps for exec() to work consistently | 
|---|
| 111 |         if (global) regexp = new RegExp(regexp.source); // non-global | 
|---|
| 112 |       } else { | 
|---|
| 113 |         regexp = new RegExp(rescape(expression)); | 
|---|
| 114 |       } | 
|---|
| 115 |       var match, string = this, result = ""; | 
|---|
| 116 |       while (string && (match = regexp.exec(string))) { | 
|---|
| 117 |         result += string.slice(0, match.index) + replacement.apply(this, match); | 
|---|
| 118 |         string = string.slice(match.index + match[0].length); | 
|---|
| 119 |         if (!global) break; | 
|---|
| 120 |       } | 
|---|
| 121 |       return result + string; | 
|---|
| 122 |     } | 
|---|
| 123 |     return _String_replace.apply(this, arguments); | 
|---|
| 124 |   }; | 
|---|
| 125 |    | 
|---|
| 126 |   Array.prototype.pop = function() { | 
|---|
| 127 |     if (this.length) { | 
|---|
| 128 |       var i = this[this.length - 1]; | 
|---|
| 129 |       this.length--; | 
|---|
| 130 |       return i; | 
|---|
| 131 |     } | 
|---|
| 132 |     return undefined; | 
|---|
| 133 |   }; | 
|---|
| 134 |    | 
|---|
| 135 |   Array.prototype.push = function() { | 
|---|
| 136 |     for (var i = 0; i < arguments.length; i++) { | 
|---|
| 137 |       this[this.length] = arguments[i]; | 
|---|
| 138 |     } | 
|---|
| 139 |     return this.length; | 
|---|
| 140 |   }; | 
|---|
| 141 |    | 
|---|
| 142 |   var ns = this; | 
|---|
| 143 |   Function.prototype.apply = function(o, a) { | 
|---|
| 144 |     if (o === undefined) o = ns; | 
|---|
| 145 |     else if (o == null) o = window; | 
|---|
| 146 |     else if (typeof o == "string") o = new String(o); | 
|---|
| 147 |     else if (typeof o == "number") o = new Number(o); | 
|---|
| 148 |     else if (typeof o == "boolean") o = new Boolean(o); | 
|---|
| 149 |     if (arguments.length == 1) a = []; | 
|---|
| 150 |     else if (a[0] && a[0].writeln) a[0] = a[0].documentElement.document || a[0]; | 
|---|
| 151 |     var $ = "#ie7_apply", r; | 
|---|
| 152 |     o[$] = this; | 
|---|
| 153 |     switch (a.length) { // unroll for speed | 
|---|
| 154 |       case 0: r = o[$](); break; | 
|---|
| 155 |       case 1: r = o[$](a[0]); break; | 
|---|
| 156 |       case 2: r = o[$](a[0],a[1]); break; | 
|---|
| 157 |       case 3: r = o[$](a[0],a[1],a[2]); break; | 
|---|
| 158 |       case 4: r = o[$](a[0],a[1],a[2],a[3]); break; | 
|---|
| 159 |       case 5: r = o[$](a[0],a[1],a[2],a[3],a[4]); break; | 
|---|
| 160 |       default: | 
|---|
| 161 |         var b = [], i = a.length - 1; | 
|---|
| 162 |         do b[i] = "a[" + i + "]"; while (i--); | 
|---|
| 163 |         eval("r=o[$](" + b + ")"); | 
|---|
| 164 |     } | 
|---|
| 165 |     if (typeof o.valueOf == "function") { // not a COM object | 
|---|
| 166 |       delete o[$]; | 
|---|
| 167 |     } else { | 
|---|
| 168 |       o[$] = undefined; | 
|---|
| 169 |       if (r && r.writeln) r = r.documentElement.document || r; | 
|---|
| 170 |     } | 
|---|
| 171 |     return r; | 
|---|
| 172 |   }; | 
|---|
| 173 |    | 
|---|
| 174 |   Function.prototype.call = function(o) { | 
|---|
| 175 |     return this.apply(o, _slice.apply(arguments, [1])); | 
|---|
| 176 |   }; | 
|---|
| 177 |  | 
|---|
| 178 |   // block elements are "inline" according to IE5.0 so we'll fix it | 
|---|
| 179 |   HEADER += "address,blockquote,body,dd,div,dt,fieldset,form,"+ | 
|---|
| 180 |     "frame,frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,"+ | 
|---|
| 181 |     "hr,applet,center,dir,menu,pre,dl,li,ol,ul{display:block}"; | 
|---|
| 182 | } | 
|---|
| 183 |  | 
|---|
| 184 | // ----------------------------------------------------------------------- | 
|---|
| 185 | // OO support | 
|---|
| 186 | // ----------------------------------------------------------------------- | 
|---|
| 187 |  | 
|---|
| 188 |  | 
|---|
| 189 | // This is a cut-down version of base2 (http://code.google.com/p/base2/) | 
|---|
| 190 |  | 
|---|
| 191 | var _slice = Array.prototype.slice; | 
|---|
| 192 |  | 
|---|
| 193 | // private | 
|---|
| 194 | var _FORMAT = /%([1-9])/g; | 
|---|
| 195 | var _LTRIM = /^\s\s*/; | 
|---|
| 196 | var _RTRIM = /\s\s*$/; | 
|---|
| 197 | var _RESCAPE = /([\/()[\]{}|*+-.,^$?\\])/g;           // safe regular expressions | 
|---|
| 198 | var _BASE = /\bbase\b/; | 
|---|
| 199 | var _HIDDEN = ["constructor", "toString"];            // only override these when prototyping | 
|---|
| 200 |  | 
|---|
| 201 | var prototyping; | 
|---|
| 202 |  | 
|---|
| 203 | function Base(){}; | 
|---|
| 204 | Base.extend = function(_instance, _static) { | 
|---|
| 205 |   // Build the prototype. | 
|---|
| 206 |   prototyping = true; | 
|---|
| 207 |   var _prototype = new this; | 
|---|
| 208 |   extend(_prototype, _instance); | 
|---|
| 209 |   prototyping = false; | 
|---|
| 210 |  | 
|---|
| 211 |   // Create the wrapper for the constructor function. | 
|---|
| 212 |   var _constructor = _prototype.constructor; | 
|---|
| 213 |   function klass() { | 
|---|
| 214 |     // Don't call the constructor function when prototyping. | 
|---|
| 215 |     if (!prototyping) _constructor.apply(this, arguments); | 
|---|
| 216 |   }; | 
|---|
| 217 |   _prototype.constructor = klass; | 
|---|
| 218 |  | 
|---|
| 219 |   // Build the static interface. | 
|---|
| 220 |   klass.extend = arguments.callee; | 
|---|
| 221 |   extend(klass, _static); | 
|---|
| 222 |   klass.prototype = _prototype; | 
|---|
| 223 |   return klass; | 
|---|
| 224 | }; | 
|---|
| 225 | Base.prototype.extend = function(source) { | 
|---|
| 226 |   return extend(this, source); | 
|---|
| 227 | }; | 
|---|
| 228 |  | 
|---|
| 229 | // A collection of regular expressions and their associated replacement values. | 
|---|
| 230 | // A Base class for creating parsers. | 
|---|
| 231 |  | 
|---|
| 232 | var _HASH   = "#"; | 
|---|
| 233 | var _KEYS   = "~"; | 
|---|
| 234 |  | 
|---|
| 235 | var _RG_ESCAPE_CHARS    = /\\./g; | 
|---|
| 236 | var _RG_ESCAPE_BRACKETS = /\(\?[:=!]|\[[^\]]+\]/g; | 
|---|
| 237 | var _RG_BRACKETS        = /\(/g; | 
|---|
| 238 |  | 
|---|
| 239 | var RegGrp = Base.extend({ | 
|---|
| 240 |   constructor: function(values) { | 
|---|
| 241 |     this[_KEYS] = []; | 
|---|
| 242 |     this.merge(values); | 
|---|
| 243 |   }, | 
|---|
| 244 |  | 
|---|
| 245 |   exec: function(string) { | 
|---|
| 246 |     var items = this, keys = this[_KEYS];     | 
|---|
| 247 |     return String(string).replace(new RegExp(this, this.ignoreCase ? "gi" : "g"), function() { | 
|---|
| 248 |       var item, offset = 1, i = 0; | 
|---|
| 249 |       // Loop through the RegGrp items. | 
|---|
| 250 |       while ((item = items[_HASH + keys[i++]])) { | 
|---|
| 251 |         var next = offset + item.length + 1; | 
|---|
| 252 |         if (arguments[offset]) { // do we have a result? | 
|---|
| 253 |           var replacement = item.replacement; | 
|---|
| 254 |           switch (typeof replacement) { | 
|---|
| 255 |             case "function": | 
|---|
| 256 |               return replacement.apply(items, _slice.call(arguments, offset, next)); | 
|---|
| 257 |             case "number": | 
|---|
| 258 |               return arguments[offset + replacement]; | 
|---|
| 259 |             default: | 
|---|
| 260 |               return replacement; | 
|---|
| 261 |           } | 
|---|
| 262 |         } | 
|---|
| 263 |         offset = next; | 
|---|
| 264 |       } | 
|---|
| 265 |     }); | 
|---|
| 266 |   }, | 
|---|
| 267 |  | 
|---|
| 268 |   add: function(expression, replacement) { | 
|---|
| 269 |     if (expression instanceof RegExp) { | 
|---|
| 270 |       expression = expression.source; | 
|---|
| 271 |     } | 
|---|
| 272 |     if (!this[_HASH + expression]) this[_KEYS].push(String(expression)); | 
|---|
| 273 |     this[_HASH + expression] = new RegGrp.Item(expression, replacement); | 
|---|
| 274 |   }, | 
|---|
| 275 |  | 
|---|
| 276 |   merge: function(values) { | 
|---|
| 277 |     for (var i in values) this.add(i, values[i]); | 
|---|
| 278 |   }, | 
|---|
| 279 |  | 
|---|
| 280 |   toString: function() { | 
|---|
| 281 |     // back references not supported in simple RegGrp | 
|---|
| 282 |     return "(" + this[_KEYS].join(")|(") + ")"; | 
|---|
| 283 |   } | 
|---|
| 284 | }, { | 
|---|
| 285 |   IGNORE: "$0", | 
|---|
| 286 |  | 
|---|
| 287 |   Item: Base.extend({ | 
|---|
| 288 |     constructor: function(expression, replacement) { | 
|---|
| 289 |       expression = expression instanceof RegExp ? expression.source : String(expression); | 
|---|
| 290 |  | 
|---|
| 291 |       if (typeof replacement == "number") replacement = String(replacement); | 
|---|
| 292 |       else if (replacement == null) replacement = ""; | 
|---|
| 293 |  | 
|---|
| 294 |       // does the pattern use sub-expressions? | 
|---|
| 295 |       if (typeof replacement == "string" && /\$(\d+)/.test(replacement)) { | 
|---|
| 296 |         // a simple lookup? (e.g. "$2") | 
|---|
| 297 |         if (/^\$\d+$/.test(replacement)) { | 
|---|
| 298 |           // store the index (used for fast retrieval of matched strings) | 
|---|
| 299 |           replacement = parseInt(replacement.slice(1)); | 
|---|
| 300 |         } else { // a complicated lookup (e.g. "Hello $2 $1") | 
|---|
| 301 |           // build a function to do the lookup | 
|---|
| 302 |           var Q = /'/.test(replacement.replace(/\\./g, "")) ? '"' : "'"; | 
|---|
| 303 |           replacement = replacement.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\$(\d+)/g, Q + | 
|---|
| 304 |             "+(arguments[$1]||" + Q+Q + ")+" + Q); | 
|---|
| 305 |           replacement = new Function("return " + Q + replacement.replace(/(['"])\1\+(.*)\+\1\1$/, "$1") + Q); | 
|---|
| 306 |         } | 
|---|
| 307 |       } | 
|---|
| 308 |  | 
|---|
| 309 |       this.length = RegGrp.count(expression); | 
|---|
| 310 |       this.replacement = replacement; | 
|---|
| 311 |       this.toString = K(expression); | 
|---|
| 312 |     } | 
|---|
| 313 |   }), | 
|---|
| 314 |  | 
|---|
| 315 |   count: function(expression) { | 
|---|
| 316 |     // Count the number of sub-expressions in a RegExp/RegGrp.Item. | 
|---|
| 317 |     expression = String(expression).replace(_RG_ESCAPE_CHARS, "").replace(_RG_ESCAPE_BRACKETS, ""); | 
|---|
| 318 |     return match(expression, _RG_BRACKETS).length; | 
|---|
| 319 |   } | 
|---|
| 320 | }); | 
|---|
| 321 |  | 
|---|
| 322 | // ========================================================================= | 
|---|
| 323 | // lang/extend.js | 
|---|
| 324 | // ========================================================================= | 
|---|
| 325 |  | 
|---|
| 326 | function extend(object, source) { // or extend(object, key, value) | 
|---|
| 327 |   if (object && source) { | 
|---|
| 328 |     var proto = (typeof source == "function" ? Function : Object).prototype; | 
|---|
| 329 |     // Add constructor, toString etc | 
|---|
| 330 |     var i = _HIDDEN.length, key; | 
|---|
| 331 |     if (prototyping) while (key = _HIDDEN[--i]) { | 
|---|
| 332 |       var value = source[key]; | 
|---|
| 333 |       if (value != proto[key]) { | 
|---|
| 334 |         if (_BASE.test(value)) { | 
|---|
| 335 |           _override(object, key, value) | 
|---|
| 336 |         } else { | 
|---|
| 337 |           object[key] = value; | 
|---|
| 338 |         } | 
|---|
| 339 |       } | 
|---|
| 340 |     } | 
|---|
| 341 |     // Copy each of the source object's properties to the target object. | 
|---|
| 342 |     for (key in source) if (proto[key] === undefined) { | 
|---|
| 343 |       var value = source[key]; | 
|---|
| 344 |       // Check for method overriding. | 
|---|
| 345 |       if (object[key] && typeof value == "function" && _BASE.test(value)) { | 
|---|
| 346 |         _override(object, key, value); | 
|---|
| 347 |       } else { | 
|---|
| 348 |         object[key] = value; | 
|---|
| 349 |       } | 
|---|
| 350 |     } | 
|---|
| 351 |   } | 
|---|
| 352 |   return object; | 
|---|
| 353 | }; | 
|---|
| 354 |  | 
|---|
| 355 | function _override(object, name, method) { | 
|---|
| 356 |   // Override an existing method. | 
|---|
| 357 |   var ancestor = object[name]; | 
|---|
| 358 |   object[name] = function() { | 
|---|
| 359 |     var previous = this.base; | 
|---|
| 360 |     this.base = ancestor; | 
|---|
| 361 |     var returnValue = method.apply(this, arguments); | 
|---|
| 362 |     this.base = previous; | 
|---|
| 363 |     return returnValue; | 
|---|
| 364 |   }; | 
|---|
| 365 | }; | 
|---|
| 366 |  | 
|---|
| 367 | function combine(keys, values) { | 
|---|
| 368 |   // Combine two arrays to make a hash. | 
|---|
| 369 |   if (!values) values = keys; | 
|---|
| 370 |   var hash = {}; | 
|---|
| 371 |   for (var i in keys) hash[i] = values[i]; | 
|---|
| 372 |   return hash; | 
|---|
| 373 | }; | 
|---|
| 374 |  | 
|---|
| 375 | function format(string) { | 
|---|
| 376 |   // Replace %n with arguments[n]. | 
|---|
| 377 |   // e.g. format("%1 %2%3 %2a %1%3", "she", "se", "lls"); | 
|---|
| 378 |   // ==> "she sells sea shells" | 
|---|
| 379 |   // Only %1 - %9 supported. | 
|---|
| 380 |   var args = arguments; | 
|---|
| 381 |   var _FORMAT = new RegExp("%([1-" + arguments.length + "])", "g"); | 
|---|
| 382 |   return String(string).replace(_FORMAT, function(match, index) { | 
|---|
| 383 |     return index < args.length ? args[index] : match; | 
|---|
| 384 |   }); | 
|---|
| 385 | }; | 
|---|
| 386 |  | 
|---|
| 387 | function match(string, expression) { | 
|---|
| 388 |   // Same as String.match() except that this function will return an empty | 
|---|
| 389 |   // array if there is no match. | 
|---|
| 390 |   return String(string).match(expression) || []; | 
|---|
| 391 | }; | 
|---|
| 392 |  | 
|---|
| 393 | function rescape(string) { | 
|---|
| 394 |   // Make a string safe for creating a RegExp. | 
|---|
| 395 |   return String(string).replace(_RESCAPE, "\\$1"); | 
|---|
| 396 | }; | 
|---|
| 397 |  | 
|---|
| 398 | // http://blog.stevenlevithan.com/archives/faster-trim-javascript | 
|---|
| 399 | function trim(string) { | 
|---|
| 400 |   return String(string).replace(_LTRIM, "").replace(_RTRIM, ""); | 
|---|
| 401 | }; | 
|---|
| 402 |  | 
|---|
| 403 | function K(k) { | 
|---|
| 404 |   return function() { | 
|---|
| 405 |     return k; | 
|---|
| 406 |   }; | 
|---|
| 407 | }; | 
|---|
| 408 |  | 
|---|
| 409 | // ----------------------------------------------------------------------- | 
|---|
| 410 | // parsing | 
|---|
| 411 | // ----------------------------------------------------------------------- | 
|---|
| 412 |  | 
|---|
| 413 | var Parser = RegGrp.extend({ignoreCase: true}); | 
|---|
| 414 |  | 
|---|
| 415 | var ENCODED = /\x01(\d+)/g, | 
|---|
| 416 |     QUOTES  = /'/g,  | 
|---|
| 417 |     STRING = /^\x01/, | 
|---|
| 418 |     UNICODE = /\\([\da-fA-F]{1,4})/g; | 
|---|
| 419 |  | 
|---|
| 420 | var _strings = []; | 
|---|
| 421 |  | 
|---|
| 422 | var encoder = new Parser({ | 
|---|
| 423 |   // comments | 
|---|
| 424 |   "<!\\-\\-|\\-\\->": "", | 
|---|
| 425 |   "\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/": "", | 
|---|
| 426 |   // get rid | 
|---|
| 427 |   "@(namespace|import)[^;\\n]+[;\\n]": "", | 
|---|
| 428 |   // strings | 
|---|
| 429 |   "'(\\\\.|[^'\\\\])*'": encodeString, | 
|---|
| 430 |   '"(\\\\.|[^"\\\\])*"': encodeString, | 
|---|
| 431 |   // white space | 
|---|
| 432 |   "\\s+": " " | 
|---|
| 433 | }); | 
|---|
| 434 |  | 
|---|
| 435 | function encode(cssText) { | 
|---|
| 436 |   return encoder.exec(cssText); | 
|---|
| 437 | }; | 
|---|
| 438 |  | 
|---|
| 439 | function decode(cssText) { | 
|---|
| 440 |   return cssText.replace(ENCODED, function(match, index) { | 
|---|
| 441 |     return _strings[index - 1]; | 
|---|
| 442 |   }); | 
|---|
| 443 | }; | 
|---|
| 444 |  | 
|---|
| 445 | function encodeString(string) { | 
|---|
| 446 |   return "\x01" + _strings.push(string.replace(UNICODE, function(match, chr) { | 
|---|
| 447 |     return eval("'\\u" + "0000".slice(chr.length) + chr + "'"); | 
|---|
| 448 |   }).slice(1, -1).replace(QUOTES, "\\'")); | 
|---|
| 449 | }; | 
|---|
| 450 |  | 
|---|
| 451 | function getString(value) { | 
|---|
| 452 |   return STRING.test(value) ? _strings[value.slice(1) - 1] : value; | 
|---|
| 453 | }; | 
|---|
| 454 |  | 
|---|
| 455 | // clone a "width" function to create a "height" function | 
|---|
| 456 | var rotater = new RegGrp({ | 
|---|
| 457 |   Width: "Height", | 
|---|
| 458 |   width: "height", | 
|---|
| 459 |   Left:  "Top", | 
|---|
| 460 |   left:  "top", | 
|---|
| 461 |   Right: "Bottom", | 
|---|
| 462 |   right: "bottom", | 
|---|
| 463 |   onX:   "onY" | 
|---|
| 464 | }); | 
|---|
| 465 |  | 
|---|
| 466 | function rotate(fn) { | 
|---|
| 467 |   return rotater.exec(fn); | 
|---|
| 468 | }; | 
|---|
| 469 |  | 
|---|
| 470 | // ----------------------------------------------------------------------- | 
|---|
| 471 | // event handling | 
|---|
| 472 | // ----------------------------------------------------------------------- | 
|---|
| 473 |  | 
|---|
| 474 | var eventHandlers = []; | 
|---|
| 475 |  | 
|---|
| 476 | function addResize(handler) { | 
|---|
| 477 |   addRecalc(handler); | 
|---|
| 478 |   addEventHandler(window, "onresize", handler); | 
|---|
| 479 | }; | 
|---|
| 480 |  | 
|---|
| 481 | // add an event handler (function) to an element | 
|---|
| 482 | function addEventHandler(element, type, handler) { | 
|---|
| 483 |   element.attachEvent(type, handler); | 
|---|
| 484 |   // store the handler so it can be detached later | 
|---|
| 485 |   eventHandlers.push(arguments); | 
|---|
| 486 | }; | 
|---|
| 487 |  | 
|---|
| 488 | // remove an event handler assigned to an element by IE7 | 
|---|
| 489 | function removeEventHandler(element, type, handler) { | 
|---|
| 490 | try { | 
|---|
| 491 |   element.detachEvent(type, handler); | 
|---|
| 492 | } catch (ignore) { | 
|---|
| 493 |   // write a letter of complaint to microsoft.. | 
|---|
| 494 | }}; | 
|---|
| 495 |  | 
|---|
| 496 | // remove event handlers (they eat memory) | 
|---|
| 497 | addEventHandler(window, "onunload", function() { | 
|---|
| 498 |   var handler; | 
|---|
| 499 |   while (handler = eventHandlers.pop()) { | 
|---|
| 500 |     removeEventHandler(handler[0], handler[1], handler[2]); | 
|---|
| 501 |   } | 
|---|
| 502 | }); | 
|---|
| 503 |  | 
|---|
| 504 | function register(handler, element, condition) { // -@DRE | 
|---|
| 505 |   //var set = handler[element.uniqueID]; | 
|---|
| 506 |   if (!handler.elements) handler.elements = {}; | 
|---|
| 507 |   if (condition) handler.elements[element.uniqueID] = element; | 
|---|
| 508 |   else delete handler.elements[element.uniqueID]; | 
|---|
| 509 |   //return !set && condition; | 
|---|
| 510 |   return condition; | 
|---|
| 511 | }; | 
|---|
| 512 |  | 
|---|
| 513 | addEventHandler(window, "onbeforeprint", function() { | 
|---|
| 514 |   if (!IE7.CSS.print) new StyleSheet("print"); | 
|---|
| 515 |   IE7.CSS.print.recalc(); | 
|---|
| 516 | }); | 
|---|
| 517 |  | 
|---|
| 518 | // ----------------------------------------------------------------------- | 
|---|
| 519 | // pixel conversion | 
|---|
| 520 | // ----------------------------------------------------------------------- | 
|---|
| 521 |  | 
|---|
| 522 | // this is handy because it means that web developers can mix and match | 
|---|
| 523 | //  measurement units in their style sheets. it is not uncommon to | 
|---|
| 524 | //  express something like padding in "em" units whilst border thickness | 
|---|
| 525 | //  is most often expressed in pixels. | 
|---|
| 526 |  | 
|---|
| 527 | var PIXEL = /^\d+(px)?$/i; | 
|---|
| 528 | var PERCENT = /^\d+%$/; | 
|---|
| 529 | var getPixelValue = function(element, value) { | 
|---|
| 530 |   if (PIXEL.test(value)) return parseInt(value); | 
|---|
| 531 |   var style = element.style.left; | 
|---|
| 532 |   var runtimeStyle = element.runtimeStyle.left; | 
|---|
| 533 |   element.runtimeStyle.left = element.currentStyle.left; | 
|---|
| 534 |   element.style.left = value || 0; | 
|---|
| 535 |   value = element.style.pixelLeft; | 
|---|
| 536 |   element.style.left = style; | 
|---|
| 537 |   element.runtimeStyle.left = runtimeStyle; | 
|---|
| 538 |   return value; | 
|---|
| 539 | }; | 
|---|
| 540 |  | 
|---|
| 541 | // ----------------------------------------------------------------------- | 
|---|
| 542 | // generic | 
|---|
| 543 | // ----------------------------------------------------------------------- | 
|---|
| 544 |  | 
|---|
| 545 | var $IE7 = "ie7-"; | 
|---|
| 546 |  | 
|---|
| 547 | var Fix = Base.extend({ | 
|---|
| 548 |   constructor: function() { | 
|---|
| 549 |     this.fixes = []; | 
|---|
| 550 |     this.recalcs = []; | 
|---|
| 551 |   }, | 
|---|
| 552 |   init: Undefined | 
|---|
| 553 | }); | 
|---|
| 554 |  | 
|---|
| 555 | // a store for functions that will be called when refreshing IE7 | 
|---|
| 556 | var recalcs = []; | 
|---|
| 557 | function addRecalc(recalc) { | 
|---|
| 558 |   recalcs.push(recalc); | 
|---|
| 559 | }; | 
|---|
| 560 |  | 
|---|
| 561 | IE7.recalc = function() { | 
|---|
| 562 |   IE7.HTML.recalc(); | 
|---|
| 563 |   // re-apply style sheet rules (re-calculate ie7 classes) | 
|---|
| 564 |   IE7.CSS.recalc(); | 
|---|
| 565 |   // apply global fixes to the document | 
|---|
| 566 |   for (var i = 0; i < recalcs.length; i++) recalcs[i](); | 
|---|
| 567 | }; | 
|---|
| 568 |  | 
|---|
| 569 | function isFixed(element) { | 
|---|
| 570 |   return element.currentStyle["ie7-position"] == "fixed"; | 
|---|
| 571 | }; | 
|---|
| 572 |  | 
|---|
| 573 | // original style | 
|---|
| 574 | function getDefinedStyle(element, propertyName) { | 
|---|
| 575 |   return element.currentStyle[$IE7 + propertyName] || element.currentStyle[propertyName]; | 
|---|
| 576 | }; | 
|---|
| 577 |  | 
|---|
| 578 | function setOverrideStyle(element, propertyName, value) { | 
|---|
| 579 |   if (element.currentStyle[$IE7 + propertyName] == null) { | 
|---|
| 580 |     element.runtimeStyle[$IE7 + propertyName] = element.currentStyle[propertyName]; | 
|---|
| 581 |   } | 
|---|
| 582 |   element.runtimeStyle[propertyName] = value; | 
|---|
| 583 | }; | 
|---|
| 584 |  | 
|---|
| 585 | // create a temporary element which is used to inherit styles | 
|---|
| 586 | //  from the target element. the temporary element can be resized | 
|---|
| 587 | //  to determine pixel widths/heights | 
|---|
| 588 | function createTempElement(tagName) { | 
|---|
| 589 |   var element = document.createElement(tagName || "object"); | 
|---|
| 590 |   element.style.cssText = "position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999"; | 
|---|
| 591 |   element.ie7_anon = true; | 
|---|
| 592 |   return element; | 
|---|
| 593 | }; | 
|---|
| 594 |  | 
|---|
| 595 |  | 
|---|
| 596 | // ========================================================================= | 
|---|
| 597 | // ie7-cssQuery.js | 
|---|
| 598 | // ========================================================================= | 
|---|
| 599 |  | 
|---|
| 600 | function cssQuery(selector, context, single) { | 
|---|
| 601 |   if (!_cache[selector]) { | 
|---|
| 602 |     reg = []; // store for RegExp objects | 
|---|
| 603 |     var fn = ""; | 
|---|
| 604 |     var selectors = cssParser.escape(selector).split(","); | 
|---|
| 605 |     for (var i = 0; i < selectors.length; i++) { | 
|---|
| 606 |       _wild = _index = _list = 0; // reset | 
|---|
| 607 |       _duplicate = selectors.length > 1 ? 2 : 0; // reset | 
|---|
| 608 |       var block = cssParser.exec(selectors[i]) || "if(0){"; | 
|---|
| 609 |       if (_wild) { // IE's pesky comment nodes | 
|---|
| 610 |         block += format("if(e%1.nodeName!='!'){", _index); | 
|---|
| 611 |       } | 
|---|
| 612 |       // check for duplicates before storing results | 
|---|
| 613 |       var store = _duplicate > 1 ? _TEST : ""; | 
|---|
| 614 |       block += format(store + _STORE, _index); | 
|---|
| 615 |       // add closing braces | 
|---|
| 616 |       block += Array(match(block, /\{/g).length + 1).join("}"); | 
|---|
| 617 |       fn += block; | 
|---|
| 618 |     } | 
|---|
| 619 |     eval(format(_FN, reg) + cssParser.unescape(fn) + "return s?null:r}"); | 
|---|
| 620 |     _cache[selector] = _selectorFunction; | 
|---|
| 621 |   } | 
|---|
| 622 |   return _cache[selector](context || document, single); | 
|---|
| 623 | }; | 
|---|
| 624 |  | 
|---|
| 625 | var _MSIE5 = appVersion < 6; | 
|---|
| 626 |  | 
|---|
| 627 | var _EVALUATED = /^(href|src)$/; | 
|---|
| 628 | var _ATTRIBUTES = { | 
|---|
| 629 |   "class": "className", | 
|---|
| 630 |   "for": "htmlFor" | 
|---|
| 631 | }; | 
|---|
| 632 |  | 
|---|
| 633 | IE7._indexed = 1; | 
|---|
| 634 |  | 
|---|
| 635 | IE7._byId = function(document, id) { | 
|---|
| 636 |   var result = document.all[id] || null; | 
|---|
| 637 |   // returns a single element or a collection | 
|---|
| 638 |   if (!result || result.id == id) return result; | 
|---|
| 639 |   // document.all has returned a collection of elements with name/id | 
|---|
| 640 |   for (var i = 0; i < result.length; i++) { | 
|---|
| 641 |     if (result[i].id == id) return result[i]; | 
|---|
| 642 |   } | 
|---|
| 643 |   return null; | 
|---|
| 644 | }; | 
|---|
| 645 |  | 
|---|
| 646 | IE7._getAttribute = function(element, name) { | 
|---|
| 647 |   if (name == "src" && element.pngSrc) return element.pngSrc; | 
|---|
| 648 |    | 
|---|
| 649 |   var attribute = _MSIE5 ? (element.attributes[name] || element.attributes[_ATTRIBUTES[name.toLowerCase()]]) : element.getAttributeNode(name); | 
|---|
| 650 |   if (attribute && (attribute.specified || name == "value")) { | 
|---|
| 651 |     if (_EVALUATED.test(name)) { | 
|---|
| 652 |       return element.getAttribute(name, 2); | 
|---|
| 653 |     } else if (name == "class") { | 
|---|
| 654 |      return element.className.replace(/\sie7_\w+/g, ""); | 
|---|
| 655 |     } else if (name == "style") { | 
|---|
| 656 |      return element.style.cssText; | 
|---|
| 657 |     } else { | 
|---|
| 658 |      return attribute.nodeValue; | 
|---|
| 659 |     } | 
|---|
| 660 |   } | 
|---|
| 661 |   return null; | 
|---|
| 662 | }; | 
|---|
| 663 |  | 
|---|
| 664 | var names = "colSpan,rowSpan,vAlign,dateTime,accessKey,tabIndex,encType,maxLength,readOnly,longDesc"; | 
|---|
| 665 | // Convert the list of strings to a hash, mapping the lowercase name to the camelCase name. | 
|---|
| 666 | extend(_ATTRIBUTES, combine(names.toLowerCase().split(","), names.split(","))); | 
|---|
| 667 |  | 
|---|
| 668 | IE7._getNextElementSibling = function(node) { | 
|---|
| 669 |   // return the next element to the supplied element | 
|---|
| 670 |   //  nextSibling is not good enough as it might return a text or comment node | 
|---|
| 671 |   while (node && (node = node.nextSibling) && (node.nodeType != 1 || node.nodeName == "!")) continue; | 
|---|
| 672 |   return node; | 
|---|
| 673 | }; | 
|---|
| 674 |  | 
|---|
| 675 | IE7._getPreviousElementSibling = function(node) { | 
|---|
| 676 |   // return the previous element to the supplied element | 
|---|
| 677 |   while (node && (node = node.previousSibling) && (node.nodeType != 1 || node.nodeName == "!")) continue; | 
|---|
| 678 |   return node; | 
|---|
| 679 | }; | 
|---|
| 680 |  | 
|---|
| 681 | // ========================================================================= | 
|---|
| 682 | // CSSParser | 
|---|
| 683 | // ========================================================================= | 
|---|
| 684 |  | 
|---|
| 685 | var IMPLIED_ASTERISK = /([\s>+~,]|[^(]\+|^)([#.:\[])/g, | 
|---|
| 686 |     IMPLIED_SPACE =    /(^|,)([^\s>+~])/g, | 
|---|
| 687 |     WHITESPACE =       /\s*([\s>+~(),]|^|$)\s*/g, | 
|---|
| 688 |     WILD_CARD =        /\s\*\s/g;; | 
|---|
| 689 |  | 
|---|
| 690 | var CSSParser = RegGrp.extend({ | 
|---|
| 691 |   constructor: function(items) { | 
|---|
| 692 |     this.base(items); | 
|---|
| 693 |     this.sorter = new RegGrp; | 
|---|
| 694 |     this.sorter.add(/:not\([^)]*\)/, RegGrp.IGNORE); | 
|---|
| 695 |     this.sorter.add(/([ >](\*|[\w-]+))([^: >+~]*)(:\w+-child(\([^)]+\))?)([^: >+~]*)/, "$1$3$6$4"); | 
|---|
| 696 |   }, | 
|---|
| 697 |    | 
|---|
| 698 |   ignoreCase: true, | 
|---|
| 699 |  | 
|---|
| 700 |   escape: function(selector) { | 
|---|
| 701 |     return this.optimise(this.format(selector)); | 
|---|
| 702 |   }, | 
|---|
| 703 |  | 
|---|
| 704 |   format: function(selector) { | 
|---|
| 705 |     return selector | 
|---|
| 706 |       .replace(WHITESPACE, "$1") | 
|---|
| 707 |       .replace(IMPLIED_SPACE, "$1 $2") | 
|---|
| 708 |       .replace(IMPLIED_ASTERISK, "$1*$2"); | 
|---|
| 709 |   }, | 
|---|
| 710 |  | 
|---|
| 711 |   optimise: function(selector) { | 
|---|
| 712 |     // optimise wild card descendant selectors | 
|---|
| 713 |     return this.sorter.exec(selector.replace(WILD_CARD, ">* ")); | 
|---|
| 714 |   }, | 
|---|
| 715 |  | 
|---|
| 716 |   unescape: function(selector) { | 
|---|
| 717 |     return decode(selector); | 
|---|
| 718 |   } | 
|---|
| 719 | }); | 
|---|
| 720 |  | 
|---|
| 721 | // some constants | 
|---|
| 722 | var _OPERATORS = { | 
|---|
| 723 |   "":   "%1!=null", | 
|---|
| 724 |   "=":  "%1=='%2'", | 
|---|
| 725 |   "~=": /(^| )%1( |$)/, | 
|---|
| 726 |   "|=": /^%1(-|$)/, | 
|---|
| 727 |   "^=": /^%1/, | 
|---|
| 728 |   "$=": /%1$/, | 
|---|
| 729 |   "*=": /%1/ | 
|---|
| 730 | }; | 
|---|
| 731 |  | 
|---|
| 732 | var _PSEUDO_CLASSES = { | 
|---|
| 733 |   "first-child": "!IE7._getPreviousElementSibling(e%1)", | 
|---|
| 734 |   "link":        "e%1.currentStyle['ie7-link']=='link'", | 
|---|
| 735 |   "visited":     "e%1.currentStyle['ie7-link']=='visited'" | 
|---|
| 736 | }; | 
|---|
| 737 |  | 
|---|
| 738 | var _VAR = "var p%2=0,i%2,e%2,n%2=e%1."; | 
|---|
| 739 | var _ID = "e%1.sourceIndex"; | 
|---|
| 740 | var _TEST = "var g=" + _ID + ";if(!p[g]){p[g]=1;"; | 
|---|
| 741 | var _STORE = "r[r.length]=e%1;if(s)return e%1;"; | 
|---|
| 742 | var _FN = "var _selectorFunction=function(e0,s){IE7._indexed++;var r=[],p={},reg=[%1],d=document;"; | 
|---|
| 743 | var reg; // a store for RexExp objects | 
|---|
| 744 | var _index; | 
|---|
| 745 | var _wild; // need to flag certain _wild card selectors as MSIE includes comment nodes | 
|---|
| 746 | var _list; // are we processing a node _list? | 
|---|
| 747 | var _duplicate; // possible duplicates? | 
|---|
| 748 | var _cache = {}; // store parsed selectors | 
|---|
| 749 |  | 
|---|
| 750 | // a hideous parser | 
|---|
| 751 | var cssParser = new CSSParser({ | 
|---|
| 752 |   " (\\*|[\\w-]+)#([\\w-]+)": function(match, tagName, id) { // descendant selector followed by ID | 
|---|
| 753 |     _wild = false; | 
|---|
| 754 |     var replacement = "var e%2=IE7._byId(d,'%4');if(e%2&&"; | 
|---|
| 755 |     if (tagName != "*") replacement += "e%2.nodeName=='%3'&&"; | 
|---|
| 756 |     replacement += "(e%1==d||e%1.contains(e%2))){"; | 
|---|
| 757 |     if (_list) replacement += format("i%1=n%1.length;", _list); | 
|---|
| 758 |     return format(replacement, _index++, _index, tagName.toUpperCase(), id); | 
|---|
| 759 |   }, | 
|---|
| 760 |    | 
|---|
| 761 |   " (\\*|[\\w-]+)": function(match, tagName) { // descendant selector | 
|---|
| 762 |     _duplicate++; // this selector may produce duplicates | 
|---|
| 763 |     _wild = tagName == "*"; | 
|---|
| 764 |     var replacement = _VAR; | 
|---|
| 765 |     // IE5.x does not support getElementsByTagName("*"); | 
|---|
| 766 |     replacement += (_wild && _MSIE5) ? "all" : "getElementsByTagName('%3')"; | 
|---|
| 767 |     replacement += ";for(i%2=0;(e%2=n%2[i%2]);i%2++){"; | 
|---|
| 768 |     return format(replacement, _index++, _list = _index, tagName.toUpperCase()); | 
|---|
| 769 |   }, | 
|---|
| 770 |    | 
|---|
| 771 |   ">(\\*|[\\w-]+)": function(match, tagName) { // child selector | 
|---|
| 772 |     var children = _list; | 
|---|
| 773 |     _wild = tagName == "*"; | 
|---|
| 774 |     var replacement = _VAR; | 
|---|
| 775 |     // use the children property for MSIE as it does not contain text nodes | 
|---|
| 776 |     //  (but the children collection still includes comments). | 
|---|
| 777 |     // the document object does not have a children collection | 
|---|
| 778 |     replacement += children ? "children": "childNodes"; | 
|---|
| 779 |     if (!_wild && children) replacement += ".tags('%3')"; | 
|---|
| 780 |     replacement += ";for(i%2=0;(e%2=n%2[i%2]);i%2++){"; | 
|---|
| 781 |     if (_wild) { | 
|---|
| 782 |       replacement += "if(e%2.nodeType==1){"; | 
|---|
| 783 |       _wild = _MSIE5; | 
|---|
| 784 |     } else { | 
|---|
| 785 |       if (!children) replacement += "if(e%2.nodeName=='%3'){"; | 
|---|
| 786 |     } | 
|---|
| 787 |     return format(replacement, _index++, _list = _index, tagName.toUpperCase()); | 
|---|
| 788 |   }, | 
|---|
| 789 |    | 
|---|
| 790 |   "\\+(\\*|[\\w-]+)": function(match, tagName) { // direct adjacent selector | 
|---|
| 791 |     var replacement = ""; | 
|---|
| 792 |     if (_wild) replacement += "if(e%1.nodeName!='!'){"; | 
|---|
| 793 |     _wild = false; | 
|---|
| 794 |     replacement += "e%1=IE7._getNextElementSibling(e%1);if(e%1"; | 
|---|
| 795 |     if (tagName != "*") replacement += "&&e%1.nodeName=='%2'"; | 
|---|
| 796 |     replacement += "){"; | 
|---|
| 797 |     return format(replacement, _index, tagName.toUpperCase()); | 
|---|
| 798 |   }, | 
|---|
| 799 |    | 
|---|
| 800 |   "~(\\*|[\\w-]+)": function(match, tagName) { // indirect adjacent selector | 
|---|
| 801 |     var replacement = ""; | 
|---|
| 802 |     if (_wild) replacement += "if(e%1.nodeName!='!'){"; | 
|---|
| 803 |     _wild = false; | 
|---|
| 804 |     _duplicate = 2; // this selector may produce duplicates | 
|---|
| 805 |     replacement += "while(e%1=e%1.nextSibling){if(e%1.ie7_adjacent==IE7._indexed)break;if("; | 
|---|
| 806 |     if (tagName == "*") { | 
|---|
| 807 |       replacement += "e%1.nodeType==1"; | 
|---|
| 808 |       if (_MSIE5) replacement += "&&e%1.nodeName!='!'"; | 
|---|
| 809 |     } else replacement += "e%1.nodeName=='%2'"; | 
|---|
| 810 |     replacement += "){e%1.ie7_adjacent=IE7._indexed;"; | 
|---|
| 811 |     return format(replacement, _index, tagName.toUpperCase()); | 
|---|
| 812 |   }, | 
|---|
| 813 |    | 
|---|
| 814 |   "#([\\w-]+)": function(match, id) { // ID selector | 
|---|
| 815 |     _wild = false; | 
|---|
| 816 |     var replacement = "if(e%1.id=='%2'){"; | 
|---|
| 817 |     if (_list) replacement += format("i%1=n%1.length;", _list); | 
|---|
| 818 |     return format(replacement, _index, id); | 
|---|
| 819 |   }, | 
|---|
| 820 |    | 
|---|
| 821 |   "\\.([\\w-]+)": function(match, className) { // class selector | 
|---|
| 822 |     _wild = false; | 
|---|
| 823 |     // store RegExp objects - slightly faster on IE | 
|---|
| 824 |     reg.push(new RegExp("(^|\\s)" + rescape(className) + "(\\s|$)")); | 
|---|
| 825 |     return format("if(e%1.className&®[%2].test(e%1.className)){", _index, reg.length - 1); | 
|---|
| 826 |   }, | 
|---|
| 827 |    | 
|---|
| 828 |   "\\[([\\w-]+)\\s*([^=]?=)?\\s*([^\\]]*)\\]": function(match, attr, operator, value) { // attribute selectors | 
|---|
| 829 |     var alias = _ATTRIBUTES[attr] || attr; | 
|---|
| 830 |     if (operator) { | 
|---|
| 831 |       var getAttribute = "e%1.getAttribute('%2',2)"; | 
|---|
| 832 |       if (!_EVALUATED.test(attr)) { | 
|---|
| 833 |         getAttribute = "e%1.%3||" + getAttribute; | 
|---|
| 834 |       } | 
|---|
| 835 |       attr = format("(" + getAttribute + ")", _index, attr, alias); | 
|---|
| 836 |     } else { | 
|---|
| 837 |       attr = format("IE7._getAttribute(e%1,'%2')", _index, attr); | 
|---|
| 838 |     } | 
|---|
| 839 |     var replacement = _OPERATORS[operator || ""] || "0"; | 
|---|
| 840 |     if (replacement && replacement.source) { | 
|---|
| 841 |       reg.push(new RegExp(format(replacement.source, rescape(cssParser.unescape(value))))); | 
|---|
| 842 |       replacement = "reg[%2].test(%1)"; | 
|---|
| 843 |       value = reg.length - 1; | 
|---|
| 844 |     } | 
|---|
| 845 |     return "if(" + format(replacement, attr, value) + "){"; | 
|---|
| 846 |   }, | 
|---|
| 847 |    | 
|---|
| 848 |   ":+([\\w-]+)(\\(([^)]+)\\))?": function(match, pseudoClass, $2, args) { // pseudo class selectors | 
|---|
| 849 |     pseudoClass = _PSEUDO_CLASSES[pseudoClass]; | 
|---|
| 850 |     return "if(" + (pseudoClass ? format(pseudoClass, _index, args || "")  : "0") + "){"; | 
|---|
| 851 |   } | 
|---|
| 852 | }); | 
|---|
| 853 |  | 
|---|
| 854 | // ========================================================================= | 
|---|
| 855 | // ie7-css.js | 
|---|
| 856 | // ========================================================================= | 
|---|
| 857 |  | 
|---|
| 858 | var HYPERLINK = /a(#[\w-]+)?(\.[\w-]+)?:(hover|active)/i; | 
|---|
| 859 | var BRACE1 = /\s*\{\s*/, BRACE2 = /\s*\}\s*/, COMMA = /\s*\,\s*/; | 
|---|
| 860 | var FIRST_LINE_LETTER = /(.*)(:first-(line|letter))/; | 
|---|
| 861 |  | 
|---|
| 862 | //var UNKNOWN = /UNKNOWN|([:.])\w+\1/i; | 
|---|
| 863 |  | 
|---|
| 864 | var styleSheets = document.styleSheets; | 
|---|
| 865 |  | 
|---|
| 866 | IE7.CSS = new (Fix.extend({ // single instance | 
|---|
| 867 |   parser: new Parser, | 
|---|
| 868 |   screen: "", | 
|---|
| 869 |   print: "", | 
|---|
| 870 |   styles: [], | 
|---|
| 871 |   rules: [], | 
|---|
| 872 |   pseudoClasses: appVersion < 7 ? "first\\-child" : "", | 
|---|
| 873 |   dynamicPseudoClasses: { | 
|---|
| 874 |     toString: function() { | 
|---|
| 875 |       var strings = []; | 
|---|
| 876 |       for (var pseudoClass in this) strings.push(pseudoClass); | 
|---|
| 877 |       return strings.join("|"); | 
|---|
| 878 |     } | 
|---|
| 879 |   }, | 
|---|
| 880 |    | 
|---|
| 881 |   init: function() { | 
|---|
| 882 |     var NONE = "^\x01$"; | 
|---|
| 883 |     var CLASS = "\\[class=?[^\\]]*\\]"; | 
|---|
| 884 |     var pseudoClasses = []; | 
|---|
| 885 |     if (this.pseudoClasses) pseudoClasses.push(this.pseudoClasses); | 
|---|
| 886 |     var dynamicPseudoClasses = this.dynamicPseudoClasses.toString();  | 
|---|
| 887 |     if (dynamicPseudoClasses) pseudoClasses.push(dynamicPseudoClasses); | 
|---|
| 888 |     pseudoClasses = pseudoClasses.join("|"); | 
|---|
| 889 |     var unknown = appVersion < 7 ? ["[>+~[(]|([:.])\\w+\\1"] : [CLASS]; | 
|---|
| 890 |     if (pseudoClasses) unknown.push(":(" + pseudoClasses + ")"); | 
|---|
| 891 |     this.UNKNOWN = new RegExp(unknown.join("|") || NONE, "i"); | 
|---|
| 892 |     var complex = appVersion < 7 ? ["\\[[^\\]]+\\]|[^\\s(\\[]+\\s*[+~]"] : [CLASS]; | 
|---|
| 893 |     var complexRule = complex.concat(); | 
|---|
| 894 |     if (pseudoClasses) complexRule.push(":(" + pseudoClasses + ")"); | 
|---|
| 895 |     Rule.COMPLEX = new RegExp(complexRule.join("|") || NONE, "ig"); | 
|---|
| 896 |     if (this.pseudoClasses) complex.push(":(" + this.pseudoClasses + ")"); | 
|---|
| 897 |     DynamicRule.COMPLEX = new RegExp(complex.join("|") || NONE, "i"); | 
|---|
| 898 |     DynamicRule.MATCH = new RegExp(dynamicPseudoClasses ? "(.*):(" + dynamicPseudoClasses + ")(.*)" : NONE, "i"); | 
|---|
| 899 |      | 
|---|
| 900 |     this.createStyleSheet(); | 
|---|
| 901 |     this.refresh(); | 
|---|
| 902 |   }, | 
|---|
| 903 |    | 
|---|
| 904 |      addEventHandler: function() { | 
|---|
| 905 |           addEventHandler.apply(null, arguments); | 
|---|
| 906 |      }, | 
|---|
| 907 |    | 
|---|
| 908 |   addFix: function(expression, replacement) { | 
|---|
| 909 |     this.parser.add(expression, replacement); | 
|---|
| 910 |   }, | 
|---|
| 911 |    | 
|---|
| 912 |   addRecalc: function(propertyName, test, handler, replacement) { | 
|---|
| 913 |     // recalcs occur whenever the document is refreshed using document.recalc() | 
|---|
| 914 |     test = new RegExp("([{;\\s])" + propertyName + "\\s*:\\s*" + test + "[^;}]*"); | 
|---|
| 915 |     var id = this.recalcs.length; | 
|---|
| 916 |     if (replacement) replacement = propertyName + ":" + replacement; | 
|---|
| 917 |     this.addFix(test, function(match, $1) { | 
|---|
| 918 |       return (replacement ? $1 + replacement : match) + ";ie7-" + match.slice(1) + ";ie7_recalc" + id + ":1"; | 
|---|
| 919 |     }); | 
|---|
| 920 |     this.recalcs.push(arguments); | 
|---|
| 921 |     return id; | 
|---|
| 922 |   }, | 
|---|
| 923 |    | 
|---|
| 924 |   apply: function() { | 
|---|
| 925 |     this.getInlineStyles(); | 
|---|
| 926 |     new StyleSheet("screen"); | 
|---|
| 927 |     this.trash(); | 
|---|
| 928 |   }, | 
|---|
| 929 |    | 
|---|
| 930 |   createStyleSheet: function() { | 
|---|
| 931 |     // create the IE7 style sheet | 
|---|
| 932 |     this.styleSheet = document.createStyleSheet(); | 
|---|
| 933 |     // flag it so we can ignore it during parsing | 
|---|
| 934 |     this.styleSheet.ie7 = true; | 
|---|
| 935 |     this.styleSheet.owningElement.ie7 = true; | 
|---|
| 936 |     this.styleSheet.cssText = HEADER; | 
|---|
| 937 |   }, | 
|---|
| 938 |    | 
|---|
| 939 |   getInlineStyles: function() { | 
|---|
| 940 |     // load inline styles | 
|---|
| 941 |     var styleSheets = document.getElementsByTagName("style"), styleSheet; | 
|---|
| 942 |     for (var i = styleSheets.length - 1; (styleSheet = styleSheets[i]); i--) { | 
|---|
| 943 |       if (!styleSheet.disabled && !styleSheet.ie7) { | 
|---|
| 944 |         this.styles.push(styleSheet.innerHTML); | 
|---|
| 945 |       } | 
|---|
| 946 |     } | 
|---|
| 947 |   }, | 
|---|
| 948 |    | 
|---|
| 949 |   getText: function(styleSheet, path) { | 
|---|
| 950 |     // explorer will trash unknown selectors (it converts them to "UNKNOWN"). | 
|---|
| 951 |     // so we must reload external style sheets (internal style sheets can have their text | 
|---|
| 952 |     //  extracted through the innerHTML property). | 
|---|
| 953 |       // load the style sheet text from an external file | 
|---|
| 954 |     try { | 
|---|
| 955 |       var cssText = styleSheet.cssText; | 
|---|
| 956 |     } catch (e) { | 
|---|
| 957 |       cssText = ""; | 
|---|
| 958 |     } | 
|---|
| 959 |     if (httpRequest) cssText = loadFile(styleSheet.href, path) || cssText; | 
|---|
| 960 |     return cssText; | 
|---|
| 961 |   }, | 
|---|
| 962 |    | 
|---|
| 963 |   recalc: function() { | 
|---|
| 964 |     this.screen.recalc(); | 
|---|
| 965 |     // we're going to read through all style rules. | 
|---|
| 966 |     //  certain rules have had ie7 properties added to them. | 
|---|
| 967 |     //   e.g. p{top:0; ie7_recalc2:1; left:0} | 
|---|
| 968 |     //  this flags a property in the rule as needing a fix. | 
|---|
| 969 |     //  the selector text is then used to query the document. | 
|---|
| 970 |     //  we can then loop through the results of the query | 
|---|
| 971 |     //  and fix the elements. | 
|---|
| 972 |     // we ignore the IE7 rules - so count them in the header | 
|---|
| 973 |     var RECALCS = /ie7_recalc\d+/g; | 
|---|
| 974 |     var start = HEADER.match(/[{,]/g).length; | 
|---|
| 975 |     // only calculate screen fixes. print fixes don't show up anyway | 
|---|
| 976 |     var stop = start + (this.screen.cssText.match(/\{/g)||"").length; | 
|---|
| 977 |     var rules = this.styleSheet.rules, rule; | 
|---|
| 978 |     var calcs, calc, elements, element, i, j, k, id; | 
|---|
| 979 |     // loop through all rules | 
|---|
| 980 |     for (i = start; i < stop; i++) { | 
|---|
| 981 |       rule = rules[i]; | 
|---|
| 982 |       var cssText = rule.style.cssText; | 
|---|
| 983 |       // search for the "ie7_recalc" flag (there may be more than one) | 
|---|
| 984 |       if (rule && (calcs = cssText.match(RECALCS))) { | 
|---|
| 985 |         // use the selector text to query the document | 
|---|
| 986 |         elements = cssQuery(rule.selectorText); | 
|---|
| 987 |         // if there are matching elements then loop | 
|---|
| 988 |         //  through the recalc functions and apply them | 
|---|
| 989 |         //  to each element | 
|---|
| 990 |         if (elements.length) for (j = 0; j < calcs.length; j++) { | 
|---|
| 991 |           // get the matching flag (e.g. ie7_recalc3) | 
|---|
| 992 |           id = calcs[j]; | 
|---|
| 993 |           // extract the numeric id from the end of the flag | 
|---|
| 994 |           //  and use it to index the collection of recalc | 
|---|
| 995 |           //  functions | 
|---|
| 996 |           calc = IE7.CSS.recalcs[id.slice(10)][2]; | 
|---|
| 997 |           for (k = 0; (element = elements[k]); k++) { | 
|---|
| 998 |             // apply the fix | 
|---|
| 999 |             if (element.currentStyle[id]) calc(element, cssText); | 
|---|
| 1000 |           } | 
|---|
| 1001 |         } | 
|---|
| 1002 |       } | 
|---|
| 1003 |     } | 
|---|
| 1004 |   }, | 
|---|
| 1005 |    | 
|---|
| 1006 |   refresh: function() { | 
|---|
| 1007 |     this.styleSheet.cssText = HEADER + this.screen + this.print; | 
|---|
| 1008 |   }, | 
|---|
| 1009 |    | 
|---|
| 1010 |   trash: function() { | 
|---|
| 1011 |     // trash the old style sheets | 
|---|
| 1012 |     for (var i = 0; i < styleSheets.length; i++) { | 
|---|
| 1013 |       if (!styleSheets[i].ie7) { | 
|---|
| 1014 |         try { | 
|---|
| 1015 |           var cssText = styleSheets[i].cssText; | 
|---|
| 1016 |         } catch (e) { | 
|---|
| 1017 |           cssText = ""; | 
|---|
| 1018 |         } | 
|---|
| 1019 |         if (cssText) styleSheets[i].cssText = ""; | 
|---|
| 1020 |       } | 
|---|
| 1021 |     } | 
|---|
| 1022 |   } | 
|---|
| 1023 | })); | 
|---|
| 1024 |  | 
|---|
| 1025 | // ----------------------------------------------------------------------- | 
|---|
| 1026 | //  IE7 StyleSheet class | 
|---|
| 1027 | // ----------------------------------------------------------------------- | 
|---|
| 1028 |  | 
|---|
| 1029 | var StyleSheet = Base.extend({ | 
|---|
| 1030 |   constructor: function(media) { | 
|---|
| 1031 |     this.media = media; | 
|---|
| 1032 |     this.load(); | 
|---|
| 1033 |     IE7.CSS[media] = this; | 
|---|
| 1034 |     IE7.CSS.refresh(); | 
|---|
| 1035 |   }, | 
|---|
| 1036 |    | 
|---|
| 1037 |   createRule: function(selector, cssText) { | 
|---|
| 1038 |     if (IE7.CSS.UNKNOWN.test(selector)) { | 
|---|
| 1039 |       var match; | 
|---|
| 1040 |       if (PseudoElement && (match = selector.match(PseudoElement.MATCH))) { | 
|---|
| 1041 |         return new PseudoElement(match[1], match[2], cssText); | 
|---|
| 1042 |       } else if (match = selector.match(DynamicRule.MATCH)) { | 
|---|
| 1043 |         if (!HYPERLINK.test(match[0]) || DynamicRule.COMPLEX.test(match[0])) { | 
|---|
| 1044 |           return new DynamicRule(selector, match[1], match[2], match[3], cssText); | 
|---|
| 1045 |         } | 
|---|
| 1046 |       } else return new Rule(selector, cssText); | 
|---|
| 1047 |     } | 
|---|
| 1048 |     return selector + " {" + cssText + "}"; | 
|---|
| 1049 |   }, | 
|---|
| 1050 |    | 
|---|
| 1051 |   getText: function() { | 
|---|
| 1052 |     // store for style sheet text | 
|---|
| 1053 |     var _inlineStyles = [].concat(IE7.CSS.styles); | 
|---|
| 1054 |     // parse media decalarations | 
|---|
| 1055 |     var MEDIA = /@media\s+([^{]*)\{([^@]+\})\s*\}/gi; | 
|---|
| 1056 |     var ALL = /\ball\b|^$/i, SCREEN = /\bscreen\b/i, PRINT = /\bprint\b/i; | 
|---|
| 1057 |     function _parseMedia(cssText, media) { | 
|---|
| 1058 |       _filterMedia.value = media; | 
|---|
| 1059 |       return cssText.replace(MEDIA, _filterMedia); | 
|---|
| 1060 |     }; | 
|---|
| 1061 |     function _filterMedia(match, media, cssText) { | 
|---|
| 1062 |       media = _simpleMedia(media); | 
|---|
| 1063 |       switch (media) { | 
|---|
| 1064 |         case "screen": | 
|---|
| 1065 |         case "print": | 
|---|
| 1066 |           if (media != _filterMedia.value) return ""; | 
|---|
| 1067 |         case "all": | 
|---|
| 1068 |           return cssText; | 
|---|
| 1069 |       } | 
|---|
| 1070 |       return ""; | 
|---|
| 1071 |     }; | 
|---|
| 1072 |     function _simpleMedia(media) { | 
|---|
| 1073 |       if (ALL.test(media)) return "all"; | 
|---|
| 1074 |       else if (SCREEN.test(media)) return (PRINT.test(media)) ? "all" : "screen"; | 
|---|
| 1075 |       else if (PRINT.test(media)) return "print"; | 
|---|
| 1076 |     }; | 
|---|
| 1077 |     var self = this; | 
|---|
| 1078 |     function _getCSSText(styleSheet, path, media, level) { | 
|---|
| 1079 |       var cssText = ""; | 
|---|
| 1080 |       if (!level) { | 
|---|
| 1081 |         media = _simpleMedia(styleSheet.media); | 
|---|
| 1082 |         level = 0; | 
|---|
| 1083 |       } | 
|---|
| 1084 |       if (media == "all" || media == self.media) { | 
|---|
| 1085 |         // IE only allows importing style sheets three levels deep. | 
|---|
| 1086 |         // it will crash if you try to access a level below this | 
|---|
| 1087 |         if (level < 3) { | 
|---|
| 1088 |           // loop through imported style sheets | 
|---|
| 1089 |           for (var i = 0; i < styleSheet.imports.length; i++) { | 
|---|
| 1090 |             // call this function recursively to get all imported style sheets | 
|---|
| 1091 |             cssText += _getCSSText(styleSheet.imports[i], getPath(styleSheet.href, path), media, level + 1); | 
|---|
| 1092 |           } | 
|---|
| 1093 |         } | 
|---|
| 1094 |         // retrieve inline style or load an external style sheet | 
|---|
| 1095 |         cssText += encode(styleSheet.href ? _loadStyleSheet(styleSheet, path) : _inlineStyles.pop() || ""); | 
|---|
| 1096 |         cssText = _parseMedia(cssText, self.media); | 
|---|
| 1097 |       } | 
|---|
| 1098 |       return cssText; | 
|---|
| 1099 |     }; | 
|---|
| 1100 |     // store loaded cssText URLs | 
|---|
| 1101 |     var fileCache = {}; | 
|---|
| 1102 |     // load an external style sheet | 
|---|
| 1103 |     function _loadStyleSheet(styleSheet, path) { | 
|---|
| 1104 |       var url = makePath(styleSheet.href, path); | 
|---|
| 1105 |       // if the style sheet has already loaded then don't duplicate it | 
|---|
| 1106 |       if (fileCache[url]) return ""; | 
|---|
| 1107 |       // load from source | 
|---|
| 1108 |       fileCache[url] = (styleSheet.disabled) ? "" : | 
|---|
| 1109 |         _fixUrls(IE7.CSS.getText(styleSheet, path), getPath(styleSheet.href, path)); | 
|---|
| 1110 |       return fileCache[url]; | 
|---|
| 1111 |     }; | 
|---|
| 1112 |     // fix css paths | 
|---|
| 1113 |     // we're lumping all css text into one big style sheet so relative | 
|---|
| 1114 |     //  paths have to be fixed. this is necessary anyway because of other | 
|---|
| 1115 |     //  explorer bugs. | 
|---|
| 1116 |     var URL = /(url\s*\(\s*['"]?)([\w\.]+[^:\)]*['"]?\))/gi; | 
|---|
| 1117 |     function _fixUrls(cssText, pathname) { | 
|---|
| 1118 |       // hack & slash | 
|---|
| 1119 |       return cssText.replace(URL, "$1" + pathname.slice(0, pathname.lastIndexOf("/") + 1) + "$2"); | 
|---|
| 1120 |     }; | 
|---|
| 1121 |  | 
|---|
| 1122 |     // load all style sheets in the document | 
|---|
| 1123 |     for (var i = 0; i < styleSheets.length; i++) { | 
|---|
| 1124 |       if (!styleSheets[i].disabled && !styleSheets[i].ie7) { | 
|---|
| 1125 |         this.cssText += _getCSSText(styleSheets[i]); | 
|---|
| 1126 |       } | 
|---|
| 1127 |     } | 
|---|
| 1128 |   }, | 
|---|
| 1129 |    | 
|---|
| 1130 |   load: function() { | 
|---|
| 1131 |     this.cssText = ""; | 
|---|
| 1132 |     this.getText(); | 
|---|
| 1133 |     this.parse(); | 
|---|
| 1134 |     this.cssText = decode(this.cssText); | 
|---|
| 1135 |     fileCache = {}; | 
|---|
| 1136 |   }, | 
|---|
| 1137 |    | 
|---|
| 1138 |   parse: function() { | 
|---|
| 1139 |     this.cssText = IE7.CSS.parser.exec(this.cssText); | 
|---|
| 1140 |      | 
|---|
| 1141 |     // parse the style sheet | 
|---|
| 1142 |     var offset = IE7.CSS.rules.length; | 
|---|
| 1143 |     var rules = this.cssText.split(BRACE2), rule; | 
|---|
| 1144 |     var selectors, cssText, i, j; | 
|---|
| 1145 |     for (i = 0; i < rules.length; i++) { | 
|---|
| 1146 |       rule = rules[i].split(BRACE1); | 
|---|
| 1147 |       selectors = rule[0].split(COMMA); | 
|---|
| 1148 |       cssText = rule[1]; | 
|---|
| 1149 |       for (j = 0; j < selectors.length; j++) { | 
|---|
| 1150 |         selectors[j] = cssText ? this.createRule(selectors[j], cssText) : ""; | 
|---|
| 1151 |       } | 
|---|
| 1152 |       rules[i] = selectors.join("\n"); | 
|---|
| 1153 |     } | 
|---|
| 1154 |     this.cssText = rules.join("\n"); | 
|---|
| 1155 |     this.rules = IE7.CSS.rules.slice(offset); | 
|---|
| 1156 |   }, | 
|---|
| 1157 |    | 
|---|
| 1158 |   recalc: function() { | 
|---|
| 1159 |     var rule, i; | 
|---|
| 1160 |     for (i = 0; (rule = this.rules[i]); i++) rule.recalc(); | 
|---|
| 1161 |   }, | 
|---|
| 1162 |    | 
|---|
| 1163 |   toString: function() { | 
|---|
| 1164 |     return "@media " + this.media + "{" + this.cssText + "}"; | 
|---|
| 1165 |   } | 
|---|
| 1166 | }); | 
|---|
| 1167 |  | 
|---|
| 1168 | var PseudoElement; | 
|---|
| 1169 |  | 
|---|
| 1170 | // ----------------------------------------------------------------------- | 
|---|
| 1171 | // IE7 style rules | 
|---|
| 1172 | // ----------------------------------------------------------------------- | 
|---|
| 1173 |  | 
|---|
| 1174 | var Rule = IE7.Rule = Base.extend({ | 
|---|
| 1175 |   // properties | 
|---|
| 1176 |   constructor: function(selector, cssText) { | 
|---|
| 1177 |     this.id = IE7.CSS.rules.length; | 
|---|
| 1178 |     this.className = Rule.PREFIX + this.id; | 
|---|
| 1179 |     selector = selector.match(FIRST_LINE_LETTER) || selector || "*"; | 
|---|
| 1180 |     this.selector = selector[1] || selector; | 
|---|
| 1181 |     this.selectorText = this.parse(this.selector) + (selector[2] || ""); | 
|---|
| 1182 |     this.cssText = cssText; | 
|---|
| 1183 |     this.MATCH = new RegExp("\\s" + this.className + "(\\s|$)", "g"); | 
|---|
| 1184 |     IE7.CSS.rules.push(this); | 
|---|
| 1185 |     this.init(); | 
|---|
| 1186 |   }, | 
|---|
| 1187 |    | 
|---|
| 1188 |   init: Undefined, | 
|---|
| 1189 |    | 
|---|
| 1190 |   add: function(element) { | 
|---|
| 1191 |     // allocate this class | 
|---|
| 1192 |     element.className += " " + this.className; | 
|---|
| 1193 |   }, | 
|---|
| 1194 |    | 
|---|
| 1195 |   recalc: function() { | 
|---|
| 1196 |     // execute the underlying css query for this class | 
|---|
| 1197 |     var match = cssQuery(this.selector); | 
|---|
| 1198 |     // add the class name for all matching elements | 
|---|
| 1199 |     for (var i = 0; i < match.length; i++) this.add(match[i]); | 
|---|
| 1200 |   }, | 
|---|
| 1201 |  | 
|---|
| 1202 |   parse: function(selector) { | 
|---|
| 1203 |     // attempt to preserve specificity for "loose" parsing by | 
|---|
| 1204 |     //  removing unknown tokens from a css selector but keep as | 
|---|
| 1205 |     //  much as we can.. | 
|---|
| 1206 |     var simple = selector.replace(Rule.CHILD, " ").replace(Rule.COMPLEX, ""); | 
|---|
| 1207 |     if (appVersion < 7) simple = simple.replace(Rule.MULTI, ""); | 
|---|
| 1208 |     var tags = match(simple, Rule.TAGS).length - match(selector, Rule.TAGS).length; | 
|---|
| 1209 |     var classes = match(simple, Rule.CLASSES).length - match(selector, Rule.CLASSES).length + 1; | 
|---|
| 1210 |     while (classes > 0 && Rule.CLASS.test(simple)) { | 
|---|
| 1211 |       simple = simple.replace(Rule.CLASS, ""); | 
|---|
| 1212 |       classes--; | 
|---|
| 1213 |     } | 
|---|
| 1214 |     while (tags > 0 && Rule.TAG.test(simple)) { | 
|---|
| 1215 |       simple = simple.replace(Rule.TAG, "$1*"); | 
|---|
| 1216 |       tags--; | 
|---|
| 1217 |     } | 
|---|
| 1218 |     simple += "." + this.className; | 
|---|
| 1219 |     classes = Math.min(classes, 2); | 
|---|
| 1220 |     tags = Math.min(tags, 2); | 
|---|
| 1221 |     var score = -10 * classes - tags; | 
|---|
| 1222 |     if (score > 0) { | 
|---|
| 1223 |       simple = simple + "," + Rule.MAP[score] + " " + simple; | 
|---|
| 1224 |     } | 
|---|
| 1225 |     return simple; | 
|---|
| 1226 |   }, | 
|---|
| 1227 |    | 
|---|
| 1228 |   remove: function(element) { | 
|---|
| 1229 |     // deallocate this class | 
|---|
| 1230 |     element.className = element.className.replace(this.MATCH, "$1"); | 
|---|
| 1231 |   }, | 
|---|
| 1232 |    | 
|---|
| 1233 |   toString: function() { | 
|---|
| 1234 |     return format("%1 {%2}", this.selectorText, this.cssText); | 
|---|
| 1235 |   } | 
|---|
| 1236 | }, { | 
|---|
| 1237 |   CHILD: />/g, | 
|---|
| 1238 |   CLASS: /\.[\w-]+/, | 
|---|
| 1239 |   CLASSES: /[.:\[]/g, | 
|---|
| 1240 |   MULTI: /(\.[\w-]+)+/g, | 
|---|
| 1241 |   PREFIX: "ie7_class", | 
|---|
| 1242 |   TAG: /^\w+|([\s>+~])\w+/, | 
|---|
| 1243 |   TAGS: /^\w|[\s>+~]\w/g, | 
|---|
| 1244 |   MAP: { | 
|---|
| 1245 |     1:  "html", | 
|---|
| 1246 |     2:  "html body", | 
|---|
| 1247 |     10: ".ie7_html", | 
|---|
| 1248 |     11: "html.ie7_html", | 
|---|
| 1249 |     12: "html.ie7_html body", | 
|---|
| 1250 |     20: ".ie7_html .ie7_body", | 
|---|
| 1251 |     21: "html.ie7_html .ie7_body", | 
|---|
| 1252 |     22: "html.ie7_html body.ie7_body" | 
|---|
| 1253 |   } | 
|---|
| 1254 | }); | 
|---|
| 1255 |  | 
|---|
| 1256 | // ----------------------------------------------------------------------- | 
|---|
| 1257 | // IE7 dynamic style | 
|---|
| 1258 | // ----------------------------------------------------------------------- | 
|---|
| 1259 |  | 
|---|
| 1260 | // object properties: | 
|---|
| 1261 | // attach: the element that an event handler will be attached to | 
|---|
| 1262 | // target: the element that will have the IE7 class applied | 
|---|
| 1263 |  | 
|---|
| 1264 | var DynamicRule = Rule.extend({ | 
|---|
| 1265 |   // properties | 
|---|
| 1266 |   constructor: function(selector, attach, dynamicPseudoClass, target, cssText) { | 
|---|
| 1267 |     // initialise object properties | 
|---|
| 1268 |     this.attach = attach || "*"; | 
|---|
| 1269 |     this.dynamicPseudoClass = IE7.CSS.dynamicPseudoClasses[dynamicPseudoClass]; | 
|---|
| 1270 |     this.target = target; | 
|---|
| 1271 |     this.base(selector, cssText); | 
|---|
| 1272 |   }, | 
|---|
| 1273 |    | 
|---|
| 1274 |   recalc: function() { | 
|---|
| 1275 |     // execute the underlying css query for this class | 
|---|
| 1276 |     var attaches = cssQuery(this.attach), attach; | 
|---|
| 1277 |     // process results | 
|---|
| 1278 |     for (var i = 0; attach = attaches[i]; i++) { | 
|---|
| 1279 |       // retrieve the event handler's target element(s) | 
|---|
| 1280 |       var target = this.target ? cssQuery(this.target, attach) : [attach]; | 
|---|
| 1281 |       // attach event handlers for dynamic pseudo-classes | 
|---|
| 1282 |       if (target.length) this.dynamicPseudoClass.apply(attach, target, this); | 
|---|
| 1283 |     } | 
|---|
| 1284 |   } | 
|---|
| 1285 | }); | 
|---|
| 1286 |  | 
|---|
| 1287 | // ----------------------------------------------------------------------- | 
|---|
| 1288 | //  IE7 dynamic pseudo-classes | 
|---|
| 1289 | // ----------------------------------------------------------------------- | 
|---|
| 1290 |  | 
|---|
| 1291 | var DynamicPseudoClass = Base.extend({ | 
|---|
| 1292 |   constructor: function(name, apply) { | 
|---|
| 1293 |     this.name = name; | 
|---|
| 1294 |     this.apply = apply; | 
|---|
| 1295 |     this.instances = {}; | 
|---|
| 1296 |     IE7.CSS.dynamicPseudoClasses[name] = this; | 
|---|
| 1297 |   }, | 
|---|
| 1298 |    | 
|---|
| 1299 |   register: function(instance) { | 
|---|
| 1300 |     // an "instance" is actually an Arguments object | 
|---|
| 1301 |     var _class = instance[2]; | 
|---|
| 1302 |     instance.id = _class.id + instance[0].uniqueID; | 
|---|
| 1303 |     if (!this.instances[instance.id]) { | 
|---|
| 1304 |       var target = instance[1], j; | 
|---|
| 1305 |       for (j = 0; j < target.length; j++) _class.add(target[j]); | 
|---|
| 1306 |       this.instances[instance.id] = instance; | 
|---|
| 1307 |     } | 
|---|
| 1308 |   }, | 
|---|
| 1309 |    | 
|---|
| 1310 |   unregister: function(instance) { | 
|---|
| 1311 |     if (this.instances[instance.id]) { | 
|---|
| 1312 |       var _class = instance[2]; | 
|---|
| 1313 |       var target = instance[1], j; | 
|---|
| 1314 |       for (j = 0; j < target.length; j++) _class.remove(target[j]); | 
|---|
| 1315 |       delete this.instances[instance.id]; | 
|---|
| 1316 |     } | 
|---|
| 1317 |   } | 
|---|
| 1318 | }); | 
|---|
| 1319 |    | 
|---|
| 1320 | // ----------------------------------------------------------------------- | 
|---|
| 1321 | // dynamic pseudo-classes | 
|---|
| 1322 | // ----------------------------------------------------------------------- | 
|---|
| 1323 |  | 
|---|
| 1324 | if (appVersion < 7) { | 
|---|
| 1325 |   var Hover = new DynamicPseudoClass("hover", function(element) { | 
|---|
| 1326 |     var instance = arguments; | 
|---|
| 1327 |     IE7.CSS.addEventHandler(element, appVersion < 5.5 ? "onmouseover" : "onmouseenter", function() { | 
|---|
| 1328 |       Hover.register(instance); | 
|---|
| 1329 |     }); | 
|---|
| 1330 |     IE7.CSS.addEventHandler(element, appVersion < 5.5 ? "onmouseout" : "onmouseleave", function() { | 
|---|
| 1331 |       Hover.unregister(instance); | 
|---|
| 1332 |     }); | 
|---|
| 1333 |   }); | 
|---|
| 1334 |    | 
|---|
| 1335 |   // globally trap the mouseup event (thanks Martijn!) | 
|---|
| 1336 |   addEventHandler(document, "onmouseup", function() { | 
|---|
| 1337 |     var instances = Hover.instances; | 
|---|
| 1338 |     for (var i in instances) | 
|---|
| 1339 |       if (!instances[i][0].contains(event.srcElement)) | 
|---|
| 1340 |         Hover.unregister(instances[i]); | 
|---|
| 1341 |   }); | 
|---|
| 1342 | } | 
|---|
| 1343 |  | 
|---|
| 1344 | // ----------------------------------------------------------------------- | 
|---|
| 1345 | // propertyName: inherit; | 
|---|
| 1346 | // ----------------------------------------------------------------------- | 
|---|
| 1347 |  | 
|---|
| 1348 | IE7.CSS.addRecalc("[\\w-]+", "inherit", function(element, cssText) { | 
|---|
| 1349 |   var inherited = cssText.match(/[\w-]+\s*:\s*inherit/g); | 
|---|
| 1350 |   for (var i = 0; i < inherited.length; i++) { | 
|---|
| 1351 |     var propertyName = inherited[i].replace(/ie7\-|\s*:\s*inherit/g, "").replace(/\-([a-z])/g, function(match, chr) { | 
|---|
| 1352 |       return chr.toUpperCase() | 
|---|
| 1353 |     }); | 
|---|
| 1354 |     element.runtimeStyle[propertyName] = element.parentElement.currentStyle[propertyName]; | 
|---|
| 1355 |   } | 
|---|
| 1356 | }); | 
|---|
| 1357 |  | 
|---|
| 1358 | // ========================================================================= | 
|---|
| 1359 | // ie7-html.js | 
|---|
| 1360 | // ========================================================================= | 
|---|
| 1361 |  | 
|---|
| 1362 | // default font-sizes | 
|---|
| 1363 | //HEADER += "h1{font-size:2em}h2{font-size:1.5em;}h3{font-size:1.17em;}h4{font-size:1em}h5{font-size:.83em}h6{font-size:.67em}"; | 
|---|
| 1364 |  | 
|---|
| 1365 | IE7.HTML = new (Fix.extend({ // single instance   | 
|---|
| 1366 |   fixed: {}, | 
|---|
| 1367 |    | 
|---|
| 1368 |   init: Undefined, | 
|---|
| 1369 |    | 
|---|
| 1370 |   addFix: function() { | 
|---|
| 1371 |     // fixes are a one-off, they are applied when the document is loaded | 
|---|
| 1372 |     this.fixes.push(arguments); | 
|---|
| 1373 |   }, | 
|---|
| 1374 |    | 
|---|
| 1375 |   apply: function() { | 
|---|
| 1376 |     for (var i = 0; i < this.fixes.length; i++) { | 
|---|
| 1377 |       var match = cssQuery(this.fixes[i][0]); | 
|---|
| 1378 |       var fix = this.fixes[i][1]; | 
|---|
| 1379 |       for (var j = 0; j < match.length; j++) fix(match[j]); | 
|---|
| 1380 |     } | 
|---|
| 1381 |   }, | 
|---|
| 1382 |    | 
|---|
| 1383 |   addRecalc: function() { | 
|---|
| 1384 |     // recalcs occur whenever the document is refreshed using document.recalc() | 
|---|
| 1385 |     this.recalcs.push(arguments); | 
|---|
| 1386 |   }, | 
|---|
| 1387 |    | 
|---|
| 1388 |   recalc: function() { | 
|---|
| 1389 |     // loop through the fixes | 
|---|
| 1390 |     for (var i = 0; i < this.recalcs.length; i++) { | 
|---|
| 1391 |       var match = cssQuery(this.recalcs[i][0]); | 
|---|
| 1392 |       var recalc = this.recalcs[i][1], element; | 
|---|
| 1393 |       var key = Math.pow(2, i); | 
|---|
| 1394 |       for (var j = 0; (element = match[j]); j++) { | 
|---|
| 1395 |         var uniqueID = element.uniqueID; | 
|---|
| 1396 |         if ((this.fixed[uniqueID] & key) == 0) { | 
|---|
| 1397 |           element = recalc(element) || element; | 
|---|
| 1398 |           this.fixed[uniqueID] |= key; | 
|---|
| 1399 |         } | 
|---|
| 1400 |       } | 
|---|
| 1401 |     } | 
|---|
| 1402 |   } | 
|---|
| 1403 | })); | 
|---|
| 1404 |  | 
|---|
| 1405 | if (appVersion < 7) {   | 
|---|
| 1406 |   // provide support for the <abbr> tag. | 
|---|
| 1407 |   //  this is a proper fix, it preserves the DOM structure and | 
|---|
| 1408 |   //  <abbr> elements report the correct tagName & namespace prefix | 
|---|
| 1409 |   document.createElement("abbr"); | 
|---|
| 1410 |    | 
|---|
| 1411 |   // bind to the first child control | 
|---|
| 1412 |   IE7.HTML.addRecalc("label", function(label) { | 
|---|
| 1413 |     if (!label.htmlFor) { | 
|---|
| 1414 |       var firstChildControl = cssQuery("input,textarea", label, true); | 
|---|
| 1415 |       if (firstChildControl) { | 
|---|
| 1416 |         addEventHandler(label, "onclick", function() { | 
|---|
| 1417 |           firstChildControl.click(); | 
|---|
| 1418 |         }); | 
|---|
| 1419 |       } | 
|---|
| 1420 |     } | 
|---|
| 1421 |   }); | 
|---|
| 1422 | } | 
|---|
| 1423 |  | 
|---|
| 1424 | // ========================================================================= | 
|---|
| 1425 | // ie7-layout.js | 
|---|
| 1426 | // ========================================================================= | 
|---|
| 1427 |  | 
|---|
| 1428 | var NUMERIC = "[.\\d]"; | 
|---|
| 1429 |  | 
|---|
| 1430 | new function(_) { | 
|---|
| 1431 | var layout = IE7.Layout = this; | 
|---|
| 1432 |  | 
|---|
| 1433 |   // big, ugly box-model hack + min/max stuff | 
|---|
| 1434 |    | 
|---|
| 1435 |   // #tantek > #erik > #dean { voice-family: hacker; } | 
|---|
| 1436 |    | 
|---|
| 1437 |   // ----------------------------------------------------------------------- | 
|---|
| 1438 |   // "layout" | 
|---|
| 1439 |   // ----------------------------------------------------------------------- | 
|---|
| 1440 |    | 
|---|
| 1441 |   HEADER += "*{boxSizing:content-box}"; | 
|---|
| 1442 |    | 
|---|
| 1443 |   // does an element have "layout" ? | 
|---|
| 1444 |   IE7.hasLayout = appVersion < 5.5 ? function(element) { | 
|---|
| 1445 |     // element.currentStyle.hasLayout doesn't work for IE5.0 | 
|---|
| 1446 |     return element.clientWidth; | 
|---|
| 1447 |   } : function(element) { | 
|---|
| 1448 |     return element.currentStyle.hasLayout; | 
|---|
| 1449 |   }; | 
|---|
| 1450 |    | 
|---|
| 1451 |   // give an element "layout" | 
|---|
| 1452 |   layout.boxSizing = function(element) { | 
|---|
| 1453 |     if (!IE7.hasLayout(element)) { | 
|---|
| 1454 |     //#  element.runtimeStyle.fixedHeight = | 
|---|
| 1455 |       element.style.height = "0cm"; | 
|---|
| 1456 |       if (element.currentStyle.verticalAlign == "auto") | 
|---|
| 1457 |         element.runtimeStyle.verticalAlign = "top"; | 
|---|
| 1458 |       // when an element acquires "layout", margins no longer collapse correctly | 
|---|
| 1459 |       collapseMargins(element); | 
|---|
| 1460 |     } | 
|---|
| 1461 |   }; | 
|---|
| 1462 |    | 
|---|
| 1463 |   // ----------------------------------------------------------------------- | 
|---|
| 1464 |   // Margin Collapse | 
|---|
| 1465 |   // ----------------------------------------------------------------------- | 
|---|
| 1466 |    | 
|---|
| 1467 |   function collapseMargins(element) { | 
|---|
| 1468 |     if (element != viewport && element.currentStyle.position != "absolute") { | 
|---|
| 1469 |       collapseMargin(element, "marginTop"); | 
|---|
| 1470 |       collapseMargin(element, "marginBottom"); | 
|---|
| 1471 |     } | 
|---|
| 1472 |   }; | 
|---|
| 1473 |    | 
|---|
| 1474 |   function collapseMargin(element, type) { | 
|---|
| 1475 |     if (!element.runtimeStyle[type]) { | 
|---|
| 1476 |       var parentElement = element.parentElement; | 
|---|
| 1477 |       if (parentElement && IE7.hasLayout(parentElement) && !IE7[type == "marginTop" ? "_getPreviousElementSibling" : "_getNextElementSibling"](element)) return; | 
|---|
| 1478 |       var child = cssQuery(">*:" + (type == "marginTop" ? "first" : "last") + "-child", element, true); | 
|---|
| 1479 |       if (child && child.currentStyle.styleFloat == "none" && IE7.hasLayout(child)) { | 
|---|
| 1480 |         collapseMargin(child, type); | 
|---|
| 1481 |         margin = _getMargin(element, element.currentStyle[type]); | 
|---|
| 1482 |         childMargin = _getMargin(child, child.currentStyle[type]); | 
|---|
| 1483 |         if (margin < 0 || childMargin < 0) { | 
|---|
| 1484 |           element.runtimeStyle[type] = margin + childMargin; | 
|---|
| 1485 |         } else { | 
|---|
| 1486 |           element.runtimeStyle[type] = Math.max(childMargin, margin); | 
|---|
| 1487 |         } | 
|---|
| 1488 |         child.runtimeStyle[type] = "0px"; | 
|---|
| 1489 |       } | 
|---|
| 1490 |     } | 
|---|
| 1491 |   }; | 
|---|
| 1492 |    | 
|---|
| 1493 |   function _getMargin(element, value) { | 
|---|
| 1494 |     return value == "auto" ? 0 : getPixelValue(element, value); | 
|---|
| 1495 |   }; | 
|---|
| 1496 |    | 
|---|
| 1497 |   // ----------------------------------------------------------------------- | 
|---|
| 1498 |   // box-model | 
|---|
| 1499 |   // ----------------------------------------------------------------------- | 
|---|
| 1500 |    | 
|---|
| 1501 |   // constants | 
|---|
| 1502 |   var UNIT = /^[.\d][\w%]*$/, AUTO = /^(auto|0cm)$/; | 
|---|
| 1503 |    | 
|---|
| 1504 |   var applyWidth, applyHeight; | 
|---|
| 1505 |   IE7.Layout.borderBox = function(element){ | 
|---|
| 1506 |     applyWidth(element); | 
|---|
| 1507 |     applyHeight(element); | 
|---|
| 1508 |   }; | 
|---|
| 1509 |    | 
|---|
| 1510 |   var fixWidth = function(HEIGHT) { | 
|---|
| 1511 |     applyWidth = function(element) { | 
|---|
| 1512 |       if (!PERCENT.test(element.currentStyle.width)) fixWidth(element); | 
|---|
| 1513 |       collapseMargins(element); | 
|---|
| 1514 |     }; | 
|---|
| 1515 |    | 
|---|
| 1516 |     function fixWidth(element, value) { | 
|---|
| 1517 |       if (!element.runtimeStyle.fixedWidth) { | 
|---|
| 1518 |         if (!value) value = element.currentStyle.width; | 
|---|
| 1519 |         element.runtimeStyle.fixedWidth = (UNIT.test(value)) ? Math.max(0, getFixedWidth(element, value)) : value; | 
|---|
| 1520 |         setOverrideStyle(element, "width", element.runtimeStyle.fixedWidth); | 
|---|
| 1521 |       } | 
|---|
| 1522 |     }; | 
|---|
| 1523 |    | 
|---|
| 1524 |     function layoutWidth(element) { | 
|---|
| 1525 |       if (!isFixed(element)) { | 
|---|
| 1526 |         var layoutParent = element.offsetParent; | 
|---|
| 1527 |         while (layoutParent && !IE7.hasLayout(layoutParent)) layoutParent = layoutParent.offsetParent; | 
|---|
| 1528 |       } | 
|---|
| 1529 |       return (layoutParent || viewport).clientWidth; | 
|---|
| 1530 |     }; | 
|---|
| 1531 |    | 
|---|
| 1532 |     function getPixelWidth(element, value) { | 
|---|
| 1533 |       if (PERCENT.test(value)) return parseInt(parseFloat(value) / 100 * layoutWidth(element)); | 
|---|
| 1534 |       return getPixelValue(element, value); | 
|---|
| 1535 |     }; | 
|---|
| 1536 |    | 
|---|
| 1537 |     var getFixedWidth = function(element, value) { | 
|---|
| 1538 |       var borderBox = element.currentStyle["box-sizing"] == "border-box"; | 
|---|
| 1539 |       var adjustment = 0; | 
|---|
| 1540 |       if (quirksMode && !borderBox) | 
|---|
| 1541 |         adjustment += getBorderWidth(element) + getWidth(element, "padding"); | 
|---|
| 1542 |       else if (!quirksMode && borderBox) | 
|---|
| 1543 |         adjustment -= getBorderWidth(element) + getWidth(element, "padding"); | 
|---|
| 1544 |       return getPixelWidth(element, value) + adjustment; | 
|---|
| 1545 |     }; | 
|---|
| 1546 |    | 
|---|
| 1547 |     // easy way to get border thickness for elements with "layout" | 
|---|
| 1548 |     function getBorderWidth(element) { | 
|---|
| 1549 |       return element.offsetWidth - element.clientWidth; | 
|---|
| 1550 |     }; | 
|---|
| 1551 |    | 
|---|
| 1552 |     // have to do some pixel conversion to get padding/margin thickness :-( | 
|---|
| 1553 |     function getWidth(element, type) { | 
|---|
| 1554 |       return getPixelWidth(element, element.currentStyle[type + "Left"]) + getPixelWidth(element, element.currentStyle[type + "Right"]); | 
|---|
| 1555 |     }; | 
|---|
| 1556 |    | 
|---|
| 1557 |     // ----------------------------------------------------------------------- | 
|---|
| 1558 |     // min/max | 
|---|
| 1559 |     // ----------------------------------------------------------------------- | 
|---|
| 1560 |    | 
|---|
| 1561 |     HEADER += "*{minWidth:none;maxWidth:none;min-width:none;max-width:none}"; | 
|---|
| 1562 |    | 
|---|
| 1563 |     // handle min-width property | 
|---|
| 1564 |     layout.minWidth = function(element) { | 
|---|
| 1565 |       // IE6 supports min-height so we frig it here | 
|---|
| 1566 |       //#if (element.currentStyle.minHeight == "auto") element.runtimeStyle.minHeight = 0; | 
|---|
| 1567 |       if (element.currentStyle["min-width"] != null) { | 
|---|
| 1568 |         element.style.minWidth = element.currentStyle["min-width"]; | 
|---|
| 1569 |       } | 
|---|
| 1570 |       if (register(arguments.callee, element, element.currentStyle.minWidth != "none")) { | 
|---|
| 1571 |         layout.boxSizing(element); | 
|---|
| 1572 |         fixWidth(element); | 
|---|
| 1573 |         resizeWidth(element); | 
|---|
| 1574 |       } | 
|---|
| 1575 |     }; | 
|---|
| 1576 |      | 
|---|
| 1577 |     // clone the minWidth function to make a maxWidth function | 
|---|
| 1578 |     eval("IE7.Layout.maxWidth=" + String(layout.minWidth).replace(/min/g, "max")); | 
|---|
| 1579 |      | 
|---|
| 1580 |     // apply min/max restrictions | 
|---|
| 1581 |     function resizeWidth(element) { | 
|---|
| 1582 |       // check boundaries | 
|---|
| 1583 |       var rect = element.getBoundingClientRect(); | 
|---|
| 1584 |       var width = rect.right - rect.left; | 
|---|
| 1585 |    | 
|---|
| 1586 |       if (element.currentStyle.minWidth != "none" && width <= getFixedWidth(element, element.currentStyle.minWidth)) { | 
|---|
| 1587 |         element.runtimeStyle.width = element.currentStyle.minWidth; | 
|---|
| 1588 |       } else if (element.currentStyle.maxWidth != "none" && width >= getFixedWidth(element, element.currentStyle.maxWidth)) { | 
|---|
| 1589 |         element.runtimeStyle.width = element.currentStyle.maxWidth; | 
|---|
| 1590 |       } else { | 
|---|
| 1591 |         element.runtimeStyle.width = element.runtimeStyle.fixedWidth; // || "auto"; | 
|---|
| 1592 |       } | 
|---|
| 1593 |     }; | 
|---|
| 1594 |    | 
|---|
| 1595 |     // ----------------------------------------------------------------------- | 
|---|
| 1596 |     // right/bottom | 
|---|
| 1597 |     // ----------------------------------------------------------------------- | 
|---|
| 1598 |    | 
|---|
| 1599 |     function fixRight(element) { | 
|---|
| 1600 |       if (register(fixRight, element, /^(fixed|absolute)$/.test(element.currentStyle.position) && | 
|---|
| 1601 |         getDefinedStyle(element, "left") != "auto" && | 
|---|
| 1602 |         getDefinedStyle(element, "right") != "auto" && | 
|---|
| 1603 |         AUTO.test(getDefinedStyle(element, "width")))) { | 
|---|
| 1604 |           resizeRight(element); | 
|---|
| 1605 |           IE7.Layout.boxSizing(element); | 
|---|
| 1606 |       } | 
|---|
| 1607 |     }; | 
|---|
| 1608 |     IE7.Layout.fixRight = fixRight; | 
|---|
| 1609 |    | 
|---|
| 1610 |     function resizeRight(element) { | 
|---|
| 1611 |       var left = getPixelWidth(element, element.runtimeStyle._left || element.currentStyle.left); | 
|---|
| 1612 |       var width = layoutWidth(element) - getPixelWidth(element, element.currentStyle.right) -  left - getWidth(element, "margin"); | 
|---|
| 1613 |       if (parseInt(element.runtimeStyle.width) == width) return; | 
|---|
| 1614 |       element.runtimeStyle.width = ""; | 
|---|
| 1615 |       if (isFixed(element) || HEIGHT || element.offsetWidth < width) { | 
|---|
| 1616 |         if (!quirksMode) width -= getBorderWidth(element) + getWidth(element, "padding"); | 
|---|
| 1617 |         if (width < 0) width = 0; | 
|---|
| 1618 |         element.runtimeStyle.fixedWidth = width; | 
|---|
| 1619 |         setOverrideStyle(element, "width", width); | 
|---|
| 1620 |       } | 
|---|
| 1621 |     }; | 
|---|
| 1622 |    | 
|---|
| 1623 |   // ----------------------------------------------------------------------- | 
|---|
| 1624 |   // window.onresize | 
|---|
| 1625 |   // ----------------------------------------------------------------------- | 
|---|
| 1626 |    | 
|---|
| 1627 |     // handle window resize | 
|---|
| 1628 |     var clientWidth = 0; | 
|---|
| 1629 |     addResize(function() { | 
|---|
| 1630 |       if (!viewport) return; | 
|---|
| 1631 |       var i, wider = (clientWidth < viewport.clientWidth); | 
|---|
| 1632 |       clientWidth = viewport.clientWidth; | 
|---|
| 1633 |       // resize elements with "min-width" set | 
|---|
| 1634 |       var elements = layout.minWidth.elements; | 
|---|
| 1635 |       for (i in elements) { | 
|---|
| 1636 |         var element = elements[i]; | 
|---|
| 1637 |         var fixedWidth = (parseInt(element.runtimeStyle.width) == getFixedWidth(element, element.currentStyle.minWidth)); | 
|---|
| 1638 |         if (wider && fixedWidth) element.runtimeStyle.width = ""; | 
|---|
| 1639 |         if (wider == fixedWidth) resizeWidth(element); | 
|---|
| 1640 |       } | 
|---|
| 1641 |       // resize elements with "max-width" set | 
|---|
| 1642 |       var elements = layout.maxWidth.elements; | 
|---|
| 1643 |       for (i in elements) { | 
|---|
| 1644 |         var element = elements[i]; | 
|---|
| 1645 |         var fixedWidth = (parseInt(element.runtimeStyle.width) == getFixedWidth(element, element.currentStyle.maxWidth)); | 
|---|
| 1646 |         if (!wider && fixedWidth) element.runtimeStyle.width = ""; | 
|---|
| 1647 |         if (wider != fixedWidth) resizeWidth(element); | 
|---|
| 1648 |       } | 
|---|
| 1649 |       // resize elements with "right" set | 
|---|
| 1650 |       for (i in fixRight.elements) resizeRight(fixRight.elements[i]); | 
|---|
| 1651 |     }); | 
|---|
| 1652 |    | 
|---|
| 1653 |   // ----------------------------------------------------------------------- | 
|---|
| 1654 |   // fix CSS | 
|---|
| 1655 |   // ----------------------------------------------------------------------- | 
|---|
| 1656 |     if (quirksMode) { | 
|---|
| 1657 |       IE7.CSS.addRecalc("width", NUMERIC, applyWidth); | 
|---|
| 1658 |     } | 
|---|
| 1659 |     if (appVersion < 7) { | 
|---|
| 1660 |       IE7.CSS.addRecalc("min-width", NUMERIC, layout.minWidth); | 
|---|
| 1661 |       IE7.CSS.addRecalc("max-width", NUMERIC, layout.maxWidth); | 
|---|
| 1662 |       IE7.CSS.addRecalc("right", NUMERIC, fixRight); | 
|---|
| 1663 |     } | 
|---|
| 1664 |   }; | 
|---|
| 1665 |    | 
|---|
| 1666 |   eval("var fixHeight=" + rotate(fixWidth)); | 
|---|
| 1667 |    | 
|---|
| 1668 |   // apply box-model + min/max fixes | 
|---|
| 1669 |   fixWidth(); | 
|---|
| 1670 |   fixHeight(true); | 
|---|
| 1671 | }; | 
|---|
| 1672 |  | 
|---|
| 1673 | // ========================================================================= | 
|---|
| 1674 | // ie7-graphics.js | 
|---|
| 1675 | // ========================================================================= | 
|---|
| 1676 |  | 
|---|
| 1677 | // a small transparent image used as a placeholder | 
|---|
| 1678 | var BLANK_GIF = makePath("blank.gif", path); | 
|---|
| 1679 |  | 
|---|
| 1680 | var ALPHA_IMAGE_LOADER = "DXImageTransform.Microsoft.AlphaImageLoader"; | 
|---|
| 1681 | var PNG_FILTER = "progid:" + ALPHA_IMAGE_LOADER + "(src='%1',sizingMethod='%2')"; | 
|---|
| 1682 |    | 
|---|
| 1683 | // regular expression version of the above | 
|---|
| 1684 | var PNG; | 
|---|
| 1685 |  | 
|---|
| 1686 | var filtered = []; | 
|---|
| 1687 |  | 
|---|
| 1688 | function fixImage(element) { | 
|---|
| 1689 |   if (PNG.test(element.src)) { | 
|---|
| 1690 |     // we have to preserve width and height | 
|---|
| 1691 |     var image = new Image(element.width, element.height); | 
|---|
| 1692 |     image.onload = function() { | 
|---|
| 1693 |       element.width = image.width; | 
|---|
| 1694 |       element.height = image.height; | 
|---|
| 1695 |       image = null; | 
|---|
| 1696 |     }; | 
|---|
| 1697 |     image.src = element.src; | 
|---|
| 1698 |     // store the original url (we'll put it back when it's printed) | 
|---|
| 1699 |     element.pngSrc = element.src; | 
|---|
| 1700 |     // add the AlphaImageLoader thingy | 
|---|
| 1701 |     addFilter(element); | 
|---|
| 1702 |   } | 
|---|
| 1703 | }; | 
|---|
| 1704 |  | 
|---|
| 1705 | if (appVersion >= 5.5 && appVersion < 7) { | 
|---|
| 1706 |   // ** IE7 VARIABLE | 
|---|
| 1707 |   // e.g. only apply the hack to files ending in ".png" | 
|---|
| 1708 |   // IE7_PNG_SUFFIX = ".png"; | 
|---|
| 1709 |  | 
|---|
| 1710 |   // replace background(-image): url(..) ..  with background(-image): .. ;filter: ..; | 
|---|
| 1711 |   IE7.CSS.addFix(/background(-image)?\s*:\s*([^};]*)?url\(([^\)]+)\)([^;}]*)?/, function(match, $1, $2, url, $4) { | 
|---|
| 1712 |     url = getString(url); | 
|---|
| 1713 |     return PNG.test(url) ? "filter:" + format(PNG_FILTER, url, "crop") + | 
|---|
| 1714 |       ";zoom:1;background" + ($1||"") + ":" + ($2||"") + "none" + ($4||"") : match; | 
|---|
| 1715 |   }); | 
|---|
| 1716 |    | 
|---|
| 1717 |   // ----------------------------------------------------------------------- | 
|---|
| 1718 |   //  fix PNG transparency (HTML images) | 
|---|
| 1719 |   // ----------------------------------------------------------------------- | 
|---|
| 1720 |  | 
|---|
| 1721 |   IE7.HTML.addRecalc("img,input", function(element) { | 
|---|
| 1722 |     if (element.tagName == "INPUT" && element.type != "image") return; | 
|---|
| 1723 |     fixImage(element); | 
|---|
| 1724 |     addEventHandler(element, "onpropertychange", function() { | 
|---|
| 1725 |       if (!printing && event.propertyName == "src" && | 
|---|
| 1726 |         element.src.indexOf(BLANK_GIF) == -1) fixImage(element); | 
|---|
| 1727 |     }); | 
|---|
| 1728 |   }); | 
|---|
| 1729 |  | 
|---|
| 1730 |   // assume that background images should not be printed | 
|---|
| 1731 |   //  (if they are not transparent then they'll just obscure content) | 
|---|
| 1732 |   // but we'll put foreground images back... | 
|---|
| 1733 |   var printing = false; | 
|---|
| 1734 |   addEventHandler(window, "onbeforeprint", function() { | 
|---|
| 1735 |     printing = true; | 
|---|
| 1736 |     for (var i = 0; i < filtered.length; i++) removeFilter(filtered[i]); | 
|---|
| 1737 |   }); | 
|---|
| 1738 |   addEventHandler(window, "onafterprint", function() { | 
|---|
| 1739 |     for (var i = 0; i < filtered.length; i++) addFilter(filtered[i]); | 
|---|
| 1740 |     printing = false; | 
|---|
| 1741 |   }); | 
|---|
| 1742 | } | 
|---|
| 1743 |  | 
|---|
| 1744 | // apply a filter | 
|---|
| 1745 | function addFilter(element, sizingMethod) { | 
|---|
| 1746 |   var filter = element.filters[ALPHA_IMAGE_LOADER]; | 
|---|
| 1747 |   if (filter) { | 
|---|
| 1748 |     filter.src = element.src; | 
|---|
| 1749 |     filter.enabled = true; | 
|---|
| 1750 |   } else { | 
|---|
| 1751 |     element.runtimeStyle.filter = format(PNG_FILTER, element.src, sizingMethod || "scale"); | 
|---|
| 1752 |     filtered.push(element); | 
|---|
| 1753 |   } | 
|---|
| 1754 |   // remove the real image | 
|---|
| 1755 |   element.src = BLANK_GIF; | 
|---|
| 1756 | }; | 
|---|
| 1757 |  | 
|---|
| 1758 | function removeFilter(element) { | 
|---|
| 1759 |   element.src = element.pngSrc; | 
|---|
| 1760 |   element.filters[ALPHA_IMAGE_LOADER].enabled = false; | 
|---|
| 1761 | }; | 
|---|
| 1762 |  | 
|---|
| 1763 | // ========================================================================= | 
|---|
| 1764 | // ie7-fixed.js | 
|---|
| 1765 | // ========================================================================= | 
|---|
| 1766 |  | 
|---|
| 1767 | new function(_) { | 
|---|
| 1768 |   if (appVersion >= 7) return; | 
|---|
| 1769 |    | 
|---|
| 1770 |   // some things to consider for this hack. | 
|---|
| 1771 |   // the document body requires a fixed background. even if | 
|---|
| 1772 |   //  it is just a blank image. | 
|---|
| 1773 |   // you have to use setExpression instead of onscroll, this | 
|---|
| 1774 |   //  together with a fixed body background helps avoid the | 
|---|
| 1775 |   //  annoying screen flicker of other solutions. | 
|---|
| 1776 |    | 
|---|
| 1777 |   IE7.CSS.addRecalc("position", "fixed", _positionFixed, "absolute"); | 
|---|
| 1778 |   IE7.CSS.addRecalc("background(-attachment)?", "[^};]*fixed", _backgroundFixed); | 
|---|
| 1779 |    | 
|---|
| 1780 |   // scrolling is relative to the documentElement (HTML tag) when in | 
|---|
| 1781 |   //  standards mode, otherwise it's relative to the document body | 
|---|
| 1782 |   var $viewport = quirksMode ? "body" : "documentElement"; | 
|---|
| 1783 |    | 
|---|
| 1784 |   function _fixBackground() { | 
|---|
| 1785 |     // this is required by both position:fixed and background-attachment:fixed. | 
|---|
| 1786 |     // it is necessary for the document to also have a fixed background image. | 
|---|
| 1787 |     // we can fake this with a blank image if necessary | 
|---|
| 1788 |     if (body.currentStyle.backgroundAttachment != "fixed") { | 
|---|
| 1789 |       if (body.currentStyle.backgroundImage == "none") { | 
|---|
| 1790 |         body.runtimeStyle.backgroundRepeat = "no-repeat"; | 
|---|
| 1791 |         body.runtimeStyle.backgroundImage = "url(" + BLANK_GIF + ")"; // dummy | 
|---|
| 1792 |       } | 
|---|
| 1793 |       body.runtimeStyle.backgroundAttachment = "fixed"; | 
|---|
| 1794 |     } | 
|---|
| 1795 |     _fixBackground = Undefined; | 
|---|
| 1796 |   }; | 
|---|
| 1797 |    | 
|---|
| 1798 |   var _tmp = createTempElement("img"); | 
|---|
| 1799 |    | 
|---|
| 1800 |   function _isFixed(element) { | 
|---|
| 1801 |     return element ? isFixed(element) || _isFixed(element.parentElement) : false; | 
|---|
| 1802 |   }; | 
|---|
| 1803 |    | 
|---|
| 1804 |   function _setExpression(element, propertyName, expression) { | 
|---|
| 1805 |     setTimeout("document.all." + element.uniqueID + ".runtimeStyle.setExpression('" + propertyName + "','" + expression + "')", 0); | 
|---|
| 1806 |   }; | 
|---|
| 1807 |    | 
|---|
| 1808 |   // ----------------------------------------------------------------------- | 
|---|
| 1809 |   //  backgroundAttachment: fixed | 
|---|
| 1810 |   // ----------------------------------------------------------------------- | 
|---|
| 1811 |    | 
|---|
| 1812 |   function _backgroundFixed(element) { | 
|---|
| 1813 |     if (register(_backgroundFixed, element, element.currentStyle.backgroundAttachment == "fixed" && !element.contains(body))) { | 
|---|
| 1814 |       _fixBackground(); | 
|---|
| 1815 |       bgLeft(element); | 
|---|
| 1816 |       bgTop(element); | 
|---|
| 1817 |       _backgroundPosition(element); | 
|---|
| 1818 |     } | 
|---|
| 1819 |   }; | 
|---|
| 1820 |    | 
|---|
| 1821 |   function _backgroundPosition(element) { | 
|---|
| 1822 |     _tmp.src = element.currentStyle.backgroundImage.slice(5, -2); | 
|---|
| 1823 |     var parentElement = element.canHaveChildren ? element : element.parentElement; | 
|---|
| 1824 |     parentElement.appendChild(_tmp); | 
|---|
| 1825 |     setOffsetLeft(element); | 
|---|
| 1826 |     setOffsetTop(element); | 
|---|
| 1827 |     parentElement.removeChild(_tmp); | 
|---|
| 1828 |   }; | 
|---|
| 1829 |    | 
|---|
| 1830 |   function bgLeft(element) { | 
|---|
| 1831 |     element.style.backgroundPositionX = element.currentStyle.backgroundPositionX; | 
|---|
| 1832 |     if (!_isFixed(element)) { | 
|---|
| 1833 |       _setExpression(element, "backgroundPositionX", "(parseInt(runtimeStyle.offsetLeft)+document." + $viewport + ".scrollLeft)||0"); | 
|---|
| 1834 |     } | 
|---|
| 1835 |   }; | 
|---|
| 1836 |   eval(rotate(bgLeft)); | 
|---|
| 1837 |    | 
|---|
| 1838 |   function setOffsetLeft(element) { | 
|---|
| 1839 |     var propertyName = _isFixed(element) ? "backgroundPositionX" : "offsetLeft"; | 
|---|
| 1840 |     element.runtimeStyle[propertyName] = | 
|---|
| 1841 |       getOffsetLeft(element, element.style.backgroundPositionX) - | 
|---|
| 1842 |       element.getBoundingClientRect().left - element.clientLeft + 2; | 
|---|
| 1843 |   }; | 
|---|
| 1844 |   eval(rotate(setOffsetLeft)); | 
|---|
| 1845 |    | 
|---|
| 1846 |   function getOffsetLeft(element, position) { | 
|---|
| 1847 |     switch (position) { | 
|---|
| 1848 |       case "left": | 
|---|
| 1849 |       case "top": | 
|---|
| 1850 |         return 0; | 
|---|
| 1851 |       case "right": | 
|---|
| 1852 |       case "bottom": | 
|---|
| 1853 |         return viewport.clientWidth - _tmp.offsetWidth; | 
|---|
| 1854 |       case "center": | 
|---|
| 1855 |         return (viewport.clientWidth - _tmp.offsetWidth) / 2; | 
|---|
| 1856 |       default: | 
|---|
| 1857 |         if (PERCENT.test(position)) { | 
|---|
| 1858 |           return parseInt((viewport.clientWidth - _tmp.offsetWidth) * parseFloat(position) / 100); | 
|---|
| 1859 |         } | 
|---|
| 1860 |         _tmp.style.left = position; | 
|---|
| 1861 |         return _tmp.offsetLeft; | 
|---|
| 1862 |     } | 
|---|
| 1863 |   }; | 
|---|
| 1864 |   eval(rotate(getOffsetLeft)); | 
|---|
| 1865 |    | 
|---|
| 1866 |   // ----------------------------------------------------------------------- | 
|---|
| 1867 |   //  position: fixed | 
|---|
| 1868 |   // ----------------------------------------------------------------------- | 
|---|
| 1869 |    | 
|---|
| 1870 |   function _positionFixed(element) { | 
|---|
| 1871 |     if (register(_positionFixed, element, isFixed(element))) { | 
|---|
| 1872 |       setOverrideStyle(element, "position",  "absolute"); | 
|---|
| 1873 |       setOverrideStyle(element, "left",  element.currentStyle.left); | 
|---|
| 1874 |       setOverrideStyle(element, "top",  element.currentStyle.top); | 
|---|
| 1875 |       _fixBackground(); | 
|---|
| 1876 |       IE7.Layout.fixRight(element); | 
|---|
| 1877 |       _foregroundPosition(element); | 
|---|
| 1878 |     } | 
|---|
| 1879 |   }; | 
|---|
| 1880 |    | 
|---|
| 1881 |   function _foregroundPosition(element, recalc) { | 
|---|
| 1882 |     positionTop(element, recalc); | 
|---|
| 1883 |     positionLeft(element, recalc, true); | 
|---|
| 1884 |     if (!element.runtimeStyle.autoLeft && element.currentStyle.marginLeft == "auto" && | 
|---|
| 1885 |       element.currentStyle.right != "auto") { | 
|---|
| 1886 |       var left = viewport.clientWidth - getPixelWidth(element, element.currentStyle.right) - | 
|---|
| 1887 |         getPixelWidth(element, element.runtimeStyle._left) - element.clientWidth; | 
|---|
| 1888 |       if (element.currentStyle.marginRight == "auto") left = parseInt(left / 2); | 
|---|
| 1889 |       if (_isFixed(element.offsetParent)) element.runtimeStyle.pixelLeft += left; | 
|---|
| 1890 |       else element.runtimeStyle.shiftLeft = left; | 
|---|
| 1891 |     } | 
|---|
| 1892 |     clipWidth(element); | 
|---|
| 1893 |     clipHeight(element); | 
|---|
| 1894 |   }; | 
|---|
| 1895 |  | 
|---|
| 1896 |   function clipWidth(element) { | 
|---|
| 1897 |     var fixWidth = element.runtimeStyle.fixWidth; | 
|---|
| 1898 |     element.runtimeStyle.borderRightWidth = ""; | 
|---|
| 1899 |     element.runtimeStyle.width = fixWidth ? getPixelWidth(element, fixWidth) : ""; | 
|---|
| 1900 |     if (element.currentStyle.width != "auto") { | 
|---|
| 1901 |       var rect = element.getBoundingClientRect(); | 
|---|
| 1902 |       var width = element.offsetWidth - viewport.clientWidth + rect.left - 2; | 
|---|
| 1903 |       if (width >= 0) { | 
|---|
| 1904 |         element.runtimeStyle.borderRightWidth = "0px"; | 
|---|
| 1905 |         width = Math.max(getPixelValue(element, element.currentStyle.width) - width, 0); | 
|---|
| 1906 |         setOverrideStyle(element, "width",  width); | 
|---|
| 1907 |         return width; | 
|---|
| 1908 |       } | 
|---|
| 1909 |     } | 
|---|
| 1910 |   }; | 
|---|
| 1911 |   eval(rotate(clipWidth)); | 
|---|
| 1912 |    | 
|---|
| 1913 |   function positionLeft(element, recalc) { | 
|---|
| 1914 |     // if the element's width is in % units then it must be recalculated | 
|---|
| 1915 |     //  with respect to the viewport | 
|---|
| 1916 |     if (!recalc && PERCENT.test(element.currentStyle.width)) { | 
|---|
| 1917 |       element.runtimeStyle.fixWidth = element.currentStyle.width; | 
|---|
| 1918 |     } | 
|---|
| 1919 |     if (element.runtimeStyle.fixWidth) { | 
|---|
| 1920 |       element.runtimeStyle.width = getPixelWidth(element, element.runtimeStyle.fixWidth); | 
|---|
| 1921 |     } | 
|---|
| 1922 |     //if (recalc) { | 
|---|
| 1923 |     //  // if the element is fixed on the right then no need to recalculate | 
|---|
| 1924 |     //  if (!element.runtimeStyle.autoLeft) return; | 
|---|
| 1925 |     //} else { | 
|---|
| 1926 |       element.runtimeStyle.shiftLeft = 0; | 
|---|
| 1927 |       element.runtimeStyle._left = element.currentStyle.left; | 
|---|
| 1928 |       // is the element fixed on the right? | 
|---|
| 1929 |       element.runtimeStyle.autoLeft = element.currentStyle.right != "auto" && | 
|---|
| 1930 |         element.currentStyle.left == "auto"; | 
|---|
| 1931 |     //} | 
|---|
| 1932 |     // reset the element's "left" value and get it's natural position | 
|---|
| 1933 |     element.runtimeStyle.left = ""; | 
|---|
| 1934 |     element.runtimeStyle.screenLeft = getScreenLeft(element); | 
|---|
| 1935 |     element.runtimeStyle.pixelLeft = element.runtimeStyle.screenLeft; | 
|---|
| 1936 |     // if the element is contained by another fixed element then there is no need to | 
|---|
| 1937 |     //  continually recalculate it's left position | 
|---|
| 1938 |     if (!recalc && !_isFixed(element.offsetParent)) { | 
|---|
| 1939 |       // onsrcoll produces jerky movement, so we use an expression | 
|---|
| 1940 |       _setExpression(element, "pixelLeft", "runtimeStyle.screenLeft+runtimeStyle.shiftLeft+document." + $viewport + ".scrollLeft"); | 
|---|
| 1941 |     } | 
|---|
| 1942 |   }; | 
|---|
| 1943 |   // clone this function so we can do "top" | 
|---|
| 1944 |   eval(rotate(positionLeft)); | 
|---|
| 1945 |    | 
|---|
| 1946 |   // I've forgotten how this works... | 
|---|
| 1947 |   function getScreenLeft(element) { // thanks to kevin newman (captainn) | 
|---|
| 1948 |     var screenLeft = element.offsetLeft, nested = 1; | 
|---|
| 1949 |     if (element.runtimeStyle.autoLeft) { | 
|---|
| 1950 |       screenLeft = viewport.clientWidth - element.offsetWidth - getPixelWidth(element, element.currentStyle.right); | 
|---|
| 1951 |     } | 
|---|
| 1952 |     // accommodate margins | 
|---|
| 1953 |     if (element.currentStyle.marginLeft != "auto") { | 
|---|
| 1954 |       screenLeft -= getPixelWidth(element, element.currentStyle.marginLeft); | 
|---|
| 1955 |     } | 
|---|
| 1956 |     while (element = element.offsetParent) { | 
|---|
| 1957 |       if (element.currentStyle.position != "static") nested = -1; | 
|---|
| 1958 |       screenLeft += element.offsetLeft * nested; | 
|---|
| 1959 |     } | 
|---|
| 1960 |     return screenLeft; | 
|---|
| 1961 |   }; | 
|---|
| 1962 |   eval(rotate(getScreenLeft)); | 
|---|
| 1963 |    | 
|---|
| 1964 |   function getPixelWidth(element, value) { | 
|---|
| 1965 |     return PERCENT.test(value) ? parseInt(parseFloat(value) / 100 * viewport.clientWidth) : getPixelValue(element, value); | 
|---|
| 1966 |   }; | 
|---|
| 1967 |   eval(rotate(getPixelWidth)); | 
|---|
| 1968 |    | 
|---|
| 1969 |   // ----------------------------------------------------------------------- | 
|---|
| 1970 |   //  capture window resize | 
|---|
| 1971 |   // ----------------------------------------------------------------------- | 
|---|
| 1972 |    | 
|---|
| 1973 |   function _resize() { | 
|---|
| 1974 |     // if the window has been resized then some positions need to be | 
|---|
| 1975 |     //  recalculated (especially those aligned to "right" or "top" | 
|---|
| 1976 |     var elements = _backgroundFixed.elements; | 
|---|
| 1977 |     for (var i in elements) _backgroundPosition(elements[i]); | 
|---|
| 1978 |     elements = _positionFixed.elements; | 
|---|
| 1979 |     for (i in elements) { | 
|---|
| 1980 |       _foregroundPosition(elements[i], true); | 
|---|
| 1981 |       // do this twice to be sure - hackish, I know :-) | 
|---|
| 1982 |       _foregroundPosition(elements[i], true); | 
|---|
| 1983 |     } | 
|---|
| 1984 |     _timer = 0; | 
|---|
| 1985 |   }; | 
|---|
| 1986 |    | 
|---|
| 1987 |   // use a timer for some reason. | 
|---|
| 1988 |   //  (sometimes this is a good way to prevent resize loops) | 
|---|
| 1989 |   var _timer; | 
|---|
| 1990 |   addResize(function() { | 
|---|
| 1991 |     if (!_timer) _timer = setTimeout(_resize, 0); | 
|---|
| 1992 |   }); | 
|---|
| 1993 | }; | 
|---|
| 1994 |  | 
|---|
| 1995 | // ========================================================================= | 
|---|
| 1996 | // ie7-oveflow.js | 
|---|
| 1997 | // ========================================================================= | 
|---|
| 1998 |  | 
|---|
| 1999 | /* --------------------------------------------------------------------- | 
|---|
| 2000 |  | 
|---|
| 2001 |   This module alters the structure of the document. | 
|---|
| 2002 |   It may adversely affect other CSS rules. Be warned. | 
|---|
| 2003 |  | 
|---|
| 2004 | --------------------------------------------------------------------- */ | 
|---|
| 2005 |  | 
|---|
| 2006 | var WRAPPER_STYLE = { | 
|---|
| 2007 |   backgroundColor: "transparent", | 
|---|
| 2008 |   backgroundImage: "none", | 
|---|
| 2009 |   backgroundPositionX: null, | 
|---|
| 2010 |   backgroundPositionY: null, | 
|---|
| 2011 |   backgroundRepeat: null, | 
|---|
| 2012 |   borderTopWidth: 0, | 
|---|
| 2013 |   borderRightWidth: 0, | 
|---|
| 2014 |   borderBottomWidth: 0, | 
|---|
| 2015 |   borderLeftStyle: "none", | 
|---|
| 2016 |   borderTopStyle: "none", | 
|---|
| 2017 |   borderRightStyle: "none", | 
|---|
| 2018 |   borderBottomStyle: "none", | 
|---|
| 2019 |   borderLeftWidth: 0, | 
|---|
| 2020 |   height: null, | 
|---|
| 2021 |   marginTop: 0, | 
|---|
| 2022 |   marginBottom: 0, | 
|---|
| 2023 |   marginRight: 0, | 
|---|
| 2024 |   marginLeft: 0, | 
|---|
| 2025 |   width: "100%" | 
|---|
| 2026 | }; | 
|---|
| 2027 |  | 
|---|
| 2028 | IE7.CSS.addRecalc("overflow", "visible", function(element) { | 
|---|
| 2029 |   // don't do this again | 
|---|
| 2030 |   if (element.parentNode.ie7_wrapped) return; | 
|---|
| 2031 |  | 
|---|
| 2032 |   // if max-height is applied, makes sure it gets applied first | 
|---|
| 2033 |   if (IE7.Layout && element.currentStyle["max-height"] != "auto") { | 
|---|
| 2034 |     IE7.Layout.maxHeight(element); | 
|---|
| 2035 |   } | 
|---|
| 2036 |  | 
|---|
| 2037 |   if (element.currentStyle.marginLeft == "auto") element.style.marginLeft = 0; | 
|---|
| 2038 |   if (element.currentStyle.marginRight == "auto") element.style.marginRight = 0; | 
|---|
| 2039 |  | 
|---|
| 2040 |   var wrapper = document.createElement(ANON); | 
|---|
| 2041 |   wrapper.ie7_wrapped = element; | 
|---|
| 2042 |   for (var propertyName in WRAPPER_STYLE) { | 
|---|
| 2043 |     wrapper.style[propertyName] = element.currentStyle[propertyName]; | 
|---|
| 2044 |     if (WRAPPER_STYLE[propertyName] != null) { | 
|---|
| 2045 |       element.runtimeStyle[propertyName] = WRAPPER_STYLE[propertyName]; | 
|---|
| 2046 |     } | 
|---|
| 2047 |   } | 
|---|
| 2048 |   wrapper.style.display = "block"; | 
|---|
| 2049 |   wrapper.style.position = "relative"; | 
|---|
| 2050 |   element.runtimeStyle.position = "absolute"; | 
|---|
| 2051 |   element.parentNode.insertBefore(wrapper, element); | 
|---|
| 2052 |   wrapper.appendChild(element); | 
|---|
| 2053 | }); | 
|---|
| 2054 |  | 
|---|
| 2055 | // ========================================================================= | 
|---|
| 2056 | // ie7-quirks.js | 
|---|
| 2057 | // ========================================================================= | 
|---|
| 2058 |  | 
|---|
| 2059 | function ie7Quirks() { | 
|---|
| 2060 |   var FONT_SIZES = "xx-small,x-small,small,medium,large,x-large,xx-large".split(","); | 
|---|
| 2061 |   for (var i = 0; i < FONT_SIZES.length; i++) { | 
|---|
| 2062 |     FONT_SIZES[FONT_SIZES[i]] = FONT_SIZES[i - 1] || "0.67em"; | 
|---|
| 2063 |   } | 
|---|
| 2064 |    | 
|---|
| 2065 |   IE7.CSS.addFix(/(font(-size)?\s*:\s*)([\w.-]+)/, function(match, label, size, value) { | 
|---|
| 2066 |     return label + (FONT_SIZES[value] || value); | 
|---|
| 2067 |   }); | 
|---|
| 2068 |    | 
|---|
| 2069 |   if (appVersion < 6) { | 
|---|
| 2070 |     var NEGATIVE = /^\-/, LENGTH = /(em|ex)$/i; | 
|---|
| 2071 |     var EM = /em$/i, EX = /ex$/i; | 
|---|
| 2072 |    | 
|---|
| 2073 |     getPixelValue = function(element, value) { | 
|---|
| 2074 |       if (PIXEL.test(value)) return parseInt(value)||0; | 
|---|
| 2075 |       var scale = NEGATIVE.test(value)? -1 : 1; | 
|---|
| 2076 |       if (LENGTH.test(value)) scale *= getFontScale(element); | 
|---|
| 2077 |       temp.style.width = (scale < 0) ? value.slice(1) : value; | 
|---|
| 2078 |       body.appendChild(temp); | 
|---|
| 2079 |       // retrieve pixel width | 
|---|
| 2080 |       value = scale * temp.offsetWidth; | 
|---|
| 2081 |       // remove the temporary element | 
|---|
| 2082 |       temp.removeNode(); | 
|---|
| 2083 |       return parseInt(value); | 
|---|
| 2084 |     }; | 
|---|
| 2085 |  | 
|---|
| 2086 |     var temp = createTempElement(); | 
|---|
| 2087 |     function getFontScale(element) { | 
|---|
| 2088 |       var scale = 1; | 
|---|
| 2089 |       temp.style.fontFamily = element.currentStyle.fontFamily; | 
|---|
| 2090 |       temp.style.lineHeight = element.currentStyle.lineHeight; | 
|---|
| 2091 |       //temp.style.fontSize = ""; | 
|---|
| 2092 |       while (element != body) { | 
|---|
| 2093 |         var fontSize = element.currentStyle["ie7-font-size"]; | 
|---|
| 2094 |         if (fontSize) { | 
|---|
| 2095 |           if (EM.test(fontSize)) scale *= parseFloat(fontSize); | 
|---|
| 2096 |           else if (PERCENT.test(fontSize)) scale *= (parseFloat(fontSize) / 100); | 
|---|
| 2097 |           else if (EX.test(fontSize)) scale *= (parseFloat(fontSize) / 2); | 
|---|
| 2098 |           else { | 
|---|
| 2099 |             temp.style.fontSize = fontSize; | 
|---|
| 2100 |             return 1; | 
|---|
| 2101 |           } | 
|---|
| 2102 |         } | 
|---|
| 2103 |         element = element.parentElement; | 
|---|
| 2104 |       } | 
|---|
| 2105 |       return scale; | 
|---|
| 2106 |     }; | 
|---|
| 2107 |  | 
|---|
| 2108 |     // cursor:pointer (IE5.x) | 
|---|
| 2109 |     IE7.CSS.addFix(/cursor\s*:\s*pointer/, "cursor:hand"); | 
|---|
| 2110 |     // display:list-item (IE5.x) | 
|---|
| 2111 |     IE7.CSS.addFix(/display\s*:\s*list-item/, "display:block"); | 
|---|
| 2112 |   } | 
|---|
| 2113 |    | 
|---|
| 2114 |   // ----------------------------------------------------------------------- | 
|---|
| 2115 |   //  margin:auto | 
|---|
| 2116 |   // ----------------------------------------------------------------------- | 
|---|
| 2117 |    | 
|---|
| 2118 |   function fixMargin(element) { | 
|---|
| 2119 |     if (appVersion < 5.5) IE7.Layout.boxSizing(element.parentElement); | 
|---|
| 2120 |     var parent = element.parentElement; | 
|---|
| 2121 |     var margin = parent.offsetWidth - element.offsetWidth - getPaddingWidth(parent); | 
|---|
| 2122 |     var autoRight = (element.currentStyle["ie7-margin"] && element.currentStyle.marginRight == "auto") || | 
|---|
| 2123 |       element.currentStyle["ie7-margin-right"] == "auto"; | 
|---|
| 2124 |     switch (parent.currentStyle.textAlign) { | 
|---|
| 2125 |       case "right": | 
|---|
| 2126 |         margin = autoRight ? parseInt(margin / 2) : 0; | 
|---|
| 2127 |         element.runtimeStyle.marginRight = margin + "px"; | 
|---|
| 2128 |         break; | 
|---|
| 2129 |       case "center": | 
|---|
| 2130 |         if (autoRight) margin = 0; | 
|---|
| 2131 |       default: | 
|---|
| 2132 |         if (autoRight) margin /= 2; | 
|---|
| 2133 |         element.runtimeStyle.marginLeft = parseInt(margin) + "px"; | 
|---|
| 2134 |     } | 
|---|
| 2135 |   }; | 
|---|
| 2136 |  | 
|---|
| 2137 |   function getPaddingWidth(element) { | 
|---|
| 2138 |     return getPixelValue(element, element.currentStyle.paddingLeft) + | 
|---|
| 2139 |       getPixelValue(element, element.currentStyle.paddingRight); | 
|---|
| 2140 |   }; | 
|---|
| 2141 |    | 
|---|
| 2142 |   IE7.CSS.addRecalc("margin(-left|-right)?", "[^};]*auto", function(element) { | 
|---|
| 2143 |     if (register(fixMargin, element, | 
|---|
| 2144 |       element.parentElement && | 
|---|
| 2145 |       element.currentStyle.display == "block" && | 
|---|
| 2146 |       element.currentStyle.marginLeft == "auto" && | 
|---|
| 2147 |       element.currentStyle.position != "absolute")) { | 
|---|
| 2148 |         fixMargin(element); | 
|---|
| 2149 |     } | 
|---|
| 2150 |   }); | 
|---|
| 2151 |    | 
|---|
| 2152 |   addResize(function() { | 
|---|
| 2153 |     for (var i in fixMargin.elements) { | 
|---|
| 2154 |       var element = fixMargin.elements[i]; | 
|---|
| 2155 |       element.runtimeStyle.marginLeft = | 
|---|
| 2156 |       element.runtimeStyle.marginRight = ""; | 
|---|
| 2157 |       fixMargin(element); | 
|---|
| 2158 |     } | 
|---|
| 2159 |   }); | 
|---|
| 2160 | }; | 
|---|
| 2161 |  | 
|---|
| 2162 |  | 
|---|
| 2163 | // ========================================================================= | 
|---|
| 2164 | // ie8-cssQuery.js | 
|---|
| 2165 | // ========================================================================= | 
|---|
| 2166 |  | 
|---|
| 2167 | IE7._isEmpty = function(element) { | 
|---|
| 2168 |   element = element.firstChild; | 
|---|
| 2169 |   while (element) { | 
|---|
| 2170 |     if (element.nodeType == 3 || (element.nodeType == 1 && element.nodeName != "!")) return false; | 
|---|
| 2171 |     element = element.nextSibling; | 
|---|
| 2172 |   } | 
|---|
| 2173 |   return true; | 
|---|
| 2174 | }; | 
|---|
| 2175 |  | 
|---|
| 2176 | IE7._isLang = function(element, code) { | 
|---|
| 2177 |   while (element && !element.getAttribute("lang")) element = element.parentNode; | 
|---|
| 2178 |   return element && new RegExp("^" + rescape(code), "i").test(element.getAttribute("lang")); | 
|---|
| 2179 | }; | 
|---|
| 2180 |  | 
|---|
| 2181 | function _nthChild(match, args, position, last) { | 
|---|
| 2182 |   // ugly but it works... | 
|---|
| 2183 |   last = /last/i.test(match) ? last + "+1-" : ""; | 
|---|
| 2184 |   if (!isNaN(args)) args = "0n+" + args; | 
|---|
| 2185 |   else if (args == "even") args = "2n"; | 
|---|
| 2186 |   else if (args == "odd") args = "2n+1"; | 
|---|
| 2187 |   args = args.split("n"); | 
|---|
| 2188 |   var a = args[0] ? (args[0] == "-") ? -1 : parseInt(args[0]) : 1; | 
|---|
| 2189 |   var b = parseInt(args[1]) || 0; | 
|---|
| 2190 |   var negate = a < 0; | 
|---|
| 2191 |   if (negate) { | 
|---|
| 2192 |     a = -a; | 
|---|
| 2193 |     if (a == 1) b++; | 
|---|
| 2194 |   } | 
|---|
| 2195 |   var query = format(a == 0 ? "%3%7" + (last + b) : "(%4%3-%2)%6%1%70%5%4%3>=%2", a, b, position, last, "&&", "%", "=="); | 
|---|
| 2196 |   if (negate) query = "!(" + query + ")"; | 
|---|
| 2197 |   return query; | 
|---|
| 2198 | }; | 
|---|
| 2199 |  | 
|---|
| 2200 | _PSEUDO_CLASSES = { | 
|---|
| 2201 |   "link":          "e%1.currentStyle['ie7-link']=='link'", | 
|---|
| 2202 |   "visited":       "e%1.currentStyle['ie7-link']=='visited'", | 
|---|
| 2203 |   "checked":       "e%1.checked", | 
|---|
| 2204 |   "contains":      "e%1.innerText.indexOf('%2')!=-1", | 
|---|
| 2205 |   "disabled":      "e%1.isDisabled", | 
|---|
| 2206 |   "empty":         "IE7._isEmpty(e%1)", | 
|---|
| 2207 |   "enabled":       "e%1.disabled===false", | 
|---|
| 2208 |   "first-child":   "!IE7._getPreviousElementSibling(e%1)", | 
|---|
| 2209 |   "lang":          "IE7._isLang(e%1,'%2')", | 
|---|
| 2210 |   "last-child":    "!IE7._getNextElementSibling(e%1)", | 
|---|
| 2211 |   "only-child":    "!IE7._getPreviousElementSibling(e%1)&&!IE7._getNextElementSibling(e%1)", | 
|---|
| 2212 |   "target":        "e%1.id==location.hash.slice(1)", | 
|---|
| 2213 |   "indeterminate": "e%1.indeterminate" | 
|---|
| 2214 | }; | 
|---|
| 2215 |  | 
|---|
| 2216 |  | 
|---|
| 2217 | // register a node and index its children | 
|---|
| 2218 | IE7._register = function(element) { | 
|---|
| 2219 |   if (element.rows) { | 
|---|
| 2220 |     element.ie7_length = element.rows.length; | 
|---|
| 2221 |     element.ie7_lookup = "rowIndex"; | 
|---|
| 2222 |   } else if (element.cells) { | 
|---|
| 2223 |     element.ie7_length = element.cells.length; | 
|---|
| 2224 |     element.ie7_lookup = "cellIndex"; | 
|---|
| 2225 |   } else if (element.ie7_indexed != IE7._indexed) { | 
|---|
| 2226 |     var index = 0; | 
|---|
| 2227 |     var child = element.firstChild; | 
|---|
| 2228 |     while (child) { | 
|---|
| 2229 |       if (child.nodeType == 1 && child.nodeName != "!") { | 
|---|
| 2230 |         child.ie7_index = ++index; | 
|---|
| 2231 |       } | 
|---|
| 2232 |       child = child.nextSibling; | 
|---|
| 2233 |     } | 
|---|
| 2234 |     element.ie7_length = index; | 
|---|
| 2235 |     element.ie7_lookup = "ie7_index"; | 
|---|
| 2236 |   } | 
|---|
| 2237 |   element.ie7_indexed = IE7._indexed; | 
|---|
| 2238 |   return element; | 
|---|
| 2239 | }; | 
|---|
| 2240 |  | 
|---|
| 2241 | var keys = cssParser[_KEYS]; | 
|---|
| 2242 | var pseudoClass = keys[keys.length - 1]; | 
|---|
| 2243 | keys.length--; | 
|---|
| 2244 |  | 
|---|
| 2245 | cssParser.merge({ | 
|---|
| 2246 |   ":not\\((\\*|[\\w-]+)?([^)]*)\\)": function(match, tagName, filters) { // :not pseudo class | 
|---|
| 2247 |     var replacement = (tagName && tagName != "*") ? format("if(e%1.nodeName=='%2'){", _index, tagName.toUpperCase()) : ""; | 
|---|
| 2248 |     replacement += cssParser.exec(filters); | 
|---|
| 2249 |     return "if(!" + replacement.slice(2, -1).replace(/\)\{if\(/g, "&&") + "){"; | 
|---|
| 2250 |   }, | 
|---|
| 2251 |    | 
|---|
| 2252 |   ":nth(-last)?-child\\(([^)]+)\\)": function(match, last, args) { // :nth-child pseudo classes | 
|---|
| 2253 |     _wild = false; | 
|---|
| 2254 |     last = format("e%1.parentNode.ie7_length", _index); | 
|---|
| 2255 |     var replacement = "if(p%1!==e%1.parentNode)p%1=IE7._register(e%1.parentNode);"; | 
|---|
| 2256 |     replacement += "var i=e%1[p%1.ie7_lookup];if(p%1.ie7_lookup!='ie7_index')i++;if("; | 
|---|
| 2257 |     return format(replacement, _index) + _nthChild(match, args, "i", last) + "){"; | 
|---|
| 2258 |   } | 
|---|
| 2259 | }); | 
|---|
| 2260 |  | 
|---|
| 2261 | keys.push(pseudoClass); | 
|---|
| 2262 |  | 
|---|
| 2263 | // ========================================================================= | 
|---|
| 2264 | // ie8-css.js | 
|---|
| 2265 | // ========================================================================= | 
|---|
| 2266 |  | 
|---|
| 2267 | var BRACKETS = "\\([^)]*\\)"; | 
|---|
| 2268 |  | 
|---|
| 2269 | if (IE7.CSS.pseudoClasses) IE7.CSS.pseudoClasses += "|"; | 
|---|
| 2270 | IE7.CSS.pseudoClasses += "before|after|last\\-child|only\\-child|empty|root|" + | 
|---|
| 2271 |   "not|nth\\-child|nth\\-last\\-child|contains|lang".split("|").join(BRACKETS + "|") + BRACKETS; | 
|---|
| 2272 |  | 
|---|
| 2273 | // pseudo-elements can be declared with a double colon | 
|---|
| 2274 | encoder.add(/::/, ":"); | 
|---|
| 2275 |  | 
|---|
| 2276 | // ----------------------------------------------------------------------- | 
|---|
| 2277 | // dynamic pseudo-classes | 
|---|
| 2278 | // ----------------------------------------------------------------------- | 
|---|
| 2279 |  | 
|---|
| 2280 | var Focus = new DynamicPseudoClass("focus", function(element) { | 
|---|
| 2281 |   var instance = arguments; | 
|---|
| 2282 |    | 
|---|
| 2283 |   IE7.CSS.addEventHandler(element, "onfocus", function() { | 
|---|
| 2284 |     Focus.unregister(instance); // in case it starts with focus | 
|---|
| 2285 |     Focus.register(instance); | 
|---|
| 2286 |   }); | 
|---|
| 2287 |    | 
|---|
| 2288 |   IE7.CSS.addEventHandler(element, "onblur", function() { | 
|---|
| 2289 |     Focus.unregister(instance); | 
|---|
| 2290 |   }); | 
|---|
| 2291 |    | 
|---|
| 2292 |   // check the active element for initial state | 
|---|
| 2293 |   if (element == document.activeElement) { | 
|---|
| 2294 |     Focus.register(instance) | 
|---|
| 2295 |   } | 
|---|
| 2296 | }); | 
|---|
| 2297 |  | 
|---|
| 2298 | var Active = new DynamicPseudoClass("active", function(element) { | 
|---|
| 2299 |   var instance = arguments; | 
|---|
| 2300 |   IE7.CSS.addEventHandler(element, "onmousedown", function() { | 
|---|
| 2301 |     Active.register(instance); | 
|---|
| 2302 |   }); | 
|---|
| 2303 | }); | 
|---|
| 2304 |  | 
|---|
| 2305 | // globally trap the mouseup event (thanks Martijn!) | 
|---|
| 2306 | addEventHandler(document, "onmouseup", function() { | 
|---|
| 2307 |   var instances = Active.instances; | 
|---|
| 2308 |   for (var i in instances) Active.unregister(instances[i]); | 
|---|
| 2309 | }); | 
|---|
| 2310 |  | 
|---|
| 2311 | // :checked | 
|---|
| 2312 | var Checked = new DynamicPseudoClass("checked", function(element) { | 
|---|
| 2313 |   if (typeof element.checked != "boolean") return; | 
|---|
| 2314 |   var instance = arguments; | 
|---|
| 2315 |   IE7.CSS.addEventHandler(element, "onpropertychange", function() { | 
|---|
| 2316 |     if (event.propertyName == "checked") { | 
|---|
| 2317 |       if (element.checked) Checked.register(instance); | 
|---|
| 2318 |       else Checked.unregister(instance); | 
|---|
| 2319 |     } | 
|---|
| 2320 |   }); | 
|---|
| 2321 |   // check current checked state | 
|---|
| 2322 |   if (element.checked) Checked.register(instance); | 
|---|
| 2323 | }); | 
|---|
| 2324 |  | 
|---|
| 2325 | // :enabled | 
|---|
| 2326 | var Enabled = new DynamicPseudoClass("enabled", function(element) { | 
|---|
| 2327 |   if (typeof element.disabled != "boolean") return; | 
|---|
| 2328 |   var instance = arguments; | 
|---|
| 2329 |   IE7.CSS.addEventHandler(element, "onpropertychange", function() { | 
|---|
| 2330 |     if (event.propertyName == "disabled") { | 
|---|
| 2331 |       if (!element.isDisabled) Enabled.register(instance); | 
|---|
| 2332 |       else Enabled.unregister(instance); | 
|---|
| 2333 |     } | 
|---|
| 2334 |   }); | 
|---|
| 2335 |   // check current disabled state | 
|---|
| 2336 |   if (!element.isDisabled) Enabled.register(instance); | 
|---|
| 2337 | }); | 
|---|
| 2338 |  | 
|---|
| 2339 | // :disabled | 
|---|
| 2340 | var Disabled = new DynamicPseudoClass("disabled", function(element) { | 
|---|
| 2341 |   if (typeof element.disabled != "boolean") return; | 
|---|
| 2342 |   var instance = arguments; | 
|---|
| 2343 |   IE7.CSS.addEventHandler(element, "onpropertychange", function() { | 
|---|
| 2344 |     if (event.propertyName == "disabled") { | 
|---|
| 2345 |       if (element.isDisabled) Disabled.register(instance); | 
|---|
| 2346 |       else Disabled.unregister(instance); | 
|---|
| 2347 |     } | 
|---|
| 2348 |   }); | 
|---|
| 2349 |   // check current disabled state | 
|---|
| 2350 |   if (element.isDisabled) Disabled.register(instance); | 
|---|
| 2351 | }); | 
|---|
| 2352 |  | 
|---|
| 2353 | // :indeterminate (Kevin Newman) | 
|---|
| 2354 | var Indeterminate = new DynamicPseudoClass("indeterminate", function(element) { | 
|---|
| 2355 |   if (typeof element.indeterminate != "boolean") return; | 
|---|
| 2356 |   var instance = arguments; | 
|---|
| 2357 |   IE7.CSS.addEventHandler(element, "onpropertychange", function() { | 
|---|
| 2358 |     if (event.propertyName == "indeterminate") { | 
|---|
| 2359 |       if (element.indeterminate) Indeterminate.register(instance); | 
|---|
| 2360 |       else Indeterminate.unregister(instance); | 
|---|
| 2361 |     } | 
|---|
| 2362 |   }); | 
|---|
| 2363 |   IE7.CSS.addEventHandler(element, "onclick", function() { | 
|---|
| 2364 |     Indeterminate.unregister(instance); | 
|---|
| 2365 |   }); | 
|---|
| 2366 |   // clever Kev says no need to check this up front | 
|---|
| 2367 | }); | 
|---|
| 2368 |  | 
|---|
| 2369 | // :target | 
|---|
| 2370 | var Target = new DynamicPseudoClass("target", function(element) { | 
|---|
| 2371 |   var instance = arguments; | 
|---|
| 2372 |   // if an element has a tabIndex then it can become "active". | 
|---|
| 2373 |   //  The default is zero anyway but it works... | 
|---|
| 2374 |   if (!element.tabIndex) element.tabIndex = 0; | 
|---|
| 2375 |   // this doesn't detect the back button. I don't know how to do that :-( | 
|---|
| 2376 |   IE7.CSS.addEventHandler(document, "onpropertychange", function() { | 
|---|
| 2377 |     if (event.propertyName == "activeElement") { | 
|---|
| 2378 |       if (element.id && element.id == location.hash.slice(1)) Target.register(instance); | 
|---|
| 2379 |       else Target.unregister(instance); | 
|---|
| 2380 |     } | 
|---|
| 2381 |   }); | 
|---|
| 2382 |   // check the current location | 
|---|
| 2383 |   if (element.id && element.id == location.hash.slice(1)) Target.register(instance); | 
|---|
| 2384 | }); | 
|---|
| 2385 |  | 
|---|
| 2386 | // ----------------------------------------------------------------------- | 
|---|
| 2387 | // IE7 pseudo elements | 
|---|
| 2388 | // ----------------------------------------------------------------------- | 
|---|
| 2389 |  | 
|---|
| 2390 | // constants | 
|---|
| 2391 | var ATTR = /^attr/; | 
|---|
| 2392 | var URL = /^url\s*\(\s*([^)]*)\)$/; | 
|---|
| 2393 | var POSITION_MAP = { | 
|---|
| 2394 |   before0: "beforeBegin", | 
|---|
| 2395 |   before1: "afterBegin", | 
|---|
| 2396 |   after0: "afterEnd", | 
|---|
| 2397 |   after1: "beforeEnd" | 
|---|
| 2398 | }; | 
|---|
| 2399 |  | 
|---|
| 2400 | var PseudoElement = IE7.PseudoElement = Rule.extend({ | 
|---|
| 2401 |   constructor: function(selector, position, cssText) { | 
|---|
| 2402 |     // initialise object properties | 
|---|
| 2403 |     this.position = position; | 
|---|
| 2404 |     var content = cssText.match(PseudoElement.CONTENT), match, entity; | 
|---|
| 2405 |     if (content) { | 
|---|
| 2406 |       content = content[1]; | 
|---|
| 2407 |       match = content.split(/\s+/); | 
|---|
| 2408 |       for (var i = 0; (entity = match[i]); i++) { | 
|---|
| 2409 |         match[i] = ATTR.test(entity) ? {attr: entity.slice(5, -1)} : | 
|---|
| 2410 |           (entity.charAt(0) == "'") ? getString(entity) : decode(entity); | 
|---|
| 2411 |       } | 
|---|
| 2412 |       content = match; | 
|---|
| 2413 |     } | 
|---|
| 2414 |     this.content = content; | 
|---|
| 2415 |     // CSS text needs to be decoded immediately | 
|---|
| 2416 |     this.base(selector, decode(cssText)); | 
|---|
| 2417 |   }, | 
|---|
| 2418 |    | 
|---|
| 2419 |   init: function() { | 
|---|
| 2420 |     // execute the underlying css query for this class | 
|---|
| 2421 |     this.match = cssQuery(this.selector); | 
|---|
| 2422 |     for (var i = 0; i < this.match.length; i++) { | 
|---|
| 2423 |       var runtimeStyle = this.match[i].runtimeStyle; | 
|---|
| 2424 |       if (!runtimeStyle[this.position]) runtimeStyle[this.position] = {cssText:""}; | 
|---|
| 2425 |       runtimeStyle[this.position].cssText += ";" + this.cssText; | 
|---|
| 2426 |       if (this.content != null) runtimeStyle[this.position].content = this.content; | 
|---|
| 2427 |     } | 
|---|
| 2428 |   }, | 
|---|
| 2429 |    | 
|---|
| 2430 |   create: function(target) { | 
|---|
| 2431 |     var generated = target.runtimeStyle[this.position]; | 
|---|
| 2432 |     if (generated) { | 
|---|
| 2433 |       // copy the array of values | 
|---|
| 2434 |       var content = [].concat(generated.content || ""); | 
|---|
| 2435 |       for (var j = 0; j < content.length; j++) { | 
|---|
| 2436 |         if (typeof content[j] == "object") { | 
|---|
| 2437 |           content[j] = target.getAttribute(content[j].attr); | 
|---|
| 2438 |         } | 
|---|
| 2439 |       } | 
|---|
| 2440 |       content = content.join(""); | 
|---|
| 2441 |       var url = content.match(URL); | 
|---|
| 2442 |       var cssText = "overflow:hidden;" + generated.cssText.replace(/'/g, '"'); | 
|---|
| 2443 |       if (target.currentStyle.styleFloat != "none") { | 
|---|
| 2444 |         //cssText = cssText.replace(/display\s*:\s*block/, "display:inline-block"); | 
|---|
| 2445 |       } | 
|---|
| 2446 |       var position = POSITION_MAP[this.position + Number(target.canHaveChildren)]; | 
|---|
| 2447 |       var id = 'ie7_pseudo' + PseudoElement.count++; | 
|---|
| 2448 |       target.insertAdjacentHTML(position, format(PseudoElement.ANON, this.className, id, cssText, url ? "" : content)); | 
|---|
| 2449 |       if (url) { | 
|---|
| 2450 |         var pseudoElement = document.getElementById(id); | 
|---|
| 2451 |         pseudoElement.src = getString(url[1]); | 
|---|
| 2452 |         addFilter(pseudoElement, "crop"); | 
|---|
| 2453 |       } | 
|---|
| 2454 |       target.runtimeStyle[this.position] = null; | 
|---|
| 2455 |     } | 
|---|
| 2456 |   }, | 
|---|
| 2457 |    | 
|---|
| 2458 |   recalc: function() { | 
|---|
| 2459 |     if (this.content == null) return; | 
|---|
| 2460 |     for (var i = 0; i < this.match.length; i++) { | 
|---|
| 2461 |       this.create(this.match[i]); | 
|---|
| 2462 |     } | 
|---|
| 2463 |   }, | 
|---|
| 2464 |  | 
|---|
| 2465 |   toString: function() { | 
|---|
| 2466 |     return "." + this.className + "{display:inline}"; | 
|---|
| 2467 |   } | 
|---|
| 2468 | }, {   | 
|---|
| 2469 |   CONTENT: /content\s*:\s*([^;]*)(;|$)/, | 
|---|
| 2470 |   ANON: "<ie7:! class='ie7_anon %1' id=%2 style='%3'>%4</ie7:!>", | 
|---|
| 2471 |   MATCH: /(.*):(before|after).*/, | 
|---|
| 2472 |    | 
|---|
| 2473 |   count: 0 | 
|---|
| 2474 | }); | 
|---|
| 2475 |  | 
|---|
| 2476 | // ========================================================================= | 
|---|
| 2477 | // ie8-html.js | 
|---|
| 2478 | // ========================================================================= | 
|---|
| 2479 |  | 
|---|
| 2480 | var UNSUCCESSFUL = /^(submit|reset|button)$/; | 
|---|
| 2481 |  | 
|---|
| 2482 | // ----------------------------------------------------------------------- | 
|---|
| 2483 | // <button> | 
|---|
| 2484 | // ----------------------------------------------------------------------- | 
|---|
| 2485 |  | 
|---|
| 2486 | // IE bug means that innerText is submitted instead of "value" | 
|---|
| 2487 | IE7.HTML.addRecalc("button,input", function(button) { | 
|---|
| 2488 |   if (button.tagName == "BUTTON") { | 
|---|
| 2489 |     var match = button.outerHTML.match(/ value="([^"]*)"/i); | 
|---|
| 2490 |     button.runtimeStyle.value = (match) ? match[1] : ""; | 
|---|
| 2491 |   } | 
|---|
| 2492 |   // flag the button/input that was used to submit the form | 
|---|
| 2493 |   if (button.type == "submit") { | 
|---|
| 2494 |     addEventHandler(button, "onclick", function() { | 
|---|
| 2495 |       button.runtimeStyle.clicked = true; | 
|---|
| 2496 |       setTimeout("document.all." + button.uniqueID + ".runtimeStyle.clicked=false", 1); | 
|---|
| 2497 |     }); | 
|---|
| 2498 |   } | 
|---|
| 2499 | }); | 
|---|
| 2500 |  | 
|---|
| 2501 | // ----------------------------------------------------------------------- | 
|---|
| 2502 | // <form> | 
|---|
| 2503 | // ----------------------------------------------------------------------- | 
|---|
| 2504 |  | 
|---|
| 2505 | // only submit "successful controls | 
|---|
| 2506 | IE7.HTML.addRecalc("form", function(form) { | 
|---|
| 2507 |   addEventHandler(form, "onsubmit", function() { | 
|---|
| 2508 |     for (var element, i = 0; element = form[i]; i++) { | 
|---|
| 2509 |       if (UNSUCCESSFUL.test(element.type) && !element.disabled && !element.runtimeStyle.clicked) { | 
|---|
| 2510 |         element.disabled = true; | 
|---|
| 2511 |         setTimeout("document.all." + element.uniqueID + ".disabled=false", 1); | 
|---|
| 2512 |       } else if (element.tagName == "BUTTON" && element.type == "submit") { | 
|---|
| 2513 |         setTimeout("document.all." + element.uniqueID + ".value='" + | 
|---|
| 2514 |           element.value + "'", 1); | 
|---|
| 2515 |         element.value = element.runtimeStyle.value; | 
|---|
| 2516 |       } | 
|---|
| 2517 |     } | 
|---|
| 2518 |   }); | 
|---|
| 2519 | }); | 
|---|
| 2520 |  | 
|---|
| 2521 | // ----------------------------------------------------------------------- | 
|---|
| 2522 | // <img> | 
|---|
| 2523 | // ----------------------------------------------------------------------- | 
|---|
| 2524 |  | 
|---|
| 2525 | // get rid of the spurious tooltip produced by the alt attribute on images | 
|---|
| 2526 | IE7.HTML.addRecalc("img", function(img) { | 
|---|
| 2527 |   if (img.alt && !img.title) img.title = ""; | 
|---|
| 2528 | }); | 
|---|
| 2529 |  | 
|---|
| 2530 | // ========================================================================= | 
|---|
| 2531 | // ie8-layout.js | 
|---|
| 2532 | // ========================================================================= | 
|---|
| 2533 |  | 
|---|
| 2534 | IE7.CSS.addRecalc("border-spacing", NUMERIC, function(element) { | 
|---|
| 2535 |   if (element.currentStyle.borderCollapse != "collapse") { | 
|---|
| 2536 |     element.cellSpacing = getPixelValue(element, element.currentStyle["border-spacing"]); | 
|---|
| 2537 |   } | 
|---|
| 2538 | }); | 
|---|
| 2539 | IE7.CSS.addRecalc("box-sizing", "content-box", IE7.Layout.boxSizing); | 
|---|
| 2540 | IE7.CSS.addRecalc("box-sizing", "border-box", IE7.Layout.borderBox); | 
|---|
| 2541 |  | 
|---|
| 2542 | // ========================================================================= | 
|---|
| 2543 | // ie8-graphics.js | 
|---|
| 2544 | // ========================================================================= | 
|---|
| 2545 |  | 
|---|
| 2546 | IE7.CSS.addFix(/opacity\s*:\s*([\d.]+)/, function(match, value) { | 
|---|
| 2547 |   return "zoom:1;filter:Alpha(opacity=" + ((value * 100) || 1) + ")"; | 
|---|
| 2548 | }); | 
|---|
| 2549 |  | 
|---|
| 2550 | // fix object[type=image/*] | 
|---|
| 2551 | var IMAGE = /^image/i; | 
|---|
| 2552 | IE7.HTML.addRecalc("object", function(element) { | 
|---|
| 2553 |   if (IMAGE.test(element.type)) { | 
|---|
| 2554 |     element.body.style.cssText = "margin:0;padding:0;border:none;overflow:hidden"; | 
|---|
| 2555 |     return element; | 
|---|
| 2556 |   } | 
|---|
| 2557 | }); | 
|---|
| 2558 |  | 
|---|
| 2559 | // ----------------------------------------------------------------------- | 
|---|
| 2560 | // initialisation | 
|---|
| 2561 | // ----------------------------------------------------------------------- | 
|---|
| 2562 |  | 
|---|
| 2563 | IE7.loaded = true; | 
|---|
| 2564 |  | 
|---|
| 2565 | (function() { | 
|---|
| 2566 |   try { | 
|---|
| 2567 |     // http://javascript.nwbox.com/IEContentLoaded/ | 
|---|
| 2568 |     documentElement.doScroll("left"); | 
|---|
| 2569 |   } catch (e) { | 
|---|
| 2570 |     setTimeout(arguments.callee, 1); | 
|---|
| 2571 |     return; | 
|---|
| 2572 |   } | 
|---|
| 2573 |   // execute the inner text of the IE7 script | 
|---|
| 2574 |   try { | 
|---|
| 2575 |     eval(script.innerHTML); | 
|---|
| 2576 |   } catch (e) { | 
|---|
| 2577 |     // ignore errors | 
|---|
| 2578 |   } | 
|---|
| 2579 |   PNG = new RegExp(rescape(typeof IE7_PNG_SUFFIX == "string" ? IE7_PNG_SUFFIX : "-trans.png") + "$", "i"); | 
|---|
| 2580 |  | 
|---|
| 2581 |   // frequently used references | 
|---|
| 2582 |   body = document.body; | 
|---|
| 2583 |   viewport = quirksMode ? body : documentElement; | 
|---|
| 2584 |  | 
|---|
| 2585 |   // classes | 
|---|
| 2586 |   body.className += " ie7_body"; | 
|---|
| 2587 |   documentElement.className += " ie7_html"; | 
|---|
| 2588 |  | 
|---|
| 2589 |   if (quirksMode) ie7Quirks(); | 
|---|
| 2590 |  | 
|---|
| 2591 |   IE7.CSS.init(); | 
|---|
| 2592 |   IE7.HTML.init(); | 
|---|
| 2593 |  | 
|---|
| 2594 |   IE7.HTML.apply(); | 
|---|
| 2595 |   IE7.CSS.apply(); | 
|---|
| 2596 |  | 
|---|
| 2597 |   IE7.recalc(); | 
|---|
| 2598 | })(); | 
|---|
| 2599 |  | 
|---|
| 2600 |  | 
|---|
| 2601 | })(); | 
|---|