slidingGallery = function(params) { //
  
  var animationSpeed = 1;
  var fadeSpeed = 800;
  var imagePauseLength = 5000;
  var endOfFlashPause = 1000;
  
  var playing = params.playing ? params.playing : false;
  
  var autoPlayFlash = true;
  var nextItemTimeout;
  
  var current;
  var currentNumber = 0;
  var jumpSize = 1;
  var entries = {};
  var entriesOrdered = [];
  
  if(params.slidable != undefined) var slidable = $(params.slidable);
  
  if(slidable.hasClass("autoplay")) playing = true;
  
  
  var items = slidable.find(">");
  if(params.thumbs != undefined) var thumbs = params.thumbs;
  var thumbsArray = [];
  
  var slide = true;
  if(slidable.hasClass("fade")){
     animationSpeed = fadeSpeed;
     slide = false;
  }
  var totalWidth = 0;
  
  if(params.startBtn != undefined) var startBtn = $(params.startBtn);
  if(params.stopBtn != undefined) var stopBtn = $(params.stopBtn);
  if(params.nextBtn != undefined) var nextBtn = $(params.nextBtn);
  if(params.prevBtn != undefined) var prevBtn = $(params.prevBtn);
  
  if(params.addPanelTo != undefined) var addPanelTo = params.addPanelTo;
  if(params.galleryPanel != undefined) var galleryPanel = $(params.galleryPanel);
  if(galleryPanel.length < 1) galleryPanel = $('<div class="'+params.galleryPanel.replace(/\.|#/g, '')+'"><ul class="'+params.thumbs.replace(/\.|#/g, '')+'"></ul></div> ');
  if(params.galleryPanelBtn != undefined) var galleryPanelBtn = $(params.galleryPanelBtn);
  var galleryPanelTargets = params.galleryPanelTargets;
  var galleryPanelDefaults = {};
  var galleryPanelOpen = false;
  
  //slide to a specific item
  this.goToItem = function(id) {
    id = id.replace(/^#/, '');
    
    if(current != id){
      clearTimeout(nextItemTimeout);
      if(document.getElementById(current) && document.getElementById(current).sendEvent) document.getElementById(current).sendEvent("PLAY", 'false');
      
      var i = entries[id];
      currentNumber = i.number;
      
      if(slide == true){
        
        var targetX = i.targetX;
      
        slidable.stop();
        slidable.animate({left: "-"+targetX+"px"}, animationSpeed, "linear", 
          function(){
            animationDone(id);
          }
        );
        
      } else {
        
        $("#"+current).stop().animate({opacity:"0"}, animationSpeed, "linear", function(){
          $(this).css({display:"none"});
        });
        
        $("#"+id).stop().css({display:"block", opacity:"0", zIndex:"9999"});
        $("#"+id).animate({opacity:"1"}, animationSpeed, "linear", 
          function(){
            animationDone(id);
          }
        );
        
        var textInfo = $($(".redbox li").get(currentNumber));
        if(textInfo && $.trim(textInfo.text()).length > 0){
          $(".redbox").fadeIn(animationSpeed);
          textInfo.siblings().stop().fadeOut(animationSpeed);
          textInfo.stop().fadeIn(animationSpeed);
        } else {
          $(".redbox").stop().fadeOut(animationSpeed);
          $(".redbox").children().stop().fadeOut(animationSpeed);
        }
        
        
      }
      
      current = id;
      
    }
  }
  
  //what to do when a thumbnail is clicked
  this.thumbClick = function(){
    
    $(thumbs).find("li a.current").removeClass("current");
    
    var href = $(this).attr("href");
    
    $(thumbs).find("a[href='"+href+"']").addClass("current");
    
    //for IE, strip the rest of the URL
    href = href.split("#");
    href = href[href.length-1];
    
    goToItem(href);
    
    if(galleryPanelOpen) togglePanel();
    
    return false;
  }
  
  //if a gallery item is a flash movie, place it using swfobject
  this.setupFlash = function(elementId, flv){
    var flashvars = { file:flv, skin:"/flash/es_skin.swf", stretching:"exactfit" };
    var params = { bgcolor:0x000000, allowScriptAccess:"always", allowFullScreen:"true", wmode:"opaque" };
    var attributes = {id:elementId, name:elementId};
    swfobject.embedSWF("/flash/player.swf", elementId, "570", "425", "8.0.0", null, flashvars, params, attributes);
  }
  
  this.playerReady = function(vars){
    var player = document.getElementById(vars.id);
    player.addModelListener("STATE", "stateListener");
  }
  
  //fired once the flash movie has finished playing
  this.stateListener = function(obj) { //IDLE, BUFFERING, PLAYING, PAUSED, COMPLETED
    currentState = obj.newstate; 
    previousState = obj.oldstate;
    if ((currentState == "COMPLETED") && (previousState == "PLAYING")) {
      if(playing == true) setTimeout("nextItem()", endOfFlashPause); 
    }
  }
  
  //fired when the current slide into place is finished
  this.animationDone = function(id){
    var i = entries[id];
    if(i.flash == true){
      if(autoPlayFlash == true) {
        if(document.getElementById(id).sendEvent) document.getElementById(id).sendEvent("PLAY", 'true');
      }
    } else {
      if(playing == true){
        clearTimeout(nextItemTimeout);
        nextItemTimeout = setTimeout(nextItem, imagePauseLength);
      }
    }
  }
  
  //slide to the next item
  this.nextItem = function(){
    clearTimeout(nextItemTimeout);
    currentNumber += jumpSize;
    if(currentNumber > entriesOrdered.length-1) currentNumber = 0;
    goToItem(entriesOrdered[currentNumber]);
  }
  
  //slide to the previous item
  this.prevItem = function(){
    clearTimeout(nextItemTimeout);
    currentNumber -= jumpSize;
    if(currentNumber < 0) currentNumber = entriesOrdered.length-1;
    goToItem(entriesOrdered[currentNumber]);
  }
  
  //open or close the thumbnail panel
  this.togglePanel = function(){
    galleryPanelOpen = !galleryPanelOpen;
    if(galleryPanelOpen){
      galleryPanel.animate(galleryPanelTargets, 250, "linear", null);
      galleryPanelBtn.addClass("open");
    } else {
      galleryPanel.animate(galleryPanelDefaults, 250, "linear", null);
      galleryPanelBtn.removeClass("open");
    }
  }
  
  //collect default css position/size etc for the gallery panel, then attach the togglePanel function to the button
  this.setupPanel = function(){
    if(galleryPanel){
      
      if(addPanelTo){
       
       galleryPanel.find("ul").empty();
        var targets = $(addPanelTo);
        if(targets.length > 1){
          targets.each(function(i, e){
            $(e).append(galleryPanel.clone());
          });
        }
        galleryPanel.remove();
        
      } else if(galleryPanelBtn){
        for(var i in galleryPanelTargets){
          galleryPanelDefaults[i] = galleryPanel.css(i);
        }
        galleryPanelBtn.click(togglePanel);
        
      }
      
    }
  }
  
  //collect vars from the items and setup stuff
  this.init = function(){
    
    //setup thumbnail panel
    setupPanel();
    
    var numOfItems = 0;
    
    if(items.length > 0){
      items.each(function(i, e){
        
        var img;
        if($(e).hasClass("textPanel")){
          img = $(e);
          jumpSize = 3;
        } else {
          img = $(e).find("> img, > .flash");
        }
        
        
        if(img.length > 0){
          
          numOfItems++;
          
          var id = img.attr("id");
          
          var y = entries[id] = {};
          y.number = entriesOrdered.length;
          entriesOrdered.push(id);
          
          y.targetX = totalWidth;
          if(img.hasClass("flash")) {
            y.flash = true;
            y.flv = img.attr("href");
            setupFlash(id, y.flv);
          }
          
          if(thumbs && thumbs.length > 0){
            if (img.hasClass("flash")){
              var thumb = $('<li><a href="#'+id+'", class="flash"></a></li>');
              var a = thumb.find("a");
              a.click(thumbClick);
              if(i == 0){
                a.addClass("current");
              }
              $(thumbs).append(thumb);
              thumbsArray.push(a);
            }else{
              var thumb = $('<li><a href="#'+id+'">'+numOfItems+'</a></li>');
              var a = thumb.find("a");
              a.click(thumbClick);
              if(i == 0){
                a.addClass("current");
              }
              $(thumbs).append(thumb);
              thumbsArray.push(a); 
            }
          }
        }
      
        totalWidth += $(e).width();
      });
      
      slidable.css({overflow:"hidden"});
      slidable.width(totalWidth+"px");
      
      //setup buttons if defined
      if(startBtn && startBtn[0]) startBtn.click(function(){
        if(playing != true){
          playing = true;
          nextItem();
        }
      });
      if(stopBtn && stopBtn[0]) stopBtn.click(function(){
        playing = false;
        clearTimeout(nextItemTimeout);
      });
      if(nextBtn && nextBtn[0]) nextBtn.click(function(){
        playing = false;
        nextItem();
      });
      if(prevBtn && prevBtn[0]) prevBtn.click(function(){
        playing = false;
        prevItem();
      });
      
      //hide all images except current if fade mode is on
      if(slide != true){
        items.each(function(i, e){
          var img = $(e).find("img");
          var textInfo = $($(".redbox li").get(i));
          if(img.attr("id") == entriesOrdered[0]){
            if(!textInfo || $.trim(textInfo.text()).length < 1){
              $(".redbox").css({display:"none"});
            }
          } else {
            img.css({display:"none"});
            if(textInfo) textInfo.css({display:"none"});
          }
        });
      }
      
      //autoplay if needed
      if(playing == true){
        goToItem(entriesOrdered[0]);
      } 
    
    }
    
  }
  
  this.init();
  
};
