$(document).ready(function(){
//    if ($('#tabs').length > 0) {
//        $('#tabs').tabs();
//    }
    tooltip.init();
    promo.init();
    racePrice.init();
    utility.init();
	menu.init();
	
	$('#registerPage2').hide();
	
	$('a#Continue').click(function(){
	     var goOn = validation.init('#registerPage1');
		 if(goOn){
			$('#registerPage1').hide('slow');
			$('#registerPage2').show('slow');
		 }	 
	});
	
	$('a#Back').click(function(){
		$('#registerPage2').hide('slow');
		$('#registerPage1').show('slow');
	})

});

$(function () {
	var tabContainers = $('div.tabs > div');
	tabContainers.hide().filter(':first').show();
		$('div.tabs ul.tabNavigation a').click(function () {
			tabContainers.hide();
			tabContainers.filter(this.hash).show();
			$('div.tabs ul.tabNavigation a').removeClass('selected');
			$(this).addClass('selected');
			return false;
  		})
	.filter(':first').click();
});

var menu = {
    init: function(){
        $('#header ul#menu li ul').hide();
        $('#header ul#menu li').hover(
            function () {
                $(this).children('ul').show();
            },function(){
                $(this).children('ul').hide();
            });
    }
}

var utility = {
     init: function(){
        utility.showNewsletter();
    },
    
    popupGreybox: function(title, url){
        GB_showFullScreen(title, url);
    },

    stripNonNumeric: function(str){
        str += '';
        var rgx = /^\d|\.|-$/;
        var out = '';
        for(var i = 0; i < str.length; i++){
            if(rgx.test(str.charAt(i))){
                if(!((str.charAt(i) == '.' && out.indexOf( '.' ) != -1) ||
                    (str.charAt(i) == '-' && out.length != 0))){
                    out += str.charAt(i);
                }
            }
        }
        return out;
    },
    
    showNewsletter: function(){
        $('#newsletterPopup').click(function(){
            $('#overlay').remove();
            var width = $('body').width();
            $('#overlay').height($('body').get(0).scrollHeight + 'px');
            $('#overlay').remove();
            var tellAFriendWidth = $('#newsletter').width();
            var left = (width - tellAFriendWidth) / 2;
            $('#newsletter').css('left', left);
            $('#newsletter').show();

            var overlay = '<div id="overlay" class="ui-widget-overlay" style="z-index: 250;"/>'
            $('body').append(overlay);
            $('html,body').animate({
                scrollTop: 0
            }, 1000);


            return false;
        })

        $('#newsletter #closeNewsletter').click(function(){
            $('#newsletter').hide();
            $('#overlay').remove();
            return false;
        })
    },
    
    faq:  function(){
        $('.faq dd').hide();
        $('.faq dt').click(function(){
            $(this).next('dd').toggle();
        })
    }
}

var rotateBanner = {
    totalRaces: 0,
    currentMarker: 0,
    currentBanner: 0,
    
    init: function(){
        rotateBanner.totalRaces = races.length;
        $('#bannerLeft h1 a').text(races[0].name);
        $('#bannerLeft h2').text(races[0].location);
        //$('#bannerLeft h1 a').attr('href', races[0].url);
        $('#bannerLeft h1 a').attr('href', "/races/");
		if (races[0].begin == races[0].end) {
            $('#bannerLeft span').text(races[0].begin);
        }
        else {
            $('#bannerLeft span').text(races[0].begin + ' - ' + races[0].end);
        }
        $('#bannerLeft img').attr('src', races[0].imageurl);
        rotateBanner.rotate();
    },
    
    rotate: function(){
        if (rotateBanner.totalRaces > 1) {
            setInterval(function(){
                rotateBanner.updateBanner();
            }, 6000);
        }
    },
    
    updateBanner: function(){
        rotateBanner.currentMarker = rotateBanner.currentMarker + 1;
        rotateBanner.currentBanner = rotateBanner.currentBanner + 1;
        
        if (rotateBanner.currentMarker >= rotateBanner.totalRaces) {
            rotateBanner.currentMarker = 0;
        }
        
        /*if(rotateBanner.currentBanner >= rotateBanner.totalBanners){
         rotateBanner.currentBanner = 0;
         }*/
        $('#bannerLeft h1 a').text('');
        $('#bannerLeft span').text('');
        
        $('#bannerLeft img').fadeOut('fast', function(){
            if (races[rotateBanner.currentMarker].imageurl == '') {
                $(this).attr('src', '/webresources/images/banner0.jpg');
            }
            else {
                $(this).attr('src', races[rotateBanner.currentMarker].imageurl);
            }
            
            $(this).fadeIn('slow');
            $('#bannerLeft h1 a').text(races[rotateBanner.currentMarker].name);
            //$('#bannerLeft h1 a').attr('href', races[rotateBanner.currentMarker].url);
			$('#bannerLeft h1 a').attr('href', "/races/");
            $('#bannerLeft h2').text(races[rotateBanner.currentMarker].location);
            if (races[rotateBanner.currentMarker].begin == races[rotateBanner.currentMarker].end) {
                $('#bannerLeft span').text(races[rotateBanner.currentMarker].begin);
            }
            else {
                $('#bannerLeft span').text(races[rotateBanner.currentMarker].begin + ' - ' + races[rotateBanner.currentMarker].end);
            }
        });
    }
}

