﻿/*
* Version: 1.11 (3-MAY-2011)
*/
var slHeading = '<h3 class="offersHdg">Your Cruise Shortlist</h3>';
var slFooter = '<div class="ins">Click on cruise name to review. You can <a href="shoplist.aspx">send your shortlist by email</a> or phone <b>01756 796699</b> to book or discuss.</div>';
var slEmpty = '<div class="ins">Your cruise shortlist is empty. Please find a cruise you like then use the departure dates dropdown to add it to your shortlist.</div>';
//var sitEmpty = '<tr><td colspan="5">You can add a cruise to your shortlist from the cruise details. If you are undecided either phone to discuss with our specialists or provide as much information as possible in the \'Your cruise requirements\' box below.</td></tr>';
var sitEmpty = '<p style="padding:4px;margin:0;">You can add a cruise to your shortlist from the cruise details. If you are undecided either phone to discuss with our specialists or provide as much information as possible in the Your cruise requirements box below.</p>'
var slInstruc = 'Add a departure date for this cruise to your Cruise Choices';
var soHeading = '<span class="offersHdg"><strong>Special Offers</strong></span>';

/*Init EveryPage*/
$(function () { if ($.browser.msie) { if ($.browser.version === '6.0') { alert('You are using a very outdated browser. This site has not been designed with obsolete browsers in mind. Please upgrade your browser.') } } });

(function ($) {
    $.fn.offers = function (options) {
        var defaults = { 'offercount': '', 'autoheight': false, 'showtitle': true };
        var opts = $.extend(defaults, options);

        return this.each(function () {
            var $ob = $(this);
            var $os = $('.miniOffer', $ob);
            if (opts.showtitle) { $os.prepend($(soHeading)); }
            var moMaxH = 0;
            var cH = 0;
            if (opts.offercount !== '') {
                while ($('.miniOffer', $ob).length > opts.offercount) {
                    $('.miniOffer', $ob).eq(rnd($('.miniOffer', $ob).length)).remove();
                }
            }
        });
    };
})(jQuery);

(function ($) {
    $.fn.specialoffers = function (options) {
        var defaults = { 'none': 'none' };
        var opts = $.extend(defaults, options);
        $('.oImg').css({ 'display': 'none' });

        return this.each(function () {
            var $t = $(this);
            var $o = $('.miniOffer', $t);
            var so = [];
            var ro = rnd($o.length);
            var c = 0;
            $o.css({ 'display': 'none' });
            while (c !== 4) {
                if (inA(ro, so)) {
                    ro = rnd($o.length);
                    while (inA(ro, so)) {
                        ro = rnd($o.length);
                    }
                } else {
                    $o.eq(ro).css({ 'display': 'block' });
                    so[so.length] = ro;
                    ro = rnd($o.length);
                    ++c;
                }
            }
        });
        rnd = function (u) { return Math.floor(Math.random() * u); };
        function inA(needle, haystack) {
            var length = haystack.length;
            var i;
            for (i = 0; i < length; i++) {
                if (haystack[i] === needle) { return true; }
            }
            return false;
        }
    };
})(jQuery);

