var ssid = 1;

var PreloaderClass = function()
{
    this.preloads    = new Array();
    this.curloads    = new Array();
    this.allPreloads = new Array();
    this.threads     = 0;
    this.ct          = new Array();
    this.timeout     = false;
    this.maxThreads  = 3;
    this.commonLoads = new Array();
    this.params      = new Array();
    this.maxErrors   = 1;
    
    this.createPreloaderCall = function(src)
    {
        var root = this;
        return function()
        {
            root.startPreloader(src);
        }
    }
    
    this.startPreloader = function(src)
    {
        if (src=='timeout')
        {
            setTimeout(this.createPreloaderCall("timeout"), 2000);
        }
        
        if (this.preloads.length>0)
        {
            var threadId = Math.random();
        
            if (this.threads>=this.maxThreads) return;
            if (this.preloads.length>1 && this.threads<this.maxThreads) setTimeout(this.createPreloaderCall("additional"), 1);
            
            this.threads++;
            this.ct[threadId] = src;
        
            var firstRun = false;
            
            var data = this.preloads.shift();
            
            if (typeof(this.curloads[data.url])!='object')
            {
                this.curloads[data.url] = new Array();
                firstRun = true;
            }
            if (typeof(data.success)=='function') this.curloads[data.url].push(data.success);
            
            if (this.allPreloads[data.url] && this.allPreloads[data.url]==true)
            {
                while(this.curloads[data.url].length>0){this.curloads[data.url].shift()();}
                delete(this.curloads[data.url]);
                this.threads--;
                delete(this.ct[threadId]);
                setTimeout(this.createPreloaderCall("already"), 100);
                return;
            }
            
            var sucFunc = function(root, elm, data, threadId){ return function() {
                root.allPreloads[data.url]=true;
                data.success = null;
                root.preloads.unshift(data);
                setTimeout(root.createPreloaderCall("success"), 10);
                root.threads--;
                
                root.params[data.url] = new Array();
                root.params[data.url]['width'] = elm.width();
                root.params[data.url]['height'] = elm.height();
                
                delete(root.ct[threadId]);
            }}
            
            var errFunc = function(root, data, threadId){ return function() {
                data.tryc++;
                data.success = null;
                if (data.tryc<this.maxErrors) root.preloads.unshift(data);
                setTimeout(root.createPreloaderCall("error"), 10);
                root.threads--;
                delete(root.ct[threadId]);
            }}
            
            var elm = jQuery('<img src="' + data.url + '"  />');
            jQuery(elm).load(sucFunc(this, elm, data, threadId));
            jQuery(elm).error(errFunc(this, data, threadId));
            jQuery('#preload').append(elm);
        }
    }

    this.preloadImage = function(url, success_func, urgent)
    {
        if (this.allPreloads[url] && this.allPreloads[url]==true) {if (typeof(success_func)=='function'){success_func();}; return;}
    
        var data = new Object;
        data.url = url;
        data.success = success_func;
        data.tryc = 0;
        if (urgent==true) this.preloads.unshift(data);
        else              this.preloads.push(data);
        
        this.allPreloads[data.url]=false;
        
        if (this.timeout==false)
        {
            this.timeout = true;
            this.startPreloader("timeout");
        }
    }
    
    this.checkWasQueued = function(url)
    {
        if (typeof(this.allPreloads[url])=='undefined') return false;
        else                                            return true;
    }
    
    this.commonPreload = function(url, callback)
    {
        if (typeof(this.commonLoads[url])!='undefined' && this.commonLoads[url]==true)
        {
            callback();
            return;
        }
        
        var sucFunc = function(root, elm, url, callback)
        {
            return function()
            {
                root.commonLoads[url] = true;
                root.params[url] = new Array();
                root.params[url]['width'] = elm.width();
                root.params[url]['height'] = elm.height();
                callback();
            }
        }
        
        var elm = jQuery('<img src="' + url + '" />');
        jQuery(elm).load(sucFunc(this, elm, url, callback));
        jQuery('#preload').append(elm);
        
        this.commonLoads[url] = false;
    }
};

