Author: bpoussin Date: 2011-08-18 04:37:38 +0200 (Thu, 18 Aug 2011) New Revision: 306 Url: http://chorem.org/repositories/revision/bow/306 Log: Evolution #438: Refactore source code and simplify all - continuation du nettoyage, le plus gros est fini, et tout semble refonctionner - plus de popup pour l'edition pour l'instant - suppression de tous les fichiers qui ne serve pas - suppression de tous les getTexts et remplacement par _() - suppression de presque toutes les utilisations de request - nettoyage des imports - nettoyage des jsp - ... Removed: trunk/bow-ui/src/main/java/org/chorem/bow/AliasServlet.java trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java trunk/bow-ui/src/main/java/org/chorem/bow/action/OrderAction.java trunk/bow-ui/src/main/webapp/js/jquery-1.5.2.min.js trunk/bow-ui/src/main/webapp/js/jquery-ui-1.8.11.custom.min.js trunk/bow-ui/src/main/webapp/jsp/inc/errorFrame.jsp trunk/bow-ui/src/main/webapp/jsp/inc/popupAddUrl.jsp Modified: trunk/bow-ui/pom.xml trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java trunk/bow-ui/src/main/java/org/chorem/bow/BowConfig.java trunk/bow-ui/src/main/java/org/chorem/bow/BowConfigOption.java trunk/bow-ui/src/main/java/org/chorem/bow/BowMail.java trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/AliasAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/LocaleAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java trunk/bow-ui/src/main/resources/bow.properties trunk/bow-ui/src/main/resources/org/chorem/bow/action/ForgotPasswordAction-validation.xml trunk/bow-ui/src/main/resources/org/chorem/bow/action/LoginAction-validation.xml trunk/bow-ui/src/main/resources/org/chorem/bow/action/RegisterAction-validation.xml trunk/bow-ui/src/main/resources/struts.xml trunk/bow-ui/src/main/webapp/WEB-INF/decorators.xml trunk/bow-ui/src/main/webapp/WEB-INF/decorators/main.jsp trunk/bow-ui/src/main/webapp/css/bookmark.css trunk/bow-ui/src/main/webapp/js/bookmark.js trunk/bow-ui/src/main/webapp/jsp/admin.jsp trunk/bow-ui/src/main/webapp/jsp/editBookmark.jsp trunk/bow-ui/src/main/webapp/jsp/error.jsp trunk/bow-ui/src/main/webapp/jsp/home.jsp trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp trunk/bow-ui/src/main/webapp/jsp/inc/footer.jsp trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp trunk/bow-ui/src/main/webapp/jsp/preferences.jsp trunk/bow-ui/src/main/webapp/jsp/suggestions.jsp trunk/pom.xml Modified: trunk/bow-ui/pom.xml =================================================================== --- trunk/bow-ui/pom.xml 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/pom.xml 2011-08-18 02:37:38 UTC (rev 306) @@ -66,6 +66,11 @@ </dependency> <dependency> + <groupId>com.jgeppert.struts2.jquery</groupId> + <artifactId>struts2-jquery-plugin</artifactId> + </dependency> + + <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <scope>runtime</scope> Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/AliasServlet.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/AliasServlet.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/AliasServlet.java 2011-08-18 02:37:38 UTC (rev 306) @@ -1,99 +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% - */ -package org.chorem.bow; - -import org.apache.commons.lang.StringUtils; -import org.nuiton.wikitty.WikittyProxy; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * TODO poussin 20110216 a revoir avec le ticket http://www.chorem.org/issues/show/295 - * - * @author bbrossaud - * @deprecated transformed to struts action since 0.5 - */ -@Deprecated -public class AliasServlet extends HttpServlet { - - private static final long serialVersionUID = 1L; - protected String bowServletUrl = ""; - - public AliasServlet() { - bowServletUrl = BowConfig.getBowUrl() + BowConfig.getServletBow(); - } - - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - doPost(request, response); - } - - /* @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet error occurs - */ - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - try { - String alias = request.getPathInfo(); - if (!StringUtils.isEmpty(alias)) { - // remove first '/' - alias = alias.substring(1); - BowSession session = BowSession.getBowSession(request); - WikittyProxy proxy = session.getProxy(); - - /*Criteria criteria = Search.query().eq( - BowAlias.FQ_FIELD_BOWALIAS_ALIAS, alias).criteria(); - - BowAlias bowAlias = proxy.findByCriteria(BowAlias.class, criteria); - String bookmarkId; - if (bowAlias == null) { - bookmarkId = alias; - } else { - bookmarkId = bowAlias.getBowBookmark(); - } - BowBookmark bookmark = proxy.restore(BowBookmark.class, bookmarkId); - if (bookmark != null) { - String redirect = bookmark.getLink(); - int clicks = bookmark.getClick() + 1; - bookmark.setClick(clicks); - proxy.store(bookmark); - response.sendRedirect(redirect); - } else { - response.sendRedirect(bowServletUrl); - }*/ - } else { - response.sendRedirect(bowServletUrl); - } - } catch (Exception eee) { - request.getRequestDispatcher("error.jsp").forward(request, response); - } - } -} Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkActions.java 2011-08-18 02:37:38 UTC (rev 306) @@ -1,194 +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% - */ -package org.chorem.bow; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -import org.apache.commons.lang.StringUtils; -import org.nuiton.util.StringUtil; -import org.nuiton.wikitty.search.FacetTopic; -import org.nuiton.wikitty.search.PagedResult; - -/** - * - * @author bbrossaud - */ -public class BookmarkActions { - - protected String fullTextLine = ""; - protected List<BowBookmark> bookmarks = new ArrayList<BowBookmark>(); // bookmarks which contain the search tags - protected List<BowBookmark> lastBookmarks = new ArrayList<BowBookmark>(); - protected List<FacetTopic> tagsCloud = new ArrayList<FacetTopic>(); // associate a tag with its frequency - protected List<String> tagsSearch = new ArrayList<String>(); // contains the tags taped in the search field - protected int tmax = -1; - protected int tmin = -1; - - public BookmarkActions() { - } - - public BookmarkActions(PagedResult<BowBookmark> booklist) { - List<FacetTopic> topics = booklist.getTopic(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS); - } - - public void createTagCloud(List<FacetTopic> cpy) { - setTagCloud(cpy); - deleteTagBySearch(); - defineTValues(); - } - - public void setTagCloud(List<FacetTopic> cpy) { - if (cpy != null) { - tagsCloud = new ArrayList<FacetTopic>(cpy); - } - } - - public void deleteTagBySearch() { - List<FacetTopic> save = new ArrayList<FacetTopic>(tagsCloud); - for (FacetTopic topic : save) { - String name = topic.getTopicName(); - if (tagsSearch.contains(name)) { - tagsCloud.remove(topic); - } - } - } - - protected void defineTValues() { - tmax = -1; // correspond to the most tag frequency in the tag cloud - tmin = -1; // correspond to the less tag frequency in the tag cloud - for (FacetTopic tag : tagsCloud) { - int value = tag.getCount(); - if (tmax < value) { // search the most tag frequancy - tmax = value; - } - if (tmin == -1) { - tmin = value; - } else if (tmin > value) { // search less tag frequency - tmin = value; - } - } - } - - public void addTags(String str) { - List<String> tags = BowUtils.getWords(str); - for (String tag : tags) { - if (!tagsSearch.contains(tag)) { - tagsSearch.add(tag); - } - } - } - - public void emptySearchline() { - List<BowBookmark> bookmarkList = new ArrayList<BowBookmark>(bookmarks); - for (BowBookmark bookmark : bookmarkList) { - Set<String> tags = bookmark.getLabels(); - if (tags != null && !tags.isEmpty()) { - bookmarks.remove(bookmark); - } - } - } - - public void reset() { - bookmarks.clear(); - tagsCloud.clear(); - tagsSearch.clear(); - tmax = -1; - tmin = -1; - } - - public void setFullTextLine(String line) { - if (line == null) { - fullTextLine = ""; - } else { - fullTextLine = line; - } - } - - public void setBookmarks(List<BowBookmark> bookmarksList) { - List<BowBookmark> newList = new ArrayList<BowBookmark>(bookmarksList); - bookmarks = newList; - } - - public void setLastBookmarks(List<BowBookmark> bookmarksList) { - List<BowBookmark> newList = new ArrayList<BowBookmark>(bookmarksList); - lastBookmarks = newList; - } - - public void setTagSearch(List<String> cpy) { - tagsSearch = new ArrayList<String>(); - if (cpy != null) { - tagsSearch.addAll(cpy); - } - } - - public String getSearchLine() { - if (tagsSearch != null) { - return StringUtil.join(tagsSearch, " ", true); // return the search line created with the tags - } - return StringUtils.EMPTY; - } - - public int getFont(int ti) { - int font = 1; - if (tmax > tmin) { - font = 30 * (ti - tmin) / (tmax - tmin); // get the font size for a tag frequency - } - if (font < 10) { - font = 10; - } - return font; - } - - public List<FacetTopic> getTagsCloud() { - return tagsCloud; - } - - public List<String> getTagsSearch() { - return tagsSearch; - } - - public List<BowBookmark> getBookmarks() { - return bookmarks; - } - - public List<BowBookmark> getLastBookmarks() { - return lastBookmarks; - } - - public int getTmin() { - return tmin; - } - - public int getTmax() { - return tmax; - } - - public String getFullTextLine() { - if (fullTextLine == null) { - return StringUtils.EMPTY; - } - return fullTextLine; - } -} Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/BookmarkUtils.java 2011-08-18 02:37:38 UTC (rev 306) @@ -32,8 +32,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.http.HttpServletRequest; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; @@ -42,7 +40,6 @@ import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.search.FacetTopic; -import org.nuiton.wikitty.search.PagedResult; import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.search.operators.Element; import org.nuiton.wikitty.search.Search; @@ -121,33 +118,7 @@ return criteria; } - static public BookmarkActions createBookmarkActions(HttpServletRequest request, - PagedResult<BowBookmark> result, String searchLine) { - String fullText = request.getParameter("fullTextLine"); - BookmarkActions bookmarkActions = new BookmarkActions(); - bookmarkActions.setFullTextLine(fullText); - List<BowBookmark> bookList = result.getAll(); - - if (bookList != null) { - bookmarkActions.setBookmarks(bookList); - } - if (fullText == null || fullText.isEmpty()) { - if (StringUtils.isEmpty(searchLine)) { - bookmarkActions.emptySearchline(); - } else { - bookmarkActions.addTags(searchLine); //Adds the new tags - } - } - List<FacetTopic> topics = result.getTopic(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS); - if (log.isDebugEnabled()) { - log.debug(String.format("There are %s tag in cloud", CollectionUtils.isEmpty(topics)?0:topics.size())); - } - bookmarkActions.createTagCloud(topics); - return bookmarkActions; - } - - static public Map<String, Integer> getBookmarksByImportDate(HttpServletRequest request, BowUser user) throws ParseException { - BowSession session = BowSession.getBowSession(request); + static public Map<String, Integer> getBookmarksByImportDate(BowSession session, BowUser user) throws ParseException { WikittyProxy proxy = session.getProxy(); Criteria criteria = Search.query() .eq(Element.ELT_EXTENSION, BowImport.EXT_BOWIMPORT) Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowConfig.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/BowConfig.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/BowConfig.java 2011-08-18 02:37:38 UTC (rev 306) @@ -23,8 +23,6 @@ */ package org.chorem.bow; -import static org.nuiton.i18n.I18n._; - import org.apache.commons.lang.UnhandledException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -148,70 +146,6 @@ } /** - * Get bow servlet as string. - * Default bow applicationConfig will be used - * - * @return servlet name - */ - public static String getServletBow() { - return getServletBow(getConfig()); - } - - /** - * Get bow servlet as string. - * - * @param config bow configuration - * @return servlet name - */ - public static String getServletBow(ApplicationConfig config) { - return config.getOption(BowConfigOption.SERVLET_BOW.key); - } - - /** - * Get alias servlet as string. - * Default bow applicationConfig will be used - * - * @return servlet name - */ - public static String getServletAlias() { - return getServletAlias(getConfig()); - } - - /** - * Get alias servlet as string. - * - * @param config bow configuration - * @return servlet name - */ - public static String getServletAlias(ApplicationConfig config) { - return config.getOption(BowConfigOption.SERVLET_ALIAS.key); - } - - /** - * Get alias servlet url as string. - * Default bow applicationConfig will be used - * - * @return servlet name - */ - public static String getServletAliasUrl() { - return getServletAliasUrl(getConfig()); - } - - /** - * Get alias servlet url as string. - * - * @param config bow configuration - * @return servlet name - */ - public static String getServletAliasUrl(ApplicationConfig config) { - String result = getAliasUrl(config) + getServletAlias(config); - if (result != null && result.charAt(result.length() - 1) != '/') { - result += '/'; - } - return result; - } - - /** * Get bow smtp server as string. * Default bow applicationConfig will be used * Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowConfigOption.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/BowConfigOption.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/BowConfigOption.java 2011-08-18 02:37:38 UTC (rev 306) @@ -49,15 +49,6 @@ "alias.url", _("bow.config.alias.url.description"), "alias/", String.class, false, false), - SERVLET_BOW( - "servlet.bow", - _("bow.config.servlet.bow.description"), - null, String.class, false, false), - // For apache url rewriting - SERVLET_ALIAS( - "servlet.alias", - _("bow.config.servlet.bow.description"), - null, String.class, false, false), SEARCH_ENGINE( "search.engine", _("bow.config.search.engine.description"), Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowMail.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/BowMail.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/BowMail.java 2011-08-18 02:37:38 UTC (rev 306) @@ -23,8 +23,6 @@ */ package org.chorem.bow; -import org.nuiton.util.ApplicationConfig; - import java.util.Properties; import javax.mail.Message; Modified: trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/BowUtils.java 2011-08-18 02:37:38 UTC (rev 306) @@ -84,16 +84,18 @@ */ static public String redirectTo(String searchLine, String fullTextLine) { String result = "home.action"; + boolean searchLineNotBlank = StringUtils.isNotBlank(searchLine); + boolean fullTextLineNotBlank = StringUtils.isNotBlank(fullTextLine); - if (!StringUtils.isEmpty(searchLine) || !StringUtils.isEmpty(fullTextLine)) { - result = "search.action?"; - if (searchLine != null) { + if (searchLineNotBlank || fullTextLineNotBlank) { + result += "?"; + if (searchLineNotBlank) { result += "searchLine=" + searchLine; } - if (searchLine != null && fullTextLine != null) { + if (searchLineNotBlank && fullTextLineNotBlank) { result += "&"; } - if (fullTextLine != null) { + if (fullTextLineNotBlank) { result += "fullTextLine=" + fullTextLine; } } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/AddUrlAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -28,7 +28,6 @@ import org.chorem.bow.BowBookmark; import org.chorem.bow.BowUser; import org.chorem.bow.BowUtils; -import static org.nuiton.i18n.I18n.n_; import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.search.PagedResult; @@ -52,8 +51,6 @@ protected String tags; protected String nameAndTags; protected String redirectTo; - protected String searchLine = ""; - protected String fullTextLine = ""; public String getBookmarkId() { return bookmarkId; @@ -148,34 +145,6 @@ return redirectTo; } - /** - * @return the searchLine - */ - public String getSearchLine() { - return searchLine; - } - - /** - * @param searchLine the searchLine to set - */ - public void setSearchLine(String searchLine) { - this.searchLine = searchLine; - } - - /** - * @return the fullTextLine - */ - public String getFullTextLine() { - return fullTextLine; - } - - /** - * @param fullTextLine the fullTextLine to set - */ - public void setFullTextLine(String fullTextLine) { - this.fullTextLine = fullTextLine; - } - public String execute() { try { WikittyProxy proxy = getBowProxy(); @@ -184,7 +153,7 @@ BowUser user = getBowSession().getUser(); String userId = user.getWikittyId(); - if (bookmarkId != null && !StringUtils.isEmpty(bookmarkId)) { + if (StringUtils.isNotBlank(bookmarkId)) { bookmarkToModify = proxy.restore(BowBookmark.class, bookmarkId); } if (log.isDebugEnabled()) { @@ -198,13 +167,13 @@ // TODO sletellier 20110416 : return error message when public or private alias is already used Criteria privateAliasCriteria = null; Criteria publicAliasCriteria = null; - if (privateAlias != null && !privateAlias.isEmpty()) { + if (StringUtils.isNotEmpty(privateAlias)) { privateAliasCriteria = Search.query() .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_PRIVATEALIAS, privateAlias) .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId) .criteria().setEndIndex(0); } - if (publicAlias != null && !publicAlias.isEmpty()) { + if (StringUtils.isNotEmpty(publicAlias)) { publicAliasCriteria = Search.query() .eq(BowBookmark.FQ_FIELD_BOWBOOKMARK_PUBLICALIAS, publicAlias) .criteria().setEndIndex(0); @@ -278,15 +247,15 @@ if (bookmark != null || bookmarkToModify != null) { proxy.store(bookmark, bookmarkToModify); //Stores the bookmark if everything is ok - addActionMessage(getText(n_("bow.bookmark.add.successful"))); + addActionMessage(_("bow.bookmark.add.successful")); if (log.isDebugEnabled()) { log.debug("Adding URL"); } } redirectTo = BowUtils.redirectTo(searchLine, fullTextLine); - } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); - log.error(e.getMessage(), e); + } catch (Exception eee) { + addActionError(_("bow.error.internal")); + log.error(eee.getMessage(), eee); } return SUCCESS; } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/AliasAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/AliasAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/AliasAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -27,7 +27,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.chorem.bow.BowBookmark; -import static org.nuiton.i18n.I18n.n_; import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.search.Search; @@ -91,7 +90,7 @@ } } } catch (Exception eee) { - addActionError(getText(n_("bow.error.internal"))); + addActionError(_("bow.error.internal")); log.error(eee.getMessage(), eee); result = ERROR; } @@ -109,7 +108,7 @@ BowBookmark bookmark = proxy.findByCriteria(BowBookmark.class, criteria); if (bookmark != null) { - addActionError(getText(n_("bow.alias.already.exists"), new String[]{alias})); + addActionError(_("bow.alias.already.exists", alias)); log.error("A bookmark already exists with alias " + alias); result = ERROR; @@ -119,14 +118,14 @@ bookmark.setPublicAlias(alias); proxy.store(bookmark); } else { - addActionError(getText(n_("bow.alias.bookmarkId.unknown"), new String[]{bookmarkId})); + addActionError(_("bow.alias.bookmarkId.unknown", bookmarkId)); log.debug("No bookmark with id " + bookmarkId); result = ERROR; } } } } catch (Exception eee) { - addActionError(getText(n_("bow.error.internal"))); + addActionError(_("bow.error.internal")); log.error(eee.getMessage(), eee); result = ERROR; } @@ -145,12 +144,12 @@ bookmark.setPublicAlias(null); proxy.store(bookmark); } else { - addActionError(getText(n_("bow.alias.bookmarkId.unknown"), new String[]{bookmarkId})); + addActionError(_("bow.alias.bookmarkId.unknown", bookmarkId)); log.error("No bookmark with id " + bookmarkId); result = ERROR; } } catch (Exception eee) { - addActionError(getText(n_("bow.error.internal"))); + addActionError(_("bow.error.internal")); log.error(eee.getMessage(), eee); result = ERROR; } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteImportAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -32,7 +32,6 @@ import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.search.Search; -import static org.nuiton.i18n.I18n.n_; /** * Supprime un import de bookmark @@ -76,10 +75,10 @@ proxy.delete(bookmarks); - addActionMessage(getText(n_("bow.bookmark.import.delete.successful"))); + addActionMessage(_("bow.bookmark.import.delete.successful")); } } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); + addActionError(_("bow.error.internal")); log.error(e.getMessage(), e); } return SUCCESS; Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -23,23 +23,16 @@ */ package org.chorem.bow.action; -import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; -import org.chorem.bow.BowBookmark; import org.chorem.bow.BookmarkUtils; import org.chorem.bow.BowPreference; import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.WikittyProxy; -import org.nuiton.wikitty.search.Search; -import static org.nuiton.i18n.I18n.n_; - /** - * Supprime des bookmarks qui satisfont le critere de recherche. Si fullTextLine - * est non vide, alors elle est utilisee, pour la recherche, sinon on utilise - * searchLine + * Supprime des bookmarks qui satisfont le critere de recherche. * * @author poussin */ @@ -55,18 +48,26 @@ if (StringUtils.isNotBlank(searchLine) || StringUtils.isNotBlank(fullTextLine)) { BowPreference user = getBowSession().getPreference(); + // FIXME poussin 20110817 ATTENTION, la recherche remonte + // potentiellement des bookmarks qui ne nous appartiennent pas, + // dans ce cas, ne faudrait-il pas seulement ce supprimer des + // reader/write/admin ? Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser( user, searchLine, fullTextLine, null); WikittyProxy proxy = getBowProxy(); List<String> ids = proxy.findAllIdByCriteria(criteria).getAll(); + if (log.isDebugEnabled()) { + log.debug("Will delete " + ids.size() + " bookmarks"); + } + proxy.delete(ids); - addActionMessage(getText(n_("bow.search.results.deleted"))); + addActionMessage(_("bow.search.results.deleted")); } - } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); - log.error(e.getMessage(), e); + } catch (Exception eee) { + addActionError(_("bow.error.internal")); + log.error(eee.getMessage(), eee); } return SUCCESS; } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/EditBookmarkAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -30,8 +30,6 @@ import org.nuiton.wikitty.search.Search; import org.nuiton.wikitty.search.operators.Element; -import static org.nuiton.i18n.I18n.n_; - /** * Load a bookmark to display it on modification page, used when javascript * is not available on client @@ -66,11 +64,11 @@ try { WikittyProxy proxy = getBowProxy(); Criteria criteria = Search.query() - .eq(Element.ELT_ID, id).criteria(); + .eq(Element.ELT_ID, id).criteria(); bookmark = proxy.findByCriteria(BowBookmark.class, criteria); - } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); - log.error(e.getMessage(), e); + } catch (Exception eee) { + addActionError(_("bow.error.internal")); + log.error(eee.getMessage(), eee); } return SUCCESS; } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -64,6 +64,7 @@ /** * Exports the bookmarks in HTML format */ + @Override public String execute() { WikittyProxy proxy = getBowProxy(); Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -27,6 +27,7 @@ import javax.mail.internet.AddressException; import org.apache.commons.lang.RandomStringUtils; +import org.apache.commons.lang.StringUtils; import org.chorem.bow.BowMail; import org.chorem.bow.BowUser; import org.nuiton.util.StringUtil; @@ -34,8 +35,6 @@ import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.search.Search; -import static org.nuiton.i18n.I18n.n_; - /** * Genere un nouveau mot de passe pour l'utilisateur et lui envoie par mail * TODO poussin 20110211 il faudrait ajouter une securite pour eviter que @@ -64,73 +63,60 @@ this.email = email; } -// protected boolean passwordExists(String password) { -// WikittyProxy proxy = getBowProxy(); -// Criteria criteria = Search.query().eq(User.FQ_FIELD_USER_PASSWORD, password).criteria(); -// List<User> users = proxy.findAllByCriteria(User.class, criteria).getAll(); -// if (users != null && users.size() > 0) { -// return true; -// } -// return false; -// } - /** * Generates a new password and sends it to the user */ + @Override public String execute() { String result = INPUT; try { - if (email != null) { + if (StringUtils.isNotBlank(email)) { email = email.trim(); - if (!email.isEmpty()) { - WikittyProxy proxy = getBowProxy(); - Criteria criteria = Search.query() - .eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria(); - BowUser user = proxy.findByCriteria(BowUser.class, criteria); + WikittyProxy proxy = getBowProxy(); + Criteria criteria = Search.query() + .eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria(); + BowUser user = proxy.findByCriteria(BowUser.class, criteria); - if (user != null) { //If the email address exists - String password = ""; - String md5 = ""; + if (user != null) { //If the email address exists + String password = ""; + String md5 = ""; - password = RandomStringUtils.randomAlphanumeric(20); - md5 = StringUtil.encodeMD5(password); - try { - String mailContent; + password = RandomStringUtils.randomAlphanumeric(20); + md5 = StringUtil.encodeMD5(password); + try { + String mailContent; - mailContent = getText(n_("bow.register.mailHi")) + - ",\n\n" + getText(n_("bow.register.mailPwd")) + ": " + - password + "\n\n" + getText(n_("bow.register.mailEmail")) + - ": " + email + "\n\n"; - BowMail.sendMail(email, - getText(n_("bow.register.mailSubject")), - mailContent); + mailContent = _("bow.register.mailHi") + + ",\n\n" + _("bow.register.mailPwd") + ": " + + password + "\n\n" + _("bow.register.mailEmail") + + ": " + email + "\n\n"; + BowMail.sendMail(email, + _("bow.register.mailSubject"), + mailContent); - //The password is changed only if the mail has been sent - user.setPassword(md5); - proxy.store(user); - } catch (AddressException e) { - //If the email address is invalid - String message = getText("bow.mail.badFormat"); - - addActionError(n_(message)); - log.error(message + " (email:" + email + ")", e); - } catch (MessagingException e) { - String message = getText("bow.mail.sendError"); - - addActionError(n_(message)); - log.error(message + "(" + e.getMessage() + ")", e); - } - result = SUCCESS; - } else { //If the email is not associated with an account - addFieldError("email", - getText(n_("bow.forgotPassword.emailDoesntExist"))); + //The password is changed only if the mail has been sent + user.setPassword(md5); + proxy.store(user); + } catch (AddressException eee) { + //If the email address is invalid + addActionError(_("bow.mail.badFormat")); + log.error(String.format("Can't send message email to '%s'", + email), eee); + } catch (MessagingException eee) { + addActionError("bow.mail.sendError"); + log.error(String.format("Can't send message email to '%s'", + email), eee); } + result = SUCCESS; + } else { //If the email is not associated with an account + addFieldError("email", + _("bow.forgotPassword.emailDoesntExist")); } } - } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); - log.error(e.getMessage(), e); + } catch (Exception eee) { + addActionError(_("bow.error.internal")); + log.error(eee.getMessage(), eee); } return result; } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/GenerateTokenAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -27,8 +27,6 @@ import org.chorem.bow.BowUtils; import org.nuiton.wikitty.WikittyProxy; -import static org.nuiton.i18n.I18n.n_; - /** * Force la regeneration de token permanent et temporaire * @@ -41,6 +39,7 @@ /** * Generates a new permanent and temporary token */ + @Override public String execute() { try { BowUser user = getBowSession().getUser(); @@ -52,10 +51,10 @@ String temporaryToken = BowUtils.generateToken(); getBowSession().setTemporaryToken(temporaryToken); - addActionMessage(getText(n_("bow.token.generate.successful"))); - } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); - log.error(e.getMessage(), e); + addActionMessage(_("bow.token.generate.successful")); + } catch (Exception eee) { + addActionError(_("bow.error.internal")); + log.error(eee.getMessage(), eee); } return SUCCESS; } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/HomeAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -30,20 +30,10 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.struts2.interceptor.ServletRequestAware; -import org.chorem.bow.BookmarkUtils; -import org.chorem.bow.BowBookmark; -import org.chorem.bow.BowConfig; -import org.chorem.bow.BowPreference; import org.chorem.bow.BowSearchResult; import org.chorem.bow.BowSession; import org.nuiton.util.TimeLog; -import org.nuiton.wikitty.WikittyProxy; -import org.nuiton.wikitty.search.Criteria; -import org.nuiton.wikitty.search.PagedResult; -import static org.nuiton.i18n.I18n.n_; - /** * Prepare l'affichage de la page d'accueil * @@ -120,7 +110,7 @@ BowSession s = getBowSession(); searchResult = new BowSearchResult(s, searchLine, fullTextLine, order); } catch (Exception eee) { - addActionError(getText(n_("bow.error.internal"))); + addActionError(_("bow.error.internal")); log.error(eee.getMessage(), eee); } timeLog.log(start, "execute"); Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -30,7 +30,6 @@ import java.util.Date; import java.util.List; -import org.apache.struts2.interceptor.ServletRequestAware; import org.chorem.bow.BookmarkUtils; import org.chorem.bow.BowBookmark; import org.chorem.bow.BowImportHelper; @@ -44,15 +43,12 @@ import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.entities.Wikitty; -import static org.nuiton.i18n.I18n.n_; - /** * Import un bookmark HTML * * @author poussin */ -public class ImportBookmarksAction extends PreferencesAction implements - ServletRequestAware { +public class ImportBookmarksAction extends PreferencesAction { private static final long serialVersionUID = -5962680416570797028L; @@ -154,6 +150,7 @@ } } + @Override public String execute() { log.info("Importing boormarks : " + upfile); @@ -174,33 +171,23 @@ new ArrayList<String>()); proxy.store(bookmarks); -// redirectTo = BowUtils.redirectTo(searchLine, fullTextLine); -// if (StringUtils.isEmpty(searchLine)) { -// BowInit.initHomePage(request, user); -// } else { -// BowSearch.search(request, user); -// } - addActionMessage(getText(n_("bow.bookmark.import.successful"))); + addActionMessage(_("bow.bookmark.import.successful")); } catch (ParserException eee) { - log.error(String.format("Can't parse imported file '%s'", getUpfileFileName()), eee); - addActionError(getText(n_("bow.bookmark.badFileFormat"))); - -// if (searchLine == null || searchLine.isEmpty()) { -// BowInit.initHomePage(request, user); -// } else { -// BowSearch.search(request, user); -// } + log.error(String.format("Can't parse imported file '%s'", + getUpfileFileName()), eee); + addActionError(_("bow.bookmark.badFileFormat")); } catch (IOException eee) { - log.error(String.format("Can't read imported file '%s'", getUpfileFileName()), eee); - addActionError(getText(n_("bow.error.internal"))); + log.error(String.format("Can't read imported file '%s'", + getUpfileFileName()), eee); + addActionError(_("bow.error.internal")); return ERROR; } } else { - addActionError(getText(n_("bow.bookmark.badFileFormat"))); + addActionError(_("bow.bookmark.badFileFormat")); return ERROR; } } catch (Exception eee) { - addActionError(getText(n_("bow.error.internal"))); + addActionError(_("bow.error.internal")); log.error(eee.getMessage(), eee); return ERROR; } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/LocaleAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/LocaleAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/LocaleAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -26,7 +26,8 @@ public class LocaleAction extends BowBaseAction { private static final long serialVersionUID = 9124549040894568467L; + @Override public String execute() { - return SUCCESS; + return SUCCESS; } } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/LoginAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -24,9 +24,8 @@ package org.chorem.bow.action; -import javax.servlet.http.HttpServletRequest; +import org.apache.commons.lang.StringUtils; -import org.apache.struts2.interceptor.ServletRequestAware; import org.chorem.bow.BowConfig; import org.chorem.bow.BowUser; import org.chorem.bow.BowUserImpl; @@ -35,18 +34,17 @@ import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.search.Search; -import static org.nuiton.i18n.I18n.n_; - /** * authentifie l'utilisateur et place son objet User dans la bow session * * @author poussin */ -public class LoginAction extends BowBaseAction implements ServletRequestAware { +public class LoginAction extends BowBaseAction { + private static final long serialVersionUID = 6891064800288772246L; + protected String email; protected String password; - protected HttpServletRequest servletRequest; public String getEmail() { return email; @@ -64,44 +62,37 @@ this.password = password; } - @Override - public void setServletRequest(HttpServletRequest request) { - this.servletRequest = request; - } - /** * Check password in solr index, if fail try to check password admin in config file - * - * @param email - * @param password + * + * @param email non null et non vide email + * @param password non null et non vide email * @return */ protected BowUser checkLogin(String email, String password) { BowUser result = null; - if (email != null && password != null) { - if (!email.isEmpty() && !password.equals(StringUtil.encodeMD5(""))) { - WikittyProxy proxy = getBowProxy(); - Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email). - eq(BowUser.FQ_FIELD_WIKITTYUSER_PASSWORD, password).criteria(); - result = proxy.findByCriteria(BowUser.class, criteria); - if (result == null) { - // failback: try to authenticate admin with config info - String configPassword = BowConfig.getAdminPassword(email); - log.info("failback password: " + password + " configPassword: " + configPassword); - if (password.equals(configPassword)) { - // admin authenticate with config, this is possible when - // solr index is corrupted or missed. Admin must go to admin - // page en recreate index - result = new BowUserImpl(); - result.setLogin(email); - result.setPassword(configPassword); - addActionMessage(getText(n_("bow.login.admin.failback"))); - log.warn(getText(n_("bow.login.admin.failback"))); - } else { - addActionError(getText(n_("bow.login.authenticationFailure"))); - } - } + WikittyProxy proxy = getBowProxy(); + Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email). + eq(BowUser.FQ_FIELD_WIKITTYUSER_PASSWORD, password).criteria(); + result = proxy.findByCriteria(BowUser.class, criteria); + + if (result == null) { + // failback: try to authenticate admin with config info + String configPassword = BowConfig.getAdminPassword(email); + log.info(String.format("failback password: '%s' configPassword: '%s'", + password, configPassword)); + if (password.equals(configPassword)) { + // admin authenticate with config, this is possible when + // solr index is corrupted or missed. Admin must go to admin + // page en recreate index + result = new BowUserImpl(); + result.setLogin(email); + result.setPassword(configPassword); + addActionMessage(_("bow.login.admin.failback")); + log.warn(_("bow.login.admin.failback")); + } else { + addActionError(_("bow.login.authenticationFailure")); } } return result; @@ -110,29 +101,28 @@ /** * Authenticates the user if his email and password are valid */ + @Override public String execute() { String result = INPUT; try { - if (email != null) { + if (StringUtils.isNotBlank(email)) { email = email.trim(); - if (password != null) { + if (StringUtils.isNotEmpty(password)) { String md5 = StringUtil.encodeMD5(password); BowUser user; user = checkLogin(email, md5); if (user != null) { getBowSession().setUser(user); -// BowPreference pref = getBowSession().getPreference(); -// BowInit.initHomePage(servletRequest, pref); result = SUCCESS; } } } - } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); - log.error(e.getMessage(), e); + } catch (Exception eee) { + addActionError(_("bow.error.internal")); + log.error(eee.getMessage(), eee); } return result; } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/LogoutAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -33,6 +33,7 @@ public class LogoutAction extends BowBaseAction { private static final long serialVersionUID = 4806944250461551896L; + @Override public String execute() { BowSession.invalidate(session); return SUCCESS; Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/MigrateDataAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -33,8 +33,6 @@ import org.nuiton.util.VersionUtil; import org.nuiton.wikitty.WikittyProxy; -import static org.nuiton.i18n.I18n.n_; - /** * Lance la migration des données de la version 0.4 vers 0.5 * @@ -61,6 +59,7 @@ this.versionTo = versionTo; } + @Override public String execute() { try { if (StringUtils.isBlank(versionFrom) || StringUtils.isBlank(versionTo)) { @@ -73,11 +72,11 @@ if (VersionUtil.equals(versionFrom, "0.4") && VersionUtil.equals(versionTo, "0.5")) { BowMigration04To05.migrate(proxy); - addActionMessage(getText(n_("bow.admin.dataMigration.success"))); + addActionMessage(_("bow.admin.dataMigration.success")); } else if (VersionUtil.equals(versionFrom, "0.6") && VersionUtil.equals(versionTo, "1.1")) { BowMigration06To11.migrate(proxy); - addActionMessage(getText(n_("bow.admin.dataMigration.success"))); + addActionMessage(_("bow.admin.dataMigration.success")); } else { addActionMessage(String.format( "No migration found for %s to %s", @@ -85,9 +84,9 @@ } } } - } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); - log.error(e.getMessage(), e); + } catch (Exception eee) { + addActionError(_("bow.error.internal")); + log.error(eee.getMessage(), eee); } return SUCCESS; } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -23,20 +23,15 @@ */ package org.chorem.bow.action; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; -import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.chorem.bow.BowBookmark; -import org.chorem.bow.BookmarkActions; -import org.chorem.bow.BookmarkUtils; import org.chorem.bow.BowConfig; import org.chorem.bow.BowUtils; import org.chorem.bow.BowPreference; import org.nuiton.wikitty.search.Criteria; -import org.nuiton.wikitty.search.PagedResult; import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.search.Search; @@ -46,13 +41,11 @@ * * @author poussin */ -public class OpenSearchResultAction extends BowBaseAction implements ServletRequestAware, -ServletResponseAware { +public class OpenSearchResultAction extends BowBaseAction implements ServletResponseAware { private static final long serialVersionUID = -1691325797986483856L; protected String token; protected String redirectTo; - protected HttpServletRequest request; protected HttpServletResponse response; /** @@ -77,20 +70,16 @@ } @Override - public void setServletRequest(HttpServletRequest request) { - this.request = request; - } - - @Override public void setServletResponse(HttpServletResponse response) { - this.response = response; + this.response = response; } + @Override public String execute() { BowPreference user = getBowSession().getPreference(); if (searchLine != null && searchLine.matches("^http://[^ ]*")) { - redirectTo = BowUtils.redirectTo(searchLine, null); + redirectTo = searchLine; } else if (searchLine != null && (searchLine.startsWith(":") || searchLine.startsWith("t:"))) { @@ -98,28 +87,10 @@ int index = searchLine.indexOf(":"); searchLine = searchLine.substring(index + 1); //Suppresses first ":" - WikittyProxy proxy = getBowProxy(); - Criteria criteria = BookmarkUtils.getBookmarkListCriteriaByUser( - user, searchLine, null, null); - criteria = criteria.addSortDescending(BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK); - PagedResult<BowBookmark> result = proxy.findAllByCriteria( - BowBookmark.class, criteria); //Retrieves bookmarks by search - BookmarkActions bookmarkActions = BookmarkUtils.createBookmarkActions( - request, result, searchLine); - request.setAttribute("bookmarkActions", bookmarkActions); - request.setAttribute("token", token); redirectTo = BowUtils.redirectTo(searchLine, null); } else if (searchLine != null && searchLine.startsWith("f:")) { // Fulltext search in bow String fullText = searchLine.substring(2); - WikittyProxy proxy = getBowProxy(); - Criteria criteria; - criteria = BookmarkUtils.getBookmarkListCriteriaByUser(user, null, searchLine, null); - - PagedResult<BowBookmark> result = proxy.findAllByCriteria(BowBookmark.class, criteria); - BookmarkActions bookmarkActions = BookmarkUtils.createBookmarkActions(request, result, null); - request.setAttribute("bookmarkActions", bookmarkActions); - request.setAttribute("token", token); redirectTo = BowUtils.redirectTo(null, fullText); } else if (searchLine != null && searchLine.startsWith("a:")) { // Redirects to the requested alias Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -23,13 +23,10 @@ */ package org.chorem.bow.action; +import com.opensymphony.xwork2.ActionContext; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import javax.servlet.http.HttpServletRequest; - -import org.apache.struts2.interceptor.ServletRequestAware; import org.chorem.bow.BowBookmark; import org.chorem.bow.OpenSearchActions; import org.chorem.bow.BowUser; @@ -46,21 +43,27 @@ * * @author poussin */ -public class OpenSearchSuggestionAction extends BowBaseAction implements ServletRequestAware { +public class OpenSearchSuggestionAction extends BowBaseAction { + private static final long serialVersionUID = 3973618635494129146L; - protected HttpServletRequest request; + static public OpenSearchSuggestionAction getAction() { + Object action = ActionContext.getContext().get(CONTEXT_ACTION_KEY); + return (OpenSearchSuggestionAction) action; + } - @Override - public void setServletRequest(HttpServletRequest request) { - this.request = request; + protected OpenSearchActions openSearchActions; + + public OpenSearchActions getOpenSearchActions() { + return openSearchActions; } + @Override public String execute() { BowUser user = getBowSession().getUser(); if (searchLine != null) { - OpenSearchActions openSearchActions = new OpenSearchActions(); + openSearchActions = new OpenSearchActions(); WikittyProxy proxy = getBowProxy(); List<String> searchLineList = BowUtils.getWords(searchLine); @@ -90,7 +93,6 @@ openSearchActions.setBookmarkList(bookList); openSearchActions.setSuggestionList(topics); openSearchActions.findSuggestions(searchLineList); - request.setAttribute("openSearchAction", openSearchActions); } return SUCCESS; } Deleted: trunk/bow-ui/src/main/java/org/chorem/bow/action/OrderAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/OrderAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/OrderAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -1,119 +0,0 @@ -/* - * #%L - * bow - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2010 - 2011 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% - */ -package org.chorem.bow.action; - -import javax.servlet.http.HttpServletRequest; - -import org.apache.struts2.interceptor.ServletRequestAware; -import org.chorem.bow.BowBookmark; -import org.chorem.bow.BookmarkActions; -import org.chorem.bow.BookmarkUtils; -import org.chorem.bow.BowPreference; -import org.nuiton.wikitty.search.Criteria; -import org.nuiton.wikitty.search.PagedResult; -import org.nuiton.wikitty.WikittyProxy; - -import static org.nuiton.i18n.I18n.n_; - -/** - * Permet de modifie l'ordre de tri des bookmarks - * TODO poussin 20110211 cette action n'est pas vraiment pertinente et devrait - * etre des options de l'action de recherche - * - * @author poussin - */ -public class OrderAction extends BowBaseAction implements ServletRequestAware { - private static final long serialVersionUID = 203690999710176818L; - - protected String order; - protected HttpServletRequest request; - - public String getOrder() { - return order; - } - - public void setOrder(String order) { - this.order = order; - } - - @Override - public void setServletRequest(HttpServletRequest request) { - this.request = request; - } - - /** - * Orders the bookmarks according to a criteria - */ - public String execute() { - try { - BowPreference user = getBowSession().getPreference(); - Criteria baseCriteria = BookmarkUtils.getBookmarkListCriteriaByUser( - user, searchLine, fullTextLine, order); - - if (order != null && baseCriteria != null && !order.isEmpty()) { - WikittyProxy proxy = getBowProxy(); - PagedResult<BowBookmark> result = null; - - if (order.equals("ascName")) { - Criteria criteria = baseCriteria.addSortAscending( - BowBookmark.FQ_FIELD_BOWBOOKMARK_DESCRIPTION); - result = proxy.findAllByCriteria(BowBookmark.class, criteria); - addActionMessage(getText(n_("bow.search.order.ascName"))); - } else if (order.equals("ascDate")) { - Criteria criteria = baseCriteria.addSortAscending( - BowBookmark.FQ_FIELD_BOWBOOKMARK_CREATIONDATE); - result = proxy.findAllByCriteria(BowBookmark.class, criteria); - addActionMessage(getText(n_("bow.search.order.ascDate"))); - } else if (order.equals("ascClick")) { - Criteria criteria = baseCriteria.addSortAscending( - BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK); - result = proxy.findAllByCriteria(BowBookmark.class, criteria); - addActionMessage(getText(n_("bow.search.order.ascClick"))); - } else if (order.equals("descName")) { - Criteria criteria = baseCriteria.addSortDescending( - BowBookmark.FQ_FIELD_BOWBOOKMARK_DESCRIPTION); - result = proxy.findAllByCriteria(BowBookmark.class, criteria); - addActionMessage(getText(n_("bow.search.order.descName"))); - } else if (order.equals("descDate")) { - Criteria criteria = baseCriteria.addSortDescending( - BowBookmark.FQ_FIELD_BOWBOOKMARK_CREATIONDATE); - result = proxy.findAllByCriteria(BowBookmark.class, criteria); - addActionMessage(getText(n_("bow.search.order.descDate"))); - } else if (order.equals("descClick")) { - Criteria criteria = baseCriteria.addSortDescending( - BowBookmark.FQ_FIELD_BOWBOOKMARK_CLICK); - result = proxy.findAllByCriteria(BowBookmark.class, criteria); - addActionMessage(getText(n_("bow.search.order.descClick"))); - } - BookmarkActions bookmarkActions = - BookmarkUtils.createBookmarkActions(request, result, searchLine); - request.setAttribute("bookmarkActions", bookmarkActions); - } - } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); - log.error(e.getMessage(), e); - } - return SUCCESS; - } -} Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/PreferencesAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -29,36 +29,35 @@ import org.chorem.bow.BowProxy; import org.chorem.bow.BowUser; import com.opensymphony.xwork2.ActionContext; +import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeSet; -import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.time.DateUtils; +import org.chorem.bow.BowSession; -import org.apache.struts2.interceptor.ServletRequestAware; import org.nuiton.util.StringUtil; import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.WikittyUtil; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.entities.WikittyLabel; import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.search.FacetTopic; -import org.nuiton.wikitty.search.FacetTopicNameComparator; import org.nuiton.wikitty.search.PagedResult; import org.nuiton.wikitty.search.Search; -import static org.nuiton.i18n.I18n.n_; - /** * Change les preferences de l'utilisateur (couleur, password, email, ...) * * @author poussin */ -public class PreferencesAction extends BowBaseAction implements ServletRequestAware { +public class PreferencesAction extends BowBaseAction { private static final long serialVersionUID = -58341106356599721L; static public PreferencesAction getAction() { @@ -77,9 +76,8 @@ protected String confirmNewPassword; protected String update; protected Map<String, Integer> bookmarksImportDate; - protected HttpServletRequest request; - protected Set<FacetTopic> labels; + protected List<FacetTopic> labels; protected String[] selectedLabels; protected String rename; protected String delete; @@ -263,7 +261,7 @@ this.bookmarksImportDate = bookmarksImportDate; } - public Set<FacetTopic> getLabels() { + public List<FacetTopic> getLabels() { return labels; } @@ -274,18 +272,31 @@ public void setSelectedLabels(String[] selectedLabels) { this.selectedLabels = selectedLabels; } - - @Override - public void setServletRequest(HttpServletRequest request) { - this.request = request; + + /** + * Date est une date mais au format String qui vient de Solr + * Elle est de la forme '2011-08-18T00:25:16.028Z' + * qui n'est pas presentable a l'utilisateur + * On la remet sous une vrai forme date + */ + public Date stringToDate(String date) { + try { + Date result = WikittyUtil.parseDate(date); + return result; + +// String result = date.replaceAll("[^0-9:-]+", " ").trim(); +// result = result.substring(0, date.lastIndexOf(' ')); + } catch (ParseException eee) { + return new Date(0); + } } protected BowPreference changePreference(BowPreference preference) { preference.setColors(colors); - if ((tagsNb != null && !tagsNb.isEmpty())) { + if (StringUtils.isNotBlank(tagsNb)) { preference.setTags(Integer.valueOf(tagsNb)); } - if (bookmarksHomePage != null && !bookmarksHomePage.isEmpty()) { + if (StringUtils.isNotBlank(bookmarksHomePage)) { preference.setBookmarks(Integer.valueOf(bookmarksHomePage)); } preference.setSearchEngineUrlSuggestions(searchEngineUrlSuggestions); @@ -295,19 +306,20 @@ } protected BowUser changeUser(BowUser newUser) { - if (email != null && !email.isEmpty()) { + if (StringUtils.isNotBlank(email)) { + email = email.trim(); newUser.setLogin(email); } - if (newPassword != null && confirmNewPassword != null && currentPassword != null) { - if (!newPassword.isEmpty() && !confirmNewPassword.isEmpty() && !currentPassword.isEmpty()) { - if (newPassword.equals(confirmNewPassword)) { - currentPassword = StringUtil.encodeMD5(currentPassword); - if (currentPassword.equals(newUser.getPassword())) { - newUser.setPassword(StringUtil.encodeMD5(newPassword)); - } else { - addFieldError("currentPassword", getText(n_("bow.preferences.badCurrentPassword"))); - return null; - } + if (StringUtils.isNotBlank(newPassword) + && StringUtils.isNotBlank(confirmNewPassword) + && StringUtils.isNotBlank(currentPassword)) { + if (newPassword.equals(confirmNewPassword)) { + currentPassword = StringUtil.encodeMD5(currentPassword); + if (currentPassword.equals(newUser.getPassword())) { + newUser.setPassword(StringUtil.encodeMD5(newPassword)); + } else { + addFieldError("currentPassword", _("bow.preferences.badCurrentPassword")); + return null; } } } @@ -325,14 +337,14 @@ Criteria c = Search.query() .exteq(BowBookmark.EXT_WIKITTYLABEL) .eq(BowBookmark.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, userId) - .criteria().setEndIndex(0) - .setFacetMinCount(0) + .criteria().setEndIndex(0) // on ne veut aucun resultat, c'est la facet dont on a besoin + .setFacetMinCount(1) // on demande meme les labels avec 1 seul item + .setFacetLimit(-1) // on demande tous les labels .addFacetField(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS); PagedResult<Wikitty> result = proxy.findAllByCriteria(c); - List<FacetTopic> topics = result.getTopic( - BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS); - labels = new TreeSet<FacetTopic>(new FacetTopicNameComparator(true)); - labels.addAll(topics); + // lorsqu'on demande tout (facetLimit(-1)), les topics sont trie + // alphabetiquement pas besoin de les retrier + labels = result.getTopic(BowBookmark.FQ_FIELD_WIKITTYLABEL_LABELS); } /** @@ -381,7 +393,7 @@ } proxy.store(toStore); } catch (Exception eee) { - addActionError(getText(n_("bow.error.internal"))); + addActionError(_("bow.error.internal")); log.error(eee.getMessage(), eee); } return result; @@ -391,17 +403,19 @@ /** * Action executer lorsque l'utilisateur demande la page */ + @Override public String execute() { String result = SUCCESS; try { - BowProxy proxy = getBowSession().getProxy(); + BowSession session = getBowSession(); + BowProxy proxy = session.getProxy(); // BowPreference extends BowUser, donc on l'utilise pour tout BowPreference preference = getBowSession().getPreference(); loadLabels(proxy); Map<String,Integer> bookmarksByImportDate = - BookmarkUtils.getBookmarksByImportDate(request, preference); + BookmarkUtils.getBookmarksByImportDate(session, preference); if (log.isDebugEnabled()) { log.debug("bookmarksByImportDate found : " + (bookmarksByImportDate == null ? "null" : bookmarksByImportDate.size())); @@ -434,12 +448,12 @@ newUser = proxy.store(newUser); getBowSession().setUser(newUser); result = "update"; - addActionMessage(getText(n_("bow.preferences.update.successful"))); + addActionMessage(_("bow.preferences.update.successful")); } } else { // this email address is already used by someone else setEmail(preference.getLogin()); - addActionError(getText("bow.preferences.emailAldyExists")); + addActionError(_("bow.preferences.emailAldyExists")); result = ERROR; } } @@ -453,12 +467,9 @@ setSearchEngineUrlSuggestions(preference.getSearchEngineUrlSuggestions()); setSearchEngineUrlResults(preference.getSearchEngineUrlResults()); } -// // retrieve last reference -// preference = getBowSession().getPreference(); -// BowInit.initHomePage(request, preference); - } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); - log.error(e.getMessage(), e); + } catch (Exception eee) { + addActionError(_("bow.error.internal")); + log.error(eee.getMessage(), eee); } return result; } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/ReIndexationAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -26,8 +26,6 @@ import org.chorem.bow.BowSession; import org.nuiton.wikitty.WikittyProxy; -import static org.nuiton.i18n.I18n.n_; - /** * Lance la reindexation solr * @@ -37,6 +35,7 @@ private static final long serialVersionUID = 6226574522402739559L; + @Override public String execute() { try { BowSession session = getBowSession(); @@ -44,11 +43,11 @@ WikittyProxy proxy = getBowProxy(); proxy.getWikittyService().syncSearchEngine(proxy.getSecurityToken()); - addActionMessage(getText(n_("bow.admin.reIndexationDone"))); + addActionMessage(_("bow.admin.reIndexationDone")); } - } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); - log.error(e.getMessage(), e); + } catch (Exception eee) { + addActionError(("bow.error.internal")); + log.error(eee.getMessage(), eee); } return SUCCESS; } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/RegisterAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -25,9 +25,8 @@ import javax.mail.MessagingException; import javax.mail.internet.AddressException; -import javax.servlet.http.HttpServletRequest; +import org.apache.commons.lang.StringUtils; -import org.apache.struts2.interceptor.ServletRequestAware; import org.chorem.bow.BowMail; import org.chorem.bow.BowUser; import org.chorem.bow.BowUserImpl; @@ -37,19 +36,18 @@ import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.search.Search; -import static org.nuiton.i18n.I18n.n_; - /** * Enregistre un nouvel utilisateur * * @author poussin */ -public class RegisterAction extends BowBaseAction implements ServletRequestAware { +public class RegisterAction extends BowBaseAction { + private static final long serialVersionUID = 2204772861770399542L; + protected String email; protected String password; protected String repeatPassword; - protected HttpServletRequest request; /** * @return the email @@ -92,54 +90,48 @@ public void setRepeatPassword(String repeatPassword) { this.repeatPassword = repeatPassword; } - - @Override - public void setServletRequest(HttpServletRequest request) { - this.request = request; - } - + /** * - * @param passwordMD5 the user password hashed in md5 + * @param email non null and non blank email * @return false if the email address isn't already registered, true * otherwise */ - protected boolean alreadyRegistered(String passwordMD5) { + protected boolean alreadyRegistered(String email) { boolean result = true; - if (email != null && passwordMD5 != null) { - if (!email.isEmpty() && !passwordMD5.equals(StringUtil.encodeMD5(""))) { - WikittyProxy proxy = getBowProxy(); - Criteria criteria = Search.query().eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria(); //Retrieves user by user name (email) + WikittyProxy proxy = getBowProxy(); + //Retrieves user by user name (email) + Criteria criteria = Search.query() + .eq(BowUser.FQ_FIELD_WIKITTYUSER_LOGIN, email).criteria(); - //If the user doesn't already exist - if (proxy.findByCriteria(BowUser.class, criteria) == null) { - result = false; - } else { //The email address is already used by someone - addFieldError("email", getText(n_("bow.register.emailAldyUsed"))); - } - } - } - return result; + result = proxy.findByCriteria(BowUser.class, criteria) != null; + //If the user doesn't already exist + if (result) { + //The email address is already used by someone + addFieldError("email", _("bow.register.emailAldyUsed")); + } + return result; } /** * Registers the new user and sends an email to confirm registration */ + @Override public String execute() { String result = INPUT; try { - if (email != null) { + if (StringUtils.isNotBlank(email)) { email = email.trim(); - if (password != null) { + if (StringUtils.isNotBlank(password)) { if (!password.equals(repeatPassword)) { - addActionError(getText(n_("bow.register.pwdDontMatch"))); + addActionError(_("bow.register.pwdDontMatch")); } else { String md5 = StringUtil.encodeMD5(password); //If the email address isn't already used - if (!alreadyRegistered(md5)) { + if (!alreadyRegistered(email)) { WikittyProxy proxy = getBowProxy(); BowUserImpl newUser = new BowUserImpl(); newUser.setPassword(md5); @@ -150,28 +142,26 @@ //If there was an error when storing the user if (login == null) { - addFieldError("email", getText(n_("bow.register.invalidLogin"))); + addFieldError("email", _("bow.register.invalidLogin")); } else { getBowSession().setUser(login); -// BowPreference pref = getBowSession().getPreference(); -// BowInit.initHomePage(request, pref); - try { String mailContent; - mailContent = getText(n_("bow.register.mailHi")) + ",\n\n" + getText(n_("bow.register.mailPwd")) + ": " + password + "\n\n" + getText(n_("bow.register.mailEmail")) + ": " + email + "\n\n"; - BowMail.sendMail(email, getText(n_("bow.register.mailSubject")), mailContent); - } catch (AddressException e) { + mailContent = + _("bow.register.mailHi") + ",\n\n" + + _("bow.register.mailPwd") + ": " + password + "\n\n" + + _("bow.register.mailEmail") + ": " + email + "\n\n"; + BowMail.sendMail(email, _("bow.register.mailSubject"), mailContent); + } catch (AddressException eee) { //If the email address is invalid - String message = getText("bow.mail.badFormat"); - - addActionError(n_(message)); - log.error(message + " (email:" + email + ")", e); - } catch (MessagingException e) { - String message = getText("bow.mail.sendError"); - - addActionError(n_(message)); - log.error(message + "(" + e.getMessage() + ")", e); + addActionError(_("bow.mail.badFormat")); + log.error(String.format("Can't send message email to '%s'", + email), eee); + } catch (MessagingException eee) { + addActionError("bow.mail.sendError"); + log.error(String.format("Can't send message email to '%s'", + email), eee); } result = SUCCESS; } @@ -179,9 +169,9 @@ } } } - } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); - log.error(e.getMessage(), e); + } catch (Exception eee) { + addActionError(_("bow.error.internal")); + log.error(eee.getMessage(), eee); } return result; } Modified: trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java =================================================================== --- trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java 2011-08-18 02:37:38 UTC (rev 306) @@ -23,22 +23,21 @@ */ package org.chorem.bow.action; +import org.apache.commons.lang.StringUtils; import org.chorem.bow.BowBookmark; import org.chorem.bow.BowUtils; import org.nuiton.wikitty.WikittyProxy; -import static org.nuiton.i18n.I18n.n_; - /** * Supprime un bookmark * * @author poussin */ public class RemoveBookmarkAction extends BowBaseAction { + private static final long serialVersionUID = 820566716695285561L; + protected String bookmarkId; - protected String searchLine; - protected String fullTextLine; protected String redirectTo; /** @@ -56,34 +55,6 @@ } /** - * @return the searchLine - */ - public String getSearchLine() { - return searchLine; - } - - /** - * @param searchLine the searchLine to set - */ - public void setSearchLine(String searchLine) { - this.searchLine = searchLine; - } - - /** - * @return the fullTextLine - */ - public String getFullTextLine() { - return fullTextLine; - } - - /** - * @param fullTextLine the fullTextLine to set - */ - public void setFullTextLine(String fullTextLine) { - this.fullTextLine = fullTextLine; - } - - /** * @return the redirectTo */ public String getRedirectTo() { @@ -93,19 +64,16 @@ /** * Removes a bookmark */ + @Override public String execute() { - if (bookmarkId != null && !bookmarkId.isEmpty()) { + if (StringUtils.isNotEmpty(bookmarkId)) { try { WikittyProxy proxy = getBowProxy(); - BowBookmark bookmark = proxy.restore(BowBookmark.class, bookmarkId); - - if (bookmark != null) { - proxy.delete(bookmarkId); - addActionMessage(getText(n_("bow.bookmark.remove.successful"))); - } - } catch (Exception e) { - addActionError(getText(n_("bow.error.internal"))); - log.error("Can't do action", e); + proxy.delete(bookmarkId); + addActionMessage(_("bow.bookmark.remove.successful")); + } catch (Exception eee) { + addActionError(_("bow.error.internal")); + log.error("Can't do action", eee); } } redirectTo = BowUtils.redirectTo(searchLine, fullTextLine); Modified: trunk/bow-ui/src/main/resources/bow.properties =================================================================== --- trunk/bow-ui/src/main/resources/bow.properties 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/resources/bow.properties 2011-08-18 02:37:38 UTC (rev 306) @@ -23,9 +23,7 @@ ### application.version=${project.version} bow.url=http://localhost:8080/ -alias.url=http://localhost:8080/ -servlet.bow=bow -servlet.alias=alias +alias.url=http://localhost:8080/alias bow.smtpServer=smtp bow.addressFrom=bow@chorem.org bow.admins=poussin@codelutin.com Modified: trunk/bow-ui/src/main/resources/org/chorem/bow/action/ForgotPasswordAction-validation.xml =================================================================== --- trunk/bow-ui/src/main/resources/org/chorem/bow/action/ForgotPasswordAction-validation.xml 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/resources/org/chorem/bow/action/ForgotPasswordAction-validation.xml 2011-08-18 02:37:38 UTC (rev 306) @@ -22,15 +22,16 @@ #L% --> <!DOCTYPE validators PUBLIC - "-//OpenSymphony Group//XWork Validator 1.0.2//EN" - "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> + "-//OpenSymphony Group//XWork Validator 1.0.2//EN" + "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="email"> - <field-validator type="requiredstring"> - <message key="bow.login.email.required" /> - </field-validator> - <field-validator type="email"> + <field-validator type="requiredstring"> + <message key="bow.login.email.required" /> + </field-validator> + <field-validator type="regex"> + <param name="expression">^[a-z0-9!#$%&'*+/=?^_`{|}~-]+((\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)?)+@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?$</param> <message key="bow.login.email.wrongformat" /> </field-validator> </field> Modified: trunk/bow-ui/src/main/resources/org/chorem/bow/action/LoginAction-validation.xml =================================================================== --- trunk/bow-ui/src/main/resources/org/chorem/bow/action/LoginAction-validation.xml 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/resources/org/chorem/bow/action/LoginAction-validation.xml 2011-08-18 02:37:38 UTC (rev 306) @@ -22,15 +22,16 @@ #L% --> <!DOCTYPE validators PUBLIC - "-//OpenSymphony Group//XWork Validator 1.0.2//EN" - "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> + "-//OpenSymphony Group//XWork Validator 1.0.2//EN" + "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="email"> - <field-validator type="requiredstring"> - <message key="bow.login.email.required" /> - </field-validator> - <field-validator type="email"> + <field-validator type="requiredstring"> + <message key="bow.login.email.required" /> + </field-validator> + <field-validator type="regex"> + <param name="expression">^[a-z0-9!#$%&'*+/=?^_`{|}~-]+((\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)?)+@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?$</param> <message key="bow.login.email.wrongformat" /> </field-validator> </field> Modified: trunk/bow-ui/src/main/resources/org/chorem/bow/action/RegisterAction-validation.xml =================================================================== --- trunk/bow-ui/src/main/resources/org/chorem/bow/action/RegisterAction-validation.xml 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/resources/org/chorem/bow/action/RegisterAction-validation.xml 2011-08-18 02:37:38 UTC (rev 306) @@ -22,15 +22,16 @@ #L% --> <!DOCTYPE validators PUBLIC - "-//OpenSymphony Group//XWork Validator 1.0.2//EN" - "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> + "-//OpenSymphony Group//XWork Validator 1.0.2//EN" + "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="email"> - <field-validator type="requiredstring"> - <message key="bow.login.email.required" /> - </field-validator> - <field-validator type="email"> + <field-validator type="requiredstring"> + <message key="bow.login.email.required" /> + </field-validator> + <field-validator type="regex"> + <param name="expression">^[a-z0-9!#$%&'*+/=?^_`{|}~-]+((\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)?)+@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?$</param> <message key="bow.login.email.wrongformat" /> </field-validator> </field> @@ -40,13 +41,13 @@ </field-validator> </field> <field name="repeatPassword"> - <field-validator type="requiredstring"> - <message key="bow.login.repeatPassword.required" /> - </field-validator> + <field-validator type="requiredstring"> + <message key="bow.login.repeatPassword.required" /> + </field-validator> </field> <validator type="expression"> - <param name="expression">password.equals(repeatPassword)</param> - <message key="bow.register.pwdDontMatch" /> + <param name="expression">password.equals(repeatPassword)</param> + <message key="bow.register.pwdDontMatch" /> </validator> </validators> Modified: trunk/bow-ui/src/main/resources/struts.xml =================================================================== --- trunk/bow-ui/src/main/resources/struts.xml 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/resources/struts.xml 2011-08-18 02:37:38 UTC (rev 306) @@ -143,11 +143,21 @@ <action name="addUrl" class="org.chorem.bow.action.AddUrlAction"> <result type="redirect">${redirectTo}</result> </action> + <action name="editBookmark" class="org.chorem.bow.action.EditBookmarkAction"> + <result>/jsp/editBookmark.jsp</result> + </action> </package> + <!-- Fragment: en prevision de faire un peu d'ajax si l'utilisateur le souhaite --> + <package name="fragment" namespace="/fragment" extends="restrictedArea"> + <action name="editBookmark" class="org.chorem.bow.action.EditBookmarkAction"> + <result>/jsp/editBookmark.jsp</result> + </action> + </package> + <package name="search" extends="restrictedArea"> - <action name="order" class="org.chorem.bow.action.OrderAction"> - <result>/jsp/search.jsp</result> + <action name="home" class="org.chorem.bow.action.HomeAction"> + <result>/jsp/home.jsp</result> </action> <action name="openSearchResult" class="org.chorem.bow.action.OpenSearchResultAction"> <result type="redirect">${redirectTo}</result> @@ -158,22 +168,18 @@ <action name="deleteSearchResults" class="org.chorem.bow.action.DeleteSearchResultsAction"> <result type="redirectAction">home</result> </action> + <action name="*Xml"> + <result>/jsp/{1}Xml.jsp</result> + </action> </package> - <package name="misc" extends="restrictedArea"> - <action name="home" class="org.chorem.bow.action.HomeAction"> - <result>/jsp/home.jsp</result> - <result name="input" type="redirectAction">home</result> - </action> + <package name="preference" extends="restrictedArea"> <action name="locale" class="org.chorem.bow.action.LocaleAction"> <result type="redirect">/jsp/login.jsp</result> </action> <action name="regenPermToken" class="org.chorem.bow.action.GenerateTokenAction"> <result type="redirectAction">preferences</result> </action> - <action name="*Xml"> - <result>/jsp/{1}Xml.jsp</result> - </action> <action name="adminlabels" class="org.chorem.bow.action.PreferencesAction" method="adminlabels"> <result type="redirectAction">preferences</result> @@ -184,6 +190,9 @@ <result name="error">/jsp/preferences.jsp</result> <result>/jsp/preferences.jsp</result> </action> + </package> + + <package name="admin" extends="restrictedArea"> <action name="admin"> <result name="error">/jsp/login.jsp</result> <result>/jsp/admin.jsp</result> @@ -194,8 +203,5 @@ <action name="migrateData" class="org.chorem.bow.action.MigrateDataAction"> <result>/jsp/admin.jsp</result> </action> - <action name="editBookmark" class="org.chorem.bow.action.EditBookmarkAction"> - <result>/jsp/editBookmark.jsp</result> - </action> </package> </struts> Modified: trunk/bow-ui/src/main/webapp/WEB-INF/decorators/main.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/WEB-INF/decorators/main.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/WEB-INF/decorators/main.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -29,6 +29,7 @@ <%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %> <%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page" %> <%@taglib prefix="s" uri="/struts-tags" %> +<%@taglib prefix="sj" uri="/struts-jquery-tags" %> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" @@ -47,15 +48,15 @@ <link rel="search" type="application/opensearchdescription+xml" title="Bow (temporary)" href="${temporaryXml}" /> <link rel="search" type="application/opensearchdescription+xml" title="Bow (permanent)" href="${permanentXml}" /> </s:if> + + <sj:head/> + <s:url var="jqueryUiCSS" value="/css/jquery-ui-1.8.11.custom.bow.css" /> <s:url var="globalCSS" value="/css/global.css" /> <link href="${jqueryUiCSS}" rel="stylesheet" type="text/css" media="all" /> <link href="${globalCSS}" rel="stylesheet" type="text/css" media="all" /> - <s:url var="jqueryJS" value="/js/jquery-1.5.2.min.js" /> - <s:url var="jqueryUiJS" value="/js/jquery-ui-1.8.11.custom.min.js" /> + <s:url var="bookmarkJS" value="/js/bookmark.js" /> - <script type="text/javascript" src="${jqueryJS}"></script> - <script type="text/javascript" src="${jqueryUiJS}"></script> <script type="text/javascript" src="${bookmarkJS}"></script> </head> <body id="page-home"> @@ -63,7 +64,6 @@ <div id="page"> <%@include file="/jsp/inc/header.jsp" %> <div id="main"> - <%@include file="/jsp/inc/errorFrame.jsp" %> <decorator:body /> </div> <s:if test="%{#session.BowSession.user != null}"> Modified: trunk/bow-ui/src/main/webapp/WEB-INF/decorators.xml =================================================================== --- trunk/bow-ui/src/main/webapp/WEB-INF/decorators.xml 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/WEB-INF/decorators.xml 2011-08-18 02:37:38 UTC (rev 306) @@ -27,6 +27,7 @@ <decorators defaultdir="/WEB-INF/decorators"> <!-- Any urls that are excluded will never be decorated by Sitemesh --> <excludes> + <pattern>/fragment/*</pattern> <pattern>/nodecorate/*</pattern> <pattern>/styles/*</pattern> <pattern>/scripts/*</pattern> Modified: trunk/bow-ui/src/main/webapp/css/bookmark.css =================================================================== --- trunk/bow-ui/src/main/webapp/css/bookmark.css 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/css/bookmark.css 2011-08-18 02:37:38 UTC (rev 306) @@ -372,6 +372,8 @@ .formFrame{ + float: left; /* pour que le contenu en float ne deborde pas du cadre */ + width: 90%; min-width:400px; /* min-height: 315px; */ position:relative; @@ -514,3 +516,17 @@ font-size:11px; font-weight:bold; } + +#labelsForm .list input{ + float: left; + clear:left; +} + +#labelsForm .list label { + float: left; +} + +#labelsForm .action { + float: left; + clear:left; +} Modified: trunk/bow-ui/src/main/webapp/js/bookmark.js =================================================================== --- trunk/bow-ui/src/main/webapp/js/bookmark.js 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/js/bookmark.js 2011-08-18 02:37:38 UTC (rev 306) @@ -21,22 +21,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ -function modify(name, alias, tags, link, action, id) { - var form = $("#bookmarkForm")[0]; - form.link.value = link; - form.name.value = name; - form.tags.value = tags; - form.alias.value = alias; - form.action = action; - - var tab = document.getElementsByName(id); - for (var count = 0; count < tab.length; count++) { - tab[count].style.display = 'inline'; - } - return false; - -} - function deleteBookmarkConfirmation(goTo, bookmarkName) { deleteConfirmation(goTo, bookmarkName, 0, undefined); } @@ -49,11 +33,11 @@ // TODO sletellier 20110516 : use i18n to translate this ! var confMsg = "Do you really want to delete "; - + if (bookmarksNb > 1) { confMsg += "these " + bookmarksNb + " bookmarks"; } else { - confMsg += "bookmark '" + bookmarkName + "'"; + confMsg += "bookmark:\n'" + bookmarkName + "'"; } if (importDate !== undefined) Deleted: trunk/bow-ui/src/main/webapp/js/jquery-1.5.2.min.js =================================================================== --- trunk/bow-ui/src/main/webapp/js/jquery-1.5.2.min.js 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/js/jquery-1.5.2.min.js 2011-08-18 02:37:38 UTC (rev 306) @@ -1,39 +0,0 @@ -/* - * #%L - * BOW UI - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2010 - 2011 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% - */ -/*! - * jQuery JavaScript Library v1.5.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Mar 31 15:28:23 2011 -0400 - */ -(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bR(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bQ(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bs.test(a)?e(a,f):bQ(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bQ(a+"["+f+"]",b[f],c,e)}function bP(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bJ,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bP(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bP(a,c,d,e,"*",g));return l}function bO(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bD),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bq(a,b,c){var e=b==="width"?bk:bl,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function bc(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function bb(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function ba(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function _(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function $(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Q(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(L.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(r,"")===a.type?q.push(g.selector):t.splice(i--,1);f=d(a.target).closest(q,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){f=p[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function E(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function y(){return!0}function x(){return!1}function i(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function h(a,c,e){if(e===b&&a.nodeType===1){e=a.getAttribute("data-"+c);if(typeof e==="string"){try{e=e==="true"?!0:e==="false"?!1:e==="null"?null:d.isNaN(e)?g.test(e)?d.parseJSON(e):e:parseFloat(e)}catch(f){}d.data(a,c,e)}else e=b}return e}var c=a.document,d=function(){function G(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(G,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x,y,z=Object.prototype.toString,A=Object.prototype.hasOwnProperty,B=Array.prototype.push,C=Array.prototype.slice,D=String.prototype.trim,E=Array.prototype.indexOf,F={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.2",length:0,size:function(){return this.length},toArray:function(){return C.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?B.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),x.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(C.apply(this,arguments),"slice",C.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:B,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;x.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=d._Deferred();if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",y,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",y),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&G()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):F[z.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!A.call(a,"constructor")&&!A.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||A.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:D?function(a){return a==null?"":D.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?B.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){F["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),E&&(d.inArray=function(a,b){return E.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?y=function(){c.removeEventListener("DOMContentLoaded",y,!1),d.ready()}:c.attachEvent&&(y=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",y),d.ready())});return d}(),e="then done fail isResolved isRejected promise".split(" "),f=[].slice;d.extend({_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(d,f)}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),f;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(f)return f;f=a={}}var c=e.length;while(c--)a[e[c]]=b[e[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?f.call(arguments,0):c,--g||h.resolveWith(h,f.call(b,0))}}var b=arguments,c=0,e=b.length,g=e,h=e<=1&&a&&d.isFunction(a.promise)?a:d.Deferred();if(e>1){for(;c<e;c++)b[c]&&d.isFunction(b[c].promise)?b[c].promise().then(i(c),h.reject):--g;g||h.resolveWith(h,b)}else h!==a&&h.resolveWith(h,e?[a]:[]);return h.promise()}}),function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0,reliableMarginRight:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e)}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(a.style.width="1px",a.style.marginRight="0",d.support.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(a,null).marginRight,10)||0)===0),b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function");return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}}();var g=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!i(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,g=b.nodeType,h=g?d.cache:b,j=g?b[d.expando]:d.expando;if(!h[j])return;if(c){var k=e?h[j][f]:h[j];if(k){delete k[c];if(!i(k))return}}if(e){delete h[j][f];if(!i(h[j]))return}var l=h[j][f];d.support.deleteExpando||h!=a?delete h[j]:h[j]=null,l?(h[j]={},g||(h[j].toJSON=d.noop),h[j][f]=l):g&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var f=this[0].attributes,g;for(var i=0,j=f.length;i<j;i++)g=f[i].name,g.indexOf("data-")===0&&(g=g.substr(5),h(this[0],g,e[g]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=h(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var j=/[\n\t\r]/g,k=/\s+/,l=/\r/g,m=/^(?:href|src|style)$/,n=/^(?:button|input)$/i,o=/^(?:button|input|object|select|textarea)$/i,p=/^a(?:rea)?$/i,q=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(k);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var i=0,j=b.length;i<j;i++)g.indexOf(" "+b[i]+" ")<0&&(h+=" "+b[i]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(k);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var h=(" "+g.className+" ").replace(j," ");for(var i=0,l=c.length;i<l;i++)h=h.replace(" "+c[i]+" "," ");g.className=d.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),i=b,j=a.split(k);while(f=j[g++])i=e?i:!h.hasClass(f),h[i?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(j," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var j=i?f:0,k=i?f+1:h.length;j<k;j++){var m=h[j];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(q.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(l,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&q.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=m.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&n.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var k=a.getAttributeNode("tabIndex");return k&&k.specified?k.value:o.test(a.nodeName)||p.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var l=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return l===null?b:l}h&&(a[c]=e);return a[c]}});var r=/\.(.*)$/,s=/^(?:textarea|input|select)$/i,t=/\./g,u=/ /g,v=/[^\w\s.|`]/g,w=function(a){return a.replace(v,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=x;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(a){return typeof d!=="undefined"&&d.event.triggered!==a.type?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=x);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),w).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(r,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=a.type,l[m]())}catch(p){}k&&(l["on"+m]=k),d.event.triggered=b}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,H(a.origType,a.selector),d.extend({},a,{handler:G,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,H(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?y:x):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=y;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=y;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=y,this.stopPropagation()},isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x};var z=function(a){var b=a.relatedTarget;try{if(b&&b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},A=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?A:z,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?A:z)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&E("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&E("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var B,C=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},D=function D(a){var c=a.target,e,f;if(s.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=C(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:D,beforedeactivate:D,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&D.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&D.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",C(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in B)d.event.add(this,c+".specialChange",B[c]);return s.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return s.test(this.nodeName)}},B=d.event.special.change.filters,B.focus=B.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function f(a){var c=d.event.fix(a);c.type=b,c.originalEvent={},d.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var e=0;d.event.special[b]={setup:function(){e++===0&&c.addEventListener(a,f,!0)},teardown:function(){--e===0&&c.removeEventListener(a,f,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var F={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=r.exec(h),k="",j&&(k=j[0],h=h.replace(r,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(F[h]+k),h=h+k):h=(F[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)d.event.add(n[p],"live."+H(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+H(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return"text"===c&&(b===c||b===null)},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var I=/Until$/,J=/^(?:parents|prevUntil|prevAll)/,K=/,/,L=/^.[^:#\[\.,]*$/,M=Array.prototype.slice,N=d.expr.match.POS,O={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(Q(this,a,!1),"not",a)},filter:function(a){return this.pushStack(Q(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=N.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(P(c[0])||P(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=M.call(arguments);I.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!O[a]?d.unique(f):f,(this.length>1||K.test(e))&&J.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var R=/ jQuery\d+="(?:\d+|null)"/g,S=/^\s+/,T=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,U=/<([\w:]+)/,V=/<tbody/i,W=/<|?\w+;/,X=/<(?:script|object|embed|option|style)/i,Y=/checked\s*(?:[^=]|=\s*.checked.)/i,Z={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};Z.optgroup=Z.option,Z.tbody=Z.tfoot=Z.colgroup=Z.caption=Z.thead,Z.th=Z.td,d.support.htmlSerialize||(Z._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(R,""):null;if(typeof a!=="string"||X.test(a)||!d.support.leadingWhitespace&&S.test(a)||Z[(U.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(T,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.length?this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&Y.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?$(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,bc)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!X.test(a[0])&&(d.support.checkClone||!Y.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){ba(a,e),f=bb(a),g=bb(e);for(h=0;f[h];++h)ba(f[h],g[h])}if(b){_(a,e);if(c){f=bb(a),g=bb(e);for(h=0;f[h];++h)_(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||W.test(i)){if(typeof i==="string"){i=i.replace(T,"<$1></$2>");var j=(U.exec(i)||["",""])[1].toLowerCase(),k=Z[j]||Z._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=V.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&S.test(i)&&m.insertBefore(b.createTextNode(S.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bd=/alpha\([^)]*\)/i,be=/opacity=([^)]*)/,bf=/-([a-z])/ig,bg=/([A-Z]|^ms)/g,bh=/^-?\d+(?:px)?$/i,bi=/^-?\d/,bj={position:"absolute",visibility:"hidden",display:"block"},bk=["Left","Right"],bl=["Top","Bottom"],bm,bn,bo,bp=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bm(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bm)return bm(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bf,bp)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bq(a,b,e):d.swap(a,bj,function(){f=bq(a,b,e)});if(f<=0){f=bm(a,b,b),f==="0px"&&bo&&(f=bo(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bh.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return be.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bd.test(f)?f.replace(bd,e):c.filter+" "+e}}),d(function(){d.support.reliableMarginRight||(d.cssHooks.marginRight={get:function(a,b){var c;d.swap(a,{display:"inline-block"},function(){b?c=bm(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bn=function(a,c,e){var f,g,h;e=e.replace(bg,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bo=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bh.test(d)&&bi.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bm=bn||bo,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var br=/%20/g,bs=/\[\]$/,bt=/\r?\n/g,bu=/#.*$/,bv=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bw=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bx=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,by=/^(?:GET|HEAD)$/,bz=/^\/\//,bA=/\?/,bB=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bC=/^(?:select|textarea)/i,bD=/\s+/,bE=/([?&])_=[^&]*/,bF=/(^|\-)([a-z])/g,bG=function(a,b,c){return b+c.toUpperCase()},bH=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bI=d.fn.load,bJ={},bK={},bL,bM;try{bL=c.location.href}catch(bN){bL=c.createElement("a"),bL.href="",bL=bL.href}bM=bH.exec(bL.toLowerCase())||[],d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bI)return bI.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bB,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bC.test(this.nodeName)||bw.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(bt,"\r\n")}}):{name:b.name,value:c.replace(bt,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bL,isLocal:bx.test(bM[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bO(bJ),ajaxTransport:bO(bK),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bR(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bS(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bF,bG)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bv.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bu,"").replace(bz,bM[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bD),e.crossDomain==null&&(q=bH.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bM[1]||q[2]!=bM[2]||(q[3]||(q[1]==="http:"?80:443))!=(bM[3]||(bM[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bP(bJ,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!by.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(bA.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bE,"$1_="+w);e.url=x+(x===e.url?(bA.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bP(bK,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bQ(g,a[g],c,f);return e.join("&").replace(br,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bT=d.now(),bU=/(\=)\?(&|$)|\?\?/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bT++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bU.test(b.url)||f&&bU.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bU,l),b.url===j&&(f&&(k=k.replace(bU,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bV=d.now(),bW,bX;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bZ()||b$()}:bZ,bX=d.ajaxSettings.xhr(),d.support.ajax=!!bX,d.support.cors=bX&&"withCredentials"in bX,bX=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),!a.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bW[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bW||(bW={},bY()),h=bV++,g.onreadystatechange=bW[h]=c):c()},abort:function(){c&&c(0,1)}}}});var b_={},ca=/^(?:toggle|show|hide)$/,cb=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cc,cd=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(ce("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cf(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ce("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(ce("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cf(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(ca.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=cb.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:ce("show",1),slideUp:ce("hide",1),slideToggle:ce("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!cc&&(cc=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(cc),cc=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var cg=/^t(?:able|d|h)$/i,ch=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=ci(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!cg.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=(e==="absolute"||e==="fixed")&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=ch.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!ch.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=ci(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=ci(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window); \ No newline at end of file Deleted: trunk/bow-ui/src/main/webapp/js/jquery-ui-1.8.11.custom.min.js =================================================================== --- trunk/bow-ui/src/main/webapp/js/jquery-ui-1.8.11.custom.min.js 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/js/jquery-ui-1.8.11.custom.min.js 2011-08-18 02:37:38 UTC (rev 306) @@ -1,137 +0,0 @@ -/* - * #%L - * BOW UI - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2010 - 2011 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% - */ -/*! - * jQuery UI 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI - */ -(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.11",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106, -NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this, -"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position"); -if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f, -"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h, -d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}}); -c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&& -b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery); -;/*! - * jQuery UI Widget 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Widget - */ -(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h, -a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h; -e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options, -this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")}, -widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this}, -enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery); -;/* - * jQuery UI Position 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Position - */ -(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, -left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= -k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-= -m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= -d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= -a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), -g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); -;/* - * jQuery UI Button 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Button - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,f=a([]);if(c)f=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return f};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button", -i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",f="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button", -function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(f)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active"); -b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var e=b.element[0];h(e).not(e).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active"); -g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(e){if(c.disabled)return false;if(e.keyCode==a.ui.keyCode.SPACE||e.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled", -c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){var b=this.element.parents().filter(":last"),c="label[for="+this.element.attr("id")+"]";this.buttonElement=b.find(c);if(!this.buttonElement.length){b=b.length?b.siblings():this.element.siblings();this.buttonElement=b.filter(c);if(!this.buttonElement.length)this.buttonElement=b.find(c)}this.element.addClass("ui-helper-hidden-accessible"); -(b=this.element.is(":checked"))&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()); -this.hasTitle||this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed", -true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"), -c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){if(this.options.text)e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){e.push(f?"ui-button-icons-only": -"ui-button-icon-only");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()}, -destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery); -;/* - * jQuery UI Dialog 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Dialog - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.button.js - * jquery.ui.draggable.js - * jquery.ui.mouse.js - * jquery.ui.position.js - * jquery.ui.resizable.js - */ -(function(c,j){var k={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},l={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&& -c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex", --1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role", -"button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose= -b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&& -a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0]){e=c(this).css("z-index"); -isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ); -d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===f[0]&&e.shiftKey){g.focus(1);return false}}}); -c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(f, -h){h=c.isFunction(h)?{click:h,text:f}:h;f=c('<button type="button"></button>').attr(h,true).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&f.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g= -d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize, -position:f.position,size:f.size}}a=a===j?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f, -h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length=== -1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);if(g in k)e=true;if(g in -l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled"); -break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d,e= -this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&& -this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.11",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length=== -0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(), -height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight); -b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances, -function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery); -; \ No newline at end of file Modified: trunk/bow-ui/src/main/webapp/jsp/admin.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/jsp/admin.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/jsp/admin.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -43,8 +43,8 @@ <s:if test="#session.BowSession.isAdmin()"> <ul id="adminActions"> <li><s:a action="reIndexation"><s:text name="bow.admin.dataReindexation" /></s:a></li> - <li><s:a action="migrateData?versionFrom=0.4&versionTo=0.5"><s:text name="bow.admin.dataMigration04to05" /></s:a></li> - <li><s:a action="migrateData?versionFrom=0.6&versionTo=1.1"><s:text name="bow.admin.dataMigration05to06" /></s:a></li> + <li><s:a action="migrateData?versionFrom=0.4&versionTo=0.5"><s:text name="bow.admin.dataMigration04to05" /></s:a></li> + <li><s:a action="migrateData?versionFrom=0.6&versionTo=1.1"><s:text name="bow.admin.dataMigration05to06" /></s:a></li> <li><s:a action="home" id="homePage"><s:text name="bow.admin.home" /></s:a></li> </ul> </s:if> Modified: trunk/bow-ui/src/main/webapp/jsp/editBookmark.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/jsp/editBookmark.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/jsp/editBookmark.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -23,11 +23,7 @@ --> <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> -<%@page import="org.chorem.bow.BowBookmark"%> -<% -BowBookmark bookmark = null; -%> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" xmlns:jsp="http://java.sun.com/JSP/Page" @@ -46,12 +42,17 @@ <s:form id="popupAddUrlForm" action="addUrl" method="post"> <s:hidden name="searchLine" value="%{searchLine}" /> <s:hidden name="fullTextLine" value="%{fullTextLine}" /> - <input type="hidden" id="popupAddUrlFormBookmarkId" name="bookmarkId" value="<%=bookmark == null ? null : bookmark.getWikittyId()%>"/> - <s:textfield key="popup.addurl.link" id="popupAddUrlFormLink" name="link" labelSeparator=" " value="%{bookmark.link}" /> - <s:textarea key="popup.addurl.name" id="popupAddUrlFormName" name="name" labelSeparator=" " value="%{bookmark.description}" /> - <s:textfield key="popup.addurl.alias.private" id="popupAddUrlFormPrivateAlias" name="privateAlias" labelSeparator=" " value="%{bookmark.privateAlias}" /> - <s:textfield key="popup.addurl.alias.public" id="popupAddUrlFormPublicAlias" name="publicAlias" labelSeparator=" " value="%{bookmark.publicAlias}" /> - <s:textfield key="popup.addurl.tags" id="popupAddUrlFormTags" name="tags" labelSeparator=" " value="%{@org.chorem.bow.BookmarkUtils@getBookmarkTagsString(#request.bookmark)}" /> + <s:hidden name="bookmarkId" value="%{bookmark.wikittyId}"/> + <s:textfield name="link" labelSeparator=" " key="popup.addurl.link" + value="%{bookmark.link}" /> + <s:textarea name="name" labelSeparator=" " key="popup.addurl.name" + value="%{bookmark.description}" /> + <s:textfield name="privateAlias" labelSeparator=" " key="popup.addurl.alias.private" + value="%{bookmark.privateAlias}" /> + <s:textfield name="publicAlias" labelSeparator=" " key="popup.addurl.alias.public" + value="%{bookmark.publicAlias}" /> + <s:textfield name="tags" labelSeparator=" " key="popup.addurl.tags" + value="%{@org.chorem.bow.BookmarkUtils@getBookmarkTagsString(bookmark)}" /> <s:submit key="popup.commons.submit" name="submit" /> </s:form> </div> Modified: trunk/bow-ui/src/main/webapp/jsp/error.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/jsp/error.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/jsp/error.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -35,7 +35,14 @@ </head> <body> <div id="main"> - <jsp:include page="inc/errorFrame.jsp" flush="true" /> + <div id="msg"> + <div id="actionmessageHeader"> + <s:actionmessage /> + </div> + <div id="actionerrorHeader"> + <s:actionerror /> + </div> + </div> </div> </body> </html> Modified: trunk/bow-ui/src/main/webapp/jsp/home.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/jsp/home.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/jsp/home.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -1,6 +1,3 @@ -<%@page import="org.chorem.bow.BowSearchResult"%> -<%@page import="org.chorem.bow.action.HomeAction"%> -<%@page import="org.chorem.bow.BowConfig"%> <!-- #%L bow @@ -27,9 +24,11 @@ <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %> <%@page import="org.chorem.bow.BowBookmark" %> -<%@page import="org.chorem.bow.BookmarkActions" %> <%@page import="java.text.SimpleDateFormat" %> <%@page import="java.util.List" %> +<%@page import="org.chorem.bow.BowSearchResult"%> +<%@page import="org.chorem.bow.action.HomeAction"%> +<%@page import="org.chorem.bow.BowConfig"%> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" @@ -56,11 +55,9 @@ </s:url> <s:a id="deleteSearchResultsButton" title="delete all" href="" onclick="deleteConfirmation('%{deleteSearchResults}', %{#bookmarksToDelete}); return(false);"></s:a> </s:if> - <s:form action="home" method="get"> - <p> - <label for="order"><s:text name="bow.search.orderby" /></label> - <s:select id="order" name="order" list="possibleOrder"/> - </p> + <s:form action="home" method="get" theme="simple"> + <label for="order"><s:text name="bow.search.orderby" /></label> + <s:select id="order" name="order" list="possibleOrder"/> <s:submit key="bow.search.submit" name="submit" /> <s:hidden name="searchLine" value="%{searchResult.searchLine}" /> <s:hidden name="fullTextLine" value="%{searchResult.fullTextLine}" /> Modified: trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/jsp/inc/bookmark.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -23,9 +23,7 @@ --> <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %> -<%@page import="org.chorem.bow.BowBookmark" %> -<%@page import="org.chorem.bow.BowUtils"%> -<%@page import="org.apache.commons.lang.StringEscapeUtils"%> +<%@taglib prefix="sj" uri="/struts-jquery-tags" %> <div class="bookmark" xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" @@ -43,21 +41,20 @@ <s:property value="%{#bookmark.publicAlias}" /> </s:a> </s:if> - <s:url var="editBookmark" action="modifyBookmark" escapeAmp="true"> - <s:param name="bookmarkId"><s:property value="%{#bookmark.wikittyId}" /></s:param> + <s:url var="editBookmark" action="editBookmark" escapeAmp="true"> + <s:param name="id"><s:property value="%{#bookmark.wikittyId}" /></s:param> <s:param name="searchLine"><s:property value="%{searchLine}" /></s:param> <s:param name="fullTextLine"><s:property value="%{fullTextLine}" /></s:param> </s:url> - <s:a cssClass="edit" href="%{editBookmark}" - onclick="return openPopupAddUrl('%{#bookmark.wikittyId}', '%{#bookmark.link}', '%{@org.apache.commons.lang.StringEscapeUtils@escapeJavaScript(#bookmark.description)}', '%{#bookmark.privateAlias}', '%{#bookmark.publicAlias}', '%{@org.chorem.bow.BookmarkUtils@getBookmarkTagsString(#bookmark)}');"> - </s:a> + <s:a cssClass="edit" href="%{editBookmark}"/> + <s:url var="removeBookmark" action="removeBookmark" escapeAmp="true"> <s:param name="bookmarkId"><s:property value="%{#bookmark.wikittyId}" /></s:param> <s:param name="searchLine"><s:property value="%{searchLine}" /></s:param> <s:param name="fullTextLine"><s:property value="%{fullTextLine}" /></s:param> </s:url> <s:a cssClass="supprim" href="%{removeBookmark}" - onclick="return deleteConfirmation('%{#removeBookmark}','%{#bookmark.privateAlias}');"></s:a> + onclick="return deleteConfirmation('%{#removeBookmark}','%{#bookmark.link}');"></s:a> </div> <div class="bookmarkcontenu"> Deleted: trunk/bow-ui/src/main/webapp/jsp/inc/errorFrame.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/jsp/inc/errorFrame.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/jsp/inc/errorFrame.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -1,36 +0,0 @@ -<!-- - #%L - bow - - $Id$ - $HeadURL$ - %% - Copyright (C) 2010 - 2011 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% - --> -<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> - - <% - String userError = (String)request.getAttribute("errorMsgUser"); - String techError = (String)request.getAttribute("errorMsgTech"); - - if (userError != null) { - %> - <div class="menu clearfix"> - <h2>Error</h2> - </div> - <pre class="error"><%=userError%><% if (techError != null) { %><br /><br />Detailed error :<br /><%=techError%><% } %></pre> - <% } %> Modified: trunk/bow-ui/src/main/webapp/jsp/inc/footer.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/jsp/inc/footer.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/jsp/inc/footer.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -27,21 +27,21 @@ <div id="footer" xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" xmlns:jsp="http://java.sun.com/JSP/Page"> - <p> - <a shape="rect" href="http://www.chorem.org/projects/show/bow">bow</a> - <a shape="rect" href="http://www.chorem.org/projects/bow/files"></a> - - <a shape="rect" href="http://www.gnu.org/licenses/agpl.html"><s:text name="bow.footer.license" /></a> - - <span title="Copyright">©2011</span> - <a shape="rect" href="http://www.codelutin.com">Code Lutin</a> - - <a shape="rect" href="http://www.chorem.org/projects/bow/issues"><s:text name="bow.footer.bugreport" /></a> - + <p> + <a shape="rect" href="http://www.chorem.org/projects/show/bow">bow</a> + <a shape="rect" href="http://www.chorem.org/projects/bow/files"></a> - + <a shape="rect" href="http://www.gnu.org/licenses/agpl.html"><s:text name="bow.footer.license" /></a> - + <span title="Copyright">©2011</span> + <a shape="rect" href="http://www.codelutin.com">Code Lutin</a> - + <a shape="rect" href="http://www.chorem.org/projects/bow/issues"><s:text name="bow.footer.bugreport" /></a> - <a shape="rect" href="http://list.chorem.org/cgi-bin/mailman/listinfo/bow-users"><s:text name="bow.footer.userSupport" /></a> - - <s:url var="localeEN"> - <s:param name="request_locale">en_GB</s:param> - </s:url> - <s:url var="localeFR"> - <s:param name="request_locale">fr_FR</s:param> - </s:url> - <s:a href="%{localeEN}"><s:text name="bow.action.locale.english" /></s:a> - - <s:a href="%{localeFR}"><s:text name="bow.action.locale.french" /></s:a> - </p> + <s:url var="localeEN"> + <s:param name="request_locale">en_GB</s:param> + </s:url> + <s:url var="localeFR"> + <s:param name="request_locale">fr_FR</s:param> + </s:url> + <s:a href="%{localeEN}"><s:text name="bow.action.locale.english" /></s:a> - + <s:a href="%{localeFR}"><s:text name="bow.action.locale.french" /></s:a> + </p> </div> Deleted: trunk/bow-ui/src/main/webapp/jsp/inc/popupAddUrl.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/jsp/inc/popupAddUrl.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/jsp/inc/popupAddUrl.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -1,94 +0,0 @@ -<!-- - #%L - BOW UI - - $Id$ - $HeadURL$ - %% - Copyright (C) 2010 - 2011 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% - --> -<%-- - Document : popupAddUrl - Created on : 20 avr. 2011, 17:03:37 - Author : poussin ---%> - -<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> -<%@taglib prefix="s" uri="/struts-tags" %> - -<script> - function openPopupAddUrl(bookmarkId, link, name, privateAlias, publicAlias, tags) { - $("#popupAddUrlFormBookmarkId")[0].value = bookmarkId; - $("#popupAddUrlFormLink")[0].value = link; - $("#popupAddUrlFormName")[0].innerHTML = name; - $("#popupAddUrlFormPrivateAlias")[0].value = privateAlias; - $("#popupAddUrlFormPublicAlias")[0].value = publicAlias; - $("#popupAddUrlFormTags")[0].value = tags; - - $("#addUrlPopup").dialog("open"); - return false; - } - - $(function() { - $( "#addUrlPopup" ).dialog({ - autoOpen: false, - width: 400, - modal: true, -// buttons: { -// "Validate": function() { -// $("#popupAddUrlForm").submit(); -// $( this ).dialog( "close" ); -// }, -// Cancel: function() { -// $( this ).dialog( "close" ); -// } -// }, - close: function() { - //allFields.val( "" ).removeClass( "ui-state-error" ); - } - }); - }); - - function submitAddUrl() { - $("#popupAddUrlForm").submit(); - closePopupAddUrl(); - } - - function closePopupAddUrl() { - $( "#addUrlPopup" ).dialog( "close" ) - } -</script> - -<s:set id="title"> - <s:text name="popup.addurl.title"/> -</s:set> - -<div xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" - id="addUrlPopup" title="${title}"> - <s:form id="popupAddUrlForm" action="addUrl" method="post"> - <s:hidden id="popupAddUrlFormBookmarkId" name="bookmarkId" /> - <s:hidden name="searchLine" value="%{searchLine}" /> - <s:hidden name="fullTextLine" value="%{fullTextLine}" /> - <s:textfield key="popup.addurl.link" id="popupAddUrlFormLink" name="link" labelSeparator=" " /> - <s:textarea key="popup.addurl.name" id="popupAddUrlFormName" name="name" labelSeparator=" " /> - <s:textfield key="popup.addurl.alias.private" id="popupAddUrlFormPrivateAlias" name="privateAlias" labelSeparator=" " /> - <s:textfield key="popup.addurl.alias.public" id="popupAddUrlFormPublicAlias" name="publicAlias" labelSeparator=" " /> - <s:textfield key="popup.addurl.tags" id="popupAddUrlFormTags" name="tags" labelSeparator=" " /> - </s:form> - <a class="button" onclick="submitAddUrl()"><s:text name="popup.commons.submit"/> </a> - <a class="button" onclick="closePopupAddUrl()"><s:text name="popup.commons.cancel"/> </a> -</div> Modified: trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/jsp/inc/rightMenu.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -23,14 +23,13 @@ --> <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@taglib prefix="s" uri="/struts-tags" %> -<%@page import="org.chorem.bow.BowConfig" %> -<% -String bowUrl = BowConfig.getBowUrl(); +<%@taglib prefix="sj" uri="/struts-jquery-tags" %> -if (request.getAttribute("formAction") == null) { - request.setAttribute("formAction", "addUrl"); -} -%> +<sj:dialog id="editBookmark" + title="Ajout/Modification d'un bookmark" + modal="true" + autoOpen="false" /> + <div id="logoutDiv" xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" xmlns:jsp="http://java.sun.com/JSP/Page"> <s:form action="logout" theme="simple"> @@ -38,22 +37,25 @@ <s:submit key="bow.rightMenu.logout" name="submit" /> </div> </s:form> - <a href="http://maven-site.chorem.org/bow/" class="help" onclick="window.open(this.href); return false;"><s:text name="bow.rightMenu.help" /></a> + <a href="http://maven-site.chorem.org/bow/" class="help" target="_blank"> + <s:text name="bow.rightMenu.help" /> + </a> </div> + <div id="side" xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" xmlns:jsp="http://java.sun.com/JSP/Page"> - <s:include value="popupAddUrl.jsp" /> - <s:set var="searchLine" value="%{request.bookmarkActions.searchLine}" /> - <s:set var="fullTextLine" value="%{request.bookmarkActions.fullTextLine}" /> <div id="colonneD"> <ul class="droite"> - <s:if test="#session.BowSession.isAdmin()"> + <s:if test="bowSession.admin"> <li><s:a action="admin"><s:text name="bow.rightMenu.admin" /></s:a></li> </s:if> <li><s:a action="preferences"><s:text name="bow.preferences.title" /></s:a></li> <li> - <s:url var="editBookmark" action="editBookmark"/> - <s:a href="%{editBookmark}" onclick="return openPopupAddUrl('', '', '', '', '', '');"> + <s:url var="editBookmark" action="editBookmark" escapeAmp="true"> + <s:param name="searchLine"><s:property value="%{searchLine}" /></s:param> + <s:param name="fullTextLine"><s:property value="%{fullTextLine}" /></s:param> + </s:url> + <s:a href="%{editBookmark}"> <s:text name="bow.rightMenu.addUrl.link" /> </s:a> </li> @@ -61,6 +63,7 @@ <!--div id="nuage"--> <jsp:include page="tagsCloud.jsp" flush="true"> <jsp:param name="searchLine" value="%{searchLine}" /> + <jsp:param name="fullTextLine" value="%{fullTextLine}"/> </jsp:include> <!--/div--> <div class="colonnebas"> Modified: trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/jsp/inc/tagsCloud.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -23,7 +23,6 @@ --> <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@taglib prefix="s" uri="/struts-tags" %> -<%@page import="org.chorem.bow.BookmarkActions"%> <div id="nuage" xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" @@ -35,6 +34,9 @@ <s:param name="fullTextLine" value="%{fullTextLine}"/> </s:url> <!-- --> - <s:a href="%{search}" title="%{#tag.count} results" cssClass="tag" cssStyle="font-size: %{searchResult.getFont(#tag.count)}px"><s:property value="%{#tag.topicName}" /></s:a> + <s:a href="%{search}" title="%{#tag.count} results" cssClass="tag" + cssStyle="font-size: %{searchResult.getFont(#tag.count)}px"> + <s:property value="%{#tag.topicName}" /> + </s:a> </s:iterator> </div> \ No newline at end of file Modified: trunk/bow-ui/src/main/webapp/jsp/preferences.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/jsp/preferences.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/jsp/preferences.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -22,16 +22,8 @@ #L% --> <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> -<%@page import="org.chorem.bow.BowConfig"%> -<%@page import="org.nuiton.wikitty.search.FacetTopic"%> -<%@page import="org.chorem.bow.action.PreferencesAction"%> <%@taglib prefix="s" uri="/struts-tags" %> -<% - PreferencesAction action = PreferencesAction.getAction(); - String bowUrl = BowConfig.getBowUrl(); -%> - <html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" xmlns:jsp="http://java.sun.com/JSP/Page"> <head> @@ -52,16 +44,16 @@ <s:set var="temporaryToken" value="#session.BowSession.getTemporaryToken()" /> <ul> <li> - <a title="%{getText('bow.rightMenu.bookmark.temporaryLinkDescription')}" - href="javascript:var%20url=location.href;var%20nameAndTags=prompt('Entrez%20le%20nom%20du%20lien%20et%20la%20liste%20des%20tags%20sous%20la%20forme:%20name|tag1%20tag2%20tag3',%20document.title+'|');if%20(nameAndTags!=(document.title+'|')){var%20link='<%=bowUrl%>addUrl.action?token=${temporaryToken}&url='+encodeURIComponent(url)+'&nameAndTags='+encodeURIComponent(nameAndTags);var%20script=document.createElement('script');script.src=link;script.type='text/javascript';document.body.appendChild(script);}void(0);"> + <s:a title="%{getText('bow.rightMenu.bookmark.temporaryLinkDescription')}" + href="javascript:var%20url=location.href;var%20nameAndTags=prompt('Entrez%20le%20nom%20du%20lien%20et%20la%20liste%20des%20tags%20sous%20la%20forme:%20name|tag1%20tag2%20tag3',%20document.title+'|');if%20(nameAndTags!=(document.title+'|')){var%20link='%{config.bowUrl}addUrl.action?token=%{temporaryToken}&url='+encodeURIComponent(url)+'&nameAndTags='+encodeURIComponent(nameAndTags);var%20script=document.createElement('script');script.src=link;script.type='text/javascript';document.body.appendChild(script);}void(0);"> <s:text name="bow.rightMenu.bookmark.temporaryLink" /> - </a> + </s:a> </li> <li> - <a title="%{getText('bow.rightMenu.bookmark.permanentLinkDescription')}" - href="javascript:var%20url=location.href;var%20nameAndTags=prompt('Entrez%20le%20nom%20du%20lien%20et%20la%20liste%20des%20tags%20sous%20la%20forme:%20name|tag1%20tag2%20tag3',%20document.title+'|');if%20(nameAndTags!=(document.title+'|')){var%20link='<%=bowUrl%>addUrl.action?token=${permanentToken}&url='+encodeURIComponent(url)+'&nameAndTags='+encodeURIComponent(nameAndTags);var%20script=document.createElement('script');script.src=link;script.type='text/javascript';document.body.appendChild(script);}void(0);"> + <s:a title="%{getText('bow.rightMenu.bookmark.permanentLinkDescription')}" + href="javascript:var%20url=location.href;var%20nameAndTags=prompt('Entrez%20le%20nom%20du%20lien%20et%20la%20liste%20des%20tags%20sous%20la%20forme:%20name|tag1%20tag2%20tag3',%20document.title+'|');if%20(nameAndTags!=(document.title+'|')){var%20link='%{config.bowUrl}addUrl.action?token=%{permanentToken}&url='+encodeURIComponent(url)+'&nameAndTags='+encodeURIComponent(nameAndTags);var%20script=document.createElement('script');script.src=link;script.type='text/javascript';document.body.appendChild(script);}void(0);"> <s:text name="bow.rightMenu.bookmark.permanentLink" /> - </a> + </s:a> </li> <li> <a href="extensions/bow4chromium.crx"> @@ -137,27 +129,18 @@ </div> <div class="formFrame fond"> - <h3><s:text name="bow.preferences.labels"/></h3> + <h3><s:text name="bow.preferences.labels"/>(<s:property value="labels.size()"/>)</h3> <br/> <s:form id="labelsForm" action="adminlabels" method="post" theme="simple"> - <ul> - <% for (FacetTopic topic : action.getLabels()) { %> - <div> - <%-- impossible de mettre un <s:checkbox, a priori erreur soit - disant que la tld ne permet pas d'expression :(. Comme - ca marche tres bien en HTML pure, vive le HTML :) --%> - <input type="checkbox" name="selectedLabels" - value="<%=topic.getTopicName()%>"> - <%=topic.getTopicName()%>(<%=topic.getCount()%>) - </input> - </div> - <% } %> - <div> - <s:text name="bow.preferences.labels.name.field"/><s:textfield name="newLabel" /> - <s:submit name="rename" key="bow.preferences.labels.rename.submit" /> - <s:submit name="delete" key="bow.preferences.labels.delete.submit" /> - </div> - </ul> + <div class="list"> + <s:checkboxlist name="selectedLabels" list="labels" + listKey="topicName" listValue="%{topicName+'('+count+')'}"/> + </div> + <div class="action"> + <s:text name="bow.preferences.labels.name.field"/><s:textfield name="newLabel" /> + <s:submit name="rename" key="bow.preferences.labels.rename.submit" /> + <s:submit name="delete" key="bow.preferences.labels.delete.submit" /> + </div> </s:form> </div> @@ -181,23 +164,17 @@ <s:if test="bookmarksImportDate != null"> <s:iterator value="bookmarksImportDate"> + <s:set name="date" value="%{key}"/> + <s:set name="nb" value="%{value}"/> + <s:date name="%{stringToDate(#date)}" var="dateString"/> <div class="deleteImport"> - <% - String date = (String) request.getAttribute("key"); - String dateSave = date; - - date = date.replaceAll("[^0-9:-]+", " ").trim(); - date = date.substring(0, date.lastIndexOf(' ')); - %> - <span><%=date%> (<s:property value="value"/> bookmarks)</span> + <span><s:property value="dateString"/> (<s:property value="#nb"/> bookmarks)</span> <s:url var="deleteImport" action="deleteImport"> - <s:param name="date"><%=dateSave%> - </s:param> + <s:param name="date" value="#date"/> </s:url> - <s:set name="date" value="%{key}"/> - <s:set name="count" value="%{value}"/> - <a class="deleteImportButton" href="%{deleteImport}" - onclick="return deleteConfirmation('${deleteImport}','${count}','<%=date%>');"></a> + <s:a cssClass="deleteImportButton" href="%{deleteImport}" + onclick="return deleteConfirmation('%{deleteImport}','%{nb}','%{dateString}');"> + </s:a> </div> </s:iterator> </s:if> Modified: trunk/bow-ui/src/main/webapp/jsp/suggestions.jsp =================================================================== --- trunk/bow-ui/src/main/webapp/jsp/suggestions.jsp 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/bow-ui/src/main/webapp/jsp/suggestions.jsp 2011-08-18 02:37:38 UTC (rev 306) @@ -24,18 +24,20 @@ <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import="org.chorem.bow.OpenSearchActions" %> <%@page import="org.nuiton.wikitty.search.FacetTopic" %> +<%@page import="org.chorem.bow.action.OpenSearchSuggestionAction"%> <%@page import="java.util.List" %> <% -OpenSearchActions osa = (OpenSearchActions) request.getAttribute("openSearchAction"); +OpenSearchSuggestionAction action = OpenSearchSuggestionAction.getAction(); +OpenSearchActions osa = action.getOpenSearchActions(); if (osa != null) { String[] word = osa.getSearch(); if (word != null) { List<FacetTopic> suggestions = osa.getSuggestionList(); if (suggestions != null) { - %> - <%=osa.getJsonResult()%> - <% +%> +<%=osa.getJsonResult()%> +<% } } } Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2011-08-16 23:13:25 UTC (rev 305) +++ trunk/pom.xml 2011-08-18 02:37:38 UTC (rev 306) @@ -126,6 +126,7 @@ <wikittyVersion>3.2-SNAPSHOT</wikittyVersion> <slf4jVersion>1.6.1</slf4jVersion> <struts2Version>2.2.3</struts2Version> + <struts2jqueryVersion>3.1.0</struts2jqueryVersion> <htmlParserVersion>1.6</htmlParserVersion> <javaxMailVersion>1.4.3</javaxMailVersion> <servletApiVersion>2.5</servletApiVersion> @@ -179,6 +180,12 @@ </dependency> <dependency> + <groupId>com.jgeppert.struts2.jquery</groupId> + <artifactId>struts2-jquery-plugin</artifactId> + <version>${struts2jqueryVersion}</version> + </dependency> + + <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>3.12.1.GA</version>