/**
 * jQuery.timers - Timer abstractions for jQuery
 * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com)
 * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).
 * Date: 2009/10/16
 *
 * @author Blair Mitchelmore
 * @version 1.2
 *
 **/

jQuery.fn.extend({
	everyTime: function(interval, label, fn, times) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, times);
		});
	},
	oneTime: function(interval, label, fn) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, 1);
		});
	},
	stopTime: function(label, fn) {
		return this.each(function() {
			jQuery.timer.remove(this, label, fn);
		});
	}
});

jQuery.extend({
	timer: {
		global: [],
		guid: 1,
		dataKey: "jQuery.timer",
		regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,
		powers: {
			// Yeah this is major overkill...
			'ms': 1,
			'cs': 10,
			'ds': 100,
			's': 1000,
			'das': 10000,
			'hs': 100000,
			'ks': 1000000
		},
		timeParse: function(value) {
			if (value == undefined || value == null)
				return null;
			var result = this.regex.exec(jQuery.trim(value.toString()));
			if (result[2]) {
				var num = parseFloat(result[1]);
				var mult = this.powers[result[2]] || 1;
				return num * mult;
			} else {
				return value;
			}
		},
		add: function(element, interval, label, fn, times) {
			var counter = 0;
			
			if (jQuery.isFunction(label)) {
				if (!times) 
					times = fn;
				fn = label;
				label = interval;
			}
			
			interval = jQuery.timer.timeParse(interval);

			if (typeof interval != 'number' || isNaN(interval) || interval < 0)
				return;

			if (typeof times != 'number' || isNaN(times) || times < 0) 
				times = 0;
			
			times = times || 0;
			
			var timers = jQuery.data(element, this.dataKey) || jQuery.data(element, this.dataKey, {});
			
			if (!timers[label])
				timers[label] = {};
			
			fn.timerID = fn.timerID || this.guid++;
			
			var handler = function() {
				if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
					jQuery.timer.remove(element, label, fn);
			};
			
			handler.timerID = fn.timerID;
			
			if (!timers[label][fn.timerID])
				timers[label][fn.timerID] = window.setInterval(handler,interval);
			
			this.global.push( element );
			
		},
		remove: function(element, label, fn) {
			var timers = jQuery.data(element, this.dataKey), ret;
			
			if ( timers ) {
				
				if (!label) {
					for ( label in timers )
						this.remove(element, label, fn);
				} else if ( timers[label] ) {
					if ( fn ) {
						if ( fn.timerID ) {
							window.clearInterval(timers[label][fn.timerID]);
							delete timers[label][fn.timerID];
						}
					} else {
						for ( var fn in timers[label] ) {
							window.clearInterval(timers[label][fn]);
							delete timers[label][fn];
						}
					}
					
					for ( ret in timers[label] ) break;
					if ( !ret ) {
						ret = null;
						delete timers[label];
					}
				}
				
				for ( ret in timers ) break;
				if ( !ret ) 
					jQuery.removeData(element, this.dataKey);
			}
		}
	}
});

jQuery(window).bind("unload", function() {
	jQuery.each(jQuery.timer.global, function(index, item) {
		jQuery.timer.remove(item);
	});
});


/**
 * jQuery Lap Time Revlolver
 **/
(function (){
	jQuery.fn.laptimeRevolver = function(){
		function repeat(str,n){
			return new Array(n+1).join(str);
		}
		return this.each(function(){
			var $wrapper = jQuery('> div', this),
				$slider = $wrapper.find('> ul'),
				$items = $slider.find('> li'),
				$item = $items.filter(':first');
			
			singleWidth = $item.innerWidth();
			
			function move(){
				$wrapper.filter(':not(:animated)').animate({
					scrollLeft : '+=' + singleWidth
				}, 800, function(){
					$wrapper.scrollLeft(0);
					first = $slider.find('li:first');
					first.remove();
					$slider.find('li:last').after(first);
					
				});
			};
			jQuery(document).everyTime(5000, function(i) {
				move();
			});
			window.move = move;
		});
	};
})(jQuery);


/**
 * Jquery Richmenu JS
 */