var pageTasks = {
    sameShippingAddress: function(){
        $('#sameShippingAddress').click(function(){
            if ($(this).attr('checked')) {
                $('#ctl00_ContentPlaceHolder1_ccName').attr('value', $('#ctl00_ContentPlaceHolder1_firstName').attr('value') + ' ' + $('#ctl00_ContentPlaceHolder1_lastName').attr('value'));
                $('#ctl00_ContentPlaceHolder1_ccAddress').attr('value', $('#ctl00_ContentPlaceHolder1_address').attr('value'));
                $('#ctl00_ContentPlaceHolder1_ccCity').attr('value', $('#ctl00_ContentPlaceHolder1_city').attr('value'));
                $('#ctl00_ContentPlaceHolder1_ccStateList').val($('#ctl00_ContentPlaceHolder1_stateList').val());
                $('#ctl00_ContentPlaceHolder1_ccZipCode').attr('value', $('#ctl00_ContentPlaceHolder1_zipCode').attr('value'));
            }
            else {
                $('#ctl00_ContentPlaceHolder1_ccName').attr('value', '');
                $('#ctl00_ContentPlaceHolder1_ccAddress').attr('value', '');
                $('#ctl00_ContentPlaceHolder1_ccCity').attr('value', '');
                $('#ctl00_ContentPlaceHolder1_ccStateList').val(0);
                $('#ctl00_ContentPlaceHolder1_ccZipCode').attr('value', '');
            }
        })
    },
    
    sameShoppingShippingAddress: function(){
        $('#sameShoppingShippingAddress').click(function(){
            if ($(this).attr('checked')) {
                $('#ctl00_ContentPlaceHolder1_Name').attr('value', $('#ctl00_ContentPlaceHolder1_FirstName').attr('value') + ' ' + $('#ctl00_ContentPlaceHolder1_LastName').attr('value'));
                $('#ctl00_ContentPlaceHolder1_SAddress1').attr('value', $('#ctl00_ContentPlaceHolder1_Address1').attr('value'));
                $('#ctl00_ContentPlaceHolder1_SAddress2').attr('value', $('#ctl00_ContentPlaceHolder1_Address2').attr('value'));
                $('#ctl00_ContentPlaceHolder1_SCity').attr('value', $('#ctl00_ContentPlaceHolder1_City').attr('value'));
                $('#ctl00_ContentPlaceHolder1_SStatelist').val($('#ctl00_ContentPlaceHolder1_StateList').val());
                $('#ctl00_ContentPlaceHolder1_SZip').attr('value', $('#ctl00_ContentPlaceHolder1_PostalCode').attr('value'));
            }
            else {
                $('#ctl00_ContentPlaceHolder1_Name').attr('value', '');
                $('#ctl00_ContentPlaceHolder1_SAddress1').attr('value', '');
                $('#ctl00_ContentPlaceHolder1_SAddress2').attr('value', '');
                $('#ctl00_ContentPlaceHolder1_SStatelist').val(0);
                $('#ctl00_ContentPlaceHolder1_SCity').attr('value', '');
                $('#ctl00_ContentPlaceHolder1_SZip').attr('value', '');
            }
        })
    },
    
    deactivateSubmitButton: function(){
        $('.submit').click(function(){
            $('.submit').css('display', 'none');
            $('#loader').removeClass('hidden');
        })
    }
}

var tooltip = {
    init: function(){
        $('.popup').click(function(){
            var id = $(this).attr('rel');
            $('#' + id).dialog({
                title: $(this).attr('title'),
                bgiframe: true,
                modal: true,
                closeOnEscape: true,
                overlay: {
                    backgroundColor: '#000000',
                    opacity: 0.5
                },
                buttons: {
                    Cancel: function(){
                        $(this).dialog('close');
                    }
                }
            });
            $('#' + id).dialog('open');
        })
    }
}


var eventGallery = {
    page: 0,
    totalImages: 0,
    totalPages: 0,
    currentMarker: 0,
    
    init: function(){
        if ($('#galleryPreview').length > 0) {
            eventGallery.setFirstImage();
            eventGallery.activateThumbnails();
            eventGallery.paging();
            eventGallery.totalImages = $('#thumbnail ul img').length;
            eventGallery.totalPages = Math.ceil(eventGallery.totalImages / 6);
            $('.count').text('1 of ' + eventGallery.totalImages);
        }
    },
    
    setFirstImage: function(){
        var thumbPath = $('#thumbnail ul img:first').attr('src');
        var alt = $('#thumbnail ul img:first').attr('alt')
        $('#loader').css('display', '');
        eventGallery.loadImage(thumbPath, alt);
        eventGallery.checkPagingLinks();
    },
    
    checkPagingLinks: function(){
        if (eventGallery.page == 0) {
            $('#thumbnail #previous').addClass('disabled');
        }
        else if (eventGallery.page == eventGallery.totalPages - 1) {
            $('#thumbnail #next').addClass('disabled');
        }
        else {
            $('#thumbnail #previous').removeClass('disabled');
            $('#thumbnail #next').removeClass('disabled');
        }
    },
    
    paging: function(){
        $('#next').click(function(){
            var okToPage = eventGallery.getPagingStatus('next');
            if (okToPage) {
                $('#thumbnail ul').css('display', 'none');
                var currentTop = $('#thumbnail ul').css('top');
                var newTop = parseInt(currentTop) - 220;
                eventGallery.page = eventGallery.page + 1;
                eventGallery.checkPagingLinks();
                $('#thumbnail ul').css('top', newTop + 'px');
                $('#thumbnail ul').show('drop', {
                    direction: 'down'
                }, 500);
            }
            return false;
        })
        $('#previous').click(function(){
            var okToPage = eventGallery.getPagingStatus('previous');
            if (okToPage) {
                eventGallery.page = eventGallery.page - 1;
                eventGallery.checkPagingLinks();
                $('#thumbnail ul').css('display', 'none');
                var currentTop = $('#thumbnail ul').css('top');
                var newTop = parseInt(currentTop) + 220;
                
                $('#thumbnail ul').css('top', newTop + 'px');
                $('#thumbnail ul').show('drop', {
                    direction: 'up'
                }, 500);
            }
            return false;
        })
    },
    
    getPagingStatus: function(direction){
        if (direction == 'next') {
            if (eventGallery.page < (eventGallery.totalPages - 1)) {
                return true;
            }
        }
        else if (direction == 'previous') {
            if (eventGallery.page > 0) {
                return true;
            }
        }
        
    },
    
    activateThumbnails: function(){
        $('#thumbnail ul').click(function(event){
            var target = $(event.target);
            if ($(target).attr('nodeName').toLowerCase() == 'a') {
                target = $('img', target);
                event.preventDefault();
            }
            if ($(target).attr('nodeName').toLowerCase() == 'img') {
                var thumbPath = $(target).attr('src');
                var alt = $(target).attr('alt');
                $('#preview img:eq(1)').fadeOut('fast', function(){
                    $('#loader').css('display', '');
                })
                eventGallery.currentMarker = $('#thumbnail ul img').index(target);
                eventGallery.loadImage(thumbPath, alt);
                return false;
            }
            
        })
    },
    
    loadImage: function(thumbPath, alt){
        $('#preview img:eq(1)').fadeOut('fast', function(){
            $(this).remove();
        })
        var mediumPath = thumbPath.replace(/thumb/, 'medium')
        var img = new Image();
        $(img).load(function(){
            $(this).hide();
            $(this).fadeIn('slow', function(){
            
                $('#preview #loader').after(img);
                var imageWidth = $(this).width();
                var left = (700 - imageWidth) / 2;
                $('#preview p:first').text(alt);
                //$('#preview p').fadeIn('fast');
                $('.count').text(eventGallery.currentMarker + 1 + ' of ' + eventGallery.totalImages);
                $('#preview img:eq(1)').css('margin-left', left);
                $('#loader').css('display', 'none');
            })
        }).attr('src', mediumPath);
    }
}


