IE9でもtext-shadow(再公開)

IE9にCSS3のtext-shadow(擬き)を適用させるJavaScript

textShadowForIE9、スクリーンリーダーなどアクセシビリティ面への配慮を加えた新版に書き直して再度公開です。 テストケース

以前に公開していたtextShadowForMSIEなどを利用している方はこの新版に差し替えていただけますよう強くお願い申し上げる次第です。

使用方法

CSSファイルからtext-shadowの値を自動的に読み込んで適用させていますので基本的に以下の設定をするだけでOKです。 また、手動で個別指定できるようにもしています。(後述)

  • ソースをコピーしてJavaScriptファイル(textshadow.jsなど)を作成し、HTMLから外部JavaScriptとして読み込む。
  • または、既存のJavaScriptファイルにソースをコピペして追加。

以前のスクリプトからの主な変更点

  • スクリーンリーダーでダブって読み上げられないよう、影にはWAI-ARIAのaria-hidden="true" role="presentation"をつけて出力するようにしました。
  • また、WAI-ARIAに未対応(あるいは対応が不十分)なスクリーンリーダー向けには、冒頭で「お知らせ」を通知するようにして、スクリプトの適用を解除できるようにしました。
    テストケース
    (IE9で確認ください。また、テストケースのため、スクリーンリーダー向けの通知はあえて画面上でも確認できるようにしています)
  • コピー&ペーストしても文字列がダブらないようにしました。 (クリップボードへの書き込みを制限している環境では効きません)
  • また、印刷時には影は除外する(display: none;)ようにしました。
  • スクリプトを全体的に見直したほか、'use strict';な他のスクリプトと併用・連携しても問題がないようにしました。 (IE9自体は'use strict'に未対応ですが…)

注意事項と制限事項

このスクリプトでは、text-shadowが指定されている要素のcloneNode()を作ってその要素自身の子として追加し、テキストの後ろに移動させて、あたかもCSSのtext-shadowであるかのように表示させています。 つまり、所詮は擬似的な再現です。
複数のtext-shadow値のほか、擬似クラスや擬似要素へのtext-shadowなどにも対応済みですが、text-shadowを再現できるのはIE9がサポートしているCSS3の範囲内に限られます。

W3Cの仕様とtextShadowForIE9の違い
text-shadow property textShadowForIE9
Value: none | [ <length>{2,3} && <color>? ]# <color>にはrgba()hsla()なども使えます
<color>が未定義の場合は要素自身の色を適用
<length>にはremvwなども使えます
3つめの<length>(ぼかしの半径)が省略されていた場合は0
Applies to: all elements
さらに説明書きに
applies to both the ::first-line and ::first-letter pseudo-elements
input要素などform関連部品には適用されません(ただし、button要素には適用可能)
img要素など空要素には適用されません
::first-lineや::first-letterだけでなく::before / ::after擬似要素にも適用可能(Firefoxなど他のブラウザの実装にあわせた)
Animatable: as shadow list 不可(IE9がCSS3のAnimationやTransitionには未対応なため)
  • 全てのIE9に適用されるわけではなく、ユーザーの環境に依存することにご注意下さい。
    JavaScriptが無効化されていたり、JavaScriptが有効でもIEのセキュリティ設定やセキュリティソフトなどによってMS独自実装のfilterの適用が抑制されている環境では、影は描画されません。
  • text-shadowを適用させる要素の子孫にidがあった場合、その子孫のidが重複してしまいます。
    <div>Text Shadow Me <span id="someID">with Child</span><ie-shadow class="dummyShadow">Text Shadow Me <span id="someID">with Child</span></ie-shadow></div>
    textShadowForIE9適用後に生成されるHTML断片のイメージ(styleなどは割愛)
  • 影を適用させる要素のCSSを一部変更していますので、場合によっては、サイトの表示が崩れる可能性があります。 (display: inline;display: inline-block;に変更、position: static;position: relative;に変更など)
  • IE11やIE10のIE9エミュレートモードでの表示は、IE9そのものの表示と若干異なります。
    これに起因して、例えば::beforeや::first-letterなど擬似要素に影を適用させている場合、IE9エミュレートモードでは影の位置がずれて表示が乱れる可能性が高いです。
    <meta http-equiv="x-ua-compatible" content="IE=EmulateIE9" /> など、サイトにIE9互換モードを指定している場合などはご注意下さい。
  • CSS上でtext-shadowの値に!importantを指定していてもその!important指定は反映されません。 (IE9では未知のCSSプロパティのgetPropertyPriority()の値をうまく取得できないため)
    別途、個別指定してください。(個別指定では!importantは有効です)
  • input要素やtextaria要素などフォーム部品に影は適用されません。(一応、button要素なら影がつけられます)
    また、:disabledや:checkedなどフォーム関連の擬似クラスでの表示に関しては未検証です。
  • ::beforeなど疑似要素のみに影を適用させたい場合は、要素本体にもtext-shadow: none;の指定が必要です。
    また、擬似要素に背景画があると影を描画しません。(影が背景の裏に回ってしまうため)
  • 影はDOMContentLoadedのタイミングで描画しています。 このため、Ajaxなど、遅延処理によって挿入または変更されたテキストには、そのままでは影は適用されません。 遅延処理を行っている関数内であらためてtextShadowForIE9を呼び出す必要があります。 (下記の「他のスクリプトとの連携方法」を参照)
  • 動作対象はIE9(もしくはIE9エミュレート)のみです。
    IE8以下に対応させる予定はありません。 また、IE9のQuirksモードでも動きません。
  • 例によって、きっとまだまだバグがありますw
    バグの報告や疑問点などありましたらコメント欄などでお気軽にどうぞ

手動による個別指定方法

  • ieShadowSettings()関数内で影を適用したいセレクタと影の値について、 { sel : 'セレクタ', shadow : '影の値' }, { sel : 'セレクタ2', shadow : '影の値2' } といった形で記述してください。
  • セレクタ、影の値ともに、引用符で文字列の前後を括ってください。
  • また、個別設定を追加する場合は末尾にカンマを付けて繋げて下さい。
  • CSSと同様、カスケードします。(下に書かれた値で上書きして適用)
  • セレクタの記述方法はCSS3のSelectorsと同様です。
  • また、影の値の指定方法もCSS3のText Shadowsと同様です。
    なお、影の色指定で「#nnnnnn」「#nnn」の形式で値の先頭に書くと、よくわからないIEのバグで影の位置がずれます。
    この場合は影を適用しないよう除外していますのでご注意ください。 (CSSファイルからの自動読み込みの場合は、補正して適用させていますので問題ありません)

他のスクリプトとの連携方法

  • 連携させたい関数から、textShadowForIE9({ sel : '#id(適用させたい要素のid)', shadow : '新たな影の値' });と引数付きで渡してtextShadowForIE9呼ぶことで、その関数と連携させて影を変化させることができます。
  • 引数の中で指定できるのはid形など1つのターゲットに限られるのでご注意ください。
  • 複数のターゲットを連携させたい場合は、for文で回すなどして、その都度、textShadowForIE9を呼んで下さい。
  • あるいは、引数無しで呼ぶこともできますが、その場合、全てのtext-shadowが再描画されます。

スクリプトソース(最終更新:2015/1/6)


/**
*   text-shadow for IE9
*   IE9にCSS3のtext-shadow(擬き)を適用させるJavaScript
*   JavaScript polyfill to apply CSS3 text-shadow effect for Internet Explorer 9
*   Copyright (c) 2014-2015 Kazz
*   http://asamuzak.jp
*   Dual licensed under MIT or GPL
*   http://asamuzak.jp/license
*/

