From scribe at crosswire.org  Thu Nov  3 16:35:44 2016
From: scribe at crosswire.org (scribe at crosswire.org)
Date: Thu, 03 Nov 2016 16:35:44 -0700
Subject: [Ils-source] r1496 - in trunk: src/com/resolutions/ils/data webapp
	webapp/WEB-INF
Message-ID: <E1c2RXs-0000gi-FF@crosswire.org>

Author: scribe
Date: 2016-11-03 16:35:44 -0700 (Thu, 03 Nov 2016)
New Revision: 1496

Modified:
   trunk/src/com/resolutions/ils/data/Course.java
   trunk/src/com/resolutions/ils/data/CourseAttempt.java
   trunk/src/com/resolutions/ils/data/UserProfile.java
   trunk/webapp/WEB-INF/sysconfig.properties
   trunk/webapp/admin_coursenew.jsp
   trunk/webapp/admin_curricnew.jsp
   trunk/webapp/aicc.jsp
   trunk/webapp/employee.jsp
   trunk/webapp/employeehometable.jsp
   trunk/webapp/manager_authorization.jsp
   trunk/webapp/menu.jsp
   trunk/webapp/report_employeecourseatt.jsp
   trunk/webapp/report_recurrent_training.jsp
Log:
bunch of crap to close out final bugs for 1.81


Modified: trunk/src/com/resolutions/ils/data/Course.java
===================================================================
--- trunk/src/com/resolutions/ils/data/Course.java	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/src/com/resolutions/ils/data/Course.java	2016-11-03 23:35:44 UTC (rev 1496)
@@ -2,6 +2,7 @@
 
 import org.apache.log4j.Logger;
 import org.crosswire.utils.HTTPUtils;
+import org.crosswire.xml.XMLBlock;
 import org.crosswire.data.*;
 import com.resolutions.ils.ILSSession;
 import java.util.Vector;
@@ -304,6 +305,14 @@
 		return getStringValue("COURSCERTGEN");
 	}
 
+	public boolean isCourseCertificateStore() {
+		return ("T".equals(getValue("COURSISCERTSTORE")));
+	}
+
+	public void setCourseCertificateStore(boolean val) {
+		setValue("COURSISCERTSTORE", (val) ? "T" : "F");
+	}
+
 	public String getCourseName() {
 		return getStringValue("COURSNAME");
 	}
@@ -502,6 +511,7 @@
 
 		// Default
 		String retVal = "width=800,height=600";
+/*
 		String url = getCourseURL();
 
 		if ((url != null) && (url.endsWith("frameset.htm"))) {
@@ -510,16 +520,21 @@
 			java.net.URL courseXML = null;
 			org.xml.sax.InputSource inputSource = null;
 			String expression = "/course";
+			XMLBlock courseXMLBlock = null;
 			try {
 				courseXML = new java.net.URL(url);
+				courseXMLBlock = XMLBlock.loadXMLBlock(courseXML.openStream());
+logger.info("courseXML: " + courseXMLBlock);
 				inputSource = new org.xml.sax.InputSource(courseXML.openStream());
 			}
 			catch (Exception ex) {
 //				logger.error(ex, ex);
 			}
-			if (inputSource == null) {
+			if (courseXMLBlock == null) {
 				try {
 					File f = new File(context.getRealPath(url));
+					courseXMLBlock = XMLBlock.loadXMLBlock(new java.io.FileInputStream(f));
+logger.info("courseXML: " + courseXMLBlock);
 					inputSource = new org.xml.sax.InputSource(new java.io.FileInputStream(f));
 				}
 				catch (Exception ex) {
@@ -545,6 +560,7 @@
 				logger.error("Bad course URL: " + url);
 			}
 		}
+*/
 		return retVal;
 	}
 