var account = {
    statusMessage: '',
    
    init: function(){
        account.getSideBar();
        account.getUpcomingEvents();
        account.updateMessage();
    },
    
    updateMessage: function(){
        if (account.statusMessage != '') {
            $('#statusMessage').css('display', '');
            $('#statusMessage').html(account.statusMessage);
        }
    },
    
    getSideBar: function(){
        $.ajax({
            type: "POST",
            url: "/services/userinfo.asmx/GetSideBar",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(result){
                account.populateSideBar(result);
            },
            error: function(xhr, status, error){
                var err = eval("(" + xhr.responseText + ")");
                alert(err.Message)
            }
        });
    },
    
    populateSideBar: function(userInfo){
        $('#myLogin').html(userInfo.Email);
        $('#myNumber').html(userInfo.MemberNumber);
        $('#myExpDate').html(userInfo.MemberExpDate);
        $('#myDivision').html(userInfo.DefaultDivision);
        $('#myClass').html(userInfo.DefaultClass);
    },
    
    getUpcomingEvents: function(){
        $.ajax({
            type: "POST",
            url: "/services/userinfo.asmx/GetUpcomingEvents",
            data: "{'pageNumber':'1','pageSize':'100'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(result){
                account.populateEvents(result);
            },
            error: function(xhr, status, error){
                var err = eval("(" + xhr.responseText + ")");
                alert(err.Message)
            }
        });
    },
    
    populateEvents: function(userEvents){
        if (userEvents.length == 0) {
            $('.display').css('display', 'none');
            $('#noEvents').css('display', '');
        }
        else {
            $('.display').css('display', '');
            $('#noEvents').css('display', 'none');
            $('.display tbody tr').remove();
            for (var i = 0; i < userEvents.length; i++) {
                var html = '';
                var href = '<a href="/races/' + userEvents[i].SeasonName + '/' + userEvents[i].Slug + '.aspx" title="' + userEvents[i].Name + '">' + userEvents[i].Name + '</a>';
                var reg = '';
                
                if (userEvents[i].IsRegistered) {
                    reg = 'Registered';
                }
                else {
                    reg = '<a href="/races/' + userEvents[i].SeasonName + '/' + userEvents[i].Slug + '/Register.aspx" title="Register for' + userEvents[i].Name + '">Register</a>';
                }
                
                html += (i % 2 == 0 ? '<tr class="alt">' : '<tr>');
                html += '<td>' + href + '</td>';
                html += '<td>' + userEvents[i].EventDate + '</td>';
                html += '<td>' + userEvents[i].Location + '</td>';
                html += '<td>' + reg + '</td>';
                html += '</tr>';
                
                $('.display tbody').append(html);
            }
        }
    },

    forgot: function(){
        account.submitEmail();
        $('.forgot').click(function(){
            $('#forgot').dialog({
                title: 'Retrieve your password',
                bgiframe: true,
                modal: true,
                closeOnEscape: true,
                overlay: {
                    backgroundColor: '#000000',
                    opacity: 0.5
                }
            });
            $('#forgot').dialog('open');
            return false;
        })       
    },

    submitEmail: function(){
        $('#submitForgot').click(function(){
            $.ajax({
                type: "POST",
                url: "/services/userinfo.asmx/SendPassword",
                data: "{'email':'" + $('#email').attr('value') + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(result){
                    if(result){
                        $('#forgot').dialog('close');
                        $('#email').attr('value', '');
                        $('#details h1').after('<ul class="information"><li>You password has been sent to the email account you entered.</li></ul>')
                    }
                    else{
                        $('#forgot .form').before('<ul><li>The email you entered was not found in our system.</li></ul>');
                    }
                },
                error: function(xhr, status, error){
                    var err = eval("(" + xhr.responseText + ")");
                    alert(err.Message)
                }
            });
            return false;
        })

        
    }
}