(function ($) {
    $.fn.ports = function (options) {
        var defaults = { 'imagepath': 'images/ports/{0}-1.jpg', 'upperbound': 3 };
        var opts = $.extend(defaults, options);

        return this.each(function () {
            var p = '';
            var h = '<h1>' + $('h1', $(this)).html() + '</h1>';
            $('h3', '.ports').each(function () {
                var $this = $(this);
                var end = false;
                var c;
                var n = '';
                var i = '';
                while (end !== true) {
                    if ($this[0].tagName === "H3") { t = $this.html(); i = t.substring(0, t.indexOf('(')); n = '<h3>' + t + '</h3>'; }
                    c = $this.next();
                    tagName = c.get(0).tagName;


                   // alert(tagName);
                      //     alert($.trim(t).toLowerCase());

                              

                    if (tagName === "H3" || tagName === "undefined") {
                        end = true;
                        p += '<div class="port" id="' + accentsTidy($.trim(t).toLowerCase()) + '"><img class="portImg" src="' + accentsTidy(opts.imagepath.replace('{0}', $.trim(t).replace(' ', '-'))).replace('{1}', rnd(opts.upperbound)) + '" alt="' + t + '" title="' + t + '"  onerror=\'this.style.display = "none"\' />' + n + '</div>';
                    } else {
                        n += '<p>' + c.html() + '</p>';
                        if (c.next().length === 0) { p += '<div class="port" id="' + accentsTidy($.trim(t).toLowerCase()) + '"><img class="portImg" src="' + accentsTidy(opts.imagepath.replace('{0}', $.trim(t).replace(' ', '-'))).replace('{1}', rnd(opts.upperbound)) + '" alt="' + t + '" title="' + t + '"  onerror=\'this.style.display = "none"\'  />' + n + '</div>'; end = true; } else { $this = c; }
                    }

                    
                }
                   
   //document.write(p);
            });
            $(this).empty().append(h + p);
            var $target = $(+window.location.hash.toLowerCase());
            if ($target.length > 1) {
                var targetOffset = $target.offset().top;
                $('html,body').animate({ scrollTop: targetOffset }, 0);
            }
        });


    };
})(jQuery);

(function ($) {
    $.fn.cabinRotate = function (options) {
        var defaults = { 'speed': 650, 'fx': 'fade' };
        var opts = $.extend(defaults, options);

        return this.each(function () {
            var $this = $(this);
            var $selected = $('li:visible', $this);
            $this.children('li:first').css({ 'display': 'list-item' });

            $('#ctPrev', $this).click(function () {
                if ($selected.index() === $('li:first', $this).index()) {
                    $selected.css({ 'display': 'none' });
                    $selected = $('li:last', $this);
                    $selected.css({ 'display': 'list-item' });
                } else {
                    $selected.css({ 'display': 'none' });
                    $selected = $selected.prev('li');
                    $selected.css({ 'display': 'list-item' });
                }
            });

            $('#ctNext', $this).click(function () {
                $selected = $('li:visible', $this);
                if ($selected.index() === $('li:last', $this).index()) {
                    $selected.css({ 'display': 'none' });
                    $selected = $('li:first', $this);
                    $selected.css({ 'display': 'list-item' });
                    $selected.css({ 'display': 'none' });
                    $selected = $selected.next('li');
                    $selected.css({ 'display': 'list-item' });
                }
            });

            $this.change(
function () {
    alert('CHANGE');
}
);
        });
    };
})(jQuery);

(function ($) {
    $.fn.hNav = function (options) {
        var defaults = { 'speed': 650, 'event': 'click', 'offset': '0 0' };
        var opts = $.extend(defaults, options);
        var navTimer = false;

        $('.hNav', $(this)).css({ 'display': 'none' });

        return this.each(function () {
            var showNav = function () {
                $this = $(this);
                $pop = $this.children('.hNav');
                $pop.css({ 'display': 'block' });
                $pop.position({ of: $this.parent(), my: "left top", at: "left bottom", offset: opts.offset, collision: 'none' });
                $('.hNav').css({ 'zindex': '1000' });
                $pop.css({ 'zindex': '1001' });
            };
            var hideNav = function () {
                $this = $(this);
                $pop = $this.children('.hNav');
                $pop.css({ 'zindex': '1000' });
                $pop.css({ 'display': 'none' });
            };
            var config = {
                over: showNav,
                timeout: 500,
                out: hideNav
            };
            $('.mBut', $(this)).click(function (ev) { ev.preventDefault(); });
            $('.hNavMBut', $(this)).hoverIntent(config);
        });
    };
})(jQuery);

(function ($) {
    $.fn.extraNav = function (options) {
        var defaults = { 'speed': 650, 'event': 'click', 'offset': '0 0' };
        var opts = $.extend(defaults, options);
        var navTimer = false;

        $('.hNavMBut', $(this)).each(function () {
            var $this = $(this);
            var $pop = $('#' + $this.data('pt')).parent();
            $pop.clone().appendTo($this);
        });
        $('.hNav', $(this)).css({ 'display': 'none' });

        return this.each(function () {
            var showNav = function () {
                var $this = $(this);
                var $pop = $this.children('.hNav');
                $pop.css({ 'display': 'block' });
                $pop.position({ of: $this.parent(), my: "left top", at: "left bottom", offset: opts.offset });
                $('.hNav').css({ 'zindex': '1000' });
                $pop.css({ 'zindex': '1001' });
            };
            var hideNav = function () {
                $this = $(this);
                $pop = $this.children('.hNav');
                $pop.css({ 'zindex': '1000' });
                $pop.css({ 'display': 'none' });
            };
            var config = {
                over: showNav,
                timeout: 500,
                out: hideNav
            };
            $('.hNavMBut', $(this)).hoverIntent(config);
        });
    };
})(jQuery);

