{"version":3,"sources":["uw-theme-fix.js","app.js","app.activityLog.js","app.committee.js","app.election.js","app.fileUploaders.js","app.grids.js","app.individual.js","app.input.js","app.kendogrids.js","app.message.js","app.prospective.js","app.survey.js","app.userhome.js","app.vis.js"],"names":[],"mappings":"AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACn0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"../site.js","sourcesContent":["$ = jQuery;","//*************************************************************************************\r\n//* WaMS Component Framework - app.js\r\n//* Version 1.03f\r\n//* Author: Damian Koch\r\n//* Component framework essentials, plus utilities.\r\n//* Requires jQuery, foundation\r\n//* 10/3/17 DBK: Added error messaging support to delete functionality, return JSON with\r\n//* errorMessage set as the message to use.\r\n//* 10/5/17 DBK: Added isDebugMode flag. Console messages only show when isDebugMode = 1\r\n//* 10/10/17 BWH: Added subtype to allow for additional variables to be passed on creation of component\r\n//* 10/24/17 DBK: Added JSON support to save action\r\n//* 10/30/17 DBK: Added tooltip support\r\n//* 11/01/17 DBK: Fix bindEditMode race condition for bindCheckboxLists\r\n//* 11/09/17 DBK: Prevent save on [enter] keypress\r\n//* 11/21/17 DBK: Allow HTML tooltips\r\n//* 11/28/17 DBK: Added rich text editor support (jqte called on [data-role=richtext]\r\n//* 12/14/17 DBK: Added to robustness of action bound debug message\r\n//* 12/18/17 DBK: Allow page component updateId actions to work with non-int Ids\r\n//* 2/15/18 BWH: Hooked in foundation date picker\r\n//* 4/2/18 WMK: Added back to top functionality\r\n//* 4/16/18 WQP: Updated select/deselect many logic to only select visible (filtered) results\r\n//* 5/14/18 DBK: Added robust filtering and paging to component lists\r\n//* 5/14/18 DBK: Added isPrintableCharacter helper method\r\n//* 5/25/18 Hanson: Removed the cancel action if someone hits escape in text area text box\r\n//* 09/21/2018 BWH: Moved validation token definition from page to the component\r\n//* 12/18/18 BWH: Updates to component filter for timeout and update to printable charachters\r\n//*************************************************************************************\r\n\r\n//$(document).foundation();\r\n\r\nvar app = (function () {\r\n var myApp = {\r\n Page: function (applicationPath) {\r\n this.appPath = applicationPath || '';\r\n this.id = 0;\r\n this.loads = 0;\r\n\r\n this.isDebugMode = 1;\r\n\r\n this.components = {};\r\n this.componentActions = {};\r\n this.currentComponent = {};\r\n this.allComponents = {};\r\n this.storage = {};\r\n \r\n this.selectors = {\r\n components: ':not([data-role~=\"component-template\"]) [data-role~=\"component\"]',\r\n componentActions: '[data-role~=\"component-action\"]',\r\n datepicker: '[data-role~=\"datepicker\"]',\r\n modals: {\r\n confirmRemove: '#removeConfirmModal',\r\n confirmRemoveOkButton: '#removeConfirmModal--ok',\r\n descriptiveError: '#descriptiveErrorModal',\r\n descriptiveErrorMessage: '[data-role~=\"descriptiveErrorMessage\"]',\r\n loadError: '#loadErrorModal',\r\n removeConfirm: '#removeConfirmModal',\r\n saveError: '#saveErrorModal'\r\n },\r\n searchBar: '[name=searchForm]'\r\n };\r\n\r\n this.initCheckboxLists();\r\n this.initModals();\r\n this.initTooltips();\r\n this.initComponents();\r\n this.initBackToTopButton();\r\n }\r\n };\r\n\r\n myApp.Page.prototype.startLoad = function () { if (++this.loads === 1 && this.selectors.loading) this.selectors.loading.show(); };\r\n myApp.Page.prototype.endLoad = function () { if (--this.loads === 0 && this.selectors.loading) this.selectors.loading.hide(); };\r\n\r\n myApp.Page.prototype.init = function () { this.log('init called on page, but not implemented'); };\r\n myApp.Page.prototype.initCheckboxLists = function () { this.bindCheckboxLists(this.el); };\r\n myApp.Page.prototype.initTooltips = function () { $(document).foundation(); };\r\n\r\n myApp.Page.prototype.initComponents = function () {\r\n //for each component, set up the component\r\n var page = this;\r\n //exclude child components\r\n $(this.selectors.components).not(this.selectors.components + ' ' + this.selectors.components).each(function () { page.initComponent(this, page); });\r\n $(this.selectors.componentActions).not(this.selectors.components + ' ' + this.selectors.componentActions).each(function () { page.initPageAction(this, page); });\r\n };\r\n myApp.Page.prototype.initComponent = function (e, pc, subtype) {\r\n var type = $(e).closest('[data-component-type]').data('component-type');\r\n var group = type + ($(e).closest('[data-component-group]').data('component-group') || \"\");\r\n var parent = pc || this;\r\n\r\n if (parent.components[group] === undefined) {\r\n parent.components[group] = [];\r\n parent.components[group + '-noResults'] = $('[data-component-role=\"noResults\"][data-component-type=\"' + group + '\"]', parent.el);\r\n }\r\n\r\n var obj = new app.component.Component(e, pc, this, subtype);\r\n obj.init();\r\n parent.components[group].push(obj);\r\n\r\n this.findAllComponents();\r\n\r\n $(document).trigger(\"component-init-complete\", obj);\r\n $(document).trigger(\"component-init-complete-\" + this.type, this);\r\n };\r\n myApp.Page.prototype.initPageAction = function (e, pc) {\r\n var parent = pc || this;\r\n var obj = new app.component.PageAction(e, pc, this);\r\n\r\n if (parent.componentActions[obj.type] === undefined) {\r\n parent.componentActions[obj.type] = [];\r\n }\r\n\r\n $(e).on(obj.event, $.proxy(obj.triggerAction, obj));\r\n\r\n //watch for enter keypress on component action text boxes. this will prevent submits\r\n $(e).on(\"keypress keydown\",\r\n function(e) {\r\n if (e.keyCode === 13 && $(event.target).is(\"input[type='text']\")) {\r\n e.preventDefault();\r\n return false;\r\n }\r\n });\r\n parent.componentActions[obj.type].push(obj);\r\n $(document).trigger(\"component-action-init-complete\", obj);\r\n this.log(obj.action + ' ' + obj.type + ' ' + obj.target + '(' + obj.event + ')' + obj.el.attr('name') + ' action bound.');\r\n };\r\n myApp.Page.prototype.initModals = function () {\r\n this.handleRemoveOkButton = function () {\r\n if (this.currentComponent) {\r\n if (typeof this.currentComponent.confirmRemove === 'function') this.currentComponent.confirmRemove();\r\n }\r\n };\r\n $(this.selectors.modals.confirmRemoveOkButton).on('click', $.proxy(this.handleRemoveOkButton, this));\r\n };\r\n myApp.Page.prototype.initBackToTopButton = function () {\r\n $(window).scroll(function () {\r\n if ($(\".back-to-top\").css('position') === 'fixed') {\r\n var mainTop = $('main').offset().top;\r\n if ($(this).scrollTop() > mainTop) {\r\n $('.back-to-top').fadeIn();\r\n } else {\r\n $('.back-to-top').fadeOut();\r\n }\r\n }\r\n });\r\n $(document).on('click', '.back-to-top', function () {\r\n $(this).fadeOut();\r\n });\r\n };\r\n myApp.Page.prototype.initToasts = function () {\r\n window.toastr.options = {\r\n \"closeButton\": true,\r\n \"debug\": false,\r\n \"newestOnTop\": false,\r\n \"progressBar\": true,\r\n \"positionClass\": 'toast-top-right',\r\n \"preventDuplicates\": false,\r\n \"onclick\": null,\r\n \"showDuration\": '300',\r\n \"hideDuration\": '1000',\r\n \"timeOut\": '5000',\r\n \"extendedTimeOut\": '1000',\r\n \"showEasing\": 'swing',\r\n \"hideEasing\": 'linear',\r\n \"showMethod\": 'fadeIn',\r\n \"hideMethod\": 'fadeOut'\r\n };\r\n };\r\n\r\n myApp.Page.prototype.bindCheckboxLists = function (el) {\r\n $('[type=\"checkbox\"][data-role~=\"selectall\"]', el).each(function () {\r\n $('[type=\"checkbox\"][name=\"' + $(this).attr('name') + '\"]').change(function () {\r\n if ($(this).attr('data-role') === 'selectall') {\r\n $('[type=\"checkbox\"][name=\"' + $(this).attr('name') + '\"]:visible').prop('checked', this.checked);\r\n\r\n } else {\r\n var selAll = $('[type=\"checkbox\"][data-role~=\"selectall\"][name=\"' + $(this).attr('name') + '\"]:visible');\r\n\r\n //check for all selected, or not all selected\r\n if (selAll.is(':checked')) {\r\n if (!this.checked) {\r\n selAll.prop('checked', this.checked);\r\n }\r\n } else {\r\n if ($('[type=\"checkbox\"][name=\"' + $(this).attr('name') + '\"]:not(:checked)').length === 1) {\r\n selAll.prop('checked', this.checked);\r\n }\r\n }\r\n }\r\n });\r\n });\r\n };\r\n\r\n myApp.Page.prototype.getElementValue = function (el, valueType) {\r\n switch (valueType) {\r\n case 'html':\r\n return el.html();\r\n case 'seltext':\r\n return $(':selected', el).text();\r\n case 'val':\r\n return el.val();\r\n default:\r\n return el.text();\r\n }\r\n };\r\n myApp.Page.prototype.getGuid = function () {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = Math.random() * 16 | 0;\r\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);\r\n });\r\n };\r\n myApp.Page.prototype.showDescriptiveError = function (message) {\r\n $(app.page.selectors.modals.descriptiveErrorMessage, app.page.selectors.modals.descriptiveError).html(message);\r\n $(app.page.selectors.modals.descriptiveError).foundation('open');\r\n };\r\n myApp.Page.prototype.handleJsonMessage = function (s) {\r\n if (s.errorMessage !== undefined) {\r\n app.page.showDescriptiveError(s.errorMessage);\r\n return true;\r\n }\r\n return false;\r\n };\r\n myApp.Page.prototype.handleAjaxError = function (xmlHttpRequest, textStatus, error) {\r\n if (xmlHttpRequest.status === 401 || xmlHttpRequest.status === 302) {\r\n window.location.replace(app.page.appPath + '/Account/Login?ReturnUrl=' + encodeURIComponent(window.location.pathname));\r\n } else if (textStatus !== 'abort' && xmlHttpRequest.readyState !== 0) {\r\n app.page.log(error);\r\n if (xmlHttpRequest.responseText !== '') {\r\n app.page.showDescriptiveError(xmlHttpRequest.responseText);\r\n } else {\r\n $(app.page.selectors.modals.loadError).foundation('open');\r\n }\r\n }\r\n };\r\n myApp.Page.prototype.mergeSort = function (arr, target) {\r\n if (arr.length < 2) return arr;\r\n\r\n var middle = parseInt(arr.length / 2);\r\n var left = arr.slice(0, middle);\r\n var right = arr.slice(middle, arr.length);\r\n\r\n return this.merge(this.mergeSort(left, target), this.mergeSort(right, target), target);\r\n };\r\n myApp.Page.prototype.merge = function (left, right, target) {\r\n var result = [];\r\n\r\n while (left.length && right.length) {\r\n //if (left[0] <= right[0]) {\r\n if ($('[data-label=\"' + target + '\"]', left[0]).text() <=\r\n $('[data-label=\"' + target + '\"]', right[0]).text()) {\r\n result.push(left.shift());\r\n } else {\r\n result.push(right.shift());\r\n }\r\n }\r\n\r\n this.log(\"left: \" + left.length + \" right: \" + right.length);\r\n\r\n while (left.length) result.push(left.shift());\r\n while (right.length) result.push(right.shift());\r\n\r\n return result;\r\n };\r\n myApp.Page.prototype.log = function (s) {\r\n if (this.isDebugMode) console.log(s);\r\n };\r\n myApp.Page.prototype.isJsonString = function (s) {\r\n try {\r\n JSON.parse(s);\r\n } catch (e) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n myApp.Page.prototype.isPrintableCharacter = function (s) {\r\n //REMOVED s===13 (enter) from printable characters BWH \r\n return s === 8 || (s > 47 && s < 58) || (s > 64 && s < 91) || (s > 95 && s < 112) || (s > 185 && s < 193) || (s > 218 && s < 223);\r\n };\r\n\r\n myApp.Page.prototype.findAllComponents = function () {\r\n this.allComponents = {};\r\n this.findComponents(this.components);\r\n };\r\n myApp.Page.prototype.findComponents = function (components) {\r\n for (var group in components) {\r\n if (this.allComponents[group] === undefined) {\r\n this.allComponents[group] = [];\r\n };\r\n $.merge(this.allComponents[group], components[group]);\r\n for (var key in components[group]) {\r\n this.findComponents(components[group][key].components);\r\n }\r\n }\r\n };\r\n\r\n return myApp;\r\n}());\r\n\r\napp.component = (function () {\r\n var myComponent = {\r\n Component: function (e, pc, page, subtype) {\r\n this.el = $(e);\r\n this.parentController = pc || {};\r\n this.page = page || app.page;\r\n this.subtype = subtype || this.el.closest('[data-component-subtype]').data('component-subtype');\r\n this.id = this.el.data('component-id') || 0;\r\n this.role = this.el.closest('[data-component-role]').data('component-role');\r\n this.type = this.el.closest('[data-component-type]').data('component-type');\r\n this.group = this.type + (this.el.closest('[data-component-group]').data('component-group') || \"\");\r\n this.state = this.el.data('component-state');\r\n this.request = null;\r\n this.isCloning = false;\r\n\r\n this.controller = this.el.closest('[data-component-controller]').data('component-controller');\r\n\r\n this.siblings = pc ? pc.components[this.group] || [] : [];\r\n\r\n this.selectors = {\r\n editComponent: '> .card > .component-edit > [data-component-role=\"EditComponent\"]',\r\n viewComponent: '> .card > .component-view > [data-component-role=\"ViewComponent\"]',\r\n buttons: {\r\n cancel: '> .card > .component-edit > .component-buttons [data-component-role=\"CancelButton\"]',\r\n clone: '> .card > .component-view > [data-component-role=\"CloneButton\"]',\r\n edit: '> .card > .component-view > .component-buttons > [data-component-role=\"EditButton\"]',\r\n remove: '> .card > .component-edit > .component-buttons [data-component-role=\"RemoveButton\"]',\r\n save: '> .card > .component-edit > .component-buttons [data-component-role=\"SaveButton\"]'\r\n },\r\n validationToken: 'input[name=\"__RequestVerificationToken\"]'\r\n };\r\n\r\n\r\n var controllerUrl = this.page.appPath + '/' + this.controller;\r\n\r\n this.urls = {\r\n view: controllerUrl + '/Show' + this.type,\r\n clone: controllerUrl + '/Show' + this.type + 'CloneForm',\r\n edit: controllerUrl + '/Show' + this.type + 'Form',\r\n save: controllerUrl + '/Update' + this.type,\r\n remove: controllerUrl + '/Remove' + this.type\r\n };\r\n\r\n this.components = {};\r\n this.componentActions = {};\r\n\r\n this.noResultsElement = (pc) ? pc.components[this.group + '-noResults'] || [] : [];\r\n this.viewComponent = '';\r\n this.editComponent = '';\r\n },\r\n PageAction: function (e, pc, page) {\r\n this.el = $(e);\r\n this.parentController = pc || {};\r\n this.page = page || app.page;\r\n this.action = this.el.closest('[data-component-action]').data('component-action');\r\n this.event = this.el.closest('[data-component-action-event]').data('component-action-event') || 'click';\r\n this.type = this.el.closest('[data-component-type]').data('component-type');\r\n this.target = this.el.closest('[data-component-action-target]').data('component-action-target');\r\n this.targetType = this.el.closest('[data-component-action-target-type]').data('component-action-target-type');\r\n this.subtype = this.el.closest('[data-component-subtype]').data('component-subtype');\r\n\r\n switch (this.action) {\r\n case \"filter\":\r\n this.filterField = this.el.closest('[data-component-action-field]').data('component-action-field');\r\n break;\r\n case \"setvalue\":\r\n this.value = this.el.closest('[data-component-action-value]').data('component-action-value');\r\n break;\r\n }\r\n }\r\n };\r\n\r\n //component events\r\n myComponent.Component.prototype.init = function () {\r\n if (this.siblings.length === 0 && this.noResultsElement !== undefined) {\r\n $(this.noResultsElement).slideUp();\r\n }\r\n\r\n if (this.state !== 'active') {\r\n this.startViewMode(true);\r\n } else {\r\n this.bindViewMode();\r\n this.finishLoad();\r\n }\r\n };\r\n myComponent.Component.prototype.finishLoad = function () {\r\n if (this.role === 'accordion') { /*f/b*/ window.Foundation.reInit($('.accordion')); }\r\n if (this.isEditing()) { this.startEditMode(); }\r\n this.page.log(this.type + ' component id ' + this.id + ' loaded.');\r\n };\r\n myComponent.Component.prototype.removeComponent = function () {\r\n var index = this.siblings.indexOf(this);\r\n if (this.siblings.length <= 1) {\r\n $(this.noResultsElement).slideDown();\r\n }\r\n\r\n this.siblings.splice(index, 1);\r\n if (this.role === 'accordion') {\r\n this.el.closest('li.accordion-item').remove();\r\n } else {\r\n this.el.remove();\r\n }\r\n };\r\n myComponent.Component.prototype.bindEditMode = function () {\r\n this.page.bindCheckboxLists(this.el);\r\n this.el.foundation();\r\n\r\n //handle enter keypress on a form\r\n $('form', this.el).on('keydown', $.proxy(function () {\r\n switch (event.keyCode) {\r\n case 13:\r\n // Stop default form submission on \"enter\" click in textbox\r\n if ($(event.target).is(\"input[type='text']\")) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n break;\r\n case 27:\r\n event.preventDefault();\r\n event.stopPropagation();\r\n //this.cancelEditMode();\r\n break;\r\n }\r\n }, this));\r\n\r\n $(document).trigger(\"component-bind-edit-mode-complete\", this);\r\n $(document).trigger(\"component-bind-edit-mode-complete-\" + this.type, this);\r\n\r\n this.bindSubComponents();\r\n };\r\n myComponent.Component.prototype.bindViewMode = function () {\r\n this.editComponent = $(this.selectors.editComponent, this.el);\r\n this.viewComponent = $(this.selectors.viewComponent, this.el);\r\n\r\n $(this.selectors.buttons.edit, this.el).on('click', $.proxy(this.startEditMode, this));\r\n $(this.selectors.buttons.clone, this.el).on('click', $.proxy(this.startCloneMode, this));\r\n $(this.selectors.buttons.cancel, this.el).on('click', $.proxy(this.cancelEditMode, this));\r\n $(this.selectors.buttons.save, this.el).on('click', $.proxy(this.saveEditMode, this));\r\n $(this.selectors.buttons.remove, this.el).on('click', $.proxy(this.startRemove, this));\r\n\r\n this.el.foundation();\r\n\r\n $(document).trigger(\"component-bind-view-mode-complete\", this);\r\n $(document).trigger(\"component-bind-view-mode-complete-\" + this.type, this);\r\n\r\n this.bindSubComponents();\r\n };\r\n myComponent.Component.prototype.bindSubComponents = function () {\r\n var controller = this;\r\n\r\n this.components = {};\r\n $(this.page.selectors.components, this.el).not($(this.page.selectors.components + ' ' + this.page.selectors.components, this.el)).each(function () { controller.page.initComponent(this, controller); });\r\n $(this.page.selectors.componentActions, this.el).not($(this.page.selectors.components + ' ' + this.page.selectors.componentActions, this.el)).each(function () { controller.page.initPageAction(this, controller); });\r\n };\r\n myComponent.Component.prototype.startLoading = function () {\r\n this.el.addClass('component-loading');\r\n $(document).trigger(\"component-loading-start\", this);\r\n };\r\n myComponent.Component.prototype.endLoading = function () {\r\n this.el.removeClass('component-loading');\r\n $(document).trigger(\"component-loading-complete\", this);\r\n };\r\n myComponent.Component.prototype.startViewMode = function (isInit, filterCriteria) {\r\n this.startLoading();\r\n var data;\r\n\r\n if (filterCriteria) {\r\n data = filterCriteria;\r\n } else {\r\n data = { id: this.id, controllerId: this.parentController.id, subtype: this.subtype };\r\n }\r\n\r\n if (this.request != null) {\r\n this.request.abort();\r\n this.request = null;\r\n }\r\n\r\n this.request = $.ajax({ url: this.urls.view, data: data, context: this, error: this.page.handleAjaxError }).done(function (data) {\r\n this.el.html(data);\r\n this.endLoading();\r\n this.bindViewMode();\r\n if (isInit) {\r\n this.finishLoad();\r\n }\r\n });\r\n };\r\n myComponent.Component.prototype.startCloneMode = function () {\r\n this.isCloning = true;\r\n this.startEditMode();\r\n };\r\n myComponent.Component.prototype.startEditMode = function () {\r\n this.startLoading();\r\n\r\n $.ajax({ url: this.urls.edit, data: { id: this.id, controllerId: this.parentController.id, subtype: this.subtype }, context: this, error: this.page.handleAjaxError }).done(function (data) {\r\n this.editComponent.html(data);\r\n\r\n if (this.isCloning) {\r\n $('[name=\"Id\"]', this.editComponent).val(0);\r\n }\r\n this.el.foundation();\r\n this.el.addClass('edit');\r\n this.endLoading();\r\n this.bindEditMode();\r\n });\r\n };\r\n myComponent.Component.prototype.cancelEditMode = function () {\r\n if (this.isCloning) { this.isCloning = false; }\r\n\r\n if (this.id === 0) {\r\n this.removeComponent();\r\n } else {\r\n this.el.removeClass('edit');\r\n }\r\n\r\n $(document).trigger(\"component-edit-cancel\", this);\r\n $(document).trigger(\"component-edit-cancel-\" + this.type, this);\r\n };\r\n myComponent.Component.prototype.saveEditMode = function () {\r\n var form = $('form:not(.component-exclude)', this.editComponent);\r\n $.validator.unobtrusive.parse(form);\r\n\r\n console.log(form.valid());\r\n if (form.valid()) {\r\n var componentTop = this.editComponent.offset().top - 50;\r\n //if the top of the component is off of the page, jump to it\r\n if ($(document).scrollTop() > componentTop)\r\n $('html, body').scrollTop(componentTop);\r\n this.startLoading();\r\n $.ajax({ url: this.urls.save, method: 'post', data: form.serialize(), context: this, error: this.page.handleAjaxError }).done(function (data) {\r\n this.endLoading();\r\n\r\n if (data) {\r\n //check if result is json, if so we have an issue\r\n if (this.page.isJsonString(data)) {\r\n this.page.handleJsonMessage($.parseJSON(data));\r\n } else {\r\n //it worked, replace the current view partial.\r\n this.viewComponent.html(data);\r\n if (this.id === 0 || this.isCloning) {\r\n this.id = parseInt($('[name=\"Id\"]', this.viewComponent).val());\r\n if (this.isCloning) { this.isCloning = false; }\r\n //this.bindViewMode();\r\n }\r\n\r\n this.bindSubComponents();\r\n $(document).trigger(\"component-save-complete\", this);\r\n $(document).trigger(\"component-save-complete-\" + this.type, this);\r\n this.cancelEditMode();\r\n }\r\n } else {\r\n $(app.page.selectors.modals.saveError).foundation('open');\r\n }\r\n });\r\n }\r\n else {\r\n //Give focus to the first error\r\n var firstError = $('#' + $('.field-validation-error', form).data('valmsg-for'));\r\n if (firstError.length) {\r\n $('html, body').animate({\r\n scrollTop: firstError.offset().top - 50\r\n }, 500);\r\n }\r\n }\r\n };\r\n myComponent.Component.prototype.startRemove = function () {\r\n if (this.id === 0) {\r\n this.removeComponent();\r\n } else {\r\n if (this.urls.remove !== undefined && this.urls.remove !== '') {\r\n app.page.currentComponent = this;\r\n $(app.page.selectors.modals.removeConfirm).foundation('open');\r\n }\r\n }\r\n };\r\n myComponent.Component.prototype.confirmRemove = function () {\r\n if (this.urls.remove !== undefined && this.urls.remove !== '') {\r\n this.el.removeClass('edit');\r\n this.startLoading();\r\n\r\n $.ajax({ url: this.urls.remove, method: 'post', data: { id: this.id, controllerId: this.parentController.id, __RequestVerificationToken: $(this.selectors.validationToken, this.editComponent).val() }, context: this, error: this.page.handleAjaxError }).done(function (data) {\r\n if (data) {\r\n if (this.page.isJsonString(data)) {\r\n if (this.page.handleJsonMessage($.parseJSON(data))) {\r\n this.el.addClass('edit');\r\n this.endLoading();\r\n } else {\r\n this.removeComponent();\r\n $(document).trigger(\"component-remove-complete\", this);\r\n $(document).trigger(\"component-remove-complete-\" + this.type, this);\r\n }\r\n }\r\n } else {\r\n this.el.addClass('edit');\r\n this.endLoading();\r\n $('#saveErrorModal').foundation('open');\r\n }\r\n });\r\n }\r\n };\r\n\r\n //component derived properties\r\n myComponent.Component.prototype.isEditing = function () {\r\n return this.el.hasClass('edit');\r\n };\r\n myComponent.PageAction.prototype.triggerAction = function (e) {\r\n this.page.log('component action ' + this.action + ' for ' + this.target + ' triggered.');\r\n\r\n switch (this.action) {\r\n case \"add\":\r\n this.pageComponentActionAdd(this.el, this.parentController, this.target);\r\n break;\r\n case \"filter\":\r\n this.pageComponentActionFilter(this.el, this.target);\r\n break;\r\n case \"filterserver\":\r\n this.pageComponentActionFilterServer(this.el, this.target, e);\r\n break;\r\n case \"refresh\":\r\n this.pageComponentActionRefresh(this.el, this.target);\r\n break;\r\n case \"setoptions\":\r\n this.pageComponentActionUpdateSetOptions(this.el, this.target);\r\n break;\r\n case \"setvalue\":\r\n this.pageComponentActionUpdateSetValue(this.el, this.target);\r\n break;\r\n case \"setvisibility\":\r\n this.pageComponentActionUpdateSetVisibility(this.el, this.target);\r\n break;\r\n case \"updateid\":\r\n this.pageComponentActionUpdateId(this.el, this.target);\r\n break;\r\n case \"updatesubtype\":\r\n this.pageComponentActionUpdateSubtype(this.el, this.target);\r\n break;\r\n }\r\n\r\n this.postAction();\r\n };\r\n myComponent.PageAction.prototype.postAction = function () { };\r\n myComponent.PageAction.prototype.pageComponentActionAdd = function (el, pc, t) {\r\n var target = $('[data-role~=\"component-action-target\"][data-component-target=\"' + t + '\"]', pc.el);\r\n var componentWrapper;\r\n\r\n if (el.data('component-template') && $('[data-role~=\"component-template\"][data-template-name=\"' + el.data('component-template') + '\"]')) {\r\n componentWrapper = $('[data-role~=\"component-template\"][data-template-name=\"' + el.data('component-template') + '\"]').html();\r\n } else {\r\n var wrapperType = el.data('component-wrapper-type') ? el.data('component-wrapper-type') : 'div';\r\n componentWrapper = '<' + wrapperType + ' class=\"edit ' + (el.data('component-wrapper-class') ? el.data('component-wrapper-class') : \"\") + '\" data-role=\"component\" data-component-id=\"0\">';\r\n }\r\n\r\n if (el.data('parent-id')) {\r\n pc.id = el.data('parent-id');\r\n }\r\n var newComponentSelector;\r\n switch (target.data('component-insert-type')) {\r\n case 'append':\r\n target.append(componentWrapper);\r\n newComponentSelector = $('[data-role~=\"component\"]:last', target);\r\n break;\r\n case 'sibling-append':\r\n target.after(componentWrapper);\r\n newComponentSelector = target.next();\r\n break;\r\n case 'sibling-prepend':\r\n target.before(componentWrapper);\r\n newComponentSelector = target.prev();\r\n break;\r\n default:\r\n target.prepend(componentWrapper);\r\n newComponentSelector = $('[data-role~=\"component\"]:first', target);\r\n break;\r\n }\r\n\r\n this.subtype = this.el.closest('[data-component-subtype]').data('component-subtype');\r\n\r\n this.page.initComponent(newComponentSelector, pc, this.subtype);\r\n $(document).trigger(\"component-add-complete\", newComponentSelector);\r\n $(componentWrapper).foundation();\r\n };\r\n myComponent.PageAction.prototype.pageComponentActionFilter = function (el, t) {\r\n\r\n var context = $('[data-role~=\"component-action-target\"][data-component-target~=\"' + this.target + '\"]');\r\n var rows = $('[data-role~=\"component\"]', context);\r\n var form = $('form[data-role=\"filter-server-form\"][data-component-action-target-type~=\"' + this.targetType + '\"]');\r\n rows.show();\r\n\r\n $(':input', form).each(function (i, e) {\r\n var el = $(e);\r\n if (el.val() !== '') {\r\n var field;\r\n\r\n if (el.data('target')) {\r\n field = '[data-label=\"' + el.data('target') + '\"]';\r\n }\r\n else {\r\n field = '[data-label]';\r\n }\r\n\r\n var values = el.val().toUpperCase().split(/\\s+/);\r\n rows.each(function (i, e) {\r\n var hide = false;\r\n\r\n $.each(values, function (index, v) {\r\n if ($(field + ':icontains(\"' + v + '\")', e).length < 1) {\r\n hide = true;\r\n return;\r\n }\r\n });\r\n if (hide) {\r\n $(e).hide();\r\n }\r\n });\r\n }\r\n });\r\n\r\n };\r\n myComponent.PageAction.prototype.pageComponentActionFilterServer = function (el, t,e) {\r\n\r\n if (e === undefined || e.type !== \"keyup\" || app.page.isPrintableCharacter(e.keyCode)) {\r\n //if keyup, add a delay\r\n var delay = 300;\r\n if (e !== undefined && e.type !== \"keyup\") {\r\n delay = 0;\r\n }\r\n\r\n if (this.timeout !== null) { clearTimeout(this.timeout); }\r\n var that = this;\r\n this.timeout = setTimeout(function () {\r\n\r\n var form = $('form[data-role=\"filter-server-form\"][data-component-action-target-type=\"' + that.targetType + '\"]');\r\n\r\n var dataRoles = el.data('role');\r\n if (dataRoles.indexOf('page-size') !== -1) {\r\n\r\n //append to form\r\n if (form.find('[name=\"pageSize\"]').length) {\r\n form.find('[name=\"pageSize\"]').val(el.val());\r\n } else {\r\n //add to form\r\n $('').attr({\r\n type: 'hidden',\r\n id: 'pageSize',\r\n name: 'pageSize',\r\n value: el.val()\r\n }).appendTo(form);\r\n }\r\n }\r\n\r\n var filters = form.serializeArray();\r\n\r\n if (el.data('pageValue')) {\r\n filters.push({ name: \"pageNumber\", value: el.data('pageValue') });\r\n }\r\n\r\n var target = that.page.components[that.targetType][0];\r\n target.startViewMode(false, $.param(filters));\r\n\r\n }, delay,el, that);\r\n }\r\n };\r\n myComponent.PageAction.prototype.pageComponentActionRefresh = function (el, t) {\r\n var target = this.page.components[t][0];\r\n if (target) {\r\n target.startViewMode();\r\n }\r\n };\r\n myComponent.PageAction.prototype.pageComponentActionUpdateId = function (el, t) {\r\n var target = this.page.components[t][0];\r\n var val;\r\n if (el.data('component-action-updateid-value')) {\r\n val = el.data('component-action-updateid-value');\r\n } else {\r\n val = el.val();\r\n }\r\n if (val.length > 0) {\r\n target.id = val;\r\n target.startViewMode();\r\n }\r\n };\r\n myComponent.PageAction.prototype.pageComponentActionUpdateSubtype = function (el, t) {\r\n var target = $('[data-role~=\"component-action-target\"][data-component-target=\"' + t + '\"]');\r\n target.data('component-subtype', el.val());\r\n };\r\n myComponent.PageAction.prototype.pageComponentActionUpdateSetOptions = function (el, t, e) {\r\n var targets = $('[data-component-target=\"' + t + '\"]');\r\n var values = $('input:checked', el);\r\n targets.each(function (i, e) {\r\n var targetField = $(e).data('component-action-setoptions-field');\r\n \r\n switch ($(e).data('component-action-setoptions-type')) {\r\n case \"showequal\":\r\n //remove all options\r\n if (values.length === 0 || values[0].value === '0') {\r\n $('.select-many-checkbox', e).show();\r\n } else {\r\n $('.select-many-checkbox', e).hide();\r\n $('.select-many-checkbox', e).prop('checked', false).trigger(\"change\");\r\n\r\n values.each(function (i2, e2) {\r\n var value = $(e2).val();\r\n //re add for thisv value\r\n $('.select-many-checkbox', e).each(function () {\r\n if ($('input', this).attr(targetField) === value) {\r\n $(this).show();\r\n }\r\n });\r\n });\r\n }\r\n break;\r\n }\r\n });\r\n };\r\n myComponent.PageAction.prototype.pageComponentActionUpdateSetValue = function (el, t) {\r\n var target = $(t);\r\n target.val($(el).data(\"component-action-value\"));\r\n };\r\n myComponent.PageAction.prototype.pageComponentActionUpdateSetVisibility = function(el, t) {\r\n var targets = $('[data-component-target=\"' + t + '\"]');\r\n var val = el.val();\r\n targets.each(function(i, e) {\r\n switch($(e).data('component-action-setvisibility-type')) {\r\n case \"showequal\":\r\n if (val === $(e).data('component-action-setvisibility-value').toString()) {\r\n $(e).slideDown();\r\n } else {\r\n $(e).slideUp();\r\n }\r\n break;\r\n }\r\n });\r\n };\r\n\r\n return myComponent;\r\n}());\r\n\r\n$(function () {\r\n app.page = new app.Page(window.applicationPath);\r\n $(document).trigger('page-init-complete');\r\n});","//*************************************************************************************\r\n//* Session specific code\r\n//*\r\n//* 6/13/18 Kraus [COM-136]: Created\r\n//*************************************************************************************\r\n\r\napp.ActivityLog = (function () {\r\n var options = [];\r\n var myActivityLog = {\r\n Init: function (gridId) {\r\n $(\"#divActivityLog\").on('click', \".fa-chevron-down\", function () {\r\n $(this).parent().next().slideDown(500);\r\n app.ActivityLog.GetActivityLogResults();\r\n $(this).parent().attr('title', 'Hide Activity Log');\r\n $(this).removeClass(\"fa-chevron-down\");\r\n $(this).addClass(\"fa-chevron-up\");\r\n });\r\n\r\n $(\"#divActivityLog\").on('click', \".fa-chevron-up\", function () {\r\n $(this).parent().next().slideUp(500);\r\n $(this).parent().attr('title', 'Show Activity Log');\r\n $(this).removeClass(\"fa-chevron-up\");\r\n $(this).addClass(\"fa-chevron-down\");\r\n });\r\n\r\n\r\n $(\"#grdActivityLog\").kendoGrid({\r\n columns: [\r\n {\r\n field: \"Id\",\r\n hidden: true\r\n },\r\n {\r\n field: \"Message\",\r\n title: \"Message\",\r\n width: \"100px\"\r\n },\r\n {\r\n field: \"UserName\",\r\n title: \"User Name\",\r\n width: \"75px\"\r\n },\r\n {\r\n field: \"Timestamp\",\r\n title: \"Timestamp\",\r\n width: \"100px\"\r\n },\r\n {\r\n field: \"Before\",\r\n title: \"Before\",\r\n encoded: false,\r\n width: \"400px\"\r\n },\r\n {\r\n field: \"After\",\r\n title: \"After\",\r\n encoded: false,\r\n width: \"400px\"\r\n }\r\n ],\r\n toolbar: [\"excel\"],\r\n excel: {\r\n allpages: true,\r\n fileName: $(\"#grdActivityLog\").data(\"file-name\")\r\n },\r\n scrollable: false,\r\n resizable: true,\r\n sortable: true,\r\n columnMenu: true,\r\n groupable: {\r\n messages: {\r\n empty: \"Drop columns here to group by\"\r\n }\r\n }\r\n });\r\n app.KendoGrids.InitPersistentGrid(\"grdActivityLog\", false);\r\n },\r\n GetActivityLogResults: function () {\r\n if ($(\"#grdActivityLog\").css('display') == 'none' || $(\"#grdActivityLog\").css(\"visibility\") == \"hidden\") {\r\n return;\r\n }\r\n app.KendoGrids.GetResults(\"grdActivityLog\");\r\n\r\n //kendo.ui.progress($('#grdActivityLog'), true);\r\n //$.ajax({\r\n // type: 'POST',\r\n // dataType: 'json',\r\n // url: $('#grdActivityLog').data('url'),\r\n // data: JSON.stringify({\r\n // 'logs': $('#grdActivityLog').data('logs'),\r\n // }),\r\n // contentType: \"application/json; charset=utf-8\",\r\n // success: function (results) {\r\n // var dataSource = new kendo.data.DataSource({ data: results });\r\n // var grid = $('#grdActivityLog').data(\"kendoGrid\");\r\n // grid.setDataSource(dataSource);\r\n // kendo.ui.progress($('#grdActivityLog'), false);\r\n // },\r\n // error: function (results) {\r\n // kendo.ui.progress($('#grdActivityLog'), false);\r\n // }\r\n //});\r\n }\r\n };\r\n return myActivityLog;\r\n}());\r\n","//*************************************************************************************\r\n//* Session specific code\r\n//*\r\n//* 6/13/18 Kraus [COM-136]: Created\r\n//*************************************************************************************\r\n\r\napp.Committee = (function () {\r\n var myCommittee = {\r\n Index: function () {\r\n $(\"#committee-grid\").kendoGrid(\r\n {\r\n columns: [\r\n {\r\n field: \"CommitteeId\",\r\n hidden: true\r\n },\r\n {\r\n field: \"Name\",\r\n title: \"Title\",\r\n width: \"200px\"\r\n },\r\n {\r\n field: \"CommitteeType\",\r\n title: \"Committee Type\",\r\n //width: \"150px\"\r\n },\r\n {\r\n field: \"HrType\",\r\n title: \"HR Type\",\r\n //width: \"150px\"\r\n },\r\n {\r\n field: \"hasVacancies\",\r\n title: \"Vacancies\",\r\n //width: \"60px\"\r\n },\r\n {\r\n field: \"Members\",\r\n title: \"Seat Count\",\r\n //width: \"75px\"\r\n },\r\n {\r\n template: \"Details\"\r\n }],\r\n toolbar: [\"excel\"],\r\n excel: {\r\n fileName: \"AllCommittees\" + app.Committee.ConvertDate(new Date()) + \".xlsx\"\r\n },\r\n scrollable: false,\r\n sortable: true,\r\n columnMenu: true,\r\n groupable: {\r\n messages: {\r\n empty: \"Drop columns here to group by\"\r\n }\r\n }\r\n });\r\n\r\n app.KendoGrids.InitPersistentGrid(\"committee-grid\", true);\r\n //$(document).ready(function () {\r\n // $(\"#txtCommitteeSeatExpectedStartDate\").on('change', function () {\r\n // var startDate = new Date($(\"#txtCommitteeSeatExpectedStartDate\").val());\r\n // var defaultTermLength = parseInt($(\"#hdnDefaultTerm\").val());\r\n // var endDate = new Date(startDate.setYear(startDate.getFullYear() + defaultTermLength));\r\n // endDate.setDate(endDate.getDate() - 1);\r\n // $(\"#txtCommitteeSeatExpectedEndDate\").val(endDate.toLocaleDateString());\r\n // });\r\n //});\r\n },\r\n Details: function () {\r\n app.Prospective.Init(\"gridProspectiveMember\");\r\n app.Committee.InitCommitteeSeatEdit();\r\n app.Committee.InitFileTypeCopy();\r\n app.Committee.InitAutoDateUpdate();\r\n \r\n $(document).on('click', \"[data-role='add-committee-seat']\",\r\n function (e) {\r\n app.Committee.EditCommitteeSeatDetails(e);\r\n });\r\n $(document).on('click', \"[data-role='update-committee-seat']\",\r\n function () {\r\n app.Committee.UpdateCommitteeSeat(this, $(this).data('post-url'));\r\n });\r\n $(document).on('click', \"[data-role='toggle-private-documents']\",\r\n function () {\r\n var componentTypeTarget = $(this).data('component-target');\r\n var publicDocs = $('[data-role=\"file-upload-view\"][data-is-private=\"False\"]', $('[data-component-type=\"' + componentTypeTarget + '\"]'));\r\n\r\n if ($(this).html().toLowerCase().indexOf(\"only\") > 0) {\r\n //hide docs\r\n publicDocs.closest(\".card\").hide();\r\n $(this).html('Show all Documents');\r\n }\r\n else {\r\n publicDocs.closest(\".card\").show();\r\n $(this).html('Show Only Private Documents');\r\n }\r\n });\r\n\r\n var isAdmin = $(\"#gridSeatHistory\").data('is-admin') == 'True';\r\n var gridColumns = [{\r\n field: \"Chair\",\r\n title: \"Chair\"\r\n },\r\n {\r\n field: \"Title\",\r\n title: \"Title\",\r\n hidden: true\r\n },\r\n {\r\n field: \"DepartmentName\",\r\n title: \"Department Name\"\r\n },\r\n {\r\n field: \"Division\",\r\n title: \"Division\",\r\n hidden: true\r\n },\r\n {\r\n field: \"Department\",\r\n title: \"Department\",\r\n hidden: true\r\n },\r\n {\r\n field: \"Subdepartment\",\r\n title: \"Subdepartment\",\r\n hidden: true\r\n },\r\n {\r\n field: \"SeatType\",\r\n title: \"Seat Type\"\r\n },\r\n {\r\n field: \"FillCommitteeSeatType\",\r\n title: \"Fill Type\",\r\n hidden: true\r\n },\r\n {\r\n field: \"FillAuthorityCommitteeSeatType\",\r\n title: \"Fill Authority\",\r\n hidden: true\r\n },\r\n {\r\n field: \"FacultyDivision\",\r\n title: \"Faculty Division\",\r\n hidden: true\r\n },\r\n {\r\n field: \"District\",\r\n title: \"District\",\r\n hidden: true\r\n }];\r\n\r\n\r\n if (isAdmin) {\r\n gridColumns.splice(0, 0,\r\n {\r\n field: \"SeatMemberId\",\r\n title: \"Seat Member Id\",\r\n hidden: true\r\n\r\n },\r\n {\r\n field: \"FirstName\",\r\n title: \"First Name\",\r\n template: \"# if(UserAddress != ''){##:FirstName##}else{#
#:FirstName#
#}#\"\r\n\r\n },\r\n {\r\n field: \"LastName\",\r\n title: \"Last Name\",\r\n template: \"# if(UserAddress != ''){##:LastName##}else{#
#:LastName#
#}#\"\r\n\r\n });\r\n }\r\n else {\r\n gridColumns.splice(0, 0,\r\n {\r\n field: \"FirstName\",\r\n title: \"First Name\"\r\n },\r\n {\r\n field: \"LastName\",\r\n title: \"Last Name\"\r\n });\r\n }\r\n\r\n\r\n if (isAdmin) {\r\n gridColumns.push({\r\n field: \"AdminNotes\",\r\n title: \"Admin Notes\"\r\n });\r\n gridColumns.push({\r\n field: \"SeatNumber\",\r\n title: \"Seat Number\",\r\n type: \"number\"\r\n });\r\n }\r\n gridColumns.splice(gridColumns.length, 0,\r\n {\r\n field: \"ExpectedStart\",\r\n title: \"Exp. Start\",\r\n format: \"{0:M/d/yyyy}\",\r\n hidden: true\r\n },\r\n {\r\n field: \"ActualStart\",\r\n title: \"Act. Start\",\r\n format: \"{0:M/d/yyyy}\"\r\n },\r\n {\r\n field: \"ExpectedEnd\",\r\n title: \"Exp. End\",\r\n format: \"{0:M/d/yyyy}\"\r\n },\r\n {\r\n field: \"ActualEnd\",\r\n title: \"Act. End\",\r\n format: \"{0:M/d/yyyy}\",\r\n hidden: true\r\n });\r\n\r\n if (isAdmin) {\r\n gridColumns.push({\r\n template: \"Details\"\r\n });\r\n }\r\n\r\n $(\"#gridSeatHistory\").kendoGrid(\r\n {\r\n dataSource: {\r\n schema: {\r\n model: {\r\n fields: {\r\n District: { type: \"number\" },\r\n SeatNumber: { type: \"number\" },\r\n ActualEnd: { type: \"date\" },\r\n ExpectedEnd: { type: \"date\" },\r\n ExpectedStart: { type: \"date\" },\r\n ActualStart: { type: \"date\" }\r\n }\r\n }\r\n }\r\n },\r\n filterable: {\r\n\r\n extra: false,\r\n operators: {\r\n string: {\r\n startswith: \"Starts with\",\r\n eq: \"Is equal to\",\r\n neq: \"Is not equal to\"\r\n }\r\n }\r\n },\r\n toolbar: [\"excel\"],\r\n excel: {\r\n fileName: \"\"\r\n },\r\n columns: gridColumns,\r\n noRecords: true,\r\n scrollable: false,\r\n sortable: true,\r\n columnMenu: true,\r\n });\r\n app.KendoGrids.InitPersistentGrid(\"gridSeatHistory\", true);\r\n },\r\n SeatHistoryFileName: function () {\r\n return $('[data-role-name=\"committee-date\"]').val().replace(/\\//g, \"-\") + \".xlsx\";\r\n },\r\n SeatDetails: function () {\r\n app.Committee.InitCommitteeSeatEdit();\r\n $(document).on('component-bind-edit-mode-complete',\r\n function (e) {\r\n app.Committee.ToggleSeatOption($(\"[data-role='committee-seat-type']\"));\r\n });\r\n app.Committee.InitAutoDateUpdate();\r\n $(document).on(\"component-remove-complete-CommitteeSeat\", function (e, component) {\r\n window.location.replace(\"/Committee/Details/\" + app.page.committeeId);\r\n });\r\n $(document).on('click', \"[data-role='update-seat-members']\",\r\n function () {\r\n app.Committee.UpdateSeatMember(this, $(this).data('post-url'));\r\n });\r\n $(document).on('click', \"[data-role='remove-seat-members']\",\r\n function () {\r\n app.Committee.RemoveSeatMember(this, $(this).data('post-url'));\r\n });\r\n $(document).on(\"component-remove-complete-SeatMember\", function (e, component) {\r\n window.location.replace(\"/Committee/SeatDetails/\" + app.page.committeeId + \"/\" + app.page.id);\r\n });\r\n\r\n $(document).on('click', \"[data-role='add-seat-members']\",\r\n function (e) {\r\n app.Committee.EditSeatMemberDetails(e);\r\n });\r\n app.Committee.InitSeatMemberHistory();\r\n $(document).on('component-save-complete-SeatMember', function () {\r\n app.KendoGrids.GetResults(\"gridSeatMemberHistory\");\r\n });\r\n $(document).on('change', '[data-role=\"is-successor\"]', function () {\r\n //toggle successor form based on checkbox\r\n if ($(this).prop('checked')) {\r\n $(this).closest('form').find('[data-role=\"successor-form\"]').show(200);\r\n }\r\n else {\r\n $(this).closest('form').find('[data-role=\"successor-form\"]').hide();\r\n $(this).closest('form').find('[data-role=\"successor-form\"]').find('input, select')\r\n .not('button, submit, reset, hidden, [type=\"button\"]')\r\n .val('')\r\n .removeAttr('checked')\r\n .removeAttr('selected');\r\n }\r\n });\r\n app.Committee.InitSeatMemberFlags();\r\n $(document).on(\"component-save-complete-SeatMember\", function (e, component) {\r\n //refresh page if the new component id is -1\r\n if (component.id == -1) {\r\n window.location.replace(\"/Committee/SeatDetails/\" + app.page.committeeId + \"/\" + app.page.id);\r\n }\r\n });\r\n },\r\n InitCommitteeSeatEdit: function () {\r\n $(document).on('change', \"[data-role='committee-seat-type']\",\r\n function (e) {\r\n app.Committee.ToggleSeatOption(this);\r\n });\r\n },\r\n InitFileTypeCopy: function () {\r\n $(document).on('change', \"[data-role='file-type']\",\r\n function (e) {\r\n $(this).closest('form').find(\"[data-role='file-display-name']\").val($(this).children(\"option:selected\").text());\r\n });\r\n },\r\n InitAutoDateUpdate: function () {\r\n $(document).on('change', \"[data-default-term-length-start]\", function () {\r\n var autoTermUpdateWrapper = $(this).closest('[data-role=\"auto-term-update\"]');\r\n var startDate = new Date($(this).val());\r\n $(\"[name*=Start]\", autoTermUpdateWrapper).val(startDate.toLocaleDateString());\r\n var defaultTermLength = parseInt($(autoTermUpdateWrapper).data(\"default-term-length\"));\r\n var endDate = new Date(startDate.setYear(startDate.getFullYear() + defaultTermLength));\r\n endDate.setDate(endDate.getDate() - 1);\r\n $(\"[name*=End]\", autoTermUpdateWrapper).val(endDate.toLocaleDateString());\r\n });\r\n },\r\n ToggleSeatOption: function (ddl) {\r\n var numberRequired = $(\"option:selected\", ddl).data(\"number-required\");\r\n var divisionRequired = $(\"option:selected\", ddl).data(\"division-required\");\r\n if (numberRequired == 'False') {\r\n $('[data-role=\"seat-number\"]').hide();\r\n $('[data-role=\"seat-number\"]').find('select').val('');\r\n }\r\n else if (numberRequired == 'True') {\r\n $('[data-role=\"seat-number\"]').slideDown(200);\r\n }\r\n\r\n if (divisionRequired != 'True') {\r\n $('[data-role=\"faculty-division\"]').hide();\r\n $('[data-role=\"faculty-division\"]').find('select').val('');\r\n }\r\n else if (divisionRequired == 'True') {\r\n $('[data-role=\"faculty-division\"]').slideDown(200);\r\n }\r\n },\r\n Sorting: function (arg) {\r\n console.log(\"The group to be expanded: \" + kendo.stringify(arg.sort.field));\r\n },\r\n EditSeatMemberDetails: function (e) {\r\n e.preventDefault();\r\n\r\n $('[data-role=\"edit-seat-member-wrapper\"]').html('');\r\n $('[data-role=\"edit-seat-member-wrapper\"]').addClass('popup-loading');\r\n $('#editSeatMemberModal').foundation('open');\r\n var SeatMemberId = $(e.currentTarget).closest(\"tr\").find('td:hidden').first().text();\r\n\r\n if (SeatMemberId === \"\") {\r\n SeatMemberId = \"0\";\r\n }\r\n\r\n $.ajax({\r\n type: 'POST',\r\n dataType: 'html',\r\n url: $(\"#gridSeatMemberHistory\").data(\"post-url\"),\r\n data: JSON.stringify({\r\n 'Id': SeatMemberId,\r\n 'CommitteeSeatId': app.page.id\r\n }),\r\n contentType: \"application/json; charset=utf-8\",\r\n success: function (partialViewResult) {\r\n $('[data-role=\"edit-seat-member-wrapper\"]').html(partialViewResult);\r\n app.input.initDatePicker($('[data-role=\"edit-seat-member-wrapper\"]'));\r\n $('[data-role=\"edit-seat-member-wrapper\"]').removeClass('popup-loading');\r\n },\r\n error: function (jqXHR, textStatus, errorThrown) {\r\n toastr.error('Error loading seat member details.', 'Error');\r\n console.log('Error: ' + jqXHR + \", textStatus: \" + textStatus + \", errorThrown: \" + errorThrown);\r\n console.log(JSON.stringify(jqXHR));\r\n $('#editSeatMemberModal').foundation('close');\r\n }\r\n });\r\n },\r\n RemoveSeatMember: function (button, url) {\r\n if (confirm(\"Are you sure you want to delete this Seat Member?\")) {\r\n var SeatMemberId = $(button).closest('.reveal').find('form').find('[data-role=\"seat-member-id\"]').val();\r\n\r\n if (SeatMemberId === \"\") {\r\n SeatMemberId = \"0\";\r\n }\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: url,\r\n data: JSON.stringify({\r\n 'Id': SeatMemberId,\r\n 'controllerId': app.page.id\r\n }),\r\n contentType: \"application/json; charset=utf-8\",\r\n success: function (partialViewResult) {\r\n $('#editSeatMemberModal').foundation('close');\r\n app.KendoGrids.GetResults(\"gridSeatMemberHistory\");\r\n },\r\n error: function (jqXHR, textStatus, errorThrown) {\r\n toastr.error('Error loading seat member details.', 'Error');\r\n console.log('Error: ' + jqXHR + \", textStatus: \" + textStatus + \", errorThrown: \" + errorThrown);\r\n console.log(JSON.stringify(jqXHR));\r\n }\r\n });\r\n }\r\n },\r\n UpdateSeatMember: function (button, url) {\r\n var form = $(button).closest('.reveal').find('form');\r\n $.validator.unobtrusive.parse(form);\r\n\r\n console.log(form.valid());\r\n if (form.valid()) {\r\n\r\n $.ajax({\r\n url: url,\r\n type: 'POST',\r\n data: form.serialize() + \"&netid=\" + $(button).closest('form').find('[data-role=\"netid\"]').val(),\r\n async: false,\r\n success: function (partialViewResult) {\r\n toastr.success('Seat Member was saved successfully!', 'Save Successful');\r\n //getActivityLogResults();\r\n\r\n //update the grid to reflect an changes\r\n app.KendoGrids.GetResults(\"gridSeatMemberHistory\");\r\n\r\n //close the popup.\r\n $('#editSeatMemberModal').foundation('close');\r\n },\r\n error: function (result) {\r\n toastr.error('There was an error while saving the seat member.', 'Error');\r\n }\r\n });\r\n }\r\n else {\r\n //Give focus to the first error\r\n var firstError = $('#' + $('.field-validation-error', form).data('valmsg-for'));\r\n if (firstError.length) {\r\n $('html, body').animate({\r\n scrollTop: firstError.offset().top - 50\r\n }, 500);\r\n }\r\n }\r\n },\r\n InitSeatMemberHistory: function () {\r\n var isAdmin = $(\"#gridSeatMemberHistory\").data('is-admin') == 'True';\r\n $(\"#gridSeatMemberHistory\").kendoGrid({\r\n filterable: {\r\n extra: false,\r\n operators: {\r\n string: {\r\n startswith: \"Starts with\",\r\n eq: \"Is equal to\",\r\n neq: \"Is not equal to\"\r\n }\r\n }\r\n },\r\n toolbar: [\"excel\"],\r\n excel: {\r\n fileName: \"\"\r\n },\r\n columns: [\r\n {\r\n field: \"SeatMemberId\",\r\n title: \"Seat Member Id\",\r\n hidden: true\r\n },\r\n {\r\n field: \"FirstName\",\r\n title: \"First Name\",\r\n template: isAdmin ? \"#=FirstName#\" : null\r\n },\r\n {\r\n field: \"LastName\",\r\n title: \"Last Name\",\r\n template: isAdmin ? \"#=LastName#\" : null\r\n },\r\n {\r\n field: \"Chair\",\r\n title: \"Chair\"\r\n },\r\n {\r\n field: \"Title\",\r\n title: \"Title\"\r\n },\r\n {\r\n field: \"DepartmentName\",\r\n title: \"Department Name\"\r\n },\r\n {\r\n field: \"Division\",\r\n title: \"Division\",\r\n hidden: true\r\n },\r\n {\r\n field: \"Department\",\r\n title: \"Department\",\r\n hidden: true\r\n },\r\n {\r\n field: \"Subdepartment\",\r\n title: \"Subdepartment\",\r\n hidden: true\r\n },\r\n {\r\n field: \"District\",\r\n title: \"District\",\r\n hidden: true\r\n },\r\n {\r\n field: \"ActualStart\",\r\n title: \"Act. Start\",\r\n format: \"{0:M/d/yyyy}\"\r\n },\r\n {\r\n field: \"ActualEnd\",\r\n title: \"Act. End\",\r\n format: \"{0:M/d/yyyy}\"\r\n },\r\n {\r\n template: \"\"\r\n }],\r\n noRecords: true,\r\n dataSource: {\r\n schema: {\r\n model: {\r\n fields: {\r\n ActualEnd: { type: \"date\" },\r\n ActualStart: { type: \"date\" }\r\n }\r\n }\r\n }\r\n },\r\n scrollable: false,\r\n width: 100,\r\n sortable: true,\r\n columnMenu: true,\r\n groupable: {\r\n messages: {\r\n empty: \"Drop columns here to group by\"\r\n }\r\n }\r\n });\r\n app.KendoGrids.InitPersistentGrid(\"gridSeatMemberHistory\", true);\r\n $(\"#gridSeatMemberHistory\").on(\"click\", \"[data-role='edit-seat-member']\", function (e) { app.Committee.EditSeatMemberDetails(e); });\r\n },\r\n EditCommitteeSeatDetails: function (e) {\r\n e.preventDefault();\r\n committeeSeatId = \"0\";\r\n $('[data-role=\"add-committee-seat-member-wrapper\"]').html('');\r\n $('[data-role=\"add-committee-seat-member-wrapper\"]').addClass('popup-loading');\r\n $('#addCommitteeSeatMemberModal').foundation('open');\r\n $.ajax({\r\n type: 'POST',\r\n dataType: 'html',\r\n url: $(\"[data-role='add-committee-seat']\").data(\"post-url\"),\r\n data: JSON.stringify({\r\n 'Id': committeeSeatId,\r\n 'CommitteeId': app.page.id\r\n }),\r\n contentType: \"application/json; charset=utf-8\",\r\n success: function (partialViewResult) {\r\n $('[data-role=\"add-committee-seat-member-wrapper\"]').html(partialViewResult);\r\n app.input.initDatePicker($('[data-role=\"add-committee-seat-member-wrapper\"]'));\r\n $('[data-role=\"add-committee-seat-member-wrapper\"]').removeClass('popup-loading');\r\n },\r\n error: function (jqXHR, textStatus, errorThrown) {\r\n toastr.error('Error loading committee seat details.', 'Error');\r\n console.log('Error: ' + jqXHR + \", textStatus: \" + textStatus + \", errorThrown: \" + errorThrown);\r\n console.log(JSON.stringify(jqXHR));\r\n }\r\n });\r\n },\r\n UpdateCommitteeSeat: function (button, url) {\r\n var form = $(button).closest('.reveal').find('form');\r\n $.validator.unobtrusive.parse(form);\r\n\r\n console.log(form.valid());\r\n if (form.valid()) {\r\n $.ajax({\r\n url: url,\r\n type: 'POST',\r\n data: form.serialize() + \"&netid=\" + $(button).closest('form').find('[data-role=\"netid\"]').val(),\r\n async: false,\r\n success: function (partialViewResult) {\r\n toastr.success('Committee Seat was saved successfully!', 'Save Successful');\r\n\r\n //update the grid to reflect an changes\r\n app.KendoGrids.GetResults(\"gridSeatHistory\");\r\n\r\n //close the popup.\r\n $('#addCommitteeSeatMemberModal').foundation('close');\r\n },\r\n error: function (result) {\r\n toastr.error('There was an error while saving the committee seat.', 'Error');\r\n }\r\n });\r\n }\r\n else {\r\n //Give focus to the first error\r\n var firstError = $('#' + $('.field-validation-error', form).data('valmsg-for'));\r\n if (firstError.length) {\r\n $('html, body').animate({\r\n scrollTop: firstError.offset().top - 50\r\n }, 500);\r\n }\r\n }\r\n },\r\n InitSeatMemberFlags: function () {\r\n $(document).on('click', '[data-role=\"add-flag\"]', function () {\r\n var template = $(this).closest('[data-role=\"flag-edit-form\"]').find(\"[data-role='flag-template']\").html();\r\n template = template.replace(/#=name#/g, $(this).closest('[data-role=\"flag-edit-form\"]').find('[name=\"FlagTypes\"] option:selected').text());\r\n template = template.replace(/#=flagTypeId#/g, $(this).closest('[data-role=\"flag-edit-form\"]').find('[name=\"FlagTypes\"] option:selected').val());\r\n template = template.replace(/#=index#/g, $(this).closest('[data-role=\"flag-edit-form\"]').find('[data-role=\"flag\"]').length - 1);\r\n $(this).closest('[data-role=\"flag-edit-form\"]').find('[name=\"FlagTypes\"] option:selected').remove();\r\n if ($(this).closest('[data-role=\"flag-edit-form\"]').find('[name=\"FlagTypes\"] option').length === 0) {\r\n $(this).closest('[data-role=\"flag-edit-form\"]').find('[data-role=\"add-flags\"]').hide();\r\n }\r\n var flags = $(this).closest('[data-role=\"flag-edit-form\"]').find('[data-role=\"flags\"]');\r\n flags.show();\r\n flags.append(template);\r\n });\r\n $(document).on('click', '[data-role~=\"delete-flag\"]', function () {\r\n if (confirm(\"Are you sure you want to delete this flag?\")) {\r\n $(this).closest('[data-role=\"flag\"]').find('[data-role=\"flag-delete-value\"]').val(true);\r\n $(this).closest('[data-role=\"flag\"]').hide();\r\n if ($('[data-role=\"flag\"]:visible').length === 0) {\r\n $(this).closest('[data-role=\"flag-edit-form\"]').find('[data-role=\"flags\"]').hide();\r\n }\r\n }\r\n });\r\n\r\n $(document).on('change', \"[data-role~='StartDateExpected']\", function () {\r\n var startDate = new Date($(\"[data-role~='StartDateExpected']\").val());\r\n $(\"[data-role~='StartDateActual']\").val(startDate.toLocaleDateString());\r\n var defaultTermLength = parseInt($(\"#hdnDefaultTerm\").val());\r\n var endDate = new Date(startDate.setYear(startDate.getFullYear() + defaultTermLength));\r\n endDate.setDate(endDate.getDate() - 1);\r\n $(\"[data-role~='EndDateExpected']\").val(endDate.toLocaleDateString());\r\n $(\"[data-role~='EndDateActual']\").val(endDate.toLocaleDateString());\r\n });\r\n },\r\n ConvertDate: function (date) {\r\n var yyyy = date.getFullYear().toString();\r\n var mm = (date.getMonth() + 1).toString();\r\n var dd = date.getDate().toString();\r\n\r\n var mmChars = mm.split('');\r\n var ddChars = dd.split('');\r\n\r\n return yyyy + '-' + (mmChars[1] ? mm : \"0\" + mmChars[0]) + '-' + (ddChars[1] ? dd : \"0\" + ddChars[0]);\r\n }\r\n };\r\n return myCommittee;\r\n}());","//*************************************************************************************\r\n//* Session specific code\r\n//*\r\n//* 6/13/18 Kraus [COM-136]: Created\r\n//*************************************************************************************\r\n\r\napp.Election = (function () {\r\n var myElection = {\r\n Index: function () {\r\n $(\"#tabs\").tabs();\r\n $(\"#tabs\").find('.ui-corner-top').removeClass('ui-corner-top');\r\n $(\"#gridElection\").kendoGrid({\r\n columns: [{\r\n field: \"Id\",\r\n hidden: true\r\n },\r\n {\r\n field: \"ElectionTitle\",\r\n title: \"Title\"\r\n },\r\n {\r\n field: \"Status\",\r\n title: \"Status\"\r\n },\r\n {\r\n template: \"Details\"\r\n }],\r\n scrollable: false,\r\n sortable: true\r\n });\r\n app.KendoGrids.InitPersistentGrid(\"gridElection\", true);\r\n\r\n $(document).on('click', '[data-role=\"save-election\"]', function () {\r\n app.Election.SaveElection(this);\r\n });\r\n\r\n\r\n\r\n $(\"#gridScheduled\").kendoGrid({\r\n columns: [{\r\n field: \"Id\",\r\n hidden: true\r\n },\r\n {\r\n field: \"ElectionId\",\r\n hidden: true\r\n },\r\n {\r\n field: \"ElectionTitle\",\r\n title: \"Title\",\r\n width: \"300px\"\r\n },\r\n {\r\n field: \"ElectionStart\",\r\n title: \"Start\",\r\n format: \"{0:M/d/yyyy}\",\r\n width: \"75px\"\r\n\r\n },\r\n {\r\n field: \"ElectionEnd\",\r\n title: \"End\",\r\n format: \"{0:M/d/yyyy}\",\r\n width: \"75px\"\r\n\r\n },\r\n {\r\n field: \"Live\",\r\n title: \"Live\",\r\n width: \"75px\",\r\n template: \"# if (Live != 'Yes') { #Offline# } else { #Live #}#\"\r\n },\r\n {\r\n field: \"VoteCount\",\r\n title: \"Voters\",\r\n width: \"75px\"\r\n },\r\n {\r\n field: \"Status\",\r\n title: \"Status\",\r\n width: \"75px\"\r\n },\r\n {\r\n template: \"Details\"\r\n }],\r\n scrollable: false,\r\n sortable: true,\r\n dataSource: {\r\n schema: {\r\n model: {\r\n fields: {\r\n ElectionStart: { type: \"date\" },\r\n ElectionEnd: { type: \"date\" }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n app.KendoGrids.InitPersistentGrid(\"gridScheduled\", true);\r\n },\r\n SaveElection: function (button) {\r\n $.ajax({\r\n url: $(button).data('url'),\r\n type: 'POST',\r\n data: $(button).closest('form').serialize(),\r\n success: function (result) {\r\n if (result == \"Success\") {\r\n toastr.success(\"Election saved successfully!\", \"Save successfull\");\r\n $('#txtElectionTitle').val('');\r\n $('#txtDescription').val('');\r\n $('#pnlAddElection').hide();\r\n app.KendoGrids.GetResults('gridElection');\r\n } else {\r\n //Was an error\r\n toastr.error(\"Election did not save.\", \"Save error\");\r\n }\r\n },\r\n error: function (result) {\r\n toastr.error(\"Election did not save.\", \"Save error\");\r\n //$(\"#dialog-error\").dialog(\"open\");\r\n //$(\"#dialog-error\").dialog(opt).dialog(\"open\");\r\n //errorDialog.dialog(\"open\");\r\n //$('#submittingCase').html('');\r\n }\r\n });\r\n}\r\n };\r\n return myElection;\r\n}());","//*************************************************************************************\r\n//* WaMS Component Framework - app.fileUpload.js\r\n//* Version 0.1\r\n//* Author: Huisenga\r\n//* Component framework file upload plugin\r\n//* Requires jQuery, WaMS Component Framework, fine uploader\r\n//* \r\n//* Component tags file upload elements and intiailizes them using fine uploader\r\n//* \r\n//*************************************************************************************\r\n//2/23/18 Huisenga [STUDYAB-339]: Added Binding for edit mode complete\r\n\r\napp.fileUploaders = (function () {\r\n var myUploaders = {\r\n Init: function () {\r\n this.initFileUploadComponents();\r\n },\r\n initFileUploadComponents: function () {\r\n $(document).on(\"component-bind-edit-mode-complete\", function (e, component) {\r\n $('[data-role~=\"file-Upload\"]', component.el).each(function (i, fileUploadElement) {\r\n app.fileUploaders.initFileUploadComponent(fileUploadElement);\r\n });\r\n });\r\n $('[data-role~=\"file-Upload\"]').each(function (i, fileUploadElement) {\r\n app.fileUploaders.initFileUploadComponent(fileUploadElement);\r\n });\r\n },\r\n initFileUploadComponent: function (fileUploadElement) {\r\n var multiUpload = $(fileUploadElement).data('multiupload') === \"True\";\r\n var allowedExtensions = $(fileUploadElement).data('allowedextensions');\r\n if (!allowedExtensions) {\r\n allowedExtensionArray = [];\r\n } else {\r\n allowedExtensionArray = allowedExtensions.split(',');\r\n }\r\n var sizeLimit = $(fileUploadElement).data('sizelimit');\r\n if (!sizeLimit) {\r\n sizeLimit = 0;\r\n }\r\n\r\n var uploader = new qq.FineUploader({\r\n debug: false,\r\n multiple: multiUpload,\r\n element: fileUploadElement,\r\n request: {\r\n endpoint: '/File/Upload'\r\n },\r\n deleteFile: {\r\n enabled: true,\r\n endpoint: '/File/Delete'\r\n },\r\n callbacks: {\r\n onStatusChange: function (id, oldStatus, newStatus) {\r\n var targetIdBase = $(this._options.element).data('target-id');\r\n if ($(this._options.element).data('multiupload') === \"True\") {\r\n var fileSet = $('#' + targetIdBase + '_fileset');\r\n if (newStatus === 'upload successful') {\r\n app.fileUploaders.UpdateFile(this, fileSet, id);\r\n }\r\n else {\r\n app.fileUploaders.RemoveFile(fileSet, id);\r\n }\r\n } else {\r\n if (newStatus === 'upload successful') {\r\n $('#' + targetIdBase + '_Guid').val(this.getUuid(id));\r\n $('#' + targetIdBase + '_Size').val(this.getSize(id));\r\n $('#' + targetIdBase + '_FileName').val(this.getName(id));\r\n\r\n $('.qq-upload-button-selector', $(this._options.element)).hide();\r\n }\r\n else {\r\n $('#' + targetIdBase + '_Guid').val('');\r\n $('#' + targetIdBase + '_Size').val('');\r\n $('#' + targetIdBase + '_FileName').val('');\r\n $('.qq-upload-button-selector', $(this._options.element)).show();\r\n }\r\n }\r\n }\r\n },\r\n thumbnails: {\r\n placeholders: {\r\n notAvailablePath: \"/Content/placeholders/not_available-generic.png\",\r\n waitingPath: \"/Content/placeholders/waiting-generic.png\"\r\n }\r\n },\r\n validation: {\r\n allowedExtensions: allowedExtensionArray,\r\n sizeLimit: sizeLimit\r\n },\r\n template: 'qq-simple-thumbnails-template'\r\n });\r\n if ($(\".initfile\", $(fileUploadElement)).length && !multiUpload){\r\n //has init file, but is single upload\r\n //hide button\r\n $('.qq-upload-button-selector', $(fileUploadElement)).hide();\r\n }\r\n $(\".initfile\", $(fileUploadElement)).each(function () {\r\n if ($(this).data('initialfile-uuid') !== \"\") {\r\n uploader.addInitialFiles([{\r\n name: $(this).data('initialfile-name'),\r\n uuid: $(this).data('initialfile-uuid'),\r\n thumbnailUrl: $(this).data('initialfile-thumbnailurl'),\r\n size: $(this).data('initialfile-size')\r\n }]);\r\n }\r\n });\r\n }\r\n\r\n };\r\n myUploaders.UpdateFile = function (file, el, id) {\r\n var fileElement = $('[data-index=\"'+id+'\"]', el);\r\n if (!fileElement.length) {\r\n var newTemplate = $('.file-template .filespec', el).clone();\r\n $('.templateField', newTemplate).each(function() {\r\n var name = $(this).attr('name');\r\n $(this).attr('name', name.replace('fileIndex', id));\r\n var idVal = $(this).attr('id');\r\n $(this).attr('id', idVal.replace('fileIndex', id));\r\n $(this).val('');\r\n });\r\n\r\n $('.file-index', newTemplate).val(id);\r\n //$('.templateValidation', newTemplate).each(function () {\r\n // var name = $(this).attr('data-valmsg-for');\r\n // $(this).attr('data-valmsg-for', name.replace('feeIndex', newIndex));\r\n //});\r\n\r\n newTemplate.attr('data-index', id);\r\n\r\n //enable the fields\r\n $('input', newTemplate).removeAttr('disabled');\r\n\r\n el.append(newTemplate);\r\n fileElement = newTemplate;\r\n }\r\n\r\n $('.file-guid', fileElement).val(file.getUuid(id));\r\n $('.file-size', fileElement).val(file.getSize(id));\r\n $('.file-name', fileElement).val(file.getName(id));\r\n\r\n\r\n //$(\"form\").data(\"unobtrusiveValidation\", null);\r\n //$(\"form\").data(\"validator\", null);\r\n //$.validator.unobtrusive.parse($(\"form\"));\r\n };\r\n\r\n myUploaders.RemoveFile = function (el, id) {\r\n $('[data-index=\"' + id + '\"]', el).remove();\r\n };\r\n return myUploaders;\r\n}());\r\n$(document).ready(function () {\r\n app.fileUploaders.Init();\r\n});\r\n","//*************************************************************************************\r\n//* WaMS Component Framework - app.grid.js\r\n//* Version 0.2\r\n//* Author: Damian Koch\r\n//* Component framework grids plugin\r\n//* Requires jQuery, WaMS Component Framework\r\n//* \r\n//* This component adds some grid features. Any component with 'component-grid' in data-role\r\n//* will be checked for [data-role=\"sort-action\"] on sorting controls, and [data-role=\"filter-action\"]\r\n//* on filtering controls.\r\n//* \r\n//* 8/17 DBK Added server grid support.\r\n//* 3/12 WMK Added auto pull if active grid state and not client side filtering.\r\n//* 5/21/18 Huisenga [STUDYAB-828]: Fix active state, arrow key presses\r\n//* 12/18/18 BWH: Updates to filter grid timeouts\r\n//*************************************************************************************\r\n\r\napp.grids = (function () {\r\n var myGrids = {\r\n Init: function () {\r\n this.initGridComponents();\r\n this.initPageGridActions();\r\n $(document).on(\"component-init-complete\", function (e, component) { app.grids.initGridComponent(component); });\r\n $(document).on(\"component-action-init-complete\", function (e, component) { app.grids.initPageGridAction(component); });\r\n },\r\n initGridComponents: function () {\r\n\r\n //This entire mess can be cleaned up if components get identified by guid\r\n var gridComponents = new Array();\r\n $('[data-role~=\"component-grid\"]').each(function (i, gridElement) {\r\n gridComponents.push($(gridElement).data('component-type'));\r\n });\r\n gridComponents = $.unique(gridComponents);\r\n $.each(gridComponents, function (i, componentType) {\r\n var grids = app.page.allComponents[componentType];\r\n grids.forEach(function (grid) {\r\n app.grids.initGridComponent(grid);\r\n });\r\n });\r\n\r\n if ($('[data-role=\"submit-changed-only\"]').length) {\r\n //in row edits\r\n $(document).on('change keyup', 'input, select, textarea', function () {\r\n $(this).closest('tr').find('input, select, textarea').addClass('changed');\r\n });\r\n\r\n //column edits\r\n $(document).on('change keyup', 'input[data-role=\"check-all\"], input[data-role=\"textbox-all\"], select[data-role=\"dropdown-all\"]', function () {\r\n $(this).closest('table').find('input, select, textarea').addClass('changed');\r\n });\r\n\r\n $(document).on('click', '[data-role=\"submit-changed-only\"]', function () {\r\n $(this).closest('form').find('table').find('input:not(.changed), select:not(.changed), textarea:not(.changed)').prop('disabled', true);\r\n });\r\n }\r\n $(document).on(\"component-bind-view-mode-complete\", function (e, component) {\r\n component.page.log(\"component-bind-view-mode-complete triggered: \" + component.type);\r\n if (component.el.data('role').indexOf('component-grid')) {\r\n $('[data-role=\"sort-action\"]', component.el).attr('tabindex', '0');\r\n $('[data-role=\"sort-action\"]', component.el).attr('role', 'button');\r\n $('[data-role=\"sort-action\"]', component.el).on('click', $.proxy(component.sortGrid, component));\r\n $('[data-role=\"dropdown-all\"]', component.el).on('change', $.proxy(component.changeAllDropdown, component));\r\n $('[data-role=\"textbox-all\"]', component.el).on('keyup', $.proxy(component.changeAllTextbox, component));\r\n $('[data-role=\"check-all\"]', component.el).on('click', $.proxy(component.checkAll, component));\r\n $('[data-role=\"sort-action\"]', component.el).keypress(function (e) {\r\n var code = e.keyCode || e.which;\r\n if (code === 13 || code === 0 || code === 32) {\r\n $(this).click();\r\n }\r\n });\r\n $('[data-role=\"grid-page-action\"]', component.el).on('click', $.proxy(component.pageGrid, component));\r\n app.input.initDatePicker(document);\r\n app.input.initTextEditor(document);\r\n }\r\n });\r\n },\r\n initGridComponent: function (gridComponent) {\r\n gridComponent.selectors.table = 'table';\r\n gridComponent.selectors.filterForm = 'form[data-role~=\"filter-grid\"][data-component-form-target~=\"' + gridComponent.type + '\"]';\r\n gridComponent.selectors.pageSize = '[data-role~=\"grid-page-size\"][data-component-form-target=\"' + gridComponent.type + '\"]';\r\n gridComponent.selectors.showForResults = '[data-role~=\"grid-show-for-results\"][data-component-form-target~=\"' + gridComponent.type + '\"]';\r\n\r\n if ($('[data-role~=\"component\"]', gridComponent.el).length) {\r\n gridComponent.selectors.rows = 'tbody:not([data-component-role=\"noResults\"])';\r\n }\r\n else {\r\n gridComponent.selectors.rows = 'tbody > tr:not([data-component-role=\"noResults\"])';\r\n }\r\n\r\n gridComponent.gridType = gridComponent.el.data('grid-type') || 'client';\r\n\r\n if (gridComponent.gridType === 'client') {\r\n gridComponent.filterGrid = function () {\r\n var context = $(this.selectors.table, this.el);\r\n var rows = $(this.selectors.rows, context);\r\n\r\n rows.show();\r\n\r\n $(':input', this.selectors.filterForm).each(function (i, e) {\r\n var el = $(e);\r\n if (el.val() !== '') {\r\n var field;\r\n\r\n if (el.data('target')) {\r\n field = '[data-label=\"' + el.data('target') + '\"]';\r\n }\r\n else {\r\n field = '';\r\n }\r\n\r\n var values = el.val().toUpperCase().split(/\\s+/);\r\n rows.each(function (i, e) {\r\n var hide = false;\r\n\r\n $.each(values, function (index, v) {\r\n if ($(field + ':icontains(\"' + v + '\")', e).length < 1) {\r\n hide = true;\r\n return;\r\n }\r\n });\r\n if (hide) {\r\n $(e).hide();\r\n }\r\n });\r\n }\r\n });\r\n\r\n //showhide noresults\r\n //TODO: move selectors to selector params\r\n if ($(this.selectors.rows + ':visible', context).length) {\r\n $('[data-component-role=\"noResults\"]', context).hide();\r\n } else {\r\n $('[data-component-role=\"noResults\"]', context).show();\r\n }\r\n };\r\n gridComponent.pageGrid = function () {\r\n alert('do this!');\r\n };\r\n gridComponent.sortGrid = function (e) {\r\n var el = $(e.target);\r\n var context = $(this.selectors.table, this.el);\r\n var rows = $(this.selectors.rows, context).get();\r\n var sortDescending = el.hasClass('asc');\r\n var component = this;\r\n\r\n $('[data-role=\"sort-action\"]', context).removeClass('asc').removeClass('desc').removeAttr('aria-sort');\r\n\r\n rows = app.page.mergeSort(rows, el.data('target'));\r\n\r\n if (sortDescending) {\r\n el.addClass('desc');\r\n el.attr('aria-sort', 'descending');\r\n rows = rows.reverse();\r\n } else {\r\n\r\n el.addClass('asc');\r\n el.attr('aria-sort', 'ascending');\r\n\r\n }\r\n\r\n if (component.selectors.rows === 'tbody') {\r\n $.each(rows, function (index, row) {\r\n context.append(row);\r\n });\r\n }\r\n else {\r\n $.each(rows, function (index, row) {\r\n context.children('tbody').append(row);\r\n });\r\n }\r\n };\r\n $(gridComponent.selectors.filterForm).on('keydown', function () {\r\n switch (event.keyCode) {\r\n case 13:\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n });\r\n } else {\r\n gridComponent.filterGrid = function () { this.refreshGrid(); };\r\n gridComponent.pageGrid = function (e) {\r\n var page = $(e.target).data('page-value');\r\n this.refreshGrid(page);\r\n };\r\n gridComponent.sortGrid = function (e) {\r\n var el = $(e.target);\r\n var context = $(this.selectors.table, this.el);\r\n var sortDescending = el.hasClass('asc');\r\n\r\n $('[data-role=\"sort-action\"]', context).removeClass('asc').removeClass('desc').removeAttr('aria-sort');\r\n\r\n if (sortDescending) {\r\n el.addClass('desc');\r\n el.attr('aria-sort', 'descending');\r\n } else {\r\n el.addClass('asc');\r\n el.attr('aria-sort', 'ascending');\r\n }\r\n\r\n this.refreshGrid();\r\n };\r\n gridComponent.checkAll = function (e) {\r\n $(\"[name*='\" + $(e.target).data('name') + \"']\").closest('tr').find('input, select, textarea').addClass('changed');\r\n if ($(e.target).prop('checked')) {\r\n $(\"[name*='\" + $(e.target).data('name') + \"']\").prop('checked', true); \r\n }\r\n else {\r\n $(\"[name*='\" + $(e.target).data('name') + \"']\").prop('checked', false);\r\n }\r\n };\r\n gridComponent.changeAllDropdown = function (e) {\r\n $(\"[name*='\" + $(e.target).data('name') + \"']\").val($(e.target).val());\r\n };\r\n gridComponent.changeAllTextbox = function (e) {\r\n $(\"[name*='\" + $(e.target).data('name') + \"']\").val($(e.target).val());\r\n };\r\n gridComponent.refreshGrid = function (pageNumber) {\r\n $(document).trigger(\"component-filter-grid-started\", this);\r\n\r\n var form = $(this.selectors.filterForm);\r\n var pageSize = $(this.selectors.pageSize).val();\r\n var el = this.el;\r\n var context = $(this.selectors.table, this.el);\r\n\r\n //get filters\r\n var filters = form.serializeArray();\r\n var pageNum = pageNumber || 1;\r\n filters.push({ name: \"pageNumber\", value: pageNum });\r\n filters.push({ name: \"pageSize\", value: pageSize });\r\n filters.push({ name: \"sortField\", value: $('[aria-sort]', context).data('target') });\r\n filters.push({ name: \"isSortAscending\", value: $('[aria-sort]', context).attr('aria-sort') === 'ascending' });\r\n\r\n this.startLoading();\r\n if (this.request !== null) {\r\n this.request.abort();\r\n this.request = null;\r\n }\r\n this.request = $.ajax({ url: this.urls.view, data: $.param(filters), context: this, error: this.page.handleAjaxError, type: 'POST' }).done(function (data) {\r\n el.html(data);\r\n this.endLoading();\r\n this.bindViewMode();\r\n var forResults = $(this.selectors.showForResults);\r\n\r\n if (forResults) {\r\n if ($('.no-results', this.el).length) {\r\n forResults.hide();\r\n eval();\r\n } else {\r\n forResults.show();\r\n eval();\r\n }\r\n } \r\n });\r\n\r\n $(document).trigger(\"component-filter-grid-completed\", this);\r\n\r\n };\r\n }\r\n\r\n\r\n $(gridComponent.componentActions.report).each(function () {\r\n app.grids.initPageGridAction(this);\r\n });\r\n\r\n if (gridComponent.state === \"active\") {\r\n $('[data-role=\"sort-action\"]', gridComponent.el).on('click', $.proxy(gridComponent.sortGrid, gridComponent));\r\n $('[data-role=\"grid-page-action\"]', gridComponent.el).on('click', $.proxy(gridComponent.pageGrid, gridComponent));\r\n }\r\n //Prevent enter key and escape to prevent unintended form posts\r\n $('form[data-component-action=\"filtergrid\"] input, form[data-component-action=\"filtergrid\"] select').on('keydown', $.proxy(function () {\r\n switch (event.keyCode) {\r\n case 13:\r\n event.preventDefault();\r\n event.stopPropagation();\r\n break;\r\n case 27:\r\n event.preventDefault();\r\n event.stopPropagation();\r\n break;\r\n }\r\n }, this));\r\n },\r\n initPageGridActions: function () {\r\n if (app.page.componentActions.report) {\r\n app.page.componentActions.report.forEach(function (pageAction) {\r\n app.grids.initPageGridAction(pageAction);\r\n });\r\n }\r\n },\r\n initPageGridAction: function (pageAction) {\r\n switch (pageAction.action) {\r\n case \"filtergrid\":\r\n pageAction.triggerAction = function (e) {\r\n if (e.type !== \"keyup\" || app.page.isPrintableCharacter(e.keyCode)) {\r\n var delay = 300;\r\n if (e.type !== \"keyup\") {\r\n delay = 0;\r\n }\r\n //if keyup, add a delay\r\n if (this.timeout !== null) { clearTimeout(this.timeout); }\r\n var that = this;\r\n this.timeout = setTimeout(function () {\r\n\r\n var theTargets = that.target.split(\" \");\r\n theTargets.forEach(function (theTarget) {\r\n var grids = this.app.page.allComponents[theTarget];\r\n grids.forEach(function (grid) {\r\n grid.filterGrid(e);\r\n });\r\n });\r\n\r\n }, delay, e, that);\r\n }\r\n };\r\n pageAction.el.off(pageAction.event).on(pageAction.event, $.proxy(pageAction.triggerAction, pageAction));\r\n break;\r\n case \"viewgridpage\":\r\n pageAction.triggerAction = function (e) {\r\n var target = this.page.components[this.target][0];\r\n target.filterGrid($(e.target).data('component-action-value'));\r\n };\r\n pageAction.el.off(pageAction.event).on(pageAction.event, $.proxy(pageAction.triggerAction, pageAction));\r\n break;\r\n }\r\n }\r\n };\r\n\r\n return myGrids;\r\n}());\r\n\r\n$(function () {\r\n app.grids.Init();\r\n});","//*************************************************************************************\r\n//* Session specific code\r\n//*\r\n//* 6/13/18 Kraus [COM-136]: Created\r\n//*************************************************************************************\r\n\r\napp.Individual = (function () {\r\n var myIndividual = {\r\n Index: function () {\r\n\r\n $(\"#gridIndividual\").kendoGrid(\r\n {\r\n columns: [\r\n {\r\n field: \"UserId\",\r\n hidden: true\r\n },\r\n {\r\n title: 'Select All',\r\n headerTemplate: \"
To
Select All
\",\r\n template: \"
\"\r\n },\r\n {\r\n title: 'Select All',\r\n headerTemplate: \"
CC
Select All
\",\r\n template: \"
\"\r\n },\r\n {\r\n title: 'Select All',\r\n headerTemplate: \"
BCC
Select All
\",\r\n template: \"
\"\r\n },\r\n {\r\n field: \"FirstName\",\r\n title: \"First Name\"\r\n },\r\n {\r\n field: \"LastName\",\r\n title: \"Last Name\"\r\n },\r\n {\r\n field: \"NetId\",\r\n title: \"NetID\"\r\n },\r\n {\r\n field: \"Committees\",\r\n title: \"Committee\"\r\n },\r\n {\r\n template: \"Details\"\r\n }],\r\n scrollable: false,\r\n sortable: true,\r\n columnMenu: true,\r\n groupable: {\r\n messages: {\r\n empty: \"Drop columns here to group by\"\r\n }\r\n }\r\n });\r\n app.KendoGrids.InitPersistentGrid(\"gridIndividual\", false);\r\n\r\n $(document).on(\"kendo-datasource-load-complete\", function () {\r\n app.Individual.EvaluateSelectAllCheckBox();\r\n app.Individual.AddPreviousCheckedDivider();\r\n });\r\n\r\n $(\"#gridIndividual\").on('click', 'input[type=\"checkbox\"]', function () {\r\n if ($(this).data(\"role\") === \"select-all\") {\r\n var cb = $(this), //checkbox that was changed\r\n th = cb.closest('th'), //get parent th\r\n col = th.index() + 1; //get column index.\r\n if ($(this).prop(\"checked\")) {\r\n $(this).closest('.k-grid').find(\"td:nth-child(\" + col + \") input[type='checkbox']\").prop(\"checked\", true);\r\n } else {\r\n $(this).closest('.k-grid').find(\"td:nth-child(\" + col + \") input[type='checkbox']\").prop(\"checked\", false);\r\n }\r\n } else {\r\n app.Individual.EvaluateSelectAllCheckBox();\r\n }\r\n });\r\n },\r\n Details: function () {\r\n app.Individual.InitProspectiveCommitteeGrid();\r\n app.UserHome.InitPreviousCommitteeGrid();\r\n app.UserHome.InitPreviousElectionGrid();\r\n },\r\n EvaluateSelectAllCheckBox: function () {\r\n //detemerine if the select all checkbox should change state\r\n $('input[data-role=\"select-all\"]').each(function () {\r\n var cb = $(this), //checkbox that was changed\r\n th = cb.closest('th'), //get parent th\r\n col = th.index() + 1; //get column index.\r\n var checkboxCount = $(this).closest('.k-grid').find('tbody').find(\"td:nth-child(\" + col + \") input[type='checkbox']\").length;\r\n if ($(this).closest('.k-grid').find('tbody').find(\"td:nth-child(\" + col + \") input[type='checkbox']:checked\").length === checkboxCount) {\r\n $(this).prop(\"checked\", true);\r\n } else {\r\n $(this).prop(\"checked\", false);\r\n }\r\n });\r\n },\r\n AddPreviousCheckedDivider: function () {\r\n $('.k-grid').find('tbody').find('input[type=\"checkbox\"]:checked:first').closest('tr').addClass('first-previous-checked');\r\n },\r\n InitProspectiveCommitteeGrid: function () {\r\n $(\"#gridProspectiveCommittee\").kendoGrid({\r\n filterable: {\r\n extra: false,\r\n operators: {\r\n string: {\r\n startswith: \"Starts with\",\r\n eq: \"Is equal to\",\r\n neq: \"Is not equal to\"\r\n }\r\n }\r\n },\r\n toolbar: [\"excel\"],\r\n excel: {\r\n fileName: \"ProspectiveCommittees.xlsx\"\r\n },\r\n columns: [\r\n {\r\n field: \"Committee\",\r\n title: \"Committee\",\r\n template: \"#=Committee#\",\r\n },\r\n {\r\n field: \"ReasonToAdd\",\r\n title: \"Reason Added\"\r\n },\r\n {\r\n field: \"AddedDate\",\r\n title: \"Date Added\",\r\n format: \"{0:M/d/yyyy}\"\r\n },\r\n {\r\n field: \"Notes\",\r\n title: \"Notes\"\r\n },\r\n {\r\n field: \"Response\",\r\n title: \"Response\"\r\n },\r\n {\r\n field: \"ResponseDate\",\r\n title: \"Response Date\",\r\n format: \"{0:M/d/yyyy}\"\r\n },\r\n {\r\n field: \"FacultyDivision\",\r\n title: \"Faculty Division\",\r\n hidden: true\r\n }],\r\n dataSource: {\r\n schema: {\r\n model: {\r\n fields: {\r\n AddedDate: { type: \"date\" },\r\n ResponseDate: { type: \"date\" }\r\n }\r\n }\r\n }\r\n },\r\n noRecords: true,\r\n scrollable: false,\r\n width: 100,\r\n sortable: true,\r\n columnMenu: true,\r\n groupable: {\r\n messages: {\r\n empty: \"Drop columns here to group by\"\r\n }\r\n }\r\n });\r\n app.KendoGrids.InitPersistentGrid(\"gridProspectiveCommittee\", true);\r\n }\r\n };\r\n return myIndividual;\r\n}());","//*******************************************************************************************\r\n//* WaMS Component Framework - app.input.js\r\n//* Version 0.1\r\n//* Author: Damian Koch\r\n//* Component framework input helpers plugin\r\n//* Requires jQuery, WaMS Component Framework\r\n//* \r\n//* This component adds some rich input features. When this file is loaded, certain\r\n//* fields/attributes will be looked for in forms on showEditMode complete.\r\n//* \r\n//* 10/17/18 DBK Created!\r\n//* 02/14/18 DBK [STUDYAB-650]: Added support for content template helpers\r\n//* 02/15/18 Kraus [STUDYAB-655]: Added select many support\r\n//* 02/21/18 Koch [STUDYAB-667]: updates to select many\r\n//* 03/15/18 Huisenga [STUDYAB-361]: swaped to froala\r\n//* 03/21/18 Koch [STUDYAB-690]: encapsulated studyab updates a bit more, add city support\r\n//* 04/10/18 Huisenga [STUDYAB-747]: Updated to run init on page if not in edit component\r\n//* 04/16/18 Peck [STUDYAB-729]: Updated select many logic to allow dropdown filters\r\n//* 06/11/18 Peck [STUDYAB-875]: Updated select many dropdown logic\r\n//* 10/12/18 Kraus [STUDYAB-195]: Added block_text options explicitly to TinyMCE\r\n//*******************************************************************************************\r\n\r\napp.input = (function () {\r\n var myInput = {\r\n Init: function () {\r\n this.initInputComponents(document);\r\n //init page\r\n\r\n //init future components\r\n $(document).on('component-bind-edit-mode-complete', function (e, component) {\r\n component.page.log('component-bind-edit-mode-complete triggered: ' + component.type);\r\n app.input.initInputComponents(component.editComponent);\r\n });\r\n },\r\n initInputComponents: function (el) {\r\n app.input.initMasks(el);\r\n app.input.initComponentTemplate(el);\r\n app.input.initCitySelect(el);\r\n app.input.initTextEditor(el);\r\n app.input.initDatePicker(el);\r\n app.input.initSelectMany(el);\r\n app.input.initTextAreas(el);\r\n if ($(\"#divActivityLog\").length > 0) {\r\n app.ActivityLog.Init();\r\n }\r\n //app.input.initAutocomplete(el);\r\n },\r\n initMasks: function (editComponent) {\r\n $('[data-component-input-type=\"Phone\"]', editComponent).mask('(000)000-0000');\r\n $('[data-component-input-type=\"date\"]', editComponent).mask('00/00/0000');\r\n $('[data-component-input-type=\"numeric\"]', editComponent).mask('000000000000.00', { reverse: true });\r\n $('[data-component-input-type=\"currency\"]', editComponent).mask('#,##0.00', { reverse: true });\r\n },\r\n initTextAreas: function (editComponent) {\r\n $('textarea').each(function () {\r\n this.setAttribute('style', 'height:' + (this.scrollHeight) + 'px;overflow-y:hidden;');\r\n }).on('input', function () {\r\n this.style.height = 'auto';\r\n this.style.height = (this.scrollHeight) + 'px';\r\n });\r\n },\r\n initComponentTemplate: function (editComponent) {\r\n $('[data-role=\"content-template-select\"]', editComponent).on('change', function (e) {\r\n var sel = $(e.target);\r\n var target = $('#' + sel.data('content-template-target'));\r\n if (target.data('role') === 'richtext') {\r\n $(tinymce.get(sel.data('content-template-target')).getBody()).html(sel.val());\r\n tinymce.triggerSave();\r\n } else {\r\n target.val(sel.val());\r\n }\r\n });\r\n },\r\n initCitySelect: function (editComponent) {\r\n var that = this;\r\n $('[data-role=\"country-select\"]', editComponent).on('change', function (e) {\r\n that.filterCities(e.target, editComponent);\r\n });\r\n $('[data-role=\"country-select\"]', editComponent).each(function (i, e) { that.filterCities(e, editComponent); });\r\n },\r\n filterCities: function (e, editComponent) {\r\n var guid = $(e).data('role-guid');\r\n var cityddl = $('[data-role=\"city-select\"][data-role-guid=\"' + guid + '\"]', editComponent);\r\n var countryVal = $(e).val();\r\n\r\n if (countryVal === '') {\r\n cityddl.children('option').show();\r\n } else {\r\n if ($('option:selected', cityddl).attr('country') !== countryVal) {\r\n cityddl.val('');\r\n }\r\n cityddl.children('option[country]').hide();\r\n cityddl.children('option[country=\"' + countryVal + '\"]').show();\r\n }\r\n\r\n app.page.log('country selected:' + countryVal);\r\n },\r\n initSelectMany: function (editComponent) {\r\n $('[data-role=\"select-many\"]', editComponent).each(function () {\r\n var selectManyContext = this;\r\n var listSelected = function (el) {\r\n var selectedCheckboxNames;\r\n var context = $(el).closest('[data-role=\"select-many\"]');\r\n var fieldSet = $('fieldset', context);\r\n\r\n if ($('[type=\"checkbox\"]:not(:checked)', fieldSet).length === 0) {\r\n selectedCheckboxNames = \"All\";\r\n }\r\n else {\r\n if ($('[type=\"checkbox\"]:checked', fieldSet).length === 0) {\r\n selectedCheckboxNames = \"None\";\r\n } else {\r\n selectedCheckboxNames = $('[type=\"checkbox\"]:checked + label', fieldSet).map(function () {\r\n return this.innerText;\r\n }).get().join(', ');\r\n }\r\n }\r\n\r\n $('[data-role=\"selected-item-list\"]', context).text(selectedCheckboxNames);\r\n };\r\n\r\n listSelected($('fieldset', this));\r\n\r\n //on change update selection list label\r\n $('input[type=\"checkbox\"]', selectManyContext).on('change', function () { listSelected(this); });\r\n\r\n //filter event listener\r\n $(selectManyContext).on('keyup', '[data-role=\"select-many-filter\"]', function () {\r\n var value = $(this).val().toLowerCase();\r\n const selMany = $(this).closest('[data-role=\"select-many\"]');\r\n\r\n var hiddenToggle = $(selectManyContext).find('[data-role=\"select-many-hide-toggle\"]').val() === 'true';\r\n\r\n selMany.find('.select-many-checkbox').each(function () {\r\n if ($(this).find('label').text().toLowerCase().search(value) > -1) {\r\n if (!hiddenToggle || (hiddenToggle && $(this).hasClass('select-many-checkbox-hide') !== true)) {\r\n $(this).show();\r\n }\r\n }\r\n else {\r\n $(this).hide();\r\n }\r\n });\r\n\r\n var selAll = selMany.find('[type=\"checkbox\"][data-role~=\"selectall\"]:visible');\r\n var selAllChecked = true;\r\n\r\n\r\n //loop through visible values, if any is false, then mark the box as not all selected\r\n selMany.find('.select-many-checkbox input[type=\"checkbox\"]:visible').each(function (ind, el) {\r\n if ($(el).prop('checked') !== true) {\r\n selAllChecked = false;\r\n // returning false breaks from loop\r\n return false;\r\n }\r\n });\r\n\r\n selAll.prop('checked', selAllChecked);\r\n });\r\n\r\n // Hide toggle event listener\r\n $(selectManyContext).on('click', '[data-role=\"select-many-hide-toggle\"]', function () {\r\n var value = $(this).val().toLowerCase();\r\n var displayText = $(this).data(\"display-text\");\r\n const selMany = $(this).closest('[data-role=\"select-many\"]');\r\n\r\n if (value === 'false') { // Currently visible, so we hide\r\n $(this).val('true');\r\n $(this).text('Show ' + displayText);\r\n selMany.find('.select-many-checkbox-hide').each(function () {\r\n $(this).hide();\r\n $(this).find(\"input\").prop('checked', false);\r\n });\r\n\r\n }\r\n else { // Current hidden, so we show\r\n $(this).val('false');\r\n $(this).text('Hide ' + displayText);\r\n selMany.find('.select-many-checkbox').each(function () {\r\n $(this).show();\r\n });\r\n }\r\n\r\n //Run the check for the Select All box after clicking the show/hide toggle\r\n var selAll = selMany.find('[type=\"checkbox\"][data-role~=\"selectall\"]:visible');\r\n var selAllChecked = true;\r\n var selCount = 0;\r\n\r\n\r\n //loop through visible values, if any is false, then mark the box as not all selected\r\n selMany.find('.select-many-checkbox input[type=\"checkbox\"]:visible').each(function (ind, el) {\r\n if ($(el).prop('checked') !== true) {\r\n selAllChecked = false;\r\n // returning false breaks from loop\r\n return false;\r\n } else {\r\n selCount++;\r\n }\r\n });\r\n\r\n if (selCount > 0 && selAllChecked) {\r\n selAll.prop('checked', true);\r\n } else {\r\n selAll.prop('checked', false);\r\n }\r\n\r\n // Select All display\r\n var selectedCheckboxNames;\r\n var context = $(this).closest('[data-role=\"select-many\"]');\r\n var fieldSet = $('fieldset', context);\r\n\r\n if ($('[type=\"checkbox\"]:not(:checked)', fieldSet).length === 0) {\r\n selectedCheckboxNames = \"All\";\r\n }\r\n else {\r\n if ($('[type=\"checkbox\"]:checked', fieldSet).length === 0) {\r\n selectedCheckboxNames = \"None\";\r\n } else {\r\n selectedCheckboxNames = $('[type=\"checkbox\"]:checked + label', fieldSet).map(function () {\r\n return this.innerText;\r\n }).get().join(', ');\r\n }\r\n }\r\n\r\n $('[data-role=\"selected-item-list\"]', context).text(selectedCheckboxNames);\r\n\r\n\r\n });\r\n\r\n console.log(editComponent);\r\n\r\n //custom dropdown filter event listener\r\n $(editComponent).on('change', 'select[data-role=\"filter-select-many\"]', function () {\r\n\r\n //var filterField = $(this).data(\"filter-field\");\r\n var filterTargetFieldset = $(\"#fst\" + $(this).data(\"target\"), selectManyContext);\r\n //var selectedOption = $(this).val();\r\n\r\n var allSelects = $('select[data-role=\"filter-select-many\"][data-target=\"' + $(this).data(\"target\") + '\"]');\r\n\r\n filterTargetFieldset.find(\".select-many-checkbox\").each(function () {\r\n var showThis = true;\r\n var curCheckbox = $(this).find(\"input\");\r\n\r\n allSelects.each(function (el) {\r\n var selectedOption = $(this).val();\r\n var filteredField = $(this).data(\"filter-field\");\r\n var filteredFieldValue = curCheckbox.data(filteredField);\r\n\r\n showThis = showThis && (selectedOption == null || selectedOption === \"\" || filteredFieldValue == selectedOption);\r\n });\r\n\r\n if (showThis) {\r\n $(this).show();\r\n }\r\n else {\r\n $(this).hide();\r\n }\r\n });\r\n\r\n var selAll = $('[type=\"checkbox\"][data-role~=\"selectall\"][name=\"' + $(this).data(\"target\") + '\"]:visible');\r\n var selAllChecked = true;\r\n $('.select-many-checkbox input[type=\"checkbox\"][name=\"' + $(this).data(\"target\") + '\"]:visible').each(function (ind, el) {\r\n if ($(el).prop('checked') != true) {\r\n selAllChecked = false;\r\n // returning false breaks from loop\r\n return false;\r\n }\r\n });\r\n \r\n selAll.prop('checked', selAllChecked);\r\n });\r\n });\r\n },\r\n initDatePicker: function (editComponent) {\r\n $('[data-component-role=\"startdate\"]', editComponent).fdatepicker().on('changeDate', function (ev) {\r\n //When start date changes, check the end date\r\n //Find end date\r\n var endDateElement = $('#' + $(this).data('enddate-target'), $(this.form)).fdatepicker();\r\n\r\n if (ev.date.valueOf() > new Date(endDateElement.val()).getTime()) {\r\n //If the end date is too early, set to know and give focus\r\n var newDate = new Date(ev.date);\r\n newDate.setDate(newDate.getDate() + 1);\r\n endDateElement.fdatepicker('update', newDate);\r\n $(this).fdatepicker('hide');\r\n endDateElement[0].focus();\r\n }\r\n\r\n }).data('datepicker');\r\n\r\n $('[data-component-role=\"enddate\"]', editComponent).fdatepicker({\r\n onRender: function (date) {\r\n //get start date\r\n var startDate = $('[data-enddate-target=\"' + this.element.attr('id') + '\"').fdatepicker();\r\n //Only allow \r\n return date.valueOf() <= new Date(startDate.val()).getTime() ? 'disabled' : '';\r\n }\r\n }).on('changeDate', function (ev) {\r\n $(this).fdatepicker('hide');\r\n }).data('datepicker');\r\n\r\n\r\n $('[data-role~=\"datepicker\"]', editComponent).fdatepicker();\r\n },\r\n initTextEditor: function (editComponent) {\r\n $('[data-role~=\"richtext\"]', editComponent).each(function (index) {\r\n tinymce.remove('#' + this.id);\r\n tinymce.init({\r\n selector: '#' + this.id, // change this value according to your HTML\r\n block_formats:\r\n 'Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre',\r\n themes: \"modern\",\r\n plugins: \"code lists link textcolor table autoresize\",\r\n mode: \"textareas\",\r\n autoresize_on_init: false,\r\n autoresize_bottom_margin: 0,\r\n autoresize_min_height: 100,\r\n branding: false,\r\n menubar: false,\r\n forced_root_block: \"\",\r\n toolbar: [\r\n 'bold italic superscript subscript | formatselect | numlist bullist | forecolor backcolor | alignleft aligncenter alignright | link | indent outdent | removeformat code'\r\n ],\r\n init_instance_callback: function (editor) {\r\n editor.on('change', function (e) {\r\n tinymce.triggerSave();\r\n $('#' + e.target.id).change();\r\n $('#' + e.target.id).valid();\r\n });\r\n }\r\n });\r\n\r\n //Hook hidden field into the validation\r\n //Tried setting this on the form on creation, on custom validators.... Would not bind correctly\r\n //This works the best out of kludge options\r\n var form = $(this.form);\r\n if (form != undefined) {\r\n //create the validator\r\n $.validator.unobtrusive.parse(form);\r\n //set validator options\r\n var validator = form.data('validator');\r\n if (validator !== undefined) {\r\n validator.settings.ignore =\r\n ':hidden:not([data-role~=\"richtext\"]),.mce-content-body';\r\n }\r\n }\r\n });\r\n },\r\n initAutocomplete: function (editComponent) {\r\n $('[data-role~=\"autocomplete\"]', editComponent).each(function() {\r\n var ac = new app.Autocomplete($(this));\r\n });\r\n app.Autocomplete.BindSetButtons(editComponent);\r\n }\r\n };\r\n\r\n return myInput;\r\n}());\r\n\r\n$(function () {\r\n app.input.Init();\r\n});","//*************************************************************************************\r\n//* Session specific code\r\n//*\r\n//* 6/13/18 Kraus [COM-136]: Created\r\n//*************************************************************************************\r\n\r\napp.KendoGrids = (function () {\r\n var options = [];\r\n var myKendoGrids = {\r\n InitPersistentGrid: function (gridId, loadData) {\r\n kendo.ui.progress($(\"#\" + gridId), true);\r\n $.ajax({\r\n type: 'POST',\r\n url: \"/PersistentState/Get\",\r\n data: \"GridIdSelector=\" + gridId,\r\n success: function (results) {\r\n if (results) {\r\n options[gridId] = results.Options;\r\n if (results.Filter) {\r\n $(\"form[data-role='\" + $(\"#\" + gridId).data(\"filter-form\") + \"']\").deserialize(results.Filter);\r\n }\r\n }\r\n\r\n $(\"#\" + gridId).data(\"kendoGrid\").bind(\"dataBound\", function (e) { app.KendoGrids.SaveOptions(gridId); });\r\n $(\"#\" + gridId).data(\"kendoGrid\").bind(\"columnMenuInit\", function (e) {\r\n var menu = e.container.find(\".k-menu\");\r\n $(\"input\", menu).on('click', function () { app.KendoGrids.SaveOptions(gridId); });\r\n });\r\n \r\n if (loadData) {\r\n app.KendoGrids.GetResults(gridId);\r\n }\r\n else {\r\n kendo.ui.progress($(\"#\" + gridId), false);\r\n }\r\n },\r\n error: function (results) {\r\n kendo.ui.progress($(\"#\" + gridId), false);\r\n }\r\n });\r\n\r\n //setup the save event listender\r\n var selectorString = \"#\" + gridId;\r\n var formSelector = \"form[data-role='\" + $(\"#\" + gridId).data(\"filter-form\") + \"']\";\r\n if ($(formSelector).length > 0) {\r\n selectorString = selectorString + \", \" + formSelector;\r\n }\r\n\r\n $(\"form[data-role='\" + $(\"#\" + gridId).data(\"filter-form\") + \"']\").on(\"keypress keydown\",\r\n function (e) {\r\n if (e.keyCode === 13 && $(event.target).is(\"input[type='text']\")) {\r\n e.preventDefault();\r\n app.KendoGrids.GetResults(gridId);\r\n return false;\r\n }\r\n });\r\n\r\n $(\"[data-clear-form]\").on(\"click\",\r\n function (e) {\r\n $(\"form[data-role='\" + $(this).data(\"clear-form\") + \"']\").find(\"input[type=text], select, textarea\").val(\"\").prop('checked', false);\r\n\r\n });\r\n\r\n $(selectorString).on('click', 'button, a, input[type=checkbox]', function (e) {\r\n app.KendoGrids.SaveOptions(gridId);\r\n });\r\n\r\n $(\"[data-update-grid-id='\" + gridId + \"']\").on('click', function (e) {\r\n app.KendoGrids.GetResults($(this).data(\"update-grid-id\"));\r\n });\r\n\r\n\r\n //setup save listeners for menu in kendo\r\n\r\n },\r\n SaveOptions: function (gridId) {\r\n currentOptions = $(\"#\" + gridId).data(\"kendoGrid\").getOptions();\r\n currentOptions.dataSource.data = {};\r\n currentOptions.data = {};\r\n currentOptions.excel = {};\r\n options[gridId] = kendo.stringify(currentOptions);\r\n var encodedOptionsString = encodeURIComponent(kendo.stringify(currentOptions));\r\n var encodedFilterString = encodeURIComponent($(\"input:not([data-not-persistent]), select:not([data-not-persistent]), textarea:not([data-not-persistent]), radio:not([data-not-persistent])\", \"form[data-role='\" + $(\"#\" + gridId).data(\"filter-form\") + \"']\").serialize());\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: \"/PersistentState/Save\",\r\n data: \"Options=\" + encodedOptionsString + \"&GridIdSelector=\" + gridId + \"&Filter=\" + encodedFilterString,\r\n success: function (results) {\r\n var hello = true;\r\n },\r\n error: function (results) {\r\n }\r\n });\r\n },\r\n OptionsExist: function (gridId) {\r\n if (options[gridId] !== undefined) { return true; }\r\n return false;\r\n },\r\n LoadOptions: function (gridId, datasource) {\r\n var parsedOptions;\r\n if (app.KendoGrids.OptionsExist(gridId)) {\r\n //console.log(\"loaded\");\r\n parsedOptions = JSON.parse(options[gridId]);\r\n }\r\n else {\r\n parsedOptions = $(\"#\" + gridId).data(\"kendoGrid\").getOptions();\r\n options[gridId] = kendo.stringify(parsedOptions);\r\n }\r\n\r\n if (datasource !== null) {\r\n parsedOptions.dataSource.data = datasource.options.data;\r\n }\r\n\r\n //set export options\r\n if (parsedOptions.excel.length == undefined) {\r\n parsedOptions.excel = {\r\n proxyUrl: null,\r\n allPages: false,\r\n filterable:false,\r\n fileName: eval($(\"#\" + gridId).attr('data-file-name'))\r\n };\r\n }\r\n\r\n $(\"#\" + gridId).data(\"kendoGrid\").setOptions(parsedOptions);\r\n },\r\n GetResults: function (gridId) {\r\n var grid = $(\"#\" + gridId);\r\n kendo.ui.progress($(grid), true);\r\n $.ajax({\r\n type: 'POST',\r\n url: $(grid).data(\"url\"),\r\n data: $(\"form[data-role='\" + $(grid).data(\"filter-form\") + \"']\").serialize(),\r\n success: function (results) {\r\n var dataSource = new kendo.data.DataSource({ data: results });\r\n app.KendoGrids.LoadOptions(gridId, dataSource);\r\n kendo.ui.progress($(grid), false);\r\n if ($(\"#grdActivityLog\").length > 0 && gridId !=='grdActivityLog') {\r\n app.ActivityLog.GetActivityLogResults();\r\n }\r\n $(document).trigger(\"kendo-datasource-load-complete\", this);\r\n },\r\n error: function (results) {\r\n kendo.ui.progress($(grid), false);\r\n }\r\n });\r\n }\r\n\r\n };\r\n return myKendoGrids;\r\n}());\r\n\r\njQuery.fn.deserialize = function (data) {\r\n var f = this,\r\n map = {},\r\n find = function (selector) { return f.is(\"form\") ? f.find(selector) : f.filter(selector); };\r\n //Get map of values\r\n jQuery.each(data.split(\"&\"), function () {\r\n var nv = this.split(\"=\"),\r\n n = decodeURIComponent(nv[0]),\r\n v = nv.length > 1 ? decodeURIComponent(nv[1]) : null;\r\n if (!(n in map)) {\r\n map[n] = [];\r\n }\r\n map[n].push(v);\r\n });\r\n //Set values for all form elements in the data\r\n jQuery.each(map, function (n, v) {\r\n find(\"[name='\" + n + \"']\").val(v);\r\n });\r\n //Clear all form elements not in form data\r\n find(\"input:text:not([data-not-persistent]),select:not([data-not-persistent]),textarea:not([data-not-persistent])\").each(function () {\r\n if (!(jQuery(this).attr(\"name\") in map)) {\r\n jQuery(this).val(\"\");\r\n }\r\n });\r\n find(\"input:checkbox:checked:not([data-not-persistent]),input:radio:checked:not([data-not-persistent])\").each(function () {\r\n if (!(jQuery(this).attr(\"name\") in map)) {\r\n this.checked = false;\r\n }\r\n });\r\n return this;\r\n}","//*************************************************************************************\r\n//* Session specific code\r\n//*\r\n//* 6/13/18 Kraus [COM-136]: Created\r\n//*************************************************************************************\r\n\r\napp.Message = (function () {\r\n var myMessage = {\r\n Init: function () {\r\n $('#btnAlreadyUpdated').on('click', function () {\r\n var updateUrl = $(this).data('update-url');\r\n var button = $(this);\r\n $.ajax({\r\n type: 'POST',\r\n dataType: 'html',\r\n url: updateUrl,\r\n success: function (tmp) {\r\n $(button).closest('.card').fadeOut(500)\r\n },\r\n error: function (jqXHR, textStatus, errorThrown) {\r\n console.log('Error: ' + jqXHR + \", textStatus: \" + textStatus + \", errorThrown: \" + errorThrown);\r\n console.log(JSON.stringify(jqXHR));\r\n }\r\n });\r\n });\r\n\r\n $(document).on(\"click\", \"[data-close-card]\", function () {\r\n $(this).closest(\".card\").hide();\r\n });\r\n },\r\n };\r\n return myMessage;\r\n}());","//*************************************************************************************\r\n//* Session specific code\r\n//*\r\n//* 6/13/18 Kraus [COM-136]: Created\r\n//*************************************************************************************\r\n\r\napp.Prospective = (function () {\r\n var gridId = \"\";\r\n var myProspective = {\r\n Index: function (gridId) {\r\n app.Prospective.Init(gridId);\r\n },\r\n Init: function (grididname) {\r\n gridId = grididname;\r\n $(document).on('change', \"[data-role='response']\",\r\n function () {\r\n if ($(\"option:selected\", this).data(\"unique-id\") == \"prospective-member-response-accepted-committee\") {\r\n $('[data-role=\"assigned-seat\"]').show(500);\r\n } else {\r\n $('[data-role=\"assigned-seat\"]').hide();\r\n }\r\n if ($(\"option:selected\", this).data(\"unique-id\") == \"prospective-member-response-accepted-ballot\") {\r\n $('[data-role=\"assigned-ballot\"]').show(500);\r\n } else {\r\n $('[data-role=\"assigned-ballot\"]').hide();\r\n }\r\n });\r\n\r\n $(document).on('change', \"[data-role='election-selection']\", function () {\r\n app.Prospective.ToggleProspectiveMemberBallotSeatSelection(this);\r\n });\r\n $(document).on('click', \"[data-role='update-prospective-members']\",\r\n function () {\r\n app.Prospective.UpdateProspectiveMember(this, $(this).data('post-url'));\r\n });\r\n $(document).on('click', \"[data-role='add-prospective-members']\",\r\n function (e) {\r\n app.Prospective.EditProspectiveMemberDetails(e);\r\n });\r\n app.Prospective.InitProspectiveMemberHistory();\r\n $(document).on('click', \"[data-role='remove-prospective-members']\",\r\n function () {\r\n app.Prospective.RemoveProspectiveMember(this, $(this).data('post-url'));\r\n });\r\n app.Committee.InitAutoDateUpdate();\r\n app.Committee.InitSeatMemberFlags();\r\n },\r\n ToggleProspectiveMemberBallotSeatSelection: function (ddl) {\r\n if ($(\"option:selected\", ddl).data(\"is-seat-ballot\") == \"1\") {\r\n //seat selection! Update the other dropdown then show it\r\n var id = $(\"option:selected\", ddl).data(\"election-id\");\r\n $('[data-role=\"election-seat-selection\"]').find('option').hide();\r\n $('[data-role=\"election-seat-selection\"]').find('option[data-election-id=' + id + ']').show();\r\n $('[data-role=\"election-seat-selection\"]').closest('div').show();\r\n } else {\r\n //show all options of other list and hide it.\r\n $('[data-role=\"election-seat-selection\"]').find('option').hide();\r\n $('[data-role=\"election-seat-selection').closest('div').hide();\r\n }\r\n },\r\n EditProspectiveMemberDetails: function (e) {\r\n e.preventDefault();\r\n\r\n //show popup and loading first\r\n $('[data-role=\"edit-prospective-member-wrapper\"]').html('');\r\n $('[data-role=\"edit-prospective-member-wrapper\"]').addClass('popup-loading');\r\n $('#editProspectiveMemberModal').foundation('open');\r\n\r\n var ProspectiveMemberId = $(e.currentTarget).closest(\"tr\").find('td:hidden').first().text();\r\n\r\n if (ProspectiveMemberId === \"\") {\r\n ProspectiveMemberId = \"0\";\r\n }\r\n var button = $(e.currentTarget);\r\n $.ajax({\r\n type: 'POST',\r\n dataType: 'html',\r\n url: $(\"#\" + gridId).data(\"post-url\"),\r\n data: JSON.stringify({\r\n 'Id': $(button).data('id'),\r\n 'CommitteeId': $(button).data('committee-id')\r\n }),\r\n contentType: \"application/json; charset=utf-8\",\r\n success: function (partialViewResult) {\r\n $('[data-role=\"edit-prospective-member-wrapper\"]').html(partialViewResult);\r\n $('[data-role=\"edit-prospective-member-wrapper\"]').removeClass('popup-loading');\r\n app.input.initDatePicker($('[data-role=\"edit-prospective-member-wrapper\"]'));\r\n app.Prospective.ToggleProspectiveMemberBallotSeatSelection($(\"[data-role='election-selection']\"));\r\n //change drop down to filtered option if exists\r\n if ($('[data-role=\"prospective-dropdown-commitee-filter\"]').length) {\r\n $('[data-role=\"edit-prospective-committee-dropdown\"]', '[data-role=\"edit-prospective-member-wrapper\"]').val($('[data-role=\"prospective-dropdown-commitee-filter\"]').val());\r\n }\r\n },\r\n error: function (jqXHR, textStatus, errorThrown) {\r\n toastr.error('Error loading prospective member details.', 'Error');\r\n console.log('Error: ' + jqXHR + \", textStatus: \" + textStatus + \", errorThrown: \" + errorThrown);\r\n console.log(JSON.stringify(jqXHR));\r\n }\r\n });\r\n },\r\n UpdateProspectiveMember: function (button, url) {\r\n var form = $(button).closest('.reveal').find('form');\r\n $.validator.unobtrusive.parse(form);\r\n\r\n console.log(form.valid());\r\n if (form.valid()) {\r\n\r\n $.ajax({\r\n url: url,\r\n type: 'POST',\r\n data: form.serialize() + \"&netid=\" + $(button).closest('form').find('[data-role=\"netid\"]').val(),\r\n async: false,\r\n success: function (partialViewResult) {\r\n toastr.success('Prospective Member was saved successfully!', 'Save Successful');\r\n //getActivityLogResults();\r\n\r\n //update the grid to reflect an changes\r\n app.KendoGrids.GetResults(gridId);\r\n\r\n //close the popup.\r\n $('#editProspectiveMemberModal').foundation('close');\r\n },\r\n error: function (result) {\r\n toastr.error('There was an error while saving the prospective member.', 'Error');\r\n }\r\n });\r\n }\r\n else {\r\n //Give focus to the first error\r\n var firstError = $('#' + $('.field-validation-error', form).data('valmsg-for'));\r\n if (firstError.length) {\r\n $('html, body').animate({\r\n scrollTop: firstError.offset().top - 50\r\n }, 500);\r\n }\r\n }\r\n },\r\n RemoveProspectiveMember: function (button, url) {\r\n if (confirm(\"Are you sure you want to delete this Prospective Member?\")) {\r\n var memberId = $(button).closest('.reveal').find('form').find('[data-role=\"prospective-member-id\"]').val();\r\n\r\n if (memberId === \"\") {\r\n memberId = \"0\";\r\n }\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: url,\r\n data: JSON.stringify({\r\n 'Id': memberId,\r\n 'controllerId': app.page.id\r\n }),\r\n contentType: \"application/json; charset=utf-8\",\r\n success: function (partialViewResult) {\r\n $('#editProspectiveMemberModal').foundation('close');\r\n app.KendoGrids.GetResults(gridId);\r\n },\r\n error: function (jqXHR, textStatus, errorThrown) {\r\n toastr.error('Error loading seat member details.', 'Error');\r\n console.log('Error: ' + jqXHR + \", textStatus: \" + textStatus + \", errorThrown: \" + errorThrown);\r\n console.log(JSON.stringify(jqXHR));\r\n }\r\n });\r\n }\r\n },\r\n InitProspectiveMemberHistory: function () {\r\n $(\"#\" + gridId).kendoGrid({\r\n filterable: {\r\n extra: false,\r\n operators: {\r\n string: {\r\n startswith: \"Starts with\",\r\n eq: \"Is equal to\",\r\n neq: \"Is not equal to\"\r\n }\r\n }\r\n },\r\n toolbar: [\"excel\"],\r\n excel: {\r\n fileName: \"ProspectiveMembers.xlsx\"\r\n },\r\n columns: [{\r\n field: \"Id\",\r\n title: \"Id\",\r\n hidden: true\r\n },\r\n {\r\n field: \"CommitteeName\",\r\n title: \"Committee\",\r\n hidden: $(\"#\" + gridId).data('show-committee') ? false : true\r\n },\r\n {\r\n field: \"CommitteeSeatType\",\r\n title: \"Seat Type\"\r\n },\r\n {\r\n field: \"FirstName\",\r\n title: \"First Name\",\r\n template: \"#=FirstName#\"\r\n },\r\n {\r\n field: \"LastName\",\r\n title: \"Last Name\",\r\n template: \"#=LastName#\"\r\n },\r\n {\r\n field: \"Title\",\r\n title: \"Title\",\r\n hidden: true\r\n },\r\n {\r\n field: \"DepartmentName\",\r\n title: \"Department Name\",\r\n hidden: true\r\n },\r\n {\r\n field: \"Division\",\r\n title: \"Division\",\r\n hidden: true\r\n },\r\n {\r\n field: \"Department\",\r\n title: \"Department\",\r\n hidden: true\r\n },\r\n {\r\n field: \"Subdepartment\",\r\n title: \"Subdepartment\",\r\n hidden: true\r\n },\r\n {\r\n field: \"FacultyDivision\",\r\n title: \"Faculty Division\",\r\n hidden: true\r\n },\r\n {\r\n field: \"ReasonToAdd\",\r\n title: \"Reason Added\"\r\n },\r\n {\r\n field: \"AddedDate\",\r\n title: \"Date Added\",\r\n format: \"{0:M/d/yyyy}\"\r\n },\r\n {\r\n field: \"Notes\",\r\n title: \"Notes\"\r\n },\r\n {\r\n field: \"Response\",\r\n title: \"Response\"\r\n },\r\n {\r\n field: \"ResponseDate\",\r\n title: \"Response Date\",\r\n format: \"{0:M/d/yyyy}\"\r\n },\r\n {\r\n template: \"\"\r\n }],\r\n noRecords: true,\r\n scrollable: false,\r\n width: 100,\r\n sortable: true,\r\n columnMenu: true,\r\n groupable: {\r\n messages: {\r\n empty: \"Drop columns here to group by\"\r\n }\r\n },\r\n dataSource: {\r\n schema: {\r\n model: {\r\n fields: {\r\n AddedDate: { type: \"date\" },\r\n ResponseDate: { type: \"date\" }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n app.KendoGrids.InitPersistentGrid(gridId, true);\r\n $(\"#\" + gridId).on(\"click\", \"[data-role='edit-prospective-member']\", function (e) { app.Prospective.EditProspectiveMemberDetails(e); });\r\n }\r\n };\r\n return myProspective;\r\n}());","//*************************************************************************************\r\n//* Session specific code\r\n//*\r\n//* 6/13/18 Kraus [COM-136]: Created\r\n//*************************************************************************************\r\n\r\napp.Survey = (function () {\r\n var mySurvey = {\r\n Index: function () {\r\n $('[data-role=\"toggle-survey-dates\"]').on('click',\r\n function () {\r\n if ($(this).val() == \"True\") {\r\n $('[data-role=\"survey-date\"]').hide();\r\n $('[data-role=\"survey-date\"]').find('input[type=\"text\"]').val(\"\");\r\n } else {\r\n $('[data-role=\"survey-date\"]').show();\r\n }\r\n });\r\n\r\n $('[data-role=\"save-survey\"]').on('click',\r\n function () {\r\n if ($('input[name=\"AddSurvey.Name\"]').val() == '') {\r\n toastr.info(\"Please add a name.\", \"Data Validation Warning\");\r\n return;\r\n }\r\n\r\n $.ajax({\r\n url: $(this).data('url'),\r\n type: 'POST',\r\n data: $('#frmAddSurvey').serialize(),\r\n async: false,\r\n success: function (result) {\r\n if (result == \"Success\") {\r\n toastr.success(\"Survey saved successfully.\", \"Save Successful\");\r\n $('#frmAddSurvey').trigger(\"reset\");\r\n $('#pnlAddSurvey').hide();\r\n app.KendoGrids.GetResults('gridSurvey');\r\n } else {\r\n //Was an error\r\n toastr.error(\"There was an error saving your survey.\", \"Error!\");\r\n }\r\n },\r\n error: function (result) {\r\n toastr.error(\"There was an error saving your survey.\", \"Error!\");\r\n }\r\n });\r\n });\r\n\r\n\r\n $(\"#gridSurvey\").kendoGrid({\r\n columns: [{\r\n field: \"Id\",\r\n hidden: true\r\n },\r\n {\r\n field: \"Name\",\r\n title: \"Title\",\r\n width: \"300px\"\r\n },\r\n {\r\n field: \"SurveyStart\",\r\n title: \"Start\",\r\n format: \"{0:M/d/yyyy}\",\r\n width: \"75px\"\r\n\r\n },\r\n {\r\n field: \"SurveyEnd\",\r\n title: \"End\",\r\n format: \"{0:M/d/yyyy}\",\r\n width: \"75px\"\r\n\r\n },\r\n {\r\n field: \"Status\",\r\n title: \"Status\",\r\n width: \"75px\"\r\n },\r\n {\r\n field: \"SurveyedCount\",\r\n title: \"Surveyed Users\",\r\n width: \"75px\"\r\n },\r\n {\r\n template: \"Details\"\r\n }],\r\n data: {\r\n schema: {\r\n model: {\r\n fields: {\r\n SurveyStart: { type: \"date\" },\r\n SurveyEnd: { type: \"date\" }\r\n }\r\n }\r\n }\r\n },\r\n scrollable: false,\r\n sortable: true,\r\n groupable: {\r\n messages: {\r\n empty: \"Drop columns here to group by\"\r\n }\r\n }\r\n });\r\n app.KendoGrids.InitPersistentGrid(\"gridSurvey\", true);\r\n },\r\n Init: function () {\r\n $(document).on(\"click\", \"[data-role='toggle-survey-dates']\", function () {\r\n if ($(this).val() == \"True\") {\r\n $('[data-role=\"dates\"]').hide();\r\n $('[data-role=\"dates\"]').find('input[type=\"text\"]').val(\"\");\r\n } else {\r\n $('[data-role=\"dates\"]').show();\r\n }\r\n });\r\n mySurvey.AdjustCriteriaHeights();\r\n $(document).on(\"component-bind-edit-mode-complete-SurveyDetails\", function (e, component) {\r\n mySurvey.InitDurationRadioButtons();\r\n });\r\n\r\n $(\"div[id='divSurveyCommitteePartialView']\").on('click', \".fa-chevron-down\", function () {\r\n $(this).closest(\".row\").next(\".row\").slideDown(500);\r\n $(this).removeClass(\"fa-chevron-down\");\r\n $(this).addClass(\"fa-chevron-up\");\r\n });\r\n\r\n $(\"div[id='divSurveyCommitteePartialView']\").on('click', \".fa-chevron-up\", function () {\r\n $(this).closest(\".row\").next(\".row\").slideUp(500);\r\n $(this).removeClass(\"fa-chevron-up\");\r\n $(this).addClass(\"fa-chevron-down\");\r\n });\r\n\r\n $(\"#ddlPossibleCommittees\").on('click', function () {\r\n $(\"#ddlPossibleCommittees\").css('outline-color', '');\r\n });\r\n\r\n $(document).on(\"click\", 'button[name=\"btnRemove\"]', function () {\r\n if (confirm(\"Are you sure you want to remove '\" + $(this).closest('.committee').find('h5:first-child').text() + \"' from this survey?\")) {\r\n $.ajax({\r\n url: '/Survey/DeleteCommitteeSurvey',\r\n type: 'POST',\r\n data: JSON.stringify({\r\n 'CommitteeSurveyId': $(this).attr(\"value\"),\r\n 'SurveyId': $('#hdnSurveyId').val(),\r\n }),\r\n async: false,\r\n contentType: 'application/json; charset=utf-8',\r\n success: function (partialViewResult) {\r\n $(\"#divCommitteesPartial\").html(partialViewResult);\r\n },\r\n error: function (result) {\r\n toastr.error(\"There was an error removing the committee.\", \"Error!\")\r\n }\r\n });\r\n }\r\n });\r\n },\r\n InitDurationRadioButtons: function () {\r\n if ($(\"input[name='IsOngoing']:checked\").val() == \"True\") {\r\n $('[data-role=\"dates\"]').hide();\r\n $('[data-role=\"dates\"]').find('input[type=\"text\"]').val(\"\");\r\n } else {\r\n $('[data-role=\"dates\"]').show();\r\n }\r\n },\r\n AddCommitteeToSurvey: function AddCommitteeToSurvey(url) {\r\n if ($(\"#ddlPossibleCommittees\").val() != \"\") {\r\n $.ajax({\r\n url: url,\r\n type: 'POST',\r\n data: JSON.stringify({\r\n 'CommitteeId': $(\"#ddlPossibleCommittees\").val(),\r\n 'SurveyId': $(\"#hdnSurveyId\").val()\r\n }),\r\n async: false,\r\n contentType: 'application/json; charset=utf-8',\r\n success: function (partialViewResult) {\r\n $(\"#divCommitteesPartial\").html(partialViewResult);\r\n },\r\n error: function (result) {\r\n toastr.error(\"There was an error adding the committee.\", \"Error!\")\r\n }\r\n });\r\n }\r\n else {\r\n $(\"#ddlPossibleCommittees\").focus();\r\n $(\"#ddlPossibleCommittees\").css('outline-color', '#FF0000');\r\n }\r\n },\r\n AdjustCriteriaHeights: function AdjustCriteriaHeights() {\r\n var leftCriteria = $(\".eligible-partial .criteria\");\r\n var rightCriteria = $(\".ineligible-partial .criteria\");\r\n\r\n if (leftCriteria.length == rightCriteria.length) {\r\n for (var index = 0; index < leftCriteria.length; index++) {\r\n $(leftCriteria[index]).height(\"auto\");\r\n $(rightCriteria[index]).height(\"auto\");\r\n\r\n var height = Math.max($(leftCriteria[index]).css(\"height\").replace(/[^-\\d\\.]/g, ''), $(rightCriteria[index]).css(\"height\").replace(/[^-\\d\\.]/g, ''));\r\n $(leftCriteria[index]).height(height);\r\n $(rightCriteria[index]).height(height);\r\n }\r\n }\r\n }\r\n };\r\n return mySurvey;\r\n}());","//*************************************************************************************\r\n//* Session specific code\r\n//*\r\n//* 6/13/18 Kraus [COM-136]: Created\r\n//*************************************************************************************\r\n\r\napp.UserHome = (function () {\r\n var myUserHome = {\r\n Dashboard: function () {\r\n app.UserHome.InitPreviousCommitteeGrid();\r\n },\r\n InitPreviousCommitteeGrid: function () {\r\n $(\"#gridPreviousCommittee\").kendoGrid({\r\n columns: [\r\n {\r\n field: \"Name\",\r\n title: \"Title\",\r\n template: \"#=Name#\",\r\n width: \"300px\"\r\n },\r\n {\r\n field: \"Chair\",\r\n title: \"Chair\"\r\n },\r\n {\r\n field: \"Title\",\r\n title: \"Title\"\r\n },\r\n {\r\n field: \"DepartmentName\",\r\n title: \"Department Name\"\r\n },\r\n {\r\n field: \"Division\",\r\n title: \"Division\",\r\n hidden: true\r\n },\r\n {\r\n field: \"Department\",\r\n title: \"Department\",\r\n hidden: true\r\n },\r\n {\r\n field: \"Subdepartment\",\r\n title: \"Subdepartment\",\r\n hidden: true\r\n },\r\n {\r\n field: \"District\",\r\n title: \"District\",\r\n hidden: true\r\n },\r\n {\r\n field: \"ExpectedStart\",\r\n title: \"Exp. Start\",\r\n hidden: true,\r\n format: \"{0:M/d/yyyy}\"\r\n },\r\n {\r\n field: \"ExpectedEnd\",\r\n title: \"Exp. End\",\r\n format: \"{0:M/d/yyyy}\",\r\n hidden: true\r\n },\r\n {\r\n field: \"ActualStart\",\r\n title: \"Act. Start\",\r\n format: \"{0:M/d/yyyy}\"\r\n },\r\n {\r\n field: \"ActualEnd\",\r\n title: \"Act. End\",\r\n format: \"{0:M/d/yyyy}\"\r\n }],\r\n toolbar: [\"excel\"],\r\n excel: {\r\n fileName: \"CommitteeHistory\" + app.Committee.ConvertDate(new Date()) + \".xlsx\"\r\n },\r\n scrollable: false,\r\n noRecords: true,\r\n sortable: true,\r\n columnMenu: true,\r\n dataSource: {\r\n schema: {\r\n model: {\r\n fields: {\r\n ActualEnd: { type: \"date\" },\r\n ExpectedEnd: { type: \"date\" },\r\n ExpectedStart: { type: \"date\" },\r\n ActualStart: { type: \"date\" }\r\n }\r\n }\r\n }\r\n },\r\n groupable: {\r\n messages: {\r\n empty: \"Drop columns here to group by\",\r\n noRecords: \"They has never had the pleasure of being on a committee.\"\r\n }\r\n }\r\n });\r\n app.KendoGrids.InitPersistentGrid(\"gridPreviousCommittee\", true);\r\n },\r\n InitPreviousElectionGrid: function () {\r\n $(\"#gridPreviousElections\").kendoGrid({\r\n columns: [\r\n {\r\n field: \"ElectionTitle\",\r\n title: \"Election Title\"\r\n },\r\n {\r\n field: \"Committee\",\r\n title: \"Comittee\"\r\n },\r\n {\r\n field: \"CandidateStatus\",\r\n title: \"Candidate Status\"\r\n },\r\n {\r\n field: \"Outcome\",\r\n title: \"Election Outcome\"\r\n },\r\n {\r\n field: \"ExpectedStart\",\r\n title: \"Exp. Start\",\r\n format: \"{0:M/d/yyyy}\"\r\n },\r\n {\r\n field: \"ExpectedEnd\",\r\n title: \"Exp. End\",\r\n format: \"{0:M/d/yyyy}\"\r\n }],\r\n toolbar: [\"excel\"],\r\n excel: {\r\n fileName: \"ElectionHistory\" + app.Committee.ConvertDate(new Date()) + \".xlsx\"\r\n },\r\n scrollable: false,\r\n noRecords: true,\r\n sortable: true,\r\n columnMenu: true,\r\n messages: {\r\n noRecords: \"No election records found.\"\r\n },\r\n dataSource: {\r\n schema: {\r\n model: {\r\n fields: {\r\n ExpectedEnd: { type: \"date\" },\r\n ExpectedStart: { type: \"date\" }\r\n }\r\n }\r\n }\r\n },\r\n groupable: {\r\n messages: {\r\n empty: \"Drop columns here to group by\"\r\n }\r\n }\r\n });\r\n app.KendoGrids.InitPersistentGrid(\"gridPreviousElections\", true);\r\n }\r\n };\r\n return myUserHome;\r\n}());","//*************************************************************************************\r\n//* WaMS Component Framework - app.vis.js\r\n//* Version 0.1\r\n//* Author: Damian Koch\r\n//* Component framework visualization plugin\r\n//* Requires d3, jQuery, WaMS Component Framework\r\n//* \r\n//* This component utilizes d3 to render data visualizations to the page.\r\n//* \r\n//* 04/11 DBK created\r\n//* 05/10 DBK updated key to highlight matching elements on hover\r\n//*************************************************************************************\r\napp.Vis = (function () {\r\n var myVis = {\r\n Visualization: function () {\r\n this.handleUpdateSettings = function (e) {\r\n var target = $(e.target);\r\n var name = target.data('update-setting-type');\r\n var option = {};\r\n if (target.is(\"select\")) {\r\n option[name] = target.val();\r\n } else {\r\n option[name] = target.data('update-setting-value');\r\n $('[data-role=\"update-setting-click\"][data-target=\"' + target.data('target') + '\"][data-update-setting-type=\"' + target.data('update-setting-type') + '\"]').removeClass('active');\r\n target.addClass('active');\r\n }\r\n\r\n this.options = $.extend({}, this.options, option);\r\n this.update();\r\n };\r\n this.updateDataSource = function (init, processingFunction) {\r\n var path = this.options.sourceRelative ? app.page.appPath + this.options.sourcePath : this.options.sourcePath;\r\n var dataLoadFunction = this.options.sourceType === \"json\" ? d3.json : d3.csv;\r\n var renderFunction = init ? this.render.bind(this) : this.updateData.bind(this);\r\n\r\n if (processingFunction == null) {\r\n dataLoadFunction(path, renderFunction);\r\n }\r\n else {\r\n dataLoadFunction(path, processingFunction, renderFunction);\r\n }\r\n\r\n //if (this.options.sourceType === \"json\") {\r\n // if (init) {\r\n // d3.json(path, this.render.bind(this));\r\n // } else {\r\n // d3.json(path, this.updateData.bind(this));\r\n // }\r\n //} else {\r\n // if (init) {\r\n // d3.csv(path, this.render.bind(this));\r\n // } else {\r\n // d3.csv(path, this.updateData.bind(this));\r\n // }\r\n //}\r\n };\r\n this.update = function () {\r\n this.data = this.allData;\r\n this.updateScales();\r\n this.drawData();\r\n };\r\n this.updateData = function (data) {\r\n this.allData = data;\r\n this.update();\r\n };\r\n\r\n $('[data-target=\"' + this.options.name + '\"][data-role=\"update-setting-click\"]').on('click', $.proxy(this.handleUpdateSettings, this));\r\n $('[data-target=\"' + this.options.name + '\"][data-role=\"update-setting-change\"]').on('change', $.proxy(this.handleUpdateSettings, this));\r\n\r\n this.data = null;\r\n this.allData = null;\r\n this.baseVis = null;\r\n this.body = null;\r\n this.dataSet = null;\r\n this.processingFunction = this.options.processingFunction;\r\n //original\r\n //this.color = d3.scaleOrdinal().range([\"#525c72\", \"#21ce03\", \"#fe3302\", \"#fa46ff\", \"#876d0d\", \"#a24568\", \"#159bfc\", \"#14926d\", \"#9149f8\", \"#fd5a93\", \"#85706a\", \"#ad4d1e\", \"#4a8b00\", \"#a96bb1\", \"#04859b\", \"#4d6643\", \"#e2770f\", \"#4567c6\", \"#d517a9\", \"#76527b\", \"#c310f3\", \"#d5324b\", \"#7c78a9\", \"#657b79\", \"#7d80fd\", \"#949401\", \"#b46965\", \"#017065\", \"#6f864d\", \"#805432\", \"#12ad4b\", \"#b86dfd\", \"#b0743b\", \"#c66495\", \"#eb6555\", \"#5c5c59\", \"#0e7b3a\", \"#7b5057\", \"#5785b7\", \"#a14297\", \"#986782\", \"#884eaf\"]);\r\n //theme1\r\n //this.color = d3.scaleOrdinal().range([\"#A31D35\", \"#FABA27\", \"#F28D2C\", \"#ECDEAD\", \"#909191\", \"#516E7B\", \"#6A8F68\", \"#C2072E\", \"#DE6379\", \"#FFD679\", \"#FFBD7E\", \"#EC5374\", \"#C03951\", \"#FFCA50\", \"#FFA855\", \"#728892\", \"#8FAC8D\", \"#E1274F\", \"#84071D\", \"#D59606\", \"#CD6A0C\", \"#C8B677\", \"#747777\", \"#385967\", \"#4D744B\", \"#9E0022\", \"#5C0010\", \"#A87500\", \"#A24F00\", \"#A6924A\", \"#5A5F5F\", \"#224453\", \"#2E552C\", \"#78001A\"]);\r\n //theme1 minus dark\r\n //this.color = d3.scaleOrdinal().range([\"#FABA27\", \"#F28D2C\", \"#ECDEAD\", \"#909191\", \"#516E7B\", \"#6A8F68\", \"#DE6379\", \"#FFD679\", \"#FFBD7E\", \"#EC5374\", \"#C03951\", \"#FFCA50\", \"#FFA855\", \"#728892\", \"#8FAC8D\", \"#E1274F\", \"#84071D\", \"#D59606\", \"#CD6A0C\", \"#C8B677\", \"#747777\", \"#385967\", \"#4D744B\", \"#9E0022\", \"#5C0010\", \"#A87500\", \"#A24F00\", \"#A6924A\", \"#5A5F5F\", \"#224453\", \"#2E552C\", \"#78001A\"]);\r\n //theme with blue\r\n this.color = d3.scaleOrdinal().range([\"#178BCA\", \"#FABA27\", \"#6A8F68\", \"#F28D2C\", \"#516E7B\", \"#ECDEAD\", \"#909191\", \"#DE6379\", \"#63B1DB\", \"#FFD679\", \"#FFBD7E\", \"#EC5374\", \"#C03951\", \"#3B9DD1\", \"#FFCA50\", \"#8FAC8D\", \"#FFA855\", \"#728892\", \"#E1274F\", \"#84071D\", \"#0675B0\", \"#D59606\", \"#4D744B\", \"#CD6A0C\", \"#385967\", \"#C8B677\", \"#747777\", \"#9E0022\", \"#5C0010\", \"#178BCA\", \"#A87500\", \"#2E552C\", \"#A24F00\", \"#224453\", \"#A6924A\", \"#5A5F5F\", \"#78001A\"]);\r\n //this.color = d3.scaleOrdinal().range([\"#DE6379\", \"#178BCA\", \"#D59606\", \"#6A8F68\", \"#F28D2C\", \"#516E7B\", \"#ECDEAD\", \"#909191\", \"#C03951\", \"#63B1DB\", \"#FFCC59\", \"#8FAC8D\", \"#FFBD7E\", \"#768D97\", \"#C8B677\", \"#757878\", \"#EC5374\", \"#84071D\", \"#3B9DD1\", \"#F6B82A\", \"#6B9A69\", \"#FFA855\", \"#728892\", \"#A7934D\", \"#5B5F5F\", \"#E1274F\", \"#7E061B\", \"#0675B0\", \"#AD7900\", \"#4D744B\", \"#CD6A0C\", \"#385967\", \"#A6924A\", \"#424646\", \"#9E0022\", \"#5C0010\", \"#178BCA\", \"#845C00\", \"#2E552C\", \"#A24F00\", \"#224453\", \"#89742C\", \"#252A2A\", \"#78001A\"]);\r\n var el = $(this.options.visSelector);\r\n el.addClass(\"vis-loading\");\r\n\r\n var visWidth = el.width() - (this.options.margins.left + this.options.margins.right);\r\n\r\n this.visDimensions = { height: this.options.visHeight, width: visWidth, margins: this.options.margins };\r\n\r\n this.updateDataSource(true, this.processingFunction);\r\n }\r\n };\r\n\r\n return myVis;\r\n}());\r\n\r\napp.Vis.Scatter = (function () {\r\n var myVis = function (options) {\r\n this.options = {\r\n name: \"scatter\", keySelector: \"\", tooltipSelector: \"\", visSelector: \"\", visHeight: 450, margins: { top: 20, right: 20, bottom: 50, left: 60 },\r\n fieldNames: { key: \"key\", x: \"x\", y: \"y\", r: \"r\", filter1: \"filter1\" },\r\n keyHeight: 0, keyMargins: { top: 0, right: 0, bottom: 0, left: 0 }, xAxisLabel: \"X Axis\", yAxisLabel: \"Y Axis\", excludedCategories: [], highlightedCategory: ''\r\n };\r\n this.options = $.extend({}, this.options, options);\r\n\r\n app.Vis.Visualization.call(this);\r\n\r\n this.elements = { zeroLine: null }\r\n\r\n this.xScale = d3.scaleLinear().range([0, this.visDimensions.width]);\r\n this.yScale = d3.scaleLinear().range([0, this.visDimensions.height]);\r\n this.yScaleReverse = d3.scaleLinear().range([0, this.visDimensions.height]);\r\n this.rScale = d3.scaleSqrt().range([3, 80]);\r\n this.xAxis = d3.axisBottom(this.xScale).tickSize(5);\r\n this.yAxis = d3.axisLeft(this.yScaleReverse);\r\n if (app.page.isPageSmall() || app.page.isPageMedium()) {\r\n this.xAxis.ticks(5);\r\n } \r\n }\r\n\r\n myVis.prototype.filter = function (fieldName, value) { \r\n return this.data = this.data.filter(function (d) { return (d[fieldName] === value.toString()); });\r\n }; \r\n myVis.prototype.filterCategories = function (excludedCategories) {\r\n var keyName = this.options.fieldNames.key;\r\n return this.data = this.data.filter(function (d) { return (excludedCategories.indexOf(d[keyName])) === -1; });\r\n };\r\n myVis.prototype.hideDetails = function () {\r\n d3.select(this.options.tooltipSelector).classed('hidden', true);\r\n this.body.selectAll(\".point\").selectAll(\"circle\").attr(\"opacity\", 0.85);\r\n this.body.select(\".crosshairs\").remove();\r\n };\r\n myVis.prototype.showDetails = function (pointData, index, element) {\r\n var box = {\r\n x: Math.round(this.xScale(pointData[this.options.fieldNames.x])) + this.visDimensions.margins.left + $(this.options.visSelector).offset().left,\r\n y: Math.round(this.yScaleReverse(pointData[this.options.fieldNames.y])) - (this.visDimensions.margins.top + this.rScale(pointData[this.options.fieldNames.r])) + $(this.options.visSelector).offset().top\r\n };\r\n\r\n var msg = this.getTooltip(pointData);\r\n\r\n d3.select(this.options.tooltipSelector).classed('hidden', false);\r\n d3.select(this.options.tooltipSelector + ' .content').html(msg);\r\n d3.select(this.options.tooltipSelector).style('left', \"\" + (box.x - 150) + \"px\").style('top', \"\" + (box.y - $(this.options.tooltipSelector).height()) + \"px\");\r\n\r\n this.body.selectAll(\".point circle\").attr(\"opacity\", 0.3);\r\n d3.select(element).select(\"circle\").attr(\"opacity\", 1.0);\r\n\r\n var crosshairs = this.body.insert(\"g\", \"#dataSet-\"+this.options.name).attr(\"class\", \"crosshairs\");\r\n crosshairs.append(\"line\").attr(\"class\", \"vis-crosshair\").attr(\"x1\", 0 + 3).attr(\"x2\", this.xScale(pointData[this.options.fieldNames.x]) - this.rScale(pointData[this.options.fieldNames.r])).attr(\"y1\", this.yScale(pointData[this.options.fieldNames.y])).attr(\"y2\", this.yScale(pointData[this.options.fieldNames.y])).attr(\"stroke-width\", 1);\r\n crosshairs.append(\"line\").attr(\"class\", \"vis-crosshair\").attr(\"x1\", this.xScale(pointData[this.options.fieldNames.x])).attr(\"x2\", this.xScale(pointData[this.options.fieldNames.x])).attr(\"y1\", 0 + 3).attr(\"y2\", this.yScale(pointData[this.options.fieldNames.y]) - this.rScale(pointData[this.options.fieldNames.r])).attr(\"stroke-width\", 1);\r\n };\r\n myVis.prototype.render = function (sourceData) {\r\n this.allData = sourceData;\r\n\r\n this.baseVis = d3.select(this.options.visSelector).append(\"svg\").attr(\"width\", this.visDimensions.width + this.visDimensions.margins.left + this.visDimensions.margins.right).attr(\"height\", this.visDimensions.height + this.visDimensions.margins.top + this.visDimensions.margins.bottom);\r\n this.baseVis.append(\"g\").attr(\"class\", \"xAxis-\"+this.options.name).attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",\" + (this.visDimensions.height + this.visDimensions.margins.top) + \")\").call(this.xAxis);\r\n this.baseVis.append(\"text\").attr(\"x\", this.visDimensions.width / 2).attr(\"y\", this.visDimensions.height + (this.visDimensions.margins.top + this.visDimensions.margins.bottom) - 10).attr(\"text-anchor\", \"middle\").attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",0)\").text(this.options.xAxisLabel);\r\n this.baseVis.append(\"g\").attr(\"class\", \"yAxis-\"+this.options.name).attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",\" + this.visDimensions.margins.top + \")\").call(this.yAxis);\r\n\r\n var vis = this.baseVis.append(\"g\").attr(\"transform\", \"translate(\" + 0 + \",\" + (this.visDimensions.height + (this.visDimensions.margins.top + this.visDimensions.margins.bottom)) + \")scale(1,-1)\");\r\n vis.append(\"text\").attr(\"x\", this.visDimensions.height / 2).attr(\"y\", 20).attr(\"text-anchor\", \"middle\").attr(\"transform\", \"rotate(270)scale(-1,1)translate(\" + this.visDimensions.margins.bottom + \",0)\").text(this.options.yAxisLabel);\r\n\r\n this.body = vis.append(\"g\").attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",\" + this.visDimensions.margins.bottom + \")\");\r\n this.elements.zeroLine = this.body.append(\"line\").attr(\"x1\", this.xScale(0)).attr(\"x2\", this.xScale(0)).attr(\"y1\", 0 + 5).attr(\"y2\", this.visDimensions.height - 5).attr(\"stroke\", \"#c8c8c8\").attr(\"stroke-width\", 1).attr(\"stroke-dasharray\", \"5\"); \r\n this.dataSet = this.body.append(\"g\").attr(\"id\", \"dataSet-\"+this.options.name);\r\n\r\n this.update();\r\n this.renderKey();\r\n $(this.options.visSelector).removeClass(\"vis-loading\");\r\n };\r\n myVis.prototype.renderKey = function() {\r\n var categories = {};\r\n var vis = this;\r\n var keyHeight = 30;\r\n var columns = [this.options.keySelector];\r\n\r\n if ($(this.options.keySelector2).length) {\r\n columns.push(this.options.keySelector2);\r\n if ($(this.options.keySelector3).length) {\r\n columns.push(this.options.keySelector3);\r\n }\r\n }\r\n\r\n this.allData.forEach(function (d) { return categories[d[vis.options.fieldNames.key]] = 1; });\r\n\r\n var totalCategories = d3.keys(categories).length;\r\n var keyDimensions = { height: (Math.ceil(totalCategories / columns.length) * keyHeight), width: $(this.options.keySelector).width(), margins: this.options.keyMargins };\r\n var key;\r\n var keyGroup;\r\n\r\n for (var i = 0; i < columns.length; i++) {\r\n if (columns.hasOwnProperty(i)) {\r\n key = d3.select(columns[i]).append(\"svg\").attr(\"width\", keyDimensions.width).attr(\"height\", keyDimensions.height + keyDimensions.margins.bottom + keyDimensions.margins.top);\r\n key = key.append(\"g\").attr(\"transform\", \"translate(\" + keyDimensions.margins.left + \",\" + keyDimensions.margins.top + \")\");\r\n\r\n keyGroup = key.selectAll(\".key-group\").data(d3.keys(categories).slice(i * Math.ceil(totalCategories / columns.length), (i + 1) * Math.ceil(totalCategories / columns.length))).enter().append(\"g\").attr(\"class\", \"key-group\").attr(\"transform\", function (d, i) { return \"translate(0,\" + (i * keyHeight % keyDimensions.height) + \")\"; });\r\n keyGroup.append(\"rect\").attr(\"width\", keyDimensions.width).attr(\"height\", 25).attr(\"fill\", function (d) { return vis.color(d); }).attr(\"linegroup-block\", function (d) { return d; });\r\n keyGroup.append(\"text\").attr(\"class\", \"key-text\").attr(\"dy\", 18).attr(\"dx\", 6).text(function (d) { return d; });\r\n keyGroup.append(\"rect\").attr(\"width\", keyDimensions.width).attr(\"height\", 25).attr(\"linegroup\", function (d) { return d; }).attr(\"columngroup\", columns[i]).attr(\"opacity\", 0)\r\n .on('click', function () { return vis.handleCategoryToggle(this); })\r\n .on(\"mouseover\", function () { return vis.handleCategoryHover(this); })\r\n .on(\"mouseout\", function () { return vis.handleCategoryHoverEnd(this); });\r\n }\r\n }\r\n };\r\n myVis.prototype.handleCategoryHover = function (element) {\r\n var lineGroup = d3.select(element).attr(\"linegroup\");\r\n if (this.options.excludedCategories.indexOf(lineGroup) === -1) {\r\n this.options.highlightedCategory = lineGroup;\r\n this.update();\r\n }\r\n };\r\n myVis.prototype.handleCategoryHoverEnd = function (element) {\r\n this.options.highlightedCategory = '';\r\n this.update();\r\n };\r\n myVis.prototype.handleCategoryToggle = function (element) {\r\n var lineGroup = d3.select(element).attr(\"linegroup\");\r\n var columnGroup = d3.select(element).attr(\"columngroup\");\r\n var index = this.options.excludedCategories.indexOf(lineGroup);\r\n var el = d3.select(columnGroup).selectAll(\"[linegroup-block='\" + lineGroup + \"']\");\r\n\r\n if (index === -1) {\r\n el.attr(\"opacity\", 0);\r\n this.options.highlightedCategory = '';\r\n this.options.excludedCategories.push(lineGroup);\r\n } else {\r\n el.attr(\"opacity\", 1.0);\r\n this.options.highlightedCategory = lineGroup;\r\n this.options.excludedCategories.splice(index, 1);\r\n }\r\n\r\n this.update();\r\n };\r\n myVis.prototype.drawData = function() {\r\n var points = this.dataSet.selectAll(\".point\").data(this.data, function (d) { return d.Id; });\r\n var t = d3.transition().duration(1000).ease(d3.easeLinear);\r\n var myVis = this;\r\n\r\n if (this.data.length) {\r\n this.baseVis.transition(t).select(\".xAxis-\"+this.options.name).call(this.xAxis);\r\n this.elements.zeroLine.transition(t).attr(\"x1\", this.xScale(0)).attr(\"x2\", this.xScale(0));\r\n this.baseVis.transition(t).select(\".yAxis-\"+this.options.name).call(this.yAxis);\r\n\r\n points.enter()\r\n .append(\"g\")\r\n .attr(\"class\", \"point\")\r\n .on(\"mouseover\", function (d, i) { return myVis.showDetails(d, i, this); })\r\n .on(\"mouseout\", $.proxy(myVis.hideDetails, this))\r\n .append(\"circle\")\r\n .attr(\"fill\", function (d) { return myVis.color(d[myVis.options.fieldNames.key]); })\r\n .attr(\"stroke\", function (d) { return d3.hsl(myVis.color(d[myVis.options.fieldNames.key])).darker(); })\r\n .attr(\"stroke-width\", 1)\r\n .attr(\"r\", function (d) { return myVis.rScale(parseFloat(d[myVis.options.fieldNames.r])); })\r\n .transition(t)\r\n .attr(\"transform\", function (d) { return \"translate(\" + (myVis.xScale(d[myVis.options.fieldNames.x])) + \",\" + (myVis.yScale(d[myVis.options.fieldNames.y])) + \")\"; });\r\n\r\n points.selectAll(\"circle\")\r\n .attr(\"opacity\", function(d, i) {\r\n return myVis.options.highlightedCategory === '' ? .85 : (d[myVis.options.fieldNames.key] === myVis.options.highlightedCategory) ? 1 : .1;\r\n })\r\n .transition(t)\r\n .attr(\"transform\", function (d) { return \"translate(\" + (myVis.xScale(d[myVis.options.fieldNames.x])) + \",\" + (myVis.yScale(d[myVis.options.fieldNames.y])) + \")\"; })\r\n .attr(\"r\", function (d) { return myVis.rScale(parseFloat(d[myVis.options.fieldNames.r])); });\r\n }\r\n\r\n points.exit().selectAll(\"circle\").transition(t).attr(\"r\", 0).attr(\"transform\", function (d) { return \"translate(\" + 0 + \",\" + 0 + \")\"; });\r\n };\r\n myVis.prototype.updateScales = function () {\r\n var myVis = this;\r\n\r\n var xRange = d3.extent(this.data, function (d) { return parseFloat(d[myVis.options.fieldNames.x]); });\r\n var yRange = d3.extent(this.data, function (d) { return parseFloat(d[myVis.options.fieldNames.y]); });\r\n var rRange = d3.extent(this.data, function (d) { return parseFloat(d[myVis.options.fieldNames.r]) });\r\n\r\n var x = { padding: { minimum: 1, actual: 0 }, minimum: Math.min(xRange[0], 0), maximum: xRange[1] };\r\n var y = { padding: { minimum: 3, actual: 0 }, minimum: yRange[0], maximum: yRange[1] };\r\n var r = { padding: { minimum: 10, actual: 0 }, minimum: rRange[0], maximum: rRange[1] };\r\n\r\n r.minimum = Math.max(r.minimum - r.padding.actual, 0);\r\n r.maximum = Math.min(r.maximum + r.padding.actual, 100);\r\n this.rScale = this.rScale.domain([rRange[0], rRange[1]]);\r\n\r\n x.padding.actual = Math.max(parseInt(Math.abs(x.maximum - x.minimum) / 12), x.padding.minimum);\r\n this.xScale.domain([x.minimum - x.padding.actual, x.maximum + x.padding.actual]);\r\n if (this.options.xAxisFormat === \"money\") {\r\n this.xAxis.tickFormat(function(d) { return app.page.getFormattedNumber(d, \"$\"); });\r\n }\r\n\r\n y.padding.actual = Math.max(parseInt(Math.abs(y.maximum - y.minimum) / 5), y.padding.minimum);\r\n y.minimum = Math.max(\r\n //y.minimum - y.padding.actual\r\n 0\r\n , 0);\r\n y.maximum = Math.min(y.maximum + y.padding.actual);\r\n this.yScale.domain([y.minimum, y.maximum]);\r\n this.yScaleReverse.domain([y.maximum, y.minimum]);\r\n };\r\n myVis.prototype.getTooltip = function() {};\r\n\r\n return myVis;\r\n}());\r\napp.Vis.LineGraph = (function () {\r\n var myVis = function (options) {\r\n this.options = {\r\n name: \"linegraph\", keySelector: \"\", moreDetails: false, xDateScale: false, tooltipSelector: \"\", visSelector: \"\", visHeight: 450, margins: { top: 20, right: 30, bottom: 50, left: 60 },\r\n fieldNames: { key: \"key\", x: \"x\", y: \"y\", filter1: \"filter1\" },\r\n keyHeight: 0, keyMargins: { top: 10, right: 10, bottom: 10, left: 15 }, xAxisLabel: \"X Axis\", yAxisLabel: \"Y Axis\", excludedCategories: [], highlightedCategory: ''\r\n };\r\n this.options = $.extend({}, this.options, options);\r\n\r\n app.Vis.Visualization.call(this);\r\n\r\n this.elements = { hoverContainer: null };\r\n this.lineData = null;\r\n this.lines = null;\r\n\r\n this.xScale = (this.options.xDateScale) ? d3.scaleTime().range([0, this.visDimensions.width]) : d3.scaleLinear().range([0, this.visDimensions.width]);\r\n this.yScale = d3.scaleLinear().range([0, this.visDimensions.height]);\r\n this.yScaleReverse = d3.scaleLinear().range([0, this.visDimensions.height]);\r\n this.xAxis = d3.axisBottom(this.xScale).tickSize(5);\r\n this.yAxis = d3.axisLeft(this.yScaleReverse);\r\n }\r\n\r\n myVis.prototype.filter = function (fieldName, value) { \r\n return this.data = this.data.filter(function (d) { return (d[fieldName] === value.toString()); });\r\n }; \r\n myVis.prototype.filterCategories = function (excludedCategories) {\r\n var keyName = this.options.fieldNames.key;\r\n return this.data = this.data.filter(function (d) { return (excludedCategories.indexOf(d[keyName])) === -1; });\r\n };\r\n myVis.prototype.handleMouseMove = function () {\r\n // mouse moving over canvas\r\n var myVis = this;\r\n var xPosition = d3.mouse(this.baseVis.node())[0] - this.visDimensions.margins.left;\r\n var lines = document.getElementsByClassName('line');\r\n var bisect = d3.bisector(function(d) { return d[myVis.options.fieldNames.x]; }).left;\r\n var x0 = myVis.xScale.invert(xPosition);\r\n\r\n d3.selectAll(\".mouse-per-line-\"+this.options.name).attr(\"transform\", function (d, i) {\r\n if (i >= lines.length) {\r\n d3.select(this).select('circle').attr('opacity', 0);\r\n d3.select(this).select('text').attr('opacity', 0);\r\n return \"translate(0,0)\";\r\n }\r\n\r\n var beginning = 0;\r\n var end = lines[i].getTotalLength();\r\n var target;\r\n\r\n while (true) {\r\n target = Math.floor((beginning + end) / 2);\r\n var pos = lines[i].getPointAtLength(target);\r\n\r\n if ((target === end || target === beginning) && pos.x !== xPosition) { break; }\r\n\r\n if (pos.x > xPosition) end = target;\r\n else if (pos.x < xPosition) beginning = target;\r\n else break;\r\n }\r\n \r\n var b = bisect(d.values, x0);\r\n var v = x0 - d.values[Math.max(b - 1, 0)][myVis.options.fieldNames.x] >= 1 ? d.values[Math.min(b, d.values.length - 1)][myVis.options.fieldNames.y] : d.values[Math.max(b - 1, 0)][myVis.options.fieldNames.y];\r\n\r\n d3.select(this).select('circle').style(\"stroke\", myVis.color(d.key));\r\n d3.select(this).select('text').text(v);\r\n\r\n return \"translate(\" + (pos.x + myVis.visDimensions.margins.left) + \",\" + Math.abs(pos.y - (myVis.visDimensions.height + myVis.visDimensions.margins.top)) + \")\";\r\n });\r\n };\r\n myVis.prototype.handleMouseOut = function () {\r\n d3.select(\".mouse-line-\"+this.options.name).style(\"opacity\", \"0\");\r\n d3.selectAll(\".mouse-per-line-\"+this.options.name+\" circle\").style(\"opacity\", \"0\");\r\n d3.selectAll(\".mouse-per-line-\"+this.options.name+\" text\").style(\"opacity\", \"0\");\r\n };\r\n myVis.prototype.handleMouseOver = function () {\r\n d3.select(\".mouse-line-\"+this.options.name).style(\"opacity\", \"1\");\r\n d3.selectAll(\".mouse-per-line-\"+this.options.name+\" circle\").style(\"opacity\", \"1\");\r\n d3.selectAll(\".mouse-per-line-\"+this.options.name+\" text\").style(\"opacity\", \"1\");\r\n };\r\n myVis.prototype.render = function (sourceData) {\r\n var myVis = this;\r\n this.allData = sourceData;\r\n\r\n this.baseVis = d3.select(this.options.visSelector).append(\"svg\").attr(\"width\", this.visDimensions.width + this.visDimensions.margins.left + this.visDimensions.margins.right).attr(\"height\", this.visDimensions.height + this.visDimensions.margins.top + this.visDimensions.margins.bottom);\r\n this.baseVis.append(\"g\").attr(\"class\", \"xAxis-\"+this.options.name).attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",\" + (this.visDimensions.height + this.visDimensions.margins.top) + \")\").call(this.xAxis);\r\n this.baseVis.append(\"text\").attr(\"x\", this.visDimensions.width / 2).attr(\"y\", this.visDimensions.height + (this.visDimensions.margins.top + this.visDimensions.margins.bottom) - 10).attr(\"text-anchor\", \"middle\").attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",0)\").text(this.options.xAxisLabel);\r\n this.baseVis.append(\"g\").attr(\"class\", \"yAxis-\"+this.options.name).attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",\" + this.visDimensions.margins.top + \")\").call(this.yAxis);\r\n\r\n var vis = this.baseVis.append(\"g\").attr(\"transform\", \"translate(\" + 0 + \",\" + (this.visDimensions.height + (this.visDimensions.margins.top + this.visDimensions.margins.bottom)) + \")scale(1,-1)\");\r\n vis.append(\"text\").attr(\"x\", this.visDimensions.height / 2).attr(\"y\", 20).attr(\"text-anchor\", \"middle\").attr(\"transform\", \"rotate(270)scale(-1,1)translate(\" + this.visDimensions.margins.bottom + \",0)\").text(this.options.yAxisLabel);\r\n\r\n this.body = vis.append(\"g\").attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",\" + this.visDimensions.margins.bottom + \")\");\r\n\r\n if (this.options.moreDetails) {\r\n this.elements.hoverContainer = this.baseVis.append(\"g\").attr(\"class\", \"mouse-over-effects\");\r\n\r\n this.baseVis.attr('pointer-events', 'all')\r\n .on('mouseout', function () { return myVis.handleMouseOut(this); })\r\n .on('mouseover', function () { return myVis.handleMouseOver(this); })\r\n .on('mousemove', function () { return myVis.handleMouseMove(this); });\r\n }\r\n\r\n this.dataSet = this.body.append(\"g\").attr(\"id\", \"dataSet\");\r\n\r\n this.update();\r\n this.renderKey();\r\n $(this.options.visSelector).removeClass(\"vis-loading\");\r\n };\r\n myVis.prototype.renderKey = function () {\r\n var keyName = this.options.fieldNames.key;\r\n var categories = {};\r\n var vis = this;\r\n var keyHeight = 30;\r\n var columns = [this.options.keySelector];\r\n\r\n if ($(this.options.keySelector2).length) {\r\n columns.push(this.options.keySelector2);\r\n if ($(this.options.keySelector3).length) {\r\n columns.push(this.options.keySelector3);\r\n }\r\n }\r\n\r\n this.allData.forEach(function (d) { return categories[d[keyName]] = d[\"TagId\"]; });\r\n\r\n var totalCategories = d3.keys(categories).length;\r\n var keyDimensions = { height: (Math.ceil(totalCategories / columns.length) * keyHeight), width: $(this.options.keySelector).width(), margins: this.options.keyMargins };\r\n var key;\r\n var keyGroup; \r\n\r\n for (var i = 0; i < columns.length; i++) {\r\n if (columns.hasOwnProperty(i)) {\r\n key = d3.select(columns[i]).append(\"svg\").attr(\"width\", keyDimensions.width).attr(\"height\", keyDimensions.height + keyDimensions.margins.bottom + keyDimensions.margins.top); \r\n key = key.append(\"g\").attr(\"transform\", \"translate(\" + keyDimensions.margins.left + \",\" + keyDimensions.margins.top + \")\");\r\n\r\n keyGroup = key.selectAll(\".key-group\").data(d3.keys(categories).slice(i * Math.ceil(totalCategories / columns.length), (i + 1) * Math.ceil(totalCategories / columns.length))).enter().append(\"g\").attr(\"class\", \"key-group\").attr(\"transform\", function (d, i) { return \"translate(0,\" + (i * keyHeight % keyDimensions.height) + \")\"; });\r\n keyGroup.append(\"rect\").attr(\"width\", keyDimensions.width).attr(\"height\", 25).attr(\"fill\", function (d) { return vis.color(d); }).attr(\"linegroup-block\", function (d) { return d; });\r\n keyGroup.append(\"text\").attr(\"class\", \"key-text\").attr(\"dy\", 18).attr(\"dx\", 6).text(function (d) { return d; });\r\n keyGroup.append(\"rect\").attr(\"width\", keyDimensions.width).attr(\"height\", 25).attr(\"linegroup\", function (d) { return d; }).attr(\"columngroup\", columns[i]).attr(\"opacity\", 0)\r\n .on('click', function () { return vis.handleCategoryToggle(this); })\r\n .on(\"mouseover\", function () { return vis.handleCategoryHover(this); })\r\n .on(\"mouseout\", function () { return vis.handleCategoryHoverEnd(this); });\r\n }\r\n }\r\n\r\n return;\r\n };\r\n myVis.prototype.handleCategoryHover = function (element) {\r\n var lineGroup = d3.select(element).attr(\"linegroup\");\r\n if (this.options.excludedCategories.indexOf(lineGroup) === -1) {\r\n this.options.highlightedCategory = lineGroup;\r\n this.update();\r\n }\r\n };\r\n myVis.prototype.handleCategoryHoverEnd = function (element) {\r\n this.options.highlightedCategory = '';\r\n this.update();\r\n };\r\n myVis.prototype.handleCategoryToggle = function (element) {\r\n var lineGroup = d3.select(element).attr(\"linegroup\");\r\n var columnGroup = d3.select(element).attr(\"columngroup\");\r\n var index = this.options.excludedCategories.indexOf(lineGroup);\r\n var el = d3.select(columnGroup).selectAll(\"[linegroup-block='\" + lineGroup + \"']\");\r\n\r\n if (index === -1) {\r\n el.attr(\"opacity\", 0);\r\n this.options.highlightedCategory = '';\r\n this.options.excludedCategories.push(lineGroup);\r\n } else {\r\n el.attr(\"opacity\", 1.0);\r\n this.options.highlightedCategory = lineGroup;\r\n this.options.excludedCategories.splice(index, 1);\r\n }\r\n\r\n this.update();\r\n };\r\n myVis.prototype.drawData = function () {\r\n var t = d3.transition().duration(1000).ease(d3.easeLinear);\r\n var myVis = this; \r\n\r\n var zerolineDefinition = d3.line().x(function (d) { return myVis.xScale(d[myVis.options.fieldNames.x]); }).y(function (d) { return myVis.yScale(0); }).curve(d3.curveCardinal);\r\n var lineDefinition = d3.line().x(function (d) { return myVis.xScale(d[myVis.options.fieldNames.x]); }).y(function (d) { return myVis.yScale(d[myVis.options.fieldNames.y]); }).curve(d3.curveCardinal);\r\n\r\n this.lineData = d3.nest().key(function (d) { return d[myVis.options.fieldNames.key]; }).entries(this.data);\r\n this.baseVis.transition(t).select(\".xAxis-\"+this.options.name).call(this.xAxis);\r\n this.baseVis.transition(t).select(\".yAxis-\"+this.options.name).call(this.yAxis);\r\n\r\n this.lines = this.dataSet.selectAll(\".line\").data(this.lineData, function(d) { return d ? d.key : this.id; });\r\n this.lines.exit().transition(t).attr(\"stroke-width\", 0).attr(\"d\", function (d) { return zerolineDefinition(d.values); }).remove();\r\n\r\n this.lines = this.lines.enter()\r\n .append(\"path\").attr(\"class\", \"line\")\r\n .attr(\"d\", function (d) { return zerolineDefinition(d.values); }) \r\n .merge(this.lines)\r\n .attr(\"opacity\", function(d, i) {\r\n return myVis.options.highlightedCategory === '' ? .85 : (d.key === myVis.options.highlightedCategory) ? 1 : .1;\r\n })\r\n .transition(t)\r\n .attr(\"stroke\", function (d) { return d3.hsl(myVis.color(d[\"key\"])); })\r\n .attr(\"stroke-width\", 5)\r\n .attr(\"d\", function (d) { return lineDefinition(d.values); }); \r\n\r\n if (this.options.moreDetails) {\r\n var mousePerLine = this.elements.hoverContainer.selectAll(\".mouse-per-line-\"+this.options.name);\r\n var mouseData = mousePerLine.data(this.lineData);\r\n\r\n var mouseG = mouseData.enter()\r\n .append(\"g\")\r\n .attr(\"class\", \"mouse-per-line-\"+this.options.name);\r\n mouseG.append(\"circle\")\r\n .attr(\"r\", 7)\r\n .style(\"fill\", \"none\")\r\n .style(\"stroke-width\", \"2px\")\r\n .style(\"opacity\", \"0\");\r\n mouseG.append(\"text\")\r\n .attr(\"transform\", \"translate(10,3)\");\r\n\r\n mouseData.exit().remove();\r\n }\r\n };\r\n myVis.prototype.updateScales = function () {\r\n var xName = this.options.fieldNames.x;\r\n var yName = this.options.fieldNames.y;\r\n var xRange = d3.extent(this.data, function (d) { return parseFloat(d[xName]); });\r\n var yRange = d3.extent(this.data, function (d) { return parseFloat(d[yName]); });\r\n\r\n var y = { padding: { minimum: 0, actual: 0 }, minimum: 0, maximum: yRange[1] };\r\n\r\n this.xScale.domain([xRange[0], xRange[1]]);\r\n this.xAxis.ticks(xRange[1] - xRange[0]).tickFormat(d3.format(\"0000\"));\r\n\r\n y.minimum = Math.max(y.minimum, 0);\r\n this.yScale.domain([y.minimum, y.maximum]);\r\n this.yScaleReverse.domain([y.maximum, y.minimum]).nice();\r\n };\r\n\r\n return myVis;\r\n}());\r\napp.Vis.ForceGraph = (function () {\r\n var myVis = function (options) {\r\n this.options = {\r\n name: \"force\", keySelector: \"\", tooltipSelector: \"\", visSelector: \"\", visHeight: 600, margins: { top: 15, right: 15, bottom: 15, left: 15 }, year: \"all\",\r\n fieldNames: { key: \"key\", x: \"x\", y: \"y\", r: \"r\", filter1: \"filter1\" },\r\n keyHeight: 0, keyMargins: { top: 10, right: 10, bottom: 10, left: 15 },\r\n baseStrength: .03, baseAlphaDecay: .001, baseVelocityDecay: .1, currentView: 1,\r\n typeLabel1: \"\", typeLabel2: \"\"\r\n };\r\n this.options = $.extend({}, this.options, options);\r\n\r\n app.Vis.Visualization.call(this);\r\n\r\n this.elements = { label: null };\r\n\r\n this.groupedData = {};\r\n this.nodes = {};\r\n this.textNodes = {};\r\n this.countNodes = {};\r\n this.categories = {};\r\n this.categoryPrimaryNodes = {};\r\n this.categoryCount = 0;\r\n this.baseHeight = this.visDimensions.height + this.visDimensions.margins.top + this.visDimensions.margins.bottom;\r\n this.xScale = d3.scaleLinear().range([0, this.visDimensions.width]);\r\n this.yScale = d3.scaleLinear().range([0, this.visDimensions.height]);\r\n this.rScale = d3.scaleSqrt().range([3, 110]);\r\n //this.rBound = this.rScale(this.options.boundingValue);\r\n this.xCenter = this.visDimensions.width / 2;\r\n this.yCenter = this.visDimensions.height / 2; \r\n };\r\n\r\n myVis.prototype.filter = function (fieldName, value) { \r\n return this.data = this.data.filter(function (d) { return (d[fieldName] === value.toString()); });\r\n }; \r\n myVis.prototype.hideDetails = function () {\r\n d3.select(this.options.tooltipSelector).classed('hidden', true);\r\n this.nodes.attr(\"opacity\", 0.85);\r\n };\r\n myVis.prototype.showDetails = function (pointData, index, element) {\r\n var e = $(element);\r\n var box = {\r\n x: Number(e.attr('cx')) + this.visDimensions.margins.left + $(this.options.visSelector).offset().left,\r\n y: Number(e.attr('cy')) - this.visDimensions.margins.top + $(this.options.visSelector).offset().top - Number(e.attr('r'))\r\n };\r\n\r\n var msg = this.getTooltip(pointData);\r\n \r\n d3.select(this.options.tooltipSelector).classed('hidden', false);\r\n d3.select(this.options.tooltipSelector + ' .content').html(msg);\r\n d3.select(this.options.tooltipSelector).style('left', \"\" + (box.x - 150) + \"px\").style('top', \"\" + (box.y - $(this.options.tooltipSelector).height()) + \"px\");\r\n\r\n this.nodes.attr(\"opacity\", .3);\r\n d3.select(element).attr(\"opacity\", 1.0);\r\n };\r\n myVis.prototype.buildData = function() { console.log('buildData is a required method for force graphs.'); };\r\n myVis.prototype.render = function (sourceData) { \r\n var categories = {};\r\n var vis = this;\r\n var rRange = d3.extent(sourceData, function (d) { return parseFloat(d[vis.options.fieldNames.r]) });\r\n\r\n sourceData.forEach(function (d) { return categories[d[vis.options.fieldNames.key]] = 1; });\r\n\r\n this.categories = categories;\r\n this.categoryCount = d3.keys(categories).length; \r\n this.rScale = this.rScale.domain([rRange[0], rRange[1]]);\r\n this.allData = this.buildData(sourceData);\r\n\r\n this.baseVis = d3.select(this.options.visSelector).append(\"svg\").attr(\"width\", this.visDimensions.width + this.visDimensions.margins.left + this.visDimensions.margins.right).attr(\"height\", this.baseHeight);\r\n this.body = this.baseVis.append(\"g\").attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",\" + this.visDimensions.margins.bottom + \")\");\r\n this.force = d3.forceSimulation().alphaDecay(this.options.baseAlphaDecay).velocityDecay(this.options.baseVelocityDecay);\r\n\r\n this.update();\r\n this.renderKey();\r\n $(this.options.visSelector).removeClass(\"vis-loading\");\r\n }; \r\n myVis.prototype.renderKey = function () {\r\n var vis = this;\r\n var keyR = 10;\r\n var columns = [this.options.keySelector];\r\n\r\n if ($(this.options.keySelector2).length) {\r\n columns.push(this.options.keySelector2);\r\n if ($(this.options.keySelector3).length) {\r\n columns.push(this.options.keySelector3);\r\n }\r\n }\r\n\r\n var keyDimensions = { height: (this.categoryCount * 25) / columns.length, width: $(this.options.keySelector).width(), margins: this.options.keyMargins };\r\n var key;\r\n var keyGroup;\r\n\r\n for (var i = 0; i < columns.length; i++) {\r\n if (columns.hasOwnProperty(i)) {\r\n key = d3.select(columns[i]).append(\"svg\").attr(\"width\", keyDimensions.width).attr(\"height\", keyDimensions.height + keyDimensions.margins.bottom + keyDimensions.margins.top);\r\n key = key.append(\"g\").attr(\"transform\", \"translate(\" + keyDimensions.margins.left + \",\" + keyDimensions.margins.top + \")\");\r\n\r\n keyGroup = key.selectAll(\".key-group\").data(d3.keys(this.categories).slice(i * Math.ceil(this.categoryCount / columns.length), (i + 1) * Math.ceil(this.categoryCount / columns.length))).enter().append(\"g\").attr(\"class\", \"key-group\").attr(\"transform\", function (d, i) { return \"translate(0,\" + (i * 25 % keyDimensions.height) + \")\"; });\r\n keyGroup.append(\"circle\").attr(\"r\", keyR).attr(\"fill\", function (d) { return vis.color(d); }).attr(\"transform\", function (d) { return \"translate(\" + keyR + \", \" + keyR + \")\"; });\r\n keyGroup.append(\"text\").attr(\"class\", \"key-text\").attr(\"dy\", 15).attr(\"dx\", keyR * 2 + 6).text(function (d) { return d; });\r\n }\r\n }\r\n };\r\n myVis.prototype.drawData = function () {\r\n var t = d3.transition().duration(1000).ease(d3.easeLinear);\r\n var myVis = this;\r\n\r\n this.nodes = myVis.body.selectAll(\"circle\").data(this.data);\r\n this.nodes.exit().transition(t).attr(\"r\", function (d) { return 0; }).remove();\r\n this.nodes = this.nodes.enter()\r\n .append(\"circle\")\r\n .attr(\"r\", 0)\r\n .attr(\"stroke-width\", 1)\r\n .merge(this.nodes)\r\n .on(\"mouseover\", function (d, i) { return myVis.showDetails(d, i, this); })\r\n .on(\"mouseout\", $.proxy(myVis.hideDetails, this))\r\n .attr(\"cx\", function(d) { return d.x; })\r\n .attr(\"cy\", function(d) { return d.y; })\r\n .attr(\"opacity\", 0.85)\r\n .attr(\"fill\", function(d) { return myVis.color(d[myVis.options.fieldNames.key]); })\r\n .attr(\"stroke\", function(d) { return d3.hsl(myVis.color(d[myVis.options.fieldNames.key])).darker(); });\r\n\r\n this.nodes.transition(t).attr(\"r\", function (d) { return d.r; });\r\n\r\n this.groupedData = d3.nest().key(function (d) { return d[myVis.options.fieldNames.key]; }).rollup(function(v) { return d3.sum(v, function(d) { return d[myVis.options.fieldNames.r]; }); }).entries(this.data).sort(function(a,b) { return d3.descending(a.value, b.value)});\r\n\r\n if (this.options.currentView !== 2) {\r\n //hide labels\r\n myVis.body.selectAll(\".label-text\").remove();\r\n }\r\n\r\n this.baseVis.transition(t).attr(\"height\", this.baseHeight);\r\n\r\n var rowSize = 3;\r\n\r\n if (app.page.isPageSmall()) {\r\n rowSize = 1;\r\n } else if(app.page.isPageMedium()) {\r\n rowSize = 2;\r\n } \r\n\r\n this.textNodes = myVis.body.selectAll(\".group-text\").data((this.options.currentView === 3) ? this.groupedData : {});\r\n this.textNodes.exit().remove();\r\n this.textNodes = this.textNodes.enter()\r\n .append(\"text\")\r\n .attr(\"class\", \"group-text\")\r\n .attr(\"text-anchor\", \"middle\")\r\n .attr(\"font-size\", \"18px\")\r\n .attr(\"font-weight\", \"bold\")\r\n .style(\"fill\", \"black\") \r\n .merge(this.textNodes)\r\n .attr('transform', function(d, i) { return 'translate(' + (((i % rowSize)) * (myVis.xCenter/ (rowSize/2)) + myVis.xCenter/rowSize) + ', ' + (75 + Math.floor(i / rowSize) * 250) + ')'; })\r\n .text(function(d) { return d.key })\r\n .style(\"opacity\", 0).transition().duration(600).ease(d3.easeLinear).style(\"opacity\", 1);\r\n\r\n this.countNodes = myVis.body.selectAll(\".group-count\").data((this.options.currentView === 3) ? this.groupedData : {});\r\n this.countNodes.exit().remove();\r\n this.countNodes = this.countNodes.enter()\r\n .append(\"text\")\r\n .attr(\"class\", \"group-count\")\r\n .attr(\"text-anchor\", \"middle\")\r\n .attr(\"font-size\", \"18px\")\r\n .style(\"fill\", \"black\") \r\n .merge(this.countNodes)\r\n .attr('transform', function(d, i) { return 'translate(' + (((i % rowSize)) * (myVis.xCenter/ (rowSize/2)) + myVis.xCenter/rowSize) + ', ' + (75 + 20 + Math.floor(i / rowSize) * 250) + ')'; })\r\n .text(function(d) { return app.page.getFormattedNumber(d.value) })\r\n .style(\"opacity\", 0).transition().duration(600).ease(d3.easeLinear).style(\"opacity\", 1);\r\n\r\n this.force.nodes(this.data).velocityDecay(.5).stop();\r\n\r\n switch (this.options.currentView) {\r\n case 2:\r\n this.clusterView();\r\n break;\r\n case 3:\r\n this.detailView(rowSize);\r\n break;\r\n default:\r\n this.overviewView();\r\n break;\r\n }\r\n\r\n $('.vis-overlay[data-overlay]', this.options.visSelector).hide();\r\n $('.vis-overlay[data-overlay=\"' + this.options.currentView + '\"]', this.options.visSelector).fadeIn(200);\r\n };\r\n\r\n return myVis;\r\n})();\r\napp.Vis.Gauge = (function () {\r\n //Copyright (c) 2015, Curtis Bratton \r\n //All rights reserved.\r\n var myVis = function (options) {\r\n this.options = {\r\n name: \"guage\", visSelector: \"\", visHeight: 150, margins: { top: 15, right: 15, bottom: 15, left: 15 }, \r\n fieldNames: { n: \"n\", m: \"m\", filter1: \"filter1\" }, \r\n waveColor: \"#178BCA\", waveTextColor: \"#FFFFFF\", textColor: \"#045681\", circleColor: \"#178BCA\", \r\n waveRise: true, waveRiseTime: 2000, countUp: true, displayPercent: true, guid: app.page.getGuid()\r\n };\r\n this.options = $.extend({}, this.options, options);\r\n\r\n app.Vis.Visualization.call(this);\r\n\r\n this.elements = { outerCircle: null, text1: null, text2: null, wave: null, waveGroup: null, fillCircleGroup: null, fillCircleGroupCircle: null, label: null };\r\n\r\n this.radius = Math.min(parseInt(this.visDimensions.width), parseInt(this.visDimensions.height)) / 2;\r\n this.textPixels = this.radius / 2;\r\n this.locationX = parseInt(this.visDimensions.width) / 2 - this.radius + this.visDimensions.margins.left;\r\n this.locationY = parseInt(this.visDimensions.height) / 2 - this.radius + this.visDimensions.margins.top + this.textPixels * .75;\r\n this.waveHeightScale = d3.scaleLinear().range([0, .05, 0]).domain([0, 50, 100]);\r\n this.percentText = this.options.displayPercent ? '%' : '';\r\n this.fillCircleMargin = 2 * .05 * this.radius;\r\n this.fillCircleRadius = this.radius - this.fillCircleMargin;\r\n this.waveLength = this.fillCircleRadius * 2 / 4;\r\n this.waveClipWidth = this.waveLength * 5;\r\n this.waveAnimateScale = d3.scaleLinear().range([0, this.waveClipWidth - this.fillCircleRadius * 2]).domain([0, 1]);\r\n }\r\n\r\n myVis.prototype.filter = function (fieldName, value) { \r\n return this.data = this.data.filter(function (d) { return (d[fieldName] === value.toString()); });\r\n }; \r\n myVis.prototype.render = function (sourceData) {\r\n this.allData = sourceData;\r\n\r\n this.baseVis = d3.select(this.options.visSelector).append(\"svg\").attr(\"width\", this.visDimensions.width + this.visDimensions.margins.left + this.visDimensions.margins.right).attr(\"height\", this.visDimensions.height + this.visDimensions.margins.top + this.visDimensions.margins.bottom + this.textPixels * .75);\r\n this.body = this.baseVis.append(\"g\").attr('transform', 'translate(' + this.locationX + ',' + this.locationY + ')');\r\n this.elements.outerCircle = this.body.append(\"path\");\r\n this.elements.text1 = this.body.append(\"text\");\r\n this.elements.waveGroup = this.body.append(\"defs\").append(\"clipPath\").attr(\"id\", \"clipWave\" + this.options.guid);\r\n this.elements.wave = this.elements.waveGroup.append(\"path\");\r\n this.elements.fillCircleGroup = this.body.append(\"g\").attr(\"clip-path\", \"url(#clipWave\" + this.options.guid + \")\");\r\n this.elements.fillCircleGroupCircle = this.elements.fillCircleGroup.append(\"circle\");\r\n this.elements.text2 = this.elements.fillCircleGroup.append(\"text\");\r\n\r\n this.elements.label = this.baseVis.append(\"text\").attr(\"class\", \"key-text\").attr(\"text-anchor\", \"middle\").attr(\"font-size\", this.textPixels * .75 + \"px\").style(\"fill\", this.options.textColor).attr('transform', 'translate(' + (this.visDimensions.width + this.visDimensions.margins.left + this.visDimensions.margins.right) / 2 + ', 30)');\r\n\r\n this.gaugeCircleX = d3.scaleLinear().range([0, 2 * Math.PI]).domain([0, 1]);\r\n this.gaugeCircleY = d3.scaleLinear().range([0, this.radius]).domain([0, this.radius]);\r\n\r\n this.update();\r\n this.renderKey();\r\n $(this.options.visSelector).removeClass(\"vis-loading\");\r\n };\r\n myVis.prototype.renderKey = function () {\r\n this.elements.label.text(this.data[0][this.options.fieldNames.key]);\r\n };\r\n myVis.prototype.roundText = function (v) {\r\n if (parseFloat(v).toString() === parseFloat(v).toFixed(0)) return function(v) { return parseFloat(v).toFixed(0); };\r\n if (parseFloat(v).toString() === parseFloat(v).toFixed(1)) return function(v) { return parseFloat(v).toFixed(1); };\r\n return function(v) { return parseFloat(v).toFixed(2); };\r\n }\r\n myVis.prototype.drawData = function () {\r\n var myVis = this;\r\n var data = [];\r\n \r\n if (this.data.length === 0) {\r\n this.data = [{}];\r\n this.data[0][this.options.fieldNames.key] = \"\";\r\n this.data[0][this.options.fieldNames.n] = 0;\r\n this.data[0][this.options.fieldNames.m] = 0;\r\n this.data[0][this.options.fieldNames.filter1] = \"\";\r\n }\r\n \r\n if (myVis.options.fieldNames.m === \"\") {\r\n if (this.data.length === 0) {\r\n this.textFinal = 0;\r\n this.fill = 0;\r\n } else {\r\n this.textFinal = parseFloat(this.data[0][myVis.options.fieldNames.n]).toFixed(1);\r\n this.fill = 1;\r\n }\r\n } else {\r\n this.textFinal = ((parseFloat(this.data[0][myVis.options.fieldNames.n]) / parseFloat(this.data[0][myVis.options.fieldNames.m]) * 100) || 0).toFixed(1);\r\n this.fill = Math.max(0, this.data[0][myVis.options.fieldNames.n] / this.data[0][myVis.options.fieldNames.m]) || 0;\r\n } \r\n\r\n var roundText = this.roundText(this.textFinal);\r\n\r\n this.textInitial = this.options.countUp ? 0 : this.textFinal;\r\n this.waveHeight = this.fillCircleRadius * this.waveHeightScale(this.fill * 100); \r\n \r\n for (var i = 0; i <= 200; i++) {\r\n data.push({ x: i / 200, y: (i / 40) });\r\n }\r\n\r\n var currentText = roundText(this.textInitial) + this.percentText;\r\n var waveScaleX = d3.scaleLinear().range([0, this.waveClipWidth]).domain([0, 1]);\r\n var waveScaleY = d3.scaleLinear().range([0, this.waveHeight]).domain([0, 1]);\r\n\r\n var waveRiseScale = d3.scaleLinear().range([(this.fillCircleMargin + this.fillCircleRadius * 2 + this.waveHeight), (this.fillCircleMargin - this.waveHeight)]).domain([0, 1]);\r\n var textRiseScaleY = d3.scaleLinear().range([this.fillCircleMargin + this.fillCircleRadius * 2, (this.fillCircleMargin + this.textPixels * 0.7)]).domain([0, 1]);\r\n\r\n var gaugeCircleArc = d3.arc().startAngle(this.gaugeCircleX(0)).endAngle(this.gaugeCircleX(1)).outerRadius(this.gaugeCircleY(this.radius)).innerRadius(this.gaugeCircleY(this.radius * .95));\r\n this.elements.outerCircle.attr(\"d\", gaugeCircleArc).style(\"fill\", this.options.circleColor).attr('transform', 'translate(' + this.radius + ',' + this.radius + ')');\r\n\r\n this.elements.text1.text(currentText).attr(\"text-anchor\", \"middle\").attr(\"font-size\", this.textPixels + \"px\").style(\"fill\", this.options.textColor).attr('transform', 'translate(' + this.radius + ',' + textRiseScaleY(.5) + ')');\r\n this.elements.text2.text(currentText).attr(\"text-anchor\", \"middle\").attr(\"font-size\", this.textPixels + \"px\").style(\"fill\", this.options.waveTextColor).attr('transform', 'translate(' + this.radius + ',' + textRiseScaleY(.5) + ')');\r\n\r\n // The clipping wave area.\r\n var waveHeight = this.waveHeight;\r\n var fillCircleRadius = this.fillCircleRadius;\r\n\r\n // The inner circle with the clipping wave attached.\r\n this.elements.fillCircleGroupCircle.attr(\"cx\", this.radius).attr(\"cy\", this.radius).attr(\"r\", this.fillCircleRadius).style(\"fill\", this.options.waveColor);\r\n\r\n var clipArea = d3.area().x(function (d) { return waveScaleX(d.x); })\r\n .y0(function (d) { return waveScaleY(Math.sin(Math.PI * -6 + d.y * 2 * Math.PI)); })\r\n .y1(function (d) { return (fillCircleRadius * 2 + waveHeight); });\r\n\r\n this.elements.wave.datum(data).attr(\"d\", clipArea).attr(\"T\", 0);\r\n\r\n // Make the value count up.\r\n if (this.options.countUp) {\r\n var textFinal = this.textFinal;\r\n var percentText = this.percentText;\r\n\r\n var textTween = function () {\r\n var node = this;\r\n var i = d3.interpolate(node.textContent, textFinal);\r\n return function (t) {\r\n node.textContent = roundText(i(t)) + percentText;\r\n }\r\n };\r\n\r\n this.elements.text1.transition().duration(this.options.waveRiseTime).tween(\"text\", textTween);\r\n this.elements.text2.transition().duration(this.options.waveRiseTime).tween(\"text\", textTween);\r\n }\r\n\r\n var waveGroupXPosition = this.fillCircleMargin + this.fillCircleRadius * 2 - this.waveClipWidth;\r\n var fill = this.fill;\r\n\r\n if (this.options.waveRise) {\r\n this.elements.waveGroup.attr('transform', 'translate(' + waveGroupXPosition + ',' + waveRiseScale(0) + ')').transition().duration(this.options.waveRiseTime).attr('transform', 'translate(' + waveGroupXPosition + ',' + waveRiseScale(fill) + ')');\r\n } else {\r\n this.elements.waveGroup.attr('transform', 'translate(' + waveGroupXPosition + ',' + waveRiseScale(fill) + ')');\r\n }\r\n\r\n animateWave(this.elements.wave, this.waveAnimateScale);\r\n\r\n function animateWave(wave, waveAnimateScale) {\r\n if (wave) {\r\n wave.attr('transform', 'translate(' + waveAnimateScale(wave.attr('T')) + ',0)');\r\n wave.transition().duration(1000 * (1 - wave.attr('T'))).ease(d3.easeLinear).attr('transform', 'translate(' + waveAnimateScale(1) + ',0)').attr('T', 1).on('end', function () { wave.attr('T', 0); animateWave(wave, waveAnimateScale); });\r\n }\r\n }\r\n\r\n $(this.options.visSelector).removeClass(\"vis-loading\");\r\n };\r\n\r\n return myVis;\r\n})();\r\napp.Vis.HoverGraph = (function () {\r\n var myVis = function (options) {\r\n this.options = {\r\n name: \"hover\", keySelector: \"\", tooltipSelector: \"\", visSelector: \"\", visHeight: 600, margins: { top: 15, right: 15, bottom: 15, left: 15 }, year: \"all\",\r\n fieldNames: { key: \"key\", subKey: \"subkey\", value:\"count\", filter1: \"filter1\" },\r\n textColor: \"#045681\", circleColor: \"#178BCA\",\r\n categoryMargin: 20,\r\n baseStrength: .03, baseAlphaDecay: .001, baseVelocityDecay: .1, currentView: 1\r\n };\r\n this.options = $.extend({}, this.options, options);\r\n\r\n app.Vis.Visualization.call(this);\r\n\r\n this.elements = { label: null };\r\n\r\n this.nodes = {};\r\n this.textNodes = {};\r\n this.countNodes = {};\r\n this.categories = {};\r\n this.categoryCount = 0;\r\n this.radius = 0;\r\n this.xScale = d3.scaleLinear().range([0, this.visDimensions.width]);\r\n this.yScale = d3.scaleLinear().range([0, this.visDimensions.height]);\r\n this.rScale = d3.scaleSqrt().range([3, 110]);\r\n this.xCenter = this.visDimensions.width / 2;\r\n this.yCenter = this.visDimensions.height / 2; \r\n };\r\n\r\n myVis.prototype.filter = function (fieldName, value) { \r\n return this.data = this.data.filter(function (d) { return (d.key === value.toString()); });\r\n }; \r\n myVis.prototype.hideDetails = function () {\r\n this.data.forEach(function(d) { d.selected = false; });\r\n $('.vis-overlay[data-overlay]', this.options.visSelector).hide();\r\n this.detailView(1);\r\n };\r\n myVis.prototype.showDetails = function (pointData, index, element) {\r\n pointData.selected = true; \r\n $('.vis-overlay[data-overlay=\"' + pointData.key + '\"]', this.options.visSelector).fadeIn(300);\r\n this.detailView(1, $('.vis-overlay[data-overlay=\"' + pointData.key + '\"]', this.options.visSelector).height(), pointData.index);\r\n };\r\n myVis.prototype.render = function (sourceData) { \r\n var categories = {};\r\n var myVis = this;\r\n\r\n sourceData.forEach(function (d) { return categories[d[myVis.options.fieldNames.key]] = 1; });\r\n\r\n this.categories = categories;\r\n this.categoryCount = d3.keys(categories).length;\r\n this.radius = Math.min(this.visDimensions.width, this.visDimensions.height / this.categoryCount) / 2;\r\n this.allData = d3.nest()\r\n .key(function (d) { return d[myVis.options.fieldNames.filter1]; })\r\n .key(function (d) { return d[myVis.options.fieldNames.key]; })\r\n .key(function (d) { return d[myVis.options.fieldNames.subKey]; })\r\n .rollup(function(v) { return d3.sum(v, function(d) { return d[myVis.options.fieldNames.value]; }); })\r\n .entries(sourceData).sort(function(a,b) { return d3.descending(a.value, b.value)});\r\n this.allData.forEach(function(d) {\r\n d.values.forEach(function(e) {\r\n e.total = d3.sum(e.values, function(f) { return f.value; });\r\n e.selected = false;\r\n }); \r\n });\r\n this.baseVis = d3.select(this.options.visSelector).append(\"svg\")\r\n .attr(\"width\", this.visDimensions.width + this.visDimensions.margins.left + this.visDimensions.margins.right)\r\n .attr(\"height\", this.visDimensions.margins.top + this.visDimensions.margins.bottom + (((myVis.radius * 2) + myVis.options.categoryMargin) * this.categoryCount ))\r\n .on(\"mouseout\", $.proxy(this.hideDetails, this));\r\n this.body = this.baseVis.append(\"g\").attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",\" + this.visDimensions.margins.bottom + \")\");\r\n this.force = d3.forceSimulation().alphaDecay(this.options.baseAlphaDecay).velocityDecay(this.options.baseVelocityDecay);\r\n\r\n //create content divs\r\n d3.keys(categories).forEach(function(d) { \r\n $(myVis.options.visSelector).append(\"
\"); \r\n }); \r\n\r\n this.update();\r\n $(this.options.visSelector).removeClass(\"vis-loading\");\r\n }; \r\n myVis.prototype.drawData = function () {\r\n var myVis = this;\r\n var rowSize = 1;\r\n\r\n this.nodes = myVis.body.selectAll(\"g\").data(this.data, function(d) { return d.key; });\r\n this.nodes.exit().remove();\r\n\r\n var nodesEnter = this.nodes.enter().append(\"g\"); \r\n\r\n nodesEnter.append(\"circle\")\r\n .attr(\"stroke-width\", 1)\r\n .attr(\"opacity\", 0.85)\r\n .attr(\"fill\", function(d) { return myVis.options.circleColor; })\r\n .attr(\"stroke\", function(d) { return d3.hsl(myVis.options.circleColor).darker(); })\r\n .attr(\"r\", function (d) { return myVis.radius; });\r\n\r\n nodesEnter.append(\"text\")\r\n .attr(\"class\", \"group-label\")\r\n .attr(\"text-anchor\", \"middle\")\r\n .attr(\"font-size\", myVis.radius/4+\"px\")\r\n .attr(\"font-weight\", \"bold\")\r\n .attr(\"transform\", \"translate(0, \"+ myVis.radius * .4 +\")\")\r\n .style(\"fill\", myVis.options.textColor)\r\n .text(d => d.key);\r\n\r\n nodesEnter.append(\"text\")\r\n .attr(\"class\", \"group-value\")\r\n .attr(\"text-anchor\", \"middle\")\r\n .attr(\"font-size\", myVis.radius +\"px\")\r\n .attr(\"font-weight\", \"bold\") \r\n .attr(\"transform\", \"translate(0, 0)\")\r\n .style(\"fill\", myVis.options.textColor);\r\n\r\n nodesEnter.append(\"rect\")\r\n .attr(\"opacity\", \"0\")\r\n .attr(\"width\", this.visDimensions.width * 1.5)\r\n .attr(\"height\", myVis.radius * 2)\r\n .attr('pointer-events', 'all')\r\n .attr('transform', 'translate(' + -myVis.xCenter + ', ' + -myVis.radius + ')');\r\n\r\n this.nodes = this.nodes.merge(nodesEnter);\r\n this.nodes.select(\"rect\").on(\"mouseover\", function(d, i) { return myVis.showDetails(d, i, this); });\r\n this.nodes.select(\".group-value\").text(d => d.total).style(\"opacity\", 0).transition().duration(600).ease(d3.easeLinear).style(\"opacity\", 1); \r\n\r\n this.data.forEach(function(d, i) {\r\n var e = $('.vis-overlay[data-overlay=\"' + d.key + '\"]', myVis.options.visSelector);\r\n var s = '';\r\n \r\n d.values.forEach(function(d2){ s = s + d2.value + ' ' + d2.key + '
'; });\r\n e.html(s);\r\n\r\n var t = (e.height() < (myVis.radius * 2) ? ((myVis.radius * 2) - e.height())/2 : 0);\r\n\r\n e.css('left', \r\n (app.page.isPageSmall() ?\r\n myVis.radius/2 :\r\n ((((i % rowSize)) * (myVis.xCenter/ (rowSize/2) ) + myVis.xCenter/rowSize)))\r\n + 'px');\r\n e.css('top', \r\n (app.page.isPageSmall() ?\r\n myVis.visDimensions.margins.top + (((myVis.radius * 2) + myVis.options.categoryMargin) * (i + 1)) :\r\n myVis.visDimensions.margins.top + myVis.options.categoryMargin + (((myVis.radius * 2) + myVis.options.categoryMargin) * i) + t)\r\n + 'px'); \r\n });\r\n\r\n this.force.nodes(this.data).velocityDecay(.5).stop();\r\n\r\n this.detailView(rowSize);\r\n };\r\n\r\n return myVis;\r\n})();\r\napp.Vis.BarGraph = (function () {\r\n var myVis = function (options) {\r\n this.options = {\r\n name: \"linegraph\", keySelector: \"\", moreDetails: false, xDateScale: false, tooltipSelector: \"\", visSelector: \"\", visHeight: 450, margins: { top: 20, right: 20, bottom: 50, left: 60 },\r\n fieldNames: { key: \"key\", x: \"x\", y: \"y\", filter1: \"filter1\" },\r\n keyHeight: 0, keyMargins: { top: 0, right: 0, bottom: 0, left: 0 }, xAxisLabel: \"X Axis\", yAxisLabel: \"Y Axis\", excludedCategories: []\r\n };\r\n this.options = $.extend({}, this.options, options);\r\n\r\n app.Vis.Visualization.call(this);\r\n\r\n this.categories = {};\r\n this.keys = {};\r\n\r\n this.xScale = d3.scaleLinear().rangeRound([this.visDimensions.width, 0]);\r\n this.yScale = d3.scaleLinear().rangeRound([this.visDimensions.height, 0]); \r\n this.xAxis = d3.axisBottom(this.xScale).tickSize(5);\r\n this.yAxis = d3.axisLeft(this.yScale).ticks(null, \"s\");\r\n }\r\n\r\n myVis.prototype.filter = function (fieldName, value) { \r\n return this.data = this.data.filter(function (d) { return (d[fieldName] === value.toString()); });\r\n }; \r\n myVis.prototype.filterCategories = function (excludedCategories) {\r\n var keyName = this.options.fieldNames.key;\r\n return this.data = this.data.filter(function (d) { return (excludedCategories.indexOf(d[keyName])) === -1; });\r\n };\r\n myVis.prototype.mungeData = function (sourceData) {\r\n var mungedData = [];\r\n var columnNames = [];\r\n\r\n for (var i = 0; i < sourceData.length; i++) {\r\n var curOb = sourceData[i];\r\n\r\n var curBucket = mungedData.find(function (el) {\r\n return el.MonthsSinceFounding == curOb.MonthsSinceFounding;\r\n });\r\n\r\n if (curBucket == null) {\r\n mungedData.push({\r\n \"MonthsSinceFounding\": curOb.MonthsSinceFounding,\r\n \"Count\": 0,\r\n \"FiscalYear\": curOb.FiscalYear,\r\n \"Tooltip\": []\r\n });\r\n curBucket = mungedData[mungedData.length - 1];\r\n }\r\n\r\n curBucket[curOb.Name] = curOb.Count;\r\n curBucket.Tooltip.push({ \"Name\": curOb.Name, \"Count\": curOb.Count });\r\n curBucket.Count = curBucket.Count + curOb.Count;\r\n\r\n // Check if we have added this initiative type to our list of columns already. If not, add it\r\n if (columnNames.indexOf(curOb.Name) < 0) {\r\n columnNames.push(curOb.Name);\r\n }\r\n }\r\n\r\n mungedData[\"columns\"] = columnNames;\r\n\r\n return mungedData;\r\n };\r\n myVis.prototype.hideDetails = function () {\r\n d3.select(this.options.tooltipSelector).classed('hidden', true);\r\n this.body.selectAll(\".point\").selectAll(\"circle\").attr(\"opacity\", 0.85);\r\n };\r\n myVis.prototype.showDetails = function (pointData, index, element) {\r\n var box = {\r\n x: Math.round(this.xScale(pointData.data[this.options.fieldNames.x])) + this.visDimensions.margins.left + $(this.options.visSelector).offset().left + 2,\r\n y: parseInt($(element).attr('y')) + $(this.options.visSelector).offset().top - 10 \r\n };\r\n\r\n var msg = this.getTooltip(pointData.data, element);\r\n\r\n d3.select(this.options.tooltipSelector).classed('hidden', false);\r\n d3.select(this.options.tooltipSelector + ' .content').html(msg);\r\n d3.select(this.options.tooltipSelector).style('left', \"\" + (box.x - 150) + \"px\").style('top', \"\" + (box.y - $(this.options.tooltipSelector).height()) + \"px\");\r\n\r\n this.body.selectAll(\".point circle\").attr(\"opacity\", 0.3);\r\n d3.select(element).select(\"circle\").attr(\"opacity\", 1.0);\r\n };\r\n myVis.prototype.render = function (sourceData) {\r\n var myVis = this;\r\n\r\n this.allData = sourceData;\r\n\r\n this.allData.forEach(function (d) { return myVis.categories[d[myVis.options.fieldNames.key]] = 1; });\r\n this.keys = d3.keys(this.categories);\r\n\r\n this.baseVis = d3.select(this.options.visSelector).append(\"svg\").attr(\"width\", this.visDimensions.width + this.visDimensions.margins.left + this.visDimensions.margins.right).attr(\"height\", this.visDimensions.height + this.visDimensions.margins.top + this.visDimensions.margins.bottom); \r\n this.body = this.baseVis.append(\"g\").attr(\"transform\", \"translate(\" + myVis.options.margins.left + \",\" + myVis.options.margins.top + \")\");\r\n this.dataSet = this.body.append(\"g\").attr(\"id\", \"dataSet-\"+this.options.name);\r\n\r\n this.baseVis.append(\"g\").attr(\"class\", \"xAxis-\"+this.options.name).attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",\" + (this.visDimensions.height + this.visDimensions.margins.top) + \")\").call(this.xAxis);\r\n this.baseVis.append(\"text\").attr(\"x\", this.visDimensions.width / 2).attr(\"y\", this.visDimensions.height + (this.visDimensions.margins.top + this.visDimensions.margins.bottom) - 10).attr(\"text-anchor\", \"middle\").attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",0)\").text(this.options.xAxisLabel);\r\n this.baseVis.append(\"g\").attr(\"class\", \"yAxis-\"+this.options.name).attr(\"transform\", \"translate(\" + this.visDimensions.margins.left + \",\" + this.visDimensions.margins.top + \")\").call(this.yAxis);\r\n this.baseVis.append(\"text\").attr(\"transform\", \"rotate(-90)\").attr(\"y\", 20).attr(\"x\", 0 - (myVis.visDimensions.height / 2)).style(\"text-anchor\", \"middle\").text(this.options.yAxisLabel);\r\n \r\n this.update();\r\n this.renderKey();\r\n $(this.options.visSelector).removeClass(\"vis-loading\");\r\n };\r\n myVis.prototype.renderKey = function() {\r\n var myVis = this;\r\n var keyHeight = 30;\r\n var keyMargin = 5;\r\n var keyEntryHeight = keyHeight - keyMargin;\r\n var columns = [this.options.keySelector];\r\n\r\n if ($(this.options.keySelector2).length) {\r\n columns.push(this.options.keySelector2);\r\n if ($(this.options.keySelector3).length) {\r\n columns.push(this.options.keySelector3);\r\n }\r\n } \r\n\r\n var totalCategories = d3.keys(myVis.categories).length;\r\n var keyDimensions = { height: (Math.ceil(totalCategories / columns.length) * keyHeight), width: $(this.options.keySelector).width(), margins: this.options.keyMargins };\r\n var key;\r\n var keyGroup;\r\n\r\n for (var i = 0; i < columns.length; i++) {\r\n if (columns.hasOwnProperty(i)) {\r\n key = d3.select(columns[i]).append(\"svg\").attr(\"width\", keyDimensions.width).attr(\"height\", keyDimensions.height + keyDimensions.margins.bottom + keyDimensions.margins.top);\r\n key = key.append(\"g\").attr(\"transform\", \"translate(\" + keyDimensions.margins.left + \",\" + keyDimensions.margins.top + \")\");\r\n\r\n keyGroup = key.selectAll(\".key-group\").data(d3.keys(myVis.categories).slice(i * Math.ceil(totalCategories / columns.length), (i + 1) * Math.ceil(totalCategories / columns.length))).enter().append(\"g\").attr(\"class\", \"key-group\").attr(\"transform\", function (d, i) { return \"translate(0,\" + (i * keyHeight % keyDimensions.height) + \")\"; });\r\n keyGroup.append(\"rect\").attr(\"width\", keyDimensions.width).attr(\"height\", keyEntryHeight).attr(\"fill\", function (d) { return myVis.color(d); }).attr(\"linegroup-block\", function (d) { return d; });\r\n keyGroup.append(\"text\").attr(\"class\", \"key-text\").attr(\"dy\", 18).attr(\"dx\", 6).text(function (d) { return d; });\r\n keyGroup.append(\"rect\").attr(\"width\", keyDimensions.width).attr(\"height\", keyEntryHeight).attr(\"linegroup\", function (d) { return d; }).attr(\"columngroup\", columns[i]).attr(\"opacity\", 0)\r\n .on('click', function () { return myVis.handleCategoryToggle(this); })\r\n .on(\"mouseover\", function () { return myVis.handleCategoryHover(this); })\r\n .on(\"mouseout\", function () { return myVis.handleCategoryHoverEnd(this); });\r\n }\r\n } \r\n };\r\n myVis.prototype.handleCategoryHover = function (element) {\r\n var lineGroup = d3.select(element).attr(\"linegroup\");\r\n\r\n if (this.options.excludedCategories.indexOf(lineGroup) === -1) {\r\n this.body.selectAll(\"rect\").attr(\"opacity\", 0.1);\r\n this.body.selectAll(\"[fill='\" + this.color(lineGroup) + \"']\").selectAll(\"rect\").attr(\"opacity\", 1);\r\n }\r\n };\r\n myVis.prototype.handleCategoryHoverEnd = function (element) {\r\n this.body.selectAll(\"rect\").attr(\"opacity\", 0.85);\r\n };\r\n myVis.prototype.handleCategoryToggle = function (element) {\r\n var lineGroup = d3.select(element).attr(\"linegroup\");\r\n var columnGroup = d3.select(element).attr(\"columngroup\");\r\n var index = this.options.excludedCategories.indexOf(lineGroup);\r\n var el = d3.select(columnGroup).selectAll(\"[linegroup-block='\" + lineGroup + \"']\");\r\n\r\n if (index === -1) {\r\n el.attr(\"opacity\", 0);\r\n this.options.excludedCategories.push(lineGroup);\r\n } else {\r\n el.attr(\"opacity\", 1.0);\r\n this.options.excludedCategories.splice(index, 1);\r\n }\r\n\r\n this.update();\r\n };\r\n myVis.prototype.drawData = function() {\r\n var t = d3.transition().duration(1000).ease(d3.easeLinear);\r\n var myVis = this;\r\n var xMax = d3.max(myVis.data, function (d) { return d.MonthsSinceFounding; }) + 1;\r\n var strokeWidth = app.page.isPageSmall() ? 0 : 1;\r\n var barWidth = (myVis.visDimensions.width / xMax) - (strokeWidth * 2); \r\n\r\n this.dataSet.selectAll(\"rect\").transition(t).attr(\"height\", 0).attr(\"y\", myVis.yScale(0)).attr(\"x\", myVis.xScale(xMax)).remove();\r\n this.dataSet.selectAll(\"*\").transition(t).remove();\r\n \r\n\r\n myVis.data.sort(function (a, b) { return b.MonthsSinceFounding - a.MonthsSinceFounding; });\r\n\r\n this.baseVis.transition(t).select(\".xAxis-\"+this.options.name).call(myVis.xAxis);\r\n this.baseVis.transition(t).select(\".yAxis-\"+this.options.name).call(myVis.yAxis);\r\n \r\n myVis.dataSet.append(\"g\")\r\n .selectAll(\"g\")\r\n .data(d3.stack().keys(myVis.keys)(myVis.data))\r\n .enter().append(\"g\")\r\n .attr(\"fill\", function(d) { return myVis.color(d.key); })\r\n .attr(\"stroke-width\", 1)\r\n .attr(\"stroke\", function(d) { return d3.hsl(myVis.color(d.key)).darker(); })\r\n .attr(\"data-category\", function(d) { return d.key; })\r\n .selectAll(\"rect\")\r\n .data(function(d) { return d; })\r\n .enter().append(\"rect\")\r\n .attr(\"x\", myVis.xScale(0))\r\n .attr(\"y\", myVis.yScale(0))\r\n .attr(\"width\", barWidth)\r\n .on(\"mouseover\",\r\n function(d, i) {\r\n return myVis.showDetails(d, i, this);\r\n })\r\n .on(\"mouseout\", $.proxy(myVis.hideDetails, this)) \r\n .transition(t)\r\n .attr(\"x\", function(d) { return myVis.xScale(d.data.MonthsSinceFounding) - (barWidth/2); })\r\n .attr(\"y\", function(d) { return isNaN(d[1]) ? 0 : myVis.yScale(d[1]); })\r\n .attr(\"height\", function(d) { return isNaN(d[1]) ? 0 : myVis.yScale(d[0]) - myVis.yScale(d[1]); });\r\n };\r\n myVis.prototype.updateScales = function() {\r\n this.xScale.domain([d3.max(this.data, function (d) { return d.MonthsSinceFounding; }) + 1, 0]).nice();\r\n this.yScale.domain([0, d3.max(this.data, function (d) { return d.Count; })]).nice();\r\n };\r\n\r\n return myVis;\r\n}());"]}