diff --git a/config/alfresco/messages/webclient.properties b/config/alfresco/messages/webclient.properties index 99211fa217..d92716441b 100644 --- a/config/alfresco/messages/webclient.properties +++ b/config/alfresco/messages/webclient.properties @@ -2152,5 +2152,38 @@ msg_err_invalid_launch_date_on_submit=The launch date has already passed. Please msg_err_invalid_expiration_date_on_submit=The expiration date(s) has already passed. Please choose a later date of expiration for the listed documents: {0} msg_err_pattern_invalid_expiration_date_on_submit=Please select an expiration date(s) that is later than the launch date for the listed documents: {0} +# +# ALF-11956 WCM Accessibility. XForms +# + +# Date/Time picker +time_picker_title=Time picker +time_picker_button_title=Time picker button +date_picker_title=Date picker +date_picker_button_title=Date picker button +date_time_picker_title=Date/time picker +date_time_picker_button_title=Date/time picker button +increase_week_label=Increase selected date by a week +decrease_week_label=Decrease selected date by a week +increase_month_label=Increase selected date by a month +decrease_month_label=Decrease selected date by a month + +# VGroup and Repeat widgets +add_item_title=Add item +move_up_title=Move item up +move_down_title=Move item down +remove_item_title=Remove item + +# Common +sandbox_title_extension=Sandbox +item_title=Item +mandatory_parameter=Mandatory field +state_expanded=Expanded +state_not_expanded=Not Expanded +select_path_menu=The current directory (press Enter, to select a different folder from the menu list) +wizard_command_buttons_description=Wizard Command Buttons. Use these buttons to navigate steps, or to finish/cancel the wizard +accessibility_validation_message=Some fields contain invalid data. Use the Tab and Shift + Tab keys to walk through the fields with invalid data. Use Alt + V keys in IE or Alt + Shift + V keys in FireFox to return to, the first field of a sequence of fields with incorrect data +accessibility_validation_message_with_error_count=field(s) contain invalid data. Use the Tab and Shift + Tab keys to walk through the fields with invalid data. Use Alt + V keys in IE or Alt + Shift + V keys in FireFox to return to, the first field of a sequence of fields with incorrect data + # Team properties team_login_warning=The requested Alfresco Explorer page is unsupported. Access this page only at the direction of Alfresco Support. diff --git a/config/alfresco/web-client-application-context.xml b/config/alfresco/web-client-application-context.xml index bd6ceba439..563936b6eb 100644 --- a/config/alfresco/web-client-application-context.xml +++ b/config/alfresco/web-client-application-context.xml @@ -306,5 +306,20 @@ + + + + + + + + + + + + + + + diff --git a/source/java/org/alfresco/web/app/servlet/BaseDownloadContentServlet.java b/source/java/org/alfresco/web/app/servlet/BaseDownloadContentServlet.java index c13a8a1396..36b3897082 100644 --- a/source/java/org/alfresco/web/app/servlet/BaseDownloadContentServlet.java +++ b/source/java/org/alfresco/web/app/servlet/BaseDownloadContentServlet.java @@ -676,12 +676,13 @@ public abstract class BaseDownloadContentServlet extends BaseServlet // TODO: investigate using getFileChannel() on ContentReader - if (r.start != 0L) + if (r.start != 0L && r.start > offset) { - long skipped = offset; - while (skipped < r.start) + long skipped = offset + is.skip(r.start - offset); + if (skipped < r.start) { - skipped += is.skip(r.start - skipped); + // Nothing left to download! + return; } } long span = (r.end - r.start) + 1L; diff --git a/source/java/org/alfresco/web/forms/FormInstanceDataImpl.java b/source/java/org/alfresco/web/forms/FormInstanceDataImpl.java index 6c0bbd2ace..73f6fb530b 100644 --- a/source/java/org/alfresco/web/forms/FormInstanceDataImpl.java +++ b/source/java/org/alfresco/web/forms/FormInstanceDataImpl.java @@ -40,6 +40,7 @@ import org.alfresco.service.cmr.avm.locking.AVMLockingService; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.util.Pair; import org.alfresco.wcm.util.WCMUtil; import org.alfresco.web.app.Application; import org.alfresco.web.app.servlet.FacesHelper; @@ -87,8 +88,15 @@ import org.xml.sax.SAXException; throw new NullPointerException(); } final AVMService avmService = this.getServiceRegistry().getAVMService(); - if (!avmService.hasAspect(AVMNodeConverter.ToAVMVersionPath(nodeRef).getFirst(), - AVMNodeConverter.ToAVMVersionPath(nodeRef).getSecond(), + + Pair avmVersionPath = AVMNodeConverter.ToAVMVersionPath(nodeRef); + + if (avmService.lookup(avmVersionPath.getFirst(), avmVersionPath.getSecond()) == null) + { + throw new IllegalArgumentException("Not found: " + avmVersionPath.getSecond()); + } + + if (!avmService.hasAspect(avmVersionPath.getFirst(), avmVersionPath.getSecond(), WCMAppModel.ASPECT_FORM_INSTANCE_DATA)) { throw new IllegalArgumentException("node " + nodeRef + diff --git a/source/java/org/alfresco/web/forms/xforms/Schema2XForms.java b/source/java/org/alfresco/web/forms/xforms/Schema2XForms.java index b19e17c8b6..2c91367c40 100644 --- a/source/java/org/alfresco/web/forms/xforms/Schema2XForms.java +++ b/source/java/org/alfresco/web/forms/xforms/Schema2XForms.java @@ -1872,7 +1872,10 @@ public class Schema2XForms implements Serializable Element bind = DOMUtil.getLastChildElement(modelSection); // ALF-9524 fix, previously we've added extra bind element, so last child is not correct for repeatable switch - if (controlType instanceof XSComplexTypeDefinition && ((XSComplexTypeDefinition)controlType).getDerivationMethod() == XSConstants.DERIVATION_EXTENSION) + String attribute = bind.getAttribute(NamespaceConstants.XFORMS_PREFIX + ":relevant"); + if (controlType instanceof XSComplexTypeDefinition && + ((XSComplexTypeDefinition)controlType).getDerivationMethod() == XSConstants.DERIVATION_EXTENSION && + attribute != null && !attribute.isEmpty()) { bind = modelSection; } diff --git a/source/java/org/alfresco/web/forms/xforms/XFormsProcessor.java b/source/java/org/alfresco/web/forms/xforms/XFormsProcessor.java index ec6a394db7..eaca28fc1a 100644 --- a/source/java/org/alfresco/web/forms/xforms/XFormsProcessor.java +++ b/source/java/org/alfresco/web/forms/xforms/XFormsProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2012 Alfresco Software Limited. * * This file is part of Alfresco * @@ -101,7 +101,29 @@ public class XFormsProcessor implements FormProcessor "path", "select", "upload", - "validation_provide_values_for_required_fields" + "validation_provide_values_for_required_fields", + + "time_picker_title", + "time_picker_button_title", + "date_picker_title", + "date_picker_button_title", + "date_time_picker_title", + "date_time_picker_button_title", + "increase_week_label", + "decrease_week_label", + "increase_month_label", + "decrease_month_label", + "mandatory_parameter", + "state_expanded", + "state_not_expanded", + "select_path_menu", + "add_item_title", + "move_up_title", + "move_down_title", + "remove_item_title", + "item_title", + "accessibility_validation_message", + "accessibility_validation_message_with_error_count" }; private static JSONObject widgetConfig = null; diff --git a/source/java/org/alfresco/web/ui/common/component/UIMenu.java b/source/java/org/alfresco/web/ui/common/component/UIMenu.java index f0c985c3d3..b01aa639b0 100644 --- a/source/java/org/alfresco/web/ui/common/component/UIMenu.java +++ b/source/java/org/alfresco/web/ui/common/component/UIMenu.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2012 Alfresco Software Limited. * * This file is part of Alfresco * @@ -76,7 +76,7 @@ public class UIMenu extends SelfRenderingComponent // output image if (getAttributes().get("image") != null) { - out.write(Utils.buildImageTag(context, (String)getAttributes().get("image"), null, "-4px")); + out.write(Utils.buildImageTag(context, (String)getAttributes().get("image"), tooltip, "-4px")); } out.write(""); diff --git a/source/java/org/alfresco/web/ui/common/renderer/ActionLinkRenderer.java b/source/java/org/alfresco/web/ui/common/renderer/ActionLinkRenderer.java index b4a7e88bbf..c8f3369f26 100644 --- a/source/java/org/alfresco/web/ui/common/renderer/ActionLinkRenderer.java +++ b/source/java/org/alfresco/web/ui/common/renderer/ActionLinkRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2012 Alfresco Software Limited. * * This file is part of Alfresco * @@ -138,7 +138,7 @@ public class ActionLinkRenderer extends BaseRenderer String verticalAlign = link.getVerticalAlign(); out.write(Utils.buildImageTag( - context, image, (String)link.getValue(), verticalAlign == null ? "-4px" : verticalAlign)); + context, image, ((null != link.getTooltip()) ? (link.getTooltip()):(String)link.getValue()), verticalAlign == null ? "-4px" : verticalAlign)); if (link.getShowLink() == false) { diff --git a/source/java/org/alfresco/web/ui/repo/RepoConstants.java b/source/java/org/alfresco/web/ui/repo/RepoConstants.java index ab5a8078c7..de83a3b228 100644 --- a/source/java/org/alfresco/web/ui/repo/RepoConstants.java +++ b/source/java/org/alfresco/web/ui/repo/RepoConstants.java @@ -46,6 +46,7 @@ public final class RepoConstants public static final String ALFRESCO_FACES_MLTEXT_RENDERER = "org.alfresco.faces.MultilingualText"; public static final String ALFRESCO_FACES_MLTEXTAREA_RENDERER = "org.alfresco.faces.MultilingualTextArea"; public static final String ALFRESCO_FACES_AJAX_TAG_PICKER = "org.alfresco.faces.AjaxTagPicker"; + public static final String ALFRESCO_FACES_TAG_SELECTOR = "org.alfresco.faces.TagSelector"; public static final String GENERATOR_LABEL = "LabelGenerator"; public static final String GENERATOR_TEXT_FIELD = "TextFieldGenerator"; diff --git a/source/java/org/alfresco/web/ui/repo/component/UISearchCustomProperties.java b/source/java/org/alfresco/web/ui/repo/component/UISearchCustomProperties.java index c40bb97484..0a338f7591 100644 --- a/source/java/org/alfresco/web/ui/repo/component/UISearchCustomProperties.java +++ b/source/java/org/alfresco/web/ui/repo/component/UISearchCustomProperties.java @@ -308,7 +308,7 @@ public class UISearchCustomProperties extends SelfRenderingComponent implements } else if (typeName.equals(DataTypeDefinition.CATEGORY)) { - control = (UICategorySelector)facesApp.createComponent(RepoConstants.ALFRESCO_FACES_CATEGORY_SELECTOR); + control = (UICategorySelector)facesApp.createComponent(RepoConstants.ALFRESCO_FACES_TAG_SELECTOR); control.setValueBinding(VALUE, vb); } else if (typeName.equals(DataTypeDefinition.DATETIME) || typeName.equals(DataTypeDefinition.DATE)) diff --git a/source/java/org/alfresco/web/ui/repo/component/UITagSelector.java b/source/java/org/alfresco/web/ui/repo/component/UITagSelector.java new file mode 100644 index 0000000000..0ceb11376c --- /dev/null +++ b/source/java/org/alfresco/web/ui/repo/component/UITagSelector.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.web.ui.repo.component; + +import java.util.ArrayList; +import java.util.Collection; + +import javax.faces.context.FacesContext; + +import org.alfresco.model.ContentModel; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.search.CategoryService; +import org.alfresco.service.cmr.search.CategoryService.Depth; +import org.alfresco.web.bean.repository.Repository; + +/** + * Component to allow the selection of a tags + */ +public class UITagSelector extends UICategorySelector +{ + public Collection getRootChildren(FacesContext context) + { + Collection childRefs = getCategoryService(context).getCategories(Repository.getStoreRef(), ContentModel.ASPECT_TAGGABLE, Depth.IMMEDIATE); + Collection refs = new ArrayList(childRefs.size()); + for (ChildAssociationRef childRef : childRefs) + { + refs.add(childRef.getChildRef()); + } + + return refs; + } + + private static CategoryService getCategoryService(FacesContext context) + { + CategoryService service = Repository.getServiceRegistry(context).getCategoryService(); + if (service == null) + { + throw new IllegalStateException("Unable to obtain CategoryService bean reference."); + } + + return service; + } +} \ No newline at end of file diff --git a/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java b/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java index 21ff4f548a..5fada356b6 100644 --- a/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java +++ b/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2012 Alfresco Software Limited. * * This file is part of Alfresco * @@ -423,6 +423,8 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa UIActionLink browseAction = aquireAction( context, mainStore, username, ACT_SANDBOX_ICON, WebResources.IMAGE_USERSANDBOX_32, "#{AVMBrowseBean.setupSandboxAction}", "browseSandbox"); + browseAction.setTooltip(Application.getMessage(context, ACT_SANDBOX_BROWSE) + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"); + browseAction.setShowLink(false); Utils.encodeRecursive(context, browseAction); out.write(""); @@ -446,31 +448,36 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa // Direct actions for a sandbox... // Browse Sandbox - Utils.encodeRecursive(context, aquireAction( - context, mainStore, username, ACT_SANDBOX_BROWSE, "/images/icons/space_small.gif", - "#{AVMBrowseBean.setupSandboxAction}", "browseSandbox")); + UIActionLink action = aquireAction(context, mainStore, username, ACT_SANDBOX_BROWSE, "/images/icons/space_small.gif", "#{AVMBrowseBean.setupSandboxAction}", "browseSandbox"); + action.setTooltip(Application.getMessage(context, ACT_SANDBOX_BROWSE) + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"); + + Utils.encodeRecursive(context, action); out.write(""); // Preview Website String websiteUrl = AVMUtil.getPreviewURI(mainStore, JNDIConstants.DIR_DEFAULT_WWW_APPBASE + '/' + getWebapp()); Map requestMap = context.getExternalContext().getRequestMap(); requestMap.put(REQUEST_PREVIEW_REF, websiteUrl); - Utils.encodeRecursive(context, aquireAction( - context, mainStore, username, ACT_SANDBOX_PREVIEW, "/images/icons/preview_website.gif", - null, null, "#{" + REQUEST_PREVIEW_REF + "}", null)); + + action = aquireAction(context, mainStore, username, ACT_SANDBOX_PREVIEW, "/images/icons/preview_website.gif", null, null, "#{" + REQUEST_PREVIEW_REF + "}", null); + action.setTooltip(Application.getMessage(context, ACT_SANDBOX_PREVIEW) + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"); + + Utils.encodeRecursive(context, action); requestMap.remove(REQUEST_PREVIEW_REF); out.write(""); // Submit All Items - Utils.encodeRecursive(context, aquireAction( - context, mainStore, username, ACT_SANDBOX_SUBMITALL, "/images/icons/submit_all.gif", - "#{AVMBrowseBean.setupAllItemsAction}", "dialog:submitSandboxItems")); + action = aquireAction(context, mainStore, username, ACT_SANDBOX_SUBMITALL, "/images/icons/submit_all.gif", "#{AVMBrowseBean.setupAllItemsAction}", "dialog:submitSandboxItems"); + action.setTooltip(Application.getMessage(context, ACT_SANDBOX_SUBMITALL) + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"); + + Utils.encodeRecursive(context, action); out.write(""); // Revert All Items - Utils.encodeRecursive(context, aquireAction( - context, mainStore, username, ACT_SANDBOX_REVERTALL, "/images/icons/revert_all.gif", - "#{AVMBrowseBean.setupAllItemsAction}", "dialog:revertAllItems")); + action = aquireAction(context, mainStore, username, ACT_SANDBOX_REVERTALL, "/images/icons/revert_all.gif", "#{AVMBrowseBean.setupAllItemsAction}", "dialog:revertAllItems"); + action.setTooltip(Application.getMessage(context, ACT_SANDBOX_REVERTALL) + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"); + + Utils.encodeRecursive(context, action); out.write(""); // More Actions menu @@ -479,6 +486,7 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa { // create the menu, then the actions menu = createMenu(context, mainStore); + menu.setTooltip(Application.getMessage(context, "more_actions") + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"); // add the menu to this component this.getChildren().add(menu); @@ -499,6 +507,7 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa ACT_SANDBOX_DEPLOY, "/images/icons/deploy.gif", "#{DialogManager.setupParameters}", "dialog:deployWebsite", null, dialogParams, false); + deploy.setTooltip(Application.getMessage(context, ACT_SANDBOX_DEPLOY) + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"); menu.getChildren().add(deploy); } @@ -509,6 +518,7 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa ACT_SANDBOX_DEPLOY_REPORT, "/images/icons/deployment_report.gif", "#{DialogManager.setupParameters}", "dialog:viewDeploymentReport", null, null, false); + reports.setTooltip(Application.getMessage(context, ACT_SANDBOX_DEPLOY_REPORT) + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"); menu.getChildren().add(reports); } @@ -519,6 +529,7 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa ACT_SANDBOX_RELEASE_SERVER, "/images/icons/release_server.gif", "#{DialogManager.setupParameters}", "dialog:releaseTestServer", null, null, false); + releaseServer.setTooltip(Application.getMessage(context, ACT_SANDBOX_RELEASE_SERVER) + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"); menu.getChildren().add(releaseServer); } @@ -526,6 +537,7 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa UIActionLink refresh = createAction(context, mainStore, username, ACT_SANDBOX_REFRESH, "/images/icons/reset.gif", "#{AVMBrowseBean.refreshSandbox}", null, null, null, false); + refresh.setTooltip(Application.getMessage(context, ACT_SANDBOX_REFRESH) + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"); menu.getChildren().add(refresh); // Delete Sandbox action @@ -535,6 +547,7 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa ACT_REMOVE_SANDBOX, "/images/icons/delete_sandbox.gif", "#{AVMBrowseBean.setupSandboxAction}", "dialog:deleteSandbox", null, null, false); + delete.setTooltip(Application.getMessage(context, ACT_REMOVE_SANDBOX) + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"); menu.getChildren().add(delete); } @@ -550,9 +563,14 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa { panelImage = WebResources.IMAGE_EXPANDED; } - out.write(Utils.buildImageTag(context, panelImage, 11, 11, "", - Utils.generateFormSubmit(context, this, getClientId(context) + PANEL_MODIFIED, username + PANEL_MODIFIED))); - out.write(" "); + + String title = Application.getMessage(context, MSG_MODIFIED_ITEMS) + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"; + String submitScript = Utils.generateFormSubmit(context, this, getClientId(context) + PANEL_MODIFIED, username + PANEL_MODIFIED); + out.write(""); + out.write(Utils.buildImageTag(context, panelImage, 11, 11, title)); + out.write(""); + + out.write(" "); out.write(bundle.getString(MSG_MODIFIED_ITEMS)); out.write(""); @@ -576,9 +594,14 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa { panelImage = WebResources.IMAGE_EXPANDED; } - out.write(Utils.buildImageTag(context, panelImage, 11, 11, "", - Utils.generateFormSubmit(context, this, getClientId(context) + PANEL_FORMS, username + PANEL_FORMS))); - out.write(" "); + + title = Application.getMessage(context, MSG_CONTENT_FORMS) + " (" + username + " " + Application.getMessage(context, "sandbox_title_extension") + ")"; + submitScript = Utils.generateFormSubmit(context, this, getClientId(context) + PANEL_FORMS, username + PANEL_FORMS); + out.write(""); + out.write(Utils.buildImageTag(context, panelImage, 11, 11, title)); + out.write(""); + + out.write(" "); out.write(bundle.getString(MSG_CONTENT_FORMS)); out.write(""); if (this.expandedPanels.contains(username + PANEL_FORMS)) diff --git a/source/test-resources/xforms/unit-tests/all-widgets.xsd b/source/test-resources/xforms/unit-tests/all-widgets.xsd new file mode 100644 index 0000000000..e41144df02 --- /dev/null +++ b/source/test-resources/xforms/unit-tests/all-widgets.xsd @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + minimal + + + + + + + custom + full + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file_picker + folder_picker + html_file_picker + image_file_picker + search_restricted_file_picker + folder_restricted_file_picker + + + + + + + + full + + + + + + + + + + + + + + + + + + + + + + minimal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + full + + + + + + + + + + + + + + + + + + minimal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + minimal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/test-resources/xforms/unit-tests/all-widgets_xform.xml b/source/test-resources/xforms/unit-tests/all-widgets_xform.xml new file mode 100644 index 0000000000..981b6833c9 --- /dev/null +++ b/source/test-resources/xforms/unit-tests/all-widgets_xform.xml @@ -0,0 +1,1261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + minimal + + + + + + + + + + + + + custom + + + + + + + full + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file_picker + + + + + + + folder_picker + + + + + + + html_file_picker + + + + + + + image_file_picker + + + + + + + search_restricted_file_picker + + + + + + + folder_restricted_file_picker + + + + + + + + + + + + + full + + + + + + + + + + + + + + + + + + + + + + + + + + minimal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + full + + + + + + + + + + + + + + + + + + + + + + minimal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + minimal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AllWidgets + + TextField NormalizedString + Please provide a valid value for 'TextField NormalizedString'. + 'TextField NormalizedString' is a required 'NormalizedString' value. + + + PlainTextEditor String Minimal + Please provide a valid value for 'PlainTextEditor String Minimal'. + 'PlainTextEditor String Minimal' is a required 'String' value. + + + RichTextEditor String + Please provide a valid value for 'RichTextEditor String'. + 'RichTextEditor String' is a required 'String' value. + + + RichTextEditor String Custom + Please provide a valid value for 'RichTextEditor String Custom'. + 'RichTextEditor String Custom' is a required 'String' value. + + + RichTextEditor String Full + Please provide a valid value for 'RichTextEditor String Full'. + 'RichTextEditor String Full' is a required 'String' value. + + + DatePicker Date + Please provide a valid value for 'DatePicker Date'. 'DatePicker Date' + is a required 'Date' value. + + + TimePicker Time + Please provide a valid value for 'TimePicker Time'. 'TimePicker Time' + is a required 'Time' value. + + + DateTimePicker DateTime + Please provide a valid value for 'DateTimePicker DateTime'. + 'DateTimePicker DateTime' is a required 'DateTime' value. + + + DayPicker GDay + Please provide a valid value for 'DayPicker GDay'. 'DayPicker GDay' is + a required 'GDay' value. + + + MonthPicker GMonth + Please provide a valid value for 'MonthPicker GMonth'. 'MonthPicker + GMonth' is a required 'GMonth' value. + + + YearPicker GYear + Please provide a valid value for 'YearPicker GYear'. 'YearPicker + GYear' is a required 'GYear' value. + + + MonthDayPicker GMonthDay + Please provide a valid value for 'MonthDayPicker GMonthDay'. + 'MonthDayPicker GMonthDay' is a required 'GMonthDay' value. + + + YearMonthPicker GYearMonth + Please provide a valid value for 'YearMonthPicker GYearMonth'. + 'YearMonthPicker GYearMonth' is a required 'GYearMonth' value. + + + + true + true + + + false + false + + Checkbox Boolean + Please provide a valid value for 'Checkbox Boolean'. 'Checkbox + Boolean' is a required 'Boolean' value. + + + NumericalRange Integer + Please provide a valid value for 'NumericalRange Integer'. + 'NumericalRange Integer' is a required 'Integer' value. + + + + FilePicker AnyURI + Please provide a valid value for 'FilePicker AnyURI'. 'FilePicker + AnyURI' is a required 'AnyURI' value. + + + + FilePicker AnyURI File Picker + Please provide a valid value for 'FilePicker AnyURI File Picker'. + 'FilePicker AnyURI File Picker' is a required 'AnyURI' value. + + + + FilePicker AnyURI Folder Picker + Please provide a valid value for 'FilePicker AnyURI Folder Picker'. + 'FilePicker AnyURI Folder Picker' is a required 'AnyURI' value. + + + + FilePicker AnyURI Html File Picker + Please provide a valid value for 'FilePicker AnyURI Html File Picker'. + 'FilePicker AnyURI Html File Picker' is a required 'AnyURI' value. + + + + FilePicker AnyURI Image File Picker + Please provide a valid value for 'FilePicker AnyURI Image File + Picker'. 'FilePicker AnyURI Image File Picker' is a required 'AnyURI' value. + + + + FilePicker AnyURI Search Restricted File Picker + Please provide a valid value for 'FilePicker AnyURI Search Restricted + File Picker'. 'FilePicker AnyURI Search Restricted File Picker' is a required 'AnyURI' + value. + + + + FilePicker AnyURI Folder Restricted File Picker + Please provide a valid value for 'FilePicker AnyURI Folder Restricted + File Picker'. 'FilePicker AnyURI Folder Restricted File Picker' is a required 'AnyURI' + value. + + + CheckboxSelect List Full + + + Checkbox List Full 1 + Checkbox List full 1 + + + Checkbox List Full 2 + Checkbox List full 2 + + + Checkbox List Full 3 + Checkbox List full 3 + + + Checkbox List Full 4 + Checkbox List full 4 + + + Checkbox List Full 5 + Checkbox List full 5 + + + Checkbox List Full 6 + Checkbox List full 6 + + + Checkbox List Full 7 + Checkbox List full 7 + + + Checkbox List Full 8 + Checkbox List full 8 + + + Checkbox List Full 9 + Checkbox List full 9 + + + Checkbox List Full 10 + Checkbox List full 10 + + + Please provide a valid value for 'CheckboxSelect List Full'. + 'CheckboxSelect List Full' is a required 'NormalizedString' value. + + + ListSelect List Minimal + + + List List Minimal 1 + List List minimal 1 + + + List List Minimal 2 + List List minimal 2 + + + List List Minimal 3 + List List minimal 3 + + + List List Minimal 4 + List List minimal 4 + + + List List Minimal 5 + List List minimal 5 + + + List List Minimal 6 + List List minimal 6 + + + List List Minimal 7 + List List minimal 7 + + + List List Minimal 8 + List List minimal 8 + + + List List Minimal 9 + List List minimal 9 + + + List List Minimal 10 + List List minimal 10 + + + Please provide a valid value for 'ListSelect List Minimal'. + 'ListSelect List Minimal' is a required 'NormalizedString' value. + + + CheckboxSelect List Default Short + + + Checkbox List Default Short 1 + Checkbox List default short 1 + + + Checkbox List Default Short 2 + Checkbox List default short 2 + + + Checkbox List Default Short 3 + Checkbox List default short 3 + + + Please provide a valid value for 'CheckboxSelect List Default Short'. + 'CheckboxSelect List Default Short' is a required 'NormalizedString' value. + + + ListSelect List Default Long + + + List List Default Long 1 + List List default long 1 + + + List List Default Long 2 + List List default long 2 + + + List List Default Long 3 + List List default long 3 + + + List List Default Long 4 + List List default long 4 + + + List List Default Long 5 + List List default long 5 + + + List List Default Long 6 + List List default long 6 + + + List List Default Long 7 + List List default long 7 + + + List List Default Long 8 + List List default long 8 + + + List List Default Long 9 + List List default long 9 + + + List List Default Long 10 + List List default long 10 + + + Please provide a valid value for 'ListSelect List Default Long'. + 'ListSelect List Default Long' is a required 'NormalizedString' value. + + + RadioSelect1 Enum Full + + + Radio Enum Full 1 + Radio enum full 1 + + + Radio Enum Full 2 + Radio enum full 2 + + + Radio Enum Full 3 + Radio enum full 3 + + + Radio Enum Full 4 + Radio enum full 4 + + + Radio Enum Full 5 + Radio enum full 5 + + + Radio Enum Full 6 + Radio enum full 6 + + + Radio Enum Full 7 + Radio enum full 7 + + + Radio Enum Full 8 + Radio enum full 8 + + + Radio Enum Full 9 + Radio enum full 9 + + + Radio Enum Full 10 + Radio enum full 10 + + + Please provide a valid value for 'RadioSelect1 Enum Full'. + 'RadioSelect1 Enum Full' is a required 'NormalizedString' value. + + + ComboboxSelect1 Enum Minimal + + + Please Select... + Please select... + + + Combobox Enum Minimal 1 + Combobox enum minimal 1 + + + Combobox Enum Minimal 2 + Combobox enum minimal 2 + + + Combobox Enum Minimal 3 + Combobox enum minimal 3 + + + Combobox Enum Minimal 4 + Combobox enum minimal 4 + + + Combobox Enum Minimal 5 + Combobox enum minimal 5 + + + Combobox Enum Minimal 6 + Combobox enum minimal 6 + + + Combobox Enum Minimal 7 + Combobox enum minimal 7 + + + Combobox Enum Minimal 8 + Combobox enum minimal 8 + + + Combobox Enum Minimal 9 + Combobox enum minimal 9 + + + Combobox Enum Minimal 10 + Combobox enum minimal 10 + + + Please provide a valid value for 'ComboboxSelect1 Enum Minimal'. + 'ComboboxSelect1 Enum Minimal' is a required 'NormalizedString' value. + + + RadioSelect1 Enum Default Short + + + Radio Enum Default Short 1 + Radio enum default short 1 + + + Radio Enum Default Short 2 + Radio enum default short 2 + + + Radio Enum Default Short 3 + Radio enum default short 3 + + + Please provide a valid value for 'RadioSelect1 Enum Default Short'. + 'RadioSelect1 Enum Default Short' is a required 'NormalizedString' value. + + + ComboboxSelect1 Enum Default Long + + + Please Select... + Please select... + + + Combobox Enum Default Long 1 + Combobox enum default long 1 + + + Combobox Enum Default Long 2 + Combobox enum default long 2 + + + Combobox Enum Default Long 3 + Combobox enum default long 3 + + + Combobox Enum Default Long 4 + Combobox enum default long 4 + + + Combobox Enum Default Long 5 + Combobox enum default long 5 + + + Combobox Enum Default Long 6 + Combobox enum default long 6 + + + Combobox Enum Default Long 7 + Combobox enum default long 7 + + + Combobox Enum Default Long 8 + Combobox enum default long 8 + + + Combobox Enum Default Long 9 + Combobox enum default long 9 + + + Combobox Enum Default Long 10 + Combobox enum default long 10 + + + Please provide a valid value for 'ComboboxSelect1 Enum Default Long'. + 'ComboboxSelect1 Enum Default Long' is a required 'NormalizedString' value. + + + VGroup ComplexType Sequence + + SequenceString + Please provide a valid value for 'SequenceString'. 'SequenceString' + is a required 'NormalizedString' value. + + + SequenceDecimal + Please provide a valid value for 'SequenceDecimal'. + 'SequenceDecimal' is a required 'Decimal' value. + + + + HGroup ComplexType All Minimal + + Horizontal1 + Please provide a valid value for 'Horizontal1'. 'Horizontal1' is a + required 'NormalizedString' value. + + + Horizontal2 + Please provide a valid value for 'Horizontal2'. 'Horizontal2' is a + required 'NormalizedString' value. + + + + Repeat 1to3 NormalizedString + + + + Repeat 1to3 NormalizedString + Please provide a valid value for 'Repeat 1to3 NormalizedString'. + 'Repeat 1to3 NormalizedString' is a required 'NormalizedString' value. + + + + + + baseComplexType + + + baseComplexType + + + + complexContentType + + + complexContentType + + + + complexContentType2 + + + complexContentType2 + + + + + baseComplexType + + Trigger SwitchGroup CaseGroup ComplexType + + Part1 + Please provide a valid value for 'Part1'. 'Part1' is a required + 'NormalizedString' value. + + + Part2 + Please provide a valid value for 'Part2'. 'Part2' is a required + 'NormalizedString' value. + + + + + complexContentType + + Trigger SwitchGroup CaseGroup ComplexType + + Part1 + Please provide a valid value for 'Part1'. 'Part1' is a required + 'NormalizedString' value. + + + Part2 + Please provide a valid value for 'Part2'. 'Part2' is a required + 'NormalizedString' value. + + + Part3 + Please provide a valid value for 'Part3'. 'Part3' is a required + 'NormalizedString' value. + + + Part4 + Please provide a valid value for 'Part4'. 'Part4' is a required + 'NormalizedString' value. + + + + + complexContentType2 + + Trigger SwitchGroup CaseGroup ComplexType + + Part1 + Please provide a valid value for 'Part1'. 'Part1' is a required + 'NormalizedString' value. + + + Part2 + Please provide a valid value for 'Part2'. 'Part2' is a required + 'NormalizedString' value. + + + Part5 + Please provide a valid value for 'Part5'. 'Part5' is a required + 'NormalizedString' value. + + + Part6 + Please provide a valid value for 'Part6'. 'Part6' is a required + 'NormalizedString' value. + + + + + + Submit + + + Save Draft + + + insert at beginning + + + + + + insert after selected + + + + + + delete selected + + + + + + + \ No newline at end of file diff --git a/source/web/WEB-INF/faces-config-repo.xml b/source/web/WEB-INF/faces-config-repo.xml index 275b57c1fd..5ac910e491 100644 --- a/source/web/WEB-INF/faces-config-repo.xml +++ b/source/web/WEB-INF/faces-config-repo.xml @@ -68,6 +68,11 @@ org.alfresco.faces.CategorySelector org.alfresco.web.ui.repo.component.UICategorySelector + + + org.alfresco.faces.TagSelector + org.alfresco.web.ui.repo.component.UITagSelector + org.alfresco.faces.MimeTypeSelector diff --git a/source/web/WEB-INF/web.xml b/source/web/WEB-INF/web.xml index d78aeede1b..48d4759c37 100644 --- a/source/web/WEB-INF/web.xml +++ b/source/web/WEB-INF/web.xml @@ -328,6 +328,11 @@ org.alfresco.web.app.ContextListener + + + org.alfresco.repo.webdav.WebDAVSessionListener + + com.sun.xml.ws.transport.http.servlet.WSServletContextListener @@ -335,6 +340,7 @@ + Faces Servlet diff --git a/source/web/jsp/rules/compare-date-property.jsp b/source/web/jsp/rules/compare-date-property.jsp index ee5f8e9943..622158a9ed 100644 --- a/source/web/jsp/rules/compare-date-property.jsp +++ b/source/web/jsp/rules/compare-date-property.jsp @@ -196,7 +196,7 @@ function checkButtonState(inputField) + disabled="#{empty WizardManager.bean.conditionProperties.qname}" /> diff --git a/source/web/jsp/users/email-space-users.jsp b/source/web/jsp/users/email-space-users.jsp index 9c932fa2e6..1dafe80736 100644 --- a/source/web/jsp/users/email-space-users.jsp +++ b/source/web/jsp/users/email-space-users.jsp @@ -30,9 +30,12 @@ function pageLoaded() { - document.getElementById("dialog:dialog-body:subject").focus(); - okEnabled = !document.getElementById("dialog:finish-button").disabled; - checkButtonState(); + if (document.getElementById("dialog:dialog-body:subject") != null) + { + document.getElementById("dialog:dialog-body:subject").focus(); + } + okEnabled = !document.getElementById("dialog:finish-button").disabled; + checkButtonState(); } function checkButtonState() diff --git a/source/web/jsp/wizard/container.jsp b/source/web/jsp/wizard/container.jsp index 346469d3e5..38549028bf 100644 --- a/source/web/jsp/wizard/container.jsp +++ b/source/web/jsp/wizard/container.jsp @@ -1,5 +1,5 @@ <%-- - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2012 Alfresco Software Limited. * * This file is part of Alfresco * @@ -76,15 +76,16 @@ if (Application.getWizardManager().getState() == null) <%-- Status and Actions inner contents table --%> <%-- Generally this consists of an icon, textual summary and actions for the current object --%> - + <%-- Accessibility heading level 1 titles --%> +
-
+
-
+
@@ -108,11 +109,13 @@ if (Application.getWizardManager().getState() == null) <% PanelGenerator.generatePanelStart(out, request.getContextPath(), "greyround", "#F5F5F5"); %> -
- - - +
+
+ + + +
<% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "greyround"); %> @@ -121,6 +124,17 @@ if (Application.getWizardManager().getState() == null) <% PanelGenerator.generatePanelStart(out, request.getContextPath(), "white", "white"); %> + + <%-- Accessibility heading level 2 titles. FireFox doesn't use labels from the table below --%> +
+