var raceList = {
    currentPage: 1,
    lastPage: 1,
    column: 'Gender',
    direction: 'Asc',
    raceDate: '',
    
    init: function(){
        raceList.getRacerCount();
    },
    
    getRacerCount: function(){
        $.ajax({
            type: "POST",
            url: "/services/raceinfo.asmx/GetRacerCount",
            data: "{'raceKey':'" + raceList.key + "'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(result){
                $('#totalEntrants').text(result);
                raceList.populateRacerCount(result);
            },
            error: function(xhr, status, error){
                var err = eval("(" + xhr.responseText + ")");
                alert(err.Message)
            }
        });
    },
    
    populateRacerCount: function(count){
        var currentDate = new Date();
                
        if (count >= 25) {
            raceList.getRacers(raceList.currentPage);
        }
        else {
            $('#entry_tab .pager').css('display', 'none');
            $('#entry_tab #raceEntrants').css('display', 'none');
            $('#entry_tab').append('<p>Race list is coming soon.</p>');
            $('#paging').css('display', 'none');
        }
        if(raceList.maxEntrants != 0 && currentDate < raceList.raceDate){
            var nearFull = 0.8 * raceList.maxEntrants;
            if(count >= nearFull){
                $('#nearlyFull').removeClass('hidden');
            }
        }        
    },
    
    pageRacers: function(elem, pageNumber){
        if (!$(elem).hasClass('disabled')) {
            raceList.getRacers(pageNumber)
        }
    },
    
    viewAllRacers: function(){
        if ($('#paging').hasClass('all')) {
            $('#paging').removeClass('all').addClass('page');
            $.ajax({
                type: "POST",
                url: "/services/raceinfo.asmx/GetAllRacers",
                data: "{'raceKey':'" + raceList.key + "', 'sortColumn':'" + raceList.column + "', 'sortDirection':'" + raceList.direction + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(result){
                    raceList.populateRacers(result);
                    $('.pager').css('visibility', 'hidden');
                    
                },
                error: function(xhr, status, error){
                    var err = eval("(" + xhr.responseText + ")");
                    alert(err.Message)
                }
            });
            
        }
        else {
            $('#paging').removeClass('page').addClass('all');
            raceList.getRacers(1);
            $('.pager').css('visibility', 'visible');
        } 
    },
    
    getRacers: function(pageNumber){
        raceList.currentPage = pageNumber;
        $.ajax({
            type: "POST",
            url: "/services/raceinfo.asmx/GetRacers",
            data: "{'raceKey':'" + raceList.key + "', 'pageSize':'5', 'pageNumber':'" + pageNumber + "', 'sortColumn':'" + raceList.column + "', 'sortDirection':'" + raceList.direction + "'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(result){
                raceList.populateRacers(result);
            },
            error: function(xhr, status, error){
                var err = eval("(" + xhr.responseText + ")");
                alert(err.Message)
            }
        });
        
        $.ajax({
            type: "POST",
            url: "/services/raceinfo.asmx/GetRacerPageCount",
            data: "{'raceKey':'" + raceList.key + "', 'pageSize':'5'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(result){
                raceList.populateCount(result)
            },
            error: function(xhr, status, error){
                var err = eval("(" + xhr.responseText + ")");
                alert(err.Message)
            }
        });
    },
    
    populateRacers: function(items){
        $('#raceEntrants tbody tr').remove();
        
        if (items.length > 0) {
            var html = '';
            
            for (var i = 0; i < items.length; i++) {
                if (i % 2 == 0) {
                    html += '<tr>';
                }
                else {
                    html += '<tr class="alt">';
                }
                
                html += '<td>' + items[i].FullName + '</td>';
                html += '<td>' + items[i].ClassName + '</td>';
                html += '<td>' + items[i].Gender + '</td>';
                html += '<td>' + items[i].Age + '</td>';
                html += '</tr>';
            }
            
            $('#raceEntrants tbody').append(html);
        }
    },
    
    populateCount: function(result){
        $('#pageList option').remove();
        for (var i = 1; i <= result; i++) {
            var html = '<option value="' + i + '">' + i + '</option>';
            $('#pageList').append(html);
        }
        $('#pageList').val(raceList.currentPage);
        
        raceList.lastPage = result;
        if (raceList.currentPage == 1) {
            $('#firstPage').attr('class', 'disabled');
            $('#prevPage').attr('class', 'disabled');
        }
        else {
            $('#firstPage').attr('class', '');
            $('#prevPage').attr('class', '');
        }
        
        if (raceList.currentPage == raceList.lastPage) {
            $('#lastPage').attr('class', 'disabled');
            $('#nextPage').attr('class', 'disabled');
        }
        else {
            $('#lastPage').attr('class', '');
            $('#nextPage').attr('class', '');
        }
    },
    
    sortProducts: function(name){
        raceList.column = name;
        if (raceList.direction == 'Desc') {
            raceList.direction = 'Asc';
        }
        else {
            raceList.direction = 'Desc';
        }
        
        raceList.getRacers(raceList.currentPage);
    }
}

var loginUtility = {
    init: function(){
        //loginUtility.getStatus();
        loginUtility.getCart();

    },
    
    getCart: function(){
        $.ajax({
            type: "POST",
            url: "/services/userinfo.asmx/GetCart",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(result){
                loginUtility.populateCart(result);
            },
            error: function(xhr, status, error){
                var err = eval("(" + xhr.responseText + ")");
                alert(err.Message)
            }
        });
    },
    
    populateCart: function(cart){
        if (cart != 0) {
            $('#cart').append($('<li><a href="/cart/">Items in Cart: ' + cart + '</a></li>'));
        }
    },
    
    getStatus: function(){
        $.ajax({
            type: "POST",
            url: "/services/userinfo.asmx/GetLoginStatus",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(result){
                loginUtility.populateLogin(result);
            },
            error: function(xhr, status, error){
                var err = eval("(" + xhr.responseText + ")");
                alert(err.Message)
            }
        });
    },
    
    populateLogin: function(firstName){
        $('#utility li').remove();
        
        if (firstName.length != 0) {
            $('#utility').append($('<li class=name></li>').text('Welcome ' + firstName));
            $('#utility').append($('<li></li>').html('<a href="/account" title="My Account">My Account</a>'));
            $('#utility').append($('<li></li>').html('<a href="/signout.aspx" title="Logout">Logout</a>'));
        }
        else {
            $('#utility').append($('<li></li>').html('<a href="/signin.aspx" title="Login">Login</a>'));
        }

        //just check for the free stuff
        
        if(validation.checkEvent == true){
            validation.checkEventType();
        }
    }
}


