/* IE7/9 */
document.createElement('figure');
document.createElement('figcaption');
document.createElement('details');

// http://jdbartlett.github.com/innershiv | WTFPL License
window.innerShiv=(function(){var d,r;return function(h,u){if(!d){d=document.createElement('div');r=document.createDocumentFragment();/*@cc_on d.style.display = 'none'@*/}var e=d.cloneNode(true);/*@cc_on document.body.appendChild(e);@*/e.innerHTML=h.replace(/^\s\s*/, '').replace(/\s\s*$/, '');/*@cc_on document.body.removeChild(e);@*/if(u===false)return e.childNodes;var f=r.cloneNode(true),i=e.childNodes.length;while(i--)f.appendChild(e.firstChild);return f}}());

/* 
 * jQuery Easing functions
 */
//t: current time, b: begInnIng value, c: change In value, d: duration
jQuery.easing['jswing'] = jQuery.easing['swing'];
jQuery.extend(jQuery.easing,{def:"easeOutQuad",swing:function(x,t,b,c,d){return jQuery.easing[jQuery.easing.def](x,t,b,c,d)},easeInQuad:function(x,t,b,c,d){return c*(t/=d)*t+b},easeOutQuad:function(x,t,b,c,d){return -c*(t/=d)*(t-2)+b},easeInOutQuad:function(x,t,b,c,d){if((t/=d/2)<1){return c/2*t*t+b}return -c/2*((--t)*(t-2)-1)+b},easeInCubic:function(x,t,b,c,d){return c*(t/=d)*t*t+b},easeOutCubic:function(x,t,b,c,d){return c*((t=t/d-1)*t*t+1)+b},easeInOutCubic:function(x,t,b,c,d){if((t/=d/2)<1){return c/2*t*t*t+b}return c/2*((t-=2)*t*t+2)+b},easeInQuart:function(x,t,b,c,d){return c*(t/=d)*t*t*t+b},easeOutQuart:function(x,t,b,c,d){return -c*((t=t/d-1)*t*t*t-1)+b},easeInOutQuart:function(x,t,b,c,d){if((t/=d/2)<1){return c/2*t*t*t*t+b}return -c/2*((t-=2)*t*t*t-2)+b},easeInQuint:function(x,t,b,c,d){return c*(t/=d)*t*t*t*t+b},easeOutQuint:function(x,t,b,c,d){return c*((t=t/d-1)*t*t*t*t+1)+b},easeInOutQuint:function(x,t,b,c,d){if((t/=d/2)<1){return c/2*t*t*t*t*t+b}return c/2*((t-=2)*t*t*t*t+2)+b},easeInSine:function(x,t,b,c,d){return -c*Math.cos(t/d*(Math.PI/2))+c+b},easeOutSine:function(x,t,b,c,d){return c*Math.sin(t/d*(Math.PI/2))+b},easeInOutSine:function(x,t,b,c,d){return -c/2*(Math.cos(Math.PI*t/d)-1)+b},easeInExpo:function(x,t,b,c,d){return(t==0)?b:c*Math.pow(2,10*(t/d-1))+b},easeOutExpo:function(x,t,b,c,d){return(t==d)?b+c:c*(-Math.pow(2,-10*t/d)+1)+b},easeInOutExpo:function(x,t,b,c,d){if(t==0){return b}if(t==d){return b+c}if((t/=d/2)<1){return c/2*Math.pow(2,10*(t-1))+b}return c/2*(-Math.pow(2,-10*--t)+2)+b},easeInCirc:function(x,t,b,c,d){return -c*(Math.sqrt(1-(t/=d)*t)-1)+b},easeOutCirc:function(x,t,b,c,d){return c*Math.sqrt(1-(t=t/d-1)*t)+b},easeInOutCirc:function(x,t,b,c,d){if((t/=d/2)<1){return -c/2*(Math.sqrt(1-t*t)-1)+b}return c/2*(Math.sqrt(1-(t-=2)*t)+1)+b},easeInElastic:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0){return b}if((t/=d)==1){return b+c}if(!p){p=d*0.3}if(a<Math.abs(c)){a=c;var s=p/4}else{var s=p/(2*Math.PI)*Math.asin(c/a)}return -(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b},easeOutElastic:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0){return b}if((t/=d)==1){return b+c}if(!p){p=d*0.3}if(a<Math.abs(c)){a=c;var s=p/4}else{var s=p/(2*Math.PI)*Math.asin(c/a)}return a*Math.pow(2,-10*t)*Math.sin((t*d-s)*(2*Math.PI)/p)+c+b},easeInOutElastic:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0){return b}if((t/=d/2)==2){return b+c}if(!p){p=d*(0.3*1.5)}if(a<Math.abs(c)){a=c;var s=p/4}else{var s=p/(2*Math.PI)*Math.asin(c/a)}if(t<1){return -0.5*(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b}return a*Math.pow(2,-10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p)*0.5+c+b},easeInBack:function(x,t,b,c,d,s){if(s==undefined){s=1.70158}return c*(t/=d)*t*((s+1)*t-s)+b},easeOutBack:function(x,t,b,c,d,s){if(s==undefined){s=1.70158}return c*((t=t/d-1)*t*((s+1)*t+s)+1)+b},easeInOutBack:function(x,t,b,c,d,s){if(s==undefined){s=1.70158}if((t/=d/2)<1){return c/2*(t*t*(((s*=(1.525))+1)*t-s))+b}return c/2*((t-=2)*t*(((s*=(1.525))+1)*t+s)+2)+b},easeInBounce:function(x,t,b,c,d){return c-jQuery.easing.easeOutBounce(x,d-t,0,c,d)+b},easeOutBounce:function(x,t,b,c,d){if((t/=d)<(1/2.75)){return c*(7.5625*t*t)+b}else{if(t<(2/2.75)){return c*(7.5625*(t-=(1.5/2.75))*t+0.75)+b}else{if(t<(2.5/2.75)){return c*(7.5625*(t-=(2.25/2.75))*t+0.9375)+b}else{return c*(7.5625*(t-=(2.625/2.75))*t+0.984375)+b}}}},easeInOutBounce:function(x,t,b,c,d){if(t<d/2){return jQuery.easing.easeInBounce(x,t*2,0,c,d)*0.5+b}return jQuery.easing.easeOutBounce(x,t*2-d,0,c,d)*0.5+c*0.5+b}});


