
var verticalOffset = 180;

//////////////////////////////////////////////////////////////////////
var thisFilePrefix = guessFileAbsolutePrefix('autopopup/', 'modify.js');
//alert(thisFilePrefix);
var placement;
var timer;

function autopopup_insertion() {
        thumbnailSelector("div.works a");

        var items;
        var documentLoaded = false;
        
        function thumbnailSelector(selector) {
                if(typeof items == "undefined") items = new Array();
                items[items.length] = {selector: selector};
        }
        
        addLoadHandler(function(){ documentLoaded = true; modifier(); });
        
        function modifier() {
                if (!thisFilePrefix) {return}
                placement = document.createElement("div");
                placement.className = "ill-popup shadows";
        
                document.getElementsByTagName('body')[0].appendChild(placement);
        
                var objHead = document.getElementsByTagName('head');
                var objCSS;
        
                objCSS = document.createElement('link');
                objCSS.href = thisFilePrefix+'style.css';
                objCSS.type = 'text/css';
                objCSS.rel = 'stylesheet';
                objHead[0].appendChild(objCSS);
        
                objCSS = document.createElement('link');
                objCSS.href = thisFilePrefix+'shadows/style.css';
                objCSS.type = 'text/css';
                objCSS.rel = 'stylesheet';
                objHead[0].appendChild(objCSS);

                var n = 1;
                for (var i=0;i<items.length;i++) {
                        var elements = getElementsBySelector(items[i].selector);
                        if (elements.length > 0) for (var j=0;j<elements.length;j++) {
                                if (!elements[j]) continue;
                                elements[j].id = "ill-small-" + n;
        //                        elements[j].setAttribute("onclick", "showIll('" + n + "'); if (visibleIll()) return false;");
                                        elements[j].onclick = (function(N) {return function() {showIll(N); return false}})(n)
                                n++;
                        }
                }
        }
        
        function addLoadHandler(handler) {
                if(window.addEventListener) {
                        window.addEventListener("load",handler,false);
                }
                else if(window.attachEvent) {
                        window.attachEvent("onload",handler);
                }
                else if(window.onload) {
                        var oldHandler = window.onload;
                        window.onload = function piggyback() {
                                oldHandler();
                                handler();
                        };
                }
                else {
                        window.onload = handler;
                }
        }

        /*
                Finds elements on page that match a given CSS selector rule. Some
                complicated rules are not compatible.
                Based on Simon Willison's excellent "getElementsBySelector" function.
                Original code (with comments and description):
                        http://simon.incutio.com/archive/2003/03/25/getElementsBySelector
        */
        function getElementsBySelector(selector)
        {
                var tokens = selector.split(' ');
                var currentContext = new Array(document);
                for(var i=0;i<tokens.length;i++)
                {
                        token = tokens[i];//.replace(/^\s+/,'').replace(/\s+$/,'');
                        if(token.indexOf('#') > -1)
                        {
                                var bits = token.split('#');
                                var tagName = bits[0];
                                var id = bits[1];
                                var element = document.getElementById(id);
                                if(tagName && element.nodeName.toLowerCase() != tagName)
                                        return new Array();
                                currentContext = new Array(element);
                                continue;
                        }
        
                        if(token.indexOf('.') > -1)
                        {
                                var bits = token.split('.');
                                var tagName = bits[0];
                                var className = bits[1];
                                if(!tagName)
                                        tagName = '*';
        
                                var found = new Array;
                                var foundCount = 0;
                                for(var h=0;h<currentContext.length;h++)
                                {
                                        var elements;
                                        if(tagName == '*')
                                                elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');
                                        else
                                                elements = currentContext[h].getElementsByTagName(tagName);
        
                                        for(var j=0;j<elements.length;j++)
                                                found[foundCount++] = elements[j];
                                }

                                currentContext = new Array;
                                var currentContextIndex = 0;
                                for(var k=0;k<found.length;k++)
                                {
                                        if(found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b')))
                                                currentContext[currentContextIndex++] = found[k];
                                }
        
                                continue;
                    }
        
                        if(token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/))
                        {
                                var tagName = RegExp.$1;
                                var attrName = RegExp.$2;
                                var attrOperator = RegExp.$3;
                                var attrValue = RegExp.$4;
                                if(!tagName)
                                        tagName = '*';
        
                                var found = new Array;
                                var foundCount = 0;
                                for(var h=0;h<currentContext.length;h++)
                                {
                                        var elements;
                                if(tagName == '*')
                                                elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');
                                        else
                                                elements = currentContext[h].getElementsByTagName(tagName);
        
                                        for(var j=0;j<elements.length;j++)
                                                found[foundCount++] = elements[j];
                                }
        
                                currentContext = new Array;
                                var currentContextIndex = 0;
                                var checkFunction;
                                switch(attrOperator)
                                {
                                        case '=':
                                                checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
                                                break;
                                        case '~':
                                                checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
                                                break;
                                        case '|':
                                                checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
                                                break;
                                        case '^':
                                                checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
                                                break;
                                        case '$':
                                                checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
                                                break;
                                        case '*':
                                                checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
                                                break;
                                        default :
                                                checkFunction = function(e) { return e.getAttribute(attrName); };
                                }
        
                                currentContext = new Array;
                                var currentContextIndex = 0;
                                for(var k=0;k<found.length;k++)
                                {
                                        if(checkFunction(found[k]))
                                                currentContext[currentContextIndex++] = found[k];
                                }
        
                                continue;
                        }
        
                        tagName = token;
                        var found = new Array;
                        var foundCount = 0;
                        for(var h=0;h<currentContext.length;h++)
                        {
                                var elements = currentContext[h].getElementsByTagName(tagName);
                                for(var j=0;j<elements.length; j++)
                                        found[foundCount++] = elements[j];
                        }
        
                        currentContext = found;
                }
        
                return currentContext;
        }
        
        
}// end of scope, execute code