var validation = {
	div: '',
	
    init: function(div) {
		
		if(div != ''){
			validation.div = div;
			$('.required', div).blur(function() {
            	validation.nonempty($(this));
        	})
        
			$('.email', div).blur(function() {
				validation.email($(this));
			})
			
			$('.zipcode', div).blur(function() {
				validation.zipcode($(this));
			})
			
			$('.selection', div).blur(function() {
				validation.selection($(this));
			})
					
			$('.creditCard', div).blur(function() {
				validation.creditCard($(this));
			});
		}
		else{
			$('.required').blur(function() {
            	validation.nonempty($(this));
        	})
        
			$('.email').blur(function() {
				validation.email($(this));
			})
			
			$('.zipcode').blur(function() {
				validation.zipcode($(this));
			})
			
			$('.selection').blur(function() {
				validation.selection($(this));
			})
					
			$('.creditCard').blur(function() {
				validation.creditCard($(this));
			});
		}
        
        var numIssues = validation.submit_form();
        if (numIssues > 0) {
            return false;
        }
        else {
            return true;
        }
    },

    email: function(elem) {
        var re = /^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([;.](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$/;
        var result = re.exec($(elem).attr('value'));
        if (result == null) {
            validation.clear(elem);
            $(elem).addClass('issue')
            $(elem).after('<span class="message">You need to include a valid email</span>')

        }
        else {
            if ($('#utility li.name').length == 0) {
                $.ajax({
                    type: "POST",
                    url: "/services/userinfo.asmx/CheckEmail",
                    data: "{'email':'" + $(elem).attr('value') + "'}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(result){
                        if(result){
                            $(elem).after('<span class="message">This email has already been registered as a member</span>')
                        }
                        else{
                            validation.clear(elem);
                        }
                    },
                    error: function(xhr, status, error){
                        var err = eval("(" + xhr.responseText + ")");
                        alert(err.Message)
                    }
                })
            }
            
        }

    },

    zipcode: function(elem) {
        var re = /^\d{5}(-\d{4})?$/;
        var result = re.exec($(elem).attr('value'));
        if (result == null && $(elem).is(':enabled')) {
            validation.clear(elem);
            $(elem).addClass('issue')
            $(elem).after('<span class="message">You need to include a valid zipcode</span>')
        }
        else {
            validation.clear(elem);
        }
    },

    nonempty: function(elem) {
        if ($(elem).attr('value') == '' && $(elem).is(':enabled')) {
            validation.clear(elem);
            $(elem).addClass('issue')
            $(elem).after('<span class="message">This field cannot be empty</span>')
        }
        else {
            validation.clear(elem);
        }
    },

    selection: function(elem) {
        if ($(elem).val() == 0 && $(elem).is(':enabled')) {
            validation.clear(elem);
            $(elem).addClass('issue')
            $(elem).after('<span class="message">You need to make a selection.</span>')
        }
        else {
            validation.clear(elem);
        }
    },

    terms: function(elem) {
        if ($('input', elem).attr('checked') == true) {
            $('input', elem).attr('checked', 'checked');
            validation.clear(elem);
        }
        else {
            $('input', elem).attr('checked', '');
            validation.clear(elem);
            $(elem).addClass('issue')
            $(elem).parent('label').after('<span class="message">You need to agree to the waiver before continuing.</span>')
        }
    },

    creditCard: function(elem) {
        var ccNumb = $(elem).attr('value');
        var valid = "0123456789" // Valid digits in a credit card number
        var len = ccNumb.length; // The length of the submitted cc number
        var iCCN = parseInt(ccNumb); // integer of ccNumb
        var sCCN = ccNumb.toString(); // string of ccNumb
        sCCN = sCCN.replace(/^s+|s+$/g, ''); // strip spaces
        var iTotal = 0; // integer total set at zero
        var bNum = true; // by default assume it is a number
        var bResult = false; // by default assume it is NOT a valid cc
        var temp; // temp variable for parsing string
        var calc; // used for calculation of each digit
        for (var j = 0; j < len; j++) {
            temp = "" + sCCN.substring(j, j + 1);
            if (valid.indexOf(temp) == "-1") {
                bNum = false;
            }
        }
        if (!bNum) {
            bResult = false;
        }
        if ((len == 0) && (bResult)) {
            bResult = false;
        }
        else {
            if (len >= 15) {
                for (var i = len; i > 0; i--) { // LOOP throught the digits of the card
                    calc = parseInt(iCCN) % 10; // right most digit
                    calc = parseInt(calc); // assure it is an integer
                    iTotal += calc; // running total of the card number as we loop - Do Nothing to first digit
                    i--; // decrement the count - move to the next digit in the card
                    iCCN = iCCN / 10; // subtracts right most digit from ccNumb
                    calc = parseInt(iCCN) % 10; // NEXT right most digit
                    calc = calc * 2; // multiply the digit by two
                    switch (calc) {
                        case 10:
                            calc = 1;
                            break; //5*2=10 & 1+0 = 1
                        case 12:
                            calc = 3;
                            break; //6*2=12 & 1+2 = 3
                        case 14:
                            calc = 5;
                            break; //7*2=14 & 1+4 = 5
                        case 16:
                            calc = 7;
                            break; //8*2=16 & 1+6 = 7
                        case 18:
                            calc = 9;
                            break; //9*2=18 & 1+8 = 9
                        default:
                            calc = calc; //4*2= 8 &   8 = 8  -same for all lower numbers
                    }
                    iCCN = iCCN / 10;
                    iTotal += calc;
                }
                if ((iTotal % 10) == 0) {
                    bResult = true;
                }
                else {
                    bResult = false;
                }
            }
        }
        //if ($('#registrationFee').text().toLowerCase() != 'free' && $('#registrationFee').text().toLowerCase() != '$0.00') {
        
        if (!bResult && $(elem).is(':enabled')) {
            validation.clear(elem);
            $(elem).addClass('issue');
            $(elem).after('<span class="message">You need to use a valid credit card.</span>')
        }
        else {
            validation.clear(elem);
        }
    },

    expirationMonth: function(elem) {
        var expMonth = $(elem).val();
        var expYear = $('.expYear').val();
        validation.expiration(expMonth, expYear);
    },

    expirationYear: function(elem) {
        var expMonth = $('.expMonth').val();
        var expYear = $(elem).val();
        validation.expiration(expMonth, expYear);
    },

    expiration: function(expMonth, expYear) {
        var date = new Date();
        var month = date.getMonth() + 1;
        var year = date.getFullYear();
        if ((expMonth < month) && (expYear < year)) {
            validation.clear(elem);
            $(elem).addClass('issue');
            $(elem).after('<span class="message">You need to use a valid credit card.</span>')
        }
    },

    clear: function(elem) {
        $(elem).removeClass('issue');
        $(elem).next('.message').remove();
        $(elem).parent('label').next('.message').remove();
    },

    submit_form: function() {
		if(validation.div != ''){
			$('.form input, .form textarea, .form select', validation.div).trigger('blur');
		}
		else{
			$('.form input, .form textarea, .form select').trigger('blur');
		}
        
        validation.terms($('.terms'));

        validation.checkEventType();
		if(validation.div != ''){
        	var issues = $('.form .issue', validation.div).length;
		}
		else{
			var issues = $('.form .issue').length;
		}
        if (issues != 0) {
            $('.form .issue:eq(0)').focus();
            return issues;
        }
        else {
            return 0;
        }
    },

    checkEventType: function() {
        if ($('#utility li.name').length > 0) {
            $('#loginInfo').hide();
            if($('.buyMisc input').length > 0){
                if($('.buyMisc input').attr('checked')){
                    if ($('#registrationFee').text().toLowerCase() == 'free' || $('#registrationFee').text().toLowerCase() == '0.00') {
                        $('#formRaceFee .required, #formRaceFee .email, #formRaceFee .zipcode, #formRaceFee .creditCard, #formRaceFee .selection').removeAttr('disabled');
                        $('#formRaceFee .required, #formRaceFee .email, #formRaceFee .zipcode, #formRaceFee .creditCard, #formRaceFee .selection').removeClass('disabled');
                    }
                }
                else{
                    if ($('#registrationFee').text().toLowerCase() == 'free' || $('#registrationFee').text().toLowerCase() == '0.00') {
                        $('#formRaceFee .required, #formRaceFee .email, #formRaceFee .zipcode, #formRaceFee .creditCard, #formRaceFee .selection').attr('disabled', 'disabled');
                        $('#formRaceFee .required, #formRaceFee .email, #formRaceFee .zipcode, #formRaceFee .creditCard, #formRaceFee .selection').addClass('disabled');
                    }                
                }
            }
            else{
                if ($('#registrationFee').text().toLowerCase() == 'free' || $('#registrationFee').text().toLowerCase() == '0.00') {
                    $('#formRaceFee .required, #formRaceFee .email, #formRaceFee .zipcode, #formRaceFee .creditCard, #formRaceFee .selection').attr('disabled', 'disabled');
                    $('#formRaceFee .required, #formRaceFee .email, #formRaceFee .zipcode, #formRaceFee .creditCard, #formRaceFee .selection').addClass('disabled');
                }
            }
        }
    }
}

var raceMetadata = {
    defaultDivision: 0,
    defaultClass: 0,

    init: function() {
        raceMetadata.defaultDivision = $('#ctl00_ContentPlaceHolder1_defaultDivision').attr('value');
        raceMetadata.defaultClass = $('#ctl00_ContentPlaceHolder1_defaultClass').attr('value');
        raceMetadata.setupEvents();
        raceMetadata.getDivisions();
        raceMetadata.buyMisc();
        
        //hackish way to set the first element that is not the select to be preselected for event registration
        setTimeout(function() {
            if (raceMetadata.selectFirst === true) {
                var secondOption = $('.divisionList option:eq(1)').attr('value');
                if (typeof (secondOption) !== 'undefined') {
                    $('.divisionList').val(secondOption);
                    $('.divisionList').trigger('change');
                }
            }

        }, 1000)

        if ($('#utility li.name').length > 0) {
            $('#loginInfo').hide();
        }

        if($('#ctl00_ContentPlaceHolder1_miscFee').length > 0){
            var miscFee = $('#ctl00_ContentPlaceHolder1_miscFee').attr('value');

            if(miscFee == "$0.00"){
                $('#misc').hide();
            }
        }
        
    },


    buyMisc: function(){
        $('.buyMisc input').click(function(){
            if($(this).attr('checked')){
                if ($('#registrationFee').text().toLowerCase() == 'free' || $('#registrationFee').text().toLowerCase() == '0.00') {
                    $('#formRaceFee .required, #formRaceFee .email, #formRaceFee .zipcode, #formRaceFee .creditCard, #formRaceFee .selection').removeAttr('disabled');
                    $('#formRaceFee .required, #formRaceFee .email, #formRaceFee .zipcode, #formRaceFee .creditCard, #formRaceFee .selection').removeClass('disabled');
                }
            }
            else{
                if ($('#registrationFee').text().toLowerCase() == 'free' || $('#registrationFee').text().toLowerCase() == '0.00') {
                    $('#formRaceFee .required, #formRaceFee .email, #formRaceFee .zipcode, #formRaceFee .creditCard, #formRaceFee .selection').attr('disabled', 'disabled');
                    $('#formRaceFee .required, #formRaceFee .email, #formRaceFee .zipcode, #formRaceFee .creditCard, #formRaceFee .selection').addClass('disabled');
                }
            }
        })
    },

    getDivisions: function() {
        if (raceMetadata.raceKey != undefined) {
            $.ajax({
                type: "POST",
                url: "/services/divisions.asmx/GetDivisionsByRace",
                data: "{'raceKey':'" + raceMetadata.raceKey + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(result) {
                    if (result.length > 0) {
                        raceMetadata.populateDivisions(result);
                    }
                    else {
                        $.ajax({
                            type: "POST",
                            url: "/services/divisions.asmx/GetDivisions",
                            data: "{}",
                            contentType: "application/json; charset=utf-8",
                            dataType: "json",
                            success: function(result) {
                                raceMetadata.populateDivisions(result);
                            },
                            error: function(xhr, status, error) {
                                var err = eval("(" + xhr.responseText + ")");
                                alert(err.Message)
                            }
                        });
                    }
                },
                error: function(xhr, status, error) {
                    var err = eval("(" + xhr.responseText + ")");
                    alert(err.Message)
                }
            });
        }
        else {
            $.ajax({
                type: "POST",
                url: "/services/divisions.asmx/GetDivisions",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(result) {
                    raceMetadata.populateDivisions(result);
                },
                error: function(xhr, status, error) {
                    var err = eval("(" + xhr.responseText + ")");
                    alert(err.Message)
                }
            });
        }
    },


    populateDivisions: function(divisions) {
        $('.divisionList').append($('<option value="0">Select...</option>'));
        for (var i = 0; i < divisions.length; i++) {
            $('.divisionList').append($('<option></option>').val(divisions[i].Key).html(divisions[i].Name));
        }
        $('.divisionList').val(raceMetadata.defaultDivision);
        raceMetadata.getClasses();
    },

    getClasses: function() {
        var division = $('.divisionList').val();
        $.ajax({
            type: "POST",
            url: "/services/divisions.asmx/GetClasses",
            data: "{'divisionKey':'" + division + "'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(result) {
                raceMetadata.populateClasses(result);

            },

            error: function(xhr, status, error) {
                var err = eval("(" + xhr.responseText + ")");
                alert(err.Message)
            }
        });
    },

    populateClasses: function(classes) {
        $('.classList option').remove();
        $('.classList').append($('<option value="0">Select...</option>'));
        for (var i = 0; i < classes.length; i++) {
            $('.classList').append($('<option></option>').val(classes[i].Key).html(classes[i].Name));
        }
        $('.classList').val(raceMetadata.defaultClass);
    },

    setupEvents: function() {
        $('.divisionList').change(function() {
            raceMetadata.getClasses();
        })
    },

    setStatus: function() {
        $('#ctl00_ContentPlaceHolder1_defaultClass').attr('value', $('.classList').val());
        $('#ctl00_ContentPlaceHolder1_defaultDivision').attr('value', $('.divisionList').val());
    }
}

