I was doing some thinking about this too. The user may wish to open the URL in a new window (as implemented), or in the same window.

The normal jscookmenu provides a "target" value for this. However the JSF JSCookMenu tag is now using this to specify which *form* should be submitted when the menu item is selected, so this isn't available to convey the target window info.

The target window (current window, named window, or new window) therefore needs to be encoded somewhere else, probably in the action field.

I was playing around with the idea of having the action field be something like this:
  // open absolute URL in same window
  somemenuid:target=self:http://www.yahoo.com

  // open relative URL in new window
  somemenuid:target=new:/context/foo/bar.html

  // execute JSF action
  somemenuid:action:goto_home_page

This is only a half-baked proposal, but I think the requirement (specifying what window to open url in) is needed.

Regards,

Simon

Barbalace, Richard wrote:
Hi, Thomas.

Below is my final version of the modified cmItemMouseUp() method.  It should
work with any protocol and scripting language.

The method checks the link for the portion right after the JSF tag.  If this is
a word followed by "://", it assumes the link is a URL, which is opened in a new
window.  Otherwise, if this is a word followed by ":", it assumes the link is a
scripted method.  Otherwise, it assumes the link is a JSF action.  I think this
is a reasonable and simple approach, but I recommend more testing by others.
Let me know if you have any questions.

I look forward to seeing this or something similar in the next release of
MyFaces.

Thanks.
+ Richard

function cmItemMouseUp (obj, index)
{
    var item = _cmItemList[index];

    var link = null, target = '_self';

    if (item.length > 2)
        link = item[2];
    if (item.length > 3 && item[3])
        target = item[3];

    if (link != null)
    {
        // changes by Richard J. Barbalace
        if (link.match(/^\w*:\w*:\/\//) != null ) {
            // Link is a URL
            link = link.replace(/^\w*:/, "");  // Remove JSF ID
            window.open (link, target);
        } else if (link.match(/^\w*:\w*:/) != null ) {
            // Link is a script method
            link = link.replace(/^\w*:/, "");  // Remove JSF ID
            window.open (link, '_self');
        } else {
            // Link is a JSF action
            var dummyForm = document.forms['linkDummyForm'];
            dummyForm.elements['jscook_action'].value = link;
            dummyForm.submit();
        }
    }

    var prefix = obj.cmPrefix;
    var thisMenu = cmGetThisMenu (obj, prefix);

    var hasChild = (item.length > 5);
    if (!hasChild)
    {
        if (cmIsDefaultItem (item))
        {
            if (obj.cmIsMain)
                obj.className = prefix + 'MainItem';
            else
                obj.className = prefix + 'MenuItem';
        }
        cmHideMenu (thisMenu, null, prefix);
    }
    else
    {
        if (cmIsDefaultItem (item))
        {
            if (obj.cmIsMain)
                obj.className = prefix + 'MainItemHover';
            else
                obj.className = prefix + 'MenuItemHover';
        }
    }
}

-----Original Message-----
From: Thomas Spiegl [mailto:[EMAIL PROTECTED] Sent: Thursday, November 03, 2005 5:57 PM
To: MyFaces Development
Cc: Simon Kitching; [EMAIL PROTECTED]; Barbalace, Richard
Subject: Re: JavaScript in jsCookMenu component?


Can you send me a final verion for cmItemMouseUp? I will patch the
current version.

Thomas

On 11/2/05, Barbalace, Richard <[EMAIL PROTECTED]> wrote:
Simon Kitching [mailto:[EMAIL PROTECTED] writes:
I'd rather see detection of *any* protocol on the front
of the URL
rather than checking just for "http:". The protocols
"https:", "mail:"
etc are also useful.

== proposal: ==
The URL *always* has "menu_id:" on the start, so
presumably the jscript
could just strip this ID off then look for a ":" before
any occurrence
of "/" or "?". If that is present, then the URL is
"absolute". And if
that is not present but the URL contains a "/" then it
isn't an action
so treat that as a local URL.
I would have done something similar to that originally, but
I was not sure how
consistent the "menu_id:" string was or if that string
might change in the
future. The string is actually "id0_menu:" in the version
I am using, at least
for the first jsCookMenu element on the page.

That proposal sounds almost fine to me. The code needs to
check for only ":" in
the case of scripting languages.  For example, one of my actions is
"id0_menu:javascript:getHelp();", which contains no "/"
character.  I am not
sure what the ideal regular expression would be, but it
would definitely check
for ":", "/", and "?". Perhaps that would be enough; can
any of those
characters be used in a JSF action name?

Thanks.
+ Richard



Reply via email to