slider = null;

Cufon.replace('.caption h2, .caption ul li a, h3.futura', { fontFamily : 'Futura-Normal', hover : true });

Cufon.replace('#header .account ul li, .reservations .check h5, .reservations label, #navigation > ul > li > a, #header .phone p, .box-info .item h4, #social-popup .boxes .box-mail h3, .reserve h3, #sidebar .nav h3, #sidebar .nav ul li a, .landing_header .header_note', { fontFamily : 'Futura-Heavy', hover : true });

jQuery(document).ready(function ($) {
	if ( $('.body .logo img').length > 0 ) {
		$('.body .logo img').load(function() {
			$('.body .box-share').css('margin-top', ($(this).height()/2) - 4)
		});
	} else {
		$('.single .body .box-share').css('margin-top', 13);
	}
	
	$('html:has(body.home)').css('overflow', 'hidden');
	
	$('body.archive.single').addClass('archive-single');
	
	$('#navigation > .menu > li:has(a[href*="accommodations"]) > .sub-menu').prepend('<li id="guestrooms-suites" />');
	$('#guestrooms-suites').append('<ul class="combo-menu" />').find('ul').append($('#menu-item-300, #menu-item-297'));
			
	$('.box-item:last').addClass('box-item-last');
	
	
	$('#navigation ul li:last-child').addClass('last');
	$('#banners li:first').addClass('first');
	
	function center (selector) {
		var left = ($(window).width() - $(selector).width()) / 2;
		$(selector).css('left', left);
	}
	
	// custom input
	//$('.reservation-form .check').jqTransform();
	
	//datePicker
	//	$('.check-in, .check-out').datepicker({
	//		numberOfMonths: 2,
	//		showOn: "button",
	//		buttonImage: window._palms_theme_root + "/images/btn-cal.gif",
	//		buttonImageOnly: true
	//	});
	
	
	// Event Calender
	(function() {
		function pad(number, length) {
			var str = '' + number.toString();
			while (str.length < length) {
			    str = '0' + str;
			}
			return str;
		}
		function ec_update(date) {
			var events_list = $('.events .list ul');
			events_list.html('');
			for (i = j = 0; i < calendarEvents.length && j < 3; i++) {
				if ( jQuery.inArray(date, calendarEvents[i][4]) > -1 ) {
					events_list.append(calendarEvents[i][3]);
					++j;
				}
			}
		}
		
		var calendarEvents = window.__event_dates;
		var current_date = new Date();
		
		var datepick = $('.cal-date').datepicker({
			onSelect: function(dateText, inst) {ec_update(dateText); },
			dateFormat: 'yy-mm-dd',
			maxDate: '+2m',
			minDate: new Date(current_date.getFullYear(), current_date.getMonth() - 1, 1, 0),
			beforeShowDay: function (date){
				var result = [false, ""];
				var event_types = { show: false, nightlife: false, concert: false };
				
				for (i = 0; i < calendarEvents.length; i++) {
					var padded_date = date.getFullYear() + '-' + pad(date.getMonth() + 1, 2) + '-' + pad(date.getDate(), 2);
					var block = false;
					
					if (event_types[calendarEvents[i][12]] !== false) {
						block = true;
					}
					
					/* Time Range */
					if ( (calendarEvents[i][7] && date.getTime() < (new Date(calendarEvents[i][7][0], calendarEvents[i][7][1] - 1, calendarEvents[i][7][2])).getTime()) || ( calendarEvents[i][8] && date.getTime() > (new Date(calendarEvents[i][8][0], calendarEvents[i][8][1] - 1, calendarEvents[i][8][2])).getTime()) ) {
						block = true;	
					}
					
					/* Exceptions */
					if ( !block ) {
						if ( (calendarEvents[i][10].length && date.getTime() > (new Date(calendarEvents[i][10][0], calendarEvents[i][10][1] - 1, calendarEvents[i][10][2])).getTime()) && ( calendarEvents[i][11].length && date.getTime() < (new Date(calendarEvents[i][11][0], calendarEvents[i][11][1] - 1, calendarEvents[i][11][2])).getTime()) ) {
							if ( calendarEvents[i][5] == 'monthly' ) {
								var dates = calendarEvents[i][6];
								if ( jQuery.inArray(date.getDate(), dates) > -1 ) {
									block = true;
								};
							} else if( calendarEvents[i][5] == 'weekly' ) {
								var days = calendarEvents[i][6];
								if ( jQuery.inArray(date.getDay() + 1, days) > -1 ) {
									block = true;
								};
							}
						}
							
						if (calendarEvents[i][9].length) { // are there particular exception dates
							for (var j=0; j<calendarEvents[i][9].length; j++) { // go through all of them
								if (
									typeof(calendarEvents[i][9][j]) != 'undefined'
									&& calendarEvents[i][9][j][0] == date.getFullYear() // check the year
									&& (
										calendarEvents[i][9][j][1] == (date.getMonth() + 1) // check the month
										|| calendarEvents[i][9][j][1] == '0' + (date.getMonth() + 1) // check the month if lower than 10
									)
									&& (
										calendarEvents[i][9][j][2] == date.getDate() // check the day
										|| calendarEvents[i][9][j][2] == '0' + date.getDate() // check the day if lower than 10
									)
								) {
									block = true;
								}
							}
						}
					}
					
					/* Repeats */
					if ( !block ) {
						if ( calendarEvents[i][0] == 'daily' ) {
							if ( jQuery.inArray(padded_date, calendarEvents[i][4]) < 0 ) {
								calendarEvents[i][4].push(padded_date);
							};
							result = [true,"ui-state-active", calendarEvents[i][2]];
							event_types[calendarEvents[i][12]] = true;
						} else if ( calendarEvents[i][0] == 'monthly' ) {
							var dates = calendarEvents[i][1];
							if ( jQuery.inArray(date.getDate(), dates) > -1 ) {
								if ( jQuery.inArray(padded_date, calendarEvents[i][4]) < 0 ) {
									calendarEvents[i][4].push(padded_date);
								};
								result = [true,"ui-state-active", calendarEvents[i][2]];
								event_types[calendarEvents[i][12]] = true;
							};
						} else {
							// weekly
							var days = calendarEvents[i][1];
							if ( jQuery.inArray(date.getDay() + 1, days) > -1 ) {
								if ( jQuery.inArray(padded_date, calendarEvents[i][4]) < 0 ) {
									calendarEvents[i][4].push(padded_date);
								};
								result = [true,"ui-state-active", calendarEvents[i][2]];
								event_types[calendarEvents[i][12]] = true;
							};
						}
					};
				}
				return result;//enable all other days
			}
		});
		
		(function() {
			if (calendarEvents == undefined) return;
			var events_list = $('.events .list ul');
			var upcoming_events = [];
			var next_events = {};
			var date = new Date();
			var event_types = { show: false, nightlife: false, concert: false };
			
			for (i = 0; i < calendarEvents.length && upcoming_events.length < 3; i++) {
				var padded_date = date.getFullYear() + '-' + pad(date.getMonth() + 1, 2) + '-' + pad(date.getDate(), 2);
				var block = false;
				
				if (event_types[calendarEvents[i][12]] !== false) {
					var current_event = calendarEvents[i];
					var saved_event = next_events[calendarEvents[i][12]];
					var overwrite = false;
					
					if (current_event[7][0] < saved_event[7][0]) {
						overwrite = true;
					} else if (current_event[7][0] == saved_event[7][0]) {
						if (current_event[7][1] < saved_event[7][1]) {
							overwrite = true;
						} else if (current_event[7][1] == saved_event[7][1]) {
							if (current_event[7][2] < saved_event[7][2]) {
								overwrite = true;
							}
						}
					}
					
					if (overwrite) {
						next_events[calendarEvents[i][12]] = current_event;
					}
					
					block = true;
				}
				
				/* Time Range */
				if (typeof(calendarEvents[i][8] != 'undefined') && calendarEvents[i][8].length > 0) {
					if (date.getFullYear() > calendarEvents[i][8][0] || date.getMonth() > calendarEvents[i][8][1] - 1 || date.getDate() > calendarEvents[i][8][2]) {
						block = true;
					}
				}
				
				/* Exceptions */
				if ( !block ) {
					if ( (calendarEvents[i][10].length && date.getTime() > (new Date(calendarEvents[i][10][0], calendarEvents[i][10][1] - 1, calendarEvents[i][10][2])).getTime()) && ( calendarEvents[i][11].length && date.getTime() < (new Date(calendarEvents[i][11][0], calendarEvents[i][11][1] - 1, calendarEvents[i][11][2])).getTime()) ) {
						if ( calendarEvents[i][5] == 'monthly' ) {
							var dates = calendarEvents[i][6];
							if ( jQuery.inArray(date.getDate(), dates) > -1 ) {
								block = true;
							};
						} else if( calendarEvents[i][5] == 'weekly' ) {
							var days = calendarEvents[i][6];
							if ( jQuery.inArray(date.getDay() + 1, days) > -1 ) {
								block = true;
							};
						}
					}
						
					if (calendarEvents[i][9].length) {
						if (
							calendarEvents[i][9][0] == date.getFullYear() // check the year
							&& (
								calendarEvents[i][9][1] == (date.getMonth() + 1) // check the month
								|| calendarEvents[i][9][1] == '0' + (date.getMonth() + 1) // check the month if lower than 10
							)
							&& (
								calendarEvents[i][9][2] == date.getDate() // check the day
								|| calendarEvents[i][9][2] == '0' + date.getDate() // check the day if lower than 10
							)
						) {
							block = true;
						}
					}
				}
				
				
				
				/* Repeats */
				if ( !block ) {
					if ( calendarEvents[i][0] == 'daily' ) {
						next_events[calendarEvents[i][12]] = calendarEvents[i];
						event_types[calendarEvents[i][12]] = true;
					} else if ( calendarEvents[i][0] == 'monthly' ) {
						var dates = calendarEvents[i][1];
						if ( jQuery.inArray(date.getDate(), dates) < 0 ) {
							if ( jQuery.inArray(padded_date, calendarEvents[i][4]) > -1 ) {
								next_events[calendarEvents[i][12]] = calendarEvents[i];
								event_types[calendarEvents[i][12]] = true;
							};
						};
					} else {
						// weekly
						var days = calendarEvents[i][1];
						if ( jQuery.inArray(date.getDay() + 1, days) > -1 ) {
							if ( jQuery.inArray(padded_date, calendarEvents[i][4]) > -1 ) {
								next_events[calendarEvents[i][12]] = calendarEvents[i];
								event_types[calendarEvents[i][12]] = true;
							};
						};
					}
				};
			}
			for (var evt in next_events) {
				upcoming_events.push(next_events[evt][3]);
			}
			date.setDate(date.getDate() + 1);
			
			events_list.html(upcoming_events.join(' '));
		})();
	})();
	
	// dd menu
	$('#navigation ul:first > li:last').addClass('last');
	$('.box-recommend li:last').addClass('last');
	$('#sidebar .nav .menu > li:last').addClass('last');
	
	// sidebar 
	$('.sub-menu:has(.current-menu-item)', '#sidebar').show().prev().addClass('active');
	$("#navigation ul:first > li").hover(function() {
		$(this).css({ 'z-index' : 100 });
		$(this).find(".sub-menu").show();
		$(this).find("a:eq(0)").addClass('hover');
		
		if ($(this).is(':first-child')) {
			var ddWidth = 0;
			$(this).find('.sub-menu:first > li > .sub-menu:not(:has(.sub-menu)), .sub-menu:first > li > .combo-menu').each(function () {
				ddWidth += $(this).width() + 15;
			});
			$(this).find('.sub-menu:first').css('width', ddWidth );
		}
	}, function() {
		$(this).css({ 'z-index' : 1 });
		$(this).find(".sub-menu").hide();
		$(this).find("a:eq(0)").removeClass('hover');
		Cufon.replace('#navigation > ul > li > a', { fontFamily : 'Futura-Heavy', hover : true });
	});
	
	$("#navigation .menu-parent > .sub-menu > li:last").css({'padding-right' : '0'});
	
	// Sidebar Radio buttons fix
	(function () {
		var is_taller = false
		$('.radios .radio-col1, .radios .radio-col2').each(function() {
			if ( $(this).height() > 20 ) {
				is_taller = true;
				return false;
			};
		});
		
		if ( is_taller ) {
			$('.radios .radio-col1, .radios .radio-col2').css({'float': 'none', 'display': 'block', 'clear': 'both', 'width': '150px'});
			$('.radios .radio-col1 label, .radios .radio-col2 label').css({'width': '80px', 'display': 'inline'});
		};
		
	})();
	
	// input button hover
	$('.form-signup .button').hover(function () {
		$(this).addClass('button-h');
		return false;
	}, function () {
		$(this).removeClass('button-h');
		return false;
	});
	
	// social popup
	$('#btn-social, .btn-social2').click(function () {
		if ( $('#social-popup:visible').length ) {
			$('#social-popup').fadeOut();
			$('#overlay').fadeOut();
		} else {
			$('#social-popup').fadeIn();
			$('#overlay').fadeIn();
		}
		return false;
	});
	$('#overlay').click(function () {
		$('#social-popup').fadeOut();
		$('#overlay').fadeOut();
		return false;
	});
	$('#social-popup .btn-close, #social-popup .close').click(function () {
		$('#social-popup').fadeOut();
		$('#overlay').fadeOut();
		return false;
	});
	$(window).keypress(function(e) {
		// Close social popup when the user hits ESC
		if ( e.keyCode == 27 ) {
			$('#social-popup:visible, #overlay:visible').fadeOut();
		};
	});
	// center
	$('#social-popup').center();
	
	// footer-exp center
	// center('#footer-exp');
	// center('.btn-quick');
	
	// $(window).resize(function () {
	// 	center('#footer-exp');
	// 	center('.btn-quick');
	// });
	
	
	$('.btn-quick').live('click', function () {
		if (!$(this).hasClass('btn-quick-close')) {
			
			$('.btn-quick').addClass('btn-quick-close');
			$('#footer-exp .holder').show().animate({height: 320}, function () {
				
			});
			$('.caption').fadeOut().addClass('disabled');
		} else {
			$('#footer-exp .holder').animate({height: 0}, function () {
				$(this).hide();
				$('.btn-quick').removeClass('btn-quick-close');
			});
		}
		
		return false;
	});
	
	$('.btn-quick2').live('click', function () {
		
		$('#footer-exp .holder').animate({height: 0}, function () {
			$(this).hide();
			$('.btn-quick').removeClass('btn-quick-close');
			
		});
		
		return false;
	});
	
	$('.mail-signup').live('click', function () {
		
		$('.btn-quick').addClass('btn-quick-close');
		$('#footer-exp .holder').show().animate({height: 320}, function () {
			$('.box-signup form .ginput_container:first input:first').focus();
		});
		$('.caption').fadeOut().addClass('disabled');
		
		return false;
	});
	
	// btn hover
	$('.reservations .col .button').hover(function () {
		$(this).addClass('button-a');
		return false;
	}, function () {
		$(this).removeClass('button-a');
		return false;
	});
	
	// image slider
	$('.thumbs').jcarousel({
	    scroll: 1,
	    wrap : 'both',
	    auto : 0,
	    vertical: true,
	    buttonNextHTML: null,
	    buttonPrevHTML: null,
	    // Events
	    initCallback: function (carousel) {
	    	$('.prev').click(function () {
		        carousel.prev();
		        carousel.stopAuto();
		        return false;
		    });
		    $('.next').click(function () {
		        carousel.next();
		        carousel.stopAuto();
		        return false;
		    });
	    }
	});
	
	//var slider;
	var thumbs_slide_enable = $('.thumbs a').length > 1;
	(function() {
		slider = {
			speed: 4000,
			index: 0,
			tm: null,
			next: function() {
				slider.index ++;
				var l = $('.thumbs li:eq(' + slider.index + ') a');
				
				if ( !l.length ) {
					slider.index = 0;
					l = $('.thumbs li:eq(' + slider.index + ') a');
				};
				
				l.click();
				slider.iter();
			},
			iter: function() {	
				slider.pause(); // prevent from multiple starts
				slider.tm = setTimeout(slider.next, slider.speed);
			},
			pause: function() {
				clearTimeout(slider.tm);
			}
		};
	})();
	
	(function() {
		if ( $('.thumbs a').length ) {
			var video_container = $('.thumbs a').parents('.thumbs.right').siblings('.video-container');
			var duration = 500;
			var pause = 4000;
			var currentItem = 0;
			var timeout = null;
			
			function fadeTo(index) {
				clearTimeout(timeout);
				timeout = null;
				if (index > currentItem) {
					video_container.find('.video:eq(' + index + ')').fadeIn(duration);
				} else if (index < currentItem) {
					video_container.find('.video:not(:eq(' + currentItem + ')):not(:eq(' + index + '))').hide();
					video_container.find('.video:eq(' + index + ')').show();
					video_container.find('.video:eq(' + currentItem + ')').fadeOut(duration);
				}
				
				currentItem = index;
				
				var thumbnail_descr = $('#content .head .thumbs ul li:eq(' + currentItem + ') .desc');
				$('#content .head p.descr').text($(thumbnail_descr).text());
				
				timeout = setTimeout(function() {
					if (++index < $('.thumbs a').length) {
						fadeTo(index);
					} else {
						fadeTo(0);
					}
				}, pause);
			}
			
			$('.thumbs a').each(function() {
				if ($(this).attr('rel') == 'video') {
					video_container.append('<div class="video left"><object width="589" height="328"><param name="movie" value="' + $(this).attr('href') + '"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><param name="wmode" value="transparent"></param><embed src="' + $(this).attr('href') + '" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="589" height="328"></embed></object></div>');
				} else if ($(this).attr('data-type') == 'image') {
					var psid = 'slide-' + new Date().getTime().toString().substr(6, 7);
					video_container.append('<div class="video left"><img id="' + psid + '" src="' + $(this).attr('href') + '" alt="' + $(this).attr('data-description') + '" title="' +  $(this).attr('data-description') + '" /></div>');
					if ($(this).attr('data-link') != '') {
						$('#' + psid).wrap('<a href="' + $(this).attr('data-link') + '" />');
					}
				} else if ($(this).attr('data-type') == 'video') {
					var psid = 'slide-' + new Date().getTime().toString().substr(6, 7);
					video_container.append('<div class="video left"><video id="' + psid + '" src="' + $(this).attr('href') + '" width="589" height="328" controls="controls" poster="' + $(this).attr('data-poster') + '" /></div>');
					var flashvars = { src: $(this).attr('href'), poster: $(this).attr('data-poster'), autoPlay: false };
					var params = { allowscriptaccess: 'always', allowfullscreen: true, wmode: "transparent" };
					var attributes = {};
					
					swfobject.embedSWF("http://fpdownload.adobe.com/strobe/FlashMediaPlayback.swf", psid, 589, 328, "10.0.0", "expressInstall.swf", flashvars, params, attributes);
				}
				
				$(this).click(function() {
					try {
						fadeTo($(this).parent().index());
					} catch (error) {
					}
					return false;
				});
			});
			
			video_container.find('.video:not(:first)').hide();
			video_container.find('.video').hover(function() {
				if ($(this).find('object, embed, video').length) {
					clearTimeout(timeout);
					timeout = false;
				}
			});
			$('.thumbs a:first').click();
		}
	})();
	
	
	var mailreg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	
	$('form.form-mail').submit(function() {
		var textfield = $(this).find('input[type=text]');
		if ( !textfield.val().match(mailreg) ) {
			alert('Pelase enter a valid e-mail address');
			textfield.focus();
			return false;
		};
	});
	
	$('form.satisfaction-form').live('submit', function() {
		var mail_fields = $(this).find('input[name=s_email]');
		var message = $(this).find('textarea');
		if ( !mail_fields.val().match(mailreg) ) {
			alert('Pelase enter a valid e-mail address!');
			mail_fields.focus();
			return false;
		} else if ( message.val() == '' || message.val() == 'Describe your idea' ) {
			alert('Pelase enter you message!');
			message.focus();
			return false;
		}
	});
	
	/* Gravity forms functions */
	$('.email-signup-field input').addClass('blink').attr('title', 'Email Address');
	$('.mobile-phone-signup-field input').addClass('blink').attr('title', 'Mobile Phone Number');
	
	if ( $('.gform_wrapper .validation_error').length ) {
		messages = '';
		$('.gform_wrapper .validation_message').each(function() {
			messages += $(this).text() + '\n';
		});
		alert($('.gform_wrapper .validation_error').text() + '\n' + messages);
	} else if( $('#gforms_confirmation_message').length ) {
		alert($('#gforms_confirmation_message').text());
	}
	
	
	// blink on focus
	$('.blink')
		.focus(function(){
			if( $(this).val() == $(this).attr('title') ) {
				$(this).val('');
			}
		})
		.blur(function(){
			if( $(this).val() == '' ) {
				$(this).val( $(this).attr('title') );
			}
		}).blur();
	
	var host = window.location.host.toString().replace(/^(http:\/\/)?(www\.)?/g, '').toString().replace(/\.[\w]{2,4}$/g, '');
	$('a').each(function() {
		var href = $(this).attr('href');
		if (typeof(href) != 'undefined' && !href.match(new RegExp(host, 'g'))) {
			$(this).attr('target', '_blank');
		}
	});
	
	$(window).load(function() {
	    $('body.page-template-page-landing-php #content .body').each(function() {
	    	var content = $(this).find('.landing_content');
	    	var sidebar = $(this).find('.landing_sidebar');
	    	if (content.height() < sidebar.height()) {
	    		content.height(sidebar.height()).css('paddingBottom', '0px');
	    	}
	    });
	    
	    
		if (!$.browser.webkit || /Chrome/.test(navigator.userAgent)) {
			$('span.html-marquee').marquee();
		} else {
			$('span.html-marquee').hide();
			var tweet_list = $('#footer .safari_tweets').show();
			
			var tweets = tweet_list.find('> li');
			var duration = 600;
			var pause = 5000;
			var current_tweet = 0;
			
			setInterval(function() {
				$(tweets[current_tweet++]).fadeOut(duration/2);
				if (current_tweet >= tweets.length) {
					current_tweet = 0;
				}
				$(tweets[current_tweet]).fadeIn(duration/2);
			}, pause);
		}
	});
	
	$('span.html-marquee').hide();
});