var promo ={
    init: function(){
        $('.promoCode').blur(function(){
            var code = $(this).attr('value');
            if(code.length > 0){
                $.ajax({
                    type: "POST",
                    url: "/services/raceinfo.asmx/GetDiscount",
                    data: "{'promoCode':'" + code + "'}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(result){

                        if(result > 0){
                            var memberFee = utility.stripNonNumeric($('#registrationFee').text());
                            var nonMemberFee = utility.stripNonNumeric($('#nonMemberRegistrationFee').text());
                            var memberFee = promo.memberFee;
                            var nonMemberFee = promo.nonMemberFee;
                            var newMemberFee = memberFee - (result * memberFee);
                            var newNonMemberFee = nonMemberFee - (result * nonMemberFee);
                            if(newMemberFee == 0){
                                $('#registrationFee').text('FREE');
                            }
                            else{
                                $('#registrationFee').text('$' + newMemberFee.toFixed(2));
                            }
                            if(newNonMemberFee == 0){
                                $('#nonMemberRegistrationFee').text('FREE');
                            }
                            else{
                                $('#nonMemberRegistrationFee').text('$' + newNonMemberFee.toFixed(2));
                            }
                            $('#promoMessage').remove();
                            $('.promoCode').after('<span id="promoMessage">Your promo code has been applied.</span>')
                        }
                        else{
                            $('#promoMessage').remove();
                            $('.promoCode').after('<span id="promoMessage">You have used an invalid promo code.</span>')
                        }
                    },

                    error: function(xhr, status, error){
                        var err = eval("(" + xhr.responseText + ")");
                        alert(err.Message)
                    }
                });
            }
        })
    }
  } 
    var racePrice = {
    init: function(){
        $('.racePrice').change(function(){
            var id = $(this).attr('value');
            if(id.length > 0){
                $.ajax({
                    type: "POST",
                    url: "/services/raceinfo.asmx/GetPricing",
                    data: "{'Key':'" + id + "'}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(result){
                        racePrice.populatePrice(result);  
                    },

                    error: function(xhr, status, error){
                        var err = eval("(" + xhr.responseText + ")");
                        alert(err.Message)
                    }
                });
            }
        })
    },
    
     populatePrice: function(price) {
        $('#registrationFee').text('$' + price.MemberPrice.toFixed(2));
        $('#nonMemberRegistrationFee').text('$' + price.NonMemberPrice.toFixed(2));
        promo.memberFee = utility.stripNonNumeric($('#registrationFee').text());
        promo.nonMemberFee = utility.stripNonNumeric($('#nonMemberRegistrationFee').text());
        
        if ($('#utility li.name').length > 0) {
            if (price.MemberPrice.toFixed(2) == '0.00')
            {
                $('#raceFee input').each(function() {
                    $(this).removeClass('required');
                    $(this).attr('disabled', 'disabled');
                });
                
                $('#raceFee select').each(function() {
                    if ($(this).attr('id') != 'ctl00_ContentPlaceHolder1_PriceList' && $(this).attr('id') != 'ctl00_ContentPlaceHolder1_MemberPriceList')
                    {
                        $(this).removeClass('required');
                        $(this).attr('disabled', 'disabled');
                    }
                });
                
                $('#paymentSection').hide();
            }
        } else {
            if (price.NonMemberPrice.toFixed(2) == '0.00')
            {
                $('#raceFee input').each(function() {
                    $(this).removeClass('required');
                    $(this).attr('disabled', 'disabled');
                });
                
                $('#raceFee select').each(function() {
                    if ($(this).attr('id') != 'ctl00_ContentPlaceHolder1_PriceList' && $(this).attr('id') != 'ctl00_ContentPlaceHolder1_MemberPriceList')
                    {
                        $(this).removeClass('required');
                        $(this).attr('disabled', 'disabled');
                    }
                });
                
                $('#paymentSection').hide();
            }
        }
       
    }

}