(function ($) {
    $.fn.richMenu = function (settings) {
        return this.each(function(){
            var $this = $(this);	
			var timer;
							   
            var options = {
                events: settings.events || 'click',
                effect: settings.effect || 'slideDown',
                target: settings.target || null,
                timeout: settings.timeout || 500,
				speed: settings.speed || 'fast',
                position: settings.position || 'bottom',
                onBefore: settings.onBefore || function(){ },
                onEnd: settings.onEnd || function(){ },
				onClick: settings.onClick || function() { }
            };

            target = function (){
                var target = options.target;
                return target && target.jquery? target: $(target);
            };
						
            var $target = target();

            var $menu = $target
                                    .clone(true)
                                    .data('menuLock', 1)
                                    .appendTo('body')
                                    .css({display: 'none', position: 'absolute', left: $this.offset().left, top: $this.offset().top + $this.height(), zIndex: 5000});

			$(window).resize(function() {
									  	$menu.css({left: $this.offset().left, top: $this.offset().top + $this.height()});
									  });	
					
						
            function hideMenu(elm) {
                if (typeof elm == 'number') elm = undefined;
				var $elm = $(elm);
				
				clearTimeout(timer);
                if($elm.css('display') != 'none'){
				 	$elm.removeClass('richMenuActive');
					switch (options.effect) {
						case 'slide':
							$elm.slideUp(options.speed);
							break;				
						case 'fade':
							$elm.fadeOut(options.speed);
							break;						
					};
                }
            };
								
            function handleUserEvent(){
                if($this.data('animating')){
                    return false;
                }		
									
				animateMenu();	
				return false;
            }
			
			function animateMenu(){		
                $this.data('animating', 1);		
				$menu.css({left: $this.offset().left, top: $this.offset().top + $this.height(), zIndex: 5000});
					   
                $menu.queue(function() {
					$('.richMenuActive').each(function(index, elm){
													   //hideMenu($(elm));
													   });
                    options.onBefore($menu, $this);
                    $menu.dequeue();
                });
				 if($menu.css('display') == 'none'){
				 	$menu.addClass('richMenuActive');
					switch (options.effect) {
						case 'slide':
							$menu.slideDown(options.speed);
							break;				
						case 'fade':
							$menu.fadeIn(options.speed);
							break;						
					};
				} else {
					if(options.events == 'click'){
						hideMenu($menu);	
					}
				}
				
                $menu.queue(function() {                    
                    options.onEnd($menu, $this);
                    $this.removeData('animating');
                    $menu.dequeue();
                });
			}
			
			function handleMenuClick (event){
				options.onClick(this, $menu, $this, event);
				hideMenu($menu);
				event.stopPropagation();
			}
				
						
			$menu.mouseenter(function() {	
				$menu.css({zIndex: 5000});		
				clearTimeout(timer);
			});
				
			$menu.mouseleave(function() {
				$menu.css({zIndex: 4999});	
				clearTimeout(timer);
				timer = setTimeout(function() {hideMenu($menu);}, options.timeout);timer				
			});
						
			$this.mouseenter(function(){	
				$menu.css({zIndex: 5000});			
				clearTimeout(timer);	
			});
					
			$this.mouseleave(function(){	
				$menu.css({zIndex: 4999});	
				clearTimeout(timer);
				timer = setTimeout(function() {hideMenu($menu);}, options.timeout);timer				
			});			
			
			function bindMenu(elm){				
				$(elm).bind('click',handleMenuClick, false);	
				$(elm).children().each(
									   function(){
											bindMenu($(this));	   
									   });
				
			}
										
            $this.bind($.trim((options.events + ' ').split(' ').join('.newmenu ')), handleUserEvent);	
			bindMenu($menu);
        });
    };
})(jQuery);



/**
 * Raw Document Ready JS sitewide 
 */
