﻿/*!
 * jCarousel - Riding carousels with jQuery
 *   http://sorgalla.com/jcarousel/
 *
 * Copyright (c) 2006 Jan Sorgalla (http://sorgalla.com)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * Built on top of the jQuery library
 *   http://jquery.com
 *
 * Inspired by the "Carousel Component" by Bill Scott
 *   http://billwscott.com/carousel/
 */

(function($){$.fn.jcarousel=function(o){if(typeof o=='string'){var instance=$(this).data('jcarousel'),args=Array.prototype.slice.call(arguments,1);return instance[o].apply(instance,args);}else
return this.each(function(){$(this).data('jcarousel',new $jc(this,o));});};var defaults={vertical:false,start:1,offset:1,size:null,scroll:3,visible:null,animation:'normal',easing:'swing',auto:0,wrap:null,initCallback:null,reloadCallback:null,itemLoadCallback:null,itemFirstInCallback:null,itemFirstOutCallback:null,itemLastInCallback:null,itemLastOutCallback:null,itemVisibleInCallback:null,itemVisibleOutCallback:null,buttonNextHTML:'<div></div>',buttonPrevHTML:'<div></div>',buttonNextEvent:'click',buttonPrevEvent:'click',buttonNextCallback:null,buttonPrevCallback:null};$.jcarousel=function(e,o){this.options=$.extend({},defaults,o||{});this.locked=false;this.container=null;this.clip=null;this.list=null;this.buttonNext=null;this.buttonPrev=null;this.wh=!this.options.vertical?'width':'height';this.lt=!this.options.vertical?'left':'top';var skin='',split=e.className.split(' ');for(var i=0;i<split.length;i++){if(split[i].indexOf('jcarousel-skin')!=-1){$(e).removeClass(split[i]);skin=split[i];break;}}if(e.nodeName=='UL'||e.nodeName=='OL'){this.list=$(e);this.container=this.list.parent();if(this.container.hasClass('jcarousel-clip')){if(!this.container.parent().hasClass('jcarousel-container'))this.container=this.container.wrap('<div></div>');this.container=this.container.parent();}else if(!this.container.hasClass('jcarousel-container'))this.container=this.list.wrap('<div></div>').parent();}else{this.container=$(e);this.list=this.container.find('ul,ol').eq(0);}if(skin!=''&&this.container.parent()[0].className.indexOf('jcarousel-skin')==-1)this.container.wrap('<div class=" '+skin+'"></div>');this.clip=this.list.parent();if(!this.clip.length||!this.clip.hasClass('jcarousel-clip'))this.clip=this.list.wrap('<div></div>').parent();this.buttonNext=$('.jcarousel-next',this.container);if(this.buttonNext.size()==0&&this.options.buttonNextHTML!=null)this.buttonNext=this.clip.after(this.options.buttonNextHTML).next();this.buttonNext.addClass(this.className('jcarousel-next'));this.buttonPrev=$('.jcarousel-prev',this.container);if(this.buttonPrev.size()==0&&this.options.buttonPrevHTML!=null)this.buttonPrev=this.clip.after(this.options.buttonPrevHTML).next();this.buttonPrev.addClass(this.className('jcarousel-prev'));this.clip.addClass(this.className('jcarousel-clip')).css({overflow:'hidden',position:'relative'});this.list.addClass(this.className('jcarousel-list')).css({overflow:'hidden',position:'relative',top:0,left:0,margin:0,padding:0});this.container.addClass(this.className('jcarousel-container')).css({position:'relative'});var di=this.options.visible!=null?Math.ceil(this.clipping()/this.options.visible):null;var li=this.list.children('li');var self=this;if(li.size()>0){var wh=0,i=this.options.offset;li.each(function(){self.format(this,i++);wh+=self.dimension(this,di);});this.list.css(this.wh,wh+'px');if(!o||o.size===undefined)this.options.size=li.size();}this.container.css('display','block');this.buttonNext.css('display','block');this.buttonPrev.css('display','block');this.funcNext=function(){self.next();};this.funcPrev=function(){self.prev();};this.funcResize=function(){self.reload();};if(this.options.initCallback!=null)this.options.initCallback(this,'init');if($.browser.safari){this.buttons(false,false);$(window).bind('load.jcarousel',function(){self.setup();});}else
this.setup();};var $jc=$.jcarousel;$jc.fn=$jc.prototype={jcarousel:'0.2.4'};$jc.fn.extend=$jc.extend=$.extend;$jc.fn.extend({setup:function(){this.first=null;this.last=null;this.prevFirst=null;this.prevLast=null;this.animating=false;this.timer=null;this.tail=null;this.inTail=false;if(this.locked)return;this.list.css(this.lt,this.pos(this.options.offset)+'px');var p=this.pos(this.options.start);this.prevFirst=this.prevLast=null;this.animate(p,false);$(window).unbind('resize.jcarousel',this.funcResize).bind('resize.jcarousel',this.funcResize);},reset:function(){this.list.empty();this.list.css(this.lt,'0px');this.list.css(this.wh,'10px');if(this.options.initCallback!=null)this.options.initCallback(this,'reset');this.setup();},reload:function(){if(this.tail!=null&&this.inTail)this.list.css(this.lt,$jc.intval(this.list.css(this.lt))+this.tail);this.tail=null;this.inTail=false;if(this.options.reloadCallback!=null)this.options.reloadCallback(this);if(this.options.visible!=null){var self=this;var di=Math.ceil(this.clipping()/this.options.visible),wh=0,lt=0;$('li',this.list).each(function(i){wh+=self.dimension(this,di);if(i+1<self.first)lt=wh;});this.list.css(this.wh,wh+'px');this.list.css(this.lt,-lt+'px');}this.scroll(this.first,false);},lock:function(){this.locked=true;this.buttons();},unlock:function(){this.locked=false;this.buttons();},size:function(s){if(s!=undefined){this.options.size=s;if(!this.locked)this.buttons();}return this.options.size;},has:function(i,i2){if(i2==undefined||!i2)i2=i;if(this.options.size!==null&&i2>this.options.size)i2=this.options.size;for(var j=i;j<=i2;j++){var e=this.get(j);if(!e.length||e.hasClass('jcarousel-item-placeholder'))return false;}return true;},get:function(i){return $('.jcarousel-item-'+i,this.list);},add:function(i,s){var e=this.get(i),old=0,add=0;if(e.length==0){var c,e=this.create(i),j=$jc.intval(i);while(c=this.get(--j)){if(j<=0||c.length){j<=0?this.list.prepend(e):c.after(e);break;}}}else
old=this.dimension(e);e.removeClass(this.className('jcarousel-item-placeholder'));typeof s=='string'?e.html(s):e.empty().append(s);var di=this.options.visible!=null?Math.ceil(this.clipping()/this.options.visible):null;var wh=this.dimension(e,di)-old;if(i>0&&i<this.first)this.list.css(this.lt,$jc.intval(this.list.css(this.lt))-wh+'px');this.list.css(this.wh,$jc.intval(this.list.css(this.wh))+wh+'px');return e;},remove:function(i){var e=this.get(i);if(!e.length||(i>=this.first&&i<=this.last))return;var d=this.dimension(e);if(i<this.first)this.list.css(this.lt,$jc.intval(this.list.css(this.lt))+d+'px');e.remove();this.list.css(this.wh,$jc.intval(this.list.css(this.wh))-d+'px');},next:function(){this.stopAuto();if(this.tail!=null&&!this.inTail)this.scrollTail(false);else
this.scroll(((this.options.wrap=='both'||this.options.wrap=='last')&&this.options.size!=null&&this.last==this.options.size)?1:this.first+this.options.scroll);},prev:function(){this.stopAuto();if(this.tail!=null&&this.inTail)this.scrollTail(true);else
this.scroll(((this.options.wrap=='both'||this.options.wrap=='first')&&this.options.size!=null&&this.first==1)?this.options.size:this.first-this.options.scroll);},scrollTail:function(b){if(this.locked||this.animating||!this.tail)return;var pos=$jc.intval(this.list.css(this.lt));!b?pos-=this.tail:pos+=this.tail;this.inTail=!b;this.prevFirst=this.first;this.prevLast=this.last;this.animate(pos);},scroll:function(i,a){if(this.locked||this.animating)return;this.animate(this.pos(i),a);},pos:function(i){var pos=$jc.intval(this.list.css(this.lt));if(this.locked||this.animating)return pos;if(this.options.wrap!='circular')i=i<1?1:(this.options.size&&i>this.options.size?this.options.size:i);var back=this.first>i;var f=this.options.wrap!='circular'&&this.first<=1?1:this.first;var c=back?this.get(f):this.get(this.last);var j=back?f:f-1;var e=null,l=0,p=false,d=0,g;while(back?--j>=i:++j<i){e=this.get(j);p=!e.length;if(e.length==0){e=this.create(j).addClass(this.className('jcarousel-item-placeholder'));c[back?'before':'after'](e);if(this.first!=null&&this.options.wrap=='circular'&&this.options.size!==null&&(j<=0||j>this.options.size)){g=this.get(this.index(j));if(g.length)this.add(j,g.children().clone(true));}}c=e;d=this.dimension(e);if(p)l+=d;if(this.first!=null&&(this.options.wrap=='circular'||(j>=1&&(this.options.size==null||j<=this.options.size))))pos=back?pos+d:pos-d;}var clipping=this.clipping();var cache=[];var visible=0,j=i,v=0;var c=this.get(i-1);while(++visible){e=this.get(j);p=!e.length;if(e.length==0){e=this.create(j).addClass(this.className('jcarousel-item-placeholder'));c.length==0?this.list.prepend(e):c[back?'before':'after'](e);if(this.first!=null&&this.options.wrap=='circular'&&this.options.size!==null&&(j<=0||j>this.options.size)){g=this.get(this.index(j));if(g.length)this.add(j,g.find('>*').clone(true));}}c=e;var d=this.dimension(e);if(d==0){alert('jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...');return 0;}if(this.options.wrap!='circular'&&this.options.size!==null&&j>this.options.size)cache.push(e);else if(p)l+=d;v+=d;if(v>=clipping)break;j++;}for(var x=0;x<cache.length;x++)cache[x].remove();if(l>0){this.list.css(this.wh,this.dimension(this.list)+l+'px');if(back){pos-=l;this.list.css(this.lt,$jc.intval(this.list.css(this.lt))-l+'px');}}var last=i+visible-1;if(this.options.wrap!='circular'&&this.options.size&&last>this.options.size)last=this.options.size;if(j>last){visible=0,j=last,v=0;while(++visible){var e=this.get(j--);if(!e.length)break;v+=this.dimension(e);if(v>=clipping)break;}}var first=last-visible+1;if(this.options.wrap!='circular'&&first<1)first=1;if(this.inTail&&back){pos+=this.tail;this.inTail=false;}this.tail=null;if(this.options.wrap!='circular'&&last==this.options.size&&(last-visible+1)>=1){var m=$jc.margin(this.get(last),!this.options.vertical?'marginRight':'marginBottom');if((v-m)>clipping)this.tail=v-clipping-m;}while(i-->first)pos+=this.dimension(this.get(i));this.prevFirst=this.first;this.prevLast=this.last;this.first=first;this.last=last;return pos;},animate:function(p,a){if(this.locked||this.animating)return;this.animating=true;var self=this;var scrolled=function(){self.animating=false;if(p==0)self.list.css(self.lt,0);if(self.options.wrap=='circular'||self.options.wrap=='both'||self.options.wrap=='last'||self.options.size==null||self.last<self.options.size)self.startAuto();self.buttons();self.notify('onAfterAnimation');};this.notify('onBeforeAnimation');if(!this.options.animation||a==false){this.list.css(this.lt,p+'px');scrolled();}else{var o=!this.options.vertical?{'left':p}:{'top':p};this.list.animate(o,this.options.animation,this.options.easing,scrolled);}},startAuto:function(s){if(s!=undefined)this.options.auto=s;if(this.options.auto==0)return this.stopAuto();if(this.timer!=null)return;var self=this;this.timer=setTimeout(function(){self.next();},this.options.auto*1000);},stopAuto:function(){if(this.timer==null)return;clearTimeout(this.timer);this.timer=null;},buttons:function(n,p){if(n==undefined||n==null){var n=!this.locked&&this.options.size!==0&&((this.options.wrap&&this.options.wrap!='first')||this.options.size==null||this.last<this.options.size);if(!this.locked&&(!this.options.wrap||this.options.wrap=='first')&&this.options.size!=null&&this.last>=this.options.size)n=this.tail!=null&&!this.inTail;}if(p==undefined||p==null){var p=!this.locked&&this.options.size!==0&&((this.options.wrap&&this.options.wrap!='last')||this.first>1);if(!this.locked&&(!this.options.wrap||this.options.wrap=='last')&&this.options.size!=null&&this.first==1)p=this.tail!=null&&this.inTail;}var self=this;this.buttonNext[n?'bind':'unbind'](this.options.buttonNextEvent+'.jcarousel',this.funcNext)[n?'removeClass':'addClass'](this.className('jcarousel-next-disabled')).attr('disabled',n?false:true);this.buttonPrev[p?'bind':'unbind'](this.options.buttonPrevEvent+'.jcarousel',this.funcPrev)[p?'removeClass':'addClass'](this.className('jcarousel-prev-disabled')).attr('disabled',p?false:true);if(this.buttonNext.length>0&&(this.buttonNext[0].jcarouselstate==undefined||this.buttonNext[0].jcarouselstate!=n)&&this.options.buttonNextCallback!=null){this.buttonNext.each(function(){self.options.buttonNextCallback(self,this,n);});this.buttonNext[0].jcarouselstate=n;}if(this.buttonPrev.length>0&&(this.buttonPrev[0].jcarouselstate==undefined||this.buttonPrev[0].jcarouselstate!=p)&&this.options.buttonPrevCallback!=null){this.buttonPrev.each(function(){self.options.buttonPrevCallback(self,this,p);});this.buttonPrev[0].jcarouselstate=p;}},notify:function(evt){var state=this.prevFirst==null?'init':(this.prevFirst<this.first?'next':'prev');this.callback('itemLoadCallback',evt,state);if(this.prevFirst!==this.first){this.callback('itemFirstInCallback',evt,state,this.first);this.callback('itemFirstOutCallback',evt,state,this.prevFirst);}if(this.prevLast!==this.last){this.callback('itemLastInCallback',evt,state,this.last);this.callback('itemLastOutCallback',evt,state,this.prevLast);}this.callback('itemVisibleInCallback',evt,state,this.first,this.last,this.prevFirst,this.prevLast);this.callback('itemVisibleOutCallback',evt,state,this.prevFirst,this.prevLast,this.first,this.last);},callback:function(cb,evt,state,i1,i2,i3,i4){if(this.options[cb]==undefined||(typeof this.options[cb]!='object'&&evt!='onAfterAnimation'))return;var callback=typeof this.options[cb]=='object'?this.options[cb][evt]:this.options[cb];if(!$.isFunction(callback))return;var self=this;if(i1===undefined)callback(self,state,evt);else if(i2===undefined)this.get(i1).each(function(){callback(self,this,i1,state,evt);});else{for(var i=i1;i<=i2;i++)if(i!==null&&!(i>=i3&&i<=i4))this.get(i).each(function(){callback(self,this,i,state,evt);});}},create:function(i){return this.format('<li></li>',i);},format:function(e,i){var $e=$(e).addClass(this.className('jcarousel-item')).addClass(this.className('jcarousel-item-'+i)).css({'float':'left','list-style':'none'});$e.attr('jcarouselindex',i);return $e;},className:function(c){return c+' '+c+(!this.options.vertical?'-horizontal':'-vertical');},dimension:function(e,d){var el=e.jquery!=undefined?e[0]:e;var old=!this.options.vertical?el.offsetWidth+$jc.margin(el,'marginLeft')+$jc.margin(el,'marginRight'):el.offsetHeight+$jc.margin(el,'marginTop')+$jc.margin(el,'marginBottom');if(d==undefined||old==d)return old;var w=!this.options.vertical?d-$jc.margin(el,'marginLeft')-$jc.margin(el,'marginRight'):d-$jc.margin(el,'marginTop')-$jc.margin(el,'marginBottom');$(el).css(this.wh,w+'px');return this.dimension(el);},clipping:function(){return!this.options.vertical?this.clip[0].offsetWidth-$jc.intval(this.clip.css('borderLeftWidth'))-$jc.intval(this.clip.css('borderRightWidth')):this.clip[0].offsetHeight-$jc.intval(this.clip.css('borderTopWidth'))-$jc.intval(this.clip.css('borderBottomWidth'));},index:function(i,s){if(s==undefined)s=this.options.size;return Math.round((((i-1)/s)-Math.floor((i-1)/s))*s)+1;}});$jc.extend({defaults:function(d){return $.extend(defaults,d||{});},margin:function(e,p){if(!e)return 0;var el=e.jquery!=undefined?e[0]:e;if(p=='marginRight'&&$.browser.safari){var old={'display':'block','float':'none','width':'auto'},oWidth,oWidth2;$.swap(el,old,function(){oWidth=el.offsetWidth;});old['marginRight']=0;$.swap(el,old,function(){oWidth2=el.offsetWidth;});return oWidth2-oWidth;}return $jc.intval($.css(el,p));},intval:function(v){v=parseInt(v);return isNaN(v)?0:v;}});})(jQuery);