function cancelGB_Window(){
    window.parent.window.parent.location.reload();
}


function closeGB_Window(){
    window.parent.window.parent.GB_hide();
}

var sponsorTags = {
    tagContainer: '#tags',
    hiddenTags: '#ctl00_ContentPlaceHolder1_Tags',
    listOfTags: '#listOfTags',
    selectedTags: '#selectedTags',

    init: function(){
        sponsorTags.getAllTags();
        sponsorTags.getCategoryTags();
        sponsorTags.saveCategoryTags();
        sponsorTags.deleteCategoryTag();
    },

    getAllTags: function(){
        $.ajax({
            type: "POST",
            url: "/services/sponsors.asmx/GetTags",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(result) {
                if(result > 0){
                    var allTags = [];
                    for(var i=0; i<result.length; i++){
                        allTags.push(result[i].Tag);
                    }

                    $(sponsorTags.selectedTags).autocomplete(allTags, {
                        width: 170,
                        maxItemsToShow: 4,
                        highlight: false,
                        multiple: true,
                        multipleSeparator: " ",
                        scroll: true,
                        scrollHeight: 150
                    });
                }
            },
            error: function(xhr, status, error) {
                var err = eval("(" + xhr.responseText + ")");
                alert(err.Message)
            }
        });
    },

    
    getCategoryTags: function(){
        var list = $(sponsorTags.hiddenTags).val();
        if(list.length > 0){
            list = list.split(';');
            var lis = '';
            for(var i=0; i<list.length; i++){
                lis = lis + sponsorTags.buildTag(list[i]);
            }
            $(sponsorTags.listOfTags).append(lis);
        }
    },

    saveCategoryTags: function(){
        $(sponsorTags.selectedTag).keypress(function(event){
            if(event.keyCode == 13){
                var newTag = $.trim($(sponsorTags.selectedTags).val());
                $(sponsorTags.listOfTags).append(sponsorTags.buildTag(newTag));
                $(sponsorTags.selectedTags).val('');
                sponsorTags.updateHiddenTags();
                return false;
            }
        })
    },

    updateHiddenTags: function(){
        $(sponsorTags.hiddenTags).val('');
        $('li', sponsorTags.listOfTags).each(function(){
            $(sponsorTags.hiddenTags).val($(sponsorTags.hiddenTags).val() + $(this).text() + ';');
        })
    },

    deleteCategoryTag: function(){
        $(sponsorTags.listOfTags).click(function(event){
            var target = $(event.target);
            if($(target).attr('nodeName').toLowerCase() == 'img'){
                var parent = $(target).parents('li');
                if(parent.length > 0){
                    $(parent).remove();
                    sponsorTags.updateHiddenTags();
                }
            }
            return false;
        })
    },

    buildTag: function(title){
        return '<li>'+ title + '<a href="#" class="delete"><img src="/webresources/images/icons/close.gif" alt="" /></a></li>';
    }
}