/////////////////////////////////////////////////////////////////////////////////////
// Модификация примера студии Лебедева
/////////////////////////////////////////////////////////////////////////////////////

var illLargeCurrent = null;
var illLargeNew = null;
var illSmallCurrent = null;
var illSmallNew = null;

function showIll(illId) {
        illSmallNew = document.getElementById('ill-small-' + illId);
        // Заставляем placement работать с открываемой картинкой (-- Филин)
/*
        placement.innerHTML = 
                '<table class="ill" align="center">' +
                        '<tr><td class="lt"><td class="cont" rowspan="2"><div>' +
                                '<img src="' + illSmallNew.href + '"' +
                                '><img src="' + thisFilePrefix + 'ill-close.gif" alt="Закрыть" class="close" onclick="closeIll(' + illId + '); return false;"' +
                                '><div class="caption">' + (illSmallNew.title || illSmallNew.href) + '</div>' +
                        '</div><td class="rt">' +
                        '<tr><td class="l">&nbsp;<td class="r">&nbsp;' +
                        '<tr><td class="lb"><td class="b"><td class="rb">' +
                '</table>';
*/
        placement.innerHTML =
                '<table class="ill" align="center">' +
                        '<tr><td id=td0l><table style="height: 100%"><tr><td id=td1l class="lt"><tr><td id=td100l class="l" style="height: 100%"></table>' +
                                '<td class="cont"><div>' +
                                        '<img onresize="correctShadows()" onclick="this.style.width=this.offsetWidth+50; this.style.height=this.offsetHeight+50; correctShadows()" onload="correctShadows()" src="' + illSmallNew.href + '"' +
                                        '><img src="' + thisFilePrefix + 'ill-close.gif" alt="Закрыть" class="close" onclick="closeIll(' + illId + '); return false;"' +
                                        '><div class="caption">' + (illSmallNew.title || illSmallNew.href) + '</div>' +
                                        '</div>' +
                                '<td id=td0r><table><tr><td id=td1r class="rt"><tr><td id=td100r class="r" style="height: 100%"></table>' +
                        '<tr><td class="lb"><td class="b"><td class="rb">' +
                '</table>';

        placement.style.top = (illSmallNew.getElementsByTagName('img').length ? getPos(illSmallNew.getElementsByTagName('img')[0]).top : getPos(illSmallNew).top)-verticalOffset + 'px'; // !!! хак из-за бага в FF1.5 (заведомо ущербный, но 99% случаев сойдет, возможно баг в FF1.5 лучше вообще игнорировать)
        //placement.style.top = getPos(illSmallNew).top-verticalOffset + 'px'; // игнорируя баг (неправильное вычисление offsetTop) в FF1.5
        placement.id = "ill-large-"   + illId;

        illLargeNew = document.getElementById('ill-large-' + illId);

        if (illLargeNew != illLargeCurrent) {
        if (illLargeCurrent) {illLargeCurrent.style.display = 'none';}
        if (illLargeNew) {
                illLargeNew.style.display = 'block';
                //if (!illLargeNew.getElementsByTagName('table')[0].offsetHeight) placement.style.visibility = 'visible'; // [ХАК НЕ РАБОТАЕТ] на тот случай (напр. Konqueror), если "visible: hidden" родительского элемента определяет обязательную невидимость и всех вложенных (-- Филин)
                //placement.style.visibility = 'visible'; // работает, но, даже прозрачный div мешает нажимать ссылки в большинстве браузеров - пока остановился на обнулении высоты
                illLargeCurrent = illLargeNew;
                }
        correctShadows();
        if (!timer) {timer=window.setInterval("correctShadows()", 1000)};
        }


        if(illSmallNew != illSmallCurrent)
                {
                if(illSmallCurrent)
                        {illSmallCurrent.className = 'ill_small_normal';}
                if(illSmallNew)
                        {
                        illSmallNew.className = 'ill_small_active';
                        illSmallCurrent = illSmallNew;
                        }
                }
}