function textShadowForIE9(eObj) {
    'use strict';
    var _doc = document;
    if(_doc.documentMode === 9) {
        var ieShadowSettings = function() {
            var arr = [];
            if(!eObj) {
                arr = [
                    // ここ(arr = [];内)にtext-shadowを適用させるセレクタの配列を記述
                    // セレクタ毎に「カンマ区切り」で配列を追加(カンマを忘れるとエラー発生)
                    // Write your text-shadow settings here, like below.
                    // { sel: 'h1', shadow: '2px 2px 2px gray' },
                    // { sel: 'em', shadow: '1px 1px 1px rgb(0, 100, 100) !important' }
                ];
                for(var _$, reg = /text\-shadow\s*:\s*([0-9a-zA-Z\s\-\+\*&#\.\(\)%,!"'><\\]+);?/, elm = _doc.getElementsByTagName('*'), i = 0, l = elm.length; i < l; i++) {
                    elm[i].style && (_$ = elm[i].style.cssText.match(reg)) && (elm[i].id === '' && (elm[i].id = 'oId' + _cNum()), arr[arr.length] = { sel: '#' + elm[i].id, shadow: _$[1] });
                }
                return cssShadowValues().concat(arr);
            }
            else {
                _doc.querySelector(eObj.sel) && _doc.querySelector(eObj.sel).hasAttribute('data-pseudo') && (eObj.shadow = eObj.shadow.replace(/none/, '0 0 transparent'));
                arr[arr.length] = eObj;
                return arr;
            }
        };
        var getCompStyle = function(obj, pseudo) {
            return _doc.defaultView.getComputedStyle(obj, pseudo ? pseudo : '');
        };
        var getGeneralObj = function(obj) {
            var arr = [];
            for((obj = obj.previousSibling) && obj.nodeType === 1 && (arr[arr.length] = obj); obj;) {
                (obj = obj.previousSibling) && obj.nodeType === 1 && (arr[arr.length] = obj);
            }
            return arr;
        };
        var getAncestObj = function(obj) {
            var arr = [];
            if(obj.parentNode) {
                for(obj = obj.parentNode, arr[arr.length] = obj; obj.nodeName.toLowerCase() !== _doc.documentElement.nodeName.toLowerCase();) {
                    (obj = obj.parentNode) && (arr[arr.length] = obj);
                }
            }
            return arr;
        };
        var convUnitToPx = function(sUnit, obj, pseudo) {
            var getUnitRatio = function(q) {
                var _$, elm = _doc.createElement('div');
                elm.id = 'dDiv' + _cNum();
                elm.style.height = 0;
                elm.style.width = q;
                elm.style.visibility = 'hidden';
                _body.appendChild(elm);
                _$ = elm.offsetWidth;
                _body.removeChild(elm);
                return _$;
            };
            var _$ = sUnit.match(/^(\-?[0-9]+(?:\.[0-9]+)?)(v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%)?$/);
            if(!_$) { return; }
            var n = _$[1] * 1, u = _$[2] || null, v;
            if(n !== 0 && !u) { return; }
            if(n === 0 || u === 'px') { return n; }
            v = /^(?:(?:[cm]|re)m|p[ct]|v[hw]|in)$/.test(u) ? getUnitRatio(Math.abs(n) + u) : /^(?:e[mx]|ch)$/.test(u) ? getUnitRatio(Math.abs(n) + u) / getUnitRatio('1em') * getUnitRatio(getCompStyle(obj, pseudo ? pseudo : '').fontSize) : /^vm(?:in)?$/.test(u) ? Math.min(getUnitRatio(Math.abs(n) + 'vw'), getUnitRatio(Math.abs(n) + 'vh')) : u === 'vmax' ? Math.max(getUnitRatio(Math.abs(n) + 'vw'), getUnitRatio(Math.abs(n) + 'vh')) : u === '%' && getUnitRatio(getCompStyle(obj, pseudo ? pseudo : '').width) * n / 100;
            return n >= 0 ? v : v * -1;
        };
        var revArr = function(arr) {
            for(var _$ = [], i = 0, l = arr.length; i < l; i++) {
                _$.unshift(arr[i]);
            }
            return _$;
        };
        var getCssValues = function(prop) {
            var getCssRules = function(sSheet) {
                var matchMedia = function(q) {
                    var _$ = _doc.createElement('style'), elm = _doc.createElement('div'), bool;
                    elm.id = 'dDiv' + _cNum();
                    elm.style.height = 0;
                    elm.style.visibility = 'hidden';
                    _body.appendChild(elm);
                    _head.appendChild(_$);
                    _$.sheet.insertRule('@media ' + q + '{#' + elm.id + '{width:42px;}}', _$.sheet.cssRules.length);
                    bool = elm.offsetWidth === 42;
                    _head.removeChild(_$);
                    _body.removeChild(elm);
                    return { matches: bool, media: q };
                };
                for(var _$, reg = prop.replace(/(\-)/, '\\-') + '\\s*:\\s*([0-9a-zA-Z\\s\\-\\+\\*&#\\.\\(\\)%,!"\'><\\\\]+);?', arr = [], sRules = sSheet.cssRules, i = 0, l = sRules.length; i < l; i++) {
                    var sSelText = sRules[i].selectorText, sType = sRules[i].type, sStyle = sRules[i].style;
                    switch(sType) {
                        case 1:
                            (_$ = sStyle.cssText.match(reg)) && ((arr[arr.length] = { sel: sSelText, prop: prop, val: sStyle.getPropertyPriority(prop) ? _$[1] + ' !important' : _$[1] }), dReg.test(sSelText) && (dArr[dArr.length] = { sel: sSelText, cText: sStyle.getPropertyPriority(prop) ? _$[1] + ' !important' : _$[1] }));
                            pReg.test(sSelText) && (pArr[pArr.length] = { sel: sSelText, cText: sStyle.cssText });
                            break;
                        case 3:
                            arr = arr.concat(getCssRules(sRules[i].styleSheet));
                            break;
                        case 4:
                            matchMedia(sRules[i].media.mediaText).matches && (arr = arr.concat(getCssRules(sRules[i])));
                            break;
                    }
                }
                return arr;
            };
            var arr = [];
            if(_doc.styleSheets) {
                for(var _$ = _doc.styleSheets, i = 0, l = _$.length; i < l; i++) {
                    arr = arr.concat(getCssRules(_$[i]));
                }
            }
            return arr;
        };
        var cssShadowValues = function() {
            for(var _$, arr = [], sArr = getCssValues('text-shadow'), reg = /^(#[0-9a-fA-F]{3,6})\s+([0-9a-zA-Z\s\-\.\(\)%,!]+)$/, i = 0, l = sArr.length; i < l; i++) {
                arr[arr.length] = { sel: sArr[i].sel, shadow: (_$ = sArr[i].val.match(reg)) ? _$[2] + ' ' + _$[1] : sArr[i].val };
            }
            return arr;
        };
        var setShadow = function(tObj) {
            var setShadowNodeColor = function(obj) {
                for(var _$ = obj.firstChild; _$; _$ = _$.nextSibling) {
                    _$.nodeType === 1 && (!_$.hasChildNodes() ? _$.style.visibility = 'hidden' : (!/quasiPseudo/.test(_$.className) && (_$.style.color = obj.style.color), setShadowNodeColor(_$)));
                }
            };
            var hideAncestShadow = function(oObj, pObj) {
                for(var _$ = pObj.firstChild; _$; _$ = _$.nextSibling) {
                    _$.hasChildNodes() && (_$.nodeName.toLowerCase() === oObj.tagName.toLowerCase() && _$.firstChild.nodeValue === oObj.firstChild.nodeValue ? _$.style.visibility = 'hidden' : hideAncestShadow(oObj, _$));
                }
            };
            var boolShadowChild = function(obj) {
                for(var _$ = true, arr = getAncestObj(obj), i = 0, l = arr.length; i < l; i++) {
                    if(arr[i].tagName.toLowerCase() === 'ie-shadow') {
                        _$ = false; break;
                    }
                }
                return _$;
            };
            var getDynCSS = function(pseudo, arr) {
                var _$, obj = { pText: '', fLetter: '', fLine: '' }, reg, dyn, i, l, j, k;
                for(reg = '', i = 0, l = pseudo.length; i < l; i++) {
                    dyn = /_/.test(pseudo[i]) ? pseudo[i].split('_') : [pseudo[i]];
                    if(dyn.length === 1) {
                        reg = '(?:(?:(::?(before|after))|(:' + dyn[0] + ')){2})';
                    }
                    else if(dyn.length > 1) {
                        reg = '(?:(?:(::?(before|after))|(:(?:';
                        for(j = 0, k = dyn.length; j < k; j++) {
                            reg += (dyn[j] + '|');
                        }
                        reg = reg.replace(/\|$/, '') + '){' + dyn.length + '})){2})';
                    }
                    for(j = 0, k = arr.length; j < k; j++) {
                        _$ = new RegExp(reg);
                        if(_$.test(arr[j].split('||')[0])) {
                            obj.pText = arr[j].split('||')[1].replace(/;$/, '') + ';';
                            break;
                        }
                    }
                    if(obj.pText !== '') { break; }
                }
                for(reg = '', i = 0, l = pseudo.length; i < l; i++) {
                    dyn = /_/.test(pseudo[i]) ? pseudo[i].split('_') : [pseudo[i]];
                    if(dyn.length === 1) {
                        reg = '(?:(?:(::?first\\-letter)|(:' + dyn[0] + ')){2})';
                    }
                    else if(dyn.length > 1) {
                        reg = '(?:(?:(::?first\\-letter)|(:(?:';
                        for(j = 0, k = dyn.length; j < k; j++) {
                            reg += (dyn[j] + '|');
                        }
                        reg = reg.replace(/\|$/, '') + '){' + dyn.length + '})){2})';
                    }
                    for(j = 0, k = arr.length; j < k; j++) {
                        _$ = new RegExp(reg);
                        if(_$.test(arr[j].split('||')[0])) {
                            obj.fLetter = arr[j].split('||')[1].replace(/;$/, '') + ';';
                            break;
                        }
                    }
                    if(obj.fLetter !== '') { break; }
                }
                for(reg = '', i = 0, l = pseudo.length; i < l; i++) {
                    dyn = /_/.test(pseudo[i]) ? pseudo[i].split('_') : [pseudo[i]];
                    if(dyn.length === 1) {
                        reg = '(?:(?:(::?first\\-line)|(:' + dyn[0] + ')){2})';
                    }
                    else if(dyn.length > 1) {
                        reg = '(?:(?:(::?first\\-line)|(:(';
                        for(j = 0, k = dyn.length; j < k; j++) {
                            reg += (dyn[j] + '|');
                        }
                        reg = reg.replace(/\|$/, '') + '){' + dyn.length + '})){2})';
                    }
                    for(j = 0, k = arr.length; j < k; j++) {
                        _$ = new RegExp(reg);
                        if(_$.test(arr[j].split('||')[0])) {
                            obj.fLine = arr[j].split('||')[1].replace(/;$/, '') + ';';
                            break;
                        }
                    }
                    if(obj.fLine !== '') { break; }
                }
                return obj;
            };
            if(tObj.shadow !== 'invalid') {
                for(var _$ = false, tShadow = tObj.shadow, tElm = tObj.elm, arr = tElm.childNodes, i = 0; i < arr.length; i++) {
                    arr[i].nodeType === 1 && arr[i].nodeName.toLowerCase() === 'ie-shadow' && (/hasImp/.test(arr[i].className) ? (_$ = true) : (tElm.removeChild(arr[i]), --i));
                }
                if(!_$ || tObj.hasImp) {
                    var aBg, cNode, sNode = _doc.createDocumentFragment();
                    for(arr = getAncestObj(tElm), i = 0, l = arr.length; i < l; i++) {
                        !aBg && (getCompStyle(arr[i]).backgroundColor !== 'transparent' || getCompStyle(arr[i]).backgroundImage !== 'none') && (aBg = arr[i]);
                        for(cNode = arr[i].firstChild; cNode; cNode = cNode.nextSibling) {
                            cNode.nodeType === 1 && cNode.nodeName.toLowerCase() === 'ie-shadow' && /dummyShadow/.test(cNode.className) && hideAncestShadow(tElm, cNode);
                        }
                    }
                    tShadow !== 'none' && tShadow.length > 1 && (getCompStyle(tElm).backgroundColor !== 'transparent' || getCompStyle(tElm).backgroundImage !== 'none') && (tShadow = revArr(tShadow));
                    if(tShadow === 'none') {
                        for(cNode = tElm.parentNode.firstChild; cNode; cNode = cNode.nextSibling) {
                            if(cNode.nodeName.toLowerCase() === 'ie-shadow') {
                                getCompStyle(tElm).display === 'inline-block' && (tElm.style.display = 'inline');
                                getCompStyle(tElm).position === 'relative' && (tElm.style.position = 'static');
                                break;
                            }
                        }
                        !eObj && tElm.hasAttribute('data-dynpseudo') && tElm.setAttribute('data-dynpseudo', encodeURIComponent(decodeURIComponent(tElm.getAttribute('data-dynpseudo')).replace(/(\|;\|default.+)$/, '') + '|;|default||0 0 transparent' + (tObj.hasImp ? ' !important;' : ';')));
                    }
                    if(tShadow !== 'none' && tElm.hasChildNodes() && boolShadowChild(tElm)) {
                        var setPseudoCSS = function(dCss, dInt, dPseudo) {
                            var convPseudoPropVal = function(t, p) {
                                var _$, arr, i, l, p1, p2, p3, p4,
                                    r = convUnitToPx(getCompStyle(tElm, '').fontSize) / convUnitToPx(getCompStyle(tElm, p).fontSize),
                                    reg = /(?:(?:[cm]|re)m|p[ctx]|v[hw]|in)/;
                                if((arr = t.match(/(margin(?:\-(?:(?:top|right|bottom|left)))?\s*:\s*(?:[^;]+));/g), arr)) {
                                    for(i = 0, l = arr.length; i < l; i++) {
                                        _$ = arr[i].match(/^margin\s*:\s*((?:(?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%)\s*){1,4});/);
                                        if(_$) {
                                            _$ = _$[1].split(/\s+/);
                                            switch(_$.length) {
                                                case 1:
                                                    p1 = _$[0]; p2 = _$[0]; p3 = _$[0]; p4 = _$[0];
                                                    break;
                                                case 2:
                                                    p1 = _$[0]; p2 = _$[1]; p3 = _$[0]; p4 = _$[1];
                                                    break;
                                                case 3:
                                                    p1 = _$[0]; p2 = _$[1]; p3 = _$[2]; p4 = _$[1];
                                                    break;
                                                case 4:
                                                    p1 = _$[0]; p2 = _$[1]; p3 = _$[2]; p4 = _$[3];
                                                    break;
                                            }
                                            break;
                                        }
                                        else {
                                            (_$ = arr[i].match(/top\s*:\s*((?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%))/)) && (p1 = _$[1]);
                                            (_$ = arr[i].match(/right\s*:\s*((?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%))/)) && (p2 = _$[1]);
                                            (_$ = arr[i].match(/bottom\s*:\s*((?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%))/)) && (p3 = _$[1]);
                                            (_$ = arr[i].match(/left\s*:\s*((?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%))/)) && (p4 = _$[1]);
                                        }
                                    }
                                    p1 && (_$ = convUnitToPx(getCompStyle(tElm, p).marginTop, tElm, p), t += ('margin-top:' + (reg.test(p1) ? _$ : _$ * r) + 'px;'));
                                    p2 && (_$ = convUnitToPx(getCompStyle(tElm, p).marginRight, tElm, p), t += ('margin-right:' + (reg.test(p2) ? _$ : _$ * r) + 'px;'));
                                    p3 && (_$ = convUnitToPx(getCompStyle(tElm, p).marginBottom, tElm, p), t += ('margin-bottom:' + (reg.test(p3) ? _$ : _$ * r) + 'px;'));
                                    p4 && (_$ = convUnitToPx(getCompStyle(tElm, p).marginLeft, tElm, p), t += ('margin-left:' + (reg.test(p4) ? _$ : _$ * r) + 'px;'));
                                }
                                if((arr = t.match(/(border(?:(?:\-(?:(?:top|right|bottom|left)))?(?:\-width)?)?\s*:\s*(?:[^;]+));/g), arr)) {
                                    for(p1 = 0, p2 = 0, p3 = 0, p4 = 0, i = 0, l = arr.length; i < l; i++) {
                                        if(/border\s*:/.test(arr[i])) {
                                            _$ = arr[i].match(/^border\s*:\s*[^;]*(thi(?:n|ck)|medium|(?:(?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%)))[^;]*;/);
                                            if(_$) {
                                                p1 = _$[1]; p2 = _$[1]; p3 = _$[1]; p4 = _$[1];
                                                break;
                                            }
                                            else {
                                                p1 = 'medium'; p2 = 'medium'; p3 = 'medium'; p4 = 'medium';
                                                break;
                                            }
                                        }
                                        else if(/border\-width\s*:/.test(arr[i])) {
                                            _$ = arr[i].match(/((?:(?:thi(?:n|ck)|medium|(?:(?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%)))\s*){1,4})/);
                                            if(_$) {
                                                _$ = _$[1].split(/\s+/);
                                                switch(_$.length) {
                                                    case 1:
                                                        p1 = _$[0]; p2 = _$[0]; p3 = _$[0]; p4 = _$[0];
                                                        break;
                                                    case 2:
                                                        p1 = _$[0]; p2 = _$[1]; p3 = _$[0]; p4 = _$[1];
                                                        break;
                                                    case 3:
                                                        p1 = _$[0]; p2 = _$[1]; p3 = _$[2]; p4 = _$[1];
                                                        break;
                                                    case 4:
                                                        p1 = _$[0]; p2 = _$[1]; p3 = _$[2]; p4 = _$[3];
                                                        break;
                                                }
                                                break;
                                            }
                                        }
                                        else {
                                            (_$ = arr[i].match(/top\-width\s*:\s*(thi(?:n|ck)|medium|(?:(?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%)))/)) && (p1 = _$[1]);
                                            (_$ = arr[i].match(/right\-width\s*:\s*(thi(?:n|ck)|medium|(?:(?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%)))/)) && (p2 = _$[1]);
                                            (_$ = arr[i].match(/bottom\-width\s*:\s*(thi(?:n|ck)|medium|(?:(?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%)))/)) && (p3 = _$[1]);
                                            (_$ = arr[i].match(/left\-width\s*:\s*(thi(?:n|ck)|medium|(?:(?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%)))/)) && (p4 = _$[1]);
                                        }
                                    }
                                    p1 && (_$ = convUnitToPx(getCompStyle(tElm, p).borderTopWidth, tElm, p), t += ('border-top-width:' + (/thi(?:n|ck)|medium|(?:(?:[cm]|re)m|p[ctx]|v[hw]|in)/.test(p1) ? _$ : _$ * r) + 'px;'));
                                    p2 && (_$ = convUnitToPx(getCompStyle(tElm, p).borderRightWidth, tElm, p), t += ('border-right-width:' + (/thi(?:n|ck)|medium|(?:(?:[cm]|re)m|p[ctx]|v[hw]|in)/.test(p2) ? _$ : _$ * r) + 'px;'));
                                    p3 && (_$ = convUnitToPx(getCompStyle(tElm, p).borderBottomWidth, tElm, p), t += ('border-bottom-width:' + (/thi(?:n|ck)|medium|(?:(?:[cm]|re)m|p[ctx]|v[hw]|in)/.test(p3) ? _$ : _$ * r) + 'px;'));
                                    p4 && (_$ = convUnitToPx(getCompStyle(tElm, p).borderLeftWidth, tElm, p), t += ('border-left-width:' + (/thi(?:n|ck)|medium|(?:(?:[cm]|re)m|p[ctx]|v[hw]|in)/.test(p4) ? _$ : _$ * r) + 'px;'));
                                    t += 'border-color:transparent !important; border-image:none !important;';
                                }
                                if((arr = t.match(/(padding(?:\-(?:(?:top|right|bottom|left)))?\s*:\s*(?:[^;]+));/g), arr)) {
                                    for(p1 = 0, p2 = 0, p3 = 0, p4 = 0, i = 0, l = arr.length; i < l; i++) {
                                        _$ = arr[i].match(/^padding\s*:\s*((?:(?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%)\s*){1,4});/);
                                        if(_$) {
                                            _$ = _$[1].split(/\s+/);
                                            switch(_$.length) {
                                                case 1:
                                                    p1 = _$[0]; p2 = _$[0]; p3 = _$[0]; p4 = _$[0];
                                                    break;
                                                case 2:
                                                    p1 = _$[0]; p2 = _$[1]; p3 = _$[0]; p4 = _$[1];
                                                    break;
                                                case 3:
                                                    p1 = _$[0]; p2 = _$[1]; p3 = _$[2]; p4 = _$[1];
                                                    break;
                                                case 4:
                                                    p1 = _$[0]; p2 = _$[1]; p3 = _$[2]; p4 = _$[3];
                                                    break;
                                            }
                                            break;
                                        }
                                        else {
                                            (_$ = arr[i].match(/top\s*:\s*((?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%))/)) && (p1 = _$[1]);
                                            (_$ = arr[i].match(/right\s*:\s*((?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%))/)) && (p2 = _$[1]);
                                            (_$ = arr[i].match(/bottom\s*:\s*((?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%))/)) && (p3 = _$[1]);
                                            (_$ = arr[i].match(/left\s*:\s*((?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%))/)) && (p4 = _$[1]);
                                        }
                                    }
                                    p1 && (_$ = convUnitToPx(getCompStyle(tElm, p).paddingTop, tElm, p), t += ('padding-top:' + (reg.test(p1) ? _$ : _$ * r) + 'px;'));
                                    p2 && (_$ = convUnitToPx(getCompStyle(tElm, p).paddingRight, tElm, p), t += ('padding-right:' + (reg.test(p2) ? _$ : _$ * r) + 'px;'));
                                    p3 && (_$ = convUnitToPx(getCompStyle(tElm, p).paddingBottom, tElm, p), t += ('padding-bottom:' + (reg.test(p3) ? _$ : _$ * r) + 'px;'));
                                    p4 && (_$ = convUnitToPx(getCompStyle(tElm, p).paddingLeft, tElm, p), t += ('padding-left:' + (reg.test(p4) ? _$ : _$ * r) + 'px;'));
                                }
                                if((arr = t.match(/((?:m(?:ax|in)\-)?width\s*:\s*(?:[^;]+));/g), arr)) {
                                    for(p1 = 0, p2 = 0, p3 = 0, i = 0, l = arr.length; i < l; i++) {
                                        (_$ = arr[i].match(/^width\s*:\s*((?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%));/)) && (p1 = _$[1]);
                                        (_$ = arr[i].match(/^max\-width\s*:\s*((?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%));/)) && (p2 = _$[1]);
                                        (_$ = arr[i].match(/^min\-width\s*:\s*((?:\-?[0-9]+(?:\.[0-9]+)?)(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in|%));/)) && (p3 = _$[1]);
                                    }
                                    p1 && (_$ = convUnitToPx(getCompStyle(tElm, p).width, tElm, p), t += ('width:' + (reg.test(p1) ? _$ : _$ * r) + 'px;'));
                                    p2 && (_$ = convUnitToPx(getCompStyle(tElm, p).maxWidth, tElm, p), t += ('max-width:' + (reg.test(p2) ? _$ : _$ * r) + 'px;'));
                                    p3 && (_$ = convUnitToPx(getCompStyle(tElm, p).minWidth, tElm, p), t += ('min-width:' + (reg.test(p3) ? _$ : _$ * r) + 'px;'));
                                }
                                return t;
                            };
                            var setPseudoCssText = function(t, p) {
                                t = t.replace(/background(\-[a-z]+?)?\s*:\s*.+?;/ig, '').replace(/[^\-]color\s*:\s*.+?;/i, '');
                                /margin|border|padding|width/.test(t) && (t = convPseudoPropVal(t, p));
                                return t;
                            };
                            var getPseudoShadowValue = function(shadow, n, p) {
                                var _$,
                                    rad = convUnitToPx(shadow[n].z, tElm, p),
                                    left = convUnitToPx(shadow[n].x, tElm, p) - rad - xPos - pxRad,
                                    top = convUnitToPx(shadow[n].y, tElm, p) - rad - yPos - pxRad,
                                    color = (_$ = shadow[n].cProf.match(/^((?:rgb|hsl)a?\(\s*[0-9\.]+%?\s*,\s*[0-9\.]+%?\s*,\s*[0-9\.]+%?\s*(?:,\s*(?:0?\.[0-9]+|1(?:\.0+)?)\s*)?\)|#[0-9a-fA-F]{3,6}|[a-zA-Z]+)?$/)) && ('color:' + _$[1] + ';'),
                                    filt = '-ms-filter:"progid:DXImageTransform.Microsoft.Blur(PixelRadius=' + rad + ',MakeShadow=false,ShadowOpacity=1)";display:inline-block;';
                                return { rad: rad, top: top, left: left, color: color , filt: filt };
                            };
                            var convEntityToStr = function(q) {
                                for(var _$, arr = q.match(/\\[0-9a-f]{1,4}/ig) || [q], i = 0, l = arr.length; i < l; i++) {
                                    (_$ = arr[i].match(/\\([0-9a-f]{1,4})/i)) && (arr[i] = String.fromCharCode(parseInt(_$[1], 16)));
                                    /&/.test(arr[i]) && (arr[i] = '&amp;');
                                    /"/.test(arr[i]) && (arr[i] = '&quot;');
                                    /</.test(arr[i]) && (arr[i] = '&lt;');
                                    />/.test(arr[i]) && (arr[i] = '&gt;');
                                }
                                return arr.join('');
                            };
                            var getListStyleType = function(style, n) {
                                var getPredefinedStyle = function(s) {
                                    var type = '', glyphs = [];
                                    switch(s) {
                                        /*  Predefined Repeating Styles */
                                        case 'circle':
                                            type = 'repeating'; glyphs = ['25E6'];
                                            break;
                                        case 'disc':
                                            type = 'repeating'; glyphs = ['2022'];
                                            break;
                                        case 'square':
                                            type = 'repeating'; glyphs = ['25FE'];
                                            break;
                                        /*  Predefined Alphabetic Styles    */
                                        case ('lower-alpha' || 'lower-latin'):
                                            type = 'alphabetic';
                                            glyphs = ['61', '62', '63', '64', '65', '66', '67', '68', '69', '6A', '6B', '6C', '6D', '6E', '6F', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7A'];
                                            break;
                                        case 'lower-greek':
                                            type = 'alphabetic';
                                            glyphs = ['3B1', '3B2', '3B3', '3B4', '3B5', '3B6', '3B7', '3B8', '3B9', '3BA', '3BB', '3BC', '3BD', '3BE', '3BF', '3C0', '3C1', '3C3', '3C4', '3C5', '3C6', '3C7', '3C8', '3C9'];
                                            break;
                                        case ('upper-alpha' || 'upper-latin'):
                                            type = 'alphabetic';
                                            glyphs = ['41', '42', '43', '44', '45', '46', '47', '48', '49', '4A', '4B', '4C', '4D', '4E', '4F', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5A'];
                                            break;
                                    }
                                    return { style: s, type: type, glyphs: glyphs };
                                };
                                var _$, glph = '', M, C, X, I;
                                switch(style) {
                                    case 'decimal-leading-zero':
                                        glph = n >= 0 && n < 10 ? '0' + n : n < 0 && n >= -9 ? '-0' + Math.abs(n) : n;
                                        break;
                                    case ('upper-roman' || 'lower-roman'):
                                        _$ = style.match(/((?:upp|low)er)\-roman/)[1];
                                        M = ['', 'M', 'MM', 'MMM', 'MMMM'];
                                        C = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'];
                                        X = ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'];
                                        I = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];
                                        if(n > 0 && n <= 4999) {
                                            glph += M[Math.floor(n / 1000)];
                                            n %= 1000;
                                            glph += C[Math.floor(n / 100)];
                                            n %= 100;
                                            glph += X[Math.floor(n / 10)];
                                            n %= 10;
                                            glph += I[n];
                                        }
                                        _$ === 'lower' && (glph = glph.toLowerCase());
                                        break;
                                    case 'armenian':
                                        M = ['', '54C', '54D', '54E', '54F', '550', '551', '552', '553', '554'];
                                        C = ['', '543', '544', '545', '546', '547', '548', '549', '54A', '54B'];
                                        X = ['', '53A', '53B', '53C', '53D', '53E', '53F', '540', '541', '542'];
                                        I = ['', '531', '532', '533', '534', '535', '536', '537', '538', '539'];
                                        if(n > 0 && n <= 9999) {
                                            glph += String.fromCharCode(parseInt(M[Math.floor(n / 1000)], 16));
                                            n %= 1000;
                                            glph += String.fromCharCode(parseInt(C[Math.floor(n / 100)], 16));
                                            n %= 100;
                                            glph += String.fromCharCode(parseInt(X[Math.floor(n / 10)], 16));
                                            n %= 10;
                                            glph += String.fromCharCode(parseInt(I[n], 16));
                                        }
                                        break;
                                    case 'georgian':
                                        _$ = ['', '10F5'];
                                        M = ['', '10E9', '10EA', '10EB', '10EC', '10ED', '10EE', '10F4', '10EF', '10F0'];
                                        C = ['', '10E0', '10E1', '10E2', '10F3', '10E4', '10E5', '10E6', '10E7', '10E8'];
                                        X = ['', '10D8', '10D9', '10DA', '10DB', '10DC', '10F2', '10DD', '10DE', '10DF'];
                                        I = ['', '10D0', '10D1', '10D2', '10D3', '10D4', '10D5', '10D6', '10F1', '10D7'];
                                        if(n > 0 && n <= 19999) {
                                            glph += String.fromCharCode(parseInt(_$[Math.floor(n / 10000)], 16));
                                            n %= 10000;
                                            glph += String.fromCharCode(parseInt(M[Math.floor(n / 1000)], 16));
                                            n %= 1000;
                                            glph += String.fromCharCode(parseInt(C[Math.floor(n / 100)], 16));
                                            n %= 100;
                                            glph += String.fromCharCode(parseInt(X[Math.floor(n / 10)], 16));
                                            n %= 10;
                                            glph += String.fromCharCode(parseInt(I[n], 16));
                                        }
                                        break;
                                    default:
                                        var obj = getPredefinedStyle(style);
                                        _$ = '';
                                        if(obj.type === 'alphabetic') {
                                            n -= 1;
                                            _$ = n % obj.glyphs.length + '';
                                            for(n = Math.floor( n / obj.glyphs.length); n >= obj.glyphs.length;) {
                                                _$ = n % obj.glyphs.length + ' ' + _$, n = Math.floor(n / obj.glyphs.length);
                                                _$ = n % obj.glyphs.length + ' ' + _$;
                                            }
                                            for(var arr = _$.split(' '), i = 0, l = arr.length; i < l; i++) {
                                                glph += String.fromCharCode(parseInt(obj.glyphs[arr[i] * 1], 16));
                                            }
                                        }
                                        if(obj.type === 'repeating') {
                                            glph = String.fromCharCode(parseInt(obj.glyphs[(n - 1) % obj.glyphs.length], 16));
                                        }
                                        break;
                                }
                                return glph;
                            };
                            var getContentValue = function(obj, qCont, pseudo) {
                                var getAncestCountOrder = function(obj, r, c) {
                                    for(var _$, cReg = new RegExp(r), iReg = new RegExp(r + '\\s+(\\-?[0-9]+)$'), n = 1, arr, aArr, gArr = getGeneralObj(obj), i = 0, l = gArr.length; i < l; i++) {
                                        gArr[i].tagName.toLowerCase() === obj.tagName.toLowerCase() && (n += 1);
                                    }
                                    c && (_$ = c.match(iReg)) && (n *= (_$[1] * 1));
                                    for(arr = [], aArr = getAncestObj(obj), i = 0, l = aArr.length; i < l; i++) {
                                        var cReset = getCompStyle(aArr[i]).counterReset || getCompStyle(aArr[i], pseudo).counterReset;
                                        cReset && cReg.test(cReset) && ((_$ = cReset.match(iReg)) && (n += (_$[1] * 1)), (arr[arr.length] = n));
                                        if(aArr[i].tagName.toLowerCase() === obj.tagName.toLowerCase()) {
                                            n = 1;
                                            gArr = getGeneralObj(aArr[i]);
                                            for(var j = 0, k = gArr.length; j < k; j++) {
                                                gArr[j].tagName.toLowerCase() === obj.tagName.toLowerCase() && (n += 1);
                                            }
                                            c && (_$ = c.match(iReg)) && (n *= (_$[1] * 1));
                                        }
                                    }
                                    return revArr(arr);
                                };
                                qCont !== '' && /^(normal|none|''|"")/.test(qCont) && (qCont = '');
                                if(qCont === '') { return; }
                                var _$, arr, aArr, reg, aReg, str, aStr, i, l, j, k, n,
                                    cIncre = getCompStyle(obj).counterIncrement || getCompStyle(obj, pseudo).counterIncrement,
                                    qNode = _doc.createDocumentFragment();
                                if(/attr\([a-z\-]+\)/.test(qCont)) {
                                    for(arr = qCont.match(/attr\(([a-z\-]+)\)/g), i = 0, l = arr.length; i < l; i++) {
                                        arr[i] = arr[i].match(/attr\(([a-z\-]+)\)/)[1];
                                        _$ = new RegExp('\\s*attr\\(' + arr[i] + '\\)\\s*');
                                        obj.hasAttribute(arr[i]) && (qCont = qCont.replace(_$, obj.getAttribute(arr[i])));
                                    }
                                }
                                if(/counters\(\s*.+?\s*,\s*["'].+?['"]\s*(,\s*[^\s]+?)?\s*\)/.test(qCont)) {
                                    for(arr = qCont.match(/counters\(\s*.+?\s*,\s*["'].+?['"]\s*(,\s*[^\s]+?)?\s*\)/g), i = 0, l = arr.length; i < l; i++) {
                                        if((_$ = arr[i].match(/counters\(\s*(.+?)\s*,\s*["'](.+?)['"]\s*(?:,\s*([^\s]+?))?\s*\)/), _$)) {
                                            var mk = _$[2];
                                            str = _$[1]; aStr = _$[3] || '';
                                            if(cIncre && cIncre === 'none' || aStr === 'none') {
                                                _$ = new RegExp('\\s*counters\\(\\s*' + str + '\\s*,\\s*["\']' + mk + '["\']\\s*(,\\s*' + aStr + '?)?\\s*\\)\\s*');
                                                qCont = qCont.replace(_$, '');
                                            }
                                            else {
                                                aArr = getAncestCountOrder(obj, str, cIncre);
                                                if(aStr !== '' && aStr !== 'decimal') {
                                                    for(j = 0, k = aArr.length; j < k; j++) {
                                                        aArr[j] = getListStyleType(aStr, aArr[j]);
                                                    }
                                                }
                                                _$ = new RegExp('\\s*counters\\(\\s*' + str + '\\s*,\\s*["\']' + mk + '["\']\\s*(,\\s*' + aStr + '?)?\\s*\\)\\s*');
                                                qCont = qCont.replace(_$, aArr.join(mk));
                                            }
                                        }
                                    }
                                }
                                if(/counter\(.+?\)/.test(qCont)) {
                                    for(arr = qCont.match(/counter\(.+?\)/g), i = 0, l = arr.length; i < l; i++) {
                                        if((_$ = arr[i].match(/counter\(\s*([^\s]+?)\s*(?:,\s*([^\s]+?)\s*)?\)/), _$)) {
                                            str = _$[1]; aStr = _$[2] || '';
                                            if(cIncre && cIncre === 'none' || aStr === 'none') {
                                                _$ = new RegExp('\\s*counter\\(\\s*' + str + '\\s*(,\\s*' + aStr + '\\s*)?\\)\\s*');
                                                qCont = qCont.replace(_$, '');
                                            }
                                            else {
                                                reg = new RegExp(str), aReg = new RegExp(str + '\\s+(\\-?[0-9]+)?');
                                                for(n = 1, aArr = getGeneralObj(obj), j = 0, k = aArr.length; j < k; j++) {
                                                    var cReset = getCompStyle(aArr[j]).counterReset;
                                                    if(cReset && reg.test(cReset)) {
                                                        (_$ = cReset.match(aReg)) && (n += (_$[1] * 1));
                                                        break;
                                                    }
                                                    aArr[j].tagName.toLowerCase() === obj.tagName.toLowerCase() && (n += 1);
                                                }
                                                if(cIncre && reg.test(cIncre)) {
                                                    n *= ((_$ = cIncre.match(aReg)) ? _$[1] * 1 : 1);
                                                    aStr !== '' && aStr !== 'decimal' && (n = getListStyleType(aStr, n));
                                                }
                                                _$ = new RegExp('counter\\(\\s*' + str + '\\s*(,\\s*' + aStr + '\\s*)?\\)');
                                                qCont = qCont.replace(_$, n);
                                            }
                                        }
                                    }
                                }
                                if(/["'].+?['"]/.test(qCont)) {
                                    for(arr = qCont.match(/["'].+?['"]/g), i = 0, l = arr.length; i < l; i++) {
                                        if((_$ = arr[i].match(/["'](.+?)['"]/), _$)) {
                                            str = _$[1];
                                            reg = str.replace(/\\/g, '\\\\');
                                            if(/(\\([0-9a-f]{1,4}){1,})/i.test(str)) {
                                                for(aArr = str.match(/(\\([0-9a-f]{1,4}){1,})/ig), j = 0, k = aArr.length; j < k; j++) {
                                                    str = str.replace(aArr[j], convEntityToStr(aArr[j]));
                                                }
                                            }
                                            _$ = new RegExp('\\s*[\'"]' + reg + '["\']\\s*');
                                            qCont = qCont.replace(_$, str.replace(/\s/g, '&#160;'));
                                        }
                                    }
                                }
                                if(/url\(.+?\)/.test(qCont)) {
                                    for(arr = qCont.match(/url\(.+?\)/g), i = 0, l = arr.length; i < l; i++) {
                                        arr[i] = arr[i].match(/url\((.+?)\)/)[1];
                                        _$ = new RegExp('\\s*url\\(' + arr[i] + '\\)\\s*');
                                        qCont = qCont.replace(_$, '||<img src="' + arr[i].replace(/["']/g, '') + '" />||').replace(/^\|\|/, '').replace(/\|\|$/, '');
                                    }
                                }
                                if(/(?:open|close)\-quote/.test(qCont) && getCompStyle(obj).quotes) {
                                    for(arr = qCont.match(/(?:open|close)\-quote/g), i = 0, l = arr.length; i < l; i++) {
                                        arr[i] = arr[i].match(/((?:no\-)?(?:open|close)\-quote)/)[1];
                                        n = 0, aArr = getCompStyle(obj).quotes.split(' ') || ['', ''];
                                        if(aArr.length > 2) {
                                            for(_$ = getAncestObj(obj), j = 0, k = _$.length; j < k; j++) {
                                                _$[j].tagName.toLowerCase() === obj.tagName.toLowerCase() && (/no\-(?:open|close)\-quote/.test(getCompStyle(_$[j], pseudo).content) ? (/open\-quote/.test(arr[i]) ? (n += 2) : /close\-quote/.test(arr[i]) && (n -= 2)) : (n += 2));
                                            }
                                        }
                                        /[^\-]?open\-quote/.test(arr[i]) && (qCont = qCont.replace(/\s*[^\-]?open\-quote\s*/g, aArr[n].replace(/^["']/, '').replace(/['"]$/, '')));
                                        /[^\-]?close\-quote/.test(arr[i]) && (qCont = qCont.replace(/\s*[^\-]?close\-quote\s*/g, aArr[n + 1].replace(/^["']/, '').replace(/['"]$/, '')));
                                        /no\-(?:open|close)\-quote/.test(arr[i]) && (qCont = '');
                                    }
                                }
                                for(arr = /\|\|/.test(qCont) ? qCont.split('||') : [qCont], i = 0, l = arr.length; i < l; i++) {
                                    (_$ = arr[i].match(/^<([a-z]+)\s/)) ? (_$ = _doc.createElement(_$[1]), _$.src = arr[i].match(/src="(.+?)"/)[1], _$.style.visibility = 'hidden', qNode.appendChild(_$)) : qNode.appendChild(_doc.createTextNode(arr[i].replace(/&#160;/g, '\u00a0')));
                                }
                                return qNode;
                            };
                            var setQuasiFirstLetter = function(cNode, cText, n) {
                                var setFirstLetter = function(obj) {
                                    for(var _$ = false, reg = /^(?:1(?:0(?:6(?:4[0-8]|2[7-9]|3[0-9])|2(?:1[4-9]|2[0-3])|7(?:1[2-5]|4[89])|1(?:0[01]|8[12])|0(?:8[89]|9[0-9]))|1(?:8(?:0[013-9]|2[0-24-9]|3[0-3]|1[0-9])|7(?:9[0-8]|7[6-9]|8[0-9])|51[893-6]|632)|2(?:3(?:1[0-57-9]|0[890-5]|49)?|2(?:9[016-9]|89)|5(?:39)?)|5(?:4[5689]|6[367]|2[34])|7(?:9[2-9]|48|1)|8(?:[237]|0[0-5])|6(?:[17]|4[2-5])|4(?:7[258]|17)|37[0-5]|91)|6(?:5(?:3(?:7[135-9]|0[67]|1[12]|4[01]|8[01]|39)|1(?:1[013-9]|0[0894-6]|2[018]|3[01])|0(?:7[27-9]|4[0-9]|8[0-9]|9[0-9])|2(?:8[1-35-9]|9[0245])|79[2-4])|8(?:1(?:[69]|8[0-4]?|7[6-9]?)|2(?:[014-9]|23?)|4(?:1[0-5]|09))|9(?:8(?:2[02-5]|19)|70[3-9]|95[2-5])|1(?:0[0-24-6]|4[4-9]|5[1-4])|4(?:83[01]|6[89])?|6(?:8[67]|463|512)|7(?:[68]71|903)|3)|4(?:[67]|3(?:4(?:5[7-9]|8[67]|6[0-9]|7)|2(?:5[6-8]|1[45])|7(?:4[23]|6[01])|3(?:1[01]|59)|12[4-7]|61[2-5])|2(?:7(?:4[0-3]|3[89])|5(?:1[01]|09)|6(?:11|22)|23[89])?|0(?:5[780-2]|4[89])?|1(?:7[0-5])?|96[0-8]|4(?:011)?)|8(?:2(?:6[1-9]|5[0-47-9]|7[50-37-9]|8[0-6]|1[4-9]|3[01]|2[0-9]|4[0-9])|3(?:1[78]|3[34])|94)|7(?:00(?:[2-7]|8[5-8]?)|2(?:2[7-9]|3[01]|9[45])|3(?:6[0-7]|79)|486[4-7]|16[4-7])|3(?:[347]|8(?:5[0-8]|4[4-9]|9[89]|60)?|9(?:0[01]|73)?|6(?:7[45]|63)|5(?:72)?)|2(?:0(?:9[6-9]|4[01]|39)|1(?:0[0-9]|10|42)|4(?:0[45]|16)|800)|5(?:7(?:4[12]|8[78])|8(?:6[7-9])?|9(?:4[12])?)|9(?:[1-3]|0(?:0[12]|3)))$/, qNode = _doc.createDocumentFragment(), isPunc = false, str = '', elm = _doc.createElement('ie-shadow'), arr = obj.nodeValue, i = 0, l = arr.length; i < l; i++) {
                                        isPunc = reg.test(arr.charCodeAt(i).toString());
                                        if(isPunc) {
                                            str += arr.charAt(i);
                                        }
                                        else {
                                            if(_$) { break; }
                                            str += arr.charAt(i);
                                            _$ = reg.test(arr.charCodeAt(i + 1).toString());
                                            if(!_$) { break; }
                                        }
                                    }
                                    elm.appendChild(_doc.createTextNode(str));
                                    elm.className = 'qFLetter quasiPseudo';
                                    (_$ = cText.match(/text\-shadow\s*:\s*((?:.+?)+?(?:\s*!\s*important)?);/i)) ? (arr = getShadowValue(_$[1]), arr.length > n ? (_$ = getPseudoShadowValue(arr, n, '::first-letter'), cText = cText.replace(/text\-shadow\s*:\s*(?:(?:.+?)+?(?:!\s*important)?);/i, ''), obj.parentNode && /qBefore/.test(obj.parentNode.className) && (_$.left -= convUnitToPx(getCompStyle(obj.parentNode).left), _$.top -= convUnitToPx(getCompStyle(obj.parentNode).top)), elm.setAttribute('style', cascadeCText(cText + 'top:' + _$.top + 'px;left:' + _$.left + 'px;' + _$.color + _$.filt + 'position:relative;'))) : (cText += 'visibility:hidden !important;', elm.setAttribute('style', cascadeCText(cText)))) : (cText = cText.replace(/[^\-]color\s*:\s*[^;]+;/, ''), elm.setAttribute('style', cascadeCText(cText)));
                                    (obj.parentNode && /quasiPseudo/.test(obj.parentNode.className)) ? (qNode.appendChild(elm), qNode.appendChild(_doc.createTextNode(obj.nodeValue.replace(str, '')))) : (_$ = _doc.createElement('ie-shadow'), _$.className = 'quasiPseudo', _$.setAttribute('style', '-ms-filter:none;display:inline;position:relative;'), _$.appendChild(elm), qNode.appendChild(_$), qNode.appendChild(_doc.createTextNode(obj.nodeValue.replace(str, ''))));
                                    return { qNode: qNode, isPunc: isPunc };
                                };
                                var _$, cType = cNode.nodeType;
                                if(cType === 1) {
                                    for(var dNode = cNode.firstChild; dNode; dNode = dNode.firstChild) {
                                        dNode.nodeType === 3 && (_$ = setFirstLetter(dNode), dNode.parentNode.replaceChild(_$.qNode, dNode));
                                    }
                                }
                                else if(cType === 3) {
                                    _$ = setFirstLetter(cNode);
                                    cNode = _doc.createDocumentFragment();
                                    cNode.appendChild(_$.qNode);
                                }
                                return { qNode: cNode, isPunc: (/float\s*:\s*(?:(?:lef|righ)t)/i.test(cText) ? false : _$.isPunc) };
                            };
                            var getFirstLineHeight = function(obj) {
                                var _$, elm = _doc.createElement('div'), fSize = convUnitToPx(getCompStyle(tElm, '::first-line').fontSize, tElm), cWidth = 0, fWidth = tElm.offsetWidth;
                                elm.id = 'dDiv' + _cNum();
                                elm.style.visibility = 'hidden';
                                elm.appendChild(obj);
                                _body.appendChild(elm);
                                for(var cNode = elm.firstChild; cNode; cNode = cNode.nextSibling) {
                                    var cType = cNode.nodeType;
                                    if(cType === 1 && cNode.hasChildNodes()) {
                                        if((cWidth += cNode.offsetWidth) <= fWidth && !/quasiPseudo/.test(cNode.className)) {
                                            (_$ = convUnitToPx(getCompStyle(cNode).fontSize, cNode)) > fSize && (fSize = _$);
                                            for(var dNode = _doc.createDocumentFragment(), arr = cNode.childNodes, i = 0, l = arr.length; i < l; i++) {
                                                dNode.appendChild(arr[i]);
                                            }
                                            (_$ = getFirstLineHeight(dNode)) > fSize && (fSize = _$);
                                        }
                                    }
                                    else if(cType === 1 && !cNode.hasChildNodes()) {
                                        (cWidth += cNode.offsetWidth) <= fWidth && (_$ = cNode.offsetHeight) > fSize && (fSize = _$);
                                        cNode.style.visibility = 'hidden;';
                                    }
                                    else if(cType === 3) {
                                        cWidth += (cNode.length * convUnitToPx(getCompStyle(elm).fontSize, elm));
                                    }
                                    if(cWidth >= fWidth) { break; }
                                }
                                _body.removeChild(elm);
                                return fSize;
                            };
                            for(var _$, cText = '', str, elm, arr, qNode, i = 0, l = dCss.length; i < l; i++) {
                                str = dCss[i].split('||')[0];
                                if(!dReg.test(str) && (_$ = str.match(/::?(before|after)/))) {
                                    var pseudo = _$[1], qCont;
                                    cText = setPseudoCssText(cascadeCText(dCss[i].split('||')[1].replace(/;$/, '') + ';' + (dPseudo ? dPseudo.pText : '')), '::' + pseudo);
                                    qCont = getContentValue(tElm, ((_$ = cText.match(/content\s*:\s*((?:.+?)+?(?:!\s*important)?);/i)) ? _$[1].replace(/^\s*/, '').replace(/\s*$/, '') : ''), '::' + pseudo);
                                    qCont && (cText = cText.replace(/content\s*:\s*(?:.+?)\s*(?:!\s*important)?;/i, ''), qNode = _doc.createElement('ie-shadow'), qNode.className = pseudo === 'before' ? 'qBefore quasiPseudo' : (pseudo === 'after' && 'qAfter quasiPseudo'), elm = _doc.createElement('ie-shadow'), (_$ = cText.match(/text\-shadow\s*:\s*((?:.+?)+?(?:\s*!\s*important)?);/i)) && (arr = getShadowValue(_$[1]), arr.length > dInt ? (_$ = getPseudoShadowValue(arr, dInt, '::' + pseudo), qNode.setAttribute('style', cascadeCText('position:relative;top:' + _$.top + 'px;left:' + _$.left + 'px;' + _$.color + _$.filt)), cText += '-ms-filter:none;display:inline;') : (cText += 'visibility:hidden !important;')), qNode.appendChild(qCont), cText = cText.replace(/text\-shadow\s*:\s*((.+?)+?(!\s*important)?);/i, ''), elm.className = 'quasiPseudo', elm.setAttribute('style', cascadeCText(cText + 'position:relative;')), elm.appendChild(qNode), pseudo === 'before' ? sNode.firstChild.className === 'quasiPseudo' ? sNode.replaceChild(elm, sNode.firstChild) : sNode.insertBefore(elm, sNode.firstChild) : (pseudo === 'after' && (sNode.lastChild.className === 'quasiPseudo' ? sNode.replaceChild(elm, sNode.lastChild) : sNode.appendChild(elm))));
                                }
                                if(!dReg.test(str) && /::?first\-letter/.test(str)) {
                                    cText = setPseudoCssText(cascadeCText(dCss[i].split('||')[1].replace(/;$/, '') + ';' + (dPseudo ? dPseudo.fLetter : '')), '::first-letter');
                                    qNode = _doc.createDocumentFragment();
                                    sNode.firstChild.nodeType === 1 ? (_$ = setQuasiFirstLetter(sNode.firstChild.cloneNode(true), cText, dInt), qNode.appendChild(_$.qNode), _$.isPunc ? (_$ = setQuasiFirstLetter(sNode.childNodes[1].cloneNode(true), cText, dInt), qNode.appendChild(_$.qNode), sNode.replaceChild(qNode, sNode.childNodes[1]), sNode.removeChild(sNode.firstChild)) : sNode.replaceChild(qNode, sNode.firstChild)) : (sNode.firstChild.nodeType === 3 && (_$ = setQuasiFirstLetter(sNode.firstChild.cloneNode(true), cText, dInt), qNode.appendChild(_$.qNode), sNode.replaceChild(qNode, sNode.firstChild)));
                                }
                            }
                            for(cText = '', i = 0, l = dCss.length; i < l; i++) {
                                str = dCss[i].split('||')[0];
                                if(!dReg.test(str) && /::?first\-line/.test(str)) {
                                    var fl = getCompStyle(tElm, '::first-line').lineHeight,
                                        fs = getCompStyle(tElm, '::first-line').fontSize;
                                    fl === 'normal' && (fl = (convUnitToPx(fs, tElm) * 1.2) + 'px');
                                    _$ = (convUnitToPx(fl, tElm) - convUnitToPx(fs, tElm)) / 2;
                                    for(qNode = sNode.cloneNode(true), elm = _doc.createElement('ie-shadow'), cNode = qNode.firstChild; cNode; cNode = cNode.nextSibling) {
                                        (cNode.nodeType === 1 && cNode.className === 'quasiPseudo') && (cNode.setAttribute('style', cascadeCText((cNode.hasAttribute('style') ? cNode.getAttribute('style') : '') + 'visibility:hidden !important;')));
                                    }
                                    cText = setPseudoCssText(cascadeCText(dCss[i].split('||')[1].replace(/;$/, '') + ';' + (dPseudo ? dPseudo.fLine : '')), '::first-line');
                                    cText += 'height:' + (getFirstLineHeight(qNode.cloneNode(true)) + _$) + 'px;overflow-y:hidden;';
                                    (_$ = cText.match(/text\-shadow\s*:\s*((?:.+?)+?(?:\s*!\s*important)?);/i)) ? (arr = getShadowValue(_$[1]), arr.length > dInt ? (_$ = getPseudoShadowValue(arr, dInt), cText = cText.replace(/text\-shadow\s*:\s*(?:(?:.+?)+?(?:!\s*important)?);/i, ''), elm.setAttribute('style', cascadeCText(cText + 'top:' + _$.top + 'px;left:' + _$.left + 'px;' + _$.color + _$.filt + 'position:absolute;display:block;'))) : (cText += 'visibility:hidden !important;', cText = cText.replace(/text\-shadow\s*:\s*(?:(?:.+?)+?(?:!\s*important)?);/i, ''), elm.setAttribute('style', cascadeCText(cText + 'position:absolute;display:block;')))) : elm.setAttribute('style', cascadeCText(cText + 'position:absolute;display:block;'));
                                    elm.className = 'qFLine quasiPseudo';
                                    elm.appendChild(qNode);
                                    sNode.insertBefore(elm, sNode.firstChild);
                                }
                            }
                        };
                        for(cNode = tElm.firstChild; cNode; cNode = cNode.nextSibling) {
                            !(cNode.nodeType === 1 && cNode.nodeName.toLowerCase() === 'ie-shadow') && sNode.appendChild(cNode.cloneNode(true));
                        }
                        i = 0;
                        for(var pxRad, xPos, yPos, sColor, sBox, sStyle, l = tShadow.length; i < l; i++) {
                            pxRad = convUnitToPx(tShadow[i].z, tElm);
                            xPos = convUnitToPx(tShadow[i].x, tElm) - pxRad + convUnitToPx(getCompStyle(tElm).paddingLeft, tElm);
                            getCompStyle(tElm).textAlign === 'center' && (xPos -= ((convUnitToPx(getCompStyle(tElm).paddingLeft, tElm) + convUnitToPx(getCompStyle(tElm).paddingRight, tElm)) / 2));
                            getCompStyle(tElm).textAlign === 'right' && (xPos -= convUnitToPx(getCompStyle(tElm).paddingRight, tElm));
                            yPos = convUnitToPx(tShadow[i].y, tElm) - pxRad + convUnitToPx(getCompStyle(tElm).paddingTop, tElm);
                            sColor = tShadow[i].cProf || getCompStyle(tElm).color;
                            sBox = _doc.createElement('ie-shadow');
                            sBox.id = 'dummyShadow' + _cNum();
                            sBox.className = (tObj.hasImp) ? 'dummyShadow hasImp' : 'dummyShadow';
                            sBox.setAttribute('aria-hidden', 'true');
                            sBox.setAttribute('role', 'presentation');
                            sStyle = sBox.style;
                            sStyle.display = 'block';
                            sStyle.position = 'absolute';
                            sStyle.left = xPos + 'px';
                            sStyle.top = yPos + 'px';
                            sStyle.width = '100%';
                            sStyle.color = sColor;
                            sStyle.filter = 'progid:DXImageTransform.Microsoft.Blur(PixelRadius=' + pxRad + ',MakeShadow=false,ShadowOpacity=1)';
                            sStyle.zIndex = -(i + 1);
                            getCompStyle(tElm).display === 'inline' && (tElm.style.display = 'inline-block');
                            getCompStyle(tElm).display === 'table-cell' && (getCompStyle(tElm).verticalAlign === 'middle' && tElm.clientHeight >= convUnitToPx(getCompStyle(tElm).height, tElm) && (sStyle.top = yPos + ((tElm.clientHeight - convUnitToPx(getCompStyle(tElm).height, tElm)) / 2) + 'px'), getCompStyle(tElm).verticalAlign === 'bottom' && (sStyle.top = '', sStyle.bottom = yPos + 'px'));
                            !(getCompStyle(tElm).position === 'absolute' || getCompStyle(tElm).position === 'fixed') && (tElm.style.position = 'relative');
                            (getCompStyle(tElm).backgroundColor !== 'transparent' || getCompStyle(tElm).backgroundImage !== 'none') && (getCompStyle(tElm).zIndex !== ('auto' || null) ? (sStyle.zIndex = tElm.style.zIndex) : (tElm.style.zIndex = sStyle.zIndex = -1));
                            aBg && aBg.tagName.toLowerCase() !== 'body' && (tElm.style.zIndex = 1, sStyle.zIndex = -1);
                            if(!eObj && tElm.hasAttribute('data-dynpseudo')) {
                                for(var str = '', j = 0, k = tShadow.length; j < k; j++) {
                                    str += (convUnitToPx(tShadow[j].x, tElm, '') + 'px ' + convUnitToPx(tShadow[j].y, tElm, '') + 'px ' + convUnitToPx(tShadow[j].z) + 'px ' + (tShadow[j].cProf ? tShadow[j].cProf : getCompStyle(tElm).color) + ';');
                                }
                                tElm.setAttribute('data-dynpseudo', encodeURIComponent(decodeURIComponent(tElm.getAttribute('data-dynpseudo')).replace(/(\|;\|default.+)$/, '') + '|;|default||' + str.replace(/;/g, ',').replace(/,$/, ';')));
                            }
                            if(tElm.hasAttribute('data-pseudo')) {
                                var dCss;
                                _$ = decodeURIComponent(tElm.getAttribute('data-pseudo'));
                                dCss = /\|;\|/.test(_$) ? _$.split('|;|') : [_$];
                                if(eObj) {
                                    var evt = this.event, eType = evt.type, x = evt.clientX, y = evt.clientY, cRect = tElm.getBoundingClientRect(), isHover = (cRect.left <= x && cRect.right >= x && cRect.top <= y && cRect.bottom >= y), isActive = tElm === _doc.activeElement;
                                    switch(eType) {
                                        case 'mouseover':
                                            _$ = isActive ? getDynCSS(['focus_hover', 'hover'], dCss) : getDynCSS(['hover'], dCss);
                                            break;
                                        case 'mouseout':
                                            _$ = isActive ? getDynCSS(['focus'], dCss) : '';
                                            break;
                                        case 'mousedown':
                                            _$ = isActive ? getDynCSS(['active_focus_hover', 'active_hover', 'active_focus', 'active', 'focus_hover', 'hover', 'focus'], dCss) : getDynCSS(['active_hover', 'active', 'hover'], dCss);
                                            break;
                                        case 'mouseup':
                                            _$ = isHover ? getDynCSS(['focus_hover', 'hover', 'focus'], dCss) : getDynCSS(['focus'], dCss);
                                            break;
                                        case 'keydown':
                                            _$ = isHover ? getDynCSS(['active_focus_hover', 'active_hover', 'active_focus', 'active', 'focus_hover', 'hover', 'focus'], dCss) : getDynCSS(['active_focus', 'active', 'focus'], dCss);
                                            break;
                                        case 'keyup':
                                            _$ = isHover ? getDynCSS(['focus_hover', 'hover', 'focus'], dCss) : getDynCSS(['focus'], dCss);
                                            break;
                                        case 'focus':
                                            _$ = isHover ? getDynCSS(['active_focus_hover', 'active_hover', 'active_focus', 'active', 'focus_hover', 'hover', 'focus'], dCss) : getDynCSS(['focus'], dCss);
                                            break;
                                        case 'blur':
                                            _$ = '';
                                            break;
                                    }
                                    setPseudoCSS(dCss, i, _$);
                                }
                                else {
                                    setPseudoCSS(dCss, i);
                                }
                            }
                            sBox.appendChild(sNode.cloneNode(true));
                            tElm.appendChild(sBox);
                            setShadowNodeColor(sBox);
                        }
                    }
                }
            }
        };
        var getTargetObj = function(obj) {
            var arr = _doc.querySelectorAll(obj.sel);
            if(arr.length > 0) {
                for(var i = 0, l = arr.length; i < l; i++) {
                    obj.elm = arr[i];
                    setShadow(obj);
                }
            }
        };
        var getShadowValue = function(shadow) {
            if(/none/.test(shadow)) {
                return 'none';
            }
            else {
                for(var _$, aArr = [], arr = shadow.match(/(?:(?:(?:rgb|hsl)a?\(\s*[0-9\.]+%?\s*,\s*[0-9\.]+%?\s*,\s*[0-9\.]+%?\s*(?:,\s*(?:0?\.[0-9]+|1(?:\.0+)?)\s*)?\)|#[0-9a-fA-F]{3,6}|[a-zA-Z]+)\s*)?(?:\-?[0-9]+(?:\.[0-9]+)?(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in)?\s*){2,3}(?:(?:rgb|hsl)a?\(\s*[0-9\.]+%?\s*,\s*[0-9\.]+%?\s*,\s*[0-9\.]+%?\s*(?:,\s*(?:0?\.[0-9]+|1(?:\.0+)?)\s*)?\)|#[0-9a-fA-F]{3,6}|[a-zA-Z]+)?/g), i = 0, l = arr.length; i < l; i++) {
                    aArr[i] = { x: '0', y: '0', z: '0', cProf: null };
                    if((_$ = arr[i].match(/(\-?[0-9]+(?:\.[0-9]+)?(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in)?)\s+(\-?[0-9]+(?:\.[0-9]+)?(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in)?)(?:\s+([0-9]+(?:\.[0-9]+)?(?:v(?:[hw]|m(?:ax|in)?)|(?:re|m)m|p[ctx]|c[hm]|e[mx]|in)?))?/), _$)) {
                        aArr[i].x = _$[1];
                        aArr[i].y = _$[2];
                        _$[3] && (aArr[i].z = _$[3]);
                        aArr[i].cProf = (_$ = arr[i].match(/^((?:rgb|hsl)a?\(\s*[0-9\.]+%?\s*,\s*[0-9\.]+%?\s*,\s*[0-9\.]+%?\s*(?:,\s*(?:0?\.[0-9]+|1(?:\.0+)?)\s*)?\)|#[0-9a-fA-F]{3,6}|[a-zA-Z]+)/)) ? _$[1] :
                        (_$ = arr[i].match(/\s((?:rgb|hsl)a?\(\s*[0-9\.]+%?\s*,\s*[0-9\.]+%?\s*,\s*[0-9\.]+%?\s*(?:,\s*(?:0?\.[0-9]+|1(?:\.0+)?)\s*)?\)|#[0-9a-fA-F]{3,6}|[a-zA-Z]+)$/)) && _$[1];
                    }
                    else {
                        aArr = 'invalid'; break;
                    }
                }
                return aArr;
            }
        };
        var pseudoElmShadow = function(obj, reg, arr) {
            for(var i = arr.length - 1, l = 0; i >= l; i--) {
                arr[i].sel === obj.replace(reg, '') && /none/.test(arr[i].shadow) && (arr[arr.length] = { sel: obj.replace(reg, ''), shadow: '0 0 transparent' });
            }
        };
        var setDataAttr = function(obj, dataAttr, reg) {
            var setEvtListener = function(obj, t) {
                obj.addEventListener(t, toggleDPseudoClassShadow, false);
            };
            if(reg.test(obj.sel)) {
                for(var arr = _doc.querySelectorAll(obj.sel.replace(pReg, '').replace(dReg, '')), i = 0, l = arr.length; i < l; i++) {
                    var _$ = arr[i].hasAttribute(dataAttr) ? decodeURIComponent(arr[i].getAttribute(dataAttr)) : '';
                    _$ !== '' && (_$ = _$.replace(/(\|;\|default.+)$/, ''));
                    _$ = _$ !== '' ? _$ + '|;|' + obj.sel + '||' + obj.cText : obj.sel + '||' + obj.cText;
                    /:(?:focus|hover|active)/.test(_$) && (arr[i].id === '' && (arr[i].id = 'dId' + _cNum()), _$ += ('|;|default||0 0 transparent;'), /:focus/.test(_$) && (setEvtListener(arr[i], 'focus'), setEvtListener(arr[i], 'blur')), /:hover/.test(_$) && (setEvtListener(arr[i], 'mouseover'), setEvtListener(arr[i], 'mouseout')), /:active/.test(_$) && (setEvtListener(arr[i], 'mousedown'), setEvtListener(arr[i], 'mouseup'), setEvtListener(arr[i], 'keydown'), setEvtListener(arr[i], 'keyup')));
                    arr[i].setAttribute(dataAttr, encodeURIComponent(_$));
                }
            }
        };
        var cascadeSel = function(arr) {
            for(var _$, aArr = [], i = 0, l = arr.length; i < l; i++) {
                _$ = true;
                for(var j = i; j < l; j++) {
                    i !== j && arr[i].sel === arr[j].sel && !/important/.test(arr[i].shadow) && (_$ = false);
                }
                _$ && (aArr[aArr.length] = arr[i]);
            }
            return aArr;
        };
        var cascadeCText = function(str) {
            for(var _$, arr = [], aArr = (str !== '' ? str.replace(/;$/, '').split(';') : []), i = 0, l = aArr.length; i < l; i++) {
                _$ = true;
                for(var j = i; j < l; j++) {
                    var i0 = aArr[i].split(':')[0].replace(/^\s+/, '').replace(/\s+$/, ''),
                        i1 = aArr[i].split(':')[1],
                        j0 = aArr[j].split(':')[0].replace(/^\s+/, '').replace(/\s+$/, ''),
                        j1 = aArr[j].split(':')[1];
                    i !== j && i0 === j0 && (/important/.test(i1) || !(/important/.test(i1) && /important/.test(j1))) && (_$ = false);
                }
                _$ && (arr[arr.length] = aArr[i]);
            }
            return (arr.length > 0 ? (arr.join(';') + ';') : '');
        };
        var splitSel = function(o) {
            for(var x = [], i = 0, l = o.length; i < l; i++) {
                for(var y = o[i].sel.split(/,/), j = 0, k = y.length; j < k; j++) {
                    x[x.length] = o[i].hasOwnProperty('cText') ? { sel: y[j].replace(/^\s*/, '').replace(/\s*$/, ''), cText: o[i].cText } : o[i].hasOwnProperty('shadow') && { sel: y[j].replace(/^\s*/, '').replace(/\s*$/, ''), shadow: o[i].shadow };
                }
            }
            return cascadeSel(x);
        };
        var _$,
            _head = _doc.querySelector('head'), _body = _doc.querySelector('body'),
            _cNum = (function(n) { return function() { return n++; };})(0),
            pArr = [], pReg = /::?(?:before|after|first\-l(?:etter|ine))/,
            dArr = [], dReg = /(?:\:(?:focus|hover|active))+/,
            arr = ieShadowSettings(), sReg = /^\s*([a-zA-Z0-9#\.:_\-\s>\+~]+)\s*$/, i, l;
        pArr = splitSel(pArr);
        for(i = 0, l = pArr.length; i < l; i++) {
            pReg.test(pArr[i].sel) && (setDataAttr(pArr[i], 'data-pseudo', pReg), pseudoElmShadow(pArr[i].sel, pReg, arr));
        }
        dArr = splitSel(dArr);
        for(i = 0, l = dArr.length; i < l; i++) {
            dReg.test(dArr[i].sel) && (setDataAttr(dArr[i], 'data-dynpseudo', dReg), pseudoElmShadow(dArr[i].sel, dReg, arr));
        }
        arr = splitSel(arr);
        for(i = 0, l = arr.length; i < l; i++) {
            (_$ = arr[i].sel.match(sReg)) && (arr[i].sel = _$[1]);
            getTargetObj({ sel: arr[i].sel, shadow: getShadowValue(arr[i].shadow), hasImp: /\s*\!\s*important/.test(arr[i].shadow) });
        }
    }
}
function toggleDPseudoClassShadow(evt) {
    'use strict';
    var _doc = document;
    if(_doc.documentMode === 9 ) {
        var checkPseudo = function(p) {
            if(obj.hasAttribute('data-pseudo')) {
                for(var bool = false, attr = decodeURIComponent(obj.getAttribute('data-pseudo')).split('|;|'), i = 0, l = attr.length; i < l; i++) {
                    for(var _$, arr = /_/.test(p) ? p.split('_') : [p], j = 0, k = arr.length; j < k; j++) {
                        arr[j] === 'default' ? !/default/.test(attr[i]) && !/:(?:focus|hover|active)/.test(attr[i]) && (bool = true) : (_$ = new RegExp(':' + arr[j]), _$.test(attr[i])) && (bool = true);
                        if(bool) { break; }
                    }
                    if(bool) { break; }
                }
                return bool;
            }
            else {
                return true;
            }
        };
        var toggleShadow = function(p, arr) {
            for(var _$ = false, i = 0, l = p.length; i < l; i++) {
                for(var j = 0, k = arr.length; j < k; j++) {
                    if(p[i] === arr[j].sel && checkPseudo(p[i])) {
                        textShadowForIE9({sel: '#' + obj.id, shadow: arr[j].shadow.replace(/none/, '0 0 transparent')});
                        _$ = true;
                        break;
                    }
                }
                if(_$) { break; }
            }
        };
        for(var _$, obj = evt.target, eType = evt.type, x = evt.clientX, y = evt.clientY, cRect = obj.getBoundingClientRect(), isHover = (cRect.left <= x && cRect.right >= x && cRect.top <= y && cRect.bottom >= y), isActive = (obj === _doc.activeElement), hasImp = false, dCss = [], dAttr = decodeURIComponent(obj.getAttribute('data-dynpseudo')).split('|;|'), i = 0, l = dAttr.length; i < l; i++) {
            (_$ = dAttr[i].split('||')[0].match(/((?:(?:\:(focus|hover|active))+)|default)/)) && (_$ = _$[1], dCss[dCss.length] = { sel: _$.replace(/^:/, '').split(':').sort().join('_'), shadow: dAttr[i].split('||')[1].replace(/none/, '0 0 transparent') }, _$ === 'default' && (hasImp = /important/.test(dAttr[i])));
        }
        if(!hasImp) {
            switch(eType) {
                case 'mouseover':
                    isActive ? toggleShadow(['focus_hover', 'hover'], dCss) : toggleShadow(['hover'], dCss);
                    break;
                case 'mouseout':
                    isActive ? toggleShadow(['focus', 'default'], dCss) : toggleShadow(['default'], dCss);
                    break;
                case 'mousedown':
                    isActive ? toggleShadow(['active_focus_hover', 'active_hover', 'active_focus', 'active', 'focus_hover', 'hover', 'focus'], dCss) : toggleShadow(['active_hover', 'active', 'hover'], dCss);
                    break;
                case 'mouseup':
                    isHover ? toggleShadow(['focus_hover', 'hover', 'focus'], dCss) : toggleShadow(['focus'], dCss);
                    break;
                case 'keydown':
                    isHover ? toggleShadow(['active_focus_hover', 'active_hover', 'active_focus', 'active', 'focus_hover', 'hover', 'focus'], dCss) : toggleShadow(['active_focus', 'active', 'focus'], dCss);
                    break;
                case 'keyup':
                    isHover ? toggleShadow(['focus_hover', 'hover', 'focus'], dCss) : toggleShadow(['focus'], dCss);
                    break;
                case 'focus':
                    isHover ? toggleShadow(['active_focus_hover', 'active_hover', 'active_focus', 'active', 'focus_hover', 'hover', 'focus'], dCss) : toggleShadow(['focus'], dCss);
                    break;
                case 'blur':
                    toggleShadow(['default'], dCss);
                    break;
            }
        }
    }
}
(function(_win, _doc) {
    'use strict';
    if(_doc.documentMode === 9) {
        var removeTextShadowForIE9 = function() {
            for(var _$, arr = _doc.querySelectorAll('.dummyShadow'), i = 0, l = arr.length; i < l; i++) {
                if(arr[i]) {
                    _$ = arr[i].parentNode;
                    _$.removeChild(arr[i]);
                    _$.removeAttribute('data-pseudo');
                    _$.removeAttribute('data-dynpseudo');
                    for(var eArr = ['mouseover', 'mouseout', 'mousedown', 'mouseup', 'keydown', 'keyup', 'focus', 'blur'], j = 0, k = eArr.length; j < k; j++) {
                        _$.removeEventListener(eArr[j], toggleDPseudoClassShadow, false);
                    }
                }
            }
            _doc.documentElement.removeEventListener('beforecopy', removeShadowBeforeCopy, true);
            _doc.documentElement.removeEventListener('copy', setShadowQAtCopy, true);
            _doc.documentElement.removeEventListener('blur', resetShadowAfterCopy, true);
            _win.alert((_$ = _doc.documentElement.getAttribute('lang')) && /^ja(?:\-JP)?$/.test(_$) ? '\u8a2d\u5b9a\u5b8c\u4e86' : 'Done');
            _$ = _doc.getElementById('textShadowConfirmation');
            _$ && _$.parentNode.removeChild(_$);
        };
        var checkTextShadowConfirmation = function() {
            var _$ = _doc.getElementById('textShadowCheck');
            _$ && (_$.checked ? (setCookie('removeShadow', _$.value), (_$ = getCookie('removeShadow')) ? _$ === '1' && removeTextShadowForIE9() : _win.alert((_$ = _doc.documentElement.getAttribute('lang')) && /^ja(?:\-JP)?$/.test(_$) ? 'Cookie\u3092\u6709\u52b9\u306b\u3057\u3066\u304b\u3089\u518d\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044' : 'Please enable Cookie')) : removeCookie('removeShadow'));
        };
        var removeCookie = function(k) {
            if(!k) { return; }
            _doc.cookie = encodeURIComponent(k) + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
        };
        var setCookie = function(k, v) {
            if(!k || /^(?:expires|max\-age|path|domain|secure)$/i.test(k)) { return; }
            _doc.cookie = encodeURIComponent(k) + '=' + encodeURIComponent(v);
        };
        var getCookie = function(k) {
            var hasKey = function(k, c) {
                return (new RegExp('(?:^|;\\s*)' + encodeURIComponent(k).replace(/[\-\.\+\*]/g, '\\$&') + '\\s*\\=')).test(c);
            };
            var _$ = _doc.cookie;
            if(!k || !_$ || _$ && !hasKey(k, _$)) { return; }
            return decodeURIComponent(_$.replace(new RegExp('(?:^|.*;\\s*)' + encodeURIComponent(k).replace(/[\-\.\+\*]/g, '\\$&') + '\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*'), '$1'));
        };
        var removeShadowBeforeCopy = function() {
            for(var _$ = _doc.querySelectorAll('.dummyShadow'), i = 0, l = _$.length; i < l; i++) {
                _$[i] && _$[i].parentNode.removeChild(_$[i]);
            }
            _$ = _doc.getElementById('textShadowConfirmation');
            _$ && _$.parentNode.removeChild(_$);
        };
        var setShadowQAtCopy = function(evt) {
            evt.preventDefault();
            _Q = _doc.selection.createRange().text;
            _win.clipboardData.setData('text', _Q);
            !getCookie('removeShadow') && forScreenReaders();
        };
        var resetShadowAfterCopy = function() {
            _Q !== '' && (_Q = '', textShadowForIE9());
        };
        var forScreenReaders = function() {
            var _$ = _doc.documentElement.getAttribute('lang'),
                _body = _doc.querySelector('body'),
                aDiv = _doc.createElement('div'),
                aForm = _doc.createElement('form'),
                aField = _doc.createElement('fieldset'),
                aLegend = _doc.createElement('legend'),
                aP1 = _doc.createElement('p'),
                aP2 = _doc.createElement('p'),
                aP3 = _doc.createElement('p'),
                aLabel = _doc.createElement('label'),
                aCheck = _doc.createElement('input'),
                aSubmit = _doc.createElement('input');
            _$ = _$ && /^ja(?:\-JP)?$/.test(_$) ? true : false;
            aDiv.id = 'textShadowConfirmation';
            aDiv.setAttribute('style', 'position:absolute;left:-9999px;width:0;height:0;overflow:hidden;');
            aDiv.setAttribute('aria-hidden', 'true');
            aDiv.setAttribute('role', 'presentation');
            aForm.id = 'textShadowConfirmForm';
            aLabel.setAttribute('for', 'textShadowCheck');
            aCheck.id = 'textShadowCheck';
            aCheck.setAttribute('type', 'checkbox');
            aCheck.setAttribute('value', '1');
            aCheck.setAttribute('role', 'checkbox');
            aSubmit.setAttribute('type', 'submit');
            aSubmit.setAttribute('role', 'button');
            aLegend.appendChild(_doc.createTextNode(_$ ? '\u30b9\u30af\u30ea\u30fc\u30f3\u30ea\u30fc\u30c0\u30fc\u5229\u7528\u8005\u3078\u306e\u304a\u77e5\u3089\u305b' : 'Notification to Screen Reader users'));
            aP1.appendChild(_doc.createTextNode(_$ ? '\u3053\u306e\u30b5\u30a4\u30c8\u306b\u306f\u3001Internet\u0020Explorer\u00209\u306bCSS3\u306etext\u002dshadow\u7684\u306a\u88c5\u98fe\u52b9\u679c\u3092\u4e0e\u3048\u308bJavaScript\u300ctext\u002dshadow\u0020for\u0020IE9\u300d\u304c\u9069\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u000a\u3053\u306e\u305f\u3081\u3001\u4e00\u90e8\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u30ea\u30fc\u30c0\u30fc\u3067\u306f\u3001text\u002dshadow\u306e\u88c5\u98fe\u52b9\u679c\u304c\u9069\u7528\u3055\u308c\u305f\u90e8\u5206\u306e\u8a9e\u53e5\u304c\u7e70\u308a\u8fd4\u3057\u8aad\u307f\u4e0a\u3052\u3089\u308c\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u000a\u3053\u306e\u6319\u52d5\u3092\u4fee\u6b63\u3059\u308b\u306b\u306f\u3001\u6b21\u306e\u8a2d\u5b9a\u3092\u884c\u3063\u3066\u4e0b\u3055\u3044\u3002' : 'This site contains a JavaScript polyfill which applies CSS3 text-shadow effect to Internet Explorer 9. Due to this, some screen readers will repeat phrases where text-shadow effect is applied. To change this behavior, set the following.'));
            aLabel.appendChild(aCheck);
            aLabel.appendChild(_doc.createTextNode(_$ ? '\u300ctext\u002dshadow\u0020for\u0020IE9\u300d\u3092\u7121\u52b9\u306b\u3059\u308b' : 'Remove text-shadow for IE9 polyfill'));
            aP2.appendChild(aLabel);
            aSubmit.setAttribute('value', _$ ? '\u5b9f\u884c' : 'Submit');
            aP3.appendChild(aSubmit);
            aField.appendChild(aLegend);
            aField.appendChild(aP1);
            aField.appendChild(aP2);
            aField.appendChild(aP3);
            aForm.appendChild(aField);
            aDiv.appendChild(aForm);
            _body.insertBefore(aDiv, _body.firstChild);
            aForm.addEventListener('submit', function(evt) {
                evt.preventDefault();
                checkTextShadowConfirmation();
            }, false);
        };
        var runTextShadowForIE9 = function() {
            if(_doc.documentElement.filters) {
                var _$, _body = _doc.querySelector('body'), elm = _doc.createElement('div');
                elm.setAttribute('style', 'width:0;height:0;visibility:hidden;-ms-filter:"progid:DXImageTransform.Microsoft.Blur()"');
                _body.appendChild(elm);
                _$ = elm.filters.item('DXImageTransform.Microsoft.Blur').Enabled;
                _body.removeChild(elm);
                _$ && !getCookie('removeShadow') && (elm = _doc.createElement('style'), _doc.querySelector('head').appendChild(elm), elm.sheet.insertRule('@media print{.dummyShadow{display:none;}}', elm.sheet.cssRules.length), _doc.documentElement.addEventListener('beforecopy', removeShadowBeforeCopy, true), _doc.documentElement.addEventListener('copy', setShadowQAtCopy, true), _doc.documentElement.addEventListener('blur', resetShadowAfterCopy, true), forScreenReaders(), textShadowForIE9());
            }
        };
        var _Q = '';
        _doc.addEventListener('DOMContentLoaded', runTextShadowForIE9, false);
    }
})(window, document);

"IE9でもtext-shadow(再公開)"へのTwitter上でのコメントやRT

13件のツイートがあります。

ツイート 1

ツイート 2

ツイート 3

ツイート 4

ツイート 5

ツイート 6

ツイート 7

ツイート 8

ツイート 9

ツイート 10

ツイート 11

ツイート 12

ツイート 13