Index: /qSiloGroup/tags/0.5.0/Extensions/Install.py
===================================================================
--- /qSiloGroup/tags/0.5.0/Extensions/Install.py	(revision 524)
+++ /qSiloGroup/tags/0.5.0/Extensions/Install.py	(revision 524)
@@ -0,0 +1,122 @@
+import string
+from cStringIO import StringIO
+
+from Products.Archetypes import listTypes
+from Products.Archetypes.Extensions.utils import installTypes
+
+from Products.CMFCore.utils import getToolByName
+from Products.CMFCore.DirectoryView import addDirectoryViews
+
+from Products.qSiloGroup.config import *
+
+def removeSkin(self, layer):
+    skinstool = getToolByName(self, 'portal_skins')
+    for skinName in skinstool.getSkinSelections():
+        original_path = skinstool.getSkinPath(skinName)
+        original_path = [l.strip() for l in original_path.split(',')]
+        new_path= []
+        for l in original_path:
+            if (l == layer) or (l.startswith(layer+'/')):
+                continue
+            new_path.append(l)
+        skinstool.addSkinSelection(skinName, ','.join(new_path))
+
+def setupSkin(self, out, skinFolder):
+
+    skinstool=getToolByName(self, 'portal_skins')
+
+    addDirectoryViews(skinstool, SKINS_DIR, GLOBALS)
+
+    for skin in skinstool.getSkinSelections():
+        path = skinstool.getSkinPath(skin)
+        path = map( string.strip, string.split( path,',' ) )
+
+        if not skinFolder in path:
+            try:
+                path.insert( path.index( 'custom')+1, skinFolder )
+            except ValueError:
+                path.append(skinFolder)
+            path = string.join( path, ', ' )
+            skinstool.addSkinSelection( skin, path )
+            out.write('  %s layer sucessfully installed into skin %s.\n' % (skinFolder, skin))
+        else:
+            out.write('  %s layer was already installed into skin %s.\n' % (skinFolder, skin))
+
+def setupActions(self, out):
+    out.write("Inspecting portal_types\n")
+    types_tool = getToolByName(self, 'portal_types')
+    for ptype in types_tool.objectValues():
+        if ptype.getId() == 'Folder':
+            action_obj = ptype.getActionObject('object/edit_silo_navigation')
+            if action_obj is None:
+                out.write( '  Added Silo Navigation tab for %s\n' % ptype.getId() )
+                ptype.addAction('edit_silo_navigation',
+                                'Silo Navigation',
+                                'string:${object_url}/silo_navigation_form',
+                                '',
+                                ('Modify portal content',),
+                                'object',
+                                visible=True)
+            else:
+                action_obj.edit(title=title, action=action,
+                                condition=condition,
+                                permissions=tuple(permissions),
+                                visible=visible)
+def removeActions(self):
+    tool = getToolByName(self, 'portal_types')
+    for ptype in tool.objectValues():
+        if ptype.getId() == 'Folder':
+            action = ptype.getActionObject('object/edit_silo_navigation')
+            if action != None:
+                acts = list(ptype.listActions())
+                ptype.deleteActions([acts.index(a) for a in acts if a.getId()=='edit_silo_navigation'])
+
+def setupResources(self, out):
+    portal_js = getToolByName(self, 'portal_javascripts', None)
+    portal_css = getToolByName(self, 'portal_css', None)
+
+    if portal_js is not None:
+        scripts = portal_js.getResourceIds()
+        for script in JS:
+            if script['id'] not in scripts:
+                portal_js.registerScript(**script)
+                print >> out, 'Registered %s script\n' % script['id']
+            else:
+                print >> out, 'Skipped registering of %s script\n' % script['id']
+
+    if portal_css is not None:
+        csses = portal_css.getResourceIds()
+        for css in CSS:
+            if css['id'] not in csses:
+                portal_css.registerStylesheet(**css)
+                print >> out, 'Registered %s css\n' % script['id']
+            else:
+                print >> out, 'Skipped registering of %s css\n' % script['id']
+
+def install(self):
+    out = StringIO()
+
+    out.write('setupSkin... \n')
+    setupSkin(self, out, PROJECTNAME)
+
+    installTypes(self, out, listTypes(PROJECTNAME), PROJECTNAME)
+    print >> out, 'Type Installed'
+
+    setupActions(self, out)
+
+    setupResources(self, out)
+
+    # setup our GenericSetup profile
+    setup_tool = getToolByName(self, 'portal_setup')
+    setup_tool.runAllImportStepsFromProfile('profile-Products.qSiloGroup:qsilogroup')
+
+    return out.getvalue()
+
+def uninstall(self):
+    out = StringIO()
+
+    removeActions(self)
+
+    removeSkin(self, PROJECTNAME)
+
+    return out.getvalue()
Index: /qSiloGroup/tags/0.5.0/Extensions/__init__.py
===================================================================
--- /qSiloGroup/tags/0.5.0/Extensions/__init__.py	(revision 524)
+++ /qSiloGroup/tags/0.5.0/Extensions/__init__.py	(revision 524)
@@ -0,0 +1,1 @@
+# I'm a package :)
Index: /qSiloGroup/tags/0.5.0/HISTORY.txt
===================================================================
--- /qSiloGroup/tags/0.5.0/HISTORY.txt	(revision 524)
+++ /qSiloGroup/tags/0.5.0/HISTORY.txt	(revision 524)
@@ -0,0 +1,44 @@
+0.5.0
+
+  * portlet_navigation now invoked as iframe
+
+0.4.1
+
+  * fixed silositemap_view template, bad link for link object
+
+0.4.0
+
+  * overrided sitemap for checking default pages in folders
+
+0.3.1
+
+  * fixed bug in templates with using path expression for importing allowed python module utils.py: 
+      changed from path to python expression
+
+0.3.0
+
+  * added possibility to customize Silo Navigation portlet for the portal root
+  
+  * refactored skins layout for diminishing template logic, added utils module
+
+0.2.0
+
+  * added special rendering of Link objects in Silo Navigation portlet
+
+0.1.3
+
+  * fixed: corrected condition for displaying manager's links
+
+0.1.2
+
+  * fixed bug: bad url in portlet_navigation form
+
+0.1.1
+
+  * automatic selection default page for silo on portlet_navigation
+  
+  * backward compatibility with 0.1.0
+
+0.1.0
+
+  * initial release
Index: /qSiloGroup/tags/0.5.0/README.txt
===================================================================
--- /qSiloGroup/tags/0.5.0/README.txt	(revision 524)
+++ /qSiloGroup/tags/0.5.0/README.txt	(revision 524)
@@ -0,0 +1,3 @@
+Silo Groups product aims to fill the niche off advance SEO techniquies of content assembling.
+
+It supports Plone 3 (tested with Plone 3.1.5.1).
Index: /qSiloGroup/tags/0.5.0/SiloSiteMap.py
===================================================================
--- /qSiloGroup/tags/0.5.0/SiloSiteMap.py	(revision 524)
+++ /qSiloGroup/tags/0.5.0/SiloSiteMap.py	(revision 524)
@@ -0,0 +1,48 @@
+from AccessControl import ClassSecurityInfo
+
+from Products.Archetypes.public import Schema
+
+from Products.qSiloGroup.config import PROJECTNAME
+from Products.ATContentTypes.content.base import registerATCT
+from Products.ATContentTypes.content.base import ATCTContent
+from Products.ATContentTypes.content.schemata import ATContentTypeSchema
+from Products.ATContentTypes.content.schemata import finalizeATCTSchema
+from Products.ATContentTypes.lib.historyaware import HistoryAwareMixin
+
+
+SiloSiteMapSchema = ATContentTypeSchema.copy()
+SiloSiteMapSchema['id'].default = 'sitemap.htm'
+SiloSiteMapSchema['id'].default_method = 'getDefaultId'
+SiloSiteMapSchema['title'].default_method = 'getDefaultTitle'
+SiloSiteMapSchema['allowDiscussion'].schemata = 'metadata'
+SiloSiteMapSchema['relatedItems'].schemata = 'metadata'
+SiloSiteMapSchema['description'].schemata = 'metadata'
+
+
+class SiloSiteMap(ATCTContent, HistoryAwareMixin):
+    """ Silo Site Map """
+
+    schema         =  SiloSiteMapSchema 
+
+    content_icon   = 'document_icon.gif'
+    meta_type      = 'SiloSiteMap'
+    portal_type    = 'SiloSiteMap'
+    archetype_name = 'Silo Sitemap'
+    default_view   = 'silositemap_view'
+    immediate_view = 'silositemap_view'
+    suppl_views    = ()
+    typeDescription= 'Silo Sitemap'
+    typeDescMsgId  = 'description_edit_document'
+
+    security       = ClassSecurityInfo()
+
+    def getDefaultTitle(self):
+        """  Buid default title """
+        return  self.aq_parent.Title() + ' Sitemap'
+
+    def getDefaultId(self):
+        """         """
+        return 'sitemap.htm'
+
+
+registerATCT(SiloSiteMap, PROJECTNAME)
Index: /qSiloGroup/tags/0.5.0/__init__.py
===================================================================
--- /qSiloGroup/tags/0.5.0/__init__.py	(revision 524)
+++ /qSiloGroup/tags/0.5.0/__init__.py	(revision 524)
@@ -0,0 +1,27 @@
+from AccessControl import allow_module
+from Products.CMFCore import utils
+from Products.CMFCore.DirectoryView import registerDirectory
+
+from Products.Archetypes.public import process_types, listTypes
+
+from Products.qSiloGroup.config import *
+
+registerDirectory(SKINS_DIR, GLOBALS)
+
+allow_module('Products.qSiloGroup.utils')
+
+def initialize(context):
+    ##Import Types here to register them
+    from Products.qSiloGroup import SiloSiteMap
+
+    content_types, constructors, ftis = process_types(
+        listTypes(PROJECTNAME),
+        PROJECTNAME)
+
+    utils.ContentInit(
+        PROJECTNAME + ' Content',
+        content_types      = content_types,
+        permission         = VIEW_PERMISSION,
+        extra_constructors = constructors,
+        fti                = ftis,
+        ).initialize(context)
Index: /qSiloGroup/tags/0.5.0/config.py
===================================================================
--- /qSiloGroup/tags/0.5.0/config.py	(revision 524)
+++ /qSiloGroup/tags/0.5.0/config.py	(revision 524)
@@ -0,0 +1,11 @@
+from Products.CMFCore import permissions
+
+VIEW_PERMISSION = permissions.ManagePortal
+
+PROJECTNAME = 'qSiloGroup'
+SKINS_DIR = 'skins'
+
+GLOBALS = globals()
+
+JS = [{'cacheable': True, 'compression': 'safe', 'expression': '', 'enabled': True, 'inline': '', 'cookable': True, 'id': 'adjustIFrameSize.js'},]
+CSS = []
Index: /qSiloGroup/tags/0.5.0/configure.zcml
===================================================================
--- /qSiloGroup/tags/0.5.0/configure.zcml	(revision 524)
+++ /qSiloGroup/tags/0.5.0/configure.zcml	(revision 524)
@@ -0,0 +1,15 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
+    i18n_domain="qSiloGroup">
+
+  <genericsetup:registerProfile
+      name="qsilogroup"
+      title="qSiloGroup extension profile"
+      directory="profiles/default"
+      description="Extension profile for a qSiloGroup product."
+      for="Products.CMFPlone.interfaces.IPloneSiteRoot"
+      provides="Products.GenericSetup.interfaces.EXTENSION"
+      />
+
+</configure>
Index: /qSiloGroup/tags/0.5.0/profiles/default/metadata.xml
===================================================================
--- /qSiloGroup/tags/0.5.0/profiles/default/metadata.xml	(revision 524)
+++ /qSiloGroup/tags/0.5.0/profiles/default/metadata.xml	(revision 524)
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<metadata>
+  <version>0.5.0</version>
+</metadata>
Index: /qSiloGroup/tags/0.5.0/profiles/default/portlets.xml
===================================================================
--- /qSiloGroup/tags/0.5.0/profiles/default/portlets.xml	(revision 524)
+++ /qSiloGroup/tags/0.5.0/profiles/default/portlets.xml	(revision 524)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<portlets>
+    <!-- left column -->
+    <!-- remove standard navigation portlet -->
+    <assignment
+        manager="plone.leftcolumn"
+        category="context"
+        key="/"
+        type="portlets.Navigation"
+        name="navigation"
+        remove="True"
+        />
+
+    <!-- add out navigation portlet before all portlets -->
+    <assignment
+        manager="plone.leftcolumn"
+        category="context"
+        key="/"
+        type="portlets.Classic"
+        name="portlet_navigation"
+        insert_before="*">
+        <property name="template">portlet_navigation</property>
+        <property name="macro">portlet</property>
+    </assignment>
+
+</portlets>
Index: /qSiloGroup/tags/0.5.0/skins/qSiloGroup/adjustIFrameSize.js
===================================================================
--- /qSiloGroup/tags/0.5.0/skins/qSiloGroup/adjustIFrameSize.js	(revision 524)
+++ /qSiloGroup/tags/0.5.0/skins/qSiloGroup/adjustIFrameSize.js	(revision 524)
@@ -0,0 +1,16 @@
+function adjustIFrameSize (iframeWindow) {
+    if (iframeWindow.document.height) {
+        var iframeElement = document.getElementById(iframeWindow.name);
+        iframeElement.style.height = iframeWindow.document.height + 20 +'px';
+//        iframeElement.style.width = iframeWindow.document.width + 20 + 'px';
+    } else if (document.all) {
+        var iframeElement = document.all[iframeWindow.name];
+        if (iframeWindow.document.compatMode && iframeWindow.document.compatMode != 'BackCompat') {
+            iframeElement.style.height = iframeWindow.document.documentElement.scrollHeight + 20 + 'px';
+//            iframeElement.style.width = iframeWindow.document.documentElement.scrollWidth + 20 + 'px';
+        } else {
+            iframeElement.style.height = iframeWindow.document.body.scrollHeight + 20 + 'px';
+//            iframeElement.style.width = iframeWindow.document.body.scrollWidth + 20 + 'px';
+        }
+    }
+}
Index: /qSiloGroup/tags/0.5.0/skins/qSiloGroup/getSiloData.py
===================================================================
--- /qSiloGroup/tags/0.5.0/skins/qSiloGroup/getSiloData.py	(revision 524)
+++ /qSiloGroup/tags/0.5.0/skins/qSiloGroup/getSiloData.py	(revision 524)
@@ -0,0 +1,20 @@
+## Controller Python Script "getSiloData"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##title=Update Folder Property
+##parameters=
+#
+
+from Products.qSiloGroup.utils import getCurrentFolder
+
+prop_dict = context.getSiloNavigationDictionary()
+
+if not prop_dict:
+    return []
+
+CONTEXT = getCurrentFolder(context)
+
+return [prop_dict[item] for item in CONTEXT.objectIds() if item in prop_dict.keys()]
Index: /qSiloGroup/tags/0.5.0/skins/qSiloGroup/getSiloNavigationDictionary.py
===================================================================
--- /qSiloGroup/tags/0.5.0/skins/qSiloGroup/getSiloNavigationDictionary.py	(revision 524)
+++ /qSiloGroup/tags/0.5.0/skins/qSiloGroup/getSiloNavigationDictionary.py	(revision 524)
@@ -0,0 +1,44 @@
+## Controller Python Script "getSiloNavigationDictionary"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##title=Update Folder Property
+##parameters=
+#
+
+from Products.CMFCore.utils import getToolByName
+from Products.qSiloGroup.utils import getCurrentFolder
+
+CONTEXT = getCurrentFolder(context)
+
+items = CONTEXT.getProperty('silo_items', None)
+
+if not items:
+    return {}
+
+links = getToolByName(context, 'portal_catalog').searchResults(path="/".join(CONTEXT.getPhysicalPath()), portal_type="Link")
+links_dict = {}
+for l in links:
+    links_dict[l.getId] = l.getRemoteUrl
+
+prop_dict = {}
+for i in items:
+    s = map(str, i.split('|'))
+    id = s[0]
+    path = id
+    link = False
+    try:
+        if len(s) == 2:
+            title = s[1]
+        else:
+            title = s[2]
+            path += s[1] and ('/'+s[1]) or s[1]
+        if id in links_dict.keys():
+            link = True
+            path = links_dict[id]
+        prop_dict[id] = {'id': id, 'path':path, 'title':title, 'link':link}
+    except: continue
+
+return prop_dict
Index: /qSiloGroup/tags/0.5.0/skins/qSiloGroup/portlet_navigation.pt
===================================================================
--- /qSiloGroup/tags/0.5.0/skins/qSiloGroup/portlet_navigation.pt	(revision 524)
+++ /qSiloGroup/tags/0.5.0/skins/qSiloGroup/portlet_navigation.pt	(revision 524)
@@ -0,0 +1,18 @@
+<html xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:metal="http://xml.zope.org/namespaces/metal"
+      i18n:domain="plone">
+<body>
+<div metal:define-macro="portlet"
+       i18n:domain="plone"
+       tal:omit-tag="">
+
+  <iframe name="document-frame"
+          id="document-frame"
+          src="silo_nav"
+          style="width:100%; border:0; overflow: hidden;"
+          frameBorder="0"
+          tal:attributes="src string:${context/absolute_url}/silo_nav"> </iframe>
+
+</div>
+</body>
+</html>
Index: /qSiloGroup/tags/0.5.0/skins/qSiloGroup/portlet_navtree_macro.pt
===================================================================
--- /qSiloGroup/tags/0.5.0/skins/qSiloGroup/portlet_navtree_macro.pt	(revision 524)
+++ /qSiloGroup/tags/0.5.0/skins/qSiloGroup/portlet_navtree_macro.pt	(revision 524)
@@ -0,0 +1,55 @@
+<tal:master define="level options/level|python:0;
+                    children options/children | nothing;
+                    bottomLevel options/bottomLevel | nothing;
+                    normalizeString nocall:context/plone_utils/normalizeString;
+                    viewActions here/portal_properties/site_properties/typesUseViewActionInListings|python:();
+                    member context/portal_membership/getAuthenticatedMember|nothing;
+                    member_id member/getId|nothing;
+                    plone_view context/@@plone">
+
+<metal:main define-macro="nav_main">
+<tal:navitem repeat="node children">
+<li class="navTreeItem visualNoMarker"
+    tal:define="children   node/children;
+                item       node/item;
+                useView    python:item.portal_type in viewActions;
+                item_icon  python:plone_view.getIcon(item);
+                isFolderish item/is_folderish|nothing;
+                default_page python:isFolderish and item.getObject().getProperty('default_page', '') or '';
+                itemUrl python:test(default_page, '%s/%s' % (item.getURL(), default_page), test(useView, item.getURL() + '/view', item.getURL()));
+                linkRemote python:item.getRemoteUrl and item.Creator != member_id;
+                isCurrent  node/currentItem;"
+    tal:condition="python: bottomLevel &lt;= 0 or level &lt; bottomLevel-1">
+
+    <tal:level define="item_wf_state_class python: 'state-' + normalizeString(item.review_state);">
+
+
+    <div tal:define="itemClass string:$item_wf_state_class;
+                     itemClass python:test(isCurrent, itemClass + ' navTreeCurrentItem', itemClass);">
+
+        <a tal:attributes="href python:test(linkRemote, item.getRemoteUrl, itemUrl);
+                           title item/Description;
+                           class string:$itemClass">
+            <img width="16" height="16"
+                 src="" alt=""
+                 tal:condition="item_icon/url"
+                 tal:attributes="src item_icon/url;
+                 alt item_icon/description;
+                 title item_icon/title;
+                 width item_icon/width;
+                 height item_icon/height;" />
+            <span tal:replace="item/Title">Selected Item Title</span>
+        </a>
+
+    </div>
+
+    <ul tal:attributes="class python:'navTree navTreeLevel'+str(level)"
+        tal:define="level python:level+1;"
+        tal:condition="nocall:children">
+        <metal:recurse use-macro="here/portlet_navtree_macro/macros/nav_main"/>
+    </ul>
+    </tal:level>
+</li>
+</tal:navitem>
+</metal:main>
+</tal:master>
Index: /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_nav.pt
===================================================================
--- /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_nav.pt	(revision 524)
+++ /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_nav.pt	(revision 524)
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><metal:block use-macro="here/global_defines/macros/defines" />
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xml:lang="en"
+      lang="en"
+      tal:attributes="lang language;
+                      xml:lang language"><tal:cache tal:define="lang language;
+                         charset site_properties/default_charset|string:utf-8"><metal:cache use-macro="here/global_cache_settings/macros/cacheheaders">
+      Get the global cache headers located in global_cache_settings.</metal:cache></tal:cache>
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"
+          tal:define="charset site_properties/default_charset|string:utf-8"
+          tal:attributes="content string:text/html;;charset=${charset}" />
+
+    <base tal:attributes="href here/renderBase" /><!--[if lt IE 7]></base><![endif]-->
+
+    <meta name="ROBOTS" content="NOINDEX, NOFOLLOW" />
+    <meta name="generator" content="Plone - http://plone.org" />
+
+    <div tal:replace="structure provider:plone.htmlhead" />
+
+    <meta tal:define="metatags python:putils.listMetaTags(here).items()"
+          tal:condition="metatags"
+          tal:repeat="keyval metatags"
+          tal:attributes="name python:keyval[0];
+                          content python:keyval[1];" />
+
+    <!-- Internet Explorer CSS Fixes -->
+    <tal:iefixstart replace="structure string:&lt;!--[if IE]&gt;" />
+    <style type="text/css" media="all" tal:condition="exists: portal/IEFixes.css"
+           tal:content="string:@import url($portal_url/IEFixes.css);">
+    </style>
+    <tal:iefixend replace="structure string:&lt;![endif]--&gt;" />
+
+    <link tal:replace="structure provider:plone.htmlhead.links" />
+
+    <!-- Disable IE6 image toolbar -->
+    <meta http-equiv="imagetoolbar" content="no" />
+  </head>
+
+  <body onload="if (parent.adjustIFrameSize) parent.adjustIFrameSize(window);"
+        style="min-width: 100px; text-align: left; background-color: #F5F6F6"
+        tal:attributes="class here/getSectionFromURL;
+                        dir python:test(isRTL, 'rtl', 'ltr')">
+
+    <dl class="portlet" id="portlet-navigation-tree" style="border-bottom-color: #FFFFFF"
+        tal:define="silo python:test(here.portal_type == 'Folder', here, here.aq_parent);
+                    default_page python:silo.getProperty('default_page',None);
+                    silo_list here/getSiloData">
+      <dt class="portletHeader">
+        <tal:title content="python:test(getattr(silo, 'portal_type', '') == 'Folder', silo.title_or_id(), 'Navigation')" />
+      </dt>
+
+      <dd class="portletItem">
+        <ul class="portletNavigationTree navTreeLevel0">
+          <tal:navitem repeat="item silo_list">
+            <li class="navTreeItem visualNoMarker"
+                tal:define="item_id item/id;
+                            item_title item/title;"
+                tal:condition="python:item_id and item_id != default_page and item_title">
+              <div>
+                <a target="_parent"
+                   tal:condition="item_title"
+                   tal:attributes="href python:test(item['link'], item['path'], silo.absolute_url()+'/'+item['path'])"
+                   tal:content="item_title|nothing">Item Title</a>
+              </div>
+            </li>
+          </tal:navitem>
+        </ul>
+      </dd>
+      <dd class="portletFooter even"
+          tal:condition="python:getattr(silo.aq_explicit, 'portal_type','')=='Folder' and not isAnon and checkPermission('Manage Portal', silo)">
+        <span>
+          <a target="_parent" tal:attributes="href string:${silo/absolute_url}/folder_contents;">Contents</a> &nbsp;|&nbsp;
+          <a target="_parent" tal:attributes="href string:${silo/absolute_url}/silo_navigation_form;">Edit Nav</a>
+        </span>
+      </dd>
+    </dl>
+  </body>
+</html>
Index: /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_navigation_edit.cpy
===================================================================
--- /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_navigation_edit.cpy	(revision 524)
+++ /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_navigation_edit.cpy	(revision 524)
@@ -0,0 +1,41 @@
+## Controller Python Script "silo_navigation_edit"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind state=state
+##bind subpath=traverse_subpath
+##title=Update Folder Property
+##parameters= menu_ids=''
+#
+
+from Products.CMFCore.utils import getToolByName
+from Products.qSiloGroup.utils import isStructuralFolder, getDefaultPage
+
+silo_items = []
+for id in menu_ids:
+    default_page = ''
+    if getattr(context.aq_explicit, id, None):
+        item = getattr(context.aq_explicit, id)
+    else:
+        continue
+    if isStructuralFolder(item):
+        ids = {}
+        for i in item.objectIds():
+                ids[i] = 1
+        page = getDefaultPage(item)
+        if page and ids.has_key(page):
+            default_page = page
+        if default_page == '':
+            site_properties = getToolByName(context, 'portal_properties').site_properties
+            for page in site_properties.getProperty('default_page', []):
+                if page and ids.has_key(page):
+                    default_page = page
+                    break
+    silo_items.append(id+'|'+default_page+'|'+context.REQUEST.get(id+'_title',''))
+if context.hasProperty('silo_items'):
+    context.manage_changeProperties({'silo_items': silo_items})
+else:
+    context.manage_addProperty('silo_items', silo_items, type='lines')
+
+return state.set(status='success', portal_status_message='Silo Navigation property have been saved.')
Index: /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_navigation_edit.cpy.metadata
===================================================================
--- /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_navigation_edit.cpy.metadata	(revision 524)
+++ /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_navigation_edit.cpy.metadata	(revision 524)
@@ -0,0 +1,6 @@
+[validators]
+validators =
+
+[actions]
+action.failure=traverse_to_action:string:edit_silo_navigation
+action.success=redirect_to_action:string:view
Index: /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_navigation_form.cpt
===================================================================
--- /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_navigation_form.cpt	(revision 524)
+++ /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_navigation_form.cpt	(revision 524)
@@ -0,0 +1,160 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      lang="en"
+      i18n:domain="plone"
+      metal:use-macro="here/main_template/macros/master">
+
+  <head>
+      <metal:block fill-slot="top_slot">
+        <tal:insert tal:replace="nothing"
+              tal:define="dummy python:request.set('enable_border', 1)" />
+      </metal:block>
+  </head>
+
+  <body>
+
+   <div metal:fill-slot="main">
+      <tal:protect tal:condition="python: not checkPermission('List folder contents', here)" tal:replace="here/raiseUnauthorized" />
+    <metal:main-macro define-macro="main">
+    <metal:contentsmacro define-macro="contents"
+         tal:define="standalone python:1;
+                     contentTypes here/getAllowedTypes;
+                     contentFilter contentFilter|request/contentFilter|nothing;
+                     b_size b_size|request/b_size|python:100;
+                     view_title view_title|request/view_title|string:;
+                     contentsMethod python:test(here.portal_type=='Topic', here.queryCatalog, here.getFolderContents);
+                     items python:contentsMethod(contentFilter);
+                     full_view full_view|request/full_view|python:True;">
+
+      <form name="silo_listing_form"
+            method="post"
+            action="folder_object"
+            tal:attributes="action string:${here/absolute_url}/${template/getId}">
+
+       <h1>
+          <tal:block replace="structure python:getattr(here, here.getIcon(1))"/>
+          <span tal:content="python: view_title and here.utranslate(view_title) or putils.pretty_title_or_id(here)" tal:omit-tag="">Directory Id</span>
+        </h1>
+        <tal:full_view condition="full_view">
+            <p tal:content="here/Description">
+                Description
+            </p>
+        </tal:full_view>
+
+        <p class="discreet"
+           tal:condition="not: items"
+           i18n:translate="description_no_visible_items_add_paste">
+           This folder has no visible items.
+        </p>
+        <metal:listing define-macro="folder_listing"
+                       tal:define="items_dict here/getSiloNavigationDictionary|nothing;
+                                   contentFilter contentFilter|python:{'path':'/'};
+                                   use_folder_contents site_properties/typesLinkToFolderContentsInFC|nothing;
+                                   use_view_action site_properties/typesUseViewActionInListings|python:();
+                                   query_path python:path('contentFilter/path|nothing') or request.get('path',None);
+                                   orderable_iface string:OFS.IOrderSupport.IOrderedContainer;
+                                   preSorted python:query_path or ((contentFilter and contentFilter.get('sort_on', 'getObjPositionInParent')!='getObjPositionInParent') or (not contentFilter and request.get('sort_on', 'getObjPositionInParent')!='getObjPositionInParent'));
+                                   isOrderable python:ifacetool.objectImplements(here, orderable_iface);
+                                   nosortclass python:test(isOrderable, 'nosort', '');
+                                   canModifyFolderContent is_editable;">
+
+        <div class="visualClear"><!-- --></div>
+
+          <table id="sortable"
+                 class="listing"
+                 summary="Content listing"
+                 i18n:attributes="summary summary_content_listing;">
+            <thead>
+              <metal:block tal:condition="items|not:standalone|nothing">
+                <tr>
+                  <th class="nosort">
+                      <input class="noborder"
+                             type="checkbox"
+                             src="select_all_icon.gif"
+                             name="selectButton"
+                             title="Select all items"
+                             onClick="toggleSelect(this,'menu_ids:list');"
+                             tal:attributes="src string:$portal_url/select_all_icon.gif"
+                             alt="Select all items"
+                             i18n:attributes="title label_select_all_items; alt label_select_all_items;"
+                  />
+                  </th>
+                  <th tal:attributes="class python:nosortclass"
+                      >&nbsp;<tal:title i18n:translate="listingheader_title"
+                      >Title</tal:title>&nbsp;</th>
+                  <metal:header_slot metal:define-slot="listingheader">
+                  <th tal:attributes="class python:nosortclass"
+                      >&nbsp;<tal:state i18n:translate="listingheader_menu_title"
+                      >Menu title</tal:state>&nbsp;</th>
+                  </metal:header_slot>
+                </tr>
+              </metal:block>
+            </thead>
+
+            <metal:block tal:condition="items|not:standalone|nothing">
+            <tbody tal:define="arrowUp portal/arrowUp.gif;
+                               arrowDown portal/arrowDown.gif;
+                               getRelativeContentURL nocall:utool/getRelativeContentURL
+                               ">
+                <tal:items tal:repeat="item items">
+                   <tr tal:define="oddrow               repeat/item/odd;
+                                   item_url             item/getURL|item/absolute_url;
+                                   item_id              item/getId;
+                                   item_title_or_id     item/pretty_title_or_id;
+                                   isEditable python:item_id in items_dict.keys();
+                                   item_nav_title       python: isEditable and items_dict[item_id]['title'] or request.get(item_id+'_title','');"
+                       tal:attributes="class python:test(oddrow, 'even', 'odd')" >
+                       <td>
+                           <input type="checkbox"
+                                  class="noborder"
+                                  name="menu_ids:list" id="#"
+                                  value="#"
+                                  tal:define="isChecked python:isEditable or item_id in request.get('menu_ids',[])"
+                                  tal:attributes="value   item_id;
+                                                  id      string:cb_$item_id;
+                                                  checked isChecked;
+                                                  alt     string:Select $item_title_or_id;
+                                                  title   string:Select $item_title_or_id" />
+                    </td>
+                    <td>
+                            <strong>
+                            <span tal:content="item_title_or_id">
+                              Item Title
+                            </span>
+                            </strong>
+                    </td>
+
+                    <td>
+                        <input type="text" size="50"
+                               tal:define="item_title python:item_nav_title or item_title_or_id"
+                               tal:attributes="name string:${item_id}_title;
+                                               value item_title"/>
+                    </td>
+                   </tr>
+                </tal:items>
+            </tbody>
+            </metal:block>
+            </table>
+
+        </metal:listing>
+
+        <metal:buttons define-macro="folder_buttons">
+        <input type="hidden" name="orig_template"
+               tal:attributes="value template_id"/>
+          <input class="context"
+                 type="submit"
+                 name="form.button.Save"
+                 value="Save"
+                 tabindex=""
+                 i18n:attributes="value"
+                 tal:attributes="tabindex tabindex/next;" />
+        </metal:buttons>
+        <input type="hidden" name="form.submitted" value="1" />
+      </form>
+
+    </metal:contentsmacro>
+    </metal:main-macro>
+    </div>
+
+
+  </body>
+</html>
Index: /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_navigation_form.cpt.metadata
===================================================================
--- /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_navigation_form.cpt.metadata	(revision 524)
+++ /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silo_navigation_form.cpt.metadata	(revision 524)
@@ -0,0 +1,14 @@
+[default]
+title=Edit Silo Navigation Properties
+
+[security]
+View=0:Authenticated
+
+[validators]
+validators..Save=
+validators..Cancel=
+
+[actions]
+action.success..Save=traverse_to:string:silo_navigation_edit
+action.success..Cancel=redirect_to_action:string:view
+action.failure=traverse_to_action:string:edit_silo_navigation
Index: /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silositemap_view.pt
===================================================================
--- /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silositemap_view.pt	(revision 524)
+++ /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silositemap_view.pt	(revision 524)
@@ -0,0 +1,45 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      lang="en"
+      metal:use-macro="here/main_template/macros/master"
+      i18n:domain="plone">
+
+<body>
+
+<div metal:fill-slot="main">
+    <tal:main-macro metal:define-macro="main" 
+           tal:define="utils python:modules['Products.qSiloGroup.utils'];
+                       silo python:utils.getCurrentFolder(context);
+                       default_page python:utils.getDefaultPage(silo);
+                       silo_dict here/getSiloNavigationDictionary;
+                       default_title python:silo_dict.get(default_page, {}).get('title', None);
+                       silo_list here/getSiloData;
+                       id context/getId">
+        <ul>
+              <li tal:condition="default_page">
+                <div>
+                  <a tal:define="item_title python:default_title or default_page"
+                     tal:condition="default_page"
+                     tal:attributes="href string:${silo/absolute_url}/${default_page};"
+                     tal:content="item_title|default_page">
+                     Item Title</a>
+                </div>
+              </li>
+            <tal:navitem repeat="item silo_list">
+              <li tal:define="item_id item/id;
+                              item_title item/title"
+                  tal:condition="python:item_id and (item_id not in [default_page, id]) and item_title">
+                <div>
+                  <a tal:condition="item_title"
+                     tal:attributes="href python:test(item['link'], item['path'], silo.absolute_url()+'/'+item['path'])"
+                     tal:content="item_title|nothing">
+                     Item Title</a>
+                </div>
+              </li>
+            </tal:navitem>
+        </ul>
+    </tal:main-macro>
+</div>
+
+</body>
+
+</html>
Index: /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silositemap_view.pt.metadata
===================================================================
--- /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silositemap_view.pt.metadata	(revision 524)
+++ /qSiloGroup/tags/0.5.0/skins/qSiloGroup/silositemap_view.pt.metadata	(revision 524)
@@ -0,0 +1,2 @@
+[default]
+title=View Silo Site Map
Index: /qSiloGroup/tags/0.5.0/utils.py
===================================================================
--- /qSiloGroup/tags/0.5.0/utils.py	(revision 524)
+++ /qSiloGroup/tags/0.5.0/utils.py	(revision 524)
@@ -0,0 +1,35 @@
+from Acquisition import aq_base, aq_inner, aq_parent
+from Products.CMFCore.utils import getToolByName
+
+def isDefaultPage(context):
+    plone_utils = getToolByName(context, 'plone_utils')
+    return plone_utils.isDefaultPage(context)
+
+def getDefaultPage(context):
+    plone_utils = getToolByName(context, 'plone_utils')
+    return plone_utils.getDefaultPage(context)
+
+def isStructuralFolder(context):
+    plone_utils = getToolByName(context, 'plone_utils')
+    return plone_utils.isStructuralFolder(context)
+
+def getParentObject(context):
+    return aq_parent(aq_inner(context))
+
+def getCurrentFolder(context):
+    if isStructuralFolder(context) and not isDefaultPage(context):
+        return context
+    return getParentObject(context)
+
+def isFolderOrFolderDefaultPage(context):
+    if isStructuralFolder(context) or isDefaultPage(context):
+        return True
+    return False
+
+def isPortalOrPortalDefaultPage(context):
+    portal = getToolByName(context, 'portal_url').getPortalObject()
+    if aq_base(context) is aq_base(portal) or \
+        (aq_base(getParentObject(context)) is aq_base(portal) and
+        isDefaultPage(context)):
+        return True
+    return False
Index: /qSiloGroup/tags/0.5.0/version.txt
===================================================================
--- /qSiloGroup/tags/0.5.0/version.txt	(revision 524)
+++ /qSiloGroup/tags/0.5.0/version.txt	(revision 524)
@@ -0,0 +1,1 @@
+0.5.0
