/*
 * 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(g){
    var q={
        vertical:!1,
        rtl:!1,
        start:1,
        offset:1,
        size:null,
        scroll:3,
        visible:null,
        animation:"normal",
        easing:"swing",
        auto:0,
        wrap:null,
        initCallback:null,
        setupCallback:null,
        reloadCallback:null,
        itemLoadCallback:null,
        itemFirstInCallback:null,
        itemFirstOutCallback:null,
        itemLastInCallback:null,
        itemLastOutCallback:null,
        itemVisibleInCallback:null,
        itemVisibleOutCallback:null,
        animationStepCallback:null,
        buttonNextHTML:"<div></div>",
        buttonPrevHTML:"<div></div>",
        buttonNextEvent:"click",
        buttonPrevEvent:"click", 
        buttonNextCallback:null,
        buttonPrevCallback:null,
        itemFallbackDimension:null
    },m=!1;
    g(window).bind("load.jcarousel",function(){
        m=!0
    });
    g.jcarousel=function(a,c){
        this.options=g.extend({},q,c||{});
        this.autoStopped=this.locked=!1;
        this.buttonPrevState=this.buttonNextState=this.buttonPrev=this.buttonNext=this.list=this.clip=this.container=null;
        if(!c||c.rtl===void 0)this.options.rtl=(g(a).attr("dir")||g("html").attr("dir")||"").toLowerCase()=="rtl";
        this.wh=!this.options.vertical?"width":"height";
        this.lt=!this.options.vertical? this.options.rtl?"right":"left":"top";
        for(var b="",d=a.className.split(" "),f=0;f<d.length;f++)if(d[f].indexOf("jcarousel-skin")!=-1){
            g(a).removeClass(d[f]);
            b=d[f];
            break
        }
        a.nodeName.toUpperCase()=="UL"||a.nodeName.toUpperCase()=="OL"?(this.list=g(a),this.clip=this.list.parents(".jcarousel-clip"),this.container=this.list.parents(".jcarousel-container")):(this.container=g(a),this.list=this.container.find("ul,ol").eq(0),this.clip=this.container.find(".jcarousel-clip"));
        if(this.clip.size()===0)this.clip= this.list.wrap("<div></div>").parent();
        if(this.container.size()===0)this.container=this.clip.wrap("<div></div>").parent();
        b!==""&&this.container.parent()[0].className.indexOf("jcarousel-skin")==-1&&this.container.wrap('<div class=" '+b+'"></div>');
        this.buttonPrev=g(".jcarousel-prev",this.container);
        if(this.buttonPrev.size()===0&&this.options.buttonPrevHTML!==null)this.buttonPrev=g(this.options.buttonPrevHTML).appendTo(this.container);
        this.buttonPrev.addClass(this.className("jcarousel-prev"));
        this.buttonNext= g(".jcarousel-next",this.container);
        if(this.buttonNext.size()===0&&this.options.buttonNextHTML!==null)this.buttonNext=g(this.options.buttonNextHTML).appendTo(this.container);
        this.buttonNext.addClass(this.className("jcarousel-next"));
        this.clip.addClass(this.className("jcarousel-clip")).css({
            position:"relative"
        });
        this.list.addClass(this.className("jcarousel-list")).css({
            overflow:"hidden",
            position:"relative",
            top:0,
            margin:0,
            padding:0
        }).css(this.options.rtl?"right":"left",0);
        this.container.addClass(this.className("jcarousel-container")).css({
            position:"relative"
        });
        !this.options.vertical&&this.options.rtl&&this.container.addClass("jcarousel-direction-rtl").attr("dir","rtl");
        var j=this.options.visible!==null?Math.ceil(this.clipping()/this.options.visible):null,b=this.list.children("li"),e=this;
        if(b.size()>0){
            var h=0,i=this.options.offset;
            b.each(function(){
                e.format(this,i++);
                h+=e.dimension(this,j)
            });
            this.list.css(this.wh,h+100+"px");
            if(!c||c.size===void 0)this.options.size=b.size()
        }
        this.container.css("display","block");
        this.buttonNext.css("display","block");
        this.buttonPrev.css("display", "block");
        this.funcNext=function(){
            e.next()
        };
            
        this.funcPrev=function(){
            e.prev()
        };
            
        this.funcResize=function(){
            e.resizeTimer&&clearTimeout(e.resizeTimer);
            e.resizeTimer=setTimeout(function(){
                e.reload()
            },100)
        };
            
        this.options.initCallback!==null&&this.options.initCallback(this,"init");
        !m&&g.browser.safari?(this.buttons(!1,!1),g(window).bind("load.jcarousel",function(){
            e.setup()
        })):this.setup()
    };
        
    var f=g.jcarousel;
    f.fn=f.prototype={
        jcarousel:"0.2.8"
    };
    
    f.fn.extend=f.extend=g.extend;
    f.fn.extend({
        setup:function(){
            this.prevLast= this.prevFirst=this.last=this.first=null;
            this.animating=!1;
            this.tail=this.resizeTimer=this.timer=null;
            this.inTail=!1;
            if(!this.locked){
                this.list.css(this.lt,this.pos(this.options.offset)+"px");
                var a=this.pos(this.options.start,!0);
                this.prevFirst=this.prevLast=null;
                this.animate(a,!1);
                g(window).unbind("resize.jcarousel",this.funcResize).bind("resize.jcarousel",this.funcResize);
                this.options.setupCallback!==null&&this.options.setupCallback(this)
            }
        },
        reset:function(){
            this.list.empty();
            this.list.css(this.lt, "0px");
            this.list.css(this.wh,"10px");
            this.options.initCallback!==null&&this.options.initCallback(this,"reset");
            this.setup()
        },
        reload:function(){
            this.tail!==null&&this.inTail&&this.list.css(this.lt,f.intval(this.list.css(this.lt))+this.tail);
            this.tail=null;
            this.inTail=!1;
            this.options.reloadCallback!==null&&this.options.reloadCallback(this);
            if(this.options.visible!==null){
                var a=this,c=Math.ceil(this.clipping()/this.options.visible),b=0,d=0;
                this.list.children("li").each(function(f){
                    b+=a.dimension(this, c);
                    f+1<a.first&&(d=b)
                });
                this.list.css(this.wh,b+"px");
                this.list.css(this.lt,-d+"px")
            }
            this.scroll(this.first,!1)
        },
        lock:function(){
            this.locked=!0;
            this.buttons()
        },
        unlock:function(){
            this.locked=!1;
            this.buttons()
        },
        size:function(a){
            if(a!==void 0)this.options.size=a,this.locked||this.buttons();
            return this.options.size
        },
        has:function(a,c){
            if(c===void 0||!c)c=a;
            if(this.options.size!==null&&c>this.options.size)c=this.options.size;
            for(var b=a;b<=c;b++){
                var d=this.get(b);
                if(!d.length||d.hasClass("jcarousel-item-placeholder"))return!1
            }
            return!0
        }, 
        get:function(a){
            return g(">.jcarousel-item-"+a,this.list)
        },
        add:function(a,c){
            var b=this.get(a),d=0,p=g(c);
            if(b.length===0)for(var j,e=f.intval(a),b=this.create(a);;){
                if(j=this.get(--e),e<=0||j.length){
                    e<=0?this.list.prepend(b):j.after(b);
                    break
                }
            }else d=this.dimension(b);
            p.get(0).nodeName.toUpperCase()=="LI"?(b.replaceWith(p),b=p):b.empty().append(c);
            this.format(b.removeClass(this.className("jcarousel-item-placeholder")),a);
            p=this.options.visible!==null?Math.ceil(this.clipping()/this.options.visible): null;
            d=this.dimension(b,p)-d;
            a>0&&a<this.first&&this.list.css(this.lt,f.intval(this.list.css(this.lt))-d+"px");
            this.list.css(this.wh,f.intval(this.list.css(this.wh))+d+"px");
            return b
        },
        remove:function(a){
            var c=this.get(a);
            if(c.length&&!(a>=this.first&&a<=this.last)){
                var b=this.dimension(c);
                a<this.first&&this.list.css(this.lt,f.intval(this.list.css(this.lt))+b+"px");
                c.remove();
                this.list.css(this.wh,f.intval(this.list.css(this.wh))-b+"px")
            }
        },
        next:function(){
            this.tail!==null&&!this.inTail?this.scrollTail(!1): 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.tail!==null&&this.inTail?this.scrollTail(!0):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(a){
            if(!this.locked&&!this.animating&&this.tail){
                this.pauseAuto();
                var c=f.intval(this.list.css(this.lt)), c=!a?c-this.tail:c+this.tail;
                this.inTail=!a;
                this.prevFirst=this.first;
                this.prevLast=this.last;
                this.animate(c)
            }
        },
        scroll:function(a,c){
            !this.locked&&!this.animating&&(this.pauseAuto(),this.animate(this.pos(a),c))
        },
        pos:function(a,c){
            var b=f.intval(this.list.css(this.lt));
            if(this.locked||this.animating)return b;
            this.options.wrap!="circular"&&(a=a<1?1:this.options.size&&a>this.options.size?this.options.size:a);
            for(var d=this.first>a,g=this.options.wrap!="circular"&&this.first<=1?1:this.first,j=d?this.get(g): this.get(this.last),e=d?g:g-1,h=null,i=0,k=!1,l=0;d?--e>=a:++e<a;){
                h=this.get(e);
                k=!h.length;
                if(h.length===0&&(h=this.create(e).addClass(this.className("jcarousel-item-placeholder")),j[d?"before":"after"](h),this.first!==null&&this.options.wrap=="circular"&&this.options.size!==null&&(e<=0||e>this.options.size)))j=this.get(this.index(e)),j.length&&(h=this.add(e,j.clone(!0)));
                j=h;
                l=this.dimension(h);
                k&&(i+=l);
                if(this.first!==null&&(this.options.wrap=="circular"||e>=1&&(this.options.size===null||e<= this.options.size)))b=d?b+l:b-l
            }
            for(var g=this.clipping(),m=[],o=0,n=0,j=this.get(a-1),e=a;++o;){
                h=this.get(e);
                k=!h.length;
                if(h.length===0){
                    h=this.create(e).addClass(this.className("jcarousel-item-placeholder"));
                    if(j.length===0)this.list.prepend(h);else j[d?"before":"after"](h);
                    if(this.first!==null&&this.options.wrap=="circular"&&this.options.size!==null&&(e<=0||e>this.options.size))j=this.get(this.index(e)),j.length&&(h=this.add(e,j.clone(!0)))
                }
                j=h;
                l=this.dimension(h);
                if(l===0)throw Error("jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...");
                this.options.wrap!="circular"&&this.options.size!==null&&e>this.options.size?m.push(h):k&&(i+=l);
                n+=l;
                if(n>=g)break;
                e++
            }
            for(h=0;h<m.length;h++)m[h].remove();
            i>0&&(this.list.css(this.wh,this.dimension(this.list)+i+"px"),d&&(b-=i,this.list.css(this.lt,f.intval(this.list.css(this.lt))-i+"px")));
            i=a+o-1;
            if(this.options.wrap!="circular"&&this.options.size&&i>this.options.size)i=this.options.size;
            if(e>i){
                o=0;
                e=i;
                for(n=0;++o;){
                    h=this.get(e--);
                    if(!h.length)break;
                    n+=this.dimension(h);
                    if(n>=g)break
                }
            }
            e=i-o+ 1;
            this.options.wrap!="circular"&&e<1&&(e=1);
            if(this.inTail&&d)b+=this.tail,this.inTail=!1;
            this.tail=null;
            if(this.options.wrap!="circular"&&i==this.options.size&&i-o+1>=1&&(d=f.intval(this.get(i).css(!this.options.vertical?"marginRight":"marginBottom")),n-d>g))this.tail=n-g-d;
            if(c&&a===this.options.size&&this.tail)b-=this.tail,this.inTail=!0;
            for(;a-- >e;)b+=this.dimension(this.get(a));
            this.prevFirst=this.first;
            this.prevLast=this.last;
            this.first=e;
            this.last=i;
            return b
        },
        animate:function(a,c){
            if(!this.locked&& !this.animating){
                this.animating=!0;
                var b=this,d=function(){
                    b.animating=!1;
                    a===0&&b.list.css(b.lt,0);
                    !b.autoStopped&&(b.options.wrap=="circular"||b.options.wrap=="both"||b.options.wrap=="last"||b.options.size===null||b.last<b.options.size||b.last==b.options.size&&b.tail!==null&&!b.inTail)&&b.startAuto();
                    b.buttons();
                    b.notify("onAfterAnimation");
                    if(b.options.wrap=="circular"&&b.options.size!==null)for(var c=b.prevFirst;c<=b.prevLast;c++)c!==null&&!(c>=b.first&&c<=b.last)&&(c<1||c>b.options.size)&&b.remove(c)
                };                
                this.notify("onBeforeAnimation");
                if(!this.options.animation||c===!1)this.list.css(this.lt,a+"px"),d();
                else{
                    var f=!this.options.vertical?this.options.rtl?{
                        right:a
                    }:{
                        left:a
                    }:{
                        top:a
                    },d={
                        duration:this.options.animation,
                        easing:this.options.easing,
                        complete:d
                    };
            
                    if(g.isFunction(this.options.animationStepCallback))d.step=this.options.animationStepCallback;
                    this.list.animate(f,d)
                }
            }
        },
        startAuto:function(a){
            if(a!==void 0)this.options.auto=a;
            if(this.options.auto===0)return this.stopAuto();
            if(this.timer===null){
                this.autoStopped= !1;
                var c=this;
                this.timer=window.setTimeout(function(){
                    c.next()
                },this.options.auto*1E3)
            }
        },
        stopAuto:function(){
            this.pauseAuto();
            this.autoStopped=!0
        },
        pauseAuto:function(){
            if(this.timer!==null)window.clearTimeout(this.timer),this.timer=null
        },
        buttons:function(a,c){
            if(a==null&&(a=!this.locked&&this.options.size!==0&&(this.options.wrap&&this.options.wrap!="first"||this.options.size===null||this.last<this.options.size),!this.locked&&(!this.options.wrap||this.options.wrap=="first")&&this.options.size!==null&& this.last>=this.options.size))a=this.tail!==null&&!this.inTail;
            if(c==null&&(c=!this.locked&&this.options.size!==0&&(this.options.wrap&&this.options.wrap!="last"||this.first>1),!this.locked&&(!this.options.wrap||this.options.wrap=="last")&&this.options.size!==null&&this.first==1))c=this.tail!==null&&this.inTail;
            var b=this;
            this.buttonNext.size()>0?(this.buttonNext.unbind(this.options.buttonNextEvent+".jcarousel",this.funcNext),a&&this.buttonNext.bind(this.options.buttonNextEvent+".jcarousel",this.funcNext), this.buttonNext[a?"removeClass":"addClass"](this.className("jcarousel-next-disabled")).attr("disabled",a?!1:!0),this.options.buttonNextCallback!==null&&this.buttonNext.data("jcarouselstate")!=a&&this.buttonNext.each(function(){
                b.options.buttonNextCallback(b,this,a)
            }).data("jcarouselstate",a)):this.options.buttonNextCallback!==null&&this.buttonNextState!=a&&this.options.buttonNextCallback(b,null,a);
            this.buttonPrev.size()>0?(this.buttonPrev.unbind(this.options.buttonPrevEvent+".jcarousel",this.funcPrev), c&&this.buttonPrev.bind(this.options.buttonPrevEvent+".jcarousel",this.funcPrev),this.buttonPrev[c?"removeClass":"addClass"](this.className("jcarousel-prev-disabled")).attr("disabled",c?!1:!0),this.options.buttonPrevCallback!==null&&this.buttonPrev.data("jcarouselstate")!=c&&this.buttonPrev.each(function(){
                b.options.buttonPrevCallback(b,this,c)
            }).data("jcarouselstate",c)):this.options.buttonPrevCallback!==null&&this.buttonPrevState!=c&&this.options.buttonPrevCallback(b,null,c);
            this.buttonNextState= a;
            this.buttonPrevState=c
        },
        notify:function(a){
            var c=this.prevFirst===null?"init":this.prevFirst<this.first?"next":"prev";
            this.callback("itemLoadCallback",a,c);
            this.prevFirst!==this.first&&(this.callback("itemFirstInCallback",a,c,this.first),this.callback("itemFirstOutCallback",a,c,this.prevFirst));
            this.prevLast!==this.last&&(this.callback("itemLastInCallback",a,c,this.last),this.callback("itemLastOutCallback",a,c,this.prevLast));
            this.callback("itemVisibleInCallback",a,c,this.first,this.last,this.prevFirst, this.prevLast);
            this.callback("itemVisibleOutCallback",a,c,this.prevFirst,this.prevLast,this.first,this.last)
        },
        callback:function(a,c,b,d,f,j,e){
            if(!(this.options[a]==null||typeof this.options[a]!="object"&&c!="onAfterAnimation")){
                var h=typeof this.options[a]=="object"?this.options[a][c]:this.options[a];
                if(g.isFunction(h)){
                    var i=this;
                    if(d===void 0)h(i,b,c);
                    else if(f===void 0)this.get(d).each(function(){
                        h(i,this,d,b,c)
                    });else for(var a=function(a){
                        i.get(a).each(function(){
                            h(i,this,a,b,c)
                        })
                    },k=d;k<=f;k++)k!== null&&!(k>=j&&k<=e)&&a(k)
                }
            }
        },
        create:function(a){
            return this.format("<li></li>",a)
        },
        format:function(a,c){
            for(var a=g(a),b=a.get(0).className.split(" "),d=0;d<b.length;d++)b[d].indexOf("jcarousel-")!=-1&&a.removeClass(b[d]);
            a.addClass(this.className("jcarousel-item")).addClass(this.className("jcarousel-item-"+c)).css({
                "float":this.options.rtl?"right":"left",
                "list-style":"none"
            }).attr("jcarouselindex",c);
            return a
        },
        className:function(a){
            return a+" "+a+(!this.options.vertical?"-horizontal":"-vertical")
        }, 
        dimension:function(a,c){
            var b=g(a);
            if(c==null)return!this.options.vertical?b.outerWidth(!0)||f.intval(this.options.itemFallbackDimension):b.outerHeight(!0)||f.intval(this.options.itemFallbackDimension);
            else{
                var d=!this.options.vertical?c-f.intval(b.css("marginLeft"))-f.intval(b.css("marginRight")):c-f.intval(b.css("marginTop"))-f.intval(b.css("marginBottom"));
                g(b).css(this.wh,d+"px");
                return this.dimension(b)
            }
        },
        clipping:function(){
            return!this.options.vertical?this.clip[0].offsetWidth-f.intval(this.clip.css("borderLeftWidth"))- f.intval(this.clip.css("borderRightWidth")):this.clip[0].offsetHeight-f.intval(this.clip.css("borderTopWidth"))-f.intval(this.clip.css("borderBottomWidth"))
        },
        index:function(a,c){
            if(c==null)c=this.options.size;
            return Math.round(((a-1)/c-Math.floor((a-1)/c))*c)+1
        }
    });
    f.extend({
        defaults:function(a){
            return g.extend(q,a||{})
        },
        intval:function(a){
            a=parseInt(a,10);
            return isNaN(a)?0:a
        },
        windowLoaded:function(){
            m=!0
        }
    });
    g.fn.jcarousel=function(a){
        if(typeof a=="string"){
            var c=g(this).data("jcarousel"),b=Array.prototype.slice.call(arguments, 1);
            return c[a].apply(c,b)
        }else return this.each(function(){
            var b=g(this).data("jcarousel");
            b?(a&&g.extend(b.options,a),b.reload()):g(this).data("jcarousel",new f(this,a))
        })
    }
})(jQuery);

/*  5/20/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/>.
*/
var pikachooseTransitionConf  = {};
(function($){
    var defaults={
        autoPlay:true,
        speed:5000,
        text:{
            play:"",
            stop:"",
            previous:"Previous",
            next:"Next"
        },
        transition:[-1],
        showCaption:true,
        IESafe:false,
        showTooltips:false,
        carousel:false,
        carouselVertical:false,
        animationFinished:null,
        buildFinished:null,
        bindFinished:null,
        startOn:0,
        thumbOpacity:0.4,
        hoverPause:false
    };
    
    $.fn.PikaChoose=function(o){
        return this.each(function(){
            $(this).data('pikachoose',new $pc(this,o))
        })
    };
        
    $.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;
        this.timeOut=null;
        if(typeof(this.options.data)!="undefined"){
            e=$("<ul></ul>").appendTo(e);
            $.each(this.options.data,function(){
                if(typeof(this.link)!="undefined"){
                    var tmp=$("<li><a href='"+this.link+"'><img></a></li>").appendTo(e);
                    if(typeof(this.title)!="undefined"){
                        tmp.find('a').attr('title',this.title)
                    }
                }else{
                    var tmp=$("<li><img></li>").appendTo(e)
                }
                if(typeof(this.caption)!="undefined"){
                    tmp.append("<span>"+this.caption+"</span>")
                }
                if(typeof(this.thumbnail)!="undefined"){
                    tmp.find('img').attr('ref',this.image);
                    tmp.find('img').attr('src',this.thumbnail)
                }else{
                    tmp.find('img').attr('src',this.image)
                }
            })
        }
	
        // Default
        /*
	this.animationSpeed = {
		0 : { speed : 500 }, //full frame fade
		1 : { delay : 30, speed : 200 }, //animate out as blocks
		2 : { delay : 30, speed : 500 },
		3 : { delay : 10, speed : 800 },
		4 : { delay : 10, maxDelay : 800, speed : 800 },
		5 : { delay : 800 }, //full frame slide
		6 : { fadeIn : 500, fadeOut : 500 } //fade out then in
	};
	*/


        this.animationSpeed = {
            0 : { speed : 500 }, //full frame fade
            1 : { delay : 30, speed : 200 }, //animate out as blocks
            2 : { delay : 100, speed : 700 },
            3 : { delay : 10, speed : 500 },
            4 : { delay : 7, maxDelay : 600, speed : 600 },
            5 : { delay : 500 }, //full frame slide
            6 : { fadeIn : 500, fadeOut : 500 } //fade out then in
        };

        if(pikachooseTransitionConf[e.id])
        {
            this.animationSpeed = pikachooseTransitionConf[e.id];
        }
	
        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
            }
        }
    };

    var $pc=$.PikaChoose;
    $pc.fn=$pc.prototype={
        pikachoose:'4.3.1'
    };

    $.fn.pikachoose=$.fn.PikaChoose;
    $pc.fn.extend=$pc.extend=$.extend;
    $pc.fn.extend({
        build:function(){
            this.step=0;
            this.wrap=$("<div class='pika-stage'></div>").insertBefore(this.list);
            this.image=$("<img>").appendTo(this.wrap);
            this.imgNav=$("<div class='pika-imgnav'></div>").insertAfter(this.image);
            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);
            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')||""
            });
            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)
            }
        },
        createThumb:function(ele){
            var self=ele;
            var that=this;
            self.hide();
            $.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'));
            $.data(ele[0],'order',self.closest('ul').find('li').index(self.parents('li')));
            var data=$.data(ele[0]);
            $('<img />').bind('load',{
                data:data
            },function(){
                if(typeof(that.options.buildThumbStart)=='function'){
                    that.options.buildThumbStart(that)
                }
                var img=$(this);
                var w=this.width;
                var h=this.height;
                if(w===0){
                    w=img.attr("width")
                }
                if(h===0){
                    h=img.attr("height")
                }
                var rw=parseInt(self.parents('.clip').css('width').slice(0,-2))/w;
                var rh=parseInt(self.parents('.clip').css('height').slice(0,-2))/h;
                var ratio;
                if(rw<rh){
                    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
                    })
                }
                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');
                    self.parents('li').eq(0).addClass('active')
                }else{
                    self.fadeTo(250,that.options.thumbOpacity)
                }
                if(typeof(that.options.buildThumbFinish)=='function'){
                    that.options.buildThumbFinish(that)
                }
            }).attr('src',self.attr('src'))
        },
        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');
                if(e.data.self.options.hoverPause==true){
                    clearTimeout(e.data.self.timeOut)
                }
            });
            this.wrap.bind('mouseleave',{
                self:this
            },function(e){
                e.data.self.imgNav.stop(true,true).fadeOut('slow');
                if(e.data.self.options.autoPlay==true&&e.data.self.options.hoverPause){
                    e.data.self.timeOut=setTimeout((function(self){
                        return function(){
                            self.nextClick()
                        }
                    })(e.data.self),e.data.self.options.speed)
                }
            });
            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)
            });
            if(typeof(this.options.bindsFinished)=='function'){
                this.options.bindsFinished(this)
            }
        },
        hideTooltip:function(e){
            $(".pika-tooltip").animate({
                opacity:0.01
            })
        },
        imgClick:function(e,x){
            var self=e.data.self;
            var data=$.data(this);
            if(self.animating){
                return
            }
            if(typeof(x)=='undefined'||x.how!="auto"){
                if(self.options.autoPlay){
                    self.imgPlay.trigger('click')
                }
            }else{
                if(self.options.autoPlay==false){
                    return false
                }
            }
            self.caption.fadeOut('slow');
            self.animating=true;
            self.active.fadeTo(300,self.options.thumbOpacity).removeClass('active');
            self.active.parents('.active').eq(0).removeClass('active');
            self.active=$(this);
            self.active.addClass('active').fadeTo(200,1);
            self.active.parents('li').eq(0).addClass('active');
            $('<img />').bind('load',{
                self:self,
                data:data
            },function(){
                self.aniDiv.css({
                    height:self.image.height(),
                    width:self.image.width()
                }).fadeIn('fast');
                self.aniDiv.children('div').css({
                    'width':'20%',
                    'height':'20%',
                    'float':'left'
                });
                var n=0;
                if(self.options.transition[0]==-1){
                    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)
        },
        doAnimation:function(n,data){
            var self=this;
            self.image.stop(true,false);
            self.caption.stop().fadeOut();
            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()){
                if(n!=0&&n!=1&&n!=7){
                    n=1
                }
            }
            self.aniDiv.css({
                height:img.height,
                width:img.width
            });
            self.aniDiv.children().each(function(){
                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'
                })
            });
            self.aniDiv.hide();
            self.aniImg.hide();
            switch(n){
                case 0: //fadeOut, fadeIn
                    self.image.stop(true,true).fadeOut(self.animationSpeed[6].fadeOut,function(){
                        self.image.attr('src',data.source).fadeIn(self.animationSpeed[6].fadeIn,function(){
                            self.finishAnimating(data)
                        })
                    });
                    break;
                case 1:
                    self.aniDiv.hide();
                    self.aniImg.height(self.image.height()).hide().attr('src',data.source);
                    $.when(self.image.fadeOut(self.animationSpeed[6].fadeOut),self.aniImg.eq(0).fadeIn(self.animationSpeed[6].fadeIn)).done(function(){
                        self.finishAnimating(data)
                    });
                    break;
                case 2:
                    self.aniDiv.show().children().hide().each(function(index){
                        var delay=index*self.animationSpeed[1].delay;
                        $(this).css({
                            opacity:0.1
                        }).show().delay(delay).animate({
                            opacity:1,
                            "width":aWidth,
                            "height":aHeight
                        },self.animationSpeed[1].speed,'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')*self.animationSpeed[2].delay;
                        $(this).css({
                            opacity:0.1,
                            "width":aWidth
                        }).show().delay(delay).animate({
                            opacity:1,
                            "height":self.image.height()
                        },self.animationSpeed[2].speed,'linear',function(){
                            if(self.aniDiv.find(" div").index(this)==4){
                                self.finishAnimating(data)
                            }
                        })
                    });
                    break;
                case 4:
                    self.aniDiv.show().children().hide().each(function(index){
                        if(index>4){
                            return
                        }
                        var delay=$(this).attr('col')*self.animationSpeed[3].delay;
                        aHeight=self.gapper($(this),aHeight);
                        $(this).css({
                            opacity:0.1,
                            "height":"100%"
                        }).show().animate({
                            opacity:1,
                            "width":aWidth
                        },self.animationSpeed[3].speed,'linear',function(){
                            if(self.aniDiv.find(" div").index(this)==4){
                                self.finishAnimating(data)
                            }
                        })
                    });
                    break;
                case 5:
                    self.aniDiv.show().children().show().each(function(index){
                        var delay=index*Math.floor(Math.random()*5)*self.animationSpeed[4].delay;
                        aHeight=self.gapper($(this),aHeight);
                        if($(".animation div").index(this)==24){
                            delay=self.animationSpeed[4].maxDelay
                        }
                        $(this).css({
                            "height":aHeight,
                            "width":aWidth,
                            "opacity":.01
                        }).delay(delay).animate({
                            "opacity":1
                        },self.animationSpeed[4].speed,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()
                    },self.animationSpeed[5].delay,function(){
                        self.finishAnimating(data);
                        self.aniDiv.css({
                            'background':'transparent'
                        })
                    });
                    break;
                case 7:
                    self.wrap.css({
                        overflow:'hidden'
                    });
                    self.aniImg.height(self.image.height()).hide().attr('src',data.source);
                    self.aniDiv.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"
                    },self.animationSpeed[0].speed,function(){
                        self.finishAnimating(data)
                    });
                    break
            }
        },
        finishAnimating:function(data){
            this.animating=false;
            this.image.attr('src',data.source);
            this.image.css({
                left:"0"
            });
            this.image.show();
            var self=this;
            $('<img />').bind('load',function(){
                self.aniImg.hide();
                self.aniDiv.hide()
            }).attr('src',data.source);
            var cur=this.list.find('img').index(this.active);
            cur++;
            var total=this.list.find('img').length;
            this.counter.html(cur+"/"+total);
            if(data.clickThrough!=""){
                if(this.anchor==null){
                    this.anchor=this.image.wrap("<a>").parent()
                }
                this.anchor.attr('href',data.clickThrough);
                this.anchor.attr('title',data.clickThroughTitle)
            }else{
                if(this.image.parent('a').length>0){
                    this.image.unwrap()
                }
                this.anchor=null
            }
            if(this.options.showCaption&&data.caption!=""&&data.caption!=null){
                this.caption.html(data.caption).fadeTo('slow',1)
            }
            if(this.options.autoPlay==true){
                var self=this;
                this.timeOut=setTimeout((function(self){
                    return function(){
                        self.nextClick()
                    }
                })(this),this.options.speed,this.timeOut)
            }
            if(typeof(this.options.animationFinished)=='function'){
                this.options.animationFinished(this)
            }
        },
        gapper:function(ele,aHeight){
            if(ele.attr('row')==9&&ele.attr('col')==0){
                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()
            }
        }
    })
})(jQuery);
