﻿// Everything pulled out of the head on the main page

// Google Analytics
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-875444-10']);
_gaq.push(['_trackPageview']);
(function () {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();


$(function() {
    if(jQuery.browser.mozilla && jQuery.browser.version == '2.0.1') 
        jQuery('head').append('<link rel="stylesheet" href="/Content/firefox4-overrides.css" type="text/css">');

    if(jQuery.browser.msie && parseFloat(jQuery.browser.version) >= 9.0) 
        jQuery('head').append('<link rel="stylesheet" href="/Content/ie9-overrides.css" type="text/css">');
    
    // IE7 Hacks
    if ($.browser.msie && $.browser.version < 8)
    {
        // If the new non-seizure way of doings is good, we don't need this code anymore.
//        // IE7 does not support display: table and such.
//        $("div.tablecell").wrap("<td />");
//        $("div.tablerow").wrap("<tr />");
//        $("div.table").wrapInner("<table />");

//        // IE7 can't handle anything.
//        var resetSize = function() {
//            var padding = ($(window).width() - $('.main-col.center-col').width()) / 2 - 30;
//            $('.main-col.left-col, .main-col.right-col').width(padding);
//        };
//        $(window).resize(resetSize);
//        resetSize();

//        // On the school profile page, AJAX calls change the height. This should help.
//        setTimeout(function() {
//            $('.main-col.left-col, .main-col.right-col').height($('.main-col.left-col').parent().height());
//        }, 200);
        
    } 
    else
    {
        // AddThis adds an iFrame which completely hoses IE7. Only load it if we are not IE7
        addthis.init();
        addthis.addEventListener('addthis.menu.share', shareEventHandler);
    }


    // Create an attribute to store our original source image
    $('img.hover-replace').each(function () {
        $(this).attr('originalimage', $(this).attr('src'));
    })
    .mouseover(function () {
        $(this).attr('src', $(this).attr('hoverimage'));
    })
    .mouseout(function () {
        $(this).attr('src', $(this).attr('originalimage'));
    });

    $('.open-book-menu, a[href="#open-book-menu"]').click(function (evt) {
        evt.stopPropagation();
        evt.preventDefault();
        $('html, body').animate({scrollTop:0}, 'slow');
        $('#mega-label-books').trigger('click');
    });

    $('.open-college-gear-menu, a[href="#open-college-gear-menu"]').click(function (evt) {
        evt.stopPropagation();
        evt.preventDefault();
        $('html, body').animate({scrollTop:0}, 'slow');
        $('#mega-label-gear').trigger('click');
    });

    $('#store-list-pulldown-link').click(function (e) {
        toggleStoreList(e);
    });
});

// TODO To clean this up, I think it'd be great if we could start taking variables
//      and functions out of the global namespace and putting them in _app

var headerPaddingOffset = 7;
var headerHeight = 0;

var _app =
{
    onload: function () {
        var _this = _app;

        $.support.placeholder = 'placeholder' in document.createElement('input');

        $('div#search-form input.search-term').autoSearch();
        $('input#powerbar-search-input').autoSearch();
        $('div#megamenu-books input.megamenu-search').autoSearch();
        headerHeight = getHeaderHeight();
        _this.cart.init();

        $('.helpme, .help').cluetip({ width: 358, dropShadow: false, positionBy: 'auto' });

        $('ul#breadcrumb a').click(function () {
            if ($(this).attr('href') == '#') {
                return false;
            }
        });

        Cufon.replace('#footer h4', { }); //textShadow: '#a6be2a 1px 1px'
        Cufon.replace('.featured-product-info *');

        var megaMenuSpeed = 250;
        var stopProp = function (event) { event.stopPropagation(); };
        var dialogs = $('div.pulldown-body')
                        .add('div#my-cart div.popout')
                        .add('div#megamenu-books div.popout')
                        .add('div#megamenu-gear div.popout')
                        .add('form .add-a-school')
            .click(stopProp)
            .each(function (i, el) {
                $(el).data('closeId', i);
            });
        var closeDialogs = function (ignore) {
            var ignoreId = (ignore) ? ignore.data('closeId') : '-1';
            dialogs.each(function (i, el) {
                var dialog = $(el);
                if (dialog.data('closeId') == ignoreId) return;
                dialog.hide((dialog.parents('#megamenu').length) ? megaMenuSpeed : null)
                    .siblings('div.pulldown-button:first').removeClass('pulldown-button-on');
            });
        };

        var thisWillMakeYouCryWhenYouTryToFigureItOut = function () {
            // This removes categories when there isn't enough room to display them.
            // Optimally, we'd drop the least popular catgories. However, this algorithm 
            // may actually end up dropping one or two categories that may not be the 
            // least popular of those shown, but won't be the most popular, either.
            // Altering it to always select exactly the most popular items seemed like
            // it would take too long considering the relatively unimportant nature of
            // the original bug. If you're reading this, I was probably wrong about that.
            $(this).removeAttr('init');
            var megaMenuCategoryRowCount = 7;
            var moreCategoriesLink = $('#gears-more-categories');
            var megaMenuCategoryRowHeight = moreCategoriesLink.parent().height();
            var droppedRows = $([]);
            $('#megamenu-gear .popout .col-1 ul').each(function (columnIndex, ul) {
                var $ul = $(ul).prepend(droppedRows);
                droppedRows = $([]);
                var categories = $ul.children('li');
                var rowCount = 0;
                categories.each(function (rowIndex, li) {
                    var $li = $(li);
                    var rows = ($li.height() == megaMenuCategoryRowHeight) ? 1 : 2;
                    $li.attr('rows', rows);
                    rowCount += rows;
                });
                if (rowCount > 7) {
                    var sorted = categories.sort(function (first, second) { return (first.getAttribute('popularity') - 0) - (second.getAttribute('popularity') - 0); }).toArray();
                    while (rowCount > 7) {
                        var droppedRow = $(sorted.pop()).detach();
                        rowCount -= (droppedRow.attr('rows') - 0);
                        droppedRows = droppedRows.add(droppedRow);
                    }
                }
            });
            if (!moreCategoriesLink.length) return;
            var newCategoryCount = (moreCategoriesLink.text().match(/^\s*([\d]+)\s*more categor/)[1] - 0)
                + droppedRows.length;
            moreCategoriesLink.text(newCategoryCount.toString() + ' more categor' + (newCategoryCount == 1 ? 'y' : 'ies'));
        };

        var megaMenuClickHandler = function (evt) {
            var whichMenu = /^mega-label-(books|gear)$/.exec(evt.target.id);
            if (!(whichMenu && whichMenu.length >= 2)) return;
            var menu = $('#megamenu-' + whichMenu[1] + ' div.popout');
            if (menu.is(':visible'))
                menu.hide(megaMenuSpeed);
            else
                menu.show(megaMenuSpeed);
            //if (menu.attr('init') == 'true') thisWillMakeYouCryWhenYouTryToFigureItOut();
            stopProp(evt);
            closeDialogs(menu);
            evt.preventDefault();
        };
        $('#mega-label-books').add('#mega-label-gear').click(megaMenuClickHandler);
        $('#megamenu-gear div.popout').attr('init', 'true');

        var popoutClickHandler = function (event) {
            var dialog = event.data.isPulldown
                        ? $(event.target).closest('div.pulldown-button').siblings('div.pulldown-body:first')
                        : event.data.dialog;
            var IsSlideUpMiniCart = (event.target.id.indexOf('mycart-dropdown-link') != -1);
            toggle(dialog, IsSlideUpMiniCart);
            stopProp(event);
            closeDialogs(dialog);
            if (event.data.isPulldown) $(this).parent().parent().toggleClass('pulldown-button-on');
        };
        var pulldowns = $('div.pulldown-button span a.nodec').bind('click', { isPulldown: true }, popoutClickHandler);
        $('#mycart-dropdown-link').bind("click", { dialog: $('div#my-cart div.popout') }, popoutClickHandler);

        $('#add-schools').click(function (event) {
            stopProp(event);

            if ($('li').not('.no-container').length > 0) {
                $('form div.add-a-school').addClass('filter-present');
            } else {
                $('form div.add-a-school').removeClass('filter-present');
            }

            closeDialogs($('form .add-a-school').show());
            event.preventDefault();
        });

        $(document.body).click(function (event) {
            var target = $(event.target);
            if (target.parent('a.ui-corner-all').length) return false;
            closeDialogs();
        });

        initSchoolAffiliation();

        $('a#signOnButton').click(function () { $(this).closest('form').trigger('submit'); return false; });
    } // End OnLoad function
}; 

_app.cart = {
    init: function () {
        this.initScroll();
    },

    initScroll: function () {
        $(window).scroll(function () {
            initSliderLocation($(this));
        });
    }
};

//todo: preload only once
function preloadImages(arrayOfImages) {
    $(arrayOfImages).each(function () {
        //$('<img/>')[0].src = this;
        // Alternatively you could use:
        (new Image()).src = this;
    });
}

function setCartSummary() {
    var myCart = $('div#my-cart');
    
    myCart.children('p.info').html(myCart.find('div.popout p.hide').html());
    
    $('div#my-cart a.remove-item').click(function (evt) {
        evt.preventDefault();
        deleteCartItem($(this).attr('href'));
    });
    
    $('div#my-cart a.remove-course').click(function (evt) {
        evt.preventDefault();
        deleteCartCourse($(this).attr('href'));
    });    
}

function noClick(selector) {
//    $(selector).click(function () { return false; });
}

function setMegaMenuClick(selector,menu) {
//    $(selector).click(function () { return toggleMegaMenu(menu); });
}

function getHeaderHeight() {
    //var headerDiv = $('#masthead-content');
    //return headerDiv.outerHeight() - headerPaddingOffset;
    var offset = $('#my-cart').offset();
    if(offset)
        return offset.top + 30;
    else 
        return 0;
}

function initSliderLocation(window) {
    var cartSlider = $('#my-cart div.popout');
    if (window.scrollTop() > headerHeight) {
        if (cartSlider.css('position') != 'fixed') {
            cartSlider.css('position', 'fixed').css('top', '0');
        }
    }
    else {
        if (cartSlider.css('position') == 'fixed') {
            if($('body').hasClass('affiliated'))
            {
                cartSlider.css('position', 'absolute').css('top', 30);
            } else {
                cartSlider.css('position', 'absolute').css('top', headerHeight);
            }
        }
    }
}

function myCartSlideOut() {
    if ($('#my-cart div.popout').css('display') != 'block') {
        initSliderLocation($(window));
        toggle('#my-cart div.popout', true);
    }
    $('.cart-contents').animate({ scrollTop: $('#my-cart').has('.cart-error').length ? 0 : $('.cart-contents').height() + 8000 }, 2000);
}

function toggle(p_element, IsSlideUpMiniCart) {
    var element = $(p_element);
    if (element.is(':visible')) {
        element.hide();
    }
    else {
        (IsSlideUpMiniCart) ? element.show().delay(5000).slideUp('slow') : element.show();
        element.find('input[type=text]:first').focus();
    }
}

// Changes styles based on selections of radio buttons.
function toggleSelected(p_form) {
    $("#" + p_form + " input").each(function () {
        if (this.checked == true) {
            $(this).parent().addClass("selected");
        } else {
            $(this).parent().removeClass("selected");
        }
    });
}

function toggleShipping(p_form) {
    $("#" + p_form + " input").each(function () {
        if (this.checked == true) {
            $(this).parent().parent().addClass("selected");
        } else {
            $(this).parent().parent().removeClass("selected");
        }
    });
}

$(window).ajaxError(function (event, xhr) {
    if (xhr.status == 401)
        window.location = $('input#login-action-url').val();
});

var schoolAffiliation = {
    label: "",
    popoutDefaultHeight: 0,
    modalDefaultHeight: 0,
    getDialog: function () {
        var dialog = $('div.modal-school-aff');
        return dialog.is(':visible') ? dialog : $('div#pulldown-school-aff');
    },
    getDefaultHeight: function () {
        return this.getDialog().is('div#pulldown-school-aff')
                ? this.popoutDefaultHeight
                : this.modalDefaultHeight;
    },
    setDefaultHeight: function () {
        var dialog = this.getDialog();
        if (dialog.is('div#pulldown-school-aff') && this.popoutDefaultHeight == 0)
            this.popoutDefaultHeight = dialog.height();
        else if (dialog.is('div.modal-school-aff') && this.modalDefaultHeight == 0)
            this.modalDefaultHeight = dialog.height();
    },
    closeDialog: function () {
        var dialog = this.getDialog();
        $('div#pulldown-school-aff').hide().siblings().first().removeClass('pulldown-button-on');
        $('div.modal-school-aff').dialog("close");
        return dialog;
    },
    onSelect: null,
    onShowStores: {},
    registerOnShowStores: function (key, handler) {
        schoolAffiliation.onShowStores[key] = handler;
    },
    showStores: function (slugs, storeSlugInput) {
        var displayType = storeSlugInput.attr('displaytype');
        schoolAffiliation.onShowStores[displayType].apply(schoolAffiliation, arguments);
    },
    toggleStoreDiv: function (on, formDiv) {
        var col2 = formDiv.parent().siblings('div.col-2');
        return (on)
            ? col2.children('div.info:first').hide().siblings('div.affiliation-stores:first').css('height', '').show()
            : col2.children('div.affiliation-stores:first').hide().siblings('div.info:first').show().parent().css('height', '');
    },
    affiliate: function (event) {
        var addNewSchool = function (schoolName) {
            var schoolArray = decodeURI(window.location.search).match(/Schools\[[\d]+\]/gi);
            if (!schoolArray) schoolArray = [];
            var newIndex = 0;
            for (var arrayIndex = 0; arrayIndex < schoolArray.length; arrayIndex++) {
                var schoolIndex = schoolArray[arrayIndex].match(/\[([\d])\]+/)[1] - 0;
                if (schoolIndex >= newIndex)
                    newIndex = schoolIndex + 1;
            }

            return (/\?/.test(window.location.href) ? '' : '?')
                    + (/&$/.test(window.location.search) ? '' : '&')
                    + 'Schools[' + newIndex.toString() + ']=' + encodeURIComponent(schoolName);
        };
        var input = this.schoolName;
        input.disabled = true;
        $.post(this.action, $(this).serialize(), function (data) {
            input.disabled = false;
            if (!data.success) return;
            // Apologies if this breaks some behavior!
            // TODO Move this into the server-side action and use a RedirectResult
            var location = window.location.href;
            if (/\/Shop/i.test(window.location.pathname)) {
                location += addNewSchool(data.schoolName);
                location = location.replace(/selectschool=true&?/i, "");
            }
            var pagesToRedirect = /^\/(About|Help|givingback|Frequently-Asked-Questions)/;
            var pagesToNotRedirect = /(ContactUs|SubscribeNow)/;
            if (window.location.pathname == '/' || ( pagesToRedirect.test(window.location.pathname) && !pagesToNotRedirect.test(window.location.pathname) )) {
                //go to school page if affiliated from homepage
                location = '/' + data.schoolSlug;
            }
            window.location = location;
        }, "json");
        event.preventDefault();
    }
};

function initSchoolAffiliation() {
    $('.school-affiliation')
        .keypress(function (evt) 
            { 
                if (evt.keyCode != 13 /* catch enter */) 
                    return; 
                    
                evt.preventDefault(); 
                evt.stopPropagation(); 
                return false; 
            }
        )
        .each(function () 
        {
            var input = $(this);

            // Only do this once
            if (input.data('inited')) return;
            input.data('inited', true);

            // Get the form we are inside
            var form = $(input.get(0).form);

            // Intercept the form submission
            //if ((/^true$/i).test(form.attr('affiliationonly')))
            //    form.submit(schoolAffiliation.affiliate);

            // Wire up autocomplete
            var autocomplete = input.autocomplete(
                {
                    source: input.attr('autocompleteurl'),
                    minLength: 3,
                    focus: function () { return false; },
                    select: function (event, ui) 
                    {
                        if(!ui.item.value){
                            return false;
                        }
                        input.val(ui.item.label);
                        form.find('input[schoolinput]:first').val(ui.item.value);
                        schoolAffiliation.label = ui.item.label;
                        schoolAffiliation.showStores(ui.item.stores, form.find('input[storeinput]:first'));
                        return false;
                    }
                }
            ).data('autocomplete');

            // Create autocomplete items
            autocomplete._renderItem = function (ul, item) 
            {
                return $('<li></li>')
                .data('item.autocomplete', item)
                .append('<a><span>' + item.label + '</span><span class="ui-menu-item-desc">' + item.desc + '</span></a>')
                .appendTo(ul);
            };

            // Kill some default functionality?
            autocomplete.menu.options.blur = null;
        }
    );

    schoolAffiliation.registerOnShowStores('dialog', function (slugs, storeSlugInput) {
        this.setDefaultHeight();
        $('a.schoolSelect').click(function () 
            {
                $(this).closest('form').trigger("submit");
                if (typeof changeTerm == 'function')
                    changeTerm();
                return false;
            }
        );

        var formDiv = storeSlugInput.closest('div.schools-form');

        if (slugs.length == 0) {
            this.toggleStoreDiv(false, formDiv);
            storeSlugInput.val(slugs.length == 0 ? "" : slugs[0]);
            this.getDialog().find('div.school-submission').show();
            return;
        }

        $('div.school-submission').hide();
        $.post(formDiv.attr('storesaction'),
            $.param({ slugs: slugs }, true),
            function (data) {
                var justOne = slugs.length == 1;
                var storesDiv = schoolAffiliation.toggleStoreDiv(true, formDiv);
                storesDiv.parent().width(168);
                $('h5.hide', storesDiv.parent()).show().text(justOne ? "Your Neebo Bookstore" : "Select a preferred store below");
                storesDiv.html(data);
                if (justOne) {
                    storeSlugInput.val(slugs[0]);
                    formDiv.find('div.school-submission').show();
                    return;
                }

                storesDiv.children('ul').children()
                    // Fired when we click one of the stores
                    .click(function () {
                        var _this = $(this);
                        _this.addClass('selected-aff-store').siblings().removeClass('selected-aff-store');
                        storeSlugInput.val(_this.find('span.affiliated-store-slug').text());
                        formDiv.find('div.school-submission').show();
                    })
                    .hover(function () { 
                            $(this).not('.selected-aff-store').addClass('affiliated-store-hover'); 
                        }, function () { 
                            $(this).removeClass('affiliated-store-hover'); 
                        }
                    )
                    // Act like we clicked the first store. 
                    .first().trigger('click');
            });
    });

    $('a.schoolSelect').click(function () { $(this).closest('form').trigger("submit"); return false; });
    if (!(/SelectedSchool=/.test(document.cookie))) 
        $('a.clear-school-affiliation').css('display', 'none');
}

function formatCurrency(num) {
    if (isNaN(Number(num))) {
        return 'ERROR';
    }

    num = num.toString().replace(/\$|\,/g, '');
    if (isNaN(num))
        num = "0";
    sign = (num == (num = Math.abs(num)));
    num = Math.floor(num * 100 + 0.50000000001);
    cents = num % 100;
    num = Math.floor(num / 100).toString();
    if (cents < 10)
        cents = "0" + cents;
    for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++)
        num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
    return (((sign) ? '' : '-') + '$' + num + '.' + cents);
}

$(_app.onload);

// could move this to its own file if desired
$(function () {
    $("#schoolFilter").keyup(function (evt) {
        var filter = $(this).val();
        if (filter.length < 3) {
            $(".filtered li.hide").addClass("show");
            $(".filtered li.hide").removeClass("hide");
        } else {
            var itemsSelector;
            if (evt.which == 8     /* backspace */
                        || evt.which == 46 /* delete */) {
                itemsSelector = ".filtered li.hide";
            } else {
                itemsSelector = ".filtered li.show";
            }

            $(itemsSelector).each(function () {
                if ($(this).text().search(new RegExp(filter, "i")) < 0) {
                    $(this).addClass("hide");
                    $(this).removeClass("show");
                } else {
                    $(this).removeClass("hide");
                    $(this).addClass("show");
                }
            });
        }
    });
});

// could move this to its own file if desired
(function ($) {
    var setPlaceholderEvents = function ($this, placeholderText) {
        $this
            .blur(function () { if (!(this.value)) this.value = placeholderText; })
            .focus(function () { if (this.value == placeholderText) this.value = ''; })
            .val(placeholderText);
    };

    var selectedItemClass = 'autosearch-selected-item';

    var moveDown = function ($this) {
        var items = $this.data('autoSearch').items;
        var selectedItem = items.filter('.' + selectedItemClass).removeClass(selectedItemClass);
        var newIndex = (items.index(selectedItem) + 1) % items.length;
        items.eq(newIndex).addClass(selectedItemClass);
    };

    var moveUp = function ($this) {
        var items = $this.data('autoSearch').items;
        var selectedItem = items.filter('.' + selectedItemClass).removeClass(selectedItemClass);
        var oldIndex = items.index(selectedItem);
        var newIndex = ((oldIndex < 0 ? 0 : oldIndex) + items.length - 1) % items.length;
        items.eq(newIndex).addClass(selectedItemClass);
    };

    var onSubmit = function (evt, $this) {
        var selectedItem = $this.data('autoSearch').items.filter('.' + selectedItemClass);
        if (selectedItem.length == 0)
            return;

        evt.stopPropagation();
        evt.preventDefault();
        window.location = selectedItem.find('a')[0].href;
    };

    var onKeydown = function (evt) {
        var keyCode = evt.which;
        if (keyCode != 13 /* enter */)
            return;
        onSubmit(evt, $(this));
    };

    var onKeyup = function (evt) {
        var keyCode = evt.which;
        if (keyCode == 8     /* backspace */
            || keyCode == 46 /* delete */
           ) $(this).trigger('keypress');
        else if (keyCode == 38 /* up arrow */)
            moveUp($(this));
        else if (keyCode == 40 /* down arrow */)
            moveDown($(this));
    };

    var onKeypress = function (evt) {
        var $data = $(this).data('autoSearch');
        window.clearTimeout($data.autocompleteDelay);
        $data.autocompleteDelay = window.setTimeout($data.startAutocomplete, 500);
    };

    var autoSearch = function (options) {
        var $this = this;
        var $element = options.element;

        this.resultsElement      = $element.siblings('.autocompletedSearchResults');
        this.placeholderText     = $element.attr('placeholder');
        this.autocompleteUrl     = this.resultsElement.attr('url');
        this.highlightExpression = null;

        this.hideResults       = function() { $this.resultsElement.delay(800).slideUp(100); }
        this.onSubmit          = function(evt) {
            _gaq.push(['_trackEvent', 'Interaction', 'Search Submit']);
            var searchValue = $element.val(); 
            if (searchValue.length && searchValue != $this.placeholderText) return;
            evt.preventDefault();
            return false;
        };
        this.startAutocomplete = function() {
            _gaq.push(['_trackEvent', 'Interaction', 'Autocomplete Search']);
            var searchTerm = $element.val().replace(/[^\w ]/, '');
            if (searchTerm.length == 0){
                $this.hideResults();
                return;
            } 

            $this.highlightExpression = new RegExp(searchTerm, 'i');
            $.get(
                $this.autocompleteUrl,
                { Search: searchTerm },
                $this.onAutocompleteEnd,
                'html');
            $this.showSpinner();
        };
        this.onAutocompleteEnd = function(html) {
            $this.items = $this.resultsElement.html(html)
                .find('li ul li').each(function () {
                    $this.highlightLink($(this).children('a:first'));
                }).hover(function() { $this.items.removeClass(selectedItemClass); $(this).addClass(selectedItemClass); },
                         function() { $this.items.removeClass(selectedItemClass); });

            $this.hideSpinner();
            $this.showResults();
        };
        this.showSpinner       = function() {
            $this.resultsElement.parent().addClass('search-spinner');
        };
        this.hideSpinner       = function() {
            $this.resultsElement.parent().removeClass('search-spinner');
        };
        this.highlightLink     = function(anchor) {
            var linkText = anchor.text();
            var matchedText = $this.highlightExpression.exec(linkText);
            if (matchedText) {
                matchedText = matchedText[0];
                anchor.html(linkText.replace(matchedText, '<strong>' + matchedText + '</strong>'));
            }
        };
        this.showResults       = function() {
            //IE7 HACK
            if ($.browser.msie && $.browser.version < 8)
            {
                $this.resultsElement.show();
            }
            else {
                //this hoses IE7 (causes the list items to not show up initially)
                $this.resultsElement.slideDown(100);
            }
        };

        $.extend(this, options);
        
        if (!$.support.placeholder) setPlaceholderEvents($element, this.placeholderText);
        
        $element
            .blur(this.hideResults)
            .keydown(onKeydown)
            .keyup(onKeyup)
            .keypress(onKeypress);
        $element.closest('form').submit(this.onSubmit)
            .find('input:submit').click(function (evt) { evt.preventDefault(); $(this.form).trigger('submit'); });
    };

    $.fn.autoSearch = function (options) {
        var element = this;
        var settings = {};

        if (options)
            $.extend(settings, options);

        settings.element = element;
        return this.data('autoSearch', new autoSearch(settings));
    };
})(jQuery);

function deleteCartItem(url) {
    $.ajax({
        type: "POST",
        url: url,
        success: function (response) {
            $('#my-cart div.popout').html(response);
            setCartSummary();
        }
    });
}

function deleteCartCourse(url) {
    $.ajax({
        type: "POST",
        url: url,
        success: function (response) {
            $('#my-cart div.popout').html(response);
            setCartSummary();
        }
    });
}

function enableSubmitOnTextChanged($caller, $elemToEnable) {
    $elemToEnable.attr('disabled', !$caller.val().length > 0);
}

function validateEmail(input) {
    var re = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
    return input.match(re);
}

// Configure AddThis
var addthis_config = { "data_track_clickback": true, "services_exclude": "myspace" };
var addthis_share = { twitter: 'check out {{url}} (from @neebohq)' };

// Fired when a user clicks any sharing mechanism.
function shareEventHandler(event) { 
    // Track this in Google Analytics
    _gaq.push(['_trackEvent', 'Sharing', event.data.service, event.data.url, 5]);
}

// Add operator to jQuery
$.expr[':'].exactly = function (el, idx, meta) {
    return $(el).text() === meta[3];
};

function toggleStoreList(e) {
    e.stopPropagation();
    var pullDown = $('#school-store-list');

    // Listen for click on body when we're expanded
    if (pullDown.css('display') == 'none')
        $(document).bind('click', toggleStoreList);
    else
        $(document).unbind('click', toggleStoreList);

    pullDown.slideToggle('fast');
}

function toggleAffiliationPulldown() {
    $('#affiliate-pulldown .pulldown-button a').click();
}

function changeAffiliationAfterConfirm() {
    if(confirm('This will clear your current course search. Continue?')) {
        var currentUrl = document.location.href;
        document.location.href = "/Affiliation/ClearAffiliation"; //""?redirectUrl=" + currentUrl;
    }
}

function isValidDate(date) {
    var monthfield = date.split("/")[0];
    var dayfield = date.split("/")[1];
    var yearfield = date.split("/")[2];
    var dayobj = new Date(yearfield, monthfield - 1, dayfield);
    if ((dayobj.getMonth() + 1 != monthfield) || (dayobj.getDate() != dayfield) || (dayobj.getFullYear() != yearfield))
        return false;
    else
        return  true;
}

function manualyValidateRentalFields($form) {
    $('#DateOfBirth').val($('#DateOfBirth_Month').val() + '/' + $('#DateOfBirth_Day').val() + '/' + $('#DateOfBirth_Year').val());
    if (!isValidDate($('#DateOfBirth').val())) {
        $form.valid();
        $('select[id^="DateOfBirth"]').removeClass('valid');
        $('select[id^="DateOfBirth"]').addClass('input-validation-error');
        $('[data-valmsg-for="DateOfBirth"]').closest('span').removeClass('field-validation-valid');
        $('[data-valmsg-for="DateOfBirth"]').addClass('field-validation-error');
        $('[data-valmsg-for="DateOfBirth"]').html('<span>Date of birth is invalid</span>');
        return false;
    }
    if (!$form.valid()) {
        return false;
    }

    return true;
}