var raceTags = {
    tagContainer: '#tags',
    hiddenTags: '#ctl00_ContentPlaceHolder1_Tags',
    listOfTags: '#listOfTags',
    selectedTags: '#selectedTags',

    init: function(){
        raceTags.getAllTags();
        raceTags.getCategoryTags();
        raceTags.saveCategoryTags();
        raceTags.deleteCategoryTag();
    },

    getAllTags: function(){
        $.ajax({
            type: "POST",
            url: "/services/raceinfo.asmx/GetTags",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(result) {
                if(result.length > 0){
                    var allTags = [];
                    for(var i=0; i<result.length; i++){
                        allTags.push(result[i].Tag);
                    }

                    $(raceTags.selectedTags).autocomplete(allTags, {
                        width: 170,
                        maxItemsToShow: 4,
                        highlight: false,
                        multiple: true,
                        multipleSeparator: " ",
                        scroll: true,
                        scrollHeight: 150
                    });
                }
            },
            error: function(xhr, status, error) {
                var err = eval("(" + xhr.responseText + ")");
                alert(err.Message)
            }
        });
    },

    
    getCategoryTags: function(){
        var list = $('#ctl00_ContentPlaceHolder1_Edit1_Tags').val();
        
        if(list != undefined){
            if(list.length > 0){
                list = list.split(';');
                var lis = '';
                for(var i=0; i<list.length; i++){
                    lis = lis + raceTags.buildTag(list[i]);
                }
                $(raceTags.listOfTags).append(lis);
            }
        }        
    },

    saveCategoryTags: function(){
        $(raceTags.selectedTag).keypress(function(event){
            if(event.keyCode == 13){
                var newTag = $.trim($(raceTags.selectedTags).val());
                $(raceTags.listOfTags).append(raceTags.buildTag(newTag));
                $(raceTags.selectedTags).val('');
                raceTags.updateHiddenTags();
                return false;
            }
        })
    },

    updateHiddenTags: function(){
        $('#ctl00_ContentPlaceHolder1_Edit1_Tags').val('');
        $('li', raceTags.listOfTags).each(function(){
            $('#ctl00_ContentPlaceHolder1_Edit1_Tags').val($('#ctl00_ContentPlaceHolder1_Edit1_Tags').val() + $(this).text() + ';');
        })
    },

    deleteCategoryTag: function(){
        $(raceTags.listOfTags).click(function(event){
            var target = $(event.target);
            if($(target).attr('nodeName').toLowerCase() == 'img'){
                var parent = $(target).parents('li');
                if(parent.length > 0){
                    $(parent).remove();
                    raceTags.updateHiddenTags();
                }
            }
            return false;
        })
    },

    buildTag: function(title){
        return '<li>'+ title + '<a href="#" class="delete"><img src="/webresources/images/icons/close.gif" alt="" /></a></li>';
    }
}