+ +

+

+ +

+
+ @@ -139,7 +153,11 @@ if (Application.getWizardManager().getState() == null) - +
+
+ +
+
<% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "white"); %> @@ -147,6 +165,14 @@ if (Application.getWizardManager().getState() == null) <% PanelGenerator.generatePanelStart(out, request.getContextPath(), "greyround", "#F5F5F5"); %> + + <%-- Accessibility heading level 2 titles --%> +
+

+ +

+
+ @@ -55,15 +55,15 @@ + dojoAttachEvent="onClick: _handleUiClick; onKey: _handleUiPress;"> - - - - - - - + + + + + + +
diff --git a/source/web/scripts/ajax/dojo/src/widget/DatePicker.js b/source/web/scripts/ajax/dojo/src/widget/DatePicker.js index 9e463ab54d..3fbd497774 100644 --- a/source/web/scripts/ajax/dojo/src/widget/DatePicker.js +++ b/source/web/scripts/ajax/dojo/src/widget/DatePicker.js @@ -264,6 +264,11 @@ dojo.widget.defineWidget( this.selectedNode = currentCalendarNode; } nextDate = dojo.date.add(nextDate, dojo.date.dateParts.DAY, 1); + + // DOJO accessibility for Alfresco WCM: ALF-11956 + var drawableDate = this._getSelectDayMonthAndYear({"target": currentCalendarNode}); + var month = dojo.date.getNames('months', 'wide', 'standAlone', this.lang)[drawableDate.month]; + currentCalendarNode.setAttribute("aria-label", (drawableDate.day + " (" + month + ", " + drawableDate.year + ")")); } this.lastDay = dojo.date.add(nextDate,dojo.date.dateParts.DAY,-1); this._initControls(); @@ -395,6 +400,17 @@ dojo.widget.defineWidget( this._incrementWeek(evt); } }, + + onIncrementWeekPressed: function(event) { + // DOJO accessibility for Alfresco WCM: ALF-11956 + if(null != event){ + event.stopPropagation(); + + if((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode))){ + this.onIncrementWeek(event); + } + } + }, onIncrementMonth: function(/*Event*/evt) { // summary: handler for increment month event @@ -403,7 +419,18 @@ dojo.widget.defineWidget( this._incrementMonth(evt); } }, - + + onIncrementMonthPressed: function(event) { + // DOJO accessibility for Alfresco WCM: ALF-11956 + if(null != event){ + event.stopPropagation(); + + if((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode))){ + this.onIncrementMonth(event); + } + } + }, + onIncrementYear: function(/*Event*/evt) { // summary: handler for increment year event evt.stopPropagation(); @@ -411,7 +438,18 @@ dojo.widget.defineWidget( this._incrementYear(evt); } }, - + + onIncrementYearPressed: function(event) { + // DOJO accessibility for Alfresco WCM: ALF-11956 + if(null != event){ + event.stopPropagation(); + + if((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode))){ + this.onIncrementYear(event); + } + } + }, + _setMonthLabel: function(monthIndex) { this.monthLabelNode.innerHTML = dojo.date.getNames('months', 'wide', 'standAlone', this.lang)[monthIndex]; }, @@ -448,14 +486,27 @@ dojo.widget.defineWidget( }, _handleUiClick: function(/*Event*/evt) { + // DOJO accessibility for Alfresco WCM: ALF-11956 + var selectedDate = this._getSelectDayMonthAndYear(evt); + if(null == selectedDate){ + return; + } + this.clickedNode = evt.target; + this.setDate(new Date(selectedDate.year, selectedDate.month, evt.target.innerHTML)); + }, + + _getSelectDayMonthAndYear: function(evt) { + // DOJO accessibility for Alfresco WCM: ALF-11956 var eventTarget = evt.target; if(eventTarget.nodeType != dojo.dom.ELEMENT_NODE){eventTarget = eventTarget.parentNode;} - dojo.event.browser.stopEvent(evt); + if(null != evt.preventDefault){ + dojo.event.browser.stopEvent(evt); + } this.selectedIsUsed = this.todayIsUsed = false; var month = this.curMonth.getMonth(); var year = this.curMonth.getFullYear(); if(dojo.html.hasClass(eventTarget, this.classNames["disabledPrevious"])||dojo.html.hasClass(eventTarget, this.classNames["disabledCurrent"])||dojo.html.hasClass(eventTarget, this.classNames["disabledNext"])){ - return; //this date is disabled... ignore it + return null; //this date is disabled... ignore it }else if (dojo.html.hasClass(eventTarget, this.classNames["next"])) { month = ++month % 12; if(month===0){++year;} @@ -463,10 +514,21 @@ dojo.widget.defineWidget( month = --month % 12; if(month==11){--year;} } - this.clickedNode = eventTarget; - this.setDate(new Date(year, month, eventTarget.innerHTML)); + + return {"day": eventTarget.innerHTML, "month": month, "year": year}; }, - + + _handleUiPress: function(event) { + // DOJO accessibility for Alfresco WCM: ALF-11956 + if(null != event){ + event.stopPropagation(); + + if((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode))){ + this._handleUiClick(event); + } + } + }, + onValueChanged: function(/*Date*/date) { //summary: the set date event handler }, diff --git a/source/web/scripts/ajax/dojo/src/widget/TimePicker.js b/source/web/scripts/ajax/dojo/src/widget/TimePicker.js index 317beaae8f..2aa82a563e 100644 --- a/source/web/scripts/ajax/dojo/src/widget/TimePicker.js +++ b/source/web/scripts/ajax/dojo/src/widget/TimePicker.js @@ -275,6 +275,17 @@ dojo.widget.defineWidget( this.onSetTime(); }, + onSetSelectedAmPmPressed: function(event) { + // DOJO accessibility for Alfresco WCM: ALF-11956 + if(null != event){ + event.stopPropagation(); + + if((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode))){ + this.onSetSelectedAmPm(event); + } + } + }, + setSelectedAmPm: function(evt) { var eventTarget = evt.target; if(evt && eventTarget) { diff --git a/source/web/scripts/ajax/dojo/src/widget/templates/DatePicker.html b/source/web/scripts/ajax/dojo/src/widget/templates/DatePicker.html index b97a0d1d21..db7619eab5 100644 --- a/source/web/scripts/ajax/dojo/src/widget/templates/DatePicker.html +++ b/source/web/scripts/ajax/dojo/src/widget/templates/DatePicker.html @@ -7,31 +7,31 @@
- ↓ - + dojoAttachEvent="onClick: onIncrementMonth; onKey: onIncrementMonthPressed;" class="incrementControl increase"> ↓ - ↑ - + dojoAttachEvent="onClick: onIncrementMonth; onKey: onIncrementMonthPressed;" class="incrementControl decrease"> ↑ - +
@@ -77,13 +77,13 @@ -

- - - -

