/** * AngularUI - The companion suite for AngularJS * @version v0.4.0 - 2013-02-15 * @link http://angular-ui.github.com * @license MIT License, http://www.opensource.org/licenses/MIT */ angular.module('ui.config', []).value('ui.config', {}); angular.module('ui.filters', ['ui.config']); angular.module('ui.directives', ['ui.config']); angular.module('ui', ['ui.filters', 'ui.directives', 'ui.config']); /** * Animates the injection of new DOM elements by simply creating the DOM with a class and then immediately removing it * Animations must be done using CSS3 transitions, but provide excellent flexibility * * @todo Add proper support for animating out * @param [options] {mixed} Can be an object with multiple options, or a string with the animation class * class {string} the CSS class(es) to use. For example, 'ui-hide' might be an excellent alternative class. * @example
  • {{item}}
  • */ angular.module('ui.directives').directive('uiAnimate', ['ui.config', '$timeout', function (uiConfig, $timeout) { var options = {}; if (angular.isString(uiConfig.animate)) { options['class'] = uiConfig.animate; } else if (uiConfig.animate) { options = uiConfig.animate; } return { restrict: 'A', // supports using directive as element, attribute and class link: function ($scope, element, attrs) { var opts = {}; if (attrs.uiAnimate) { opts = $scope.$eval(attrs.uiAnimate); if (angular.isString(opts)) { opts = {'class': opts}; } } opts = angular.extend({'class': 'ui-animate'}, options, opts); element.addClass(opts['class']); $timeout(function () { element.removeClass(opts['class']); }, 20, false); } }; }]); /* * AngularJs Fullcalendar Wrapper for the JQuery FullCalendar * API @ http://arshaw.com/fullcalendar/ * * Angular Calendar Directive that takes in the [eventSources] nested array object as the ng-model and watches (eventSources.length + eventSources[i].length) for changes. * Can also take in multiple event urls as a source object(s) and feed the events per view. * The calendar will watch any eventSource array and update itself when a delta is created * An equalsTracker attrs has been added for use cases that would render the overall length tracker the same even though the events have changed to force updates. * */ angular.module('ui.directives').directive('uiCalendar',['ui.config', '$parse', function (uiConfig,$parse) { uiConfig.uiCalendar = uiConfig.uiCalendar || {}; //returns calendar return { require: 'ngModel', restrict: 'A', link: function(scope, elm, attrs, $timeout) { var sources = scope.$eval(attrs.ngModel); var tracker = 0; /* returns the length of all source arrays plus the length of eventSource itself */ var getSources = function () { var equalsTracker = scope.$eval(attrs.equalsTracker); tracker = 0; angular.forEach(sources,function(value,key){ if(angular.isArray(value)){ tracker += value.length; } }); if(angular.isNumber(equalsTracker)){ return tracker + sources.length + equalsTracker; }else{ return tracker + sources.length; } }; /* update the calendar with the correct options */ function update() { //calendar object exposed on scope scope.calendar = elm.html(''); var view = scope.calendar.fullCalendar('getView'); if(view){ view = view.name; //setting the default view to be whatever the current view is. This can be overwritten. } /* If the calendar has options added then render them */ var expression, options = { defaultView : view, eventSources: sources }; if (attrs.uiCalendar) { expression = scope.$eval(attrs.uiCalendar); } else { expression = {}; } angular.extend(options, uiConfig.uiCalendar, expression); scope.calendar.fullCalendar(options); } update(); /* watches all eventSources */ scope.$watch(getSources, function( newVal, oldVal ) { update(); }); } }; }]); /*global angular, CodeMirror, Error*/ /** * Binds a CodeMirror widget to a