Author: maksimkaszynski
Date: 2007-11-20 11:30:57 -0500 (Tue, 20 Nov 2007)
New Revision: 4113
Added:
branches/3.1.x/ui/menu-components/src/main/config/resources/
branches/3.1.x/ui/menu-components/src/main/config/resources/resources-config.xml
branches/3.1.x/ui/menu-components/src/main/java/org/richfaces/renderkit/html/AbstractMenuRenderer.java
branches/3.1.x/ui/menu-components/src/main/java/org/richfaces/renderkit/html/images/background/MenuListBackground.java
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/css/dropdownmenu.xcss
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/scripts/
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/scripts/menu.js
Modified:
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/css/menucomponents.xcss
Log:
context menu moved to 3.1.x branch
Added: branches/3.1.x/ui/menu-components/src/main/config/resources/resources-config.xml
===================================================================
--- branches/3.1.x/ui/menu-components/src/main/config/resources/resources-config.xml
(rev 0)
+++
branches/3.1.x/ui/menu-components/src/main/config/resources/resources-config.xml 2007-11-20
16:30:57 UTC (rev 4113)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resource-config>
+<!-- Menu list background -->
+
+ <resource
class="org.richfaces.renderkit.html.images.background.MenuListBackground">
+ <name>org.richfaces.renderkit.html.images.background.MenuListBackground</name>
+ </resource>
+</resource-config>
Added:
branches/3.1.x/ui/menu-components/src/main/java/org/richfaces/renderkit/html/AbstractMenuRenderer.java
===================================================================
---
branches/3.1.x/ui/menu-components/src/main/java/org/richfaces/renderkit/html/AbstractMenuRenderer.java
(rev 0)
+++
branches/3.1.x/ui/menu-components/src/main/java/org/richfaces/renderkit/html/AbstractMenuRenderer.java 2007-11-20
16:30:57 UTC (rev 4113)
@@ -0,0 +1,211 @@
+/**
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.renderkit.html;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+
+import org.ajax4jsf.context.AjaxContext;
+import org.ajax4jsf.javascript.JSFunction;
+import org.ajax4jsf.renderkit.HeaderResourcesRendererBase;
+import org.ajax4jsf.resource.InternetResource;
+import org.richfaces.component.UIMenuGroup;
+import org.richfaces.component.UIMenuItem;
+import org.richfaces.component.UIMenuSeparator;
+import org.richfaces.component.util.HtmlUtil;
+import org.richfaces.renderkit.ScriptOptions;
+
+/**
+ * @author Maksim Kaszynski
+ *
+ */
+public abstract class AbstractMenuRenderer extends HeaderResourcesRendererBase {
+
+ private final InternetResource[] scripts = {
+ new org.ajax4jsf.javascript.PrototypeScript(),
+ new org.ajax4jsf.javascript.AjaxScript(),
+ getResource("scripts/menu.js") };
+
+
+ protected InternetResource[] getScripts() {
+ return scripts;
+ }
+
+ protected InternetResource[] getStyles() {
+ return super.getStyles();
+ }
+
+ public void encodeScript(FacesContext context, UIComponent component) throws IOException
{
+ StringBuffer buffer = new StringBuffer();
+
+ buffer.append(getLayerScript(context, component));
+
+ List children = component.getChildren();
+ for(Iterator it = children.iterator();it.hasNext();) {
+ buffer.append(getItemScript(context, (UIComponent) it.next()));
+ }
+
+ ResponseWriter out = context.getResponseWriter();
+ String script = buffer.append(";").toString();
+ out.write(script);
+ }
+
+ protected abstract String getLayerScript(FacesContext context, UIComponent layer);
+
+ protected String getItemScript(FacesContext context, UIComponent kid) {
+ String itemId = null;
+ int flcloseonclick = 1;
+ int flagGroup = 0;
+ if (kid instanceof UIMenuItem) {
+ UIMenuItem menuItem = (UIMenuItem) kid;
+ itemId = kid.getClientId(context);
+ if (menuItem.isDisabled()) {
+ flcloseonclick = 0;
+ }
+ } else if (kid instanceof UIMenuGroup) {
+ UIMenuGroup menuGroup = (UIMenuGroup) kid;
+ itemId = "ref" + kid.getClientId(context);
+ flcloseonclick = 0;
+ if (menuGroup.isDisabled()) {
+ flagGroup = 2;
+ } else {
+ flagGroup = 1;
+ }
+ }
+ if (itemId != null) {
+ JSFunction function = new JSFunction(".addItem");
+ function.addParameter(itemId);
+ function.addParameter(new Integer(flcloseonclick));
+
+ ScriptOptions options = new ScriptOptions(kid);
+ options.addEventHandler("onmouseout");
+ options.addEventHandler("onmouseover");
+ options.addOption("flagGroup", new Integer(flagGroup));
+ options.addOption("selectClass");
+ function.addParameter(options);
+ return function.toScript();
+ }
+ return "";
+ }
+
+ public boolean getRendersChildren() {
+ return true;
+ }
+
+ public void encodeChildren(FacesContext context, UIComponent component)
+ throws IOException {
+ List flatListOfNodes = new LinkedList();
+ String width = (String) component.getAttributes().get("popupWidth");
+
+ flatten(component.getChildren(), flatListOfNodes);
+ processLayer(context, component, width);
+
+ for (Iterator iter = flatListOfNodes.iterator(); iter.hasNext();) {
+ UIMenuGroup node = (UIMenuGroup) iter.next();
+ if (node.isRendered() && !node.isDisabled())
+ processLayer(context, node, width);
+ }
+ }
+
+ public void processLayer(FacesContext context, UIComponent layer, String width) throws
IOException {
+ String clientId = layer.getClientId(context);
+
+ ResponseWriter writer = context.getResponseWriter();
+ writer.startElement("div", layer);
+ writer.writeAttribute("id", clientId+"_menu", null);
+ writer.writeAttribute("class", "dr-menu-list-border
rich-menu-list-border", null);
+ writer.writeAttribute("style", "visibility: hidden; z-index: 2; ",
null);
+ writer.startElement("div", layer);
+ writer.writeAttribute("class", "dr-menu-list-bg rich-menu-list-bg",
null);
+ encodeItems(context, layer);
+
+ writer.startElement("div", layer);
+ writer.writeAttribute("class", "dr-menu-list-strut
rich-menu-list-strut", null);
+
+ writer.startElement("img", layer);
+ writer.writeAttribute("width", "1", null);
+ writer.writeAttribute("height", "1", null);
+ writer.writeAttribute("alt", "", null);
+ writer.writeAttribute("border", "0", null);
+ writer.writeAttribute("style", width!=null && width.length() > 0 ?
"width: " + HtmlUtil.qualifySize(width) : "", null);
+ writer.writeAttribute("src",
+ getResource("/org/richfaces/renderkit/html/images/spacer.gif").getUri(context,
null),
+ null);
+ writer.endElement("img");
+ writer.endElement("div");
+
+ writer.endElement("div");
+ writer.endElement("div");
+
+ writer.startElement("iframe", layer);
+ writer.writeAttribute("src",
+ getResource("/org/richfaces/renderkit/html/images/spacer.gif")
+ .getUri(context, null), null);
+ writer.writeAttribute("id", clientId+"_menu_iframe", null);
+ writer.writeAttribute("class", "underneath_iframe", null);
+ writer.writeAttribute("style", "position:absolute; z-index: 1;",
null);
+ writer.endElement("iframe");
+
+ writer.startElement("script", layer);
+ writer.writeAttribute("id", clientId+"_menu_script", null);
+ writer.writeAttribute("type", "text/javascript", null);
+ encodeScript(context, layer);
+ writer.endElement("script");
+
+ AjaxContext ajaxContext = AjaxContext.getCurrentInstance();
+ Set renderedAreas = ajaxContext.getAjaxRenderedAreas();
+ renderedAreas.add(clientId + "_menu_iframe");
+ renderedAreas.add(clientId + "_menu_script");
+ }
+
+ public void encodeItems(FacesContext context, UIComponent component) throws IOException
{
+ List kids = component.getChildren();
+ Iterator it = kids.iterator();
+ while (it.hasNext()) {
+ UIComponent kid = (UIComponent)it.next();
+ if (kid instanceof UIMenuGroup || kid instanceof UIMenuItem || kid instanceof
UIMenuSeparator) {
+ renderChild(context, kid);
+ }
+ }
+ }
+
+ private void flatten(List kids, List flatList){
+ if(kids != null){
+ for (Iterator iter = kids.iterator(); iter.hasNext();) {
+ UIComponent kid = (UIComponent) iter.next();
+ if (kid instanceof UIMenuGroup) {
+ UIMenuGroup node = (UIMenuGroup) kid;
+ flatList.add(node);
+ flatten(node.getChildren(), flatList);
+ }
+ }
+ }
+ }
+
+}
Copied:
branches/3.1.x/ui/menu-components/src/main/java/org/richfaces/renderkit/html/images/background/MenuListBackground.java
(from rev 4100,
branches/3.1.x/ui/dropdown-menu/src/main/java/org/richfaces/renderkit/html/images/background/MenuListBackground.java)
===================================================================
---
branches/3.1.x/ui/menu-components/src/main/java/org/richfaces/renderkit/html/images/background/MenuListBackground.java
(rev 0)
+++
branches/3.1.x/ui/menu-components/src/main/java/org/richfaces/renderkit/html/images/background/MenuListBackground.java 2007-11-20
16:30:57 UTC (rev 4113)
@@ -0,0 +1,32 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.renderkit.html.images.background;
+
+import org.richfaces.renderkit.html.BaseGradient;
+
+public class MenuListBackground extends BaseGradient {
+
+ public MenuListBackground() {
+ super(22, 3, "additionalBackgroundColor",
"tabBackgroundColor", true);
+ }
+
+}
Added:
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/css/dropdownmenu.xcss
===================================================================
---
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/css/dropdownmenu.xcss
(rev 0)
+++
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/css/dropdownmenu.xcss 2007-11-20
16:30:57 UTC (rev 4113)
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<f:template
xmlns:f='http:/jsf.exadel.com/template'
+
xmlns:u='http:/jsf.exadel.com/template/util'
+
xmlns="http://www.w3.org/1999/xhtml" >
+
+<f:verbatim><![CDATA[
+
+
+.dr-menu-list-border {
+ border : 1px solid;
+ float : left;
+ position : absolute;
+}
+.dr-menu-list-bg {
+ border-top-style : solid;
+ border-left-style : solid;
+ border-right-style : solid;
+
+ border-top-width : 1px;
+ border-left-width : 1px;
+ border-right-width : 1px;
+
+ background : repeat-y left;
+}
+.dr-menu-label {
+ left: 0px;
+ top: 0px;
+ padding : 2px 5px 2px 5px;
+ white-space : nowrap;
+ width : auto;
+ height : auto;
+}
+.dr-menu-label-unselect {
+ border : 0px solid transparent;
+ padding : 3px 6px;
+}
+.dr-menu-label-select {
+ border : 1px solid;
+ cursor : pointer;
+}
+
+.dr-menu-list-strut {
+ font-size : 0px;
+ border: 0px;
+ margin : 0px;
+ position: relative;
+}
+
+.underneath_iframe{
+ position: absolute;
+ z-index: 90;
+ visibility:hidden;
+ left:0px;
+ top:0px;
+ height:1px;
+ width:1px;
+}
+
+]]>
+
+</f:verbatim>
+
+<u:selector name=".dr-label-text-decor">
+ <u:style name="font-weight" skin="headerWeightFont" />
+</u:selector>
+
+<u:selector name=".dr-menu-list-border">
+ <u:style name="border-color" skin="panelBorderColor" />
+ <u:style name="background-color" skin="additionalBackgroundColor"
/>
+</u:selector>
+
+<u:selector name=".dr-menu-list-bg">
+ <u:style name="background-image">
+ <f:resource
f:key="org.richfaces.renderkit.html.images.background.MenuListBackground"/>
+ </u:style>
+ <u:style name="border-top-color" skin="additionalBackgroundColor"
/>
+ <u:style name="border-left-color"
skin="additionalBackgroundColor" />
+ <u:style name="border-right-color"
skin="additionalBackgroundColor" />
+</u:selector>
+
+<u:selector name=".dr-menu-label">
+ <u:style name="font-family" skin="generalFamilyFont" />
+ <u:style name="font-size" skin="generalSizeFont" />
+</u:selector>
+
+<u:selector name=".dr-menu-label-select">
+ <u:style name="border-color" skin="panelBorderColor" />
+ <u:style name="background-color" skin="controlBackgroundColor"
/>
+ <u:style name="color" skin="generalTextColor" />
+</u:selector>
+
+</f:template>
Modified:
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/css/menucomponents.xcss
===================================================================
---
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/css/menucomponents.xcss 2007-11-20
16:30:43 UTC (rev 4112)
+++
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/css/menucomponents.xcss 2007-11-20
16:30:57 UTC (rev 4113)
@@ -49,6 +49,56 @@
.dr-menu-item-disabled .dr-menu-node {
background-position : bottom;
}
+
+.dr-menu-list-border {
+ border : 1px solid;
+ float : left;
+ position : absolute;
+}
+.dr-menu-list-bg {
+ border-top-style : solid;
+ border-left-style : solid;
+ border-right-style : solid;
+
+ border-top-width : 1px;
+ border-left-width : 1px;
+ border-right-width : 1px;
+
+ background : repeat-y left;
+}
+.dr-menu-label {
+ left: 0px;
+ top: 0px;
+ padding : 2px 5px 2px 5px;
+ white-space : nowrap;
+ width : auto;
+ height : auto;
+}
+.dr-menu-label-unselect {
+ border : 0px solid transparent;
+ padding : 3px 6px;
+}
+.dr-menu-label-select {
+ border : 1px solid;
+ cursor : pointer;
+}
+
+.dr-menu-list-strut {
+ font-size : 0px;
+ border: 0px;
+ margin : 0px;
+ position: relative;
+}
+
+.underneath_iframe{
+ position: absolute;
+ z-index: 90;
+ visibility:hidden;
+ left:0px;
+ top:0px;
+ height:1px;
+ width:1px;
+}
]]>
</f:verbatim>
@@ -80,4 +130,33 @@
</u:style>
</u:selector>
+<u:selector name=".dr-label-text-decor">
+ <u:style name="font-weight" skin="headerWeightFont" />
+</u:selector>
+
+<u:selector name=".dr-menu-list-border">
+ <u:style name="border-color" skin="panelBorderColor" />
+ <u:style name="background-color" skin="additionalBackgroundColor"
/>
+</u:selector>
+
+<u:selector name=".dr-menu-list-bg">
+ <u:style name="background-image">
+ <f:resource
f:key="org.richfaces.renderkit.html.images.background.MenuListBackground"/>
+ </u:style>
+ <u:style name="border-top-color" skin="additionalBackgroundColor"
/>
+ <u:style name="border-left-color"
skin="additionalBackgroundColor" />
+ <u:style name="border-right-color"
skin="additionalBackgroundColor" />
+</u:selector>
+
+<u:selector name=".dr-menu-label">
+ <u:style name="font-family" skin="generalFamilyFont" />
+ <u:style name="font-size" skin="generalSizeFont" />
+</u:selector>
+
+<u:selector name=".dr-menu-label-select">
+ <u:style name="border-color" skin="panelBorderColor" />
+ <u:style name="background-color" skin="controlBackgroundColor"
/>
+ <u:style name="color" skin="generalTextColor" />
+</u:selector>
+
</f:template>
Copied:
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/scripts/menu.js
(from rev 4100,
branches/3.1.x/ui/dropdown-menu/src/main/resources/org/richfaces/renderkit/html/scripts/menu.js)
===================================================================
---
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/scripts/menu.js
(rev 0)
+++
branches/3.1.x/ui/menu-components/src/main/resources/org/richfaces/renderkit/html/scripts/menu.js 2007-11-20
16:30:57 UTC (rev 4113)
@@ -0,0 +1,1210 @@
+
+if(!window.RichFaces) window.RichFaces = {};
+if(!RichFaces.Menu) RichFaces.Menu = {};
+
+/**
+ * Fixes IE bug with incorrect layer width when set to auto
+ * @param layer
+ */
+RichFaces.Menu.fitLayerToContent = function(layer) {
+ if (!RichFaces.Menu.Layers.IE)
+ return;
+
+ var table = layer.childNodes[0];
+ if (table) {
+ if (layer.style.width.indexOf("px")!=-1) {
+ var width =
parseFloat(layer.style.width.substring(0,layer.style.width.indexOf('px')));
+ var tmpDims = Element.getDimensions(table);
+ if (tmpDims.width > width) layer.style.width = tmpDims.width + "px";
+ }
+ //layer.style.height = dims.height + "px";
+ } // if
+}
+
+RichFaces.Menu.removePx = function(e) {
+ if ((e+"").indexOf("px")!=-1)
+ return (e+"").substring(0,e.length-2);
+ else
+ return e;
+}
+
+
+RichFaces.Menu.Layers = {
+ listl: new Array(),
+ father: {},
+ lwidthDetected:false,
+ lwidth:{},
+ back: new Array(),
+ horizontals: {},
+ layers: {},
+ levels:
['','','','','','','','','','',''],
+ detectWidth: function(){
+ this.IE = (navigator.userAgent.indexOf('MSIE') > -1) &&
(navigator.userAgent.indexOf('Opera') < 0);
+ this.NS = (navigator.userAgent.indexOf('Netscape') > -1);
+ }
+ ,
+
+ menuTopShift : -11,
+ menuRightShift : 11,
+ menuLeftShift : 0,
+ shadowWidth: 0,
+ thresholdY : 0,
+ abscissaStep : 180,
+
+ CornerRadius: 0,
+
+ toBeHidden : new Array(),
+ toBeHiddenLeft : new Array(),
+ toBeHiddenTop : new Array(),
+
+ layersMoved : 0,
+ layerPoppedUp : '',
+ layerTop : new Array(),
+ layerLeft : new Array(),
+ timeoutFlag : 0,
+ useTimeouts : 1,
+ timeoutLength : 500,
+ showTimeOutFlag : 0,
+ showTimeoutLength: 0,
+ queuedId : '',
+
+ LMPopUp:function(menuName, isCurrent) {
+ if (!this.loaded || ( this.isVisible(menuName) && !isCurrent)) {
+ return;
+ }
+ if (menuName == this.father[this.layerPoppedUp]) {
+ this.LMPopUpL(this.layerPoppedUp, false);
+ } else if (this.father[menuName] == this.layerPoppedUp) {
+ this.LMPopUpL(menuName, true);
+ } else {
+ //this.shutdown();
+ foobar = menuName;
+ do {
+ this.LMPopUpL(foobar, true);
+ foobar = this.father[foobar];
+ } while (foobar);
+ }
+ this.layerPoppedUp = menuName;
+ },
+
+ isVisible: function(layer) {
+ return ($(layer).style.visibility == 'visible');
+ },
+
+ /**
+ * @param menuName
+ * @param visibleFlag
+ */
+ LMPopUpL: function(menuName, visibleFlag) {
+ if (!this.loaded) {
+ return;
+ }
+ this.detectWidth();
+ var menu = $(menuName);
+ RichFaces.Menu.fitLayerToContent(menu);
+ var visible = this.isVisible(menuName);
+ this.setVisibility(menuName, visibleFlag);
+ this.ieSelectWorkAround(menuName, visibleFlag);
+ if (visible && !visibleFlag) {
+ var menuLayer = this.layers[menu.id];
+ if (menuLayer && menuLayer.eventOnClose) menuLayer.eventOnClose();
+ if (menuLayer && menuLayer.eventOnCollapse) menuLayer.eventOnCollapse();
+ if (menuLayer.refItem) menuLayer.refItem.highLightGroup(false);
+ } else if (!visible && visibleFlag) {
+ var menuLayer = this.layers[menu.id];
+ if (menuLayer && menuLayer.eventOnOpen) menuLayer.eventOnOpen();
+ if (menuLayer && menuLayer.eventOnExpand) menuLayer.eventOnExpand();
+
+ if (menuLayer.level>0) {
+ do {
+ menuLayer = this.layers[(this.father[menuLayer.id])];
+ } while (menuLayer.level > 0)
+ if (menuLayer && menuLayer.eventOnGroupActivate)
menuLayer.eventOnGroupActivate();
+ }
+ }
+ },
+
+ ieSelectWorkAround: function(menuName, on){
+ //alert(navigator.userAgent);
+ if(this.IE || this.NS) {
+ menuName = $(menuName).id;
+ var menu = $(menuName);
+ var iframe = $(menuName + "_iframe");
+ var nsfix = (this.NS ? 7 : 0);
+ if(on){
+ var dim = Element.getDimensions(menu);
+ iframe.style.top = menu.style.top;
+ iframe.style.left = menu.style.left;
+ iframe.style.width = menu.offsetWidth + "px"
+ iframe.style.height = menu.offsetHeight + "px"
+ iframe.style.visibility = "visible";
+ } else {
+ iframe.style.visibility = "hidden";
+ }
+ }
+ },
+
+ shutdown: function () {
+ var needToResetLayers = false;
+ for (var i=0; i<this.listl.length; i++) {
+ var layerId = this.listl[i];
+ if ($(layerId)) {
+ this.LMPopUpL(layerId, false);
+ } else {
+ needToResetLayers = true;
+ }
+ }
+
+ if (needToResetLayers) {
+ this.resetLayers();
+ }
+
+ this.layerPoppedUp = '';
+ if (this.Konqueror || this.IE5) {
+ this.seeThroughElements(true);
+ }
+ },
+ resetLayers: function() {
+ var newList = new Array();
+ for (i=0; i<this.listl.length; i++) {
+ var layer = this.listl[i];
+ if ($(layer)) {
+ newList.push(layer);
+ }
+ }
+
+ this.listl = newList;
+ }
+ ,
+
+ /**
+ * Set visibility
+ * @param layer the layer to visibility
+ * @param visible the boolean flag, if true to set visible layer from variable,
otherwise - hide this layer
+ */
+ setVisibility: function (layer, visible) {
+ var tmpLayer = $(layer);
+
+ if (visible) {
+ tmpLayer.style.visibility = 'visible';
+ } else {
+ if(tmpLayer.getElementsByTagName){
+ var inputs = tmpLayer.getElementsByTagName('INPUT');
+ if(inputs){
+ $A(inputs).each(function(node){node.blur()});
+ } // if
+ } // if
+
+ tmpLayer.style.visibility = 'hidden';
+// tmpLayer.style.left = "-"+tmpLayer.clientWidth;
+// Element.hide(tmpLayer);
+ } // else
+ },
+
+
+ clearLMTO: function () {
+ if (this.useTimeouts) {
+ clearTimeout(this.timeoutFlag);
+ }
+ },
+
+ setLMTO: function (ratio) {
+ if(!ratio){
+ ratio = this.timeoutLength;
+ }
+ if (this.useTimeouts) {
+ clearTimeout(this.timeoutFlag);
+ this.timeoutFlag = setTimeout('RichFaces.Menu.Layers.shutdown()', ratio);
+ }
+ },
+
+ loaded:1,
+
+ clearPopUpTO: function(){
+ clearTimeout(this.showTimeOutFlag);
+ },
+ showMenuLayer: function (layerId, e, delay){
+ this.clearPopUpTO();
+ this.showTimeOutFlag = setTimeout(new RichFaces.Menu.DelayedPopUp(layerId, e,
function(){this.layerId = null;}.bind(this)).show, delay);
+ this.layerId = layerId;
+ },
+ showDropDownLayer: function (layerId, parentId, e, delay){
+ this.clearPopUpTO();
+ this.showTimeOutFlag = setTimeout(new RichFaces.Menu.DelayedDropDown(layerId, parentId,
e).show, delay);
+ },
+ showPopUpLayer: function (layer, e){
+ this.shutdown();
+ this.detectWidth();
+ this.LMPopUp(menuName, false);
+ this.setLMTO(4);
+ }
+};
+
+/**
+ * return true if defined document element or document body, otherwise return false
+ */
+RichFaces.Menu.getWindowElement = function() {
+ return (document.documentElement || document.body);
+}
+
+RichFaces.Menu.getWindowDimensions = function() {
+ var x,y;
+ if (self.innerHeight) // all except Explorer
+ {
+ x = self.innerWidth;
+ y = self.innerHeight;
+ }
+ else if (document.documentElement && document.documentElement.clientHeight)
+ // Explorer 6 Strict Mode
+ {
+ x = document.documentElement.clientWidth;
+ y = document.documentElement.clientHeight;
+ }
+ else if (document.body) // other Explorers
+ {
+ x = document.body.clientWidth;
+ y = document.body.clientHeight;
+ }
+ return {width:x, height:y};
+}
+
+RichFaces.Menu.getWindowScrollOffset = function() {
+ var x,y;
+ if (typeof pageYOffset != "undefined") // all except Explorer
+ {
+ x = window.pageXOffset;
+ y = window.pageYOffset;
+ }
+ else if (document.documentElement && document.documentElement.scrollTop)
+ // Explorer 6 Strict
+ {
+ x = document.documentElement.scrollLeft;
+ y = document.documentElement.scrollTop;
+ }
+ else if (document.body) // all other Explorers
+ {
+ x = document.body.scrollLeft;
+ y = document.body.scrollTop;
+ }
+
+ return {top:y, left: x};
+}
+
+RichFaces.Menu.getPageDimensions = function() {
+ var x,y;
+ var test1 = document.body.scrollHeight;
+ var test2 = document.body.offsetHeight;
+ if (test1 > test2) {
+ // all but Explorer Mac
+ x = document.body.scrollWidth;
+ y = document.body.scrollHeight;
+ }
+ else {
+ // Explorer Mac;
+ // would also work in Explorer 6 Strict, Mozilla and Safari
+
+ x = document.body.offsetWidth;
+ y = document.body.offsetHeight;
+ }
+
+ return {width:x, height:y};
+}
+
+
+RichFaces.Menu.DelayedContextMenu = function(layer, e) {
+ if (!e) {
+ e = window.event;
+ }
+ Event.stop(e);
+ this.event = e;
+ this.element = Event.element(e);
+ this.layer = $(layer);
+ this.show = function() {
+ RichFaces.Menu.Layers.shutdown();
+ var body = RichFaces.Menu.getPageDimensions();
+ var win = RichFaces.Menu.getWindowDimensions();
+ var bodyHeight = body.height;
+ var bodyWidth = body.width;
+ var clientX = this.event.clientX;
+ var clientY = this.event.clientY;
+
+ var top = Event.pointerY(this.event);
+ var left = Event.pointerX(this.event);
+ var layerdim = Element.getDimensions(this.layer);
+ var layerLeft = left;
+
+ if (clientX + layerdim.width > win.width) {
+ layerLeft -= (layerdim.width - RichFaces.Menu.Layers.shadowWidth -
RichFaces.Menu.Layers.CornerRadius);
+ }
+
+ if (layerLeft < 0) {
+ layerLeft = 0;
+ }
+
+ /*
+ if (layerLeft + layerdim.width > bodyWidth) {
+ layerLeft = bodyWidth - layerdim.width;
+ }
+
+ if (layerLeft < 0) {
+ layerLeft = 0;
+ }
+ */
+ var layerTop = top;
+ /*if (layertop + layerdim.height > bodyHeight) {
+ layertop = bodyHeight - layerdim.height;
+ }
+
+ if (layertop < 0) {
+ layertop = 0;
+ }
+ */
+ if (clientY + layerdim.height > win.height) {
+ layerTop -= (layerdim.height - RichFaces.Menu.Layers.shadowWidth -
RichFaces.Menu.Layers.CornerRadius);
+ }
+
+ if (layerTop < 0) {
+ layerTop = 0;
+ }
+
+ this.layer.style.left = layerLeft + "px";
+ this.layer.style.top = layerTop + "px";
+
+ RichFaces.Menu.Layers.LMPopUp(this.layer.id, false);
+ RichFaces.Menu.Layers.clearLMTO();
+ }.bind(this);
+}
+
+
+/**
+ * Calculates for DROPDOWN
+ */
+RichFaces.Menu.DelayedDropDown = function(layer, elementId, e) {
+ if (!e) {
+ e = window.event;
+ }
+
+ this.event = e;
+ this.element = $(elementId) || Event.element(e);
+ this.layer = $(layer);
+ Event.stop(e);
+
+ this.listPositions = function(jp, dir) {
+ var poss = new Array(new Array(2,1,4),new Array(1,2,3),new Array(4,3,2),new
Array(3,4,1));
+ var list = new Array();
+ if (jp>0 && dir>0) {
+ list.push({jointPoint: jp, direction: dir });
+ } else if (jp>0 && dir==0) {
+ for(var i=0;i<3;i++) {
+ list.push({jointPoint: jp, direction: poss[jp-1][i] });
+ }
+ } else if (jp==0 && dir>0) {
+ for(var i=0;i<3;i++) {
+ list.push({jointPoint: poss[dir-1][i], direction: dir });
+ }
+ } else if (jp==0 && dir==0) {
+ list.push({jointPoint: 4, direction: 3 });
+ list.push({jointPoint: 1, direction: 2 });
+ list.push({jointPoint: 3, direction: 4 });
+ list.push({jointPoint: 2, direction: 1 });
+ }
+ return list;
+ }.bind(this);
+
+ this.calcPosition = function(jp, dir) {
+ var layerLeft;
+ var layerTop;
+ switch (jp) {
+ case 1:
+ layerLeft = this.left;
+ layerTop = this.top;
+ break;
+ case 2:
+ layerLeft = this.right;
+ layerTop = this.top;
+ break;
+ case 3:
+ layerLeft = this.right;
+ layerTop = this.bottom;
+ break;
+ case 4:
+ layerLeft = this.left;
+ layerTop = this.bottom;
+ break;
+ }
+ switch (dir) {
+ case 1:
+ layerLeft -= this.layerdim.width;
+ layerTop -= this.layerdim.height;
+ break;
+ case 2:
+ layerTop -= this.layerdim.height;
+ break;
+ case 4:
+ layerLeft -= this.layerdim.width;
+ }
+ return {left: layerLeft, top: layerTop};
+ }.bind(this);
+
+ this.show = function() {
+ RichFaces.Menu.Layers.shutdown();
+
+ var winOffset = RichFaces.Menu.getWindowScrollOffset();
+ var win = RichFaces.Menu.getWindowDimensions();
+ var pageDims = RichFaces.Menu.getPageDimensions();
+
+
+ var windowHeight = win.height;
+ var windowWidth = win.width;
+
+// var screenOffset = Position.cumulativeOffset(this.element);
+// if (Element.getStyle(this.element, 'position') == 'absolute') {
+// screenOffset[0] = 0;
+// screenOffset[1] = 0;
+// }
+ var screenOffset = Position.positionedOffset(this.element);
+ var innerDiv = this.element.lastChild;
+ var dim = Element.getDimensions(this.element);
+
+ var parOffset = Position.cumulativeOffset(this.element);
+ var divOffset = Position.cumulativeOffset(innerDiv);
+ var deltaX = divOffset[0] - parOffset[0];
+ var deltaY = divOffset[1] - parOffset[1];
+
+ // parent element
+ this.top = screenOffset[1];
+ this.left = screenOffset[0];
+
+ this.bottom = this.top + dim.height;
+ this.right = this.left + dim.width;
+
+ this.layerdim = Element.getDimensions(this.layer);
+
+ var options = RichFaces.Menu.Layers.layers[this.layer.id].options;
+
+ var jointPoint = 0;
+ if (options.jointPoint) {
+ var sJp = options.jointPoint.toUpperCase();
+ jointPoint = sJp.indexOf('TL') != -1?1:jointPoint;
+ jointPoint = sJp.indexOf('TR') != -1?2:jointPoint;
+ jointPoint = sJp.indexOf('BR') != -1?3:jointPoint;
+ jointPoint = sJp.indexOf('BL') != -1?4:jointPoint;
+ }
+
+ var direction = 0;
+ if (options.direction) {
+ var sDir = options.direction.toUpperCase();
+ direction = sDir.indexOf('TOP-LEFT') != -1?1:direction;
+ direction = sDir.indexOf('TOP-RIGHT') != -1?2:direction;
+ direction = sDir.indexOf('BOTTOM-RIGHT')!= -1?3:direction;
+ direction = sDir.indexOf('BOTTOM-LEFT') != -1?4:direction;
+ }
+ var hOffset = options.horizontalOffset;
+ var vOffset = options.verticalOffset;
+
+ var listPos = this.listPositions(jointPoint, direction);
+ var layerPos;
+ var foundPos = false;
+ for (var i=0;i<listPos.length;i++) {
+ layerPos = this.calcPosition(listPos[i].jointPoint, listPos[i].direction)
+ if ((layerPos.left + hOffset >= winOffset.left) &&
+ (layerPos.left + hOffset + this.layerdim.width - winOffset.left <= windowWidth)
&&
+ (layerPos.top + vOffset >= winOffset.top) &&
+ (layerPos.top + vOffset + this.layerdim.height - winOffset.top <= windowHeight))
{
+ foundPos = true;
+ break;
+ }
+ }
+ if (!foundPos) {
+ layerPos = this.calcPosition(listPos[0].jointPoint, listPos[0].direction)
+ }
+ this.layer.style.left = layerPos.left + hOffset - deltaX - this.left + "px";
+ this.layer.style.top = layerPos.top + vOffset - deltaY - this.top + "px";
+
+ this.layer.style.width = this.layer.clientWidth + "px";
+
+ RichFaces.Menu.Layers.LMPopUp(this.layer.id, false);
+ RichFaces.Menu.Layers.clearLMTO();
+ }.bind(this);
+}
+
+RichFaces.Menu.DelayedPopUp = function(layer, e) {
+ if (!e) {
+ e = window.event;
+ }
+
+ this.event = e;
+ this.element = Event.findElement(e, 'div');
+ if (this.element.id.indexOf(":folder") == (this.element.id.length -7) ) {
+ this.element = this.element.parentNode;
+ }
+ this.layer = $(layer);
+
+ this.show = function() {
+ if (!RichFaces.Menu.Layers.isVisible(this.layer) &&
+ RichFaces.Menu.Layers.isVisible(RichFaces.Menu.Layers.father[this.layer.id])) {
+ this.reposition();
+ RichFaces.Menu.Layers.LMPopUp(this.layer, false);
+ }
+ }.bind(this);
+}
+
+RichFaces.Menu.DelayedPopUp.prototype.reposition = function() {
+ var windowShift = RichFaces.Menu.getWindowScrollOffset();
+ var body = RichFaces.Menu.getWindowDimensions();
+ var windowHeight = body.height;
+ var windowWidth = body.width;
+ var scrolls = {top:0, left:0};
+ var screenOffset = Position.positionedOffset(this.element);
+ var leftPx = RichFaces.Menu.removePx(this.element.parentNode.parentNode.style.left);
+ var topPx = RichFaces.Menu.removePx(this.element.parentNode.parentNode.style.top);
+ screenOffset[0]+=Number(leftPx);
+ screenOffset[1]+=Number(topPx);
+ var cumulativeOffset = Position.cumulativeOffset(this.element);
+ var labelOffset = [cumulativeOffset[0] - screenOffset[0], cumulativeOffset[1] -
screenOffset[1]];
+ var dim = Element.getDimensions(this.element);
+ var top = screenOffset[1] + scrolls.top;
+ var bottom = top + dim.height;
+ var left = screenOffset[0] + scrolls.left;
+ var right = left + dim.width;
+ var layerdim = Element.getDimensions(this.layer);
+
+ var options = RichFaces.Menu.Layers.layers[this.layer.id].options;
+ var dir = 0;
+ var vDir = 0;
+ if (options.direction) {
+ strDirection = options.direction.toUpperCase();
+ dir = strDirection.indexOf('LEFT')!=-1?1:dir;
+ dir = strDirection.indexOf('RIGHT')!=-1?2:dir;
+ if (dir>0) {
+ if (strDirection.indexOf('LEFT-UP')!=-1 ||
+ strDirection.indexOf('RIGHT-UP')!=-1) vDir = 1;
+ if (strDirection.indexOf('LEFT-DOWN')!=-1 ||
+ strDirection.indexOf('RIGHT-DOWN')!=-1) vDir = 2;
+ }
+ }
+
+ var layerLeft = right;
+ var layerTop = top - this.layer.firstChild.firstChild.offsetTop;
+
+ if (dir == 0) {
+ if (layerLeft + layerdim.width + labelOffset[0] - windowShift.left >=
windowWidth) {
+ var invisibleRight = layerLeft + layerdim.width + labelOffset[0] -
windowShift.left - windowWidth;
+ layerLeft = left - layerdim.width;
+ }
+
+ if (layerLeft + labelOffset[0] < 0) {
+ if (Math.abs(layerLeft + labelOffset[0]) > invisibleRight) {
+ layerLeft = right;
+ }
+ }
+
+ } else if (dir == 1) {
+ layerLeft = left - layerdim.width;
+ }
+
+ if (vDir != 2) {
+ if (layerTop + layerdim.height + labelOffset[1] - windowShift.top >= windowHeight
+ || vDir == 1) {
+ var invisibleBottom = layerTop + layerdim.height + labelOffset[1] - windowShift.top
- windowHeight;
+ var items = this.layer.firstChild.childNodes;
+ if (items.length > 1) {
+ var lastItem = items[items.length-2];
+ // var layerOffset = Position.cumulativeOffset(this.layer);
+ var itemOffset = Position.positionedOffset(lastItem);
+ // layerTop = top -(itemOffset[1]-layerOffset[1]);
+ layerTop = top - itemOffset[1];
+ if (vDir == 0) {
+ if (layerTop < 0) {
+ if (Math.abs(layerTop) > invisibleBottom) layerTop = top;
+ }
+ }
+ }
+ }
+ }
+
+/* if (layerLeft + layerdim.width >= windowWidth) {
+ layerLeft = left - layerdim.width + RichFaces.Menu.Layers.shadowWidth;
+ }
+
+ if (layerLeft < 0) {
+ layerLeft = 0;
+ }
+
+ // search offsetTop (ch-1351)
+ var layerOffset = Position.cumulativeOffset(this.layer);
+ var items = document.getElementsByClassName("exadel_menuItem",this.layer);
+ var nodes = document.getElementsByClassName("exadel_menuNode",this.layer);
+ var firstItem = (items.length>0) ? items[0] : ((nodes.length>0) ? nodes[0] :
null);
+ if (firstItem) {
+ if (nodes.length>0 && firstItem.offsetTop>nodes[0].offsetTop)
firstItem = nodes[0];
+ var itemOffset = Position.cumulativeOffset(firstItem);
+ layertop = top -(itemOffset[1]-layerOffset[1]);
+ if (layertop + layerdim.height >= windowHeight) {
+ var lastItem = (items.length>0) ? items[items.length-1] :
nodes[nodes.length-1];
+ if (nodes.length>0 &&
lastItem.offsetTop<nodes[nodes.length-1].offsetTop) lastItem = nodes[nodes.length-1];
+ itemOffset = Position.cumulativeOffset(lastItem);
+ layertop = top -(itemOffset[1]-layerOffset[1]);
+ }
+ } else layertop = top - RichFaces.Menu.Layers.CornerRadius;
+
+ if (layertop < 0) {
+ layertop = 0;
+ } */
+
+ this.layer.style.left = layerLeft + "px";
+ this.layer.style.top = layerTop + "px";
+
+ this.layer.style.width = this.layer.clientWidth + "px";
+
+}
+/**
+ * set to true when a dropdown box inside menu receives focus
+ */
+RichFaces.Menu.selectOpen = false;
+RichFaces.Menu.MouseIn = false;
+
+
+RichFaces.Menu.Layer = Class.create();
+RichFaces.Menu.Layer.prototype = {
+ initialize: function(id,delay, hideDelay){
+ RichFaces.Menu.Layers.listl.push(id);
+ this.id = id;
+ this.layer = $(id);
+ this.level = 0;
+ this.delay = delay;
+ if (hideDelay){
+ this.hideDelay=hideDelay;
+ }
+ else{
+ this.hideDelay=hideDelay;
+ }
+ RichFaces.Menu.fitLayerToContent(this.layer);
+ this.items = new Array();
+ RichFaces.Menu.Layers.layers[id] = this;
+ this.bindings = new Array();
+
+ //Usually set on DD menu to true
+ this.highlightParent = true;
+
+
+ this.mouseover =
+ function(e){
+ RichFaces.Menu.MouseIn=true;
+ RichFaces.Menu.Layers.clearLMTO();
+ if (this.highlightParent) {
+ var menuNode =
RichFaces.Menu.Layers.layers[this.layer.id].layer.parentNode.parentNode;
+ menuNode.className='dr-menu-label dr-menu-label-select rich-ddmenu-label
rich-ddmenu-label-select';
+ }
+
+ Event.stop(e);
+ }.bindAsEventListener(this);
+
+ this.mouseout =
+ function(e){
+ RichFaces.Menu.MouseIn = false;
+ if (!RichFaces.Menu.selectOpen) {
+ RichFaces.Menu.Layers.setLMTO(this.hideDelay);
+ }
+ if (this.highlightParent) {
+ var menuNode =
RichFaces.Menu.Layers.layers[this.layer.id].layer.parentNode.parentNode;
+ menuNode.className='dr-menu-label dr-menu-label-unselect rich-ddmenu-label
rich-ddmenu-label-unselect';
+ }
+ Event.stop(e);
+ }.bindAsEventListener(this);
+
+
+
+ var binding = new RichFaces.Menu.Layer.Binding (
+ this.id,
+ "mouseover",
+ this.mouseover);
+
+ this.bindings.push(binding);
+ binding.refresh();
+ binding = new RichFaces.Menu.Layer.Binding (
+ this.id,
+ "mouseout",
+ this.mouseout);
+ this.bindings.push(binding);
+ binding.refresh();
+
+ arrayinp=$A(this.layer.getElementsByTagName("select"));
+ for(i=0; i<arrayinp.length; i++){
+ var openSelectb = this.openSelect.bindAsEventListener(this);
+ var closeSelectb = this.closeSelect.bindAsEventListener(this);
+ Event.observe(arrayinp[i], "focus", openSelectb);
+ Event.observe(arrayinp[i], "blur", closeSelectb);
+ //var MouseoverInInputb =
RichFaces.Menu.Layer.MouseoverInInput.bindAsEventListener(this);
+ var MouseoverInInputb = this.MouseoverInInput.bindAsEventListener(this);
+ //var MouseoutInInputb =
RichFaces.Menu.Layer.MouseoutInInput.bindAsEventListener(this);
+ var MouseoutInInputb =
this.MouseoutInInput.bindAsEventListener(this);
+ Event.observe(arrayinp[i], "mouseover", MouseoverInInputb);
+ Event.observe(arrayinp[i], "mouseout", MouseoutInInputb);
+
+ //var OnKeyPressb = RichFaces.Menu.Layer.OnKeyPress.bindAsEventListener(this);
+ var OnKeyPressb = this.OnKeyPress.bindAsEventListener(this);
+ Event.observe(arrayinp[i], "keypress", OnKeyPressb);
+ }
+
+ arrayinp=$A(this.layer.getElementsByTagName("input"));
+ for(i=0; i<arrayinp.length; i++){
+ var openSelectb = this.openSelect.bindAsEventListener(this);
+ var closeSelectb = this.closeSelect.bindAsEventListener(this);
+ Event.observe(arrayinp[i], "focus", openSelectb);
+ Event.observe(arrayinp[i], "blur", closeSelectb);
+ //var MouseoverInInputb =
RichFaces.Menu.Layer.MouseoverInInput.bindAsEventListener(this);
+ var MouseoverInInputb = this.MouseoverInInput.bindAsEventListener(this);
+ //var MouseoutInInputb =
RichFaces.Menu.Layer.MouseoutInInput.bindAsEventListener(this);
+ var MouseoutInInputb =
this.MouseoutInInput.bindAsEventListener(this);
+ Event.observe(arrayinp[i], "mouseover", MouseoverInInputb);
+ Event.observe(arrayinp[i], "mouseout", MouseoutInInputb);
+ var OnKeyPressb = this.OnKeyPress.bindAsEventListener(this);
+ Event.observe(arrayinp[i], "keypress", OnKeyPressb);
+ }
+
+ arrayinp=$A(this.layer.getElementsByTagName("textarea"));
+ for(i=0; i<arrayinp.length; i++){
+ var openSelectb = this.openSelect.bindAsEventListener(this);
+ var closeSelectb = this.closeSelect.bindAsEventListener(this);
+ Event.observe(arrayinp[i], "focus", openSelectb);
+ Event.observe(arrayinp[i], "blur", closeSelectb);
+ //var MouseoverInInputb =
RichFaces.Menu.Layer.MouseoverInInput.bindAsEventListener(this);
+ var MouseoverInInputb = this.MouseoverInInput.bindAsEventListener(this);
+ //var MouseoutInInputb =
RichFaces.Menu.Layer.MouseoutInInput.bindAsEventListener(this);
+ var MouseoutInInputb =
this.MouseoutInInput.bindAsEventListener(this);
+ Event.observe(arrayinp[i], "mouseover", MouseoverInInputb);
+ Event.observe(arrayinp[i], "mouseout", MouseoutInInputb);
+ }
+
+/* if(window.A4J && A4J.AJAX ){
+ var listener = new A4J.AJAX.Listener(this.rebind.bindAsEventListener(this));
+ A4J.AJAX.AddListener(listener);
+ } */
+ },
+
+
+
+ openSelect: function(event){
+ RichFaces.Menu.selectOpen = true;
+ var ClickInputb = this.ClickInput.bindAsEventListener(this);
+ Event.observe(Event.element(event), "click", this.ClickInput);
+
+ },
+
+
+ closeSelect: function(event){
+ RichFaces.Menu.selectOpen = false;
+ var ClickInputb = this.ClickInput.bindAsEventListener(this);
+ Event.stopObserving(Event.element(event), "click", this.ClickInput);
+ if (RichFaces.Menu.MouseIn == false){
+ RichFaces.Menu.Layers.setLMTO(this.hideDelay);
+ }
+ },
+
+
+
+ OnKeyPress: function(event){
+
+ if(event.keyCode==13){
+ RichFaces.Menu.Layers.setLMTO(this.hideDelay);
+ }
+ },
+
+
+ MouseoverInInput: function(event){
+ //alert("event rabotaet "+ event.target);
+ var ClickInputb = this.ClickInput.bindAsEventListener(this);
+ Event.observe(Event.element(event), "click", this.ClickInput);
+ },
+
+
+ ClickInput: function(event){
+ //alert("event rabotaet dsds ");
+ Event.stop(event || window.event);
+ return false;
+ },
+
+
+ MouseoutInInput: function(event){
+ var ClickInputb = this.ClickInput.bindAsEventListener(this);
+ Event.stopObserving(Event.element(event), "click", this.ClickInput);
+
+ },
+
+ rebind:function(){
+ $A(this.bindings)
+ .each(
+ function(binding){
+ binding.refresh();
+ }
+ );
+ },
+ showMe: function(e){
+ this.closeSiblings(e);
+ //LOG.a4j_debug('show me ' + this.id +' ' +this.level);
+ RichFaces.Menu.Layers.showMenuLayer(this.id, e, this.delay);
+ RichFaces.Menu.Layers.levels[this.level] = this;
+// if (this.eventOnOpen) this.eventOnOpen();
+ },
+ closeSiblings: function(e){
+ //LOG.a4j_debug('closeASiblins ' + this.id +' ' +this.level);
+ if(RichFaces.Menu.Layers.levels[this.level] &&
RichFaces.Menu.Layers.levels[this.level].id != this.id){
+ for(var i = this.level; i < RichFaces.Menu.Layers.levels.length; i++){
+ if(RichFaces.Menu.Layers.levels[i]) {
+ RichFaces.Menu.Layers.levels[i].hideMe();
+ //RichFaces.Menu.Layers.levels[i] = '';
+ }
+ }
+ }
+ },
+ closeMinors: function(id){
+ //LOG.a4j_debug('closeMinors ' + this.id +' ' +this.level);
+ var item = this.items[id];
+// if(!item.childMenu){
+ //LOG.a4j_debug('hiding menus ' + this.id +' ' +this.level);
+ for(var i = this.level + (!item.childMenu?1:2); i <
RichFaces.Menu.Layers.levels.length; i++){
+ if(RichFaces.Menu.Layers.levels[i]) {
+ //LOG.a4j_debug('hide ' +RichFaces.Menu.Layers.levels[i]);
+ RichFaces.Menu.Layers.levels[i].hideMe();
+ }
+ }
+// }
+ if (item.menu.refItem) {
+ item.menu.refItem.highLightGroup(true);
+ }
+
+ },
+ //addItem: function(itemId, hoverClass, plainClass, hoverStyle, plainStyle){
+ addItem: function(itemId, flag_close_onclick, options) {
+ var dis = this;
+ var item = {
+ highLightGroup: function(light) {
+ if (light) {
+ Element.removeClassName(this.id,"dr-menu-item-enabled");
+ Element.addClassName(this.id,"dr-menu-item-hover");
+ Element.addClassName(this.id,"rich-menu-group-hover");
+ if (this.options.selectClass) Element.addClassName(this.id,
this.options.selectClass);
+
+ Element.addClassName(this.id+":icon","rich-menu-item-icon-selected");
+ Element.addClassName(this.id+":anchor","rich-menu-item-label");
+ } else if (!this.mouseOver) {
+ Element.removeClassName(this.id,"dr-menu-item-hover");
+ Element.removeClassName(this.id,"rich-menu-group-hover");
+ Element.addClassName(this.id,"dr-menu-item-enabled");
+ if (this.options.selectClass) Element.removeClassName(this.id,
this.options.selectClass);
+
+ Element.removeClassName(this.id+":icon","rich-menu-item-icon-selected");
+ Element.removeClassName(this.id+":anchor","rich-menu-item-label");
+ }
+ }
+ };
+ item.id = itemId;
+ item.obj = $(itemId);
+ item.menu = this;
+ item.options = options || {};
+ item.mouseOver = false;
+ if (item.options.onmouseover && item.options.onmouseover != ""){
+ item.eventOnMouseOver = new
Function("event",item.options.onmouseover).bindAsEventListener(item);
+ }
+ if (item.options.onmouseout && item.options.onmouseout != ""){
+ item.eventOnMouseOut = new
Function("event",item.options.onmouseout).bindAsEventListener(item);
+ }
+ this.items[itemId] = item;
+
+ var onmouseover =
+ function(e){
+ this.menu.closeMinors(this.id);
+ if (this.options.flagGroup == 1) {
+ this.mouseOver = true;
+ this.highLightGroup(true);
+ }
+ if (this.eventOnMouseOver) {
+ var reltg = (e.relatedTarget) ? e.relatedTarget : e.fromElement;
+ while (reltg && reltg != this.obj && reltg.nodeName !=
'BODY')
+ reltg = reltg.parentNode;
+ if (reltg == this.obj) return;
+ this.eventOnMouseOver();
+ }
+ }.bindAsEventListener(item);
+
+ var onmouseout =
+ function(e){
+ if (this.options.flagGroup == 1) {
+ this.mouseOver = false;
+ this.highLightGroup(false);
+ }
+ if (this.eventOnMouseOut) {
+ var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
+ while (reltg && reltg != this.obj && reltg.nodeName !=
'BODY')
+ reltg = reltg.parentNode;
+ if (reltg == this.obj) return;
+ this.eventOnMouseOut();
+ }
+ }.bindAsEventListener(item);
+
+ var onmouseclick =
+ function(e){
+ var menuLayer = item.menu;
+ while (menuLayer.level > 0) {
+ menuLayer =
RichFaces.Menu.Layers.layers[(RichFaces.Menu.Layers.father[menuLayer.id])];
+ }
+ if (menuLayer && menuLayer.eventOnItemSelect) menuLayer.eventOnItemSelect();
+ RichFaces.Menu.Layers.shutdown();
+ }.bindAsEventListener(item);
+
+ var binding = new RichFaces.Menu.Layer.Binding (
+ item.id,
+ "mouseover",
+ onmouseover);
+ this.bindings.push(binding);
+ binding.refresh();
+ binding = new RichFaces.Menu.Layer.Binding (
+ item.id,
+ "mouseout",
+ onmouseout);
+ this.bindings.push(binding);
+ binding.refresh();
+ if (flag_close_onclick==1){
+ binding = new RichFaces.Menu.Layer.Binding (
+ item.id,
+ "click",
+ onmouseclick);
+ this.bindings.push(binding);
+ binding.refresh();
+ }
+
+ return this;
+ },
+ hideMe: function(e){
+ RichFaces.Menu.Layers.clearPopUpTO();
+ RichFaces.Menu.Layers.levels[this.level] = null;
+ RichFaces.Menu.Layers.LMPopUpL(this.id, false);
+// if (this.eventOnClose) this.eventOnClose();
+ },
+ asDropDown: function(topLevel, onEvt, offEvt, options){
+ this.options = options || {};
+ if (this.options.ongroupactivate){
+ this.eventOnGroupActivate = this.options.ongroupactivate.bindAsEventListener(this);
+ }
+ if (this.options.onitemselect){
+ this.eventOnItemSelect = this.options.onitemselect.bindAsEventListener(this);
+ }
+ if (this.options.oncollapse){
+ this.eventOnCollapse = this.options.oncollapse.bindAsEventListener(this);
+ }
+ if (this.options.onexpand){
+ this.eventOnExpand = this.options.onexpand.bindAsEventListener(this);
+ }
+
+// if($(topLevel)){ CH-1518
+ var onmouseover = function(e){
+ if (!e) {
+ e = window.event;
+ }
+ RichFaces.Menu.Layers.showDropDownLayer(this.id, topLevel,
e,this.delay);
+ }.bindAsEventListener(this);
+
+ if(!onEvt){
+ onEvt = 'onmouseover';
+ }
+ onEvt = this.eventJsToPrototype(onEvt);
+ if(!offEvt){
+ offEvt = 'onmouseout';
+ }
+ offEvt = this.eventJsToPrototype(offEvt);
+
+ var dis = this;
+ var onmouseout =
+ function(e){
+ RichFaces.Menu.Layers.setLMTO(this.hideDelay);
+ RichFaces.Menu.Layers.clearPopUpTO();
+ }.bindAsEventListener(this);
+
+// var item = $(topLevel);
+ var binding = new RichFaces.Menu.Layer.Binding(topLevel,onEvt, onmouseover);
+ this.bindings.push(binding);
+ binding.refresh();
+ binding = new RichFaces.Menu.Layer.Binding (topLevel, offEvt, onmouseout);
+ this.bindings.push(binding);
+ binding.refresh();
+
+ RichFaces.Menu.Layers.horizontals[this.id] = topLevel;
+// }
+ return this;
+ },
+
+ asSubMenu: function(parentv, refLayerName, evtName, options){
+ this.options = options || {};
+ if (this.options.onclose){
+ this.eventOnClose = this.options.onclose.bindAsEventListener(this);
+ }
+ if (this.options.onopen){
+ this.eventOnOpen = this.options.onopen.bindAsEventListener(this);
+ }
+
+ if(!evtName){
+ evtName = 'onmouseover';
+ }
+ evtName = this.eventJsToPrototype(evtName);
+ this.level = RichFaces.Menu.Layers.layers[parentv].level + 1;
+ RichFaces.Menu.Layers.father[this.id] = parentv;
+ if(!refLayerName){
+ refLayerName = 'ref' + parentv;
+ }
+ var refLayer = $(refLayerName);
+ this.refItem = RichFaces.Menu.Layers.layers[parentv].items[refLayerName];
+ this.refItem.childMenu = this;
+ var binding = new RichFaces.Menu.Layer.Binding(refLayerName,
evtName, this.showMe.bindAsEventListener(this));
+ this.bindings.push(binding);
+ binding.refresh();
+
+
+ // set parents hideDelay
+ var menuLayer=this;
+ while (menuLayer.level > 0) {
+ menuLayer =
RichFaces.Menu.Layers.layers[(RichFaces.Menu.Layers.father[menuLayer.id])];
+ }
+ if (menuLayer && menuLayer.hideDelay){
+ this.hideDelay=menuLayer.hideDelay;
+ }
+
+
+ return this;
+ },
+ asContextMenu: function(parent, evt){
+ var refLayer = $(parent);
+ if(!refLayer) return this;
+ var id = this.id;
+ this.highlightParent = false;
+ if(!evt){
+ evt = 'onclick';
+ }
+ var offEvt = 'onmouseout';
+ offEvt = this.eventJsToPrototype(offEvt);
+
+ var dis = this;
+ var onmouseout =
+ function(e){
+ RichFaces.Menu.Layers.setLMTO(this.hideDelay);
+ RichFaces.Menu.Layers.clearPopUpTO();
+ }.bindAsEventListener(this);
+ evt = this.eventJsToPrototype(evt);
+ var handler = function(e){new RichFaces.Menu.DelayedContextMenu(this.id,
e).show();}.bindAsEventListener(this);
+ var binding = new RichFaces.Menu.Layer.Binding (parent, evt, handler);
+ this.bindings.push(binding);
+ binding.refresh();
+ binding = new RichFaces.Menu.Layer.Binding (parent, offEvt, onmouseout);
+ this.bindings.push(binding);
+ binding.refresh();
+ return this;
+ },
+ eventJsToPrototype: function(evtName){
+ var indexof = evtName.indexOf('on');
+ if(indexof >= 0){
+ evtName = evtName.substr(indexof + 2);
+ }
+ return evtName;
+ }
+
+};
+
+RichFaces.Menu.Layer.Binding = Class.create();
+RichFaces.Menu.Layer.Binding.prototype = {
+ initialize:function(objectId, eventname, handler){
+ this.objectId = objectId;
+ this.eventname = eventname;
+ this.handler = handler;
+ },
+ refresh:function(){
+ /*LOG.a4j_debug("rebinding " + $H(this).inspect());*/
+ var obj = $(this.objectId);
+ if(obj){
+ Event.stopObserving(obj, this.eventname, this.handler);
+ Event.observe(obj, this.eventname, this.handler);
+ return true;
+ }
+ return false;
+ }
+};
+if(!RichFaces.Menu.Item) RichFaces.Menu.Item = {};
+
+/**
+ *
+ */
+RichFaces.Menu.Item.Onclick = function(evt, item, action, params, target) {
+ var form = Event.findElement(evt, 'form');
+
+ /*if(!form || typeof(form) == 'undefined' || !form.nodeName ||
form.nodeName.toLowerCase() != 'form'){
+ form = document.createElement('form');
+ form.setAttribute('method', 'post');
+ form.setAttribute('enctype', 'application/x-www-form-urlencoded');
+ form.action = action;
+ document.body.appendChild(form);
+ }*/
+ var objectsCreated = new Array();
+ var oldValues = new Object();
+ RichFaces.Menu.Item._createOrInitHiddenInput(item + ":submit", item +
":submit", objectsCreated, oldValues, form);
+
+ if (params) {
+
+ for (var param in params) {
+ var paramName = param;
+ var paramValue = params[paramName];
+ if (typeof(paramValue) != 'function') {
+ if (paramValue) {
+ paramValue = String(paramValue);
+ }
+ RichFaces.Menu.Item._createOrInitHiddenInput(paramName, paramValue, objectsCreated,
oldValues, form);
+
+ }
+ }
+ }
+
+ var l = objectsCreated.length;
+
+ for (var i = 0; i < l; i++) {
+ var kid = objectsCreated[i];
+ form.appendChild(kid);
+ }
+
+ var targ = form.target;
+
+ if (target) {
+ form.target = target;
+ }
+
+ form.submit();
+
+ form.target = targ;
+
+ for (var j = 0; j < l; j++) {
+ var kid = objectsCreated[j];
+ if (form && kid) {
+ form.removeChild(kid);
+ }
+ }
+
+ for (var key in oldValues) {
+ var value = oldValues[key];
+ if (typeof(value) != 'function') {
+ ($(key) || form[key]).value = value;
+ }
+ }
+ }
+
+RichFaces.Menu.Item._createOrInitHiddenInput = function(name, value, list, oldValues,
form) {
+ var hiddenObj = $(name) || form[name];
+
+ if (!hiddenObj) {
+ hiddenObj = document.createElement('input');
+ hiddenObj.setAttribute('type', 'hidden');
+ hiddenObj.setAttribute('name', name);
+ hiddenObj.setAttribute('id', name);
+ list.push(hiddenObj);
+ } else {
+ oldValues[name] = hiddenObj.value;
+ }
+ hiddenObj.value = value;
+}
+