Modified: trunk/src/com/resolutions/ils/data/CourseAttempt.java
===================================================================
--- trunk/src/com/resolutions/ils/data/CourseAttempt.java	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/src/com/resolutions/ils/data/CourseAttempt.java	2016-11-03 23:35:44 UTC (rev 1496)
@@ -363,14 +363,18 @@
 	public void passAllAssociatedCurriculum(ILSSession session, HttpServletRequest request, String forcePassReason) {
 		Collection<Course> curs = Course.getUserCurricula(session, getCourseAttemptUserProfileID());
 		if (curs != null) {
+			// find all curricula our user is assigned and check each one
 			for (Course cur : curs) {
+
 				boolean isPassed = false;
 				Vector<Course> courses = cur.getCurriculumCourses();
 				if (courses != null) {
-					// is this course a member of the curriculum?
+					// is this course a member of the tested curriculum?
+					boolean isPertinent = false;
 					for (Course c : courses) {
 						if (c.getCourseID() == getCourseAttemptCourseID()) {
-							isPassed = true;
+							isPertinent = true;
+logger.info("curr is pertinent: " + cur.getCourseName());
 							break;
 						}
 					}
@@ -381,7 +385,7 @@
 					int  score       = 0;
 					int  courseCount = 0;
 
-					if (isPassed) {
+					if (isPertinent) {
 						for (Course c : courses) {
 							isPassed = false;
 
@@ -394,13 +398,15 @@
 									d = ca.getCourseAttemptCompleteDate();
 									endDate = (d != null && (endDate == 0 || endDate < d.getTime())) ? d.getTime() : endDate;
 
-									if (ca.getCourseAttemptStatusID() == STATUS_PASSED) {
+									boolean finished = !c.isCourseRequiresManagerApproval() || ca.isCourseAttemptManagerApproved();
+									if (finished && ca.getCourseAttemptStatusID() == STATUS_PASSED) {
 										int s = ca.getCourseAttemptScore();
 										if (s > -1) {
 											++courseCount;
 											score += s;
 										}
 										isPassed = true;
+logger.info("course is passed: " + c.getCourseName());
 										break;
 									}
 								}
@@ -412,7 +418,7 @@
 					}
 					// if we have a curriculum of which our course is a member and all courses in this curriculum are passed,
 					// then create a passed course attempt for this curriculum
-					if (isPassed) {
+					if (isPertinent && isPassed) {
 
 						if (courseCount != 0) score /= courseCount;
 
@@ -429,10 +435,10 @@
 						// TODO: timeframe?
 
 						ca = ca.saveNew(session);
+logger.info("passing curriulum: " + cur.getCourseName());
 
 						// render certificate
-						String certgen = cur.getCourseCertificateGenerator();
-						if (certgen != null && certgen.trim().length() > 0) {
+						if (cur.isCourseCertificateStore()) {
 							try {
 								ca.saveCertificate(ca.generateCertificate(session, request));
 							}
@@ -981,8 +987,7 @@
 
 			ca.sendStatusUpdateEvent(httpRequest.getSession().getServletContext());
 
-			String certgen = course.getCourseCertificateGenerator();
-			if (certgen != null && certgen.trim().length() > 0) {
+			if (course.isCourseCertificateStore()) {
 				try {
 					ca.saveCertificate(ca.generateCertificate(ilsSession, httpRequest));
 				}
@@ -997,16 +1002,22 @@
 		if (allCurriculumCourses && course.isCourseCurriculum()) {
 			for (Course curCourse : course.getCurriculumCourses()) {
 				Vector<CourseAttempt> cas = CourseAttempt.getUserCourseAttempts(ilsSession, userProfileID, curCourse.getCourseID(), false);
+				int caid = -1;
 				boolean skipCourse = false;
 				if (cas != null) {
 					for (CourseAttempt ca2 : cas) {
-						if (ca2.getCourseAttemptStatusID() == STATUS_PASSED && !ca2.isCourseAttemptExpired()) {
-							skipCourse = true;
+						if (!ca2.isCourseAttemptExpired()) {
+							if (ca2.getCourseAttemptStatusID() == STATUS_PASSED) {
+								skipCourse = true;
+							}
+							else {
+								caid = ca2.getCourseAttemptID();
+							}
 						}
 					}
 				}
 				if (!skipCourse) {
-					CourseAttempt.forcePass(curCourse.getCourseID(), userProfileID, reason, ilsSession, httpRequest, allCurriculumCourses, -1);
+					CourseAttempt.forcePass(curCourse.getCourseID(), userProfileID, reason, ilsSession, httpRequest, allCurriculumCourses, caid);
 				}
 			}
 		}

Modified: trunk/src/com/resolutions/ils/data/UserProfile.java
===================================================================
--- trunk/src/com/resolutions/ils/data/UserProfile.java	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/src/com/resolutions/ils/data/UserProfile.java	2016-11-03 23:35:44 UTC (rev 1496)
@@ -80,10 +80,21 @@
 	static String COUNTWOULDBEDELETES = "SELECT COUNT(*) WOULDBE FROM ("+SELECTOLDIDS+") TMPTABLE";
 	static String LOOKUPUSERGROUPS = "SELECT * FROM ILSGROUP T1, USERGROUP T2 WHERE T1.ILSGROUPID=T2.ILSGROUPID AND T2.USERPRID={USERPRID} AND T1.COMPANYID={COMPANYID} AND T2.COMPANYID={COMPANYID}";
 
-	static String RECURRENT_TRAINING_REPORT = "SELECT DISTINCT CASS.COMPANYID, CASS.USERPRID, CASS.COURSID, UP.USERPRLNAME, UP.USERPRFNAME, UP.USERPRNUM, "
+	static String RECURRENT_TRAINING_REPORT = "SELECT DISTINCT CASS.COMPANYID, CASS.USERPRID, CASS.COURSID, "
+		+ " CASS.FROMCURRICULUM,  CURDET.COURSISCURRICCERT, "
+		+ " UP.USERPRLNAME, UP.USERPRFNAME, UP.USERPRNUM, "
 		+ " (SELECT MAX(GROUPNAME) FROM USERGROUP UG JOIN ILSGROUP IG ON UG.ILSGROUPID=IG.ILSGROUPID AND UG.USERPRID=UP.USERPRID AND GROUPTYPEID=2) WORKGROUP," 
 		+ " (SELECT MAX(GROUPNAME) FROM USERGROUP UG JOIN ILSGROUP IG ON UG.ILSGROUPID=IG.ILSGROUPID AND UG.USERPRID=UP.USERPRID AND GROUPTYPEID=1) ROLE, "
-		+ "C.COURSNAME, CA.CACOMPLETEDATE, CASE C.COURSPASSEXPDAYS WHEN 0 THEN CA.CAEXPIREDON ELSE COALESCE(CA.CAEXPIREDON, CA.CACOMPLETEDATE+C.COURSPASSEXPDAYS) END AS CAEXPIREDON, DATEDIFF(day, CA.CAEXPIREDON, CURRENT_TIMESTAMP) as DAYSEXPIRED, CASE C.COURSPASSEXPDAYS WHEN 0 THEN NULL ELSE C.COURSPASSEXPDAYS - DATEDIFF(day, CA.CACOMPLETEDATE, CURRENT_TIMESTAMP) END as DAYSSHOULDEXPIRE from USERCOURSEASSIGNMENTSWITHGROUPS CASS LEFT JOIN COURSE C ON C.COURSID = CASS.COURSID LEFT JOIN COURSEATTEMPT CA ON CA.USERPRID=CASS.USERPRID AND CA.COURSID=CASS.COURSID INNER JOIN (SELECT USERPRID, COURSID, MAX(CACOMPLETEDATE) as max_date FROM COURSEATTEMPT GROUP BY USERPRID, COURSID)a on a.USERPRID = CA.USERPRID AND a.COURSID=CA.COURSID and a.max_date = CA.CACOMPLETEDATE LEFT JOIN USERPROFILE UP ON UP.COMPANYID=CASS.COMPANYID AND UP.USERPRID = CASS.USERPRID WHERE CASS.COMPANYID={COMPANYID} AND (DATEDIFF(day, CA.CAEXPIREDON, CURRENT_TIMESTAMP) >= 0 OR CASE C.COURSPASSEXPDAYS WHEN 0 THEN NULL ELSE C.COURSPASSEXPDAYS - DATEDIFF(day, CA.CACOMPLETEDATE, CURRENT_TIMESTAMP) END <={DAYSTILEXP}) AND UP.USERPRSTATUSID=" + STATUS_ACTIVE;
+		+ " C.COURSNAME, CA.CACOMPLETEDATE, CASE C.COURSPASSEXPDAYS WHEN 0 THEN CA.CAEXPIREDON ELSE COALESCE(CA.CAEXPIREDON, CA.CACOMPLETEDATE+C.COURSPASSEXPDAYS) END AS CAEXPIREDON, DATEDIFF(day, CA.CAEXPIREDON, CURRENT_TIMESTAMP) as DAYSEXPIRED, CASE C.COURSPASSEXPDAYS WHEN 0 THEN NULL ELSE C.COURSPASSEXPDAYS - DATEDIFF(day, CA.CACOMPLETEDATE, CURRENT_TIMESTAMP) END as DAYSSHOULDEXPIRE "
+		+ " FROM USERCOURSEASSIGNMENTSWITHGROUPS CASS "
+		+ " LEFT JOIN COURSE C ON C.COURSID = CASS.COURSID "
+		+ " LEFT JOIN COURSE CURDET ON CURDET.COURSID = CASS.FROMCURRICULUM "
+		+ " LEFT JOIN COURSEATTEMPT CA ON CA.USERPRID=CASS.USERPRID AND CA.COURSID=CASS.COURSID "
+		+ " INNER JOIN (SELECT USERPRID, COURSID, MAX(CACOMPLETEDATE) as max_date FROM COURSEATTEMPT GROUP BY USERPRID, COURSID)a on a.USERPRID = CA.USERPRID AND a.COURSID=CA.COURSID and a.max_date = CA.CACOMPLETEDATE "
+		+ " LEFT JOIN USERPROFILE UP ON UP.COMPANYID=CASS.COMPANYID AND UP.USERPRID = CASS.USERPRID "
+		+ " WHERE CASS.COMPANYID={COMPANYID} AND (DATEDIFF(day, CA.CAEXPIREDON, CURRENT_TIMESTAMP) >= 0 OR CASE C.COURSPASSEXPDAYS WHEN 0 THEN NULL ELSE C.COURSPASSEXPDAYS - DATEDIFF(day, CA.CACOMPLETEDATE, CURRENT_TIMESTAMP) END <={DAYSTILEXP}) AND UP.USERPRSTATUSID=" + STATUS_ACTIVE
+		+ " AND (CURDET.COURSISCURRICCERT IS NULL OR CURDET.COURSISCURRICCERT = 'F')"
+		+ "";
 static String RECURRENT_TRAINING_REPORT_LIMIT_TO_MANAGER = " AND CASS.USERPRID IN (SELECT DISTINCT UG.USERPRID FROM MANAGERGROUP MG LEFT JOIN USERGROUP UG ON UG.COMPANYID = MG.COMPANYID AND UG.ILSGROUPID=MG.ILSGROUPID WHERE MG.COMPANYID={COMPANYID} AND MG.USERPRID={USERPRID}) AND (GROUPTYPEID <> 2 OR ILSGROUPID IN (SELECT ILSGROUPID FROM MANAGERGROUP WHERE COMPANYID={COMPANYID} AND USERPRID={USERPRID}))";
 
 
@@ -174,7 +185,7 @@
         	}
         	if (modCols.contains("USERPRPASSWD")) {
         		eventsLogger.info("User: " + getUserProfileNum() + " PASSWORD changed " + "by user: " + session.getCurrentUserProfile().getUserProfileNum());
-        		if (email != null) {
+			if (email != null && getUserProfileStatusID() == STATUS_ACTIVE) {
 	    			try {
 						String subject = Utils.getSysConfig(email).getProperty("EmailTemplate1Subject");
 						String body    = Utils.getSysConfig(email).getProperty("EmailTemplate1Body");
@@ -223,7 +234,7 @@
     			try {
     				Properties sysConfig = Utils.getSysConfig(email);
 				    boolean emailNotice = "on".equals(sysConfig.getProperty("EmailEnableWelcome", "off"));
-				    if (emailNotice) {
+				    if (emailNotice && getUserProfileStatusID() == STATUS_ACTIVE) {
 						String subject = sysConfig.getProperty("EmailTemplate6Subject");
 						String body    = sysConfig.getProperty("EmailTemplate6Body");
 						HashMap<String, Object> params = new HashMap<String, Object>();
@@ -422,7 +433,7 @@
 
 		UserProfile retVal = new UserProfile();
 
-		String sql = "SELECT * FROM USERPROFILE UP WHERE UP.COMPANYID={COMPANYID} AND EXISTS (SELECT USERPRID FROM MANAGERGROUP MG WHERE MG.USERPRID=UP.USERPRID AND MG.COMPANYID={COMPANYID})";
+		String sql = "SELECT * FROM USERPROFILE UP WHERE UP.COMPANYID={COMPANYID} AND EXISTS (SELECT USERPRID FROM MANAGERGROUP MG WHERE MG.USERPRID=UP.USERPRID AND MG.COMPANYID={COMPANYID}) AND UP.USERPRSTATUSID=" + STATUS_ACTIVE;
 		retVal.setCompanyID(companyID);
 
 		if (excludeRecurEmailOverrides) {
@@ -558,7 +569,7 @@
 	}
 
     public UserProfile []getManagers() {
-        String sql = LOOKUP + " AND USERPRID IN (" + LOOKUPMANAGERS + ")";
+        String sql = LOOKUP + " AND USERPRID IN (" + LOOKUPMANAGERS + ") AND USERPRSTATUSID=" + STATUS_ACTIVE;
         Vector<UserProfile> rows = this.getDataSet(sql);
         return rows.toArray(new UserProfile[0]);
     }

Modified: trunk/webapp/WEB-INF/sysconfig.properties
===================================================================
--- trunk/webapp/WEB-INF/sysconfig.properties	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/WEB-INF/sysconfig.properties	2016-11-03 23:35:44 UTC (rev 1496)
@@ -52,3 +52,6 @@
 Docusign.integratorKey=SSIX-55285494-f60e-49a6-bb5c-70c8605fbee4
 Docusign.accountID=f1f63527-3250-49c8-b31b-3166cb3e6a46
 DefaultPasswd=changeme
+Add alternate certificate generators here
+#CertificateGeneratorCourse.1=certificate_alt.jsp|Alternate Course Certificate
+#CertificateGeneratorCurriculum.1=certificate_curriculum_alt.jsp|Alternate Curriculum Certificate

Modified: trunk/webapp/admin_coursenew.jsp
===================================================================
--- trunk/webapp/admin_coursenew.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/admin_coursenew.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -146,6 +146,9 @@
               else if ("certgen".equals(fi.getFieldName())) {
                   if (fi.getString() != null) try { current.setCourseCertificateGenerator(fi.getString()); } catch (Exception e) { logger.error(e); }
                 }
+              else if ("certstore".equals(fi.getFieldName())) {
+		if (fi.getString() != null) try { current.setCourseCertificateStore(Integer.parseInt(fi.getString())>0); } catch (Exception e) { logger.error(e); }
+                }
               else if ("passexp".equals(fi.getFieldName())) {
                   if (fi.getString() != null) try { current.setCoursePassExpireDays(Integer.parseInt(fi.getString())); } catch (Exception e) { logger.error(e); }
                 }
@@ -399,8 +402,34 @@
                         <td><input name="pass" type="text" value="<%=current.getCoursePass()%>" size="6"/> % </td>
                       </tr>
                       <tr>
+                        <td class="formHeadings">Course Certificate</td>
+                        <td>
+                              <input id="dontStoreCert" name="certstore" type="radio" <%=!current.isCourseCertificateStore()?"checked=\"true\"":""%> value="0" />
+				<label for="dontStoreCert">Displays Current Template and Data</label>
+                              <input id="storeCert" name="certstore" type="radio" <%=current.isCourseCertificateStore()?"checked=\"true\"":""%> value="1" />
+				<label for="storeCert">Imaged At Time of Completion</label>
+			</td>
+                      </tr>
+                      <tr>
                         <td class="formHeadings">Course Certificate Generator </td>
-                        <td><input name="certgen" style="width:100%" type="text" placeholder="default or certificate.jsp or certificate_curriculum.jsp" value="<%=current.getCourseCertificateGenerator()%>" size="40"/></td>
+                        <td>
+				<select name="certgen">
+					<option value="">default</option>
+<%
+				for (int i = 1; true; ++i) {
+					String gen = Utils.getSysConfig(session).getProperty("CertificateGeneratorCourse."+i);
+					if (gen == null) break;
+
+					String genPage = gen.split("\\|")[0];
+					String genName = gen.split("\\|")[1];
+%>
+					<option value="<%=genPage%>"<%=genPage.equals(current.getCourseCertificateGenerator())?" selected=\"selected\"":""%> size="40"/><%=genName%></option>
+<%
+				}
+%>
+			
+				</select>
+			</td>
                       </tr>
                       <tr>
                         <td class="formHeadings">Course Certificate Expires After </td>
@@ -524,7 +553,7 @@
                         <td>
                           <table class="tableData">
                             <tr>
-                              <th><input type="checkbox" name="cba1" onClick="checkAll('roleck', this.checked);"></th>
+                              <th><input type="checkbox" name="cba1" onClick="checkAll('roleck', this.checked);" /></th>
                               <th><a href="admin_coursenew.jsp?courseid=<%=courseID%>&sort=name"><t:t>role name</t:t></a></th>
                               <th><a href="admin_coursenew.jsp?courseid=<%=courseID%>&sort=desc">description</a></th>
                             </tr>
@@ -534,7 +563,7 @@
           boolean checked = (inCourse.contains(new Integer(role.getGroupID())));
 %>
                             <tr>
-                              <td><input id="roleck<%=i%>" type="checkbox" <%=(checked)?"checked=\"true\"":""%> name="roleid" value="<%=role.getGroupID()%>"></td>
+                              <td><input id="roleck<%=i%>" type="checkbox" <%=(checked)?"checked=\"true\"":""%> name="roleid" value="<%=role.getGroupID()%>" /></td>
                               <td><%=role.getGroupName()%></td>
                               <td><%=role.getGroupDesc()%></td>
                             </tr>

Modified: trunk/webapp/admin_curricnew.jsp
===================================================================
--- trunk/webapp/admin_curricnew.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/admin_curricnew.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -76,6 +76,8 @@
         if (val != null) current.setCourseDesc(val);
         val = request.getParameter("certgen");
   	if (val != null) current.setCourseCertificateGenerator(val);
+        val = request.getParameter("certstore");
+  	if (val != null) try { current.setCourseCertificateStore(Integer.parseInt(val)>0); } catch (Exception e) { logger.error(e); }
         val = request.getParameter("passexp");
 	if (val != null) try { current.setCoursePassExpireDays(Integer.parseInt(val)); } catch (Exception e) { logger.error(e); }
         val = request.getParameter("passreassign");
@@ -144,9 +146,10 @@
 <head>
   <title><%= ilsSession.getCurrentCompany().getCompanyName() %> eLearning Portal</title>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-  <script type="text/javascript" src="crosswire.js"></script>
-  <link href="lms_style.css" rel="stylesheet" type="text/css">
-  <script type="text/javascript" language="JavaScript">
+	<script type="text/javascript" src="crosswire.js"></script>
+	<script type="text/javascript" src="js/jquery/jquery.min.js"></script>
+	<link href="lms_style.css" rel="stylesheet" type="text/css">
+	<script type="text/javascript" language="JavaScript">
 <!--
 function confirmRevoke() {
     if (confirm("Running this routine will assign this curriculum as recurrent training to all applicable users.  Are you sure?")) {
@@ -160,6 +163,17 @@
 function rC(val) {
     document.coursesave.locURL.value = 'courses/'+val+'/frameset.htm';
 }
+function updateCertVisibility() {
+	var hide = !$('#curricCert').is(':checked');
+	$('#dontStoreCert').prop('disabled', hide);
+	$('#storeCert').prop('disabled', hide);
+	$('#certgen').prop('disabled', hide);
+}
+
+$(document).ready(function() {
+	updateCertVisibility();
+});
+
 // -->
   </script>
 
@@ -215,11 +229,37 @@
                             </tr>
                             <tr>
                               <td class="formHeadings">Enable Curriculum Certificate :</td>
-                              <td><input type="checkbox" <%=(current.isCourseCurriculumCertificate())?"checked=\"checked\"":""%> name="curricCert" value="true" /></td>
+                              <td><input onclick="updateCertVisibility();" type="checkbox" <%=(current.isCourseCurriculumCertificate())?"checked=\"checked\"":""%> id="curricCert" name="curricCert" value="true" /></td>
                             </tr>
 			      <tr>
+                        <td class="formHeadings">Curriculum Certificate</td>
+                        <td>
+                              <input id="dontStoreCert" name="certstore" type="radio" <%=!current.isCourseCertificateStore()?"checked=\"true\"":""%> value="0" />
+				<label for="dontStoreCert">Displays Current Template and Data</label>
+                              <input id="storeCert" name="certstore" type="radio" <%=current.isCourseCertificateStore()?"checked=\"true\"":""%> value="1" />
+				<label for="storeCert">Imaged At Time of Completion</label>
+			</td>
+                      </tr>
+                      <tr>
 				<td class="formHeadings">Curriculum Certificate Generator </td>
-				<td><input name="certgen" style="width:100%" type="text" placeholder="default or certificate.jsp or certificate_curriculum.jsp" value="<%=current.getCourseCertificateGenerator()%>" size="40"/></td>
+				<td>
+					<select id="certgen" name="certgen">
+						<option value="">default</option>
+<%
+					for (int i = 1; true; ++i) {
+						String gen = Utils.getSysConfig(session).getProperty("CertificateGeneratorCurriculum."+i);
+						if (gen == null) break;
+
+						String genPage = gen.split("\\|")[0];
+						String genName = gen.split("\\|")[1];
+%>
+						<option value="<%=genPage%>"<%=genPage.equals(current.getCourseCertificateGenerator())?" selected=\"selected\"":""%> size="40"/><%=genName%></option>
+<%
+					}
+%>
+				
+					</select>
+				</td>
 			      </tr>
                             <tr>
                               <td class="formHeadings">Enable Curriculum Part Retake :</td>

Modified: trunk/webapp/aicc.jsp
===================================================================
--- trunk/webapp/aicc.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/aicc.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -242,9 +242,9 @@
 				ca.setCourseAttemptCompleteDate(new Date());
 				ca.save(orig);
 				if (ca.getCourseAttemptStatusID() != originalStatusID) {
-					if (ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_PASSED) {
-						String certgen = course.getCourseCertificateGenerator();
-						if (certgen != null && certgen.trim().length() > 0) {
+					boolean finished = !((course.isCourseRequiresManagerApproval()) && (!ca.isCourseAttemptManagerApproved()));
+					if (finished && ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_PASSED) {
+						if (course.isCourseCertificateStore()) {
 							try {
 								ca.saveCertificate(ca.generateCertificate(ilsSession, request));
 							}

Modified: trunk/webapp/employee.jsp
===================================================================
--- trunk/webapp/employee.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/employee.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -153,8 +153,10 @@
           <td width="10%">
 <%
 	if (curricCompleted) {
-            out.append("<a href=\"#\" onClick=\"showWindow('certificate_curriculum.jsp?c=" + c.getCourseID() + "'); return false;\">");
-            out.append("<img src=\"images/print_certficate.png\" border=\"0\" alt=\"Certificate\" width=\"21\" height=\"20\"/>           </a>");
+		String generator = c.getCourseCertificateGenerator();
+		if (generator == null || generator.length() < 1) generator = "certificate_curriculum..jsp";
+		out.append("<a href=\"#\" onClick=\"showWindow('"+generator+"?c=" + c.getCourseID() + "'); return false;\">");
+		out.append("<img src=\"images/print_certficate.png\" border=\"0\" alt=\"Certificate\" width=\"21\" height=\"20\"/>           </a>");
 	}
 %>
           </td>
@@ -338,8 +340,10 @@
           <td class="centered">
 <%
         if (finished) {
+		String generator = cc.getCourseCertificateGenerator();
+		if (generator == null || generator.length() < 1) generator = "certificate.jsp";
 %>
-            <a href="#" onClick="showWindow('certificate.jsp?ca=<%=ca.getCourseAttemptID()%>'); return false;">
+            <a href="#" onClick="showWindow('<%=generator%>?ca=<%=ca.getCourseAttemptID()%>'); return false;">
               <img src="images/print_certficate.png" border="0" alt="Certificate" width="21" height="20"/>   </a>
 <%
         }
@@ -586,9 +590,11 @@
         out.append("</a></td>");
         out.append("<td class=\"centered\">");
         if (finished && !supressCerts) {
-            out.append("<a href=\"#\" onClick=\"showWindow('certificate.jsp?ca=" + ca.getCourseAttemptID() + "'); return false;\">");
-            out.append("<img src=\"images/print_certficate.png\" border=\"0\" alt=\"Certificate\" width=\"21\" height=\"20\"/>           </a>");
-        }
+		String generator = cc.getCourseCertificateGenerator();
+		if (generator == null || generator.length() < 1) generator = "certificate.jsp";
+		out.append("<a href=\"#\" onClick=\"showWindow('"+generator+"?ca=" + ca.getCourseAttemptID() + "'); return false;\">");
+		out.append("<img src=\"images/print_certficate.png\" border=\"0\" alt=\"Certificate\" width=\"21\" height=\"20\"/>           </a>");
+	}
         out.append("</td>");
         out.append("<td> " + score + " </td>");
         out.append("</tr>");

Modified: trunk/webapp/employeehometable.jsp
===================================================================
--- trunk/webapp/employeehometable.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/employeehometable.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -219,8 +219,10 @@
           <td class="centered">
 <%
         if (finished) {
+		String generator = cc.getCourseCertificateGenerator();
+		if (generator == null || generator.length() < 1) generator = "certificate.jsp";
 %>
-            <a href="#" onClick="showWindow('certificate.jsp?ca=<%=ca.getCourseAttemptID()%>'); return false;">
+            <a href="#" onClick="showWindow('<%=generator%>?ca=<%=ca.getCourseAttemptID()%>'); return false;">
                 <img src="images/print_certficate.png" border="0" alt="Certificate" width="21" height="20"/>           </a>
 <%
         }
@@ -344,8 +346,10 @@
           <td class="centered">
 <%
         if (finished) {
+		String generator = cc.getCourseCertificateGenerator();
+		if (generator == null || generator.length() < 1) generator = "certificate.jsp";
 %>
-            <a href="#" onClick="showWindow('certificate.jsp?ca=<%=ca.getCourseAttemptID()%>'); return false;">
+            <a href="#" onClick="showWindow('<%=generator%>?ca=<%=ca.getCourseAttemptID()%>'); return false;">
               <img src="images/print_certficate.png" border="0" alt="Certificate" width="21" height="20"/>   </a>
 <%
         }

Modified: trunk/webapp/manager_authorization.jsp
===================================================================
--- trunk/webapp/manager_authorization.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/manager_authorization.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -14,6 +14,7 @@
 
 
 <%
+	Logger logger = Logger.getLogger("report/manager/approval");
     String statusMsg = "";
     String validError = "";
     String action = request.getParameter("action");
@@ -40,8 +41,18 @@
             for (int i = 0; i < caids.length; i++) {
                 CourseAttempt ca = CourseAttempt.getCourseAttempt(ilsSession, Integer.parseInt(caids[i]));
                 CourseAttempt orig = (CourseAttempt)ca.clone();
+                Course c = Course.getCourse(ilsSession, ca.getCourseAttemptCourseID());
                 ca.setCourseAttemptManagerApproved(true);
                 ca.save(orig);
+		if (c.isCourseCertificateStore()) {
+			try {
+				ca.saveCertificate(ca.generateCertificate(ilsSession, request));
+			}
+			catch (Exception e) {
+				logger.error(e, e);
+			}
+		}
+		ca.passAllAssociatedCurriculum(ilsSession, request);
             }
         }
         statusMsg = "" + caids.length + " course" + ((caids.length != 1) ? "s have" : " has") + " been approved.";

Modified: trunk/webapp/menu.jsp
===================================================================
--- trunk/webapp/menu.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/menu.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -31,6 +31,8 @@
     }
 </style>
 
+	<form name="report_recurrent_training" action="report_recurrent_training.jsp" style="display:none;"></form>
+
    <div id="Banner"><span class="loggedinBar">Logged in as:<%=user.getUserProfileNum()%></span></div>
       <div id="MainMenu">
 <%
@@ -87,7 +89,7 @@
   }
   if ((user.getUserProfileAccessLevel() > UserProfile.ACCESS_MANAGER) || (user.hasAccess(UserProfile.ACCESS_MODE_MENU_STUDENT_RECORDS))) {
 %>
-	  <li><a href="report_recurrent_training.jsp">Recurrent Training Report</a></li>
+	  <li><a href="#" onclick="$.blockUI({ message: '<h3><img width=&quot;30&quot; height=&quot;30&quot; style=&quot;margin-right:10px;vertical-align:middle;&quot; src=&quot;images/loading.gif&quot;/> Generating Report...</h3>' }); document.report_recurrent_training.submit();return false;">Recurrent Training Report</a></li>
 <%
   }
   if (user.getUserProfileAccessLevel() >= UserProfile.ACCESS_MANAGER) {

Modified: trunk/webapp/report_employeecourseatt.jsp
===================================================================
--- trunk/webapp/report_employeecourseatt.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/report_employeecourseatt.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -20,7 +20,7 @@
 
 <%!
 	static SimpleDateFormat df  = new SimpleDateFormat("MM/dd/yyyy");
-	Logger logger = Logger.getLogger(this.getClass());
+	static Logger logger = Logger.getLogger("report/employee/course/attempt");
 %>
 <%
     ILSSession ilsSession = (ILSSession)session.getAttribute("ilsSession");
@@ -109,7 +109,7 @@
 		HashSet<CourseAttempt> meCourseAttempts = new HashSet<CourseAttempt>();
 		courseCourseAttempts.put(mainCourse.getCourseID(), meCourseAttempts);
 		logger.debug("processing course: " + mainCourse.getCourseName());
-		Vector cas        = CourseAttempt.getUserCourseAttempts(ilsSession, current.getUserProfileID(), mainCourse.getCourseID());
+		Vector cas = CourseAttempt.getUserCourseAttempts(ilsSession, current.getUserProfileID(), mainCourse.getCourseID());
 		boolean nonExpired = false;
 		for (int i = 0; i < cas.size() + 1; i++) {
 			CourseAttempt ca  = null;
@@ -119,6 +119,7 @@
 				else {
 					ca = new CourseAttempt();
 					ca.setCourseAttemptID(-1);
+					ca.setIntValue("COMPANYID", ilsSession.getCompanyID());
 				}
 			}
 			else {
@@ -161,7 +162,7 @@
 			ca.setValue("coursename", mainCourse.getCourseName());
 			ca.setValue("seattimetext", mainCourse.getCourseSeatTimeText());
 			ca.setCourseAttemptCourseID(mainCourse.getCourseID());
-			if (mainCourse.isCourseActive() || (ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_FAILED) || (ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_PASSED)) {
+			if (mainCourse.isCourseActive() || (ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_FAILED) || (finished && ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_PASSED)) {
 				courseAttempts.add(ca);
 				meCourseAttempts.add(ca);
 			}
@@ -203,8 +204,11 @@
 		cursor: pointer;
 	}
 </style>
-<script type="text/javascript" src="crosswire.js"></script>
-<script type="text/javascript" src="js/jquery/jquery.min.js"></script>
+
+	<script type="text/javascript" src="crosswire.js"></script>
+	<script type="text/javascript" src="js/jquery/jquery.min.js"></script>
+	<script type="text/javascript" src="js/jquery/jquery.blockUI.js"></script>
+
 <script type="text/javascript">
 var rcid=0;
 function retake(inCID) {
@@ -213,6 +217,7 @@
 }
 
 function retakeComplete(resultObject) {
+	$.blockUI({ message: '<h3><img width=&quot;30&quot; height=&quot;30&quot; style=&quot;margin-right:10px;vertical-align:middle;&quot; src=&quot;images/loading.gif&quot;/> Generating Report...</h3>' });
 	reason = resultObject.value;
 	document.getElementById('revokeCID').value=rcid;
 	if (reason.length > 0) reason = reason + ' / ';
@@ -229,6 +234,7 @@
 }
 
 function forcePassComplete(resultObject) {
+	$.blockUI({ message: '<h3><img width=&quot;30&quot; height=&quot;30&quot; style=&quot;margin-right:10px;vertical-align:middle;&quot; src=&quot;images/loading.gif&quot;/> Generating Report...</h3>' });
 	reason = resultObject.value;
 	document.getElementById('passCID').value=pcid;
 	document.getElementById('passCourseID').value=pcourseid;
@@ -464,9 +470,10 @@
 		int  passedCourseCount = (Integer)values.get("passedCourseCount");
 		int  totalCourseCount  = (Integer)values.get("totalCourseCount");
 		ca.setValue("seattimetext", Course.getNiceTimeText(timeFrame));
+		boolean finished = !((curr.isCourseRequiresManagerApproval()) && (!ca.isCourseAttemptManagerApproved()));
 		// if we have a stored history of passed or failed, use it.  Otherwise, compute curriculum status based on course progress
 		if (
-			   ca.getCourseAttemptStatusID() != CourseAttempt.STATUS_PASSED
+			   (!finished || ca.getCourseAttemptStatusID() != CourseAttempt.STATUS_PASSED)
 			&& ca.getCourseAttemptStatusID() != CourseAttempt.STATUS_FAILED
 		) {
 			ca.setValue("status", passedCourseCount == totalCourseCount ? "Passed" : (inProgressCourseCount == 0 && passedCourseCount == 0) ? "New" : "In Progress");
@@ -518,7 +525,8 @@
 	}
 	else if ("Passed".equals(status) && !supressCert) {
 		Course c = Course.getCourse(ca.getCompanyID(), ca.getCourseAttemptCourseID());
-		String urlString = (c.isCourseCurriculum() ? "certificate_curriculum.jsp" : "certificate.jsp");
+		String urlString = c.getCourseCertificateGenerator();
+		if (urlString == null || urlString.length() < 1) urlString = (c.isCourseCurriculum() ? "certificate_curriculum.jsp" : "certificate.jsp");
 		urlString += "?ca=" + ca.getCourseAttemptID();
 		urlString += "&c=" + c.getCourseID();
 		urlString += "&up=" + ca.getCourseAttemptUserProfileID();
@@ -554,7 +562,8 @@
 					d = ca.getCourseAttemptCompleteDate();
 					endDate = (d != null && (endDate == 0 || endDate < d.getTime())) ? d.getTime() : endDate;
 
-					if (ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_PASSED && !ca.isCourseAttemptExpired()) {
+					boolean finished = !((c.isCourseRequiresManagerApproval()) && (!ca.isCourseAttemptManagerApproved()));
+					if (finished && ca.getCourseAttemptStatusID() == CourseAttempt.STATUS_PASSED && !ca.isCourseAttemptExpired()) {
 						int s = ca.getCourseAttemptScore();
 						++passedCourseCount;
 						if (s > -1) {
@@ -581,5 +590,6 @@
 	values.put("totalCourseCount", totalCourseCount);
 	values.put("timeFrame", timeFrame);
 
+logger.debug("curriculum: " + curriculumID + "; values: " + values);
 }
 %>

Modified: trunk/webapp/report_recurrent_training.jsp
===================================================================
--- trunk/webapp/report_recurrent_training.jsp	2016-10-27 21:13:14 UTC (rev 1495)
+++ trunk/webapp/report_recurrent_training.jsp	2016-11-03 23:35:44 UTC (rev 1496)
@@ -174,7 +174,7 @@
                                     <td><a href="?action=csv"><img border="0" src="images/download_btn.gif" width="24" height="24" alt=""></a></td>
 					<td></td>
                                     <td><a href="?action=csv" class="formButtons">Download to Excel File </a></td>
-                                    <td><form action="#">View Upcoming Training Within The Next <input name="daysTilDue" size="5" value="<%=daysTilDue%>"/> Days <button>Go</button></form></td>
+                                    <td><form id="report_recurrent_training" action="report_recurrent_training.jsp">View Upcoming Training Within The Next <input name="daysTilDue" size="5" value="<%=daysTilDue%>"/> Days <button onclick="$.blockUI({ message: '<h3><img width=&quot;30&quot; height=&quot;30&quot; style=&quot;margin-right:10px;vertical-align:middle;&quot; src=&quot;images/loading.gif&quot;/> Generating Report...</h3>' });return true;">Go</button></form></td>
                                   </tr>
                                 </table>
                               </td>



From scribe at crosswire.org  Thu Nov  3 16:37:50 2016
From: scribe at crosswire.org (scribe at crosswire.org)
Date: Thu, 03 Nov 2016 16:37:50 -0700
Subject: [Ils-source] r1497 - trunk/db/mssql
Message-ID: <E1c2RZu-0000iI-KL@crosswire.org>

Author: scribe
Date: 2016-11-03 16:37:50 -0700 (Thu, 03 Nov 2016)
New Revision: 1497

Added:
   trunk/db/mssql/upgrade1.81.0-1.sql
Modified:
   trunk/db/mssql/ilsdb.sql
Log:
added db changed for 1.81


Modified: trunk/db/mssql/ilsdb.sql
===================================================================
--- trunk/db/mssql/ilsdb.sql	2016-11-03 23:35:44 UTC (rev 1496)
+++ trunk/db/mssql/ilsdb.sql	2016-11-03 23:37:50 UTC (rev 1497)
@@ -1,5 +1,5 @@
 CREATE TABLE ILSGROUP (COMPANYID INTEGER NOT NULL, ILSGROUPID INTEGER IDENTITY(1,1) NOT NULL, GROUPNAME VARCHAR(75) NOT NULL, GROUPDESC VARCHAR(255), GROUPTYPEID INTEGER, USERDATA VARCHAR(80), CONSTRAINT ILSGROUPPK1 PRIMARY KEY (COMPANYID, ILSGROUPID))
-CREATE TABLE COURSE (COMPANYID INTEGER NOT NULL, COURSID INTEGER IDENTITY(1,1) NOT NULL, COURSNUM VARCHAR(20) NOT NULL, COURSNAME VARCHAR(100), COURSDESC VARCHAR(500), COURSTYPEID INTEGER, COURSPASS INTEGER, COURSPASSEXPDAYS INTEGER, COURSREASBEFDAYS INTEGER, COURSURL VARCHAR(255), COURSCKLISTURL VARCHAR(255), COURSCOST FLOAT, COURSSEATMINS INTEGER, COURSISCURRICULUM CHAR(1), COURSISQUICKVIEW CHAR(1), COURSPOSTDATE DATETIME, COURSISACTIVE CHAR(1), COURSISIPRESTRICTED char(1), COURSREQMGRAPPRVL CHAR(1), USERDATA VARCHAR(80), COURSISCURRICCERT char(1) DEFAULT 'F', COURSISALLOWCERTPARTRETAKE char(1) DEFAULT 'F', COURSCERTGEN VARCHAR(60) DEFAULT null, CONSTRAINT COURSEPK1 PRIMARY KEY (COMPANYID, COURSID))
+CREATE TABLE COURSE (COMPANYID INTEGER NOT NULL, COURSID INTEGER IDENTITY(1,1) NOT NULL, COURSNUM VARCHAR(20) NOT NULL, COURSNAME VARCHAR(100), COURSDESC VARCHAR(500), COURSTYPEID INTEGER, COURSPASS INTEGER, COURSPASSEXPDAYS INTEGER, COURSREASBEFDAYS INTEGER, COURSURL VARCHAR(255), COURSCKLISTURL VARCHAR(255), COURSCOST FLOAT, COURSSEATMINS INTEGER, COURSISCURRICULUM CHAR(1), COURSISQUICKVIEW CHAR(1), COURSPOSTDATE DATETIME, COURSISACTIVE CHAR(1), COURSISIPRESTRICTED char(1), COURSREQMGRAPPRVL CHAR(1), USERDATA VARCHAR(80), COURSISCURRICCERT char(1) DEFAULT 'F', COURSISALLOWCERTPARTRETAKE char(1) DEFAULT 'F', COURSCERTGEN VARCHAR(60) DEFAULT null, COURSISCERTSTORE char(1) DEFAULT 'F', CONSTRAINT COURSEPK1 PRIMARY KEY (COMPANYID, COURSID))
 
 CREATE TABLE USERPROFILE (COMPANYID INTEGER NOT NULL, USERPRID INTEGER IDENTITY(1,1) NOT NULL, USERPRNUM VARCHAR(50) NOT NULL, USERPRPASSWD VARCHAR(50), USERPRMNAME VARCHAR(40), USERPRSNAME VARCHAR(40), USERPRFNAME VARCHAR(40), USERPRLNAME VARCHAR(40), USERPRSTATUSID INTEGER, USERPRADDR1 VARCHAR(60),USERPRADDR2 VARCHAR(60),USERPRCITY VARCHAR(30),USERPRSTATE VARCHAR(2),USERPRZIP VARCHAR(12),USERPRCOUNTRY VARCHAR(50),USERPREMAIL VARCHAR(50), USERPRPHONE VARCHAR(50), USERPREMPTITLEID INTEGER, USERPRLASTLOGIN TIMESTAMP, USERPRACCESSLEVEL INTEGER, USERPRACCESSMOD INTEGER, USERPRINACTDATE DATETIME, USERPRHIREDATE DATETIME, USERPRTERMDATE DATETIME, USERPRIPRESTRICTOVERRIDE char(1), USERDATA VARCHAR(80), USERPRSECONDLOGINOVERRIDE char(1) DEFAULT 'F', USERPMGRRECUREMAILSOVERRIDE char(1) DEFAULT 'F', CONSTRAINT USERPROFILEPK1 PRIMARY KEY (COMPANYID, USERPRID))
 CREATE TABLE ANNOUNCEMENT (COMPANYID INTEGER NOT NULL, ANNOUNCID INTEGER IDENTITY(1,1) NOT NULL, ANNOUNCTITLE VARCHAR(100), ANNOUNCMESSAGE VARCHAR(255), ANNOUNCEXP DATETIME, ANNOUNCURL VARCHAR(255), ANNOUNCPOSTDATE DATETIME, USERDATA VARCHAR(80), CONSTRAINT ANNOUNCEMENTPK1 PRIMARY KEY (COMPANYID, ANNOUNCID))
@@ -37,12 +37,15 @@
 INSERT INTO SECURITYMODE (COMPANYID, SECMODDESC, SECMODVAL) VALUES (1, 'Course Developer', 9)
 
 
+GO
 
 -- run separately
 
 CREATE VIEW USERCOURSEASSIGNMENTS WITH SCHEMABINDING AS SELECT DISTINCT T2.COMPANYID, T2.USERPRID, COALESCE (T9.COURSID, T1.COURSID) AS COURSID FROM   dbo.USERGROUP AS T2 INNER JOIN dbo.COURSEGROUP AS T3 ON T3.COMPANYID = T2.COMPANYID AND T3.ILSGROUPID = T2.ILSGROUPID INNER JOIN dbo.COURSE AS T1 ON T1.COMPANYID = T3.COMPANYID AND T1.COURSID = T3.COURSID LEFT OUTER JOIN dbo.CURRICULUMCOURSE AS T5 ON T5.COMPANYID = T1.COMPANYID AND T5.CURRICULUMID = T1.COURSID AND T1.COURSISCURRICULUM = 'T' LEFT OUTER JOIN dbo.COURSE AS T9 ON T5.COMPANYID IS NOT NULL AND T9.COMPANYID = T5.COMPANYID AND T9.COURSID = T5.COURSID WHERE (T9.COURSID IS NULL) AND (T1.COURSISCURRICULUM IS NULL) AND (T9.COURSID IS NULL) AND (T1.COURSISQUICKVIEW IS NULL OR T1.COURSISQUICKVIEW <> 'T') OR (T9.COURSID IS NULL) AND (T1.COURSISCURRICULUM IS NULL) AND (T9.COURSID IS NOT NULL) AND (T9.COURSISQUICKVIEW IS NULL OR T9.COURSISQUICKVIEW <> 'T') OR (T9.COURSID IS NULL) AND (T1.COURSISCURRICULUM <> 'T') AND (T1.COURSISQUICKVIEW IS NULL OR T1.COURSISQUICKVIEW <> 'T') OR (T9.COURSID IS NOT NULL) AND (T1.COURSISCURRICULUM <> 'T') AND (T9.COURSISQUICKVIEW IS NULL OR T9.COURSISQUICKVIEW <> 'T') OR (T9.COURSID IS NULL) AND (T1.COURSISQUICKVIEW IS NULL OR T1.COURSISQUICKVIEW <> 'T') AND (T1.COURSID <> T9.COURSID) OR (T9.COURSID IS NOT NULL) AND (T9.COURSISQUICKVIEW IS NULL OR T9.COURSISQUICKVIEW <> 'T') AND (T1.COURSID <> T9.COURSID);
 
-CREATE VIEW USERCOURSEASSIGNMENTSWITHGROUPS WITH SCHEMABINDING AS SELECT DISTINCT T2.COMPANYID, T2.USERPRID, COALESCE (T9.COURSID, T1.COURSID) AS COURSID, G.ILSGROUPID, G.GROUPTYPEID, CASE WHEN (T9.COURSID IS NULL) THEN NULL ELSE T1.COURSID END as FROMCURRICULUM
+GO
+
+CREATE VIEW USERCOURSEASSIGNMENTSWITHGROUPS WITH SCHEMABINDING AS SELECT DISTINCT T2.COMPANYID, T2.USERPRID, COALESCE (T9.COURSID, T1.COURSID) AS COURSID, G.ILSGROUPID, G.GROUPTYPEID, CASE WHEN (T9.COURSID IS NULL OR T9.COURSISCURRICULUM='T') THEN NULL ELSE T1.COURSID END as FROMCURRICULUM
 FROM   dbo.USERGROUP AS T2
 -- which courses and curriculum are assigned by user group
 INNER JOIN dbo.COURSEGROUP AS T3 ON T3.COMPANYID = T2.COMPANYID AND T3.ILSGROUPID = T2.ILSGROUPID
@@ -54,15 +57,20 @@
 LEFT OUTER JOIN dbo.COURSE AS T9 ON T5.COMPANYID IS NOT NULL AND T9.COMPANYID = T5.COMPANYID AND T9.COURSID = T5.COURSID
 -- group details
 LEFT OUTER JOIN dbo.ILSGROUP G ON G.ILSGROUPID=T2.ILSGROUPID
---	
-WHERE	(T9.COURSID IS NULL) AND (T1.COURSISCURRICULUM IS NULL) AND (T9.COURSID IS NULL) AND (T1.COURSISQUICKVIEW IS NULL OR T1.COURSISQUICKVIEW <> 'T')
-OR	(T9.COURSID IS NULL) AND (T1.COURSISCURRICULUM IS NULL) AND (T9.COURSID IS NOT NULL) AND (T9.COURSISQUICKVIEW IS NULL OR T9.COURSISQUICKVIEW <> 'T')
-OR	(T9.COURSID IS NULL) AND (T1.COURSISCURRICULUM <> 'T') AND (T1.COURSISQUICKVIEW IS NULL OR T1.COURSISQUICKVIEW <> 'T')
-OR	(T9.COURSID IS NOT NULL) AND (T9.COURSISQUICKVIEW IS NULL OR T9.COURSISQUICKVIEW <> 'T')
-OR	(T9.COURSID IS NULL) AND (T1.COURSISQUICKVIEW IS NULL OR T1.COURSISQUICKVIEW <> 'T') AND (T1.COURSID <> T9.COURSID)
-OR	(T9.COURSID IS NOT NULL) AND (T9.COURSISQUICKVIEW IS NULL OR T9.COURSISQUICKVIEW <> 'T') AND (T1.COURSID <> T9.COURSID);
+--      
+WHERE   (T9.COURSID IS NULL) AND (T1.COURSISCURRICULUM IS NULL) AND (T9.COURSID IS NULL) AND (T1.COURSISQUICKVIEW IS NULL OR T1.COURSISQUICKVIEW <> 'T')
+OR      (T9.COURSID IS NULL) AND (T1.COURSISCURRICULUM IS NULL) AND (T9.COURSID IS NOT NULL) AND (T9.COURSISQUICKVIEW IS NULL OR T9.COURSISQUICKVIEW <> 'T')
+OR      (T9.COURSID IS NULL) AND (T1.COURSISCURRICULUM <> 'T') AND (T1.COURSISQUICKVIEW IS NULL OR T1.COURSISQUICKVIEW <> 'T')
+OR      (T9.COURSID IS NOT NULL) AND (T9.COURSISQUICKVIEW IS NULL OR T9.COURSISQUICKVIEW <> 'T')
+OR      (T9.COURSID IS NULL) AND (T1.COURSISQUICKVIEW IS NULL OR T1.COURSISQUICKVIEW <> 'T') AND (T1.COURSID <> T9.COURSID)
+OR      (T9.COURSID IS NOT NULL) AND (T9.COURSISQUICKVIEW IS NULL OR T9.COURSISQUICKVIEW <> 'T') AND (T1.COURSID <> T9.COURSID);
 
+GO
+
 CREATE VIEW COURSEATTEMPTSTATUS WITH SCHEMABINDING AS SELECT CA.COMPANYID, CA.USERPRID, CA.COURSID, CA.COURSATTID, CA.CACOMPLETEDATE, CA.CAEXPIREDON,  COALESCE(CA.CASTATUSID, 0) AS CASTATUSID, CASE COALESCE(CA.CASTATUSID, 0) WHEN 3 THEN 1 WHEN 0 THEN 1 ELSE 0 END AS CRS_OPEN, CASE COALESCE(CA.CASTATUSID, 0) WHEN 1 THEN 1 ELSE 0 END               AS CRS_COMPLETED, CASE COALESCE(CA.CASTATUSID, 0) WHEN 2 THEN 1 ELSE 0 END               AS CRS_FAILED FROM DBO.COURSEATTEMPT CA;
 
+GO
 
 CREATE NONCLUSTERED INDEX CAEXPIREDONINDEX ON COURSEATTEMPT (COMPANYID,CAEXPIREDON) INCLUDE (USERPRID,COURSID,CACOMPLETEDATE,CASTATUSID);
+
+GO

Added: trunk/db/mssql/upgrade1.81.0-1.sql
===================================================================
--- trunk/db/mssql/upgrade1.81.0-1.sql	                        (rev 0)
+++ trunk/db/mssql/upgrade1.81.0-1.sql	2016-11-03 23:37:50 UTC (rev 1497)
@@ -0,0 +1,30 @@
+alter table COURSE add COURSCERTGEN VARCHAR(60) DEFAULT null;
+alter table COURSE add COURSISCERTSTORE char(1) DEFAULT 'F';
+alter table COURSE add COURSISALLOWCURRPARTRETAKE char(1) default 'F';
+
+DROP VIEW USERCOURSEASSIGNMENTSWITHGROUPS;
+GO
+
+CREATE VIEW USERCOURSEASSIGNMENTSWITHGROUPS WITH SCHEMABINDING AS SELECT DISTINCT T2.COMPANYID, T2.USERPRID, COALESCE (T9.COURSID, T1.COURSID) AS COURSID, G.ILSGROUPID, G.GROUPTYPEID, CASE WHEN (T9.COURSID IS NULL OR T9.COURSISCURRICULUM='T') THEN NULL ELSE T1.COURSID END as FROMCURRICULUM
+FROM   dbo.USERGROUP AS T2
+-- which courses and curriculum are assigned by user group
+INNER JOIN dbo.COURSEGROUP AS T3 ON T3.COMPANYID = T2.COMPANYID AND T3.ILSGROUPID = T2.ILSGROUPID
+-- course details for courses curriculum assigned by user group
+INNER JOIN dbo.COURSE AS T1 ON T1.COMPANYID = T3.COMPANYID AND T1.COURSID = T3.COURSID
+-- for each curriculum, pull in all courses. T5.COURSID is a course assigned via a curriculum
+LEFT OUTER JOIN dbo.CURRICULUMCOURSE AS T5 ON T5.COMPANYID = T1.COMPANYID AND T5.CURRICULUMID = T1.COURSID AND T1.COURSISCURRICULUM = 'T'
+-- course details for courses assigned via a curriculum
+LEFT OUTER JOIN dbo.COURSE AS T9 ON T5.COMPANYID IS NOT NULL AND T9.COMPANYID = T5.COMPANYID AND T9.COURSID = T5.COURSID
+-- group details
+LEFT OUTER JOIN dbo.ILSGROUP G ON G.ILSGROUPID=T2.ILSGROUPID
+--      
+WHERE   (T9.COURSID IS NULL) AND (T1.COURSISCURRICULUM IS NULL) AND (T9.COURSID IS NULL) AND (T1.COURSISQUICKVIEW IS NULL OR T1.COURSISQUICKVIEW <> 'T')
+OR      (T9.COURSID IS NULL) AND (T1.COURSISCURRICULUM IS NULL) AND (T9.COURSID IS NOT NULL) AND (T9.COURSISQUICKVIEW IS NULL OR T9.COURSISQUICKVIEW <> 'T')
+OR      (T9.COURSID IS NULL) AND (T1.COURSISCURRICULUM <> 'T') AND (T1.COURSISQUICKVIEW IS NULL OR T1.COURSISQUICKVIEW <> 'T')
+OR      (T9.COURSID IS NOT NULL) AND (T9.COURSISQUICKVIEW IS NULL OR T9.COURSISQUICKVIEW <> 'T')
+OR      (T9.COURSID IS NULL) AND (T1.COURSISQUICKVIEW IS NULL OR T1.COURSISQUICKVIEW <> 'T') AND (T1.COURSID <> T9.COURSID)
+OR      (T9.COURSID IS NOT NULL) AND (T9.COURSISQUICKVIEW IS NULL OR T9.COURSISQUICKVIEW <> 'T') AND (T1.COURSID <> T9.COURSID);
+
+
+GO
+



From scribe at crosswire.org  Thu Nov  3 16:39:54 2016
From: scribe at crosswire.org (scribe at crosswire.org)
Date: Thu, 03 Nov 2016 16:39:54 -0700
Subject: [Ils-source] r1498 - trunk/db/mssql
Message-ID: <E1c2Rbu-0000k2-40@crosswire.org>

Author: scribe
Date: 2016-11-03 16:39:53 -0700 (Thu, 03 Nov 2016)
New Revision: 1498

Modified:
   trunk/db/mssql/pending.1.sql
Log:
clearing out pending db changes


Modified: trunk/db/mssql/pending.1.sql
===================================================================
--- trunk/db/mssql/pending.1.sql	2016-11-03 23:37:50 UTC (rev 1497)
+++ trunk/db/mssql/pending.1.sql	2016-11-03 23:39:53 UTC (rev 1498)
@@ -1 +0,0 @@
-alter table COURSE add COURSCERTGEN VARCHAR(60) DEFAULT null;



From scribe at crosswire.org  Thu Nov  3 16:40:39 2016
From: scribe at crosswire.org (scribe at crosswire.org)
Date: Thu, 03 Nov 2016 16:40:39 -0700
Subject: [Ils-source] r1499 - in trunk/webapp/css: . jquery-ui
	jquery-ui/images
Message-ID: <E1c2Rcd-0000kt-0l@crosswire.org>

Author: scribe
Date: 2016-11-03 16:40:38 -0700 (Thu, 03 Nov 2016)
New Revision: 1499

Added:
   trunk/webapp/css/jquery-ui/
   trunk/webapp/css/jquery-ui/images/
   trunk/webapp/css/jquery-ui/images/animated-overlay.gif
   trunk/webapp/css/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png
   trunk/webapp/css/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png
   trunk/webapp/css/jquery-ui/images/ui-bg_flat_10_000000_40x100.png
   trunk/webapp/css/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png
   trunk/webapp/css/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png
   trunk/webapp/css/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png
   trunk/webapp/css/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png
   trunk/webapp/css/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
   trunk/webapp/css/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
   trunk/webapp/css/jquery-ui/images/ui-icons_222222_256x240.png
   trunk/webapp/css/jquery-ui/images/ui-icons_228ef1_256x240.png
   trunk/webapp/css/jquery-ui/images/ui-icons_ef8c08_256x240.png
   trunk/webapp/css/jquery-ui/images/ui-icons_ffd27a_256x240.png
   trunk/webapp/css/jquery-ui/images/ui-icons_ffffff_256x240.png
   trunk/webapp/css/jquery-ui/jquery-ui.min.css
Log:
added jquery-ui theme


Added: trunk/webapp/css/jquery-ui/images/animated-overlay.gif
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/animated-overlay.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-bg_flat_10_000000_40x100.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-bg_flat_10_000000_40x100.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-icons_222222_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-icons_222222_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-icons_228ef1_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-icons_228ef1_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-icons_ef8c08_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-icons_ef8c08_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-icons_ffd27a_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-icons_ffd27a_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/images/ui-icons_ffffff_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/css/jquery-ui/images/ui-icons_ffffff_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/css/jquery-ui/jquery-ui.min.css
===================================================================
--- trunk/webapp/css/jquery-ui/jquery-ui.min.css	                        (rev 0)
+++ trunk/webapp/css/jquery-ui/jquery-ui.min.css	2016-11-03 23:40:38 UTC (rev 1499)
@@ -0,0 +1,7 @@
+/*! jQuery UI - v1.10.4 - 2014-04-02
+* http://jqueryui.com
+* Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px}
\ No newline at end of file



From scribe at crosswire.org  Thu Nov  3 16:43:45 2016
From: scribe at crosswire.org (scribe at crosswire.org)
Date: Thu, 03 Nov 2016 16:43:45 -0700
Subject: [Ils-source] r1500 - trunk
Message-ID: <E1c2Rfd-0000nA-2p@crosswire.org>

Author: scribe
Date: 2016-11-03 16:43:44 -0700 (Thu, 03 Nov 2016)
New Revision: 1500

Added:
   trunk/eligible_to_trunk
Removed:
   trunk/eligible
Modified:
   trunk/
Log:
added eligble script to show what's committed on production which might need to be committed back to trunk



Property changes on: trunk
___________________________________________________________________
Added: svn:mergeinfo
   + /branches/1.6:1368,1370,1440

Deleted: trunk/eligible
===================================================================
--- trunk/eligible	2016-11-03 23:40:38 UTC (rev 1499)
+++ trunk/eligible	2016-11-03 23:43:44 UTC (rev 1500)
@@ -1,2 +0,0 @@
-#!/bin/sh
-svn mergeinfo --show-revs=eligible ^/trunk | tr "\\n" "," | xargs -i svn log -c {} ^/trunk

Copied: trunk/eligible_to_trunk (from rev 1497, trunk/eligible)
===================================================================
--- trunk/eligible_to_trunk	                        (rev 0)
+++ trunk/eligible_to_trunk	2016-11-03 23:43:44 UTC (rev 1500)
@@ -0,0 +1,2 @@
+#!/bin/sh
+svn mergeinfo --show-revs=eligible ^/branches/1.6 | tr "\\n" "," | xargs -i svn log -c {} ^/branches/1.6



From scribe at crosswire.org  Thu Nov  3 16:55:47 2016
From: scribe at crosswire.org (scribe at crosswire.org)
Date: Thu, 03 Nov 2016 16:55:47 -0700
Subject: [Ils-source] r1501 - trunk/webapp/WEB-INF/lib
Message-ID: <E1c2RrH-0000w9-MP@crosswire.org>

Author: scribe
Date: 2016-11-03 16:55:47 -0700 (Thu, 03 Nov 2016)
New Revision: 1501

Added:
   trunk/webapp/WEB-INF/lib/activation.jar
   trunk/webapp/WEB-INF/lib/antlr-runtime-3.5.2.jar
   trunk/webapp/WEB-INF/lib/avalon-framework-api-4.3.1.jar
   trunk/webapp/WEB-INF/lib/avalon-framework-impl-4.3.1.jar
   trunk/webapp/WEB-INF/lib/jgl3.1.0.jar
   trunk/webapp/WEB-INF/lib/js.jar
   trunk/webapp/WEB-INF/lib/jtds-1.2.5.jar
   trunk/webapp/WEB-INF/lib/nekohtml-1.9.22.jar
   trunk/webapp/WEB-INF/lib/serializer.jar
   trunk/webapp/WEB-INF/lib/slf4j-api-1.7.12.jar
   trunk/webapp/WEB-INF/lib/unbescape-1.1.1.RELEASE.jar
   trunk/webapp/WEB-INF/lib/xalan-2.7.0.jar
   trunk/webapp/WEB-INF/lib/xercesImpl-2.11.0.jar
   trunk/webapp/WEB-INF/lib/xerces_2_5_0.jar
   trunk/webapp/WEB-INF/lib/xml-apis-1.4.01.jar
   trunk/webapp/WEB-INF/lib/xml-apis-ext-1.3.04.jar
   trunk/webapp/WEB-INF/lib/xmlgraphics-commons-2.0.jar
Modified:
   trunk/webapp/WEB-INF/lib/crosswire.jar
   trunk/webapp/WEB-INF/lib/ils.jar
Log:
updated jars and added new requirements for generating pdf certs


Added: trunk/webapp/WEB-INF/lib/activation.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/activation.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/antlr-runtime-3.5.2.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/antlr-runtime-3.5.2.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/avalon-framework-api-4.3.1.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/avalon-framework-api-4.3.1.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/avalon-framework-impl-4.3.1.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/avalon-framework-impl-4.3.1.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Modified: trunk/webapp/WEB-INF/lib/crosswire.jar
===================================================================
(Binary files differ)

Modified: trunk/webapp/WEB-INF/lib/ils.jar
===================================================================
(Binary files differ)

Added: trunk/webapp/WEB-INF/lib/jgl3.1.0.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/jgl3.1.0.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/js.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/js.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/jtds-1.2.5.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/jtds-1.2.5.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/nekohtml-1.9.22.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/nekohtml-1.9.22.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/serializer.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/serializer.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/slf4j-api-1.7.12.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/slf4j-api-1.7.12.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/unbescape-1.1.1.RELEASE.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/unbescape-1.1.1.RELEASE.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/xalan-2.7.0.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/xalan-2.7.0.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/xercesImpl-2.11.0.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/xercesImpl-2.11.0.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/xerces_2_5_0.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/xerces_2_5_0.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/xml-apis-1.4.01.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/xml-apis-1.4.01.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/xml-apis-ext-1.3.04.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/xml-apis-ext-1.3.04.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/webapp/WEB-INF/lib/xmlgraphics-commons-2.0.jar
===================================================================
(Binary files differ)


Property changes on: trunk/webapp/WEB-INF/lib/xmlgraphics-commons-2.0.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream



From scribe at crosswire.org  Wed Nov 30 10:33:52 2016
From: scribe at crosswire.org (scribe at crosswire.org)
Date: Wed, 30 Nov 2016 10:33:52 -0700
Subject: [Ils-source] r1504 - trunk/webapp
Message-ID: <E1cC8lU-0000lv-1j@crosswire.org>

Author: scribe
Date: 2016-11-30 10:33:51 -0700 (Wed, 30 Nov 2016)
New Revision: 1504

Modified:
   trunk/webapp/admin_coursenew.jsp
   trunk/webapp/admin_curricnew.jsp
   trunk/webapp/report_employeecourseatt.jsp
Log:
style updates from Dominick


Modified: trunk/webapp/admin_coursenew.jsp
===================================================================
--- trunk/webapp/admin_coursenew.jsp	2016-11-08 19:10:12 UTC (rev 1503)
+++ trunk/webapp/admin_coursenew.jsp	2016-11-30 17:33:51 UTC (rev 1504)
@@ -402,6 +402,14 @@
                         <td><input name="pass" type="text" value="<%=current.getCoursePass()%>" size="6"/> % </td>
                       </tr>
                       <tr>
+	                              <td>&nbsp;</td>
+	                              <td colspan="2">&nbsp;</td>
+	                            </tr>
+	                            <tr>
+	                              <td class="formHeadingsTitle">Course Certificate Settings</td>
+	                              <td colspan="2">&nbsp;</td>
+	                            </tr>
+                      <tr>
                         <td class="formHeadings">Course Certificate</td>
                         <td>
                               <input id="dontStoreCert" name="certstore" type="radio" <%=!current.isCourseCertificateStore()?"checked=\"true\"":""%> value="0" />
@@ -432,6 +440,15 @@
 			</td>
                       </tr>
                       <tr>
+	                              <td>&nbsp;</td>
+	                              <td colspan="2">&nbsp;</td>
+	                            </tr>
+	                            <tr>
+	                              <td class="formHeadingsTitle">Recurrent Training Settings</td>
+	                              <td colspan="2">&nbsp;</td>
+	                            </tr>
+                      <tr>
+                      <tr>
                         <td class="formHeadings">Course Certificate Expires After </td>
                         <td><input name="passexp" type="text" value="<%=current.getCoursePassExpireDays()%>" size="6"/> Days</td>
                       </tr>
@@ -444,6 +461,15 @@
                         <td><a href="#" onClick="confirmRevoke(); return false;"><img border="0" src="images/run_btn.gif" width="51" height="24" alt="Perform Action"/></a></td>
                       </tr>
                       <tr>
+	                              <td>&nbsp;</td>
+	                              <td colspan="2">&nbsp;</td>
+	                            </tr>
+	                            <tr>
+	                              <td class="formHeadingsTitle">Manager Approval Settings</td>
+	                              <td colspan="2">&nbsp;</td>
+	                            </tr>
+                      <tr>
+                      <tr>
                         <td class="formHeadings">Requires Management Approval for Completion: </td>
                         <td colspan="2">
                             <select name="mgrApprvl">

Modified: trunk/webapp/admin_curricnew.jsp
===================================================================
--- trunk/webapp/admin_curricnew.jsp	2016-11-08 19:10:12 UTC (rev 1503)
+++ trunk/webapp/admin_curricnew.jsp	2016-11-30 17:33:51 UTC (rev 1504)
@@ -227,12 +227,25 @@
                                   <option value="0" <%=(!current.isCourseActive())?"selected=\"true\"":""%>>Inactive</option>
                               </select></td>
                             </tr>
+							<tr>
+                              <td class="formHeadings">Enable Curriculum Partial Retake :</td>
+                              <td><input type="checkbox" <%=(current.isCourseAllowCurriculumPartRetake())?"checked=\"checked\"":""%> name="curricPartRetake" value="true" /></td>
+                            </tr>
                             <tr>
+	                              <td>&nbsp;</td>
+	                              <td colspan="2">&nbsp;</td>
+	                            </tr>
+	                            <tr>
+	                              <td class="formHeadingsTitle">Cirriculum Certificate Settings</td>
+	                              <td colspan="2">&nbsp;</td>
+	                            </tr>
+                      <tr>
+                            <tr>
                               <td class="formHeadings">Enable Curriculum Certificate :</td>
-                              <td><input onclick="updateCertVisibility();" type="checkbox" <%=(current.isCourseCurriculumCertificate())?"checked=\"checked\"":""%> id="curricCert" name="curricCert" value="true" /></td>
+                              <td><input onClick="updateCertVisibility();" type="checkbox" <%=(current.isCourseCurriculumCertificate())?"checked=\"checked\"":""%> id="curricCert" name="curricCert" value="true" /></td>
                             </tr>
 			      <tr>
-                        <td class="formHeadings">Curriculum Certificate</td>
+                        <td class="formHeadings">Curriculum Certificate :</td>
                         <td>
                               <input id="dontStoreCert" name="certstore" type="radio" <%=!current.isCourseCertificateStore()?"checked=\"true\"":""%> value="0" />
 				<label for="dontStoreCert">Displays Current Template and Data</label>
@@ -241,7 +254,7 @@
 			</td>
                       </tr>
                       <tr>
-				<td class="formHeadings">Curriculum Certificate Generator </td>
+				<td class="formHeadings">Curriculum Certificate Type :</td>
 				<td>
 					<select id="certgen" name="certgen">
 						<option value="">default</option>
@@ -261,10 +274,14 @@
 					</select>
 				</td>
 			      </tr>
-                            <tr>
-                              <td class="formHeadings">Enable Curriculum Part Retake :</td>
-                              <td><input type="checkbox" <%=(current.isCourseAllowCurriculumPartRetake())?"checked=\"checked\"":""%> name="curricPartRetake" value="true" /></td>
-                            </tr>
+                  <tr>
+	                              <td>&nbsp;</td>
+	                              <td colspan="2">&nbsp;</td>
+	                            </tr>
+	                            <tr>
+	                              <td class="formHeadingsTitle">Recurrent Training Settings</td>
+	                              <td colspan="2">&nbsp;</td>
+	                            </tr>
                       <tr>
                         <td class="formHeadings">Curriculum Certificate Expires After </td>
                         <td><input name="passexp" type="text" value="<%=current.getCoursePassExpireDays()%>" size="6"/> Days</td>

Modified: trunk/webapp/report_employeecourseatt.jsp
===================================================================
--- trunk/webapp/report_employeecourseatt.jsp	2016-11-08 19:10:12 UTC (rev 1503)
+++ trunk/webapp/report_employeecourseatt.jsp	2016-11-30 17:33:51 UTC (rev 1504)
@@ -195,16 +195,6 @@
 <title><%= ilsSession.getCurrentCompany().getCompanyName() %> eLearning Portal</title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 <link href="lms_style.css" rel="stylesheet" type="text/css">
-<style>
-	.curriculumHeader {
-		background: lightgrey;
-	}
-
-	.curHeader, .courseHeader {
-		cursor: pointer;
-	}
-</style>
-
 	<script type="text/javascript" src="crosswire.js"></script>
 	<script type="text/javascript" src="js/jquery/jquery.min.js"></script>
 	<script type="text/javascript" src="js/jquery/jquery.blockUI.js"></script>
@@ -306,10 +296,10 @@
                         </td>
                       </tr>
                       <tr>
-                        <td><table class="tableDataList">
+                        <td><table class="tableDataList tableDataListStudentRecords">
                             <tr>
-                              <th title="Hide/Show Courses within Curriculum">C</th>
-                              <th title="Hide/Show All History for an Item">H</th>
+                              <th title="Hide/Show Courses within Curriculum"></th>
+                              <th title="Hide/Show All History for an Item"></th>
 <% if (managing) { %>                            
                               <th>Comments</th>
 <% } %>                              
@@ -491,7 +481,7 @@
 		out.write("<td>");
 		if ("Passed".equals(status)) {
 			if (!ca.isCourseAttemptExpired() && !supressRetake) {
-				out.write("<a href=\"#\" onClick=\"retake("+ca.getCourseAttemptID()+");return false;\" class=\"Assign\">Assign Retake</a>");
+				out.write("<a href=\"#\" onClick=\"retake("+ca.getCourseAttemptID()+");return false;\" class=\"Assign\">Assign Retake</a><br>");
 			}
 		}
 		else if (!"Awaiting <t:t>Manager</t:t> Approval".equals(status) && user.getUserProfileAccessLevel() > UserProfile.ACCESS_MANAGER || user.hasAccess(UserProfile.ACCESS_MODE_STUDENTREC_PASS_OVERRIDE)) {
@@ -513,7 +503,7 @@
 
 	out.write("<td>"+status+"</td>");
 	out.write("<td>"+ca.getStringValue("coursenum")+"</td>");
-	out.write("<td><a href=\"#\" onclick=\"p('course','"+ca.getCourseAttemptCourseID()+"','"+wordNum+"');\"><strong>"+ca.getStringValue("coursename")+"</strong></a></td>");
+	out.write("<td><a href=\"#\" onclick=\"p('course','"+ca.getCourseAttemptCourseID()+"','"+wordNum+"');\">"+ca.getStringValue("coursename")+"</a></td>");
 	out.write("<td>"+ca.getStringValue("seattimetext")+"</td>");
 	out.write("<td>"+startDate+"</td>");
 	out.write("<td>"+endDate+"</td>");



