UNPKG

23.6 kBHTMLView Raw
1<!DOCTYPE html>
2<html lang="en">
3 <head>
4<meta charset="utf-8"/>
5<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"/>
6
7<link rel="stylesheet" href="../assets/css/style.css"/>
8<!-- Copyright 1998-2021 by Northwoods Software Corporation. --> <title> GoJS Context Menus -- Northwoods Software </title>
9 <link rel="stylesheet" href="../assets/css/prism.css" />
10 </head>
11 <script>
12
13 window.diagrams = [];
14 window.goCode = function(pre, w, h, parentid, animation) {
15 window.diagrams.push([pre, w, h, parentid, animation]);
16 }
17 </script>
18 <body>
19 <nav id="navTop" class="w-full z-30 top-0 text-white bg-nwoods-primary">
20 <div class="w-full container max-w-screen-lg mx-auto flex flex-wrap sm:flex-nowrap items-center justify-between mt-0 py-2">
21 <div class="md:pl-4">
22 <a class="text-white hover:text-white no-underline hover:no-underline
23 font-bold text-2xl lg:text-4xl rounded-lg hover:bg-nwoods-secondary " href="../">
24 <h1 class="mb-0 p-1 ">GoJS</h1>
25 </a>
26 </div>
27 <button id="topnavButton" class="rounded-lg sm:hidden focus:outline-none focus:ring" aria-label="Navigation">
28 <svg fill="currentColor" viewBox="0 0 20 20" class="w-6 h-6">
29 <path id="topnavOpen" fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM9 15a1 1 0 011-1h6a1 1 0 110 2h-6a1 1 0 01-1-1z" clip-rule="evenodd"></path>
30 <path id="topnavClosed" class="hidden" fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path>
31 </svg>
32 </button>
33 <div id="topnavList" class="hidden sm:block items-center w-auto mt-0 text-white p-0 z-20">
34 <ul class="list-reset list-none font-semibold flex justify-end flex-wrap sm:flex-nowrap items-center px-0 pb-0">
35 <li class="p-1 sm:p-0"><a class="topnav-link" href="../learn/">Learn</a></li>
36 <li class="p-1 sm:p-0"><a class="topnav-link" href="../samples/">Samples</a></li>
37 <li class="p-1 sm:p-0"><a class="topnav-link" href="../intro/">Intro</a></li>
38 <li class="p-1 sm:p-0"><a class="topnav-link" href="../api/">API</a></li>
39 <li class="p-1 sm:p-0"><a class="topnav-link" href="https://www.nwoods.com/products/register.html">Register</a></li>
40 <li class="p-1 sm:p-0"><a class="topnav-link" href="../download.html">Download</a></li>
41 <li class="p-1 sm:p-0"><a class="topnav-link" href="https://forum.nwoods.com/c/gojs/11">Forum</a></li>
42 <li class="p-1 sm:p-0"><a class="topnav-link" href="https://www.nwoods.com/contact.html"
43 target="_blank" rel="noopener" onclick="getOutboundLink('https://www.nwoods.com/contact.html', 'contact');">Contact</a></li>
44 <li class="p-1 sm:p-0"><a class="topnav-link" href="https://www.nwoods.com/sales/index.html"
45 target="_blank" rel="noopener" onclick="getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy');">Buy</a></li>
46 </ul>
47 </div>
48 </div>
49 <hr class="border-b border-gray-600 opacity-50 my-0 py-0" />
50 </nav>
51
52 <div class="md:flex flex-col md:flex-row md:min-h-screen w-full max-w-screen-xl mx-auto">
53
54 <div id="navSide" class="flex flex-col w-full md:w-40 lg:w-48 text-gray-700 bg-white flex-shrink-0">
55 <div class="flex-shrink-0 px-8 py-4">
56 <button id="navButton" class="rounded-lg md:hidden focus:outline-none focus:ring" aria-label="Navigation">
57 <svg fill="currentColor" viewBox="0 0 20 20" class="w-6 h-6">
58 <path id="navOpen" fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM9 15a1 1 0 011-1h6a1 1 0 110 2h-6a1 1 0 01-1-1z" clip-rule="evenodd"></path>
59 <path id="navClosed" class="hidden" fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path>
60 </svg>
61 </button>
62 </div>
63 <nav id="navList" class="min-h-screen hidden md:block sidebar-nav flex-grow px-1 lg:px-4 pb-4 md:pb-0 md:overflow-y-auto break-words">
64 <a href="index.html">Basics</a>
65 <a href="buildingObjects.html">Building Parts</a>
66 <a href="usingModels.html">Using Models</a>
67 <a href="dataBinding.html">Data Binding</a>
68 <a href="react.html">GoJS with React</a>
69 <a href="angular.html">GoJS with Angular</a>
70 <a href="textBlocks.html">TextBlocks</a>
71 <a href="shapes.html">Shapes</a>
72 <a href="pictures.html">Pictures</a>
73 <a href="panels.html">Panels</a>
74 <a href="tablePanels.html">Table Panels</a>
75 <a href="brush.html">Brushes</a>
76 <a href="sizing.html">Sizing Objects</a>
77 <a href="itemArrays.html">Item Arrays</a>
78 <a href="changedEvents.html">Changed Events</a>
79 <a href="transactions.html">Transactions</a>
80 <a href="viewport.html">Coordinates</a>
81 <a href="initialView.html">Initial View</a>
82 <a href="collections.html">Collections</a>
83 <a href="links.html">Links</a>
84 <a href="linkLabels.html">Link Labels</a>
85 <a href="connectionPoints.html">Link Points</a>
86 <a href="ports.html">Ports</a>
87 <a href="nodes.html">Nodes</a>
88 <a href="debugging.html">Debugging</a>
89 <a href="layouts.html">Layouts</a>
90 <a href="trees.html">Trees</a>
91 <a href="subtrees.html">SubTrees</a>
92 <a href="groups.html">Groups</a>
93 <a href="subgraphs.html">SubGraphs</a>
94 <a href="sizedGroups.html">Sized Groups</a>
95 <a href="selection.html">Selection</a>
96 <a href="highlighting.html">Highlighting</a>
97 <a href="animation.html">Animation</a>
98 <a href="toolTips.html">ToolTips</a>
99 <a href="contextmenus.html">Context Menus</a>
100 <a href="events.html">Diagram Events</a>
101 <a href="tools.html">Tools</a>
102 <a href="commands.html">Commands</a>
103 <a href="permissions.html">Permissions</a>
104 <a href="validation.html">Validation</a>
105 <a href="HTMLInteraction.html">HTML Interaction</a>
106 <a href="layers.html">Layers &amp; Z-ordering</a>
107 <a href="palette.html">Palette</a>
108 <a href="overview.html">Overview</a>
109 <a href="resizing.html">Resizing Diagrams</a>
110 <a href="replacingDeleting.html">Replacing and Deleting</a>
111 <a href="buttons.html">Buttons</a>
112 <a href="templateMaps.html">Template Maps</a>
113 <a href="legends.html">Legends and Titles</a>
114 <a href="extensions.html">Extensions</a>
115 <a href="geometry.html">Geometry Strings</a>
116 <a href="grids.html">Grid Patterns</a>
117 <a href="graduatedPanels.html">Graduated Panels</a>
118 <a href="makingImages.html">Diagram Images</a>
119 <a href="makingSVG.html">Diagram SVG</a>
120 <a href="printing.html">Printing</a>
121 <a href="serverSideImages.html">Server-side Images</a>
122 <a href="nodeScript.html">GoJS in Node.js</a>
123 <a href="testing.html">Testing</a>
124 <a href="storage.html">Storage</a>
125 <a href="performance.html">Performance</a>
126 <a href="source.html">Building from Source</a>
127 <a href="platforms.html">Platforms</a>
128 <a href="deployment.html">Deployment</a>
129 </nav>
130 </div>
131 <div class="pt-4 px-2 md:px-0 lg:px-4 pb-16 w-full overflow-hidden">
132
133
134
135
136<h1>Context Menus</h1>
137<p>
138<b>GoJS</b> provides a mechanism for you to define context menus for any object or for the diagram background.
139</p>
140
141<p class="box" style="background-color: lightgoldenrodyellow;">
142 Note: GoJS context menus cannot render outside of Diagrams, because they are objects inside the Diagram and therefore drawn only on the Diagram.
143 If you need a context menu drawn partially or fully outside the Diagram, consider making an <a href="#HTMLContextMenus">HTML context menu</a>.
144</p>
145
146<p>
147A GoJS context menu is an <a>Adornment</a> that is shown when the user context-clicks (right mouse click or long touch hold)
148an object that has its <a>GraphObject.contextMenu</a> set.
149The context menu is bound to the same data as the part itself.
150</p>
151<p>
152See samples that make use of context menus in the <a href="../samples/index.html#contextmenus">samples index</a>.
153</p>
154<p>
155It is typical to implement a context menu as a "ContextMenu" Panel containing "ContextMenuButton"s,
156as you can see in the code below in the assignment of the Node's <a>GraphObject.contextMenu</a> and <a>Diagram.contextMenu</a> properties.
157Each "ContextMenu" is just a "Vertical" Panel <a>Adornment</a> that is shadowed.
158Each "ContextMenuButton" is a Panel on which you can set the <a>GraphObject.click</a> event handler.
159In the event handler <code>obj.part</code> will be the whole context menu Adornment.
160<code>obj.part.adornedPart</code> will be adorned Node or Link.
161The bound data is <code>obj.part.data</code>, which will be the same as <code>obj.part.adornedPart.data</code>.
162</p>
163<p>
164You can see how the "ContextMenu" and "ContextMenuButton" builders are defined at
165<a href="../extensions/Buttons.js">Buttons.js</a>.
166There are examples of customizing buttons at <a href="buttons.html">Introduction to Buttons</a>.
167</p>
168<p>
169In this example each <a>Node</a> has its <a>GraphObject.contextMenu</a> property set to an Adornment that shows
170a single button that when clicked changes the color property of the bound model data.
171The diagram gets its own context menu by setting <a>Diagram.contextMenu</a>.
172</p>
173<pre class="lang-js" id="contextmenus"><code>
174 // This method is called as a context menu button's click handler.
175 // Rotate the selected node's color through a predefined sequence of colors.
176 function changeColor(e, obj) {
177 diagram.commit(function(d) {
178 // get the context menu that holds the button that was clicked
179 var contextmenu = obj.part;
180 // get the node data to which the Node is data bound
181 var nodedata = contextmenu.data;
182 // compute the next color for the node
183 var newcolor = "lightblue";
184 switch (nodedata.color) {
185 case "lightblue": newcolor = "lightgreen"; break;
186 case "lightgreen": newcolor = "lightyellow"; break;
187 case "lightyellow": newcolor = "orange"; break;
188 case "orange": newcolor = "lightblue"; break;
189 }
190 // modify the node data
191 // this evaluates data Bindings and records changes in the UndoManager
192 d.model.set(nodedata, "color", newcolor);
193 }, "changed color");
194 }
195
196 // this is a normal Node template that also has a contextMenu defined for it
197 diagram.nodeTemplate =
198 $(go.Node, "Auto",
199 $(go.Shape, "RoundedRectangle",
200 { fill: "white" },
201 new go.Binding("fill", "color")),
202 $(go.TextBlock, { margin: 5 },
203 new go.Binding("text", "key")),
204 {
205 contextMenu: // define a context menu for each node
206 $("ContextMenu", // that has one button
207 $("ContextMenuButton",
208 {
209 "ButtonBorder.fill": "white",
210 "_buttonFillOver": "skyblue"
211 },
212 $(go.TextBlock, "Change Color"),
213 { click: changeColor })
214 // more ContextMenuButtons would go here
215 ) // end Adornment
216 }
217 );
218
219 // also define a context menu for the diagram's background
220 diagram.contextMenu =
221 $("ContextMenu",
222 $("ContextMenuButton",
223 $(go.TextBlock, "Undo"),
224 { click: function(e, obj) { e.diagram.commandHandler.undo(); } },
225 new go.Binding("visible", "", function(o) {
226 return o.diagram.commandHandler.canUndo();
227 }).ofObject()),
228 $("ContextMenuButton",
229 $(go.TextBlock, "Redo"),
230 { click: function(e, obj) { e.diagram.commandHandler.redo(); } },
231 new go.Binding("visible", "", function(o) {
232 return o.diagram.commandHandler.canRedo();
233 }).ofObject()),
234 // no binding, always visible button:
235 $("ContextMenuButton",
236 $(go.TextBlock, "New Node"),
237 { click: function(e, obj) {
238 e.diagram.commit(function(d) {
239 var data = {};
240 d.model.addNodeData(data);
241 part = d.findPartForData(data); // must be same data reference, not a new {}
242 // set location to saved mouseDownPoint in ContextMenuTool
243 part.location = d.toolManager.contextMenuTool.mouseDownPoint;
244 }, 'new node');
245 } })
246 );
247
248 var nodeDataArray = [
249 { key: "Alpha", color: "lightyellow" },
250 { key: "Beta", color: "orange" }
251 ];
252 var linkDataArray = [
253 { from: "Alpha", to: "Beta" }
254 ];
255 diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);
256 diagram.undoManager.isEnabled = true;
257</code></pre>
258<script>goCode("contextmenus", 350, 200)</script>
259<p>
260Try context clicking a node and invoking the "Change Color" command a few times.
261With the diagram context menu you will be able to "Undo" and/or "Redo", or you can use Control-Z and/or Control-Y.
262</p>
263
264<h2 id="Positioning">Positioning</h2>
265<p>
266There are two ways to customize the positioning of the context menu relative to the adorned GraphObject.
267One way is to override <a>ContextMenuTool.positionContextMenu</a>.
268Another way is to have the context menu <a>Adornment</a> include a <a>Placeholder</a>.
269The Placeholder is positioned to have the same size and position as the adorned object.
270The context menu will not to have a background, and thus will not display a shadow by default when using a Placeholder.
271</p>
272<pre class="lang-js" id="contextmenusplaceholder"><code>
273 // this is a shared context menu button click event handler, just for demonstration
274 function cmCommand(e, obj) {
275 var node = obj.part.adornedPart; // the Node with the context menu
276 var buttontext = obj.elt(1); // the TextBlock
277 alert(buttontext.text + " command on " + node.data.key);
278 }
279
280 // this is a normal Node template that also has a contextMenu defined for it
281 diagram.nodeTemplate =
282 $(go.Node, "Auto",
283 $(go.Shape, "RoundedRectangle",
284 { fill: "white" },
285 new go.Binding("fill", "color")),
286 $(go.TextBlock, { margin: 5 },
287 new go.Binding("text", "key")),
288 {
289 contextMenu: // define a context menu for each node
290 $("ContextMenu", "Spot", // that has several buttons around
291 $(go.Placeholder, { padding: 5 }), // a Placeholder object
292 $("ContextMenuButton", $(go.TextBlock, "Top"),
293 { alignment: go.Spot.Top, alignmentFocus: go.Spot.Bottom, click: cmCommand }),
294 $("ContextMenuButton", $(go.TextBlock, "Right"),
295 { alignment: go.Spot.Right, alignmentFocus: go.Spot.Left, click: cmCommand }),
296 $("ContextMenuButton", $(go.TextBlock, "Bottom"),
297 { alignment: go.Spot.Bottom, alignmentFocus: go.Spot.Top, click: cmCommand }),
298 $("ContextMenuButton", $(go.TextBlock, "Left"),
299 { alignment: go.Spot.Left, alignmentFocus: go.Spot.Right, click: cmCommand })
300 ) // end Adornment
301 }
302 );
303
304 var nodeDataArray = [
305 { key: "Alpha", color: "lightyellow" },
306 { key: "Beta", color: "orange" }
307 ];
308 var linkDataArray = [
309 { from: "Alpha", to: "Beta" }
310 ];
311 diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);
312</code></pre>
313<script>goCode("contextmenusplaceholder", 350, 200)</script>
314
315<h2 id="HTMLContextMenus">HTML Context Menus</h2>
316<p>
317It is possible to define custom context menus using HTML instead of Adornments using the <a>HTMLInfo</a> class.
318The <a href="../samples/customContextMenu.html">Custom Context Menu sample</a> and
319<a href="../samples/htmlLightBoxContextMenu.html">Lightbox Context Menu sample</a> show two such custom context menus.
320</p>
321<p>
322HTML context menus require more effort to implement than using the default <b>GoJS</b> "ContextMenu" and "ContextMenuButton".
323However you would have the full power of HTML/CSS/JavaScript to show whatever you want.
324This includes creating context menus that can exist or float outside of the Diagram.
325</p>
326<p>
327 There are two primary considerations when authoring HTML and CSS for context menus.
328 The context menu should usually be a sibling Element of the Diagram, and should never be nested inside a Diagram DIV:
329</p>
330
331<pre class="lang-js"><code>
332&lt;div style="position: relative;"&gt;
333 &lt;div id="myDiagramDiv" style="border: solid 1px black; width:400px; height:400px;"&gt;&lt;/div&gt;
334 &lt;div id="contextMenu"&gt;
335 &lt;!-- ... context menu HTML --&gt;
336 &lt;/div&gt;
337&lt;/div&gt;
338</code></pre>
339
340<p>
341 And the ContextMenu may need a z-index set to ensure it is always on top. GoJS Diagrams have z-index of 2, and some tools a z-index of 100.
342</p>
343
344<pre class="lang-css"><code>#contextMenu {
345 z-index: 1000;
346 ...
347}
348</code></pre>
349
350<p>
351 See the <a href="../samples/customContextMenu.html">Custom Context Menu sample</a> and
352 <a href="../samples/htmlLightBoxContextMenu.html">Lightbox Context Menu sample</a> for HTML examples.
353 See the <a href="HTMLInteraction.html">HTMLInteraction</a> page for more discussion on HTML in GoJS.
354</p>
355
356<h2 id="DefaultContextMenuForTouchEnabledDevices">Default Context Menu for Touch-enabled devices</h2>
357<p>
358Touch devices are presumed to have no keyboard ability, which makes actions like copying and pasting more difficult.
359Because of this, <b>GoJS</b> provides a built-in default context menu on touch devices, implemented in HTML.
360The buttons on this menu are populated dynamically, depending on the target GraphObject (if any) and Diagram and their properties.
361</p>
362<p>
363The default context menu can be disabled by setting <a>ContextMenuTool.defaultTouchContextMenu</a> to null.
364The <a href="../samples/htmlLightBoxContextMenu.html">Lightbox Context Menu sample</a> contains a re-implementation of this menu if you wish to modify it.
365</p>
366<p>
367If you define your own custom context menus, they will prevent the default context menu from appearing on touch devices.
368We recommend that your custom context menus include all common commands appropriate for your app.
369</p>
370
371 </div>
372 </div>
373
374 <div class="bg-nwoods-primary">
375 <section class="max-w-screen-lg text-white container mx-auto py-2 px-12">
376 <p id="version" class="leading-none mb-2 my-4">GoJS</p>
377 </section>
378 </div><footer class="bg-nwoods-primary text-white">
379 <div class="container max-w-screen-lg mx-auto px-8">
380 <div class="w-full py-6">
381
382 <div class="max-w-screen-lg xl:max-w-screen-xl mx-auto px-4 sm:px-6 md:px-8">
383 <ul class="text-sm font-medium pb-14 sm:pb-20 grid grid-cols-1 sm:grid-cols-3 gap-y-10">
384 <li class="list-none row-span-2">
385 <h2 class="text-base font-semibold tracking-wide">GoJS</h2>
386 <ul class="list-none space-y-4 md:space-y-1 px-0">
387 <li>
388 <a href="../samples/index.html">Samples</a>
389 </li>
390 <li>
391 <a href="../learn/index.html">Learn</a>
392 </li>
393 <li>
394 <a href="../intro/index.html">Intro</a>
395 </li>
396 <li>
397 <a href="../api/index.html">API</a>
398 </li>
399 <li>
400 <a href="../changelog.html">Changelog</a>
401 </li>
402 <li>
403 <a href="https://github.com/NorthwoodsSoftware/GoJS">GitHub</a>
404 </li>
405 </ul>
406 </li>
407 <li class="list-none row-span-2">
408 <h2 class="text-base font-semibold tracking-wide">Support</h2>
409 <ul class="list-none space-y-4 md:space-y-1 px-0">
410 <li>
411 <a href="https://www.nwoods.com/contact.html"
412 target="_blank" rel="noopener" onclick="getOutboundLink('https://www.nwoods.com/contact.html', 'contact');">Contact</a>
413 </li>
414 <li>
415 <a href="https://forum.nwoods.com/c/gojs">Forum</a>
416 </li>
417 <li>
418 <a href="https://www.nwoods.com/app/activate.aspx?sku=gojs">Activate</a>
419 </li>
420 <li>
421 <a href="https://www.nwoods.com/sales/index.html"
422 target="_blank" rel="noopener" onclick="getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy');">Buy</a>
423 </li>
424 <li>
425 <a href="https://www.youtube.com/channel/UC9We8EoX596-6XFjJDtZIDg">Videos</a>
426 </li>
427 </ul>
428 </li>
429 <li class="list-none row-span-2">
430 <h2 class="text-base font-semibold tracking-wide">Company</h2>
431 <ul class="list-none space-y-4 md:space-y-1 px-0">
432 <li>
433 <a href="https://www.nwoods.com">Northwoods</a>
434 </li>
435 <li>
436 <a href="https://www.nwoods.com/about.html">About Us</a>
437 </li>
438 <li>
439 <a href="https://www.nwoods.com/contact.html">Contact Us</a>
440 </li>
441 <li>
442 <a href="https://twitter.com/northwoodsgo">Twitter</a>
443 </li>
444
445 </ul>
446 </li>
447 </ul>
448
449
450 <p class="text-sm text-gray-100 md:mb-6">
451 Copyright 1998-2021 <a class="text-white" href="https://www.nwoods.com">Northwoods Software</a>
452 </p>
453 </div>
454 </div>
455</footer> </body>
456
457<script async src="https://www.googletagmanager.com/gtag/js?id=UA-1506307-5"></script>
458<script>
459 window.dataLayer = window.dataLayer || [];
460 function gtag(){dataLayer.push(arguments);}
461 gtag('js', new Date()); gtag('config', 'UA-1506307-5');
462 var getOutboundLink = function(url, label) {
463 gtag('event', 'click', {
464 'event_category': 'outbound',
465 'event_label': label,
466 'transport_type': 'beacon'
467 });
468 }
469
470 // topnav
471 var topButton = document.getElementById("topnavButton");
472 var topnavList = document.getElementById("topnavList");
473 topButton.addEventListener("click", function() {
474 this.classList.toggle("active");
475 topnavList.classList.toggle("hidden");
476 document.getElementById("topnavOpen").classList.toggle("hidden");
477 document.getElementById("topnavClosed").classList.toggle("hidden");
478 });
479</script>
480 <script src="../assets/js/prism.js"></script>
481 <script src="../release/go.js"></script>
482 <script src="../assets/js/goDoc.js"></script>
483 <script>
484 document.addEventListener("DOMContentLoaded", function() {
485 if (window.go) document.getElementById('version').textContent = "GoJS version " + go.version;
486 if (window.goDoc) window.goDoc();
487 var d = window.diagrams;
488 for (var i = 0; i < d.length; i++) {
489 var dargs = d[i];
490 goCodeExecute(dargs[0], dargs[1], dargs[2], dargs[3], dargs[4]);
491 }
492 if (window.extra) window.extra();
493 });
494 </script>
495</html>