var ImgList = function()
{
    this.width  = 916;
    this.chunks = 11;
    this.chunkWidth = this.width/(this.chunks-2);
    this.topOffset = 17;
    
    this.offset = 0;
    
    //this.cover_small_h = 170;
    //this.cover_big_h   = 230;
    this.cover_small_h = 130;
    this.cover_big_h   = 172;
    this.cover_sb_mult = this.cover_big_h/this.cover_small_h;
    
    this.htmlBoxes = new Array();
    this.images = new Array();
    
    this.htmlBoxesIds = new Array();
    
    this.preloader = new PreloaderClass;

    this.htmlArea = jQuery('#covers');
    
    this.animateSpeed = 300;
    //this.wh = 10;
    
    this.nocache = 0;
    
    this.toShowList = new Array();
    
    this.rnav = jQuery('<div></div>');
    this.lnav = jQuery('<div></div>');
    this.navbind = 0;
    
    this.absHeight   = 175;    
    //this.dots = new Array(); 
    
    this.init = function(src_data)
    {
        jQuery('#coversBord').css({'height':this.absHeight+'px'})
        jQuery('#coversNav').css({'height':this.absHeight+'px'})
        //jQuery('#coversBord').animate({'height':this.absHeight+'px'})
        //jQuery('#coversNav').animate({'height':this.absHeight+'px'})
        
        this.images = new Array();
        
        var imgs = jQuery('cover',src_data);
        var htmlText = '';
        for (var i=0; i<this.chunks; i++)
        {
            this.htmlBoxes[i] = jQuery('<div id="c' + i + '"></div>');
            this.htmlArea.append(this.htmlBoxes[i]);
        }
        
        for (var i=0; i<imgs.length; i++)
        {
            this.images[i] = new Array();
            this.images[i]['img'] = getNodeValue(imgs[i], 'image');
            this.images[i]['url'] = getNodeValue(imgs[i], 'url');
            this.images[i]['new'] = getNodeValue(imgs[i], 'new');
            this.images[i]['state'] = 'small';
            this.images[i]['lwidth_fix'] = 0;
        }
    }
    
    this.bindNav = function()
    {
        if (this.navbind == 0)
        {
            jQuery('img', this.lnav).attr({'src':'/images/pnav_l1.gif'});
            jQuery('img', this.rnav).attr({'src':'/images/pnav_r1.gif'});
        }
        this.navbind = 1;
        
        this.lnav.bind('click', this.createMoveOffset(-1));
        this.rnav.bind('click', this.createMoveOffset(1));
    }
    
    this.unbindNav = function()
    {
        if (this.navbind == 1)
        {
            jQuery('img', this.lnav).attr({'src':'/images/pnav_l.gif'});
            jQuery('img', this.rnav).attr({'src':'/images/pnav_r.gif'});
        }
        this.navbind = 0;
        
        this.lnav.unbind();
        this.rnav.unbind();
    }
    
    this.moveOffset = function(size)
    {
        newIdx = this.offset + size;
        if (newIdx > this.images.length) newIdx-= this.images.length;
        if (newIdx<0) newIdx += this.images.length;
        

        var list = this.getShowList(newIdx);
        
        this.preloadCovers(list);
        
        this.unbindAll();
        this.unbindNav();

        if (size==-1)
        {
            this.htmlArea.stop().animate({'left':'0px'}, this.animateSpeed/1.5, "linear", this.createFinishOffset(newIdx));
        }
        else if (size==1)
        {
            this.htmlArea.stop().animate({'left':(this.chunkWidth*-2)+'px' }, this.animateSpeed/1.5, "linear", this.createFinishOffset(newIdx));
        }
        else
        {
            this.htmlArea.stop().animate({'left':this.chunkWidth+'px' }, this.animateSpeed/1.5, "linear", this.createFinishOffset(newIdx));
        }
        
        
        var list2 = this.getShowList(newIdx+size*3);
        this.preloadCovers(list2);
        var list2 = this.getShowList(newIdx-1);
        this.preloadCovers(list2);
        var list2 = this.getShowList(newIdx+1);
        this.preloadCovers(list2);
        
    }
    
    this.createFinishOffset = function(newIdx)
    {
        var root = this;
        return function()
        {
            root.offset = newIdx;
            root.toShowList = root.getShowList(newIdx);
            root.show();
        }
    }
    
    this.getShowList = function(offset)
    {
        var idx = Math.max(0,offset);
        var maxIdx = this.images.length;
        var idsArr = new Array();
        
        for (var i=0; i<maxIdx; i++)
        {
            var cid = idx + i;
            if (cid>=maxIdx) cid -= maxIdx;
            idsArr[i] = cid;
            if (idsArr.length == this.chunks) break;
        }
        return idsArr;
    }

    this.getImageURL = function(id,size)
    {
        var mh;
        if (size == 'big') mh = this.cover_big_h;
        else              mh = this.cover_small_h;
        mw = 1000;
        if (this.images[id]['new']==1) return '/image.php?img='+this.images[id]['img']+'&mw='+mw+'&mh='+mh+'&mirr=1&nocache='+this.nocache+'&new=1';
        else                           return '/image.php?img='+this.images[id]['img']+'&mw='+mw+'&mh='+mh+'&mirr=1&nocache='+this.nocache+'&new=0';
    }
    
    
    this.createFreplaceHiRes = function(id)
    {
        var root = this;
        return function()
        {
            root.images[id]['state'] = 'big';
            root.images[id]['obj'].attr({'src':root.getImageURL(id,'big')});
        }
    }

    this.createFreplaceLoRes = function(id)
    {
        var root = this;
        return function()
        {
            if (root.images[id]['state']!='small')
            {
                root.images[id]['state'] = 'small';
                root.images[id]['obj'].attr({'src':root.getImageURL(id,'small')});
            }
        }
    }
    
    this.createMoveOffset = function(offs)
    {
        var root = this;
        return function()
        {
            root.moveOffset(offs);
        }
    }
    
    this.drawNav = function()
    {
        this.lnav = jQuery('<div style="position : absolute; left : -25px; top : 0px;"><img src="/images/pnav_l.gif" alt="" style="cursor : pointer;" /></div>');
        this.rnav = jQuery('<div style="position : absolute; right : -25px; top : 0px;"><img src="/images/pnav_r.gif" alt="" style="cursor : pointer;" /></div>');

        jQuery('#coversNav').append(this.lnav);
        jQuery('#coversNav').append(this.rnav);
        
        this.bindNav();
    }

    this.clearDots = function()
    {
        for (var i=0; i<this.dots.length; i++)
        {
            jQuery(this.dots[i]).remove();
        }
    }
    
    this.drawDot = function(x, y, color)
    {
        var dot = jQuery('<div class="dot" style="left:'+(x-1)+'px; top:'+y+'px; background:'+color+'"></div>');
        this.htmlArea.append(dot);
        this.dots.push(dot);
        return dot;
    }
    
    this.createFonMouseEnter = function(id, pos)
    {
        var root = this;
        
        return function()
        {
            var lcount = pos-1;
            var rcount = root.chunks-3-lcount;
            var rpos  = (pos+1) * root.chunkWidth + root.wh;
            var inc = root.images[id]['lwidth'] - root.chunkWidth; // Узнаём удлиннение
            var newChunkWidth = root.chunkWidth - inc/(root.chunks-2);
            var lInitPos = root.chunkWidth;
            var rpad = 0;
            
            if (rcount == 0) rpad = root.width - (newChunkWidth*(root.chunks-3) + root.images[id]['lwidth']) - 6;
            if (lcount == 0) rpad = 6;
            
            if (lcount>0)
            {
                for (var x=1; x<pos; x++)
                {
                    var zid = root.htmlBoxesIds[x];
                    var loffs = lInitPos; // Ставим на левую грань
                    loffs += newChunkWidth*(x-1); // Ставим на новую ширину
                    loffs += (newChunkWidth - root.images[zid]['width'])/2;
                    loffs += rpad;
                    root.images[zid]['obj'].stop().animate({'left':loffs+'px','height':root.cover_small_h+'px', 'width':root.images[zid]['width']+'px', 'top':root.topOffset+'px'}, root.animateSpeed, "linear", root.createFreplaceLoRes(zid));
                }
            }
            
            var loffs = lInitPos; // Ставим на левую грань
            loffs += newChunkWidth*lcount; // Ставим на новую ширину
            loffs += rpad;
            
            // Узнаём ширину увеличенного изображения
            if (root.images[id]['lwidth_fix']==0)
            {
                var lurl = root.getImageURL(id, "big");
                if (root.preloader.params[lurl]!=undefined)
                {
                    var nlw = root.preloader.params[root.getImageURL(id, "big")]['width'];
                    if (nlw>0)
                    {
                        root.images[id]['lwidth'] = nlw;
                        root.images[id]['lwidth_fix'] = 1;
                    }
                }
            }
            root.createFreplaceHiRes(id)();
            //root.images[id]['obj'].stop().animate({'height':root.cover_big_h+'px', 'width':root.images[id]['lwidth']+'px', 'left':loffs+'px', 'top':'0px'},root.animateSpeed, "linear", root.createFreplaceHiRes(id) );
            root.images[id]['obj'].stop().animate({'height':root.cover_big_h+'px', 'width':root.images[id]['lwidth']+'px', 'left':loffs+'px', 'top':'0px'},root.animateSpeed, "linear");

            if (rcount>0)
            {
                var c = 0
                for (x=pos+1; x<root.chunks-1; x++)
                {
                    var zid = root.htmlBoxesIds[x];
                    var loffs = lInitPos;
                    loffs += newChunkWidth*lcount;
                    loffs += root.images[id]['lwidth'];
                    loffs += newChunkWidth*c;
                    loffs += (newChunkWidth - root.images[zid]['width'])/2;
                    loffs += rpad;
                    root.images[zid]['obj'].stop().animate({'left':loffs+'px','height':root.cover_small_h+'px','width':root.images[zid]['width']+'px','top':root.topOffset+'px'}, root.animateSpeed, "linear", root.createFreplaceLoRes(zid));
                    c++;
                }
            }
        }
    }

    this.createFonMouseOut = function(id, pos)
    {
        var root = this;
        return function()
        {
            root.resetPositions();
        }
    }
    
    this.resetPositions = function()
    {
        for (var i=0; i<this.htmlBoxes.length; i++)
        {
            var zid = this.htmlBoxesIds[i];
            var imgPos = this.chunkWidth*i + (this.chunkWidth-root.images[zid]['width'])/2;
            this.images[zid]['obj'].stop().animate({'left':imgPos+'px', 'top':this.topOffset+'px', 'height':this.cover_small_h+'px', 'width':root.images[zid]['width']+'px'}, this.animateSpeed, this.createFreplaceLoRes(zid,i));
        }
    }
    
    this.preloadCovers = function(ids)
    {
        for (var i=0; i<ids.length; i++)
        {
            var url1 = this.getImageURL(ids[i], 'small');
            var url2 = this.getImageURL(ids[i], 'big');
            this.preloader.preloadImage(url1, this.createFonCoverLoad(ids[i]) , true);
            this.preloader.preloadImage(url2);
        }
    }
    
    this.cons = function()
    {
        return function(data)
        {
            jQuery(data.originalTarget).click();
        }
    }
    
    this.createFonCoverLoad = function(id)
    {
        root = this;
        return function()
        {
            if (root.images[id]==undefined || root.images[id]['obj']==undefined)
            {
                var imgText = jQuery('<img style="z-index : 1000; position : absolute; top : 0px; left : 0px; cursor : pointer;" src="'+root.getImageURL(id, 'small')+'" />');
                
                root.images[id]['obj'] = imgText;
                jQuery('#covers_preload').append(root.images[id]['obj']);
            }
            
            root.show();
        }
    }
    
    this.onAllLoadCallback = function()
    {
        root = this;
        return function()
        {
            root.show();
        }
    }
    
    this.show = function()
    {
        if (this.toShowList.length<1) return;
        
        for (var i=0; i<this.toShowList.length; i++)
        {
            var id = this.toShowList[i];
            
            this.htmlBoxesIds[i] = id;
            
            if (this.images[id] == undefined || this.images[id]['obj']==undefined)
            {
                return;
            }
            
            if (this.images[id]['width']==undefined || this.images[id]['width']==0)
            {
                var url = this.getImageURL(id, "small");
                this.images[id]['width'] = this.preloader.params[url]['width'];
                
                //this.images[id]['width'] = this.images[id]['obj'].width();
                this.images[id]['lwidth'] = this.images[id]['width']*this.cover_sb_mult;
            }
        }
        
        this.htmlArea.stop().css({'position':'relative', 'left':(this.chunkWidth*-1)+'px'});
       
        for (var i=0; i<this.toShowList.length; i++)
        {
            var id = this.toShowList[i];
            
            var imgPos = this.chunkWidth*i + (this.chunkWidth-this.images[id]['width'])/2;
            this.images[id]['obj'].css({'left':imgPos+'px', 'top':this.topOffset+'px'});
            
            var bf = function(id, url)
            {
                return function()
                {
                    window.location = url;
                }            
            }
            
            this.images[id]['obj'].unbind().bind('click', bf(id, this.images[id]['url']));
            
            this.htmlBoxes[i].empty().append(this.images[id]['obj']);
        }
       
        this.bindNav();
        this.bindAll();
        this.toShowList = new Array();
        this.resetPositions();
    }
    
    this.bindAll = function()
    {
        for (var i=0; i<this.htmlBoxesIds.length; i++)
        {
            id = this.htmlBoxesIds[i];
            this.images[id]['obj'].bind('mouseover', this.createFonMouseEnter(id, i));
            this.images[id]['obj'].bind('mouseout', this.createFonMouseOut(id, i));
        }
    }
    
    this.unbindAll = function()
    {
        for (var i=0; i<this.htmlBoxesIds.length; i++)
        {
            id = this.htmlBoxesIds[i];
            if (this.images[id]['obj']!=undefined)
            {
                this.images[id]['obj'].unbind('mouseover');
                this.images[id]['obj'].unbind('mouseout');
            }
        }
    }
    
    this.drawList = function(list)
    {
        this.toShowList = list;
        this.preloadCovers(list);
    }
}

