Let's share our experiences
Finally, we got official and detailed articles from Microsoft about Forms Authentication in SharePoint Server 2007 and Windows SharePoint Services 3.0:
I'm excited to announce the release of SP1 for WSS 3.0 and Office SharePoint Server 2007. Before you install the service pack there are some very important things to understand. In this post I'll try to provide you with the resources you need to be successful in updating to the latest service pack. Please do NOT simply drop to the bottom and find the links and download and install directly on your production environments. It is essential that you understand the appropriate guidance and test out the patch in a separate test environment. For this purpose we have put together a special SP1 page on TechNet to guide you through the process. The more you know the better prepared you'll be for updating your environment.
Microsoft has unveiled Search Server 2008, the really exciting news is that Microsoft is also offering a free version of this product.
Search Server 2008 is implemented and administered as managed properties, so HTML pages, Office documents, SharePoint lists, database tables, web services - in fact, any content source indexed by MOSS can be made available as a facet.
Read More: http://www.microsoft.com/enterprisesearch/
July 10, 2007 at the Worldwide Partner Conference in Denver, Microsoft announced that a new suite of products called Software Licensing and Protection Services (SLP Services) will become available in the October timeframe. The products comprise a set of tools designed to help developers — from ISVs selling software to those working on internal line-of-business applications — protect their intellectual property (IP), easily and flexibly create and license product versions, track product and feature usage, and integrate into backend business processes. Read more
The ASP.NET AJAX Control Toolkit provides a set of sample controls and extenders that makes it a snap to spice up your web site with rich functionality, and I think it will be very interesting to embed this toolkit into MOSS 2007. In the following example I’ve started with ASP.NET Ajax Accordion control, and may be later I’ll get the opportunity to embed more controls.
Software Needed:
For all people who are enabling Ajax for the first time in SharePoint 2007, you need first to configure your SharePoint Portal to support AJAX. To do this, it is better to open a new AJAX web site in Visual Studio to pick a copy from configuration sections in web.config , and if you have configured it before you can start directly from step 9.
1– Add the following part under: <configSections>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere" />
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
</sectionGroup>
</sectionGroup>
</sectionGroup>
2– Add the following part under: <pages >
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</controls>
3– Add the following part under : <compilation><assemblies>
<add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
4– Add the following part under: <httpHandlers>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
5– Add the following part under: <httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
6– At the end of web.config add the following part under: <configuration>
<system.web.extensions>
<scripting>
<webServices>
<!-- Uncomment this line to enable the authentication service. Include requireSSL="true" if appropriate. -->
<!--
<authenticationService enabled="true" requireSSL = "true|false"/>
-->
<!-- Uncomment these lines to enable the profile service. To allow profile properties to be retrieved and modified in ASP.NET AJAX applications, you need to add each property name to the readAccessProperties and writeAccessProperties attributes. -->
<!--
<profileService enabled="true"
readAccessProperties="propertyname1,propertyname2"
writeAccessProperties="propertyname1,propertyname2" />
-->
</webServices>
<!--
<scriptResourceHandler enableCompression="true" enableCaching="true" />
-->
</scripting>
</system.web.extensions>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</modules>
<handlers>
<remove name="WebServiceHandlerFactory-Integrated" />
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</handlers>
</system.webServer>
7– Before closing web.config we should add the AJAX controls dll to SharePoint Safe Controls, so copy the following part under: <SafeControls>
<SafeControl Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TypeName="*" Safe="True" />
8– It is time to include the AJAX script Manager to the master page, in my case I’ve included the script manager control in the default.master located in the following path:
C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\GLOBAL
So, according to your portal template; locate the right master page file or you can open the master page from the SharePoint Designer under _catalogs folder.
After you locate the master page file open the file then put the following line inside the top of <form> tag
<asp:ScriptManager runat="server" ID="ScriptManager1"></asp:ScriptManager>
As shown below:
9– At this point you’ve configured your SharePoint to support AJAX, once more you need your SharePoint to support the Control Kit, so add the following line under <Controls> tag:
<add namespace="AjaxControlToolkit" assembly="AjaxControlToolkit" tagPrefix="ajaxToolkit"/>
10 – Also you should copy the DLL “AjaxControlToolkit.dll” into your SharePoint Bin Folder:
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\bin
11– Now it is time to write our code, open a new web part project in Visual studio 2005 then add reference of System.Web.Extensions, AjaxControlToolkit to the project and write the following code to web part code file:
using System;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;
namespace Accordion
{
[Guid("6e6ad58b-7e84-46f4-a3f7-e4b276cc0b12")]
public class _Accordion : System.Web.UI.WebControls.WebParts.WebPart
{
protected AjaxControlToolkit.Accordion acc;
public _Accordion()
{
this.ExportMode = WebPartExportMode.All;
}
protected override void CreateChildControls()
{
base.CreateChildControls();
// Fix Form Action
this.FixingFormAction();
acc = new AjaxControlToolkit.Accordion();
acc.ID = "acc";
acc.FramesPerSecond = 40;
acc.FadeTransitions = true;
acc.TransitionDuration = 250;
acc.SuppressHeaderPostbacks = true;
AjaxControlToolkit.AccordionPane pane1 = new AjaxControlToolkit.AccordionPane();
AjaxControlToolkit.AccordionPane pane2 = new AjaxControlToolkit.AccordionPane();
PaneHTMLTemplate header = new PaneHTMLTemplate("<a href=\"\" style=\"border:1px solid #ccc;background-color:#e3eeef\"><b>1. Accordion</b></a>");
PaneHTMLTemplate header2 = new PaneHTMLTemplate("<a href=\"\" style=\"border:1px solid #ccc;background-color:#e3eeef\"><b>2. Accordion</b></a>");
CheckBoxList chk = new CheckBoxList();
CheckBoxList chk2 = new CheckBoxList();
chk.ID = "chk";
chk2.ID = "chk2";
chk.Items.Add(new ListItem("Check1.1"));
chk.Items.Add(new ListItem("Check1.2"));
chk2.Items.Add(new ListItem("Check2.1"));
chk2.Items.Add(new ListItem("Check2.2"));
Control[] myControls = { new LiteralControl("List No.1:<br />"), chk };
Control[] myControls2 = { new LiteralControl("List No.2:<br />"), chk2 };
PaneControlTemplate cont = new PaneControlTemplate(myControls);
PaneControlTemplate cont2 = new PaneControlTemplate(myControls2);
pane1.Header = header;
pane1.Content = cont;
pane2.Header = header2;
pane2.Content = cont2;
acc.Panes.Add(pane1);
acc.Panes.Add(pane2);
this.Controls.Add(acc); ;
}
//Fixing Form Action
private void FixingFormAction()
{
if (this.Page.Form != null)
{
string formOnSubmitAtt = this.Page.Form.Attributes["onsubmit"];
if (formOnSubmitAtt == "return _spFormOnSubmitWrapper();")
{
this.Page.Form.Attributes["onsubmit"] = "_spFormOnSubmitWrapper();";
}
}
ScriptManager.RegisterStartupScript(this, typeof(_Accordion), "UpdatePanelFixup", "_spOriginalFormAction = document.forms[0].action; _spSuppressFormOnSubmitWrapper=true;", true);
}
}
//Class for Building Pane HTML Template tempales
public class PaneHTMLTemplate : ITemplate
{
private string template;
public PaneHTMLTemplate(string temp)
{
template = temp;
}
public void InstantiateIn(Control container)
{
LiteralControl ltr = new LiteralControl(this.template);
container.Controls.Add(ltr);
}
}
//Class for Building Pane Control Template tempales
public class PaneControlTemplate : ITemplate
{
private Control[] tempControls;
public PaneControlTemplate(Control[] tempC)
{
tempControls = tempC;
}
public void InstantiateIn(Control container)
{
foreach (Control ctl in this.tempControls)
{
container.Controls.Add(ctl);
}
}
}
}
Hi all, I've received the following message from MOSS 2007 interested guy, he did use the idea of my previuos post: Customizing SharePoint 2007 Navigation Menu.
Hi, we needed the diferent color tabs, and we use your idea but with some modification. Hope it works for some people:
<SharePoint:AspMenu
ID="TopNavigationMenu"
Runat="server"
DataSourceID="topSiteMap"
EnableViewState="false"
AccessKey="<%$Resources:wss,navigation_accesskey%>"
Orientation="Horizontal"
StaticDisplayLevels="2"
MaximumDynamicDisplayLevels="1"
DynamicHorizontalOffset="0"
StaticPopoutImageUrl="/_layouts/images/menudark.gif"
StaticPopoutImageTextFormatString=""
DynamicHoverStyle-BackColor="#CBE3F0"
SkipLinkText=""
StaticSubMenuIndent="0"
CssClass="ms-topNavContainer">
<StaticMenuItemStyle CssClass="" ItemSpacing="4px" />
<StaticSelectedStyle CssClass="ms-topnavselected" ItemSpacing="4px" />
<StaticHoverStyle CssClass="ms-topNavHover"/>
<StaticItemTemplate>
<div class="<%# GetMenuItemClass(Eval("Text").ToString())%>" style="height:100%">
<a href="<%# Eval("DataPath") %>">
<%# Eval("Text") %></a></div>
</StaticItemTemplate>
<DynamicMenuStyle BackColor="#F2F3F4" BorderColor="#A7B4CE" BorderWidth="1px"/>
<DynamicMenuItemStyle CssClass="ms-topNavFlyOuts"/>
<DynamicHoverStyle CssClass="ms-topNavFlyOutsHover"/>
<DynamicSelectedStyle CssClass="ms-topNavFlyOutsSelected"/>
</SharePoint:AspMenu>
<script runat="server" type="text/C#">
private string GetMenuItemClass(string nombreP)
{
string cssClass, lists, name, style, temp;
cssClass = System.Configuration.ConfigurationSettings.AppSettings["cssDefault"].ToString();
list = System.Configuration.ConfigurationSettings.AppSettings["ListSHP"].ToString();
SPWeb web = SPContext.Current.Site.RootWeb ;
//SPWeb web = SPContext.Current.Web;
SPListItemCollection items = web.Lists[list].Items;
foreach (SPListItem item in items)
{
name = System.Configuration.ConfigurationSettings.AppSettings ["TabName"].ToString();
style = System.Configuration.ConfigurationSettings.AppSettings["TabStyle"].ToString();
if (item[nombre].ToString().ToUpper() == TabName.ToUpper())
{
cssClass = item[style].ToString();
break;
}
}
return cssClass;
}
</script>
The idea is to use a SharePoint List to manage the styles of the tabs.
So, we have a SharePoint List with two fields one with the name of the tab and other with the colour wanted for each tab. you have to create the style that you want to apply to each tab.
we have themes for each site, so in each theme.css we add the default styles for each tab in our case:
.green{
border-color: #428914;
border-style: solid;
border-width: 1px 1px 0px 1px;
background-image: url("topnav_green.gif");
background-repeat:repeat-x;
background-color: #F0F8E7;
color: #428914;
font-size: 11pt;
font-family: Arial;
vertical-align:middle;
}
.green a{
color:#FFFFFF;
}
.blue{
border-color: #0073BA;
border-style:solid;
border-width: 1px 1px 0px 1px;
background-image: url("topnav_azul.gif");
background-repeat:repeat-x;
background-color: #E3EAF5;
color: #0073BA;
font-size: 11pt;
font-family: Arial;
vertical-align:middle;
}
.blue a{
color:#0073BA;
}
and the hover and selected depends of the theme that you have on the site that you're viewing
thanks Mahdi!
A new CodePlex projects for community WCM code samples announced by Spencer Harbar & Andrew Connell:
SharePoint 2007 WCM Field Controls
A collection of sample Field Controls for use within Publishing Sites built using Office SharePoint Server 2007's Web Content Management features.
SharePoint 2007 WCM Web Parts
A collection of sample Web Parts for use within Publishing Sites built using Office SharePoint Server 2007's Web Content Management features.
SharePoint 2007 WCM Utilities
A collection of useful utilities for Publishing Sites built using Office SharePoint Server 2007's Web Content Management features.
Hi everyone, I've seen that many people are using HTML content web part for displaying Flash animation, I don't recommend this approach for many reasons, one of them being you won't tell your client to edit HTML code for changing Flash properties; so it is better to have a dedicated web part for rendering Flash animation, I've developed a simple one, here is the code:

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.WebControls;
using System.Xml.Serialization;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;
using Microsoft.SharePoint.Utilities;
using System.Web.UI.HtmlControls;
namespace FlashWebPart
{
[Guid("f04fa49d-1342-4c7d-904a-c43ebc942f39")]
[XmlRoot(Namespace = "FlashWebPart")]
public class FlashWebPart : Microsoft.SharePoint.WebPartPages.WebPart
{
public FlashWebPart()
{
this.ExportMode = WebPartExportMode.All;
}
protected int flashWidth = 400;
protected int flashHeight = 300;
protected string flashUrl = "";
[Browsable(true),
Category("Flash Info"),
DefaultValue(400),
WebPartStorage(Storage.Shared),
FriendlyName("Width"),
Description("Width of the web part")]
public int FlashWidth
{
get
{
return this.flashWidth;
}
set
{
this.flashWidth = value;
}
}
[Browsable(true),
Category("Flash Info"),
DefaultValue(300),
WebPartStorage(Storage.Shared),
FriendlyName("Height"),
Description("Height of the web part")]
public int FlashHeight
{
get
{
return this.flashHeight;
}
set
{
this.flashHeight = value;
}
}
[Browsable(true),
Category("Flash Info"),
DefaultValue(""),
WebPartStorage(Storage.Shared),
FriendlyName("URL"),
Description("URL of the web part")]
public string FlashURL
{
get
{
return this.flashUrl;
}
set
{
this.flashUrl = value;
}
}
protected override void Render(HtmlTextWriter writer)
{
string outHTML = "<OBJECT classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" " +
"codebase=
\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0\" " +
"WIDTH=" + flashWidth + " HEIGHT=" + flashHeight + "> " +
"<PARAM NAME=movie VALUE=\"" + flashUrl + "\"> " +
"<PARAM NAME=WMODE VALUE=\"Transparent\">" +
"<PARAM NAME=quality VALUE=high> " +
"<EMBED src=\"" + flashUrl +
"\" quality=high wmode=\"transparent\" WIDTH=\"" + flashWidth +
"\" HEIGHT=\"" + flashHeight +
"\" TYPE=\"application/x-shockwave-flash\" PLUGINSPAGE=
\"http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash\"></EMBED> " +
"</OBJECT>";
writer.Write(outHTML);
}
}
}
To apply this code, you will need SharePoint Services 3.0 extenstions for Visual studio 2005 to be installed, first create new SharePoint web part Project then override the web part class file.
If you are a WCM developer, then you will be in need to customize the default SharePoint menu control. This new feature in MOSS 2007 is great and it allows for suitable level of customization, but unfortunately, this level is not enough for such portal which I’m involved in these days.
I’ve decided to customize the default menu instead of developing new control. To realize the problem suppose that you want your menu to have the following structure:
Site1 Site2 Site3 Site4 …..
Site1Child1 . Site1Child2 . Site1Child3…
As you see, every static item has its own style, also it should has its own hover style, and dynamic items should appear horizontally in case of mouse over the static item.
If you edited your master page by sharepoint designer, you will notice that the default SharePoint menu allows you to define only one class for all static items, so we need to edit the static menu template, but even though, the template allows you only for editing "link"s' inner HTML, however you can add another link inside this template, it is a good idea for applying deferent classes:
<StaticItemTemplate>
<div id="Static" runat="Server" class='<%# GetStaticClass()%>' onmouseover='<%# GetShowFunction()%>' onmouseout='<%# GetHideFunction()%>'>
<asp:hyperLink runat="Server" id="urlNavS" NavigateUrl='<%# Eval("DataPath")%>' Text='<%# Eval("Text")%>' />
</div>
<div id='<%# GetDynamicID()%>' class='dynPanel' onmouseover='<%# GetShowFunction()%>' onmouseout='<%# GetHideFunction()%>'></div>
</StaticItemTemplate>
You will notice that I’ve put all classes and javascript functions to be driven from C# script, but first you should be permitted from SharePoint to execute C# script in SharePoint pages. To do that you need first to add the following section under <SafeMode> tag in web.config:
<PageParserPaths>
<PageParserPath VirtualPath="/_catalogs/masterpage/*" CompilationMode="Always" AllowServerSideScript="true" />
</PageParserPaths>
I’ve written C# script for providing class name for each item and JavaScript functions.
That will solve the first problem, but further more we need to display dynamic items horizontally, I think this hard to be done by the default dynamic template, so I’ve assigned a class to hide the default dynamic items and I’ve began to generate them by C# code using OnDataBound event.
Here is the full code:
<div id="MenuDiv">
<SharePoint:AspMenu ID="GlobalNav" Runat="server" DataSourceID="SiteMapDataSource1" Orientation="Horizontal" StaticDisplayLevels="1" MaximumDynamicDisplayLevels="1" StaticSubMenuIndent="2" DynamicHorizontalOffset="0" DynamicVerticalOffset="4" StaticEnableDefaultPopOutImage="false" ItemWrap="false" Width="0%" OnDataBound="MenuDataBound">
<StaticMenuItemStyle CssClass="" ItemSpacing="4px" />
<StaticSelectedStyle CssClass="" ItemSpacing="4px" />
<DynamicMenuItemStyle CssClass="dynamicItems" />
<StaticItemTemplate>
<div id="Static" runat="Server" class='<%# GetStaticClass()%>' onmouseover='<%# GetShowFunction()%>' onmouseout='<%# GetHideFunction()%>'>
<asp:hyperLink runat="Server" id="urlNavS" NavigateUrl='<%# Eval("DataPath")%>' Text='<%# Eval("Text")%>' />
</div>
<div id='<%# GetDynamicID()%>' class='dynPanel' onmouseover='<%# GetShowFunction()%>' onmouseout='<%# GetHideFunction()%>'></div>
</StaticItemTemplate>
<StaticHoverStyle CssClass="topNavHover"/>
</SharePoint:AspMenu>
<PublishingNavigation:PortalSiteMapDataSource ID="siteMapDataSource1" Runat="server" SiteMapProvider="CombinedNavSiteMapProvider" EnableViewState="true" StartFromCurrentNode="true" StartingNodeOffset="0" ShowStartingNode="false" TreatStartingNodeAsCurrent="true" TrimNonCurrentTypes="Heading"/>
<div id="dynamicItems" runat="server"></div>
<script runat="server">
int stCount = 0;
protected string GetStaticClass()
{
stCount += 1;
return "staticItem" + stCount .ToString() ;
}
protected string GetDynamicID()
{
return "DynamicItem" + stCount .ToString() ;
}
protected string GetShowFunction()
{
return "showDynamicItems(" + stCount .ToString() + ")" ;
}
protected string GetHideFunction()
{
return "hideDynamicItems(" + stCount .ToString() + ")" ;
}
protected void MenuDataBound(object sender, EventArgs e)
{
int ItemIndex = 0;
int subIndex = 0;
string divContent = "";
foreach(System.Web.UI.WebControls.MenuItem item in GlobalNav.Items)
{
subIndex = 0;
foreach(System.Web.UI.WebControls.MenuItem cItem in item.ChildItems )
{
if(subIndex == 0)
{
divContent += "<div style='display:none' id='subItems" + ItemIndex.ToString() + "'><table class='MenuSubDiv" + (ItemIndex + 1).ToString() + "' ><tr>";
}
divContent += "<td><a href='" + cItem.DataPath + "'>" + cItem.Text + "<a></td>";
if(subIndex == item.ChildItems.Count-1)
{
divContent += "</tr></table></div>";
}
else
{
divContent += "<td> <img src='http://devexpert.net/_layouts/images/menu_sub_bullet.gif'/> </td>";
}
subIndex += 1;
}
ItemIndex += 1;
}
dynamicItems.InnerHtml += divContent ;
}
</script>
<script language="javascript" type="text/javascript">
function showDynamicItems(num)
{
try
{
var dv = document.getElementById("subItems" + (num -1).toString());
var dynCont = document.getElementById("DynamicItem" + num.toString());
if (dynCont.style.display!="block")
{
hideAll();
dynCont.innerHTML = dv.innerHTML ;
dynCont.style.display = "block" ;
}
}
catch (e)
{
}
}
function hideAll()
{
var count =1;
while(true)
{
try
{
var dynCont = document.getElementById("DynamicItem" + count.toString());
if(dynCont.style.display != "none")
{
dynCont.style.display = "none" ;
}
count += 1;
}
catch(e)
{
return;
}
}
}
function hideDynamicItems(num)
{
try
{
var dynCont = document.getElementById("DynamicItem" + num.toString());
dynCont.style.display = "none" ;
}
catch (e)
{
}
}
</script>
</div>