jQuery(document).ready(function() {
    /* Christmas Voucher Offer Firstname and Email Restore */
    jQuery('#vName').focus( function() {
        if( jQuery(this).val() == 'First name') {
            jQuery(this).val('');
        }
        jQuery(this).addClass('focused');
    });
    jQuery('#vName').blur(function() {
        if (jQuery(this).val() == '') {
            jQuery(this).val('First name');
        }
    });
    jQuery('#vEmail').focus( function() {
        if( jQuery(this).val() == 'Your email address') {
            jQuery(this).val('');
        }
        jQuery(this).addClass('focused');
    });
    jQuery('#vEmail').blur(function() {
        if (jQuery(this).val() == '') {
            jQuery(this).val('Your email address');
        }
    });

    jQuery('#vImageSubmit').click(function(){
        if( jQuery('#vName').val() != '' && jQuery('#vEmail').val() != '' ) {
            if( !checkEmail( jQuery('#vEmail').val() ) ) {
                alert( 'Please check you have entered a valid Email Address' );
                return false;
            }
        } else {
            alert( 'Please check you have entered a valid Email Address' );
            return false;
        }
        //jQuery('.externalLink').hide();
        //jQuery('.done').show();
    });

    // by default page load set carousel to offers
    jQuery("#offers-tab-panel .wrapper").carousel({
        autoSlide: true,
        autoSlideInterval: 5000,
        prevBtn: '<div class="prev"></div>',
        nextBtn: '<div class="next"></div>'
    });
    jQuery("#latest-tab-panel .wrapper").carousel({
        autoSlide: true,
        autoSlideInterval: 5000,
        prevBtn: '<div class="prev"></div>',
        nextBtn: '<div class="next"></div>'
    });
    jQuery("#vouchers-tab-panel .wrapper").carousel({
        autoSlide: true,
        autoSlideInterval: 5000,
        prevBtn: '<div class="prev"></div>',
        nextBtn: '<div class="next"></div>'
    });

    // actions for clicking a tab
    jQuery(".tabs").click( function() {
        // get tab id
        var id = jQuery(this).attr('id');

        // hide all tabs and remove selected
        jQuery('#tabs .offers li').removeClass('selected');
        
        // set selected
        jQuery(this).addClass('selected');

        // hide all panels
        jQuery('#offers-tab-panel').hide();
        jQuery('#latest-tab-panel').hide();
        jQuery('#vouchers-tab-panel').hide();

        // show the panel selected
        jQuery('#' + id + '-panel').show();
        
        return false;
    });

    // default action to select offers tab by default
    
    
    // Rich Menu Jquery JS on Doc Ready
    jQuery('#flexmenuChooseTrack').richMenu({
			effect: 'slide',
			events: 'click', 
			target: jQuery('#flexmenu4'),
			timeout: 100
			});
	  
	jQuery('#flexmenuChooseRace').richMenu({
			effect: 'slide',
			events: 'click', 
			target: jQuery('#flexmenu5'),
			timeout: 100
			});
	  
	jQuery('#tracksMenu').richMenu({
			effect: 'slide',
			events: 'mouseover', 
			target: jQuery('#flexmenu1'),
			timeout: 100
			});
	  
	jQuery('#raceTypesMenu').richMenu({
			effect: 'slide',
			events: 'mouseover', 
			target: jQuery('#flexmenu2'),
			timeout: 100
			});
	  
	jQuery('#infoMenu').richMenu({
			effect: 'slide',
			events: 'mouseover', 
			target: jQuery('#flexmenu10'),
			timeout: 100
			});
	 
	jQuery('#flexmenuCheck').richMenu({
			effect: 'slide',
			events: 'click', 
			target: jQuery('#flexmenu6'),
			timeout: 200,
			onClick: function(elm, menu, trig, event) { 
				event.preventDefault();
				var item = (jQuery(elm).attr('rel')).replace(/\//gi,'');
				var newDiv = jQuery('#fastestLap-'+item).clone().hide();
				var newImgDiv = jQuery('#trackVid-'+item).clone().hide();
				jQuery('#fastestLap').html(newDiv);
				newDiv.fadeIn(1000);
				jQuery('#trackVideo').html(newImgDiv);
				newImgDiv.fadeIn(1000);
			}
	});
	jQuery('#flexMenuGoKarting').richMenu({
        effect: 'slide',
        events: 'mouseover', 
        target: jQuery('#flexmenu7'),
        timeout: 200
    });
    
    // carousel rel links
    jQuery('#gokartingCarousel-rel .wrapper ul').cycle({ 
	    fx: 'scrollRight' 
	});
    
    
    // ajax pagination
	jQuery('#wp_page_numbers a').live('click', function(e){ // if not using wp-page-numbers, change this to correct ID
		e.preventDefault();
		var link = jQuery(this).attr('href').replace(/#\//,'/');
		jQuery('#posts-wrapper').fadeOut(500).load(link + ' #entries-wrapper', function(){ jQuery('#posts-wrapper').fadeIn(500); });
	});	
        
	function checkEmail(email) {
		var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		return filter.test(email);
	}
});