(function($) {
    
    var _settings = {
        fadeThumb   : 500,
        fadeHover   : 250,
        fadeZoom    : 750,
        toggleZoom  : 750
    };
    
    
    var Tittisons = function(el) {
        
        var _zoom, 
            _zoomcnt    = $(el).find('#zoom');
            
        var $page = (jQuery.browser.opera)? $("html") : $("html,body");
        _settings.fadeHover = (jQuery.browser.msie && jQuery.browser.version < 9)? 0 : _settings.fadeHover;
        
        var _fadeInThumbs = function(thumbs) {
            /* fadein thumbs onload */
            thumbs.each(function() {
                var $outer_img = $(this);
                $outer_img
                .bind('error', function() {
                    /** see CSS for style related **/
                    var $inner_img = $(this);
                    $inner_img.closest('li').addClass('error');
                }) 
                .one('load', function() {
                    /** see CSS for style related **/
                    var $inner_img = $(this);
                    $inner_img.closest('li').addClass('loaded');
                    $inner_img.fadeIn(_settings.fadeThumb);
                })
                .attr('src', $outer_img.attr('src')); // needs for Opera 
                if (this.complete) { $outer_img.trigger('load') }
            });
        };
        
        var _hoverItems = function(items) {
            /* hover thumbs */
            var $span = items.find('a > span');
            items.hover(
                /* mouseenter */
                function() {
                    var $i = $(this);
                    if ($i.hasClass('loaded') && !$i.hasClass('current')) {
                        $i.find('a > span').fadeIn(_settings.fadeHover);
                        
                    }
                },
                /* mouseleave */
                function() {
                    var $i = $(this);
                    if ($i.hasClass('loaded') && !$i.hasClass('current')) {
                        $i.find('a > span').fadeOut(_settings.fadeHover);
                    }
                }
            );
        };
        
        var _openZoom   = function(link, id, items) {
            
            var idx, desc, speed, diff, pageScroll, cli, 
                logoPos     = items.index($('#logoreplay'));
                targetPos   = link.offset().top;
                
            /* webkit bug: http://code.google.com/p/chromium/issues/detail?id=2891 */
            pageScroll = (document.body.scrollTop != 0)
                ? document.body.scrollTop : document.documentElement.scrollTop;
                    
            diff = Math.abs(pageScroll - targetPos);
            

            /* then we create and append the empty container */
            cli = link.closest('li');
            idx = items.index(cli);
            idx = (Math.ceil((idx + 1) / 6) * 6) - 1;
            
  
            _zoomcnt = $('<li />').insertAfter(items.eq(idx))
            _zoomcnt.attr('id', 'zoom')
            
            
            /* open container, load the zoom, append and then fadein */
            _zoom = $('<img />').appendTo(_zoomcnt);
            desc = link.closest('li').find('figcaption').html();
            
            $(innerShiv('<figcaption>&nbsp;</figcaption>')).appendTo(_zoomcnt);     
            _zoomcnt.find('figcaption').html(innerShiv(desc));    
            
            
            var appendZoom = function()  {
                
                _zoomcnt.stop().animate({ height: '250px'}, 380);
               // _zoom = _zoomcnt.find('img');
                _zoom.bind('load', function() {
                    var z = $(this);
                    setTimeout(function() {
                        _zoomcnt.stop()
                        .animate({ height: z.height()+50 }, _settings.toggleZoom, 'easeOutQuad', function() {

                            z.fadeIn(_settings.fadeZoom, function() {
                                /* add close button */
                                $('<a href="#" id="closezoom">Close</a>')
                                .appendTo(_zoomcnt)
                                .bind('click', function(evt) {
                                    _closeCurrentZoom();
                                    evt.preventDefault(); 
                                });
                            })
                        })
                    }, 1000);
                })
                .attr('src', link.attr('longDesc'));
                //location.hash = id; 
                $(el).addClass('zoom');
            };
            
            /* check the offsetTop of chosed element */
            if (diff != 0) {
                speed = (diff * 1.5) + 500;
                $page.stop().animate({scrollTop: targetPos}, speed, appendZoom);
            }
            else {
                appendZoom();
            }        
        };
        
        var _closeCurrentZoom = function(callback) {
            $('#closezoom').fadeOut(200);
            //$(el).find('li.current').removeClass('current');
            _zoomcnt
                .stop()
                .animate({ height: 0}, _settings.toggleZoom, 'easeOutQuad', function() {
                    _zoomcnt.remove();    
                    $(el).removeClass('zoom');
                    if (callback) callback();
                }); 
            
        }
        
        var _clickItems = function(link, id, items) {
            
            var cli = link.closest('li');
            
            if (cli.hasClass('error')) return false;
            
            _zoomcnt.stop();            
            $(el).find('ins').remove()
            $('<ins>Current</ins>').appendTo(link);
            
            items.trigger("mouseleave").removeClass('current');
            cli.addClass('current');

            /* if a zoom exists we close it */
            if (_zoomcnt.length > 0) {
                _closeCurrentZoom(function() {
                    _openZoom(link, id, items);
                })
            }
            else {
                _openZoom(link, id, items);
            }
        };
        
        return {
            
            init    : function() {
                
                var thumb = $(el).find('a > img'),
                    links = $(el).find('a[title]'),
                    items = $(el).find('li');
                    
                /* define basic event handlers */
                _fadeInThumbs(thumb);
                _hoverItems(items);
                
                /* the following code turns accessible links into
                * full js-controlled links, like the example below:
                *
                * From : <a href="zoom/1.jpg" title="This is the description">...</a>
                * To   : <a href="#This-is-the-description" id="This-is-the-description"
                *          title="This is the description" longDesc="zoom/1.jpg" >...</a>
                */
                
                links.each(function(i, l) {
                    var $l = $(l),
                        id = $l.attr('title').replace(/\W/g, '-');
                        
                    $l.attr({
                        id          : id,
                        longDesc    : $(l).attr('href'),
                        href        : '#' + id
                    });
                });
                
                
                links.bind('click.tittisons', function(evt) {
                    evt.preventDefault();
                    var id = this.href.replace(/^[^#]+/g, '');
                    if (id.length > 1 && $(id).length) {
                        _clickItems($(id), id, items);
                    }
                });
 
                /* load hash at page load */             
                var hash = location.hash;
                if (hash.length > 1 && $(hash).length) {
                    _clickItems($(hash), hash, items);
                }   
                
                /* load get at page load */ 
                var getEl = location.search.substring(1);
                if (getEl.length > 1 && $('#'+getEl).length) {
                   _clickItems($('#'+getEl), '#'+getEl, items);           
                }                    
                 
            }    
        }
        
    }
    
    
    
    $.fn.replaysons = function(options) {
        if (this.length) {
            _settings = $.extend(_settings, options);    
            return this.each(function() {
                var obj = new Tittisons(this);
                obj.init(this);
                $.data(this, 'Tittisons', obj);
            });
        }
    }
    
}(jQuery));
