diff --git a/api/event/event.model.js b/api/event/event.model.js index 21030737b..4aebb6745 100644 --- a/api/event/event.model.js +++ b/api/event/event.model.js @@ -53,6 +53,10 @@ var EventSchema = new Schema({ type : Boolean, default : false }, + isExample : { + type : Boolean, + default : false + }, __private : { verificationCode : String, unsubscribeCode : String, diff --git a/helpers/notification.helper.js b/helpers/notification.helper.js index a7e8e92e2..bd3e170ce 100644 --- a/helpers/notification.helper.js +++ b/helpers/notification.helper.js @@ -9,13 +9,13 @@ var mandrill = require('mandrill-api'); var mandrill_client = new mandrill.Mandrill(app.get('mandrillAPIKey')); communicator.on('event:create', function(event){ - if (!event.creator.allowNotifications && event.isClosed) return; + if (!event.creator.allowNotifications || event.isClosed || event.isExample) return; sendEmailConfirmation(event); sendInvites(event); }); communicator.on('event:update:creator.email', function(event, oldEvent){ - if (!event.creator.allowNotifications && event.isClosed) return; + if (!event.creator.allowNotifications || event.isClosed || event.isExample) return; verifyEmail(event); }); diff --git a/public/build/app.js b/public/build/app.js index 217c8eb9c..b31352f01 100644 --- a/public/build/app.js +++ b/public/build/app.js @@ -1,3 +1,3 @@ -angular.module("rallly",["ui.router","ngResource","btford.modal","ngTagsInput","ngAnimate"]).config(["$stateProvider","$urlRouterProvider","$locationProvider",function(e,n,t){t.html5Mode(!0),n.otherwise("/notfound"),e.state("index",{url:"/",templateUrl:"templates/home.html",controller:"HomeCtrl"}).state("newevent",{url:"/new",templateUrl:"templates/newEvent/layout.html",controller:"NewEventCtrl"}).state("newevent.general",{templateUrl:"templates/newEvent/general.html"}).state("newevent.datetime",{templateUrl:"templates/newEvent/datetime.html"}).state("newevent.invite",{templateUrl:"templates/newEvent/invite.html"}).state("newevent.success",{templateUrl:"templates/newEvent/success.html"}).state("about",{url:"/about",templateUrl:"templates/about.html",controller:"AboutCtrl"}).state("example",{url:"/example",controller:"ExampleCtrl"}).state("notfound",{url:"/notfound",templateUrl:"templates/notfound.html"}).state("event",{url:"/:id",templateUrl:"templates/event.html",controller:"EventCtrl"}).state("editevent",{url:"/:id/edit",templateUrl:"templates/editevent.html",controller:"EditEventCtrl"}).state("verifyevent",{url:"/verify/:id/code/:code",controller:"VerificationCtrl"}).state("deleteevent",{url:"/delete/:id/code/:code",controller:"DeletionCtrl"})}]).factory("Event",["$resource",function(e){return e("/api/event/:id",{id:"@_id"},{update:{method:"PUT"},verify:{method:"GET",url:"/api/event/:id/code/:code"},destroy:{method:"DELETE",url:"/api/event/:id/code/:code"}})}]).factory("Participant",["$resource",function(e){return e("/api/event/:id/participant/:pid",{id:"@_id"},{update:{method:"PUT"}})}]).factory("Comment",["$resource",function(e){return e("/api/event/:id/comment/:cid",{id:"@_id"},{update:{method:"PUT"}})}]).factory("Title",function(){return{set:function(e){document.title=e}}}),angular.module("rallly").run(["$templateCache",function(e){e.put("templates/about.html",'
\n
Frequently Asked Questions
\n
\n Want to find out more about Rallly? Check out the FAQs below.\n

What is Rallly?

\n

\n Rallly is a collaborative scheduling service that makes deciding on a date fast and easy. In other words, Rallly helps you and your friends decide on a date to host an event.\n

\n

Why is it called Rallly?

\n

\n The name is derived from the proper spelling of the word, “rally”. The Webster dictionary defines rally as, “to muster for a common purpose” which accurately describes the goal of this service. The inproper spelling can be attributed to the difficulty of finding short and meaningful domain names.\n

\n

Who made this?

\n

\n Rallly was created by Luke Vella.\n

\n
\n'),e.put("templates/confirmmodal.html",'
\n\n
\n\n
\n
{{modal.title}}
\n
\n {{modal.message}}\n
\n
\n \n \n
\n
\n\n
\n\n
\n'),e.put("templates/editevent.html",'
\n
\n\n
Edit Event
\n
\n You can makes changes to your existing event by changing the fields in the form below.\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n
\n\n
\n\n
\n\n
\n\n
\n \n \n Done\n
\n\n
\n\n
\n\n
\n'),e.put("templates/event.html",'
\n
\n
\n
\n
\n {{event.title}}\n Poll Closed\n Poll Open\n
\n
\n Created by {{event.creator.name}} • {{event.created | elapsed}}\n
\n
\n
\n \n
\n
\n
{{event.description}}
\n
\n Location:\n {{event.location}}\n
\n\n
\n
\n
\n
\n
\n\n
\n
\n Discussion\n
\n
\n You can discuss the event with your friends by leaving a comment below.\n
\n
\n\n
\n
\n
\n'),e.put("templates/home.html",'
\n
\n \n
\n
\n Schedule an Event\n
\n
\n Want to host an event but can’t decide on a date? Click on the button below to start!\n
\n \n
\n'),e.put("templates/notfound.html","

Error 404

\n

Not Found

\n"),e.put("templates/notification.html",'
\n
\n {{notification.title}}\n
\n
\n {{notification.message}}\n
\n
\n'),e.put("templates/directives/datePicker.html",'
\n
\n
\n \n \n {{title}}\n \n \n
\n
\n
\n Su\n
\n
\n Mo\n
\n
\n Tu\n
\n
\n We\n
\n
\n Th\n
\n
\n Fr\n
\n
\n Sa\n
\n
\n
\n
\n {{day.date | date : \'d\' }}\n
\n
\n
\n
\n'),e.put("templates/directives/discussion.html",'\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n \n \n Make sure you fill in all the fields.\n \n
\n
\n
\n
\n'),e.put("templates/directives/poll.html",'
\n
\n {{event.participants.length}} participants\n
\n
\n
\n
\n {{d | date: \'EEE\'}}\n
\n
\n {{d | date: \'d\'}}\n
\n
\n {{d | date : \'MMM\'}}\n
\n {{selectedDate($index)}}\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n \n \n \n \n {{participant.name}}\n
\n
\n \n \n \n
\n
\n
\n \n \n \n \n
\n
\n
\n
\n
\n
\n \n \n \n {{example.name}}\n
\n
\n \n \n
\n
\n\n
\n
\n
\n
\n Fill in the form below to get started\n
\n
\n
\n
\n
\n
\n \n \n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n'),e.put("templates/directives/timePicker.html",'
\n
\n
\n
\n {{date | date: \'EEE\'}}\n
\n
\n {{date | date: \'d\'}}\n
\n
\n {{date | date : \'MMM\'}}\n
\n \n
\n
\n
\n \n
\n
\n'),e.put("templates/form/dateForm.html",'
\n
Choose Dates
\n \n
\n
\n
\n
\n \n \n You need to select a few dates\n \n
\n\n
\n
\n
\n
\n'),e.put("templates/form/eventForm.html",'
\n
Event Details
\n
\n
\n
\n
\n
\n \n \n {{errors.title}}\n \n \n
\n
\n
\n
\n \n \n {{errors.location}}\n \n \n
\n
\n
\n
\n
\n \n \n
\n
\n
\n'),e.put("templates/form/participantsForm.html",'
\n
Invite Participants
\n
\n
\n
\n
\n \n \n \n\n
\n
\n
\n'),e.put("templates/form/settingsForm.html",'
\n
Settings
\n
\n
\n
\n
\n
\n Poll Status\n
\n
\n Let people vote on the poll.\n
\n
\n
\n
\n {{event.isClosed ? \'Closed\' : \'Open\' }}\n
\n
\n
\n
\n
\n
\n
\n
\n Notifications\n
\n
\n Send email notifications to the creator of this event.\n
\n
\n
\n
\n {{event.creator.allowNotifications ? \'Enabled\' : \'Disabled\' }}\n
\n
\n
\n
\n
\n
\n
\n
\n Delete Event\n
\n
\n Once you delete an event it will no longer be accessible.\n
\n
\n
\n \n
\n
\n
\n\n'),e.put("templates/form/timeForm.html",'
\n
Choose Times
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n \n Time 1\n \n Time 2\n \n Time 3\n
\n
\n
\n {{d.date | date: \'EEE\'}}\n
\n
\n {{d.date | date: \'d\'}}\n
\n
\n {{d.date | date : \'MMM\'}}\n
\n \n
\n
\n \n
\n
\n'),e.put("templates/form/userForm.html",'
\n
Your Details
\n
\n
\n
\n
\n
\n \n \n {{errors.name}}\n \n \n
\n
\n
\n
\n \n \n {{errors.email}}\n \n \n
\n
\n
\n
\n'),e.put("templates/newEvent/datetime.html",'
\n\n
\n\n
\n \n \n
\n'),e.put("templates/newEvent/general.html",'
\n\n
\n\n
\n\n
\n\n
\n \n
\n'),e.put("templates/newEvent/invite.html",'
\n
\n
Summary
\n
\n
\n
\n
\n
\n Your Name\n
\n
\n {{event.creator.name}}\n
\n
\n
\n
\n Email\n
\n
\n {{event.creator.email}}\n
\n
\n
\n
\n Title\n
\n
\n {{event.title}}\n
\n
\n
\n
\n Location\n
\n
\n {{event.location}}\n
\n
\n
\n
\n Description\n
\n
{{event.description}}
\n
\n
\n
\n Dates\n
\n
\n
    \n
  • \n
    \n
    \n {{d | date: \'EEE\'}}\n
    \n
    \n {{d | date: \'d\'}}\n
    \n
    \n {{d | date : \'MMM\'}}\n
    \n
    \n
  • \n
\n
\n
\n
\n
\n
\n
\n\n
\n\n
\n \n \n
\n'),e.put("templates/newEvent/layout.html",'
\n\n
Schedule a New Event
\n
\n Fill in the form below to create your event and share it with your friends and colleagues.\n
\n
    \n
  1. \n General Details\n
  2. \n
  3. \n Dates & Times\n
  4. \n
  5. \n Create & Send\n
  6. \n
\n
\n
\n\n
\n
\n
\n'),e.put("templates/newEvent/success.html",'
\n
\n \n
\n
Event Created
\n
\n Your event has been created successfully! You should receive an email shortly with instructions to verify your email address.\n
\n
\n
\n
\n \n GO\n
\n
\n')}]),angular.module("rallly").controller("AboutCtrl",["Title",function(e){e.set("About Rallly")}]),angular.module("rallly").controller("AccountCtrl",["$scope","ConfirmModal",function(e){e.showNotice=function(){}}]),angular.module("rallly").controller("DeletionCtrl",["$state","Notification","Event",function(e,n,t){t.destroy({id:e.params.id,code:e.params.code},function(){new n({title:"Event deleted",message:"This event has been deleted",type:"success",timeout:5e3})},function(){new n({title:"Deletion Failed",message:"The event could not be deleted. Make sure that it exists and that the url is correct",type:"error"})}),e.go("event",{id:e.params.id})}]),angular.module("rallly").controller("EditEventCtrl",["$scope","$http","$state","$timeout","Event","ConfirmModal","Notification","Title",function(e,n,t,i,a,o,s,l){var r=t.params.id;e.event=a.get({id:r},function(){l.set("Edit: "+e.event.title),e.master=angular.copy(e.event)},function(){t.go("notfound")}),e.undoChanges=function(){e.event=angular.copy(e.master)},e.didChange=function(){return JSON.stringify(e.master)!=JSON.stringify(e.event)},e.didChangeDates=function(){return JSON.stringify(e.master.dates)!=JSON.stringify(e.event.dates)},e.submit=function(){if(e.form.$valid)if(e.didChangeDates()){new o({title:"Hold up!",message:"Changing the dates will reset all entries by the participants. Are you sure you want to do that?",confirmText:"Yes, I'm sure",isDestructive:!0,confirm:function(){e.event.participants=[],d()}})}else d();else{new s({title:"Not so fast",message:"Make sure you fill in all the required fields and try again.",type:"error"})}};var d=function(){a.update({id:r},e.event,function(){new s({title:"Changes Saved",message:"Your changes have been saved successfully.",type:"success"});e.master=angular.copy(e.event)})}}]),angular.module("rallly").controller("EventCtrl",["$scope","$http","$state","Title","Event","ConfirmModal",function(e,n,t,i,a,o){var s=t.params.id;e.event=a.get({id:s},function(){i.set(e.event.title),e.eventUrl=t.href("event",{id:e.event._id},{absolute:!0})},function(){t.go("notfound")}),e.openEvent=function(){e.event.isClosed=!1,a.update({id:s},e.event,function(){new o({title:"Event Open",message:"People can vote and comment on this event.",cancelText:"OK"})})},e.closeEvent=function(){e.event.isClosed=!0,a.update({id:s},e.event,function(){new o({title:"Event Closed",message:"People can no longer vote or comment on this event.",cancelText:"OK"})})},e.editEvent=function(){t.go("editevent",{id:e.event._id})}}]),angular.module("rallly").controller("ExampleCtrl",["$state","Event",function(e,n){for(var t=[],i=new Date,a=0;4>a;a++)t.push(i.add(Math.ceil(5*Math.random())).days().toISOString());for(var o=["John Example","Jane Specimen","Mark Instance","Mary Case"],s=[],a=0;a\n
Frequently Asked Questions
\n
\n Want to find out more about Rallly? Check out the FAQs below.\n

What is Rallly?

\n

\n Rallly is a collaborative scheduling service that makes deciding on a date fast and easy. In other words, Rallly helps you and your friends decide on a date to host an event.\n

\n

Why is it called Rallly?

\n

\n The name is derived from the proper spelling of the word, “rally”. The Webster dictionary defines rally as, “to muster for a common purpose” which accurately describes the goal of this service. The inproper spelling can be attributed to the difficulty of finding short and meaningful domain names.\n

\n

Who made this?

\n

\n Rallly was created by Luke Vella.\n

\n\n'),e.put("templates/confirmmodal.html",'
\n\n
\n\n
\n
{{modal.title}}
\n
\n {{modal.message}}\n
\n
\n \n \n
\n
\n\n
\n\n
\n'),e.put("templates/editevent.html",'
\n
\n\n
Edit Event
\n
\n You can makes changes to your existing event by changing the fields in the form below.\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n
\n\n
\n\n
\n\n
\n\n
\n \n \n Done\n
\n\n
\n\n
\n\n
\n'),e.put("templates/event.html",'
\n
\n
\n
\n
\n {{event.title}}\n Poll Closed\n Poll Open\n
\n
\n Created by {{event.creator.name}} • {{event.created | elapsed}}\n
\n
\n
\n \n
\n
\n
{{event.description}}
\n
\n Location:\n {{event.location}}\n
\n\n
\n
\n
\n
\n
\n\n
\n
\n Discussion\n
\n
\n You can discuss the event with your friends by leaving a comment below.\n
\n
\n\n
\n
\n
\n'),e.put("templates/home.html",'
\n
\n \n
\n
\n Schedule an Event\n
\n
\n Want to host an event but can’t decide on a date? Click on the button below to start!\n
\n \n
\n'),e.put("templates/notfound.html","

Error 404

\n

Not Found

\n"),e.put("templates/notification.html",'
\n
\n {{notification.title}}\n
\n
\n {{notification.message}}\n
\n
\n'),e.put("templates/directives/datePicker.html",'
\n
\n
\n \n \n {{title}}\n \n \n
\n
\n
\n Su\n
\n
\n Mo\n
\n
\n Tu\n
\n
\n We\n
\n
\n Th\n
\n
\n Fr\n
\n
\n Sa\n
\n
\n
\n
\n {{day.date | date : \'d\' }}\n
\n
\n
\n
\n'),e.put("templates/directives/discussion.html",'\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n \n \n Make sure you fill in all the fields.\n \n
\n
\n
\n
\n'),e.put("templates/directives/poll.html",'
\n
\n {{event.participants.length}} participants\n
\n
\n
\n
\n {{d | date: \'EEE\'}}\n
\n
\n {{d | date: \'d\'}}\n
\n
\n {{d | date : \'MMM\'}}\n
\n {{selectedDate($index)}}\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n \n \n \n \n {{participant.name}}\n
\n
\n \n \n \n
\n
\n
\n \n \n \n \n
\n
\n
\n
\n
\n
\n \n \n \n {{example.name}}\n
\n
\n \n \n
\n
\n\n
\n
\n
\n
\n Fill in the form below to get started\n
\n
\n
\n
\n
\n
\n \n \n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n'),e.put("templates/directives/timePicker.html",'
\n
\n
\n
\n {{date | date: \'EEE\'}}\n
\n
\n {{date | date: \'d\'}}\n
\n
\n {{date | date : \'MMM\'}}\n
\n \n
\n
\n
\n \n
\n
\n'),e.put("templates/form/dateForm.html",'
\n
Choose Dates
\n \n
\n
\n
\n
\n \n \n You need to select a few dates\n \n
\n\n
\n
\n
\n
\n'),e.put("templates/form/eventForm.html",'
\n
Event Details
\n
\n
\n
\n
\n
\n \n \n {{errors.title}}\n \n \n
\n
\n
\n
\n \n \n {{errors.location}}\n \n \n
\n
\n
\n
\n
\n \n \n
\n
\n
\n'),e.put("templates/form/participantsForm.html",'
\n
Invite Participants
\n
\n
\n
\n
\n \n \n \n\n
\n
\n
\n'),e.put("templates/form/settingsForm.html",'
\n
Settings
\n
\n
\n
\n
\n
\n Poll Status\n
\n
\n Let people vote on the poll.\n
\n
\n
\n
\n {{event.isClosed ? \'Closed\' : \'Open\' }}\n
\n
\n
\n
\n
\n
\n
\n
\n Notifications\n
\n
\n Send email notifications to the creator of this event.\n
\n
\n
\n
\n {{event.creator.allowNotifications ? \'Enabled\' : \'Disabled\' }}\n
\n
\n
\n
\n
\n
\n
\n
\n Delete Event\n
\n
\n Once you delete an event it will no longer be accessible.\n
\n
\n
\n \n
\n
\n
\n\n'),e.put("templates/form/timeForm.html",'
\n
Choose Times
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n \n Time 1\n \n Time 2\n \n Time 3\n
\n
\n
\n {{d.date | date: \'EEE\'}}\n
\n
\n {{d.date | date: \'d\'}}\n
\n
\n {{d.date | date : \'MMM\'}}\n
\n \n
\n
\n \n
\n
\n'),e.put("templates/form/userForm.html",'
\n
Your Details
\n
\n
\n
\n
\n
\n \n \n {{errors.name}}\n \n \n
\n
\n
\n
\n \n \n {{errors.email}}\n \n \n
\n
\n
\n
\n'),e.put("templates/newEvent/datetime.html",'
\n\n
\n\n
\n \n \n
\n'),e.put("templates/newEvent/general.html",'
\n\n
\n\n
\n\n
\n\n
\n \n
\n'),e.put("templates/newEvent/invite.html",'
\n
\n
Summary
\n
\n
\n
\n
\n
\n Your Name\n
\n
\n {{event.creator.name}}\n
\n
\n
\n
\n Email\n
\n
\n {{event.creator.email}}\n
\n
\n
\n
\n Title\n
\n
\n {{event.title}}\n
\n
\n
\n
\n Location\n
\n
\n {{event.location}}\n
\n
\n
\n
\n Description\n
\n
{{event.description}}
\n
\n
\n
\n Dates\n
\n
\n
    \n
  • \n
    \n
    \n {{d | date: \'EEE\'}}\n
    \n
    \n {{d | date: \'d\'}}\n
    \n
    \n {{d | date : \'MMM\'}}\n
    \n
    \n
  • \n
\n
\n
\n
\n
\n
\n
\n\n
\n\n
\n \n \n
\n'),e.put("templates/newEvent/layout.html",'
\n\n
Schedule a New Event
\n
\n Fill in the form below to create your event and share it with your friends and colleagues.\n
\n
    \n
  1. \n General Details\n
  2. \n
  3. \n Dates & Times\n
  4. \n
  5. \n Create & Send\n
  6. \n
\n
\n
\n\n
\n
\n
\n'),e.put("templates/newEvent/success.html",'
\n
\n \n
\n
Event Created
\n
\n Your event has been created successfully! You should receive an email shortly with instructions to verify your email address.\n
\n
\n
\n
\n \n GO\n
\n
\n')}]),angular.module("rallly").controller("AboutCtrl",["Title",function(e){e.set("About Rallly")}]),angular.module("rallly").controller("AccountCtrl",["$scope","ConfirmModal",function(e){e.showNotice=function(){}}]),angular.module("rallly").controller("DeletionCtrl",["$state","Notification","Event",function(e,n,t){t.destroy({id:e.params.id,code:e.params.code},function(){new n({title:"Event deleted",message:"This event has been deleted",type:"success",timeout:5e3})},function(){new n({title:"Deletion Failed",message:"The event could not be deleted. Make sure that it exists and that the url is correct",type:"error"})}),e.go("event",{id:e.params.id})}]),angular.module("rallly").controller("EditEventCtrl",["$scope","$http","$state","$timeout","Event","ConfirmModal","Notification","Title",function(e,n,t,i,a,o,s,l){var r=t.params.id;e.event=a.get({id:r},function(){l.set("Edit: "+e.event.title),e.master=angular.copy(e.event)},function(){t.go("notfound")}),e.undoChanges=function(){e.event=angular.copy(e.master)},e.didChange=function(){return JSON.stringify(e.master)!=JSON.stringify(e.event)},e.didChangeDates=function(){return JSON.stringify(e.master.dates)!=JSON.stringify(e.event.dates)},e.submit=function(){if(e.form.$valid)if(e.didChangeDates()){new o({title:"Hold up!",message:"Changing the dates will reset all entries by the participants. Are you sure you want to do that?",confirmText:"Yes, I'm sure",isDestructive:!0,confirm:function(){e.event.participants=[],d()}})}else d();else{new s({title:"Not so fast",message:"Make sure you fill in all the required fields and try again.",type:"error"})}};var d=function(){a.update({id:r},e.event,function(){new s({title:"Changes Saved",message:"Your changes have been saved successfully.",type:"success"});e.master=angular.copy(e.event)})}}]),angular.module("rallly").controller("EventCtrl",["$scope","$http","$state","Title","Event","ConfirmModal",function(e,n,t,i,a,o){var s=t.params.id;e.event=a.get({id:s},function(){i.set(e.event.title),e.eventUrl=t.href("event",{id:e.event._id},{absolute:!0})},function(){t.go("notfound")}),e.openEvent=function(){e.event.isClosed=!1,a.update({id:s},e.event,function(){new o({title:"Event Open",message:"People can vote and comment on this event.",cancelText:"OK"})})},e.closeEvent=function(){e.event.isClosed=!0,a.update({id:s},e.event,function(){new o({title:"Event Closed",message:"People can no longer vote or comment on this event.",cancelText:"OK"})})},e.editEvent=function(){t.go("editevent",{id:e.event._id})}}]),angular.module("rallly").controller("ExampleCtrl",["$state","Event",function(e,n){for(var t=[],i=new Date,a=0;4>a;a++)t.push(i.add(Math.ceil(5*Math.random())).days().toISOString());for(var o=["John Example","Jane Specimen","Mark Instance","Mary Case"],s=[],a=0;a0;console.log(t),t||e.toggleMenu()};n.$on("$stateChangeSuccess",function(){angular.element("body").removeClass("open-menu"),i.unbind("click",a)}),e.toggleMenu=function(){var e=angular.element("body").hasClass("open-menu");e?(angular.element("body").removeClass("open-menu"),i.unbind("click",a)):(angular.element("body").addClass("open-menu"),i.bind("click",a))}}]),angular.module("rallly").controller("NewEventCtrl",["$scope","$http","$state","Event","ConfirmModal","Notification",function(e,n,t,i,a){e.title="Schedule a New Event",e.description="Fill in the form below to create your event and share it with your friends and colleagues.",e.event={};var o=["newevent.general","newevent.datetime","newevent.invite"];e.page=1;var s=function(n){e.page=n,t.go(o[n-1])};s(e.page),e.submit=function(){if(e.form.$valid&&e.page==o.length){console.log(JSON.stringify(e.event));var n=new i(e.event);n.$save().then(function(n){e.event=n,e.eventUrl=t.href("event",{id:e.event._id},{absolute:!0}),e.page++,t.go("newevent.success")},function(){new a({title:"Uh oh!",message:"There was an error creating your event. Please try again later.",cancelText:"OK"})})}else e.form.$valid&&(e.form.$setPristine(),e.nextPage())},e.nextPage=function(){s(e.page+1)},e.prevPage=function(){s(e.page-1)}}]),angular.module("rallly").controller("VerificationCtrl",["Event","Notification","$state",function(e,n,t){e.verify({id:t.params.id,code:t.params.code},function(){new n({title:"Email Verified",message:"Your email has been verified. You will now be able to receive email notifications for this event",type:"success",timeout:5e3})},function(){new n({title:"Verification Failed",message:"Your verification code has expired.",type:"error"})}),t.go("event",{id:t.params.id})}]),angular.module("rallly").directive("backImg",function(){return function(e,n,t){var i=t.backImg;n.css({"background-image":"url(/images/"+i+".png)"})}}),angular.module("rallly").directive("datepicker",function(){return{restrict:"A",require:"ngModel",scope:{model:"=ngModel",control:"="},templateUrl:"templates/directives/datePicker.html",link:function(e,n,t,i){e.model=e.model||[],e.control=e.control||{},e.$watchCollection("model",function(e){i.$setViewValue(e),i.$validate()}),i.$validators.required=function(e){return e&&0!=e.length?!0:!1};var a=Date.today(),o=a.clone(),s=function(n){o=n;var t=o.clone().moveToFirstDayOfMonth(),i=t.getDay();t.add(i-7).days(),e.title=o.toString("MMMM yyyy");for(var s=new Array(42),l=0;l0)&&(e.model.splice(t,0,n.date),i=!0),t++;while(0==i)}},e.isActive=function(n,t){e.model=e.model||[];for(var i=0;i0;i||n.toggle()};n.toggle=function(){n.open=!n.open,n.open?(t.addClass("open"),e.bind("click",i)):(t.removeClass("open"),e.unbind("click",i))}}}}]),angular.module("rallly").service("FormHelper",function(){this.emailRegexString="^([\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4})?$",this.emailRegex=new RegExp(this.emailRegexString),this.prettyError=function(e,n){return e.required?n+" is required":e.pattern?n+" is invalid":e.maxlength?n+" is too long":!1}}).directive("userForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/form/userForm.html",link:function(n){n.errors={},n.emailRegex=e.emailRegex,n.$watchCollection("form.name.$error",function(t){n.errors.name=e.prettyError(t,"Name")}),n.$watchCollection("form.email.$error",function(t){n.errors.email=e.prettyError(t,"Email")})}}}]).directive("eventForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/form/eventForm.html",link:function(n){n.errors={},n.$watchCollection("form.title.$error",function(t){n.errors.title=e.prettyError(t,"Title")}),n.$watchCollection("form.location.$error",function(t){n.errors.location=e.prettyError(t,"Location")})}}}]).directive("dateForm",function(){return{scope:{event:"=",form:"="},templateUrl:"templates/form/dateForm.html"}}).directive("participantsForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/form/participantsForm.html",link:function(n){n.emailRegex=e.emailRegexString}}}]).directive("settingsForm",["Event","ConfirmModal",function(e,n){return{scope:{event:"=",form:"="},templateUrl:"templates/form/settingsForm.html",link:function(t){t.deleteEvent=function(){t.deleteRequestSent||e.delete({id:t.event._id},function(){t.deleteRequestSent=!0;new n({title:"Delete Request Sent",message:"An email has been sent to the creator of this event with instructions to delete it.",cancelText:"OK"})})}}}}]).directive("switchToggle",function(){return{scope:{model:"=ngModel"},require:"ngModel",link:function(e,n,t,i){n.addClass("switch-toggle");var a=function(){e.model^"undefined"!=typeof t.invert?n.addClass("active"):n.removeClass("active")};e.$watch("model",a),n.bind("click",function(n){e.model=!e.model,i.$setViewValue(e.model,n)})}}}).directive("timeForm",["DatePickerService",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/form/timeForm.html",link:function(n){var t,i=!1,a=n.$watch("event.dates",function(o){o&&!i&&a(),i=!0,t=new e(n.event.dates),n.unsetDate=function(e){t.removeDate(e)}})}}}]).directive("timePicker",["$timeout",function(){return{scope:{model:"=ngModel"},require:"ngModel",link:function(e,n,t,i){i.$viewChangeListeners.push(function(){e.model=i.$modelValue}),i.$parsers.push(function(e){return e?Date.parse(e):void 0}),i.$validators.time=function(e){if(i.$isEmpty(e))return!0;var n=Date.parse(e);return n?(i.$setViewValue(n.toString("hh:mm tt")),i.$render(),!0):!1}}}}]),angular.module("rallly").directive("poll",["$timeout","Participant","ConfirmModal",function(e,n,t){return{restrict:"A",templateUrl:"templates/directives/poll.html",scope:{event:"="},link:function(e){e.defaults=[],e.participant={};var i=[];e.event.$promise.then(function(n){for(var t=["John Example","Jane Specimen","Mark Instance","Mary Case"],i=[],a=0;an)return!1;return!0},e.selectedDate=function(n){i[n]=0;for(var t=0;t30?"on "+e("date")(n,"MMMM d"):r>1?r+" days ago":1==r?"1 day ago":l>1?l+" hours ago":1==l?"an hour ago":s>1?s+" minutes ago":1==s?"a minute ago":"a few seconds ago"}}}]),angular.module("rallly").factory("ConfirmModal",["btfModal",function(e){return function(n){var t;t=e({templateUrl:"templates/confirmmodal.html",controllerAs:"modal",controller:function(){this.title=n.title,this.message=n.message,this.confirm=n.confirm?function(){n.confirm(),t.deactivate()}:!1,this.cancel=t.deactivate,this.confirmText=n.confirmText||"Confirm",this.cancelText=n.cancelText||"Cancel",this.isDestructive=n.isDestructive}}),t.activate(),this.destroy=function(){t.deactivate()}}}]),angular.module("rallly").factory("Notification",["$timeout","btfModal",function(e,n){return function(t){var i;i=n({templateUrl:"templates/notification.html",controllerAs:"notification",controller:function(){this.title=t.title,this.message=t.message,this.close=i.deactivate,this.type=t.type;var n=t.timeout||5e3;e(i.deactivate,n)}}),i.activate(),this.destroy=function(){i.deactivate()}}}]); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/public/build/app.js.map b/public/build/app.js.map index e7d407502..b7ccea283 100644 --- a/public/build/app.js.map +++ b/public/build/app.js.map @@ -1 +1 @@ -{"version":3,"sources":["main.js","templates.js","controllers/about.controller.js","controllers/account.controller.js","controllers/deletion.controller.js","controllers/editevent.controller.js","controllers/event.controller.js","controllers/example.controller.js","controllers/home.controller.js","controllers/navigation.controller.js","controllers/newevent.controller.js","controllers/verification.controller.js","directives/backImg.directive.js","directives/datepicker.directive.js","directives/discussion.directive.js","directives/dropdown.directive.js","directives/form.directive.js","directives/poll.directive.js","filters/elapsed.filter.js","services/modal.service.js","services/notification.service.js"],"names":[],"mappings":"AAAA,QAAA,OAAA,UAAA,YAAA,aAAA,eAAA,cAAA,cACA,QAAA,iBAAA,qBAAA,oBAAA,SAAA,EAAA,EAAA,GACA,EAAA,WAAA,GACA,EAAA,UAAA,aACA,EACA,MAAA,SACA,IAAA,IACA,YAAA,sBACA,WAAA,aAEA,MAAA,YACA,IAAA,OACA,YAAA,iCACA,WAAA,iBAEA,MAAA,oBACA,YAAA,oCAEA,MAAA,qBACA,YAAA,qCAEA,MAAA,mBACA,YAAA,mCAEA,MAAA,oBACA,YAAA,oCAEA,MAAA,SACA,IAAA,SACA,YAAA,uBACA,WAAA,cAEA,MAAA,WACA,IAAA,WACA,WAAA,gBAEA,MAAA,YACA,IAAA,YACA,YAAA,4BAEA,MAAA,SACA,IAAA,OACA,YAAA,uBACA,WAAA,cAEA,MAAA,aACA,IAAA,YACA,YAAA,2BACA,WAAA,kBAEA,MAAA,eACA,IAAA,yBACA,WAAA,qBAEA,MAAA,eACA,IAAA,yBACA,WAAA,oBAGA,QAAA,SAAA,YAAA,SAAA,GACA,MAAA,GAAA,kBAAA,GAAA,SACA,QAAA,OAAA,OACA,QAAA,OAAA,MAAA,IAAA,6BACA,SAAA,OAAA,SAAA,IAAA,kCAGA,QAAA,eAAA,YAAA,SAAA,GACA,MAAA,GAAA,mCAAA,GAAA,SACA,QAAA,OAAA,YAGA,QAAA,WAAA,YAAA,SAAA,GACA,MAAA,GAAA,+BAAA,GAAA,SACA,QAAA,OAAA,YAGA,QAAA,QAAA,WACA,OACA,IAAA,SAAA,GACA,SAAA,MAAA,MC/EA,QAAA,OAAA,UAAA,KAAA,iBAAA,SAAA,GAAA,EAAA,IAAA,uBAAA,47BACA,EAAA,IAAA,8BAAA,kmBACA,EAAA,IAAA,2BAAA,ivCACA,EAAA,IAAA,uBAAA,mlDACA,EAAA,IAAA,sBAAA,2ZACA,EAAA,IAAA,0BAAA,4CACA,EAAA,IAAA,8BAAA,4OACA,EAAA,IAAA,uCAAA,4sCACA,EAAA,IAAA,uCAAA,kkDACA,EAAA,IAAA,iCAAA,iiJACA,EAAA,IAAA,uCAAA,mtBACA,EAAA,IAAA,+BAAA,4nCACA,EAAA,IAAA,gCAAA,kkDACA,EAAA,IAAA,uCAAA,+iBACA,EAAA,IAAA,mCAAA,ozDACA,EAAA,IAAA,+BAAA,s6CACA,EAAA,IAAA,+BAAA,uvCACA,EAAA,IAAA,mCAAA,iRACA,EAAA,IAAA,kCAAA,2RACA,EAAA,IAAA,iCAAA,opFACA,EAAA,IAAA,iCAAA,sxBACA,EAAA,IAAA,kCAAA,slBCrBA,QAAA,OAAA,UACA,WAAA,aAAA,QAAA,SAAA,GACA,EAAA,IAAA,mBCFA,QAAA,OAAA,UACA,WAAA,eAAA,SAAA,eAAA,SAAA,GACA,EAAA,WAAA,gBCFA,QAAA,OAAA,UACA,WAAA,gBAAA,SAAA,eAAA,QAAA,SAAA,EAAA,EAAA,GACA,EAAA,SAAA,GAAA,EAAA,OAAA,GAAA,KAAA,EAAA,OAAA,MAAA,WACA,GAAA,IACA,MAAA,gBACA,QAAA,8BACA,KAAA,UACA,QAAA,OAEA,WACA,GAAA,IACA,MAAA,kBACA,QAAA,uFACA,KAAA,YAGA,EAAA,GAAA,SAAA,GAAA,EAAA,OAAA,QChBA,QAAA,OAAA,UACA,WAAA,iBAAA,SAAA,QAAA,SAAA,WAAA,QAAA,eAAA,eAAA,QAAA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,OAAA,EACA,GAAA,MAAA,EAAA,KAAA,GAAA,GAAA,WACA,EAAA,IAAA,SAAA,EAAA,MAAA,OACA,EAAA,OAAA,QAAA,KAAA,EAAA,QACA,WACA,EAAA,GAAA,cAEA,EAAA,YAAA,WACA,EAAA,MAAA,QAAA,KAAA,EAAA,SAEA,EAAA,UAAA,WACA,MAAA,MAAA,UAAA,EAAA,SAAA,KAAA,UAAA,EAAA,QAEA,EAAA,eAAA,WACA,MAAA,MAAA,UAAA,EAAA,OAAA,QAAA,KAAA,UAAA,EAAA,MAAA,QAEA,EAAA,OAAA,WACA,GAAA,EAAA,KAAA,OACA,GAAA,EAAA,iBACA,CAAA,GAAA,IACA,MAAA,WACA,QAAA,mGACA,YAAA,gBACA,eAAA,EACA,QAAA,WACA,EAAA,MAAA,gBACA,WAKA,SAGA,CAAA,GAAA,IACA,MAAA,cACA,QAAA,+DACA,KAAA,WAIA,IAAA,GAAA,WACA,EAAA,QACA,GAAA,GACA,EAAA,MACA,WACA,GAAA,IACA,MAAA,gBACA,QAAA,6CACA,KAAA,WAEA,GAAA,OAAA,QAAA,KAAA,EAAA,aCrDA,QAAA,OAAA,UACA,WAAA,aAAA,SAAA,QAAA,SAAA,QAAA,QAAA,eAAA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,OAAA,EAEA,GAAA,MAAA,EAAA,KAAA,GAAA,GAAA,WAEA,EAAA,IAAA,EAAA,MAAA,OAEA,EAAA,SAAA,EAAA,KAAA,SACA,GAAA,EAAA,MAAA,MAEA,UAAA,KAEA,WACA,EAAA,GAAA,cAGA,EAAA,UAAA,WACA,EAAA,MAAA,UAAA,EACA,EAAA,QACA,GAAA,GACA,EAAA,MACA,WACA,GAAA,IACA,MAAA,aACA,QAAA,6CACA,WAAA,UAKA,EAAA,WAAA,WACA,EAAA,MAAA,UAAA,EACA,EAAA,QACA,GAAA,GACA,EAAA,MACA,WACA,GAAA,IACA,MAAA,eACA,QAAA,sDACA,WAAA,UAKA,EAAA,UAAA,WACA,EAAA,GAAA,aAAA,GAAA,EAAA,MAAA,UC9CA,QAAA,OAAA,UACA,WAAA,eAAA,SAAA,QAAA,SAAA,EAAA,GAGA,IAAA,GADA,MAAA,EAAA,GAAA,MACA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,KAAA,EAAA,IAAA,KAAA,KAAA,EAAA,KAAA,WAAA,OAAA,cAKA,KAAA,GAFA,IAAA,eAAA,gBAAA,gBAAA,aACA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,IAAA,KAAA,EAAA,GACA,GAAA,QACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,KAAA,SAAA,EACA,GAAA,MAAA,GAAA,EAEA,EAAA,KAAA,GAEA,GAAA,GAAA,GAAA,IACA,SACA,KAAA,eACA,MAAA,wBAEA,MAAA,gBACA,SAAA,iCACA,YAAA,iKACA,MAAA,EACA,aAAA,EACA,UACA,WACA,QACA,KAAA,gBAEA,QAAA,iCAEA,QACA,KAAA,iBAEA,QAAA,qDAEA,QACA,KAAA,gBAEA,QAAA,gBAGA;EAAA,MAAA,SAAA,GAEA,EAAA,GAAA,SAAA,GAAA,EAAA,WCjDA,QAAA,OAAA,UACA,WAAA,YAAA,SAAA,SAAA,QAAA,SAAA,EAAA,EAAA,GACA,EAAA,IAAA,qCAEA,EAAA,SAAA,WACA,EAAA,GAAA,gBCLA,QAAA,OAAA,UACA,WAAA,kBAAA,SAAA,aAAA,YAAA,YAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,SAAA,SAAA,GACA,MAAA,GAAA,QAAA,GACA,GAEA,EAMA,IAAA,GAAA,SAAA,GACA,GAAA,GAAA,QAAA,QAAA,oBAAA,KAAA,EAAA,QAAA,OAAA,CACA,SAAA,IAAA,GACA,GACA,EAAA,aAGA,GAAA,IAAA,sBAAA,WACA,QAAA,QAAA,QAAA,YAAA,aACA,EAAA,OAAA,QAAA,KAGA,EAAA,WAAA,WACA,GAAA,GAAA,QAAA,QAAA,QAAA,SAAA,YACA,IACA,QAAA,QAAA,QAAA,YAAA,aACA,EAAA,OAAA,QAAA,KAEA,QAAA,QAAA,QAAA,SAAA,aACA,EAAA,KAAA,QAAA,QC/BA,QAAA,OAAA,UACA,WAAA,gBAAA,SAAA,QAAA,SAAA,QAAA,eAAA,eAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GAEA,EAAA,MAAA,uBACA,EAAA,YAAA,6FACA,EAAA,QAEA,IAAA,IACA,mBACA,oBACA,kBAGA,GAAA,KAAA,CAEA,IAAA,GAAA,SAAA,GACA,EAAA,KAAA,EACA,EAAA,GAAA,EAAA,EAAA,IAGA,GAAA,EAAA,MAGA,EAAA,OAAA,WACA,GAAA,EAAA,KAAA,QAAA,EAAA,MAAA,EAAA,OAAA,CACA,QAAA,IAAA,KAAA,UAAA,EAAA,OACA,IAAA,GAAA,GAAA,GAAA,EAAA,MACA,GAAA,QACA,KAAA,SAAA,GACA,EAAA,MAAA,EACA,EAAA,SAAA,EAAA,KAAA,SACA,GAAA,EAAA,MAAA,MAEA,UAAA,IAEA,EAAA,OACA,EAAA,GAAA,qBACA,WACA,GAAA,IACA,MAAA,SACA,QAAA,kEACA,WAAA,aAGA,GAAA,KAAA,SACA,EAAA,KAAA,eACA,EAAA,aAIA,EAAA,SAAA,WACA,EAAA,EAAA,KAAA,IAGA,EAAA,SAAA,WACA,EAAA,EAAA,KAAA,OCvDA,QAAA,OAAA,UACA,WAAA,oBAAA,QAAA,eAAA,SAAA,SAAA,EAAA,EAAA,GACA,EAAA,QAAA,GAAA,EAAA,OAAA,GAAA,KAAA,EAAA,OAAA,MAAA,WACA,GAAA,IACA,MAAA,iBACA,QAAA,mGACA,KAAA,UACA,QAAA,OAEA,WACA,GAAA,IACA,MAAA,sBACA,QAAA,sCACA,KAAA,YAGA,EAAA,GAAA,SAAA,GAAA,EAAA,OAAA,QChBA,QAAA,OAAA,UACA,UAAA,UAAA,WACA,MAAA,UAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,OACA,GAAA,KACA,mBAAA,eAAA,EAAA,aCLA,QAAA,OAAA,UACA,UAAA,aAAA,WACA,OACA,SAAA,IACA,QAAA,UACA,OACA,MAAA,WACA,QAAA,KAEA,YAAA,uCACA,KAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,MAAA,EAAA,UACA,EAAA,QAAA,EAAA,YAEA,EAAA,iBAAA,QAAA,SAAA,GACA,EAAA,cAAA,GACA,EAAA,cAGA,EAAA,YAAA,SAAA,SAAA,GACA,MAAA,IAAA,GAAA,EAAA,QAGA,GAFA,EAKA,IAAA,GAAA,KAAA,QAAA,EAAA,EAAA,QACA,EAAA,SAAA,GACA,EAAA,CACA,IAAA,GAAA,EAAA,QAAA,wBACA,EAAA,EAAA,QACA,GAAA,IAAA,EAAA,GAAA,OACA,EAAA,MAAA,EAAA,SAAA,YAEA,KAAA,GADA,GAAA,GAAA,OAAA,IACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,QAAA,IAAA,GAAA,MACA,GAAA,IACA,KAAA,EACA,eAAA,EAAA,YAAA,EAAA,YAAA,GAAA,EACA,QAAA,KAAA,OAAA,EAAA,IAGA,EAAA,KAAA,EAEA,GAAA,GACA,EAAA,UAAA,SAAA,GAIA,GAHA,EAAA,gBACA,EAAA,EAAA,MAEA,KAAA,EAAA,EAAA,SAAA,EAAA,MAAA,IAEA,EAAA,MAAA,OAAA,EAAA,OACA,CAEA,GAAA,GAAA,EAAA,GAAA,CACA,IACA,QAAA,EAAA,MAAA,IAAA,KAAA,QAAA,KAAA,MAAA,EAAA,MAAA,IAAA,EAAA,MAAA,KACA,EAAA,MAAA,OAAA,EAAA,EAAA,EAAA,MACA,GAAA,GAEA,UACA,GAAA,KAGA,EAAA,SAAA,SAAA,EAAA,GACA,EAAA,MAAA,EAAA,SACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,MAAA,OAAA,IACA,GAAA,KAAA,OAAA,KAAA,MAAA,EAAA,MAAA,IAAA,GACA,MAAA,GAAA,GAAA,CAGA,OAAA,GAAA,IAAA,GAEA,EAAA,UAAA,WACA,EAAA,EAAA,IAAA,GAAA,WAEA,EAAA,UAAA,WACA,EAAA,EAAA,IAAA,IAAA,WAGA,EAAA,QAAA,WAAA,SAAA,GACA,KAAA,MAAA,EAAA,SAAA,KAAA,MAAA,IAAA,KACA,EAAA,MAAA,OAAA,MAAA,QClFA,QAAA,OAAA,UACA,UAAA,cAAA,WAAA,UAAA,eAAA,SAAA,EAAA,EAAA,GACA,OACA,SAAA,IACA,YAAA,uCACA,OACA,MAAA,KAEA,KAAA,SAAA,GACA,EAAA,UACA,IAAA,GAAA,QAAA,QAAA,kBACA,GAAA,WACA,EAAA,UAAA,EAAA,KAAA,mBAEA,EAAA,cAAA,SAAA,GACA,GAAA,IACA,MAAA,gBACA,QAAA,gDACA,YAAA,eACA,WAAA,iBACA,eAAA,EACA,QAAA,WACA,EAAA,QAAA,GAAA,EAAA,MAAA,IAAA,IAAA,EAAA,KAAA,SAAA,GACA,EAAA,MAAA,QAKA,EAAA,YAAA,WACA,GAAA,EAAA,YAAA,OAAA,CACA,GAAA,GAAA,GAAA,GAAA,EAAA,QACA,GAAA,OAAA,GAAA,EAAA,MAAA,KAAA,SAAA,GACA,EAAA,MAAA,EACA,EAAA,aAEA,EAAA,YAAA,sBCnCA,QAAA,OAAA,UACA,UAAA,YAAA,YAAA,SAAA,GACA,OACA,SAAA,IACA,KAAA,SAAA,EAAA,GACA,EAAA,SAAA,YACA,EAAA,MAAA,CAEA,IAAA,GAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,EAAA,QAAA,OAAA,CACA,IACA,EAAA,SAGA,GAAA,OAAA,WACA,EAAA,MAAA,EAAA,KACA,EAAA,MACA,EAAA,SAAA,QACA,EAAA,KAAA,QAAA,KAEA,EAAA,YAAA,QACA,EAAA,OAAA,QAAA,UCrBA,QAAA,OAAA,UACA,QAAA,aAAA,WACA,KAAA,iBAAA,2CACA,KAAA,WAAA,GAAA,QAAA,KAAA,kBACA,KAAA,YAAA,SAAA,EAAA,GACA,MAAA,GAAA,SAAA,EAAA,eACA,EAAA,QAAA,EAAA,cACA,EAAA,UAAA,EAAA,gBACA,KAGA,UAAA,YAAA,aAAA,SAAA,GACA,OACA,OACA,MAAA,IACA,KAAA,KAEA,YAAA,+BACA,KAAA,SAAA,GACA,EAAA,UAEA,EAAA,WAAA,EAAA,WAEA,EAAA,iBAAA,mBAAA,SAAA,GACA,EAAA,OAAA,KAAA,EAAA,YAAA,EAAA,UAGA,EAAA,iBAAA,oBAAA,SAAA,GACA,EAAA,OAAA,MAAA,EAAA,YAAA,EAAA,gBAKA,UAAA,aAAA,aAAA,SAAA,GACA,OACA,OACA,MAAA,IACA,KAAA,KAEA,YAAA,gCACA,KAAA,SAAA,GACA,EAAA,UAEA,EAAA,iBAAA,oBAAA,SAAA,GACA,EAAA,OAAA,MAAA,EAAA,YAAA,EAAA,WAGA,EAAA,iBAAA,uBAAA,SAAA,GACA,EAAA,OAAA,SAAA,EAAA,YAAA,EAAA,mBAMA,UAAA,WAAA,WACA,OACA,OACA,MAAA,IACA,KAAA,KAEA,YAAA,kCAGA,UAAA,oBAAA,aAAA,SAAA,GACA,OACA,OACA,MAAA,IACA,KAAA,KAEA,YAAA,uCACA,KAAA,SAAA,GACA,EAAA,WAAA,EAAA,sBAIA,UAAA,gBAAA,QAAA,eAAA,SAAA,EAAA,GACA,OACA,OACA,MAAA,IACA,KAAA,KAEA,YAAA,mCACA,KAAA,SAAA,GACA,EAAA,YAAA,WACA,EAAA,mBACA,EAAA,QAAA,GAAA,EAAA,MAAA,KAAA,WACA,EAAA,mBAAA,CACA,IAAA,IACA,MAAA,sBACA,QAAA,sFACA,WAAA,eAOA,UAAA,eAAA,WACA,OACA,OACA,MAAA,YAEA,QAAA,UACA,KAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,SAAA,gBACA,IAAA,GAAA,WACA,EAAA,MAAA,mBAAA,GAAA,OACA,EAAA,SAAA,UAEA,EAAA,YAAA,UAGA,GAAA,OAAA,QAAA,GACA,EAAA,KAAA,QAAA,SAAA,GACA,EAAA,OAAA,EAAA,MACA,EAAA,cAAA,EAAA,MAAA,SAKA,UAAA,YAAA,oBAAA,SAAA,GACA,OACA,OACA,MAAA,IACA,KAAA,KAEA,YAAA,+BACA,KAAA,SAAA,GACA,GACA,GADA,GAAA,EAEA,EAAA,EAAA,OAAA,cAAA,SAAA,GACA,IAAA,GACA,IAEA,GAAA,EACA,EAAA,GAAA,GAAA,EAAA,MAAA,OACA,EAAA,UAAA,SAAA,GACA,EAAA,WAAA,WAMA,UAAA,cAAA,WAAA,WACA,OACA,OACA,MAAA,YAEA,QAAA,UACA,KAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,qBAAA,KAAA,WACA,EAAA,MAAA,EAAA,cAGA,EAAA,SAAA,KAAA,SAAA,GACA,MAAA,GACA,KAAA,MAAA,GADA,SAIA,EAAA,YAAA,KAAA,SAAA,GACA,GAAA,EAAA,SAAA,GAAA,OAAA,CACA,IAAA,GAAA,KAAA,MAAA,EACA,OAAA,IACA,EAAA,cAAA,EAAA,SAAA,aACA,EAAA,WACA,IAEA,QCvKA,QAAA,OAAA,UACA,UAAA,QAAA,WAAA,cAAA,eAAA,SAAA,EAAA,EAAA,GACA,OACA,SAAA,IACA,YAAA,iCACA,OACA,MAAA,KAEA,KAAA,SAAA,GACA,EAAA,YACA,EAAA,cACA,IAAA,KACA,GAAA,MAAA,SAAA,KAAA,SAAA,GAGA,IAAA,GAFA,IAAA,eAAA,gBAAA,gBAAA,aACA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,IAAA,KAAA,EAAA,GACA,GAAA,QACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,MAAA,OAAA,IAAA,CACA,GAAA,GAAA,KAAA,SAAA,EACA,GAAA,MAAA,GAAA,EAEA,EAAA,KAAA,GAEA,EAAA,SAAA,IAEA,EAAA,OAAA,SAAA,GACA,GAAA,IACA,MAAA,UAAA,EAAA,KAAA,IACA,QAAA,mCAAA,EAAA,KAAA,kBACA,YAAA,eACA,WAAA,iBACA,eAAA,EACA,QAAA,WACA,EAAA,QAAA,GAAA,EAAA,MAAA,IAAA,IAAA,EAAA,KAAA,SAAA,GACA,EAAA,MAAA,QAKA,EAAA,UAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,GAAA,EAAA,OAAA,CAEA,QAAA,GAEA,EAAA,aAAA,SAAA,GACA,EAAA,GAAA,CACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,MAAA,aAAA,OAAA,IACA,EAAA,MAAA,aAAA,GAAA,MAAA,IAAA,EAAA,IAEA,OAAA,GAAA,IAEA,EAAA,OAAA,SAAA,GACA,EAAA,QACA,GAAA,EAAA,MAAA,IACA,IAAA,EAAA,KACA,IAEA,EAAA,KAAA,SAAA,GACA,EAAA,SAAA,EAAA,MAAA,aAAA,QAAA,IAAA,QAAA,KAAA,IAEA,EAAA,OAAA,SAAA,GACA,EAAA,MAAA,aAAA,GAAA,EAAA,SAAA,IAEA,EAAA,KAAA,WACA,GAAA,EAAA,QAAA,OAAA,CACA,GAAA,GAAA,GAAA,GAAA,EAAA,YACA,GAAA,OAAA,GAAA,EAAA,MAAA,KAAA,SAAA,GACA,EAAA,MAAA,EACA,EAAA,iBAEA,EAAA,QAAA,sBCzEA,QAAA,OAAA,UACA,OAAA,WAAA,UAAA,SAAA,GACA,MAAA,UAAA,GACA,GAAA,EAAA,CACA,GAAA,GAAA,KAAA,MAAA,GACA,GAAA,GAAA,OAAA,UACA,EAAA,EAAA,EACA,EAAA,KAAA,MAAA,EAAA,KACA,EAAA,KAAA,MAAA,EAAA,IACA,EAAA,KAAA,MAAA,EAAA,IACA,EAAA,KAAA,MAAA,EAAA,GACA,OAAA,GAAA,GACA,MAAA,EAAA,QAAA,EAAA,UACA,EAAA,EACA,EAAA,YACA,GAAA,EACA,YACA,EAAA,EACA,EAAA,aACA,GAAA,EACA,cACA,EAAA,EACA,EAAA,eACA,GAAA,EACA,eAEA,yBC1BA,QAAA,OAAA,UACA,QAAA,gBAAA,WAAA,SAAA,GAEA,MAAA,UAAA,GACA,GAAA,EACA,GAAA,GACA,YAAA,8BACA,aAAA,QACA,WAAA,WACA,KAAA,MAAA,EAAA,MACA,KAAA,QAAA,EAAA,QACA,KAAA,QAAA,EAAA,QAAA,WAAA,EAAA,UAAA,EAAA,eAAA,EACA,KAAA,OAAA,EAAA,WACA,KAAA,YAAA,EAAA,aAAA,UACA,KAAA,WAAA,EAAA,YAAA,SACA,KAAA,cAAA,EAAA,iBAGA,EAAA,WAEA,KAAA,QAAA,WACA,EAAA,kBCrBA,QAAA,OAAA,UACA,QAAA,gBAAA,WAAA,WAAA,SAAA,EAAA,GACA,MAAA,UAAA,GACA,GAAA,EACA,GAAA,GACA,YAAA,8BACA,aAAA,eACA,WAAA,WACA,KAAA,MAAA,EAAA,MACA,KAAA,QAAA,EAAA,QACA,KAAA,MAAA,EAAA,WACA,KAAA,KAAA,EAAA,IACA,IAAA,GAAA,EAAA,SAAA,GACA,GAAA,EAAA,WAAA,MAGA,EAAA,WAEA,KAAA,QAAA,WACA,EAAA","file":"app.js","sourcesContent":["angular.module('rallly', ['ui.router','ngResource','btford.modal','ngTagsInput','ngAnimate'])\n .config(function($stateProvider, $urlRouterProvider, $locationProvider){\n $locationProvider.html5Mode(true);\n $urlRouterProvider.otherwise(\"/notfound\")\n $stateProvider\n .state('index',{\n url : '/',\n templateUrl : 'templates/home.html',\n controller : 'HomeCtrl'\n })\n .state('newevent',{\n url : '/new',\n templateUrl : 'templates/newEvent/layout.html',\n controller : 'NewEventCtrl',\n })\n .state('newevent.general', {\n templateUrl : 'templates/newEvent/general.html'\n })\n .state('newevent.datetime', {\n templateUrl : 'templates/newEvent/datetime.html'\n })\n .state('newevent.invite', {\n templateUrl : 'templates/newEvent/invite.html'\n })\n .state('newevent.success', {\n templateUrl : 'templates/newEvent/success.html'\n })\n .state('about', {\n url : '/about',\n templateUrl : 'templates/about.html',\n controller : 'AboutCtrl'\n })\n .state('example', {\n url : '/example',\n controller : 'ExampleCtrl'\n })\n .state('notfound', {\n url : '/notfound',\n templateUrl : 'templates/notfound.html'\n })\n .state('event',{\n url : '/:id',\n templateUrl : 'templates/event.html',\n controller : 'EventCtrl'\n })\n .state('editevent', {\n url: '/:id/edit',\n templateUrl : 'templates/editevent.html',\n controller : 'EditEventCtrl'\n })\n .state('verifyevent', {\n url : '/verify/:id/code/:code',\n controller : 'VerificationCtrl'\n })\n .state('deleteevent', {\n url : '/delete/:id/code/:code',\n controller : 'DeletionCtrl'\n })\n })\n .factory('Event', function($resource){\n return $resource('/api/event/:id', { id : '@_id' }, {\n 'update' : { method : 'PUT' },\n 'verify' : { method : 'GET', url : '/api/event/:id/code/:code' },\n 'destroy': { method : 'DELETE', url: '/api/event/:id/code/:code' }\n });\n })\n .factory('Participant', function($resource){\n return $resource('/api/event/:id/participant/:pid', { id: '@_id'}, {\n 'update' : { method : 'PUT' }\n });\n })\n .factory('Comment', function($resource){\n return $resource('/api/event/:id/comment/:cid', { id : '@_id' }, {\n 'update' : { method : 'PUT' }\n })\n })\n .factory('Title', function(){\n return {\n set : function(title){\n document.title = title;\n }\n }\n });\n","angular.module(\"rallly\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"templates/about.html\",\"
\\n
Frequently Asked Questions
\\n
\\n Want to find out more about Rallly? Check out the FAQs below.\\n

What is Rallly?

\\n

\\n Rallly is a collaborative scheduling service that makes deciding on a date fast and easy. In other words, Rallly helps you and your friends decide on a date to host an event.\\n

\\n

Why is it called Rallly?

\\n

\\n The name is derived from the proper spelling of the word, “rally”. The Webster dictionary defines rally as, “to muster for a common purpose” which accurately describes the goal of this service. The inproper spelling can be attributed to the difficulty of finding short and meaningful domain names.\\n

\\n

Who made this?

\\n

\\n Rallly was created by Luke Vella.\\n

\\n
\\n\");\n$templateCache.put(\"templates/confirmmodal.html\",\"
\\n\\n
\\n\\n
\\n
{{modal.title}}
\\n
\\n {{modal.message}}\\n
\\n
\\n \\n \\n
\\n
\\n\\n
\\n\\n
\\n\");\n$templateCache.put(\"templates/editevent.html\",\"
\\n
\\n\\n
Edit Event
\\n
\\n You can makes changes to your existing event by changing the fields in the form below.\\n
\\n\\n
\\n\\n
\\n\\n
\\n\\n
\\n\\n
\\n
\\n\\n
\\n\\n
\\n\\n
\\n\\n
\\n \\n \\n Done\\n
\\n\\n
\\n\\n
\\n\\n
\\n\");\n$templateCache.put(\"templates/event.html\",\"
\\n
\\n
\\n
\\n
\\n {{event.title}}\\n Poll Closed\\n Poll Open\\n
\\n
\\n Created by {{event.creator.name}} • {{event.created | elapsed}}\\n
\\n
\\n
\\n \\n
\\n
\\n
{{event.description}}
\\n
\\n Location:\\n {{event.location}}\\n
\\n\\n
\\n
\\n
\\n
\\n
\\n\\n
\\n
\\n Discussion\\n
\\n
\\n You can discuss the event with your friends by leaving a comment below.\\n
\\n
\\n\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/home.html\",\"
\\n
\\n \\n
\\n
\\n Schedule an Event\\n
\\n
\\n Want to host an event but can’t decide on a date? Click on the button below to start!\\n
\\n \\n
\\n\");\n$templateCache.put(\"templates/notfound.html\",\"

Error 404

\\n

Not Found

\\n\");\n$templateCache.put(\"templates/notification.html\",\"
\\n
\\n {{notification.title}}\\n
\\n
\\n {{notification.message}}\\n
\\n
\\n\");\n$templateCache.put(\"templates/directives/datePicker.html\",\"
\\n
\\n
\\n \\n \\n {{title}}\\n \\n \\n
\\n
\\n
\\n Su\\n
\\n
\\n Mo\\n
\\n
\\n Tu\\n
\\n
\\n We\\n
\\n
\\n Th\\n
\\n
\\n Fr\\n
\\n
\\n Sa\\n
\\n
\\n
\\n
\\n {{day.date | date : \\'d\\' }}\\n
\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/directives/discussion.html\",\"
    \\n
  • \\n
    \\n \\n
    \\n
    \\n ×\\n
    \\n {{comment.author.name}}\\n {{comment.created | elapsed}}\\n
    \\n
    {{comment.content}}
    \\n
    \\n
  • \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n \\n \\n \\n Make sure you fill in all the fields.\\n \\n
\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/directives/poll.html\",\"
\\n
\\n {{event.participants.length}} participants\\n
\\n
\\n
\\n
\\n {{d | date: \\'EEE\\'}}\\n
\\n
\\n {{d | date: \\'d\\'}}\\n
\\n
\\n {{d | date : \\'MMM\\'}}\\n
\\n {{selectedDate($index)}}\\n
\\n
\\n
\\n\\n
\\n
\\n
\\n
\\n
\\n
\\n \\n \\n \\n \\n {{participant.name}}\\n
\\n
\\n \\n \\n \\n
\\n
\\n
\\n \\n \\n \\n \\n
\\n
\\n
\\n
0}\\\">\\n
\\n
\\n \\n \\n \\n {{example.name}}\\n
\\n
\\n \\n \\n
\\n
\\n\\n
\\n
\\n
\\n
\\n Fill in the form below to get started\\n
\\n
\\n
\\n
\\n
\\n
\\n \\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/directives/timePicker.html\",\"
\\n
\\n
\\n
\\n {{date | date: \\'EEE\\'}}\\n
\\n
\\n {{date | date: \\'d\\'}}\\n
\\n
\\n {{date | date : \\'MMM\\'}}\\n
\\n \\n
\\n
\\n
\\n \\n
\\n
\\n\");\n$templateCache.put(\"templates/form/dateForm.html\",\"
\\n
Choose Dates
\\n
    \\n
  • \\n
    \\n
    \\n {{d | date: \\'EEE\\'}}\\n
    \\n
    \\n {{d | date: \\'d\\'}}\\n
    \\n
    \\n {{d | date : \\'MMM\\'}}\\n
    \\n \\n
    \\n
  • \\n
\\n
\\n
\\n
\\n
\\n \\n \\n You need to select a few dates\\n \\n
\\n\\n
\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/form/eventForm.html\",\"
\\n
Event Details
\\n
\\n
\\n
\\n
\\n
\\n \\n \\n {{errors.title}}\\n \\n \\n
\\n
\\n
\\n
\\n \\n \\n {{errors.location}}\\n \\n \\n
\\n
\\n
\\n
\\n
\\n \\n \\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/form/participantsForm.html\",\"
\\n
Invite Participants
\\n
\\n
\\n
\\n
\\n \\n \\n \\n\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/form/settingsForm.html\",\"
\\n
Settings
\\n
\\n
\\n
\\n
\\n
\\n Poll Status\\n
\\n
\\n Let people vote on the poll.\\n
\\n
\\n
\\n
\\n {{event.isClosed ? \\'Closed\\' : \\'Open\\' }}\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n Notifications\\n
\\n
\\n Send email notifications to the creator of this event.\\n
\\n
\\n
\\n
\\n {{event.creator.allowNotifications ? \\'Enabled\\' : \\'Disabled\\' }}\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n Delete Event\\n
\\n
\\n Once you delete an event it will no longer be accessible.\\n
\\n
\\n
\\n \\n
\\n
\\n
\\n\\n\");\n$templateCache.put(\"templates/form/timeForm.html\",\"
\\n
Choose Times
\\n
\\n
\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
\\n\\n \\n Time 1\\n \\n Time 2\\n \\n Time 3\\n
\\n
\\n
\\n {{d.date | date: \\'EEE\\'}}\\n
\\n
\\n {{d.date | date: \\'d\\'}}\\n
\\n
\\n {{d.date | date : \\'MMM\\'}}\\n
\\n \\n
\\n
\\n \\n
\\n
\\n\");\n$templateCache.put(\"templates/form/userForm.html\",\"
\\n
Your Details
\\n
\\n
\\n
\\n
\\n
\\n \\n \\n {{errors.name}}\\n \\n \\n
\\n
\\n
\\n
\\n \\n \\n {{errors.email}}\\n \\n \\n
\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/newEvent/datetime.html\",\"
\\n\\n
\\n\\n
\\n \\n \\n
\\n\");\n$templateCache.put(\"templates/newEvent/general.html\",\"
\\n\\n
\\n\\n
\\n\\n
\\n\\n
\\n \\n
\\n\");\n$templateCache.put(\"templates/newEvent/invite.html\",\"
\\n
\\n
Summary
\\n
\\n
\\n
\\n
\\n
\\n Your Name\\n
\\n
\\n {{event.creator.name}}\\n
\\n
\\n
\\n
\\n Email\\n
\\n
\\n {{event.creator.email}}\\n
\\n
\\n
\\n
\\n Title\\n
\\n
\\n {{event.title}}\\n
\\n
\\n
\\n
\\n Location\\n
\\n
\\n {{event.location}}\\n
\\n
\\n
\\n
\\n Description\\n
\\n
{{event.description}}
\\n
\\n
\\n
\\n Dates\\n
\\n
\\n
    \\n
  • \\n
    \\n
    \\n {{d | date: \\'EEE\\'}}\\n
    \\n
    \\n {{d | date: \\'d\\'}}\\n
    \\n
    \\n {{d | date : \\'MMM\\'}}\\n
    \\n
    \\n
  • \\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n\\n
\\n\\n
\\n \\n \\n
\\n\");\n$templateCache.put(\"templates/newEvent/layout.html\",\"
\\n\\n
Schedule a New Event
\\n
\\n Fill in the form below to create your event and share it with your friends and colleagues.\\n
\\n
    \\n
  1. 1 }\\\">\\n General Details\\n
  2. \\n
  3. 2 }\\\">\\n Dates & Times\\n
  4. \\n
  5. 3 }\\\">\\n Create & Send\\n
  6. \\n
\\n
\\n
\\n\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/newEvent/success.html\",\"
\\n
\\n \\n
\\n
Event Created
\\n
\\n Your event has been created successfully! You should receive an email shortly with instructions to verify your email address.\\n
\\n
\\n
\\n
\\n \\n GO\\n
\\n
\\n\");}]);","angular.module('rallly')\n.controller('AboutCtrl', function(Title){\n Title.set('About Rallly')\n});\n","angular.module('rallly')\n.controller('AccountCtrl', function($scope, ConfirmModal){\n $scope.showNotice = function(){\n \n }\n})\n","angular.module('rallly')\n.controller('DeletionCtrl', function($state, Notification, Event){\n Event.destroy({id : $state.params.id, code :$state.params.code}, function(){\n var notification = new Notification({\n title : 'Event deleted',\n message : 'This event has been deleted',\n type : 'success',\n timeout : 5000\n });\n }, function(e){\n var notification = new Notification({\n title : 'Deletion Failed',\n message : 'The event could not be deleted. Make sure that it exists and that the url is correct',\n type : 'error'\n });\n });\n $state.go('event', { id : $state.params.id });\n});\n","angular.module('rallly')\n.controller('EditEventCtrl', function($scope, $http, $state, $timeout, Event, ConfirmModal, Notification, Title){\n var id = $state.params.id\n $scope.event = Event.get({id:id}, function(data){\n Title.set(\"Edit: \" + $scope.event.title);\n $scope.master = angular.copy($scope.event);\n }, function(e){\n $state.go('notfound');\n });\n $scope.undoChanges = function(){\n $scope.event = angular.copy($scope.master);\n }\n $scope.didChange = function(){\n return JSON.stringify($scope.master) != JSON.stringify($scope.event);\n }\n $scope.didChangeDates = function(){\n return JSON.stringify($scope.master.dates) != JSON.stringify($scope.event.dates);\n }\n $scope.submit = function(){\n if ($scope.form.$valid){\n if ($scope.didChangeDates() ){\n var modal = new ConfirmModal({\n title : 'Hold up!',\n message : 'Changing the dates will reset all entries by the participants. Are you sure you want to do that?',\n confirmText : 'Yes, I\\'m sure',\n isDestructive : true,\n confirm : function(){\n $scope.event.participants = [];\n update();\n }\n });\n\n } else {\n update();\n }\n } else {\n var notification = new Notification({\n title : 'Not so fast',\n message : 'Make sure you fill in all the required fields and try again.',\n type : 'error'\n });\n }\n }\n var update = function(){\n Event.update({\n id : id\n }, $scope.event,\n function(){\n var notification = new Notification({\n title : 'Changes Saved',\n message : 'Your changes have been saved successfully.',\n type : 'success'\n });\n $scope.master = angular.copy($scope.event);\n });\n }\n});\n","angular.module('rallly')\n.controller('EventCtrl', function($scope, $http, $state, Title, Event, ConfirmModal){\n var id = $state.params.id;\n // Get Event\n $scope.event = Event.get({id:id}, function(data){\n // Set the page title to the event title\n Title.set($scope.event.title);\n // Generate event url - i.e. http://rallly.co/jF9F_Fd\n $scope.eventUrl = $state.href('event', {\n id: $scope.event._id\n }, {\n absolute : true\n });\n }, function(e){\n $state.go('notfound');\n });\n\n $scope.openEvent = function(){\n $scope.event.isClosed = false;\n Event.update({\n id : id\n }, $scope.event,\n function(){\n var modal = new ConfirmModal({\n title : 'Event Open',\n message : 'People can vote and comment on this event.',\n cancelText : 'OK',\n });\n });\n }\n\n $scope.closeEvent = function(){\n $scope.event.isClosed = true;\n Event.update({\n id : id\n }, $scope.event,\n function(){\n var modal = new ConfirmModal({\n title : 'Event Closed',\n message : 'People can no longer vote or comment on this event.',\n cancelText : 'OK',\n });\n });\n }\n\n $scope.editEvent = function(){\n $state.go('editevent', { id : $scope.event._id });\n }\n\n});\n","angular.module('rallly')\n.controller('ExampleCtrl', function($state, Event){\n // Generate dates\n var dates = [], date = new Date();\n for (var i = 0; i < 4; i++){\n dates.push(date.add(Math.ceil(Math.random() * 5)).days().toISOString());\n }\n // Generate Participants\n var examplesNames = ['John Example', 'Jane Specimen','Mark Instance', 'Mary Case'];\n var examples = [];\n for (var i = 0; i < examplesNames.length; i++){\n var example = { name : examplesNames[i] };\n example.votes = [];\n for (var j = 0; j < dates.length; j++){\n var answer = Math.random()<.5;\n example.votes[j] = answer;\n }\n examples.push(example);\n }\n var event = new Event({\n \"creator\": {\n \"name\": \"John Example\",\n \"email\": \"rallly@lukevella.com\"\n },\n \"title\": \"Lunch Meeting\",\n \"location\": \"Starbucks, 901 New York Avenue\",\n \"description\": \"This event has been automatically generated just for you! Feel free to try out all the different features and when you're ready, you can schedule a new event.\",\n \"dates\" : dates,\n \"participants\" : examples,\n \"emails\": [],\n \"comments\" : [{\n author : {\n name : \"John Example\"\n },\n content : \"Hey guys, this is a comment!\"\n }, {\n author : {\n name : \"Mark Instance\"\n },\n content : \"Hi John... nice comment. Keep up the great work!\"\n }, {\n author : {\n name : \"John Example\"\n },\n content : \"Thank you!\"\n }]\n });\n event.$save(function(data){\n\n $state.go('event', { id : data._id });\n })\n});\n","angular.module('rallly')\n.controller('HomeCtrl', function($scope, $state, Title){\n Title.set('Rallly - Collaborative Scheduling')\n\n $scope.newEvent = function(){\n $state.go('newevent');\n }\n});\n","angular.module('rallly')\n.controller('NavigationCtrl', function($scope, $rootScope, $location, $document){\n $scope.isActive = function(path) {\n if ($location.path() == path) {\n return true;\n } else {\n return false\n }\n }\n\n\n\n var clickHandler = function(event){\n var isClickedElementChildOfPopup = angular.element('.main-navigation').find(event.target).length > 0;\n console.log(isClickedElementChildOfPopup);\n if (isClickedElementChildOfPopup) return;\n $scope.toggleMenu()\n }\n\n $rootScope.$on('$stateChangeSuccess', function(){\n angular.element('body').removeClass('open-menu');\n $document.unbind('click', clickHandler);\n });\n\n $scope.toggleMenu = function(){\n var isOpen = angular.element('body').hasClass('open-menu');\n if (isOpen) {\n angular.element('body').removeClass('open-menu');\n $document.unbind('click', clickHandler);\n } else {\n angular.element('body').addClass('open-menu');\n $document.bind('click', clickHandler);\n }\n }\n\n\n})\n","angular.module('rallly')\n.controller('NewEventCtrl', function($scope, $http, $state, Event, ConfirmModal, Notification){\n\n $scope.title = \"Schedule a New Event\";\n $scope.description = \"Fill in the form below to create your event and share it with your friends and colleagues.\";\n $scope.event = {};\n\n var states = [\n 'newevent.general',\n 'newevent.datetime',\n 'newevent.invite'\n ];\n\n $scope.page = 1;\n\n var goTo = function(page){\n $scope.page = page;\n $state.go(states[page-1]);\n }\n\n goTo($scope.page);\n\n\n $scope.submit = function(){\n if ($scope.form.$valid && $scope.page == states.length){\n console.log(JSON.stringify($scope.event));\n var newEvent = new Event($scope.event);\n newEvent.$save()\n .then(function(event){\n $scope.event = event;\n $scope.eventUrl = $state.href('event', {\n id: $scope.event._id\n }, {\n absolute : true\n });\n $scope.page++;\n $state.go('newevent.success');\n }, function(){\n var modal = new ConfirmModal({\n title : 'Uh oh!',\n message : 'There was an error creating your event. Please try again later.',\n cancelText : 'OK'\n });\n });\n } else if ($scope.form.$valid) {\n $scope.form.$setPristine();\n $scope.nextPage();\n }\n }\n\n $scope.nextPage = function(){\n goTo($scope.page+1);\n }\n\n $scope.prevPage = function(){\n goTo($scope.page-1);\n }\n\n});\n","angular.module('rallly')\n.controller('VerificationCtrl', function(Event, Notification, $state){\n Event.verify({id : $state.params.id, code :$state.params.code}, function(){\n var notification = new Notification({\n title : 'Email Verified',\n message : 'Your email has been verified. You will now be able to receive email notifications for this event',\n type : 'success',\n timeout : 5000\n });\n }, function(e){\n var notification = new Notification({\n title : 'Verification Failed',\n message : 'Your verification code has expired.',\n type : 'error'\n });\n });\n $state.go('event', { id : $state.params.id });\n\n});\n","angular.module('rallly')\n.directive('backImg', function(){\n return function(scope, element, attrs){\n var url = attrs.backImg;\n element.css({\n 'background-image': 'url(/images/' + url +'.png)'\n });\n };\n})\n","angular.module('rallly')\n.directive('datepicker', function(){\n return {\n restrict : 'A',\n require : 'ngModel',\n scope : {\n model : '=ngModel',\n control : '='\n },\n templateUrl: 'templates/directives/datePicker.html',\n link : function(scope, el, attrs, ngModel){\n scope.model = scope.model || [];\n scope.control = scope.control || {};\n\n scope.$watchCollection('model', function(newValue){\n ngModel.$setViewValue(newValue);\n ngModel.$validate();\n });\n\n ngModel.$validators.required = function(modelValue, viewValue){\n if (!modelValue || modelValue.length == 0){\n return false;\n }\n return true;\n }\n\n var today = Date.today(), activeDate = today.clone();\n var setMonth = function(toDate){\n activeDate = toDate;\n var startDate = activeDate.clone().moveToFirstDayOfMonth(),\n startDateDOW = startDate.getDay();\n startDate.add(startDateDOW - 7).days();\n scope.title = activeDate.toString('MMMM yyyy');\n var days = new Array(42);\n for (var i = 0; i < days.length; i++){\n var date = startDate.clone().add(i).days()\n days[i] = {\n date : date,\n isOutsideMonth : (date.getMonth() != activeDate.getMonth()) ? true : false,\n isToday : (Date.equals(date, today))\n }\n }\n scope.days = days;\n }\n setMonth(activeDate);\n scope.selectDay = function(dayObj){\n if (dayObj.isOutsideMonth) {\n setMonth(dayObj.date);\n }\n if ((index = scope.isActive(dayObj.date, true)) != -1) {\n // Already selected\n scope.model.splice(index, 1); // remove\n } else {\n // Not selected\n var index = 0, inserted = false;\n do {\n if (scope.model[index] == undefined || Date.compare(Date.parse(scope.model[index]), dayObj.date) > 0){\n scope.model.splice(index, 0, dayObj.date);\n inserted = true;\n }\n index++;\n } while (inserted == false);\n }\n }\n scope.isActive = function(date, returnIndex){\n scope.model = scope.model || [];\n for (var i = 0; i < scope.model.length; i++){\n if (Date.equals(Date.parse(scope.model[i]), date)){\n return (returnIndex) ? i : true;\n }\n }\n return (returnIndex) ? -1 : false;\n }\n scope.nextMonth = function(){\n setMonth(activeDate.add(1).months());\n }\n scope.prevMonth = function(){\n setMonth(activeDate.add(-1).months());\n }\n\n scope.control.removeDate = function(date){\n if ((index = scope.isActive(Date.parse(date), true)) != -1) {\n scope.model.splice(index, 1)\n }\n }\n }\n }\n});\n","angular.module('rallly')\n.directive('discussion', function($timeout, Comment, ConfirmModal){\n return {\n restrict : 'A',\n templateUrl : 'templates/directives/discussion.html',\n scope : {\n 'event' : '='\n },\n link : function(scope, el, attrs){\n scope.comment = {};\n var thread = angular.element('.comment-thread');\n $timeout(function(){\n thread.scrollTop(thread.prop('scrollHeight'));\n });\n scope.deleteComment = function(comment){\n var modal = new ConfirmModal({\n title : 'Are you sure?',\n message : 'Are you sure you want to remove this comment?',\n confirmText : 'Yes - delete',\n cancelText : 'No - nevermind',\n isDestructive : true,\n confirm : function(){\n Comment.remove({ id : scope.event._id , cid : comment._id }, function(event){\n scope.event = event;\n });\n }\n });\n }\n scope.postComment = function(){\n if (scope.commentForm.$valid){\n var comment = new Comment(scope.comment);\n comment.$save({id:scope.event._id}, function(event){\n scope.event = event;\n scope.comment = {};\n });\n scope.commentForm.$setPristine();\n }\n }\n }\n }\n});\n","angular.module('rallly')\n.directive('dropdown', function($document){\n return {\n restrict : 'A',\n link : function(scope, el, attrs){\n el.addClass('dropdown');\n scope.open = false;\n\n var clickHandler = function(event){\n var isClickedElementChildOfPopup = el.find(event.target).length > 0;\n if (isClickedElementChildOfPopup) return;\n scope.toggle();\n }\n\n scope.toggle = function(){\n scope.open = !scope.open;\n if (scope.open){\n el.addClass('open');\n $document.bind('click', clickHandler);\n } else {\n el.removeClass('open');\n $document.unbind('click', clickHandler);\n }\n }\n }\n }\n});\n","angular.module('rallly')\n.service('FormHelper', function(){\n this.emailRegexString = '^([\\\\w-\\\\.]+@([\\\\w-]+\\\\.)+[\\\\w-]{2,4})?$';\n this.emailRegex = new RegExp(this.emailRegexString);\n this.prettyError = function(errors, field){\n if (errors.required) return field + \" is required\";\n if (errors.pattern) return field + \" is invalid\" ;\n if (errors.maxlength) return field + \" is too long\";\n return false;\n }\n})\n.directive('userForm', function(FormHelper){\n return {\n scope : {\n event : '=',\n form : '='\n },\n templateUrl : 'templates/form/userForm.html',\n link : function(scope, el, attrs) {\n scope.errors = {};\n\n scope.emailRegex = FormHelper.emailRegex;\n\n scope.$watchCollection('form.name.$error',function(errors){\n scope.errors.name = FormHelper.prettyError(errors, \"Name\");\n });\n\n scope.$watchCollection('form.email.$error',function(errors){\n scope.errors.email = FormHelper.prettyError(errors, \"Email\");\n });\n }\n }\n})\n.directive('eventForm', function(FormHelper){\n return {\n scope : {\n event : '=',\n form : '='\n },\n templateUrl : 'templates/form/eventForm.html',\n link : function(scope, el, attrs) {\n scope.errors = {};\n\n scope.$watchCollection('form.title.$error',function(errors){\n scope.errors.title = FormHelper.prettyError(errors, \"Title\");\n });\n\n scope.$watchCollection('form.location.$error',function(errors){\n scope.errors.location = FormHelper.prettyError(errors, \"Location\");\n });\n\n }\n }\n})\n.directive('dateForm', function(){\n return {\n scope : {\n event : '=',\n form : '='\n },\n templateUrl : 'templates/form/dateForm.html'\n }\n})\n.directive('participantsForm', function(FormHelper){\n return {\n scope : {\n event : '=',\n form : '='\n },\n templateUrl : 'templates/form/participantsForm.html',\n link : function(scope, el, attrs){\n scope.emailRegex = FormHelper.emailRegexString;\n }\n }\n})\n.directive('settingsForm', function(Event, ConfirmModal){\n return {\n scope : {\n event : '=',\n form : '='\n },\n templateUrl : 'templates/form/settingsForm.html',\n link : function(scope, el, attrs){\n scope.deleteEvent = function(){\n if (scope.deleteRequestSent) return;\n Event.delete({'id' : scope.event._id}, function(){\n scope.deleteRequestSent = true;\n var modal = new ConfirmModal({\n title : 'Delete Request Sent',\n message : 'An email has been sent to the creator of this event with instructions to delete it.',\n cancelText : 'OK'\n });\n });\n }\n }\n }\n})\n.directive('switchToggle', function(){\n return {\n scope : {\n model : '=ngModel'\n },\n require : 'ngModel',\n link : function(scope, el, attrs, ngModel) {\n el.addClass('switch-toggle');\n var setClass = function(){\n if (scope.model ^ typeof(attrs.invert) !== 'undefined'){\n el.addClass('active');\n } else {\n el.removeClass('active');\n }\n }\n scope.$watch('model', setClass);\n el.bind('click', function(e){\n scope.model = !scope.model;\n ngModel.$setViewValue(scope.model, e);\n });\n }\n }\n})\n.directive('timeForm', function(DatePickerService){\n return {\n scope : {\n event : '=',\n form : '='\n },\n templateUrl : 'templates/form/timeForm.html',\n link : function(scope, el, attrs){\n var init = false;\n var dateService;\n var deregister = scope.$watch('event.dates', function(value){\n if (value && !init) {\n deregister();\n }\n init = true;\n dateService = new DatePickerService(scope.event.dates);\n scope.unsetDate = function(date){\n dateService.removeDate(date);\n }\n });\n }\n }\n})\n.directive('timePicker', function($timeout){\n return {\n scope : {\n model : '=ngModel'\n },\n require : 'ngModel',\n link : function(scope, el, attrs, ngModel){\n ngModel.$viewChangeListeners.push(function(){\n scope.model = ngModel.$modelValue;\n });\n\n ngModel.$parsers.push(function (value) {\n if (!value) return;\n return Date.parse(value);\n });\n\n ngModel.$validators.time = function(modelValue, viewValue){\n if (ngModel.$isEmpty(modelValue)) return true;\n var time = Date.parse(modelValue);\n if (time) {\n ngModel.$setViewValue(time.toString(\"hh:mm tt\"));\n ngModel.$render();\n return true;\n }\n return false;\n }\n }\n }\n});\n","angular.module('rallly')\n.directive('poll', function($timeout, Participant, ConfirmModal){\n return {\n restrict : 'A',\n templateUrl : 'templates/directives/poll.html',\n scope : {\n 'event' : '='\n },\n link : function(scope, el, attrs){\n scope.defaults = [];\n scope.participant = {};\n var datesCount = [];\n scope.event.$promise.then(function(event){\n var examplesNames = ['John Example', 'Jane Specimen','Mark Instance', 'Mary Case'];\n var examples = [];\n for (var i = 0; i < examplesNames.length; i++){\n var example = { name : examplesNames[i] };\n example.votes = [];\n for (var j = 0; j < event.dates.length; j++){\n var answer = Math.random()<.5;\n example.votes[j] = answer;\n }\n examples.push(example);\n }\n scope.examples = examples;\n })\n scope.delete = function(participant){\n var modal = new ConfirmModal({\n title : 'Delete ' + participant.name + '?',\n message : 'Are you sure you want to remove '+participant.name+' from the poll?',\n confirmText : 'Yes - delete',\n cancelText : 'No - nevermind',\n isDestructive : true,\n confirm : function(){\n Participant.remove({ id : scope.event._id , pid : participant._id }, function(event){\n scope.event = event;\n });\n }\n });\n }\n scope.isTopDate = function(index){\n var count = datesCount[index];\n for (var i = 0; i < datesCount.length; i++){\n if (datesCount[i] > count) return false;\n }\n return true;\n }\n scope.selectedDate = function(index){\n datesCount[index] = 0;\n for (var i = 0; i < scope.event.participants.length; i++){\n if (scope.event.participants[i].votes[index]) datesCount[index]++;\n }\n return datesCount[index];\n }\n scope.update = function(participant){\n Participant.update({\n id : scope.event._id,\n pid : participant._id\n }, participant);\n }\n scope.edit = function(participant){\n scope.defaults[scope.event.participants.indexOf(participant)] = angular.copy(participant);\n }\n scope.cancel = function(index){\n scope.event.participants[index] = scope.defaults[index];\n }\n scope.save = function(){\n if (scope.formnew.$valid){\n var participant = new Participant(scope.participant);\n participant.$save({id:scope.event._id}, function(event){\n scope.event = event;\n scope.participant = {};\n });\n scope.formnew.$setPristine();\n }\n }\n }\n }\n});\n","angular.module('rallly')\n.filter('elapsed', function($filter){\n return function(date){\n if (!date) return;\n var time = Date.parse(date),\n timeNow = new Date().getTime(),\n difference = timeNow - time,\n seconds = Math.floor(difference / 1000),\n minutes = Math.floor(seconds / 60),\n hours = Math.floor(minutes / 60),\n days = Math.floor(hours / 24);\n if (days > 30) {\n return 'on ' + $filter('date')(date, 'MMMM d');\n } else if (days > 1) {\n return days + \" days ago\";\n } else if (days == 1) {\n return \"1 day ago\"\n } else if (hours > 1) {\n return hours + \" hours ago\";\n } else if (hours == 1) {\n return \"an hour ago\";\n } else if (minutes > 1) {\n return minutes + \" minutes ago\";\n } else if (minutes == 1){\n return \"a minute ago\";\n } else {\n return \"a few seconds ago\";\n }\n }\n})\n","angular.module('rallly')\n.factory('ConfirmModal', function(btfModal){\n\n return function(config){\n var modal;\n modal = btfModal({\n templateUrl : 'templates/confirmmodal.html',\n controllerAs : 'modal',\n controller : function(){\n this.title = config.title\n this.message = config.message;\n this.confirm = (config.confirm) ? function(){config.confirm(); modal.deactivate()} : false;\n this.cancel = modal.deactivate;\n this.confirmText = config.confirmText || 'Confirm';\n this.cancelText = config.cancelText || 'Cancel';\n this.isDestructive = config.isDestructive;\n }\n });\n modal.activate();\n \n this.destroy = function(){\n modal.deactivate();\n }\n }\n});\n","angular.module('rallly')\n.factory('Notification', function($timeout, btfModal){\n return function(config){\n var modal;\n modal = btfModal({\n templateUrl : 'templates/notification.html',\n controllerAs : 'notification',\n controller : function(){\n this.title = config.title\n this.message = config.message;\n this.close = modal.deactivate;\n this.type = config.type;\n var timeout = config.timeout || 5000;\n $timeout(modal.deactivate, timeout);\n }\n });\n modal.activate();\n\n this.destroy = function(){\n modal.deactivate();\n }\n }\n});\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["main.js","templates.js","controllers/about.controller.js","controllers/account.controller.js","controllers/deletion.controller.js","controllers/editevent.controller.js","controllers/event.controller.js","controllers/example.controller.js","controllers/home.controller.js","controllers/navigation.controller.js","controllers/newevent.controller.js","controllers/verification.controller.js","directives/backImg.directive.js","directives/datepicker.directive.js","directives/discussion.directive.js","directives/dropdown.directive.js","directives/form.directive.js","directives/poll.directive.js","filters/elapsed.filter.js","services/modal.service.js","services/notification.service.js"],"names":[],"mappings":"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","file":"app.js","sourcesContent":["angular.module('rallly', ['ui.router','ngResource','btford.modal','ngTagsInput','ngAnimate'])\n .config(function($stateProvider, $urlRouterProvider, $locationProvider){\n $locationProvider.html5Mode(true);\n $urlRouterProvider.otherwise(\"/notfound\")\n $stateProvider\n .state('index',{\n url : '/',\n templateUrl : 'templates/home.html',\n controller : 'HomeCtrl'\n })\n .state('newevent',{\n url : '/new',\n templateUrl : 'templates/newEvent/layout.html',\n controller : 'NewEventCtrl',\n })\n .state('newevent.general', {\n templateUrl : 'templates/newEvent/general.html'\n })\n .state('newevent.datetime', {\n templateUrl : 'templates/newEvent/datetime.html'\n })\n .state('newevent.invite', {\n templateUrl : 'templates/newEvent/invite.html'\n })\n .state('newevent.success', {\n templateUrl : 'templates/newEvent/success.html'\n })\n .state('about', {\n url : '/about',\n templateUrl : 'templates/about.html',\n controller : 'AboutCtrl'\n })\n .state('example', {\n url : '/example',\n controller : 'ExampleCtrl'\n })\n .state('notfound', {\n url : '/notfound',\n templateUrl : 'templates/notfound.html'\n })\n .state('event',{\n url : '/:id',\n templateUrl : 'templates/event.html',\n controller : 'EventCtrl'\n })\n .state('editevent', {\n url: '/:id/edit',\n templateUrl : 'templates/editevent.html',\n controller : 'EditEventCtrl'\n })\n .state('verifyevent', {\n url : '/verify/:id/code/:code',\n controller : 'VerificationCtrl'\n })\n .state('deleteevent', {\n url : '/delete/:id/code/:code',\n controller : 'DeletionCtrl'\n })\n })\n .factory('Event', function($resource){\n return $resource('/api/event/:id', { id : '@_id' }, {\n 'update' : { method : 'PUT' },\n 'verify' : { method : 'GET', url : '/api/event/:id/code/:code' },\n 'destroy': { method : 'DELETE', url: '/api/event/:id/code/:code' }\n });\n })\n .factory('Participant', function($resource){\n return $resource('/api/event/:id/participant/:pid', { id: '@_id'}, {\n 'update' : { method : 'PUT' }\n });\n })\n .factory('Comment', function($resource){\n return $resource('/api/event/:id/comment/:cid', { id : '@_id' }, {\n 'update' : { method : 'PUT' }\n })\n })\n .factory('Title', function(){\n return {\n set : function(title){\n document.title = title;\n }\n }\n });\n","angular.module(\"rallly\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"templates/about.html\",\"
\\n
Frequently Asked Questions
\\n
\\n Want to find out more about Rallly? Check out the FAQs below.\\n

What is Rallly?

\\n

\\n Rallly is a collaborative scheduling service that makes deciding on a date fast and easy. In other words, Rallly helps you and your friends decide on a date to host an event.\\n

\\n

Why is it called Rallly?

\\n

\\n The name is derived from the proper spelling of the word, “rally”. The Webster dictionary defines rally as, “to muster for a common purpose” which accurately describes the goal of this service. The inproper spelling can be attributed to the difficulty of finding short and meaningful domain names.\\n

\\n

Who made this?

\\n

\\n Rallly was created by Luke Vella.\\n

\\n
\\n\");\n$templateCache.put(\"templates/confirmmodal.html\",\"
\\n\\n
\\n\\n
\\n
{{modal.title}}
\\n
\\n {{modal.message}}\\n
\\n
\\n \\n \\n
\\n
\\n\\n
\\n\\n
\\n\");\n$templateCache.put(\"templates/editevent.html\",\"
\\n
\\n\\n
Edit Event
\\n
\\n You can makes changes to your existing event by changing the fields in the form below.\\n
\\n\\n
\\n\\n
\\n\\n
\\n\\n
\\n\\n
\\n
\\n\\n
\\n\\n
\\n\\n
\\n\\n
\\n \\n \\n Done\\n
\\n\\n
\\n\\n
\\n\\n
\\n\");\n$templateCache.put(\"templates/event.html\",\"
\\n
\\n
\\n
\\n
\\n {{event.title}}\\n Poll Closed\\n Poll Open\\n
\\n
\\n Created by {{event.creator.name}} • {{event.created | elapsed}}\\n
\\n
\\n
\\n \\n
\\n
\\n
{{event.description}}
\\n
\\n Location:\\n {{event.location}}\\n
\\n\\n
\\n
\\n
\\n
\\n
\\n\\n
\\n
\\n Discussion\\n
\\n
\\n You can discuss the event with your friends by leaving a comment below.\\n
\\n
\\n\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/home.html\",\"
\\n
\\n \\n
\\n
\\n Schedule an Event\\n
\\n
\\n Want to host an event but can’t decide on a date? Click on the button below to start!\\n
\\n \\n
\\n\");\n$templateCache.put(\"templates/notfound.html\",\"

Error 404

\\n

Not Found

\\n\");\n$templateCache.put(\"templates/notification.html\",\"
\\n
\\n {{notification.title}}\\n
\\n
\\n {{notification.message}}\\n
\\n
\\n\");\n$templateCache.put(\"templates/directives/datePicker.html\",\"
\\n
\\n
\\n \\n \\n {{title}}\\n \\n \\n
\\n
\\n
\\n Su\\n
\\n
\\n Mo\\n
\\n
\\n Tu\\n
\\n
\\n We\\n
\\n
\\n Th\\n
\\n
\\n Fr\\n
\\n
\\n Sa\\n
\\n
\\n
\\n
\\n {{day.date | date : \\'d\\' }}\\n
\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/directives/discussion.html\",\"
    \\n
  • \\n
    \\n \\n
    \\n
    \\n ×\\n
    \\n {{comment.author.name}}\\n {{comment.created | elapsed}}\\n
    \\n
    {{comment.content}}
    \\n
    \\n
  • \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n \\n \\n \\n Make sure you fill in all the fields.\\n \\n
\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/directives/poll.html\",\"
\\n
\\n {{event.participants.length}} participants\\n
\\n
\\n
\\n
\\n {{d | date: \\'EEE\\'}}\\n
\\n
\\n {{d | date: \\'d\\'}}\\n
\\n
\\n {{d | date : \\'MMM\\'}}\\n
\\n {{selectedDate($index)}}\\n
\\n
\\n
\\n\\n
\\n
\\n
\\n
\\n
\\n
\\n \\n \\n \\n \\n {{participant.name}}\\n
\\n
\\n \\n \\n \\n
\\n
\\n
\\n \\n \\n \\n \\n
\\n
\\n
\\n
0}\\\">\\n
\\n
\\n \\n \\n \\n {{example.name}}\\n
\\n
\\n \\n \\n
\\n
\\n\\n
\\n
\\n
\\n
\\n Fill in the form below to get started\\n
\\n
\\n
\\n
\\n
\\n
\\n \\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/directives/timePicker.html\",\"
\\n
\\n
\\n
\\n {{date | date: \\'EEE\\'}}\\n
\\n
\\n {{date | date: \\'d\\'}}\\n
\\n
\\n {{date | date : \\'MMM\\'}}\\n
\\n \\n
\\n
\\n
\\n \\n
\\n
\\n\");\n$templateCache.put(\"templates/form/dateForm.html\",\"
\\n
Choose Dates
\\n
    \\n
  • \\n
    \\n
    \\n {{d | date: \\'EEE\\'}}\\n
    \\n
    \\n {{d | date: \\'d\\'}}\\n
    \\n
    \\n {{d | date : \\'MMM\\'}}\\n
    \\n \\n
    \\n
  • \\n
\\n
\\n
\\n
\\n
\\n \\n \\n You need to select a few dates\\n \\n
\\n\\n
\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/form/eventForm.html\",\"
\\n
Event Details
\\n
\\n
\\n
\\n
\\n
\\n \\n \\n {{errors.title}}\\n \\n \\n
\\n
\\n
\\n
\\n \\n \\n {{errors.location}}\\n \\n \\n
\\n
\\n
\\n
\\n
\\n \\n \\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/form/participantsForm.html\",\"
\\n
Invite Participants
\\n
\\n
\\n
\\n
\\n \\n \\n \\n\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/form/settingsForm.html\",\"
\\n
Settings
\\n
\\n
\\n
\\n
\\n
\\n Poll Status\\n
\\n
\\n Let people vote on the poll.\\n
\\n
\\n
\\n
\\n {{event.isClosed ? \\'Closed\\' : \\'Open\\' }}\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n Notifications\\n
\\n
\\n Send email notifications to the creator of this event.\\n
\\n
\\n
\\n
\\n {{event.creator.allowNotifications ? \\'Enabled\\' : \\'Disabled\\' }}\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n Delete Event\\n
\\n
\\n Once you delete an event it will no longer be accessible.\\n
\\n
\\n
\\n \\n
\\n
\\n
\\n\\n\");\n$templateCache.put(\"templates/form/timeForm.html\",\"
\\n
Choose Times
\\n
\\n
\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
\\n\\n \\n Time 1\\n \\n Time 2\\n \\n Time 3\\n
\\n
\\n
\\n {{d.date | date: \\'EEE\\'}}\\n
\\n
\\n {{d.date | date: \\'d\\'}}\\n
\\n
\\n {{d.date | date : \\'MMM\\'}}\\n
\\n \\n
\\n
\\n \\n
\\n
\\n\");\n$templateCache.put(\"templates/form/userForm.html\",\"
\\n
Your Details
\\n
\\n
\\n
\\n
\\n
\\n \\n \\n {{errors.name}}\\n \\n \\n
\\n
\\n
\\n
\\n \\n \\n {{errors.email}}\\n \\n \\n
\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/newEvent/datetime.html\",\"
\\n\\n
\\n\\n
\\n \\n \\n
\\n\");\n$templateCache.put(\"templates/newEvent/general.html\",\"
\\n\\n
\\n\\n
\\n\\n
\\n\\n
\\n \\n
\\n\");\n$templateCache.put(\"templates/newEvent/invite.html\",\"
\\n
\\n
Summary
\\n
\\n
\\n
\\n
\\n
\\n Your Name\\n
\\n
\\n {{event.creator.name}}\\n
\\n
\\n
\\n
\\n Email\\n
\\n
\\n {{event.creator.email}}\\n
\\n
\\n
\\n
\\n Title\\n
\\n
\\n {{event.title}}\\n
\\n
\\n
\\n
\\n Location\\n
\\n
\\n {{event.location}}\\n
\\n
\\n
\\n
\\n Description\\n
\\n
{{event.description}}
\\n
\\n
\\n
\\n Dates\\n
\\n
\\n
    \\n
  • \\n
    \\n
    \\n {{d | date: \\'EEE\\'}}\\n
    \\n
    \\n {{d | date: \\'d\\'}}\\n
    \\n
    \\n {{d | date : \\'MMM\\'}}\\n
    \\n
    \\n
  • \\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n\\n
\\n\\n
\\n \\n \\n
\\n\");\n$templateCache.put(\"templates/newEvent/layout.html\",\"
\\n\\n
Schedule a New Event
\\n
\\n Fill in the form below to create your event and share it with your friends and colleagues.\\n
\\n
    \\n
  1. 1 }\\\">\\n General Details\\n
  2. \\n
  3. 2 }\\\">\\n Dates & Times\\n
  4. \\n
  5. 3 }\\\">\\n Create & Send\\n
  6. \\n
\\n
\\n
\\n\\n
\\n
\\n
\\n\");\n$templateCache.put(\"templates/newEvent/success.html\",\"
\\n
\\n \\n
\\n
Event Created
\\n
\\n Your event has been created successfully! You should receive an email shortly with instructions to verify your email address.\\n
\\n
\\n
\\n
\\n \\n GO\\n
\\n
\\n\");}]);","angular.module('rallly')\n.controller('AboutCtrl', function(Title){\n Title.set('About Rallly')\n});\n","angular.module('rallly')\n.controller('AccountCtrl', function($scope, ConfirmModal){\n $scope.showNotice = function(){\n \n }\n})\n","angular.module('rallly')\n.controller('DeletionCtrl', function($state, Notification, Event){\n Event.destroy({id : $state.params.id, code :$state.params.code}, function(){\n var notification = new Notification({\n title : 'Event deleted',\n message : 'This event has been deleted',\n type : 'success',\n timeout : 5000\n });\n }, function(e){\n var notification = new Notification({\n title : 'Deletion Failed',\n message : 'The event could not be deleted. Make sure that it exists and that the url is correct',\n type : 'error'\n });\n });\n $state.go('event', { id : $state.params.id });\n});\n","angular.module('rallly')\n.controller('EditEventCtrl', function($scope, $http, $state, $timeout, Event, ConfirmModal, Notification, Title){\n var id = $state.params.id\n $scope.event = Event.get({id:id}, function(data){\n Title.set(\"Edit: \" + $scope.event.title);\n $scope.master = angular.copy($scope.event);\n }, function(e){\n $state.go('notfound');\n });\n $scope.undoChanges = function(){\n $scope.event = angular.copy($scope.master);\n }\n $scope.didChange = function(){\n return JSON.stringify($scope.master) != JSON.stringify($scope.event);\n }\n $scope.didChangeDates = function(){\n return JSON.stringify($scope.master.dates) != JSON.stringify($scope.event.dates);\n }\n $scope.submit = function(){\n if ($scope.form.$valid){\n if ($scope.didChangeDates() ){\n var modal = new ConfirmModal({\n title : 'Hold up!',\n message : 'Changing the dates will reset all entries by the participants. Are you sure you want to do that?',\n confirmText : 'Yes, I\\'m sure',\n isDestructive : true,\n confirm : function(){\n $scope.event.participants = [];\n update();\n }\n });\n\n } else {\n update();\n }\n } else {\n var notification = new Notification({\n title : 'Not so fast',\n message : 'Make sure you fill in all the required fields and try again.',\n type : 'error'\n });\n }\n }\n var update = function(){\n Event.update({\n id : id\n }, $scope.event,\n function(){\n var notification = new Notification({\n title : 'Changes Saved',\n message : 'Your changes have been saved successfully.',\n type : 'success'\n });\n $scope.master = angular.copy($scope.event);\n });\n }\n});\n","angular.module('rallly')\n.controller('EventCtrl', function($scope, $http, $state, Title, Event, ConfirmModal){\n var id = $state.params.id;\n // Get Event\n $scope.event = Event.get({id:id}, function(data){\n // Set the page title to the event title\n Title.set($scope.event.title);\n // Generate event url - i.e. http://rallly.co/jF9F_Fd\n $scope.eventUrl = $state.href('event', {\n id: $scope.event._id\n }, {\n absolute : true\n });\n }, function(e){\n $state.go('notfound');\n });\n\n $scope.openEvent = function(){\n $scope.event.isClosed = false;\n Event.update({\n id : id\n }, $scope.event,\n function(){\n var modal = new ConfirmModal({\n title : 'Event Open',\n message : 'People can vote and comment on this event.',\n cancelText : 'OK',\n });\n });\n }\n\n $scope.closeEvent = function(){\n $scope.event.isClosed = true;\n Event.update({\n id : id\n }, $scope.event,\n function(){\n var modal = new ConfirmModal({\n title : 'Event Closed',\n message : 'People can no longer vote or comment on this event.',\n cancelText : 'OK',\n });\n });\n }\n\n $scope.editEvent = function(){\n $state.go('editevent', { id : $scope.event._id });\n }\n\n});\n","angular.module('rallly')\n.controller('ExampleCtrl', function($state, Event){\n // Generate dates\n var dates = [], date = new Date();\n for (var i = 0; i < 4; i++){\n dates.push(date.add(Math.ceil(Math.random() * 5)).days().toISOString());\n }\n // Generate Participants\n var examplesNames = ['John Example', 'Jane Specimen','Mark Instance', 'Mary Case'];\n var examples = [];\n for (var i = 0; i < examplesNames.length; i++){\n var example = { name : examplesNames[i] };\n example.votes = [];\n for (var j = 0; j < dates.length; j++){\n var answer = Math.random()<.5;\n example.votes[j] = answer;\n }\n examples.push(example);\n }\n var event = new Event({\n \"creator\": {\n \"name\": \"John Example\",\n \"email\": \"rallly@lukevella.com\"\n },\n \"title\": \"Lunch Meeting\",\n \"location\": \"Starbucks, 901 New York Avenue\",\n \"description\": \"This event has been automatically generated just for you! Feel free to try out all the different features and when you're ready, you can schedule a new event.\",\n \"dates\" : dates,\n \"participants\" : examples,\n \"emails\": [],\n \"comments\" : [{\n author : {\n name : \"John Example\"\n },\n content : \"Hey guys, this is a comment!\"\n }, {\n author : {\n name : \"Mark Instance\"\n },\n content : \"Hi John... nice comment. Keep up the great work!\"\n }, {\n author : {\n name : \"John Example\"\n },\n content : \"Thank you!\"\n }],\n \"isExample\" : true\n });\n event.$save(function(data){\n\n $state.go('event', { id : data._id });\n })\n});\n","angular.module('rallly')\n.controller('HomeCtrl', function($scope, $state, Title){\n Title.set('Rallly - Collaborative Scheduling')\n\n $scope.newEvent = function(){\n $state.go('newevent');\n }\n});\n","angular.module('rallly')\n.controller('NavigationCtrl', function($scope, $rootScope, $location, $document){\n $scope.isActive = function(path) {\n if ($location.path() == path) {\n return true;\n } else {\n return false\n }\n }\n\n\n\n var clickHandler = function(event){\n var isClickedElementChildOfPopup = angular.element('.main-navigation').find(event.target).length > 0;\n console.log(isClickedElementChildOfPopup);\n if (isClickedElementChildOfPopup) return;\n $scope.toggleMenu()\n }\n\n $rootScope.$on('$stateChangeSuccess', function(){\n angular.element('body').removeClass('open-menu');\n $document.unbind('click', clickHandler);\n });\n\n $scope.toggleMenu = function(){\n var isOpen = angular.element('body').hasClass('open-menu');\n if (isOpen) {\n angular.element('body').removeClass('open-menu');\n $document.unbind('click', clickHandler);\n } else {\n angular.element('body').addClass('open-menu');\n $document.bind('click', clickHandler);\n }\n }\n\n\n})\n","angular.module('rallly')\n.controller('NewEventCtrl', function($scope, $http, $state, Event, ConfirmModal, Notification){\n\n $scope.title = \"Schedule a New Event\";\n $scope.description = \"Fill in the form below to create your event and share it with your friends and colleagues.\";\n $scope.event = {};\n\n var states = [\n 'newevent.general',\n 'newevent.datetime',\n 'newevent.invite'\n ];\n\n $scope.page = 1;\n\n var goTo = function(page){\n $scope.page = page;\n $state.go(states[page-1]);\n }\n\n goTo($scope.page);\n\n\n $scope.submit = function(){\n if ($scope.form.$valid && $scope.page == states.length){\n console.log(JSON.stringify($scope.event));\n var newEvent = new Event($scope.event);\n newEvent.$save()\n .then(function(event){\n $scope.event = event;\n $scope.eventUrl = $state.href('event', {\n id: $scope.event._id\n }, {\n absolute : true\n });\n $scope.page++;\n $state.go('newevent.success');\n }, function(){\n var modal = new ConfirmModal({\n title : 'Uh oh!',\n message : 'There was an error creating your event. Please try again later.',\n cancelText : 'OK'\n });\n });\n } else if ($scope.form.$valid) {\n $scope.form.$setPristine();\n $scope.nextPage();\n }\n }\n\n $scope.nextPage = function(){\n goTo($scope.page+1);\n }\n\n $scope.prevPage = function(){\n goTo($scope.page-1);\n }\n\n});\n","angular.module('rallly')\n.controller('VerificationCtrl', function(Event, Notification, $state){\n Event.verify({id : $state.params.id, code :$state.params.code}, function(){\n var notification = new Notification({\n title : 'Email Verified',\n message : 'Your email has been verified. You will now be able to receive email notifications for this event',\n type : 'success',\n timeout : 5000\n });\n }, function(e){\n var notification = new Notification({\n title : 'Verification Failed',\n message : 'Your verification code has expired.',\n type : 'error'\n });\n });\n $state.go('event', { id : $state.params.id });\n\n});\n","angular.module('rallly')\n.directive('backImg', function(){\n return function(scope, element, attrs){\n var url = attrs.backImg;\n element.css({\n 'background-image': 'url(/images/' + url +'.png)'\n });\n };\n})\n","angular.module('rallly')\n.directive('datepicker', function(){\n return {\n restrict : 'A',\n require : 'ngModel',\n scope : {\n model : '=ngModel',\n control : '='\n },\n templateUrl: 'templates/directives/datePicker.html',\n link : function(scope, el, attrs, ngModel){\n scope.model = scope.model || [];\n scope.control = scope.control || {};\n\n scope.$watchCollection('model', function(newValue){\n ngModel.$setViewValue(newValue);\n ngModel.$validate();\n });\n\n ngModel.$validators.required = function(modelValue, viewValue){\n if (!modelValue || modelValue.length == 0){\n return false;\n }\n return true;\n }\n\n var today = Date.today(), activeDate = today.clone();\n var setMonth = function(toDate){\n activeDate = toDate;\n var startDate = activeDate.clone().moveToFirstDayOfMonth(),\n startDateDOW = startDate.getDay();\n startDate.add(startDateDOW - 7).days();\n scope.title = activeDate.toString('MMMM yyyy');\n var days = new Array(42);\n for (var i = 0; i < days.length; i++){\n var date = startDate.clone().add(i).days()\n days[i] = {\n date : date,\n isOutsideMonth : (date.getMonth() != activeDate.getMonth()) ? true : false,\n isToday : (Date.equals(date, today))\n }\n }\n scope.days = days;\n }\n setMonth(activeDate);\n scope.selectDay = function(dayObj){\n if (dayObj.isOutsideMonth) {\n setMonth(dayObj.date);\n }\n if ((index = scope.isActive(dayObj.date, true)) != -1) {\n // Already selected\n scope.model.splice(index, 1); // remove\n } else {\n // Not selected\n var index = 0, inserted = false;\n do {\n if (scope.model[index] == undefined || Date.compare(Date.parse(scope.model[index]), dayObj.date) > 0){\n scope.model.splice(index, 0, dayObj.date);\n inserted = true;\n }\n index++;\n } while (inserted == false);\n }\n }\n scope.isActive = function(date, returnIndex){\n scope.model = scope.model || [];\n for (var i = 0; i < scope.model.length; i++){\n if (Date.equals(Date.parse(scope.model[i]), date)){\n return (returnIndex) ? i : true;\n }\n }\n return (returnIndex) ? -1 : false;\n }\n scope.nextMonth = function(){\n setMonth(activeDate.add(1).months());\n }\n scope.prevMonth = function(){\n setMonth(activeDate.add(-1).months());\n }\n\n scope.control.removeDate = function(date){\n if ((index = scope.isActive(Date.parse(date), true)) != -1) {\n scope.model.splice(index, 1)\n }\n }\n }\n }\n});\n","angular.module('rallly')\n.directive('discussion', function($timeout, Comment, ConfirmModal){\n return {\n restrict : 'A',\n templateUrl : 'templates/directives/discussion.html',\n scope : {\n 'event' : '='\n },\n link : function(scope, el, attrs){\n scope.comment = {};\n var thread = angular.element('.comment-thread');\n $timeout(function(){\n thread.scrollTop(thread.prop('scrollHeight'));\n });\n scope.deleteComment = function(comment){\n var modal = new ConfirmModal({\n title : 'Are you sure?',\n message : 'Are you sure you want to remove this comment?',\n confirmText : 'Yes - delete',\n cancelText : 'No - nevermind',\n isDestructive : true,\n confirm : function(){\n Comment.remove({ id : scope.event._id , cid : comment._id }, function(event){\n scope.event = event;\n });\n }\n });\n }\n scope.postComment = function(){\n if (scope.commentForm.$valid){\n var comment = new Comment(scope.comment);\n comment.$save({id:scope.event._id}, function(event){\n scope.event = event;\n scope.comment = {};\n });\n scope.commentForm.$setPristine();\n }\n }\n }\n }\n});\n","angular.module('rallly')\n.directive('dropdown', function($document){\n return {\n restrict : 'A',\n link : function(scope, el, attrs){\n el.addClass('dropdown');\n scope.open = false;\n\n var clickHandler = function(event){\n var isClickedElementChildOfPopup = el.find(event.target).length > 0;\n if (isClickedElementChildOfPopup) return;\n scope.toggle();\n }\n\n scope.toggle = function(){\n scope.open = !scope.open;\n if (scope.open){\n el.addClass('open');\n $document.bind('click', clickHandler);\n } else {\n el.removeClass('open');\n $document.unbind('click', clickHandler);\n }\n }\n }\n }\n});\n","angular.module('rallly')\n.service('FormHelper', function(){\n this.emailRegexString = '^([\\\\w-\\\\.]+@([\\\\w-]+\\\\.)+[\\\\w-]{2,4})?$';\n this.emailRegex = new RegExp(this.emailRegexString);\n this.prettyError = function(errors, field){\n if (errors.required) return field + \" is required\";\n if (errors.pattern) return field + \" is invalid\" ;\n if (errors.maxlength) return field + \" is too long\";\n return false;\n }\n})\n.directive('userForm', function(FormHelper){\n return {\n scope : {\n event : '=',\n form : '='\n },\n templateUrl : 'templates/form/userForm.html',\n link : function(scope, el, attrs) {\n scope.errors = {};\n\n scope.emailRegex = FormHelper.emailRegex;\n\n scope.$watchCollection('form.name.$error',function(errors){\n scope.errors.name = FormHelper.prettyError(errors, \"Name\");\n });\n\n scope.$watchCollection('form.email.$error',function(errors){\n scope.errors.email = FormHelper.prettyError(errors, \"Email\");\n });\n }\n }\n})\n.directive('eventForm', function(FormHelper){\n return {\n scope : {\n event : '=',\n form : '='\n },\n templateUrl : 'templates/form/eventForm.html',\n link : function(scope, el, attrs) {\n scope.errors = {};\n\n scope.$watchCollection('form.title.$error',function(errors){\n scope.errors.title = FormHelper.prettyError(errors, \"Title\");\n });\n\n scope.$watchCollection('form.location.$error',function(errors){\n scope.errors.location = FormHelper.prettyError(errors, \"Location\");\n });\n\n }\n }\n})\n.directive('dateForm', function(){\n return {\n scope : {\n event : '=',\n form : '='\n },\n templateUrl : 'templates/form/dateForm.html'\n }\n})\n.directive('participantsForm', function(FormHelper){\n return {\n scope : {\n event : '=',\n form : '='\n },\n templateUrl : 'templates/form/participantsForm.html',\n link : function(scope, el, attrs){\n scope.emailRegex = FormHelper.emailRegexString;\n }\n }\n})\n.directive('settingsForm', function(Event, ConfirmModal){\n return {\n scope : {\n event : '=',\n form : '='\n },\n templateUrl : 'templates/form/settingsForm.html',\n link : function(scope, el, attrs){\n scope.deleteEvent = function(){\n if (scope.deleteRequestSent) return;\n Event.delete({'id' : scope.event._id}, function(){\n scope.deleteRequestSent = true;\n var modal = new ConfirmModal({\n title : 'Delete Request Sent',\n message : 'An email has been sent to the creator of this event with instructions to delete it.',\n cancelText : 'OK'\n });\n });\n }\n }\n }\n})\n.directive('switchToggle', function(){\n return {\n scope : {\n model : '=ngModel'\n },\n require : 'ngModel',\n link : function(scope, el, attrs, ngModel) {\n el.addClass('switch-toggle');\n var setClass = function(){\n if (scope.model ^ typeof(attrs.invert) !== 'undefined'){\n el.addClass('active');\n } else {\n el.removeClass('active');\n }\n }\n scope.$watch('model', setClass);\n el.bind('click', function(e){\n scope.model = !scope.model;\n ngModel.$setViewValue(scope.model, e);\n });\n }\n }\n})\n.directive('timeForm', function(DatePickerService){\n return {\n scope : {\n event : '=',\n form : '='\n },\n templateUrl : 'templates/form/timeForm.html',\n link : function(scope, el, attrs){\n var init = false;\n var dateService;\n var deregister = scope.$watch('event.dates', function(value){\n if (value && !init) {\n deregister();\n }\n init = true;\n dateService = new DatePickerService(scope.event.dates);\n scope.unsetDate = function(date){\n dateService.removeDate(date);\n }\n });\n }\n }\n})\n.directive('timePicker', function($timeout){\n return {\n scope : {\n model : '=ngModel'\n },\n require : 'ngModel',\n link : function(scope, el, attrs, ngModel){\n ngModel.$viewChangeListeners.push(function(){\n scope.model = ngModel.$modelValue;\n });\n\n ngModel.$parsers.push(function (value) {\n if (!value) return;\n return Date.parse(value);\n });\n\n ngModel.$validators.time = function(modelValue, viewValue){\n if (ngModel.$isEmpty(modelValue)) return true;\n var time = Date.parse(modelValue);\n if (time) {\n ngModel.$setViewValue(time.toString(\"hh:mm tt\"));\n ngModel.$render();\n return true;\n }\n return false;\n }\n }\n }\n});\n","angular.module('rallly')\n.directive('poll', function($timeout, Participant, ConfirmModal){\n return {\n restrict : 'A',\n templateUrl : 'templates/directives/poll.html',\n scope : {\n 'event' : '='\n },\n link : function(scope, el, attrs){\n scope.defaults = [];\n scope.participant = {};\n var datesCount = [];\n scope.event.$promise.then(function(event){\n var examplesNames = ['John Example', 'Jane Specimen','Mark Instance', 'Mary Case'];\n var examples = [];\n for (var i = 0; i < examplesNames.length; i++){\n var example = { name : examplesNames[i] };\n example.votes = [];\n for (var j = 0; j < event.dates.length; j++){\n var answer = Math.random()<.5;\n example.votes[j] = answer;\n }\n examples.push(example);\n }\n scope.examples = examples;\n })\n scope.delete = function(participant){\n var modal = new ConfirmModal({\n title : 'Delete ' + participant.name + '?',\n message : 'Are you sure you want to remove '+participant.name+' from the poll?',\n confirmText : 'Yes - delete',\n cancelText : 'No - nevermind',\n isDestructive : true,\n confirm : function(){\n Participant.remove({ id : scope.event._id , pid : participant._id }, function(event){\n scope.event = event;\n });\n }\n });\n }\n scope.isTopDate = function(index){\n var count = datesCount[index];\n for (var i = 0; i < datesCount.length; i++){\n if (datesCount[i] > count) return false;\n }\n return true;\n }\n scope.selectedDate = function(index){\n datesCount[index] = 0;\n for (var i = 0; i < scope.event.participants.length; i++){\n if (scope.event.participants[i].votes[index]) datesCount[index]++;\n }\n return datesCount[index];\n }\n scope.update = function(participant){\n Participant.update({\n id : scope.event._id,\n pid : participant._id\n }, participant);\n }\n scope.edit = function(participant){\n scope.defaults[scope.event.participants.indexOf(participant)] = angular.copy(participant);\n }\n scope.cancel = function(index){\n scope.event.participants[index] = scope.defaults[index];\n }\n scope.save = function(){\n if (scope.formnew.$valid){\n var participant = new Participant(scope.participant);\n participant.$save({id:scope.event._id}, function(event){\n scope.event = event;\n scope.participant = {};\n });\n scope.formnew.$setPristine();\n }\n }\n }\n }\n});\n","angular.module('rallly')\n.filter('elapsed', function($filter){\n return function(date){\n if (!date) return;\n var time = Date.parse(date),\n timeNow = new Date().getTime(),\n difference = timeNow - time,\n seconds = Math.floor(difference / 1000),\n minutes = Math.floor(seconds / 60),\n hours = Math.floor(minutes / 60),\n days = Math.floor(hours / 24);\n if (days > 30) {\n return 'on ' + $filter('date')(date, 'MMMM d');\n } else if (days > 1) {\n return days + \" days ago\";\n } else if (days == 1) {\n return \"1 day ago\"\n } else if (hours > 1) {\n return hours + \" hours ago\";\n } else if (hours == 1) {\n return \"an hour ago\";\n } else if (minutes > 1) {\n return minutes + \" minutes ago\";\n } else if (minutes == 1){\n return \"a minute ago\";\n } else {\n return \"a few seconds ago\";\n }\n }\n})\n","angular.module('rallly')\n.factory('ConfirmModal', function(btfModal){\n\n return function(config){\n var modal;\n modal = btfModal({\n templateUrl : 'templates/confirmmodal.html',\n controllerAs : 'modal',\n controller : function(){\n this.title = config.title\n this.message = config.message;\n this.confirm = (config.confirm) ? function(){config.confirm(); modal.deactivate()} : false;\n this.cancel = modal.deactivate;\n this.confirmText = config.confirmText || 'Confirm';\n this.cancelText = config.cancelText || 'Cancel';\n this.isDestructive = config.isDestructive;\n }\n });\n modal.activate();\n \n this.destroy = function(){\n modal.deactivate();\n }\n }\n});\n","angular.module('rallly')\n.factory('Notification', function($timeout, btfModal){\n return function(config){\n var modal;\n modal = btfModal({\n templateUrl : 'templates/notification.html',\n controllerAs : 'notification',\n controller : function(){\n this.title = config.title\n this.message = config.message;\n this.close = modal.deactivate;\n this.type = config.type;\n var timeout = config.timeout || 5000;\n $timeout(modal.deactivate, timeout);\n }\n });\n modal.activate();\n\n this.destroy = function(){\n modal.deactivate();\n }\n }\n});\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/public/js/controllers/example.controller.js b/public/js/controllers/example.controller.js index 2e181a36a..6a444155d 100644 --- a/public/js/controllers/example.controller.js +++ b/public/js/controllers/example.controller.js @@ -43,7 +43,8 @@ angular.module('rallly') name : "John Example" }, content : "Thank you!" - }] + }], + "isExample" : true }); event.$save(function(data){