(function ($) {
    $.fn.shortlist = function (options) {
        var defaults = { 'cookiename': 'test-sl', 'cruisecode': 'A387', 'cruisename': 'Legendary Danube', 'datesDropDown': $('.sld'), 'heading': slHeading, 'footer': slFooter };
        var opts = $.extend(defaults, options);

        var sList = new sl();

        return this.each(function () {
            var $this = $(this);

            if (opts.datesDropDown.length >= 1) {
                opts.datesDropDown.change(function () {
                    if ($("option:selected", $(this)).index() > 0) {
                        sList.add(opts.cruisecode, opts.cruisename, $("option:selected", $(this)).text());
                        $("#dialog:ui-dialog").dialog("destroy");
                        $("#dialog-message").html(opts.cruisename + ' ' + $("option:selected", $(this)).text() + ' has been added to your Cruise Choices.');
                        $("#dialog-message").dialog({
                            closeText: '',
                            modal: true,
                            height: 100,
                            width: 298,
                            buttons: { "Carry on cruising": function () { $(this).dialog("close"); }, "Send your Cruise Choices": function () { window.location = 'norway-cruise-shortlist.aspx'; } }
                        });
                    }
                });

                $.each(opts.dates, function (value, text) {
                    if (text.indexOf(' - ') > -1) {
                        var ts = text.split(' - ');
                        var d = ts[0];
                        var dText = ts[1];
                        var dp = d.split('/');
                        text = dp[2] + ' ' + month[dp[0] - 1] + ' ' + dp[1];
                        if (dText !== 'undefined') { text += ' - ' + ts[1]; }
                    }
                    opts.datesDropDown.append($('<option></option>').text(text));
                });
                $('<span class="t"><label for="sld">' + slInstruc + '</label></span>').insertBefore(opts.datesDropDown);
            }
            $('.slRemove').live('click', function (e) {
                sList.removeItem($(this).parent().index());
            });
        });
    };
})(jQuery);

(function ($) {
    $.fn.reviewshortlist = function (options) {
        var defaults = { 'cookiename': 'test-sl' };
        var opts = $.extend(defaults, options);

        var sList = new sl();

        return this.each(function () {
            var $this = $(this);
            $this.position(opts.position);
            $this.append(sList.getHTMLItems().table);
            $('.priorityDropDown').change(function () {
                $active = $(this);
                var nv = $(':selected', $active).val();
                $('.priorityDropDown').each(function () {
                    if ($active[0] !== $(this)[0] && $(':selected', $(this)).val() === nv) { $(this).val(' - '); }
                });
            });
            $('.slRemove').live('click', function () {
                sList.removeItem($(this).parent().parent().index() - 1);
                $(this).parent().parent().slideUp(400);
                sList.draw();
            });
        });
    };
})(jQuery);

var month = new Array(12); month[0] = "Jan"; month[1] = "Feb"; month[2] = "Mar"; month[3] = "Apr"; month[4] = "May"; month[5] = "Jun"; month[6] = "Jul"; month[7] = "Aug"; month[8] = "Sep"; month[9] = "Oct"; month[10] = "Nov"; month[11] = "Dec";

