Chorem-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
April 2012
- 2 participants
- 8 discussions
r142 - in trunk/chorem-webmotion/src/main: java/org/wikitty/web/jsptag webapp/WEB-INF webapp/WEB-INF/jsp
by ymartel@users.chorem.org 26 Apr '12
by ymartel@users.chorem.org 26 Apr '12
26 Apr '12
Author: ymartel
Date: 2012-04-26 18:04:03 +0200 (Thu, 26 Apr 2012)
New Revision: 142
Url: http://chorem.org/repositories/revision/chorem/142
Log:
Prepare a tag support to display wikitty fields
Added:
trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyDisplay.java
Modified:
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/view.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/wikitty.tld
Added: trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyDisplay.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyDisplay.java (rev 0)
+++ trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyDisplay.java 2012-04-26 16:04:03 UTC (rev 142)
@@ -0,0 +1,183 @@
+package org.wikitty.web.jsptag;
+
+import org.apache.commons.lang3.StringUtils;
+import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.FieldType;
+import org.nuiton.wikitty.entities.Wikitty;
+
+import javax.servlet.ServletContext;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Tag Support to display Wikitty fields.
+ *
+ * @author ymartel <martel(a)codelutin.com>
+ * @since 04/26/2012
+ */
+public class WikittyDisplay extends SimpleTagSupport {
+
+
+ protected String name="";
+ protected Object value="";
+
+ protected Wikitty wikitty;
+ protected String fqfield="";
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setValue(Object value) {
+ this.value = value;
+ }
+
+ public void setWikitty(Wikitty wikitty) {
+ this.wikitty = wikitty;
+ }
+
+ public void setFqfield(String fqfield) {
+ this.fqfield = fqfield;
+ }
+
+ @Override
+ public void doTag() throws JspException, IOException {
+ // par defaut si pas de name on utilise celui du field
+ if (StringUtils.isBlank(name)) {
+ name = fqfield;
+ }
+
+ JspWriter output = getJspContext().getOut();
+ PageContext pageContext = (PageContext)getJspContext();
+ ServletContext servletContext = pageContext.getServletContext();
+ String contextPath = servletContext.getContextPath();
+
+ String extName = WikittyUtil.getExtensionNameFromFQFieldName(fqfield);
+ String fieldName = WikittyUtil.getFieldNameFromFQFieldName(fqfield);
+ FieldType field = wikitty.getFieldType(fqfield);
+
+ if (field != null) {
+ switch(field.getType()) {
+ case BINARY:
+ viewBinary(output, contextPath, name, wikitty, field, extName, fieldName);
+ break;
+ case BOOLEAN:
+ viewBoolean(output, contextPath, name, wikitty, field, extName, fieldName);
+ break;
+ case DATE:
+ viewDate(output, contextPath, name, wikitty, field, extName, fieldName);
+ break;
+ case NUMERIC:
+ viewNumeric(output, contextPath, name, wikitty, field, extName, fieldName);
+ break;
+ case STRING:
+ if (field.isCollection()) {
+ viewCollectionString(output, contextPath, name, wikitty, field, extName, fieldName);
+ } else {
+ viewString(output, contextPath, name, wikitty, field, extName, fieldName);
+ }
+ break;
+ case WIKITTY:
+ if (field.isCollection()) {
+ viewCollectionWikitty(output, contextPath, name, wikitty, field, extName, fieldName);
+ } else {
+ viewWikitty(output, contextPath, name, wikitty, field, extName, fieldName);
+ }
+ break;
+ }
+ } else {
+ /*{<div class="alert alert-error"><%=wikitty.getId()%> doesn't have field '<%=fqfield%>'</div>}*/
+ }
+ }
+
+ protected void viewBinary(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ /*{<%=name%> : <c:out value=<%=wikitty.getFieldAsString(extName, fieldName)%>" />}*/
+ }
+
+ protected void viewBoolean(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ boolean value = wikitty.getFieldAsBoolean(extName, fieldName);
+ /*{<%=fieldName%> : <%=value%>}*/
+ }
+
+ protected void viewDate(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ Date date = wikitty.getFieldAsDate(extName, fieldName);
+
+ if (field.hasPattern()) {
+ String pattern = field.getPattern();
+ /*{<%=fieldName%> : <fmt:formatDate value="<%=date%>" pattern="<%=pattern%>" />}*/
+ } else {
+ /*{<%=fieldName%> : <fmt:formatDate value="<%=date%>" />}*/
+
+ }
+ }
+
+ protected void viewNumeric(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ BigDecimal value = wikitty.getFieldAsBigDecimal(extName, fieldName);
+
+ if (field.hasPattern()) {
+ String pattern = field.getPattern();
+ /*{<%=fieldName%> : <fmt:formatNumber value="<%=value%>" pattern="<%=pattern%>" />}*/
+ } else {
+ /*{<%=fieldName%> : <%=value%> />}*/
+ }
+ }
+
+ protected void viewCollectionString(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ String id = wikitty.getId() + "-" + extName + "-" + fieldName;
+ List<String> values = wikitty.getFieldAsList(extName, fieldName, String.class);
+ /*{<%=fieldName%> : <ul>}*/
+ for (String value : values) {
+ /*{<li><%=value%></li>}*/
+ }
+ /*{</ul>}*/
+ }
+
+ protected void viewString(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ boolean value = wikitty.getFieldAsBoolean(extName, fieldName);
+ /*{<%=fieldName%> : <%=value%>}*/
+ }
+
+ protected void viewCollectionWikitty(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ String id = wikitty.getId() + "-" + extName + "-" + fieldName;
+ List<Wikitty> values = wikitty.getFieldAsWikittyList(extName, fieldName, false);
+ /*{<%=fieldName%> : <ul>}*/
+ for (Wikitty value : values) {
+ /*{<li><a href="<c:url value="/wikitty/view/<%=value.getId()%>"/>"><c:out value="<%=value%>"/></a></li>}*/
+ }
+ /*{</ul>}*/
+
+ }
+
+ protected void viewWikitty(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ String id = wikitty.getId() + "-" + extName + "-" + fieldName;
+ String value = wikitty.getFieldAsWikitty(extName, fieldName);
+ Wikitty wikittyValue = wikitty.getFieldAsWikitty(extName, fieldName, false);
+ String url = contextPath + "/wikitty-json/search?extension=" + field.getAllowed();
+ if (wikittyValue != null) {
+ /*{<%=fieldName%>: <a href="<c:url value="/wikitty/view/<%=wikittyValue.getId()%>"/>"><c:out value="<%=wikittyValue%>"/></a>}*/
+ }
+ }
+
+}//WikittyDisplay
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/view.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/view.jsp 2012-04-25 12:55:15 UTC (rev 141)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/view.jsp 2012-04-26 16:04:03 UTC (rev 142)
@@ -15,6 +15,7 @@
<a class="btn btn-danger btn-mini" href="<c:url value="/wikitty/delete/${wikitty.id}?extension=${ext.name}&wmDecoratorNo=true"/>"><i class="icon-trash icon-white"></i> Delete</a></dt>
<c:forEach var="fieldName" items="${ext.fieldNames}">
<dd><%@ include file="wikittyFieldView.jsp"%></dd>
+ <!-- <dd><w:input wikitty="${wikitty}" fqfield="${ext.name}.${fieldName}"/></dd> -->
</c:forEach>
</dl>
</c:forEach>
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/wikitty.tld
===================================================================
(Binary files differ)
1
0
25 Apr '12
Author: ymartel
Date: 2012-04-25 14:55:15 +0200 (Wed, 25 Apr 2012)
New Revision: 141
Url: http://chorem.org/repositories/revision/chorem/141
Log:
Add menu entries for project in webmotion module
Modified:
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp 2012-04-24 15:00:51 UTC (rev 140)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp 2012-04-25 12:55:15 UTC (rev 141)
@@ -65,16 +65,23 @@
</ul>
</li>
<li class="dropdown nav-group">
- <a href="/project">Project</a>
- <a href="#"
- class="dropdown-toggle"
- data-toggle="dropdown">
+ <a href="<c:url value="/wikitty/search?extension=Quotation&extension=ProjectOrder&extension=Task"/>">Project</a>
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
- <li><a href="/project/company">Propale</a></li>
- <li><a href="/project/current">Current project</a></li>
- <li><a href="/wikitty/search?query=extension=Task">Task</a></li>
+ <li>Propale</li>
+ <li><a href="<c:url value="/wikitty/Quotation/search"/>"><i class="icon-th-list icon-black"></i> All quotations</a></li>
+ <li><a href="<c:url value="/wikitty/Quotation/edit/new"/>"><i class="icon-plus icon-black"></i> Add quotation</a></li>
+ <li class="divider"></li>
+ <li>Current project</li>
+ <li><a href="<c:url value="/wikitty/ProjectOrder/search"/>"><i class="icon-th-list icon-black"></i> All projects</a></li>
+ <li><a href="<c:url value="/wikitty/ProjectOrder/edit/new"/>"><i class="icon-plus icon-black"></i> Add project</a></li>
+ <li class="divider"></li>
+ <li>Task</li>
+ <li><a href="<c:url value="/wikitty/Task/search"/>"><i class="icon-th-list icon-black"></i> All tasks</a></li>
+ <li><a href="<c:url value="/wikitty/Task/edit/new"/>"><i class="icon-plus icon-black"></i> Add task</a></li>
+ <li class="divider"></li>
</ul>
</li>
<li class="dropdown nav-group">
1
0
r140 - trunk/chorem-entities/src/test/java/org/chorem/entities
by bpoussin@users.chorem.org 24 Apr '12
by bpoussin@users.chorem.org 24 Apr '12
24 Apr '12
Author: bpoussin
Date: 2012-04-24 17:00:51 +0200 (Tue, 24 Apr 2012)
New Revision: 140
Url: http://chorem.org/repositories/revision/chorem/140
Log:
utilisation de WikittyClient au lieu de WikittyProxy
Modified:
trunk/chorem-entities/src/test/java/org/chorem/entities/InvoiceableUtilTest.java
Modified: trunk/chorem-entities/src/test/java/org/chorem/entities/InvoiceableUtilTest.java
===================================================================
--- trunk/chorem-entities/src/test/java/org/chorem/entities/InvoiceableUtilTest.java 2012-04-24 14:56:48 UTC (rev 139)
+++ trunk/chorem-entities/src/test/java/org/chorem/entities/InvoiceableUtilTest.java 2012-04-24 15:00:51 UTC (rev 140)
@@ -1,8 +1,8 @@
package org.chorem.entities;
import org.junit.Test;
+import org.nuiton.wikitty.WikittyClient;
import static org.junit.Assert.*;
-import org.nuiton.wikitty.WikittyProxy;
/**
*
@@ -17,7 +17,7 @@
public void testEvalCondition() {
System.out.println("evalCondition");
- WikittyProxy proxy = null;
+ WikittyClient proxy = null;
Invoiceable invoiceable = new InvoiceableImpl();
invoiceable.setMimetype("application/javascript");
invoiceable.setCondition("'coucou'.equals(invoiceable.getName())");
@@ -43,7 +43,7 @@
public void testEvalValue() {
System.out.println("evalValue");
- WikittyProxy proxy = null;
+ WikittyClient proxy = null;
Invoiceable invoiceable = new InvoiceableImpl();
invoiceable.setMimetype("application/javascript");
invoiceable.setValue("10*10");
1
0
24 Apr '12
Author: bpoussin
Date: 2012-04-24 16:56:48 +0200 (Tue, 24 Apr 2012)
New Revision: 139
Url: http://chorem.org/repositories/revision/chorem/139
Log:
utilisation de opencsv 2.3 au lieu de 2.4-SNAPSHOT
Modified:
trunk/chorem-entities/src/main/java/org/chorem/ImportChoremTopia.java
trunk/pom.xml
Modified: trunk/chorem-entities/src/main/java/org/chorem/ImportChoremTopia.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ImportChoremTopia.java 2012-04-24 14:56:16 UTC (rev 138)
+++ trunk/chorem-entities/src/main/java/org/chorem/ImportChoremTopia.java 2012-04-24 14:56:48 UTC (rev 139)
@@ -129,7 +129,7 @@
FileReader in = new FileReader(filename);
// separateur ';' String delimiter '"', skip first line (header)
CSVReader reader = new CSVReader(in, ';', '"', 1);
- for(String[] line : reader) {
+ for(String[] line : reader.readAll()) {
String topiaId = line[COMPANY_HEADER.topiaid.ordinal()];
// Read company info
@@ -204,7 +204,7 @@
FileReader in = new FileReader(filename);
// separateur ';' String delimiter '"', skip first line (header)
CSVReader reader = new CSVReader(in, ';', '"', 1);
- for(String[] line : reader) {
+ for(String[] line : reader.readAll()) {
String topiaId = line[COMPANY_HEADER.topiaid.ordinal()];
// Read company info
@@ -273,7 +273,7 @@
FileReader in = new FileReader(filename);
// separateur ';' String delimiter '"', skip first line (header)
CSVReader reader = new CSVReader(in, ';', '"', 1);
- for(String[] line : reader) {
+ for(String[] line : reader.readAll()) {
String topiaId = line[CONTRACT_TYPE_HEADER.topiaid.ordinal()];
// Read company info
@@ -299,7 +299,7 @@
FileReader in = new FileReader(filename);
// separateur ';' String delimiter '"', skip first line (header)
CSVReader reader = new CSVReader(in, ';', '"', 1);
- for(String[] line : reader) {
+ for(String[] line : reader.readAll()) {
String topiaId = line[EMPLOYEE_HEADER.topiaid.ordinal()];
// Read company info
@@ -361,7 +361,7 @@
FileReader in = new FileReader(filename);
// separateur ';' String delimiter '"', skip first line (header)
CSVReader reader = new CSVReader(in, ';', '"', 1);
- for(String[] line : reader) {
+ for(String[] line : reader.readAll()) {
count++;
String employeeId = line[CONTRACT_HEADER.employee.ordinal()];
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-04-24 14:56:16 UTC (rev 138)
+++ trunk/pom.xml 2012-04-24 14:56:48 UTC (rev 139)
@@ -56,7 +56,7 @@
<platform>chorem.org</platform>
<projectId>chorem</projectId>
- <opencsvVersion>2.4-SNAPSHOT</opencsvVersion>
+ <opencsvVersion>2.3</opencsvVersion>
<processPluginVersion>1.1</processPluginVersion>
<eugenePluginVersion>2.4.2</eugenePluginVersion>
<nuitonUtilsVersion>2.4.4</nuitonUtilsVersion>
1
0
r138 - trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag
by bpoussin@users.chorem.org 24 Apr '12
by bpoussin@users.chorem.org 24 Apr '12
24 Apr '12
Author: bpoussin
Date: 2012-04-24 16:56:16 +0200 (Tue, 24 Apr 2012)
New Revision: 138
Url: http://chorem.org/repositories/revision/chorem/138
Log:
gestion des dates null dans les wikitty pour l'edition
Modified:
trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyInput.java
Modified: trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyInput.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyInput.java 2012-04-24 14:55:53 UTC (rev 137)
+++ trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyInput.java 2012-04-24 14:56:16 UTC (rev 138)
@@ -144,6 +144,9 @@
Wikitty wikitty, FieldType field, String extName , String fieldName)
throws JspException, IOException {
Date date = wikitty.getFieldAsDate(extName, fieldName);
+ if (date == null) {
+ date = new Date();
+ }
String value = DateFormatUtils.format(date, "dd/MM/yyyy");
/*{<input class="datepicker" type="date" name="<%=name%>" value="<%=value%>"<%=getDynamicAttribute()%>/>}*/
}
1
0
24 Apr '12
Author: bpoussin
Date: 2012-04-24 16:55:53 +0200 (Tue, 24 Apr 2012)
New Revision: 137
Url: http://chorem.org/repositories/revision/chorem/137
Log:
creation des urls via la taglib
Modified:
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/edit.jsp
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/edit.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/edit.jsp 2012-04-24 14:55:08 UTC (rev 136)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/edit.jsp 2012-04-24 14:55:53 UTC (rev 137)
@@ -3,7 +3,7 @@
<%@ taglib uri="/WEB-INF/wikitty.tld" prefix="w"%>
<c:if test="${not empty wikitty}">
- <form class="form-inline" method="post" action="/wikitty/save">
+ <form class="form-inline" method="post" action="<c:url value="/wikitty/save"/>">
<input type="hidden" name="id" value="${wikitty.id}"/>
<p>
<button class="btn btn-success" type="submit"><i class="icon-ok icon-white"></i> Save</button>
1
0
r136 - trunk/chorem-entities/src/main/java/org/chorem/entities
by bpoussin@users.chorem.org 24 Apr '12
by bpoussin@users.chorem.org 24 Apr '12
24 Apr '12
Author: bpoussin
Date: 2012-04-24 16:55:08 +0200 (Tue, 24 Apr 2012)
New Revision: 136
Url: http://chorem.org/repositories/revision/chorem/136
Log:
utilisation de WikittyClient au lieu de WikittyProxy
Modified:
trunk/chorem-entities/src/main/java/org/chorem/entities/InvoiceableUtil.java
Modified: trunk/chorem-entities/src/main/java/org/chorem/entities/InvoiceableUtil.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/entities/InvoiceableUtil.java 2012-04-23 13:11:43 UTC (rev 135)
+++ trunk/chorem-entities/src/main/java/org/chorem/entities/InvoiceableUtil.java 2012-04-24 14:55:08 UTC (rev 136)
@@ -5,6 +5,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.ScriptEvaluator;
+import org.nuiton.wikitty.WikittyClient;
import org.nuiton.wikitty.WikittyProxy;
/**
@@ -22,9 +23,9 @@
/** to use log facility, just put in your code: log.info(\"...\"); */
static private Log log = LogFactory.getLog(InvoiceableUtil.class);
- static public boolean evalCondition(WikittyProxy proxy, Invoiceable invoiceable) {
+ static public boolean evalCondition(WikittyClient client, Invoiceable invoiceable) {
Map<String, Object> bindings = new HashMap<String, Object>();
- bindings.put("proxy", proxy);
+ bindings.put("wikittyClient", client);
bindings.put("invoiceable", invoiceable);
Object resultEval = ScriptEvaluator.eval(null,
invoiceable.getName(), invoiceable.getCondition(),
@@ -33,9 +34,9 @@
return result;
}
- static public double evalValue(WikittyProxy proxy, Invoiceable invoiceable) {
+ static public double evalValue(WikittyClient client, Invoiceable invoiceable) {
Map<String, Object> bindings = new HashMap<String, Object>();
- bindings.put("proxy", proxy);
+ bindings.put("wikittyClient", client);
bindings.put("invoiceable", invoiceable);
Object resultEval = ScriptEvaluator.eval(null,
invoiceable.getName(), invoiceable.getValue(),
1
0
Author: bpoussin
Date: 2012-04-23 15:11:43 +0200 (Mon, 23 Apr 2012)
New Revision: 135
Url: http://chorem.org/repositories/revision/chorem/135
Log:
Commit en l'etat de chorem/webmotion
Added:
trunk/chorem-entities/src/main/java/org/chorem/ChoremAction.java
trunk/chorem-entities/src/main/java/org/chorem/ChoremClient.java
trunk/chorem-entities/src/main/java/org/chorem/ChoremConfig.java
trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigAction.java
trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigOption.java
trunk/chorem-entities/src/main/java/org/chorem/ChoremMain.java
trunk/chorem-entities/src/main/java/org/chorem/ImportChoremTopia.java
trunk/chorem-entities/src/main/resources/
trunk/chorem-entities/src/main/resources/chorem.properties
trunk/chorem-entities/src/main/resources/log4j.properties
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/projects.jsp
trunk/chorem-web/src/test/
trunk/chorem-web/src/test/java/
trunk/chorem-web/src/test/java/org/
trunk/chorem-web/src/test/java/org/chorem/
trunk/chorem-web/src/test/java/org/chorem/entities/
trunk/chorem-webmotion/
trunk/chorem-webmotion/LICENSE.txt
trunk/chorem-webmotion/README.txt
trunk/chorem-webmotion/changelog.txt
trunk/chorem-webmotion/nb-configuration.xml
trunk/chorem-webmotion/pom.xml
trunk/chorem-webmotion/src/
trunk/chorem-webmotion/src/main/
trunk/chorem-webmotion/src/main/i18n/
trunk/chorem-webmotion/src/main/i18n/jsp.rules
trunk/chorem-webmotion/src/main/java/
trunk/chorem-webmotion/src/main/java/org/
trunk/chorem-webmotion/src/main/java/org/chorem/
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/GenericAction.java
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/ChoremClientFilter.java
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/DecoratorFilter.java
trunk/chorem-webmotion/src/main/java/org/wikitty/
trunk/chorem-webmotion/src/main/java/org/wikitty/web/
trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/
trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyInput.java
trunk/chorem-webmotion/src/main/resources/
trunk/chorem-webmotion/src/main/resources/i18n/
trunk/chorem-webmotion/src/main/resources/i18n/chorem-webmotion_en_GB.properties
trunk/chorem-webmotion/src/main/resources/i18n/chorem-webmotion_fr_FR.properties
trunk/chorem-webmotion/src/main/resources/log4j.properties
trunk/chorem-webmotion/src/main/resources/mapping
trunk/chorem-webmotion/src/main/webapp/
trunk/chorem-webmotion/src/main/webapp/WEB-INF/
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/contact.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/edit.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/footerPerson.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/index.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/search.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/view.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/wikittyFieldView.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/web.xml
trunk/chorem-webmotion/src/main/webapp/WEB-INF/wikitty.tld
trunk/chorem-webmotion/src/main/webapp/css/
trunk/chorem-webmotion/src/main/webapp/css/bootstrap-responsive.min.css
trunk/chorem-webmotion/src/main/webapp/css/bootstrap.min.css
trunk/chorem-webmotion/src/main/webapp/css/chorem.less
trunk/chorem-webmotion/src/main/webapp/css/token-input-facebook.css
trunk/chorem-webmotion/src/main/webapp/css/token-input-mac.css
trunk/chorem-webmotion/src/main/webapp/css/token-input.css
trunk/chorem-webmotion/src/main/webapp/img/
trunk/chorem-webmotion/src/main/webapp/img/glyphicons-halflings-white.png
trunk/chorem-webmotion/src/main/webapp/img/glyphicons-halflings.png
trunk/chorem-webmotion/src/main/webapp/js/
trunk/chorem-webmotion/src/main/webapp/js/bootstrap.min.js
trunk/chorem-webmotion/src/main/webapp/js/chorem.js
trunk/chorem-webmotion/src/main/webapp/js/jquery.maskedinput-1.3.js
trunk/chorem-webmotion/src/main/webapp/js/jquery.tokeninput.js
trunk/chorem-webmotion/src/main/webapp/js/less-1.2.1.min.js
Removed:
trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java
trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java
trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java
trunk/chorem-web/src/main/resources/chorem.properties
trunk/chorem-web/src/main/resources/log4j.properties
Modified:
trunk/
trunk/chorem-entities/pom.xml
trunk/chorem-entities/src/main/xmi/chorem.properties
trunk/chorem-entities/src/main/xmi/chorem.zargo
trunk/chorem-entities/src/test/java/org/chorem/entities/InvoiceableUtilTest.java
trunk/chorem-web/src/main/java/org/chorem/ChoremSession.java
trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java
trunk/chorem-web/src/main/java/org/chorem/action/HomeAction.java
trunk/chorem-web/src/main/resources/struts.xml
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/menu.jsp
trunk/pom.xml
Property changes on: trunk
___________________________________________________________________
Added: svn:ignore
+ target
Modified: trunk/chorem-entities/pom.xml
===================================================================
--- trunk/chorem-entities/pom.xml 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-entities/pom.xml 2012-04-23 13:11:43 UTC (rev 135)
@@ -24,6 +24,11 @@
<!-- compile dependencies -->
<dependency>
+ <groupId>net.sf.opencsv</groupId>
+ <artifactId>opencsv</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>org.nuiton</groupId>
<artifactId>nuiton-utils</artifactId>
</dependency>
@@ -34,6 +39,18 @@
</dependency>
<dependency>
+ <groupId>org.nuiton.wikitty</groupId>
+ <artifactId>wikitty-jdbc</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.nuiton.wikitty</groupId>
+ <artifactId>wikitty-solr</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
</dependency>
Added: trunk/chorem-entities/src/main/java/org/chorem/ChoremAction.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremAction.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremAction.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,38 @@
+package org.chorem;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.util.ApplicationConfig;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ChoremAction {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ChoremAction.class);
+
+ /**
+ * Remove all data in database, used with caution
+ */
+ static public void clean() {
+ System.out.println("Cleaning database ...");
+ ChoremClient proxy = ChoremClient.getClient();
+ proxy.clear();
+ System.out.println("... clean done");
+ }
+
+ static public void configInfo() {
+ ApplicationConfig config = ChoremConfig.getConfig();
+ config.printConfig();
+ }
+
+ static public void help() {
+ System.out.println("Chorem Main Help");
+ }
+}
Added: trunk/chorem-entities/src/main/java/org/chorem/ChoremClient.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremClient.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremClient.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,153 @@
+package org.chorem;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+
+import org.chorem.entities.Attachment;
+import org.chorem.entities.ContactDetails;
+
+import org.nuiton.util.ApplicationConfig;
+import org.nuiton.wikitty.WikittyClient;
+import org.nuiton.wikitty.WikittyService;
+import org.nuiton.wikitty.WikittyServiceFactory;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+
+/**
+ * Proxy pour l'application. Certaines methodes specifiques pour l'application
+ * peuvent y etre ajoutees (ex: des find particulier)
+ */
+public class ChoremClient extends WikittyClient {
+
+ static protected WikittyService ws = null;
+
+ protected ChoremClient(ApplicationConfig config, WikittyService ws) {
+ super(config, ws);
+ }
+
+ /**
+ * Returns new ChoremClient instance with specified security token
+ *
+ * @param token can be null, if no authorisation token already exist (no login done)
+ * @return
+ */
+ static public ChoremClient getClient(String token) {
+ ApplicationConfig config = ChoremConfig.getConfig();
+ WikittyService ws = getWikittyService(config);
+ ChoremClient result = new ChoremClient(config, ws);
+ result.setSecurityToken(token);
+
+ return result;
+ }
+
+ /**
+ * Return new ChoremClient instance with authentication done with login and
+ * password found in application configuration. If no login found
+ * ChoremClient returned doesn't have authentication.
+ *
+ * @return
+ */
+ static public ChoremClient getClient() {
+ ApplicationConfig config = ChoremConfig.getConfig();
+ String login = config.getOption(ChoremConfigOption.CHOREM_LOGIN.key);
+ String password = config.getOption(ChoremConfigOption.CHOREM_PASSWORD.key);
+
+ ChoremClient result = getClient(login, password);
+
+ return result;
+ }
+
+ /**
+ * return new ChoremClient instance with authentication done with
+ * login and password in argument, only if login is not null and not blank
+ *
+ * @param login login used for authentication
+ * @param password password used for authentication
+ */
+ static public ChoremClient getClient(String login, String password) {
+ ChoremClient result = getClient(null);
+
+ if (StringUtils.isNotBlank(login)) {
+ result.login(login, password);
+ }
+ return result;
+ }
+
+ /**
+ * Returns WikittyService to use. This WikittyService is singleton.
+ *
+ * @param config
+ * @return WikittyService instance
+ */
+ static protected WikittyService getWikittyService(ApplicationConfig config) {
+ if (ws == null) {
+ synchronized(ChoremClient.class) {
+ if (ws == null) {
+ ws = WikittyServiceFactory.buildWikittyService(config);
+
+ // register last entity versions in database
+ List<WikittyExtension> exts = new ArrayList<WikittyExtension>();
+
+ exts.addAll(org.chorem.entities.AttachmentAbstract.extensions);
+ exts.addAll(org.chorem.entities.CompanyAbstract.extensions);
+ exts.addAll(org.chorem.entities.ContactDetailsAbstract.extensions);
+ exts.addAll(org.chorem.entities.EmployeeAbstract.extensions);
+ exts.addAll(org.chorem.entities.EvaluationAbstract.extensions);
+ exts.addAll(org.chorem.entities.GoalAbstract.extensions);
+ exts.addAll(org.chorem.entities.IntervalAbstract.extensions);
+ exts.addAll(org.chorem.entities.InterviewAbstract.extensions);
+ exts.addAll(org.chorem.entities.InvoiceableAbstract.extensions);
+ exts.addAll(org.chorem.entities.InvoiceAbstract.extensions);
+ exts.addAll(org.chorem.entities.MissionAbstract.extensions);
+ exts.addAll(org.chorem.entities.PersonAbstract.extensions);
+ exts.addAll(org.chorem.entities.PersonSkillAbstract.extensions);
+ exts.addAll(org.chorem.entities.ProjectOrderAbstract.extensions);
+ exts.addAll(org.chorem.entities.ProjectAbstract.extensions);
+ exts.addAll(org.chorem.entities.QuotationAbstract.extensions);
+ exts.addAll(org.chorem.entities.SkillAbstract.extensions);
+ exts.addAll(org.chorem.entities.TaskAbstract.extensions);
+ exts.addAll(org.chorem.entities.TimeAbstract.extensions);
+ exts.addAll(org.chorem.entities.TouchAbstract.extensions);
+ exts.addAll(org.chorem.entities.VacationAbstract.extensions);
+ exts.addAll(org.chorem.entities.WorkerAbstract.extensions);
+
+ ws.storeExtension(null, exts);
+ }
+ }
+ }
+ return ws;
+ }
+
+ /**
+ * Returns the attachments linked with a wikitty id ordered by date
+ *
+ * @param wikittyId
+ * @return the list of attachments
+ */
+ static public List<Attachment> getAttachments(String wikittyId) {
+ WikittyQuery criteria = new WikittyQueryMaker()
+ .eq(Attachment.FQ_FIELD_ATTACHMENT_TARGET, wikittyId).end();
+ WikittyQueryResult<Attachment> result = getClient(null)
+ .findAllByQuery(Attachment.class, criteria);
+ List<Attachment> attachments = result.getAll();
+ return attachments;
+ }
+
+ /**
+ * Returns the contact details linked with a wikitty id
+ *
+ * @param wikittyId
+ * @return the list of contact details
+ */
+ static public List<ContactDetails> getContactDetails(String wikittyId) {
+ WikittyQuery criteria = new WikittyQueryMaker()
+ .eq(ContactDetails.FQ_FIELD_CONTACTDETAILS_TARGET, wikittyId).end();
+ WikittyQueryResult<ContactDetails> result = getClient(null)
+ .findAllByQuery(ContactDetails.class, criteria);
+ List<ContactDetails> contactDetails = result.getAll();
+ return contactDetails;
+ }
+}
Copied: trunk/chorem-entities/src/main/java/org/chorem/ChoremConfig.java (from rev 128, trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java)
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremConfig.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremConfig.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,60 @@
+package org.chorem;
+
+import org.apache.commons.lang.UnhandledException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.util.ApplicationConfig;
+import org.nuiton.wikitty.WikittyConfigOption;
+
+import static org.nuiton.i18n.I18n._;
+
+/**
+ * Inits chorem configuration
+ */
+public class ChoremConfig {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ChoremConfig.class);
+
+ static protected ApplicationConfig config = null;
+
+ /**
+ * constructeur public seulement pour pouvoir mettre une variable de ce
+ * type dans BowBaseAction et acceder facilement au donnees dans les jsp
+ * en ognl
+ */
+ public ChoremConfig() {
+ }
+
+ public static ApplicationConfig getConfig(String... args) {
+ if (config == null) {
+ synchronized (ChoremConfig.class) {
+ if (config == null) {
+ try {
+ config = new ApplicationConfig(ChoremConfigOption.CONFIG_FILE.getDefaultValue());
+
+ // Load wikitty options
+ config.loadDefaultOptions(WikittyConfigOption.class);
+
+ // Load chorem options
+ config.loadDefaultOptions(ChoremConfigOption.class);
+
+ // Load chorem action
+ config.loadActions(ChoremConfigAction.class);
+
+ // Parse args
+ config.parse(args);
+
+ // on fait toutes les actions
+ config.doAllAction();
+ } catch (Exception eee) {
+ log.error("Can't create chorem configuration", eee);
+ throw new UnhandledException(eee);
+ }
+ }
+ }
+ }
+ return config;
+ }
+
+}
Added: trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigAction.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigAction.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigAction.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,47 @@
+package org.chorem;
+
+import org.nuiton.util.ApplicationConfig.ActionDef;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public enum ChoremConfigAction implements ActionDef {
+
+ HELP(ChoremAction.class.getName() + "#help", "-h", "--help"),
+ INFO(ChoremAction.class.getName() + "#configInfo", "-i", "--config-info" , "--configInfo"),
+ CLEAN(ChoremAction.class.getName() + "#clean", "--clean"),
+ IMPORT_PERSON(ImportChoremTopia.class.getName() + "#importPerson",
+ "-ip", "--import-person", "--importPerson"),
+ IMPORT_COMPANY(ImportChoremTopia.class.getName() + "#importCompany",
+ "-ic", "--import-company", "--importCompany"),
+ IMPORT_EMPLOYEE(ImportChoremTopia.class.getName() + "#importEmployee",
+ "-ie", "--import-employee", "--importEmployee"),
+ IMPORT_CONTRACT(ImportChoremTopia.class.getName() + "#importContract",
+ "--import-contract", "--importContract"),
+ IMPORT_CONTRACT_TYPE(ImportChoremTopia.class.getName() + "#importContractType",
+ "--import-contract-type", "--importContractType"),
+ IMPORT_COMMIT(ImportChoremTopia.class.getName() + "#commit", "--commit");
+
+ public String action;
+ public String[] aliases;
+
+ private ChoremConfigAction(String action, String... aliases) {
+ this.action = action;
+ this.aliases = aliases;
+ }
+
+ @Override
+ public String getAction() {
+ return action;
+ }
+
+ @Override
+ public String[] getAliases() {
+ return aliases;
+ }
+}
Copied: trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigOption.java (from rev 128, trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java)
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigOption.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigOption.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2011 poussin. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.chorem;
+
+import static org.nuiton.i18n.I18n._;
+import org.nuiton.util.ApplicationConfig;
+
+/**
+ * Chorem option definition.
+ *
+ * @author poussin
+ */
+public enum ChoremConfigOption implements ApplicationConfig.OptionDef {
+ CONFIG_FILE(ApplicationConfig.CONFIG_FILE_NAME,
+ _("chorem.config.configFileName.description"),
+ "chorem.properties", String.class, false, false),
+ CHOREM_LOGIN(
+ "chorem.admin.login",
+ _("Login as default login for action on command line"),
+ "",
+ String.class, false, false),
+ CHOREM_PASSWORD(
+ "chorem.import.csv.format",
+ _("Password associated with login used"),
+ "",
+ String.class, false, false);
+
+ public final String key;
+ public final String description;
+ public String defaultValue;
+ public final Class<?> type;
+ public boolean isTransient;
+ public boolean isFinal;
+
+ ChoremConfigOption(String key, String description, String defaultValue,
+ Class<?> type, boolean isTransient, boolean isFinal) {
+ this.key = key;
+ this.description = description;
+ this.defaultValue = defaultValue;
+ this.type = type;
+ this.isFinal = isFinal;
+ this.isTransient = isTransient;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public Class<?> getType() {
+ return type;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ public boolean isTransient() {
+ return isTransient;
+ }
+
+ public boolean isFinal() {
+ return isFinal;
+ }
+
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ public void setTransient(boolean isTransient) {
+ this.isTransient = isTransient;
+ }
+
+ public void setFinal(boolean isFinal) {
+ this.isFinal = isFinal;
+ }
+
+}
Added: trunk/chorem-entities/src/main/java/org/chorem/ChoremMain.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremMain.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremMain.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,29 @@
+package org.chorem;
+
+import java.util.Arrays;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.util.ApplicationConfig;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ChoremMain {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ChoremMain.class);
+
+ static public void main(String[] args) throws Exception {
+ System.out.println(String.format("Launching ChoremMain ... (args: %s)", Arrays.toString(args)));
+ // getConfig do all: parse and doAllAction
+// String[] forceArgs = "--clean -ic /tmp/chorem-company.csv -ip /tmp/chorem-person.csv -ie /tmp/chorem-employee.csv --import-contract-type /tmp/chorem-contracttype.csv --import-contract /tmp/chorem-contract.csv --commit".split(" ");
+ ApplicationConfig config = ChoremConfig.getConfig(args);
+
+ System.exit(0);
+ }
+}
Added: trunk/chorem-entities/src/main/java/org/chorem/ImportChoremTopia.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ImportChoremTopia.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ImportChoremTopia.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,394 @@
+package org.chorem;
+
+import au.com.bytecode.opencsv.CSVReader;
+import java.io.FileReader;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.lang3.time.DateUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.entities.CompanyImpl;
+import org.chorem.entities.ContactDetailsImpl;
+import org.chorem.entities.EmployeeImpl;
+import org.chorem.entities.PersonImpl;
+import org.nuiton.util.ApplicationConfig.Action.Step;
+import org.nuiton.wikitty.entities.BusinessEntityImpl;
+
+/**
+ * Les donnees doivent etre exportees de la base postgresql avec les commandes:
+ * <pre>
+ * \copy employee to '/tmp/chorem-employee.csv' delimiters ';' CSV HEADER
+ * \copy company to '/tmp/chorem-company.csv' delimiters ';' CSV HEADER
+ * \copy person to '/tmp/chorem-person.csv' delimiters ';' CSV HEADER
+ * ...
+ * </pre>
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ImportChoremTopia {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ImportChoremTopia.class);
+
+ enum COMPANY_HEADER {
+ topiaid, topiaversion, topiacreatedate,
+ name, type, headoffice, activity,
+ address, phone, mail, web, fax,
+ relation, othercostemployee, percentcostemployeepay
+ };
+
+ enum PERSON_HEADER {
+ topiaid, topiaversion, topiacreatedate,
+ firstname, lastname,
+ address, birthdate, phone, mobile, mail
+ };
+
+ enum EMPLOYEE_HEADER {
+ topiaid, topiaversion, topiacreatedate,
+ phone, mobile, mail, job, company, service, responsable, person, contract
+ };
+
+ enum CONTRACT_TYPE_HEADER {
+ topiaid, topiaversion, topiacreatedate,
+ name
+ }
+
+ enum CONTRACT_HEADER {
+ topiaid, topiaversion, topiacreatedate,
+ type, hiringdate, timecost, beginhiringdate, endhiringdate, dayduration,
+ monthduration, basepay, othercost, employee, contracttype
+ }
+
+ protected List<ContactDetailsImpl> contacts = new LinkedList<ContactDetailsImpl>();
+ protected Map<String, CompanyImpl> companies = new HashMap<String, CompanyImpl>();
+ protected Map<String, PersonImpl> persons = new HashMap<String, PersonImpl>();
+ protected Map<String, EmployeeImpl> employees = new HashMap<String, EmployeeImpl>();
+
+ // a ne pas stocker dans wikitty
+ protected Map<String, String> contractType = new HashMap<String, String>();
+
+ public ImportChoremTopia() {
+ }
+
+ /**
+ * Try to parse date, if not possible, return null.
+ * acceptable pattern
+ * <li>"yyyy-MM-dd HH:mm:ss"
+ * <li>"yyyy-MM-dd"
+ *
+ * @param s date to parse
+ * @return Date object or null if s is not date with right pattern
+ */
+ protected Date parseDate(String s) {
+ Date result = null;
+ try {
+ result = DateUtils.parseDate(s, "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd");
+ } catch (ParseException ex) {
+ log.debug(String.format("Bad date format '%s'", s));
+ }
+ return result;
+ }
+
+ protected String getWikittyId(BusinessEntityImpl e) {
+ String result = null;
+ if (e != null) {
+ result = e.getWikittyId();
+ }
+ return result;
+ }
+
+ /**
+ * Commit all imported data. Step number must be the last
+ */
+ @Step(99)
+ public void commit() {
+ List<BusinessEntityImpl> data = new LinkedList<BusinessEntityImpl>();
+
+ data.addAll(companies.values());
+ data.addAll(persons.values());
+ data.addAll(employees.values());
+ data.addAll(contacts);
+
+ ChoremClient proxy = ChoremClient.getClient();
+ data = proxy.store(data);
+ System.out.println(String.format("%s Commited data", data.size()));
+ }
+
+ @Step(1)
+ public void importCompany(String filename) {
+ System.out.println(String.format("Try to import company '%s'", filename));
+ try {
+ FileReader in = new FileReader(filename);
+ // separateur ';' String delimiter '"', skip first line (header)
+ CSVReader reader = new CSVReader(in, ';', '"', 1);
+ for(String[] line : reader) {
+ String topiaId = line[COMPANY_HEADER.topiaid.ordinal()];
+
+ // Read company info
+ String name = line[COMPANY_HEADER.name.ordinal()];
+ String type = line[COMPANY_HEADER.type.ordinal()];
+
+ CompanyImpl company = new CompanyImpl();
+ company.setName(name);
+ company.setType(type);
+
+ companies.put(topiaId, company);
+
+ // Read company contacts details
+ String address = line[COMPANY_HEADER.address.ordinal()];
+ String fax = line[COMPANY_HEADER.fax.ordinal()];
+ String mail = line[COMPANY_HEADER.mail.ordinal()];
+ String phone = line[COMPANY_HEADER.phone.ordinal()];
+ String web = line[COMPANY_HEADER.web.ordinal()];
+
+ ContactDetailsImpl contactAddress = new ContactDetailsImpl();
+ contactAddress.setType("address");
+ contactAddress.setName("main");
+ contactAddress.setValue(address);
+ contactAddress.setTarget(company.getWikittyId());
+ contacts.add(contactAddress);
+
+ ContactDetailsImpl contactFax = new ContactDetailsImpl();
+ contactFax.setType("fax");
+ contactFax.setName("main");
+ contactFax.setValue(fax);
+ contactFax.setTarget(company.getWikittyId());
+ contacts.add(contactFax);
+
+ ContactDetailsImpl contactMail = new ContactDetailsImpl();
+ contactMail.setType("mail");
+ contactMail.setName("main");
+ contactMail.setValue(mail);
+ contactMail.setTarget(company.getWikittyId());
+ contacts.add(contactMail);
+
+ ContactDetailsImpl contactPhone = new ContactDetailsImpl();
+ contactPhone.setType("phone");
+ contactPhone.setName("main");
+ contactPhone.setValue(phone);
+ contactPhone.setTarget(company.getWikittyId());
+ contacts.add(contactPhone);
+
+ ContactDetailsImpl contactWeb = new ContactDetailsImpl();
+ contactWeb.setType("web");
+ contactWeb.setName("main");
+ contactWeb.setValue(web);
+ contactWeb.setTarget(company.getWikittyId());
+ contacts.add(contactWeb);
+ }
+ reader.close();
+
+
+ } catch (Exception eee) {
+ log.fatal(String.format("Can't import file '%s'", filename));
+ if (log.isDebugEnabled()) {
+ log.debug("StackTrace", eee);
+ }
+ System.exit(1);
+ }
+ System.out.println(String.format("%s companies loaded", companies.size()));
+ }
+
+ @Step(1)
+ public void importPerson(String filename) {
+ System.out.println(String.format("Try to import person '%s'", filename));
+ try {
+ FileReader in = new FileReader(filename);
+ // separateur ';' String delimiter '"', skip first line (header)
+ CSVReader reader = new CSVReader(in, ';', '"', 1);
+ for(String[] line : reader) {
+ String topiaId = line[COMPANY_HEADER.topiaid.ordinal()];
+
+ // Read company info
+ String firstname = line[PERSON_HEADER.firstname.ordinal()];
+ String lastname = line[PERSON_HEADER.lastname.ordinal()];
+ String birthdate = line[PERSON_HEADER.birthdate.ordinal()];
+
+ PersonImpl person = new PersonImpl();
+ person.setFirstName(firstname);
+ person.setLastName(lastname);
+ person.setBirthDate(parseDate(birthdate));
+
+ persons.put(topiaId, person);
+
+ // Read company contacts details
+ String address = line[PERSON_HEADER.address.ordinal()];
+ String mail = line[PERSON_HEADER.mail.ordinal()];
+ String phone = line[PERSON_HEADER.phone.ordinal()];
+ String mobile = line[PERSON_HEADER.mobile.ordinal()];
+
+ ContactDetailsImpl contactAddress = new ContactDetailsImpl();
+ contactAddress.setType("address");
+ contactAddress.setName("main");
+ contactAddress.setValue(address);
+ contactAddress.setTarget(person.getWikittyId());
+ contacts.add(contactAddress);
+
+ ContactDetailsImpl contactMobile = new ContactDetailsImpl();
+ contactMobile.setType("phone");
+ contactMobile.setName("mobile");
+ contactMobile.setValue(mobile);
+ contactMobile.setTarget(person.getWikittyId());
+ contacts.add(contactMobile);
+
+ ContactDetailsImpl contactMail = new ContactDetailsImpl();
+ contactMail.setType("mail");
+ contactMail.setName("main");
+ contactMail.setValue(mail);
+ contactMail.setTarget(person.getWikittyId());
+ contacts.add(contactMail);
+
+ ContactDetailsImpl contactPhone = new ContactDetailsImpl();
+ contactPhone.setType("phone");
+ contactPhone.setName("main");
+ contactPhone.setValue(phone);
+ contactPhone.setTarget(person.getWikittyId());
+ contacts.add(contactPhone);
+ }
+ reader.close();
+
+
+ } catch (Exception eee) {
+ log.fatal(String.format("Can't import file '%s'", filename));
+ if (log.isDebugEnabled()) {
+ log.debug("StackTrace", eee);
+ }
+ System.exit(1);
+ }
+ System.out.println(String.format("%s persons loaded", persons.size()));
+ }
+
+ @Step(1) // independant de tout
+ public void importContractType(String filename) {
+ System.out.println(String.format("Try to import contract type '%s'", filename));
+ try {
+ FileReader in = new FileReader(filename);
+ // separateur ';' String delimiter '"', skip first line (header)
+ CSVReader reader = new CSVReader(in, ';', '"', 1);
+ for(String[] line : reader) {
+ String topiaId = line[CONTRACT_TYPE_HEADER.topiaid.ordinal()];
+
+ // Read company info
+ String name = line[CONTRACT_TYPE_HEADER.name.ordinal()];
+
+ contractType.put(topiaId, name);
+ }
+ reader.close();
+ } catch (Exception eee) {
+ log.fatal(String.format("Can't import file '%s'", filename));
+ if (log.isDebugEnabled()) {
+ log.debug("StackTrace", eee);
+ }
+ System.exit(1);
+ }
+ System.out.println(String.format("%s contracts types loaded", contractType.size()));
+ }
+
+ @Step(2) // il faut importer apres company et person
+ public void importEmployee(String filename) {
+ System.out.println(String.format("Try to import employee '%s'", filename));
+ try {
+ FileReader in = new FileReader(filename);
+ // separateur ';' String delimiter '"', skip first line (header)
+ CSVReader reader = new CSVReader(in, ';', '"', 1);
+ for(String[] line : reader) {
+ String topiaId = line[EMPLOYEE_HEADER.topiaid.ordinal()];
+
+ // Read company info
+ String company = line[EMPLOYEE_HEADER.company.ordinal()];
+ String person = line[EMPLOYEE_HEADER.person.ordinal()];
+ String job = line[EMPLOYEE_HEADER.job.ordinal()];
+
+ EmployeeImpl employee = new EmployeeImpl();
+ employee.setCompany(getWikittyId(companies.get(company)));
+ employee.setPerson(getWikittyId(persons.get(person)));
+ employee.setDescription(job);
+
+ employees.put(topiaId, employee);
+
+ // Read company contacts details
+ String mail = line[EMPLOYEE_HEADER.mail.ordinal()];
+ String phone = line[EMPLOYEE_HEADER.phone.ordinal()];
+ String mobile = line[EMPLOYEE_HEADER.mobile.ordinal()];
+
+ ContactDetailsImpl contactMobile = new ContactDetailsImpl();
+ contactMobile.setType("phone");
+ contactMobile.setName("mobile");
+ contactMobile.setValue(mobile);
+ contactMobile.setTarget(employee.getWikittyId());
+ contacts.add(contactMobile);
+
+ ContactDetailsImpl contactMail = new ContactDetailsImpl();
+ contactMail.setType("mail");
+ contactMail.setName("main");
+ contactMail.setValue(mail);
+ contactMail.setTarget(employee.getWikittyId());
+ contacts.add(contactMail);
+
+ ContactDetailsImpl contactPhone = new ContactDetailsImpl();
+ contactPhone.setType("phone");
+ contactPhone.setName("main");
+ contactPhone.setValue(phone);
+ contactPhone.setTarget(employee.getWikittyId());
+ contacts.add(contactPhone);
+ }
+ reader.close();
+
+
+ } catch (Exception eee) {
+ log.fatal(String.format("Can't import file '%s'", filename));
+ if (log.isDebugEnabled()) {
+ log.debug("StackTrace", eee);
+ }
+ System.exit(1);
+ }
+ System.out.println(String.format("%s employees loaded", employees.size()));
+ }
+
+ @Step(3) // il faut importer apres employee
+ public void importContract(String filename) {
+ System.out.println(String.format("Try to import contract '%s'", filename));
+ int count = 0;
+ try {
+ FileReader in = new FileReader(filename);
+ // separateur ';' String delimiter '"', skip first line (header)
+ CSVReader reader = new CSVReader(in, ';', '"', 1);
+ for(String[] line : reader) {
+ count++;
+ String employeeId = line[CONTRACT_HEADER.employee.ordinal()];
+
+ EmployeeImpl employee = employees.get(employeeId);
+ if (employee != null) {
+
+ // Read info
+ String beginDate = line[CONTRACT_HEADER.beginhiringdate.ordinal()];
+ String endDate = line[CONTRACT_HEADER.endhiringdate.ordinal()];
+ String typeId = line[CONTRACT_HEADER.contracttype.ordinal()];
+ String salary = line[CONTRACT_HEADER.basepay.ordinal()];
+
+ employee.setBeginDate(parseDate(beginDate));
+ employee.setEndDate(parseDate(endDate));
+ employee.setSalary(Float.parseFloat(salary));
+ employee.setType(contractType.get(typeId));
+ }
+ }
+ reader.close();
+ } catch (Exception eee) {
+ log.fatal(String.format("Can't import file '%s'", filename));
+ if (log.isDebugEnabled()) {
+ log.debug("StackTrace", eee);
+ }
+ System.exit(1);
+ }
+ System.out.println(String.format("%s contracts loaded", count));
+ }
+
+}
Copied: trunk/chorem-entities/src/main/resources/chorem.properties (from rev 127, trunk/chorem-web/src/main/resources/chorem.properties)
===================================================================
--- trunk/chorem-entities/src/main/resources/chorem.properties (rev 0)
+++ trunk/chorem-entities/src/main/resources/chorem.properties 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,29 @@
+wikitty.data.directory=/tmp/chorem
+wikitty.storage.jdbc.queryfile=wikitty-jdbc-query.properties
+wikitty.storage.jdbc.driver=org.h2.Driver
+wikitty.storage.jdbc.host=jdbc:h2:file:${wikitty.data.directory}/data/db
+wikitty.storage.jdbc.login=sa
+wikitty.storage.jdbc.password=
+wikitty.storage.jdbc.xadatasource=org.h2.jdbcx.JdbcDataSource
+wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.URL=${wikitty.storage.jdbc.host}
+wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.user=${wikitty.storage.jdbc.login}
+wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.password=${wikitty.storage.jdbc.password}
+wikitty.searchengine.solr.directory.data=${wikitty.data.directory}/data/solr
+wikitty.searchengine.solr.directory.factory=solr.StandardDirectoryFactory
+wikitty.WikittyService.components=org.nuiton.wikitty.services.WikittyServiceStorage,\
+org.nuiton.wikitty.services.WikittyServiceNotifier,\
+org.nuiton.wikitty.services.WikittyServiceCached,\
+org.nuiton.wikitty.services.WikittyServiceSecurity
+wikitty.WikittyServiceStorage.components=org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,\
+org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\
+org.nuiton.wikitty.storage.solr.WikittySearchEngineSolr
+wikitty.WikittyServiceCached.components=org.nuiton.wikitty.services.WikittyCacheJCS
+wikitty.service.cache.listenevents=false
+wikitty.service.cache.allwaysRestoreCopies=false
+wikitty.service.event.propagate=false
+wikitty.service.event.listen=false
+wikitty.addon.export.threadnumber=1
+wikitty.addon.export.directory=${wikitty.data.directory}/export
+wikitty.addon.export.publicurl=file://${wikitty.data.directory}/export/
+jcs.default=
+jcs.default.cacheattributes.MaxObjects=1000
Copied: trunk/chorem-entities/src/main/resources/log4j.properties (from rev 128, trunk/chorem-web/src/main/resources/log4j.properties)
===================================================================
--- trunk/chorem-entities/src/main/resources/log4j.properties (rev 0)
+++ trunk/chorem-entities/src/main/resources/log4j.properties 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,34 @@
+###
+# #%L
+# bow
+#
+# $Id$
+# $HeadURL$
+# %%
+# Copyright (C) 2010 CodeLutin
+# %%
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# #L%
+###
+# Global logging configuration
+log4j.rootLogger=INFO, stdout
+
+# Console output...
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] (%F:%L) %M - %m%n
+
+# package level
+log4j.logger.org.chorem=DEBUG
+log4j.logger.org.nuiton=INFO
Modified: trunk/chorem-entities/src/main/xmi/chorem.properties
===================================================================
--- trunk/chorem-entities/src/main/xmi/chorem.properties 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-entities/src/main/xmi/chorem.properties 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,27 +1,68 @@
-org.chorem.entities.Project.class.tagvalue.version=1.0
+org.chorem.entities.Project.class.tagvalue.version=5.0
org.chorem.entities.Project.class.tagvalue.toString=%Project.name|noname$s
-org.chorem.entities.ProjectOrder.class.tagvalue.version=1.0
+org.chorem.entities.Project.class.tagvalue.sortOrder=Project.name
+org.chorem.entities.ProjectOrder.class.tagvalue.version=5.0
org.chorem.entities.ProjectOrder.class.tagvalue.toString=%ProjectOrder.description|noname$s
-org.chorem.entities.Task.class.tagvalue.version=1.0
+org.chorem.entities.ProjectOrder.class.tagvalue.sortOrder=ProjectOrder.description
+org.chorem.entities.Task.class.tagvalue.version=5.0
org.chorem.entities.Task.class.tagvalue.toString=%Task.name|noname$s
-org.chorem.entities.Worker.class.tagvalue.version=1.0
-org.chorem.entities.Person.class.tagvalue.version=3.0
+org.chorem.entities.Task.class.tagvalue.sortOrder=Task.name
+org.chorem.entities.Worker.class.tagvalue.version=5.0
+org.chorem.entities.Worker.class.tagvalue.toString=%Worker.percentage|nopercentage$s
+org.chorem.entities.Worker.class.tagvalue.sortOrder=Worker.percentage
+org.chorem.entities.Person.class.tagvalue.version=5.0
org.chorem.entities.Person.class.tagvalue.toString=%Person.lastName$s %Person.firstName|noname$s
-org.chorem.entities.Interval.class.tagvalue.version=1.0
-org.chorem.entities.Company.class.tagvalue.version=2.0
+org.chorem.entities.Person.class.tagvalue.sortOrder=Person.lastName,Person.firstName
+org.chorem.entities.Interval.class.tagvalue.version=5.0
+org.chorem.entities.Interval.class.tagvalue.toString=%Interval.beginDate$tF-%Interval.endDate$tF
+org.chorem.entities.Interval.class.tagvalue.sortOrder=Interval.beginDate,Interval.endDate
+org.chorem.entities.Company.class.tagvalue.version=5.0
org.chorem.entities.Company.class.tagvalue.toString=%Company.name|noname$s
-org.chorem.entities.ContactDetails.class.tagvalue.version=1.0
-org.chorem.entities.Time.class.tagvalue.version=1.0
-org.chorem.entities.Employee.class.tagvalue.version=2.0
-org.chorem.entities.Goal.class.tagvalue.version=1.0
-org.chorem.entities.PersonSkill.class.tagvalue.version=1.0
-org.chorem.entities.Skill.class.tagvalue.version=1.0
-org.chorem.entities.interview.class.tagvalue.version=1.0
-org.chorem.entities.Mission.class.tagvalue.version=1.0
-org.chorem.entities.Evaluation.class.tagvalue.version=1.0
-org.chorem.entities.Vacation.class.tagvalue.version=1.0
-org.chorem.entities.Touch.class.tagvalue.version=1.0
-org.chorem.entities.Attachment.class.tagvalue.version=1.0
-org.chorem.entities.Quotation.class.tagvalue.version=1.0
-org.chorem.entities.Invoice.class.tagvalue.version=1.0
-org.chorem.entities.Invoiceable.class.tagvalue.version=1.0
+org.chorem.entities.Company.class.tagvalue.sortOrder=Company.name
+org.chorem.entities.ContactDetails.class.tagvalue.version=5.0
+org.chorem.entities.ContactDetails.class.tagvalue.toString=%ContactDetails.type|notype$s %ContactDetails.name|noname$s %ContactDetails.value$s
+org.chorem.entities.ContactDetails.class.tagvalue.sortOrder=ContactDetails.type, ContactDetails.name,ContactDetails.value
+org.chorem.entities.Time.class.tagvalue.version=5.0
+org.chorem.entities.Employee.class.tagvalue.version=5.0
+org.chorem.entities.Employee.class.tagvalue.preload=Employee.company;Employee.person
+org.chorem.entities.Employee.class.tagvalue.toString=%Employee.company$s %Employee.person$s %Employee.type|notype$s
+org.chorem.entities.Employee.class.tagvalue.sortOrder=Employee.company,Employee.person
+org.chorem.entities.Goal.class.tagvalue.version=5.0
+org.chorem.entities.Goal.class.tagvalue.toString=%Goal.name|noname$s
+org.chorem.entities.Goal.class.tagvalue.sortOrder=Goal.name
+org.chorem.entities.PersonSkill.class.tagvalue.version=5.0
+org.chorem.entities.PersonSkill.class.tagvalue.toString=%Evaluation.level|nolevel$s
+org.chorem.entities.PersonSkill.class.tagvalue.sortOrder=Evaluation.level
+org.chorem.entities.Skill.class.tagvalue.version=5.0
+org.chorem.entities.Skill.class.tagvalue.toString=%Skill.description|nodescription$s
+org.chorem.entities.Skill.class.tagvalue.sortOrder=Skill.description
+org.chorem.entities.Interview.class.tagvalue.version=5.0
+org.chorem.entities.Interview.class.tagvalue.toString=%Interval.beginDate$tF-%Interval.endDate$tF %Interview.type|notype$s
+org.chorem.entities.Interview.class.tagvalue.sortOrder=Interval.beginDate,Interval.endDate,Interview.type
+org.chorem.entities.Mission.class.tagvalue.version=5.0
+org.chorem.entities.Mission.class.tagvalue.toString=%Mission.name|noname$s (%Mission.role$s)
+org.chorem.entities.Mission.class.tagvalue.sortOrder=Mission.name,Mission.role
+org.chorem.entities.Evaluation.class.tagvalue.version=5.0
+org.chorem.entities.Evaluation.class.tagvalue.toString=%Evaluation.level|nolevel$s
+org.chorem.entities.Evaluation.class.tagvalue.sortOrder=Evaluation.level
+org.chorem.entities.Vacation.class.tagvalue.version=5.0
+org.chorem.entities.Vacation.class.tagvalue.toString=%Interval.beginDate$tF-%Interval.endDate$tF %Vacation.type|notype$s
+org.chorem.entities.Vacation.class.tagvalue.sortOrder=Interval.beginDate,Interval.endDate,Vacation.type
+org.chorem.entities.Touch.class.tagvalue.version=6.0
+org.chorem.entities.Touch.class.tagvalue.preload=Touch.participant
+org.chorem.entities.Touch.class.tagvalue.toString=%Interval.beginDate$tF - %Touch.type$s - %Touch.goal|nogoal$s
+org.chorem.entities.Touch.class.tagvalue.sortOrder=Interval.beginDate desc,Touch.type,Touch.goal
+org.chorem.entities.Touch.attribute.goal.tagvalue.subtype=text/rst
+org.chorem.entities.Touch.attribute.type.tagvalue.choiceQuery=SELECT Touch.type WHERE extension=Touch
+org.chorem.entities.Attachment.class.tagvalue.version=5.0
+org.chorem.entities.Attachment.class.tagvalue.toString=%Attachment.name|noname$s (%Attachment.mimetype|notype$s) %Attachment.date$tF
+org.chorem.entities.Attachment.class.tagvalue.sortOrder=Attachment.name,Attachment.mimetype,Attachment.date
+org.chorem.entities.Quotation.class.tagvalue.version=5.0
+org.chorem.entities.Quotation.class.tagvalue.toString=%Interval.beginDate$tF-%Interval.endDate$tF %Quotation.reference|noref$s(%Quotation.type|notype$s) %Quotation.description|nodescription$s
+org.chorem.entities.Quotation.class.tagvalue.sortOrder=Interval.beginDate,Interval.endDate,Quotation.reference,Quotation.type,Quotation.description
+org.chorem.entities.Invoice.class.tagvalue.version=5.0
+org.chorem.entities.Invoice.class.tagvalue.toString=%Invoice.reference|noref$s %Invoice.amount|noamount$s %Invoice.postedDate$tF %Invoice.expectedDate$tF %Invoice.paymentDate$tF
+org.chorem.entities.Invoice.class.tagvalue.sortOrder=Invoice.postedDate,Invoice.expectedDate,Invoice.paymentDate,Invoice.reference,Invoice.amount
+org.chorem.entities.Invoiceable.class.tagvalue.version=5.0
+org.chorem.entities.Invoiceable.class.tagvalue.toString=%Invoiceable.name|noname$s
+org.chorem.entities.Invoiceable.class.tagvalue.sortOrder=Invoiceable.name
Modified: trunk/chorem-entities/src/main/xmi/chorem.zargo
===================================================================
(Binary files differ)
Modified: trunk/chorem-entities/src/test/java/org/chorem/entities/InvoiceableUtilTest.java
===================================================================
--- trunk/chorem-entities/src/test/java/org/chorem/entities/InvoiceableUtilTest.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-entities/src/test/java/org/chorem/entities/InvoiceableUtilTest.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -9,7 +9,7 @@
* @author poussin
*/
public class InvoiceableUtilTest {
-
+
/**
* Test of evalCondition method, of class InvoiceableUtil.
*/
Deleted: trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,54 +0,0 @@
-package org.chorem;
-
-import org.apache.commons.lang.UnhandledException;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.nuiton.util.ApplicationConfig;
-import org.nuiton.wikitty.WikittyConfigOption;
-
-import static org.nuiton.i18n.I18n._;
-
-/**
- * Inits chorem configuration
- */
-public class ChoremConfig {
-
- /** to use log facility, just put in your code: log.info(\"...\"); */
- static private Log log = LogFactory.getLog(ChoremConfig.class);
-
- static protected ApplicationConfig config = null;
-
- /**
- * constructeur public seulement pour pouvoir mettre une variable de ce
- * type dans BowBaseAction et acceder facilement au donnees dans les jsp
- * en ognl
- */
- public ChoremConfig() {
- }
-
- public static ApplicationConfig getConfig(String... args) {
- if (config == null) {
- synchronized (ChoremConfig.class) {
- if (config == null) {
- try {
- config = new ApplicationConfig(ChoremConfigOption.CONFIG_FILE.getDefaultValue());
-
- // Load wikitty options
- config.loadDefaultOptions(WikittyConfigOption.class);
-
- // Load bow options
- config.loadDefaultOptions(ChoremConfigOption.class);
-
- // Parse args
- config.parse(args);
- } catch (Exception eee) {
- log.error("Can't create chorem configuration", eee);
- throw new UnhandledException(eee);
- }
- }
- }
- }
- return config;
- }
-
-}
Deleted: trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2011 poussin. All rights reserved.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.chorem;
-
-import static org.nuiton.i18n.I18n._;
-import org.nuiton.util.ApplicationConfig;
-
-/**
- * Chorem option definition.
- *
- * @author poussin
- */
-public enum ChoremConfigOption implements ApplicationConfig.OptionDef {
- CONFIG_FILE(ApplicationConfig.CONFIG_FILE_NAME,
- _("chorem.config.configFileName.description"),
- "chorem.properties", String.class, false, false);
-
- public final String key;
- public final String description;
- public String defaultValue;
- public final Class<?> type;
- public boolean isTransient;
- public boolean isFinal;
-
- ChoremConfigOption(String key, String description, String defaultValue,
- Class<?> type, boolean isTransient, boolean isFinal) {
- this.key = key;
- this.description = description;
- this.defaultValue = defaultValue;
- this.type = type;
- this.isFinal = isFinal;
- this.isTransient = isTransient;
- }
-
- public String getKey() {
- return key;
- }
-
- public Class<?> getType() {
- return type;
- }
-
- public String getDescription() {
- return description;
- }
-
- public String getDefaultValue() {
- return defaultValue;
- }
-
- public boolean isTransient() {
- return isTransient;
- }
-
- public boolean isFinal() {
- return isFinal;
- }
-
- public void setDefaultValue(String defaultValue) {
- this.defaultValue = defaultValue;
- }
-
- public void setTransient(boolean isTransient) {
- this.isTransient = isTransient;
- }
-
- public void setFinal(boolean isFinal) {
- this.isFinal = isFinal;
- }
-
-}
Deleted: trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,119 +0,0 @@
-package org.chorem;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.chorem.entities.Attachment;
-import org.chorem.entities.ContactDetails;
-
-import org.nuiton.util.ApplicationConfig;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.WikittyService;
-import org.nuiton.wikitty.WikittyServiceFactory;
-import org.nuiton.wikitty.entities.WikittyExtension;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
-import org.nuiton.wikitty.search.Search;
-
-/**
- * Proxy pour l'application. Certaines methodes specifiques pour l'application
- * peuvent y etre ajoutees (ex: des find particulier)
- */
-public class ChoremProxy extends WikittyProxy {
-
- static protected WikittyService ws = null;
-
- protected ChoremProxy(ApplicationConfig config, WikittyService ws) {
- super(config, ws);
- }
-
- /**
- * Returns instance of ChoremProxy with specified security token
- *
- * @param token
- * @return
- */
- static public ChoremProxy getInstance(String token) {
- ApplicationConfig config = ChoremConfig.getConfig();
- WikittyService ws = getWikittyService(config);
- ChoremProxy result = new ChoremProxy(config, ws);
- result.setSecurityToken(token);
-
- return result;
- }
-
- /**
- * Returns WikittyService to use. This WikittyService is singleton.
- *
- * @param config
- * @return WikittyService instance
- */
- static protected WikittyService getWikittyService(ApplicationConfig config) {
- if (ws == null) {
- synchronized(ChoremProxy.class) {
- if (ws == null) {
- ws = WikittyServiceFactory.buildWikittyService(config);
-
- // register last entity versions in database
- List<WikittyExtension> exts = new ArrayList<WikittyExtension>();
-
- exts.addAll(org.chorem.entities.AttachmentAbstract.extensions);
- exts.addAll(org.chorem.entities.CompanyAbstract.extensions);
- exts.addAll(org.chorem.entities.ContactDetailsAbstract.extensions);
- exts.addAll(org.chorem.entities.EmployeeAbstract.extensions);
- exts.addAll(org.chorem.entities.EvaluationAbstract.extensions);
- exts.addAll(org.chorem.entities.GoalAbstract.extensions);
- exts.addAll(org.chorem.entities.IntervalAbstract.extensions);
- exts.addAll(org.chorem.entities.InterviewAbstract.extensions);
- exts.addAll(org.chorem.entities.InvoiceableAbstract.extensions);
- exts.addAll(org.chorem.entities.InvoiceAbstract.extensions);
- exts.addAll(org.chorem.entities.MissionAbstract.extensions);
- exts.addAll(org.chorem.entities.PersonAbstract.extensions);
- exts.addAll(org.chorem.entities.PersonSkillAbstract.extensions);
- exts.addAll(org.chorem.entities.ProjectOrderAbstract.extensions);
- exts.addAll(org.chorem.entities.ProjectAbstract.extensions);
- exts.addAll(org.chorem.entities.QuotationAbstract.extensions);
- exts.addAll(org.chorem.entities.SkillAbstract.extensions);
- exts.addAll(org.chorem.entities.TaskAbstract.extensions);
- exts.addAll(org.chorem.entities.TimeAbstract.extensions);
- exts.addAll(org.chorem.entities.TouchAbstract.extensions);
- exts.addAll(org.chorem.entities.VacationAbstract.extensions);
- exts.addAll(org.chorem.entities.WorkerAbstract.extensions);
-
- ws.storeExtension(null, exts);
- }
- }
- }
- return ws;
- }
-
- /**
- * Returns the attachments linked with a wikitty id ordered by date
- *
- * @param wikittyId
- * @return the list of attachments
- */
- static public List<Attachment> getAttachments(String wikittyId) {
- Criteria criteria = Search.query().
- eq(Attachment.FQ_FIELD_ATTACHMENT_TARGET, wikittyId).criteria();
- PagedResult<Attachment> result = getInstance(null).
- findAllByCriteria(Attachment.class, criteria);
- List<Attachment> attachments = result.getAll();
- return attachments;
- }
-
- /**
- * Returns the contact details linked with a wikitty id
- *
- * @param wikittyId
- * @return the list of contact details
- */
- static public List<ContactDetails> getContactDetails(String wikittyId) {
- Criteria criteria = Search.query().
- eq(ContactDetails.FQ_FIELD_CONTACTDETAILS_TARGET, wikittyId).criteria();
- PagedResult<ContactDetails> result = getInstance(null).
- findAllByCriteria(ContactDetails.class, criteria);
- List<ContactDetails> contactDetails = result.getAll();
- return contactDetails;
- }
-}
Modified: trunk/chorem-web/src/main/java/org/chorem/ChoremSession.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremSession.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremSession.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -8,7 +8,6 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.entities.WikittyUser;
-import org.nuiton.wikitty.services.WikittySecurityUtil;
/**
* Le seul objet qui doit être mis en session pour l'application. S'il y a
@@ -28,6 +27,7 @@
/** to use log facility, just put in your code: log.info(\"...\"); */
final static private Log log = LogFactory.getLog(ChoremSession.class);
+ private static final long serialVersionUID = 1L;
final static private String CHOREM_SESSION_KEY = ChoremSession.class.getSimpleName();
@@ -53,7 +53,7 @@
public ChoremProxy getProxy() {
if (proxy == null) {
- proxy = ChoremProxy.getInstance(securityToken);
+ proxy = ChoremProxy.getProxy(securityToken);
}
return proxy;
}
Modified: trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -4,7 +4,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -23,9 +22,10 @@
import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.entities.WikittyImpl;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
-import org.nuiton.wikitty.search.Search;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.conditions.Element;
/**
* Action qui d'interagir avec les jqgrid pour n'importe qu'elle type d'extension
@@ -168,12 +168,12 @@
// si l'utilisateur demande de supprimer aussi tous les objets qui ont
// ces ids comme reference, on les recherche
if (isDeleteAllLink()) {
- Search search = Search.query().or();
+ WikittyQueryMaker search = new WikittyQueryMaker().or();
for(String id:ids) {
search.keyword(id);
}
- Criteria criteria = search.criteria();
- PagedResult<String> result = getChoremProxy().findAllIdByCriteria(criteria);
+ WikittyQuery criteria = search.end();
+ WikittyQueryResult<String> result = getChoremProxy().findAllByQuery(criteria);
ids = result.getAll();
}
getChoremProxy().delete(ids);
@@ -223,11 +223,11 @@
protected void doSearch() {
- Search search = Search.query();
+ WikittyQueryMaker search = new WikittyQueryMaker().and();
if (StringUtils.isNotBlank(wikittyExtension)) {
Collection<String> col = ChoremUtil.toCollection(wikittyExtension);
- search.exteq(col);
+ search.extContainsAll(col);
}
// on restraint la recherche pour les sous grilles a l'id du wikitty
@@ -240,11 +240,10 @@
JSONObject jsonFilter = (JSONObject) JSONSerializer.toJSON( filters );
String groupOp = jsonFilter.getString("groupOp");
log.debug("groupOp: " + groupOp);
- Search filter;
if ("or".equalsIgnoreCase(groupOp)) {
- filter = search.or();
+ search.or();
} else {
- filter = search.and();
+ search.and();
}
JSONArray rules = jsonFilter.getJSONArray("rules");
int rulesCount = JSONArray.getDimensions(rules)[0];
@@ -253,19 +252,16 @@
String field = rule.getString("field");
String op = rule.getString("op");
String data = rule.getString("data");
- addCondition(filter, field, op, data);
+ addCondition(search, field, op, data);
}
} else if (StringUtils.isNotBlank(fulltextSearch)) {
- // TODO poussin 20111106: ca ne serait pas au like d'ajouter les * ?
- String s = "*" + fulltextSearch + "*";
- // TODO poussin 20111106: voir pourquoi like fontion comme on souhaite et pas Keyword :(
- // keyword ne fonctionne pas avec les *
- Search or = search.or();
- or = or.like("#fulltext", s);
+ String s = fulltextSearch;
+ WikittyQueryMaker or = new WikittyQueryMaker().or();
+ or = or.keyword(s);
log.debug("link: " + getWikittyLinkToLoadCache());
for (String link:getWikittyLinkToLoadCache()) {
- or.associated(link).like("#fulltext", s);
+ or.containsOne(link).select(Element.ID).keyword(s);
}
} else {
// si pas de filtre on recherche tout
@@ -274,17 +270,17 @@
int first = rows * (page - 1);
- int last = rows * page - 1;
+ int last = rows;
- Criteria criteria = search.criteria();
- criteria.setFirstIndex(first);
- criteria.setEndIndex(last);
+ WikittyQuery criteria = search.end();
+ criteria.setFirst(first);
+ criteria.setLimit(last);
if (StringUtils.isNotBlank(sidx)) {
if ("asc".equalsIgnoreCase(sord)) {
- criteria.setSortAscending(sidx);
+ criteria.setSortAscending(Element.get(sidx));
} else {
- criteria.setSortDescending(sidx);
+ criteria.setSortDescending(Element.get(sidx));
}
}
@@ -304,7 +300,8 @@
log.debug("criteria: " + criteria);
}
- PagedResult<Wikitty> result = getChoremProxy().findAllByCriteria(criteria);
+ WikittyQueryResult<Wikitty> result =
+ getChoremProxy().findAllByQuery(Wikitty.class, criteria);
setWikitties(result.getAll());
@@ -312,7 +309,7 @@
log.trace("result: " + getWikitties());
}
- setRecords(result.getNumFound());
+ setRecords(result.getTotalResult());
setTotal((int) Math.ceil((double) getRecords() / (double) getRows()));
gridModel = new ArrayList<Map<String, Object>>();
@@ -490,11 +487,11 @@
* @param op ['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']
* @param data la valuer de la condition
*/
- protected void addCondition(Search search, String field, String op, String data) {
+ protected void addCondition(WikittyQueryMaker search, String field, String op, String data) {
if ("eq".equalsIgnoreCase(op)) {
search.eq(field, data);
} else if ("ne".equalsIgnoreCase(op)) {
- search.neq(field, data);
+ search.ne(field, data);
} else if ("lt".equalsIgnoreCase(op)) {
search.lt(field, data);
} else if ("le".equalsIgnoreCase(op)) {
@@ -506,7 +503,7 @@
} else if ("bw".equalsIgnoreCase(op)) {
search.sw(field, data);
} else if ("bn".equalsIgnoreCase(op)) {
- search.nsw(field, data);
+ search.notsw(field, data);
} else if ("ew".equalsIgnoreCase(op)) {
search.ew(field, data);
} else if ("en".equalsIgnoreCase(op)) {
@@ -522,9 +519,9 @@
} else {
Collection<String> col = ChoremUtil.toCollection(data);
if ("in".equalsIgnoreCase(op)) {
- search.in(field, col);
+ search.containsOne(field, col);
} else if ("ni".equalsIgnoreCase(op)) {
- search.not().in(field, col);
+ search.not().containsOne(field, col);
} else {
log.error(String.format("Unreconize Operator %s for field %s and value %s", op, field, data));
}
Modified: trunk/chorem-web/src/main/java/org/chorem/action/HomeAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/action/HomeAction.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/java/org/chorem/action/HomeAction.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -19,6 +19,7 @@
import org.chorem.entities.Task;
import org.chorem.entities.Touch;
import org.chorem.entities.Worker;
+import org.nuiton.wikitty.WikittyClient;
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.WikittyUtil;
import org.nuiton.wikitty.entities.Wikitty;
@@ -48,7 +49,7 @@
@Override
public String execute() {
try {
- WikittyProxy proxy = getChoremProxy();
+ WikittyClient proxy = getChoremProxy();
load(proxy);
} catch (Exception eee) {
addActionError(getText(n_("chorem.error.internal")));
@@ -94,7 +95,7 @@
/** CA l'annee derniere jusqu'a maintenant (meme periode)*/
protected double salesTurnoverLastYear = 0;
- public void load(WikittyProxy proxy) throws ParseException {
+ public void load(WikittyClient proxy) throws ParseException {
String now = WikittyUtil.formatDate(new Date());
Deleted: trunk/chorem-web/src/main/resources/chorem.properties
===================================================================
--- trunk/chorem-web/src/main/resources/chorem.properties 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/resources/chorem.properties 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,29 +0,0 @@
-wikitty.data.directory=/tmp/chorem
-wikitty.storage.jdbc.queryfile=wikitty-jdbc-query.properties
-wikitty.storage.jdbc.driver=org.h2.Driver
-wikitty.storage.jdbc.host=jdbc:h2:file:${wikitty.data.directory}/data/db
-wikitty.storage.jdbc.login=sa
-wikitty.storage.jdbc.password=
-wikitty.storage.jdbc.xadatasource=org.h2.jdbcx.JdbcDataSource
-wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.URL=${wikitty.storage.jdbc.host}
-wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.user=${wikitty.storage.jdbc.login}
-wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.password=${wikitty.storage.jdbc.password}
-wikitty.searchengine.solr.directory.data=${wikitty.data.directory}/data/solr
-wikitty.searchengine.solr.directory.factory=solr.StandardDirectoryFactory
-wikitty.WikittyService.components=org.nuiton.wikitty.services.WikittyServiceStorage,\
-org.nuiton.wikitty.services.WikittyServiceNotifier,\
-org.nuiton.wikitty.services.WikittyServiceCached,\
-org.nuiton.wikitty.services.WikittyServiceSecurity
-wikitty.WikittyServiceStorage.components=org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,\
-org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\
-org.nuiton.wikitty.storage.solr.WikittySearchEngineSolr
-wikitty.WikittyServiceCached.components=org.nuiton.wikitty.services.WikittyCacheJCS
-wikitty.service.cache.listenevents=false
-wikitty.service.cache.allwaysRestoreCopies=false
-wikitty.service.event.propagate=false
-wikitty.service.event.listen=false
-wikitty.addon.export.threadnumber=1
-wikitty.addon.export.directory=${wikitty.data.directory}/export
-wikitty.addon.export.publicurl=file://${wikitty.data.directory}/export/
-jcs.default=
-jcs.default.cacheattributes.MaxObjects=1000
Deleted: trunk/chorem-web/src/main/resources/log4j.properties
===================================================================
--- trunk/chorem-web/src/main/resources/log4j.properties 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/resources/log4j.properties 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,34 +0,0 @@
-###
-# #%L
-# bow
-#
-# $Id$
-# $HeadURL$
-# %%
-# Copyright (C) 2010 CodeLutin
-# %%
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# #L%
-###
-# Global logging configuration
-log4j.rootLogger=INFO, stdout
-
-# Console output...
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] (%F:%L) %M - %m%n
-
-# package level
-log4j.logger.org.chorem=DEBUG
-log4j.logger.org.nuiton=INFO
Modified: trunk/chorem-web/src/main/resources/struts.xml
===================================================================
--- trunk/chorem-web/src/main/resources/struts.xml 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/resources/struts.xml 2012-04-23 13:11:43 UTC (rev 135)
@@ -75,13 +75,18 @@
<action name="companies">
<result>/WEB-INF/jsp/bonzoms/companies.jsp</result>
</action>
- <action name="persons" class="org.chorem.bonzoms.action.PersonAction">
+ <action name="persons">
<result>/WEB-INF/jsp/bonzoms/persons.jsp</result>
</action>
</package>
<package name="gepeto" namespace="/gepeto" extends="publicArea">
- <default-action-ref name="projectsWithoutQuotation" />
+ <default-action-ref name="projects" />
+ <action name="projects">
+ <result>/WEB-INF/jsp/gepeto/projects.jsp</result>
+ </action>
+
+
<action name="addProjectInput">
<result>/WEB-INF/jsp/gepeto/addProject.jsp</result>
</action>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,6 +1,4 @@
-<%@page import="org.apache.commons.lang.StringUtils"%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
-<%@page import="java.util.List" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
<%@taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
@@ -12,25 +10,11 @@
</head>
<body>
- <s:url id="companyDetails" namespace="/bonzoms" action="companyDetails"/>
- <script type="text/javascript">
- function formatCompanyIdLink(cellvalue, options, rowObject) {
- return "<a href='<s:property value="companyDetails"/>?companyId="+rowObject['id']+"'>voir</a>";
- }
- function formatCompanyLink(cellvalue, options, rowObject) {
- return "<a href='<s:property value="companyDetails"/>?companyId="+rowObject['id']+"'>" + cellvalue + "</a>";
- }
- </script>
-
- <s:url id="personDetails" namespace="/bonzoms" action="personDetails"/>
- <script type="text/javascript">
- function formatPersonNameLink(cellvalue, options, rowObject) {
- return "<a href='<s:property value="personDetails"/>?personId="+rowObject['id']+"'>" + cellvalue + "</a>";
- }
- </script>
-
- <%-- Partie generique (ou presque, ce ne sont que des variables qui change) --%>
-
+ <!--
+ |
+ | Definition des URL
+ |
+ +-->
<s:url id="selectPersonUrl" namespace="/ajax" action="selectWikittyComponent" escapeAmp="false">
<s:param name="wikittyExtension">Person</s:param>
<s:param name="sortField">Person.lastName</s:param>
@@ -91,7 +75,7 @@
href="%{listCompanyUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
- rowNum="20"
+ rowNum="10"
rownumbers="true"
autowidth="true"
sortname="Company.name"
@@ -118,7 +102,7 @@
navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
>
- <sjg:gridColumn name="id" hidden="true" key="true" title="Action" formatter="formatCompanyIdLink" editable="false" sortable="false"/>
+ <sjg:gridColumn name="id" hidden="true" title="id" key="true"/>
<sjg:gridColumn name="Company.name" index="Company.name" title="Société" editable="true" sortable="true"/>
<sjg:gridColumn name="Company.type" index="Company.type" title="type" editable="true" sortable="true"/>
@@ -128,7 +112,7 @@
href="%{listContactDetailsUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
- rowNum="20"
+ rowNum="10"
rownumbers="true"
autowidth="true"
sortname="ContactDetails.type"
@@ -177,7 +161,7 @@
href="%{listEmployeeUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
- rowNum="20"
+ rowNum="10"
rownumbers="true"
autowidth="true"
sortname="Person.lastName"
@@ -213,8 +197,8 @@
hidden="true" editrules="{edithidden:true}"
editoptions="{dataUrl:'%{selectPersonUrl}'}"/>
- <sjg:gridColumn name="Company.name" index="Company.name" title="Société" sortable="false" formatter="formatCompanyLink" editable="false"/>
- <sjg:gridColumn name="Person.lastName" index="Person.lastName" title="Nom" sortable="false" formatter="formatPersonNameLink" editable="false"/>
+ <sjg:gridColumn name="Company.name" index="Company.name" title="Société" sortable="false" editable="false"/>
+ <sjg:gridColumn name="Person.lastName" index="Person.lastName" title="Nom" sortable="false" editable="false"/>
<sjg:gridColumn name="Person.firstName" index="Person.firstName" title="Prénom" sortable="false" editable="false"/>
<sjg:gridColumn name="Person.diploma" index="Person.diploma" title="Diplôme" sortable="false" editable="false"/>
@@ -231,7 +215,7 @@
href="%{listContactDetailsUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
- rowNum="20"
+ rowNum="10"
rownumbers="true"
autowidth="true"
sortname="ContactDetails.type"
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,7 +1,4 @@
-<%@page import="org.apache.commons.lang.StringUtils"%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
-<%@page import="java.util.List" %>
-<%@page import="org.chorem.entities.Person" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
<%@taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
@@ -12,6 +9,7 @@
<title><s:text name="chorem.bonzoms.persons" /></title>
</head>
<body>
+
<h2><s:text name="chorem.bonzoms.persons" /></h2>
<s:url id="listPersonUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
@@ -42,7 +40,7 @@
href="%{listPersonUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
- rowNum="20"
+ rowNum="10"
rownumbers="true"
autowidth="true"
sortname="Person.lastName"
@@ -78,7 +76,7 @@
href="%{listContactDetailsUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
- rowNum="20"
+ rowNum="10"
rownumbers="true"
autowidth="true"
sortname="ContactDetails.type"
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/menu.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/menu.jsp 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/menu.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -2,11 +2,12 @@
<div id="menu">
<ul>
- <li><s:a action="addProjectInput"><s:text name="chorem.gepeto.project.add" /></s:a></li>
- <s:url action="projectsByYear" var="projectsByYear">
- <s:param name="year">2011</s:param>
- </s:url>
- <li><a href="${projectsByYear}"><s:text name="chorem.gepeto.projects" /></a></li>
- <li><s:a action="projectsWithoutQuotation"><s:text name="chorem.gepeto.projectsWithoutQuotation" /></s:a></li>
+ <li><s:a action="projects"><s:text name="chorem.gepeto.projects" /></s:a></li>
+ <li><s:a action="addProjectInput"><s:text name="chorem.gepeto.project.add" /></s:a></li>
+ <s:url action="projectsByYear" var="projectsByYear">
+ <s:param name="year">2011</s:param>
+ </s:url>
+ <li><a href="${projectsByYear}"><s:text name="chorem.gepeto.projects" /></a></li>
+ <li><s:a action="projectsWithoutQuotation"><s:text name="chorem.gepeto.projectsWithoutQuotation" /></s:a></li>
</ul>
</div>
\ No newline at end of file
Copied: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/projects.jsp (from rev 132, trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp)
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/projects.jsp (rev 0)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/projects.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,254 @@
+<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@taglib prefix="s" uri="/struts-tags" %>
+<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
+<%@taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
+
+<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
+ xmlns:jsp="http://java.sun.com/JSP/Page">
+ <head>
+ <title><s:text name="chorem.gepeto.projects" /></title>
+ </head>
+ <body>
+
+ <s:url id="selectEmployeeUrl" namespace="/ajax" action="selectWikittyComponent" escapeAmp="false">
+ <s:param name="wikittyExtension">Employee</s:param>
+ <s:param name="sortField">Employee.person</s:param>
+ </s:url>
+
+ <s:url id="selectCompanyUrl" namespace="/ajax" action="selectWikittyComponent" escapeAmp="false">
+ <s:param name="wikittyExtension">Company</s:param>
+ <s:param name="sortField">Company.name</s:param>
+ </s:url>
+
+ <s:url id="listProjectUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">Project</s:param>
+ </s:url>
+
+ <s:url id="editProjectUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">Project</s:param>
+ </s:url>
+
+ <s:url id="listQuotationUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">Quotation</s:param>
+ <s:param name="wikittyLinkToLoad">Quotation.customer,Employee.person,Employee.company</s:param>
+ </s:url>
+
+ <s:url id="editQuotationUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">Quotation</s:param>
+ <s:param name="wikittyLinkFieldForRowId">Quotation.project</s:param>
+ </s:url>
+
+ <s:url id="listProjectOrderUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">ProjectOrder</s:param>
+ <s:param name="wikittyLinkToLoad">ProjectOrder.Quotation,Quotation.project,Quotation.customer,Employee.person,Employee.company</s:param>
+ </s:url>
+
+ <s:url id="editProjectOrderUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">ProjectOrder</s:param>
+ </s:url>
+
+ <script type="text/javascript">
+ // event de la grille des companies qui selection seulement les employers
+ // la companie selectionnee
+ $.subscribe('rowselect', function(event, data) {
+ // alert('Selected Row : ' + event.originalEvent.id + ' data: ' + event.originalEvent.status);
+ var gridUrl = "<s:property value="listProjectOrderUrl" escapeHtml="false"/>&fulltextSearch=" + event.originalEvent.id;
+ jQuery("#gridProjectOrder").jqGrid('setGridParam',{url:gridUrl,page:1})
+ .trigger('reloadGrid');
+ });
+ </script>
+
+ <h2><s:text name="chorem.bonzoms.projects" /></h2>
+
+ <s:form>
+ <s:textfield id="fulltextSearchProject" name="fulltextSearchProject"
+ onkeydown="doSearch('#gridProject', '#fulltextSearchProject', '%{listProjectUrl}')"></s:textfield>
+ </s:form>
+
+ <sjg:grid
+ id="gridProject"
+ dataType="json"
+ href="%{listProjectUrl}"
+ gridModel="gridModel"
+ rowList="10,20,50,100"
+ rowNum="20"
+ rownumbers="true"
+ autowidth="true"
+ sortname="Project.name"
+ sortorder="asc"
+ pager="true"
+ viewrecords="true"
+
+ multiselect="false"
+
+ editurl="%{editProjectUrl}"
+ editinline="false"
+
+ onSelectRowTopics="rowselect"
+
+ navigator="true"
+ navigatorAdd="true"
+ navigatorEdit="true"
+ navigatorDelete="true"
+ navigatorView="true"
+ navigatorSearch="true"
+ navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorEditOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
+ >
+
+ <sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
+ <sjg:gridColumn name="Project.name" index="Project.name" title="Nom"
+ editable="true" sortable="true"/>
+ <sjg:gridColumn name="Project.description" index="Project.description"
+ title="Description" editable="true" sortable="true"
+ edittype="textarea"/>
+
+
+ <sjg:grid
+ id="gridQuotation"
+ dataType="json"
+ href="%{listQuotationUrl}"
+ gridModel="gridModel"
+ rowList="10,20,50,100"
+ rowNum="20"
+ rownumbers="true"
+ autowidth="true"
+ sortname="Quotation.reference"
+ sortorder="asc"
+ pager="true"
+ viewrecords="true"
+
+ multiselect="false"
+
+ editurl="%{editQuotationUrl}"
+ editinline="false"
+
+ navigator="true"
+ navigatorAdd="true"
+ navigatorEdit="true"
+ navigatorDelete="true"
+ navigatorView="true"
+ navigatorSearch="true"
+ navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorEditOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
+ >
+
+ <sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
+
+ <sjg:gridColumn name="Quotation.customer" index="Quotation.customer"
+ title="Acheteur" editable="true" edittype="select"
+ hidden="true" editrules="{edithidden:true,required:true}"
+ editoptions="{dataUrl:'%{selectEmployeeUrl}'}"/>
+ <sjg:gridColumn name="Quotation.supplier" index="Quotation.supplier"
+ title="Vendeur" editable="true" edittype="select"
+ hidden="true" editrules="{edithidden:true}"
+ editoptions="{dataUrl:'%{selectEmployeeUrl}'}"/>
+
+
+ <sjg:gridColumn name="Company.name" index="Company.name"
+ title="Société" editable="false" sortable="false"/>
+ <sjg:gridColumn name="Person.name" index="Person.name"
+ title="Acheteur" editable="false" sortable="false"/>
+
+ <sjg:gridColumn name="Quotation.reference" index="Quotation.reference"
+ title="Référence" editable="true" sortable="true"
+ editrules="{required:true}"/>
+ <sjg:gridColumn name="Quotation.type" index="Quotation.type"
+ title="Type" editable="true" sortable="true"
+ edittype="select" editoptions="{value:'Development:Development;TMA:TMA;Regie:Regie;System:Sytem;Conseil:Conseil;Audit:Audit;Support:Support;Other:Other'}"/>
+ <sjg:gridColumn name="Quotation.description" index="Quotation.description"
+ title="Description" editable="true" sortable="true"
+ edittype="textarea"/>
+ <sjg:gridColumn name="Quotation.amount" index="Quotation.amount"
+ title="Montant" editable="true" sortable="true"
+ editrules="{number:true}"/>
+ <sjg:gridColumn name="Quotation.VAT" index="Quotation.VAT"
+ title="TVA" editable="true" sortable="true"
+ editrules="{number:true}"/>
+ <sjg:gridColumn name="Interval.beginDate" index="Interval.beginDate"
+ title="Date d'envoi" editable="true" sortable="true"
+ editrules="{date:true}"/>
+ <sjg:gridColumn name="Interval.endDate" index="Interval.endDate"
+ title="Date de validité" editable="true" sortable="true"
+ editrules="{date:true}"/>
+ <sjg:gridColumn name="Quotation.conversionHope" index="Quotation.conversionHope"
+ title="Convertibilité" editable="true" sortable="true"
+ editrules="{integer:true,minValue:0,maxValue:100}"/>
+ </sjg:grid>
+ </sjg:grid>
+
+ <h2><s:text name="chorem.bonzoms.employees" /></h2>
+
+ <s:form>
+ <s:textfield id="fulltextSearchProjectOrder" name="fulltextSearchProjectOrder"
+ onkeydown="doSearch('#gridProjectOrder', '#fulltextSearchProjectOrder', '%{listProjectOrderUrl}')"></s:textfield>
+ </s:form>
+
+ <sjg:grid
+ id="gridProjectOrder"
+ dataType="json"
+ href="%{listProjectOrderUrl}"
+ gridModel="gridModel"
+ rowList="10,20,50,100"
+ rowNum="20"
+ rownumbers="true"
+ autowidth="true"
+ sortname="ProjectOrder.status"
+ sortorder="asc"
+ pager="true"
+ viewrecords="true"
+
+ multiselect="false"
+
+ editurl="%{editProjectOrderUrl}"
+ editinline="false"
+
+ navigator="true"
+ navigatorAdd="true"
+ navigatorEdit="true"
+ navigatorDelete="true"
+ navigatorView="true"
+ navigatorSearch="true"
+ navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorEditOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
+ >
+
+ <sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
+
+ <sjg:gridColumn name="ProjectOrder.company" index="ProjectOrder.company"
+ title="Société" editable="true" edittype="select"
+ hidden="true" editrules="{edithidden:true}"
+ editoptions="{dataUrl:'%{selectCompanyUrl}'}"/>
+
+ <sjg:gridColumn name="Company.name" index="Company.name"
+ title="Société" sortable="false" editable="false"/>
+
+ <sjg:gridColumn name="ProjectOrder.status" index="ProjectOrder.status"
+ title="Type" edittype="select" editable="true"
+ editoptions="{value:'NotStarted;NotStarted;WorkInProgress:WorkInProgress;Finished:Finished;Other:Other'}"/>
+ <sjg:gridColumn name="ProjectOrder.type" index="ProjectOrder.type"
+ title="Type" edittype="select" editable="true"
+ editoptions="{value:'Development;Development;Regie:Regie;System:Sytem;Conseil:Conseil;Audit:Audit;Support:Support;Other:Other'}"/>
+ <sjg:gridColumn name="ProjectOrder.description" index="ProjectOrder.description"
+ title="Description" edittype="textarea" editable="true"/>
+ <sjg:gridColumn name="Interval.beginDate" index="Interval.beginDate"
+ title="Date d'envoi" editable="true" sortable="true"
+ editrules="{date:true}"/>
+ <sjg:gridColumn name="Interval.endDate" index="Interval.endDate"
+ title="Date de validité" editable="true" sortable="true"
+ editrules="{date:true}"/>
+ <sjg:gridColumn name="Quotation.conversionHope" index="Quotation.conversionHope"
+ title="Convertibilité" editable="true" sortable="true"
+ editrules="{integer:true,minValue:0,maxValue:100}"/>
+
+ <%-- TODO poussin 20111123 put task grid here --%>
+ </sjg:grid>
+
+ </body>
+</html>
Property changes on: trunk/chorem-webmotion
___________________________________________________________________
Added: svn:ignore
+ target
Added: trunk/chorem-webmotion/LICENSE.txt
===================================================================
Added: trunk/chorem-webmotion/README.txt
===================================================================
Added: trunk/chorem-webmotion/changelog.txt
===================================================================
Added: trunk/chorem-webmotion/nb-configuration.xml
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-webmotion/nb-configuration.xml
___________________________________________________________________
Added: svn:mime-type
+ application/xml
Added: trunk/chorem-webmotion/pom.xml
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-webmotion/pom.xml
___________________________________________________________________
Added: svn:mime-type
+ application/xml
Added: trunk/chorem-webmotion/src/main/i18n/jsp.rules
===================================================================
--- trunk/chorem-webmotion/src/main/i18n/jsp.rules (rev 0)
+++ trunk/chorem-webmotion/src/main/i18n/jsp.rules 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,10 @@
+# Règles i18n pour les jsp
+
+//s:text/@name
+//s:submit/@key
+//s:textfield/@key
+//s:password/@key
+//s:file/@key
+//s:textarea/@key
+
+//sx:datetimepicker/@key
Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/GenericAction.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/GenericAction.java (rev 0)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/GenericAction.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,411 @@
+package org.chorem.webmotion.actions;
+
+import com.google.common.collect.LinkedHashMultimap;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.ChoremClient;
+import org.debux.webmotion.server.WebMotionController;
+import org.debux.webmotion.server.render.Render;
+import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.Element;
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.entities.WikittyImpl;
+import org.nuiton.wikitty.entities.WikittyTypes;
+import org.nuiton.wikitty.generator.WikittyTagValue;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryParser;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class GenericAction extends WebMotionController {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(GenericAction.class);
+
+ // ANCIENNE IMLANTATION A SUPPRIMER
+ public Render search2(ChoremClient client, String[] extension, String query) {
+ WikittyQuery q = null;
+ if (StringUtils.isNotBlank(query)) {
+ q = new WikittyQueryParser().parseQuery(query);
+ }
+ if (extension != null) {
+ WikittyQueryMaker maker = new WikittyQueryMaker().or();
+ for(String extName : extension) {
+ if (StringUtils.isNotBlank(extName)) {
+ maker.exteq(extName);
+ }
+ }
+
+ if (q == null) {
+ q = maker.end();
+ } else {
+ q = new WikittyQueryMaker(q).and()
+ .condition(q.getCondition())
+ .condition(maker.getCondition()).end();
+ }
+ }
+ LinkedHashMultimap<String, Wikitty> map = LinkedHashMultimap.create();
+ if (q != null) {
+ WikittyQueryResult<Wikitty> result = client.findAllByQuery(Wikitty.class, q);
+ for (Wikitty w : result) {
+ for (String ext : w.getExtensionNames()) {
+ String ts = w.getExtension(ext).getTagValue(WikittyTagValue.TAG_TO_STRING);
+ if (StringUtils.isNotBlank(ts)) {
+ map.put(ext, w);
+ }
+ }
+ }
+ }
+ return renderView("search.jsp", "result", map);
+ }
+
+ // FIXME poussin 20120418 cette methode est-elle vraiment utilise ?
+ // si oui searchJson ne peut-elle pas la remplacer ?
+ public Render searchFieldJson(ChoremClient client, String query) {
+ List<Map<String, String>> result;
+ try {
+ WikittyQuery q = WikittyQueryParser.parse(query);
+ q.setOffset(0).setLimit(WikittyQuery.MAX); // FIXME poussin 20120416 peut-etre toujours avoir un max et non pas l'infini (100?)
+ WikittyQueryResult<String> queryResult = client.findAllByQuery(q);
+
+ result = new ArrayList<Map<String, String>>(queryResult.size());
+ for (String s : queryResult) {
+ String id = s;
+ String label = s;
+ Map<String, String> item = new LinkedHashMap<String, String>();
+ item.put("label", label);
+ item.put("value", label);
+ item.put("name", label);
+ item.put("id", id);
+ result.add(item);
+ }
+ } catch (Exception eee) {
+ log.error(String.format("Can't evaluate query: '%s'", query), eee);
+ result = Collections.EMPTY_LIST;
+ }
+
+ return renderJSON(result);
+
+ }
+
+ public Render getById(ChoremClient client, String id) {
+ Map<String, String> result = new LinkedHashMap<String, String>();
+
+ Wikitty w = client.restore(id);
+ if (w != null) {
+ result.put("id", id);
+ result.put("version", w.getVersion());
+ result.put("extensions", StringUtils.join(w.getExtensionNames(), ","));
+ for (WikittyExtension ext : w.getExtensions()) {
+ result.put(ext.getName() + ".version", ext.getVersion());
+ for (String tag : ext.getTagNames()) {
+ result.put(ext.getName() + ".tag." + tag, ext.getTagValue(tag));
+ }
+ for (String field : ext.getFieldNames()){
+ result.put(ext.getName() + "." + field, w.getFieldAsString(ext.getName(), field));
+ }
+ }
+ }
+
+ return renderJSON(result);
+
+ }
+
+ public Render search(ChoremClient client, String[] extension, String query) {
+ LinkedHashMultimap<String, Wikitty> map = searchAsMap(client, extension, query);
+ return renderView("search.jsp", "result", map);
+
+ }
+
+ /**
+ * Execute une recherche et retourne le resultat sous un format json
+ * <pre>
+ * [{extension: XXXX, // nom de l'extension
+ * label: XXXX // toString pour l'extension pour l'objet
+ * value: XXXX // toString pour l'extension pour l'objet
+ * name: XXXX // toString pour l'extension pour l'objet
+ * id: XXXX // id de l'objet
+ * },
+ * {...}
+ * ,...
+ * ]
+ * </pre>
+ *
+ * @param client objet injecte par le framework webmotion/chorem
+ * @param extension la liste des extensions que peut/doit avoir l'objet resultat
+ * @param query la restriction a appliquer en plus des extensions
+ * @return une reponse JSON
+ */
+ public Render searchJson(ChoremClient client, String[] extension, String query) {
+// // extensionRestriction est de la forme "ext1,ext2;ext3;ext4,ext5,ext6" ...
+// String extensionRestriction = StringUtils.join(extension, ";");
+// if (StringUtils.isNotBlank(extensionRestriction)) {
+// // et il faut avoir "extension=ext1 AND extension=ext2 OR extension=ext3 OR extension=ext4 AND extension=ext5 AND extension=ext6"
+// extensionRestriction = extensionRestriction.replaceAll("\\s", "");
+// extensionRestriction = "extension=" + extensionRestriction;
+// extensionRestriction = extensionRestriction.replaceAll(";", " OR extension=");
+// extensionRestriction = extensionRestriction.replaceAll(",", " AND extension=");
+//
+// query += " AND ("+extensionRestriction+")";
+// }
+
+ LinkedHashMultimap<String, Wikitty> map = searchAsMap(client, extension, query);
+ List<Map<String, String>> result = new ArrayList<Map<String, String>>(map.size());
+ for (Map.Entry<String, Wikitty> e : map.entries()) {
+ String extName = e.getKey();
+ String id = e.getValue().getId();
+ String label = e.getValue().toString(extName);
+ Map<String, String> item = new LinkedHashMap<String, String>();
+ item.put("extension", extName);
+ item.put("label", label);
+ item.put("value", label);
+ item.put("name", label);
+ item.put("id", id);
+ result.add(item);
+ }
+ return renderJSON(result);
+ }
+
+ /**
+ * Fait une recherche et retourne le resultat dans une map avec comme cle
+ * le nom de l'extension et comme valeur une liste de Wikitty qui correspond
+ * aux criteres de recherche
+ *
+ * @param client objet injecte par le framework webmotion/chorem
+ * @param extension la liste des extensions que peut/doit avoir l'objet resultat
+ * Si vide alors on fait la recherche sur toutes les extensions disponibles
+ * dans la base.
+ * @param query la restriction a appliquer en plus des extensions
+ * @return une Map{extensionName: liste de wikitty}
+ */
+ protected LinkedHashMultimap<String, Wikitty> searchAsMap(
+ ChoremClient client, String[] extension, String query) {
+ boolean expliciteExtension = false;
+ Collection<String> extNames;
+ if (ArrayUtils.isEmpty(extension)) {
+ // recuperation de toutes les extensions
+ extNames = new LinkedHashSet<String>();
+ Collection<String> extIds = client.getAllExtensionIds();
+ for (String id : extIds) {
+ String name = WikittyExtension.computeName(id);
+ extNames.add(name);
+ }
+ } else {
+ // utilisation des extensions demande en parametre
+ extNames = Arrays.asList(extension);
+ expliciteExtension = true;
+ }
+
+ Map<String, WikittyExtension> extensionMaps = new LinkedHashMap<String, WikittyExtension>();
+ // chargement de la definition de toutes les extensions
+ List<WikittyExtension> exts = client.restoreExtensionAndDependenciesLastVesion(extNames);
+ for (WikittyExtension ext : exts) {
+ // on ne garde que les extensions qui on un toString ou qui ont ete
+ // explicitement demandee
+ if (expliciteExtension || ext.hasTagValueToString()) {
+ extensionMaps.put(ext.getName(), ext);
+ }
+ }
+
+ // suppression des extensions non souhaitee
+ // le mieux serait d'avoir une method sur le client 'restoreExtensionLastVesion'
+ extensionMaps.keySet().retainAll(extNames);
+
+ // creation de la parti de la condition commune a toutes les requetes
+ WikittyQuery q = null;
+ if (StringUtils.isNotBlank(query)) {
+ q = new WikittyQueryParser().parseQuery(query);
+ }
+
+ // creation d'une requete par extension
+ List<WikittyQuery> queries = new ArrayList<WikittyQuery>(extensionMaps.size());
+ for (WikittyExtension ext : extensionMaps.values()) {
+ WikittyQueryMaker queryMaker = new WikittyQueryMaker().and();
+ if (q != null) {
+ // on ajoute pour chaque champs precharge, la meme condition
+ // par exemple cela permet lorsqu'on recherche un 'Employee' de
+ // recherche aussi sur le nom de la personne ou de la societe
+ String [] preload = StringUtils.split(ext.getTagValue(WikittyTagValue.TAG_PRELOAD), ";");
+ if (preload == null) {
+ // si pas de preload, on ajoute directement la restriction
+ queryMaker.condition(q.getCondition());
+ } else {
+ // sinon, il faut faire un "or" entre tous
+ queryMaker.or();
+ // on ajoute la restriction dans le or
+ queryMaker.condition(q.getCondition());
+ for (String e : preload) {
+// String preloadQuery = String.format("%s={SELECT ID WHERE %s}",
+// e, query);
+// WikittyQuery wq = WikittyQueryParser.parse(preloadQuery);
+// queryMaker.condition(wq.getCondition());
+ queryMaker.containsOne(Element.get(e))
+ .select(Element.ID).condition(q.getCondition())
+ .close() // select
+ .close(); // containsOne
+ }
+ // on ferme le or
+ queryMaker.close();
+ }
+ }
+
+
+ WikittyQuery extQuery = queryMaker.exteq(ext.getName()).end();
+ extQuery.setName(ext.getName());
+ if (q != null) {
+ extQuery.setOffset(q.getOffset());
+ extQuery.setLimit(q.getLimit());
+ }
+ // ajout de l'ordre de tri de l'extension
+ extQuery.setSortAscending(ext.getSortAscending());
+ extQuery.setSortDescending(ext.getSortDescending());
+
+ queries.add(extQuery);
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("Queries: " + queries);
+ }
+
+ List<WikittyQueryResult<Wikitty>> results =
+ client.findAllByQuery(Wikitty.class, queries);
+
+ // on classe par extension demande les resultats
+ LinkedHashMultimap<String, Wikitty> map = LinkedHashMultimap.create();
+ for (WikittyQueryResult<Wikitty> result : results) {
+ String ext = result.getQueryName();
+ for (Wikitty w : result) {
+ map.put(ext, w);
+ }
+ }
+
+ return map;
+ }
+
+ public Render view(ChoremClient client, String id, String[] extension) {
+ log.debug("view: " + id);
+ Wikitty w = client.restore(id, ".*");
+
+ LinkedHashSet<WikittyExtension> exts = new LinkedHashSet<WikittyExtension>();
+ if (w != null) {
+ if (extension == null) {
+ exts.addAll(w.getExtensions());
+ } else {
+ for (String extName : extension) {
+ exts.addAll(w.getExtensionDependencies(extName, true));
+ exts.add(w.getExtension(extName));
+ }
+ }
+ }
+
+ return renderView("view.jsp", "wikitty", w, "extensions", exts);
+ }
+
+ public Render edit(ChoremClient client, String id, String[] extension) {
+ log.debug("edit: " + id);
+ Wikitty w = client.restore(id, ".*");
+
+ if (w == null) {
+ w = new WikittyImpl();
+ }
+ if (extension != null) {
+ List<WikittyExtension> newExts =
+ client.restoreExtensionAndDependenciesLastVesion(Arrays.asList(extension));
+ w.addExtension(newExts);
+ }
+
+ LinkedHashSet<WikittyExtension> exts = new LinkedHashSet<WikittyExtension>();
+ if (w != null) {
+ if (extension == null) {
+ exts.addAll(w.getExtensions());
+ } else {
+ for (String extName : extension) {
+ exts.addAll(w.getExtensionDependencies(extName, true));
+ exts.add(w.getExtension(extName));
+ }
+ }
+ }
+
+ return renderView("edit.jsp", "wikitty", w, "extensions", exts);
+ }
+
+ public Render save(ChoremClient client, String id, String extension) {
+ log.debug("save: " + id);
+ Wikitty w = client.restore(id);
+ if (w == null) {
+ w = new WikittyImpl();
+ }
+ List<WikittyExtension> exts =
+ client.restoreExtensionAndDependenciesLastVesion(Arrays.asList(extension));
+ w.addExtension(exts);
+ Map<String, String[]> params = getContext().getParameters();
+ String error = "";
+ for (String fqfield : params.keySet()) {
+ if (w.hasField(fqfield)) {
+ String[] values = params.get(fqfield);
+ Object v;
+ if (w.getFieldType(fqfield).isCollection()) {
+ if (values.length == 1 && w.getFieldType(fqfield).getType() == WikittyTypes.WIKITTY) {
+ // petit hack si l'editeur utilise n'est pas un select,
+ // mais un input (et donc des valeurs separees par des ','
+ values = values[0].split(",");
+ System.out.println("YYYY " + Arrays.toString(values));
+ }
+ v = values;
+ } else {
+ v = values[0];
+ }
+ try {
+ System.out.println("AAA try to put in field: " + fqfield + " values: " + Arrays.toString(values));
+ w.setFqField(fqfield, v);
+ System.out.println("XXX after field: " + w.getFqField(fqfield));
+ } catch (Exception eee) {
+ String msg = String.format("Can't put value '%s' in field '%s'", v, fqfield);
+ error += "\n<li>" + msg + "</li>";
+ log.error(msg, eee);
+ }
+ }
+ }
+ client.store(w);
+
+ getContext().addInfoMessage("message", "Object saved" + error);
+
+ return renderURL("/wikitty/view/"+w.getId());
+ }
+
+ public Render delete(ChoremClient client, String id, String[] extension) {
+ log.debug("delete: " + id);
+ if (extension == null) {
+ client.delete(id);
+ getContext().addInfoMessage("message", "Object deleted");
+ } else {
+ getContext().addInfoMessage("message", "Delete extension not yet implemented");
+// Wikitty w = client.restore(id);
+// for (String extName : extension) {
+// // todo remove extension field and extension
+// }
+ }
+ return renderURL("/wikitty/view/"+id);
+ }
+}
Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/ChoremClientFilter.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/ChoremClientFilter.java (rev 0)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/ChoremClientFilter.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,52 @@
+package org.chorem.webmotion.filters;
+
+
+import java.lang.reflect.Method;
+import java.util.Map;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.ChoremClient;
+import org.debux.webmotion.server.WebMotionFilter;
+import org.debux.webmotion.server.WebMotionUtils;
+import org.debux.webmotion.server.call.Executor;
+import org.debux.webmotion.server.mapping.Mapping;
+
+/**
+ * Inject dans les parametres des actions le client wikitty a utiliser pour les
+ * actions (ChoremClient)
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ChoremClientFilter extends WebMotionFilter {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ChoremClientFilter.class);
+
+ public void inject(Mapping mapping, String token) {
+ ChoremClient client = ChoremClient.getClient(token);
+
+ Executor executor = contextable.getCall().getExecutor();
+ if (executor != null) {
+ Method executorMethod = executor.getMethod();
+ String[] parameterNames = WebMotionUtils.getParameterNames(mapping, executorMethod);
+ Class<?>[] parameterTypes = executorMethod.getParameterTypes();
+ Map<String, Object> parameters = executor.getParameters();
+
+ for (int i=0; i<parameterNames.length; i++) {
+ Class<?> clazz = parameterTypes[i];
+ if (ChoremClient.class.isAssignableFrom(clazz)) {
+ String name = parameterNames[i];
+ if (parameters.get(name) == null) {
+ parameters.put(name, client);
+ }
+ }
+ }
+ }
+
+ doProcess();
+ }
+}
Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/DecoratorFilter.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/DecoratorFilter.java (rev 0)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/DecoratorFilter.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,54 @@
+package org.chorem.webmotion.filters;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.debux.webmotion.server.WebMotionFilter;
+import org.debux.webmotion.server.render.Render;
+
+/**
+ * Filtre pour decorer les pages. Il est possible de le configurer pour modifier
+ * le fichier view par defaut ou le nom du slot principale
+ * <p>
+ * parametre possible
+ * <li> view: le nom du fichier jsp a utiliser comme decorateur (defaut: decorator.jsp)
+ * <li> main: le nom du slot utilise pour mettre le contenu principal (defaut: slotContent)
+ *
+ * Si dans la requete on trouve un attribut "__nodecorator__" qui vaut true alors
+ * on ne fait pas la decoration.
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class DecoratorFilter extends WebMotionFilter {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(DecoratorFilter.class);
+
+ public Render decorate(String wmDecoratorNo, String wmDecoratorView, String wmDecoratorMain) {
+ Boolean nodecorator = (Boolean)getContext().getRequest().getAttribute("wmDecoratorNo");
+ if (StringUtils.equalsIgnoreCase("true", wmDecoratorNo)
+ || nodecorator != null && nodecorator) {
+ log.debug("Decorator direct process");
+ doProcess();
+ return null;
+ } else {
+ getContext().getRequest().setAttribute("wmDecoratorNo", Boolean.TRUE);
+ String url = getContext().getUrl();
+ // pas besoin de mettre le query car, les arguments sont deja parse et stocke dans la request
+ log.debug("Decorate page '"+ url +"'");
+
+ if (StringUtils.isBlank(wmDecoratorView)) {
+ wmDecoratorView = "decorator.jsp";
+ }
+ if (StringUtils.isBlank(wmDecoratorMain)) {
+ wmDecoratorMain = "slotContent";
+ }
+ return renderView(wmDecoratorView, wmDecoratorMain, url);
+ }
+ }
+
+}
Added: trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyInput.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyInput.java (rev 0)
+++ trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyInput.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,275 @@
+package org.wikitty.web.jsptag;
+
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.ServletContext;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.tagext.DynamicAttributes;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.FieldType;
+import org.nuiton.wikitty.entities.Wikitty;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittyInput extends SimpleTagSupport implements DynamicAttributes {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyInput.class);
+
+ protected Map<String, Object> dynamicAttribute = new HashMap<String, Object>();
+
+ protected String name="";
+ protected Object defaultValue="";
+
+ protected Wikitty wikitty;
+ protected String fqfield="";
+
+ public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
+ dynamicAttribute.put(localName, value);
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setDefaultValue(Object defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ public void setWikitty(Wikitty wikitty) {
+ this.wikitty = wikitty;
+ }
+
+ public void setFqfield(String fqfield) {
+ this.fqfield = fqfield;
+ }
+
+ @Override
+ public void doTag() throws JspException, IOException {
+ // par defaut si pas de name on utilise celui du field
+ if (StringUtils.isBlank(name)) {
+ name = fqfield;
+ }
+
+ JspWriter output = getJspContext().getOut();
+ PageContext pageContext = (PageContext)getJspContext();
+ ServletContext servletContext = pageContext.getServletContext();
+ String contextPath = servletContext.getContextPath();
+
+ String extName = WikittyUtil.getExtensionNameFromFQFieldName(fqfield);
+ String fieldName = WikittyUtil.getFieldNameFromFQFieldName(fqfield);
+ FieldType field = wikitty.getFieldType(fqfield);
+
+ if (field != null) {
+ switch(field.getType()) {
+ case BINARY:
+ inputBinary(output, contextPath, name, wikitty, field, extName, fieldName);
+ break;
+ case BOOLEAN:
+ inputBoolean(output, contextPath, name, wikitty, field, extName, fieldName);
+ break;
+ case DATE:
+ inputDate(output, contextPath, name, wikitty, field, extName, fieldName);
+ break;
+ case NUMERIC:
+ inputNumeric(output, contextPath, name, wikitty, field, extName, fieldName);
+ break;
+ case STRING:
+ if (field.isCollection()) {
+ inputCollectionString(output, contextPath, name, wikitty, field, extName, fieldName);
+ } else {
+ inputString(output, contextPath, name, wikitty, field, extName, fieldName);
+ }
+ break;
+ case WIKITTY:
+ if (field.isCollection()) {
+ inputCollectionWikitty(output, contextPath, name, wikitty, field, extName, fieldName);
+ } else {
+ inputWikitty(output, contextPath, name, wikitty, field, extName, fieldName);
+ }
+ break;
+ }
+ } else {
+ /*{<div class="alert alert-error"><%=wikitty.getId()%> doesn't have field '<%=fqfield%>'</div>}*/
+ }
+ }
+
+ protected String getDynamicAttribute() {
+ String result = "";
+ for (Map.Entry<String, Object> e : dynamicAttribute.entrySet()) {
+ result += " " + e.getKey() + "=\"" + e.getValue() + "\"";
+ }
+ return result;
+ }
+
+
+
+ protected void inputBinary(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ /*{<input type="text" name="<%=name%>" <%=getDynamicAttribute()%>/>"}*/
+ }
+
+ protected void inputBoolean(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ boolean value = wikitty.getFieldAsBoolean(extName, fieldName);
+ String checked="";
+ if (value) {
+ checked=" checked";
+ }
+ /*{<input type="checkbox" name="<%=name%>"<%=checked%><%=getDynamicAttribute()%>/>}*/
+ }
+
+ protected void inputDate(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ Date date = wikitty.getFieldAsDate(extName, fieldName);
+ String value = DateFormatUtils.format(date, "dd/MM/yyyy");
+ /*{<input class="datepicker" type="date" name="<%=name%>" value="<%=value%>"<%=getDynamicAttribute()%>/>}*/
+ }
+
+ protected void inputNumeric(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ BigDecimal value = wikitty.getFieldAsBigDecimal(extName, fieldName);
+ /*{<input type="text" name="<%=name%>" value="<%=value%>"<%=getDynamicAttribute()%>/>}*/
+ }
+
+ protected void inputString(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ String id = wikitty.getId() + "-" + extName + "-" + fieldName;
+ String value = wikitty.getFieldAsString(extName, fieldName);
+ if ("monoline".equalsIgnoreCase(field.getSubtype())) {
+ /*{<input id="text-<%=id%>" type="text" name="<%=name%>" value="<%=value%>"<%=getDynamicAttribute()%>/>}*/
+ if (field.hasChoiceQuery()) {
+ String url = contextPath + "/wikitty-json/searchField?q=" + field.getChoiceQuery();
+/*{
+ <script>
+ $(function() {
+ $( "#text-<%=id%>" ).autocomplete({
+ source: "<%=url%>",
+ minLength: 1
+ });
+ });
+ </script>
+}*/
+ }
+ } else {
+ /*{<textarea name="<%=name%>"<%=getDynamicAttribute()%>><%=value%></textarea>}*/
+ }
+ }
+
+ protected void inputCollectionString(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ String id = wikitty.getId() + "-" + extName + "-" + fieldName;
+ List<String> value = wikitty.getFieldAsList(extName, fieldName, String.class);
+
+ if ("monoline".equalsIgnoreCase(field.getSubtype())) {
+ /*{<input id="text-<%=id%>" type="text" name="<%=name%>" value="<%=value%>"<%=getDynamicAttribute()%>/>}*/
+ if (field.hasChoiceQuery()) {
+ String url = contextPath + "/wikitty-json/searchField?q=" + field.getChoiceQuery();
+/*{
+ <script>
+ $(function() {
+ $( "#text-<%=id%>" ).autocomplete({
+ source: "<%=url%>",
+ minLength: 1
+ });
+ });
+ </script>
+}*/
+ }
+ } else {
+ /*{<textarea name="<%=name%>"<%=getDynamicAttribute()%>><%=value%></textarea>}*/
+ }
+ }
+
+ protected void inputWikitty(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ String id = wikitty.getId() + "-" + extName + "-" + fieldName;
+ String value = wikitty.getFieldAsWikitty(extName, fieldName);
+ Wikitty wikittyValue = wikitty.getFieldAsWikitty(extName, fieldName, false);
+ String url = contextPath + "/wikitty-json/search?extension=" + field.getAllowed();
+/*{
+ <script>
+ $(function() {
+ $( "#text-<%=id%>" ).autocompleteByExtension({
+ source: "<%=url%>",
+ minLength: 2,
+ select: function( event, ui ) {
+ $( "#text-<%=id%>" ).val( ui.item.label );
+ $( "#hidden-<%=id%>" ).val( ui.item.id );
+
+ return false;
+ }
+ });
+ });
+ </script>
+
+<input type="text" id="text-<%=id%>" value="<%=wikittyValue%>"<%=getDynamicAttribute()%>/>
+<input type="hidden" id="hidden-<%=id%>" name="<%=name%>" value="<%=value%>"/>
+}*/
+ }
+
+ protected void inputCollectionWikitty(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ String id = wikitty.getId() + "-" + extName + "-" + fieldName;
+ List<Wikitty> values = wikitty.getFieldAsWikittyList(extName, fieldName, false);
+
+ String url = contextPath + "/wikitty-json/search?extension=" + field.getAllowed();
+
+ String sep = "";
+ String prePopulate = "[";
+ if (values != null) {
+ for (Wikitty w :values) {
+ if (w != null) {
+ prePopulate += String.format("%s{id:'%s', label:'%s'}", sep,
+ StringEscapeUtils.escapeEcmaScript(w.getId()),
+ StringEscapeUtils.escapeEcmaScript(w.toString()));
+ sep = ",";
+ }
+ }
+ }
+ prePopulate += "]";
+/*{
+<script type="text/javascript">
+$(document).ready(function () {
+ $("#text-<%=id%>").tokenInput("<%=url%>", {
+ prePopulate: <%=prePopulate%>,
+ preventDuplicates: true,
+ propertyToSearch: "label"
+
+ });
+});
+</script>
+
+<input type="text" id="text-<%=id%>" name="<%=name%>"<%=getDynamicAttribute()%>/>
+}*/
+ }
+
+
+}
Added: trunk/chorem-webmotion/src/main/resources/i18n/chorem-webmotion_en_GB.properties
===================================================================
Added: trunk/chorem-webmotion/src/main/resources/i18n/chorem-webmotion_fr_FR.properties
===================================================================
Added: trunk/chorem-webmotion/src/main/resources/log4j.properties
===================================================================
--- trunk/chorem-webmotion/src/main/resources/log4j.properties (rev 0)
+++ trunk/chorem-webmotion/src/main/resources/log4j.properties 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,34 @@
+###
+# #%L
+# bow
+#
+# $Id$
+# $HeadURL$
+# %%
+# Copyright (C) 2010 CodeLutin
+# %%
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# #L%
+###
+# Global logging configuration
+log4j.rootLogger=INFO, stdout
+
+# Console output...
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] (%F:%L) %M - %m%n
+
+# package level
+log4j.logger.org.chorem=DEBUG
+log4j.logger.org.nuiton=INFO
Added: trunk/chorem-webmotion/src/main/resources/mapping
===================================================================
--- trunk/chorem-webmotion/src/main/resources/mapping (rev 0)
+++ trunk/chorem-webmotion/src/main/resources/mapping 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,27 @@
+[config]
+package.views=WEB-INF/jsp
+package.filters=org.chorem.webmotion.filters
+package.actions=org.chorem.webmotion.actions
+
+[filters]
+* /* ChoremClientFilter.inject
+#GET /wikitty/{extension}/view/{id} DecoratorFilter.decorate slotEntityFooter={extension}Footer.jsp
+* /wikitty-json/* DecoratorFilter.decorate wmDecoratorNo=true
+GET /* DecoratorFilter.decorate
+
+[actions]
+* / view:index.jsp
+* /wikitty/{extension}/search action:GenericAction.search
+* /wikitty/{extension}/view/{id} action:GenericAction.view
+* /wikitty/{extension}/edit/{id} action:GenericAction.edit
+* /wikitty/{extension}/delete/{id} action:GenericAction.delete
+* /wikitty/search action:GenericAction.search
+* /wikitty/view/{id} action:GenericAction.view
+* /wikitty/edit/{id} action:GenericAction.edit
+* /wikitty/delete/{id} action:GenericAction.delete
+* /wikitty/save action:GenericAction.save
+* /wikitty-json/searchField?q={query} action:GenericAction.searchFieldJson
+* /wikitty-json/search?q={query} action:GenericAction.searchJson
+* /wikitty-json/search?term={query} action:GenericAction.searchJson
+* /wikitty-json/get/{id} action:GenericAction.getById
+* /contact view:contact.jsp
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/contact.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/contact.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/contact.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,4 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+
+<h1>Contact</h1>
+toto: '${param.toto}'
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,143 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<!DOCTYPE html>
+
+<html>
+ <head>
+ <title>Chorem</title>
+ <meta charset="utf-8" />
+ <%-- JQuery --%>
+ <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
+ <script type="text/javascript" src="http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/jquery.ui.datepicker-fr.js"></script>
+ <%-- Bootstrap --%>
+ <link rel="stylesheet/less" href="/css/bootstrap.min.css">
+ <link rel="stylesheet/less" href="/css/bootstrap-responsive.min.css">
+ <script src="/js/bootstrap.min.js"></script>
+ <%-- multi selection ajax --%>
+ <script type="text/javascript" src="/js/jquery.tokeninput.js"></script>
+ <link rel="stylesheet" type="text/css" href="/css/token-input.css" />
+ <link rel="stylesheet" type="text/css" href="/css/token-input-mac.css" />
+ <link rel="stylesheet" type="text/css" href="/css/token-input-facebook.css" />
+ <%-- Specific chorem --%>
+ <link rel="stylesheet/less" href="/css/chorem.less">
+ <script src="/js/less-1.2.1.min.js"></script>
+ <script src="/js/chorem.js"></script>
+ </head>
+ <body>
+ <div class="navbar navbar-fixed-top">
+ <div class="navbar-inner">
+ <div class="container">
+ <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </a>
+
+ <a class="brand" href="/">Chorem</a>
+
+ <!-- Everything you want hidden at 940px or less, place within here -->
+ <div class="nav-collapse">
+
+ <ul class="nav">
+ <li class="dropdown nav-group">
+ <a href="<c:url value="/wikitty/search?extension=Company&extension=Person&extension=Contact"/>">Contact</a>
+ <a href="#"
+ class="dropdown-toggle"
+ data-toggle="dropdown">
+ <b class="caret"></b>
+ </a>
+ <ul class="dropdown-menu">
+ <li><a href="<c:url value="/wikitty/Company/search"/>"><i class="icon-th-list icon-black"></i> All company</a></li>
+ <li><a href="<c:url value="/wikitty/Company/edit/new"/>"><i class="icon-plus icon-black"></i> Add company</a></li>
+ <li class="divider"></li>
+ <li><a href="<c:url value="/wikitty/Employee/search"/>"><i class="icon-th-list icon-black"></i> All employee</a></li>
+ <li><a href="<c:url value="/wikitty/Employee/edit/new"/>"><i class="icon-plus icon-black"></i> Add employee</a></li>
+ <li class="divider"></li>
+ <li><a href="<c:url value="/wikitty/Person/search"/>"><i class="icon-th-list icon-black"></i> All person</a></li>
+ <li><a href="<c:url value="/wikitty/Person/edit/new"/>"><i class="icon-plus icon-black"></i> Add person</a></li>
+ <li class="divider"></li>
+ <li><a href="<c:url value="/wikitty/Touch/search"/>"><i class="icon-th-list icon-black"></i> All touch</a></li>
+ <li><a href="<c:url value="/wikitty/Touch/edit/new"/>"><i class="icon-plus icon-black"></i> Add touch</a></li>
+ </ul>
+ </li>
+ <li class="dropdown nav-group">
+ <a href="/project">Project</a>
+ <a href="#"
+ class="dropdown-toggle"
+ data-toggle="dropdown">
+ <b class="caret"></b>
+ </a>
+ <ul class="dropdown-menu">
+ <li><a href="/project/company">Propale</a></li>
+ <li><a href="/project/current">Current project</a></li>
+ <li><a href="/wikitty/search?query=extension=Task">Task</a></li>
+ </ul>
+ </li>
+ <li class="dropdown nav-group">
+ <a href="/financial">Financial</a>
+ <a href="#"
+ class="dropdown-toggle"
+ data-toggle="dropdown">
+ <b class="caret"></b>
+ </a>
+ <ul class="dropdown-menu">
+ <li><a href="/financial/projected">Projected</a></li>
+ <li><a href="/wikitty/search?query=extension=Invoice">Invoice</a></li>
+ <li><a href="/wikitty/search?query=extension=Accounting">Accounting</a></li>
+ </ul>
+ </li>
+ <li class="dropdown nav-group">
+ <a href="/hr">HR</a>
+ <a href="#"
+ class="dropdown-toggle"
+ data-toggle="dropdown">
+ <b class="caret"></b>
+ </a>
+ <ul class="dropdown-menu">
+ <li><a href="/wikitty/search?query=extension=Employee">Employee</a></li>
+ <li><a href="/wikitty/search?query=extension=Interview">Annual interview</a></li>
+ </ul>
+ </li>
+ </ul>
+
+ <form class="navbar-search pull-left" action="<c:url value="/wikitty/search"/>">
+ <input type="text" class="search-query" placeholder="Search" name="query" value="${param.query}"/>
+ </form>
+ </div>
+
+
+ </div>
+ </div>
+ </div>
+
+ <div class="container">
+ <c:if test="${not empty slotMenu}" >
+ <jsp:include page="${slotMenu}"></jsp:include>
+ </c:if>
+ </div>
+
+ <c:if test="${not empty flashMessages.errors.message}">
+ <div class="alert alert-error">
+ ... ${flashMessages.errors.message}
+ </div>
+ </c:if>
+
+ <c:if test="${not empty flashMessages.infos.message}">
+ <div class="alert alert-info">
+ ... ${flashMessages.infos.message}
+ </div>
+ </c:if>
+
+ <div class="container">
+ <div class="well">
+ <c:if test="${not empty slotContent}" >
+ <jsp:include page="${slotContent}"></jsp:include>
+ </c:if>
+ </div>
+ </div>
+ </body>
+</html>
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/edit.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/edit.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/edit.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,22 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="/WEB-INF/wikitty.tld" prefix="w"%>
+
+<c:if test="${not empty wikitty}">
+ <form class="form-inline" method="post" action="/wikitty/save">
+ <input type="hidden" name="id" value="${wikitty.id}"/>
+ <p>
+ <button class="btn btn-success" type="submit"><i class="icon-ok icon-white"></i> Save</button>
+ <a class="btn btn-info" href="/wikitty/view/${wikitty.id}"><i class="icon-remove icon-white"></i> Cancel</a>
+ </p>
+
+ <c:forEach var="ext" items="${extensions}">
+ <input type="hidden" name="extension" value="${ext.name}">
+ <dl><dt>${ext.name}</dt>
+ <c:forEach var="fieldName" items="${ext.fieldNames}">
+ <dd>${fieldName}: <w:input wikitty="${wikitty}" fqfield="${ext.name}.${fieldName}"/><%--@ include file="wikittyFieldEdit.jsp"--%></dd>
+ </c:forEach>
+ </dl>
+ </c:forEach>
+ </form>
+</c:if>
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/footerPerson.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/footerPerson.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/footerPerson.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,4 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<jsp:include page="/wikitty/search?query=${wikitty.id} id!=${wikitty.id}"/>
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/index.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/index.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/index.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,5 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+
+<h1>Chorem</h1>
+
+Bienvenue sur Chorem, l'outil de gestion d'entreprise.
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/search.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/search.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/search.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,25 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<c:forEach var="key" items="${result.keySet()}">
+ <dl>
+ <dt>
+ <ul class="nav nav-pills">
+ <li>
+ <a href="<c:url value="/wikitty/${key}/search"/>">${key}</a>
+ </li>
+ <li>
+ <a class="btn btn-success btn-mini" href="<c:url value="/wikitty/${key}/edit/new"/>"><i class="icon-plus icon-white"></i> Add</a>
+ </li>
+ <li>
+ <form class="form-search form-inline" action="<c:url value="/wikitty/${key}/search"/>">
+ <input type="text" class="search-query" placeholder="Search" name="query"/>
+ </form>
+ </li>
+ </ul>
+ </dt>
+ <c:forEach var="w" items="${result.get(key)}">
+ <dd><a href="<c:url value="/wikitty/${key}/view/${w.id}"/>"><c:out value="${w.toString(key)}"/></a></dd>
+ </c:forEach>
+ </dl>
+</c:forEach>
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/view.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/view.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/view.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,29 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<p>
+ <c:if test="${not empty wikitty}">
+ <a class="btn btn-success" href="<c:url value="/wikitty/view/${wikitty.id}"/>"><i class="icon-list icon-white"></i> View all extension</a>
+ <a class="btn btn-success" href="<c:url value="/wikitty/edit/${wikitty.id}"/>"><i class="icon-pencil icon-white"></i> Edit object</a>
+ <a class="btn btn-danger" href="<c:url value="/wikitty/delete/${wikitty.id}?wmDecoratorNo=true"/>"><i class="icon-trash icon-white"></i> Delete object</a>
+ </c:if>
+</p>
+
+<c:forEach var="ext" items="${extensions}">
+ <dl><dt><a href="<c:url value="/wikitty/search?query=extension=${ext.name}"/>">${ext.name}</a>
+ <a class="btn btn-success btn-mini" href="<c:url value="/wikitty/edit/${wikitty.id}?extension=${ext.name}"/>"><i class="icon-pencil icon-white"></i> Edit</a>
+ <a class="btn btn-danger btn-mini" href="<c:url value="/wikitty/delete/${wikitty.id}?extension=${ext.name}&wmDecoratorNo=true"/>"><i class="icon-trash icon-white"></i> Delete</a></dt>
+ <c:forEach var="fieldName" items="${ext.fieldNames}">
+ <dd><%@ include file="wikittyFieldView.jsp"%></dd>
+ </c:forEach>
+ </dl>
+</c:forEach>
+
+<div class="container">
+ <jsp:include page="/wikitty/search?query=${wikitty.id} AND id!=${wikitty.id}"/>
+<%--
+ <c:forEach var="ext" items="${extensions}">
+ <jsp:include page="footer${ext.name}.jsp"/>
+ </c:forEach>
+--%>
+</div>
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/wikittyFieldView.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/wikittyFieldView.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/wikittyFieldView.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,42 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<c:choose>
+ <c:when test="${ext.getFieldType(fieldName).type == 'BOOLEAN'}">
+ ${fieldName}: ${wikitty.getFieldAsBoolean(ext.name, fieldName)}
+ </c:when>
+ <c:when test="${ext.getFieldType(fieldName).type == 'DATE'}">
+ <c:choose>
+ <c:when test="${ext.getFieldType(fieldName).hasPattern()}">
+ ${fieldName}: <fmt:formatDate value="${wikitty.getFieldAsDate(ext.name, fieldName)}"
+ pattern="${ext.getFieldType(fieldName).getPattern()}"/>
+ </c:when>
+ <c:otherwise>
+ ${fieldName}: <fmt:formatDate value="${wikitty.getFieldAsDate(ext.name, fieldName)}"/>
+ </c:otherwise>
+ </c:choose>
+ </c:when>
+ <c:when test="${ext.getFieldType(fieldName).type == 'NUMERIC'}">
+ <c:choose>
+ <c:when test="${ext.getFieldType(fieldName).hasPattern()}">
+ ${fieldName}: <fmt:formatNumber value="${wikitty.getFieldAsBigDecimal(ext.name, fieldName)}"
+ pattern="${ext.getFieldType(fieldName).getPattern()}"/>
+ </c:when>
+ <c:otherwise>
+ ${fieldName}: ${wikitty.getFieldAsBigDecimal(ext.name, fieldName)}
+ </c:otherwise>
+ </c:choose>
+ </c:when>
+ <c:when test="${ext.getFieldType(fieldName).type == 'STRING'}">
+ ${fieldName}: <c:out value="${wikitty.getFieldAsString(ext.name, fieldName)}"/>
+ </c:when>
+ <c:when test="${ext.getFieldType(fieldName).type == 'WIKITTY'}">
+ <c:if test="${wikitty.getFieldAsWikitty(ext.name, fieldName, false) != null}">
+ ${fieldName}: <a href="<c:url value="/wikitty/view/${wikitty.getFieldAsWikitty(ext.name, fieldName, false).getId()}"/>"><c:out value="${wikitty.getFieldAsWikitty(ext.name, fieldName, false)}"/></a>
+ </c:if>
+ </c:when>
+ <c:otherwise>
+ ${fieldName}: ${wikitty.getFieldAsObject(ext.name, fieldName)} (${ext.getFieldType(fieldName).toDefinition("")})
+ </c:otherwise>
+</c:choose>
\ No newline at end of file
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/web.xml
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/web.xml (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/web.xml 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,5 @@
+<web-app version="3.0"
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+ http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" />
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/wikitty.tld
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-webmotion/src/main/webapp/WEB-INF/wikitty.tld
___________________________________________________________________
Added: svn:mime-type
+ application/xml
Added: trunk/chorem-webmotion/src/main/webapp/css/bootstrap-responsive.min.css
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/bootstrap-responsive.min.css (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/css/bootstrap-responsive.min.css 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,4 @@
+.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}
+.clearfix:after{clear:both;}
+.hidden{display:none;visibility:hidden;}
+@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:767px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid>.span1{width:5.801104972%;} .row-fluid>.span2{width:14.364640883%;} .row-fluid>.span3{width:22.928176794%;} .row-fluid>.span4{width:31.491712705%;} .row-fluid>.span5{width:40.055248616%;} .row-fluid>.span6{width:48.618784527%;} .row-fluid>.span7{width:57.182320438000005%;} .row-fluid>.span8{width:65.74585634900001%;} .row-fluid>.span9{width:74.30939226%;} .row-fluid>.span10{width:82.87292817100001%;} .row-fluid>.span11{width:91.436464082%;} .row-fluid>.span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav .nav-header{color:#999999;text-shadow:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid>.span1{width:5.982905983%;} .row-fluid>.span2{width:14.529914530000001%;} .row-fluid>.span3{width:23.076923077%;} .row-fluid>.span4{width:31.623931624%;} .row-fluid>.span5{width:40.170940171000005%;} .row-fluid>.span6{width:48.717948718%;} .row-fluid>.span7{width:57.264957265%;} .row-fluid>.span8{width:65.81196581200001%;} .row-fluid>.span9{width:74.358974359%;} .row-fluid>.span10{width:82.905982906%;} .row-fluid>.span11{width:91.45299145300001%;} .row-fluid>.span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}}
Added: trunk/chorem-webmotion/src/main/webapp/css/bootstrap.min.css
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/bootstrap.min.css (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/css/bootstrap.min.css 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,632 @@
+article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
+audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
+audio:not([controls]){display:none;}
+html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
+a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+a:hover,a:active{outline:0;}
+sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
+sup{top:-0.5em;}
+sub{bottom:-0.25em;}
+img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;}
+button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
+button,input{*overflow:visible;line-height:normal;}
+button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
+button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
+input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}
+input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
+textarea{overflow:auto;vertical-align:top;}
+.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}
+.clearfix:after{clear:both;}
+body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;}
+a{color:#0088cc;text-decoration:none;}
+a:hover{color:#005580;text-decoration:underline;}
+.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";}
+.row:after{clear:both;}
+[class*="span"]{float:left;margin-left:20px;}
+.span1{width:60px;}
+.span2{width:140px;}
+.span3{width:220px;}
+.span4{width:300px;}
+.span5{width:380px;}
+.span6{width:460px;}
+.span7{width:540px;}
+.span8{width:620px;}
+.span9{width:700px;}
+.span10{width:780px;}
+.span11{width:860px;}
+.span12,.container{width:940px;}
+.offset1{margin-left:100px;}
+.offset2{margin-left:180px;}
+.offset3{margin-left:260px;}
+.offset4{margin-left:340px;}
+.offset5{margin-left:420px;}
+.offset6{margin-left:500px;}
+.offset7{margin-left:580px;}
+.offset8{margin-left:660px;}
+.offset9{margin-left:740px;}
+.offset10{margin-left:820px;}
+.offset11{margin-left:900px;}
+.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";}
+.row-fluid:after{clear:both;}
+.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;}
+.row-fluid>[class*="span"]:first-child{margin-left:0;}
+.row-fluid>.span1{width:6.382978723%;}
+.row-fluid>.span2{width:14.89361702%;}
+.row-fluid>.span3{width:23.404255317%;}
+.row-fluid>.span4{width:31.914893614%;}
+.row-fluid>.span5{width:40.425531911%;}
+.row-fluid>.span6{width:48.93617020799999%;}
+.row-fluid>.span7{width:57.446808505%;}
+.row-fluid>.span8{width:65.95744680199999%;}
+.row-fluid>.span9{width:74.468085099%;}
+.row-fluid>.span10{width:82.97872339599999%;}
+.row-fluid>.span11{width:91.489361693%;}
+.row-fluid>.span12{width:99.99999998999999%;}
+.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";}
+.container:after{clear:both;}
+.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";}
+.container-fluid:after{clear:both;}
+p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;}
+.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;}
+h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}
+h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;}
+h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;}
+h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;}
+h4,h5,h6{line-height:18px;}
+h4{font-size:14px;}h4 small{font-size:12px;}
+h5{font-size:12px;}
+h6{font-size:11px;color:#999999;text-transform:uppercase;}
+.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;}
+.page-header h1{line-height:1;}
+ul,ol{padding:0;margin:0 0 9px 25px;}
+ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
+ul{list-style:disc;}
+ol{list-style:decimal;}
+li{line-height:18px;}
+ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
+dl{margin-bottom:18px;}
+dt,dd{line-height:18px;}
+dt{font-weight:bold;}
+dd{margin-left:9px;}
+hr{margin:18px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
+strong{font-weight:bold;}
+em{font-style:italic;}
+.muted{color:#999999;}
+abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;}
+blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;}
+blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
+blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
+q:before,q:after,blockquote:before,blockquote:after{content:"";}
+address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;}
+small{font-size:100%;}
+cite{font-style:normal;}
+code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;}
+pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;}pre.prettyprint{margin-bottom:18px;}
+pre code{padding:0;color:inherit;background-color:transparent;border:0;}
+.pre-scrollable{max-height:340px;overflow-y:scroll;}
+form{margin:0 0 18px;}
+fieldset{padding:0;margin:0;border:0;}
+legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}legend small{font-size:13.5px;color:#999999;}
+label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;}
+input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
+label{display:block;margin-bottom:5px;color:#333333;}
+input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.uneditable-textarea{width:auto;height:auto;}
+label input,label textarea,label select{display:block;}
+input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0 \9;}
+input[type="image"]{border:0;}
+input[type="file"]{width:auto;padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;}
+select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;}
+input[type="file"]{line-height:18px \9;}
+select{width:220px;background-color:#ffffff;}
+select[multiple],select[size]{height:auto;}
+input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+textarea{height:auto;}
+input[type="hidden"]{display:none;}
+.radio,.checkbox{padding-left:18px;}
+.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
+.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
+.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
+.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
+input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;}
+input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;}
+input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+.input-mini{width:60px;}
+.input-small{width:90px;}
+.input-medium{width:150px;}
+.input-large{width:210px;}
+.input-xlarge{width:270px;}
+.input-xxlarge{width:530px;}
+input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;}
+input.span1,textarea.span1,.uneditable-input.span1{width:50px;}
+input.span2,textarea.span2,.uneditable-input.span2{width:130px;}
+input.span3,textarea.span3,.uneditable-input.span3{width:210px;}
+input.span4,textarea.span4,.uneditable-input.span4{width:290px;}
+input.span5,textarea.span5,.uneditable-input.span5{width:370px;}
+input.span6,textarea.span6,.uneditable-input.span6{width:450px;}
+input.span7,textarea.span7,.uneditable-input.span7{width:530px;}
+input.span8,textarea.span8,.uneditable-input.span8{width:610px;}
+input.span9,textarea.span9,.uneditable-input.span9{width:690px;}
+input.span10,textarea.span10,.uneditable-input.span10{width:770px;}
+input.span11,textarea.span11,.uneditable-input.span11{width:850px;}
+input.span12,textarea.span12,.uneditable-input.span12{width:930px;}
+input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;}
+.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
+.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;}
+.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
+.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
+.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;}
+.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
+.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
+.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;}
+.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
+input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
+.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;}
+.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
+:-moz-placeholder{color:#999999;}
+::-webkit-input-placeholder{color:#999999;}
+.help-block{display:block;margin-top:5px;margin-bottom:0;color:#999999;}
+.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;}
+.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";}
+.input-prepend:after,.input-append:after{clear:both;}
+.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;}
+.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;}
+.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;}
+.input-prepend .add-on{*margin-top:1px;}
+.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-append .uneditable-input{border-left-color:#eee;border-right-color:#ccc;}
+.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;}
+.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;}
+.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;}
+.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
+.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;}
+.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;}
+.form-search .radio,.form-inline .radio,.form-search .checkbox,.form-inline .checkbox{margin-bottom:0;vertical-align:middle;}
+.control-group{margin-bottom:9px;}
+legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;}
+.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";}
+.form-horizontal .control-group:after{clear:both;}
+.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;}
+.form-horizontal .controls{margin-left:160px;}
+.form-horizontal .form-actions{padding-left:160px;}
+table{max-width:100%;border-collapse:collapse;border-spacing:0;}
+.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #ddd;}
+.table th{font-weight:bold;}
+.table thead th{vertical-align:bottom;}
+.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;}
+.table tbody+tbody{border-top:2px solid #ddd;}
+.table-condensed th,.table-condensed td{padding:4px 5px;}
+.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;}
+.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
+.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;}
+.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;}
+.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;}
+.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;}
+.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
+.table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;}
+table .span1{float:none;width:44px;margin-left:0;}
+table .span2{float:none;width:124px;margin-left:0;}
+table .span3{float:none;width:204px;margin-left:0;}
+table .span4{float:none;width:284px;margin-left:0;}
+table .span5{float:none;width:364px;margin-left:0;}
+table .span6{float:none;width:444px;margin-left:0;}
+table .span7{float:none;width:524px;margin-left:0;}
+table .span8{float:none;width:604px;margin-left:0;}
+table .span9{float:none;width:684px;margin-left:0;}
+table .span10{float:none;width:764px;margin-left:0;}
+table .span11{float:none;width:844px;margin-left:0;}
+table .span12{float:none;width:924px;margin-left:0;}
+[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0;}
+.icon-white{background-image:url("../img/glyphicons-halflings-white.png");}
+.icon-glass{background-position:0 0;}
+.icon-music{background-position:-24px 0;}
+.icon-search{background-position:-48px 0;}
+.icon-envelope{background-position:-72px 0;}
+.icon-heart{background-position:-96px 0;}
+.icon-star{background-position:-120px 0;}
+.icon-star-empty{background-position:-144px 0;}
+.icon-user{background-position:-168px 0;}
+.icon-film{background-position:-192px 0;}
+.icon-th-large{background-position:-216px 0;}
+.icon-th{background-position:-240px 0;}
+.icon-th-list{background-position:-264px 0;}
+.icon-ok{background-position:-288px 0;}
+.icon-remove{background-position:-312px 0;}
+.icon-zoom-in{background-position:-336px 0;}
+.icon-zoom-out{background-position:-360px 0;}
+.icon-off{background-position:-384px 0;}
+.icon-signal{background-position:-408px 0;}
+.icon-cog{background-position:-432px 0;}
+.icon-trash{background-position:-456px 0;}
+.icon-home{background-position:0 -24px;}
+.icon-file{background-position:-24px -24px;}
+.icon-time{background-position:-48px -24px;}
+.icon-road{background-position:-72px -24px;}
+.icon-download-alt{background-position:-96px -24px;}
+.icon-download{background-position:-120px -24px;}
+.icon-upload{background-position:-144px -24px;}
+.icon-inbox{background-position:-168px -24px;}
+.icon-play-circle{background-position:-192px -24px;}
+.icon-repeat{background-position:-216px -24px;}
+.icon-refresh{background-position:-240px -24px;}
+.icon-list-alt{background-position:-264px -24px;}
+.icon-lock{background-position:-287px -24px;}
+.icon-flag{background-position:-312px -24px;}
+.icon-headphones{background-position:-336px -24px;}
+.icon-volume-off{background-position:-360px -24px;}
+.icon-volume-down{background-position:-384px -24px;}
+.icon-volume-up{background-position:-408px -24px;}
+.icon-qrcode{background-position:-432px -24px;}
+.icon-barcode{background-position:-456px -24px;}
+.icon-tag{background-position:0 -48px;}
+.icon-tags{background-position:-25px -48px;}
+.icon-book{background-position:-48px -48px;}
+.icon-bookmark{background-position:-72px -48px;}
+.icon-print{background-position:-96px -48px;}
+.icon-camera{background-position:-120px -48px;}
+.icon-font{background-position:-144px -48px;}
+.icon-bold{background-position:-167px -48px;}
+.icon-italic{background-position:-192px -48px;}
+.icon-text-height{background-position:-216px -48px;}
+.icon-text-width{background-position:-240px -48px;}
+.icon-align-left{background-position:-264px -48px;}
+.icon-align-center{background-position:-288px -48px;}
+.icon-align-right{background-position:-312px -48px;}
+.icon-align-justify{background-position:-336px -48px;}
+.icon-list{background-position:-360px -48px;}
+.icon-indent-left{background-position:-384px -48px;}
+.icon-indent-right{background-position:-408px -48px;}
+.icon-facetime-video{background-position:-432px -48px;}
+.icon-picture{background-position:-456px -48px;}
+.icon-pencil{background-position:0 -72px;}
+.icon-map-marker{background-position:-24px -72px;}
+.icon-adjust{background-position:-48px -72px;}
+.icon-tint{background-position:-72px -72px;}
+.icon-edit{background-position:-96px -72px;}
+.icon-share{background-position:-120px -72px;}
+.icon-check{background-position:-144px -72px;}
+.icon-move{background-position:-168px -72px;}
+.icon-step-backward{background-position:-192px -72px;}
+.icon-fast-backward{background-position:-216px -72px;}
+.icon-backward{background-position:-240px -72px;}
+.icon-play{background-position:-264px -72px;}
+.icon-pause{background-position:-288px -72px;}
+.icon-stop{background-position:-312px -72px;}
+.icon-forward{background-position:-336px -72px;}
+.icon-fast-forward{background-position:-360px -72px;}
+.icon-step-forward{background-position:-384px -72px;}
+.icon-eject{background-position:-408px -72px;}
+.icon-chevron-left{background-position:-432px -72px;}
+.icon-chevron-right{background-position:-456px -72px;}
+.icon-plus-sign{background-position:0 -96px;}
+.icon-minus-sign{background-position:-24px -96px;}
+.icon-remove-sign{background-position:-48px -96px;}
+.icon-ok-sign{background-position:-72px -96px;}
+.icon-question-sign{background-position:-96px -96px;}
+.icon-info-sign{background-position:-120px -96px;}
+.icon-screenshot{background-position:-144px -96px;}
+.icon-remove-circle{background-position:-168px -96px;}
+.icon-ok-circle{background-position:-192px -96px;}
+.icon-ban-circle{background-position:-216px -96px;}
+.icon-arrow-left{background-position:-240px -96px;}
+.icon-arrow-right{background-position:-264px -96px;}
+.icon-arrow-up{background-position:-289px -96px;}
+.icon-arrow-down{background-position:-312px -96px;}
+.icon-share-alt{background-position:-336px -96px;}
+.icon-resize-full{background-position:-360px -96px;}
+.icon-resize-small{background-position:-384px -96px;}
+.icon-plus{background-position:-408px -96px;}
+.icon-minus{background-position:-433px -96px;}
+.icon-asterisk{background-position:-456px -96px;}
+.icon-exclamation-sign{background-position:0 -120px;}
+.icon-gift{background-position:-24px -120px;}
+.icon-leaf{background-position:-48px -120px;}
+.icon-fire{background-position:-72px -120px;}
+.icon-eye-open{background-position:-96px -120px;}
+.icon-eye-close{background-position:-120px -120px;}
+.icon-warning-sign{background-position:-144px -120px;}
+.icon-plane{background-position:-168px -120px;}
+.icon-calendar{background-position:-192px -120px;}
+.icon-random{background-position:-216px -120px;}
+.icon-comment{background-position:-240px -120px;}
+.icon-magnet{background-position:-264px -120px;}
+.icon-chevron-up{background-position:-288px -120px;}
+.icon-chevron-down{background-position:-313px -119px;}
+.icon-retweet{background-position:-336px -120px;}
+.icon-shopping-cart{background-position:-360px -120px;}
+.icon-folder-close{background-position:-384px -120px;}
+.icon-folder-open{background-position:-408px -120px;}
+.icon-resize-vertical{background-position:-432px -119px;}
+.icon-resize-horizontal{background-position:-456px -118px;}
+.dropdown{position:relative;}
+.dropdown-toggle{*margin-bottom:-3px;}
+.dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
+.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";}
+.dropdown .caret{margin-top:8px;margin-left:2px;}
+.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);}
+.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;}
+.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;}
+.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;}
+.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;}
+.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);}
+.dropdown.open .dropdown-menu{display:block;}
+.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
+.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;}
+.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;}
+.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;}
+.btn{display:inline-block;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-ms-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(top, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);*margin-left:.3em;}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;}
+.btn:active,.btn.active{background-color:#cccccc \9;}
+.btn:first-child{*margin-left:0;}
+.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
+.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;outline:0;}
+.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.btn-large [class^="icon-"]{margin-top:1px;}
+.btn-small{padding:5px 9px;font-size:11px;line-height:16px;}
+.btn-small [class^="icon-"]{margin-top:-1px;}
+.btn-mini{padding:2px 6px;font-size:11px;line-height:14px;}
+.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;}
+.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-dark.active{color:rgba(255, 255, 255, 0.75);}
+.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;}
+.btn-primary:active,.btn-primary.active{background-color:#003399 \9;}
+.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;}
+.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
+.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;}
+.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
+.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;}
+.btn-success:active,.btn-success.active{background-color:#408140 \9;}
+.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;}
+.btn-info:active,.btn-info.active{background-color:#24748c \9;}
+.btn-inverse{background-color:#393939;background-image:-moz-linear-gradient(top, #454545, #262626);background-image:-ms-linear-gradient(top, #454545, #262626);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#454545), to(#262626));background-image:-webkit-linear-gradient(top, #454545, #262626);background-image:-o-linear-gradient(top, #454545, #262626);background-image:linear-gradient(top, #454545, #262626);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#454545', endColorstr='#262626', GradientType=0);border-color:#262626 #262626 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#262626;}
+.btn-inverse:active,.btn-inverse.active{background-color:#0c0c0c \9;}
+button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
+button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;}
+button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;}
+.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";}
+.btn-group:after{clear:both;}
+.btn-group:first-child{*margin-left:0;}
+.btn-group+.btn-group{margin-left:5px;}
+.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;}
+.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
+.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
+.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
+.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
+.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;}
+.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
+.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;}
+.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);}
+.btn .caret{margin-top:7px;margin-left:0;}
+.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);}
+.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);}
+.btn-small .caret{margin-top:4px;}
+.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.alert,.alert-heading{color:#c09853;}
+.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;}
+.alert-success{background-color:#dff0d8;border-color:#d6e9c6;}
+.alert-success,.alert-success .alert-heading{color:#468847;}
+.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;}
+.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;}
+.alert-info{background-color:#d9edf7;border-color:#bce8f1;}
+.alert-info,.alert-info .alert-heading{color:#3a87ad;}
+.alert-block{padding-top:14px;padding-bottom:14px;}
+.alert-block>p,.alert-block>ul{margin-bottom:0;}
+.alert-block p+p{margin-top:5px;}
+.nav{margin-left:0;margin-bottom:18px;list-style:none;}
+.nav>li>a{display:block;}
+.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;}
+.nav .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;}
+.nav li+.nav-header{margin-top:9px;}
+.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;}
+.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
+.nav-list>li>a{padding:3px 15px;}
+.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;}
+.nav-list [class^="icon-"]{margin-right:2px;}
+.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";}
+.nav-tabs:after,.nav-pills:after{clear:both;}
+.nav-tabs>li,.nav-pills>li{float:left;}
+.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
+.nav-tabs{border-bottom:1px solid #ddd;}
+.nav-tabs>li{margin-bottom:-1px;}
+.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;}
+.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
+.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;}
+.nav-stacked>li{float:none;}
+.nav-stacked>li>a{margin-right:0;}
+.nav-tabs.nav-stacked{border-bottom:0;}
+.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
+.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
+.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;}
+.nav-pills.nav-stacked>li>a{margin-bottom:3px;}
+.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
+.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;}
+.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;}
+.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;}
+.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;}
+.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;}
+.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;}
+.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
+.tabs-stacked .open>a:hover{border-color:#999999;}
+.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";}
+.tabbable:after{clear:both;}
+.tab-content{overflow:hidden;}
+.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;}
+.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
+.tab-content>.active,.pill-content>.active{display:block;}
+.tabs-below .nav-tabs{border-top:1px solid #ddd;}
+.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;}
+.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;}
+.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;}
+.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;}
+.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
+.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
+.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
+.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
+.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
+.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
+.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
+.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
+.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
+.navbar{overflow:visible;margin-bottom:18px;}
+.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);}
+.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;}
+.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;}
+.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
+.btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
+.nav-collapse.collapse{height:auto;}
+.navbar .brand:hover{text-decoration:none;}
+.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;}
+.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;}
+.navbar .btn,.navbar .btn-group{margin-top:5px;}
+.navbar .btn-group .btn{margin-top:0;}
+.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";}
+.navbar-form:after{clear:both;}
+.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;}
+.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
+.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
+.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}
+.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;}
+.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;}
+.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);}
+.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
+.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;}
+.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
+.navbar .nav.pull-right{float:right;}
+.navbar .nav>li{display:block;float:left;}
+.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
+.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;}
+.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;}
+.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;}
+.navbar .nav.pull-right{margin-left:10px;margin-right:0;}
+.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
+.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
+.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;}
+.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);}
+.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;}
+.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;}
+.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;}
+.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;}
+.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline-block;text-shadow:0 1px 0 #ffffff;}
+.breadcrumb .divider{padding:0 5px;color:#999999;}
+.breadcrumb .active a{color:#333333;}
+.pagination{height:36px;margin:18px 0;}
+.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
+.pagination li{display:inline;}
+.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;}
+.pagination a:hover,.pagination .active a{background-color:#f5f5f5;}
+.pagination .active a{color:#999999;cursor:default;}
+.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;}
+.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+.pagination-centered{text-align:center;}
+.pagination-right{text-align:right;}
+.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";}
+.pager:after{clear:both;}
+.pager li{display:inline;}
+.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
+.pager a:hover{text-decoration:none;background-color:#f5f5f5;}
+.pager .next a{float:right;}
+.pager .previous a{float:left;}
+.modal-open .dropdown-menu{z-index:2050;}
+.modal-open .dropdown.open{*z-index:2050;}
+.modal-open .popover{z-index:2060;}
+.modal-open .tooltip{z-index:2070;}
+.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
+.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
+.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
+.modal.fade.in{top:50%;}
+.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
+.modal-body{padding:15px;}
+.modal-body .modal-form{margin-bottom:0;}
+.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";}
+.modal-footer:after{clear:both;}
+.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;}
+.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
+.tooltip.top{margin-top:-2px;}
+.tooltip.right{margin-left:2px;}
+.tooltip.bottom{margin-top:2px;}
+.tooltip.left{margin-left:-2px;}
+.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
+.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
+.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
+.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
+.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.tooltip-arrow{position:absolute;width:0;height:0;}
+.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;}
+.popover.right{margin-left:5px;}
+.popover.bottom{margin-top:5px;}
+.popover.left{margin-left:-5px;}
+.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
+.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
+.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
+.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
+.popover .arrow{position:absolute;width:0;height:0;}
+.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);}
+.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;}
+.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;}
+.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";}
+.thumbnails:after{clear:both;}
+.thumbnails>li{float:left;margin:0 0 18px 20px;}
+.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}
+a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
+.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
+.thumbnail .caption{padding:9px;}
+.label{padding:2px 4px 3px;font-size:11.049999999999999px;font-weight:bold;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.label:hover{color:#ffffff;text-decoration:none;}
+.label-important{background-color:#b94a48;}
+.label-important:hover{background-color:#953b39;}
+.label-warning{background-color:#f89406;}
+.label-warning:hover{background-color:#c67605;}
+.label-success{background-color:#468847;}
+.label-success:hover{background-color:#356635;}
+.label-info{background-color:#3a87ad;}
+.label-info:hover{background-color:#2d6987;}
+@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;}
+.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;}
+.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
+.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);}
+.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
+.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);}
+.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
+.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);}
+.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
+.accordion{margin-bottom:18px;}
+.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.accordion-heading{border-bottom:0;}
+.accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
+.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
+.carousel{position:relative;margin-bottom:18px;line-height:1;}
+.carousel-inner{overflow:hidden;width:100%;position:relative;}
+.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}
+.carousel .item>img{display:block;line-height:1;}
+.carousel .active,.carousel .next,.carousel .prev{display:block;}
+.carousel .active{left:0;}
+.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;}
+.carousel .next{left:100%;}
+.carousel .prev{left:-100%;}
+.carousel .next.left,.carousel .prev.right{left:0;}
+.carousel .active.left{left:-100%;}
+.carousel .active.right{left:100%;}
+.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
+.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
+.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);}
+.carousel-caption h4,.carousel-caption p{color:#ffffff;}
+.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;}
+.hero-unit p{font-size:18px;font-weight:200;line-height:27px;}
+.pull-right{float:right;}
+.pull-left{float:left;}
+.hide{display:none;}
+.show{display:block;}
+.invisible{visibility:hidden;}
Added: trunk/chorem-webmotion/src/main/webapp/css/chorem.less
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/chorem.less (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/css/chorem.less 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,19 @@
+body {
+ position: relative;
+ padding-top: 60px;
+ background-color: #fff;
+}
+
+.nav > li.nav-group{
+ padding: 10px 10px 11px;
+}
+
+.nav > li.nav-group > a {
+ display: inline;
+ padding: 0px;
+}
+
+.ui-autocomplete-category {
+ color: rgba(82, 168, 236, 0.796875);
+ font-weight: bolder;
+}
Added: trunk/chorem-webmotion/src/main/webapp/css/token-input-facebook.css
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/token-input-facebook.css (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/css/token-input-facebook.css 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,122 @@
+/* Example tokeninput style #2: Facebook style */
+ul.token-input-list-facebook {
+ overflow: hidden;
+ height: auto !important;
+ height: 1%;
+ width: 400px;
+ border: 1px solid #8496ba;
+ cursor: text;
+ font-size: 12px;
+ font-family: Verdana;
+ min-height: 1px;
+ z-index: 999;
+ margin: 0;
+ padding: 0;
+ background-color: #fff;
+ list-style-type: none;
+ clear: left;
+}
+
+ul.token-input-list-facebook li input {
+ border: 0;
+ width: 100px;
+ padding: 3px 8px;
+ background-color: white;
+ margin: 2px 0;
+ -webkit-appearance: caret;
+}
+
+li.token-input-token-facebook {
+ overflow: hidden;
+ height: auto !important;
+ height: 15px;
+ margin: 3px;
+ padding: 1px 3px;
+ background-color: #eff2f7;
+ color: #000;
+ cursor: default;
+ border: 1px solid #ccd5e4;
+ font-size: 11px;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ float: left;
+ white-space: nowrap;
+}
+
+li.token-input-token-facebook p {
+ display: inline;
+ padding: 0;
+ margin: 0;
+}
+
+li.token-input-token-facebook span {
+ color: #a6b3cf;
+ margin-left: 5px;
+ font-weight: bold;
+ cursor: pointer;
+}
+
+li.token-input-selected-token-facebook {
+ background-color: #5670a6;
+ border: 1px solid #3b5998;
+ color: #fff;
+}
+
+li.token-input-input-token-facebook {
+ float: left;
+ margin: 0;
+ padding: 0;
+ list-style-type: none;
+}
+
+div.token-input-dropdown-facebook {
+ position: absolute;
+ width: 400px;
+ background-color: #fff;
+ overflow: hidden;
+ border-left: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ cursor: default;
+ font-size: 11px;
+ font-family: Verdana;
+ z-index: 1;
+}
+
+div.token-input-dropdown-facebook p {
+ margin: 0;
+ padding: 5px;
+ font-weight: bold;
+ color: #777;
+}
+
+div.token-input-dropdown-facebook ul {
+ margin: 0;
+ padding: 0;
+}
+
+div.token-input-dropdown-facebook ul li {
+ background-color: #fff;
+ padding: 3px;
+ margin: 0;
+ list-style-type: none;
+}
+
+div.token-input-dropdown-facebook ul li.token-input-dropdown-item-facebook {
+ background-color: #fff;
+}
+
+div.token-input-dropdown-facebook ul li.token-input-dropdown-item2-facebook {
+ background-color: #fff;
+}
+
+div.token-input-dropdown-facebook ul li em {
+ font-weight: bold;
+ font-style: normal;
+}
+
+div.token-input-dropdown-facebook ul li.token-input-selected-dropdown-item-facebook {
+ background-color: #3b5998;
+ color: #fff;
+}
\ No newline at end of file
Added: trunk/chorem-webmotion/src/main/webapp/css/token-input-mac.css
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/token-input-mac.css (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/css/token-input-mac.css 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,204 @@
+/* Example tokeninput style #2: Mac Style */
+fieldset.token-input-mac {
+ position: relative;
+ padding: 0;
+ margin: 5px 0;
+ background: #fff;
+ width: 400px;
+ border: 1px solid #A4BDEC;
+ border-radius: 10px;
+ -moz-border-radius: 10px;
+ -webkit-border-radius: 10px;
+}
+
+fieldset.token-input-mac.token-input-dropdown-mac {
+ border-radius: 10px 10px 0 0;
+ -moz-border-radius: 10px 10px 0 0;
+ -webkit-border-radius: 10px 10px 0 0;
+ box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25);
+ -moz-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25);
+ -webkit-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25);
+}
+
+ul.token-input-list-mac {
+ overflow: hidden;
+ height: auto !important;
+ height: 1%;
+ cursor: text;
+ font-size: 12px;
+ font-family: Verdana;
+ min-height: 1px;
+ z-index: 999;
+ margin: 0;
+ padding: 3px;
+ background: transparent;
+}
+
+ul.token-input-list-mac.error {
+ border: 1px solid #C52020;
+}
+
+ul.token-input-list-mac li {
+ list-style-type: none;
+}
+
+li.token-input-token-mac p {
+ display: inline;
+ padding: 0;
+ margin: 0;
+}
+
+li.token-input-token-mac span {
+ color: #a6b3cf;
+ margin-left: 5px;
+ font-weight: bold;
+ cursor: pointer;
+}
+
+/* TOKENS */
+
+li.token-input-token-mac {
+ font-family: "Lucida Grande", Arial, serif;
+ font-size: 9pt;
+ line-height: 12pt;
+ overflow: hidden;
+ height: 16px;
+ margin: 3px;
+ padding: 0 10px;
+ background: none;
+ background-color: #dee7f8;
+ color: #000;
+ cursor: default;
+ border: 1px solid #a4bdec;
+ border-radius: 15px;
+ -moz-border-radius: 15px;
+ -webkit-border-radius: 15px;
+ float: left;
+}
+
+li.token-input-highlighted-token-mac {
+ background-color: #bbcef1;
+ border: 1px solid #598bec;
+ color: #000;
+}
+
+li.token-input-selected-token-mac {
+ background-color: #598bec;
+ border: 1px solid transparent;
+ color: #fff;
+}
+
+li.token-input-highlighted-token-mac span.token-input-delete-token-mac {
+ color: #000;
+}
+
+li.token-input-selected-token-mac span.token-input-delete-token-mac {
+ color: #fff;
+}
+
+li.token-input-input-token-mac {
+ border: none;
+ background: transparent;
+ float: left;
+ padding: 0;
+ margin: 0;
+}
+
+li.token-input-input-token-mac input {
+ border: 0;
+ width: 100px;
+ padding: 3px;
+ background-color: transparent;
+ margin: 0;
+}
+
+div.token-input-dropdown-mac {
+ position: absolute;
+ border: 1px solid #A4BDEC;
+ border-top: none;
+ left: -1px;
+ right: -1px;
+ background-color: #fff;
+ overflow: hidden;
+ cursor: default;
+ font-size: 10pt;
+ font-family: "Lucida Grande", Arial, serif;
+ padding: 5px;
+ border-radius: 0 0 10px 10px;
+ -moz-border-radius: 0 0 10px 10px;
+ -webkit-border-radius: 0 0 10px 10px;
+ box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25);
+ -moz-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25);
+ -webkit-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25);
+ clip:rect(0px, 1000px, 1000px, -10px);
+}
+
+div.token-input-dropdown-mac p {
+ font-size: 8pt;
+ margin: 0;
+ padding: 0 5px;
+ font-style: italic;
+ color: #aaa;
+}
+
+div.token-input-dropdown-mac h3.token-input-dropdown-category-mac {
+ font-family: "Lucida Grande", Arial, serif;
+ font-size: 10pt;
+ font-weight: bold;
+ border: none;
+ padding: 0 5px;
+ margin: 0;
+}
+
+div.token-input-dropdown-mac ul {
+ margin: 0;
+ padding: 0;
+}
+
+div.token-input-dropdown-mac ul li {
+ list-style-type: none;
+ cursor: pointer;
+ background: none;
+ background-color: #fff;
+ margin: 0;
+ padding: 0 0 0 25px;
+}
+
+div.token-input-dropdown-mac ul li.token-input-dropdown-item-mac {
+ background-color: #fff;
+}
+
+div.token-input-dropdown-mac ul li.token-input-dropdown-item-mac.odd {
+ background-color: #ECF4F9;
+ border-radius: 15px;
+ -moz-border-radius: 15px;
+ -webkit-border-radius: 15px;
+}
+
+div.token-input-dropdown-mac ul li.token-input-dropdown-item-mac span.token-input-dropdown-item-description-mac {
+ float: right;
+ font-size: 8pt;
+ font-style: italic;
+ padding: 0 10px 0 0;
+ color: #999;
+}
+
+div.token-input-dropdown-mac ul li strong {
+ font-weight: bold;
+ text-decoration: underline;
+ font-style: none;
+}
+
+div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac,
+div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac.odd {
+ background-color: #598bec;
+ color: #fff;
+ border-radius: 15px;
+ -moz-border-radius: 15px;
+ -webkit-border-radius: 15px;
+}
+
+div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac span.token-input-dropdown-item-description-mac,
+div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac.odd span.token-input-dropdown-item-description-mac {
+ color: #fff;
+}
Added: trunk/chorem-webmotion/src/main/webapp/css/token-input.css
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/token-input.css (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/css/token-input.css 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,113 @@
+/* Example tokeninput style #1: Token vertical list*/
+ul.token-input-list {
+ overflow: hidden;
+ height: auto !important;
+ height: 1%;
+ width: 400px;
+ border: 1px solid #999;
+ cursor: text;
+ font-size: 12px;
+ font-family: Verdana;
+ z-index: 999;
+ margin: 0;
+ padding: 0;
+ background-color: #fff;
+ list-style-type: none;
+ clear: left;
+}
+
+ul.token-input-list li {
+ list-style-type: none;
+}
+
+ul.token-input-list li input {
+ border: 0;
+ width: 350px;
+ padding: 3px 8px;
+ background-color: white;
+ -webkit-appearance: caret;
+}
+
+li.token-input-token {
+ overflow: hidden;
+ height: auto !important;
+ height: 1%;
+ margin: 3px;
+ padding: 3px 5px;
+ background-color: #d0efa0;
+ color: #000;
+ font-weight: bold;
+ cursor: default;
+ display: block;
+}
+
+li.token-input-token p {
+ float: left;
+ padding: 0;
+ margin: 0;
+}
+
+li.token-input-token span {
+ float: right;
+ color: #777;
+ cursor: pointer;
+}
+
+li.token-input-selected-token {
+ background-color: #08844e;
+ color: #fff;
+}
+
+li.token-input-selected-token span {
+ color: #bbb;
+}
+
+div.token-input-dropdown {
+ position: absolute;
+ width: 400px;
+ background-color: #fff;
+ overflow: hidden;
+ border-left: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ cursor: default;
+ font-size: 12px;
+ font-family: Verdana;
+ z-index: 1;
+}
+
+div.token-input-dropdown p {
+ margin: 0;
+ padding: 5px;
+ font-weight: bold;
+ color: #777;
+}
+
+div.token-input-dropdown ul {
+ margin: 0;
+ padding: 0;
+}
+
+div.token-input-dropdown ul li {
+ background-color: #fff;
+ padding: 3px;
+ list-style-type: none;
+}
+
+div.token-input-dropdown ul li.token-input-dropdown-item {
+ background-color: #fafafa;
+}
+
+div.token-input-dropdown ul li.token-input-dropdown-item2 {
+ background-color: #fff;
+}
+
+div.token-input-dropdown ul li em {
+ font-weight: bold;
+ font-style: normal;
+}
+
+div.token-input-dropdown ul li.token-input-selected-dropdown-item {
+ background-color: #d0efa0;
+}
+
Added: trunk/chorem-webmotion/src/main/webapp/img/glyphicons-halflings-white.png
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-webmotion/src/main/webapp/img/glyphicons-halflings-white.png
___________________________________________________________________
Added: svn:mime-type
+ image/png
Added: trunk/chorem-webmotion/src/main/webapp/img/glyphicons-halflings.png
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-webmotion/src/main/webapp/img/glyphicons-halflings.png
___________________________________________________________________
Added: svn:mime-type
+ image/png
Added: trunk/chorem-webmotion/src/main/webapp/js/bootstrap.min.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/bootstrap.min.js (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/js/bootstrap.min.js 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1 @@
+!function(a){a(function(){"use strict",a.support.transition=function(){var b=document.body||document.documentElement,c=b.style,d=c.transition!==undefined||c.WebkitTransition!==undefined||c.MozTransition!==undefined||c.MsTransition!==undefined||c.OTransition!==undefined;return d&&{end:function(){var b="TransitionEnd";return a.browser.webkit?b="webkitTransitionEnd":a.browser.mozilla?b="transitionend":a.browser.opera&&(b="oTransitionEnd"),b}()}}()})}(window.jQuery),!function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype={constructor:c,close:function(b){function f(){e.trigger("closed").remove()}var c=a(this),d=c.attr("data-target"),e;d||(d=c.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),e=a(d),e.trigger("close"),b&&b.preventDefault(),e.length||(e=c.hasClass("alert")?c:c.parent()),e.trigger("close").removeClass("in"),a.support.transition&&e.hasClass("fade")?e.on(a.support.transition.end,f):f()}},a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.alert.Constructor=c,a(function(){a("body").on("click.alert.data-api",b,c.prototype.close)})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype={constructor:b,setState:function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},toggle:function(){var a=this.$element.parent('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")}},a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a(function(){a("body").on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.carousel.defaults,c),this.options.slide&&this.slide(this.options.slide)};b.prototype={cycle:function(){return this.interval=setInterval(a.proxy(this.next,this),this.options.interval),this},to:function(b){var c=this.$element.find(".active"),d=c.parent().children(),e=d.index(c),f=this;if(b>d.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(){return clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this;if(!e.length)return;return this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h](),!a.support.transition&&this.$element.hasClass("slide")?(this.$element.trigger("slide"),d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")):(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.trigger("slide"),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})),f&&this.cycle(),this}},a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=typeof c=="object"&&c;e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):typeof c=="string"||(c=f.slide)?e[c]():e.cycle()})},a.fn.carousel.defaults={interval:5e3},a.fn.carousel.Constructor=b,a(function(){a("body").on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=!e.data("modal")&&a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find(".in"),e;d&&d.length&&(e=d.data("collapse"),d.collapse("hide"),e||d.data("collapse",null)),this.$element[b](0),this.transition("addClass","show","shown"),this.$element[b](this.$element[0][c])},hide:function(){var a=this.dimension();this.reset(this.$element[a]()),this.transition("removeClass","hide","hidden"),this.$element[a](0)},reset:function(a){var b=this.dimension();this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element.addClass("collapse")},transition:function(b,c,d){var e=this,f=function(){c=="show"&&e.reset(),e.$element.trigger(d)};this.$element.trigger(c)[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a(function(){a("body").on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();a(e).collapse(f)})})}(window.jQuery),!function(a){function d(){a(b).parent().removeClass("open")}"use strict";var b='[data-toggle="dropdown"]',c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),e=c.attr("data-target"),f,g;return e||(e=c.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,"")),f=a(e),f.length||(f=c.parent()),g=f.hasClass("open"),d(),!g&&f.toggleClass("open"),!1}},a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a(function(){a("html").on("click.dropdown.data-api",d),a("body").on("click.dropdown.data-api",b,c.prototype.toggle)})}(window.jQuery),!function(a){function c(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),d.call(b)},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),d.call(b)})}function d(a){this.$element.hide().trigger("hidden"),e.call(this)}function e(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(a.proxy(this.hide,this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),e?this.$backdrop.one(a.support.transition.end,b):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,a.proxy(f,this)):f.call(this)):b&&b()}function f(){this.$backdrop.remove(),this.$backdrop=null}function g(){var b=this;this.isShown&&this.options.keyboard?a(document).on("keyup.dismiss.modal",function(a){a.which==27&&b.hide()}):this.isShown||a(document).off("keyup.dismiss.modal")}"use strict";var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hide,this))};b.prototype={constructor:b,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var b=this;if(this.isShown)return;a("body").addClass("modal-open"),this.isShown=!0,this.$element.trigger("show"),g.call(this),e.call(this,function(){var c=a.support.transition&&b.$element.hasClass("fade");!b.$element.parent().length&&b.$element.appendTo(document.body),b.$element.show(),c&&b.$element[0].offsetWidth,b.$element.addClass("in"),c?b.$element.one(a.support.transition.end,function(){b.$element.trigger("shown")}):b.$element.trigger("shown")})},hide:function(b){b&&b.preventDefault();if(!this.isShown)return;var e=this;this.isShown=!1,a("body").removeClass("modal-open"),g.call(this),this.$element.trigger("hide").removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?c.call(this):d.call(this)}},a.fn.modal=function(c){return this.each(function(){var d=a(this),e=d.data("modal"),f=a.extend({},a.fn.modal.defaults,d.data(),typeof c=="object"&&c);e||d.data("modal",e=new b(this,f)),typeof c=="string"?e[c]():f.show&&e.show()})},a.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},a.fn.modal.Constructor=b,a(function(){a("body").on("click.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({},e.data(),c.data());b.preventDefault(),e.modal(f)})})}(window.jQuery),!function(a){"use strict";var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);!c.options.delay||!c.options.delay.show?c.show():(c.hoverState="in",setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show))},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);!c.options.delay||!c.options.delay.hide?c.hide():(c.hoverState="out",setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide))},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.remove().css({top:0,left:0,display:"block"}).appendTo(b?this.$element:document.body),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.css(g).addClass(f).addClass("in")}},setContent:function(){var a=this.tip();a.find(".tooltip-inner").html(this.getTitle()),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).remove()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.remove()})}var b=this,c=this.tip();c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.remove()},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a=a.toString().replace(/(^\s*|\s*$)/,""),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()}},a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,delay:0,selector:!1,placement:"top",trigger:"hover",title:"",template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'}}(window.jQuery),!function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var b=this.tip(),c=this.getTitle(),d=this.getContent();b.find(".popover-title")[a.type(c)=="object"?"append":"html"](c),b.find(".popover-content > *")[a.type(d)=="object"?"append":"html"](d),b.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a=a.toString().replace(/(^\s*|\s*$)/,""),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip}}),a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(a){function b(b,c){var d=a.proxy(this.process,this),e=a(b).is("body")?a(window):a(b),f;this.options=a.extend({},a.fn.scrollspy.defaults,c),this.$scrollElement=e.on("scroll.scroll.data-api",d),this.selector=(this.options.target||(f=a(b).attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=a("body").on("click.scroll.data-api",this.selector,d),this.refresh(),this.process()}"use strict",b.prototype={constructor:b,refresh:function(){this.targets=this.$body.find(this.selector).map(function(){var b=a(this).attr("href");return/^#\w/.test(b)&&a(b).length?b:null}),this.offsets=a.map(this.targets,function(b){return a(b).position().top})},process:function(){var a=this.$scrollElement.scrollTop()+this.options.offset,b=this.offsets,c=this.targets,d=this.activeTarget,e;for(e=b.length;e--;)d!=c[e]&&a>=b[e]&&(!b[e+1]||a<=b[e+1])&&this.activate(c[e])},activate:function(a){var b;this.activeTarget=a,this.$body.find(this.selector).parent(".active").removeClass("active"),b=this.$body.find(this.selector+'[href="'+a+'"]').parent("li").addClass("active"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active")}},a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("scrollspy"),f=typeof c=="object"&&c;e||d.data("scrollspy",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.defaults={offset:10},a(function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),!function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype={constructor:b,show:function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target"),e,f;d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,""));if(b.parent("li").hasClass("active"))return;e=c.find(".active a").last()[0],b.trigger({type:"show",relatedTarget:e}),f=a(d),this.activate(b.parent("li"),c),this.activate(f,f.parent(),function(){b.trigger({type:"shown",relatedTarget:e})})},activate:function(b,c,d){function g(){e.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),f?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var e=c.find("> .active"),f=d&&a.support.transition&&e.hasClass("fade");f?e.one(a.support.transition.end,g):g(),e.removeClass("in")}},a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("tab");e||d.data("tab",e=new b(this)),typeof c=="string"&&e[c]()})},a.fn.tab.Constructor=b,a(function(){a("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.typeahead.defaults,c),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.$menu=a(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};b.prototype={constructor:b,select:function(){var a=this.$menu.find(".active").attr("data-value");return this.$element.val(a),this.hide()},show:function(){var b=a.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:b.top+b.height,left:b.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(b){var c=this,d,e;return this.query=this.$element.val(),this.query?(d=a.grep(this.source,function(a){if(c.matcher(a))return a}),d=this.sorter(d),d.length?this.render(d.slice(0,this.options.items)).show():this.shown?this.hide():this):this.shown?this.hide():this},matcher:function(a){return~a.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(a){var b=[],c=[],d=[],e;while(e=a.shift())e.toLowerCase().indexOf(this.query.toLowerCase())?~e.indexOf(this.query)?c.push(e):d.push(e):b.push(e);return b.concat(c,d)},highlighter:function(a){return a.replace(new RegExp("("+this.query+")","ig"),function(a,b){return"<strong>"+b+"</strong>"})},render:function(b){var c=this;return b=a(b).map(function(b,d){return b=a(c.options.item).attr("data-value",d),b.find("a").html(c.highlighter(d)),b[0]}),b.first().addClass("active"),this.$menu.html(b),this},next:function(b){var c=this.$menu.find(".active").removeClass("active"),d=c.next();d.length||(d=a(this.$menu.find("li")[0])),d.addClass("active")},prev:function(a){var b=this.$menu.find(".active").removeClass("active"),c=b.prev();c.length||(c=this.$menu.find("li").last()),c.addClass("active")},listen:function(){this.$element.on("blur",a.proxy(this.blur,this)).on("keypress",a.proxy(this.keypress,this)).on("keyup",a.proxy(this.keyup,this)),(a.browser.webkit||a.browser.msie)&&this.$element.on("keydown",a.proxy(this.keypress,this)),this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this))},keyup:function(a){a.stopPropagation(),a.preventDefault();switch(a.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:this.hide();break;default:this.lookup()}},keypress:function(a){a.stopPropagation();if(!this.shown)return;switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:a.preventDefault(),this.prev();break;case 40:a.preventDefault(),this.next()}},blur:function(a){var b=this;a.stopPropagation(),a.preventDefault(),setTimeout(function(){b.hide()},150)},click:function(a){a.stopPropagation(),a.preventDefault(),this.select()},mouseenter:function(b){this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")}},a.fn.typeahead=function(c){return this.each(function(){var d=a(this),e=d.data("typeahead"),f=typeof c=="object"&&c;e||d.data("typeahead",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>'},a.fn.typeahead.Constructor=b,a(function(){a("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(b){var c=a(this);if(c.data("typeahead"))return;b.preventDefault(),c.typeahead(c.data())})})}(window.jQuery);
\ No newline at end of file
Added: trunk/chorem-webmotion/src/main/webapp/js/chorem.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/chorem.js (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/js/chorem.js 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,20 @@
+// tout ce qui aura la classe datepicker servira a editer une date
+$(function() {
+ $( ".datepicker" ).datepicker($.datepicker.regional['fr']);
+ $( ".datepicker" ).datepicker( "option", "gotoCurrent", true );
+});
+
+// nouveau composant pour afficher les wikitties lors de l'edition classe par extension
+$.widget( "custom.autocompleteByExtension", $.ui.autocomplete, {
+ _renderMenu: function( ul, items ) {
+ var self = this,
+ currentExtension = "";
+ $.each( items, function( index, item ) {
+ if ( item.extension != currentExtension ) {
+ ul.append( "<li class='ui-autocomplete-category'>" + item.extension + "</li>" );
+ currentExtension = item.extension;
+ }
+ self._renderItem( ul, item );
+ });
+ }
+});
Added: trunk/chorem-webmotion/src/main/webapp/js/jquery.maskedinput-1.3.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/jquery.maskedinput-1.3.js (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/js/jquery.maskedinput-1.3.js 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,299 @@
+/*
+ Masked Input plugin for jQuery
+ Copyright (c) 2007-2011 Josh Bush (digitalbush.com)
+ Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)
+ Version: 1.3
+
+<script src="jquery.js" type="text/javascript"></script>
+<script src="jquery.maskedinput.js" type="text/javascript"></script>
+
+jQuery(function($){
+ $("#date").mask("99/99/9999");
+ $("#phone").mask("(999) 999-9999");
+ $("#tin").mask("99-9999999");
+ $("#ssn").mask("999-99-9999");
+});
+
+Optionally, if you are not satisfied with the underscore ('_') character as a
+placeholder, you may pass an optional argument to the maskedinput method.
+
+jQuery(function($){
+ $("#product").mask("99/99/9999",{placeholder:" "});
+});
+
+Optionally, if you would like to execute a function once the mask has been
+completed, you can specify that function as an optional argument to the
+maskedinput method.
+
+jQuery(function($){
+ $("#product").mask("99/99/9999",
+ {completed:function(){alert("You typed thefollowing: "+this.val());}});
+});
+
+You can now supply your own mask definitions.
+
+jQuery(function($){
+ $.mask.definitions['~']='[+-]';
+ $("#eyescript").mask("~9.99 ~9.99 999");
+});
+
+You can have part of your mask be optional. Anything listed after '?' within the
+mask is considered optional user input. The common example for this is phone
+number + optional extension.
+
+jQuery(function($){
+ $("#phone").mask("(999) 999-9999? x99999");
+});
+*/
+(function($) {
+ var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask";
+ var iPhone = (window.orientation != undefined);
+
+ $.mask = {
+ //Predefined character definitions
+ definitions: {
+ '9': "[0-9]",
+ 'a': "[A-Za-z]",
+ '*': "[A-Za-z0-9]"
+ },
+ dataName:"rawMaskFn"
+ };
+
+ $.fn.extend({
+ //Helper Function for Caret positioning
+ caret: function(begin, end) {
+ if (this.length == 0) return;
+ if (typeof begin == 'number') {
+ end = (typeof end == 'number') ? end : begin;
+ return this.each(function() {
+ if (this.setSelectionRange) {
+ this.setSelectionRange(begin, end);
+ } else if (this.createTextRange) {
+ var range = this.createTextRange();
+ range.collapse(true);
+ range.moveEnd('character', end);
+ range.moveStart('character', begin);
+ range.select();
+ }
+ });
+ } else {
+ if (this[0].setSelectionRange) {
+ begin = this[0].selectionStart;
+ end = this[0].selectionEnd;
+ } else if (document.selection && document.selection.createRange) {
+ var range = document.selection.createRange();
+ begin = 0 - range.duplicate().moveStart('character', -100000);
+ end = begin + range.text.length;
+ }
+ return { begin: begin, end: end };
+ }
+ },
+ unmask: function() { return this.trigger("unmask"); },
+ mask: function(mask, settings) {
+ if (!mask && this.length > 0) {
+ var input = $(this[0]);
+ return input.data($.mask.dataName)();
+ }
+ settings = $.extend({
+ placeholder: "_",
+ completed: null
+ }, settings);
+
+ var defs = $.mask.definitions;
+ var tests = [];
+ var partialPosition = mask.length;
+ var firstNonMaskPos = null;
+ var len = mask.length;
+
+ $.each(mask.split(""), function(i, c) {
+ if (c == '?') {
+ len--;
+ partialPosition = i;
+ } else if (defs[c]) {
+ tests.push(new RegExp(defs[c]));
+ if(firstNonMaskPos==null)
+ firstNonMaskPos = tests.length - 1;
+ } else {
+ tests.push(null);
+ }
+ });
+
+ return this.trigger("unmask").each(function() {
+ var input = $(this);
+ var buffer = $.map(mask.split(""), function(c, i) { if (c != '?') return defs[c] ? settings.placeholder : c });
+ var focusText = input.val();
+
+ function seekNext(pos) {
+ while (++pos <= len && !tests[pos]);
+ return pos;
+ };
+ function seekPrev(pos) {
+ while (--pos >= 0 && !tests[pos]);
+ return pos;
+ };
+
+ function shiftL(begin,end) {
+ if(begin<0)
+ return;
+ for (var i = begin,j = seekNext(end); i < len; i++) {
+ if (tests[i]) {
+ if (j < len && tests[i].test(buffer[j])) {
+ buffer[i] = buffer[j];
+ buffer[j] = settings.placeholder;
+ } else
+ break;
+ j = seekNext(j);
+ }
+ }
+ writeBuffer();
+ input.caret(Math.max(firstNonMaskPos, begin));
+ };
+
+ function shiftR(pos) {
+ for (var i = pos, c = settings.placeholder; i < len; i++) {
+ if (tests[i]) {
+ var j = seekNext(i);
+ var t = buffer[i];
+ buffer[i] = c;
+ if (j < len && tests[j].test(t))
+ c = t;
+ else
+ break;
+ }
+ }
+ };
+
+ function keydownEvent(e) {
+ var k=e.which;
+
+ //backspace, delete, and escape get special treatment
+ if(k == 8 || k == 46 || (iPhone && k == 127)){
+ var pos = input.caret(),
+ begin = pos.begin,
+ end = pos.end;
+
+ if(end-begin==0){
+ begin=k!=46?seekPrev(begin):(end=seekNext(begin-1));
+ end=k==46?seekNext(end):end;
+ }
+ clearBuffer(begin, end);
+ shiftL(begin,end-1);
+
+ return false;
+ } else if (k == 27) {//escape
+ input.val(focusText);
+ input.caret(0, checkVal());
+ return false;
+ }
+ };
+
+ function keypressEvent(e) {
+ var k = e.which,
+ pos = input.caret();
+ if (e.ctrlKey || e.altKey || e.metaKey || k<32) {//Ignore
+ return true;
+ } else if (k) {
+ if(pos.end-pos.begin!=0){
+ clearBuffer(pos.begin, pos.end);
+ shiftL(pos.begin, pos.end-1);
+ }
+
+ var p = seekNext(pos.begin - 1);
+ if (p < len) {
+ var c = String.fromCharCode(k);
+ if (tests[p].test(c)) {
+ shiftR(p);
+ buffer[p] = c;
+ writeBuffer();
+ var next = seekNext(p);
+ input.caret(next);
+ if (settings.completed && next >= len)
+ settings.completed.call(input);
+ }
+ }
+ return false;
+ }
+ };
+
+ function clearBuffer(start, end) {
+ for (var i = start; i < end && i < len; i++) {
+ if (tests[i])
+ buffer[i] = settings.placeholder;
+ }
+ };
+
+ function writeBuffer() { return input.val(buffer.join('')).val(); };
+
+ function checkVal(allow) {
+ //try to place characters where they belong
+ var test = input.val();
+ var lastMatch = -1;
+ for (var i = 0, pos = 0; i < len; i++) {
+ if (tests[i]) {
+ buffer[i] = settings.placeholder;
+ while (pos++ < test.length) {
+ var c = test.charAt(pos - 1);
+ if (tests[i].test(c)) {
+ buffer[i] = c;
+ lastMatch = i;
+ break;
+ }
+ }
+ if (pos > test.length)
+ break;
+ } else if (buffer[i] == test.charAt(pos) && i!=partialPosition) {
+ pos++;
+ lastMatch = i;
+ }
+ }
+ if (!allow && lastMatch + 1 < partialPosition) {
+ input.val("");
+ clearBuffer(0, len);
+ } else if (allow || lastMatch + 1 >= partialPosition) {
+ writeBuffer();
+ if (!allow) input.val(input.val().substring(0, lastMatch + 1));
+ }
+ return (partialPosition ? i : firstNonMaskPos);
+ };
+
+ input.data($.mask.dataName,function(){
+ return $.map(buffer, function(c, i) {
+ return tests[i]&&c!=settings.placeholder ? c : null;
+ }).join('');
+ })
+
+ if (!input.attr("readonly"))
+ input
+ .one("unmask", function() {
+ input
+ .unbind(".mask")
+ .removeData($.mask.dataName);
+ })
+ .bind("focus.mask", function() {
+ focusText = input.val();
+ var pos = checkVal();
+ writeBuffer();
+ var moveCaret=function(){
+ if (pos == mask.length)
+ input.caret(0, pos);
+ else
+ input.caret(pos);
+ };
+ ($.browser.msie ? moveCaret:function(){setTimeout(moveCaret,0)})();
+ })
+ .bind("blur.mask", function() {
+ checkVal();
+ if (input.val() != focusText)
+ input.change();
+ })
+ .bind("keydown.mask", keydownEvent)
+ .bind("keypress.mask", keypressEvent)
+ .bind(pasteEventName, function() {
+ setTimeout(function() { input.caret(checkVal(true)); }, 0);
+ });
+
+ checkVal(); //Perform initial check for existing values
+ });
+ }
+ });
+})(jQuery);
Added: trunk/chorem-webmotion/src/main/webapp/js/jquery.tokeninput.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/jquery.tokeninput.js (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/js/jquery.tokeninput.js 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,860 @@
+/*
+ * jQuery Plugin: Tokenizing Autocomplete Text Entry
+ * Version 1.6.0
+ *
+ * Copyright (c) 2009 James Smith (http://loopj.com)
+ * Licensed jointly under the GPL and MIT licenses,
+ * choose which one suits your project best!
+ *
+ */
+
+(function ($) {
+// Default settings
+var DEFAULT_SETTINGS = {
+ // Search settings
+ method: "GET",
+ contentType: "json",
+ queryParam: "q",
+ searchDelay: 300,
+ minChars: 1,
+ propertyToSearch: "name",
+ jsonContainer: null,
+
+ // Display settings
+ hintText: "Type in a search term",
+ noResultsText: "No results",
+ searchingText: "Searching...",
+ deleteText: "×",
+ animateDropdown: true,
+
+ // Tokenization settings
+ tokenLimit: null,
+ tokenDelimiter: ",",
+ preventDuplicates: false,
+
+ // Output settings
+ tokenValue: "id",
+
+ // Prepopulation settings
+ prePopulate: null,
+ processPrePopulate: false,
+
+ // Manipulation settings
+ idPrefix: "token-input-",
+
+ // Formatters
+ resultsFormatter: function(item){ return "<li>" + item[this.propertyToSearch]+ "</li>" },
+ tokenFormatter: function(item) { return "<li><p>" + item[this.propertyToSearch] + "</p></li>" },
+
+ // Callbacks
+ onResult: null,
+ onAdd: null,
+ onDelete: null,
+ onReady: null
+};
+
+// Default classes to use when theming
+var DEFAULT_CLASSES = {
+ tokenList: "token-input-list",
+ token: "token-input-token",
+ tokenDelete: "token-input-delete-token",
+ selectedToken: "token-input-selected-token",
+ highlightedToken: "token-input-highlighted-token",
+ dropdown: "token-input-dropdown",
+ dropdownItem: "token-input-dropdown-item",
+ dropdownItem2: "token-input-dropdown-item2",
+ selectedDropdownItem: "token-input-selected-dropdown-item",
+ inputToken: "token-input-input-token"
+};
+
+// Input box position "enum"
+var POSITION = {
+ BEFORE: 0,
+ AFTER: 1,
+ END: 2
+};
+
+// Keys "enum"
+var KEY = {
+ BACKSPACE: 8,
+ TAB: 9,
+ ENTER: 13,
+ ESCAPE: 27,
+ SPACE: 32,
+ PAGE_UP: 33,
+ PAGE_DOWN: 34,
+ END: 35,
+ HOME: 36,
+ LEFT: 37,
+ UP: 38,
+ RIGHT: 39,
+ DOWN: 40,
+ NUMPAD_ENTER: 108,
+ COMMA: 188
+};
+
+// Additional public (exposed) methods
+var methods = {
+ init: function(url_or_data_or_function, options) {
+ var settings = $.extend({}, DEFAULT_SETTINGS, options || {});
+
+ return this.each(function () {
+ $(this).data("tokenInputObject", new $.TokenList(this, url_or_data_or_function, settings));
+ });
+ },
+ clear: function() {
+ this.data("tokenInputObject").clear();
+ return this;
+ },
+ add: function(item) {
+ this.data("tokenInputObject").add(item);
+ return this;
+ },
+ remove: function(item) {
+ this.data("tokenInputObject").remove(item);
+ return this;
+ },
+ get: function() {
+ return this.data("tokenInputObject").getTokens();
+ }
+}
+
+// Expose the .tokenInput function to jQuery as a plugin
+$.fn.tokenInput = function (method) {
+ // Method calling and initialization logic
+ if(methods[method]) {
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+ } else {
+ return methods.init.apply(this, arguments);
+ }
+};
+
+// TokenList class for each input
+$.TokenList = function (input, url_or_data, settings) {
+ //
+ // Initialization
+ //
+
+ // Configure the data source
+ if($.type(url_or_data) === "string" || $.type(url_or_data) === "function") {
+ // Set the url to query against
+ settings.url = url_or_data;
+
+ // If the URL is a function, evaluate it here to do our initalization work
+ var url = computeURL();
+
+ // Make a smart guess about cross-domain if it wasn't explicitly specified
+ if(settings.crossDomain === undefined) {
+ if(url.indexOf("://") === -1) {
+ settings.crossDomain = false;
+ } else {
+ settings.crossDomain = (location.href.split(/\/+/g)[1] !== url.split(/\/+/g)[1]);
+ }
+ }
+ } else if(typeof(url_or_data) === "object") {
+ // Set the local data to search through
+ settings.local_data = url_or_data;
+ }
+
+ // Build class names
+ if(settings.classes) {
+ // Use custom class names
+ settings.classes = $.extend({}, DEFAULT_CLASSES, settings.classes);
+ } else if(settings.theme) {
+ // Use theme-suffixed default class names
+ settings.classes = {};
+ $.each(DEFAULT_CLASSES, function(key, value) {
+ settings.classes[key] = value + "-" + settings.theme;
+ });
+ } else {
+ settings.classes = DEFAULT_CLASSES;
+ }
+
+
+ // Save the tokens
+ var saved_tokens = [];
+
+ // Keep track of the number of tokens in the list
+ var token_count = 0;
+
+ // Basic cache to save on db hits
+ var cache = new $.TokenList.Cache();
+
+ // Keep track of the timeout, old vals
+ var timeout;
+ var input_val;
+
+ // Create a new text input an attach keyup events
+ var input_box = $("<input type=\"text\" autocomplete=\"off\">")
+ .css({
+ outline: "none"
+ })
+ .attr("id", settings.idPrefix + input.id)
+ .focus(function () {
+ if (settings.tokenLimit === null || settings.tokenLimit !== token_count) {
+ show_dropdown_hint();
+ }
+ })
+ .blur(function () {
+ hide_dropdown();
+ $(this).val("");
+ })
+ .bind("keyup keydown blur update", resize_input)
+ .keydown(function (event) {
+ var previous_token;
+ var next_token;
+
+ switch(event.keyCode) {
+ case KEY.LEFT:
+ case KEY.RIGHT:
+ case KEY.UP:
+ case KEY.DOWN:
+ if(!$(this).val()) {
+ previous_token = input_token.prev();
+ next_token = input_token.next();
+
+ if((previous_token.length && previous_token.get(0) === selected_token) || (next_token.length && next_token.get(0) === selected_token)) {
+ // Check if there is a previous/next token and it is selected
+ if(event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) {
+ deselect_token($(selected_token), POSITION.BEFORE);
+ } else {
+ deselect_token($(selected_token), POSITION.AFTER);
+ }
+ } else if((event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) && previous_token.length) {
+ // We are moving left, select the previous token if it exists
+ select_token($(previous_token.get(0)));
+ } else if((event.keyCode === KEY.RIGHT || event.keyCode === KEY.DOWN) && next_token.length) {
+ // We are moving right, select the next token if it exists
+ select_token($(next_token.get(0)));
+ }
+ } else {
+ var dropdown_item = null;
+
+ if(event.keyCode === KEY.DOWN || event.keyCode === KEY.RIGHT) {
+ dropdown_item = $(selected_dropdown_item).next();
+ } else {
+ dropdown_item = $(selected_dropdown_item).prev();
+ }
+
+ if(dropdown_item.length) {
+ select_dropdown_item(dropdown_item);
+ }
+ return false;
+ }
+ break;
+
+ case KEY.BACKSPACE:
+ previous_token = input_token.prev();
+
+ if(!$(this).val().length) {
+ if(selected_token) {
+ delete_token($(selected_token));
+ hidden_input.change();
+ } else if(previous_token.length) {
+ select_token($(previous_token.get(0)));
+ }
+
+ return false;
+ } else if($(this).val().length === 1) {
+ hide_dropdown();
+ } else {
+ // set a timeout just long enough to let this function finish.
+ setTimeout(function(){do_search();}, 5);
+ }
+ break;
+
+ case KEY.TAB:
+ case KEY.ENTER:
+ case KEY.NUMPAD_ENTER:
+ case KEY.COMMA:
+ if(selected_dropdown_item) {
+ add_token($(selected_dropdown_item).data("tokeninput"));
+ hidden_input.change();
+ return false;
+ }
+ break;
+
+ case KEY.ESCAPE:
+ hide_dropdown();
+ return true;
+
+ default:
+ if(String.fromCharCode(event.which)) {
+ // set a timeout just long enough to let this function finish.
+ setTimeout(function(){do_search();}, 5);
+ }
+ break;
+ }
+ });
+
+ // Keep a reference to the original input box
+ var hidden_input = $(input)
+ .hide()
+ .val("")
+ .focus(function () {
+ input_box.focus();
+ })
+ .blur(function () {
+ input_box.blur();
+ });
+
+ // Keep a reference to the selected token and dropdown item
+ var selected_token = null;
+ var selected_token_index = 0;
+ var selected_dropdown_item = null;
+
+ // The list to store the token items in
+ var token_list = $("<ul />")
+ .addClass(settings.classes.tokenList)
+ .click(function (event) {
+ var li = $(event.target).closest("li");
+ if(li && li.get(0) && $.data(li.get(0), "tokeninput")) {
+ toggle_select_token(li);
+ } else {
+ // Deselect selected token
+ if(selected_token) {
+ deselect_token($(selected_token), POSITION.END);
+ }
+
+ // Focus input box
+ input_box.focus();
+ }
+ })
+ .mouseover(function (event) {
+ var li = $(event.target).closest("li");
+ if(li && selected_token !== this) {
+ li.addClass(settings.classes.highlightedToken);
+ }
+ })
+ .mouseout(function (event) {
+ var li = $(event.target).closest("li");
+ if(li && selected_token !== this) {
+ li.removeClass(settings.classes.highlightedToken);
+ }
+ })
+ .insertBefore(hidden_input);
+
+ // The token holding the input box
+ var input_token = $("<li />")
+ .addClass(settings.classes.inputToken)
+ .appendTo(token_list)
+ .append(input_box);
+
+ // The list to store the dropdown items in
+ var dropdown = $("<div>")
+ .addClass(settings.classes.dropdown)
+ .appendTo("body")
+ .hide();
+
+ // Magic element to help us resize the text input
+ var input_resizer = $("<tester/>")
+ .insertAfter(input_box)
+ .css({
+ position: "absolute",
+ top: -9999,
+ left: -9999,
+ width: "auto",
+ fontSize: input_box.css("fontSize"),
+ fontFamily: input_box.css("fontFamily"),
+ fontWeight: input_box.css("fontWeight"),
+ letterSpacing: input_box.css("letterSpacing"),
+ whiteSpace: "nowrap"
+ });
+
+ // Pre-populate list if items exist
+ hidden_input.val("");
+ var li_data = settings.prePopulate || hidden_input.data("pre");
+ if(settings.processPrePopulate && $.isFunction(settings.onResult)) {
+ li_data = settings.onResult.call(hidden_input, li_data);
+ }
+ if(li_data && li_data.length) {
+ $.each(li_data, function (index, value) {
+ insert_token(value);
+ checkTokenLimit();
+ });
+ }
+
+ // Initialization is done
+ if($.isFunction(settings.onReady)) {
+ settings.onReady.call();
+ }
+
+ //
+ // Public functions
+ //
+
+ this.clear = function() {
+ token_list.children("li").each(function() {
+ if ($(this).children("input").length === 0) {
+ delete_token($(this));
+ }
+ });
+ }
+
+ this.add = function(item) {
+ add_token(item);
+ }
+
+ this.remove = function(item) {
+ token_list.children("li").each(function() {
+ if ($(this).children("input").length === 0) {
+ var currToken = $(this).data("tokeninput");
+ var match = true;
+ for (var prop in item) {
+ if (item[prop] !== currToken[prop]) {
+ match = false;
+ break;
+ }
+ }
+ if (match) {
+ delete_token($(this));
+ }
+ }
+ });
+ }
+
+ this.getTokens = function() {
+ return saved_tokens;
+ }
+
+ //
+ // Private functions
+ //
+
+ function checkTokenLimit() {
+ if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) {
+ input_box.hide();
+ hide_dropdown();
+ return;
+ }
+ }
+
+ function resize_input() {
+ if(input_val === (input_val = input_box.val())) {return;}
+
+ // Enter new content into resizer and resize input accordingly
+ var escaped = input_val.replace(/&/g, '&').replace(/\s/g,' ').replace(/</g, '<').replace(/>/g, '>');
+ input_resizer.html(escaped);
+ input_box.width(input_resizer.width() + 30);
+ }
+
+ function is_printable_character(keycode) {
+ return ((keycode >= 48 && keycode <= 90) || // 0-1a-z
+ (keycode >= 96 && keycode <= 111) || // numpad 0-9 + - / * .
+ (keycode >= 186 && keycode <= 192) || // ; = , - . / ^
+ (keycode >= 219 && keycode <= 222)); // ( \ ) '
+ }
+
+ // Inner function to a token to the list
+ function insert_token(item) {
+ var this_token = settings.tokenFormatter(item);
+ this_token = $(this_token)
+ .addClass(settings.classes.token)
+ .insertBefore(input_token);
+
+ // The 'delete token' button
+ $("<span>" + settings.deleteText + "</span>")
+ .addClass(settings.classes.tokenDelete)
+ .appendTo(this_token)
+ .click(function () {
+ delete_token($(this).parent());
+ hidden_input.change();
+ return false;
+ });
+
+ // Store data on the token
+ var token_data = {"id": item.id};
+ token_data[settings.propertyToSearch] = item[settings.propertyToSearch];
+ $.data(this_token.get(0), "tokeninput", item);
+
+ // Save this token for duplicate checking
+ saved_tokens = saved_tokens.slice(0,selected_token_index).concat([token_data]).concat(saved_tokens.slice(selected_token_index));
+ selected_token_index++;
+
+ // Update the hidden input
+ update_hidden_input(saved_tokens, hidden_input);
+
+ token_count += 1;
+
+ // Check the token limit
+ if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) {
+ input_box.hide();
+ hide_dropdown();
+ }
+
+ return this_token;
+ }
+
+ // Add a token to the token list based on user input
+ function add_token (item) {
+ var callback = settings.onAdd;
+
+ // See if the token already exists and select it if we don't want duplicates
+ if(token_count > 0 && settings.preventDuplicates) {
+ var found_existing_token = null;
+ token_list.children().each(function () {
+ var existing_token = $(this);
+ var existing_data = $.data(existing_token.get(0), "tokeninput");
+ if(existing_data && existing_data.id === item.id) {
+ found_existing_token = existing_token;
+ return false;
+ }
+ });
+
+ if(found_existing_token) {
+ select_token(found_existing_token);
+ input_token.insertAfter(found_existing_token);
+ input_box.focus();
+ return;
+ }
+ }
+
+ // Insert the new tokens
+ if(settings.tokenLimit == null || token_count < settings.tokenLimit) {
+ insert_token(item);
+ checkTokenLimit();
+ }
+
+ // Clear input box
+ input_box.val("");
+
+ // Don't show the help dropdown, they've got the idea
+ hide_dropdown();
+
+ // Execute the onAdd callback if defined
+ if($.isFunction(callback)) {
+ callback.call(hidden_input,item);
+ }
+ }
+
+ // Select a token in the token list
+ function select_token (token) {
+ token.addClass(settings.classes.selectedToken);
+ selected_token = token.get(0);
+
+ // Hide input box
+ input_box.val("");
+
+ // Hide dropdown if it is visible (eg if we clicked to select token)
+ hide_dropdown();
+ }
+
+ // Deselect a token in the token list
+ function deselect_token (token, position) {
+ token.removeClass(settings.classes.selectedToken);
+ selected_token = null;
+
+ if(position === POSITION.BEFORE) {
+ input_token.insertBefore(token);
+ selected_token_index--;
+ } else if(position === POSITION.AFTER) {
+ input_token.insertAfter(token);
+ selected_token_index++;
+ } else {
+ input_token.appendTo(token_list);
+ selected_token_index = token_count;
+ }
+
+ // Show the input box and give it focus again
+ input_box.focus();
+ }
+
+ // Toggle selection of a token in the token list
+ function toggle_select_token(token) {
+ var previous_selected_token = selected_token;
+
+ if(selected_token) {
+ deselect_token($(selected_token), POSITION.END);
+ }
+
+ if(previous_selected_token === token.get(0)) {
+ deselect_token(token, POSITION.END);
+ } else {
+ select_token(token);
+ }
+ }
+
+ // Delete a token from the token list
+ function delete_token (token) {
+ // Remove the id from the saved list
+ var token_data = $.data(token.get(0), "tokeninput");
+ var callback = settings.onDelete;
+
+ var index = token.prevAll().length;
+ if(index > selected_token_index) index--;
+
+ // Delete the token
+ token.remove();
+ selected_token = null;
+
+ // Show the input box and give it focus again
+ input_box.focus();
+
+ // Remove this token from the saved list
+ saved_tokens = saved_tokens.slice(0,index).concat(saved_tokens.slice(index+1));
+ if(index < selected_token_index) selected_token_index--;
+
+ // Update the hidden input
+ update_hidden_input(saved_tokens, hidden_input);
+
+ token_count -= 1;
+
+ if(settings.tokenLimit !== null) {
+ input_box
+ .show()
+ .val("")
+ .focus();
+ }
+
+ // Execute the onDelete callback if defined
+ if($.isFunction(callback)) {
+ callback.call(hidden_input,token_data);
+ }
+ }
+
+ // Update the hidden input box value
+ function update_hidden_input(saved_tokens, hidden_input) {
+ var token_values = $.map(saved_tokens, function (el) {
+ return el[settings.tokenValue];
+ });
+ hidden_input.val(token_values.join(settings.tokenDelimiter));
+
+ }
+
+ // Hide and clear the results dropdown
+ function hide_dropdown () {
+ dropdown.hide().empty();
+ selected_dropdown_item = null;
+ }
+
+ function show_dropdown() {
+ dropdown
+ .css({
+ position: "absolute",
+ top: $(token_list).offset().top + $(token_list).outerHeight(),
+ left: $(token_list).offset().left,
+ zindex: 999
+ })
+ .show();
+ }
+
+ function show_dropdown_searching () {
+ if(settings.searchingText) {
+ dropdown.html("<p>"+settings.searchingText+"</p>");
+ show_dropdown();
+ }
+ }
+
+ function show_dropdown_hint () {
+ if(settings.hintText) {
+ dropdown.html("<p>"+settings.hintText+"</p>");
+ show_dropdown();
+ }
+ }
+
+ // Highlight the query part of the search term
+ function highlight_term(value, term) {
+ return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<b>$1</b>");
+ }
+
+ function find_value_and_highlight_term(template, value, term) {
+ return template.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + value + ")(?![^<>]*>)(?![^&;]+;)", "g"), highlight_term(value, term));
+ }
+
+ // Populate the results dropdown with some results
+ function populate_dropdown (query, results) {
+ if(results && results.length) {
+ dropdown.empty();
+ var dropdown_ul = $("<ul>")
+ .appendTo(dropdown)
+ .mouseover(function (event) {
+ select_dropdown_item($(event.target).closest("li"));
+ })
+ .mousedown(function (event) {
+ add_token($(event.target).closest("li").data("tokeninput"));
+ hidden_input.change();
+ return false;
+ })
+ .hide();
+
+ $.each(results, function(index, value) {
+ var this_li = settings.resultsFormatter(value);
+
+ this_li = find_value_and_highlight_term(this_li ,value[settings.propertyToSearch], query);
+
+ this_li = $(this_li).appendTo(dropdown_ul);
+
+ if(index % 2) {
+ this_li.addClass(settings.classes.dropdownItem);
+ } else {
+ this_li.addClass(settings.classes.dropdownItem2);
+ }
+
+ if(index === 0) {
+ select_dropdown_item(this_li);
+ }
+
+ $.data(this_li.get(0), "tokeninput", value);
+ });
+
+ show_dropdown();
+
+ if(settings.animateDropdown) {
+ dropdown_ul.slideDown("fast");
+ } else {
+ dropdown_ul.show();
+ }
+ } else {
+ if(settings.noResultsText) {
+ dropdown.html("<p>"+settings.noResultsText+"</p>");
+ show_dropdown();
+ }
+ }
+ }
+
+ // Highlight an item in the results dropdown
+ function select_dropdown_item (item) {
+ if(item) {
+ if(selected_dropdown_item) {
+ deselect_dropdown_item($(selected_dropdown_item));
+ }
+
+ item.addClass(settings.classes.selectedDropdownItem);
+ selected_dropdown_item = item.get(0);
+ }
+ }
+
+ // Remove highlighting from an item in the results dropdown
+ function deselect_dropdown_item (item) {
+ item.removeClass(settings.classes.selectedDropdownItem);
+ selected_dropdown_item = null;
+ }
+
+ // Do a search and show the "searching" dropdown if the input is longer
+ // than settings.minChars
+ function do_search() {
+ var query = input_box.val().toLowerCase();
+
+ if(query && query.length) {
+ if(selected_token) {
+ deselect_token($(selected_token), POSITION.AFTER);
+ }
+
+ if(query.length >= settings.minChars) {
+ show_dropdown_searching();
+ clearTimeout(timeout);
+
+ timeout = setTimeout(function(){
+ run_search(query);
+ }, settings.searchDelay);
+ } else {
+ hide_dropdown();
+ }
+ }
+ }
+
+ // Do the actual search
+ function run_search(query) {
+ var cache_key = query + computeURL();
+ var cached_results = cache.get(cache_key);
+ if(cached_results) {
+ populate_dropdown(query, cached_results);
+ } else {
+ // Are we doing an ajax search or local data search?
+ if(settings.url) {
+ var url = computeURL();
+ // Extract exisiting get params
+ var ajax_params = {};
+ ajax_params.data = {};
+ if(url.indexOf("?") > -1) {
+ var parts = url.split("?");
+ ajax_params.url = parts[0];
+
+ var param_array = parts[1].split("&");
+ $.each(param_array, function (index, value) {
+ var kv = value.split("=");
+ ajax_params.data[kv[0]] = kv[1];
+ });
+ } else {
+ ajax_params.url = url;
+ }
+
+ // Prepare the request
+ ajax_params.data[settings.queryParam] = query;
+ ajax_params.type = settings.method;
+ ajax_params.dataType = settings.contentType;
+ if(settings.crossDomain) {
+ ajax_params.dataType = "jsonp";
+ }
+
+ // Attach the success callback
+ ajax_params.success = function(results) {
+ if($.isFunction(settings.onResult)) {
+ results = settings.onResult.call(hidden_input, results);
+ }
+ cache.add(cache_key, settings.jsonContainer ? results[settings.jsonContainer] : results);
+
+ // only populate the dropdown if the results are associated with the active search query
+ if(input_box.val().toLowerCase() === query) {
+ populate_dropdown(query, settings.jsonContainer ? results[settings.jsonContainer] : results);
+ }
+ };
+
+ // Make the request
+ $.ajax(ajax_params);
+ } else if(settings.local_data) {
+ // Do the search through local data
+ var results = $.grep(settings.local_data, function (row) {
+ return row[settings.propertyToSearch].toLowerCase().indexOf(query.toLowerCase()) > -1;
+ });
+
+ if($.isFunction(settings.onResult)) {
+ results = settings.onResult.call(hidden_input, results);
+ }
+ cache.add(cache_key, results);
+ populate_dropdown(query, results);
+ }
+ }
+ }
+
+ // compute the dynamic URL
+ function computeURL() {
+ var url = settings.url;
+ if(typeof settings.url == 'function') {
+ url = settings.url.call();
+ }
+ return url;
+ }
+};
+
+// Really basic cache for the results
+$.TokenList.Cache = function (options) {
+ var settings = $.extend({
+ max_size: 500
+ }, options);
+
+ var data = {};
+ var size = 0;
+
+ var flush = function () {
+ data = {};
+ size = 0;
+ };
+
+ this.add = function (query, results) {
+ if(size > settings.max_size) {
+ flush();
+ }
+
+ if(!data[query]) {
+ size += 1;
+ }
+
+ data[query] = results;
+ };
+
+ this.get = function (query) {
+ return data[query];
+ };
+};
+}(jQuery));
Added: trunk/chorem-webmotion/src/main/webapp/js/less-1.2.1.min.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/less-1.2.1.min.js (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/js/less-1.2.1.min.js 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,9 @@
+//
+// LESS - Leaner CSS v1.2.1
+// http://lesscss.org
+//
+// Copyright (c) 2009-2011, Alexis Sellier
+// Licensed under the Apache 2.0 License.
+//
+(function(a,b){function c(b){return a.less[b.split("/")[1]]}function m(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(k)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){var e=d.toCSS(),f=a[b];f.type="text/css",f.styleSheet?f.styleSheet.cssText=e:f.innerHTML=e})}function n(a,b){for(var c=0;c<d.sheets.length;c++)o(d.sheets[c],a,b,d.sheets.length-(c+1))}function o(b,c,e,f){var g=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=h&&h.getItem(i),k=h&&h.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=g.slice(0,g.lastIndexOf("/")+1)+i);var m=i.match(/([^\/]+)$/)[1];s(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())r(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type,filename:m})).parse(a,function(d,e){if(d)return w(d,i);try{c(d,e,a,b,{local:!1,lastModified:g,remaining:f}),u(document.getElementById("less-error-message:"+q(i)))}catch(d){w(d,i)}})}catch(h){w(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function q(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function r(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||q(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(g){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&h&&(v("saving "+e+" to cache."),h.setItem(e,a),h.setItem(e+":timestamp",c))}function s(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var f=t(),h=g?!1:d.async;typeof f.overrideMimeType=="function"&&f.overrideMimeType("text/css"),f.open("GET",a,h),f.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),f.send(null),g?f.status===0||f.status>=200&&f.status<300?c(f.responseText):e(f.status,a):h?f.onreadystatechange=function(){f.readyState==4&&i(f,c,e)}:i(f,c,e)}function t(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return v("browser doesn't support AJAX."),null}}function u(a){return a&&a.parentNode.removeChild(a)}function v(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function w(a,b){var c="less-error-message:"+q(b),e='<li><label>{line}</label><pre class="{class}">{content}</pre></li>',f=document.createElement("div"),g,h,i=[],j=a.filename||b;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p>in <a href="'+j+'">'+j+"</a> ";var k=function(a,b,c){a.extract[b]&&i.push(e.replace(/\{line\}/,parseInt(a.line)+(b-1)).replace(/\{class\}/,c).replace(/\{content\}/,a.extract[b]))};a.stack?h+="<br/>"+a.stack.split("\n").slice(1).join("<br/>"):a.extract&&(k(a,0,""),k(a,1,"line"),k(a,2,""),h+="on line "+a.line+", column "+(a.column+1)+":</p>"+"<ul>"+i.join("")+"</ul>"),f.innerHTML=h,r([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=new Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,f;typeof environment=="object"&&{}.toString.call(environment)==="[object Environment]"?(typeof a=="undefined"?d={}:d=a.less={},f=d.tree={},d.mode="rhino"):typeof a=="undefined"?(d=exports,f=c("./tree"),d.mode="node"):(typeof a.less=="undefined"&&(a.less={}),d=a.less,f=a.less.tree={},d.mode="browser"),d.Parser=function(b){function t(){j=m[i],k=h,n=h}function u(){m[i]=j,h=k,n=h}function v(){h>n&&(m[i]=m[i].slice(h-n),n=h)}function w(a){var b,c,d,e,f,j,k,l;if(a instanceof Function)return a.call(o.parsers);if(typeof a=="string")b=g.charAt(h)===a?a:null,d=1,v();else{v();if(!(b=a.exec(m[i])))return null;d=b[0].length}if(b){l=h+=d,j=h+m[i].length-d;while(h<j){e=g.charCodeAt(h);if(e!==32&&e!==10&&e!==9)break;h++}return m[i]=m[i].slice(d+(h-l)),n=h,m[i].length===0&&i<m.length-1&&i++,typeof b=="string"?b:b.length===1?b[0]:b}}function x(a,b){var c=w(a);if(!!c)return c;y(b||(typeof a=="string"?"expected '"+a+"' got '"+g.charAt(h)+"'":"unexpected token"))}function y(a,b){throw{index:h,type:b||"Syntax",message:a}}function z(a){return typeof a=="string"?g.charAt(h)===a:a.test(m[i])?!0:!1}function A(a,b){return a.filename&&b.filename&&a.filename!==b.filename?o.imports.contents[a.filename]:g}function B(a,b){for(var c=a,d=-1;c>=0&&b.charAt(c)!=="\n";c--)d++;return{line:typeof a=="number"?(b.slice(0,a).match(/\n/g)||"").length:null,column:d}}function C(a,b){var c=A(a,b),d=B(a.index,c),e=d.line,f=d.column,g=c.split("\n");this.type=a.type||"Syntax",this.message=a.message,this.filename=a.filename||b.filename,this.index=a.index,this.line=typeof e=="number"?e+1:null,this.callLine=a.call&&B(a.call,c)+1,this.callExtract=g[B(a.call,c)],this.stack=a.stack,this.column=f,this.extract=[g[e-1],g[e],g[e+1]]}var g,h,i,j,k,l,m,n,o,q=this,r=function(){},s=this.imports={paths:b&&b.paths||[],queue:[],files:{},contents:{},mime:b&&b.mime,error:null,push:function(a,c){var e=this;this.queue.push(a),d.Parser.importer(a,this.paths,function(b,d,f){e.queue.splice(e.queue.indexOf(a),1),e.files[a]=d,e.contents[a]=f,b&&!e.error&&(e.error=b),c(b,d),e.queue.length===0&&r()},b)}};return this.env=b=b||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,o={imports:s,parse:function(a,e){var j,k,p,q,s,t,u=[],v,x=null;h=i=n=l=0,m=[],g=a.replace(/\r\n/g,"\n"),m=function(a){var c=0,d=/[^"'`\{\}\/\(\)]+/g,e=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,f=0,h,i=a[0],j,k;for(var l=0,m,n;l<g.length;l++){d.lastIndex=l,(h=d.exec(g))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=g.charAt(l),e.lastIndex=l,!k&&!j&&m==="/"&&(n=g.charAt(l+1),(n==="/"||n==="*")&&(h=e.exec(g))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=g.charAt(l)));if(m==="{"&&!k&&!j)f++,i.push(m);else if(m==="}"&&!k&&!j)f--,i.push(m),a[++c]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(f>0)throw{type:"Syntax",message:"Missing closing `}`",filename:b.filename};return a.map(function(a){return a.join("")})}([[]]);try{j=new f.Ruleset([],w(this.parsers.primary)),j.root=!0}catch(y){return e(new C(y,b))}j.toCSS=function(a){var e,g,h;return function(e,g){var h=[],i;e=e||{},typeof g=="object"&&!Array.isArray(g)&&(g=Object.keys(g).map(function(a){var b=g[a];return b instanceof f.Value||(b instanceof f.Expression||(b=new f.Expression([b])),b=new f.Value([b])),new f.Rule("@"+a,b,!1,0)}),h=[new f.Ruleset(null,g)]);try{var j=a.call(this,{frames:h}).toCSS([],{compress:e.compress||!1})}catch(k){throw new C(k,b)}if(i=o.imports.error)throw i instanceof C?i:new C(i,b);return e.yuicompress&&d.mode==="node"?c("./cssmin").compressor.cssmin(j):e.compress?j.replace(/(\s)+/g,"$1"):j}}(j.eval);if(h<g.length-1){h=l,t=g.split("\n"),s=(g.slice(0,h).match(/\n/g)||"").length+1;for(var z=h,A=-1;z>=0&&g.charAt(z)!=="\n";z--)A++;x={type:"Parse",message:"Syntax Error on line "+s,index:h,filename:b.filename,line:s,column:A,extract:[t[s-2],t[s-1],t[s]]}}this.imports.queue.length>0?r=function(){e(x,j)}:e(x,j)},parsers:{primary:function(){var a,b=[];while((a=w(this.mixin.definition)||w(this.rule)||w(this.ruleset)||w(this.mixin.call)||w(this.comment)||w(this.directive))||w(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(g.charAt(h)!=="/")return;if(g.charAt(h+1)==="/")return new f.Comment(w(/^\/\/.*/),!0);if(a=w(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new f.Comment(a)},entities:{quoted:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=='"'&&g.charAt(b)!=="'")return;c&&w("~");if(a=w(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new f.Quoted(a[0],a[1]||a[2],c)},keyword:function(){var a;if(a=w(/^[_A-Za-z-][_A-Za-z0-9-]*/))return f.colors.hasOwnProperty(a)?new f.Color(f.colors[a].slice(1)):new f.Keyword(a)},call:function(){var a,c,d=h;if(!(a=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(m[i])))return;a=a[1].toLowerCase();if(a==="url")return null;h+=a.length;if(a==="alpha")return w(this.alpha);w("("),c=w(this.entities.arguments);if(!w(")"))return;if(a)return new f.Call(a,c,d,b.filename)},arguments:function(){var a=[],b;while(b=w(this.entities.assignment)||w(this.expression)){a.push(b);if(!w(","))break}return a},literal:function(){return w(this.entities.dimension)||w(this.entities.color)||w(this.entities.quoted)},assignment:function(){var a,b;if((a=w(/^\w+(?=\s?=)/i))&&w("=")&&(b=w(this.entity)))return new f.Assignment(a,b)},url:function(){var a;if(g.charAt(h)!=="u"||!w(/^url\(/))return;return a=w(this.entities.quoted)||w(this.entities.variable)||w(this.entities.dataURI)||w(/^[-\w%@$\/.&=:;#+?~]+/)||"",x(")"),new f.URL(a.value||a.data||a instanceof f.Variable?a:new f.Anonymous(a),s.paths)},dataURI:function(){var a;if(w(/^data:/)){a={},a.mime=w(/^[^\/]+\/[^,;)]+/)||"",a.charset=w(/^;\s*charset=[^,;)]+/)||"",a.base64=w(/^;\s*base64/)||"",a.data=w(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,c=h;if(g.charAt(h)==="@"&&(a=w(/^@@?[\w-]+/)))return new f.Variable(a,c,b.filename)},color:function(){var a;if(g.charAt(h)==="#"&&(a=w(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new f.Color(a[1])},dimension:function(){var a,b=g.charCodeAt(h);if(b>57||b<45||b===47)return;if(a=w(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new f.Dimension(a[1],a[2])},javascript:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=="`")return;c&&w("~");if(a=w(/^`([^`]*)`/))return new f.JavaScript(a[1],h,c)}},variable:function(){var a;if(g.charAt(h)==="@"&&(a=w(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!z(/^[@\w.%-]+\/[@\w.-]+/))return;if((a=w(this.entity))&&w("/")&&(b=w(this.entity)))return new f.Shorthand(a,b)},mixin:{call:function(){var a=[],c,d,e,i=h,j=g.charAt(h),k=!1;if(j!=="."&&j!=="#")return;while(c=w(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new f.Element(d,c,h)),d=w(">");w("(")&&(e=w(this.entities.arguments))&&w(")"),w(this.important)&&(k=!0);if(a.length>0&&(w(";")||z("}")))return new f.mixin.Call(a,e,i,b.filename,k)},definition:function(){var a,b=[],c,d,e,i,j;if(g.charAt(h)!=="."&&g.charAt(h)!=="#"||z(/^[^{]*(;|})/))return;t();if(c=w(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=c[1];while(e=w(this.entities.variable)||w(this.entities.literal)||w(this.entities.keyword)){e instanceof f.Variable?w(":")?(i=x(this.expression,"expected expression"),b.push({name:e.name,value:i})):b.push({name:e.name}):b.push({value:e});if(!w(","))break}x(")"),w(/^when/)&&(j=x(this.conditions,"expected condition")),d=w(this.block);if(d)return new f.mixin.Definition(a,b,d,j);u()}}},entity:function(){return w(this.entities.literal)||w(this.entities.variable)||w(this.entities.url)||w(this.entities.call)||w(this.entities.keyword)||w(this.entities.javascript)||w(this.comment)},end:function(){return w(";")||z("}")},alpha:function(){var a;if(!w(/^\(opacity=/i))return;if(a=w(/^\d+/)||w(this.entities.variable))return x(")"),new f.Alpha(a)},element:function(){var a,b,c,d;c=w(this.combinator),a=w(/^(?:\d+\.\d+|\d+)%/)||w(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||w("*")||w(this.attribute)||w(/^\([^)@]+\)/),a||w("(")&&(d=w(this.entities.variable))&&w(")")&&(a=new f.Paren(d));if(a)return new f.Element(c,a,h);if(c.value&&c.value.charAt(0)==="&")return new f.Element(c,null,h)},combinator:function(){var a,b=g.charAt(h);if(b===">"||b==="+"||b==="~"){h++;while(g.charAt(h)===" ")h++;return new f.Combinator(b)}if(b==="&"){a="&",h++,g.charAt(h)===" "&&(a="& ");while(g.charAt(h)===" ")h++;return new f.Combinator(a)}if(b===":"&&g.charAt(h+1)===":"){h+=2;while(g.charAt(h)===" ")h++;return new f.Combinator("::")}return g.charAt(h-1)===" "?new f.Combinator(" "):new f.Combinator(null)},selector:function(){var a,b,c=[],d,e;while(b=w(this.element)){d=g.charAt(h),c.push(b);if(d==="{"||d==="}"||d===";"||d===",")break}if(c.length>0)return new f.Selector(c)},tag:function(){return w(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||w("*")},attribute:function(){var a="",b,c,d;if(!w("["))return;if(b=w(/^[a-zA-Z-]+/)||w(this.entities.quoted))(d=w(/^[|~*$^]?=/))&&(c=w(this.entities.quoted)||w(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!w("]"))return;if(a)return"["+a+"]"},block:function(){var a;if(w("{")&&(a=w(this.primary))&&w("}"))return a},ruleset:function(){var a=[],b,c,d;t();while(b=w(this.selector)){a.push(b),w(this.comment);if(!w(","))break;w(this.comment)}if(a.length>0&&(c=w(this.block)))return new f.Ruleset(a,c);l=h,u()},rule:function(){var a,b,c=g.charAt(h),d,e;t();if(c==="."||c==="#"||c==="&")return;if(a=w(this.variable)||w(this.property)){a.charAt(0)!="@"&&(e=/^([^@+\/'"*`(;{}-]*);/.exec(m[i]))?(h+=e[0].length-1,b=new f.Anonymous(e[1])):a==="font"?b=w(this.font):b=w(this.value),d=w(this.important);if(b&&w(this.end))return new f.Rule(a,b,d,k);l=h,u()}},"import":function(){var a,b,c=h;if(w(/^@import\s+/)&&(a=w(this.entities.quoted)||w(this.entities.url))){b=w(this.mediaFeatures);if(w(";"))return new f.Import(a,s,b,c)}},mediaFeature:function(){var a=[];do if(e=w(this.entities.keyword))a.push(e);else if(w("(")){p=w(this.property),e=w(this.entity);if(!w(")"))return null;if(p&&e)a.push(new f.Paren(new f.Rule(p,e,null,h,!0)));else{if(!e)return null;a.push(new f.Paren(e))}}while(e);if(a.length>0)return new f.Expression(a)},mediaFeatures:function(){var a,b=[];while(a=w(this.mediaFeature)){b.push(a);if(!w(","))break}return b.length>0?b:null},media:function(){var a;if(w(/^(a)media/)){a=w(this.mediaFeatures);if(rules=w(this.block))return new f.Directive("@media",rules,a)}},directive:function(){var a,b,c,d,e,i;if(g.charAt(h)!=="@")return;if(b=w(this["import"])||w(this.media))return b;if(a=w(/^@page|@keyframes/)||w(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)){d=(w(/^[^{]+/)||"").trim();if(c=w(this.block))return new f.Directive(a+" "+d,c)}else if(a=w(/^@[-a-z]+/))if(a==="@font-face"){if(c=w(this.block))return new f.Directive(a,c)}else if((b=w(this.entity))&&w(";"))return new f.Directive(a,b)},font:function(){var a=[],b=[],c,d,e,g;while(g=w(this.shorthand)||w(this.entity))b.push(g);a.push(new f.Expression(b));if(w(","))while(g=w(this.expression)){a.push(g);if(!w(","))break}return new f.Value(a)},value:function(){var a,b=[],c;while(a=w(this.expression)){b.push(a);if(!w(","))break}if(b.length>0)return new f.Value(b)},important:function(){if(g.charAt(h)==="!")return w(/^! *important/)},sub:function(){var a;if(w("(")&&(a=w(this.expression))&&w(")"))return a},multiplication:function(){var a,b,c,d;if(a=w(this.operand)){while(!z(/^\/\*/)&&(c=w("/")||w("*"))&&(b=w(this.operand)))d=new f.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,b,c,d;if(a=w(this.multiplication)){while((c=w(/^[-+]\s+/)||g.charAt(h-1)!=" "&&(w("+")||w("-")))&&(b=w(this.multiplication)))d=new f.Operation(c,[d||a,b]);return d||a}},conditions:function(){var a,b,c=h,d;if(a=w(this.condition)){while(w(",")&&(b=w(this.condition)))d=new f.Condition("or",d||a,b,c);return d||a}},condition:function(){var a,b,c,d,e=h,g=!1;w(/^not/)&&(g=!0),x("(");if(a=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))return(d=w(/^(?:>=|=<|[<=>])/))?(b=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))?c=new f.Condition(d,a,b,e,g):y("expected expression"):c=new f.Condition("=",a,new f.Keyword("true"),e,g),x(")"),w(/^and/)?new f.Condition("and",c,w(this.condition)):c},operand:function(){var a,b=g.charAt(h+1);g.charAt(h)==="-"&&(b==="@"||b==="(")&&(a=w("-"));var c=w(this.sub)||w(this.entities.dimension)||w(this.entities.color)||w(this.entities.variable)||w(this.entities.call);return a?new f.Operation("*",[new f.Dimension(-1),c]):c},expression:function(){var a,b,c=[],d;while(a=w(this.addition)||w(this.entity))c.push(a);if(c.length>0)return new f.Expression(c)},property:function(){var a;if(a=w(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}};if(d.mode==="browser"||d.mode==="rhino")d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),o({href:a,title:a,type:d.mime},c,!0)};(function(a){function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function d(a){return Math.min(1,Math.max(0,a))}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){return a=a<0?a+1:a>1?a-1:a,a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();return e.s+=c.value/100,e.s=d(e.s),b(e)},desaturate:function(a,c){var e=a.toHSL();return e.s-=c.value/100,e.s=d(e.s),b(e)},lighten:function(a,c){var e=a.toHSL();return e.l+=c.value/100,e.l=d(e.l),b(e)},darken:function(a,c){var e=a.toHSL();return e.l-=c.value/100,e.l=d(e.l),b(e)},fadein:function(a,c){var e=a.toHSL();return e.a+=c.value/100,e.a=d(e.a),b(e)},fadeout:function(a,c){var e=a.toHSL();return e.a-=c.value/100,e.a=d(e.a),b(e)},fade:function(a,c){var e=a.toHSL();return e.a=c.value/100,e.a=d(e.a),b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;return d.h=e<0?360+e:e,b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});return d=d.replace(/%%/g,"%"),new a.Quoted('"'+d+'"',d)},round:function(a){return this._math("round",a)},ceil:function(a){return this._math("ceil",a)},floor:function(a){return this._math("floor",a)},_math:function(b,d){if(d instanceof a.Dimension)return new a.Dimension(Math[b](c(d)),d.unit);if(typeof d=="number")return Math[b](d);throw{type:"Argument",message:"argument must be a number"}},argb:function(b){return new a.Anonymous(b.toARGB())},percentage:function(b){return new a.Dimension(b.value*100,"%")},color:function(b){if(b instanceof a.Quoted)return new a.Color(b.value.slice(1));throw{type:"Argument",message:"argument must be a string"}},iscolor:function(b){return this._isa(b,a.Color)},isnumber:function(b){return this._isa(b,a.Dimension)},isstring:function(b){return this._isa(b,a.Quoted)},iskeyword:function(b){return this._isa(b,a.Keyword)},isurl:function(b){return this._isa(b,a.URL)},ispixel:function(b){return b instanceof a.Dimension&&b.unit==="px"?a.True:a.False},ispercentage:function(b){return b instanceof a.Dimension&&b.unit==="%"?a.True:a.False},isem:function(b){return b instanceof a.Dimension&&b.unit==="em"?a.True:a.False},_isa:function(b,c){return b instanceof c?a.True:a.False}}})(c("./tree")),function(a){a.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}}(c("./tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Assignment=function(a,b){this.key=a,this.value=b},a.Assignment.prototype={toCSS:function(){return this.key+"="+(this.value.toCSS?this.value.toCSS():this.value)},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Call=function(a,b,c,d){this.name=a,this.args=b,this.index=c,this.filename=d},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{type:d.type||"Runtime",message:"error evaluating function `"+this.name+"`"+(d.message?": "+d.message:""),index:this.index,filename:this.filename}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("../tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}},toARGB:function(){var a=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+a.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")}}}(c("../tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Condition=function(a,b,c,d,e){this.op=a.trim(),this.lvalue=b,this.rvalue=c,this.index=d,this.negate=e},a.Condition.prototype.eval=function(a){var b=this.lvalue.eval(a),c=this.rvalue.eval(a),d=this.index,e,e=function(a){switch(a){case"and":return b&&c;case"or":return b||c;default:if(b.compare)e=b.compare(c);else{if(!c.compare)throw{type:"Type",message:"Unable to perform comparison",index:d};e=c.compare(b)}switch(e){case-1:return a==="<"||a==="=<";case 0:return a==="="||a===">="||a==="=<";case 1:return a===">"||a===">="}}}(this.op);return this.negate?!e:e}}(c("../tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)},compare:function(b){return b instanceof a.Dimension?b.value>this.value?-1:b.value<this.value?1:0:-1}}}(c("../tree")),function(a){a.Directive=function(b,c,d){this.name=b,this.features=d&&new a.Value(d),Array.isArray(c)?(this.ruleset=new a.Ruleset([],c),this.ruleset.allowImports=!0):this.value=c},a.Directive.prototype={toCSS:function(a,b){var c=this.features?" "+this.features.toCSS(b):"";return this.ruleset?(this.ruleset.root=!0,this.name+c+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")):this.name+" "+this.value.toCSS()+";\n"},eval:function(a){return this.features=this.features&&this.features.eval(a),a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift(),this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("../tree")),function(a){a.Element=function(b,c,d){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),typeof c=="string"?this.value=c.trim():c?this.value=c:this.value="",this.index=d},a.Element.prototype.eval=function(b){return new a.Element(this.combinator,this.value.eval?this.value.eval(b):this.value,this.index)},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+(this.value.toCSS?this.value.toCSS(a):this.value)},a.Combinator=function(a){a===" "?this.value=" ":a==="& "?this.value="& ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"","& ":" ",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS?b.toCSS(a):""}).join(" ")}}}(c("../tree")),function(a){a.Import=function(b,c,d,e){var f=this;this.index=e,this._path=b,this.features=d&&new a.Value(d),b instanceof a.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css(\?.*)?$/.test(this.path),this.css||c.push(this.path,function(b,c){b&&(b.index=e),f.root=c||new a.Ruleset([],[])})},a.Import.prototype={toCSS:function(a){var b=this.features?" "+this.features.toCSS(a):"";return this.css?"@import "+this._path.toCSS()+b+";\n":""},eval:function(b){var c,d=this.features&&this.features.eval(b);if(this.css)return this;c=new a.Ruleset([],this.root.rules.slice(0));for(var e=0;e<c.rules.length;e++)c.rules[e]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[e,1].concat(c.rules[e].eval(b)));return this.features?new a.Directive("@media",c.rules,this.features.value):c.rules}}}(c("../tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+
+f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("../tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value},compare:function(b){return b instanceof a.Keyword?b.value===this.value?0:1:-1}},a.True=new a.Keyword("true"),a.False=new a.Keyword("false")}(c("../tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d,e,f){this.selector=new a.Selector(b),this.arguments=c,this.index=d,this.filename=e,this.important=f},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments,this.important).rules),e=!0}catch(h){throw{message:h.message,index:h.index,filename:this.filename,stack:h.stack,call:this.index}}if(e)return d;throw{type:"Runtime",message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index,filename:this.filename}}throw{type:"Name",message:this.selector.toCSS().trim()+" is undefined",index:this.index,filename:this.filename}}},a.mixin.Definition=function(b,c,d,e){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.condition=e,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},evalParams:function(b,c){var d=new a.Ruleset(null,[]);for(var e=0,f;e<this.params.length;e++)if(this.params[e].name){if(!(f=c&&c[e]||this.params[e].value))throw{type:"Runtime",message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};d.rules.unshift(new a.Rule(this.params[e].name,f.eval(b)))}return d},eval:function(b,c,d){var e=this.evalParams(b,c),f,g=[],h;for(var i=0;i<Math.max(this.params.length,c&&c.length);i++)g.push(c[i]||this.params[i].value);return e.rules.unshift(new a.Rule("@arguments",(new a.Expression(g)).eval(b))),h=d?this.rules.map(function(b){return new a.Rule(b.name,b.value,"!important",b.index)}):this.rules.slice(0),(new a.Ruleset(null,h)).eval({frames:[this,e].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d,e;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;if(this.condition&&!this.condition.eval({frames:[this.evalParams(b,a)].concat(b.frames)}))return!1;d=Math.min(c,this.arity);for(var f=0;f<d;f++)if(!this.params[f].name&&a[f].eval(b).toCSS()!=this.params[f].value.eval(b).toCSS())return!1;return!0}}}(c("../tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color){if(this.op!=="*"&&this.op!=="+")throw{name:"OperationError",message:"Can't substract or divide a color from a number"};e=d,d=c,c=e}return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("../tree")),function(a){a.Paren=function(a){this.value=a},a.Paren.prototype={toCSS:function(a){return"("+this.value.toCSS(a)+")"},eval:function(b){return new a.Paren(this.value.eval(b))}}}(c("../tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return"value"in f?f.value:f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("../tree")),function(a){a.Rule=function(b,c,d,e,f){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,this.inline=f||!1,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+(this.inline?"":";")},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index,this.inline)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("../tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=this.selectors&&this.selectors.map(function(a){return a.eval(b)}),d=new a.Ruleset(c,this.rules.slice(0));d.root=this.root,d.allowImports=this.allowImports,b.frames.unshift(d);if(d.root||d.allowImports)for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.Import&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Definition&&(d.rules[e].frames=b.frames.slice(0));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Call&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0,f;e<d.rules.length;e++)f=d.rules[e],f instanceof a.mixin.Definition||(d.rules[e]=f.eval?f.eval(b):f);return b.frames.shift(),d},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){return c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c),b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();return g in this._lookups?this._lookups[g]:(this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>e.selectors[g].elements.length?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}}),this._lookups[g]=d)},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j<this.rules.length;j++)i=this.rules[j],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());return f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f),d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e=[],f=[],g=[],h=[],i=!1,j;for(var k=0;k<d.elements.length;k++)j=d.elements[k],j.combinator.value.charAt(0)==="&"&&(i=!0),i?h.push(j):g.push(j);i||(h=g,g=[]),g.length>0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l<c.length;l++)b.push(e.concat(c[l]).concat(f))}}}(c("../tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){var b=this.elements.length,c=a.elements.length,d=Math.min(b,c);if(b<c)return!1;for(var e=0;e<d;e++)if(this.elements[e].value!==a.elements[e].value)return!1;return!0},a.Selector.prototype.eval=function(b){return new a.Selector(this.elements.map(function(a){return a.eval(b)}))},a.Selector.prototype.toCSS=function(a){return this._css?this._css:this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("../tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(typeof a!="undefined"&&!/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(b.value)&&c.length>0&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("../tree")),function(a){a.Variable=function(a,b,c){this.name=a,this.index=b,this.file=c},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{type:"Name",message:"variable "+e+" is undefined",filename:this.file,index:this.index}}}}(c("../tree")),function(a){a.find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},a.jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)}}(c("./tree"));var g=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||g?"development":"production"),d.async=!1,d.poll=d.poll||(g?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&n(function(a,b,c,d,e){b&&r(b.toCSS(),d,e.lastModified)})},d.poll)):d.optimization=3;var h;try{h=typeof a.localStorage=="undefined"?null:a.localStorage}catch(i){h=null}var j=document.getElementsByTagName("link"),k=/^text\/(x-)?less$/;d.sheets=[];for(var l=0;l<j.length;l++)(j[l].rel==="stylesheet/less"||j[l].rel.match(/stylesheet/)&&j[l].type.match(k))&&d.sheets.push(j[l]);d.refresh=function(a){var b,c;b=c=new Date,n(function(a,d,e,f,g){g.local?v("loading "+f.href+" from cache."):(v("parsed "+f.href+" successfully."),r(d.toCSS(),f,g.lastModified)),v("css for "+f.href+" generated in "+(new Date-c)+"ms"),g.remaining===0&&v("css generated in "+(new Date-b)+"ms"),c=new Date},a),m()},d.refreshStyles=m,d.refresh(d.env==="development")})(window);
\ No newline at end of file
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/pom.xml 2012-04-23 13:11:43 UTC (rev 135)
@@ -19,7 +19,7 @@
<modules>
<module>chorem-entities</module>
- <module>chorem-web</module>
+ <module>chorem-webmotion</module>
</modules>
<name>chorem</name>
@@ -56,11 +56,13 @@
<platform>chorem.org</platform>
<projectId>chorem</projectId>
- <eugenePluginVersion>2.4.1-SNAPSHOT</eugenePluginVersion>
- <nuitonUtilsVersion>2.3</nuitonUtilsVersion>
- <nuitonWebVersion>1.3</nuitonWebVersion>
+ <opencsvVersion>2.4-SNAPSHOT</opencsvVersion>
+ <processPluginVersion>1.1</processPluginVersion>
+ <eugenePluginVersion>2.4.2</eugenePluginVersion>
+ <nuitonUtilsVersion>2.4.4</nuitonUtilsVersion>
+ <nuitonWebVersion>1.7</nuitonWebVersion>
<nuitonI18nVersion>2.3.1</nuitonI18nVersion>
- <wikittyVersion>3.3-SNAPSHOT</wikittyVersion>
+ <wikittyVersion>3.7-SNAPSHOT</wikittyVersion>
<slf4jVersion>1.6.1</slf4jVersion>
<struts2Version>2.2.3</struts2Version>
<struts2jqueryVersion>3.2.0</struts2jqueryVersion>
@@ -69,6 +71,8 @@
<servletApiVersion>2.5</servletApiVersion>
<jspApiVersion>2.0</jspApiVersion>
<h2Version>1.2.134</h2Version>
+ <webmotionVersion>2.1</webmotionVersion>
+ <jstlVersion>1.2</jstlVersion>
<!-- license to use -->
<license.licenseName>agpl_v3</license.licenseName>
@@ -82,8 +86,33 @@
<dependencies>
<!-- compile dependencies -->
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>11.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.debux.webmotion</groupId>
+ <artifactId>webmotion</artifactId>
+ <version>${webmotionVersion}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>jstl</artifactId>
+ <version>${jstlVersion}</version>
+ <scope>runtime</scope>
+ </dependency>
+
<dependency>
+ <groupId>net.sf.opencsv</groupId>
+ <artifactId>opencsv</artifactId>
+ <version>${opencsvVersion}</version>
+ </dependency>
+
+ <dependency>
<groupId>org.nuiton</groupId>
<artifactId>nuiton-utils</artifactId>
<version>${nuitonUtilsVersion}</version>
@@ -233,7 +262,14 @@
</dependencies>
</plugin>
+ <!-- processor plugin -->
<plugin>
+ <groupId>org.nuiton.processor</groupId>
+ <artifactId>maven-processor-plugin</artifactId>
+ <version>${processPluginVersion}</version>
+ </plugin>
+
+ <plugin>
<groupId>org.nuiton.eugene</groupId>
<artifactId>maven-eugene-plugin</artifactId>
<version>${eugenePluginVersion}</version>
@@ -250,4 +286,27 @@
</build>
+ <repositories>
+
+ <repository>
+ <id>wikitty-group</id>
+ <name>wikitty-group</name>
+ <url>http://nexus.nuiton.org/nexus/content/groups/wikitty/</url>
+ </repository>
+ <repository>
+ <id>debux.repo</id>
+ <name>DebuxRepository</name>
+ <url>http://debux.org/maven/repo</url>
+ </repository>
+ <repository>
+ <id>debux.snapshot</id>
+ <name>DebuxSnapshotRepository</name>
+ <url>http://debux.org/maven/snapshot</url>
+ <snapshots>
+ <enabled>true</enabled>
+ <checksumPolicy>fail</checksumPolicy>
+ </snapshots>
+ </repository>
+ </repositories>
+
</project>
1
0