function getNodeValue(node, tagName)
{
    var data = jQuery(tagName, node)[0];
    if (data && data.firstChild && data.firstChild.nodeValue) return data.firstChild.nodeValue;
    //if (data.firstChild && data.firstChild.nodeValue) return data.firstChild.nodeValue;
}


var ImageChanger = function()
{
    this.period = 5000;
    this.changeSpeed = 2000;
    
    this.queue = new Array();
    this.preloader = new PreloaderClass;
    this.current = 0;

    this.firstrun = 1;
    this.alias = false;

    this.cc = 0;    

    this.onXMLLoad = function()
    {
        var root = this;
        return function(data)
        {
            root.parse(data);
        }
    }
    
    this.init = function(url, mw, mh, parentId, alias)
    {
        this.maxwidth  = mw;
        this.maxheight = mh;
        this.parentid = parentId;
        this.alias = alias;

        this.current = getCookie('ic_'+alias)*1;
                        
        this.preloader.startPreloader("timeout");
        
        jQuery.get(url, {}, this.onXMLLoad() ,'xml');
    }
    
    this.getUrl = function(url)
    {
        rurl = '/image.php?img='+url+'&mw='+this.maxwidth+'&mh='+this.maxheight+'&crop=1&round=1'+'&s='+ssid;
        return rurl;
    }
    
    this.parse = function(src_data)
    {
        var imgs = jQuery('image',src_data);
        
        for (i=0; i<imgs.length; i++)
        {
            this.queue[i] = new Array();
            this.queue[i]['url'] = getNodeValue(imgs[i], 'url');
        }
        this.start();
    }

    this.onImageLoad = function(currentIdVal)
    {
        var root = this;
        var currentId = currentIdVal;
        
        return function()
        {
            jQuery('.'+root.parentid+' img').unbind().bind("mouseenter mouseleave", function(){});

            jQuery('.'+root.parentid+' img').show();
            
            jQuery('.'+root.parentid).css({'background':'url('+root.getUrl(root.queue[currentId]['url'])+') left top no-repeat'});
            jQuery('.'+root.parentid).css({'height':jQuery('.'+root.parentid+' img').height()+'px'});
            
	    jQuery('.'+root.parentid+' img').stop();
            jQuery('.'+root.parentid+' img').fadeOut(root.changeSpeed, function(){
            jQuery('.'+root.parentid+' img').attr({'src':root.getUrl(root.queue[currentId]['url'])});
            });
            
            if (root.firstrun==1) setTimeout(function(){root.start()}, root.period/2);
            else                  setTimeout(function(){root.start()}, root.period);
            root.firstrun = 0;

            if (root.alias) setCookie('ic_'+root.alias, currentId);
        }
    }
    
    this.start = function()
    {
        if (this.current>=this.queue.length) this.current = 0;
        
        next = this.current+1;
        if (next<this.queue.length)
        {
            this.preloader.preloadImage(this.getUrl(this.queue[next]['url']));
            
        }
        
        this.preloader.preloadImage(this.getUrl(this.queue[this.current]['url']), this.onImageLoad(this.current) );
        this.current+=1;
    }
}