+
+ + + +
diff --git a/source/web/scripts/ajax/dojo/src/widget/templates/TimePicker.html b/source/web/scripts/ajax/dojo/src/widget/templates/TimePicker.html index 0b1e5a52ec..91b1e26b46 100644 --- a/source/web/scripts/ajax/dojo/src/widget/templates/TimePicker.html +++ b/source/web/scripts/ajax/dojo/src/widget/templates/TimePicker.html @@ -15,28 +15,28 @@ - 12 - 6 + 12 + 6 - 1 - 7 + 1 + 7 - 2 - 8 + 2 + 8 - 3 - 9 + 3 + 9 - 4 - 10 + 4 + 10 - 5 - 11 + 5 + 11 @@ -46,28 +46,28 @@ - 00 - 30 + 00 + 30 - 05 - 35 + 05 + 35 - 10 - 40 + 10 + 40 - 15 - 45 + 15 + 45 - 20 - 50 + 20 + 50 - 25 - 55 + 25 + 55 @@ -78,10 +78,10 @@ + dojoAttachEvent="onClick: onSetSelectedAmPm; onKey: onSetSelectedAmPmPressed;"> - - + +
${this.calendar.am}${this.calendar.pm}${this.calendar.am}${this.calendar.pm}
diff --git a/source/web/scripts/ajax/file_picker_widget.js b/source/web/scripts/ajax/file_picker_widget.js index 9235ba026b..183385be44 100644 --- a/source/web/scripts/ajax/file_picker_widget.js +++ b/source/web/scripts/ajax/file_picker_widget.js @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2012 Alfresco Software Limited. * * This file is part of Alfresco * @@ -193,6 +193,7 @@ _showSelectedValue: function() this.resize_callback(this); this.selectedPathInput = d.createElement("input"); + this.selectedPathInput.id = this.uploadId + "-selected-path"; this.selectedPathInput.type = "text"; this.selectedPathInput.value = this.value == null ? "" : this.value; this.node.appendChild(this.selectedPathInput); @@ -206,6 +207,7 @@ _showSelectedValue: function() this._selectButton.value = (this.value == null ? alfresco.resources["select"] : alfresco.resources["change"]); + this._selectButton.title = (null == this.node.widget.labelNode) ? ("") : (this.node.widget.labelNode.getText() + " ") + this._selectButton.value + " " + alfresco.resources["path"]; this._selectButton.disabled = this.readonly; this._selectButton.style.margin = "0px 10px"; this.node.appendChild(this._selectButton); @@ -332,6 +334,8 @@ _showPicker: function(data) this.headerMenuTriggerLink.appendChild(headerMenuTriggerImage); this.headerMenuTriggerLink.image = headerMenuTriggerImage; headerMenuTriggerImage.setAttribute("src", alfresco.constants.WEBAPP_CONTEXT + "/images/icons/menu.gif"); + headerMenuTriggerImage.setAttribute("alt", alfresco.resources["select_path_menu"]); + headerMenuTriggerImage.setAttribute("title", alfresco.resources["select_path_menu"]); headerMenuTriggerImage.style.borderWidth = "0px"; headerMenuTriggerImage.style.marginLeft = "4px"; headerMenuTriggerImage.align = "absmiddle"; @@ -364,6 +368,8 @@ _showPicker: function(data) addContentImage.style.margin = "0px 2px 0px 2px"; addContentImage.align = "absmiddle"; addContentImage.setAttribute("src", alfresco.constants.WEBAPP_CONTEXT + "/images/icons/add.gif"); + addContentImage.setAttribute("alt", ""); + addContentImage.setAttribute("title", ""); addContentLink.appendChild(addContentImage); addContentLink.appendChild(d.createTextNode(alfresco.resources["add_content"])); @@ -395,6 +401,8 @@ _showPicker: function(data) navigateToParentNodeImage.style.margin = "0px 2px 0px 2px"; navigateToParentNodeImage.align = "absmiddle"; navigateToParentNodeImage.setAttribute("src", alfresco.constants.WEBAPP_CONTEXT + "/images/icons/up.gif"); + navigateToParentNodeImage.setAttribute("alt", ""); + navigateToParentNodeImage.setAttribute("title", ""); navigateToParentLink.appendChild(navigateToParentNodeImage); navigateToParentLink.appendChild(d.createTextNode(alfresco.resources["go_up"])); @@ -419,6 +427,7 @@ _showPicker: function(data) cancelButton.filePickerWidget = this; cancelButton.value = alfresco.resources["cancel"]; + cancelButton.title = (null == this.node.widget.labelNode) ? ("") : (this.node.widget.labelNode.getText() + " ") + alfresco.resources["cancel"]; footerDiv.appendChild(cancelButton); cancelButton.style.margin = ((.5 * footerDiv.offsetHeight) - @@ -506,6 +515,7 @@ _createRow: function(fileName, webappRelativePath, isDirectory, isSelectable, f e.type = "button"; e.name = webappRelativePath; e.value = "Select"; + e.title = ((null != this.node.widget.labelNode) ? (this.node.widget.labelNode.getText()) : ("")) + " " + e.value + " " + webappRelativePath; result.appendChild(e); e.style.position = "absolute"; @@ -797,6 +807,7 @@ _showSelectedValue: function() this.resize_callback(this); this.selectedPathInput = new Element("input", { + "id": this.node.id + "-selected-path", "type":"text", "value": (this.value == null ? "" : this.value), "styles": {"margin":"0"}, @@ -823,6 +834,7 @@ _showSelectedValue: function() : alfresco.resources["change"]), "disabled":this.readonly, "styles":{"margin":"0 3px"}, + "title": (node.widget.labelNode == null ? "" : node.widget.labelNode.getText()), "events": { "click": function(event) @@ -836,6 +848,7 @@ _showSelectedValue: function() } }); this._selectButton.filePickerWidget = this; + this._selectButton.title = (null == this.node.widget.labelNode) ? ("") : (this.node.widget.labelNode.getText() + " ") + this._selectButton.value + " " + alfresco.resources["path"], this._selectButton.inject(this.wrapper); var nodeSize = node.getSize(); var selectButtonSize = this._selectButton.getSize(); @@ -944,7 +957,9 @@ _showPicker: function(data) var headerMenuTriggerImage = new Element("img", { "src": alfresco.constants.WEBAPP_CONTEXT + "/images/icons/menu.gif", - "styles" : {"border":"0", "width:":"16px", "height":"16px", "margin":"0 0 0 4px", "z-index":"500", "vertical-align":"middle"} + "styles" : {"border":"0", "width:":"16px", "height":"16px", "margin":"0 0 0 4px", "z-index":"500", "vertical-align":"middle"}, + "alt": alfresco.resources["select_path_menu"], + "title": alfresco.resources["select_path_menu"] }); headerMenuTriggerImage.inject(this.headerMenuTriggerLink); @@ -974,7 +989,9 @@ _showPicker: function(data) var addContentImage = new Element("img", { "src":alfresco.constants.WEBAPP_CONTEXT + "/images/icons/add.gif", - "styles":{"border":"0", "width:":"16px", "height":"16px", "margin":"0 2px", "vertical-align":"middle"} + "styles":{"border":"0", "width:":"16px", "height":"16px", "margin":"0 2px", "vertical-align":"middle"}, + "alt": "", + "title": "" }); addContentImage.inject(addContentLink); @@ -1004,7 +1021,9 @@ _showPicker: function(data) var navigateToParentNodeImage = new Element("img", { "src":alfresco.constants.WEBAPP_CONTEXT + "/images/icons/up.gif", - "styles":{"border":"0", "width:":"16px", "height":"16px", "margin":"0 2px", "vertical-align":"middle"} + "styles":{"border":"0", "width:":"16px", "height":"16px", "margin":"0 2px", "vertical-align":"middle"}, + "alt": "", + "title": "" }); dojo.html.setOpacity(navigateToParentNodeImage, (currentPathName == "/" ? .3 : 1)); navigateToParentNodeImage.inject(navigateToParentLink); @@ -1016,6 +1035,7 @@ _showPicker: function(data) { "type" : "button", "value" : alfresco.resources["cancel"], + "title": ((null == this.node.widget.labelNode) ? ("") : (this.node.widget.labelNode.getText() + " ") + alfresco.resources["cancel"]), "events" : { "click" : function(event) { @@ -1148,6 +1168,7 @@ _createRow: function(fileName, webappRelativePath, isDirectory, isSelectable, f } } ); + e.title = ((null != this.node.widget.labelNode) ? (this.node.widget.labelNode.getText()) : ("")) + " " + e.value + " " + webappRelativePath; e.inject(result); } return result; diff --git a/source/web/scripts/ajax/xforms.js b/source/web/scripts/ajax/xforms.js index 17335fb077..7117b166c1 100644 --- a/source/web/scripts/ajax/xforms.js +++ b/source/web/scripts/ajax/xforms.js @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2012 Alfresco Software Limited. * * This file is part of Alfresco * @@ -923,6 +923,25 @@ alfresco.xforms.RichTextEditor = alfresco.xforms.Widget.extend({ alfresco.xforms.RichTextEditor.clickMask.setText(alfresco.resources["click_to_edit"]); alfresco.xforms.RichTextEditor.clickMask.id = 'xformsRichTextEditorHoverLayer'; alfresco.xforms.RichTextEditor.clickMask.style.display='none'; + + alfresco.xforms.RichTextEditor.maskFocusHandler = new Element("a"); + alfresco.xforms.RichTextEditor.maskFocusHandler.src = "#"; + alfresco.xforms.RichTextEditor.maskFocusHandler.accessKey = "e"; + alfresco.xforms.RichTextEditor.maskFocusHandler.style.width = "1px"; + alfresco.xforms.RichTextEditor.maskFocusHandler.style.height = "1px"; + alfresco.xforms.RichTextEditor.maskFocusHandler.style.position = "absolute"; + alfresco.xforms.RichTextEditor.maskFocusHandler.style.border.width = 0; + alfresco.xforms.RichTextEditor.maskFocusHandler.style.padding = 0; + alfresco.xforms.RichTextEditor.maskFocusHandler.style.margin = 0; + alfresco.xforms.RichTextEditor.maskFocusHandler.tabIndex = 0; + alfresco.xforms.RichTextEditor.maskFocusHandler.innerHTML = '
' + this.getLabel() + '
'; + + alfresco.xforms.RichTextEditor.maskFocusHandler.onfocus = function() + { + alfresco.xforms.RichTextEditor.clickMask.onclick(); + return; + }; + document.body.appendChild(alfresco.xforms.RichTextEditor.clickMask); } }, @@ -995,6 +1014,10 @@ alfresco.xforms.RichTextEditor = alfresco.xforms.Widget.extend({ render: function(attach_point) { + attach_point.appendChild(alfresco.xforms.RichTextEditor.maskFocusHandler); + alfresco.xforms.RichTextEditor.maskFocusHandler.style.top = this.domNode.style.top; + alfresco.xforms.RichTextEditor.maskFocusHandler.style.left = this.domNode.style.left; + attach_point.appendChild(this.domNode); this.domNode.addClass("xformsTextArea"); if (this._params.height) @@ -1232,6 +1255,10 @@ alfresco.xforms.RichTextEditor = alfresco.xforms.Widget.extend({ _hoverLayer_clickHandler: function(event) { alfresco.xforms.RichTextEditor.clickMask.style.display='none' + + alfresco.xforms.RichTextEditor.maskFocusHandler.tabIndex = -1; + alfresco.xforms.RichTextEditor.maskFocusHandler.style.display = "none"; + document.body.appendChild(alfresco.xforms.RichTextEditor.clickMask); if (alfresco.xforms.RichTextEditor.currentInstance && document.getElementById(alfresco.xforms.RichTextEditor.currentInstance.domNode.id) && alfresco.xforms.RichTextEditor.currentInstance != this) @@ -1393,6 +1420,7 @@ alfresco.xforms.CheckboxSelect = alfresco.xforms.AbstractSelectWidget.extend({ checkbox.setAttribute("id", this.id + "_" + i + "-widget"); checkbox.setAttribute("name", this.id + "_" + i + "-widget"); checkbox.setAttribute("type", "checkbox"); + checkbox.setAttribute("title", values[i].label); checkbox.setAttribute("value", values[i].value); checkboxDiv.appendChild(checkbox); if (initial_value.indexOf(values[i].value) != -1) @@ -1400,7 +1428,12 @@ alfresco.xforms.CheckboxSelect = alfresco.xforms.AbstractSelectWidget.extend({ this._selectedValues.push(values[i].value); checkbox.checked = true; } - checkboxDiv.appendChild(document.createTextNode(values[i].label)); + + var label = new Element("label", {"for": checkbox.id}); + label.title = values[i].label; + label.appendChild(document.createTextNode(values[i].label)); + + checkboxDiv.appendChild(label); checkbox.onclick = this._checkbox_clickHandler.bindAsEventListener(this); } }, @@ -1455,7 +1488,10 @@ alfresco.xforms.CheckboxSelect = alfresco.xforms.AbstractSelectWidget.extend({ alfresco.xforms.ListSelect = alfresco.xforms.AbstractSelectWidget.extend({ initialize: function(xform, xformsNode, parentWidget) { - this.parent(xform, xformsNode, parentWidget, new Element("select")); + var select = new Element("select"); + var idPrefix = (null != parentWidget) ? (parentWidget.id) : (xformsNode.id); + select.setAttribute("id", idPrefix + "-select"); + this.parent(xform, xformsNode, parentWidget, select); }, ///////////////////////////////////////////////////////////////// @@ -1572,11 +1608,17 @@ alfresco.xforms.RadioSelect1 = alfresco.xforms.AbstractSelectWidget.extend({ radio_div.style.lineHeight = "16px"; this.widget.appendChild(radio_div); var radio = new Element("input"); - radio.setAttribute("id", this.id + "-widget"); + radio.setAttribute("id", this.id + "-" + i + "-widget"); radio.setAttribute("name", this.id + "-widget"); radio.setAttribute("type", "radio"); + radio.setAttribute("title", values[i].label); radio_div.appendChild(radio); - radio_div.appendChild(document.createTextNode(values[i].label)); + + var label = new Element("label", {"for": radio.id}); + label.title = values[i].label; + label.appendChild(document.createTextNode(values[i].label)); + + radio_div.appendChild(label); radio.setAttribute("value", values[i].value); if (values[i].value == initial_value) @@ -1658,7 +1700,10 @@ alfresco.xforms.RadioSelect1 = alfresco.xforms.AbstractSelectWidget.extend({ alfresco.xforms.ComboboxSelect1 = alfresco.xforms.AbstractSelectWidget.extend({ initialize: function(xform, xformsNode, parentWidget) { - this.parent(xform, xformsNode, parentWidget, new Element("select")); + var select = new Element("select"); + var idPrefix = (null != parentWidget) ? (parentWidget.id) : (xformsNode.id); + select.setAttribute("id", idPrefix + "-select"); + this.parent(xform, xformsNode, parentWidget, select); }, ///////////////////////////////////////////////////////////////// @@ -1670,6 +1715,7 @@ alfresco.xforms.ComboboxSelect1 = alfresco.xforms.AbstractSelectWidget.extend({ var values = this._getItemValues(); var initial_value = this.getInitialValue(); this.domNode = new Element("select"); + this.domNode.id = attach_point.id + "-select2"; attach_point.appendChild(this.domNode); this.widget = this.domNode; for (var i = 0; i < values.length; i++) @@ -1811,6 +1857,8 @@ alfresco.xforms.Checkbox = alfresco.xforms.Widget.extend({ alfresco.xforms.DatePicker = alfresco.xforms.Widget.extend({ initialize: function(xform, xformsNode, parentWidget) { + _createExternalLabels(_getDateTimePickerLabels(parentWidget.domNode)); + this.parent(xform, xformsNode, parentWidget); this._minInclusive = (_hasAttribute(this.xformsNode, alfresco.xforms.constants.ALFRESCO_PREFIX + ":minInclusive") ? this.xformsNode.getAttribute(alfresco.xforms.constants.ALFRESCO_PREFIX + ":minInclusive") @@ -1858,12 +1906,24 @@ alfresco.xforms.DatePicker = alfresco.xforms.Widget.extend({ "onValueChanged", this, this._datePicker_valueChangedHandler); + + var expandoImage = document.getElementById(this.domNode.id + "-expanded-image"); + if (null != expandoImage) + { + expandoImage.alt = this._buildExpandoImageTitle(true); + } }, _destroyPicker: function() { if (this.widget.picker) { + var expandoImage = document.getElementById(this.domNode.id + "-expanded-image"); + if (null != expandoImage) + { + expandoImage.alt = this._buildExpandoImageTitle(false); + } + this.domNode.parentNode.removeChild(this.widget.picker.domNode); this.widget.picker = null; this.domContainer.style.height = @@ -1882,7 +1942,11 @@ alfresco.xforms.DatePicker = alfresco.xforms.Widget.extend({ { var initial_value = this.getInitialValue(); attach_point.appendChild(this.domNode); - this.widget = new Element("input", { "id": this.id + "-widget", "type": "text"}); + this.widget = new Element("input", { "id": this.id + "-widget", "type": "text", "aria-live": "polite"}); + + this.widget.setAttribute("alt", alfresco.resources["date_picker_title"]); + this.widget.setAttribute("title", alfresco.resources["date_picker_title"]); + if (initial_value) { var jsDate = dojo.date.fromRfc3339(initial_value); @@ -1903,20 +1967,41 @@ alfresco.xforms.DatePicker = alfresco.xforms.Widget.extend({ this.domNode.appendChild(this.widget); var expandoImage = new Element("img"); + expandoImage.id = this.domNode.id + "-expanded-image"; expandoImage.setAttribute("src", alfresco.constants.WEBAPP_CONTEXT + "/images/icons/action.gif"); expandoImage.align = "absmiddle"; expandoImage.style.margin = "0px 5px"; + expandoImage.tabIndex = 0; + + var imageTitle = this._buildExpandoImageTitle(false); + + expandoImage.setAttribute("alt", imageTitle); + expandoImage.setAttribute("title", alfresco.resources["date_picker_title"]); this.domNode.appendChild(expandoImage); if (!this.isReadonly()) { expandoImage.onclick = this._expando_clickHandler.bindAsEventListener(this); + expandoImage.onkeypress = this._expando_keypressHandler.bindAsEventListener(this); + this.widget.onfocus = this._dateTextBox_focusHandler.bindAsEventListener(this); this.widget.onchange = this._dateTextBox_changeHandler.bindAsEventListener(this); } }, + _buildExpandoImageTitle: function(expanded) + { + var result = ""; + if ((null != this.labelNode) && (null != this.labelNode.getText()) && (this.labelNode.getText().length > 0)) + { + result = this.labelNode.getText() + " "; + } + result += alfresco.resources["date_picker_button_title"] + ". " + ((expanded) ? (alfresco.resources["state_expanded"]) : (alfresco.resources["state_not_expanded"])) + "."; + + return result; + }, + setValue: function(value, forceCommit) { if (!this.widget) @@ -1969,6 +2054,11 @@ alfresco.xforms.DatePicker = alfresco.xforms.Widget.extend({ { var rfcDate = dojo.date.toRfc3339(date, "dateOnly"); this._destroyPicker(); + + var imageTitle = this._buildExpandoImageTitle(false); + var expandoImage = document.getElementById(this.domNode.id + "-expanded-image"); + expandoImage.alt = imageTitle; + this.setValue(rfcDate); this._commitValueChange(); }, @@ -1983,6 +2073,14 @@ alfresco.xforms.DatePicker = alfresco.xforms.Widget.extend({ { this._createPicker(); } + }, + + _expando_keypressHandler: function(event) + { + if ((null != event) && ((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode)))) + { + this._expando_clickHandler(); + } } }); @@ -1990,6 +2088,8 @@ alfresco.xforms.DatePicker = alfresco.xforms.Widget.extend({ alfresco.xforms.TimePicker = alfresco.xforms.Widget.extend({ initialize: function(xform, xformsNode, parentWidget) { + _createExternalLabels(_getDateTimePickerLabels(parentWidget.domNode)); + this.parent(xform, xformsNode, parentWidget); dojo.require("dojo.date.format"); this._noValueSet = (alfresco.resources["eg"] + " " + @@ -2042,12 +2142,24 @@ alfresco.xforms.TimePicker = alfresco.xforms.Widget.extend({ "onValueChanged", this, this._timePicker_valueChangedHandler); + + var expandoImage = document.getElementById(this.domNode.id + "-expanded-image"); + if (null != expandoImage) + { + expandoImage.alt = this._buildExpandoImageTitle(true); + } }, _destroyPicker: function() { if (this.widget.picker) { + var expandoImage = document.getElementById(this.domNode.id + "-expanded-image"); + if (null != expandoImage) + { + expandoImage.alt = this._buildExpandoImageTitle(false); + } + this.domNode.removeChild(this.widget.picker.domNode); this.widget.picker = null; this.domContainer.style.height = @@ -2067,7 +2179,11 @@ alfresco.xforms.TimePicker = alfresco.xforms.Widget.extend({ var initial_value = this.getInitialValue(); attach_point.appendChild(this.domNode); - this.widget = new Element("input", { "id": this.id + "-widget", "type": "text" }); + this.widget = new Element("input", { "id": this.id + "-widget", "type": "text", "aria-live": "polite" }); + + this.widget.setAttribute("alt", alfresco.resources["time_picker_title"]); + this.widget.setAttribute("title", alfresco.resources["time_picker_title"]); + if (initial_value) { var jsDate = this._parseTime(initial_value); @@ -2088,20 +2204,41 @@ alfresco.xforms.TimePicker = alfresco.xforms.Widget.extend({ this.domNode.appendChild(this.widget); var expandoImage = new Element("img"); + expandoImage.id = this.domNode.id + "-expanded-image"; expandoImage.setAttribute("src", alfresco.constants.WEBAPP_CONTEXT + "/images/icons/action.gif"); expandoImage.align = "absmiddle"; expandoImage.style.margin = "0px 5px"; + expandoImage.tabIndex = 0; + + var imageTitle = this._buildExpandoImageTitle(false); + + expandoImage.setAttribute("alt", imageTitle); + expandoImage.setAttribute("title", alfresco.resources["time_picker_title"]); this.domNode.appendChild(expandoImage); if (!this.isReadonly()) { expandoImage.onclick = this._expando_clickHandler.bindAsEventListener(this); + expandoImage.onkeypress = this._expando_keypressHandler.bindAsEventListener(this); + this.widget.onfocus = this._timeTextBox_focusHandler.bindAsEventListener(this); this.widget.onchange = this._timeTextBox_changeHandler.bindAsEventListener(this); } }, + _buildExpandoImageTitle: function(expanded) + { + var result = ""; + if ((null != this.labelNode) && (null != this.labelNode.getText()) && (this.labelNode.getText().length > 0)) + { + result = this.labelNode.getText() + " "; + } + result += alfresco.resources["time_picker_button_title"] + ". " + ((expanded) ? (alfresco.resources["state_expanded"]) : (alfresco.resources["state_not_expanded"])) + "."; + + return result; + }, + setValue: function(value, forceCommit) { if (!this.widget) @@ -2167,6 +2304,14 @@ alfresco.xforms.TimePicker = alfresco.xforms.Widget.extend({ { this._createPicker(); } + }, + + _expando_keypressHandler: function(event) + { + if ((null != event) && ((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode)))) + { + this._expando_clickHandler(); + } } }); @@ -2174,6 +2319,8 @@ alfresco.xforms.TimePicker = alfresco.xforms.Widget.extend({ alfresco.xforms.DateTimePicker = alfresco.xforms.Widget.extend({ initialize: function(xform, xformsNode, parentWidget) { + _createExternalLabels(_getDateTimePickerLabels(parentWidget.domNode)); + this.parent(xform, xformsNode, parentWidget); dojo.require("dojo.date.format"); this._noValueSet = (alfresco.resources["eg"] + " " + @@ -2237,12 +2384,24 @@ alfresco.xforms.DateTimePicker = alfresco.xforms.Widget.extend({ "onValueChanged", this, this._timePicker_valueChangedHandler); + + var expandoImage = document.getElementById(this.domNode.id + "-expanded-image"); + if (null != expandoImage) + { + expandoImage.alt = this._buildExpandoImageTitle(true); + } }, _destroyPicker: function() { if (this._pickerDiv) { + var expandoImage = document.getElementById(this.domNode.id + "-expanded-image"); + if (null != expandoImage) + { + expandoImage.alt = this._buildExpandoImageTitle(false); + } + this.domNode.removeChild(this._pickerDiv); this.widget.datePicker = null; this.widget.timePicker = null; @@ -2264,7 +2423,11 @@ alfresco.xforms.DateTimePicker = alfresco.xforms.Widget.extend({ var initial_value = this.getInitialValue(); attach_point.appendChild(this.domNode); - this.widget = new Element("input", { "id": this.id + "-widget", "type": "text" }); + this.widget = new Element("input", { "id": this.id + "-widget", "type": "text", "aria-live": "polite" }); + + this.widget.setAttribute("alt", alfresco.resources["date_time_picker_title"]); + this.widget.setAttribute("title", alfresco.resources["date_time_picker_title"]); + if (initial_value) { var jsDate = dojo.date.fromRfc3339(initial_value); @@ -2282,17 +2445,38 @@ alfresco.xforms.DateTimePicker = alfresco.xforms.Widget.extend({ this.widget.style.width = (3 * this.widget.offsetWidth) + "px"; var expandoImage = new Element("img"); + expandoImage.id = this.domNode.id + "-expanded-image"; expandoImage.setAttribute("src", alfresco.constants.WEBAPP_CONTEXT + "/images/icons/action.gif"); expandoImage.align = "absmiddle"; expandoImage.style.margin = "0px 5px"; + expandoImage.tabIndex = 0; + + var imageTitle = this._buildExpandoImageTitle(false); + + expandoImage.setAttribute("alt", imageTitle); + expandoImage.setAttribute("title", alfresco.resources["date_time_picker_title"]); this.domNode.appendChild(expandoImage); expandoImage.onclick = this._expando_clickHandler.bindAsEventListener(this); + expandoImage.onkeypress = this._expando_keypressHandler.bindAsEventListener(this); + this.widget.onfocus = this._dateTimeTextBox_focusHandler.bindAsEventListener(this); this.widget.onchange = this._dateTimeTextBox_changeHandler.bindAsEventListener(this); }, + _buildExpandoImageTitle: function(expanded) + { + var result = ""; + if ((null != this.labelNode) && (null != this.labelNode.getText()) && (this.labelNode.getText().length > 0)) + { + result = this.labelNode.getText() + " "; + } + result += alfresco.resources["date_time_picker_button_title"] + ". " + ((expanded) ? (alfresco.resources["state_expanded"]) : (alfresco.resources["state_not_expanded"])) + "."; + + return result; + }, + setValue: function(value, forceCommit) { if (!this.widget) @@ -2372,6 +2556,14 @@ alfresco.xforms.DateTimePicker = alfresco.xforms.Widget.extend({ { this._createPicker(); } + }, + + _expando_keypressHandler: function(event) + { + if ((null != event) && ((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode)))) + { + this._expando_clickHandler(); + } } }); @@ -2677,6 +2869,20 @@ alfresco.xforms.AbstractGroup = alfresco.xforms.Widget.extend({ id: child.id + "-label", "class": "xformsItemLabelContainer" }); + + var result = labelNode; + + var needsInLabel = (null != child.domNode) && (null != child.domNode.id) && !document.getElementById(child.domNode.id); + + if (needsInLabel) + { + var labelLabel = new Element("label", {"id": (child.id + "-accessibility-label")}); + + labelNode.appendChild(labelLabel); + + labelNode = labelLabel; + } + var requiredImage = new Element("img", { "class": "xformsItemRequiredImage" }); requiredImage.src = alfresco.xforms.AbstractGroup._requiredImage.src; @@ -2689,21 +2895,57 @@ alfresco.xforms.AbstractGroup = alfresco.xforms.Widget.extend({ var label = child.getLabel(); if (label) { - child.labelNode = labelNode; - child.labelNode.appendChild(document.createTextNode(label)); + child.labelNode = result; + + if (needsInLabel) + { + labelLabel.appendChild(document.createTextNode(label)); + } + else + { + child.labelNode.appendChild(document.createTextNode(label)); + } } var hint = child.getHint(); if (hint) { - labelNode.setAttribute("title", hint); - requiredImage.setAttribute("alt", hint); + result.setAttribute("title", hint); + requiredImage.setAttribute("alt", (alfresco.resources["mandatory_parameter"] + " " + hint)); } - labelNode.style.width = "0px"; - $pick(attach_point, child.domContainer).appendChild(labelNode); - labelNode.style.width = labelNode.scrollWidth + "px"; - return labelNode; + else + { + requiredImage.setAttribute("alt", alfresco.resources["mandatory_parameter"]); + } + result.style.width = "0px"; + $pick(attach_point, child.domContainer).appendChild(result); + result.style.width = result.scrollWidth + "px"; + + return result; }, + _findControlElement: function(element) + { + if ((("A" == element.tagName) || ("INPUT" == element.tagName) || ("SELECT" == element.tagName)) && ("hidden" != element.visibility) && ("none" != element.style.display) && (element.tabIndex >= 0)) + { + return element; + } + + if(null != element.children) + { + for (var i = 0; i < element.children.length; i++) + { + var result = this._findControlElement(element.children[i]); + + if(null != result) + { + return result; + } + } + } + + return null; + }, + ///////////////////////////////////////////////////////////////// // overridden methods & properties ///////////////////////////////////////////////////////////////// @@ -2876,7 +3118,14 @@ alfresco.xforms.VGroup = alfresco.xforms.AbstractGroup.extend({ } contentDiv.style.width = contentDivWidth; child.render(contentDiv); - + + var labelLabel = document.getElementById(child.id + "-accessibility-label"); + if (null != labelLabel) + { + var labelOwner = this._findControlElement(child.domNode); + labelLabel.setAttribute("for", ((null != labelOwner) ? (labelOwner) : (child.domNode)).id); + } + var oh = contentDiv.offsetHeight; var mt = contentDiv.getStyle("margin-top").toInt(); if (!(child instanceof alfresco.xforms.AbstractGroup)) @@ -2947,15 +3196,23 @@ alfresco.xforms.VGroup = alfresco.xforms.AbstractGroup.extend({ }); this.domNode.appendChild(this._groupHeaderNode); + var imageTitle = this._buildAccessibilityLabel(this.getLabel(), true); + this.toggleExpandedImage = new Element("img", { + "id": (this.id + "-exapndoImage"), "align": "absmiddle", "styles": { "margin": "0px 5px" }, - "src": alfresco.xforms.constants.EXPANDED_IMAGE.src + "src": alfresco.xforms.constants.EXPANDED_IMAGE.src, + "tabIndex": 0, + "alt": imageTitle, + "title": this.getLabel() }); - this._groupHeaderNode.appendChild(this.toggleExpandedImage); + this._configureHeadingElements(this._groupHeaderNode, this.toggleExpandedImage); + this.toggleExpandedImage.onclick = this._toggleExpanded_clickHandler.bindAsEventListener(this); - + this.toggleExpandedImage.onkeypress = this._toggleExpanded_keypressHandler.bindAsEventListener(this); + this._groupHeaderNode.appendChild(document.createTextNode(this.getLabel())); } attach_point.appendChild(this.domNode); @@ -2967,6 +3224,34 @@ alfresco.xforms.VGroup = alfresco.xforms.AbstractGroup.extend({ return this.domNode; }, + _buildAccessibilityLabel: function(label, expanded) + { + var result = ""; + if ((null != label) && (0 != label.length)) + { + result = label + ". "; + } + result += ((expanded) ? (alfresco.resources["state_expanded"]) : (alfresco.resources["state_not_expanded"])) + "."; + + return result; + }, + + _configureHeadingElements: function(parentWidget, child) + { + if (null != parentWidget) + { + var heading = new Element("span", + { + "id": (this.id + "-headingElement"), + "role": "heading", + "aria-level": "3", + "aria-labelledby": (this.id + "-exapndoImage") + }); + heading.appendChild(child); + parentWidget.appendChild(heading); + } + }, + /** Indicates if the group is expanded. */ isExpanded: function() { @@ -2987,6 +3272,9 @@ alfresco.xforms.VGroup = alfresco.xforms.AbstractGroup.extend({ ? alfresco.xforms.constants.EXPANDED_IMAGE.src : alfresco.xforms.constants.COLLAPSED_IMAGE.src); this.domNode.childContainerNode.style.display = expanded ? "block" : "none"; + + this.toggleExpandedImage.alt = this._buildAccessibilityLabel(this.getLabel(), this.isExpanded()); + this.toggleExpandedImage.title = this.toggleExpandedImage.alt; } }, @@ -3074,6 +3362,14 @@ alfresco.xforms.VGroup = alfresco.xforms.AbstractGroup.extend({ _toggleExpanded_clickHandler: function(event) { this.setExpanded(!this.isExpanded()); + }, + + _toggleExpanded_keypressHandler: function(event) + { + if ((null != event) && ((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode)))) + { + this.setExpanded(!this.isExpanded()); + } } }); @@ -3127,7 +3423,18 @@ alfresco.xforms.HGroup = alfresco.xforms.AbstractGroup.extend({ contentDiv.labelNode = labelNode; child.render(contentDiv); - + + var labelLabel = document.getElementById(child.id + "-accessibility-label"); + if (null != labelLabel) + { + var labelOwner = this._findControlElement(child.domNode); + labelLabel.setAttribute("for", ((null != labelOwner) ? (labelOwner) : (child.domNode)).id); + } + + var labelOwner = this._findControlElement(child.domNode); + var labelLabel = document.getElementById(child.id + "-accessibility-label"); + labelLabel.setAttribute("for", ((null != labelOwner) ? (labelOwner) : (child.domNode)).id); + var w = child.domNode.style.width; if (!w || w[w.length - 1] != "%") { @@ -3587,12 +3894,29 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ { var insertEnabled = this.isInsertRepeatItemEnabled(); var removeEnabled = this.isRemoveRepeatItemEnabled(); + + var label = this.getLabel(); + label = (null != label) ? (label + " ") : (""); + for (var i = 0; i < this._repeatControls.length; i++) { + var labelPrefix = label + alfresco.resources["item_title"] + " " + (i + 1) + ". " + this._repeatControls[i].moveRepeatItemUpImage.setOpacity(i == 0 ? .3 : 1); + this._repeatControls[i].moveRepeatItemUpImage.tabIndex = (0 == i) ? (-1) : (0); + this._repeatControls[i].moveRepeatItemUpImage.alt = labelPrefix + alfresco.resources["move_up_title"]; + this._repeatControls[i].moveRepeatItemDownImage.setOpacity(i == this._repeatControls.length - 1 ? .3 : 1); + this._repeatControls[i].moveRepeatItemDownImage.tabIndex = (i == (this._repeatControls.length - 1)) ? (-1) : (0); + this._repeatControls[i].moveRepeatItemDownImage.alt = labelPrefix + alfresco.resources["move_down_title"]; + this._repeatControls[i].insertRepeatItemImage.setOpacity(insertEnabled ? 1 : .3); + this._repeatControls[i].insertRepeatItemImage.tabIndex = (insertEnabled) ? (0) : (-1); + this._repeatControls[i].insertRepeatItemImage.alt = labelPrefix + alfresco.resources["add_item_title"]; + this._repeatControls[i].removeRepeatItemImage.setOpacity(removeEnabled ? 1 : .3); + this._repeatControls[i].removeRepeatItemImage.tabIndex = (removeEnabled) ? (0) : (-1); + this._repeatControls[i].removeRepeatItemImage.alt = labelPrefix + alfresco.resources["remove_item_title"]; } }, @@ -3615,12 +3939,14 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ _insertChildAt: function(child, position) { this._repeatControls.splice(position, 0, new Element("div")); + var label = this.parentWidget.getLabel(); // this.getLabel() breaks dynamic dispatching mechanism of mootools for _insertChildAt()! + var labelPrefix = ((null != label) ? (label + " ") : ("")) + "Item " + (position + 1) + ". "; var images = [ - { name: "insertRepeatItemImage", src: "plus", action: this._insertRepeatItemAfter_handler }, - { name: "moveRepeatItemUpImage", src: "arrow_up", action: this._moveRepeatItemUp_handler }, - { name: "moveRepeatItemDownImage", src: "arrow_down", action: this._moveRepeatItemDown_handler }, - { name: "removeRepeatItemImage", src: "minus", action: this._removeRepeatItem_handler } + { name: "insertRepeatItemImage", src: "plus", action: this._insertRepeatItemAfter_handler, accessibilityAction: this._insertRepeatItemAfter_keypressHandler, title: alfresco.resources["add_item_title"] }, + { name: "moveRepeatItemUpImage", src: "arrow_up", action: this._moveRepeatItemUp_handler, accessibilityAction: this._moveRepeatItemUp_keypressHandler, title: alfresco.resources["move_up_title"] }, + { name: "moveRepeatItemDownImage", src: "arrow_down", action: this._moveRepeatItemDown_handler, accessibilityAction: this._moveRepeatItemDown_keypressHandler, title: alfresco.resources["move_down_title"] }, + { name: "removeRepeatItemImage", src: "minus", action: this._removeRepeatItem_handler, accessibilityAction: this._removeRepeatItem_keypressHandler, title: alfresco.resources["remove_item_title"] } ]; var _repeatControlsWidth = 0; for (var i = 0; i < images.length; i++) @@ -3629,7 +3955,9 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ { "src": (alfresco.constants.WEBAPP_CONTEXT + "/images/icons/" + images[i].src + ".gif"), - "styles": { "width" : "16px", "height" : "16px" } + "styles": { "width" : "16px", "height" : "16px" }, + "alt": (labelPrefix + images[i].title), + "title": images[i].title }); this._repeatControls[position][images[i].name] = img; var imgMargin = [2, 5, 2, (i == 0 ? 5 : 0) ]; @@ -3637,6 +3965,7 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ _repeatControlsWidth += (parseInt(img.style.width) + imgMargin[1] + imgMargin[3]); this._repeatControls[position].appendChild(img); img.onclick = images[i].action.bindAsEventListener(this); + img.onkeypress = images[i].accessibilityAction.bindAsEventListener(this); } var result = this.parent(child, position); @@ -3691,6 +4020,7 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ _childAdded: function(child) { this.headerInsertRepeatItemImage.setOpacity(.3); + this.headerInsertRepeatItemImage.tabIndex = -1; this._updateRepeatControls(); }, @@ -3700,6 +4030,7 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ if (this._children.length == 0) { this.headerInsertRepeatItemImage.setOpacity(1); + this.headerInsertRepeatItemImage.tabIndex = 0; } this._updateRepeatControls(); }, @@ -3726,13 +4057,22 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ event.currentTarget.repeat.setFocusedChild(null); } }; - + + var imageTitle = ""; + if ((null != this.getLabel()) && (this.getLabel().length > 0)) + { + imageTitle = this.getLabel() + " "; + } + imageTitle += alfresco.resources["add_item_title"]; + this.headerInsertRepeatItemImage = new Element("img", { "align": "absmiddle", "src": alfresco.constants.WEBAPP_CONTEXT + "/images/icons/plus.gif", - "styles": { "margin-left": "5px", "width": "16px", "height": "16px" } + "styles": { "margin-left": "5px", "width": "16px", "height": "16px" }, + "title": alfresco.resources["add_item_title"], + "alt": imageTitle }); this.headerInsertRepeatItemImage.repeat = this; @@ -3740,6 +4080,7 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ this.headerInsertRepeatItemImage.onclick = this._headerInsertRepeatItemBefore_handler.bindAsEventListener(this); + this.headerInsertRepeatItemImage.onkeypress = this._headerInsertRepeatItemBefore_keypressHandler.bindAsEventListener(this); return this.domNode; }, @@ -3807,6 +4148,14 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ } }, + _insertRepeatItemAfter_keypressHandler: function(event) + { + if ((null != event) && ((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode)))) + { + this._insertRepeatItemAfter_handler(event); + } + }, + /** * Event handler for insert before. If insert is enabled, causes a setRepeatIndeces * and an insert. @@ -3826,6 +4175,14 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ } }, + _headerInsertRepeatItemBefore_keypressHandler: function(event) + { + if ((null != event) && ((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode)))) + { + this._headerInsertRepeatItemBefore_handler(event); + } + }, + /** * Event handler for remove. If remove is enabled, causes a setRepeatIndeces * and an delete. @@ -3844,6 +4201,14 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ } }, + _removeRepeatItem_keypressHandler: function(event) + { + if ((null != event) && ((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode)))) + { + this._removeRepeatItem_handler(event); + } + }, + /** * Event handler for move up. Calls swap children with the child before * if the current select child is not the first child. @@ -3861,6 +4226,14 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ } }, + _moveRepeatItemUp_keypressHandler: function(event) + { + if ((null != event) && ((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode)))) + { + this._moveRepeatItemUp_handler(event); + } + }, + /** * Event handler for move down. Calls swap children with the child after * if the current select child is not the last child. @@ -3878,6 +4251,14 @@ alfresco.xforms.Repeat = alfresco.xforms.VGroup.extend({ } }, + _moveRepeatItemDown_keypressHandler: function(event) + { + if ((null != event) && ((13 == event.keyCode) || (32 == event.keyCode) || ((null != event.charCode) && (32 == event.charCode)))) + { + this._moveRepeatItemDown_handler(event); + } + }, + ///////////////////////////////////////////////////////////////// // XForms event handlers ///////////////////////////////////////////////////////////////// @@ -4492,6 +4873,8 @@ alfresco.xforms.XForm = new Class({ this._handleEventLog.bindAsEventListener(this)); }, + _previousInvalidWidgets: null, + /** Handles the xforms event log resulting from a call to the XFormsBean. */ _handleEventLog: function(events) { @@ -4715,15 +5098,23 @@ alfresco.xforms.XForm = new Class({ { this.submitWidget = null; var invalid_widgets = this.rootWidget.getWidgetsInvalidForSubmit(); - _show_error(document.createTextNode(alfresco.resources["validation_provide_values_for_required_fields"])); + _show_error(document.createTextNode(alfresco.resources["validation_provide_values_for_required_fields"]), invalid_widgets.length); var error_list = document.createElement("ul"); + + _removeAccessibilityErrorNotification(this._previousInvalidWidgets); + var strongTabIndex = 2; invalid_widgets.each(function(invalid) { var error_item = document.createElement("li"); + error_item.id = invalid.domNode.id + "-alertItem"; error_item.appendChild(document.createTextNode(invalid.getAlert())); error_list.appendChild(error_item); + _applyAccessibilityErrorNotification(invalid, strongTabIndex++, error_item.id); invalid.showAlert(); }); + + this._previousInvalidWidgets = invalid_widgets; + _show_error(error_list); break; } @@ -4764,10 +5155,18 @@ function _hide_errors() errorDiv.empty(); errorDiv.style.display = "none"; } + + var errorLink = $("errorLink-with-key-v"); + if (null != errorLink) + { + errorLink.tabIndex = -1; + errorLink.parentNode.removeChild(errorLink); + errorLink = null; + } } /** shows the error message display. */ -function _show_error(msg) +function _show_error(msg, errorCount) { var errorDiv = $(alfresco.xforms.constants.XFORMS_ERROR_DIV_ID); if (!errorDiv) @@ -4777,6 +5176,44 @@ function _show_error(msg) errorDiv.injectBefore($(alfresco.xforms.constants.XFORMS_UI_DIV_ID)); } + var errorLink = $("errorLink-with-key-v"); + if (null == errorLink) + { + errorLink = new Element("a", + { + "id": "errorLink-with-key-v", + "src": "javascript: ;", + "accessKey": "v", + "role": "alert", + "tabIndex": 1 + }); + errorLink.onclick = "return false;" + errorLink.onmousedown = "return false;" + + var errorMessage = new Element("div", + { + "id": "accessibility-error-message" + }); + + if (null != errorCount) + { + errorMessage.appendChild(document.createTextNode(errorCount + " " + alfresco.resources["accessibility_validation_message_with_error_count"])); + } + else + { + errorMessage.appendChild(document.createTextNode(alfresco.resources["accessibility_validation_message"])); + } + + errorLink.appendChild(errorMessage); + errorLink.injectBefore($(alfresco.xforms.constants.XFORMS_ERROR_DIV_ID)); + + errorMessage.style.width = "1px"; + errorMessage.style.height = "1px"; + errorMessage.style.filter = "alpha(opacity=0.01)"; + errorMessage.style.color = "transparent"; + errorMessage.style.overflow = "hidden"; + } + if (errorDiv.style.display == "block") { errorDiv.appendChild(document.createElement("br")); @@ -4786,6 +5223,194 @@ function _show_error(msg) errorDiv.style.display = "block"; } errorDiv.appendChild(msg); + + errorLink.focus(); +} + +//////////////////////////////////////////////////////////////////////////////// +// Accessibility helpers related to the fields validation +//////////////////////////////////////////////////////////////////////////////// + +function _getDateTimePickerLabels(parent) +{ + return [ + { + "tagName": "div", + "id": "increase-week-label", + "style": "width: 1px; height: 1px; filter: alpha(opacity=0.01); color: transparent; overflow: hidden", + "parent": parent, + "text": alfresco.resources["increase_week_label"] + }, + { + "tagName": "div", + "id": "increase-month-label", + "style": "width: 1px; height: 1px; filter: alpha(opacity=0.01); color: transparent; overflow: hidden", + "parent": parent, + "text": alfresco.resources["increase_month_label"] + }, + { + "tagName": "div", + "id": "decrease-week-label", + "style": "width: 1px; height: 1px; filter: alpha(opacity=0.01); color: transparent; overflow: hidden", + "parent": parent, + "text": alfresco.resources["decrease_week_label"] + }, + { + "tagName": "div", + "id": "decrease-month-label", + "style": "width: 1px; height: 1px; filter: alpha(opacity=0.01); color: transparent; overflow: hidden", + "parent": parent, + "text": alfresco.resources["decrease_month_label"] + } + ]; +} + +function _createExternalLabels(labelIds) +{ + if ((null == labelIds) || (null == labelIds.length) || (0 == labelIds.length)) + { + return; + } + + for (var i = 0; i < labelIds.length; i++) + { + var el = labelIds[i]; + if (null == document.getElementById(el.id)) + { + var label = new Element(el.tagName, + { + "id": el.id, + "style": el.style + }); + + if (null != el.parent) + { + el.parent.appendChild(label); + } + else + { + document.appendChild(label); + } + + label.appendChild(document.createTextNode(el.text)); + } + } +} + +function _removeAccessibilityErrorNotification(widgets) +{ + if (null != widgets) + { + widgets.each(function(invalid) + { + _applyAccessibilityErrorNotification(invalid, 0, null); + }); + } +} + +function _applyAccessibilityErrorNotification(field, tabIndex, alertId) +{ + if ((null == field) || (null == tabIndex)) + { + return; + } + + var control = _findFirstControl(field.domNode); + + if (null != control) + { + control.tabIndex = tabIndex; + + if (null == alertId) + { + control.removeAttribute("aria-labelledby"); + } + else + { + control.setAttribute("aria-labelledby", alertId); + } + + if ((tabIndex > 0) && (null == control.getAttribute("role"))) + { + switch (control.tagName) + { + case "SELECT": + { + control.setAttribute("role", ((control.multiple) ? ("listbox") : ("combobox"))); + break; + } + case "A": + { + control.setAttribute("role", "link"); + break; + } + case "TEXTAREA": case "DIV": + { + control.setAttribute("role", "textbox"); + control.setAttribute("aria-multiline", true); + break; + } + case "INPUT": + { + switch (control.type) + { + case "button": case "checkbox": case "radio": + { + control.setAttribute("role", control.type); + break; + } + case "hidden": case "password": case "text": + { + control.setAttribute("role", "textbox"); + break; + } + case "submit": case "reset": + { + control.setAttribute("role", "button"); + } + } + } + } + } + else + { + if (0 == tabIndex) + { + control.removeAttribute("role"); + } + } + } +} + +function _findFirstControl(element) +{ + if (null == element) + { + return null; + } + + if (("INPUT" == element.tagName) || ("SELECT" == element.tagName) || ("TEXTAREA" == element.tagName) || ((null != element.id) && (0 == element.id.toLowerCase().indexOf("textarea")))) + { + if (("DIV" == element.tagName) && (null != element.parentNode.children) && (0 != element.parentNode.children.length) && ("A" == element.parentNode.children[0].tagName)) + { + return element.parentNode.children[0]; + } + return element; + } + + if (null != element.children) + { + for (var i = 0; i < element.children.length; i++) + { + var result = _findFirstControl(element.children[i]); + if (null != result) + { + return result; + } + } + } + + return null; } //////////////////////////////////////////////////////////////////////////////// diff --git a/source/web/scripts/tiny_mce/classes/ui/Button.js b/source/web/scripts/tiny_mce/classes/ui/Button.js index f683114443..2bee37c64f 100644 --- a/source/web/scripts/tiny_mce/classes/ui/Button.js +++ b/source/web/scripts/tiny_mce/classes/ui/Button.js @@ -45,7 +45,7 @@ if (s.image) h += '' + l + ''; else - h += '' + (l ? '' + l + '' : '') + ''; + h += '
' + s.title + '
' + (l ? '' + l + '' : '') + ''; return h; }, diff --git a/source/web/scripts/tiny_mce/classes/ui/SplitButton.js b/source/web/scripts/tiny_mce/classes/ui/SplitButton.js index b2fa481430..dca72e4870 100644 --- a/source/web/scripts/tiny_mce/classes/ui/SplitButton.js +++ b/source/web/scripts/tiny_mce/classes/ui/SplitButton.js @@ -42,13 +42,22 @@ if (s.image) h1 = DOM.createHTML('img ', {src : s.image, 'class' : 'mceAction ' + s['class']}); - else - h1 = DOM.createHTML('span', {'class' : 'mceAction ' + s['class']}, ''); + else { + var titleDiv = DOM.createHTML("div", { + "style": "clear: none; width: 1px; height: 1px; filter: alpha(opacity=0.01); color: transparent; overflow: hidden;" + }, s.title); + h1 = DOM.createHTML('span', {'class' : 'mceAction ' + s['class']}, titleDiv); + } h += '' + DOM.createHTML('a', {id : t.id + '_action', href : 'javascript:;', 'class' : 'mceAction ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + ''; h1 = DOM.createHTML('span', {'class' : 'mceOpen ' + s['class']}); - h += '' + DOM.createHTML('a', {id : t.id + '_open', href : 'javascript:;', 'class' : 'mceOpen ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + ''; + + var titleDiv = DOM.createHTML("div", { + "style": "clear: none; width: 1px; height: 1px; filter: alpha(opacity=0.01); color: transparent; overflow: hidden;" + }, h1); + + h += '' + DOM.createHTML('a', {id : t.id + '_open', href : 'javascript:;', 'class' : 'mceOpen ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, titleDiv) + ''; h += ''; diff --git a/source/web/scripts/tiny_mce/tiny_mce.js b/source/web/scripts/tiny_mce/tiny_mce.js index 8c511f385b..f9a6011290 100644 --- a/source/web/scripts/tiny_mce/tiny_mce.js +++ b/source/web/scripts/tiny_mce/tiny_mce.js @@ -1 +1 @@ -var tinymce={majorVersion:"3",minorVersion:"2.7",releaseDate:"2009-09-22",_init:function(){var o=this,k=document,l=window,j=navigator,b=j.userAgent,h,a,g,f,e,m;o.isOpera=l.opera&&opera.buildNumber;o.isWebKit=/WebKit/.test(b);o.isIE=!o.isWebKit&&!o.isOpera&&(/MSIE/gi).test(b)&&(/Explorer/gi).test(j.appName);o.isIE6=o.isIE&&/MSIE [56]/.test(b);o.isGecko=!o.isWebKit&&/Gecko/.test(b);o.isMac=b.indexOf("Mac")!=-1;o.isAir=/adobeair/i.test(b);if(l.tinyMCEPreInit){o.suffix=tinyMCEPreInit.suffix;o.baseURL=tinyMCEPreInit.base;o.query=tinyMCEPreInit.query;return}o.suffix="";a=k.getElementsByTagName("base");for(h=0;h=c.length){for(e=0,b=g.length;e=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length=g.length||g[e]!=c[e]){f=e+1;break}}}if(f==1){return h}for(e=0,b=g.length-(f-1);e=0;c--){if(f[c].length==0||f[c]=="."){continue}if(f[c]==".."){b++;continue}if(b>0){b--;continue}h.push(f[c])}c=e.length-b;if(c<=0){g=h.reverse().join("/")}else{g=e.slice(0,c).join("/")+"/"+h.reverse().join("/")}if(g.indexOf("/")!==0){g="/"+g}if(d&&g.lastIndexOf("/")!==g.length-1){g+=d}return g},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!=0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(e,b){var c=new Date();c.setTime(c.getTime()-1000);this.set(e,"",c,b,c)}})})();tinymce.create("static tinymce.util.JSON",{serialize:function(e){var c,a,d=tinymce.util.JSON.serialize,b;if(e==null){return"null"}b=typeof e;if(b=="string"){a="\bb\tt\nn\ff\rr\"\"''\\\\";return'"'+e.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g,function(g,f){c=a.indexOf(f);if(c+1){return"\\"+a.charAt(c+1)}g=f.charCodeAt().toString(16);return"\\u"+"0000".substring(g.length)+g})+'"'}if(b=="object"){if(e.hasOwnProperty&&e instanceof Array){for(c=0,a="[";c0?",":"")+d(e[c])}return a+"]"}a="{";for(c in e){a+=typeof e[c]!="function"?(a.length>1?',"':'"')+c+'":'+d(e[c]):""}return a+"}"}return""+e},parse:function(s){try{return eval("("+s+")")}catch(ex){}}});tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.setRequestHeader("X-Requested-With","XMLHttpRequest");a.send(g.data);function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){e.call(f.error_scope||f.scope,h,g)};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(c){var e=c.each,b=c.is;var d=c.isWebKit,a=c.isIE;c.create("tinymce.dom.DOMUtils",{doc:null,root:null,files:null,pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,props:{"for":"htmlFor","class":"className",className:"className",checked:"checked",disabled:"disabled",maxlength:"maxLength",readonly:"readOnly",selected:"selected",value:"value",id:"id",name:"name",type:"type"},DOMUtils:function(i,g){var f=this;f.doc=i;f.win=window;f.files={};f.cssFlicker=false;f.counter=0;f.boxModel=!c.isIE||i.compatMode=="CSS1Compat";f.stdMode=i.documentMode===8;f.settings=g=c.extend({keep_values:false,hex_colors:1,process_html:1},g);if(c.isIE6){try{i.execCommand("BackgroundImageCache",false,true)}catch(h){f.cssFlicker=true}}c.addUnload(f.destroy,f)},getRoot:function(){var f=this,g=f.settings;return(g&&f.get(g.root_element))||f.doc.body},getViewPort:function(g){var h,f;g=!g?this.win:g;h=g.document;f=this.boxModel?h.documentElement:h.body;return{x:g.pageXOffset||f.scrollLeft,y:g.pageYOffset||f.scrollTop,w:g.innerWidth||f.clientWidth,h:g.innerHeight||f.clientHeight}},getRect:function(i){var h,f=this,g;i=f.get(i);h=f.getPos(i);g=f.getSize(i);return{x:h.x,y:h.y,w:g.w,h:g.h}},getSize:function(j){var g=this,f,i;j=g.get(j);f=g.getStyle(j,"width");i=g.getStyle(j,"height");if(f.indexOf("px")===-1){f=0}if(i.indexOf("px")===-1){i=0}return{w:parseInt(f)||j.offsetWidth||j.clientWidth,h:parseInt(i)||j.offsetHeight||j.clientHeight}},getParent:function(i,h,g){return this.getParents(i,h,g,false)},getParents:function(p,k,i,m){var h=this,g,j=h.settings,l=[];p=h.get(p);m=m===undefined;if(j.strict_root){i=i||h.getRoot()}if(b(k,"string")){g=k;if(k==="*"){k=function(f){return f.nodeType==1}}else{k=function(f){return h.is(f,g)}}}while(p){if(p==i||!p.nodeType||p.nodeType===9){break}if(!k||k(p)){if(m){l.push(p)}else{return p}}p=p.parentNode}return m?l:null},get:function(f){var g;if(f&&this.doc&&typeof(f)=="string"){g=f;f=this.doc.getElementById(f);if(f&&f.id!==g){return this.doc.getElementsByName(g)[1]}}return f},getNext:function(g,f){return this._findSib(g,f,"nextSibling")},getPrev:function(g,f){return this._findSib(g,f,"previousSibling")},select:function(h,g){var f=this;return c.dom.Sizzle(h,f.get(g)||f.get(f.settings.root_element)||f.doc,[])},is:function(g,f){return c.dom.Sizzle.matches(f,g.nodeType?[g]:g).length>0},add:function(j,l,f,i,k){var g=this;return this.run(j,function(n){var m,h;m=b(l,"string")?g.doc.createElement(l):l;g.setAttribs(m,f);if(i){if(i.nodeType){m.appendChild(i)}else{g.setHTML(m,i)}}return !k?n.appendChild(m):m})},create:function(i,f,g){return this.add(this.doc.createElement(i),i,f,g,1)},createHTML:function(m,f,j){var l="",i=this,g;l+="<"+m;for(g in f){if(f.hasOwnProperty(g)){l+=" "+g+'="'+i.encode(f[g])+'"'}}if(c.is(j)){return l+">"+j+""}return l+" />"},remove:function(h,f){var g=this;return this.run(h,function(m){var l,k,j;l=m.parentNode;if(!l){return null}if(f){for(j=m.childNodes.length-1;j>=0;j--){g.insertAfter(m.childNodes[j],m)}}if(g.fixPsuedoLeaks){l=m.cloneNode(true);f="IELeakGarbageBin";k=g.get(f)||g.add(g.doc.body,"div",{id:f,style:"display:none"});k.appendChild(m);k.innerHTML="";return l}return l.removeChild(m)})},setStyle:function(i,f,g){var h=this;return h.run(i,function(l){var k,j;k=l.style;f=f.replace(/-(\D)/g,function(n,m){return m.toUpperCase()});if(h.pixelStyles.test(f)&&(c.is(g,"number")||/^[\-0-9\.]+$/.test(g))){g+="px"}switch(f){case"opacity":if(a){k.filter=g===""?"":"alpha(opacity="+(g*100)+")";if(!i.currentStyle||!i.currentStyle.hasLayout){k.display="inline-block"}}k[f]=k["-moz-opacity"]=k["-khtml-opacity"]=g||"";break;case"float":a?k.styleFloat=g:k.cssFloat=g;break;default:k[f]=g||""}if(h.settings.update_styles){h.setAttrib(l,"mce_style")}})},getStyle:function(i,f,h){i=this.get(i);if(!i){return false}if(this.doc.defaultView&&h){f=f.replace(/[A-Z]/g,function(j){return"-"+j});try{return this.doc.defaultView.getComputedStyle(i,null).getPropertyValue(f)}catch(g){return null}}f=f.replace(/-(\D)/g,function(k,j){return j.toUpperCase()});if(f=="float"){f=a?"styleFloat":"cssFloat"}if(i.currentStyle&&h){return i.currentStyle[f]}return i.style[f]},setStyles:function(i,j){var g=this,h=g.settings,f;f=h.update_styles;h.update_styles=0;e(j,function(k,l){g.setStyle(i,l,k)});h.update_styles=f;if(h.update_styles){g.setAttrib(i,h.cssText)}},setAttrib:function(h,i,f){var g=this;if(!h||!i){return}if(g.settings.strict){i=i.toLowerCase()}return this.run(h,function(k){var j=g.settings;switch(i){case"style":if(!b(f,"string")){e(f,function(l,m){g.setStyle(k,m,l)});return}if(j.keep_values){if(f&&!g._isRes(f)){k.setAttribute("mce_style",f,2)}else{k.removeAttribute("mce_style",2)}}k.style.cssText=f;break;case"class":k.className=f||"";break;case"src":case"href":if(j.keep_values){if(j.url_converter){f=j.url_converter.call(j.url_converter_scope||g,f,i,k)}g.setAttrib(k,"mce_"+i,f,2)}break;case"shape":k.setAttribute("mce_style",f);break}if(b(f)&&f!==null&&f.length!==0){k.setAttribute(i,""+f,2)}else{k.removeAttribute(i,2)}})},setAttribs:function(g,h){var f=this;return this.run(g,function(i){e(h,function(j,k){f.setAttrib(i,k,j)})})},getAttrib:function(i,j,h){var f,g=this;i=g.get(i);if(!i||i.nodeType!==1){return false}if(!b(h)){h=""}if(/^(src|href|style|coords|shape)$/.test(j)){f=i.getAttribute("mce_"+j);if(f){return f}}if(a&&g.props[j]){f=i[g.props[j]];f=f&&f.nodeValue?f.nodeValue:f}if(!f){f=i.getAttribute(j,2)}if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(j)){if(i[g.props[j]]===true&&f===""){return j}return f?j:""}if(i.nodeName==="FORM"&&i.getAttributeNode(j)){return i.getAttributeNode(j).nodeValue}if(j==="style"){f=f||i.style.cssText;if(f){f=g.serializeStyle(g.parseStyle(f));if(g.settings.keep_values&&!g._isRes(f)){i.setAttribute("mce_style",f)}}}if(d&&j==="class"&&f){f=f.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(a){switch(j){case"rowspan":case"colspan":if(f===1){f=""}break;case"size":if(f==="+0"||f===20||f===0){f=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(f===0){f=""}break;case"hspace":if(f===-1){f=""}break;case"maxlength":case"tabindex":if(f===32768||f===2147483647||f==="32768"){f=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(f===65535){return j}return h;case"shape":f=f.toLowerCase();break;default:if(j.indexOf("on")===0&&f){f=(""+f).replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1")}}}return(f!==undefined&&f!==null&&f!=="")?""+f:h},getPos:function(m,i){var g=this,f=0,l=0,j,k=g.doc,h;m=g.get(m);i=i||k.body;if(m){if(a&&!g.stdMode){m=m.getBoundingClientRect();j=g.boxModel?k.documentElement:k.body;f=g.getStyle(g.select("html")[0],"borderWidth");f=(f=="medium"||g.boxModel&&!g.isIE6)&&2||f;m.top+=g.win.self!=g.win.top?2:0;return{x:m.left+j.scrollLeft-f,y:m.top+j.scrollTop-f}}h=m;while(h&&h!=i&&h.nodeType){f+=h.offsetLeft||0;l+=h.offsetTop||0;h=h.offsetParent}h=m.parentNode;while(h&&h!=i&&h.nodeType){f-=h.scrollLeft||0;l-=h.scrollTop||0;h=h.parentNode}}return{x:f,y:l}},parseStyle:function(h){var i=this,j=i.settings,k={};if(!h){return k}function f(w,q,v){var o,u,m,n;o=k[w+"-top"+q];if(!o){return}u=k[w+"-right"+q];if(o!=u){return}m=k[w+"-bottom"+q];if(u!=m){return}n=k[w+"-left"+q];if(m!=n){return}k[v]=n;delete k[w+"-top"+q];delete k[w+"-right"+q];delete k[w+"-bottom"+q];delete k[w+"-left"+q]}function g(n,m,l,p){var o;o=k[m];if(!o){return}o=k[l];if(!o){return}o=k[p];if(!o){return}k[n]=k[m]+" "+k[l]+" "+k[p];delete k[m];delete k[l];delete k[p]}h=h.replace(/&(#?[a-z0-9]+);/g,"&$1_MCE_SEMI_");e(h.split(";"),function(m){var l,n=[];if(m){m=m.replace(/_MCE_SEMI_/g,";");m=m.replace(/url\([^\)]+\)/g,function(o){n.push(o);return"url("+n.length+")"});m=m.split(":");l=c.trim(m[1]);l=l.replace(/url\(([^\)]+)\)/g,function(p,o){return n[parseInt(o)-1]});l=l.replace(/rgb\([^\)]+\)/g,function(o){return i.toHex(o)});if(j.url_converter){l=l.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g,function(o,p){return"url("+j.url_converter.call(j.url_converter_scope||i,i.decode(p),"style",null)+")"})}k[c.trim(m[0]).toLowerCase()]=l}});f("border","","border");f("border","-width","border-width");f("border","-color","border-color");f("border","-style","border-style");f("padding","","padding");f("margin","","margin");g("border","border-width","border-style","border-color");if(a){if(k.border=="medium none"){k.border=""}}return k},serializeStyle:function(g){var f="";e(g,function(i,h){if(h&&i){if(c.isGecko&&h.indexOf("-moz-")===0){return}switch(h){case"color":case"background-color":i=i.toLowerCase();break}f+=(f?" ":"")+h+": "+i+";"}});return f},loadCSS:function(f){var h=this,i=h.doc,g;if(!f){f=""}g=h.select("head")[0];e(f.split(","),function(j){var k;if(h.files[j]){return}h.files[j]=true;k=h.create("link",{rel:"stylesheet",href:c._addVer(j)});if(a&&i.documentMode){k.onload=function(){i.recalc();k.onload=null}}g.appendChild(k)})},addClass:function(f,g){return this.run(f,function(h){var i;if(!g){return 0}if(this.hasClass(h,g)){return h.className}i=this.removeClass(h,g);return h.className=(i!=""?(i+" "):"")+g})},removeClass:function(h,i){var f=this,g;return f.run(h,function(k){var j;if(f.hasClass(k,i)){if(!g){g=new RegExp("(^|\\s+)"+i+"(\\s+|$)","g")}j=k.className.replace(g," ");return k.className=c.trim(j!=" "?j:"")}return k.className})},hasClass:function(g,f){g=this.get(g);if(!g||!f){return false}return(" "+g.className+" ").indexOf(" "+f+" ")!==-1},show:function(f){return this.setStyle(f,"display","block")},hide:function(f){return this.setStyle(f,"display","none")},isHidden:function(f){f=this.get(f);return !f||f.style.display=="none"||this.getStyle(f,"display")=="none"},uniqueId:function(f){return(!f?"mce_":f)+(this.counter++)},setHTML:function(i,g){var f=this;return this.run(i,function(m){var h,k,j,q,l,h;g=f.processHTML(g);if(a){function o(){try{m.innerHTML="
"+g;m.removeChild(m.firstChild)}catch(n){while(m.firstChild){m.firstChild.removeNode()}h=f.create("div");h.innerHTML="
"+g;e(h.childNodes,function(r,p){if(p){m.appendChild(r)}})}}if(f.settings.fix_ie_paragraphs){g=g.replace(/

<\/p>|]+)><\/p>|/gi,' 

')}o();if(f.settings.fix_ie_paragraphs){j=m.getElementsByTagName("p");for(k=j.length-1,h=0;k>=0;k--){q=j[k];if(!q.hasChildNodes()){if(!q.mce_keep){h=1;break}q.removeAttribute("mce_keep")}}}if(h){g=g.replace(/

]+)>|

/ig,'

');g=g.replace(/<\/p>/g,"
");o();if(f.settings.fix_ie_paragraphs){j=m.getElementsByTagName("DIV");for(k=j.length-1;k>=0;k--){q=j[k];if(q.mce_tmp){l=f.doc.createElement("p");q.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi,function(p,n){var r;if(n!=="mce_tmp"){r=q.getAttribute(n);if(!r&&n==="class"){r=q.className}l.setAttribute(n,r)}});for(h=0;h|]+)>/gi,"<$1b$2>");j=j.replace(/<(\/?)em>|]+)>/gi,"<$1i$2>")}else{if(a){j=j.replace(/'/g,"'");j=j.replace(/\s+(disabled|checked|readonly|selected)\s*=\s*[\"\']?(false|0)[\"\']?/gi,"")}}j=j.replace(/]+)\/>|/gi,"");if(i.keep_values){if(/)/g,"\n");h=h.replace(/^[\r\n]*|[\r\n]*$/g,"");h=h.replace(/^\s*(\/\/\s*|\]\]>|-->|\]\]-->)\s*$/g,"");return h}j=j.replace(/]+|)>([\s\S]*?)<\/script>/gi,function(h,m,l){if(!m){m=' type="text/javascript"'}m=m.replace(/src=\"([^\"]+)\"?/i,function(n,o){if(i.url_converter){o=g.encode(i.url_converter.call(i.url_converter_scope||g,g.decode(o),"src","script"))}return'mce_src="'+o+'"'});if(c.trim(l)){k.push(f(l));l=""}return""+l+""});j=j.replace(/]+|)>([\s\S]*?)<\/style>/gi,function(h,m,l){if(l){k.push(f(l));l=""}return""+l+""});j=j.replace(/]+|)>([\s\S]*?)<\/noscript>/g,function(h,m,l){return""})}j=j.replace(//g,"");j=j.replace(/<([\w:]+) [^>]*(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)[^>]*>/gi,function(l){function h(o,m,n){if(n==="false"||n==="0"){return""}return" "+m+'="'+m+'"'}l=l.replace(/ (checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)=[\"]([^\"]+)[\"]/gi,h);l=l.replace(/ (checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)=[\']([^\']+)[\']/gi,h);l=l.replace(/ (checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)=([^\s\"\'>]+)/gi,h);l=l.replace(/ (checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)([\s>])/gi,' $1="$1"$2');return l});j=j.replace(/<([\w:]+) [^>]*(src|href|style|shape|coords)[^>]*>/gi,function(h,m){function l(o,n,q){var p=q;if(h.indexOf("mce_"+n)!=-1){return o}if(n=="style"){if(g._isRes(q)){return o}p=g.encode(g.serializeStyle(g.parseStyle(p)))}else{if(n!="coords"&&n!="shape"){if(i.url_converter){p=g.encode(i.url_converter.call(i.url_converter_scope||g,g.decode(q),n,m))}}}return" "+n+'="'+q+'" mce_'+n+'="'+p+'"'}h=h.replace(/ (src|href|style|coords|shape)=[\"]([^\"]+)[\"]/gi,l);h=h.replace(/ (src|href|style|coords|shape)=[\']([^\']+)[\']/gi,l);return h.replace(/ (src|href|style|coords|shape)=([^\s\"\'>]+)/gi,l)});j=j.replace(/MCE_SCRIPT:([0-9]+)/g,function(l,h){return k[h]})}return j},getOuterHTML:function(f){var g;f=this.get(f);if(!f){return null}if(f.outerHTML!==undefined){return f.outerHTML}g=(f.ownerDocument||this.doc).createElement("body");g.appendChild(f.cloneNode(true));return g.innerHTML},setOuterHTML:function(j,g,k){var f=this;function i(m,l,p){var q,o;o=p.createElement("body");o.innerHTML=l;q=o.lastChild;while(q){f.insertAfter(q.cloneNode(true),m);q=q.previousSibling}f.remove(m)}return this.run(j,function(l){l=f.get(l);if(l.nodeType==1){k=k||l.ownerDocument||f.doc;if(a){try{if(a&&l.nodeType==1){l.outerHTML=g}else{i(l,g,k)}}catch(h){i(l,g,k)}}else{i(l,g,k)}}})},decode:function(g){var h,i,f;if(/&[^;]+;/.test(g)){h=this.doc.createElement("div");h.innerHTML=g;i=h.firstChild;f="";if(i){do{f+=i.nodeValue}while(i.nextSibling)}return f||g}return g},encode:function(f){return f?(""+f).replace(/[<>&\"]/g,function(h,g){switch(h){case"&":return"&";case'"':return""";case"<":return"<";case">":return">"}return h}):f},insertAfter:function(h,g){var f=this;g=f.get(g);return this.run(h,function(k){var j,i;j=g.parentNode;i=g.nextSibling;if(i){j.insertBefore(k,i)}else{j.appendChild(k)}return k})},isBlock:function(f){if(f.nodeType&&f.nodeType!==1){return false}f=f.nodeName||f;return/^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TH|TBODY|TR|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(f)},replace:function(i,h,f){var g=this;if(b(h,"array")){i=i.cloneNode(true)}return g.run(h,function(j){if(f){e(j.childNodes,function(k){i.appendChild(k.cloneNode(true))})}if(g.fixPsuedoLeaks&&j.nodeType===1){j.parentNode.insertBefore(i,j);g.remove(j);return i}return j.parentNode.replaceChild(i,j)})},findCommonAncestor:function(h,f){var i=h,g;while(i){g=f;while(g&&i!=g){g=g.parentNode}if(i==g){break}i=i.parentNode}if(!i&&h.ownerDocument){return h.ownerDocument.documentElement}return i},toHex:function(f){var h=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(f);function g(i){i=parseInt(i).toString(16);return i.length>1?i:"0"+i}if(h){f="#"+g(h[1])+g(h[2])+g(h[3]);return f}return f},getClasses:function(){var l=this,g=[],k,m={},n=l.settings.class_filter,j;if(l.classes){return l.classes}function o(f){e(f.imports,function(i){o(i)});e(f.cssRules||f.rules,function(i){switch(i.type||1){case 1:if(i.selectorText){e(i.selectorText.split(","),function(p){p=p.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(p)||!/\.[\w\-]+$/.test(p)){return}j=p;p=p.replace(/.*\.([a-z0-9_\-]+).*/i,"$1");if(n&&!(p=n(p,j))){return}if(!m[p]){g.push({"class":p});m[p]=1}})}break;case 3:o(i.styleSheet);break}})}try{e(l.doc.styleSheets,o)}catch(h){}if(g.length>0){l.classes=g}return g},run:function(j,i,h){var g=this,k;if(g.doc&&typeof(j)==="string"){j=g.get(j)}if(!j){return false}h=h||this;if(!j.nodeType&&(j.length||j.length===0)){k=[];e(j,function(l,f){if(l){if(typeof(l)=="string"){l=g.doc.getElementById(l)}k.push(i.call(h,l,f))}});return k}return i.call(h,j)},getAttribs:function(g){var f;g=this.get(g);if(!g){return[]}if(a){f=[];if(g.nodeName=="OBJECT"){return g.attributes}if(g.nodeName==="OPTION"&&this.getAttrib(g,"selected")){f.push({specified:1,nodeName:"selected"})}g.cloneNode(false).outerHTML.replace(/<\/?[\w:]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=\w+|>/gi,"").replace(/[\w:]+/gi,function(h){f.push({specified:1,nodeName:h})});return f}return g.attributes},destroy:function(g){var f=this;if(f.events){f.events.destroy()}f.win=f.doc=f.root=f.events=null;if(!g){c.removeUnload(f.destroy)}},createRng:function(){var f=this.doc;return f.createRange?f.createRange():new c.dom.Range(this)},split:function(l,k,o){var p=this,f=p.createRng(),m,j,n;function g(r,q){r=r[q];if(r&&r[q]&&r[q].nodeType==1&&i(r[q])){p.remove(r[q])}}function i(q){q=p.getOuterHTML(q);q=q.replace(/<(img|hr|table)/gi,"-");q=q.replace(/<[^>]+>/g,"");return q.replace(/[ \t\r\n]+| | /g,"")==""}function h(r){var q=0;while(r.previousSibling){q++;r=r.previousSibling}return q}if(l&&k){f.setStart(l.parentNode,h(l));f.setEnd(k.parentNode,h(k));m=f.extractContents();f=p.createRng();f.setStart(k.parentNode,h(k)+1);f.setEnd(l.parentNode,h(l)+1);j=f.extractContents();n=l.parentNode;g(m,"lastChild");if(!i(m)){n.insertBefore(m,l)}if(o){n.replaceChild(o,k)}else{n.insertBefore(k,l)}g(j,"firstChild");if(!i(j)){n.insertBefore(j,l)}p.remove(l);return o||k}},bind:function(j,f,i,h){var g=this;if(!g.events){g.events=new c.dom.EventUtils()}return g.events.add(j,f,i,h||this)},unbind:function(i,f,h){var g=this;if(!g.events){g.events=new c.dom.EventUtils()}return g.events.remove(i,f,h)},_findSib:function(j,g,h){var i=this,k=g;if(j){if(b(k,"string")){k=function(f){return i.is(f,g)}}for(j=j[h];j;j=j[h]){if(k(j)){return j}}}return null},_isRes:function(f){return/^(top|left|bottom|right|width|height)/i.test(f)||/;\s*(top|left|bottom|right|width|height)/i.test(f)}});c.DOM=new c.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(f){var h=0,c=1,e=2,d=tinymce.extend;function g(m,k){var j,l;if(m.parentNode!=k){return -1}for(l=k.firstChild,j=0;l!=m;l=l.nextSibling){j++}return j}function b(k){var j=0;while(k.previousSibling){j++;k=k.previousSibling}return j}function i(j,k){var l;if(j.nodeType==3){return j}if(k<0){return j}l=j.firstChild;while(l!=null&&k>0){--k;l=l.nextSibling}if(l!=null){return l}return j}function a(k){var j=k.doc;d(this,{dom:k,startContainer:j,startOffset:0,endContainer:j,endOffset:0,collapsed:true,commonAncestorContainer:j,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3})}d(a.prototype,{setStart:function(k,j){this._setEndPoint(true,k,j)},setEnd:function(k,j){this._setEndPoint(false,k,j)},setStartBefore:function(j){this.setStart(j.parentNode,b(j))},setStartAfter:function(j){this.setStart(j.parentNode,b(j)+1)},setEndBefore:function(j){this.setEnd(j.parentNode,b(j))},setEndAfter:function(j){this.setEnd(j.parentNode,b(j)+1)},collapse:function(k){var j=this;if(k){j.endContainer=j.startContainer;j.endOffset=j.startOffset}else{j.startContainer=j.endContainer;j.startOffset=j.endOffset}j.collapsed=true},selectNode:function(j){this.setStartBefore(j);this.setEndAfter(j)},selectNodeContents:function(j){this.setStart(j,0);this.setEnd(j,j.nodeType===1?j.childNodes.length:j.nodeValue.length)},compareBoundaryPoints:function(m,n){var l=this,p=l.startContainer,o=l.startOffset,k=l.endContainer,j=l.endOffset;if(m===0){return l._compareBoundaryPoints(p,o,p,o)}if(m===1){return l._compareBoundaryPoints(p,o,k,j)}if(m===2){return l._compareBoundaryPoints(k,j,k,j)}if(m===3){return l._compareBoundaryPoints(k,j,p,o)}},deleteContents:function(){this._traverse(e)},extractContents:function(){return this._traverse(h)},cloneContents:function(){return this._traverse(c)},insertNode:function(m){var j=this,l,k;if(m.nodeType===3||m.nodeType===4){l=j.startContainer.splitText(j.startOffset);j.startContainer.parentNode.insertBefore(m,l)}else{if(j.startContainer.childNodes.length>0){k=j.startContainer.childNodes[j.startOffset]}j.startContainer.insertBefore(m,k)}},surroundContents:function(l){var j=this,k=j.extractContents();j.insertNode(l);l.appendChild(k);j.selectNode(l)},cloneRange:function(){var j=this;return d(new a(j.dom),{startContainer:j.startContainer,startOffset:j.startOffset,endContainer:j.endContainer,endOffset:j.endOffset,collapsed:j.collapsed,commonAncestorContainer:j.commonAncestorContainer})},_isCollapsed:function(){return(this.startContainer==this.endContainer&&this.startOffset==this.endOffset)},_compareBoundaryPoints:function(m,p,k,o){var q,l,j,r,t,s;if(m==k){if(p==o){return 0}else{if(p0){l.collapse(k)}}l.collapsed=l._isCollapsed();l.commonAncestorContainer=l.dom.findCommonAncestor(l.startContainer,l.endContainer)},_traverse:function(r){var s=this,q,m=0,v=0,k,o,l,n,j,u;if(s.startContainer==s.endContainer){return s._traverseSameContainer(r)}for(q=s.endContainer,k=q.parentNode;k!=null;q=k,k=k.parentNode){if(k==s.startContainer){return s._traverseCommonStartContainer(q,r)}++m}for(q=s.startContainer,k=q.parentNode;k!=null;q=k,k=k.parentNode){if(k==s.endContainer){return s._traverseCommonEndContainer(q,r)}++v}o=v-m;l=s.startContainer;while(o>0){l=l.parentNode;o--}n=s.endContainer;while(o<0){n=n.parentNode;o++}for(j=l.parentNode,u=n.parentNode;j!=u;j=j.parentNode,u=u.parentNode){l=j;n=u}return s._traverseCommonAncestors(l,n,r)},_traverseSameContainer:function(o){var r=this,q,u,j,k,l,p,m;if(o!=e){q=r.dom.doc.createDocumentFragment()}if(r.startOffset==r.endOffset){return q}if(r.startContainer.nodeType==3){u=r.startContainer.nodeValue;j=u.substring(r.startOffset,r.endOffset);if(o!=c){r.startContainer.deleteData(r.startOffset,r.endOffset-r.startOffset);r.collapse(true)}if(o==e){return null}q.appendChild(r.dom.doc.createTextNode(j));return q}k=i(r.startContainer,r.startOffset);l=r.endOffset-r.startOffset;while(l>0){p=k.nextSibling;m=r._traverseFullySelected(k,o);if(q){q.appendChild(m)}--l;k=p}if(o!=c){r.collapse(true)}return q},_traverseCommonStartContainer:function(j,p){var s=this,r,k,l,m,q,o;if(p!=e){r=s.dom.doc.createDocumentFragment()}k=s._traverseRightBoundary(j,p);if(r){r.appendChild(k)}l=g(j,s.startContainer);m=l-s.startOffset;if(m<=0){if(p!=c){s.setEndBefore(j);s.collapse(false)}return r}k=j.previousSibling;while(m>0){q=k.previousSibling;o=s._traverseFullySelected(k,p);if(r){r.insertBefore(o,r.firstChild)}--m;k=q}if(p!=c){s.setEndBefore(j);s.collapse(false)}return r},_traverseCommonEndContainer:function(m,p){var s=this,r,o,j,k,q,l;if(p!=e){r=s.dom.doc.createDocumentFragment()}j=s._traverseLeftBoundary(m,p);if(r){r.appendChild(j)}o=g(m,s.endContainer);++o;k=s.endOffset-o;j=m.nextSibling;while(k>0){q=j.nextSibling;l=s._traverseFullySelected(j,p);if(r){r.appendChild(l)}--k;j=q}if(p!=c){s.setStartAfter(m);s.collapse(true)}return r},_traverseCommonAncestors:function(p,j,s){var w=this,l,v,o,q,r,k,u,m;if(s!=e){v=w.dom.doc.createDocumentFragment()}l=w._traverseLeftBoundary(p,s);if(v){v.appendChild(l)}o=p.parentNode;q=g(p,o);r=g(j,o);++q;k=r-q;u=p.nextSibling;while(k>0){m=u.nextSibling;l=w._traverseFullySelected(u,s);if(v){v.appendChild(l)}u=m;--k}l=w._traverseRightBoundary(j,s);if(v){v.appendChild(l)}if(s!=c){w.setStartAfter(p);w.collapse(true)}return v},_traverseRightBoundary:function(p,q){var s=this,l=i(s.endContainer,s.endOffset-1),r,o,n,j,k;var m=l!=s.endContainer;if(l==p){return s._traverseNode(l,m,false,q)}r=l.parentNode;o=s._traverseNode(r,false,false,q);while(r!=null){while(l!=null){n=l.previousSibling;j=s._traverseNode(l,m,false,q);if(q!=e){o.insertBefore(j,o.firstChild)}m=true;l=n}if(r==p){return o}l=r.previousSibling;r=r.parentNode;k=s._traverseNode(r,false,false,q);if(q!=e){k.appendChild(o)}o=k}return null},_traverseLeftBoundary:function(p,q){var s=this,m=i(s.startContainer,s.startOffset);var n=m!=s.startContainer,r,o,l,j,k;if(m==p){return s._traverseNode(m,n,true,q)}r=m.parentNode;o=s._traverseNode(r,false,true,q);while(r!=null){while(m!=null){l=m.nextSibling;j=s._traverseNode(m,n,true,q);if(q!=e){o.appendChild(j)}n=true;m=l}if(r==p){return o}m=r.nextSibling;r=r.parentNode;k=s._traverseNode(r,false,true,q);if(q!=e){k.appendChild(o)}o=k}return null},_traverseNode:function(j,o,r,s){var u=this,m,l,p,k,q;if(o){return u._traverseFullySelected(j,s)}if(j.nodeType==3){m=j.nodeValue;if(r){k=u.startOffset;l=m.substring(k);p=m.substring(0,k)}else{k=u.endOffset;l=m.substring(0,k);p=m.substring(k)}if(s!=c){j.nodeValue=p}if(s==e){return null}q=j.cloneNode(false);q.nodeValue=l;return q}if(s==e){return null}return j.cloneNode(false)},_traverseFullySelected:function(l,k){var j=this;if(k!=e){return k==c?l.cloneNode(true):l}l.parentNode.removeChild(l);return null}});f.Range=a})(tinymce.dom);(function(){function a(e){var d=this,h="\uFEFF",b,g;function c(j,i){if(j&&i){if(j.item&&i.item&&j.item(0)===i.item(0)){return 1}if(j.isEqual&&i.isEqual&&i.isEqual(j)){return 1}}return 0}function f(){var m=e.dom,j=e.getRng(),s=m.createRng(),p,k,n,q,o,l;function i(v){var t=v.parentNode.childNodes,u;for(u=t.length-1;u>=0;u--){if(t[u]==v){return u}}return -1}function r(v){var t=j.duplicate(),B,y,u,w,x=0,z=0,A,C;t.collapse(v);B=t.parentElement();t.pasteHTML(h);u=B.childNodes;for(y=0;y0&&(w.nodeType!==3||u[y-1].nodeType!==3)){z++}if(w.nodeType===3){A=w.nodeValue.indexOf(h);if(A!==-1){x+=A;break}x+=w.nodeValue.length}else{x=0}}t.moveStart("character",-1);t.text="";return{index:z,offset:x,parent:B}}n=j.item?j.item(0):j.parentElement();if(n.ownerDocument!=m.doc){return s}if(j.item||!n.hasChildNodes()){s.setStart(n.parentNode,i(n));s.setEnd(s.startContainer,s.startOffset+1);return s}l=e.isCollapsed();p=r(true);k=r(false);p.parent.normalize();k.parent.normalize();q=p.parent.childNodes[Math.min(p.index,p.parent.childNodes.length-1)];if(q.nodeType!=3){s.setStart(p.parent,p.index)}else{s.setStart(p.parent.childNodes[p.index],p.offset)}o=k.parent.childNodes[Math.min(k.index,k.parent.childNodes.length-1)];if(o.nodeType!=3){if(!l){k.index++}s.setEnd(k.parent,k.index)}else{s.setEnd(k.parent.childNodes[k.index],k.offset)}if(!l){q=s.startContainer;if(q.nodeType==1){s.setStart(q,Math.min(s.startOffset,q.childNodes.length))}o=s.endContainer;if(o.nodeType==1){s.setEnd(o,Math.min(s.endOffset,o.childNodes.length))}}d.addRange(s);return s}this.addRange=function(j){var o,m=e.dom.doc.body,p,k,q,l,n,i;q=j.startContainer;l=j.startOffset;n=j.endContainer;i=j.endOffset;o=m.createTextRange();q=q.nodeType==1?q.childNodes[Math.min(l,q.childNodes.length-1)]:q;n=n.nodeType==1?n.childNodes[Math.min(l==i?i:i-1,n.childNodes.length-1)]:n;if(q==n&&q.nodeType==1){if(/^(IMG|TABLE)$/.test(q.nodeName)&&l!=i){o=m.createControlRange();o.addElement(q)}else{o=m.createTextRange();if(!q.hasChildNodes()&&q.canHaveHTML){q.innerHTML=h}o.moveToElementText(q);if(q.innerHTML==h){o.collapse(true);q.removeChild(q.firstChild)}}if(l==i){o.collapse(i<=j.endContainer.childNodes.length-1)}o.select();return}function r(t,v){var u,s,w;if(t.nodeType!=3){return -1}u=t.nodeValue;s=m.createTextRange();t.nodeValue=u.substring(0,v)+h+u.substring(v);s.moveToElementText(t.parentNode);s.findText(h);w=Math.abs(s.moveStart("character",-1048575));t.nodeValue=u;return w}if(j.collapsed){pos=r(q,l);o=m.createTextRange();o.move("character",pos);o.select();return}else{if(q==n&&q.nodeType==3){p=r(q,l);o=m.createTextRange();o.move("character",p);o.moveEnd("character",i-l);o.select();return}p=r(q,l);k=r(n,i);o=m.createTextRange();if(p==-1){o.moveToElementText(q);p=0}else{o.move("character",p)}tmpRng=m.createTextRange();if(k==-1){tmpRng.moveToElementText(n)}else{tmpRng.move("character",k)}o.setEndPoint("EndToEnd",tmpRng);o.select();return}};this.getRangeAt=function(){if(!b||!c(g,e.getRng())){b=f();g=e.getRng()}return b};this.destroy=function(){g=b=null}}tinymce.dom.TridentSelection=a})();(function(){var p=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,i=0,d=Object.prototype.toString,n=false;var b=function(D,t,A,v){A=A||[];var e=t=t||document;if(t.nodeType!==1&&t.nodeType!==9){return[]}if(!D||typeof D!=="string"){return A}var B=[],C,y,G,F,z,s,r=true,w=o(t);p.lastIndex=0;while((C=p.exec(D))!==null){B.push(C[1]);if(C[2]){s=RegExp.rightContext;break}}if(B.length>1&&j.exec(D)){if(B.length===2&&f.relative[B[0]]){y=g(B[0]+B[1],t)}else{y=f.relative[B[0]]?[t]:b(B.shift(),t);while(B.length){D=B.shift();if(f.relative[D]){D+=B.shift()}y=g(D,y)}}}else{if(!v&&B.length>1&&t.nodeType===9&&!w&&f.match.ID.test(B[0])&&!f.match.ID.test(B[B.length-1])){var H=b.find(B.shift(),t,w);t=H.expr?b.filter(H.expr,H.set)[0]:H.set[0]}if(t){var H=v?{expr:B.pop(),set:a(v)}:b.find(B.pop(),B.length===1&&(B[0]==="~"||B[0]==="+")&&t.parentNode?t.parentNode:t,w);y=H.expr?b.filter(H.expr,H.set):H.set;if(B.length>0){G=a(y)}else{r=false}while(B.length){var u=B.pop(),x=u;if(!f.relative[u]){u=""}else{x=B.pop()}if(x==null){x=t}f.relative[u](G,x,w)}}else{G=B=[]}}if(!G){G=y}if(!G){throw"Syntax error, unrecognized expression: "+(u||D)}if(d.call(G)==="[object Array]"){if(!r){A.push.apply(A,G)}else{if(t&&t.nodeType===1){for(var E=0;G[E]!=null;E++){if(G[E]&&(G[E]===true||G[E].nodeType===1&&h(t,G[E]))){A.push(y[E])}}}else{for(var E=0;G[E]!=null;E++){if(G[E]&&G[E].nodeType===1){A.push(y[E])}}}}}else{a(G,A)}if(s){b(s,e,A,v);b.uniqueSort(A)}return A};b.uniqueSort=function(r){if(c){n=false;r.sort(c);if(n){for(var e=1;e":function(w,r,x){var u=typeof r==="string";if(u&&!/\W/.test(r)){r=x?r:r.toUpperCase();for(var s=0,e=w.length;s=0)){if(!s){e.push(v)}}else{if(s){r[u]=false}}}}return false},ID:function(e){return e[1].replace(/\\/g,"")},TAG:function(r,e){for(var s=0;e[s]===false;s++){}return e[s]&&o(e[s])?r[1]:r[1].toUpperCase()},CHILD:function(e){if(e[1]=="nth"){var r=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(e[2]=="even"&&"2n"||e[2]=="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(r[1]+(r[2]||1))-0;e[3]=r[3]-0}e[0]=i++;return e},ATTR:function(u,r,s,e,v,w){var t=u[1].replace(/\\/g,"");if(!w&&f.attrMap[t]){u[1]=f.attrMap[t]}if(u[2]==="~="){u[4]=" "+u[4]+" "}return u},PSEUDO:function(u,r,s,e,v){if(u[1]==="not"){if(u[3].match(p).length>1||/^\w/.test(u[3])){u[3]=b(u[3],null,null,r)}else{var t=b.filter(u[3],r,s,true^v);if(!s){e.push.apply(e,t)}return false}}else{if(f.match.POS.test(u[0])||f.match.CHILD.test(u[0])){return true}}return u},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){e.parentNode.selectedIndex;return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(s,r,e){return !!b(e[3],s).length},header:function(e){return/h\d/i.test(e.nodeName)},text:function(e){return"text"===e.type},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toUpperCase()==="BUTTON"},input:function(e){return/input|select|textarea|button/i.test(e.nodeName)}},setFilters:{first:function(r,e){return e===0},last:function(s,r,e,t){return r===t.length-1},even:function(r,e){return e%2===0},odd:function(r,e){return e%2===1},lt:function(s,r,e){return re[3]-0},nth:function(s,r,e){return e[3]-0==r},eq:function(s,r,e){return e[3]-0==r}},filter:{PSEUDO:function(w,s,t,x){var r=s[1],u=f.filters[r];if(u){return u(w,t,s,x)}else{if(r==="contains"){return(w.textContent||w.innerText||"").indexOf(s[3])>=0}else{if(r==="not"){var v=s[3];for(var t=0,e=v.length;t=0)}}},ID:function(r,e){return r.nodeType===1&&r.getAttribute("id")===e},TAG:function(r,e){return(e==="*"&&r.nodeType===1)||r.nodeName===e},CLASS:function(r,e){return(" "+(r.className||r.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(v,t){var s=t[1],e=f.attrHandle[s]?f.attrHandle[s](v):v[s]!=null?v[s]:v.getAttribute(s),w=e+"",u=t[2],r=t[4];return e==null?u==="!=":u==="="?w===r:u==="*="?w.indexOf(r)>=0:u==="~="?(" "+w+" ").indexOf(r)>=0:!r?w&&e!==false:u==="!="?w!=r:u==="^="?w.indexOf(r)===0:u==="$="?w.substr(w.length-r.length)===r:u==="|="?w===r||w.substr(0,r.length+1)===r+"-":false},POS:function(u,r,s,v){var e=r[2],t=f.setFilters[e];if(t){return t(u,s,r,v)}}}};var j=f.match.POS;for(var l in f.match){f.match[l]=new RegExp(f.match[l].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var a=function(r,e){r=Array.prototype.slice.call(r);if(e){e.push.apply(e,r);return e}return r};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(k){a=function(u,t){var r=t||[];if(d.call(u)==="[object Array]"){Array.prototype.push.apply(r,u)}else{if(typeof u.length==="number"){for(var s=0,e=u.length;s";var e=document.documentElement;e.insertBefore(r,e.firstChild);if(!!document.getElementById(s)){f.find.ID=function(u,v,w){if(typeof v.getElementById!=="undefined"&&!w){var t=v.getElementById(u[1]);return t?t.id===u[1]||typeof t.getAttributeNode!=="undefined"&&t.getAttributeNode("id").nodeValue===u[1]?[t]:undefined:[]}};f.filter.ID=function(v,t){var u=typeof v.getAttributeNode!=="undefined"&&v.getAttributeNode("id");return v.nodeType===1&&u&&u.nodeValue===t}}e.removeChild(r)})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){f.find.TAG=function(r,v){var u=v.getElementsByTagName(r[1]);if(r[1]==="*"){var t=[];for(var s=0;u[s];s++){if(u[s].nodeType===1){t.push(u[s])}}u=t}return u}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){f.attrHandle.href=function(r){return r.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var e=b,s=document.createElement("div");s.innerHTML="

";if(s.querySelectorAll&&s.querySelectorAll(".TEST").length===0){return}b=function(w,v,t,u){v=v||document;if(!u&&v.nodeType===9&&!o(v)){try{return a(v.querySelectorAll(w),t)}catch(x){}}return e(w,v,t,u)};for(var r in e){b[r]=e[r]}})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var e=document.createElement("div");e.innerHTML="
";if(e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}f.order.splice(1,0,"CLASS");f.find.CLASS=function(r,s,t){if(typeof s.getElementsByClassName!=="undefined"&&!t){return s.getElementsByClassName(r[1])}}})()}function m(r,w,v,A,x,z){var y=r=="previousSibling"&&!z;for(var t=0,s=A.length;t0){u=e;break}}}e=e[r]}A[t]=u}}}var h=document.compareDocumentPosition?function(r,e){return r.compareDocumentPosition(e)&16}:function(r,e){return r!==e&&(r.contains?r.contains(e):true)};var o=function(e){return e.nodeType===9&&e.documentElement.nodeName!=="HTML"||!!e.ownerDocument&&e.ownerDocument.documentElement.nodeName!=="HTML"};var g=function(e,x){var t=[],u="",v,s=x.nodeType?[x]:x;while((v=f.match.PSEUDO.exec(e))){u+=v[0];e=e.replace(f.match.PSEUDO,"")}e=f.relative[e]?e+"*":e;for(var w=0,r=s.length;w=0;h--){k=g[h];if(k.obj===l){j._remove(k.obj,k.name,k.cfunc);k.obj=k.cfunc=null;g.splice(h,1)}}}},cancel:function(g){if(!g){return false}this.stop(g);return this.prevent(g)},stop:function(g){if(g.stopPropagation){g.stopPropagation()}else{g.cancelBubble=true}return false},prevent:function(g){if(g.preventDefault){g.preventDefault()}else{g.returnValue=false}return false},destroy:function(){var g=this;f(g.events,function(j,h){g._remove(j.obj,j.name,j.cfunc);j.obj=j.cfunc=null});g.events=[];g=null},_add:function(h,i,g){if(h.attachEvent){h.attachEvent("on"+i,g)}else{if(h.addEventListener){h.addEventListener(i,g,false)}else{h["on"+i]=g}}},_remove:function(i,j,h){if(i){try{if(i.detachEvent){i.detachEvent("on"+j,h)}else{if(i.removeEventListener){i.removeEventListener(j,h,false)}else{i["on"+j]=null}}}catch(g){}}},_pageInit:function(h){var g=this;if(g.domLoaded){return}g.domLoaded=true;f(g.inits,function(i){i()});g.inits=[]},_wait:function(i){var g=this,h=i.document;if(i.tinyMCE_GZ&&tinyMCE_GZ.loaded){g.domLoaded=1;return}if(h.attachEvent){h.attachEvent("onreadystatechange",function(){if(h.readyState==="complete"){h.detachEvent("onreadystatechange",arguments.callee);g._pageInit(i)}});if(h.documentElement.doScroll&&i==i.top){(function(){if(g.domLoaded){return}try{h.documentElement.doScroll("left")}catch(j){setTimeout(arguments.callee,0);return}g._pageInit(i)})()}}else{if(h.addEventListener){g._add(i,"DOMContentLoaded",function(){g._pageInit(i)})}}g._add(i,"load",function(){g._pageInit(i)})},_stoppers:{preventDefault:function(){this.returnValue=false},stopPropagation:function(){this.cancelBubble=true}}});a=d.dom.Event=new d.dom.EventUtils();a._wait(window);d.addUnload(function(){a.destroy()})})(tinymce);(function(a){var b=a.each;a.create("tinymce.dom.Element",{Element:function(g,e){var c=this,f,d;e=e||{};c.id=g;c.dom=f=e.dom||a.DOM;c.settings=e;if(!a.isIE){d=c.dom.get(c.id)}b(["getPos","getRect","getParent","add","setStyle","getStyle","setStyles","setAttrib","setAttribs","getAttrib","addClass","removeClass","hasClass","getOuterHTML","setOuterHTML","remove","show","hide","isHidden","setHTML","get"],function(h){c[h]=function(){var j=[g],k;for(k=0;k_';j.deleteContents();j.insertNode(f.getRng().createContextualFragment(i));l=f.dom.get("__caret");j=k.createRange();j.setStartBefore(l);j.setEndAfter(l);f.setRng(j);f.dom.remove("__caret")}else{if(j.item){k.execCommand("Delete",false,null);j=f.getRng()}j.pasteHTML(i)}f.onSetContent.dispatch(f,g)},getStart:function(){var f=this,g=f.getRng(),h;if(a){if(g.item){return g.item(0)}g=g.duplicate();g.collapse(1);h=g.parentElement();if(h&&h.nodeName=="BODY"){return h.firstChild}return h}else{h=g.startContainer;if(h.nodeName=="BODY"){return h.firstChild}return f.dom.getParent(h,"*")}},getEnd:function(){var f=this,g=f.getRng(),h;if(a){if(g.item){return g.item(0)}g=g.duplicate();g.collapse(0);h=g.parentElement();if(h&&h.nodeName=="BODY"){return h.lastChild}return h}else{h=g.endContainer;if(h.nodeName=="BODY"){return h.lastChild}return f.dom.getParent(h,"*")}},getBookmark:function(x){var j=this,m=j.getRng(),f,n,l,u=j.dom.getViewPort(j.win),v,p,z,o,w=-16777215,k,h=j.dom.getRoot(),g=0,i=0,y;n=u.x;l=u.y;if(x){return{rng:m,scrollX:n,scrollY:l}}if(a){if(m.item){v=m.item(0);d(j.dom.select(v.nodeName),function(s,r){if(v==s){p=r;return false}});return{tag:v.nodeName,index:p,scrollX:n,scrollY:l}}f=j.dom.doc.body.createTextRange();f.moveToElementText(h);f.collapse(true);z=Math.abs(f.move("character",w));f=m.duplicate();f.collapse(true);p=Math.abs(f.move("character",w));f=m.duplicate();f.collapse(false);o=Math.abs(f.move("character",w))-p;return{start:p-z,length:o,scrollX:n,scrollY:l}}v=j.getNode();k=j.getSel();if(!k){return null}if(v&&v.nodeName=="IMG"){return{scrollX:n,scrollY:l}}function q(A,D,t){var s=j.dom.doc.createTreeWalker(A,NodeFilter.SHOW_TEXT,null,false),E,B=0,C={};while((E=s.nextNode())!=null){if(E==D){C.start=B}if(E==t){C.end=B;return C}B+=e(E.nodeValue||"").length}return null}if(k.anchorNode==k.focusNode&&k.anchorOffset==k.focusOffset){v=q(h,k.anchorNode,k.focusNode);if(!v){return{scrollX:n,scrollY:l}}e(k.anchorNode.nodeValue||"").replace(/^\s+/,function(r){g=r.length});return{start:Math.max(v.start+k.anchorOffset-g,0),end:Math.max(v.end+k.focusOffset-g,0),scrollX:n,scrollY:l,beg:k.anchorOffset-g==0}}else{v=q(h,m.startContainer,m.endContainer);if(!v){return{scrollX:n,scrollY:l}}return{start:Math.max(v.start+m.startOffset-g,0),end:Math.max(v.end+m.endOffset-i,0),scrollX:n,scrollY:l,beg:m.startOffset-g==0}}},moveToBookmark:function(n){var o=this,g=o.getRng(),p=o.getSel(),j=o.dom.getRoot(),m,h,k;function i(q,t,D){var B=o.dom.doc.createTreeWalker(q,NodeFilter.SHOW_TEXT,null,false),x,s=0,A={},u,C,z,y;while((x=B.nextNode())!=null){z=y=0;k=x.nodeValue||"";h=e(k).length;s+=h;if(s>=t&&!A.startNode){u=t-(s-h);if(n.beg&&u>=h){continue}A.startNode=x;A.startOffset=u+y}if(s>=D){A.endNode=x;A.endOffset=D-(s-h)+y;return A}}return null}if(!n){return false}o.win.scrollTo(n.scrollX,n.scrollY);if(a){o.tridentSel.destroy();if(g=n.rng){try{g.select()}catch(l){}return true}o.win.focus();if(n.tag){g=j.createControlRange();d(o.dom.select(n.tag),function(r,q){if(q==n.index){g.addElement(r)}})}else{try{if(n.start<0){return true}g=p.createRange();g.moveToElementText(j);g.collapse(true);g.moveStart("character",n.start);g.moveEnd("character",n.length)}catch(f){return true}}try{g.select()}catch(l){}return true}if(!p){return false}if(n.rng){p.removeAllRanges();p.addRange(n.rng)}else{if(b(n.start)&&b(n.end)){try{m=i(j,n.start,n.end);if(m){g=o.dom.doc.createRange();g.setStart(m.startNode,m.startOffset);g.setEnd(m.endNode,m.endOffset);p.removeAllRanges();p.addRange(g)}if(!c.isOpera){o.win.focus()}}catch(l){}}}},select:function(g,l){var p=this,f=p.getRng(),q=p.getSel(),o,m,k,j=p.win.document;function h(u,t){var s,r;if(u){s=j.createTreeWalker(u,NodeFilter.SHOW_TEXT,null,false);while(u=s.nextNode()){r=u;if(c.trim(u.nodeValue).length!=0){if(t){return u}else{r=u}}}}return r}if(a){try{o=j.body;if(/^(IMG|TABLE)$/.test(g.nodeName)){f=o.createControlRange();f.addElement(g)}else{f=o.createTextRange();f.moveToElementText(g)}f.select()}catch(i){}}else{if(l){m=h(g,1)||p.dom.select("br:first",g)[0];k=h(g,0)||p.dom.select("br:last",g)[0];if(m&&k){f=j.createRange();if(m.nodeName=="BR"){f.setStartBefore(m)}else{f.setStart(m,0)}if(k.nodeName=="BR"){f.setEndBefore(k)}else{f.setEnd(k,k.nodeValue.length)}}else{f.selectNode(g)}}else{f.selectNode(g)}p.setRng(f)}return g},isCollapsed:function(){var f=this,h=f.getRng(),g=f.getSel();if(!h||h.item){return false}return !g||h.boundingWidth==0||h.collapsed},collapse:function(f){var g=this,h=g.getRng(),i;if(h.item){i=h.item(0);h=this.win.document.body.createTextRange();h.moveToElementText(i)}h.collapse(!!f);g.setRng(h)},getSel:function(){var g=this,f=this.win;return f.getSelection?f.getSelection():f.document.selection},getRng:function(j){var g=this,h,i;if(j&&g.tridentSel){return g.tridentSel.getRangeAt(0)}try{if(h=g.getSel()){i=h.rangeCount>0?h.getRangeAt(0):(h.createRange?h.createRange():g.win.document.createRange())}}catch(f){}if(!i){i=a?g.win.document.body.createTextRange():g.win.document.createRange()}return i},setRng:function(i){var h,g=this;if(!g.tridentSel){h=g.getSel();if(h){h.removeAllRanges();h.addRange(i)}}else{if(i.cloneRange){g.tridentSel.addRange(i);return}try{i.select()}catch(f){}}},setNode:function(g){var f=this;f.setContent(f.dom.getOuterHTML(g));return g},getNode:function(){var f=this,h=f.getRng(),g=f.getSel(),i;if(!a){if(!h){return f.dom.getRoot()}i=h.commonAncestorContainer;if(!h.collapsed){if(c.isWebKit&&g.anchorNode&&g.anchorNode.nodeType==1){return g.anchorNode.childNodes[g.anchorOffset]}if(h.startContainer==h.endContainer){if(h.startOffset-h.endOffset<2){if(h.startContainer.hasChildNodes()){i=h.startContainer.childNodes[h.startOffset]}}}}return f.dom.getParent(i,"*")}return h.item?h.item(0):h.parentElement()},getSelectedBlocks:function(g,f){var i=this,j=i.dom,m,h,l,k=[];m=j.getParent(g||i.getStart(),j.isBlock);h=j.getParent(f||i.getEnd(),j.isBlock);if(m){k.push(m)}if(m&&h&&m!=h){l=m;while((l=l.nextSibling)&&l!=h){if(j.isBlock(l)){k.push(l)}}}if(h&&m!=h){k.push(h)}return k},destroy:function(g){var f=this;f.win=null;if(f.tridentSel){f.tridentSel.destroy()}if(!g){c.removeUnload(f.destroy)}}})})(tinymce);(function(a){a.create("tinymce.dom.XMLWriter",{node:null,XMLWriter:function(c){function b(){var e=document.implementation;if(!e||!e.createDocument){try{return new ActiveXObject("MSXML2.DOMDocument")}catch(d){}try{return new ActiveXObject("Microsoft.XmlDom")}catch(d){}}else{return e.createDocument("","",null)}}this.doc=b();this.valid=a.isOpera||a.isWebKit;this.reset()},reset:function(){var b=this,c=b.doc;if(c.firstChild){c.removeChild(c.firstChild)}b.node=c.appendChild(c.createElement("html"))},writeStartElement:function(c){var b=this;b.node=b.node.appendChild(b.doc.createElement(c))},writeAttribute:function(c,b){if(this.valid){b=b.replace(/>/g,"%MCGT%")}this.node.setAttribute(c,b)},writeEndElement:function(){this.node=this.node.parentNode},writeFullEndElement:function(){var b=this,c=b.node;c.appendChild(b.doc.createTextNode(""));b.node=c.parentNode},writeText:function(b){if(this.valid){b=b.replace(/>/g,"%MCGT%")}this.node.appendChild(this.doc.createTextNode(b))},writeCDATA:function(b){this.node.appendChild(this.doc.createCDATASection(b))},writeComment:function(b){if(a.isIE){b=b.replace(/^\-|\-$/g," ")}this.node.appendChild(this.doc.createComment(b.replace(/\-\-/g," ")))},getContent:function(){var b;b=this.doc.xml||new XMLSerializer().serializeToString(this.doc);b=b.replace(/<\?[^?]+\?>||<\/html>||]+>/g,"");b=b.replace(/ ?\/>/g," />");if(this.valid){b=b.replace(/\%MCGT%/g,">")}return b}})})(tinymce);(function(a){a.create("tinymce.dom.StringWriter",{str:null,tags:null,count:0,settings:null,indent:null,StringWriter:function(b){this.settings=a.extend({indent_char:" ",indentation:0},b);this.reset()},reset:function(){this.indent="";this.str="";this.tags=[];this.count=0},writeStartElement:function(b){this._writeAttributesEnd();this.writeRaw("<"+b);this.tags.push(b);this.inAttr=true;this.count++;this.elementCount=this.count},writeAttribute:function(d,b){var c=this;c.writeRaw(" "+c.encode(d)+'="'+c.encode(b)+'"')},writeEndElement:function(){var b;if(this.tags.length>0){b=this.tags.pop();if(this._writeAttributesEnd(1)){this.writeRaw("")}if(this.settings.indentation>0){this.writeRaw("\n")}}},writeFullEndElement:function(){if(this.tags.length>0){this._writeAttributesEnd();this.writeRaw("");if(this.settings.indentation>0){this.writeRaw("\n")}}},writeText:function(b){this._writeAttributesEnd();this.writeRaw(this.encode(b));this.count++},writeCDATA:function(b){this._writeAttributesEnd();this.writeRaw("");this.count++},writeComment:function(b){this._writeAttributesEnd();this.writeRaw("");this.count++},writeRaw:function(b){this.str+=b},encode:function(b){return b.replace(/[<>&"]/g,function(c){switch(c){case"<":return"<";case">":return">";case"&":return"&";case'"':return"""}return c})},getContent:function(){return this.str},_writeAttributesEnd:function(b){if(!this.inAttr){return}this.inAttr=false;if(b&&this.elementCount==this.count){this.writeRaw(" />");return false}this.writeRaw(">");return true}})})(tinymce);(function(e){var g=e.extend,f=e.each,b=e.util.Dispatcher,d=e.isIE,a=e.isGecko;function c(h){return h.replace(/([?+*])/g,".$1")}e.create("tinymce.dom.Serializer",{Serializer:function(j){var i=this;i.key=0;i.onPreProcess=new b(i);i.onPostProcess=new b(i);try{i.writer=new e.dom.XMLWriter()}catch(h){i.writer=new e.dom.StringWriter()}i.settings=j=g({dom:e.DOM,valid_nodes:0,node_filter:0,attr_filter:0,invalid_attrs:/^(mce_|_moz_|sizset|sizcache)/,closed:/^(br|hr|input|meta|img|link|param|area)$/,entity_encoding:"named",entities:"160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro",valid_elements:"*[*]",extended_valid_elements:0,valid_child_elements:0,invalid_elements:0,fix_table_elements:1,fix_list_elements:true,fix_content_duplication:true,convert_fonts_to_spans:false,font_size_classes:0,font_size_style_values:0,apply_source_formatting:0,indent_mode:"simple",indent_char:"\t",indent_levels:1,remove_linebreaks:0,remove_redundant_brs:1,element_format:"xhtml"},j);i.dom=j.dom;if(j.remove_redundant_brs){i.onPostProcess.add(function(k,l){l.content=l.content.replace(/(
\s*)+<\/(p|h[1-6]|div|li)>/gi,function(n,m,o){if(/^
\s*<\//.test(n)){return""}return n})})}if(j.element_format=="html"){i.onPostProcess.add(function(k,l){l.content=l.content.replace(/<([^>]+) \/>/g,"<$1>")})}if(j.fix_list_elements){i.onPreProcess.add(function(v,s){var l,y,w=["ol","ul"],u,t,q,k=/^(OL|UL)$/,z;function m(r,x){var o=x.split(","),p;while((r=r.previousSibling)!=null){for(p=0;p=1767){f(i.dom.select("p table",l.node).reverse(),function(p){var o=i.dom.getParent(p.parentNode,"table,p");if(o.nodeName!="TABLE"){try{i.dom.split(o,p)}catch(m){}}})}})}},setEntities:function(p){var n=this,j,m,h={},o="",k;if(n.entityLookup){return}j=p.split(",");for(m=0;m1){f(q[1].split("|"),function(u){var p={},t;k=k||[];u=u.replace(/::/g,"~");u=/^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(u);u[2]=u[2].replace(/~/g,":");if(u[1]=="!"){r=r||[];r.push(u[2])}if(u[1]=="-"){for(t=0;t=1767)){p=j.createHTMLDocument("");f(r.nodeName=="BODY"?r.childNodes:[r],function(h){p.body.appendChild(p.importNode(h,true))});if(r.nodeName!="BODY"){r=p.body.firstChild}else{r=p.body}i=k.dom.doc;k.dom.doc=p}k.key=""+(parseInt(k.key)+1);if(!q.no_events){q.node=r;k.onPreProcess.dispatch(k,q)}k.writer.reset();k._serializeNode(r,q.getInner);q.content=k.writer.getContent();if(i){k.dom.doc=i}if(!q.no_events){k.onPostProcess.dispatch(k,q)}k._postProcess(q);q.node=null;return e.trim(q.content)},_postProcess:function(n){var i=this,k=i.settings,j=n.content,m=[],l;if(n.format=="html"){l=i._protect({content:j,patterns:[{pattern:/(]*>)(.*?)(<\/script>)/g},{pattern:/(]*>)(.*?)(<\/noscript>)/g},{pattern:/(]*>)(.*?)(<\/style>)/g},{pattern:/(]*>)(.*?)(<\/pre>)/g,encode:1},{pattern:/()/g}]});j=l.content;if(k.entity_encoding!=="raw"){j=i._encode(j)}if(!n.set){j=j.replace(/

\s+<\/p>|]+)>\s+<\/p>/g,k.entity_encoding=="numeric"?" 

":" 

");if(k.remove_linebreaks){j=j.replace(/\r?\n|\r/g," ");j=j.replace(/(<[^>]+>)\s+/g,"$1 ");j=j.replace(/\s+(<\/[^>]+>)/g," $1");j=j.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g,"<$1 $2>");j=j.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g,"<$1>");j=j.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g,"")}if(k.apply_source_formatting&&k.indent_mode=="simple"){j=j.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g,"\n<$1$2$3>\n");j=j.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g,"\n<$1$2>");j=j.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g,"\n");j=j.replace(/\n\n/g,"\n")}}j=i._unprotect(j,l);j=j.replace(//g,"");if(k.entity_encoding=="raw"){j=j.replace(/

 <\/p>|]+)> <\/p>/g,"\u00a0

")}j=j.replace(/]+|)>([\s\S]*?)<\/noscript>/g,function(h,p,o){return""+i.dom.decode(o.replace(//g,""))+""})}n.content=j},_serializeNode:function(D,o){var z=this,A=z.settings,x=z.writer,q,j,u,F,E,G,B,h,y,k,r,C,p,m;if(!A.node_filter||A.node_filter(D)){switch(D.nodeType){case 1:if(D.hasAttribute?D.hasAttribute("mce_bogus"):D.getAttribute("mce_bogus")){return}p=false;q=D.hasChildNodes();k=D.getAttribute("mce_name")||D.nodeName.toLowerCase();if(d){if(D.scopeName!=="HTML"&&D.scopeName!=="html"){k=D.scopeName+":"+k}}if(k.indexOf("mce:")===0){k=k.substring(4)}if(!z.validElementsRE||!z.validElementsRE.test(k)||(z.invalidElementsRE&&z.invalidElementsRE.test(k))||o){p=true;break}if(d){if(A.fix_content_duplication){if(D.mce_serialized==z.key){return}D.mce_serialized=z.key}if(k.charAt(0)=="/"){k=k.substring(1)}}else{if(a){if(D.nodeName==="BR"&&D.getAttribute("type")=="_moz"){return}}}if(z.childRules){if(z.parentElementsRE.test(z.elementName)){if(!z.childRules[z.elementName].test(k)){p=true;break}}z.elementName=k}r=z.findRule(k);k=r.name||k;m=A.closed.test(k);if((!q&&r.noEmpty)||(d&&!k)){p=true;break}if(r.requiredAttribs){G=r.requiredAttribs;for(F=G.length-1;F>=0;F--){if(this.dom.getAttrib(D,G[F])!==""){break}}if(F==-1){p=true;break}}x.writeStartElement(k);if(r.attribs){for(F=0,B=r.attribs,E=B.length;F-1;F--){h=B[F];if(h.specified){G=h.nodeName.toLowerCase();if(A.invalid_attrs.test(G)||!r.validAttribsRE.test(G)){continue}C=z.findAttribRule(r,G);y=z._getAttrib(D,C,G);if(y!==null){x.writeAttribute(G,y)}}}}if(k==="script"&&e.trim(D.innerHTML)){x.writeText("// ");x.writeCDATA(D.innerHTML.replace(/|<\[CDATA\[|\]\]>/g,""));q=false;break}if(r.padd){if(q&&(u=D.firstChild)&&u.nodeType===1&&D.childNodes.length===1){if(u.hasAttribute?u.hasAttribute("mce_bogus"):u.getAttribute("mce_bogus")){x.writeText("\u00a0")}}else{if(!q){x.writeText("\u00a0")}}}break;case 3:if(z.childRules&&z.parentElementsRE.test(z.elementName)){if(!z.childRules[z.elementName].test(D.nodeName)){return}}return x.writeText(D.nodeValue);case 4:return x.writeCDATA(D.nodeValue);case 8:return x.writeComment(D.nodeValue)}}else{if(D.nodeType==1){q=D.hasChildNodes()}}if(q&&!m){u=D.firstChild;while(u){z._serializeNode(u);z.elementName=k;u=u.nextSibling}}if(!p){if(!m){x.writeFullEndElement()}else{x.writeEndElement()}}},_protect:function(j){var i=this;j.items=j.items||[];function h(l){return l.replace(/[\r\n\\]/g,function(m){if(m==="\n"){return"\\n"}else{if(m==="\\"){return"\\\\"}}return"\\r"})}function k(l){return l.replace(/\\[\\rn]/g,function(m){if(m==="\\n"){return"\n"}else{if(m==="\\\\"){return"\\"}}return"\r"})}f(j.patterns,function(l){j.content=k(h(j.content).replace(l.pattern,function(n,o,m,p){m=k(m);if(l.encode){m=i._encode(m)}j.items.push(m);return o+""+p}))});return j},_unprotect:function(i,j){i=i.replace(/\"))}if(a&&j.ListBox){if(a.Button||a.SplitButton){e+=b.createHTML("td",{"class":"mceToolbarEnd"},b.createHTML("span",null,""))}}if(b.stdMode){e+=''+j.renderHTML()+""}else{e+=""+j.renderHTML()+""}if(f&&j.ListBox){if(f.Button||f.SplitButton){e+=b.createHTML("td",{"class":"mceToolbarStart"},b.createHTML("span",null,""))}}}g="mceToolbarEnd";if(j.Button){g+=" mceToolbarEndButton"}else{if(j.SplitButton){g+=" mceToolbarEndSplitButton"}else{if(j.ListBox){g+=" mceToolbarEndListBox"}}}e+=b.createHTML("td",{"class":g},b.createHTML("span",null,""));return b.createHTML("table",{id:l.id,"class":"mceToolbar"+(m["class"]?" "+m["class"]:""),cellpadding:"0",cellspacing:"0",align:l.settings.align||""},""+e+"")}});(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{items:[],urls:{},lookup:{},onAdd:new a(this),get:function(d){return this.lookup[d]},requireLangPack:function(f){var d,e=b.EditorManager.settings;if(e&&e.language){d=this.urls[f]+"/langs/"+e.language+".js";if(!b.dom.Event.domLoaded&&!e.strict_mode){b.ScriptLoader.load(d)}else{b.ScriptLoader.add(d)}}},add:function(e,d){this.items.push(d);this.lookup[e]=d;this.onAdd.dispatch(this,e,d);return d},load:function(h,e,d,g){var f=this;if(f.urls[h]){return}if(e.indexOf("/")!=0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}f.urls[h]=e.substring(0,e.lastIndexOf("/"));b.ScriptLoader.add(e,d,g)}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(f){var g=f.each,h=f.extend,e=f.DOM,a=f.dom.Event,c=f.ThemeManager,b=f.PluginManager,d=f.explode;f.create("static tinymce.EditorManager",{editors:{},i18n:{},activeEditor:null,preInit:function(){var i=this,j=window.location;f.documentBaseURL=j.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(f.documentBaseURL)){f.documentBaseURL+="/"}f.baseURL=new f.util.URI(f.documentBaseURL).toAbsolute(f.baseURL);f.EditorManager.baseURI=new f.util.URI(f.baseURL);i.onBeforeUnload=new f.util.Dispatcher(i);a.add(window,"beforeunload",function(k){i.onBeforeUnload.dispatch(i,k)})},init:function(q){var p=this,l,k=f.ScriptLoader,o,n,i=[],m;function j(u,v,r){var t=u[v];if(!t){return}if(f.is(t,"string")){r=t.replace(/\.\w+$/,"");r=r?f.resolve(r):0;t=f.resolve(t)}return t.apply(r||this,Array.prototype.slice.call(arguments,2))}q=h({theme:"simple",language:"en",strict_loading_mode:document.contentType=="application/xhtml+xml"},q);p.settings=q;if(!a.domLoaded&&!q.strict_loading_mode){if(q.language){k.add(f.baseURL+"/langs/"+q.language+".js")}if(q.theme&&q.theme.charAt(0)!="-"&&!c.urls[q.theme]){c.load(q.theme,"themes/"+q.theme+"/editor_template"+f.suffix+".js")}if(q.plugins){l=d(q.plugins);g(l,function(r){if(r&&r.charAt(0)!="-"&&!b.urls[r]){if(!f.isWebKit&&r=="safari"){return}b.load(r,"plugins/"+r+"/editor_plugin"+f.suffix+".js")}})}k.loadQueue()}a.add(document,"init",function(){var r,t;j(q,"onpageload");if(q.browsers){r=false;g(d(q.browsers),function(u){switch(u){case"ie":case"msie":if(f.isIE){r=true}break;case"gecko":if(f.isGecko){r=true}break;case"safari":case"webkit":if(f.isWebKit){r=true}break;case"opera":if(f.isOpera){r=true}break}});if(!r){return}}switch(q.mode){case"exact":r=q.elements||"";if(r.length>0){g(d(r),function(u){if(e.get(u)){m=new f.Editor(u,q);i.push(m);m.render(1)}else{o=0;g(document.forms,function(v){g(v.elements,function(w){if(w.name===u){u="mce_editor_"+o;e.setAttrib(w,"id",u);m=new f.Editor(u,q);i.push(m);m.render(1)}})})}})}break;case"textareas":case"specific_textareas":function s(v,u){return u.constructor===RegExp?u.test(v.className):e.hasClass(v,u)}g(e.select("textarea"),function(u){if(q.editor_deselector&&s(u,q.editor_deselector)){return}if(!q.editor_selector||s(u,q.editor_selector)){n=e.get(u.name);if(!u.id&&!n){u.id=u.name}if(!u.id||p.get(u.id)){u.id=e.uniqueId()}m=new f.Editor(u.id,q);i.push(m);m.render(1)}});break}if(q.oninit){r=t=0;g(i,function(u){t++;if(!u.initialized){u.onInit.add(function(){r++;if(r==t){j(q,"oninit")}})}else{r++}if(r==t){j(q,"oninit")}})}})},get:function(i){return this.editors[i]},getInstanceById:function(i){return this.get(i)},add:function(i){this.editors[i.id]=i;this._setActive(i);return i},remove:function(j){var i=this;if(!i.editors[j.id]){return null}delete i.editors[j.id];if(i.activeEditor==j){i._setActive(null);g(i.editors,function(k){i._setActive(k);return false})}j.destroy();return j},execCommand:function(o,m,l){var n=this,k=n.get(l),i;switch(o){case"mceFocus":k.focus();return true;case"mceAddEditor":case"mceAddControl":if(!n.get(l)){new f.Editor(l,n.settings).render()}return true;case"mceAddFrameControl":i=l.window;i.tinyMCE=tinyMCE;i.tinymce=f;f.DOM.doc=i.document;f.DOM.win=i;k=new f.Editor(l.element_id,l);k.render();if(f.isIE){function j(){k.destroy();i.detachEvent("onunload",j);i=i.tinyMCE=i.tinymce=null}i.attachEvent("onunload",j)}l.page_window=null;return true;case"mceRemoveEditor":case"mceRemoveControl":if(k){k.remove()}return true;case"mceToggleEditor":if(!k){n.execCommand("mceAddControl",0,l);return true}if(k.isHidden()){k.show()}else{k.hide()}return true}if(n.activeEditor){return n.activeEditor.execCommand(o,m,l)}return false},execInstanceCommand:function(m,l,k,j){var i=this.get(m);if(i){return i.execCommand(l,k,j)}return false},triggerSave:function(){g(this.editors,function(i){i.save()})},addI18n:function(k,l){var i,j=this.i18n;if(!f.is(k,"string")){g(k,function(n,m){g(n,function(q,p){g(q,function(s,r){if(p==="common"){j[m+"."+r]=s}else{j[m+"."+p+"."+r]=s}})})})}else{g(l,function(n,m){j[k+"."+m]=n})}},_setActive:function(i){this.selectedInstance=this.activeEditor=i}});f.EditorManager.preInit()})(tinymce);var tinyMCE=window.tinyMCE=tinymce.EditorManager;(function(n){var o=n.DOM,k=n.dom.Event,f=n.extend,l=n.util.Dispatcher;var j=n.each,a=n.isGecko,b=n.isIE,e=n.isWebKit;var d=n.is,h=n.ThemeManager,c=n.PluginManager,i=n.EditorManager;var p=n.inArray,m=n.grep,g=n.explode;n.create("tinymce.Editor",{Editor:function(u,r){var q=this;q.id=q.editorId=u;q.execCommands={};q.queryStateCommands={};q.queryValueCommands={};q.isNotDirty=false;q.plugins={};j(["onPreInit","onBeforeRenderUI","onPostRender","onInit","onRemove","onActivate","onDeactivate","onClick","onEvent","onMouseUp","onMouseDown","onDblClick","onKeyDown","onKeyUp","onKeyPress","onContextMenu","onSubmit","onReset","onPaste","onPreProcess","onPostProcess","onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent","onLoadContent","onSaveContent","onNodeChange","onChange","onBeforeExecCommand","onExecCommand","onUndo","onRedo","onVisualAid","onSetProgressState"],function(s){q[s]=new l(q)});q.settings=r=f({id:u,language:"en",docs_language:"en",theme:"simple",skin:"default",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:n.documentBaseURL,add_form_submit_trigger:1,submit_patch:1,add_unload_trigger:1,convert_urls:1,relative_urls:1,remove_script_host:1,table_inline_editing:0,object_resizing:1,cleanup:1,accessibility_focus:1,custom_shortcuts:1,custom_undo_redo_keyboard_shortcuts:1,custom_undo_redo_restore_selection:1,custom_undo_redo:1,doctype:'',visual_table_class:"mceItemTable",visual:1,inline_styles:true,convert_fonts_to_spans:true,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",apply_source_formatting:0,directionality:"ltr",forced_root_block:"p",valid_elements:"@[id|class|style|title|dir';if(G.document_base_url!=n.documentBaseURL){F.iframeHTML+=''}F.iframeHTML+='';if(n.relaxedDomain){F.iframeHTML+='