├── favicon.png ├── fonts ├── FontAwesome.otf ├── fontawesome-webfont.eot ├── fontawesome-webfont.ttf ├── fontawesome-webfont.woff ├── fontawesome-webfont.woff2 ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.ttf ├── glyphicons-halflings-regular.woff └── glyphicons-halflings-regular.woff2 ├── images ├── patterns │ └── 8.png ├── slider │ └── bg1.jpg └── MSCschedulizer.png ├── .travis.yml ├── .gitignore ├── includes ├── main-nav.html └── header.html ├── bower.json ├── asset └── js │ ├── bundleme.js │ └── config.example.js ├── test ├── index.html └── qunit │ └── qunit-1.18.0.css ├── README.md ├── LICENSE.md ├── package.json ├── css ├── jquery.timepicker.css ├── jquery.ptTimeSelect.css ├── jquery.weekLine.css ├── slicknav.css ├── pnotify.custom.min.css ├── jade.css ├── responsive.css └── tooltipster.css ├── js ├── jquery.lettering.js ├── jquery.parallax.js ├── count-to.js ├── jquery.fitvids.js ├── jquery.easypiechart.min.js ├── jquery.appear.js ├── jquery.endless-scroll.js ├── nivo-lightbox.min.js ├── datepair.min.js ├── jquery.migrate.js ├── jquery-migrate-1.2.1.min.js ├── jquery.datepair.min.js ├── jquery.textillate.js ├── jquery.weekLine.min.js ├── jquery.easypiechart.js └── nivo-lightbox.js ├── Gruntfile.js ├── 404.html ├── favorites.html ├── preview.html ├── generate.html ├── visual_filter.html ├── index.html ├── select-classes.html ├── webfor.html └── course-listings.html /favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/favicon.png -------------------------------------------------------------------------------- /fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /images/patterns/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/images/patterns/8.png -------------------------------------------------------------------------------- /images/slider/bg1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/images/slider/bg1.jpg -------------------------------------------------------------------------------- /images/MSCschedulizer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/images/MSCschedulizer.png -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "4.1" 4 | before_script: 5 | - "npm install -g bower" 6 | - "npm run-script build" -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyleladd/mscschedulizer/master/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .sass-cache 2 | 3 | # Generated 4 | asset/js/schedulizer_bundle.js 5 | asset/js/schedulizer_bundle.min.js 6 | 7 | # Dependencies 8 | bower_components/* 9 | node_modules/* 10 | 11 | # Logs 12 | npm-debug.log 13 | 14 | # Config Files 15 | asset/js/config.js 16 | Web.config 17 | 18 | styles/* -------------------------------------------------------------------------------- /includes/main-nav.html: -------------------------------------------------------------------------------- 1 |
  • Home
  • 2 |
  • Select Classes
  • 3 |
  • 4 | Generate 5 | 10 |
  • 11 |
  • Favorites
  • 12 |
  • Course Listings
  • -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mscschedulizer_frontend", 3 | "version": "0.0.0", 4 | "homepage": "https://github.com/mscweb/mscschedulizer", 5 | "authors": [ 6 | "Kyle Ladd " 7 | ], 8 | "license": "MIT", 9 | "dependencies": { 10 | "bootstrap-select": "~1.9.4", 11 | "fullcalendar": "~2.6.0", 12 | "moment": "~2.11.2", 13 | "basictable": "~1.0.2" 14 | }, 15 | "private": true 16 | } 17 | -------------------------------------------------------------------------------- /asset/js/bundleme.js: -------------------------------------------------------------------------------- 1 | var mscSchedulizer_config = require('./config.js'); 2 | var node_generic_functions = require('node_generic_functions'); 3 | var mscSchedulizer = require('./schedulizer.js'); 4 | var Combinatorics = require('js-combinatorics'); 5 | window.mscSchedulizer = mscSchedulizer; 6 | window.mscSchedulizer_config = mscSchedulizer_config; 7 | window.node_generic_functions = node_generic_functions; 8 | window.mscSchedulizer = mscSchedulizer; 9 | window.Combinatorics = Combinatorics; -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | QUnit Tests 6 | 7 | 8 | 9 |
    10 |
    11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MSCschedulizer 2 | [![Build Status](https://travis-ci.org/kyleladd/mscschedulizer.svg?branch=master)](https://travis-ci.org/kyleladd/mscschedulizer) 3 | ## Installation 4 | - One command install: ```npm run-script build``` 5 | 6 | - ``` grunt ``` 7 | 8 | - Copy ```/asset/js/config.example.js``` to ```/asset/js/config.js``` and configure 9 | 10 | -- OR (For development) -- 11 | 12 | - ```grunt dev``` 13 | 14 | ## Tests 15 | 16 | - ```node-qunit-phantomjs test/index.html``` 17 | - Or browse to ```/test/index.html``` within your browser 18 | 19 | - Run jshint and qunit tests 20 | - ``` npm test``` 21 | 22 | ## Android App 23 | - [https://play.google.com/store/apps/details?id=us.kyleladd.mscschedulizer](https://play.google.com/store/apps/details?id=us.kyleladd.mscschedulizer) 24 | 25 | ## Windows Desktop App 26 | - Using Electron (Official Release coming soon) - In Beta 27 | 28 | ### Trello Board 29 | https://trello.com/b/bNiEIopB/mscschedulizer 30 | -------------------------------------------------------------------------------- /asset/js/config.example.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | api_host:"http://schedulizer-api.morrisville.edu", 3 | html_elements:{ 4 | // All elements are By ID 5 | course_selections_list:"course_selections", 6 | departments_select:"departments", 7 | semesters_select:"semesters", 8 | department_class_list:"dept_class_list", 9 | schedules_container:"schedules", 10 | filters_container:"filters", 11 | checkbox_filters:"checkbox_filters", 12 | timeblock_filters:"timeblock_filters", 13 | alt_view_filter:"altViewFilter", 14 | filters:{ 15 | not_full:"notFullFilter", 16 | morrisville_campus:"morrisville_campus_filter", 17 | norwich_campus:"norwich_campus_filter", 18 | show_online:"showOnlineFilter", 19 | show_international:"showInternationalFilter" 20 | } 21 | }, 22 | msc_special_messages:false, 23 | colors: ["#22B548","#2293B5","#3222B5","#B58122","#B52222","#B522B0","#686967","#433050","#B3B522"], 24 | numToLoad:10 25 | } -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Kyle Ladd 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mscschedulizer_frontend", 3 | "version": "1.0.0", 4 | "description": "Front end for generating class schedules for MSCschedulizer", 5 | "license": "MIT", 6 | "private": true, 7 | "scripts": { 8 | "preinstall": "npm install -g grunt-cli", 9 | "build": "npm install && bower install && grunt --target=prod", 10 | "test": "node-qunit-phantomjs test/index.html && jshint --verbose asset/js/schedulizer.js" 11 | }, 12 | "dependencies": { 13 | "js-combinatorics": "^0.5.0", 14 | "node_generic_functions": "git+https://github.com/kyleladd/node_generic_functions.git", 15 | "readmore-js": "^2.1.0" 16 | }, 17 | "devDependencies": { 18 | "browserify": "^13.0.0", 19 | "browserify-shader": "^0.1.2", 20 | "grunt": "^1.0.1", 21 | "grunt-bower-task": "^0.4.0", 22 | "grunt-browserify": "^5.0.0", 23 | "grunt-contrib-copy": "^1.0.0", 24 | "grunt-contrib-cssmin": "^1.0.1", 25 | "grunt-contrib-uglify": "^1.0.1", 26 | "grunt-contrib-watch": "^1.0.0", 27 | "jshint": "^2.9.1", 28 | "minifyify": "^7.3.2", 29 | "node-qunit-phantomjs": "^1.3.1", 30 | "watchify": "^3.7.0" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /css/jquery.timepicker.css: -------------------------------------------------------------------------------- 1 | .ui-timepicker-wrapper { 2 | overflow-y: auto; 3 | height: 150px; 4 | width: 6.5em; 5 | background: #fff; 6 | border: 1px solid #ddd; 7 | -webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2); 8 | -moz-box-shadow:0 5px 10px rgba(0,0,0,0.2); 9 | box-shadow:0 5px 10px rgba(0,0,0,0.2); 10 | outline: none; 11 | z-index: 10001; 12 | margin: 0; 13 | } 14 | 15 | .ui-timepicker-wrapper.ui-timepicker-with-duration { 16 | width: 13em; 17 | } 18 | 19 | .ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-30, 20 | .ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-60 { 21 | width: 11em; 22 | } 23 | 24 | .ui-timepicker-list { 25 | margin: 0; 26 | padding: 0; 27 | list-style: none; 28 | } 29 | 30 | .ui-timepicker-duration { 31 | margin-left: 5px; color: #888; 32 | } 33 | 34 | .ui-timepicker-list:hover .ui-timepicker-duration { 35 | color: #888; 36 | } 37 | 38 | .ui-timepicker-list li { 39 | padding: 3px 0 3px 5px; 40 | cursor: pointer; 41 | white-space: nowrap; 42 | color: #000; 43 | list-style: none; 44 | margin: 0; 45 | } 46 | 47 | .ui-timepicker-list:hover .ui-timepicker-selected { 48 | background: #fff; color: #000; 49 | } 50 | 51 | li.ui-timepicker-selected, 52 | .ui-timepicker-list li:hover, 53 | .ui-timepicker-list .ui-timepicker-selected:hover { 54 | background: #1980EC; color: #fff; 55 | } 56 | 57 | li.ui-timepicker-selected .ui-timepicker-duration, 58 | .ui-timepicker-list li:hover .ui-timepicker-duration { 59 | color: #ccc; 60 | } 61 | 62 | .ui-timepicker-list li.ui-timepicker-disabled, 63 | .ui-timepicker-list li.ui-timepicker-disabled:hover, 64 | .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled { 65 | color: #888; 66 | cursor: default; 67 | } 68 | 69 | .ui-timepicker-list li.ui-timepicker-disabled:hover, 70 | .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled { 71 | background: #f2f2f2; 72 | } 73 | -------------------------------------------------------------------------------- /js/jquery.lettering.js: -------------------------------------------------------------------------------- 1 | /*global jQuery */ 2 | /*! 3 | * Lettering.JS 0.6.1 4 | * 5 | * Copyright 2010, Dave Rupert http://daverupert.com 6 | * Released under the WTFPL license 7 | * http://sam.zoy.org/wtfpl/ 8 | * 9 | * Thanks to Paul Irish - http://paulirish.com - for the feedback. 10 | * 11 | * Date: Mon Sep 20 17:14:00 2010 -0600 12 | */ 13 | (function($){ 14 | function injector(t, splitter, klass, after) { 15 | var a = t.text().split(splitter), inject = ''; 16 | if (a.length) { 17 | $(a).each(function(i, item) { 18 | inject += ''+item+''+after; 19 | }); 20 | t.empty().append(inject); 21 | } 22 | } 23 | 24 | var methods = { 25 | init : function() { 26 | 27 | return this.each(function() { 28 | injector($(this), '', 'char', ''); 29 | }); 30 | 31 | }, 32 | 33 | words : function() { 34 | 35 | return this.each(function() { 36 | injector($(this), ' ', 'word', ' '); 37 | }); 38 | 39 | }, 40 | 41 | lines : function() { 42 | 43 | return this.each(function() { 44 | var r = "eefec303079ad17405c889e092e105b0"; 45 | // Because it's hard to split a
    tag consistently across browsers, 46 | // (*ahem* IE *ahem*), we replaces all
    instances with an md5 hash 47 | // (of the word "split"). If you're trying to use this plugin on that 48 | // md5 hash string, it will fail because you're being ridiculous. 49 | injector($(this).children("br").replaceWith(r).end(), r, 'line', ''); 50 | }); 51 | 52 | } 53 | }; 54 | 55 | $.fn.lettering = function( method ) { 56 | // Method calling logic 57 | if ( method && methods[method] ) { 58 | return methods[ method ].apply( this, [].slice.call( arguments, 1 )); 59 | } else if ( method === 'letters' || ! method ) { 60 | return methods.init.apply( this, [].slice.call( arguments, 0 ) ); // always pass an array 61 | } 62 | $.error( 'Method ' + method + ' does not exist on jQuery.lettering' ); 63 | return this; 64 | }; 65 | 66 | })(jQuery); -------------------------------------------------------------------------------- /css/jquery.ptTimeSelect.css: -------------------------------------------------------------------------------- 1 | /** 2 | * FILE: jquery.ptTileSelect.css 3 | * Default style for the timeselect container. 4 | * 5 | * LAST UPDATED: 6 | * 7 | * - $Date: 2009/04/12 20:23:02 $ 8 | * - $Author: paulinho4u $ 9 | * - $Revision: 1.1 $ 10 | */ 11 | #ptTimeSelectCntr { 12 | width: 250px; 13 | font-size: .9em; 14 | position: absolute; 15 | z-index: 10; 16 | display: none; 17 | } 18 | #ptTimeSelectCntr .ui-widget{ 19 | padding: .2em; 20 | } 21 | #ptTimeSelectCntr .ui-widget-header { 22 | padding: .2em; 23 | } 24 | #ptTimeSelectCntr #ptTimeSelectUserTime { 25 | font-size: larger; 26 | padding: .2em; 27 | padding-left: 1em; 28 | text-align: center; 29 | } 30 | #ptTimeSelectCntr #ptTimeSelectCloseCntr { 31 | display: block; 32 | padding: .2em; 33 | } 34 | #ptTimeSelectCntr #ptTimeSelectCloseCntr a { 35 | display: block; 36 | padding: .2em; 37 | } 38 | #ptTimeSelectCntr .ui-widget-content { 39 | margin-top: .1em; 40 | margin-bottom: .1em; 41 | padding: .2em; 42 | } 43 | #ptTimeSelectCntr .ui-widget.ui-widget-content { 44 | margin-top: 0; 45 | } 46 | #ptTimeSelectCntr .ptTimeSelectLeftPane.ui-widget-content { 47 | border-top:none; 48 | border-bottom:none; 49 | border-left:none; 50 | border-right-width: 2px; 51 | } 52 | #ptTimeSelectCntr .ptTimeSelectRightPane.ui-widget-content { 53 | border: none; 54 | } 55 | #ptTimeSelectCntr .ptTimeSelectHrCntr a, 56 | #ptTimeSelectCntr .ptTimeSelectMinCntr a { 57 | display: block; 58 | float: left; 59 | padding: .2em; 60 | width: 1.9em; 61 | margin: 1px; 62 | text-align: center; 63 | text-decoration: none; 64 | } 65 | #ptTimeSelectCntr .ptTimeSelectHrAmPmCntr a { 66 | text-align: center; 67 | margin: 1px; 68 | } 69 | #ptTimeSelectCntr .ptTimeSelectTimeLabelsCntr { 70 | font-weight: bold; 71 | font-size: .9em; 72 | } 73 | #ptTimeSelectCntr #ptTimeSelectSetButton { 74 | padding-top: .2em; 75 | padding-bottom: .2em; 76 | } 77 | #ptTimeSelectCntr #ptTimeSelectSetButton a { 78 | display: block; 79 | padding: .2em; 80 | width: 30%; 81 | text-align: center; 82 | float: right; 83 | } 84 | -------------------------------------------------------------------------------- /js/jquery.parallax.js: -------------------------------------------------------------------------------- 1 | /* 2 | Plugin: jQuery Parallax 3 | Version 1.1.3 4 | Author: Ian Lunn 5 | Twitter: @IanLunn 6 | Author URL: http://www.ianlunn.co.uk/ 7 | Plugin URL: http://www.ianlunn.co.uk/plugins/jquery-parallax/ 8 | 9 | Dual licensed under the MIT and GPL licenses: 10 | http://www.opensource.org/licenses/mit-license.php 11 | http://www.gnu.org/licenses/gpl.html 12 | */ 13 | 14 | (function( $ ){ 15 | var $window = $(window); 16 | var windowHeight = $window.height(); 17 | 18 | $window.resize(function () { 19 | windowHeight = $window.height(); 20 | }); 21 | 22 | $.fn.parallax = function(xpos, speedFactor, outerHeight) { 23 | var $this = $(this); 24 | var getHeight; 25 | var firstTop; 26 | var paddingTop = 0; 27 | 28 | //get the starting position of each element to have parallax applied to it 29 | $this.each(function(){ 30 | firstTop = $this.offset().top; 31 | }); 32 | 33 | if (outerHeight) { 34 | getHeight = function(jqo) { 35 | return jqo.outerHeight(true); 36 | }; 37 | } else { 38 | getHeight = function(jqo) { 39 | return jqo.height(); 40 | }; 41 | } 42 | 43 | // setup defaults if arguments aren't specified 44 | if (arguments.length < 1 || xpos === null) xpos = "50%"; 45 | if (arguments.length < 2 || speedFactor === null) speedFactor = 0.1; 46 | if (arguments.length < 3 || outerHeight === null) outerHeight = true; 47 | 48 | // function to be called whenever the window is scrolled or resized 49 | function update(){ 50 | var pos = $window.scrollTop(); 51 | 52 | $this.each(function(){ 53 | var $element = $(this); 54 | var top = $element.offset().top; 55 | var height = getHeight($element); 56 | 57 | // Check if totally above or totally below viewport 58 | if (top + height < pos || top > pos + windowHeight) { 59 | return; 60 | } 61 | 62 | $this.css('backgroundPosition', xpos + " " + Math.round((firstTop - pos) * speedFactor) + "px"); 63 | }); 64 | } 65 | 66 | $window.bind('scroll', update).resize(update); 67 | update(); 68 | }; 69 | })(jQuery); 70 | -------------------------------------------------------------------------------- /js/count-to.js: -------------------------------------------------------------------------------- 1 | (function ($) { 2 | $.fn.countTo = function (options) { 3 | options = options || {}; 4 | 5 | return $(this).each(function () { 6 | // set options for current element 7 | var settings = $.extend({}, $.fn.countTo.defaults, { 8 | from: $(this).data('from'), 9 | to: $(this).data('to'), 10 | speed: $(this).data('speed'), 11 | refreshInterval: $(this).data('refresh-interval'), 12 | decimals: $(this).data('decimals') 13 | }, options); 14 | 15 | // how many times to update the value, and how much to increment the value on each update 16 | var loops = Math.ceil(settings.speed / settings.refreshInterval), 17 | increment = (settings.to - settings.from) / loops; 18 | 19 | // references & variables that will change with each update 20 | var self = this, 21 | $self = $(this), 22 | loopCount = 0, 23 | value = settings.from, 24 | data = $self.data('countTo') || {}; 25 | 26 | $self.data('countTo', data); 27 | 28 | // if an existing interval can be found, clear it first 29 | if (data.interval) { 30 | clearInterval(data.interval); 31 | } 32 | data.interval = setInterval(updateTimer, settings.refreshInterval); 33 | 34 | // initialize the element with the starting value 35 | render(value); 36 | 37 | function updateTimer() { 38 | value += increment; 39 | loopCount++; 40 | 41 | render(value); 42 | 43 | if (typeof(settings.onUpdate) == 'function') { 44 | settings.onUpdate.call(self, value); 45 | } 46 | 47 | if (loopCount >= loops) { 48 | // remove the interval 49 | $self.removeData('countTo'); 50 | clearInterval(data.interval); 51 | value = settings.to; 52 | 53 | if (typeof(settings.onComplete) == 'function') { 54 | settings.onComplete.call(self, value); 55 | } 56 | } 57 | } 58 | 59 | function render(value) { 60 | var formattedValue = settings.formatter.call(self, value, settings); 61 | $self.html(formattedValue); 62 | } 63 | }); 64 | }; 65 | 66 | $.fn.countTo.defaults = { 67 | from: 0, // the number the element should start at 68 | to: 0, // the number the element should end at 69 | speed: 1000, // how long it should take to count between the target numbers 70 | refreshInterval: 100, // how often the element should be updated 71 | decimals: 0, // the number of decimal places to show 72 | formatter: formatter, // handler for formatting the value before rendering 73 | onUpdate: null, // callback method for every time the element is updated 74 | onComplete: null // callback method for when the element finishes updating 75 | }; 76 | 77 | function formatter(value, settings) { 78 | return value.toFixed(settings.decimals); 79 | } 80 | }(jQuery)); -------------------------------------------------------------------------------- /css/jquery.weekLine.css: -------------------------------------------------------------------------------- 1 | /* weekLine jquery-ui css*/ 2 | 3 | .ui-WeekDays a 4 | { 5 | padding: 2px 3px !important; 6 | } 7 | 8 | .ui-WeekDays a:first-child 9 | { 10 | border-radius: 20% 0 0 20% !important; 11 | padding: 2px 3px 2px 6px !important; 12 | } 13 | 14 | .ui-WeekDays a:last-child 15 | { 16 | border-radius: 0 20% 20% 0 !important; 17 | padding: 2px 6px 2px 3px !important; 18 | } 19 | 20 | .ui-WeekDays a:hover 21 | { 22 | border-style: solid !important; 23 | border-width: 1px !important; 24 | } 25 | 26 | .ui-WeekDays .ui-state-active 27 | { 28 | border-style: solid !important; 29 | border-width: 1px !important; 30 | } 31 | 32 | /* weekLine dark css*/ 33 | 34 | .weekDays-dark a 35 | { 36 | padding: 2px 3px !important; 37 | color: Gray !important; 38 | background: linear-gradient(to bottom, #3B3B3B 0%, #202020 100%) repeat scroll 0 0 rgba(0, 0, 0, 0) !important; 39 | text-decoration: none !important; 40 | font-family: "courier new" !important; 41 | } 42 | 43 | .weekDays-dark a:first-child:not(.selectedDay):not(:hover) 44 | { 45 | border-radius: 20% 0 0 20% !important; 46 | padding: 2px 3px 2px 6px !important; 47 | } 48 | 49 | .weekDays-dark a:last-child:not(.selectedDay):not(:hover) 50 | { 51 | border-radius: 0 20% 20% 0 !important; 52 | padding: 2px 6px 2px 3px !important; 53 | } 54 | 55 | .weekDays-dark a:first-child:hover 56 | { 57 | padding: 2px 1px 2px 4px !important; 58 | } 59 | 60 | .weekDays-dark a:first-child 61 | { 62 | padding: 2px 2px 2px 5px !important; 63 | } 64 | 65 | .weekDays-dark a:hover 66 | { 67 | border-style: solid !important; 68 | border-radius: 20% !important; 69 | border-width: 2px !important; 70 | border-color: #6E9A52 !important; 71 | text-decoration: none !important; 72 | padding: 2px 1px !important; 73 | } 74 | 75 | .weekDays-dark .selectedDay 76 | { 77 | border-style: solid !important; 78 | border-radius: 20% !important; 79 | border-width: 1px !important; 80 | border-color: gray !important; 81 | color: #6E9A52 !important; 82 | padding: 2px !important; 83 | } 84 | 85 | /* weekLine white css*/ 86 | 87 | .weekDays-white a 88 | { 89 | padding: 0px 3px 0px 3px !important; 90 | border-width: 1px !important; 91 | border-style: dotted !important; 92 | color: Gray !important; 93 | text-decoration: none !important; 94 | } 95 | 96 | .weekDays-white a:hover 97 | { 98 | border-style: solid !important; 99 | border-width: 1px 1px 2px 1px !important; 100 | text-decoration: none !important; 101 | color: Gray !important; 102 | } 103 | 104 | .weekDays-white .selectedDay 105 | { 106 | background-color: #F5F5F5 !important; 107 | border-style: solid !important; 108 | border-width: 1px 1px 2px 1px !important; 109 | border-color: gray !important; 110 | color: #505050 !important; 111 | } -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | var target = grunt.option('target') || 'dev'; 3 | grunt.initConfig({ 4 | pkg: grunt.file.readJSON('package.json'), 5 | uglify: { 6 | options: { 7 | banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' 8 | }, 9 | build: { 10 | src: 'asset/js/schedulizer_bundle.js', 11 | dest: 'asset/js/schedulizer_bundle.min.js' 12 | } 13 | }, 14 | browserify: { 15 | dist: { 16 | files: { 17 | 'asset/js/schedulizer_bundle.js': ['asset/js/bundleme.js'] 18 | } 19 | } 20 | }, 21 | cssmin: { 22 | target: { 23 | files: [{ 24 | expand: true, 25 | cwd: 'css', 26 | src: ['*css','!*.min.css'], 27 | dest: 'styles', 28 | ext: '.min.css', 29 | extDot: 'last' // Extensions in filenames begin after the last dot 30 | }, 31 | { 32 | expand: true, 33 | cwd: 'css', 34 | src: ['*.min.css'], 35 | dest: 'styles', 36 | ext: '.css', 37 | extDot: 'last' // Extensions in filenames begin after the last dot 38 | }] 39 | } 40 | }, 41 | watch: { 42 | css: { 43 | files: 'css/*', 44 | tasks: ['cssmin'], 45 | options: { 46 | spawn:false, 47 | event:['all'] 48 | }, 49 | }, 50 | scripts: { 51 | files: 'asset/js/*', 52 | tasks: ['browserify','copy:browserifybundle'], 53 | options: { 54 | spawn:false, 55 | event:['all'] 56 | }, 57 | }, 58 | }, 59 | copy: { 60 | main: { 61 | expand: true, src: ['asset/js/config.example.js'], dest: '', 62 | // Copy if file does not exist. 63 | filter: function (filepath) { 64 | // Return false if the file exists. 65 | return !(grunt.file.exists(filepath.replace('.example',''))); 66 | }, 67 | rename: function(dest, src) { 68 | return dest + src.replace('.example',''); 69 | } 70 | }, 71 | browserifybundle: { 72 | expand: true, src: ['asset/js/schedulizer_bundle.js'], dest: '', 73 | rename: function(dest, src) { 74 | return dest + src.replace('.js','.min.js'); 75 | } 76 | } 77 | } 78 | }); 79 | grunt.loadNpmTasks('grunt-contrib-copy'); 80 | grunt.loadNpmTasks('grunt-contrib-watch'); 81 | grunt.loadNpmTasks('grunt-contrib-uglify'); 82 | grunt.loadNpmTasks('grunt-contrib-cssmin'); 83 | grunt.loadNpmTasks('grunt-browserify'); 84 | grunt.loadNpmTasks('grunt-bower-task'); 85 | var tasks = ['copy:main','browserify','cssmin']; 86 | if(target==="prod"){ 87 | tasks.push("uglify"); 88 | } 89 | else{ 90 | tasks.push("copy:browserifybundle"); 91 | } 92 | grunt.registerTask('default', tasks); 93 | grunt.registerTask('dev', ['default','watch']); 94 | }; -------------------------------------------------------------------------------- /js/jquery.fitvids.js: -------------------------------------------------------------------------------- 1 | /*global jQuery */ 2 | /*jshint multistr:true browser:true */ 3 | /*! 4 | * FitVids 1.0.3 5 | * 6 | * Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com 7 | * Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/ 8 | * Released under the WTFPL license - http://sam.zoy.org/wtfpl/ 9 | * 10 | * Date: Thu Sept 01 18:00:00 2011 -0500 11 | */ 12 | 13 | (function( $ ){ 14 | 15 | "use strict"; 16 | 17 | $.fn.fitVids = function( options ) { 18 | var settings = { 19 | customSelector: null 20 | }; 21 | 22 | if(!document.getElementById('fit-vids-style')) { 23 | 24 | var div = document.createElement('div'), 25 | ref = document.getElementsByTagName('base')[0] || document.getElementsByTagName('script')[0], 26 | cssStyles = '­'; 27 | 28 | div.className = 'fit-vids-style'; 29 | div.id = 'fit-vids-style'; 30 | div.style.display = 'none'; 31 | div.innerHTML = cssStyles; 32 | 33 | ref.parentNode.insertBefore(div,ref); 34 | 35 | } 36 | 37 | if ( options ) { 38 | $.extend( settings, options ); 39 | } 40 | 41 | return this.each(function(){ 42 | var selectors = [ 43 | "iframe[src*='player.vimeo.com']", 44 | "iframe[src*='youtube.com']", 45 | "iframe[src*='youtube-nocookie.com']", 46 | "iframe[src*='kickstarter.com'][src*='video.html']", 47 | "object", 48 | "embed" 49 | ]; 50 | 51 | if (settings.customSelector) { 52 | selectors.push(settings.customSelector); 53 | } 54 | 55 | var $allVideos = $(this).find(selectors.join(',')); 56 | $allVideos = $allVideos.not("object object"); // SwfObj conflict patch 57 | 58 | $allVideos.each(function(){ 59 | var $this = $(this); 60 | if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; } 61 | var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(), 62 | width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(), 63 | aspectRatio = height / width; 64 | if(!$this.attr('id')){ 65 | var videoID = 'fitvid' + Math.floor(Math.random()*999999); 66 | $this.attr('id', videoID); 67 | } 68 | $this.wrap('
    ').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+"%"); 69 | $this.removeAttr('height').removeAttr('width'); 70 | }); 71 | }); 72 | }; 73 | // Works with either jQuery or Zepto 74 | })( window.jQuery || window.Zepto ); 75 | -------------------------------------------------------------------------------- /js/jquery.easypiechart.min.js: -------------------------------------------------------------------------------- 1 | /**! 2 | * easyPieChart 3 | * Lightweight plugin to render simple, animated and retina optimized pie charts 4 | * 5 | * @license 6 | * @author Robert Fleischmann (http://robert-fleischmann.de) 7 | * @version 2.1.5 8 | **/ 9 | !function(a,b){"object"==typeof exports?module.exports=b():"function"==typeof define&&define.amd?define([],b):a.EasyPieChart=b()}(this,function(){var a=function(a,b){var c,d=document.createElement("canvas");a.appendChild(d),"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size;var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0>=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f>=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,"number"==typeof e.animate&&(e.animate={duration:e.animate,enabled:!0}),"boolean"!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent?this.update(parseFloat(b.dataset.percent)):b.getAttribute&&b.getAttribute("data-percent")&&this.update(parseFloat(b.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()};return b}); -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | MSCschedulizer 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 |
    67 | 68 | 69 |
    70 |
    71 | 72 | 73 |
    74 |
    75 |
    76 |
    77 |

    404

    78 |

    File not Found

    79 |

    We're sorry, but the page you were looking for doesn't exist.

    80 | 81 |
    82 |
    83 |
    84 |
    85 | 86 | 87 | 88 | 89 |
    90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /css/slicknav.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * SlickNav Responsive Mobile Menu v1.0.3 3 | * (c) 2015 Josh Cope 4 | * licensed under MIT 5 | */ 6 | .slicknav_btn { 7 | cursor: pointer; 8 | display: block; 9 | float: right; 10 | height: 35px; 11 | line-height: 50px; 12 | padding: 10px 0 9px; 13 | position: relative; 14 | vertical-align: middle; 15 | width: 44px; 16 | } 17 | .slicknav_btn .slicknav_icon-bar + .slicknav_icon-bar { 18 | margin-top: 0.188em; } 19 | 20 | .slicknav_menu { 21 | *zoom: 1; } 22 | .slicknav_menu .slicknav_menutxt { 23 | display: block; 24 | line-height: 1.188em; 25 | float: left; } 26 | .slicknav_menu .slicknav_icon { 27 | margin: 0.188em 0 0 0.438em; } 28 | .slicknav_menu .slicknav_no-text { 29 | margin: 0; } 30 | .slicknav_menu .slicknav_icon-bar { 31 | display: block; 32 | width: 1.125em; 33 | height: 0.125em; 34 | margin: 0 auto; 35 | -webkit-border-radius: 1px; 36 | -moz-border-radius: 1px; 37 | border-radius: 1px; 38 | -webkit-transition: all 0.2s linear; 39 | -moz-transition: all 0.2s linear; 40 | -o-transition: all 0.2s linear; 41 | transition: all 0.2s linear; 42 | } 43 | 44 | .slicknav_menu .slicknav_btn:hover .slicknav_icon-bar{ 45 | background: #ffffff; 46 | } 47 | .slicknav_menu:before { 48 | content: " "; 49 | display: table; } 50 | .slicknav_menu:after { 51 | content: " "; 52 | display: table; 53 | clear: both; } 54 | 55 | .slicknav_nav { 56 | clear: both; } 57 | .slicknav_nav ul { 58 | display: block; } 59 | .slicknav_nav li { 60 | display: block; 61 | line-height: 30px; 62 | } 63 | .slicknav_nav li:not(:first-child){ 64 | border-top: 1px solid rgba(0,0,0,0.04); 65 | } 66 | .slicknav_nav .slicknav_arrow { 67 | background: #ededed; 68 | float: right; 69 | text-align: center; 70 | width: 35px; 71 | color: #666; 72 | } 73 | .slicknav_nav .slicknav_item { 74 | cursor: pointer; } 75 | .slicknav_nav .slicknav_item a { 76 | display: inline; } 77 | .slicknav_nav .slicknav_row { 78 | display: block; } 79 | .slicknav_nav a { 80 | display: block; } 81 | .slicknav_nav .slicknav_parent-link a { 82 | display: inline; } 83 | 84 | .slicknav_brand { 85 | float: left; } 86 | 87 | .slicknav_menu { 88 | font-size: 16px; 89 | box-sizing: border-box; 90 | } 91 | .slicknav_menu ul{ 92 | background: #fff; 93 | } 94 | .slicknav_menu * { 95 | box-sizing: border-box; } 96 | .slicknav_menu .slicknav_menutxt { 97 | color: #fff; 98 | font-weight: bold; 99 | text-shadow: 0 1px 3px #000; } 100 | 101 | .slicknav_btn { 102 | border: 1px solid; 103 | border-radius: 0; 104 | margin: 16px 15px; 105 | -webkit-transition: all 0.2s linear; 106 | -moz-transition: all 0.2s linear; 107 | -o-transition: all 0.2s linear; 108 | transition: all 0.2s linear; 109 | } 110 | 111 | .slicknav_nav { 112 | color: #fff; 113 | font-size: 0.875em; 114 | list-style: outside none none; 115 | margin: 0; 116 | max-height: 350px; 117 | overflow-y: scroll; 118 | padding: 0; 119 | width: 100%; 120 | } 121 | .slicknav_nav ul { 122 | list-style: none; 123 | overflow: hidden; 124 | padding: 0; 125 | margin: 0 0 0 20px; } 126 | .slicknav_nav .slicknav_row { 127 | padding: 5px 10px; 128 | margin: 2px 5px; } 129 | .slicknav_nav a { 130 | padding: 5px 10px; 131 | margin: 2px 5px; 132 | text-decoration: none; 133 | color: #666; } 134 | .slicknav_nav .slicknav_txtnode { 135 | margin-left: 15px; } 136 | .slicknav_nav .slicknav_item a { 137 | padding: 0; 138 | margin: 0; } 139 | .slicknav_nav .slicknav_parent-link a { 140 | padding: 0; 141 | margin: 0; } 142 | 143 | .slicknav_brand { 144 | color: #fff; 145 | font-size: 18px; 146 | line-height: 30px; 147 | padding: 7px 12px; 148 | height: 44px; } 149 | -------------------------------------------------------------------------------- /js/jquery.appear.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery.appear 3 | * https://github.com/bas2k/jquery.appear/ 4 | * http://code.google.com/p/jquery-appear/ 5 | * 6 | * Copyright (c) 2009 Michael Hixson 7 | * Copyright (c) 2012 Alexander Brovikov 8 | * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) 9 | */ 10 | (function($) { 11 | $.fn.appear = function(fn, options) { 12 | 13 | var settings = $.extend({ 14 | 15 | //arbitrary data to pass to fn 16 | data: undefined, 17 | 18 | //call fn only on the first appear? 19 | one: true, 20 | 21 | // X & Y accuracy 22 | accX: 0, 23 | accY: 0 24 | 25 | }, options); 26 | 27 | return this.each(function() { 28 | 29 | var t = $(this); 30 | 31 | //whether the element is currently visible 32 | t.appeared = false; 33 | 34 | if (!fn) { 35 | 36 | //trigger the custom event 37 | t.trigger('appear', settings.data); 38 | return; 39 | } 40 | 41 | var w = $(window); 42 | 43 | //fires the appear event when appropriate 44 | var check = function() { 45 | 46 | //is the element hidden? 47 | if (!t.is(':visible')) { 48 | 49 | //it became hidden 50 | t.appeared = false; 51 | return; 52 | } 53 | 54 | //is the element inside the visible window? 55 | var a = w.scrollLeft(); 56 | var b = w.scrollTop(); 57 | var o = t.offset(); 58 | var x = o.left; 59 | var y = o.top; 60 | 61 | var ax = settings.accX; 62 | var ay = settings.accY; 63 | var th = t.height(); 64 | var wh = w.height(); 65 | var tw = t.width(); 66 | var ww = w.width(); 67 | 68 | if (y + th + ay >= b && 69 | y <= b + wh + ay && 70 | x + tw + ax >= a && 71 | x <= a + ww + ax) { 72 | 73 | //trigger the custom event 74 | if (!t.appeared) t.trigger('appear', settings.data); 75 | 76 | } else { 77 | 78 | //it scrolled out of view 79 | t.appeared = false; 80 | } 81 | }; 82 | 83 | //create a modified fn with some additional logic 84 | var modifiedFn = function() { 85 | 86 | //mark the element as visible 87 | t.appeared = true; 88 | 89 | //is this supposed to happen only once? 90 | if (settings.one) { 91 | 92 | //remove the check 93 | w.unbind('scroll', check); 94 | var i = $.inArray(check, $.fn.appear.checks); 95 | if (i >= 0) $.fn.appear.checks.splice(i, 1); 96 | } 97 | 98 | //trigger the original fn 99 | fn.apply(this, arguments); 100 | }; 101 | 102 | //bind the modified fn to the element 103 | if (settings.one) t.one('appear', settings.data, modifiedFn); 104 | else t.bind('appear', settings.data, modifiedFn); 105 | 106 | //check whenever the window scrolls 107 | w.scroll(check); 108 | 109 | //check whenever the dom changes 110 | $.fn.appear.checks.push(check); 111 | 112 | //check now 113 | (check)(); 114 | }); 115 | }; 116 | 117 | //keep a queue of appearance checks 118 | $.extend($.fn.appear, { 119 | 120 | checks: [], 121 | timeout: null, 122 | 123 | //process the queue 124 | checkAll: function() { 125 | var length = $.fn.appear.checks.length; 126 | if (length > 0) while (length--) ($.fn.appear.checks[length])(); 127 | }, 128 | 129 | //check the queue asynchronously 130 | run: function() { 131 | if ($.fn.appear.timeout) clearTimeout($.fn.appear.timeout); 132 | $.fn.appear.timeout = setTimeout($.fn.appear.checkAll, 20); 133 | } 134 | }); 135 | 136 | //run checks when these methods are called 137 | $.each(['append', 'prepend', 'after', 'before', 'attr', 138 | 'removeAttr', 'addClass', 'removeClass', 'toggleClass', 139 | 'remove', 'css', 'show', 'hide'], function(i, n) { 140 | var old = $.fn[n]; 141 | if (old) { 142 | $.fn[n] = function() { 143 | var r = old.apply(this, arguments); 144 | $.fn.appear.run(); 145 | return r; 146 | } 147 | } 148 | }); 149 | 150 | })(jQuery); -------------------------------------------------------------------------------- /includes/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
    4 |
    5 |
    6 |
    7 | 8 | 12 | 13 |
    14 | 15 |
    16 | 17 | 34 | 35 |
    36 | 37 |
    38 | 39 |
    40 | 41 |
    42 | 43 | 44 | 45 | 46 | 47 | 85 | 86 | -------------------------------------------------------------------------------- /favorites.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | MSCschedulizer 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
    80 | 81 | 82 |
    83 |
    84 | 85 | 86 | 87 | 88 |
    89 |
    90 |
    91 | 92 | 93 |
    94 | 95 |
    96 | 97 |

    Favorites

    98 |
    Loading Favorited Schedules...
    99 |
    100 |
    101 |
    102 |
    103 |
    104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 |
    112 | 113 | 114 | -------------------------------------------------------------------------------- /preview.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | MSCschedulizer 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 94 |
    Loading Schedule...
    95 | 96 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /generate.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | MSCschedulizer 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 |
    93 | 94 | 95 |
    96 |
    97 | 98 | 99 | 100 | 101 |
    102 |
    103 |
    104 |
    105 | 106 |
    107 | 108 |

    Schedules

    109 |
    110 |
    Loading Schedules...
    111 |
    112 |
    113 |
    114 |
    115 |
    116 | 117 | 118 | 119 | 120 | 121 |
    122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /visual_filter.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | MSCschedulizer 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 |
    93 | 94 | 95 |
    96 |
    97 | 98 | 99 | 100 | 101 |
    102 |
    103 |
    104 |
    105 | 106 |
    107 | 108 |

    Schedules

    109 |
    110 |
    Loading Schedules...
    111 |
    112 |
    113 |
    114 |
    115 |
    116 | 117 | 118 | 119 | 120 | 121 |
    122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /js/jquery.endless-scroll.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Endless Scroll plugin for jQuery 3 | * 4 | * v1.4.8 5 | * 6 | * Copyright (c) 2008 Fred Wu 7 | * 8 | * Dual licensed under the MIT and GPL licenses: 9 | * http://www.opensource.org/licenses/mit-license.php 10 | * http://www.gnu.org/licenses/gpl.html 11 | */ 12 | 13 | /** 14 | * Usage: 15 | * 16 | * // using default options 17 | * $(document).endlessScroll(); 18 | * 19 | * // using some custom options 20 | * $(document).endlessScroll({ 21 | * fireOnce: false, 22 | * fireDelay: false, 23 | * loader: "
    ", 24 | * callback: function(){ 25 | * alert("test"); 26 | * } 27 | * }); 28 | * 29 | * Configuration options: 30 | * 31 | * bottomPixels integer the number of pixels from the bottom of the page that triggers the event 32 | * fireOnce boolean only fire once until the execution of the current event is completed 33 | * fireDelay integer delay the subsequent firing, in milliseconds, 0 or false to disable delay 34 | * loader string the HTML to be displayed during loading 35 | * data string|function plain HTML data, can be either a string or a function that returns a string, 36 | * when passed as a function it accepts one argument: fire sequence (the number 37 | * of times the event triggered during the current page session) 38 | * insertAfter string jQuery selector syntax: where to put the loader as well as the plain HTML data 39 | * callback function callback function, accepts one argument: fire sequence (the number of times 40 | * the event triggered during the current page session) 41 | * resetCounter function resets the fire sequence counter if the function returns true, this function 42 | * could also perform hook actions since it is applied at the start of the event 43 | * ceaseFire function stops the event (no more endless scrolling) if the function returns true 44 | * 45 | * Usage tips: 46 | * 47 | * The plugin is more useful when used with the callback function, which can then make AJAX calls to retrieve content. 48 | * The fire sequence argument (for the callback function) is useful for 'pagination'-like features. 49 | */ 50 | 51 | (function($){ 52 | 53 | $.fn.endlessScroll = function(options) { 54 | 55 | var defaults = { 56 | bottomPixels: 50, 57 | fireOnce: true, 58 | fireDelay: 150, 59 | loader: "
    Loading...
    ", 60 | data: "", 61 | insertAfter: "div:last", 62 | resetCounter: function() { return false; }, 63 | callback: function() { return true; }, 64 | ceaseFire: function() { return false; } 65 | }; 66 | 67 | var options = $.extend({}, defaults, options); 68 | 69 | var firing = true; 70 | var fired = false; 71 | var fireSequence = 0; 72 | 73 | if (options.ceaseFire.apply(this) === true) { 74 | firing = false; 75 | } 76 | 77 | if (firing === true) { 78 | $(this).scroll(function() { 79 | if (options.ceaseFire.apply(this) === true) { 80 | firing = false; 81 | return; // Scroll will still get called, but nothing will happen 82 | } 83 | 84 | if (this == document || this == window) { 85 | var is_scrollable = $(document).height() - $(window).height() <= $(window).scrollTop() + options.bottomPixels; 86 | } else { 87 | // calculates the actual height of the scrolling container 88 | var inner_wrap = $(".endless_scroll_inner_wrap", this); 89 | if (inner_wrap.length == 0) { 90 | inner_wrap = $(this).wrapInner("
    ").find(".endless_scroll_inner_wrap"); 91 | } 92 | var is_scrollable = inner_wrap.length > 0 && 93 | (inner_wrap.height() - $(this).height() <= $(this).scrollTop() + options.bottomPixels); 94 | } 95 | 96 | if (is_scrollable && (options.fireOnce == false || (options.fireOnce == true && fired != true))) { 97 | if (options.resetCounter.apply(this) === true) fireSequence = 0; 98 | 99 | fired = true; 100 | fireSequence++; 101 | 102 | $(options.insertAfter).after("
    " + options.loader + "
    "); 103 | 104 | data = typeof options.data == 'function' ? options.data.apply(this, [fireSequence]) : options.data; 105 | 106 | if (data !== false) { 107 | $(options.insertAfter).after("
    " + data + "
    "); 108 | $("div#endless_scroll_data").hide().fadeIn(); 109 | $("div#endless_scroll_data").removeAttr("id"); 110 | 111 | options.callback.apply(this, [fireSequence]); 112 | 113 | if (options.fireDelay !== false || options.fireDelay !== 0) { 114 | $("body").after("
    "); 115 | // slight delay for preventing event firing twice 116 | $("div#endless_scroll_marker").fadeTo(options.fireDelay, 1, function() { 117 | $(this).remove(); 118 | fired = false; 119 | }); 120 | } 121 | else { 122 | fired = false; 123 | } 124 | } 125 | 126 | $("div#endless_scroll_loader").remove(); 127 | } 128 | }); 129 | } 130 | }; 131 | 132 | })(jQuery); 133 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | MSCschedulizer 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 |
    71 | 72 | 73 |
    74 |
    75 | 76 | 77 | 78 | 79 |
    80 | 81 | 118 | 119 |
    120 | 121 |
    122 |
    123 |
    124 |
    125 | 126 |
    127 | 128 |

    Demo

    129 | 130 |
    131 |
    132 |
    133 |
    134 |
    135 | 136 | 137 |
    138 | 139 | 140 | 141 | -------------------------------------------------------------------------------- /select-classes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | MSCschedulizer 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 |
    76 | 77 | 78 |
    79 |
    80 | 81 | 82 | 83 | 84 |
    85 |
    86 |
    87 | 88 | 134 |
    135 |
    136 |
    137 | 138 | 139 | 140 | 141 | 142 |
    143 | 144 | 145 | 146 | 147 | -------------------------------------------------------------------------------- /webfor.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Add or Drop Classes 5 | 6 | 7 |

    Add Classes Worksheet

    8 |  Go to the MSCschedulizer 9 | 10 | 49 |
    50 | 51 | 52 | 53 | 54 | 55 | 63 | 71 | 79 | 87 | 95 | 103 | 111 | 119 | 127 | 135 |
    CRNs
    56 | 57 | 58 | 59 | 60 | 61 | 62 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 128 | 129 | 130 | 131 | 132 | 133 | 134 |
    136 | 137 | 138 | 139 | 140 |
    141 | 142 |
    143 | 144 | 145 | 146 | 147 | -------------------------------------------------------------------------------- /js/nivo-lightbox.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Nivo Lightbox v1.0 3 | * http://dev7studios.com/nivo-lightbox 4 | * 5 | * Copyright 2013, Dev7studios 6 | * Free to use and abuse under the MIT license. 7 | * http://www.opensource.org/licenses/mit-license.php 8 | */ 9 | 10 | (function(e,t,n,r){function o(t,n){this.el=t;this.$el=e(this.el);this.options=e.extend({},s,n);this._defaults=s;this._name=i;this.init()}var i="nivoLightbox",s={effect:"fade",theme:"default",keyboardNav:true,onInit:function(){},beforeShowLightbox:function(){},afterShowLightbox:function(e){},beforeHideLightbox:function(){},afterHideLightbox:function(){},onPrev:function(e){},onNext:function(e){},errorMessage:"The requested content cannot be loaded. Please try again later."};o.prototype={init:function(){var t=this;this.$el.on("click",function(e){e.preventDefault();t.showLightbox()});if(this.options.keyboardNav){e("body").off("keyup").on("keyup",function(n){var r=n.keyCode?n.keyCode:n.which;if(r==27)t.destructLightbox();if(r==37)e(".nivo-lightbox-prev").trigger("click");if(r==39)e(".nivo-lightbox-next").trigger("click")})}this.options.onInit.call(this)},showLightbox:function(){var t=this;this.options.beforeShowLightbox.call(this);var n=this.constructLightbox();if(!n)return;var r=n.find(".nivo-lightbox-content");if(!r)return;var i=this.$el;e("body").addClass("nivo-lightbox-body-effect-"+this.options.effect);this.processContent(r,i);if(this.$el.attr("data-lightbox-gallery")){var t=this,s=e('[data-lightbox-gallery="'+this.$el.attr("data-lightbox-gallery")+'"]');e(".nivo-lightbox-nav").show();e(".nivo-lightbox-prev").off("click").on("click",function(n){n.preventDefault();var o=s.index(i);i=s.eq(o-1);if(!e(i).length)i=s.last();t.processContent(r,i);t.options.onPrev.call(this,[i])});e(".nivo-lightbox-next").off("click").on("click",function(n){n.preventDefault();var o=s.index(i);i=s.eq(o+1);if(!e(i).length)i=s.first();t.processContent(r,i);t.options.onNext.call(this,[i])})}setTimeout(function(){n.addClass("nivo-lightbox-open");t.options.afterShowLightbox.call(this,[n])},1)},processContent:function(n,r){var i=this;var s=r.attr("href");n.html("").addClass("nivo-lightbox-loading");if(this.isHidpi()&&r.attr("data-lightbox-hidpi")){s=r.attr("data-lightbox-hidpi")}if(s.match(/\.(jpeg|jpg|gif|png)$/)!=null){var o=e("",{src:s});o.one("load",function(){var r=e('
    ');r.append(o);n.html(r).removeClass("nivo-lightbox-loading");r.css({"line-height":e(".nivo-lightbox-content").height()+"px",height:e(".nivo-lightbox-content").height()+"px"});e(t).resize(function(){r.css({"line-height":e(".nivo-lightbox-content").height()+"px",height:e(".nivo-lightbox-content").height()+"px"})})}).each(function(){if(this.complete)e(this).load()});o.error(function(){var t=e('

    '+i.options.errorMessage+"

    ");n.html(t).removeClass("nivo-lightbox-loading")})}else if(video=s.match(/(youtube|youtu|vimeo)\.(com|be)\/(watch\?v=(\w+)|(\w+))/)){var u="",a="nivo-lightbox-video";if(video[1]=="youtube"){u="http://www.youtube.com/v/"+video[4];a="nivo-lightbox-youtube"}if(video[1]=="youtu"){u="http://www.youtube.com/v/"+video[3];a="nivo-lightbox-youtube"}if(video[1]=="vimeo"){u="http://player.vimeo.com/video/"+video[3];a="nivo-lightbox-vimeo"}if(u){var f=e("