/* * The DynamicElements object */ function DynamicElements(){ this.BC; this.clickType; this.setRange = de_setRange; this.setKeyboardControls = de_setKeyboardControls; this.checkUrposterRequired = de_checkUrposterRequired; this.setSubnav = de_setSubnav; this.setAthleticsTicker = de_setAthleticsTicker; this.setTouchAnimation = de_setTouchAnimation; this.setDirectoryLookup = de_setDirectoryLookup; this.__construct = function(){ var obj = this; $('body').ready(function(){ obj.setTouchAnimation(); obj.setKeyboardControls(); obj.checkUrposterRequired(); obj.setSubnav(); obj.setRange(); obj.setAthleticsTicker(); obj.setDirectoryLookup(); //obj.setResponsivePlaylist(); Needs to be called once PHP returns playlist object }); }; } /* ########################################## * ############# Touch Controls ############# * ########################################## */ function de_setKeyboardControls(){ var obj = this; //add keyboard controls to any a tag with tabindex set. $("body").delegate('a[tabindex]', 'keydown', function(event){ if(event.which == 13){ //since this is a keyboard action, you know that touchend isn't the triggering action //trigger mouseup or click as necessary. var clicked = $(event.target).triggerHandler('click'); if(clicked == undefined){ $(event.target).trigger('mouseup'); } } }); } function de_setTouchAnimation(){ var obj = this; //pick touch or click document.body.setAttribute('ontouchmove','return;'); if(typeof document.body.ontouchmove == 'function'){ obj.clickType = { start: 'touchstart', move: 'touchmove', end: 'touchend', x: 'event.changedTouches[0].clientX', y: 'event.changedTouches[0].clientY', enter: 'touchend', exit: 'touchend', leave: 'touchleave' }; } else{ obj.clickType = { start: 'mousedown', move: 'mousemove', end: 'mouseup', x: 'e.clientX', y: 'e.clientY', enter: 'mouseenter', exit: 'mouseexit', leave: 'mouseleave' }; } } /* ############################################################# * ############# Range Controls for Course Catalog ############# * ############################################################# */ function de_calculateRangeValues () { var rangeValues = []; $("#starttimeDropdown option").each(function(){ rangeValues.push($(this).attr('value')); }); return rangeValues; } function de_calculateRangeNames () { var rangeNames = []; $("#starttimeDropdown option").each(function(){ rangeNames.push($(this).text()); }); return rangeNames; } function de_setRangeValues (rangeValues, rangeNames) { /* Setting up the time dropdown */ if($("#search-courses #starttimeInput").length > 0){ $("#search-courses #starttimeInput").remove(); } if($("#search-courses #endtimeInput").length > 0){ $("#search-courses #endtimeInput").remove(); } $('#range_start .val').text(rangeNames[0]); $('#range_end .val').text(rangeNames[rangeNames.length-1]); $('#starttimeDropdown').val(rangeValues[0]); $('#endtimeDropdown').val(rangeValues[rangeValues.length-1]); $("#range_start").css({left : "0%" }); $("#range_end").css({left : '100%' }); $("#range_indicator").css({ left : "0%", width : "100%" }).attr("min", '0%').attr("max", '100%'); } /* * This code will construct a dynamic range slider for catalog */ function de_setRange () { var obj = this; var divisions = $("#starttimeDropdown option").length - 1; var tickLength = 100 / divisions; var rangeLength; var anchorPoints = []; var rangeValues = de_calculateRangeValues(); var rangeNames = de_calculateRangeNames(); var active_range_el; de_setRangeValues(rangeValues, rangeNames); $("#range_start").css({left: "0%"}); $("#range_end").css({left:"100%"}); var counter = 0; for (var i = divisions; i > 0; i--){ $(".ticks").append('
'); anchorPoints.push((tickLength * i) - tickLength); } anchorPoints.splice(0, 0, anchorPoints[0] + tickLength); //Adds in the final anchorpoint value to the array anchorPoints.reverse(); function findAnchorpoint(value){ var lowValue = 0; var closestPoint = anchorPoints[0]; var selectOption; for(i = 0; i <= anchorPoints.length; i++){ //Find the closest Anchorpoint var diff = Math.abs(anchorPoints[i] - value); if(lowValue == 0 || diff < lowValue) { lowValue = diff; closestPoint = anchorPoints[i]; selectOption = i; } if(diff == 0 || diff > lowValue){ break; } } var anchorPoint = { closestPoint: closestPoint, selectOption: selectOption }; return anchorPoint; } $(document).on(obj.clickType.start,'#range-canvas .control', function(){active_range_el = $(this); $("#range-canvas").unbind(obj.clickType.move); $("#range-canvas").bind(obj.clickType.move, function(e){ var left = ((e.pageX - $("#range-canvas").offset().left) / $("#range_bg").width()) * 100; if( (typeof(active_range_el) != 'undefined') && (active_range_el.is("#range_start")) ){ $('#range_start .val').text(""); $("#range_start").css({left:left+"%"}); $("#range_indicator").css({left:left+"%"}); var rangeIndWidth = (($("#range_end").position().left - $("#range_start").position().left) / $("#range_bg").width()) * 100; $("#range_indicator").css({width: rangeIndWidth+"%"}); //This if statement prevents #range_start from being less than #range_end if (parseInt($("#range_end").css('left')) - parseInt($("#range_start").css('left')) < tickLength){ var absoluteLeft = parseInt($("#range_end").css('left')) - tickLength - 1; $("#range_start").css({left:absoluteLeft+"%"}); $("#range_indicator").css({left:absoluteLeft+"%"}); $("#range_indicator").width(tickLength); } //This if statements prevents #range_start from being less than 0 if (parseInt($("#range_start").css('left')) <= 0){ $("#range_start").css({left: "0%"}); $("#range_indicator").css({left: "0%"}); } } else{ $('#range_end .val').text(""); $("#range_end").css({left:left+"%"}); var rangeIndWidth = (($("#range_end").position().left - $("#range_start").position().left) / $("#range_bg").width()) * 100; $("#range_indicator").css({width: rangeIndWidth+"%"}); //This if statement prevents #range_end from being less than #range_start if (parseInt($("#range_end").css('left')) - parseInt($("#range_start").css('left')) <= tickLength){ var absoluteLeft = parseInt($("#range_start").css('left')) + tickLength + 1; $("#range_end").css({left:absoluteLeft+"%"}); $("#range_indicator").width(tickLength); } //This if statements prevents #range_end from being greater than the #range-canvas length if (parseInt($("#range_end").css('left')) >= $("#range-canvas").width()){ $("#range_end").css({left:$("#range-canvas").width()+"px"}); } } var endval = (parseInt($("#range_end").position().left) / $("#range_bg").width()) * 100; var startval = (parseInt($("#range_start").position().left) / $("#range_bg").width()) * 100; $("#range_indicator").attr("max", endval); $("#range_indicator").attr("min", startval); }); return false; }); /* When user selects start time using the dropdown, the range slider is updated to with the new selection */ $(".starttime").change(function() { $("#starttimeDropdown").val($("option:selected", this).val()); var index = $("#starttimeDropdown option:selected").index(); $("#range_indicator").attr("min", anchorPoints[index]+1); var anchorPoint = findAnchorpoint($("#range_indicator").attr("max")); $('#range_start .val').text(rangeNames[anchorPoint.selectOption]); rangeLength = (parseInt($("#range_end").css('left')) / $("#range_bg").width() * 100) - anchorPoint.closestPoint; $("#range_indicator").animate({width:rangeLength+"%", left:anchorPoint.closestPoint+"%"}); $("#range_start").animate({left:anchorPoint.closestPoint+"%"}); }); /* When user selects end time using the dropdown, the range slider is updated to with the new selection */ $(".endtime").change(function() { $("#endtimeDropdown").val($("option:selected", this).val()); var index = $("#endtimeDropdown option:selected").index(); $("#range_indicator").attr("max", anchorPoints[index]+1); var anchorPoint = findAnchorpoint($("#range_indicator").attr("max")); $('#range_end .val').text(rangeNames[anchorPoint.selectOption]); rangeLength = anchorPoint.closestPoint - (parseInt($("#range_start").css('left')) / $("#range_bg").width() * 100); $("#range_indicator").animate({width:rangeLength+"%"}); $("#range_end").animate({left:anchorPoint.closestPoint+"%"}); }); $(document).on(obj.clickType.move, '#range_start', function(){ var anchorPoint = findAnchorpoint($("#range_indicator").attr("min")); //if($(this).find('.val').text() != $('#starttimeInput').attr('minname')) { if($(this).find('.val').text() != rangeNames[0]) { $(this).find('.val').text(rangeNames[anchorPoint.selectOption]); } }); $(document).on(obj.clickType.move, '#range_end', function(){ var anchorPoint = findAnchorpoint($("#range_indicator").attr("max")); //if($(this).find('.val').text() != $('#endtimeInput').attr('maxname')){ if($(this).find('.val').text() != rangeNames[rangeNames.length-1]){ $(this).find('.val').text(rangeNames[anchorPoint.selectOption]); } }); $(document).on(obj.clickType.end+' '+obj.clickType.leave, '#range-canvas', function(){ //snap to the nearest integer position: rangeLength = $("#range_bg").width(); if ((typeof(active_range_el) != 'undefined') && (active_range_el.is("#range_start"))){ var anchorPoint = findAnchorpoint(parseFloat($("#range_indicator").attr("min"))); $("#starttimeDropdown").val(rangeValues[anchorPoint.selectOption]); $('#range_start .val').text(rangeNames[anchorPoint.selectOption]); rangeLength = (parseInt($("#range_end").css('left')) / $("#range_bg").width() * 100) - anchorPoint.closestPoint; $("#range_indicator").animate({width:rangeLength+"%", left:anchorPoint.closestPoint+"%"}); $("#range_start").animate({left:anchorPoint.closestPoint+"%"}); } else if ((typeof(active_range_el) != 'undefined') && (active_range_el.is("#range_end"))) { var anchorPoint = findAnchorpoint(parseFloat($("#range_indicator").attr("max"))); $("#endtimeDropdown").val(rangeValues[anchorPoint.selectOption]); $('#range_end .val').text(rangeNames[anchorPoint.selectOption]); rangeLength = anchorPoint.closestPoint - (parseInt($("#range_start").css('left')) / $("#range_bg").width() * 100); $("#range_indicator").animate({width:rangeLength+"%"}); $("#range_end").animate({left:anchorPoint.closestPoint+"%"}); } }); $(document).on(obj.clickType.end, 'body', function(){ $("#range-canvas").unbind(obj.clickType.move); }); } /* ######################################### * ############# Subnavigation ############# * ######################################### */ function resizeSubnav(){ $('#submenu a').addClass('noTransition'); $('#submenu .item.open').each(function(){ $(this).find('.open ul:first').each(function(){ if($(this).height() > 0){ $(this).height('auto'); } }); var height = $(this).find('ul:first').height(); $(this).css('padding-bottom', height); }); $('#submenu a').removeClass('noTransition'); } function de_setSubnav(){ if($('#submenu').length !== 0) { //If submenu exists, add additional class to change the size of #menu-wrap for mobile styling $('#menu-wrap').addClass('hasSubmenu'); } $('#submenu .item ul').hide(); $('#submenu .item').each(function(){ var collapseMySiblings = false; $(this).find('ul li ul').each(function() { if($(this).find('li').length > 0) { collapseMySiblings = true; } }); $('#submenu .on').parents('li').addClass('expandable hasOn open'); if(collapseMySiblings == true) { $(this).find('ul li ul').each(function () { if ($(this).find('.on').length > 0) { $(this).find('.on').parents('li').addClass('expandable hasOn open'); $(this).parent().find('a:first').wrap(''); $(this).parent().find('div a').after(''); } else { $(this).parent().addClass('expandable'); $(this).parent().find('a:first').wrap(''); $(this).parent().find('div a').after(''); } }); } if($(this).find('div:first > .expand').length > 0){ //has the expand div, meaning there is substructure $(this).addClass('expandable'); if($(this).find('.on').length > 0){ //$(this) is .item $(this).addClass('hasOn'); //adds hasOn class if a descendant has the on class if(!$(this).find('div:first > a').hasClass('on')){ $(this).find('div:first > .expand').toggleClass($(this).find('.expand').attr('data-icon') + ' ' + $(this).find('.expand').attr('data-icon-close')); //Toggles the icon classes for plus and minus } $(this).find('.on').next().toggleClass($(this).find('.expand').attr('data-icon') + ' ' + $(this).find('.expand').attr('data-icon-close')); //Toggles the icon classes for plus and minus $(this).find('ul').show(); //unhides the on item's ul $(this).find('.expandable:not(.open) > ul').hide(); var height = $(this).find('ul:first').height(); $(this).addClass('open').css('padding-bottom', height); } } }); $('#submenu .item ul').show(); //Unhides all the rest of the ul's $('#submenu li.expandable:not(.open) > ul').height(0); var isSubnavigating = false; $('#submenu .expand').on('click', function(){ if(isSubnavigating == false) { isSubnavigating = true; var item = $(this).closest('.expandable'); $(this).toggleClass('' + $(this).attr('data-icon') + ' ' + $(this).attr('data-icon-close') + ''); //Toggles the icon classes for plus and minus if (item.hasClass('item')) { //is top level subnav item if (item.hasClass('open')) { item.animate({ 'padding-bottom': 0 }, 300, function () { //reset isSubnavigating; item.removeClass('open'); isSubnavigating = false; }); } else { var height = item.find('ul:first').height(); item.addClass('open').animate({ 'padding-bottom': height }, 300, function () { //reset isSubnavigating; isSubnavigating = false; }); } } else { //is interior collapsed element var parent = item.parents('.item'); var parentHeight = parent.children('ul:first').height(); var height = item.children('ul:first').height(); if (item.hasClass('open')) { item.find('ul:first').animate({ height: 0 }, 300, function () { item.removeClass('open'); //reset isSubnavigating; isSubnavigating = false; }); parent.css('padding-bottom', parentHeight).animate({ 'padding-bottom': parentHeight - height }, 300, function () { //reset isSubnavigating; isSubnavigating = false; }); } else { item.addClass('open'); item.find('ul:first').height('auto'); item.parents('ul').height('auto'); height = item.find('ul:first').height(); item.find('ul:first').height(0).animate({ height: height }, 300, function () { //reset isSubnavigating; isSubnavigating = false; }); parent.css('padding-bottom', parentHeight).animate({ 'padding-bottom': parentHeight + height - 2 }, 300, function () { //reset isSubnavigating; isSubnavigating = false; }); } } } }); $(window).resize(function(){ resizeSubnav(); }); } /* ############################################ * ############# Directory Lookup ############# * ############################################ */ function de_setDirectoryLookup(){ var obj = this; $('body').on('submit','#directory #keyword_search',function(){ var el = $(this); var parent = el.parents('#directory'); if(typeof console != 'undefined'){ console.log('directory submit'); } el.find('#keyword').blur(); parent.find('#search_results').html(swod); var value = encodeURI(el.find('#keyword').val()); $.ajax({ url: el.attr('action')+'?ajax=true&keyword='+value, type: 'GET', dataType: 'jsonp', error: function(data,status,errorThrown){ return false; }, success: function(data){ parent.find('.paginationControls').remove(); parent.find('#search_results').html(data.results); var content = new CollapsedContent(); //directory is either in the kit or in the sub-toolbar: if(parent.parents('#kit').length == 1){ content.parent = '#kit #directory .person'; } else if(parent.parents('#sub-toolbar').length == 1){ content.parent = '#sub-toolbar #directory .person'; } else{ content.parent = '#directory .person'; } content.collapse = '.info'; content.trigger = '.name'; content.animation = 'Slide'; content.__construct(); var height = $('#flyouts').height() + $('#toolbar .controls').height(); if(height > $('#content').height()){ $('#content').height(height+'px'); $('#content').attr('data-old-height', height+'px'); } else { $('#content').height('auto'); $('#content').attr('data-old-height', 'auto'); } if(parent.find('#search_results .collapsible').length == 1){ parent.find('#search_results .collapsible:first').trigger('click'); } } }); return false; }); } /* ############################################ * ############# Athletics Ticker ############# * ############################################ */ function de_setAthleticsTicker(){ var slider = $('.marquee .marqueeSlider'); var ticker = $('.marquee .mobileTicker'); var width; var animationDistance; var animationTime; var startTime; //Time stamp used to calculate time passage for hover states var pauseTime; //Time stamp used to calculate time passage for hover states function setVariables(){ //Sets animationDistance and animationTime width = 0; slider.find('.item').not('.off').each(function(){ width += $(this).width(); }); animationTime = width * 7; if(animationTime < 17000){ animationTime = 17000; } animationDistance = (width/$('.marquee').width() * -100) - 100; } function scrollIt(slider, distance, time, reset){ //sets scrolling animation if(slider.find('.item').not('.off').length > 0){ if(reset == true){ slider.css('margin-left', '100%'); } slider.animate({ marginLeft: distance+'%' }, time, 'linear', function(){ setVariables(); scrollIt(slider, animationDistance, animationTime, true); }); startTime = new Date().getTime(); } else { slider.stop(true,false); slider.css('margin-left', '0%'); slider.find('.temporary').remove(); slider.prepend('No current news or scores for this sport.'); } } function chunkIt(){ //Divides up visible news items into panels of 5 var count = 0; for(var i = 0; i < ticker.find('.item').length; i++){ var item = ticker.find('.item:eq('+i+')'); item.addClass('wrapMe'); if(!item.hasClass('off')){ count++; } if(count == 5){ ticker.find('.item.wrapMe').wrapAll('').removeClass('wrapMe'); count = 0; } } ticker.find('.item.wrapMe').wrapAll('').removeClass('wrapMe'); ticker.find('.panel').each(function(){ var windowWidth = $(window).width(); $(this).width(windowWidth); if($(this).find('.item').not('.off').length == 0){ $(this).addClass('off'); } }); ticker.find('.panel:first-child').addClass('on'); } setVariables(); chunkIt(); if(slider.is(':visible')){ scrollIt(slider, animationDistance, animationTime, true); } $('.marquee').hover( function(){ //on hover pauseTime = new Date().getTime(); animationTime = animationTime - (pauseTime - startTime); slider.stop(true,false); }, function(){ //on mouseleave if(slider.is(':visible')){ scrollIt(slider, animationDistance, animationTime, false); } } ); $(window).resize(function(){ var windowWidth = $(window).width(); ticker.find('.panel').width(windowWidth); if(slider.is(':visible')){ slider.stop(true,false); setVariables(); scrollIt(slider, animationDistance, animationTime, false); } }); $(document).on('click', '.tickerControls #ticker-next', function(){ if(!ticker.find('.on').next().hasClass('off')){ ticker.find('.on').removeClass('on').next().addClass('on'); $('.tickerControls #ticker-prev').show(); } if(ticker.find('.on').next().hasClass('off')){ $('.tickerControls #ticker-next').hide(); } var multiplier = ticker.find('.on').index(); ticker.animate({ marginLeft: multiplier * -100+'%' }, 200, function(){ //animation complete }); }); $(document).on('click', '.tickerControls #ticker-prev', function(){ if(ticker.find('.on').index() > 0){ ticker.find('.on').removeClass('on').prev().addClass('on'); $('.tickerControls #ticker-next').show(); } if(ticker.find('.on').index() == 0){ $('.tickerControls #ticker-prev').hide(); } var multiplier = ticker.find('.on').index(); ticker.animate({ marginLeft: multiplier * -100+'%' }, 200, function(){ //animation complete }); }); $(document).on('click', '.marqueeControls li, .marqueeControls .spider', function(){ $('.marqueeControls li, .marqueeControls .spider').removeClass('on'); $(this).addClass('on'); var tags = $(this).data('tags').split(','); $('.marquee').animate({ opacity: 0 }, 200, function(){ slider.find('.temporary').remove(); slider.find('.item').addClass('off'); for(var i= 0; i < tags.length; i++){ slider.find('.item[data-tags="'+tags[i]+'"]').removeClass('off'); } slider.stop(true,false); setVariables(); scrollIt(slider, animationDistance, animationTime, true); $('.marquee').animate({ opacity: 1 }, 200); }); }); $(document).on('change', '.tickerSelect', function(){ var tags = $(this).find('option:selected').data('tags').split(','); ticker.find('.item').addClass('off'); for(var i= 0; i < tags.length; i++){ ticker.find('.item[data-tags="'+tags[i]+'"]').removeClass('off'); } ticker.find('.item').unwrap(); chunkIt(); ticker.css('margin-left', '0%'); $('.tickerControls #ticker-prev').hide(); if(ticker.find('.panel').not('.off').length == 1){ $('.tickerControls #ticker-next').hide(); } }); } function de_checkUrposterRequired(){ /* * check urposter forms at submission to see if they have empty required elements. * * also adds datepicker if needed */ forms = $("form"); forms.submit(function(){ var inputs = $(this).find('*[name*="REQ_"]'); var okay = true; inputs.each(function(){ if($(this).val() == ''){ okay = false; $(this).addClass('error'); } else { $(this).removeClass('error'); } }); if(okay == false){ alert('A required field is not completed. Please check the form and resubmit.'); return false; } }); var dp = forms.find('*[usecal="true"]'); if(dp.length > 0){ //load datepicker files if not alread in page: if(typeof($.datepicker) == 'undefined'){ var link = document.createElement('link'); link.type = 'text/css'; link.media = 'screen'; link.rel = 'stylesheet'; link.href = assetsUrl+"/scripts/frameworks/jquery-ui-1.9.2.custom.datepicker/css/jqui-smoothness/jqui.min.css"; $("head").append(link); var script = document.createElement('script'); script.type='text/javascript'; script.src = assetsUrl+'/scripts/frameworks/jquery-ui-1.9.2.custom.datepicker/jqui.min.js'; $("head").append(script); } var checkdpload = function(){ if(typeof($.datepicker) != 'undefined'){ $(function() { $(dp).each(function(){ var props = {}; if($(this).attr('mindate') != ''){ props.minDate = $(this).attr('mindate'); } $(this).datepicker(props); }); }); } else{ setTimeout(function(){ checkdpload(); }, 50); } }; checkdpload(); } } /* * This code calls the DynamicElements object. */ var de = new DynamicElements(); de.__construct();