function setCookie (name, value, expires, path, domain, secure) {
      document.cookie = name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
}

function getCookie(name) {
	var cookie = " " + document.cookie;
	var search = " " + name + "=";
	var setStr = null;
	var offset = 0;
	var end = 0;
	if (cookie.length > 0) {
		offset = cookie.indexOf(search);
		if (offset != -1) {
			offset += search.length;
			end = cookie.indexOf(";", offset)
			if (end == -1) {
				end = cookie.length;
			}
			setStr = unescape(cookie.substring(offset, end));
		}
	}
	return(setStr);
}


if (jQuery.browser.opera)
{
    jQuery('body').mousemove(function(){}); 
}

function change_block(block)
{
    if (block==1)
    {
        jQuery('#bt1').html('<img src="/images/title1_1.gif" alt="" />');
        jQuery('#bt2').html('<img src="/images/title2.gif" alt="" onclick="javascript:change_block(2);" style="cursor:pointer" />');
        jQuery('#bt3').html('<img src="/images/title3.gif" alt="" onclick="javascript:change_block(3);" style="cursor:pointer" />');
        jQuery('#btb').css({'background':'url(/images/title_b1.gif)'});
        jQuery('#mblock1').show();
        jQuery('#mblock2').hide();
        jQuery('#mblock3').hide();
    }
    else if (block==2)
    {
        jQuery('#bt1').html('<img src="/images/title1.gif" alt="" onclick="javascript:change_block(1);" style="cursor:pointer" />');
        jQuery('#bt2').html('<img src="/images/title2_1.gif" alt="" />');
        jQuery('#bt3').html('<img src="/images/title3.gif" alt="" onclick="javascript:change_block(3);" style="cursor:pointer" />');
        jQuery('#btb').css({'background':'url(/images/title_b2.gif)'});
        jQuery('#mblock1').hide();
        jQuery('#mblock2').show();
        jQuery('#mblock3').hide();
    }
    else if (block==3)
    {
        jQuery('#bt1').html('<img src="/images/title1.gif" alt="" onclick="javascript:change_block(1);" style="cursor:pointer" />');
        jQuery('#bt2').html('<img src="/images/title2.gif" alt="" onclick="javascript:change_block(2);" style="cursor:pointer" />');
        jQuery('#bt3').html('<img src="/images/title3_1.gif" alt="" />');
        jQuery('#btb').css({'background':'url(/images/title_b3.gif)'});
        jQuery('#mblock1').hide();
        jQuery('#mblock2').hide();
        jQuery('#mblock3').show();
    }
}