/*   2/26/2011
    PikaChoose
  Jquery plugin for photo galleries
    Copyright (C) 2011 Jeremy Fry

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
(function($) {
    /**
     * Creates a slideshow for all matched elements.
     *
     * @example $("#pikame").PikaChoose();
     * @input needed <ul id="pikame"><li><img src="first.jpg"><span>Caption</span></li><li><img src="second.jpg"><span>Caption</span></li></ul>
     *
     * @method PikaChoose
     * @return $
     * @param o {Hash|String} A set of key/value pairs to set as configuration properties or a method name to call on a formerly created instance.
     */
   var defaults = {
    autoPlay: true,
    speed: 5000,
    text: { play: "", stop: "", previous: "zurück", next: "weiter" },
    transition:[1],
    showCaption: true,
    IESafe: false,
    showTooltips: false,
    carousel: false,
    carouselVertical: false,
    animationFinished: null,
    buildFinished: null,
    startOn: 0,
    thumbOpacity: 0.4
  };
   
    $.fn.PikaChoose = function(o) {
    return this.each(function() {
      $(this).data('pikachoose', new $pc(this, o));
    });
  };
  
  /**
     * The PikaChoose object.
     *
     * @constructor
     * @class pikachoose
     * @param e {HTMLElement} The element to create the carousel for.
     * @param o {Object} A set of key/value pairs to set as configuration properties.
     * @cat Plugins/PikaChoose
     */
    $.PikaChoose = function(e, o) {
    this.options    = $.extend({}, defaults, o || {});
    this.list       = null;
    this.image    = null;
    this.anchor    = null;
    this.caption  = null;
    this.imgNav    = null;
    this.imgPlay   = null;
    this.imgPrev  = null;
    this.imgNext   = null;
    this.textNext  = null;
    this.textPrev  = null;
    this.previous    = null;
    this.next     = null;
    this.aniWrap  = null;
    this.aniDiv    = null;
    this.aniImg    = null;
    this.thumbs    = null;
    this.transition  = null;
    this.active    = null;
    this.tooltip  = null;
    this.animating  = false;
    this.stillOut   = null;
    this.counter  = null;
    if(typeof(this.options.data) != "undefined"){
      //user passed a data source
      e = $("<ul></ul>").appendTo(e);
      $.each(this.options.data,function(){
        var tmp = $("<li><a 'href='"+this.link+"'><img src='"+this.image+"'></a></li>").appendTo(e);
        if(typeof(this.title) != "undefined"){ tmp.find('a').attr('title',this.title); }
        if(typeof(this.caption) != "undefined"){ tmp.append("<span>"+this.caption+"</span>"); }
        if(typeof(this.thumbnail) != "undefined"){ tmp.find('a').attr('ref',this.thumbnail); }
      });
    }
    if(e.nodeName == 'UL' || e.nodeName == 'OL' || e instanceof  jQuery) {
            this.list = $(e);
            this.build();
            this.bindEvents();
        }else{
          return;
        }
    
    var y = 0;
    var x = 0;
    for(var t = 0; t<25;t++){
      var a = '<div col="'+y+'" row="'+x+'"></div>';
      this.aniDiv.append(a);
      y++;
      if(y == 5){
        x++;
        y=0;
      }
    }

    };//end PikaChoose function(e, o)
    
    var $pc = $.PikaChoose;
        $pc.fn = $pc.prototype = {
        pikachoose: '4.2.1'
    };
  
  $.fn.pikachoose = $.fn.PikaChoose;

    $pc.fn.extend = $pc.extend = $.extend;

    $pc.fn.extend({
        /**
         * Builds the gallery structure.
         *
         * @method build
         * @return undefined
         */
        build: function() {
          this.step     = 0; //transition step count
         //create the structure for pikachoose
      this.wrap     = $("<div class='pika-stage'></div>").insertBefore(this.list);
      this.image     = $("<img>").appendTo(this.wrap);
      this.anchor    = this.image.wrap("<a>").parent();
      this.imgNav   = $("<div class='pika-imgnav'></div>").insertAfter(this.anchor);
      this.imgPlay   = $("<a></a>").appendTo(this.imgNav);
      this.counter   = $("<span class='pika-counter'></span>").appendTo(this.imgNav);
      if(this.options.autoPlay){ this.imgPlay.addClass('pause'); }else{ this.imgPlay.addClass('play'); }
      this.imgPrev   = $("<a class='previous'></a>").insertAfter(this.imgPlay);
      this.imgNext   = $("<a class='next'></a>").insertAfter(this.imgPrev);
      this.caption   = $("<div class='caption'></div>").insertAfter(this.imgNav).hide();
      this.tooltip   = $("<div class='pika-tooltip'></div>").insertAfter(this.list).hide();
      this.aniWrap  = $("<div class='pika-aniwrap'></div>").insertAfter(this.caption);
      this.aniImg    = $("<img>").appendTo(this.aniWrap).hide();
      this.aniDiv    = $("<div class='pika-ani'></div>").appendTo(this.aniWrap);
      this.textNav   = $("<div class='pika-textnav'></div>").insertAfter(this.aniWrap);
      this.textPrev   = $("<a class='previous'>"+this.options.text.previous+"</a>").appendTo(this.textNav);
      this.textNext  = $("<a class='next'>"+this.options.text.next+"</a>").appendTo(this.textNav);
      this.list.addClass('pika-thumbs');
          this.list.children('li').wrapInner("<div class='clip' />");
      this.thumbs = this.list.find('img');
      this.active    = this.thumbs.eq(this.options.startOn);
      //fill in info for first image
      this.finishAnimating({'source':this.active.attr('ref') || this.active.attr('src'),'caption':this.active.parents('li:first').find('span:first').html(), 'clickThrough':this.active.parent().attr('href') || "", 'clickThroughTitle':this.active.parent().attr('title') || ""});

      //process all the thumbnails
      var self = this;
      this.thumbs.each(function(){
        self.createThumb($(this),self);
      });
      
      if(this.options.carousel){
        this.list.jcarousel({vertical:this.options.carouselVertical, initCallback: function(carousel){
          jQuery(carousel.list).find('img').click(function() {
            var clicked = parseInt(jQuery(this).parents('.jcarousel-item').attr('jcarouselindex'));
            var last = (jQuery(this).parents('ul').find('li:last').index() == clicked-1) ? true : false;
            if(!last){
              clicked = (clicked-2<=0) ? 0 : clicked-2;
            }
            clicked++;
            carousel.scroll(clicked);
          });
        }});
      }
      
      if(typeof(this.options.buildFinished) == 'function'){
           this.options.buildFinished(this);
         }
    }, //end setup
        /**
         * proccesses thumbnails
         *
         * @method createThumb
         * @return undefined
         */
        createThumb: function(ele) {
          var self = ele;
      var that = this;
          self.hide();
          
      //store all the data with the image
          $.data(ele[0],'clickThrough',self.parent('a').attr('href') || "");
          $.data(ele[0],'clickThroughTitle',self.parent('a').attr('title') || "");
          if(self.parent('a').length > 0){ self.unwrap(); }
          $.data(ele[0],'caption',self.next('span').html() || "");
      self.next('span').remove();
          $.data(ele[0],'source',self.attr('ref') || self.attr('src'));
      
      //gets each items index to iterate through them. Thanks to Tushar for the fix.
      $.data(ele[0],'order',self.closest('ul').find('li').index(self.parents('li')));
        //pass data so it can enter the load scope
        var data = $.data(ele[0]);
        $('<img />').bind('load',{data:data},function(){
          if(typeof(that.options.buildThumbStart) == 'function'){
             that.options.buildThumbStart(that);
           }
          //in this scope self refers to the image
        var img = $(this);
        var w = img.width();
        var h = img.height();
        if(w===0){w = img.attr("width");}
        if(h===0){h = img.attr("height");}
        //grab a ratio for image to user defined settings
        var rw = parseInt(self.parents('.clip').css('width').slice(0,-2))/w;
        var rh = parseInt(self.parents('.clip').css('height').slice(0,-2))/h;
        //determine which has the smallest ratio (thus needing
        //to be the side we use to scale so our whole thumb is filled)
        var ratio;
        if(rw<rh){
          //we'll use ratio later to scale and not distort
          ratio = rh;
          var left = ((w*ratio- parseInt(self.parents('.clip').css('width').slice(0,-2)))/2)*-1;
          left = Math.round(left);
          self.css({left:left});
        }else{
          ratio = rw;
          self.css({top:0});
        }
        //use those ratios to calculate scale
        var width = Math.round(w*ratio);
        var height = Math.round(h*ratio);
        self.css("position","relative");
        var imgcss={
          width: width+"px",
          height: height+"px"
        };
        self.css(imgcss);
        self.hover(
          function(e){
            clearTimeout(that.stillOut);
            $(this).stop(true,true).fadeTo(250,1);
            if(!that.options.showTooltips){ return; }
            that.tooltip.show().stop(true,true).html(data.caption).animate({top:$(this).parent().position().top, left:$(this).parent().position().left, opacity: 1.0},'fast');
          },
          function(e){
            if(!$(this).hasClass("active")){$(this).stop(true,true).fadeTo(250,that.options.thumbOpacity);
            that.stillOut = setTimeout(that.hideTooltip,700);
          }}
        );

        
        if(data.order == that.options.startOn){
          self.fadeTo(250,1);
          self.addClass('active');
        }else{
          self.fadeTo(250,that.options.thumbOpacity);
        }
        if(typeof(that.options.buildThumbFinish) == 'function'){
             that.options.buildThumbFinish(that);
           }
        }).attr('src',self.attr('src'));
        },//end createThumb
    /**
         * proccesses thumbnails
         *
         * @method bindEvents
         * @return undefined
         */
        bindEvents: function() {
          this.thumbs.bind('click',{self:this},this.imgClick);
          this.imgNext.bind('click',{self:this},this.nextClick);
          this.textNext.bind('click',{self:this},this.nextClick);
          this.imgPrev.bind('click',{self:this},this.prevClick);
          this.textPrev.bind('click',{self:this},this.prevClick);
          this.imgPlay.bind('click',{self:this},this.playClick);
          this.wrap.bind('mouseenter',{self:this},function(e){
            e.data.self.imgNav.stop(true,true).fadeIn('slow');
          });
          this.wrap.bind('mouseleave',{self:this},function(e){
            e.data.self.imgNav.stop(true,true).fadeOut('slow');          
          });
      this.tooltip.bind('mouseenter',{self:this},function(e){
        clearTimeout(e.data.self.stillOut);
      });
      this.tooltip.bind('mouseleave',{self:this},function(e){
        e.data.self.stillOut = setTimeout(e.data.self.hideTooltip,700);
      });
        },//end bind event
    /**
         * hides tooltip
         *
         * @method hideTooltip
         * @return undefined
         */
    hideTooltip: function (e){
      $(".pika-tooltip").animate({opacity:0.01});
    },
        /**
         * handles gallery after aclick occurs. and sets active classes
         *
         * @method imgClick
         * @return undefined
         */
       imgClick: function(e,x) {
         var self = e.data.self;
      var data = $.data(this);
         if(self.animating){return;}
      self.caption.fadeOut('slow');
         if(typeof(x) == 'undefined' || x.how != "auto"){
           //arrive here if natural click
           if(self.options.autoPlay){
             self.imgPlay.trigger('click');
           }
      }
         self.animating = true;
         self.active.fadeTo(300,self.options.thumbOpacity).removeClass('active');
         self.active = $(this);
         self.active.addClass('active').fadeTo(200,1);
         
       $('<img />').bind('load', {self:self,data:data}, function(){
        //in this scope self referes to the PikaChoose object
        self.aniDiv.css({height:self.image.height(),width:self.image.width()}).fadeIn('fast');
        self.aniDiv.children('div').css({'width':'20%','height':'20%','float':'left'});
    
        //decide our transition
        var n = 0;
        if(self.options.transition[0] == -1){  
          //random
          n = Math.floor(Math.random()*7)+1;
        }else{
          n = self.options.transition[self.step];
          self.step++;
          if(self.step >= self.options.transition.length){self.step=0;}
        }
        if(self.options.IESafe && $.browser.msie){ n = 1; }
        self.doAnimation(n,data);
        
      }).attr('src',$.data(this).source);//end image preload
       },//end bindEvents
       doAnimation: function(n,data){
           var self = this; //self in this scope refers to PikaChoose object. Needed for callbacks on animations
        self.image.stop(true,true);
        var aWidth = self.aniDiv.children('div').eq(0).width();
        var aHeight = self.aniDiv.children('div').eq(0).height();
        var img = new Image();
        $(img).attr('src',data.source);
        if(img.height != self.image.height() || img.width != self.image.width()){
          //Your images are not the same height? Well you get limited on transitions
          if(n != 0 && n != 1 && n != 7){
            n = 1;
          }
        }
        self.aniDiv.css({height:img.height,width:img.width});
        self.aniDiv.children().each(function(){
          //position myself absolutely
          var div = $(this);
          var xOffset = Math.floor(div.parent().width()/5)*div.attr('col');
          var yOffset = Math.floor(div.parent().height()/5)*div.attr('row');
          div.css({
            'background':'url('+data.source+') -'+xOffset+'px -'+yOffset+'px',
            'width':'0px',
            'height':'0px',
            'position':'absolute',
            'top':yOffset+'px',
            'left':xOffset+'px',
            'float':'none'
          });
        });//end ani_divs.children.each
        self.aniDiv.hide();
        self.aniImg.hide();
        
           switch(n){
          case 0:
            //fade out then in
            self.image.stop(true,true).fadeOut('slow',function(){
              self.image.attr('src',data.source).fadeIn('slow',function(){
                self.finishAnimating(data);
              });
            });
  
            break;
          case 1:
            //full frame fade
            self.aniDiv.hide();
            self.aniImg.height(self.image.height()).hide().attr('src',data.source);
            self.image.fadeOut('slow');
            self.aniImg.fadeIn('slow',function(){
              self.aniImg.hide();
              self.finishAnimating(data);
            });
  
            break;
          case 2:
            self.aniDiv.show().children().hide().each(function(index){  
              //animate out as blocks 
              var delay = index*30;
              $(this).css({opacity: 0.1}).show().delay(delay).animate({opacity: 1,"width":aWidth,"height":aHeight},200,'linear',function(){
                if(self.aniDiv.find("div").index(this) == 24){
                  self.finishAnimating(data);
                }
              });
            });
            break;
          case 3:
            self.aniDiv.show().children("div:lt(5)").hide().each(function(index){
              var delay = $(this).attr('col')*100;
              $(this).css({opacity:0.1,"width":aWidth}).show().delay(delay).animate({opacity:1,"height":self.image.height()},700,'linear',function(){
                if(self.aniDiv.find(" div").index(this) == 4){
                  self.finishAnimating(data);
                }
              });
            });
            break;              
          case 4:
            self.aniDiv.show().children().hide().each(function(index){
              var delay = $(this).attr('col')*10;
              aHeight = self.gapper($(this), aHeight);
              $(this).css({opacity:0.1,"height":aHeight}).show().delay(delay).animate({opacity:1,"width":aWidth},800,'linear',function(){
                if(self.aniDiv.find(" div").index(this) == 24){
                  self.finishAnimating(data);
                }
              });
            });
            break;
          case 5:
            self.aniDiv.show().children().show().each(function(index){
              var delay = index*Math.floor(Math.random()*5)*10;
              aHeight = self.gapper($(this), aHeight);
              
              if($(".animation div").index(this) == 24){
                delay = 800;
              }
              $(this).css({"height":aHeight,"width":aWidth,"opacity":.01}).delay(delay).animate({"opacity":1},800,function(){
                if(self.aniDiv.find(" div").index(this) == 24){
                  self.finishAnimating(data);
                }
              });
            });
            break;
          case 6:
            //full frame slide
            self.aniDiv.height(self.image.height()).hide().css({'background':'url('+data.source+') top left no-repeat'});
            self.aniDiv.children('div').hide();
            self.aniDiv.css({width:0}).show().animate({width:self.image.width()},'slow',function(){
              self.finishAnimating(data);
              self.aniDiv.css({'background':'transparent'});
            });
            break;
          case 7:
            //side in slide
            self.wrap.css({overflow:'hidden'});
            self.aniImg.height(self.image.height()).hide().attr('src',data.source);
            self.aniDiv.children('div').hide();
            self.image.css({position:'relative'}).animate({left:"-"+self.wrap.outerWidth()+"px"});
            self.aniImg.show();
            self.aniWrap.css({left:self.wrap.outerWidth()}).show().animate({left:"0px"},'slow',function(){
              self.finishAnimating(data);
              $(this).hide();
              self.aniDiv.css({'background':'transparent'});
            });
            break;
        }

       },//end doAnimation
       finishAnimating: function(data){
         this.animating = false;
         var cur = this.list.find('img').index(this.active);
         cur++;
         var total = this.list.find('img').length;
         this.counter.html(cur+"/"+total);
         this.image.attr('src',data.source).css({left:"0"}).show();
         this.aniDiv.hide();
         this.anchor.attr('href',data.clickThrough);
         this.anchor.attr('title',data.clickThroughTitle);
         if(this.options.showCaption && data.caption != "" && data.caption != null){
           this.caption.html(data.caption).stop(true,true).fadeIn('slow');
         }
         if(this.options.autoPlay == true){
           var self = this;
           this.image.delay(this.options.speed).fadeIn(0,function(){ if(self.options.autoPlay){ self.nextClick(); } });
         }
         
         if(typeof(this.options.animationFinished) == 'function'){
           this.options.animationFinished(this);
         }
       },//end finishedAnimating
     gapper: function(ele, aHeight){
      if(ele.attr('row') == 9 && ele.attr('col') == 0){
        //last row, check the gap and fix it!
        var gap = ani_divs.height()-(aHeight*9);
        return gap;
      }
      return aHeight;
     },
     nextClick : function(e){
      var how = "natural";
       try{
        var self = e.data.self;
        if(typeof(e.data.self.options.next) == 'function'){
          e.data.self.options.next(this);
        }
      }catch(err){
        var self = this;
        how = "auto";
      }
      var next = self.active.parents('li:first').next().find('img');
      if(next.length == 0){next = self.list.find('img').eq(0);};
       next.trigger('click',{how:how});
     },
     prevClick : function(e){
      if(typeof(e.data.self.options.previous) == 'function'){
           e.data.self.options.previous(this);
         }
      var self = e.data.self;
      var prev = self.active.parents('li:first').prev().find('img');
      if(prev.length == 0){prev = self.list.find('img:last');};
       prev.trigger('click');
     },
     playClick: function(e){
       var self = e.data.self;
       self.options.autoPlay = !self.options.autoPlay;
      self.imgPlay.toggleClass('play').toggleClass('pause');
      if(self.options.autoPlay){ self.nextClick(); }
     }
  }); //end extend

})(jQuery);