function closeIll(illId) {
        window.clearInterval(timer); timer=false;
        illLargeCurrent = document.getElementById('ill-large-' + illId);
        illLargeCurrent.style.display = 'none';
        illLargeCurrent = null;
        illSmallCurrent = document.getElementById('ill-small-' + illId);
        illSmallCurrent.className = 'ill_small_normal';
        illSmallCurrent = null;
}

function visibleIll() {
        return placement.getElementsByTagName('table')[0].offsetHeight;
}

function correctShadows() {
//        if (navigator.userAgent.indexOf('Mozilla')) {return;}
//alert(1); 
        document.getElementById('td100l').style.height = document.getElementById('td0l').offsetHeight - document.getElementById('td1l').offsetHeight + 'px';
        document.getElementById('td100r').style.height = document.getElementById('td0r').offsetHeight - document.getElementById('td1r').offsetHeight + 'px';

}

// Пытаемся получить абсолютную позицию элемента (однозначно глючит в FF1.5)
function getPos(element) {
        var left = element.offsetLeft;
        var top = element.offsetTop;
        for (var parent = element.offsetParent; parent; parent = parent.offsetParent) {
                left += parent.offsetLeft;
                top += parent.offsetTop;
        }
        return {left: left, top: top, right: left+element.offsetWidth, bottom: top+element.offsetHeight};
}

/////////////////////////////////////////////////////////////////////////////////////
// Конец изнасилованного примера студии Лебедева
/////////////////////////////////////////////////////////////////////////////////////

// Пытаемся определить путь к файлу с точки зрения подключающей нас html-странички
// guessFileAbsolutePrefix('autopopup/modify.js') ===> 'http://some.domane.name/path/to/autopopup/'
function guessFileAbsolutePrefix(prefix, base) {
        var ss = document.getElementsByTagName('script');
        for (i=0; i<ss.length; i++) {
                var name_re = new RegExp((prefix+'/'+base+'$').replace(/\/+/,'(?:/|/.)+'));
                //var base = name.match(/\/([^\/]*)$/)[1];
                var base_re = new RegExp(base+'$');
                if (ss[i].src.match(name_re)) {return ss[i].src.replace(base_re, '')};
        };
        return;
}


if(document.createElement && document.getElementsByTagName && !navigator.userAgent.match(/opera\/?6/i))
        autopopup_insertion();
