
// gallery class
var _gallery = {
    queue:[],
    imagecaption:[],
    loaded:[],
    img:[],
    speed:2000,
    speedstep:100,
    index:-1,
    path:"",
    firstimg:true,
    bgfade:90,
    bgfadetime:1,
    bgfadecycle:"",
    bgfadecurve:"easeOutExp",
    fadebackground:true,
    backgroundcolor:"#000000",
    usebackgroundcolor:true,
    viewtime:0,
    fadeintime:1,
    fadeouttime:1,
    fadeincurve:"easeOutExp",
    fadeoutcurve:"easeOutCirc",
    widthshifttime:.75,
    heightshifttime:.75,
    galleryloadedimage:"galleryloadedimage",
    galleryinfo:"galleryinfo",
    galleryinfoimage:"galleryinfoimage",
    gallerypause:"gallerypausebutton",
    gallerypauseimage:["images/gallerypause.gif","images/galleryplay.gif"],
    loadingimageid:"galleryisloading",
    loadingimage:"loading/loading1.gif",
    galleryloader:"galleryloading",
    gallerymenustop:"gallerymenustop",
    menutitle:"gallerymenutitle",
    menutitlecontent:"gallery options",
    menutransitioncurve:"easeOutExp",
    menutransitionoffset:100,
    menurevealcurve:"easeOutBack",
    menuhidecurve:"easeOut",
    animatemenu:false,
    hidemenuonchange:false,
    showmenuondisplay:false,
    hidemenuondisplayend:true,
    loadingimagewidthoffset:50,
    loadingimageheightoffset:50,
    adjustloaderwidth:true,
    adjustloaderheight:false,
    screen:"",
    bufferindex:-1,
    frame:false,
    framesize:"0px",
    framecolor:"#FFFFFF",
    buffer:["buffer1","buffer2"],
    navigate:"gallerynavigate",
    navbuttonsrc:"gallerynav",
    navbuttonoffset:20,
    menu:"gallerymenu",
    transitioneffect:"",
    fxbuffer:"galleryfxbuffer",
    fxbfrcontainer:"gallerytransitionfxcontainer",
    caption:"gallerycaptioncontent",
    infocaption:"galleryinfocontent",
    captionbackground:"gallerycaption",
    background:"gallerybackground",
    bfrcontainer:['gallerycentered1','gallerycentered2','gallerycentered3','gallerycentered4','gallerycentered5'],
    bfrspawn:['gallerycontainer1','gallerycontainer2','gallerycontainer3','gallerycontainer4','gallerycontainer5'],
    pausetimeout:null,
    pausetime:250,
    showcaption:false,
    animatecaption:false,
    showcaptioninfo:false,
    paused:false,
    running:false,
    animatedtransition:false,
    transitioncurve:"easeOutExp",
    menuoffset:0,
    userandomaxis:false,
    usexaxisonly:false,
    useyaxisonly:false,
    direction:"right",
    transitiondone:true,
    rendertimeout:null,
    resize:false,
    resizeimage:{w:0,h:0},
    slide:"",
    slideshiftcurve:"easeOut",
    slideshifttime:5,
    randomxytransitioneffect:false,
    xtransitioneffect:false,
    xtransitiondirection:"left",
    xtransitionduration:1,
    xtransitionrange:.5,
    ytransitioneffect:false,
    ytransitiondirection:"top",
    ytransitionduration:1,
    ytransitionrange:.5,
    infodelimeter:" /",
    hidegalleryinfo:false,
    animategalleryinfo:false,
    gallerybrokenlinktext:"gallerybrokenlinktext",
    gallerybrokenlinktextcontent:"broken link",
    showmenueffect:false,
	useshortcutkeys:true,
    exitkey:"x",
    pausekey:"space",
    nextkey:"right",
    prevkey:"left",
    speedtogglekey:"s",
    menudisplaytimeout:null,
    menudisplayoffset:500,
    brokenlinks:0,
    show:function(o){

      if(!this.running){
          if(o.set){
            var setopts=o.set.split(",");
              setopts[0]=parseInt(setopts[0],10);
              setopts[2]=parseInt(setopts[2],10);
              var list=o.list;
              var proto=list[0].url;
              list.length=setopts[0];
              list=list.results(function(){
                  return {};
              });
                  for(var i=0,j=setopts[0];i<j;i++){
                    var indx=(setopts[1]+"").substr(0,1)==="0";
                    var x=proto+(indx?"0":"")+(parseInt(setopts[1],10)+(i)*setopts[2])+setopts[3];
                    list[i].url=x;
                    this.imagecaption[i]=o.captions?(o.captions[i]?o.captions[i]:""):"";
                  }
              o.list=list;
          }

          for(var a in o.options)this[a]=o.options[a];

          if(o.size){
              var sz=o.size,rszimg=false;
              if(sz.w){
                this.resizeimage.w=sz.w;
                rszimg=true;
              }
              if(sz.h){
                this.resizeimage.h=sz.h;
                rszimg=true;
              }
              this.resize=rszimg;
          }

          this.viewtime=o.speed?o.speed:5000;
          this.queue=o.list.copy();
          this.queue.length=o.list.length;
          for(var i=0,j=o.list.length;i<j;i++){
              if(typeof o.list[i] === 'object'){
                  if(o.list[i].caption)this.imagecaption[i]=o.list[i].caption;
                  this.queue[i]=o.list[i].url;
              }else{
                  this.queue[i]=o.list[i];
              }
              this.loaded[i]=false;
          }
          this.path=o.path?o.path:"";
          clearTimeout(this.rendertimeout);

          this.running=true;
          this.index=-1;

          this.set();
          this.render();
      }
    },
    render:function(){
      if(this.direction==="left")this.index=this.index>0?--this.index:this.queue.length-1;
      if(this.direction==="right")this.index=this.index<this.queue.length-1?++this.index:0;
        var index=this.index;

        $(this.galleryloadedimage).show();
        if(this.loaded[index]){
            this.display();
        }else{
            var imgld=this.path+this.queue[index];
            var gal=this;
            $(this.loadingimageid).show();
            this.img[index]=new Image;
            this.img[index].src=imgld;
                _imagehandler(this.img[index],
                function(){
                    if(gal.resize){
                        if(gal.resizeimage.w)this.width=gal.resizeimage.w;
                        if(gal.resizeimage.h)this.height=gal.resizeimage.h;
                    }
                    gal.brokenlinks=0;
                    gal.loaded[index]=true;
                    gal.display();
                },function(){
            gal.brokenlinks++;
            $(gal.gallerybrokenlinktext).innerHTML=" "+gal.brokenlinks;
            //$(gal.gallerybrokenlinktext).innerHTML=gal.gallerybrokenlinktextcontent+" "+gal.brokenlinks;
                    gal.queue.removeindex(gal.index);
                    gal.queue.length--;
                    if(gal.direction==="right"){
                        gal.index=(gal.index===0)?gal.queue.length-1:--gal.index;
                    }else if(gal.direction==="left"){
                        gal.index=(gal.index===gal.queue.length-1)?0:++gal.index;
                    }
                gal.render();
                });
        }
    },
    setcaption:function(i){
      if(this.showcaption){
        if(this.imagecaption[i]){
            if(this.animatecaption){
                tweentext({
                    obj:this.caption,
                    text:this.imagecaption[i],
                    mode:"",
                    direction:"",
                    cycle:"loop,1",
                    curvefunc:"easeOut",
                    duration:.75,
                    formatmatrix:function(o){return o.sub();}
                });
            }else {
              $(this.caption).innerHTML=this.imagecaption[i];
            }
        }else $(this.caption).innerHTML="";
        if(this.showcaptioninfo){
            var infostr="";
            var ig=this.img[i];
            var imgsrc=ig.src.split("/");
                infostr+="<font style='font-size:11px;'>"+imgsrc[imgsrc.length-1]+"</font><br />";
                infostr+=ig.width+" x "+ig.height+"<br />";
                if(_isbrowser("iexplorer"))infostr+=(_mathround((parseInt(ig.fileSize,10)/1000),2))+"kb<br />";
                $(this.infocaption).innerHTML=infostr;
        }
      }
    },
    pausedatindex:-1,
    pause:function(){
        //$(this.loadingimageid).hide();
        this.paused=this.paused?false:true;
        this.pausedatindex=this.index;
        if(this.paused){
            $(this.gallerypause).src=this.gallerypauseimage[1];
        }else{
            $(this.gallerypause).src=this.gallerypauseimage[0];
        }
    },
    set:function(){
            _setcss(this.bfrcontainer[0],'height',$d('clientHeight')+'px');
            _setcss(this.bfrcontainer[1],'height',$d('clientHeight')+'px');
            _setcss(this.bfrcontainer[2],'height',$d('clientHeight')+'px');
            _setcss(this.bfrcontainer[3],'height',$d('clientHeight')+'px');
            _setcss(this.bfrcontainer[4],'height',$d('clientHeight')+'px');

			var bfrspn=parseInt(_getcss(document,"scrollTop"),10);
            _setcss(this.bfrspawn[0],'top',bfrspn+'px');
            _setcss(this.bfrspawn[1],'top',bfrspn+'px');
            _setcss(this.bfrspawn[2],'top',bfrspn+'px');
            _setcss(this.bfrspawn[3],'top',bfrspn+'px');
            _setcss(this.bfrspawn[4],'top',bfrspn+'px');
            _setcss(this.background,'top',bfrspn+'px');
            _setcss(this.fxbfrcontainer,'top',bfrspn+'px');
			
            _setcss(this.bfrspawn[0],'left','0px');
            _setcss(this.bfrspawn[1],'left','0px');
            _setcss(this.bfrspawn[2],'left','0px');
            _setcss(this.bfrspawn[3],'left','0px');
            _setcss(this.bfrspawn[4],'left','0px');
            _setcss(this.background,'left','0px');
            _setcss(this.fxbfrcontainer,'left','0px');

        if(this.usebackgroundcolor)_setcss(this.background,'backgroundColor',this.backgroundcolor);
        if(this.fadebackground)$(this.background).fade({v:this.bgfade,d:this.bgfadetime,cf:this.bgfadecurve,c:this.bgfadecycle});
        //$(this.background).color({v:this.backgroundcolor,p:"backgroundColor",d:1,mode:'//',c:'cycle,1',pauseafter:1});
    },
    exit:function(){
        this.stop();
    },
    stop:function(){
        $(this.loadingimageid).hide();
        var bg=this.background;
        $(this.background).fade({v:.01,d:this.bgfadetime/2,c:this.bgfadecycle,e:function(){
            _setcss(bg,'left','-5000px');
        }});
        clearTimeout(this.rendertimeout);
          _setcss(this.bfrspawn[0],'left','-5000px');
          _setcss(this.bfrspawn[1],'left','-5000px');
          _setcss(this.bfrspawn[2],'left','-5000px');
          _setcss(this.bfrspawn[3],'left','-5000px');
          _setcss(this.bfrspawn[4],'left','-5000px');
          _setcss(this.fxbfrcontainer,'left','-5000px');
        this.running=false;
    },
    transitionopts:{},
    transitionfx:function(){
        if(this.transitioneffect!==""){
            switch(this.transitioneffect){
                default:
                    $(this.fxbuffer).fade({v:0,st:100,d:this.fadeintime,cf:'easeInExp',c:''});
                    $(this.fxbuffer).highlight({v:'#FFCC33',sc:'#99CCFF',type:'',p:"backgroundColor",d:this.fadeouttime/25,cf:'easeInExp',mode:'/',c:'cycle,9'});
                break;
            }
        }
    },
    display:function(){
        var index=this.index;
        var _gal=this;

        if(this.running){
            if(!this.paused){
              if(this.loaded[this.index]){
                  $(this.loadingimageid).hide();
                  if(this.hidemenuonchange)this.hidemenu();
                  if(this.showmenuondisplay)this.showmenu();
                  this.bufferindex=this.bufferindex<this.buffer.length-1?++this.bufferindex:0;
                  var nextbuffer=this.bufferindex+1;
                      nextbuffer=nextbuffer<this.buffer.length?nextbuffer:0;
                      var bufferindex=this.bufferindex;
                      var scr=this.buffer[bufferindex];
                      var bfr=this.buffer[nextbuffer];
                      var galsrc=this.img[index].src;
                        var captnbg=this.captionbackground;
                        var captn=this.caption;
                        var captninfo=this.infocaption;
                        var loadr=this.galleryloader;
                        var nav=this.navigate;
                        var menu=this.menu;
                        this.transitiondone=false;

                        var transcurve=this.transitioncurve;

                        var navbtnoffset=this.navbuttonoffset;
                        var menuoffset=this.menuoffset;
                        var galinfoimg=this.galleryinfoimage;

                        var fxbfr=this.fxbuffer;

                        var imgw=this.img[index].width;
                        var imgh=this.img[index].height;

                        if($(bfr).getElementsByTagName("img").length===0){
                            $(bfr).innerHTML="<img src=''/>";
                        }
                        $(bfr).getElementsByTagName("img")[0].src=galsrc;

                          $(scr).fade({v:0,cf:this.fadeoutcurve,d:this.fadeouttime,e:function(){
                            $(scr).hide();
                          }});
                          $(bfr).fade({v:100,cf:this.fadeincurve,d:this.fadeintime,e:function(){
                            _gal.transitiondone=true;
                            $(galinfoimg).hide();
                          }});

                        _setcss(bfr,'left','0px');
                        _setcss(bfr,'top','0px');

                        if(this.animatedtransition&&(!_isbrowser('opera'))){
                            $(scr).tween({p:'width',cf:transcurve,v:imgw,d:this.widthshifttime});

                            if(this.xtransitioneffect){
                                if(this.randomxytransitioneffect)this.xtransitiondirection=this.randomxytransition().x;
                                $(scr).tween({p:'left',cf:transcurve,v:(this.xtransitiondirection==='left'?-1:1)*this.xtransitionrange*imgw,d:this.xtransitionduration});
                            }
                            if(this.ytransitioneffect){
                                if(this.randomxytransitioneffect)this.ytransitiondirection=this.randomxytransition().y;
                                $(scr).tween({p:'top',cf:transcurve,v:(this.ytransitiondirection==='top'?-1:1)*this.ytransitionrange*imgh,d:this.ytransitionduration});
                            }
                            $(bfr).tween({p:'width',cf:transcurve,v:imgw,d:this.widthshifttime,t:function(t){
                                  _setcss(captnbg,t.prop,t.curval+'px');
                                  _setcss(captninfo,t.prop,t.curval+'px');
                                  _setcss(captn,t.prop,t.curval+'px');
                                  _setcss(fxbfr,t.prop,t.curval+'px');
                                  _setcss(nav,t.prop,_percentagevalue(navbtnoffset,t.curval)+t.curval+'px');
                                  _setcss(menu,t.prop,t.curval+1+'px');
                            }});
                            $(scr).tween({p:'height',cf:transcurve,v:imgh,d:this.heightshifttime});
                            $(bfr).tween({p:'height',cf:transcurve,v:imgh,d:this.heightshifttime,t:function(t){
                                  _setcss(captnbg,t.prop,t.curval+'px');
                                  _setcss(nav,t.prop,t.curval+'px');
                                  _setcss(fxbfr,t.prop,t.curval+'px');
                            }});
                        }else{
                            if(this.usexaxisonly){
                                $(bfr).tween({p:'width',cf:transcurve,v:imgw,d:this.widthshifttime});
                            }else{
                                _setcss(bfr,'width',imgw+'px');
                            }
                            _setcss(captn,'width',imgw+'px');
                            _setcss(captninfo,'width',imgw+'px');
                            _setcss(captnbg,'width',imgw+'px');
                            _setcss(fxbfr,'width',imgw+'px');

                            if(this.animatemenu){
                                $(menu).tween({p:'width',cf:this.menutransitioncurve,v:(_percentagevalue(menuoffset,imgw))+1+imgw,d:_percentagevalue(this.menutransitionoffset,this.widthshifttime)});
                            }else _setcss(menu,'width',imgw+1+'px');

                            _setcss(nav,'width',(_percentagevalue(navbtnoffset,imgw))+imgw+'px');
                            _setcss(nav,'height',imgh+'px');
                            if(this.useyaxisonly){
                                $(bfr).tween({p:'height',cf:transcurve,v:imgh,d:this.heightshifttime});
                            }else{
                                _setcss(bfr,'height',imgh+'px');
                            }
                            _setcss(captnbg,'height',imgh+'px');
                            _setcss(fxbfr,'height',imgh+'px');

                            if(this.adjustloaderwidth)_setcss(this.loadingimageid,'width',(_percentagevalue(this.loadingimagewidthoffset,imgw))+'px');
                            if(this.adjustloaderheight)_setcss(loadr,'height',(_percentagevalue(this.loadingimageheightoffset,imgh))+'px');
                        }



                        if(this.frame){
                            _setcss(scr,'borderWidth',this.framesize);
                            _setcss(bfr,'borderWidth',this.framesize);
                            _setcss(bfr,'borderColor',this.framecolor);
                        }else{
                            _setcss(scr,'borderWidth',"0px");
                            _setcss(bfr,'borderWidth',"0px");
                            _setcss(bfr,'borderColor',"");
                        }

                        if(!this.hidegalleryinfo)this.showgalleryinfo();

                      $(this.galleryloadedimage).hide();
                      $(galinfoimg).show();
                      $(bfr).show();
                      // image caption
                      this.setcaption(index);
                      if(this.imagecaption[index])$(captn).fade({v:100,cf:'easeOutExp',d:1,c:'cycle,2',pb:0,pa:_percentagevalue(55,this.viewtime/1000)});
                      if(this.showcaptioninfo)$(captninfo).fade({v:100,cf:'easeOut',d:1,c:'cycle,2',pb:1,pa:_percentagevalue(20,this.viewtime/1000)});

                  this.transitionfx();

                  clearTimeout(this.menudisplaytimeout);
                  this.menudisplaytimeout=setTimeout(function(){
                        if(_gal.hidemenuondisplayend)_gal.hidemenu();
                  },this.viewtime-this.menudisplayoffset);

                  this.rendertimeout=setTimeout(function(){
                    if(_gal.hidemenuondisplayend)_gal.hidemenu();
                    _gal.render();
                  },this.viewtime);
              }
            }else{
                $(this.loadingimageid).hide();
                this.pausetimeout=setTimeout(function(){
                    _gal.display();
                },this.pausetime);
            }
        }
    },
    randomxytransition:function(){
        var xt=_randomtruth()?"right":"left";
        var yt=_randomtruth()?"top":"bottom";
        return {x:xt,y:yt};
    },
    showgalleryinfo:function(){
      var x=(""+(this.index+1)+""+this.infodelimeter+"<b>").sup()+(this.queue.length)+"</b>";
      if(this.animategalleryinfo){
                tweentext({
                    obj:this.galleryinfo,
                    text:x,
                    mode:"matrix",
                    direction:"left",
                    cycle:"loop,1",
                    curvefunc:"easeOut",
                    duration:.5,
                    formatmatrix:function(o){
                        return "<font style='color:"+_randomcolor({r:"0/255",g:"0/0",b:"0/0"})+";font-size:"+(_randomseed(10)+_randomseed(10)+1)+"px;'>"+o+"</font>";
                    }
                });
        }else{
            $(this.galleryinfo).innerHTML=x;
        }
    },
    getrandomaxis:function(){
        if(this.userandomaxis){
            return (_randomseed(9)>4)||false;
        }else return false;
    },
    next:function(){
            if(this.transitiondone){
                this.transitiondone=false;
                this.pauseout();
                $(this.gallerypause).src=this.gallerypauseimage[0];
                var pdirection=this.direction;
                this.direction="right";
                if(this.paused){
                    if(pdirection!==this.direction){
                      this.paused=false;
                        clearTimeout(this.pausetimeout);
                        clearTimeout(this.rendertimeout);
                        var nwindex=this.pausedatindex>0?this.pausedatindex--:this.queue.length-1;
                        this.index=nwindex;
                        this.render();
                    }else{
                        this.pause();
                    }
                }else{
                    clearTimeout(this.rendertimeout);
                    this.render();
                }
            }
    },
    prev:function(){
            if(this.transitiondone){
                this.transitiondone=false;
                this.pauseout();
                $(this.gallerypause).src=this.gallerypauseimage[0];
                var pdirection=this.direction;
                this.direction="left";
                if(this.paused){
                    if(pdirection!==this.direction){
                      this.paused=false;
                        clearTimeout(this.pausetimeout);
                        clearTimeout(this.rendertimeout);
                        var nwindex=this.pausedatindex<this.queue.length-1?this.pausedatindex++:0;
                        this.index=nwindex;
                        this.render();
                    }else{
                        this.pause();
                    }
                }else{
                    clearTimeout(this.rendertimeout);
                    this.render();
                }
            }
    },
    nextover:function(e){
        $('gallerynextbutton').show();
    },
    nextout:function(e){
        $('gallerynextbutton').hide();
    },
    prevover:function(e){
        $('galleryprevbutton').show();
    },
    prevout:function(e){
        $('galleryprevbutton').hide();
    },
    pauseover:function(){
        $('gallerypausebutton').fade({v:90,d:.25,cf:'easeOut'});
    },
    pauseout:function(){
        $('gallerypausebutton').fade({v:.01,d:.25,cf:'easeOut'});
    },
    showmenu:function(){
        if(this.showmenueffect){
                tweentext({
                    obj:this.menutitle,
                    text:this.menutitlecontent,
                    mode:"matrix",
                    direction:"left",
                    cycle:"loop,1",
                    curvefunc:"easeOut",
                    duration:.5,
                    formatmatrix:function(o){
                        return "<font style='color:"+_randomcolor({r:"0/255",g:"200/255",b:"200/255"})+";font-size:"+(_randomseed(10)+_randomseed(10)+1)+"px;'>"+o+"</font>";
                    }
                });
        }else{
            $(this.menutitle).innerHTML=this.menutitlecontent;
        }
        $(this.menu).tween({p:'top',v:-120,d:.5,cf:this.menurevealcurve});
        $(this.menu).fade({v:80,d:.5,cf:'easeOut'});
    },
    hidemenu:function(){
        $(this.menu).tween({p:'top',v:-50,d:.25,cf:this.menuhidecurve});
        $(this.menu).fade({v:.01,d:.5,cf:'easeOut'});
    },
    setup:function(o){
        var o=o?o:{};
        if(o.syncimage)VVEDobj.add(this.buffer[0],{syncimage:true});
        if(o.syncimage)VVEDobj.add(this.buffer[1],{syncimage:true});

        this.setkeys();

    },
    setkeys:function(){
	
		if(this.useshortcutkeys){
	
          _pollkey(this.exitkey,function(){
              if(_gallery.running)_gallery.exit();
          },"keyup");
          _pollkey(this.pausekey,function(){
              if(_gallery.running)_gallery.pause();
          },"keydown");
          _pollkey(this.nextkey,function(){
              if(_gallery.running)_gallery.next();
          },"keydown");
          _pollkey(this.prevkey,function(){
              if(_gallery.running)_gallery.prev();
          },"keydown");

            _Event.addevent({f:function(e,s){
                if(_activekey(_gallery.speedtogglekey)){
                  var d=_Event.mousewheeluprotations?_Event.mousewheeluprotations:1;
                  var inc=d*_gallery.speedstep;
                      _gallery.viewtime+=inc;
                }
            },v:"mousewheelup"});

            _Event.addevent({f:function(e,s){
                if(_activekey(_gallery.speedtogglekey)){
                  var d=_Event.mousewheeldownrotations?_Event.mousewheeldownrotations:1;
                  var inc=d*_gallery.speedstep;
                      if(_gallery.viewtime>0)_gallery.viewtime-=inc;
                }
            },v:"mousewheeldown"});

            disabledkeys.push(this.exitkey);
            disabledkeys.push(this.pausekey);
            disabledkeys.push(this.nextkey);
            disabledkeys.push(this.prevkey);
			
			}

    }


};

// hack for opera.. i love you babes but you got to stop this
var disabledkeys=[];
onkeypress=function(){
  if(_gallery.running){
        for(var a=0,b=disabledkeys.length;a<b;a++){
          if(_activekey(disabledkeys[a])){
              return false;
          }
        }
  }
};

