VKViewer

By MasterOk Last update Apr 1, 2013 — Installed 3,040 times.

There are 245 previous versions of this script.

// ==UserScript==
// @name vkviewer
// @namespace vkviewer.ua
// @version 7.0.128
// @uso:version 7.0.128
// @description vk.com smart viewer
// @include http://*vk.com/*
// @include http://*vkontakte.ru/*
// ==/UserScript==

if ( /^http(|s):\/\/[^\/]*(vk\.com|vkontakte\.ru)/.test(self.location.href) ) {

    unsafeWindow = typeof unsafeWindow == 'undefined' ? window : unsafeWindow;

    if ( (unsafeWindow.top == unsafeWindow.self) && (parent.location == self.location) && // не должен выполнятся в ifram-ах
        (!/(\/)(login|settings|audio|video|edit|apps|support|topface|music|away|restore|app\d+)(\.php|)(\?|#|$)/.test(self.location.href)) &&
        (!/(\/)(video|photo)(\d+_\d+)(\?|$)/.test(self.location.href)) && !document.getElementById('listener') ) {

        document.getElementsByTagName('html')[0].style.display = 'none';

        function createHidden(id) {
            var elem = document.createElement('div');
            elem.setAttribute('id', id);
            elem.setAttribute('display', 'none');
            return elem;
        }

        var listener = createHidden('listener');
        var sender = createHidden('sender');
        var receiver = createHidden('receiver');

        document.getElementsByTagName('html')[0].appendChild(listener);
        listener.appendChild(sender);
        listener.appendChild(receiver);

        try {

            if ( typeof chrome != 'undefined' && typeof chrome.extension != 'undefined' ) {
                var port = chrome.extension.connect({
                    name : 'background'
                });

                new WebKitMutationObserver(function (mutations) {
                    mutations.forEach(function (mutation) {
                        for ( var n = 0; n < mutation.addedNodes.length; n++ ) {
                            try {
                                port.postMessage(JSON.parse(mutation.addedNodes[n].textContent));
                            } catch ( e ) {
                            }
                        }
                    });
                }).observe(sender, {
                        childList : true
                    });

                port.onMessage.addListener(function (msgObj) {
                    try {
                        receiver.appendChild(document.createTextNode(JSON.stringify(msgObj)));
                    } catch ( e ) {
                    }
                });

            }

            function applyScript(scriptSrc, callback) {
                var script = document.createElement('script');
                script.setAttribute('type', 'text/javascript');
                if ( callback ) {
                    script.addEventListener('load', callback, false);
                }
                if ( typeof scriptSrc == 'function' ) {
                    script.textContent = '(' + scriptSrc.toString() + ')();';
                } else {
                    if ( (typeof scriptSrc == 'string') && /.js$/.test(scriptSrc) ) {
                        script.setAttribute('src', scriptSrc);
                    }
                }
                document.head.appendChild(script);
            }

            function addJQuery(callback) {
                if ( unsafeWindow && (typeof unsafeWindow.jQuery == 'undefined') || (typeof jQuery == 'undefined') ) {
                    applyScript('http://vkviewer/vkviewer.js/libs/jQuery/jquery.min.js', function () {
                        applyScript(callback);
                    });
                } else {
                    applyScript(callback);
                }
            }

            var waitHead = setInterval(function () {
                if ( document.getElementsByTagName('head')[0] ) {
                    clearInterval(waitHead);
                    addJQuery(function () {
                        jQuery.extend({ // Используем виртуальный сервер для доступа к localhost
                            vkViewerPath : 'http://vkviewer/vkviewer.js'
                        });
                        return $.getScript($.vkViewerPath + '/vk.joiner.js');
                    });
                }
            }, 7);

        } catch ( e ) {
            alert(e.stack);
        }
    }
}