function sl() {
    this.version = '0.0.1';
    this.cookieName = '';
    this.items = [];
    this.hasItem = function (item) {
        var count = 0;
        var it;
        for (it = 0; it < this.items.length; it++) {
            if (this.items[it].code + this.items[it].date === item.code + item.date) { return count; } else { count += 1; }
        }
        return -1;
    };
    this.newId = function () {
        var id = 0;
        var it;
        for (it = 0; it < this.items.length; it++) {
            id += 1;
        }
        return (id);
    };
    this.add = function (c, n, d) {
        var i = new slItem();
        var ts = d.split(' - ');
        i.code = c;
        if (ts[1] !== undefined) { i.name = n + ' - ' + ts[1]; } else { i.name = n; }
        i.date = ts[0];
        i.id = this.newId();
        if (this.hasItem(i) === -1) { this.items[i.id] = i; }
        this.save();
        this.redraw();
    };
    this.save = function () {
        var basketString = '';
        var it;
        for (it = 0; it < this.items.length; it++) {
            basketString += this.items[it].print() + '|';
        }
        $.cookie('test-sl', basketString, { expires: 7 });
    };
    this.redraw = function () {
        var $sl = $('.showShortlist');
        $sl.html(this.getHTMLItems().div);
        $sl.append(slFooter);
        $('.slRemove', $sl).hide(0);
    };
    this.removeItem = function (i) {
        var newItems = {};
        var newIndex = 0;
        var it;
        for (it = 0; it < this.items.length; it++) {
            if (it !== i) {
                newItems[newIndex] = this.items[it];
                newIndex++;
            }
        }
        this.items = newItems;
        this.save();
    };
    this.draw = function () {
        var sListString = $.cookie('test-sl');
        if (sListString !== null) {
            var sItems = sListString.split('|');
            var i;
            for (i = 0; i < sItems.length; i++) {
                if (sItems[i] !== '') {
                    var sItem = sItems[i].split('#');
                    var item = new slItem();
                    item.id = i;
                    item.code = sItem[0];
                    item.name = sItem[1];
                    item.date = sItem[2];
                    this.items[i] = item;
                }
            }
        }
        this.redraw();
    };
    this.getHTMLItems = function () {
        var si = '';
        var sit = '<table cellpadding="0" cellspacing="0"><tr><th class="code"></th><th class="name">Cruise Shortlist</th><th class="date">Date</th><th class="priority">Priority</th><th class="remove">Remove</th></tr>';
        var it;
        for (it = 0; it < this.items.length; it++) {
            var slDate = new Date(this.items[it].date);
            var dt = '';
            if (month[slDate.getMonth()] != undefined) { dt = slDate.getDate() + ' ' + month[slDate.getMonth()] + ' ' + slDate.getFullYear(); } else { dt = this.items[it].date; }
            si += "<div class=\"slItem\"><span class=\"code\">" + this.items[it].code + "</span><span class=\"name\">" + this.items[it].name + "</span><span class=\"date\">" + dt + "</span><span class=\"priority\"></span><span class=\"slRemove\" title=\"Click here to remove this option from your shortlist\">Click to remove</span></div>";
            sit += '<tr><td class="code"><input type="hidden" id="code_' + it + '"  name="code_' + it + '" value="' + this.items[it].code + '" />' + this.items[it].code + '</td><td class="name"><input type="hidden" id="name_' + it + '" name="name_' + it + '" value="' + this.items[it].name + '" />' + this.items[it].name + '</td><td class="date"><input type="hidden" id="date_' + it + '" name="date_' + it + '" value="' + dt + '" />' + dt + '</td><td class="priority"><select class="priorityDropDown" id="priority_' + it + '" name="priority_' + it + '"><option> - </option><option>1st</option><option>2nd</option></select></td><td class="remove"><span class=\"slRemove\" title=\"Click here to remove this option from your shortlist\">Remove</span></td></tr>';
        }
        if (this.items.length === 0) { si = slEmpty; sit = sitEmpty; }
        sit += '</table>';
        return { 'div': si, 'table': sit };
    };
    this.draw();
}

function slItem() {
    this.id = '';
    this.code = '';
    this.name = '';
    this.date = '';
    this.print = function () { return this.code + '#' + this.name + '#' + this.date; }
}
rnd = function (u) { return Math.floor(Math.random() * u); }
accentsTidy = function (s) { var r = s.toLowerCase(); r = r.replace(/\(|\)/g, ""); r = r.replace(new RegExp("[,'&%!]"), ""); r = r.replace(new RegExp("[àáâãäå]", 'g'), "a"); r = r.replace(new RegExp("æ", 'g'), "ae"); r = r.replace(new RegExp("ç", 'g'), "c"); r = r.replace(new RegExp("[èéêë]", 'g'), "e"); r = r.replace(new RegExp("[ìíîï]", 'g'), "i"); r = r.replace(new RegExp("ñ", 'g'), "n"); r = r.replace(new RegExp("[øòóôõö]", 'g'), "o"); r = r.replace(new RegExp("œ", 'g'), "oe"); r = r.replace(new RegExp("[ùúûü]", 'g'), "u"); r = r.replace(new RegExp("[ýÿ]", 'g'), "y"); return r; };

$(function () {
    var iImage = $('.rtImg').length; var iCount = 0;
    var fade = 3000;
    var speed = 6000;

    $('.rtImg').eq(0).fadeIn(0);
    $('#rvTag').text($('.rtImg').eq(0).attr('alt'));

    if (iImage > 1) {
        window.setInterval(function () {
            $('.rtImg').eq(iCount).fadeOut(fade);
            if (iCount < iImage - 1) {
                $('.rtImg').eq(iCount + 1).fadeIn(fade);
                $('#rvTag').text($('.rtImg').eq(iCount + 1).attr('alt'));
                iCount += 1;
            } else {
                $('.rtImg').eq(0).fadeIn(fade);
                $('#rvTag').text($('.rtImg').eq(0).attr('alt'));
                iCount = 0;
            }
        }, speed);
    }
    if ($('.itinerary').length > 0) {
        var p = $('.itinerary>div:nth-child(2)');
        var offset = p.position();
    }
});

function get_ents(str) {
    var temp = document.createElement("pre");
    temp.innerHTML = str;
    return temp.firstChild.nodeValue;
}

$(function () {
    $('.mhSearch input').css('color', '#666');
    $('.mhSearch input').attr('value', 'Destination Search...');
    $('.mhSearch input').click(function () {
        $('.mhSearch input').css('color', '#006');
        $('.mhSearch input').attr('value', '');
    });
    $('.mhSearch input').keypress(function (ev) {
        if (ev.which == '13') {
            ev.preventDefault();
            var strSrc = $('.mhSearch input').attr('value');
            window.location = 'search.aspx?ft=' + strSrc;
        }
    });
    $('.mhSearch img').click(function () {
        var strSrc = $('.mhSearch input').attr('value');
        window.location = 'search.aspx?ft=' + strSrc;
    });
});

if ($.browser.msie && $.browser.version <= "6.0") { $('.pageWrapper').css('z-index', '-1'); }

$('.offers').prepend(soHeading);

/**
* Cookie plugin
*
* Copyright (c) 2006 Klaus Hartl (stilbuero.de)
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
*/
jQuery.cookie = function (name, value, options) { if (typeof value != 'undefined') { options = options || {}; if (value === null) { value = ''; options = $.extend({}, options); options.expires = -1; } var expires = ''; if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { var date; if (typeof options.expires == 'number') { date = new Date(); date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); } else { date = options.expires; } expires = '; expires=' + date.toUTCString(); } var path = options.path ? '; path=' + (options.path) : ''; var domain = options.domain ? '; domain=' + (options.domain) : ''; var secure = options.secure ? '; secure' : ''; document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); } else { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } };

/**
* hoverIntent r6 // 2011.02.26 // jQuery 1.5.1+
* <http://cherne.net/brian/resources/jquery.hoverIntent.html>
* 
* @param  f  onMouseOver function || An object with configuration options
* @param  g  onMouseOut function  || Nothing (use configuration options object)
* @author    Brian Cherne brian(at)cherne(dot)net
*/
(function ($) { $.fn.hoverIntent = function (f, g) { var cfg = { sensitivity: 7, interval: 100, timeout: 0 }; cfg = $.extend(cfg, g ? { over: f, out: g} : f); var cX, cY, pX, pY; var track = function (ev) { cX = ev.pageX; cY = ev.pageY }; var compare = function (ev, ob) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); if ((Math.abs(pX - cX) + Math.abs(pY - cY)) < cfg.sensitivity) { $(ob).unbind("mousemove", track); ob.hoverIntent_s = 1; return cfg.over.apply(ob, [ev]) } else { pX = cX; pY = cY; ob.hoverIntent_t = setTimeout(function () { compare(ev, ob) }, cfg.interval) } }; var delay = function (ev, ob) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); ob.hoverIntent_s = 0; return cfg.out.apply(ob, [ev]) }; var handleHover = function (e) { var ev = jQuery.extend({}, e); var ob = this; if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t) } if (e.type == "mouseenter") { pX = ev.pageX; pY = ev.pageY; $(ob).bind("mousemove", track); if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout(function () { compare(ev, ob) }, cfg.interval) } } else { $(ob).unbind("mousemove", track); if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout(function () { delay(ev, ob) }, cfg.timeout) } } }; return this.bind('mouseenter', handleHover).bind('mouseleave', handleHover) } })(jQuery);