/**
* author Remy Sharp
* url http://remysharp.com/tag/marquee
*/

(function ($) {
    $.fn.marquee = function (klass) {
        var newMarquee = [],
            last = this.length;

        // works out the left or right hand reset position, based on scroll
        // behavior, current direction and new direction
        function getReset(newDir, marqueeRedux, marqueeState) {
            var behavior = marqueeState.behavior, width = marqueeState.width, dir = marqueeState.dir;
            var r = 0;
            if (behavior == 'alternate') {
                r = newDir == 1 ? marqueeRedux[marqueeState.widthAxis] - (width*2) : width;
            } else if (behavior == 'slide') {
                if (newDir == -1) {
                    r = dir == -1 ? marqueeRedux[marqueeState.widthAxis] : width;
                } else {
                    r = dir == -1 ? marqueeRedux[marqueeState.widthAxis] - (width*2) : 0;
                }
            } else {
                r = newDir == -1 ? marqueeRedux[marqueeState.widthAxis] : 0;
            }
            return r;
        }

        // single "thread" animation
        function animateMarquee() {
            var i = newMarquee.length,
                marqueeRedux = null,
                $marqueeRedux = null,
                marqueeState = {},
                newMarqueeList = [],
                hitedge = false;
                
            while (i--) {
                marqueeRedux = newMarquee[i];
                $marqueeRedux = $(marqueeRedux);
                marqueeState = $marqueeRedux.data('marqueeState');
                
                if ($marqueeRedux.data('paused') !== true) {
                    // TODO read scrollamount, dir, behavior, loops and last from data
                    marqueeRedux[marqueeState.axis] += (marqueeState.scrollamount * marqueeState.dir);

                    // only true if it's hit the end
                    hitedge = marqueeState.dir == -1 ? marqueeRedux[marqueeState.axis] <= getReset(marqueeState.dir * -1, marqueeRedux, marqueeState) : marqueeRedux[marqueeState.axis] >= getReset(marqueeState.dir * -1, marqueeRedux, marqueeState);
                    
                    if ((marqueeState.behavior == 'scroll' && marqueeState.last == marqueeRedux[marqueeState.axis]) || (marqueeState.behavior == 'alternate' && hitedge && marqueeState.last != -1) || (marqueeState.behavior == 'slide' && hitedge && marqueeState.last != -1)) {                        
                        if (marqueeState.behavior == 'alternate') {
                            marqueeState.dir *= -1; // flip
                        }
                        marqueeState.last = -1;

                        $marqueeRedux.trigger('stop');

                        marqueeState.loops--;
                        if (marqueeState.loops === 0) {
                            if (marqueeState.behavior != 'slide') {
                                marqueeRedux[marqueeState.axis] = getReset(marqueeState.dir, marqueeRedux, marqueeState);
                            } else {
                                // corrects the position
                                marqueeRedux[marqueeState.axis] = getReset(marqueeState.dir * -1, marqueeRedux, marqueeState);
                            }

                            $marqueeRedux.trigger('end');
                        } else {
                            // keep this marquee going
                            newMarqueeList.push(marqueeRedux);
                            $marqueeRedux.trigger('start');
                            marqueeRedux[marqueeState.axis] = getReset(marqueeState.dir, marqueeRedux, marqueeState);
                        }
                    } else {
                        newMarqueeList.push(marqueeRedux);
                    }
                    marqueeState.last = marqueeRedux[marqueeState.axis];

                    // store updated state only if we ran an animation
                    $marqueeRedux.data('marqueeState', marqueeState);
                } else {
                    // even though it's paused, keep it in the list
                    newMarqueeList.push(marqueeRedux);                    
                }
            }

            newMarquee = newMarqueeList;
            
            if (newMarquee.length) {
                setTimeout(animateMarquee, 25);
            }            
        }
        
        // TODO consider whether using .html() in the wrapping process could lead to loosing predefined events...
        this.each(function (i) {
            var $marquee = $(this),
                width = $marquee.attr('width') || $marquee.width(),
                height = $marquee.attr('height') || $marquee.height(),
                $marqueeRedux = $marquee.after('<div ' + (klass ? 'class="' + klass + '" ' : '') + 'style="display: block-inline; width: ' + width + 'px; height: ' + height + 'px; overflow: hidden;"><div style="float: left; white-space: nowrap;">' + $marquee.html() + '</div></div>').next(),
                marqueeRedux = $marqueeRedux.get(0),
                hitedge = 0,
                direction = ($marquee.attr('direction') || 'left').toLowerCase(),
                marqueeState = {
                    dir : /down|right/.test(direction) ? -1 : 1,
                    axis : /left|right/.test(direction) ? 'scrollLeft' : 'scrollTop',
                    widthAxis : /left|right/.test(direction) ? 'scrollWidth' : 'scrollHeight',
                    last : -1,
                    loops : $marquee.attr('loop') || -1,
                    scrollamount : $marquee.attr('scrollamount') || this.scrollAmount || 2,
                    behavior : ($marquee.attr('behavior') || 'scroll').toLowerCase(),
                    width : /left|right/.test(direction) ? width : height
                };
            
            // corrects a bug in Firefox - the default loops for slide is -1
            if ($marquee.attr('loop') == -1 && marqueeState.behavior == 'slide') {
                marqueeState.loops = 1;
            }

            $marquee.remove();
            
            // add padding
            if (/left|right/.test(direction)) {
                $marqueeRedux.find('> div').css('padding', '0 ' + width + 'px');
            } else {
                $marqueeRedux.find('> div').css('padding', height + 'px 0');
            }
            
            // events
            $marqueeRedux.bind('stop', function () {
                $marqueeRedux.data('paused', true);
            }).bind('pause', function () {
                $marqueeRedux.data('paused', true);
            }).bind('start', function () {
                $marqueeRedux.data('paused', false);
            }).bind('unpause', function () {
                $marqueeRedux.data('paused', false);
            }).data('marqueeState', marqueeState); // finally: store the state
            
            // todo - rerender event allowing us to do an ajax hit and redraw the marquee

            newMarquee.push(marqueeRedux);

            marqueeRedux[marqueeState.axis] = getReset(marqueeState.dir, marqueeRedux, marqueeState);
            $marqueeRedux.trigger('start');
            
            // on the very last marquee, trigger the animation
            if (i+1 == last) {
                animateMarquee();
            }
        });            

        return $(newMarquee);
    };
}(jQuery));
