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(/^@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>