/*
* jQuery Cycle Plugin (core engine)
* Examples and documentation at: http://jquery.malsup.com/cycle/
* Copyright (c) 2007-2010 M. Alsup
* Version: 2.88 (08-JUN-2010)
* Dual licensed under the MIT and GPL licenses.
* http://jquery.malsup.com/license.html
* Requires: jQuery v1.2.6 or later
*/
(function ($) { var ver = "2.88"; 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, " ")); } } $.fn.cycle = function (options, arg2) { var o = { s: this.selector, c: this.context }; 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; } log("terminating; zero elements found by selector" + ($.isReady ? "" : " (DOM not ready)")); return this; } return this.each(function () { var opts = handleArguments(this, options, arg2); if (opts === false) { return; } opts.updateActivePagerLink = opts.updateActivePagerLink || $.fn.cycle.updateActivePagerLink; 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(els[opts2.currSlide], els[opts2.nextSlide], opts2, !opts2.rev); 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 && !opts.backwards)); }, startTime); } }); }; 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 "destroy": case "stop": var opts = $(cont).data("cycle.opts"); if (!opts) { return false; } cont.cycleStop++; if (cont.cycleTimeout) { clearTimeout(cont.cycleTimeout); } cont.cycleTimeout = 0; $(cont).removeData("cycle.opts"); if (options == "destroy") { destroy(opts); } return false; case "toggle": cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1; checkInstantResume(cont.cyclePause, arg2, cont); return false; case "pause": cont.cyclePause = 1; return false; case "resume": cont.cyclePause = 0; checkInstantResume(false, arg2, cont); 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) { 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 checkInstantResume(isPaused, arg2, cont) { if (!isPaused && arg2 === true) { var 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, (!opts.rev && !opts.backwards)); } } } function removeFilter(el, opts) { if (!$.support.opacity && opts.cleartype && el.style.filter) { try { el.style.removeAttribute("filter"); } catch (smother) { } } } function destroy(opts) { if (opts.next) { $(opts.next).unbind(opts.prevNextEvent); } if (opts.prev) { $(opts.prev).unbind(opts.prevNextEvent); } if (opts.pager || opts.pagerAnchorBuilder) { $.each(opts.pagerAnchors || [], function () { this.unbind().remove(); }); } opts.pagerAnchors = null; if (opts.destroy) { opts.destroy(opts); } } function buildOptions($cont, $slides, els, options, o) { 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; }); 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 && !opts.backwards)); }); } saveOriginalOpts(opts); if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) { clearTypeFix($slides); } 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); } else { if (opts.backwards) { opts.startingSlide = els.length - 1; } } 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 = 1; opts.startingSlide = opts.randomMap[1]; } else { if (opts.startingSlide >= els.length) { opts.startingSlide = 0; } } opts.currSlide = opts.startingSlide || 0; var first = opts.startingSlide; $slides.css({ position: "absolute", top: 0, left: 0 }).hide().each(function (i) { var z; if (opts.backwards) { z = first ? i <= first ? els.length + (i - first) : first - i : els.length - i; } else { z = first ? i >= first ? els.length - (i - first) : first - i : els.length - i; } $(this).css("z-index", z); }); $(els[first]).css("opacity", 1).show(); removeFilter(els[first], opts); if (opts.fit && opts.width) { $slides.width(opts.width); } if (opts.fit && opts.height && opts.height != "auto") { $slides.height(opts.height); } var reshape = opts.containerResize && !$cont.innerHeight(); if (reshape) { 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 || e.width || $e.attr("width"); } if (!h) { h = e.offsetHeight || e.height || $e.attr("height"); } 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; } var requeue = false; options.requeueAttempts = options.requeueAttempts || 0; $slides.each(function () { var $el = $(this); this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr("height") || 0); this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr("width") || 0); if ($el.is("img")) { 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); if (loadingIE || loadingFF || loadingOp || loadingOther) { if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { 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; } 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); if (opts.speed.constructor == String) { opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed); } if (!opts.sync) { opts.speed = opts.speed / 2; } var buffer = opts.fx == "shuffle" ? 500 : 250; while ((opts.timeout - opts.speed) < buffer) { 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) { if (++opts.randomIndex == els.length) { opts.randomIndex = 0; } opts.nextSlide = opts.randomMap[opts.randomIndex]; } else { if (opts.backwards) { opts.nextSlide = opts.startingSlide == 0 ? (els.length - 1) : opts.startingSlide - 1; } else { opts.nextSlide = opts.startingSlide >= (els.length - 1) ? 0 : opts.startingSlide + 1; } } 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; } } } 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 || opts.pagerAnchorBuilder) { buildPager(els, opts); } exposeAddSlide(opts, els); return opts; } 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; if (opts.fx.indexOf(",") > 0) { opts.multiFx = true; opts.fxs = opts.fx.replace(/\s*/g, "").split(","); 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 (!opts.fxs.length) { log("No valid transitions named; slideshow terminating."); return false; } } else { if (opts.fx == "all") { 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) { 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; } 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); } 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 || opts.pagerAnchorBuilder) { $.fn.cycle.createPagerAnchor(els.length - 1, s, $(opts.pager), els, opts); } if ($.isFunction(opts.onAddSlide)) { opts.onAddSlide($s); } else { $s.hide(); } }; } $.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); }); var init = $.fn.cycle.transitions[fx]; if ($.isFunction(init)) { init(opts.$cont, $(opts.elements), opts); } }; function go(els, opts, manual, fwd) { if (manual && opts.busy && opts.manualTrump) { debug("manualTrump in go(), stopping active transition"); $(els).stop(true, true); opts.busy = false; } if (opts.busy) { debug("transition active, ignoring new tx request"); return; } var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide]; if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual) { return; } if (!manual && !p.cyclePause && !opts.bounce && ((opts.autostop && (--opts.countdown <= 0)) || (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) { if (opts.end) { opts.end(opts); } return; } var changed = false; if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) { changed = true; var fx = opts.fx; curr.cycleH = curr.cycleH || $(curr).height(); curr.cycleW = curr.cycleW || $(curr).width(); next.cycleH = next.cycleH || $(next).height(); next.cycleW = next.cycleW || $(next).width(); if (opts.multiFx) { if (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length) { opts.lastFx = 0; } fx = opts.fxs[opts.lastFx]; opts.currFx = fx; } if (opts.oneTimeFx) { fx = opts.oneTimeFx; opts.oneTimeFx = null; } $.fn.cycle.resetState(opts, fx); if (opts.before.length) { $.each(opts.before, function (i, o) { if (p.cycleStop != opts.stopCount) { return; } o.apply(next, [curr, next, opts, fwd]); }); } var after = function () { $.each(opts.after, function (i, o) { if (p.cycleStop != opts.stopCount) { return; } o.apply(next, [curr, next, opts, fwd]); }); }; debug("tx firing; currSlide: " + opts.currSlide + "; nextSlide: " + opts.nextSlide); opts.busy = 1; if (opts.fxFn) { opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent); } else { if ($.isFunction($.fn.cycle[opts.fx])) { $.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent); } else { $.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent); } } } if (changed || opts.nextSlide == opts.currSlide) { 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]; if (opts.nextSlide == opts.currSlide) { opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1; } } else { if (opts.backwards) { var roll = (opts.nextSlide - 1) < 0; if (roll && opts.bounce) { opts.backwards = !opts.backwards; opts.nextSlide = 1; opts.currSlide = 0; } else { opts.nextSlide = roll ? (els.length - 1) : opts.nextSlide - 1; opts.currSlide = roll ? 0 : opts.nextSlide + 1; } } else { var roll = (opts.nextSlide + 1) == els.length; if (roll && opts.bounce) { opts.backwards = !opts.backwards; opts.nextSlide = els.length - 2; opts.currSlide = els.length - 1; } else { opts.nextSlide = roll ? 0 : opts.nextSlide + 1; opts.currSlide = roll ? els.length - 1 : opts.nextSlide - 1; } } } } if (changed && opts.pager) { opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass); } var ms = 0; if (opts.timeout && !opts.continuous) { ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd); } else { if (opts.continuous && p.cyclePause) { ms = 10; } } if (ms > 0) { p.cycleTimeout = setTimeout(function () { go(els, opts, 0, (!opts.rev && !opts.backwards)); }, ms); } } $.fn.cycle.updateActivePagerLink = function (pager, currSlide, clsName) { $(pager).each(function () { $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName); }); }; function getTimeout(curr, next, opts, fwd) { if (opts.timeoutFn) { var t = opts.timeoutFn.call(curr, curr, next, opts, fwd); while ((t - opts.speed) < 250) { t += opts.speed; } debug("calculated timeout: " + t + "; speed: " + opts.speed); if (t !== false) { return t; } } return opts.timeout; } $.fn.cycle.next = function (opts) { advance(opts, opts.rev ? -1 : 1); }; $.fn.cycle.prev = function (opts) { advance(opts, opts.rev ? 1 : -1); }; 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) { 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) { 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; } } } } var cb = opts.onPrevNextEvent || opts.prevNextClick; if ($.isFunction(cb)) { cb(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); }); opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass); } $.fn.cycle.createPagerAnchor = function (i, el, $p, els, opts) { var a; if ($.isFunction(opts.pagerAnchorBuilder)) { a = opts.pagerAnchorBuilder(i, el); debug("pagerAnchorBuilder(" + i + ", el) returned: " + a); } else { a = '<a href="#">' + (i + 1) + "</a>"; } if (!a) { return; } var $a = $(a); 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[0]); }); $a = $(arr); } else { $a.appendTo($p); } } opts.pagerAnchors = opts.pagerAnchors || []; opts.pagerAnchors.push($a); $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; } var cb = opts.onPagerEvent || opts.pagerClick; if ($.isFunction(cb)) { cb(opts.nextSlide, els[opts.nextSlide]); } go(els, opts, 1, opts.currSlide < i); }); if (!/^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble) { $a.bind("click.cycle", function () { return false; }); } if (opts.pauseOnPagerHover) { $a.hover(function () { opts.$cont[0].cyclePause++; }, function () { opts.$cont[0].cyclePause--; }); } }; $.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; }; function clearTypeFix($slides) { debug("applying clearType background-color hack"); 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)); }); } $.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)); }; $.fn.cycle.custom = function (curr, next, opts, cb, fwd, 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(); } }; $.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; }; $.fn.cycle.defaults = { fx: "fade", timeout: 4000, timeoutFn: null, continuous: 0, speed: 1000, speedIn: null, speedOut: null, next: null, prev: null, onPrevNextEvent: null, prevNextEvent: "click.cycle", pager: null, onPagerEvent: null, pagerEvent: "click.cycle", allowPagerClickBubble: false, pagerAnchorBuilder: null, before: null, after: null, end: null, easing: null, easeIn: null, easeOut: null, shuffle: null, animIn: null, animOut: null, cssBefore: null, cssAfter: null, fxFn: null, height: "auto", startingSlide: 0, sync: 1, random: 0, fit: 0, containerResize: 1, pause: 0, pauseOnPagerHover: 0, autostop: 0, autostopCount: 0, delay: 0, slideExpr: null, cleartype: !$.support.opacity, cleartypeNoBg: false, nowrap: 0, fastOnEvent: 0, randomizeEffects: 1, rev: 0, manualTrump: true, requeueOnImageNotLoaded: true, requeueTimeout: 250, activePagerClass: "activeSlide", updateActivePagerLink: null, backwards: false }; })(jQuery);
