Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Opera - плагины, дополнения, панели, кнопки, утилиты

Модерирует : gyra, Maz

articlebot (26-09-2016 11:41): продолжение - Opera - плагины, дополнения, панели, кнопки и т.д. (часть 5)  Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

   

Watson_Rus_2

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
// ==UserScript==
// @name                Ultimate Search Highlighter
// @namespace        http://my.opera.com/community/forums/findpost.pl?id=1648805
// @version            1.61
// @description    Highlights search terms on page, with summaries of results, and search engine integration.
// @download        http://files.myopera.com/Stoen/uhb/highlighter.js
// @include            *
// ==/UserScript==
 
'use strict';
 
((window.opera?window.opera:window).USH = new function() {
    var preferences = {
        runOnLoad: /*@runOnLoad: Run script on page load based on search engine referrer@bool@*/true/*@*/,
        runOnKeyPress:  /*@runOnKeyPress: Run script on any key press@bool@*/false/*@*/,
        autoHideDelay: /*@autoHideDelay: Time in ms after which the toolbar will hide if not in use. 0 to disable@int@*/2000/*@*/,
        highlightOnLoad: /*@highlightOnLoad: Highlight page automatically or just show toolbar@bool@*/true/*@*/,
        toolbarHiddenOnLoad: /*@toolbarHiddenOnLoad: Toolbar is initially hidden@bool@*/false/*@*/,
        toolbarAtBottom: /*@toolbarAtBottom: Show the toolbar at the bottom of the screen@bool@*/false/*@*/,
        toolbarOverText: /*@toolbarOverText: Show the toolbar over text@bool@*/true/*@*/,
        useStopwords: /*@useStopwords: Highlight words ignored by search engines. Only used for search engine highlights@bool@*/false/*@*/,
        useCookies: /*@useCookies: Use cookies to store searches@bool@*/true/*@*/,
        useDOMStorage: /*@useDOMStorage: Use HTML5 localStorage instead of cookies to store searches@bool@*/true/*@*/,
        useWindowName: /*@useWindowName: Use window.name to store referrer information@bool@*/false/*@*/,
        enableSearchHistory: /*@enableSearchHistory: Number of previous searches to save. 0 to disable@int@*/10/*@*/,
        hideColour: /*@hideColour: Hide coloured highlights for search terms@bool@*/false/*@*/,
        embedStyle: /*@embedStyle: Embed CSS via javascript. False if using external CSS@bool@*/true/*@*/,
        checkDocChanges: /*@checkDocChanges: Re-highlights when scripts dynamically change document content@bool@*/true/*@*/,
        hideHighlightHTML: /*@hideHighlightHTML: Removes highlights from Element.innerHTML and Element.outerHTML getters@bool@*/true/*@*/,
        inputDelay: /*@inputDelay: Time in ms after which text typed into the toolbar will be used for highlighting. 0 to disable@int@*/300/*@*/,
        keyShortcuts: [
            ['run',                /*@runKey: Keyboard shortcut to run script@string@*/'/?'/*@*/,
                                        /*@_runKey+Optional modifier@bool@*/false/*@*/,
                                        /*@_runKey+Ctrl@bool@*/true/*@*/,
                                        /*@_runKey+Shift@bool@*/false/*@*/],
            ['enable',        /*@enableKey: Keyboard shortcut toggle. Enables or disables the following shortcuts@string@*/'`~'/*@*/,
                                        /*@_enableKey+Optional modifier@bool@*/true/*@*/,
                                        /*@_enableKey+Ctrl@bool@*/false/*@*/,
                                        /*@_enableKey+Shift@bool@*/false/*@*/],
            ['mOver',            /*@mOverKey: Keyboard shortcut to toggle toolbar visibility@string@*/'9('/*@*/,
                                        /*@_mOverKey+Optional modifier@bool@*/true/*@*/,
                                        /*@_mOverKey+Ctrl@bool@*/false/*@*/,
                                        /*@_mOverKey+Shift@bool@*/false/*@*/],
            ['optsBttn',    /*@optsBttnKey: Keyboard shortcut for the 'Options' button@string@*/'0)'/*@*/,
                                        /*@_optsBttnKey+Optional modifier@bool@*/true/*@*/,
                                        /*@_optsBttnKey+Ctrl@bool@*/false/*@*/,
                                        /*@_optsBttnKey+Shift@bool@*/false/*@*/],
            ['newBttn',        /*@newBttnKey: Keyboard shortcut for the 'New' button@string@*/'-_'/*@*/,
                                        /*@_newBttnKey+Optional modifier@bool@*/true/*@*/,
                                        /*@_newBttnKey+Ctrl@bool@*/false/*@*/,
                                        /*@_newBttnKey+Shift@bool@*/false/*@*/],
            ['hideBttn',    /*@toggleBttnKey: Keyboard shortcut for the 'Toggle' button@string@*/'=+'/*@*/,
                                        /*@_toggleBttnKey+Optional modifier@bool@*/true/*@*/,
                                        /*@_toggleBttnKey+Ctrl@bool@*/false/*@*/,
                                        /*@_toggleBttnKey+Shift@bool@*/false/*@*/],
            ['closeBttn',    /*@closeBttnKey: Keyboard shortcut for the 'Close' button@string@*/'\\|'/*@*/,
                                        /*@_closeBttnKey+Optional modifier@bool@*/true/*@*/,
                                        /*@_closeBttnKey+Ctrl@bool@*/false/*@*/,
                                        /*@_closeBttnKey+Shift@bool@*/false/*@*/],
            [0,    /*@term1Key: Keyboard shortcut for search term 1@string@*/'1!'/*@*/,true],
            [1,    /*@term2Key: Keyboard shortcut for search term 2@string@*/'2@'/*@*/,true],
            [2,    /*@term3Key: Keyboard shortcut for search term 3@string@*/'3#'/*@*/,true],
            [3,    /*@term4Key: Keyboard shortcut for search term 4@string@*/'4$'/*@*/,true],
            [4,    /*@term5Key: Keyboard shortcut for search term 5@string@*/'5%'/*@*/,true],
            [5,    /*@term6Key: Keyboard shortcut for search term 6@string@*/'6^'/*@*/,true],
            [6,    /*@term7Key: Keyboard shortcut for search term 7@string@*/'7&'/*@*/,true],
            [7,    /*@term8Key: Keyboard shortcut for search term 8@string@*/'8*'/*@*/,true]
        ],
        usePunctuation: /*@usePunctuation: Allow matching of search terms regardless of punctuation@bool@*/false/*@*/,
        wholeWordsOnly: /*@wholeWordsOnly: Only highlight whole words@bool@*/false/*@*/,
        matchCase: /*@matchCase: Highlights are case sensitive@bool@*/false/*@*/,
        useRegExp: /*@useRegExp: Search using a Regular Expression@bool@*/false/*@*/
    },
    colours = ["#ffff66","#A0FFFF","#99ff99","#ff9999","#ff66ff","#FF7F50","#00FF00","#7FFF00","#00BFFF","#FF00FF","#FFD700","#CD5C5C","#C0C0C0","#B0C4DE","#808000","#FFA500","#ADD8E6"],
    searchEngines = [null
        ,[1,null,null,'#USH:(.+)$']
        ,[2,'\\w+\\.+google\\.[^.]{2,3}(?:\\.[^.]{2})?/(?:(?:search)|(?:url))\\?.*',null,'[&?#]q=([^&]+)']
        ,[2,'\\w+\\.bing\\.com',null,'[&?]q=([^&]+)']
        ,[2,'search\\.yahoo\\.com',null,'[&?]p=([^&]+)']
        ,[2,'yandex\\.',,'text=([^&]+)']
        ,[2,'\\w+\\.wikipedia\\.org/wiki/Special:Search',null,'[&?]search=([^&]+)']
        ,[2,'(?:www\\.)??ask\\.com',null,'[&?]q=([^&]+)']
        ,[2,'my\\.opera\\.com/community/forums/search\\.dml.*',null,'[&?]term=([^&]+)']
        ,[4,null,null,'UserJS-USH=(.*?)(?:;|$)']
    ],
    strings = {
        _opts: 'Options',
        _new: 'New highlight',
        _hide: 'Toggle highlights',
        _close: 'Close',
        _goto: 'Goto next instance of',
        _gotoPrev: 'Goto previous instance of',
        _nfound: 'not found',
        _regExpError: 'Ultimate Search Highlighter:\nFailed to create RegExp. Check syntax\n',
        _preProcessError: 'Ultimate Search Highlighter:\nFailed to create Pre-Processor. Check syntax\n',
        _usePunctuation: 'Match punctuation',
        _wholeWordsOnly: 'Match whole words only',
        _matchCase: 'Match case',
        _useRegExp: 'Match as RegExp',
        _clearHistory: 'Clear search history'
    },
    frameIndex = 0,
    frames = [null],
    iID = window.setTimeout(function(){},0),
    merlin = window.opera && window.opera.version() < 9.5,
    query = null,
    running = 0,
    USH = this,
    highlight = {
        add: function(e) {
            if( !results.terms ) { return; }
            var excElems = ['userjs-ush-toolbar','userjs-ush-highlight','head','applet','object','embed','param','script','noscript','style','frameset','frame','iframe','textarea','input','option','select','img','map'],
                    textNodes = document.evaluate('.//text()[normalize-space() and not(ancestor::text() or ancestor::*[contains(" '+excElems.join(' ')+' ",concat(" ",local-name()," "))])]',e&&e.srcElement||document,null,7,null),
                    hFind, hElem, i, k, textNode, term;
 
            if( !(i = textNodes.snapshotLength) ) { return; }
            toolbar.bar.setAttribute('busy','');
 
            (hElem = document.createElementNS(resolver.xhtmlNS,'userjs-ush-highlight')).tabIndex = 0;
            hElem.setAttribute('iID',iID);
            hElem.setAttribute(preferences.hideColour?'off':'on','');
 
            while( i-- ) {
                if( (textNode = textNodes.snapshotItem(i)).nodeType != 3 ) { continue; }
                while(hFind = results.regExp.exec(textNode.data)) {
                    if( !hFind[0] ) { break; }
                    for( k = 1; !hFind[k++]; );
                    term = results.terms[k-=2];
 
                    (hElem = hElem.cloneNode(false)).style.background = term.colour;
                    hElem.setAttribute('term',k);
 
                    textNode = textNode.splitText(hFind.index+hFind[0].length-hFind[k+1].length);
                    textNode.deleteData(0,(hElem.textContent=hFind[k+1]).length);
                    textNode.parentNode.insertBefore(hElem,textNode);
                }
            }
            toolbar.bar.removeAttribute('busy');
        },
        get: function(expr,el) {
            if( (el = el||document).querySelectorAll ) {
                el = el.querySelectorAll('userjs-ush-highlight'+expr.replace(/@/g,''));
                el.snapshotLength = el.length;
                el.snapshotItem = function(i) { return this[i]; }
                return el;
            }
            return document.evaluate('.//*[local-name()="userjs-ush-highlight"]'+expr,el,null,7,null);
        },
        remove: function(toggle,idx,el) {
            var i, j, node, nodes = this.get('[@iID="'+iID+'"][@term'+(idx!==undefined?'="'+idx+'"]':']'),el);
            i = nodes.snapshotLength; while( i-- ) {
                node = nodes.snapshotItem(i);
                if( toggle ) { node.setAttribute((j = node.hasAttribute('on'))?'off':'on',''); node.removeAttribute(j?'on':'off'); }
                else { j = node.parentNode; j.replaceChild(node.firstChild,node); j.normalize(); }
            }
            return el;
        }
    },
    mutation = {
        timer: null,
        types: [
            ['DOMNodeInsertedIntoDocument',true],
            ['DOMNodeRemovedFromDocument',true],
            ['DOMCharacterDataModified',false]
        ],
        handlers: {
            DOMNodeInsertedIntoDocument: [highlight.add],
            DOMNodeRemovedFromDocument: [],
            DOMCharacterDataModified: [highlight.add]
        },
        handleEvent: function(e) {
            var i, handler;
            window.clearTimeout(this.timer);
            USH.running(1);
            for( i = 0; handler = this.handlers[e.type][i++]; ) {
                if( handler instanceof Function || (handler = handler.handleEvent) instanceof Function ) { handler(e); }
            }
            this.timer = window.setTimeout(function(el) { USH.running(1); toolbar.update(); USH.running(0); },500);
            USH.running(0);
        }
    },
    resolver = {
        xhtmlNS: 'http://www.w3.org/1999/xhtml',
        lookupNamespaceURI: function() { return this.xhtmlNS; }
    },
    results = {
        regExp: null,
        terms: null,
        timer: null,
        clear: function() { window.clearTimeout(this.timer); this.terms = this.regExp = null; },
        handleEvent: function(e) {
            var    el = e.target, idx = el.getAttribute('idx'), term = this.terms[idx], d, t = toolbar, o, x, xT, y, yT;
            if( !term || !term.total ) { return }
            window.clearTimeout(this.timer);
 
            if( e.ctrlKey ) { if( --term.current < 0 ) { term.current = term.total-1; } }
            else if( ++term.current >= term.total ) { term.current = 0; }
            USH.running(1); el.childNodes[1].data = term.text+' ['+(Math.pow(10,(term.total+'').length)+term.current+1+'').substring(1)+'/'+term.total+'] '; USH.running(0);
            if( !(el = highlight.get('[@iID="'+iID+'"][@term="'+idx+'"]').snapshotItem(term.current)) ) { return; }
            t.mOver.className = t.bar.className = 'userjs-ush-hide';
            d = getDim(el);
            t.mOver.className = t.bar.className = '';
            if( !d.visible ) { return (e.run = term.current||!e.run)?this.handleEvent(e):0; }
 
            this.timer = window.setTimeout(function(el) { var r = document.createRange(); r.selectNodeContents(el); window.getSelection().addRange(r); results.timer = null; },500,el);
            el.focus();
 
            el.scrollIntoView(!preferences.toolbarAtBottom);
            d = getDim(el); o = getDim(t.input).height; t = getDim(t.bar);
            x = d.left-o; xT = t.left; y = d.bottom+o; yT = t.visible?t.top:0;
            window.scrollBy((x<xT || (x=d.right+o)>(xT=t.right))?x-xT:0,preferences.toolbarAtBottom?(y>yT?y-yT:0):((y=d.top-o)<(yT=t.visible?t.bottom:0)?y-yT:0));
        },
        init: function() {
            var i, j, k, qArr, q = query, isRE = preferences.useRegExp, term, terms = [], tmp = [],
            punc = /[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]/g,
            wb = (preferences.wholeWordsOnly && /[^\x20-\x7e]/.test(q))?/[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\xa9\xab-\xb4\xb6-\xb9\xbb-\xbf\xd7\xf7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02ED\u02EF-\u02FF\u0374\u0375\u037E-\u0385\u0387\u03F6\u0482\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3-\u060F\u061B-\u061F\u066A-\u066D\u06D4\u06DD\u06E9\u06FD\u06FE\u0700-\u070F\u07F6-\u07F9\u0964\u0965\u0970\u09F2-\u09FA\u0AF1\u0B70\u0BF0-\u0BFA\u0CF1\u0CF2\u0DF4\u0E3F\u0E4F\u0E5A\u0E5B\u0F01-\u0F17\u0F1A-\u0F1F\u0F2A-\u0F34\u0F36\u0F38\u0F3A-\u0F3D\u0F85\u0FBE-\u0FC5\u0FC7-\u0FD1\u104A-\u104F\u10FB\u1360-\u137C\u1390-\u1399\u166D\u166E\u1680\u169B\u169C\u16EB-\u16F0\u1735\u1736\u17B4\u17B5\u17D4-\u17D6\u17D8-\u17DB\u17F0-\u180A\u180E\u1940-\u1945\u19DE-\u19FF\u1A1E\u1A1F\u1B5A-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD-\u2070\u2074-\u207E\u2080-\u208E\u20A0-\u20B5\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u2153-\u2182\u2190-\u2B23\u2CE5-\u2CFF\u2E00-\u3004\u3007-\u3029\u3030\u3036-\u303A\u303D-\u303F\u309B\u309C\u30A0\u30FB\u3190-\u319F\u31C0-\u31CF\u3200-\u33FF\u4DC0-\u4DFF\uA490-\uA716\uA720\uA721\uA828-\uA82B\uA874-\uA877\uD800-\uF8FF\uFB29\uFD3E\uFD3F\uFDFC\uFDFD\uFE10-\uFE19\uFE30-\uFE6B\uFEFF-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFFE0-\uFFFD]/.source:'\\b',
            sw = searchEngines[0]&2 && !preferences.useStopwords && /(?:^|\s)(?:intext:|(?:filetype|site|related|info|daterange|link|inurl|inanchor|intitle):\S*|(?:I|a|about|an|are|as|at|be|by|com|for|from|how|in|is|it|of|on|or|that|the|this|to|was|what|when|where|who|will|with|and|the|www)(?=$|\s))/gi;
 
            if( !q.indexOf('USHRegExp ') ) { isRE = true; q = q.substring(10); }
            if( isRE ) { qArr = [,,q]; }
            else {
                qArr = (searchEngines[0]&2?query=q.replace(/\++?(\+)?/g,' $1'):q).split(/([\s+|\-]*)"([^"]*)"/);
                for( i = 0; (term = qArr[i]) != null; i+=3 ) {
                    if( !term ) { qArr[i] = 1; continue; }
                    term = (' '+(sw?term.replace(sw,' '):term)).split(/([\s+|][\s+|\-]*)/);
                    for( j = 0, k = (term.length-1)/2; j < k; j++ ) { qArr.splice(i+3*j,0,0,term[2*j+1],term[2*j+2]); }
                    qArr[i+=3*j] = 1;
                }
            }
            for( i = 2, j = 0; (term = qArr[i]) != null; i += 3 ) {
                if( !term || terms['_'+term] || (/-$/).test(qArr[i-1]) ) { continue; }
                terms[j] = isRE?term:term.replace(punc,(qArr[i-2]||preferences.usePunctuation||!term.replace(punc,''))?'\\$&':punc.source+'?');
                terms['_'+term] = true;
                tmp[j] = { text: qArr[i-2]?'"'+term+'"':term, colour: colours[j++%colours.length], total: 0, current: -1 };
            }
 
            term = (!isRE && preferences.wholeWordsOnly?'(?:^|'+wb+')(?:('+terms.join(')|(')+'))(?='+wb+'|$)':'('+terms.join(')|(')+')');
            try { this.regExp = new RegExp(term,preferences.matchCase?'':'i'); }
            catch(e) { return log(strings._regExpError+term); }
            this.terms = tmp.length?tmp:null;
            if( searchEngines[0]&(window==window.top?13:15) ) { return; }
            saveVal('query',query);
            if( !toolbar.onInput.timer ) { window.setTimeout(function() { searchData.historyAdd(query); },0); }
        }
    },
    searchData = {
        keys: ['hash','referrer','storage'],
        assign: function(data) {
            var i, key, sE, rE = new RegExp();
            if( data && (data = data.split('|')) ) {
                for( i = 0; key = this.keys[i]; this[key] = decodeURIComponent(data[i++])||this[key] );
            }
            for( i = 1; sE = searchEngines[i++]; ) {
                data = '';
                switch( searchEngines[0] = sE[0] ) {
                    case 1:
                        data = this.hash;
                        break;
                    case 2: case 3:
                        if( !preferences.runOnLoad ) { }
                        else if( (rE.compile('^https?://'+sE[1])||rE).test(window.location) ) {
                            if( sE[0] == 3 ) { data = window.location; }
                            else if( preferences.useWindowName ) { window.name = window.location; }
                        }
                        else if( rE.test(this.referrer) ) { data = (sE[0]==2)&&this.referrer; }
                        break;
                    case (preferences.useDOMStorage||preferences.useCookies)&&4:
                        data = this.storage;
                }
 
                if( data && (rE.compile(sE[3])||rE).test(data) ) {
                    for( i = 1, query = '', data = data.split(rE); key = data[i]; i+=2 ) { query += ' '+decodeURIComponent(key); }
                    query = query.substring(1);
                    if( sE[4] ) {
                        try { query = new Function('q',sE[4])(query); }
                        catch(e) { log(strings._preProcessError+sE[4]); }
                    }
                    break;
                }
            }
        },
        historyAdd: function(val) {
            if( this.history && val ) {
                this.historyDel(val);
                USH.running(1); this.history.setItem(toolbar.list.insertBefore(new window.Option(),toolbar.list.firstChild).value = val,0); USH.running(0);
                if( this.history.length > preferences.enableSearchHistory ) { this.historyDel(toolbar.list.lastChild.value); }
            }
        },
        historyDel: function(val) {
            if( this.history && (val = document.evaluate('./option[@value=../@val]',toolbar.list.setAttribute('val',val)||toolbar.list,null,9,null).singleNodeValue) ) {
                this.history.removeItem(val.value);
                USH.running(1); toolbar.list.removeChild(val); USH.running(0);
            }
        },
        historyClear: function() {
            if( this.history ) {
                USH.running(1); toolbar.list.textContent = ''; USH.running(0);
                this.history.clear();
            }
        },
        init: function(store) {
            this.hash = window.location.hash;
            this.referrer = (preferences.useWindowName && !!window.opener && window.opener.name)||document.referrer;
            this.storage = preferences.useDOMStorage?window.localStorage.getItem('UserJS-USH'):preferences.useCookies?document.cookie:'';
            this.history = store;
            delete this.init;
        },
        toString: function() { for( var data = '', key, i = 0; key = this.keys[i++]; data += encodeURIComponent(this[key])+'|' ); return data; }
    },
    toolbar = {
        enabled: false,
        timer: null,
        visible: false,
        bar: null,
        buttons: [],
        closeBttn: null,
        list: null,
        hideBttn: null,
        input: null,
        mOver: null,
        newBttn: null,
        optsBttn: null,
        optsMenu: null,
        styles: null,
        create: function() {
            var xhtmlNS = resolver.xhtmlNS, divEl, elem, i, term, terms;
 
            function createButton(id,fn) {
                var el = document.createElementNS(xhtmlNS,'userjs-ush-bttn');
                el.className = 'userjs-ush-bttn-icon-'+id; el.title = strings['_'+id];
                el.addEventListener('click',fn||function(e){ USH.run(e,this.className); },false);
                return toolbar.bar.appendChild(toolbar[id+'Bttn'] = el);
            }
 
            function createPref(id,fn) {
                var el = document.createElementNS(xhtmlNS,'label');
                el.appendChild(document.createElementNS(xhtmlNS,'input')).type = 'checkbox';
                el.firstChild.setAttribute('prefIdx',id);
                el.firstChild.checked = preferences[id];
                el.firstChild.addEventListener('change',fn||function(e) { saveVal(this.getAttribute('prefIdx'),this.checked); USH.run(e,'userjs-ush-bttn-icon-new'); },false);
                el.appendChild(document.createTextNode(strings['_'+id]));
                return toolbar.optsMenu.appendChild(el);
            }
 
            if( !this.bar ) {
                (divEl = this.bar = document.createElementNS(xhtmlNS,'userjs-ush-toolbar')).tabIndex = 0;
                divEl.focus = function(oF) { return function() {
                    this.className = 'userjs-ush-prefocus';
                    oF.call(this);
                    this.className = '';
                }}(divEl.focus);
 
                (this.bar.appendChild(this.optsMenu = document.createElementNS(xhtmlNS,'optgroup'))).className = 'userjs-ush-fade';
                createPref('usePunctuation');
                createPref('wholeWordsOnly');
                createPref('matchCase');
                createPref('useRegExp');
 
                createButton('close');
                createButton('hide');
                createButton('opts',function(e) {
                    var active = this.hasAttribute('active');
                    this[active?'removeAttribute':'setAttribute']('active','');
                    toolbar.optsMenu.className = (active||e.ctrlKey)?'userjs-ush-fade':'';
                });
 
                (this.input = i = this.bar.appendChild(document.createElementNS(xhtmlNS,'input'))).className = 'userjs-ush-input';
                i.value = query||'';
                i.setAttribute('form','');
                i.addEventListener('input',this.onInput,false);
 
                createButton('new');
 
                if( searchData.history ) {
                    i.setAttribute('list',(this.list = this.bar.appendChild(document.createElementNS(xhtmlNS,'datalist'))).id = 'userjs-ush-list');
                    createPref('clearHistory',function() { searchData.historyClear(); this.checked = false; });
                    window.setTimeout(function(h) { USH.running(1); for( var i = h.length; i; toolbar.list.appendChild(new window.Option()).value = h.key(--i) ); USH.running(0); },0,searchData.history);
                }
 
                (this.mOver = document.createElementNS(xhtmlNS,'userjs-ush-mouseover')).addEventListener('click',this,false);
                if( !preferences.autoHideDelay ) { preferences.toolbarOverText = false; }
                else {
                    divEl.addEventListener('DOMFocusOut',this,false);
                    divEl.addEventListener('mouseout',this,false);
                    divEl.addEventListener('mouseover',this,false);
                    this.mOver.addEventListener('mouseover',this,false);
                }
 
                if( preferences.embedStyle || !preferences.toolbarOverText ) {
                    (this.styles = document.createElementNS(xhtmlNS,"style")).textContent = 'html { position: relative !important; }'+(preferences.embedStyle?'\
                    userjs-ush-mouseover { height: 1em !important; z-index: 99999980 !important; }\
                    userjs-ush-toolbar { background: -o-skin("Viewbar Skin") #f2f2ee !important; -moz-appearance: statusbar; z-index: 99999990 !important; }\
                    userjs-ush-toolbar[mini=on], userjs-ush-mouseover[mini=on] { right: auto !important; min-width: 26.5em !important; }\
                    userjs-ush-toolbar[top], userjs-ush-mouseover[top] { bottom: auto !important; top: 0 !important; }\
                    .userjs-ush-prefocus { margin: 1em !important; }\
                    #userjs-ush-list, .userjs-ush-hide { display: none !important; }\
                    userjs-ush-toolbar, userjs-ush-toolbar *, userjs-ush-highlight[on] { text-align: left !important; text-indent: 0 !important; margin: 0 !important; padding: 0 !important; min-height: 0 !important; height: auto !important; max-height: none !important; min-width: 0 !important; width: auto !important; max-width: none !important; float: none !important; clear: none !important; color: #000 !important; -o-transition: opacity .5s, visibility .5s !important; }\
                    userjs-ush-toolbar, userjs-ush-mouseover { display: block !important; position: fixed !important; width: 100% !important; min-width: 100% !important; font: 12px/18px Arial, sans-serif !important; padding: 1px 0 !important; }\
                    userjs-ush-toolbar * { display: inline-block !important; font: inherit !important; vertical-align: middle !important; border: none !important; box-sizing: border-box !important; margin: 2px !important; text-shadow: #FFF 0 0 5px !important; }\
                    userjs-ush-highlight[off] { background: transparent !important; color: inherit !important; }\
                    userjs-ush-highlight:focus { outline: -o-highlight-border !important; }\
                    userjs-ush-bttn { background: -o-skin("Infobar Button Skin") !important; -moz-appearance: toolbarbutton; padding: 2px 4px !important; }\
                    userjs-ush-bttn:hover { background: -o-skin("Infobar Button Skin.hover") !important; }\
                    userjs-ush-bttn:active, userjs-ush-bttn[active] { background: -o-skin("Infobar Button Skin.pressed") !important; }\
                    userjs-ush-bttn>userjs-ush-icon { width: 1em !important; height: 1em !important; border: 1px #BBB solid !important; }\
                    userjs-ush-bttn>.userjs-ush-icon-prev { background: url("chrome://global/skin/icons/collapse.png") 50% 50% no-repeat !important; background: -o-skin("Find Previous") !important; width: 1.3em !important; height: 1.3em !important; margin: 0 .3em 0 0 !important; border-width: 0 1px 0 0 !important; opacity: 0.7 !important; }\
                    userjs-ush-bttn>userjs-ush-icon:hover { border-color: #666 !important; opacity: 1 !important; }\
                    [class^=userjs-ush-bttn-icon], [class^=userjs-ush-bttn-icon]::before { content: "" !important; float: right !important; min-height: 1.5em !important; min-width: 1.5em !important; }\
                    .userjs-ush-bttn-icon-opts::before { background: url("chrome://global/skin/icons/question-16.png") 50% 50% no-repeat !important; background: -o-skin("View") !important; }\
                    .userjs-ush-bttn-icon-new::before { background: url("chrome://global/skin/icons/Search-glass.png") 50% 50% no-repeat !important; background: -o-skin("Find") !important; }\
                    userjs-ush-toolbar[busy]>.userjs-ush-bttn-icon-new { background: -o-skin("Infobar Button Skin.pressed") !important; }\
                    .userjs-ush-bttn-icon-hide::before { background: url("chrome://global/skin/icons/Restore.gif") 50% 50% no-repeat !important; background: -o-skin("Mail Compose Text Color") !important; }\
                    .userjs-ush-bttn-icon-close::before { background: url("chrome://global/skin/icons/Close.gif") 50% 50% no-repeat !important; background: -o-skin("Close Widget") !important; }\
                    .userjs-ush-bttn-icon-opts, .userjs-ush-bttn-icon-new { float: none !important; }\
                    .userjs-ush-input { min-width: 16em !important; background: -o-skin("Edit Skin") !important; padding: 4px 3px 3px !important; }\
                    userjs-ush-toolbar>optgroup { position: absolute !important; bottom: 100% !important; background: -o-skin("Rich Popup Menu Skin") !important; padding: 1em !important; }\
                    .userjs-ush-fade { visibility: hidden !important; opacity: 0 !important; }\
                    userjs-ush-toolbar>optgroup>* { display: block !important; }\
                    userjs-ush-toolbar[top]>optgroup { bottom: auto !important; top: 100% !important; }':'');
                }
            }
 
            this.visible = false;
            if( this.enabled ) { return; }
            if( this.styles ) { document.documentElement.appendChild(this.styles); }
            if( !preferences.toolbarAtBottom ) {
                this.bar.setAttribute('top','');
                this.mOver.setAttribute('top','');
            }
            if( preferences.toolbarOverText ) {
                this.bar.setAttribute('mini','on');
                this.mOver.setAttribute('mini','on');
            }
            document.documentElement.appendChild(this.mOver);
            document.documentElement.appendChild(this.bar);
            if( !preferences.toolbarOverText ) { document.addEventListener('resize',this,false); }
            this.enabled = true;
        },
        handleEvent: function(e,state) {
            window.clearTimeout(this.timer);
            if( e ) { switch( e.type||e ) {
                case 'click':    this.bar.focus(); break;
                case 'DOMFocusOut':
                    if( e.target == this.input && !this.onInput.timer && e.target.hasAttribute('pattern') ) {
                        searchData.historyAdd(e.target.value);
                        e.target.removeAttribute('pattern');
                    }
                    if( results.timer || contains(this.bar,document.activeElement||document.body) ) { return; }
                    if( !this.optsMenu.className ) { this.optsBttn.click(); }
                case 'mouseout':
                    return this.timer = (document.activeElement==this.input?null:window.setTimeout(function(t) { t.handleEvent(null,false); },preferences.autoHideDelay,this));
                case 'resize':
                    if( !this.styles.parentNode ) { USH.running(1); document.documentElement.appendChild(this.styles); USH.running(0); }
                    this.styles.sheet.cssRules[0].style[e = 'margin'+(preferences.toolbarAtBottom?'Bottom':'Top')] = '';
                    return this.visible && (this.styles.sheet.cssRules[0].style[e] = parseInt(window.getComputedStyle(document.documentElement,'')[e])+getDim(this.bar).height+'px !important');
                default: state = true;
            }}
            this.bar.className = ((state=(state===undefined?!this.visible:state))||this.optsBttn.hasAttribute('active'))?'':'userjs-ush-fade';
            if( this.visible != (this.visible = state) && !preferences.toolbarOverText ) { this.handleEvent('resize'); }
        },
        onInput: {
            oVal: '',
            timer: null,
            triggered: false,
            handleEvent: function(e,fill) {
                this.timer = window.clearTimeout(this.timer);
                if( this.triggered ) { return this.triggered = false; }
                var i = toolbar.input, val = i.value, uVal = val.toUpperCase(), lVal = val.toLowerCase(), opt = '';
 
                this.timer = (fill === undefined)&&preferences.inputDelay&&window.setTimeout(function(i,val) {
                    USH.run(val,document.activeElement==i?'newEdit':'new');
                    toolbar.onInput.handleEvent(null,opt);
                },preferences.inputDelay,i,val);
 
                if( !toolbar.list ) { return; }
                i.setAttribute('pattern',lVal.replace(/[a-z]/g,function(l,i){ return '['+l+uVal[i]+']'; })+'.*');
                toolbar.list.setAttribute('uVal',uVal); toolbar.list.setAttribute('lVal',lVal);
                if( fill || val.length > this.oVal.length && (opt = document.evaluate('./option[starts-with(translate(@value,../@uVal,../@lVal),../@lVal)]',toolbar.list,null,9,null).singleNodeValue) ) {
                    opt = fill||opt.value;
                    i.value += opt.substring(val.length);
                    i.setSelectionRange(val.length,opt.length);
                }
                this.oVal = val;
            }
        },
        remove: function() {
            window.clearTimeout(this.timer);
            window.clearTimeout(this.onInput.timer);
            document.removeEventListener('resize',this,false);
            if( this.styles ) { this.styles.parentNode.removeChild(this.styles); }
            this.bar.parentNode.removeChild(this.bar);
            this.mOver.parentNode.removeChild(this.mOver);
            this.update();
            this.visible = this.enabled = false;
        },
        update: function() {
            if( !this.enabled ) { return; }
            var bttn, icon, pIcon, i, term, terms, total, text;
 
            this.input.value = query||this.input.value;
            while( (terms = this.list||this.newBttn).nextSibling ) { this.bar.removeChild(terms.nextSibling); }
            i = (terms=this.optsMenu.children).length; while( i ) { (term = terms[--i].firstChild).checked = preferences[term.getAttribute('prefIdx')]; }
 
            if( preferences.toolbarOverText ) {
                this.bar.setAttribute('mini',results.terms?'':'on');
                this.mOver.setAttribute('mini',results.terms?'':'on');
            }
 
            if( !results.terms ) { return; }
            bttn = document.createElementNS(resolver.xhtmlNS,'userjs-ush-bttn');
            icon = document.createElementNS(resolver.xhtmlNS,'userjs-ush-icon');
 
            for( i = 0; term = results.terms[i]; i++ ) {
                (this.buttons[i] = bttn = bttn.cloneNode(false)).setAttribute('idx',i);
                text = bttn.textContent = term.text;
                total = highlight.get('[@iID="'+iID+'"][@term="'+i+'"]').snapshotLength;
                bttn.title = total?strings._goto+' "'+text+'"':'"'+text+'" '+strings._nfound;
                if( total ) {
                    if( term.current >= total ) { term.current -= term.total - total; }
                    bttn.addEventListener('click',results,false);
                    bttn.textContent += ' ['+(Math.pow(10,(total+'').length)+term.current+1+'').substring(1)+'/'+total+'] ';
                    (pIcon = bttn.insertBefore((pIcon||icon).cloneNode(false),bttn.firstChild)).className = 'userjs-ush-icon-prev';
                    pIcon.addEventListener('click',function() { results.handleEvent({target: this.parentNode, ctrlKey: true}); },false);
                    pIcon.title = strings._gotoPrev+' "'+text+'"';
                    (icon = bttn.appendChild(icon.cloneNode(false))).setAttribute('style','background: '+term.colour);
                    icon.addEventListener('click',function() { highlight.remove(true,this.parentNode.getAttribute('idx')); },false);
                    icon.title = strings._hide;
                }
                term.total = total;
                this.bar.appendChild(bttn);
            }
        }
    },
    contains = function(el1,el2) { return el1 == el2 || !!(el1.contains?el1.contains(el2):el1.compareDocumentPosition(el2)&16); },
    exit = function() {
        USH.running(1);
        highlight.remove();
        saveVal('query',query='');
        results.clear();
        toolbar.remove();
        USH.running(0);
    },
    getDim = function(el) {
        var t1 = -window.pageYOffset, t = t1, l1 = -window.pageXOffset, l = l1, d, oEl = el, h = el.offsetHeight, w = el.offsetWidth;
        if( el.getBoundingClientRect ) { d = el.getBoundingClientRect(); }
        else { while( el ) { t += el.offsetTop; l += el.offsetLeft; el = el.offsetParent; } }
        d = {left:d?d.left:l, top:d?d.top:t, right:d?d.right:w+l, bottom:d?d.bottom:h+t, height:h, width:w};
        d.visible = h && w && d.bottom>t1 && d.right>l1 && (contains(oEl,el=document.elementFromPoint((merlin?-l1:0)+(d.left+d.right)/2,(merlin?-t1:0)+(d.top+d.bottom)/2)||oEl) || contains(el,oEl));
        return d;
    },
    log = function() { return (window.opera?window.opera.postError:console.log)(arguments); },
    run = function() {
        USH.running(1);
        toolbar.create();
        if( query !== null && (!searchEngines[0] || preferences.highlightOnLoad) ) {
            results.init();
            highlight.remove();
            highlight.add();
            toolbar.update();
        }
        toolbar.handleEvent(searchEngines[0] && window!=window.top?null:'click',!preferences.autoHideDelay||!searchEngines[0]||!preferences.toolbarHiddenOnLoad);
        searchEngines[0] = 0;
        USH.running(0);
    },
    saveVal = function(key,val) {
        preferences[key] = val;
        if( key != 'query' ) { return; }
        if( preferences.useDOMStorage ) {
            val?window.localStorage.setItem('UserJS-USH','UserJS-USH='+val):window.localStorage.removeItem('UserJS-USH');
        }
        else if( preferences.useCookies ) {
            document.cookie = 'UserJS-USH='+encodeURIComponent(val)+';path=/;'+(val?'':'expires='+new window.Date(0).toGMTString());
        }
    };
 
    this.init = function(prefs,store) {
        var doc = document.documentElement, loadFn = {handleEvent: function(oE) {
            if( oE ) { window.opera.removeEventListener(oE.type,this,false); }
            (merlin?window.top.document:window.top).postMessage(window==window.top?'USH|load|':'USH|loadFrame','*');
        }};
        if( !(doc instanceof window.HTMLHtmlElement) && window.opera ) { return; }
        delete this.init;
 
        if( prefs instanceof Function ) {
            preferences = prefs('preferences');
            colours = prefs('colours');
            searchEngines = prefs('searchEngines');
            strings = prefs('strings');
            delete window.opera.USHprefs;
        }
        else if( prefs instanceof Storage ) {
            for( var i = 0, key; key = prefs.key(i++); ) {
                preferences[key] = JSON.parse(window.atob(prefs[key]));
            }
        }
 
        preferences.useDOMStorage = preferences.useDOMStorage && (typeof window.localStorage == 'object');
 
        if( preferences.checkDocChanges ) {
            this.addEventListener = function(type,handler) {
                USH.running(1); USH.running(0);
                if( mutation.handlers[type] && handler ) { mutation.handlers[type].push(handler); }
            }
        }
 
        searchData.init(preferences.enableSearchHistory && store);
 
        if( preferences.hideHighlightHTML && window.opera && window.Element.prototype.__lookupGetter__ ) {
            var iHG = doc.__lookupGetter__('innerHTML'), iHS = doc.__lookupSetter__('innerHTML'),
                    oHG = doc.__lookupGetter__('outerHTML'), oHS = doc.__lookupSetter__('outerHTML');
            window.Element.prototype.__defineGetter__('innerHTML',function() { return iHG.call(highlight.remove(false,undefined,this.cloneNode(true))); });
            window.Element.prototype.__defineSetter__('innerHTML',iHS);
            window.Element.prototype.__defineGetter__('outerHTML',function() { return oHG.call(highlight.remove(false,undefined,this.cloneNode(true))); });
            window.Element.prototype.__defineSetter__('outerHTML',oHS);
        }
 
        (window.opera?window.opera:window).addEventListener(window.opera?'BeforeEvent.message':'message',function(oE) {
            var e = oE.event||oE, msg = e.data.toString(), data;
            if( !!msg.indexOf('USH|') ) { return; }
            oE.preventDefault();
            switch( msg = msg.substring(4) )    {
                case 'loadFrame':
                    e.source.postMessage('USH|frameIndex|'+frames.length,'*');
                    e.source.postMessage('USH|load|'+searchData,'*');
                    frames[frames.length] = e.source;
                    break;
                case 'frameIndex|'+(data=msg.substring(11)):
                    frameIndex = data;
                    break;
                case 'load|'+(data=msg.substring(5)):
                    searchData.assign(data);
                    if( !query && USH.query ) {
                        query = USH.query;
                        searchEngines[0] = 8;
                        delete USH.query;
                    }
                    if( query && searchEngines[0] ) { run(); }
                    break;
                case 'run|'+(data=msg.substring(4)):
                    data = data.split('|');
                    USH.run(data[0],data[1],data[2]^0);
            }
        },false);
 
        (window.opera?window.opera:window).addEventListener(window.opera?'BeforeEvent.keypress':'keypress',({
            enabled: false,
            keys: {},
            event: document.createEvent('MouseEvents'),
            init: function() {
                var i, j, key, code;
                for( i = j = 0; key = preferences.keyShortcuts[i++]; j = 0 ) {
                    if( key[1] ) {
                        while( code = key[1].charCodeAt(j++) ) { this.keys['_'+code] = key[0]; }
                        this.keys[key[0]] = (key[2]<<0) + (key[3]<<1) + (key[4]<<2);
                    }
                }
                this.enabled = (this.keys.enable === undefined);
                return this;
            },
            handleEvent: function(oE) {
                var e = oE.event||oE, el = e.target, key = e.keyCode||e.charCode, bttn = this.keys['_'+key],
                        keyChk = (this.keys[bttn]&1 || this.keys[bttn] == (e.ctrlKey<<1) + (e.shiftKey<<2))&&bttn;
                if( keyChk == 'run' ) { return USH.run(window.getSelection().toString()||null,'newSelect'); }
                if( el == toolbar.input ) {
                    toolbar.onInput.triggered = !e.which;
                    switch( key ) {
                        case 13: USH.run(e,'userjs-ush-bttn-icon-new'); break;
                        case 27: el.blur(); break;
                        case 8:
                            if( !e.ctrlKey ) { break; }
                            searchData.historyDel(el.value);
                            USH.run(el.value = '','newEdit');
                    }
                }
                if( el.forms instanceof window.NodeList ) { return; }
                if( preferences.runOnKeyPress && e.which ) { return USH.run(null,'newEdit'); }
                if( !toolbar.enabled ) { return; }
 
                if( keyChk == 'enable' ) { this.enabled = !this.enabled; }
                if( this.enabled && keyChk !== false && (bttn = ((typeof bttn == 'number')?toolbar.buttons:toolbar)[bttn]) ) {
                    oE.preventDefault(); e.preventDefault();
                    this.event.initMouseEvent('click',true,true,window,1,0,0,0,0,e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,0,null);
                    bttn.dispatchEvent(this.event);
                }
            }
        }).init(),false);
 
        if( !window.opera || window.document.readyState != 'loading' ) { return loadFn.handleEvent(); }
        window.opera.addEventListener('AfterEvent.DOMContentLoaded',loadFn,false);
        if( window == window.top ) {
            searchData.assign();
            if( query ) { saveVal('query',query); }
        }
    }
 
    this.run = function(e,action,frame) {
        var i = toolbar.enabled && toolbar.input, f;
        frame = frame || e&&e.shiftKey;
        switch( action ) {
            case 'userjs-ush-bttn-icon-close':
                i && exit();
                break;
            case 'userjs-ush-bttn-icon-hide':
                i && highlight.remove(true);
                break;
            case 'userjs-ush-bttn-icon-new':
                return i && USH.run(i.value.replace(/^\s*(USHRegExp\s)?\s*/,e&&e.ctrlKey?'USHRegExp ':'$1'),'new',frame);
            case 'newSearch':
                if( !e || e == window.location ) { return; }
                searchEngines[0] = 2;
            case 'new'+action.substring(3):
                query = e;
                run();
                i = toolbar.input;
                if( action == 'newSelect' ) { window.setTimeout(function() { i.select(); i.focus(); },0); }
                if( action != 'newEdit' ) { break; }
            case 'edit':
                i && i.focus();
        }
        if( !frame ) { return; }
        if( window != window.top ) { return (merlin?window.top.document:window.top).postMessage('USH|run|'+query+'|'+action+'|'+frameIndex,'*'); }
        for( i = 0; f = frames[++i]; ) {
            if( i !== frame ) { (merlin?f.document:f).postMessage('USH|run|'+query+'|'+action,'*'); }
        }
    }
 
    this.running = function(val) {
        var i, type;
        if( val === undefined ) { return running; }
        val = val?1:running?2:0;
        if( preferences.checkDocChanges && val ) {
            for( i = 0; type = mutation.types[i++]; ) { document[val&1?'removeEventListener':'addEventListener'](type[0],mutation,type[1]); }
        }
        return running = !!(val&1);
    }
}).init((typeof widget == 'object' && widget.preferences.length)?widget.preferences:window.opera&&window.opera.USHprefs,window.opera&&window.opera.scriptStorage);

Всего записей: 2858 | Зарегистр. 08-11-2015 | Отправлено: 15:54 13-03-2016
   

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Программы » Opera - плагины, дополнения, панели, кнопки, утилиты
articlebot (26-09-2016 11:41): продолжение - Opera - плагины, дополнения, панели, кнопки и т.д. (часть 5)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru