var $j = jQuery.noConflict();

 
 /**
 * jQuery-Plugin "preloadCssImages"
 * by Scott Jehl, scott@filamentgroup.com
 * http://www.filamentgroup.com
 * reference article: http://www.filamentgroup.com/lab/update_automatically_preload_images_from_css_with_jquery/
 * demo page: http://www.filamentgroup.com/examples/preloadImages/index_v2.php
 * 
 * Copyright (c) 2008 Filament Group, Inc
 * Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
 *
 * Version: 5.0, 10.31.2008
 * Changelog:
 * 	02.20.2008 initial Version 1.0
 *    06.04.2008 Version 2.0 : removed need for any passed arguments. Images load from any and all directories.
 *    06.21.2008 Version 3.0 : Added options for loading status. Fixed IE abs image path bug (thanks Sam Pohlenz).
 *    07.24.2008 Version 4.0 : Added support for @imported CSS (credit: http://marcarea.com/). Fixed support in Opera as well. 
 *    10.31.2008 Version: 5.0 : Many feature and performance enhancements from trixta
 * --------------------------------------------------------------------
 */

;jQuery.preloadCssImages = function(settings){
	settings = jQuery.extend({
		statusTextEl: null,
		statusBarEl: null,
		errorDelay: 999, // handles 404-Errors in IE
		simultaneousCacheLoading: 2
	}, settings);
	var allImgs = [],
		loaded = 0,
		imgUrls = [],
		thisSheetRules,	
		errorTimer;
	
	function onImgComplete(){
		clearTimeout(errorTimer);
		if (imgUrls && imgUrls.length && imgUrls[loaded]) {
			loaded++;
			if (settings.statusTextEl) {
				var nowloading = (imgUrls[loaded]) ? 
					'Now Loading: <span>' + imgUrls[loaded].split('/')[imgUrls[loaded].split('/').length - 1] : 
					'Loading complete'; // wrong status-text bug fixed
				jQuery(settings.statusTextEl).html('<span class="numLoaded">' + loaded + '</span> of <span class="numTotal">' + imgUrls.length + '</span> loaded (<span class="percentLoaded">' + (loaded / imgUrls.length * 100).toFixed(0) + '%</span>) <span class="currentImg">' + nowloading + '</span></span>');
			}
			if (settings.statusBarEl) {
				var barWidth = jQuery(settings.statusBarEl).width();
				jQuery(settings.statusBarEl).css('background-position', -(barWidth - (barWidth * loaded / imgUrls.length).toFixed(0)) + 'px 50%');
			}
			loadImgs();
		}
	}
	
	function loadImgs(){
		//only load 1 image at the same time / most browsers can only handle 2 http requests, 1 should remain for user-interaction (Ajax, other images, normal page requests...)
		// otherwise set simultaneousCacheLoading to a higher number for simultaneous downloads
		if(imgUrls && imgUrls.length && imgUrls[loaded]){
			var img = new Image(); //new img obj
			img.src = imgUrls[loaded];	//set src either absolute or rel to css dir
			if(!img.complete){
				jQuery(img).bind('error load onreadystatechange', onImgComplete);
			} else {
				onImgComplete();
			}
			errorTimer = setTimeout(onImgComplete, settings.errorDelay); // handles 404-Errors in IE
		}
	}
	
	function parseCSS(sheets, urls) {
		var w3cImport = false,
			imported = [],
			importedSrc = [],
			baseURL;
		var sheetIndex = sheets.length;
		while(sheetIndex--){//loop through each stylesheet
			
			var cssPile = '';//create large string of all css rules in sheet
			
			if(urls && urls[sheetIndex]){
				baseURL = urls[sheetIndex];
			} else {
				var csshref = (sheets[sheetIndex].href) ? sheets[sheetIndex].href : 'window.location.href';
				var baseURLarr = csshref.split('/');//split href at / to make array
				baseURLarr.pop();//remove file path from baseURL array
				baseURL = baseURLarr.join('/');//create base url for the images in this sheet (css file's dir)
				if (baseURL) {
					baseURL += '/'; //tack on a / if needed
				}
			}
			if(sheets[sheetIndex].cssRules || sheets[sheetIndex].rules){
				thisSheetRules = (sheets[sheetIndex].cssRules) ? //->>> http://www.quirksmode.org/dom/w3c_css.html
					sheets[sheetIndex].cssRules : //w3
					sheets[sheetIndex].rules; //ie 
				var ruleIndex = thisSheetRules.length;
				while(ruleIndex--){
					if(thisSheetRules[ruleIndex].style && thisSheetRules[ruleIndex].style.cssText){
						var text = thisSheetRules[ruleIndex].style.cssText;
						if(text.toLowerCase().indexOf('url') != -1){ // only add rules to the string if you can assume, to find an image, speed improvement
							cssPile += text; // thisSheetRules[ruleIndex].style.cssText instead of thisSheetRules[ruleIndex].cssText is a huge speed improvement
						}
					} else if(thisSheetRules[ruleIndex].styleSheet) {
						imported.push(thisSheetRules[ruleIndex].styleSheet);
						w3cImport = true;
					}
					
				}
			}
			//parse cssPile for image urls
			var tmpImage = cssPile.match(/[^\("]+\.(gif|jpg|jpeg|png)/g);//reg ex to get a string of between a "(" and a ".filename" / '"' for opera-bugfix
			if(tmpImage){
				var i = tmpImage.length;
				while(i--){ // handle baseUrl here for multiple stylesheets in different folders bug
					var imgSrc = (tmpImage[i].charAt(0) == '/' || tmpImage[i].match('://')) ? // protocol-bug fixed
						tmpImage[i] : 
						baseURL + tmpImage[i];
					
					if(jQuery.inArray(imgSrc, imgUrls) == -1){
						imgUrls.push(imgSrc);
					}
				}
			}
			
			if(!w3cImport && sheets[sheetIndex].imports && sheets[sheetIndex].imports.length) {
				for(var iImport = 0, importLen = sheets[sheetIndex].imports.length; iImport < importLen; iImport++){
					var iHref = sheets[sheetIndex].imports[iImport].href;
					iHref = iHref.split('/');
					iHref.pop();
					iHref = iHref.join('/');
					if (iHref) {
						iHref += '/'; //tack on a / if needed
					}
					var iSrc = (iHref.charAt(0) == '/' || iHref.match('://')) ? // protocol-bug fixed
						iHref : 
						baseURL + iHref;
					
					importedSrc.push(iSrc);
					imported.push(sheets[sheetIndex].imports[iImport]);
				}
				
				
			}
		}//loop
		if(imported.length){
			parseCSS(imported, importedSrc);
			return false;
		}
		var downloads = settings.simultaneousCacheLoading;
		while( downloads--){
			setTimeout(loadImgs, downloads);
		}
	}
	parseCSS(document.styleSheets);
	return imgUrls;
};

/*
 * 	Easy Slider 1.5 - jQuery plugin
 *	written by Alen Grakalic	
 *	http://cssglobe.com/post/4004/easy-slider-15-the-easiest-jquery-plugin-for-sliding
 *
 *	Copyright (c) 2009 Alen Grakalic (http://cssglobe.com)
 *	Dual licensed under the MIT (MIT-LICENSE.txt)
 *	and GPL (GPL-LICENSE.txt) licenses.
 *
 *	Built for jQuery library
 *	http://jquery.com
 *
 */
(function ($) {
    $.fn.easySlider = function (options) {
        // default configuration properties
        var defaults = {
            prevId: 'prevBtn',
            prevText: 'Previous',
            nextId: 'nextBtn',
            nextText: 'Next',
            controlsShow: false,
            controlsBefore: '',
            controlsAfter: '',
            controlsFade: true,
            firstId: 'firstBtn',
            firstText: 'First',
            firstShow: false,
            lastId: 'lastBtn',
            lastText: 'Last',
            lastShow: false,
            vertical: false,
            speed: 800,
            auto: false,
            pause: 5000,
            continuous: false
        };
        var options = $.extend(defaults, options);
        this.each(function () {
            var obj = $(this);
            var s = $("li", obj).length;
            var w = $("li", obj).width();
            var h = $("li", obj).height();
            obj.width(w);
            obj.height(h);
            obj.css("overflow", "hidden");
            var ts = s - 1;
            var t = 0;
            $("ul", obj).css('width', s * w);
            if (!options.vertical) $("li", obj).css('float', 'left');
            if (options.controlsShow) {
                var html = options.controlsBefore;
                if (options.firstShow) html += '<span id="' + options.firstId + '"><a href=\"javascript:void(0);\">' + options.firstText + '</a></span>';
                html += ' <span id="' + options.prevId + '"><a href=\"javascript:void(0);\">' + options.prevText + '</a></span>';
                html += ' <span id="' + options.nextId + '"><a href=\"javascript:void(0);\">' + options.nextText + '</a></span>';
                if (options.lastShow) html += ' <span id="' + options.lastId + '"><a href=\"javascript:void(0);\">' + options.lastText + '</a></span>';
                html += options.controlsAfter;
                $(obj).after(html);
            };
            $("a", "#" + options.nextId).click(function () {
                animate("next", true);
            });
            
            

            
            
            
            $("a", "#" + options.prevId).click(function () {
                animate("prev", true);
            });
            $("a", "#" + options.firstId).click(function () {
                animate("first", true);
            });
            $("a", "#" + options.lastId).click(function () {
                animate("last", true);
            });
            function animate(dir, clicked) {
                var ot = t;
                switch (dir) {
                case "next":
                    t = (ot >= ts) ? (options.continuous ? 0 : ts) : t + 1;
                    break;
                case "prev":
                    t = (t <= 0) ? (options.continuous ? ts : 0) : t - 1;
                    break;
                case "first":
                    t = 0;
                    break;
                case "last":
                    t = ts;
                    break;
                default:
                    break;
                };
                var diff = Math.abs(ot - t);
                var speed = diff * options.speed;
                if (!options.vertical) {
                    p = (t * w * -1);
                    $("ul", obj).animate({
                        marginLeft: p
                    }, speed);
                } else {
                    p = (t * h * -1);
                    $("ul", obj).animate({
                        marginTop: p
                    }, speed);
                };
                if (!options.continuous && options.controlsFade) {
                    if (t == ts) {
                        $("a", "#" + options.nextId).hide();
                        $("a", "#" + options.lastId).hide();
                    } else {
                        $("a", "#" + options.nextId).show();
                        $("a", "#" + options.lastId).show();
                    };
                    if (t == 0) {
                        $("a", "#" + options.prevId).hide();
                        $("a", "#" + options.firstId).hide();
                    } else {
                        $("a", "#" + options.prevId).show();
                        $("a", "#" + options.firstId).show();
                    };
                };
                if (clicked) clearTimeout(timeout);
                if (options.auto && dir == "next" && !clicked) {;
                    timeout = setTimeout(function () {
                        animate("next", false);
                    }, diff * options.speed + options.pause);
                };
            };
            // init
            var timeout;
            if (options.auto) {;
                timeout = setTimeout(function () {
                    animate("next", false);
                }, options.pause);
            };
            if (!options.continuous && options.controlsFade) {
                $("a", "#" + options.prevId).hide();
                $("a", "#" + options.firstId).hide();
            };
        });
    };
})(jQuery);
/*!
 * jQuery Cycle Plugin (with Transition Definitions)
 * Examples and documentation at: http://jquery.malsup.com/cycle/
 * Copyright (c) 2007-2009 M. Alsup
 * Version: 2.72 (09-SEP-2009)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 * Requires: jQuery v1.2.6 or later
 *
 * Originally based on the work of:
 *	1) Matt Oakes
 *	2) Torsten Baldes (http://medienfreunde.com/lab/innerfade/)
 *	3) Benjamin Sterling (http://www.benjaminsterling.com/experiments/jqShuffle/)
 */
;
(function ($) {
    var ver = '2.72';
    // if $.support is not defined (pre jQuery 1.3) add what I need
    if ($.support == undefined) {
        $.support = {
            opacity: !($.browser.msie)
        };
    }
    function debug(s) {
        if ($.fn.cycle.debug) log(s);
    }
    function log() {
        if (window.console && window.console.log) window.console.log('[cycle] ' + Array.prototype.join.call(arguments, ' '));
        //$('body').append('<div>'+Array.prototype.join.call(arguments,' ')+'</div>');
    };
    // the options arg can be...
    //   a number  - indicates an immediate transition should occur to the given slide index
    //   a string  - 'stop', 'pause', 'resume', or the name of a transition effect (ie, 'fade', 'zoom', etc)
    //   an object - properties to control the slideshow
    //
    // the arg2 arg can be...
    //   the name of an fx (only used in conjunction with a numeric value for 'options')
    //   the value true (only used in conjunction with a options == 'resume') and indicates
    //	 that the resume should occur immediately (not wait for next timeout)
    $.fn.cycle = function (options, arg2) {
        var o = {
            s: this.selector,
            c: this.context
        };
        // in 1.3+ we can fix mistakes with the ready state
        if (this.length === 0 && options != 'stop') {
            if (!$.isReady && o.s) {
                log('DOM not ready, queuing slideshow');
                $(function () {
                    $(o.s, o.c).cycle(options, arg2);
                });
                return this;
            }
            // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
            log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
            return this;
        }
        // iterate the matched nodeset
        return this.each(function () {
            var opts = handleArguments(this, options, arg2);
            if (opts === false) return;
            // stop existing slideshow for this container (if there is one)
            if (this.cycleTimeout) clearTimeout(this.cycleTimeout);
            this.cycleTimeout = this.cyclePause = 0;
            var $cont = $(this);
            var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children();
            var els = $slides.get();
            if (els.length < 2) {
                log('terminating; too few slides: ' + els.length);
                return;
            }
            var opts2 = buildOptions($cont, $slides, els, opts, o);
            if (opts2 === false) return;
            var startTime = opts2.continuous ? 10 : getTimeout(opts2.currSlide, opts2.nextSlide, opts2, !opts2.rev);
            // if it's an auto slideshow, kick it off
            if (startTime) {
                startTime += (opts2.delay || 0);
                if (startTime < 10) startTime = 10;
                debug('first timeout: ' + startTime);
                this.cycleTimeout = setTimeout(function () {
                    go(els, opts2, 0, !opts2.rev)
                }, startTime);
            }
        });
    };
    // process the args that were passed to the plugin fn
    function handleArguments(cont, options, arg2) {
        if (cont.cycleStop == undefined) cont.cycleStop = 0;
        if (options === undefined || options === null) options = {};
        if (options.constructor == String) {
            switch (options) {
            case 'stop':
                cont.cycleStop++; // callbacks look for change
                if (cont.cycleTimeout) clearTimeout(cont.cycleTimeout);
                cont.cycleTimeout = 0;
                $(cont).removeData('cycle.opts');
                return false;
            case 'pause':
                cont.cyclePause = 1;
                return false;
            case 'resume':
                cont.cyclePause = 0;
                if (arg2 === true) { // resume now!
                    options = $(cont).data('cycle.opts');
                    if (!options) {
                        log('options not found, can not resume');
                        return false;
                    }
                    if (cont.cycleTimeout) {
                        clearTimeout(cont.cycleTimeout);
                        cont.cycleTimeout = 0;
                    }
                    go(options.elements, options, 1, 1);
                }
                return false;
            case 'prev':
            case 'next':
                var opts = $(cont).data('cycle.opts');
                if (!opts) {
                    log('options not found, "prev/next" ignored');
                    return false;
                }
                $.fn.cycle[options](opts);
                return false;
            default:
                options = {
                    fx: options
                };
            };
            return options;
        } else if (options.constructor == Number) {
            // go to the requested slide
            var num = options;
            options = $(cont).data('cycle.opts');
            if (!options) {
                log('options not found, can not advance slide');
                return false;
            }
            if (num < 0 || num >= options.elements.length) {
                log('invalid slide index: ' + num);
                return false;
            }
            options.nextSlide = num;
            if (cont.cycleTimeout) {
                clearTimeout(cont.cycleTimeout);
                cont.cycleTimeout = 0;
            }
            if (typeof arg2 == 'string') options.oneTimeFx = arg2;
            go(options.elements, options, 1, num >= options.currSlide);
            return false;
        }
        return options;
    };
    function removeFilter(el, opts) {
        if (!$.support.opacity && opts.cleartype && el.style.filter) {
            try {
                el.style.removeAttribute('filter');
            }
            catch(smother) {} // handle old opera versions
        }
    };
    // one-time initialization
    function buildOptions($cont, $slides, els, options, o) {
        // support metadata plugin (v1.0 and v2.0)
        var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
        if (opts.autostop) opts.countdown = opts.autostopCount || els.length;
        var cont = $cont[0];
        $cont.data('cycle.opts', opts);
        opts.$cont = $cont;
        opts.stopCount = cont.cycleStop;
        opts.elements = els;
        opts.before = opts.before ? [opts.before] : [];
        opts.after = opts.after ? [opts.after] : [];
        opts.after.unshift(function () {
            opts.busy = 0;
        });
        // push some after callbacks
        if (!$.support.opacity && opts.cleartype) opts.after.push(function () {
            removeFilter(this, opts);
        });
        if (opts.continuous) opts.after.push(function () {
            go(els, opts, 0, !opts.rev);
        });
        saveOriginalOpts(opts);
        // clearType corrections
        if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) clearTypeFix($slides);
        // container requires non-static position so that slides can be position within
        if ($cont.css('position') == 'static') $cont.css('position', 'relative');
        if (opts.width) $cont.width(opts.width);
        if (opts.height && opts.height != 'auto') $cont.height(opts.height);
        if (opts.startingSlide) opts.startingSlide = parseInt(opts.startingSlide);
        // if random, mix up the slide array
        if (opts.random) {
            opts.randomMap = [];
            for (var i = 0; i < els.length; i++)
            opts.randomMap.push(i);
            opts.randomMap.sort(function (a, b) {
                return Math.random() - 0.5;
            });
            opts.randomIndex = 0;
            opts.startingSlide = opts.randomMap[0];
        } else if (opts.startingSlide >= els.length) opts.startingSlide = 0; // catch bogus input
        opts.currSlide = opts.startingSlide = opts.startingSlide || 0;
        var first = opts.startingSlide;
        // set position and zIndex on all the slides
        $slides.css({
            position: 'absolute',
            top: 0,
            left: 0
        }).hide().each(function (i) {
            var z = first ? i >= first ? els.length - (i - first) : first - i : els.length - i;
            $(this).css('z-index', z)
        });
        // make sure first slide is visible
        $(els[first]).css('opacity', 1).show(); // opacity bit needed to handle restart use case
        removeFilter(els[first], opts);
        // stretch slides
        if (opts.fit && opts.width) $slides.width(opts.width);
        if (opts.fit && opts.height && opts.height != 'auto') $slides.height(opts.height);
        // stretch container
        var reshape = opts.containerResize && !$cont.innerHeight();
        if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
            var maxw = 0,
                maxh = 0;
            for (var j = 0; j < els.length; j++) {
                var $e = $(els[j]),
                    e = $e[0],
                    w = $e.outerWidth(),
                    h = $e.outerHeight();
                if (!w) w = e.offsetWidth;
                if (!h) h = e.offsetHeight;
                maxw = w > maxw ? w : maxw;
                maxh = h > maxh ? h : maxh;
            }
            if (maxw > 0 && maxh > 0) $cont.css({
                width: maxw + 'px',
                height: maxh + 'px'
            });
        }
        if (opts.pause) $cont.hover(function () {
            this.cyclePause++;
        }, function () {
            this.cyclePause--;
        });
        if (supportMultiTransitions(opts) === false) return false;
        // apparently a lot of people use image slideshows without height/width attributes on the images.
        // Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
        var requeue = false;
        options.requeueAttempts = options.requeueAttempts || 0;
        $slides.each(function () {
            // try to get height/width of each slide
            var $el = $(this);
            this.cycleH = (opts.fit && opts.height) ? opts.height : $el.height();
            this.cycleW = (opts.fit && opts.width) ? opts.width : $el.width();
            if ($el.is('img')) {
                // sigh..  sniffing, hacking, shrugging...  this crappy hack tries to account for what browsers do when
                // an image is being downloaded and the markup did not include sizing info (height/width attributes);
                // there seems to be some "default" sizes used in this situation
                var loadingIE = ($.browser.msie && this.cycleW == 28 && this.cycleH == 30 && !this.complete);
                var loadingFF = ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete);
                var loadingOp = ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete);
                var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete);
                // don't requeue for images that are still loading but have a valid size
                if (loadingIE || loadingFF || loadingOp || loadingOther) {
                    if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
                        log(options.requeueAttempts, ' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
                        setTimeout(function () {
                            $(o.s, o.c).cycle(options)
                        }, opts.requeueTimeout);
                        requeue = true;
                        return false; // break each loop
                    } else {
                        log('could not determine size of image: ' + this.src, this.cycleW, this.cycleH);
                    }
                }
            }
            return true;
        });
        if (requeue) return false;
        opts.cssBefore = opts.cssBefore || {};
        opts.animIn = opts.animIn || {};
        opts.animOut = opts.animOut || {};
        $slides.not(':eq(' + first + ')').css(opts.cssBefore);
        if (opts.cssFirst) $($slides[first]).css(opts.cssFirst);
        if (opts.timeout) {
            opts.timeout = parseInt(opts.timeout);
            // ensure that timeout and speed settings are sane
            if (opts.speed.constructor == String) opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed);
            if (!opts.sync) opts.speed = opts.speed / 2;
            while ((opts.timeout - opts.speed) < 250) // sanitize timeout
            opts.timeout += opts.speed;
        }
        if (opts.easing) opts.easeIn = opts.easeOut = opts.easing;
        if (!opts.speedIn) opts.speedIn = opts.speed;
        if (!opts.speedOut) opts.speedOut = opts.speed;
        opts.slideCount = els.length;
        opts.currSlide = opts.lastSlide = first;
        if (opts.random) {
            opts.nextSlide = opts.currSlide;
            if (++opts.randomIndex == els.length) opts.randomIndex = 0;
            opts.nextSlide = opts.randomMap[opts.randomIndex];
        } else opts.nextSlide = opts.startingSlide >= (els.length - 1) ? 0 : opts.startingSlide + 1;
        // run transition init fn
        if (!opts.multiFx) {
            var init = $.fn.cycle.transitions[opts.fx];
            if ($.isFunction(init)) init($cont, $slides, opts);
            else if (opts.fx != 'custom' && !opts.multiFx) {
                log('unknown transition: ' + opts.fx, '; slideshow terminating');
                return false;
            }
        }
        // fire artificial events
        var e0 = $slides[first];
        if (opts.before.length) opts.before[0].apply(e0, [e0, e0, opts, true]);
        if (opts.after.length > 1) opts.after[1].apply(e0, [e0, e0, opts, true]);
        if (opts.next) $(opts.next).bind(opts.prevNextEvent, function () {
            return advance(opts, opts.rev ? -1 : 1)
        });
        if (opts.prev) $(opts.prev).bind(opts.prevNextEvent, function () {
            return advance(opts, opts.rev ? 1 : -1)
        });
        if (opts.pager) buildPager(els, opts);
        exposeAddSlide(opts, els);
        return opts;
    };
    // save off original opts so we can restore after clearing state
    function saveOriginalOpts(opts) {
        opts.original = {
            before: [],
            after: []
        };
        opts.original.cssBefore = $.extend({}, opts.cssBefore);
        opts.original.cssAfter = $.extend({}, opts.cssAfter);
        opts.original.animIn = $.extend({}, opts.animIn);
        opts.original.animOut = $.extend({}, opts.animOut);
        $.each(opts.before, function () {
            opts.original.before.push(this);
        });
        $.each(opts.after, function () {
            opts.original.after.push(this);
        });
    };
    function supportMultiTransitions(opts) {
        var i, tx, txs = $.fn.cycle.transitions;
        // look for multiple effects
        if (opts.fx.indexOf(',') > 0) {
            opts.multiFx = true;
            opts.fxs = opts.fx.replace(/\s*/g, '').split(',');
            // discard any bogus effect names
            for (i = 0; i < opts.fxs.length; i++) {
                var fx = opts.fxs[i];
                tx = txs[fx];
                if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
                    log('discarding unknown transition: ', fx);
                    opts.fxs.splice(i, 1);
                    i--;
                }
            }
            // if we have an empty list then we threw everything away!
            if (!opts.fxs.length) {
                log('No valid transitions named; slideshow terminating.');
                return false;
            }
        } else if (opts.fx == 'all') { // auto-gen the list of transitions
            opts.multiFx = true;
            opts.fxs = [];
            for (p in txs) {
                tx = txs[p];
                if (txs.hasOwnProperty(p) && $.isFunction(tx)) opts.fxs.push(p);
            }
        }
        if (opts.multiFx && opts.randomizeEffects) {
            // munge the fxs array to make effect selection random
            var r1 = Math.floor(Math.random() * 20) + 30;
            for (i = 0; i < r1; i++) {
                var r2 = Math.floor(Math.random() * opts.fxs.length);
                opts.fxs.push(opts.fxs.splice(r2, 1)[0]);
            }
            debug('randomized fx sequence: ', opts.fxs);
        }
        return true;
    };
    // provide a mechanism for adding slides after the slideshow has started
    function exposeAddSlide(opts, els) {
        opts.addSlide = function (newSlide, prepend) {
            var $s = $(newSlide),
                s = $s[0];
            if (!opts.autostopCount) opts.countdown++;
            els[prepend ? 'unshift' : 'push'](s);
            if (opts.els) opts.els[prepend ? 'unshift' : 'push'](s); // shuffle needs this
            opts.slideCount = els.length;
            $s.css('position', 'absolute');
            $s[prepend ? 'prependTo' : 'appendTo'](opts.$cont);
            if (prepend) {
                opts.currSlide++;
                opts.nextSlide++;
            }
            if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) clearTypeFix($s);
            if (opts.fit && opts.width) $s.width(opts.width);
            if (opts.fit && opts.height && opts.height != 'auto') $slides.height(opts.height);
            s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
            s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();
            $s.css(opts.cssBefore);
            if (opts.pager) $.fn.cycle.createPagerAnchor(els.length - 1, s, $(opts.pager), els, opts);
            if ($.isFunction(opts.onAddSlide)) opts.onAddSlide($s);
            else $s.hide(); // default behavior
        };
    }
    // reset internal state; we do this on every pass in order to support multiple effects
    $.fn.cycle.resetState = function (opts, fx) {
        fx = fx || opts.fx;
        opts.before = [];
        opts.after = [];
        opts.cssBefore = $.extend({}, opts.original.cssBefore);
        opts.cssAfter = $.extend({}, opts.original.cssAfter);
        opts.animIn = $.extend({}, opts.original.animIn);
        opts.animOut = $.extend({}, opts.original.animOut);
        opts.fxFn = null;
        $.each(opts.original.before, function () {
            opts.before.push(this);
        });
        $.each(opts.original.after, function () {
            opts.after.push(this);
        });
        // re-init
        var init = $.fn.cycle.transitions[fx];
        if ($.isFunction(init)) init(opts.$cont, $(opts.elements), opts);
    };
    // this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
    function go(els, opts, manual, fwd) {
        // opts.busy is true if we're in the middle of an animation
        if (manual && opts.busy && opts.manualTrump) {
            // let manual transitions requests trump active ones
            $(els).stop(true, true);
            opts.busy = false;
        }
        // don't begin another timeout-based transition if there is one active
        if (opts.busy) return;
        var p = opts.$cont[0],
            curr = els[opts.currSlide],
            next = els[opts.nextSlide];
        // stop cycling if we have an outstanding stop request
        if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual) return;
        // check to see if we should stop cycling based on autostop options
        if (!manual && !p.cyclePause && ((opts.autostop && (--opts.countdown <= 0)) || (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
            if (opts.end) opts.end(opts);
            return;
        }
        // if slideshow is paused, only transition on a manual trigger
        if (manual || !p.cyclePause) {
            var fx = opts.fx;
            // keep trying to get the slide size if we don't have it yet
            curr.cycleH = curr.cycleH || $(curr).height();
            curr.cycleW = curr.cycleW || $(curr).width();
            next.cycleH = next.cycleH || $(next).height();
            next.cycleW = next.cycleW || $(next).width();
            // support multiple transition types
            if (opts.multiFx) {
                if (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length) opts.lastFx = 0;
                fx = opts.fxs[opts.lastFx];
                opts.currFx = fx;
            }
            // one-time fx overrides apply to:  $('div').cycle(3,'zoom');
            if (opts.oneTimeFx) {
                fx = opts.oneTimeFx;
                opts.oneTimeFx = null;
            }
            $.fn.cycle.resetState(opts, fx);
            // run the before callbacks
            if (opts.before.length) $.each(opts.before, function (i, o) {
                if (p.cycleStop != opts.stopCount) return;
                o.apply(next, [curr, next, opts, fwd]);
            });
            // stage the after callacks
            var after = function () {
                $.each(opts.after, function (i, o) {
                    if (p.cycleStop != opts.stopCount) return;
                    o.apply(next, [curr, next, opts, fwd]);
                });
            };
            if (opts.nextSlide != opts.currSlide) {
                // get ready to perform the transition
                opts.busy = 1;
                if (opts.fxFn) // fx function provided?
                opts.fxFn(curr, next, opts, after, fwd);
                else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
                $.fn.cycle[opts.fx](curr, next, opts, after);
                else $.fn.cycle.custom(curr, next, opts, after, manual && opts.fastOnEvent);
            }
            // calculate the next slide
            opts.lastSlide = opts.currSlide;
            if (opts.random) {
                opts.currSlide = opts.nextSlide;
                if (++opts.randomIndex == els.length) opts.randomIndex = 0;
                opts.nextSlide = opts.randomMap[opts.randomIndex];
            } else { // sequence
                var roll = (opts.nextSlide + 1) == els.length;
                opts.nextSlide = roll ? 0 : opts.nextSlide + 1;
                opts.currSlide = roll ? els.length - 1 : opts.nextSlide - 1;
            }
            if (opts.pager) $.fn.cycle.updateActivePagerLink(opts.pager, opts.currSlide);
        }
        // stage the next transtion
        var ms = 0;
        if (opts.timeout && !opts.continuous) ms = getTimeout(curr, next, opts, fwd);
        else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
        ms = 10;
        if (ms > 0) p.cycleTimeout = setTimeout(function () {
            go(els, opts, 0, !opts.rev)
        }, ms);
    };
    // invoked after transition
    $.fn.cycle.updateActivePagerLink = function (pager, currSlide) {
        $(pager).find('a').removeClass('activeSlide').filter('a:eq(' + currSlide + ')').addClass('activeSlide');
    };
    // calculate timeout value for current transition
    function getTimeout(curr, next, opts, fwd) {
        if (opts.timeoutFn) {
            // call user provided calc fn
            var t = opts.timeoutFn(curr, next, opts, fwd);
            while ((t - opts.speed) < 250) // sanitize timeout
            t += opts.speed;
            debug('calculated timeout: ' + t + '; speed: ' + opts.speed);
            if (t !== false) return t;
        }
        return opts.timeout;
    };
    // expose next/prev function, caller must pass in state
    $.fn.cycle.next = function (opts) {
        advance(opts, opts.rev ? -1 : 1);
    };
    $.fn.cycle.prev = function (opts) {
        advance(opts, opts.rev ? 1 : -1);
    };
    // advance slide forward or back
    function advance(opts, val) {
        var els = opts.elements;
        var p = opts.$cont[0],
            timeout = p.cycleTimeout;
        if (timeout) {
            clearTimeout(timeout);
            p.cycleTimeout = 0;
        }
        if (opts.random && val < 0) {
            // move back to the previously display slide
            opts.randomIndex--;
            if (--opts.randomIndex == -2) opts.randomIndex = els.length - 2;
            else if (opts.randomIndex == -1) opts.randomIndex = els.length - 1;
            opts.nextSlide = opts.randomMap[opts.randomIndex];
        } else if (opts.random) {
            if (++opts.randomIndex == els.length) opts.randomIndex = 0;
            opts.nextSlide = opts.randomMap[opts.randomIndex];
        } else {
            opts.nextSlide = opts.currSlide + val;
            if (opts.nextSlide < 0) {
                if (opts.nowrap) return false;
                opts.nextSlide = els.length - 1;
            } else if (opts.nextSlide >= els.length) {
                if (opts.nowrap) return false;
                opts.nextSlide = 0;
            }
        }
        if ($.isFunction(opts.prevNextClick)) opts.prevNextClick(val > 0, opts.nextSlide, els[opts.nextSlide]);
        go(els, opts, 1, val >= 0);
        return false;
    };
    function buildPager(els, opts) {
        var $p = $(opts.pager);
        $.each(els, function (i, o) {
            $.fn.cycle.createPagerAnchor(i, o, $p, els, opts);
        });
        $.fn.cycle.updateActivePagerLink(opts.pager, opts.startingSlide);
    };
    $.fn.cycle.createPagerAnchor = function (i, el, $p, els, opts) {
        var a;
        if ($.isFunction(opts.pagerAnchorBuilder)) a = opts.pagerAnchorBuilder(i, el);
        else a = '<a href="#">' + (i + 1) + '</a>';
        if (!a) return;
        var $a = $(a);
        // don't reparent if anchor is in the dom
        if ($a.parents('body').length === 0) {
            var arr = [];
            if ($p.length > 1) {
                $p.each(function () {
                    var $clone = $a.clone(true);
                    $(this).append($clone);
                    arr.push($clone);
                });
                $a = $(arr);
            } else {
                $a.appendTo($p);
            }
        }
        $a.bind(opts.pagerEvent, function (e) {
            e.preventDefault();
            opts.nextSlide = i;
            var p = opts.$cont[0],
                timeout = p.cycleTimeout;
            if (timeout) {
                clearTimeout(timeout);
                p.cycleTimeout = 0;
            }
            if ($.isFunction(opts.pagerClick)) opts.pagerClick(opts.nextSlide, els[opts.nextSlide]);
            go(els, opts, 1, opts.currSlide < i); // trigger the trans
            return false;
        });
        if (opts.pagerEvent != 'click') $a.click(function () {
            return false;
        }); // supress click
        if (opts.pauseOnPagerHover) $a.hover(function () {
            opts.$cont[0].cyclePause++;
        }, function () {
            opts.$cont[0].cyclePause--;
        });
    };
    // helper fn to calculate the number of slides between the current and the next
    $.fn.cycle.hopsFromLast = function (opts, fwd) {
        var hops, l = opts.lastSlide,
            c = opts.currSlide;
        if (fwd) hops = c > l ? c - l : opts.slideCount - l;
        else hops = c < l ? l - c : l + opts.slideCount - c;
        return hops;
    };
    // fix clearType problems in ie6 by setting an explicit bg color
    // (otherwise text slides look horrible during a fade transition)
    function clearTypeFix($slides) {
        function hex(s) {
            s = parseInt(s).toString(16);
            return s.length < 2 ? '0' + s : s;
        };
        function getBg(e) {
            for (; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
                var v = $.css(e, 'background-color');
                if (v.indexOf('rgb') >= 0) {
                    var rgb = v.match(/\d+/g);
                    return '#' + hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
                }
                if (v && v != 'transparent') return v;
            }
            return '#ffffff';
        };
        $slides.each(function () {
            $(this).css('background-color', getBg(this));
        });
    };
    // reset common props before the next transition
    $.fn.cycle.commonReset = function (curr, next, opts, w, h, rev) {
        $(opts.elements).not(curr).hide();
        opts.cssBefore.opacity = 1;
        opts.cssBefore.display = 'block';
        if (w !== false && next.cycleW > 0) opts.cssBefore.width = next.cycleW;
        if (h !== false && next.cycleH > 0) opts.cssBefore.height = next.cycleH;
        opts.cssAfter = opts.cssAfter || {};
        opts.cssAfter.display = 'none';
        $(curr).css('zIndex', opts.slideCount + (rev === true ? 1 : 0));
        $(next).css('zIndex', opts.slideCount + (rev === true ? 0 : 1));
    };
    // the actual fn for effecting a transition
    $.fn.cycle.custom = function (curr, next, opts, cb, speedOverride) {
        var $l = $(curr),
            $n = $(next);
        var speedIn = opts.speedIn,
            speedOut = opts.speedOut,
            easeIn = opts.easeIn,
            easeOut = opts.easeOut;
        $n.css(opts.cssBefore);
        if (speedOverride) {
            if (typeof speedOverride == 'number') speedIn = speedOut = speedOverride;
            else speedIn = speedOut = 1;
            easeIn = easeOut = null;
        }
        var fn = function () {
            $n.animate(opts.animIn, speedIn, easeIn, cb)
        };
        $l.animate(opts.animOut, speedOut, easeOut, function () {
            if (opts.cssAfter) $l.css(opts.cssAfter);
            if (!opts.sync) fn();
        });
        if (opts.sync) fn();
    };
    // transition definitions - only fade is defined here, transition pack defines the rest
    $.fn.cycle.transitions = {
        fade: function ($cont, $slides, opts) {
            $slides.not(':eq(' + opts.currSlide + ')').css('opacity', 0);
            opts.before.push(function (curr, next, opts) {
                $.fn.cycle.commonReset(curr, next, opts);
                opts.cssBefore.opacity = 0;
            });
            opts.animIn = {
                opacity: 1
            };
            opts.animOut = {
                opacity: 0
            };
            opts.cssBefore = {
                top: 0,
                left: 0
            };
        }
    };
    $.fn.cycle.ver = function () {
        return ver;
    };
    // override these globally if you like (they are all optional)
    $.fn.cycle.defaults = {
        fx: 'fade',
        // name of transition effect (or comma separated names, ex: fade,scrollUp,shuffle)
        timeout: 4000,
        // milliseconds between slide transitions (0 to disable auto advance)
        timeoutFn: null,
        // callback for determining per-slide timeout value:  function(currSlideElement, nextSlideElement, options, forwardFlag)
        continuous: 0,
        // true to start next transition immediately after current one completes
        speed: 1000,
        // speed of the transition (any valid fx speed value)
        speedIn: null,
        // speed of the 'in' transition
        speedOut: null,
        // speed of the 'out' transition
        next: null,
        // selector for element to use as click trigger for next slide
        prev: null,
        // selector for element to use as click trigger for previous slide
        prevNextClick: null,
        // callback fn for prev/next clicks:	function(isNext, zeroBasedSlideIndex, slideElement)
        prevNextEvent: 'click',
        // event which drives the manual transition to the previous or next slide
        pager: null,
        // selector for element to use as pager container
        pagerClick: null,
        // callback fn for pager clicks:	function(zeroBasedSlideIndex, slideElement)
        pagerEvent: 'click',
        // name of event which drives the pager navigation
        pagerAnchorBuilder: null,
        // callback fn for building anchor links:  function(index, DOMelement)
        before: null,
        // transition callback (scope set to element to be shown):	 function(currSlideElement, nextSlideElement, options, forwardFlag)
        after: null,
        // transition callback (scope set to element that was shown):  function(currSlideElement, nextSlideElement, options, forwardFlag)
        end: null,
        // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
        easing: null,
        // easing method for both in and out transitions
        easeIn: null,
        // easing for "in" transition
        easeOut: null,
        // easing for "out" transition
        shuffle: null,
        // coords for shuffle animation, ex: { top:15, left: 200 }
        animIn: null,
        // properties that define how the slide animates in
        animOut: null,
        // properties that define how the slide animates out
        cssBefore: null,
        // properties that define the initial state of the slide before transitioning in
        cssAfter: null,
        // properties that defined the state of the slide after transitioning out
        fxFn: null,
        // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
        height: 'auto',
        // container height
        startingSlide: 0,
        // zero-based index of the first slide to be displayed
        sync: 1,
        // true if in/out transitions should occur simultaneously
        random: 0,
        // true for random, false for sequence (not applicable to shuffle fx)
        fit: 0,
        // force slides to fit container
        containerResize: 1,
        // resize container to fit largest slide
        pause: 0,
        // true to enable "pause on hover"
        pauseOnPagerHover: 0,
        // true to pause when hovering over pager link
        autostop: 0,
        // true to end slideshow after X transitions (where X == slide count)
        autostopCount: 0,
        // number of transitions (optionally used with autostop to define X)
        delay: 0,
        // additional delay (in ms) for first transition (hint: can be negative)
        slideExpr: null,
        // expression for selecting slides (if something other than all children is required)
        cleartype: !$.support.opacity,
        // true if clearType corrections should be applied (for IE)
        cleartypeNoBg: false,
        // set to true to disable extra cleartype fixing (leave false to force background color setting on slides)
        nowrap: 0,
        // true to prevent slideshow from wrapping
        fastOnEvent: 0,
        // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
        randomizeEffects: 1,
        // valid when multiple effects are used; true to make the effect sequence random
        rev: 0,
        // causes animations to transition in reverse
        manualTrump: true,
        // causes manual transition to stop an active transition instead of being ignored
        requeueOnImageNotLoaded: true,
        // requeue the slideshow if any image slides are not yet loaded
        requeueTimeout: 250 // ms delay for requeue
    };
})(jQuery);
/**
 * jQuery Galleriffic plugin
 *
 * Copyright (c) 2008 Trent Foley (http://trentacular.com)
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 *
 * Much thanks to primary contributer Ponticlaro (http://www.ponticlaro.com)
 */
;
(function ($) {
    // Globally keep track of all images by their unique hash.  Each item is an image data object.
    var allImages = {};
    var imageCounter = 0;
    // Galleriffic static class
    $.galleriffic = {
        version: '2.0.1',
        // Strips invalid characters and any leading # characters
        normalizeHash: function (hash) {
            return hash.replace(/^.*#/, '').replace(/\?.*$/, '');
        },
        getImage: function (hash) {
            if (!hash) return undefined;
            hash = $.galleriffic.normalizeHash(hash);
            return allImages[hash];
        },
        // Global function that looks up an image by its hash and displays the image.
        // Returns false when an image is not found for the specified hash.
        // @param {String} hash This is the unique hash value assigned to an image.
        gotoImage: function (hash) {
            var imageData = $.galleriffic.getImage(hash);
            if (!imageData) return false;
            var gallery = imageData.gallery;
            gallery.gotoImage(imageData);
            return true;
        },
        // Removes an image from its respective gallery by its hash.
        // Returns false when an image is not found for the specified hash or the
        // specified owner gallery does match the located images gallery.
        // @param {String} hash This is the unique hash value assigned to an image.
        // @param {Object} ownerGallery (Optional) When supplied, the located images
        // gallery is verified to be the same as the specified owning gallery before
        // performing the remove operation.
        removeImageByHash: function (hash, ownerGallery) {
            var imageData = $.galleriffic.getImage(hash);
            if (!imageData) return false;
            var gallery = imageData.gallery;
            if (ownerGallery && ownerGallery != gallery) return false;
            return gallery.removeImageByIndex(imageData.index);
        }
    };
    var defaults = {
        delay: 3000,
        numThumbs: 20,
        preloadAhead: 40,
        // Set to -1 to preload all images
        enableTopPager: false,
        enableBottomPager: true,
        maxPagesToShow: 7,
        imageContainerSel: '',
        captionContainerSel: '',
        controlsContainerSel: '',
        loadingContainerSel: '',
        renderSSControls: true,
        renderNavControls: true,
        playLinkText: 'Play',
        pauseLinkText: 'Pause',
        prevLinkText: 'Previous',
        nextLinkText: 'Next',
        nextPageLinkText: 'Next &rsaquo;',
        prevPageLinkText: '&lsaquo; Prev',
        enableHistory: false,
        enableKeyboardNavigation: true,
        autoStart: false,
        syncTransitions: false,
        defaultTransitionDuration: 1000,
        onSlideChange: undefined,
        // accepts a delegate like such: function(prevIndex, nextIndex) { ... }
        onTransitionOut: undefined,
        // accepts a delegate like such: function(slide, caption, isSync, callback) { ... }
        onTransitionIn: undefined,
        // accepts a delegate like such: function(slide, caption, isSync) { ... }
        onPageTransitionOut: undefined,
        // accepts a delegate like such: function(callback) { ... }
        onPageTransitionIn: undefined,
        // accepts a delegate like such: function() { ... }
        onImageAdded: undefined,
        // accepts a delegate like such: function(imageData, $li) { ... }
        onImageRemoved: undefined // accepts a delegate like such: function(imageData, $li) { ... }
    };
    // Primary Galleriffic initialization function that should be called on the thumbnail container.
    $.fn.galleriffic = function (settings) {
        //  Extend Gallery Object
        $.extend(this, {
            // Returns the version of the script
            version: $.galleriffic.version,
            // Current state of the slideshow
            isSlideshowRunning: false,
            slideshowTimeout: undefined,
            // This function is attached to the click event of generated hyperlinks within the gallery
            clickHandler: function (e, link) {
                this.pause();
                if (!this.enableHistory) {
                    // The href attribute holds the unique hash for an image
                    var hash = $.galleriffic.normalizeHash($(link).attr('href'));
                    $.galleriffic.gotoImage(hash);
                    e.preventDefault();
                }
            },
            // Appends an image to the end of the set of images.  Argument listItem can be either a jQuery DOM element or arbitrary html.
            // @param listItem Either a jQuery object or a string of html of the list item that is to be added to the gallery.
            appendImage: function (listItem) {
                this.addImage(listItem, false, false);
                return this;
            },
            // Inserts an image into the set of images.  Argument listItem can be either a jQuery DOM element or arbitrary html.
            // @param listItem Either a jQuery object or a string of html of the list item that is to be added to the gallery.
            // @param {Integer} position The index within the gallery where the item shouold be added.
            insertImage: function (listItem, position) {
                this.addImage(listItem, false, true, position);
                return this;
            },
            // Adds an image to the gallery and optionally inserts/appends it to the DOM (thumbExists)
            // @param listItem Either a jQuery object or a string of html of the list item that is to be added to the gallery.
            // @param {Boolean} thumbExists Specifies whether the thumbnail already exists in the DOM or if it needs to be added.
            // @param {Boolean} insert Specifies whether the the image is appended to the end or inserted into the gallery.
            // @param {Integer} position The index within the gallery where the item shouold be added.
            addImage: function (listItem, thumbExists, insert, position) {
                var $li = (typeof listItem === "string") ? $(listItem) : listItem;
                var $aThumb = $li.find('a.thumb');
                var slideUrl = $aThumb.attr('href');
                var title = $aThumb.attr('title');
                var $caption = $li.find('.caption').remove();
                var hash = $aThumb.attr('name');
                // Increment the image counter
                imageCounter++;
                // Autogenerate a hash value if none is present or if it is a duplicate
                if (!hash || allImages['' + hash]) {
                    hash = imageCounter;
                }
                // Set position to end when not specified
                if (!insert) position = this.data.length;
                var imageData = {
                    title: title,
                    slideUrl: slideUrl,
                    caption: $caption,
                    hash: hash,
                    gallery: this,
                    index: position
                };
                // Add the imageData to this gallery's array of images
                if (insert) {
                    this.data.splice(position, 0, imageData);
                    // Reset index value on all imageData objects
                    this.updateIndices(position);
                } else {
                    this.data.push(imageData);
                }
                var gallery = this;
                // Add the element to the DOM
                if (!thumbExists) {
                    // Update thumbs passing in addition post transition out handler
                    this.updateThumbs(function () {
                        var $thumbsUl = gallery.find('ul.thumbs');
                        if (insert) $thumbsUl.children(':eq(' + position + ')').before($li);
                        else $thumbsUl.append($li);
                        if (gallery.onImageAdded) gallery.onImageAdded(imageData, $li);
                    });
                }
                // Register the image globally
                allImages['' + hash] = imageData;
                // Setup attributes and click handler
                $aThumb.attr('rel', 'history').attr('href', '#' + hash).removeAttr('name').click(function (e) {
                    gallery.clickHandler(e, this);
                });
                return this;
            },
            // Removes an image from the gallery based on its index.
            // Returns false when the index is out of range.
            removeImageByIndex: function (index) {
                if (index < 0 || index >= this.data.length) return false;
                var imageData = this.data[index];
                if (!imageData) return false;
                this.removeImage(imageData);
                return true;
            },
            // Convenience method that simply calls the global removeImageByHash method.
            removeImageByHash: function (hash) {
                return $.galleriffic.removeImageByHash(hash, this);
            },
            // Removes an image from the gallery.
            removeImage: function (imageData) {
                var index = imageData.index;
                // Remove the image from the gallery data array
                this.data.splice(index, 1);
                // Remove the global registration
                delete allImages['' + imageData.hash];
                // Remove the image's list item from the DOM
                this.updateThumbs(function () {
                    var $li = gallery.find('ul.thumbs').children(':eq(' + index + ')').remove();
                    if (gallery.onImageRemoved) gallery.onImageRemoved(imageData, $li);
                });
                // Update each image objects index value
                this.updateIndices(index);
                return this;
            },
            // Updates the index values of the each of the images in the gallery after the specified index
            updateIndices: function (startIndex) {
                for (i = startIndex; i < this.data.length; i++) {
                    this.data[i].index = i;
                }
                return this;
            },
            // Scraped the thumbnail container for thumbs and adds each to the gallery
            initializeThumbs: function () {
                this.data = [];
                var gallery = this;
                this.find('ul.thumbs > li').each(function (i) {
                    gallery.addImage($(this), true, false);
                });
                return this;
            },
            isPreloadComplete: false,
            // Initalizes the image preloader
            preloadInit: function () {
                if (this.preloadAhead == 0) return this;
                this.preloadStartIndex = this.currentImage.index;
                var nextIndex = this.getNextIndex(this.preloadStartIndex);
                return this.preloadRecursive(this.preloadStartIndex, nextIndex);
            },
            // Changes the location in the gallery the preloader should work
            // @param {Integer} index The index of the image where the preloader should restart at.
            preloadRelocate: function (index) {
                // By changing this startIndex, the current preload script will restart
                this.preloadStartIndex = index;
                return this;
            },
            // Recursive function that performs the image preloading
            // @param {Integer} startIndex The index of the first image the current preloader started on.
            // @param {Integer} currentIndex The index of the current image to preload.
            preloadRecursive: function (startIndex, currentIndex) {
                // Check if startIndex has been relocated
                if (startIndex != this.preloadStartIndex) {
                    var nextIndex = this.getNextIndex(this.preloadStartIndex);
                    return this.preloadRecursive(this.preloadStartIndex, nextIndex);
                }
                var gallery = this;
                // Now check for preloadAhead count
                var preloadCount = currentIndex - startIndex;
                if (preloadCount < 0) preloadCount = this.data.length - 1 - startIndex + currentIndex;
                if (this.preloadAhead >= 0 && preloadCount > this.preloadAhead) {
                    // Do this in order to keep checking for relocated start index
                    setTimeout(function () {
                        gallery.preloadRecursive(startIndex, currentIndex);
                    }, 500);
                    return this;
                }
                var imageData = this.data[currentIndex];
                if (!imageData) return this;
                // If already loaded, continue
                if (imageData.image) return this.preloadNext(startIndex, currentIndex);
                // Preload the image
                var image = new Image();
                image.onload = function () {
                    imageData.image = this;
                    gallery.preloadNext(startIndex, currentIndex);
                };
                image.alt = imageData.title;
                image.src = imageData.slideUrl;
                return this;
            },
            // Called by preloadRecursive in order to preload the next image after the previous has loaded.
            // @param {Integer} startIndex The index of the first image the current preloader started on.
            // @param {Integer} currentIndex The index of the current image to preload.
            preloadNext: function (startIndex, currentIndex) {
                var nextIndex = this.getNextIndex(currentIndex);
                if (nextIndex == startIndex) {
                    this.isPreloadComplete = true;
                } else {
                    // Use setTimeout to free up thread
                    var gallery = this;
                    setTimeout(function () {
                        gallery.preloadRecursive(startIndex, nextIndex);
                    }, 100);
                }
                return this;
            },
            // Safe way to get the next image index relative to the current image.
            // If the current image is the last, returns 0
            getNextIndex: function (index) {
                var nextIndex = index + 1;
                if (nextIndex >= this.data.length) nextIndex = 0;
                return nextIndex;
            },
            // Safe way to get the previous image index relative to the current image.
            // If the current image is the first, return the index of the last image in the gallery.
            getPrevIndex: function (index) {
                var prevIndex = index - 1;
                if (prevIndex < 0) prevIndex = this.data.length - 1;
                return prevIndex;
            },
            // Pauses the slideshow
            pause: function () {
                this.isSlideshowRunning = false;
                if (this.slideshowTimeout) {
                    clearTimeout(this.slideshowTimeout);
                    this.slideshowTimeout = undefined;
                }
                if (this.$controlsContainer) {
                    this.$controlsContainer.find('div.ss-controls a').removeClass().addClass('play').attr('title', this.playLinkText).attr('href', '#play').html(this.playLinkText);
                }
                return this;
            },
            // Plays the slideshow
            play: function () {
                this.isSlideshowRunning = true;
                if (this.$controlsContainer) {
                    this.$controlsContainer.find('div.ss-controls a').removeClass().addClass('pause').attr('title', this.pauseLinkText).attr('href', '#pause').html(this.pauseLinkText);
                }
                if (!this.slideshowTimeout) {
                    var gallery = this;
                    this.slideshowTimeout = setTimeout(function () {
                        gallery.ssAdvance();
                    }, this.delay);
                }
                return this;
            },
            // Toggles the state of the slideshow (playing/paused)
            toggleSlideshow: function () {
                if (this.isSlideshowRunning) this.pause();
                else this.play();
                return this;
            },
            // Advances the slideshow to the next image and delegates navigation to the
            // history plugin when history is enabled
            // enableHistory is true
            ssAdvance: function () {
                if (this.isSlideshowRunning) this.next(true);
                return this;
            },
            // Advances the gallery to the next image.
            // @param {Boolean} dontPause Specifies whether to pause the slideshow.
            // @param {Boolean} bypassHistory Specifies whether to delegate navigation to the history plugin when history is enabled.  
            next: function (dontPause, bypassHistory) {
                this.gotoIndex(this.getNextIndex(this.currentImage.index), dontPause, bypassHistory);
                return this;
            },
            // Navigates to the previous image in the gallery.
            // @param {Boolean} dontPause Specifies whether to pause the slideshow.
            // @param {Boolean} bypassHistory Specifies whether to delegate navigation to the history plugin when history is enabled.
            previous: function (dontPause, bypassHistory) {
                this.gotoIndex(this.getPrevIndex(this.currentImage.index), dontPause, bypassHistory);
                return this;
            },
            // Navigates to the next page in the gallery.
            // @param {Boolean} dontPause Specifies whether to pause the slideshow.
            // @param {Boolean} bypassHistory Specifies whether to delegate navigation to the history plugin when history is enabled.
            nextPage: function (dontPause, bypassHistory) {
                var page = this.getCurrentPage();
                var lastPage = this.getNumPages() - 1;
                if (page < lastPage) {
                    var startIndex = page * this.numThumbs;
                    var nextPage = startIndex + this.numThumbs;
                    this.gotoIndex(nextPage, dontPause, bypassHistory);
                }
                return this;
            },
            // Navigates to the previous page in the gallery.
            // @param {Boolean} dontPause Specifies whether to pause the slideshow.
            // @param {Boolean} bypassHistory Specifies whether to delegate navigation to the history plugin when history is enabled.
            previousPage: function (dontPause, bypassHistory) {
                var page = this.getCurrentPage();
                if (page > 0) {
                    var startIndex = page * this.numThumbs;
                    var prevPage = startIndex - this.numThumbs;
                    this.gotoIndex(prevPage, dontPause, bypassHistory);
                }
                return this;
            },
            // Navigates to the image at the specified index in the gallery
            // @param {Integer} index The index of the image in the gallery to display.
            // @param {Boolean} dontPause Specifies whether to pause the slideshow.
            // @param {Boolean} bypassHistory Specifies whether to delegate navigation to the history plugin when history is enabled.
            gotoIndex: function (index, dontPause, bypassHistory) {
                if (!dontPause) this.pause();
                if (index < 0) index = 0;
                else if (index >= this.data.length) index = this.data.length - 1;
                var imageData = this.data[index];
                if (!bypassHistory && this.enableHistory) $.historyLoad(String(imageData.hash)); // At the moment, historyLoad only accepts string arguments
                else this.gotoImage(imageData);
                return this;
            },
            // This function is garaunteed to be called anytime a gallery slide changes.
            // @param {Object} imageData An object holding the image metadata of the image to navigate to.
            gotoImage: function (imageData) {
                var index = imageData.index;
                if (this.onSlideChange) this.onSlideChange(this.currentImage.index, index);
                this.currentImage = imageData;
                this.preloadRelocate(index);
                this.refresh();
                return this;
            },
            // Returns the default transition duration value.  The value is halved when not
            // performing a synchronized transition.
            // @param {Boolean} isSync Specifies whether the transitions are synchronized.
            getDefaultTransitionDuration: function (isSync) {
                if (isSync) return this.defaultTransitionDuration;
                return this.defaultTransitionDuration / 2;
            },
            // Rebuilds the slideshow image and controls and performs transitions
            refresh: function () {
                var imageData = this.currentImage;
                if (!imageData) return this;
                var index = imageData.index;
                // Update Controls
                if (this.$controlsContainer) {
                    this.$controlsContainer.find('div.nav-controls a.prev').attr('href', '#' + this.data[this.getPrevIndex(index)].hash).end().find('div.nav-controls a.next').attr('href', '#' + this.data[this.getNextIndex(index)].hash);
                }
                var previousSlide = this.$imageContainer.find('span.current').addClass('previous').removeClass('current');
                var previousCaption = 0;
                if (this.$captionContainer) {
                    previousCaption = this.$captionContainer.find('span.current').addClass('previous').removeClass('current');
                }
                // Perform transitions simultaneously if syncTransitions is true and the next image is already preloaded
                var isSync = this.syncTransitions && imageData.image;
                // Flag we are transitioning
                var isTransitioning = true;
                var gallery = this;
                var transitionOutCallback = function () {
                    // Flag that the transition has completed
                    isTransitioning = false;
                    // Remove the old slide
                    previousSlide.remove();
                    // Remove old caption
                    if (previousCaption) previousCaption.remove();
                    if (!isSync) {
                        if (imageData.image && imageData.hash == gallery.data[gallery.currentImage.index].hash) {
                            gallery.buildImage(imageData, isSync);
                        } else {
                            // Show loading container
                            if (gallery.$loadingContainer) {
                                gallery.$loadingContainer.show();
                            }
                        }
                    }
                };
                if (previousSlide.length == 0) {
                    // For the first slide, the previous slide will be empty, so we will call the callback immediately
                    transitionOutCallback();
                } else {
                    if (this.onTransitionOut) {
                        this.onTransitionOut(previousSlide, previousCaption, isSync, transitionOutCallback);
                    } else {
                        previousSlide.fadeTo(this.getDefaultTransitionDuration(isSync), 0.0, transitionOutCallback);
                        if (previousCaption) previousCaption.fadeTo(this.getDefaultTransitionDuration(isSync), 0.0);
                    }
                }
                // Go ahead and begin transitioning in of next image
                if (isSync) this.buildImage(imageData, isSync);
                if (!imageData.image) {
                    var image = new Image();
                    // Wire up mainImage onload event
                    image.onload = function () {
                        imageData.image = this;
                        // Only build image if the out transition has completed and we are still on the same image hash
                        if (!isTransitioning && imageData.hash == gallery.data[gallery.currentImage.index].hash) {
                            gallery.buildImage(imageData, isSync);
                        }
                    };
                    // set alt and src
                    image.alt = imageData.title;
                    image.src = imageData.slideUrl;
                }
                // This causes the preloader (if still running) to relocate out from the currentIndex
                this.relocatePreload = true;
                return this.syncThumbs();
            },
            // Called by the refresh method after the previous image has been transitioned out or at the same time
            // as the out transition when performing a synchronous transition.
            // @param {Object} imageData An object holding the image metadata of the image to build.
            // @param {Boolean} isSync Specifies whether the transitions are synchronized.
            buildImage: function (imageData, isSync) {
                var gallery = this;
                var nextIndex = this.getNextIndex(imageData.index);
                // Construct new hidden span for the image
                var newSlide = this.$imageContainer.append('<span class="image-wrapper current"><a class="advance-link" rel="history" href="#' + this.data[nextIndex].hash + '" title="' + imageData.title + '">&nbsp;</a></span>').find('span.current').css('opacity', '0');
                newSlide.find('a').append(imageData.image).click(function (e) {
                    gallery.clickHandler(e, this);
                });
                var newCaption = 0;
                if (this.$captionContainer) {
                    // Construct new hidden caption for the image
                    newCaption = this.$captionContainer.append('<span class="image-caption current"></span>').find('span.current').css('opacity', '0').append(imageData.caption);
                }
                // Hide the loading conatiner
                if (this.$loadingContainer) {
                    this.$loadingContainer.hide();
                }
                // Transition in the new image
                if (this.onTransitionIn) {
                    this.onTransitionIn(newSlide, newCaption, isSync);
                } else {
                    newSlide.fadeTo(this.getDefaultTransitionDuration(isSync), 1.0);
                    if (newCaption) newCaption.fadeTo(this.getDefaultTransitionDuration(isSync), 1.0);
                }
                if (this.isSlideshowRunning) {
                    if (this.slideshowTimeout) clearTimeout(this.slideshowTimeout);
                    this.slideshowTimeout = setTimeout(function () {
                        gallery.ssAdvance();
                    }, this.delay);
                }
                return this;
            },
            // Returns the current page index that should be shown for the currentImage
            getCurrentPage: function () {
                return Math.floor(this.currentImage.index / this.numThumbs);
            },
            // Applies the selected class to the current image's corresponding thumbnail.
            // Also checks if the current page has changed and updates the displayed page of thumbnails if necessary.
            syncThumbs: function () {
                var page = this.getCurrentPage();
                if (page != this.displayedPage) this.updateThumbs();
                // Remove existing selected class and add selected class to new thumb
                var $thumbs = this.find('ul.thumbs').children();
                $thumbs.filter('.selected').removeClass('selected');
                $thumbs.eq(this.currentImage.index).addClass('selected');
                return this;
            },
            // Performs transitions on the thumbnails container and updates the set of
            // thumbnails that are to be displayed and the navigation controls.
            // @param {Delegate} postTransitionOutHandler An optional delegate that is called after
            // the thumbnails container has transitioned out and before the thumbnails are rebuilt.
            updateThumbs: function (postTransitionOutHandler) {
                var gallery = this;
                var transitionOutCallback = function () {
                    // Call the Post-transition Out Handler
                    if (postTransitionOutHandler) postTransitionOutHandler();
                    gallery.rebuildThumbs();
                    // Transition In the thumbsContainer
                    if (gallery.onPageTransitionIn) gallery.onPageTransitionIn();
                    else gallery.show();
                };
                // Transition Out the thumbsContainer
                if (this.onPageTransitionOut) {
                    this.onPageTransitionOut(transitionOutCallback);
                } else {
                    this.hide();
                    transitionOutCallback();
                }
                return this;
            },
            // Updates the set of thumbnails that are to be displayed and the navigation controls.
            rebuildThumbs: function () {
                var needsPagination = this.data.length > this.numThumbs;
                // Rebuild top pager
                if (this.enableTopPager) {
                    var $topPager = this.find('div.top');
                    if ($topPager.length == 0) $topPager = this.prepend('<div class="top pagination"></div>').find('div.top');
                    else $topPager.empty();
                    if (needsPagination) this.buildPager($topPager);
                }
                // Rebuild bottom pager
                if (this.enableBottomPager) {
                    var $bottomPager = this.find('div.bottom');
                    if ($bottomPager.length == 0) $bottomPager = this.append('<div class="bottom pagination"></div>').find('div.bottom');
                    else $bottomPager.empty();
                    if (needsPagination) this.buildPager($bottomPager);
                }
                var page = this.getCurrentPage();
                var startIndex = page * this.numThumbs;
                var stopIndex = startIndex + this.numThumbs - 1;
                if (stopIndex >= this.data.length) stopIndex = this.data.length - 1;
                // Show/Hide thumbs
                var $thumbsUl = this.find('ul.thumbs');
                $thumbsUl.find('li').each(function (i) {
                    var $li = $(this);
                    if (i >= startIndex && i <= stopIndex) {
                        $li.show();
                    } else {
                        $li.hide();
                    }
                });
                this.displayedPage = page;
                // Remove the noscript class from the thumbs container ul
                $thumbsUl.removeClass('noscript');
                return this;
            },
            // Returns the total number of pages required to display all the thumbnails.
            getNumPages: function () {
                return Math.ceil(this.data.length / this.numThumbs);
            },
            // Rebuilds the pager control in the specified matched element.
            // @param {jQuery} pager A jQuery element set matching the particular pager to be rebuilt.
            buildPager: function (pager) {
                var gallery = this;
                var numPages = this.getNumPages();
                var page = this.getCurrentPage();
                var startIndex = page * this.numThumbs;
                var pagesRemaining = this.maxPagesToShow - 1;
                var pageNum = page - Math.floor((this.maxPagesToShow - 1) / 2) + 1;
                if (pageNum > 0) {
                    var remainingPageCount = numPages - pageNum;
                    if (remainingPageCount < pagesRemaining) {
                        pageNum = pageNum - (pagesRemaining - remainingPageCount);
                    }
                }
                if (pageNum < 0) {
                    pageNum = 0;
                }
                // Prev Page Link
                if (page > 0) {
                    var prevPage = startIndex - this.numThumbs;
                    pager.append('<a rel="history" href="#' + this.data[prevPage].hash + '" title="' + this.prevPageLinkText + '">' + this.prevPageLinkText + '</a>');
                }
                // Create First Page link if needed
                if (pageNum > 0) {
                    this.buildPageLink(pager, 0, numPages);
                    if (pageNum > 1) pager.append('<span class="ellipsis">&hellip;</span>');
                    pagesRemaining--;
                }
                // Page Index Links
                while (pagesRemaining > 0) {
                    this.buildPageLink(pager, pageNum, numPages);
                    pagesRemaining--;
                    pageNum++;
                }
                // Create Last Page link if needed
                if (pageNum < numPages) {
                    var lastPageNum = numPages - 1;
                    if (pageNum < lastPageNum) pager.append('<span class="ellipsis">&hellip;</span>');
                    this.buildPageLink(pager, lastPageNum, numPages);
                }
                // Next Page Link
                var nextPage = startIndex + this.numThumbs;
                if (nextPage < this.data.length) {
                    pager.append('<a rel="history" href="#' + this.data[nextPage].hash + '" title="' + this.nextPageLinkText + '">' + this.nextPageLinkText + '</a>');
                }
                pager.find('a').click(function (e) {
                    gallery.clickHandler(e, this);
                });
                return this;
            },
            // Builds a single page link within a pager.  This function is called by buildPager
            // @param {jQuery} pager A jQuery element set matching the particular pager to be rebuilt.
            // @param {Integer} pageNum The page number of the page link to build.
            // @param {Integer} numPages The total number of pages required to display all thumbnails.
            buildPageLink: function (pager, pageNum, numPages) {
                var pageLabel = pageNum + 1;
                var currentPage = this.getCurrentPage();
                if (pageNum == currentPage) pager.append('');
                else if (pageNum < numPages) {
                    var imageIndex = pageNum * this.numThumbs;
                }
                return this;
            }
        });
        // Now initialize the gallery
        $.extend(this, defaults, settings);
        // Verify the history plugin is available
        if (this.enableHistory && !$.historyInit) this.enableHistory = false;
        // Select containers
        if (this.imageContainerSel) this.$imageContainer = $(this.imageContainerSel);
        if (this.captionContainerSel) this.$captionContainer = $(this.captionContainerSel);
        if (this.loadingContainerSel) this.$loadingContainer = $(this.loadingContainerSel);
        // Initialize the thumbails
        this.initializeThumbs();
        if (this.maxPagesToShow < 3) this.maxPagesToShow = 3;
        this.displayedPage = -1;
        this.currentImage = this.data[0];
        var gallery = this;
        // Hide the loadingContainer
        if (this.$loadingContainer) this.$loadingContainer.hide();
        // Setup controls
        if (this.controlsContainerSel) {
            this.$controlsContainer = $(this.controlsContainerSel).empty();
            if (this.renderSSControls) {
                if (this.autoStart) {
                    this.$controlsContainer.append('<div class="ss-controls"><a href="#pause" class="pause" title="' + this.pauseLinkText + '">' + this.pauseLinkText + '</a></div>');
                } else {
                    this.$controlsContainer.append('<div class="ss-controls"><a href="#play" class="play" title="' + this.playLinkText + '">' + this.playLinkText + '</a></div>');
                }
                this.$controlsContainer.find('div.ss-controls a').click(function (e) {
                    gallery.toggleSlideshow();
                    e.preventDefault();
                    return false;
                });
            }
            if (this.renderNavControls) {
                this.$controlsContainer.append('<div class="nav-controls"><a class="prev" rel="history" title="' + this.prevLinkText + '">' + this.prevLinkText + '</a><a class="next" rel="history" title="' + this.nextLinkText + '">' + this.nextLinkText + '</a></div>').find('div.nav-controls a').click(function (e) {
                    gallery.clickHandler(e, this);
                });
            }
        }
        var initFirstImage = !this.enableHistory || !location.hash;
        if (this.enableHistory && location.hash) {
            var hash = $.galleriffic.normalizeHash(location.hash);
            var imageData = allImages[hash];
            if (!imageData) initFirstImage = true;
        }
        // Setup gallery to show the first image
        if (initFirstImage) this.gotoIndex(0, false, true);
        // Setup Keyboard Navigation
        if (this.enableKeyboardNavigation) {
            $(document).keydown(function (e) {
                var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
                switch (key) {
                case 32:
                    // space
                    gallery.next();
                    e.preventDefault();
                    break;
                case 33:
                    // Page Up
                    gallery.previousPage();
                    e.preventDefault();
                    break;
                case 34:
                    // Page Down
                    gallery.nextPage();
                    e.preventDefault();
                    break;
                case 35:
                    // End
                    gallery.gotoIndex(gallery.data.length - 1);
                    e.preventDefault();
                    break;
                case 36:
                    // Home
                    gallery.gotoIndex(0);
                    e.preventDefault();
                    break;
                case 37:
                    // left arrow
                    gallery.previous();
                    e.preventDefault();
                    break;
                case 39:
                    // right arrow
                    gallery.next();
                    e.preventDefault();
                    break;
                }
            });
        }
        // Auto start the slideshow
        if (this.autoStart) this.play();
        // Kickoff Image Preloader after 1 second
        setTimeout(function () {
            gallery.preloadInit();
        }, 1000);
        return this;
    };
})(jQuery);
/**
 * jQuery Opacity Rollover plugin
 *
 * Copyright (c) 2009 Trent Foley (http://trentacular.com)
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 */
;
(function ($) {
    var defaults = {
        mouseOutOpacity: 0.67,
        mouseOverOpacity: 1.0,
        fadeSpeed: 'fast',
        exemptionSelector: '.selected'
    };
    $.fn.opacityrollover = function (settings) {
        // Initialize the effect
        $.extend(this, defaults, settings);
        var config = this;
        function fadeTo(element, opacity) {
            var $target = $(element);
            if (config.exemptionSelector) $target = $target.not(config.exemptionSelector);
            $target.fadeTo(config.fadeSpeed, opacity);
        }
        this.css('opacity', this.mouseOutOpacity).hover(
        function () {
            fadeTo(this, config.mouseOverOpacity);
        }, function () {
            fadeTo(this, config.mouseOutOpacity);
        });
        return this;
    };
})(jQuery);
/*!
INIT
 * 
 */
$j(function () {
    $j(".dropdown li").hover(function () {
        $j(this).addClass("hover");
        $j('ul:first', this).css('visibility', 'visible');
    }, function () {
        $j(this).removeClass("hover");
        $j('ul:first', this).css('visibility', 'hidden');
    });
    $j(".dropdown li ul li:has(ul)").find("a:first").append(" &raquo; ");
    $j("ul#ticker01").liScroll({
        travelocity: 0.030
    });
});

$j('#sidebar-slideshow').cycle({
    fx: 'fade',
    timeout: 6000
});
$j('#blog-sidebar-slideshow').cycle({
    fx: 'fade',
    timeout: 3000
});
document.write('<style>.noscript { display: none; }</style>');
var url = window.location.href;
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2010&gpm=1") {
    $j('#sidebar-tour ul li.January a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-jan2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2010&gpm=2") {
    $j('#sidebar-tour ul li.February a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-feb2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2010&gpm=3") {
    $j('#sidebar-tour ul li.March a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-mar2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2010&gpm=4") {
    $j('#sidebar-tour ul li.April a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-apr2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2010&gpm=5") {
    $j('#sidebar-tour ul li.May a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-may2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2010&gpm=6") {
    $j('#sidebar-tour ul li.June a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-june2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2010&gpm=7") {
    $j('#sidebar-tour ul li.July a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-jul2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2010&gpm=8") {
    $j('#sidebar-tour ul li.August a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-aug2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2010&gpm=9") {
    $j('#sidebar-tour ul li.September a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-spt2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2010&gpm=10") {
    $j('#sidebar-tour ul li.October a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-oct2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2010&gpm=11") {
    $j('#sidebar-tour ul li.November a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-nov2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2010&gpm=12") {
    $j('#sidebar-tour ul li.December a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-dec2.gif")');
}


if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2011&gpm=1") {
    $j('#sidebar-tour ul li.January a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-jan2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2011&gpm=2") {
    $j('#sidebar-tour ul li.February a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-feb2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2011&gpm=3") {
    $j('#sidebar-tour ul li.March a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-mar2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2011&gpm=4") {
    $j('#sidebar-tour ul li.April a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-apr2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2011&gpm=5") {
    $j('#sidebar-tour ul li.May a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-may2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2011&gpm=6") {
    $j('#sidebar-tour ul li.June a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-june2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2011&gpm=7") {
    $j('#sidebar-tour ul li.July a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-jul2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2011&gpm=8") {
    $j('#sidebar-tour ul li.August a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-aug2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2011&gpm=9") {
    $j('#sidebar-tour ul li.September a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-spt2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2011&gpm=10") {
    $j('#sidebar-tour ul li.October a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-oct2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2011&gpm=11") {
    $j('#sidebar-tour ul li.November a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-nov2.gif")');
}
if (url == "http://www.cristiekerrgolf.com/tour-schedule/?gpy=2011&gpm=12") {
    $j('#sidebar-tour ul li.December a').css('background', 'url("http://cristiekerrgolf.com/app/wp-content/themes/2010/images/tour_menu-dec2.gif")');
}
 
 
 
 





function album(){

        var img1 = {
        player:     'img',
        content:    'press/press1.jpg',
        title:    'Click anywhere outside this box to return'
    };

        var img2 = {
        player:     'img',
        content:    'press/press2.jpg',
        title:    'Click anywhere outside this box to return'
    };

        var img3 = {
        player:     'img',
        content:    'press/press3.jpg',
        title:    'Click anywhere outside this box to return'
    };
    var img4 = {
        player:     'img',
        content:    'press/press4.jpg',
        title:    'Click anywhere outside this box to return'
    };
        var img5 = {
        player:     'img',
        content:    'press/press5.jpg',
        title:    'Click anywhere outside this box to return'
    };
        var img6 = {
        player:     'img',
        content:    'press/press6.jpg',
        title:    'Click anywhere outside this box to return'
    };
        var img7 = {
        player:     'img',
        content:    'press/press7.jpg',
        title:    'Click anywhere outside this box to return'
    };

    Shadowbox.open([img7, img1, img2, img3, img4, img5, img6]);

};

	function Launch(page, width, height) { 
		OpenWin = this.open(page, "popup", "toolbar=no, menubar=no ,location=no, scrollbars=yes, resizable=yes, width=" + width + ", height=" + height + ", top=" + (screen.height/2 - height/2) + ", left=" + (screen.width/2 - width/2) + "\""); 
	} 

 
 
   $j("a#part").click(function () {
                $j('.sponsors.bene').toggle("slow")
                $j('.sponsors.part').toggle("slow")
                
                return false;
            });
            
               $j("a#bene").click(function () {
                $j('.sponsors.bene').toggle("slow")
                $j('.sponsors.part').toggle("slow")
                
                return false;
            });
            
 
 
 

