Continued work on new Appy GUI.
| 
						 | 
					@ -674,7 +674,7 @@ class Type:
 | 
				
			||||||
        if 'cell' not in layouts:
 | 
					        if 'cell' not in layouts:
 | 
				
			||||||
            layouts['cell'] = Table(other=layouts['view'], derivedType='cell')
 | 
					            layouts['cell'] = Table(other=layouts['view'], derivedType='cell')
 | 
				
			||||||
        # Put the required CSS classes in the layouts
 | 
					        # Put the required CSS classes in the layouts
 | 
				
			||||||
        layouts['cell'].addCssClasses('no-style-table')
 | 
					        layouts['cell'].addCssClasses('noStyle')
 | 
				
			||||||
        if self.master:
 | 
					        if self.master:
 | 
				
			||||||
            # This type has a master (so is a slave): we add css classes
 | 
					            # This type has a master (so is a slave): we add css classes
 | 
				
			||||||
            # allowing to show/hide, in Javascript, its widget according to
 | 
					            # allowing to show/hide, in Javascript, its widget according to
 | 
				
			||||||
| 
						 | 
					@ -1462,13 +1462,10 @@ class Date(Type):
 | 
				
			||||||
                      label)
 | 
					                      label)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getCss(self, layoutType):
 | 
					    def getCss(self, layoutType):
 | 
				
			||||||
        if (layoutType == 'edit') and self.calendar:
 | 
					        if (layoutType == 'edit') and self.calendar: return ('calendar.css',)
 | 
				
			||||||
            return ('jscalendar/calendar-system.css',)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getJs(self, layoutType):
 | 
					    def getJs(self, layoutType):
 | 
				
			||||||
        if (layoutType == 'edit') and self.calendar:
 | 
					        if (layoutType == 'edit') and self.calendar: return ('calendar.js',)
 | 
				
			||||||
            return ('jscalendar/calendar_stripped.js',
 | 
					 | 
				
			||||||
                    'jscalendar/calendar-en.js')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getSelectableYears(self):
 | 
					    def getSelectableYears(self):
 | 
				
			||||||
        '''Gets the list of years one may select for this field.'''
 | 
					        '''Gets the list of years one may select for this field.'''
 | 
				
			||||||
| 
						 | 
					@ -1727,7 +1724,8 @@ class Ref(Type):
 | 
				
			||||||
                      historized, sync, mapping, label)
 | 
					                      historized, sync, mapping, label)
 | 
				
			||||||
        self.validable = self.link
 | 
					        self.validable = self.link
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getDefaultLayouts(self): return {'view': Table('l-f'), 'edit': 'lrv-f'}
 | 
					    def getDefaultLayouts(self):
 | 
				
			||||||
 | 
					        return {'view': Table('l-f', width='100%'), 'edit': 'lrv-f'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def isShowable(self, obj, layoutType):
 | 
					    def isShowable(self, obj, layoutType):
 | 
				
			||||||
        res = Type.isShowable(self, obj, layoutType)
 | 
					        res = Type.isShowable(self, obj, layoutType)
 | 
				
			||||||
| 
						 | 
					@ -2639,11 +2637,6 @@ class Config:
 | 
				
			||||||
        # People having one of these roles will be able to create instances
 | 
					        # People having one of these roles will be able to create instances
 | 
				
			||||||
        # of classes defined in your application.
 | 
					        # of classes defined in your application.
 | 
				
			||||||
        self.defaultCreators = ['Manager', 'Owner']
 | 
					        self.defaultCreators = ['Manager', 'Owner']
 | 
				
			||||||
        # If True, the following flag will produce a minimalist Plone, where
 | 
					 | 
				
			||||||
        # some actions, portlets or other stuff less relevant for building
 | 
					 | 
				
			||||||
        # web applications, are removed or hidden. Using this produces
 | 
					 | 
				
			||||||
        # effects on your whole Plone site!
 | 
					 | 
				
			||||||
        self.minimalistPlone = False
 | 
					 | 
				
			||||||
        # If you want to replace the Plone front page with a page coming from
 | 
					        # If you want to replace the Plone front page with a page coming from
 | 
				
			||||||
        # your application, use the following parameter. Setting
 | 
					        # your application, use the following parameter. Setting
 | 
				
			||||||
        # frontPage = True will replace the Plone front page with a page
 | 
					        # frontPage = True will replace the Plone front page with a page
 | 
				
			||||||
| 
						 | 
					@ -2651,9 +2644,6 @@ class Config:
 | 
				
			||||||
        self.frontPage = False
 | 
					        self.frontPage = False
 | 
				
			||||||
        # You can choose the Plone or Appy main template
 | 
					        # You can choose the Plone or Appy main template
 | 
				
			||||||
        self.frontPageTemplate = 'plone' # or "appy"
 | 
					        self.frontPageTemplate = 'plone' # or "appy"
 | 
				
			||||||
        # If you don't need the portlet that appy.gen has generated for your
 | 
					 | 
				
			||||||
        # application, set the following parameter to False.
 | 
					 | 
				
			||||||
        self.showPortlet = True
 | 
					 | 
				
			||||||
        # Number of translations for every page on a Translation object
 | 
					        # Number of translations for every page on a Translation object
 | 
				
			||||||
        self.translationsPerPage = 30
 | 
					        self.translationsPerPage = 30
 | 
				
			||||||
        # Language that will be used as a basis for translating to other
 | 
					        # Language that will be used as a basis for translating to other
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,9 +14,6 @@
 | 
				
			||||||
#  w - The widgets of the current page/class
 | 
					#  w - The widgets of the current page/class
 | 
				
			||||||
#  n - The navigation panel (inter-objects navigation)
 | 
					#  n - The navigation panel (inter-objects navigation)
 | 
				
			||||||
#  b - The range of buttons (intra-object navigation, save, edit, delete...)
 | 
					#  b - The range of buttons (intra-object navigation, save, edit, delete...)
 | 
				
			||||||
#  m - The global status message sometimes shown. If you specify this in a
 | 
					 | 
				
			||||||
#      layout, ensure that you have hidden the global_statusmessage zone as
 | 
					 | 
				
			||||||
#      proposed by Plone. Else, the message will appear twice.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Layout elements for a field --------------------------------------------------
 | 
					# Layout elements for a field --------------------------------------------------
 | 
				
			||||||
#  l -  "label"        The field label
 | 
					#  l -  "label"        The field label
 | 
				
			||||||
| 
						 | 
					@ -48,7 +45,6 @@ macroDict = {
 | 
				
			||||||
  # Page-related elements
 | 
					  # Page-related elements
 | 
				
			||||||
  's': ('page', 'header'), 'w': ('page', 'widgets'),
 | 
					  's': ('page', 'header'), 'w': ('page', 'widgets'),
 | 
				
			||||||
  'n': ('navigate', 'objectNavigate'), 'b': ('page', 'buttons'),
 | 
					  'n': ('navigate', 'objectNavigate'), 'b': ('page', 'buttons'),
 | 
				
			||||||
  'm': ('page', 'message'),
 | 
					 | 
				
			||||||
  # Field-related elements
 | 
					  # Field-related elements
 | 
				
			||||||
  'l': ('show', 'label'), 'd': ('show', 'description'),
 | 
					  'l': ('show', 'label'), 'd': ('show', 'description'),
 | 
				
			||||||
  'h': ('show', 'help'),  'v': ('show', 'validation'),
 | 
					  'h': ('show', 'help'),  'v': ('show', 'validation'),
 | 
				
			||||||
| 
						 | 
					@ -220,6 +216,6 @@ class Table(LayoutElement):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# ------------------------------------------------------------------------------
 | 
					# ------------------------------------------------------------------------------
 | 
				
			||||||
defaultPageLayouts  = {
 | 
					defaultPageLayouts  = {
 | 
				
			||||||
    'view': Table('m;-s|-n!-w|-b|'), 'edit': Table('m;-w|-b|')}
 | 
					    'view': Table('s|-n!-w|-b|'), 'edit': Table('w|-b|')}
 | 
				
			||||||
defaultFieldLayouts = {'edit': 'lrv;f!'}
 | 
					defaultFieldLayouts = {'edit': 'lrv;f!'}
 | 
				
			||||||
# ------------------------------------------------------------------------------
 | 
					# ------------------------------------------------------------------------------
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,7 +45,6 @@ class Generator(AbstractGenerator):
 | 
				
			||||||
        # i18n labels to generate
 | 
					        # i18n labels to generate
 | 
				
			||||||
        self.labels = [] # i18n labels
 | 
					        self.labels = [] # i18n labels
 | 
				
			||||||
        self.toolInstanceName = 'portal_%s' % self.applicationName.lower()
 | 
					        self.toolInstanceName = 'portal_%s' % self.applicationName.lower()
 | 
				
			||||||
        self.portletName = '%s_portlet' % self.applicationName.lower()
 | 
					 | 
				
			||||||
        self.skinsFolder = 'skins/%s' % self.applicationName
 | 
					        self.skinsFolder = 'skins/%s' % self.applicationName
 | 
				
			||||||
        # The following dict, pre-filled in the abstract generator, contains a
 | 
					        # The following dict, pre-filled in the abstract generator, contains a
 | 
				
			||||||
        # series of replacements that need to be applied to file templates to
 | 
					        # series of replacements that need to be applied to file templates to
 | 
				
			||||||
| 
						 | 
					@ -168,15 +167,9 @@ class Generator(AbstractGenerator):
 | 
				
			||||||
                      destFolder='profiles/default')
 | 
					                      destFolder='profiles/default')
 | 
				
			||||||
        self.copyFile('ProfileInit.py', self.repls, destFolder='profiles',
 | 
					        self.copyFile('ProfileInit.py', self.repls, destFolder='profiles',
 | 
				
			||||||
                      destName='__init__.py')
 | 
					                      destName='__init__.py')
 | 
				
			||||||
        self.copyFile('Portlet.pt', self.repls,
 | 
					 | 
				
			||||||
            destName='%s.pt' % self.portletName, destFolder=self.skinsFolder)
 | 
					 | 
				
			||||||
        self.copyFile('tool.gif', {})
 | 
					        self.copyFile('tool.gif', {})
 | 
				
			||||||
        self.copyFile('Styles.css.dtml',self.repls, destFolder=self.skinsFolder,
 | 
					        self.copyFile('Styles.css.dtml',self.repls, destFolder=self.skinsFolder,
 | 
				
			||||||
                      destName = '%s.css.dtml' % self.applicationName)
 | 
					                      destName = '%s.css.dtml' % self.applicationName)
 | 
				
			||||||
        self.copyFile('IEFixes.css.dtml',self.repls,destFolder=self.skinsFolder)
 | 
					 | 
				
			||||||
        if self.config.minimalistPlone:
 | 
					 | 
				
			||||||
            self.copyFile('colophon.pt', self.repls,destFolder=self.skinsFolder)
 | 
					 | 
				
			||||||
            self.copyFile('footer.pt', self.repls, destFolder=self.skinsFolder)
 | 
					 | 
				
			||||||
        # Create version.txt
 | 
					        # Create version.txt
 | 
				
			||||||
        f = open(os.path.join(self.outputFolder, 'version.txt'), 'w')
 | 
					        f = open(os.path.join(self.outputFolder, 'version.txt'), 'w')
 | 
				
			||||||
        f.write(self.version)
 | 
					        f.write(self.version)
 | 
				
			||||||
| 
						 | 
					@ -393,10 +386,8 @@ class Generator(AbstractGenerator):
 | 
				
			||||||
        grantableRoles = self.getAllUsedRoles(local=False, grantable=True)
 | 
					        grantableRoles = self.getAllUsedRoles(local=False, grantable=True)
 | 
				
			||||||
        repls['grRoles'] = ','.join(['"%s"' % r.name for r in grantableRoles])
 | 
					        repls['grRoles'] = ','.join(['"%s"' % r.name for r in grantableRoles])
 | 
				
			||||||
        # Generate configuration options
 | 
					        # Generate configuration options
 | 
				
			||||||
        repls['showPortlet'] = self.config.showPortlet
 | 
					 | 
				
			||||||
        repls['languages'] = ','.join('"%s"' % l for l in self.config.languages)
 | 
					        repls['languages'] = ','.join('"%s"' % l for l in self.config.languages)
 | 
				
			||||||
        repls['languageSelector'] = self.config.languageSelector
 | 
					        repls['languageSelector'] = self.config.languageSelector
 | 
				
			||||||
        repls['minimalistPlone'] = self.config.minimalistPlone
 | 
					 | 
				
			||||||
        repls['appFrontPage'] = bool(self.config.frontPage)
 | 
					        repls['appFrontPage'] = bool(self.config.frontPage)
 | 
				
			||||||
        repls['sourceLanguage'] = self.config.sourceLanguage
 | 
					        repls['sourceLanguage'] = self.config.sourceLanguage
 | 
				
			||||||
        self.copyFile('config.py', repls)
 | 
					        self.copyFile('config.py', repls)
 | 
				
			||||||
| 
						 | 
					@ -595,9 +586,7 @@ class Generator(AbstractGenerator):
 | 
				
			||||||
                        "(getattr(OrderedBaseFolder,'__implements__',()),)",
 | 
					                        "(getattr(OrderedBaseFolder,'__implements__',()),)",
 | 
				
			||||||
          'register': "registerType(%s, '%s')" % (self.tool.name,
 | 
					          'register': "registerType(%s, '%s')" % (self.tool.name,
 | 
				
			||||||
                                                  self.applicationName),
 | 
					                                                  self.applicationName),
 | 
				
			||||||
          'static': "left_slots = ['here/portlet_prefs/macros/portlet']\n    " \
 | 
					          'static': "def __init__(self, id=None):\n    " \
 | 
				
			||||||
                    "right_slots = []\n    " \
 | 
					 | 
				
			||||||
                    "def __init__(self, id=None):\n    " \
 | 
					 | 
				
			||||||
                    "    OrderedBaseFolder.__init__(self, '%s')\n    " \
 | 
					                    "    OrderedBaseFolder.__init__(self, '%s')\n    " \
 | 
				
			||||||
                    "    self.setTitle('%s')\n" % (self.toolInstanceName,
 | 
					                    "    self.setTitle('%s')\n" % (self.toolInstanceName,
 | 
				
			||||||
                                                   self.applicationName)})
 | 
					                                                   self.applicationName)})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,6 @@ class PloneInstaller:
 | 
				
			||||||
        self.config = cfg = config
 | 
					        self.config = cfg = config
 | 
				
			||||||
        # Unwrap some useful variables from config
 | 
					        # Unwrap some useful variables from config
 | 
				
			||||||
        self.productName = cfg.PROJECTNAME
 | 
					        self.productName = cfg.PROJECTNAME
 | 
				
			||||||
        self.minimalistPlone = cfg.minimalistPlone
 | 
					 | 
				
			||||||
        self.appClasses = cfg.appClasses
 | 
					        self.appClasses = cfg.appClasses
 | 
				
			||||||
        self.appClassNames = cfg.appClassNames
 | 
					        self.appClassNames = cfg.appClassNames
 | 
				
			||||||
        self.allClassNames = cfg.allClassNames
 | 
					        self.allClassNames = cfg.allClassNames
 | 
				
			||||||
| 
						 | 
					@ -35,7 +34,6 @@ class PloneInstaller:
 | 
				
			||||||
        self.applicationRoles = cfg.applicationRoles # Roles defined in the app
 | 
					        self.applicationRoles = cfg.applicationRoles # Roles defined in the app
 | 
				
			||||||
        self.defaultAddRoles = cfg.defaultAddRoles
 | 
					        self.defaultAddRoles = cfg.defaultAddRoles
 | 
				
			||||||
        self.appFrontPage = cfg.appFrontPage
 | 
					        self.appFrontPage = cfg.appFrontPage
 | 
				
			||||||
        self.showPortlet = cfg.showPortlet
 | 
					 | 
				
			||||||
        self.languages = cfg.languages
 | 
					        self.languages = cfg.languages
 | 
				
			||||||
        self.languageSelector = cfg.languageSelector
 | 
					        self.languageSelector = cfg.languageSelector
 | 
				
			||||||
        self.attributes = cfg.attributes
 | 
					        self.attributes = cfg.attributes
 | 
				
			||||||
| 
						 | 
					@ -78,19 +76,6 @@ class PloneInstaller:
 | 
				
			||||||
                logger.info('Created index "%s" of type "%s"...' % \
 | 
					                logger.info('Created index "%s" of type "%s"...' % \
 | 
				
			||||||
                            (indexName, indexType))
 | 
					                            (indexName, indexType))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    actionsToHide = {
 | 
					 | 
				
			||||||
        'portal_actions': ('sitemap', 'accessibility', 'change_state','sendto'),
 | 
					 | 
				
			||||||
        'portal_membership': ('mystuff', 'preferences'),
 | 
					 | 
				
			||||||
        'portal_undo': ('undo',)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    def customizePlone(self):
 | 
					 | 
				
			||||||
        '''Hides some UI elements that appear by default in Plone.'''
 | 
					 | 
				
			||||||
        for portalName, toHide in self.actionsToHide.iteritems():
 | 
					 | 
				
			||||||
            portal = getattr(self.ploneSite, portalName)
 | 
					 | 
				
			||||||
            portalActions = portal.listActions()
 | 
					 | 
				
			||||||
            for action in portalActions:
 | 
					 | 
				
			||||||
                if action.id in toHide: action.visible = False
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    appyFolderType = 'AppyFolder'
 | 
					    appyFolderType = 'AppyFolder'
 | 
				
			||||||
    def registerAppyFolderType(self):
 | 
					    def registerAppyFolderType(self):
 | 
				
			||||||
        '''We need a specific content type for the folder that will hold all
 | 
					        '''We need a specific content type for the folder that will hold all
 | 
				
			||||||
| 
						 | 
					@ -265,30 +250,6 @@ class PloneInstaller:
 | 
				
			||||||
            # If an instance with the same name already exists, this error will
 | 
					            # If an instance with the same name already exists, this error will
 | 
				
			||||||
            # be unelegantly raised by Zope.
 | 
					            # be unelegantly raised by Zope.
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
        except:
 | 
					 | 
				
			||||||
            e = sys.exc_info()
 | 
					 | 
				
			||||||
            if e[0] != 'Bad Request': raise
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        # Hide the tool from the search form
 | 
					 | 
				
			||||||
        portalProperties = self.ploneSite.portal_properties
 | 
					 | 
				
			||||||
        if portalProperties is not None:
 | 
					 | 
				
			||||||
            siteProperties = getattr(portalProperties, 'site_properties', None)
 | 
					 | 
				
			||||||
            if siteProperties is not None and \
 | 
					 | 
				
			||||||
               siteProperties.hasProperty('types_not_searched'):
 | 
					 | 
				
			||||||
                current = list(siteProperties.getProperty('types_not_searched'))
 | 
					 | 
				
			||||||
                if self.toolName not in current:
 | 
					 | 
				
			||||||
                    current.append(self.toolName)
 | 
					 | 
				
			||||||
                    siteProperties.manage_changeProperties(
 | 
					 | 
				
			||||||
                        **{'types_not_searched' : current})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # Hide the tool in the navigation
 | 
					 | 
				
			||||||
        if portalProperties is not None:
 | 
					 | 
				
			||||||
            nvProps = getattr(portalProperties, 'navtree_properties', None)
 | 
					 | 
				
			||||||
            if nvProps is not None and nvProps.hasProperty('idsNotToList'):
 | 
					 | 
				
			||||||
                current = list(nvProps.getProperty('idsNotToList'))
 | 
					 | 
				
			||||||
                if self.toolInstanceName not in current:
 | 
					 | 
				
			||||||
                    current.append(self.toolInstanceName)
 | 
					 | 
				
			||||||
                    nvProps.manage_changeProperties(**{'idsNotToList': current})
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.tool = getattr(self.ploneSite, self.toolInstanceName)
 | 
					        self.tool = getattr(self.ploneSite, self.toolInstanceName)
 | 
				
			||||||
        self.tool.refreshSecurity()
 | 
					        self.tool.refreshSecurity()
 | 
				
			||||||
| 
						 | 
					@ -297,25 +258,9 @@ class PloneInstaller:
 | 
				
			||||||
            self.tool.createOrUpdate(False, None)
 | 
					            self.tool.createOrUpdate(False, None)
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            self.tool.createOrUpdate(True, None)
 | 
					            self.tool.createOrUpdate(True, None)
 | 
				
			||||||
 | 
					 | 
				
			||||||
        self.updatePodTemplates()
 | 
					        self.updatePodTemplates()
 | 
				
			||||||
 | 
					 | 
				
			||||||
        # Uncatalog tool
 | 
					 | 
				
			||||||
        self.tool.unindexObject()
 | 
					        self.tool.unindexObject()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Register tool as configlet
 | 
					 | 
				
			||||||
        portalControlPanel = self.ploneSite.portal_controlpanel
 | 
					 | 
				
			||||||
        portalControlPanel.unregisterConfiglet(self.toolName)
 | 
					 | 
				
			||||||
        portalControlPanel.registerConfiglet(
 | 
					 | 
				
			||||||
            self.toolName, self.productName,
 | 
					 | 
				
			||||||
            'string:${portal_url}/%s' % self.toolInstanceName, 'python:True',
 | 
					 | 
				
			||||||
            'Manage portal', # Access permission
 | 
					 | 
				
			||||||
            'Products', # Section to which the configlet should be added:
 | 
					 | 
				
			||||||
                        # (Plone, Products (default) or Member)
 | 
					 | 
				
			||||||
            1, # Visibility
 | 
					 | 
				
			||||||
            '%sID' % self.toolName, 'site_icon.gif', # Icon in control_panel
 | 
					 | 
				
			||||||
            self.productName, None)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def installTranslations(self):
 | 
					    def installTranslations(self):
 | 
				
			||||||
        '''Creates or updates the translation objects within the tool.'''
 | 
					        '''Creates or updates the translation objects within the tool.'''
 | 
				
			||||||
        translations = [t.o.id for t in self.appyTool.translations]
 | 
					        translations = [t.o.id for t in self.appyTool.translations]
 | 
				
			||||||
| 
						 | 
					@ -386,32 +331,6 @@ class PloneInstaller:
 | 
				
			||||||
        defaults.update(cssInfo)
 | 
					        defaults.update(cssInfo)
 | 
				
			||||||
        portalCss.registerStylesheet(**defaults)
 | 
					        portalCss.registerStylesheet(**defaults)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def managePortlets(self):
 | 
					 | 
				
			||||||
        '''Shows or hides the application-specific portlet and configures other
 | 
					 | 
				
			||||||
           Plone portlets if relevant.'''
 | 
					 | 
				
			||||||
        portletName= 'here/%s_portlet/macros/portlet' % self.productName.lower()
 | 
					 | 
				
			||||||
        site = self.ploneSite
 | 
					 | 
				
			||||||
        leftPortlets = site.getProperty('left_slots')
 | 
					 | 
				
			||||||
        if not leftPortlets: leftPortlets = []
 | 
					 | 
				
			||||||
        else: leftPortlets = list(leftPortlets)
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        if self.showPortlet and (portletName not in leftPortlets):
 | 
					 | 
				
			||||||
            leftPortlets.insert(0, portletName)
 | 
					 | 
				
			||||||
        if not self.showPortlet and (portletName in leftPortlets):
 | 
					 | 
				
			||||||
            leftPortlets.remove(portletName)
 | 
					 | 
				
			||||||
        # Remove some basic Plone portlets that make less sense when building
 | 
					 | 
				
			||||||
        # web applications.
 | 
					 | 
				
			||||||
        portletsToRemove = ["here/portlet_navigation/macros/portlet",
 | 
					 | 
				
			||||||
                            "here/portlet_recent/macros/portlet",
 | 
					 | 
				
			||||||
                            "here/portlet_related/macros/portlet"]
 | 
					 | 
				
			||||||
        if not self.minimalistPlone: portletsToRemove = []
 | 
					 | 
				
			||||||
        for p in portletsToRemove:
 | 
					 | 
				
			||||||
            if p in leftPortlets:
 | 
					 | 
				
			||||||
                leftPortlets.remove(p)
 | 
					 | 
				
			||||||
        site.manage_changeProperties(left_slots=tuple(leftPortlets))
 | 
					 | 
				
			||||||
        if self.minimalistPlone:
 | 
					 | 
				
			||||||
            site.manage_changeProperties(right_slots=())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def manageIndexes(self):
 | 
					    def manageIndexes(self):
 | 
				
			||||||
        '''For every indexed field, this method installs and updates the
 | 
					        '''For every indexed field, this method installs and updates the
 | 
				
			||||||
           corresponding index if it does not exist yet.'''
 | 
					           corresponding index if it does not exist yet.'''
 | 
				
			||||||
| 
						 | 
					@ -442,21 +361,11 @@ class PloneInstaller:
 | 
				
			||||||
    def finalizeInstallation(self):
 | 
					    def finalizeInstallation(self):
 | 
				
			||||||
        '''Performs some final installation steps.'''
 | 
					        '''Performs some final installation steps.'''
 | 
				
			||||||
        site = self.ploneSite
 | 
					        site = self.ploneSite
 | 
				
			||||||
        # Do not generate an action (tab) for each root folder
 | 
					 | 
				
			||||||
        if self.minimalistPlone:
 | 
					 | 
				
			||||||
            site.portal_properties.site_properties.manage_changeProperties(
 | 
					 | 
				
			||||||
                disable_folder_sections=True)
 | 
					 | 
				
			||||||
        # Do not allow an anonymous user to register himself as new user
 | 
					        # Do not allow an anonymous user to register himself as new user
 | 
				
			||||||
        site.manage_permission('Add portal member', ('Manager',), acquire=0)
 | 
					        site.manage_permission('Add portal member', ('Manager',), acquire=0)
 | 
				
			||||||
        # Call custom installer if any
 | 
					        # Call custom installer if any
 | 
				
			||||||
        if hasattr(self.appyTool, 'install'):
 | 
					        if hasattr(self.appyTool, 'install'):
 | 
				
			||||||
            self.tool.executeAppyAction('install', reindex=False)
 | 
					            self.tool.executeAppyAction('install', reindex=False)
 | 
				
			||||||
        # Patch the "logout" action with a custom Appy one that updates the
 | 
					 | 
				
			||||||
        # list of currently logged users.
 | 
					 | 
				
			||||||
        for action in site.portal_membership._actions:
 | 
					 | 
				
			||||||
            if action.id == 'logout':
 | 
					 | 
				
			||||||
                action.setActionExpression(
 | 
					 | 
				
			||||||
                    'string:${portal_url}/%s/logout' % self.toolInstanceName)
 | 
					 | 
				
			||||||
        # Replace Plone front-page with an application-specific page if needed
 | 
					        # Replace Plone front-page with an application-specific page if needed
 | 
				
			||||||
        if self.appFrontPage:
 | 
					        if self.appFrontPage:
 | 
				
			||||||
            frontPageName = self.productName + 'FrontPage'
 | 
					            frontPageName = self.productName + 'FrontPage'
 | 
				
			||||||
| 
						 | 
					@ -465,14 +374,12 @@ class PloneInstaller:
 | 
				
			||||||
    def info(self, msg): return self.appyTool.log(msg)
 | 
					    def info(self, msg): return self.appyTool.log(msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def install(self):
 | 
					    def install(self):
 | 
				
			||||||
        if self.minimalistPlone: self.customizePlone()
 | 
					 | 
				
			||||||
        self.installRootFolder()
 | 
					        self.installRootFolder()
 | 
				
			||||||
        self.installTypes()
 | 
					        self.installTypes()
 | 
				
			||||||
        self.installTool()
 | 
					        self.installTool()
 | 
				
			||||||
        self.installTranslations()
 | 
					        self.installTranslations()
 | 
				
			||||||
        self.installRolesAndGroups()
 | 
					        self.installRolesAndGroups()
 | 
				
			||||||
        self.installStyleSheet()
 | 
					        self.installStyleSheet()
 | 
				
			||||||
        self.managePortlets()
 | 
					 | 
				
			||||||
        self.manageIndexes()
 | 
					        self.manageIndexes()
 | 
				
			||||||
        self.manageLanguages()
 | 
					        self.manageLanguages()
 | 
				
			||||||
        self.finalizeInstallation()
 | 
					        self.finalizeInstallation()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,6 +27,10 @@ class ToolMixin(BaseMixin):
 | 
				
			||||||
            res = '%s%s' % (elems[1], elems[4])
 | 
					            res = '%s%s' % (elems[1], elems[4])
 | 
				
			||||||
        return res
 | 
					        return res
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def getApp(self):
 | 
				
			||||||
 | 
					        '''Returns the root application object.'''
 | 
				
			||||||
 | 
					        return self.portal_url.getPortalObject()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getSiteUrl(self):
 | 
					    def getSiteUrl(self):
 | 
				
			||||||
        '''Returns the absolute URL of this site.'''
 | 
					        '''Returns the absolute URL of this site.'''
 | 
				
			||||||
        return self.portal_url.getPortalObject().absolute_url()
 | 
					        return self.portal_url.getPortalObject().absolute_url()
 | 
				
			||||||
| 
						 | 
					@ -342,6 +346,11 @@ class ToolMixin(BaseMixin):
 | 
				
			||||||
    def getPublishedObject(self):
 | 
					    def getPublishedObject(self):
 | 
				
			||||||
        '''Gets the currently published object, if its meta_class is among
 | 
					        '''Gets the currently published object, if its meta_class is among
 | 
				
			||||||
           application classes.'''
 | 
					           application classes.'''
 | 
				
			||||||
 | 
					        req = self.REQUEST
 | 
				
			||||||
 | 
					        # If we are querying object, there is no published object (the truth is:
 | 
				
			||||||
 | 
					        # the tool is the currently published object but we don't want to
 | 
				
			||||||
 | 
					        # consider it this way).
 | 
				
			||||||
 | 
					        if not req['ACTUAL_URL'].endswith('/skyn/view'): return
 | 
				
			||||||
        obj = self.REQUEST['PUBLISHED']
 | 
					        obj = self.REQUEST['PUBLISHED']
 | 
				
			||||||
        parent = obj.getParentNode()
 | 
					        parent = obj.getParentNode()
 | 
				
			||||||
        if parent.id == 'skyn': obj = parent.getParentNode()
 | 
					        if parent.id == 'skyn': obj = parent.getParentNode()
 | 
				
			||||||
| 
						 | 
					@ -538,8 +547,8 @@ class ToolMixin(BaseMixin):
 | 
				
			||||||
        if refInfo: criteria['_ref'] = refInfo
 | 
					        if refInfo: criteria['_ref'] = refInfo
 | 
				
			||||||
        rq.SESSION['searchCriteria'] = criteria
 | 
					        rq.SESSION['searchCriteria'] = criteria
 | 
				
			||||||
        # Go to the screen that displays search results
 | 
					        # Go to the screen that displays search results
 | 
				
			||||||
        backUrl = '%s/query?type_name=%s&&search=_advanced' % \
 | 
					        backUrl = '%s/skyn/query?type_name=%s&&search=_advanced' % \
 | 
				
			||||||
                  (os.path.dirname(rq['URL']),rq['type_name'])
 | 
					                  (self.absolute_url(), rq['type_name'])
 | 
				
			||||||
        return self.goto(backUrl)
 | 
					        return self.goto(backUrl)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getJavascriptMessages(self):
 | 
					    def getJavascriptMessages(self):
 | 
				
			||||||
| 
						 | 
					@ -605,7 +614,7 @@ class ToolMixin(BaseMixin):
 | 
				
			||||||
        '''This method creates the URL that allows to perform a (non-Ajax)
 | 
					        '''This method creates the URL that allows to perform a (non-Ajax)
 | 
				
			||||||
           request for getting queried objects from a search named p_searchName
 | 
					           request for getting queried objects from a search named p_searchName
 | 
				
			||||||
           on p_contentType.'''
 | 
					           on p_contentType.'''
 | 
				
			||||||
        baseUrl = self.getAppFolder().absolute_url() + '/skyn'
 | 
					        baseUrl = self.absolute_url() + '/skyn'
 | 
				
			||||||
        baseParams = 'type_name=%s' % contentType
 | 
					        baseParams = 'type_name=%s' % contentType
 | 
				
			||||||
        rq = self.REQUEST
 | 
					        rq = self.REQUEST
 | 
				
			||||||
        if rq.get('ref'): baseParams += '&ref=%s' % rq.get('ref')
 | 
					        if rq.get('ref'): baseParams += '&ref=%s' % rq.get('ref')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,23 +4,26 @@
 | 
				
			||||||
  It can also have a parameter "action", that refers to a method that will be triggered on
 | 
					  It can also have a parameter "action", that refers to a method that will be triggered on
 | 
				
			||||||
  contextObj before returning the result of the macro to the browser.
 | 
					  contextObj before returning the result of the macro to the browser.
 | 
				
			||||||
</tal:comment>
 | 
					</tal:comment>
 | 
				
			||||||
<tal:ajax define="page       request/page;
 | 
					<tal:ajax define="contextObj context/getParentNode;
 | 
				
			||||||
                  macro      request/macro;
 | 
					                  tool contextObj/getTool;
 | 
				
			||||||
                  contextObj context/getParentNode;
 | 
					                  req python: request;
 | 
				
			||||||
                  action     request/action|nothing;
 | 
					                  resp req/RESPONSE;
 | 
				
			||||||
                  response   request/RESPONSE;
 | 
					                  page req/page;
 | 
				
			||||||
                  member     context/portal_membership/getAuthenticatedMember;
 | 
					                  macro req/macro;
 | 
				
			||||||
                  portal     context/portal_url/getPortalObject;
 | 
					                  action req/action|nothing;
 | 
				
			||||||
                  portal_url python: context.portal_url();
 | 
					                  user contextObj/portal_membership/getAuthenticatedMember;
 | 
				
			||||||
                  template   python: contextObj.getPageTemplate(portal.skyn, page);
 | 
					                  app tool/getApp;
 | 
				
			||||||
                  dummy      python: response.setHeader('Content-Type','text/html;;charset=utf-8');
 | 
					                  appUrl app/absolute_url;
 | 
				
			||||||
                  dummy2     python: response.setHeader('Expires', 'Mon, 11 Dec 1975 12:05:05 GMT');
 | 
					                  template python: contextObj.getPageTemplate(app.skyn, page);
 | 
				
			||||||
                  dummy3     python: response.setHeader('CacheControl', 'no-cache')">
 | 
					                  x python: resp.setHeader('Content-Type','text/html;;charset=utf-8');
 | 
				
			||||||
 | 
					                  x python: resp.setHeader('Expires', 'Mon, 11 Dec 1975 12:05:05 GMT');
 | 
				
			||||||
 | 
					                  x python: resp.setHeader('Content-Language', req.get('language', 'en'));
 | 
				
			||||||
 | 
					                  x python: resp.setHeader('CacheControl', 'no-cache')">
 | 
				
			||||||
  <tal:comment replace="nothing">Keys "Expires" and "CacheControl" are used for preventing IE to cache
 | 
					  <tal:comment replace="nothing">Keys "Expires" and "CacheControl" are used for preventing IE to cache
 | 
				
			||||||
    this page. Indeed, this page is retrieved through an asynchronous XMLHttpRequest by the browser, and
 | 
					    this page. Indeed, this page is retrieved through an asynchronous XMLHttpRequest by the browser, and
 | 
				
			||||||
    IE caches this by default.</tal:comment>
 | 
					    IE caches this by default.</tal:comment>
 | 
				
			||||||
  <tal:executeAction condition="action">
 | 
					  <tal:executeAction condition="action">
 | 
				
			||||||
    <tal:do define="dummy python: contextObj.getMethod('on'+action)()" omit-tag=""/>
 | 
					    <tal:do define="x python: contextObj.getMethod('on'+action)()" omit-tag=""/>
 | 
				
			||||||
  </tal:executeAction>
 | 
					  </tal:executeAction>
 | 
				
			||||||
  <metal:callMacro use-macro="python: template.macros.get(macro)"/>
 | 
					  <metal:callMacro use-macro="python: template.macros.get(macro)"/>
 | 
				
			||||||
</tal:ajax>
 | 
					</tal:ajax>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,37 +1,64 @@
 | 
				
			||||||
body {
 | 
					body { font: 70% Lucida,Helvetica,Arial,sans-serif; background-color: #EAEAEA; }
 | 
				
			||||||
  font: 75% Lucida,Helvetica,Arial,sans-serif;
 | 
					h1 { font-size: 11pt; margin:0;}
 | 
				
			||||||
  background-color: #EAEAEA;
 | 
					h2 { font-size: 10pt; margin:0; font-style: italic; font-weight: normal;}
 | 
				
			||||||
}
 | 
					h3 { font-size: 9pt; margin:0; font-weight: bold;}
 | 
				
			||||||
 | 
					a { text-decoration: none; color: #503737;}
 | 
				
			||||||
a {text-decoration: none; color: #747171;}
 | 
					a:visited { color: #503737;}
 | 
				
			||||||
a:visited {color: #840107;}
 | 
					 | 
				
			||||||
table { font-size: 100%; border-spacing: 0px; border-collapse:collapse;}
 | 
					table { font-size: 100%; border-spacing: 0px; border-collapse:collapse;}
 | 
				
			||||||
input {border: 1px solid #a79e9e;}
 | 
					form { margin: 0; padding: 0;}
 | 
				
			||||||
form {margin: 0; padding: 0;}
 | 
					p { margin: 0;}
 | 
				
			||||||
p {margin: 0;}
 | 
					acronym {cursor: help;}
 | 
				
			||||||
 | 
					input { border: 1px solid #a79e9e;
 | 
				
			||||||
h1 {font-size: 11pt; margin:0;}
 | 
					        font-family: Lucida,Helvetica,Arial,sans-serif; }
 | 
				
			||||||
h2 {font-size: 10pt; margin:0; font-style: italic; font-weight: normal;}
 | 
					input[type=image] { border-width: 0px; background: none; }
 | 
				
			||||||
h3 {font-size: 9pt; margin:0; font-weight: bold;}
 | 
					textarea { width: 99%; font: 100% Lucida,Helvetica,Arial,sans-serif;
 | 
				
			||||||
 | 
					           border: 1px solid #a79e9e;}
 | 
				
			||||||
.main {
 | 
					label { font-weight: 600; font-style: italic; line-height: 1.4em;}
 | 
				
			||||||
  width: 900px;
 | 
					 | 
				
			||||||
  background-color: white;
 | 
					 | 
				
			||||||
  border-style: solid;
 | 
					 | 
				
			||||||
  border-width: 1px;
 | 
					 | 
				
			||||||
  border-color: grey;
 | 
					 | 
				
			||||||
  box-shadow: 3px 3px 3px #A9A9A9;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.main { width: 900px; background-color: white; box-shadow: 3px 3px 3px #A9A9A9;
 | 
				
			||||||
 | 
					        border-style: solid; border-width: 1px; border-color: grey; }
 | 
				
			||||||
.top { height: 75px; margin-left: 3em; vertical-align: top;}
 | 
					.top { height: 75px; margin-left: 3em; vertical-align: top;}
 | 
				
			||||||
.lang { margin-right: 3px; }
 | 
					.lang { margin-right: 3px; }
 | 
				
			||||||
.userStrip {
 | 
					.userStrip { background-color: #a2a2a2; height: 30px;
 | 
				
			||||||
  background-color: #a2a2a2;
 | 
					             border-top: 3px solid #525252; border-bottom: 2px solid #9b0000; }
 | 
				
			||||||
  border-top: 3px solid #525252;
 | 
					 | 
				
			||||||
  border-bottom: 2px solid #9b0000;
 | 
					 | 
				
			||||||
  height: 30px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.login { margin-top: 2px; margin-bottom: 2px; color: white;}
 | 
					.login { margin-top: 2px; margin-bottom: 2px; color: white;}
 | 
				
			||||||
.buttons { margin-left: 4px; }
 | 
					.buttons { margin-left: 4px; }
 | 
				
			||||||
.content {margin: 7px 0 9px 4px;}
 | 
					.message { color: #9b0000; font-style: italic;
 | 
				
			||||||
.message {color: #9b0000; font-style: italic; position: absolute; top: -50px; right: 5px}
 | 
					           position: absolute; top: -15px; right: 5px}
 | 
				
			||||||
 | 
					.discreet { font-size: 90%; }
 | 
				
			||||||
 | 
					.portlet { width: 150px; padding: 3px 7px 0px 7px;
 | 
				
			||||||
 | 
					           border-right: 1px solid #9b0000;}
 | 
				
			||||||
 | 
					.portletCurrent { font-weight: bold; }
 | 
				
			||||||
 | 
					.portletSep { border-top: 1px solid grey; margin-top: 5px; padding-top: 5px}
 | 
				
			||||||
 | 
					.portletPage { font-style: italic; }
 | 
				
			||||||
 | 
					.phase { border-style: dashed; border-width: thin; padding: 0 0.6em 0 1em; }
 | 
				
			||||||
 | 
					.content { padding: 3px 3px 7px 15px;}
 | 
				
			||||||
 | 
					.grey { display: none; position: absolute; left: 0px; top: 0px;
 | 
				
			||||||
 | 
					        width:100%; height:100%; background:grey; opacity:0.5;
 | 
				
			||||||
 | 
					        -moz-opacity:0.5; -khtml-opacity:0.5; filter:alpha(Opacity=50);}
 | 
				
			||||||
 | 
					.popup { display: none; position: absolute; top: 30%; left: 35%;
 | 
				
			||||||
 | 
					         width: 350px; z-index : 100; background: white; padding: 8px;
 | 
				
			||||||
 | 
					         border: 1px solid grey; }
 | 
				
			||||||
 | 
					.list { border: 1px solid grey; margin-bottom: 3px;}
 | 
				
			||||||
 | 
					.list td, .list th { border: 1px solid grey;
 | 
				
			||||||
 | 
					                     padding-left: 3px; padding-right: 3px;}
 | 
				
			||||||
 | 
					.list th { background-color: #cbcbcb; font-style: italic; font-weight: normal;}
 | 
				
			||||||
 | 
					.noStyle { border: 0 !important; padding: 0 !important; margin: 0 !important; }
 | 
				
			||||||
 | 
					.noStyle td { border:0 !important; padding:0 !important; margin:0 !important; }
 | 
				
			||||||
 | 
					.translationLabel { background-color: #EAEAEA; border-bottom: 1px dashed grey;
 | 
				
			||||||
 | 
					                    margin-top: 0.5em; margin-bottom: 0.5em; }
 | 
				
			||||||
 | 
					.section1 { font-size: 120%; margin: 0.45em 0em 0.1em 0;
 | 
				
			||||||
 | 
					            padding: 0.3em 0em 0.2em 0.1em; background-color: #eef3f5;
 | 
				
			||||||
 | 
					            border-top: 1px solid #8CACBB;border-bottom: 1px solid #8CACBB; }
 | 
				
			||||||
 | 
					.section2 { font-size: 110%; font-style: italic; margin: 0.45em 0em 0.1em 0;
 | 
				
			||||||
 | 
					            border-bottom: 2px solid grey; }
 | 
				
			||||||
 | 
					.section3 { font-size: 100%; font-style: italic; margin: 0.45em 0em 0.1em 0;
 | 
				
			||||||
 | 
					            background-color: #efeae8; text-align: center; color: grey; }
 | 
				
			||||||
 | 
					.odd { background-color: white; }
 | 
				
			||||||
 | 
					.even { background-color: #ededed; }
 | 
				
			||||||
 | 
					.summary {margin-bottom: 5px;}
 | 
				
			||||||
 | 
					.objectTitle { font-size: 11pt; border-bottom: 3px solid grey;
 | 
				
			||||||
 | 
					               font-weight: bold;}
 | 
				
			||||||
 | 
					.by { background-color: #ededed; font-style: italic; padding-top: 3px;}
 | 
				
			||||||
 | 
					.workflow { background-color: #ededed; text-align: center;}
 | 
				
			||||||
 | 
					.objectNavigate { margin-top: 3px;}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// Functions related to user authentication
 | 
				
			||||||
function cookiesAreEnabled() {
 | 
					function cookiesAreEnabled() {
 | 
				
			||||||
  // Test whether cookies are enabled by attempting to set a cookie and then
 | 
					  // Test whether cookies are enabled by attempting to set a cookie and then
 | 
				
			||||||
  // change its value
 | 
					  // change its value
 | 
				
			||||||
| 
						 | 
					@ -30,3 +31,376 @@ function setLoginVars() {
 | 
				
			||||||
  if (password.value.length==0) emptyPassword.value = '1';
 | 
					  if (password.value.length==0) emptyPassword.value = '1';
 | 
				
			||||||
  else emptyPassword.value = '0';
 | 
					  else emptyPassword.value = '0';
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AJAX machinery
 | 
				
			||||||
 | 
					var isIe = (navigator.appName == "Microsoft Internet Explorer");
 | 
				
			||||||
 | 
					// AJAX machinery
 | 
				
			||||||
 | 
					var xhrObjects = new Array(); // An array of XMLHttpRequest objects
 | 
				
			||||||
 | 
					function XhrObject() { // Wraps a XmlHttpRequest object
 | 
				
			||||||
 | 
					  this.freed = 1; // Is this xhr object already dealing with a request or not?
 | 
				
			||||||
 | 
					  this.xhr = false;
 | 
				
			||||||
 | 
					  if (window.XMLHttpRequest) this.xhr = new XMLHttpRequest();
 | 
				
			||||||
 | 
					  else this.xhr = new ActiveXObject("Microsoft.XMLHTTP");
 | 
				
			||||||
 | 
					  this.hook = '';  /* The ID of the HTML element in the page that will be
 | 
				
			||||||
 | 
					                      replaced by result of executing the Ajax request. */
 | 
				
			||||||
 | 
					  this.onGet = ''; /* The name of a Javascript function to call once we
 | 
				
			||||||
 | 
					                      receive the result. */
 | 
				
			||||||
 | 
					  this.info = {};  /* An associative array for putting anything else. */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function getAjaxChunk(pos) {
 | 
				
			||||||
 | 
					  // This function is the callback called by the AJAX machinery (see function
 | 
				
			||||||
 | 
					  // askAjaxChunk below) when an Ajax response is available.
 | 
				
			||||||
 | 
					  // First, find back the correct XMLHttpRequest object
 | 
				
			||||||
 | 
					  if ( (typeof(xhrObjects[pos]) != 'undefined') &&
 | 
				
			||||||
 | 
					       (xhrObjects[pos].freed == 0)) {
 | 
				
			||||||
 | 
					    var hook = xhrObjects[pos].hook;
 | 
				
			||||||
 | 
					    if (xhrObjects[pos].xhr.readyState == 1) {
 | 
				
			||||||
 | 
					      // The request has been initialized: display the waiting radar
 | 
				
			||||||
 | 
					      var hookElem = document.getElementById(hook);
 | 
				
			||||||
 | 
					      if (hookElem) hookElem.innerHTML = "<div align=\"center\"><img src=\"skyn/waiting.gif\"/><\/div>";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (xhrObjects[pos].xhr.readyState == 4) {
 | 
				
			||||||
 | 
					      // We have received the HTML chunk
 | 
				
			||||||
 | 
					      var hookElem = document.getElementById(hook);
 | 
				
			||||||
 | 
					      if (hookElem && (xhrObjects[pos].xhr.status == 200)) {
 | 
				
			||||||
 | 
					        hookElem.innerHTML = xhrObjects[pos].xhr.responseText;
 | 
				
			||||||
 | 
					        // Call a custom Javascript function if required
 | 
				
			||||||
 | 
					        if (xhrObjects[pos].onGet) {
 | 
				
			||||||
 | 
					          xhrObjects[pos].onGet(xhrObjects[pos], hookElem);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // Eval inner scripts if any.
 | 
				
			||||||
 | 
					        var innerScripts = document.getElementsByName("appyHook");
 | 
				
			||||||
 | 
					        for (var i=0; i<innerScripts.length; i++) {
 | 
				
			||||||
 | 
					          eval(innerScripts[i].innerHTML);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        xhrObjects[pos].freed = 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function askAjaxChunk(hook,mode,url,page,macro,params,beforeSend,onGet) {
 | 
				
			||||||
 | 
					  /* This function will ask to get a chunk of HTML on the server through a
 | 
				
			||||||
 | 
					     XMLHttpRequest. p_mode can be 'GET' or 'POST'. p_url is the URL of a
 | 
				
			||||||
 | 
					     given server object. On this URL we will call the page "ajax.pt" that
 | 
				
			||||||
 | 
					     will call a specific p_macro in a given p_page with some additional
 | 
				
			||||||
 | 
					     p_params (must be an associative array) if required.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     p_hook is the ID of the HTML element that will be filled with the HTML
 | 
				
			||||||
 | 
					     result from the server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     p_beforeSend is a Javascript function to call before sending the request.
 | 
				
			||||||
 | 
					     This function will get 2 args: the XMLHttpRequest object and the
 | 
				
			||||||
 | 
					     p_params. This method can return, in a string, additional parameters to
 | 
				
			||||||
 | 
					     send, ie: "¶m1=blabla¶m2=blabla".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     p_onGet is a Javascript function to call when we will receive the answer.
 | 
				
			||||||
 | 
					     This function will get 2 args, too: the XMLHttpRequest object and the
 | 
				
			||||||
 | 
					     HTML node element into which the result has been inserted.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					  // First, get a non-busy XMLHttpRequest object.
 | 
				
			||||||
 | 
					  var pos = -1;
 | 
				
			||||||
 | 
					  for (var i=0; i < xhrObjects.length; i++) {
 | 
				
			||||||
 | 
					    if (xhrObjects[i].freed == 1) { pos = i; break; }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (pos == -1) {
 | 
				
			||||||
 | 
					    pos = xhrObjects.length;
 | 
				
			||||||
 | 
					    xhrObjects[pos] = new XhrObject();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  xhrObjects[pos].hook = hook;
 | 
				
			||||||
 | 
					  xhrObjects[pos].onGet = onGet;
 | 
				
			||||||
 | 
					  if (xhrObjects[pos].xhr) {
 | 
				
			||||||
 | 
					    var rq = xhrObjects[pos];
 | 
				
			||||||
 | 
					    rq.freed = 0;
 | 
				
			||||||
 | 
					    // Construct parameters
 | 
				
			||||||
 | 
					    var paramsFull = 'page=' + page + '¯o=' + macro;
 | 
				
			||||||
 | 
					    if (params) {
 | 
				
			||||||
 | 
					      for (var paramName in params)
 | 
				
			||||||
 | 
					        paramsFull = paramsFull + '&' + paramName + '=' + params[paramName];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // Call beforeSend if required
 | 
				
			||||||
 | 
					    if (beforeSend) {
 | 
				
			||||||
 | 
					       var res = beforeSend(rq, params);
 | 
				
			||||||
 | 
					       if (res) paramsFull = paramsFull + res;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // Construct the URL to call
 | 
				
			||||||
 | 
					    var urlFull = url + '/skyn/ajax';
 | 
				
			||||||
 | 
					    if (mode == 'GET') {
 | 
				
			||||||
 | 
					      urlFull = urlFull + '?' + paramsFull;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // Perform the asynchronous HTTP GET or POST
 | 
				
			||||||
 | 
					    rq.xhr.open(mode, urlFull, true);
 | 
				
			||||||
 | 
					    if (mode == 'POST') {
 | 
				
			||||||
 | 
					      // Set the correct HTTP headers
 | 
				
			||||||
 | 
					      rq.xhr.setRequestHeader(
 | 
				
			||||||
 | 
					        "Content-Type", "application/x-www-form-urlencoded");
 | 
				
			||||||
 | 
					      rq.xhr.setRequestHeader("Content-length", paramsFull.length);
 | 
				
			||||||
 | 
					      rq.xhr.setRequestHeader("Connection", "close");
 | 
				
			||||||
 | 
					      rq.xhr.onreadystatechange = function(){ getAjaxChunk(pos); }
 | 
				
			||||||
 | 
					      rq.xhr.send(paramsFull);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (mode == 'GET') {
 | 
				
			||||||
 | 
					      rq.xhr.onreadystatechange = function() { getAjaxChunk(pos); }
 | 
				
			||||||
 | 
					      if (window.XMLHttpRequest) { rq.xhr.send(null); }
 | 
				
			||||||
 | 
					      else if (window.ActiveXObject) { rq.xhr.send(); }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The functions below wrap askAjaxChunk for getting specific content through
 | 
				
			||||||
 | 
					   an Ajax request. */
 | 
				
			||||||
 | 
					function askQueryResult(hookId, objectUrl, contentType, searchName,
 | 
				
			||||||
 | 
					                        startNumber, sortKey, sortOrder, filterKey) {
 | 
				
			||||||
 | 
					  // Sends an Ajax request for getting the result of a query.
 | 
				
			||||||
 | 
					  var params = {'type_name': contentType, 'search': searchName,
 | 
				
			||||||
 | 
					                'startNumber': startNumber};
 | 
				
			||||||
 | 
					  if (sortKey) params['sortKey'] = sortKey;
 | 
				
			||||||
 | 
					  if (sortOrder) params['sortOrder'] = sortOrder;
 | 
				
			||||||
 | 
					  if (filterKey) {
 | 
				
			||||||
 | 
					    var filterWidget = document.getElementById(hookId + '_' + filterKey);
 | 
				
			||||||
 | 
					    if (filterWidget && filterWidget.value) {
 | 
				
			||||||
 | 
					      params['filterKey'] = filterKey;
 | 
				
			||||||
 | 
					      params['filterValue'] = filterWidget.value;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  askAjaxChunk(hookId,'GET',objectUrl, 'result', 'queryResult', params);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function askObjectHistory(hookId, objectUrl, maxPerPage, startNumber) {
 | 
				
			||||||
 | 
					  // Sends an Ajax request for getting the history of an object
 | 
				
			||||||
 | 
					  var params = {'maxPerPage': maxPerPage, 'startNumber': startNumber};
 | 
				
			||||||
 | 
					  askAjaxChunk(hookId, 'GET', objectUrl, 'page', 'objectHistory', params);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function askRefField(hookId, objectUrl, fieldName, innerRef, startNumber,
 | 
				
			||||||
 | 
					                     action, actionParams){
 | 
				
			||||||
 | 
					  // Sends an Ajax request for getting the content of a reference field.
 | 
				
			||||||
 | 
					  var startKey = hookId + '_startNumber';
 | 
				
			||||||
 | 
					  var params = {'fieldName': fieldName, 'innerRef': innerRef, };
 | 
				
			||||||
 | 
					  params[startKey] =  startNumber;
 | 
				
			||||||
 | 
					  if (action) params['action'] = action;
 | 
				
			||||||
 | 
					  if (actionParams) {
 | 
				
			||||||
 | 
					    for (key in actionParams) { params[key] = actionParams[key]; };
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  askAjaxChunk(hookId, 'GET', objectUrl, 'widgets/ref', 'viewContent',params);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function askComputedField(hookId, objectUrl, fieldName) {
 | 
				
			||||||
 | 
					  // Sends an Ajax request for getting the content of a computed field
 | 
				
			||||||
 | 
					  var params = {'fieldName': fieldName};
 | 
				
			||||||
 | 
					  askAjaxChunk(hookId, 'GET', objectUrl, 'widgets/computed', 'viewContent', params);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Function used by checkbox widgets for having radio-button-like behaviour
 | 
				
			||||||
 | 
					function toggleCheckbox(visibleCheckbox, hiddenBoolean) {
 | 
				
			||||||
 | 
					  vis = document.getElementById(visibleCheckbox);
 | 
				
			||||||
 | 
					  hidden = document.getElementById(hiddenBoolean);
 | 
				
			||||||
 | 
					  if (vis.checked) hidden.value = 'True';
 | 
				
			||||||
 | 
					  else hidden.value = 'False';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Functions used for master/slave relationships between widgets
 | 
				
			||||||
 | 
					function getMasterValue(widget) {
 | 
				
			||||||
 | 
					  // Returns an array of selected options in a select widget
 | 
				
			||||||
 | 
					  res = new Array();
 | 
				
			||||||
 | 
					  if (widget.type == 'checkbox') {
 | 
				
			||||||
 | 
					    var mv = widget.checked + '';
 | 
				
			||||||
 | 
					    mv = mv.charAt(0).toUpperCase() + mv.substr(1);
 | 
				
			||||||
 | 
					    res.push(mv);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else { // SELECT widget
 | 
				
			||||||
 | 
					    for (var i=0; i < widget.options.length; i++) {
 | 
				
			||||||
 | 
					      if (widget.options[i].selected) res.push(widget.options[i].value);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function updateSlaves(masterValues, appyTypeId) {
 | 
				
			||||||
 | 
					  // Given the value(s) selected in a master field, this function updates the
 | 
				
			||||||
 | 
					  // state of all corresponding slaves.
 | 
				
			||||||
 | 
					  var slaves = cssQuery('table.slave_' + appyTypeId);
 | 
				
			||||||
 | 
					  for (var i=0; i< slaves.length; i++){
 | 
				
			||||||
 | 
					    slaves[i].style.display = "none";
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  for (var i=0; i < masterValues.length; i++) {
 | 
				
			||||||
 | 
					    var activeSlaves = cssQuery('table.slaveValue_' + appyTypeId + '_' + masterValues[i]);
 | 
				
			||||||
 | 
					    for (var j=0; j < activeSlaves.length; j++){
 | 
				
			||||||
 | 
					      activeSlaves[j].style.display = "";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Function used for triggering a workflow transition
 | 
				
			||||||
 | 
					function triggerTransition(transitionId, msg) {
 | 
				
			||||||
 | 
					  var theForm = document.getElementById('triggerTransitionForm');
 | 
				
			||||||
 | 
					  theForm.workflow_action.value = transitionId;
 | 
				
			||||||
 | 
					  if (!msg) {
 | 
				
			||||||
 | 
					    theForm.submit();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else { // Ask the user to confirm.
 | 
				
			||||||
 | 
					   askConfirm('form', 'triggerTransitionForm', msg);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function onDeleteObject(objectUid) {
 | 
				
			||||||
 | 
					  f = document.getElementById('deleteForm');
 | 
				
			||||||
 | 
					  f.objectUid.value = objectUid;
 | 
				
			||||||
 | 
					  askConfirm('form', 'deleteForm', delete_confirm);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function toggleCookie(cookieId) {
 | 
				
			||||||
 | 
					  // What is the state of this boolean (expanded/collapsed) cookie?
 | 
				
			||||||
 | 
					  var state = readCookie(cookieId);
 | 
				
			||||||
 | 
					  if ((state != 'collapsed') && (state != 'expanded')) {
 | 
				
			||||||
 | 
					    // No cookie yet, create it.
 | 
				
			||||||
 | 
					    createCookie(cookieId, 'collapsed');
 | 
				
			||||||
 | 
					    state = 'collapsed';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  var hook = document.getElementById(cookieId); // The hook is the part of
 | 
				
			||||||
 | 
					  // the HTML document that needs to be shown or hidden.
 | 
				
			||||||
 | 
					  var displayValue = 'none';
 | 
				
			||||||
 | 
					  var newState = 'collapsed';
 | 
				
			||||||
 | 
					  var imgSrc = 'skyn/expand.gif';
 | 
				
			||||||
 | 
					  if (state == 'collapsed') {
 | 
				
			||||||
 | 
					    // Show the HTML zone
 | 
				
			||||||
 | 
					    displayValue = 'block';
 | 
				
			||||||
 | 
					    imgSrc = 'skyn/collapse.gif';
 | 
				
			||||||
 | 
					    newState = 'expanded';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  // Update the corresponding HTML element
 | 
				
			||||||
 | 
					  hook.style.display = displayValue;
 | 
				
			||||||
 | 
					  var img = document.getElementById(cookieId + '_img');
 | 
				
			||||||
 | 
					  img.src = imgSrc;
 | 
				
			||||||
 | 
					  // Inverse the cookie value
 | 
				
			||||||
 | 
					  createCookie(cookieId, newState);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Function that allows to generate a document from a pod template.
 | 
				
			||||||
 | 
					function generatePodDocument(contextUid, fieldName, podFormat, queryData) {
 | 
				
			||||||
 | 
					  var theForm = document.getElementsByName("podTemplateForm")[0];
 | 
				
			||||||
 | 
					  theForm.objectUid.value = contextUid;
 | 
				
			||||||
 | 
					  theForm.fieldName.value = fieldName;
 | 
				
			||||||
 | 
					  theForm.podFormat.value = podFormat;
 | 
				
			||||||
 | 
					  theForm.askAction.value = "False";
 | 
				
			||||||
 | 
					  theForm.queryData.value = queryData;
 | 
				
			||||||
 | 
					  var askActionWidget = document.getElementById(contextUid + '_' + fieldName);
 | 
				
			||||||
 | 
					  if (askActionWidget && askActionWidget.checked) {
 | 
				
			||||||
 | 
					      theForm.askAction.value = "True";
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  theForm.submit();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					// Functions for opening and closing a popup
 | 
				
			||||||
 | 
					function openPopup(popupId, msg) {
 | 
				
			||||||
 | 
					  // Put the message into the popup
 | 
				
			||||||
 | 
					  var confirmElem = document.getElementById('appyConfirmText');
 | 
				
			||||||
 | 
					  confirmElem.innerHTML = msg;
 | 
				
			||||||
 | 
					  // Open the popup
 | 
				
			||||||
 | 
					  var popup = document.getElementById(popupId);
 | 
				
			||||||
 | 
					  // Put it at the right place on the screen
 | 
				
			||||||
 | 
					  var scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0;
 | 
				
			||||||
 | 
					  popup.style.top = (scrollTop + 150) + 'px';
 | 
				
			||||||
 | 
					  popup.style.display = "block";
 | 
				
			||||||
 | 
					  // Show the greyed zone
 | 
				
			||||||
 | 
					  var greyed = document.getElementById('grey');
 | 
				
			||||||
 | 
					  greyed.style.top = scrollTop + 'px';
 | 
				
			||||||
 | 
					  greyed.style.display = "block";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function closePopup(popupId) {
 | 
				
			||||||
 | 
					  // Close the popup
 | 
				
			||||||
 | 
					  var popup = document.getElementById(popupId);
 | 
				
			||||||
 | 
					  popup.style.display = "none";
 | 
				
			||||||
 | 
					  // Hide the greyed zone
 | 
				
			||||||
 | 
					  var greyed = document.getElementById('grey');
 | 
				
			||||||
 | 
					  greyed.style.display = "none";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Function triggered when an action needs to be confirmed by the user
 | 
				
			||||||
 | 
					function askConfirm(actionType, action, msg) {
 | 
				
			||||||
 | 
					  /* Store the actionType (send a form, call an URL or call a script) and the
 | 
				
			||||||
 | 
					     related action, and shows the confirm popup. If the user confirms, we
 | 
				
			||||||
 | 
					     will perform the action. */
 | 
				
			||||||
 | 
					  var confirmForm = document.getElementById('confirmActionForm');
 | 
				
			||||||
 | 
					  confirmForm.actionType.value = actionType;
 | 
				
			||||||
 | 
					  confirmForm.action.value = action;
 | 
				
			||||||
 | 
					  openPopup("confirmActionPopup", msg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Function triggered when an action confirmed by the user must be performed
 | 
				
			||||||
 | 
					function doConfirm() {
 | 
				
			||||||
 | 
					  // The user confirmed: perform the required action.
 | 
				
			||||||
 | 
					  closePopup('confirmActionPopup');
 | 
				
			||||||
 | 
					  var confirmForm = document.getElementById('confirmActionForm');
 | 
				
			||||||
 | 
					  var actionType = confirmForm.actionType.value;
 | 
				
			||||||
 | 
					  var action = confirmForm.action.value;
 | 
				
			||||||
 | 
					  if (actionType == 'form') {
 | 
				
			||||||
 | 
					    // We must submit the form whose id is in "action"
 | 
				
			||||||
 | 
					    document.getElementById(action).submit();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (actionType == 'url') {
 | 
				
			||||||
 | 
					    // We must go to the URL defined in "action"
 | 
				
			||||||
 | 
					    window.location = action;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (actionType == 'script') {
 | 
				
			||||||
 | 
					    // We must execute Javascript code in "action"
 | 
				
			||||||
 | 
					    eval(action);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Function that finally posts the edit form after the user has confirmed that
 | 
				
			||||||
 | 
					// she really wants to post it.
 | 
				
			||||||
 | 
					function postConfirmedEditForm() {
 | 
				
			||||||
 | 
					  var theForm = document.getElementById('appyEditForm');
 | 
				
			||||||
 | 
					  theForm.confirmed.value = "True";
 | 
				
			||||||
 | 
					  theForm.submit();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Function that shows or hides a tab. p_action is 'show' or 'hide'.
 | 
				
			||||||
 | 
					function manageTab(tabId, action) {
 | 
				
			||||||
 | 
					  // Manage the tab content (show it or hide it)
 | 
				
			||||||
 | 
					  var content = document.getElementById('tabcontent_' + tabId);
 | 
				
			||||||
 | 
					  if (action == 'show')   { content.style.display = 'table-row'; }
 | 
				
			||||||
 | 
					  else                    { content.style.display = 'none'; }
 | 
				
			||||||
 | 
					  // Manage the tab itself (show as selected or unselected)
 | 
				
			||||||
 | 
					  var left = document.getElementById('tab_' + tabId + '_left');
 | 
				
			||||||
 | 
					  var tab = document.getElementById('tab_' + tabId);
 | 
				
			||||||
 | 
					  var right = document.getElementById('tab_' + tabId + '_right');
 | 
				
			||||||
 | 
					  if (action == 'show') {
 | 
				
			||||||
 | 
					      left.src  = "skyn/tabLeft.png";
 | 
				
			||||||
 | 
					      tab.style.backgroundImage = "url(skyn/tabBg.png)";
 | 
				
			||||||
 | 
					      right.src = "skyn/tabRight.png";
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (action == 'hide') {
 | 
				
			||||||
 | 
					      left.src  = "skyn/tabLeftu.png";
 | 
				
			||||||
 | 
					      tab.style.backgroundImage = "url(skyn/tabBgu.png)";
 | 
				
			||||||
 | 
					      right.src = "skyn/tabRightu.png";
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Function used for displaying/hiding content of a tab
 | 
				
			||||||
 | 
					function showTab(tabId) {
 | 
				
			||||||
 | 
					  // 1st, show the tab to show
 | 
				
			||||||
 | 
					  manageTab(tabId, 'show');
 | 
				
			||||||
 | 
					  // Compute the number of tabs.
 | 
				
			||||||
 | 
					  var idParts = tabId.split('_');
 | 
				
			||||||
 | 
					  var prefix = idParts[0] + '_';
 | 
				
			||||||
 | 
					  // Store the currently selected tab in a cookie.
 | 
				
			||||||
 | 
					  createCookie('tab_' + idParts[0], tabId);
 | 
				
			||||||
 | 
					  var nbOfTabs = idParts[2]*1;
 | 
				
			||||||
 | 
					  // Then, hide the other tabs.
 | 
				
			||||||
 | 
					  for (var i=0; i<nbOfTabs; i++) {
 | 
				
			||||||
 | 
					     var idTab = prefix + (i+1) + '_' + nbOfTabs;
 | 
				
			||||||
 | 
					     if (idTab != tabId) {
 | 
				
			||||||
 | 
					       manageTab(idTab, 'hide');
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Function that initializes the state of a tab
 | 
				
			||||||
 | 
					function initTab(cookieId, defaultValue) {
 | 
				
			||||||
 | 
					  var toSelect = readCookie(cookieId);
 | 
				
			||||||
 | 
					  if (!toSelect) { showTab(defaultValue) }
 | 
				
			||||||
 | 
					  else { showTab(toSelect); }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										252
									
								
								gen/plone25/skin/calendar.css
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,252 @@
 | 
				
			||||||
 | 
					/* The main calendar widget.  DIV containing a table. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar {
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  display: none;
 | 
				
			||||||
 | 
					  border: 1px solid;
 | 
				
			||||||
 | 
					  border-color: #fff #000 #000 #fff;
 | 
				
			||||||
 | 
					  font-size: 11px;
 | 
				
			||||||
 | 
					  cursor: default;
 | 
				
			||||||
 | 
					  background: Window;
 | 
				
			||||||
 | 
					  color: WindowText;
 | 
				
			||||||
 | 
					  font-family: tahoma,verdana,sans-serif;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar table {
 | 
				
			||||||
 | 
					  border: 1px solid;
 | 
				
			||||||
 | 
					  border-color: #fff #000 #000 #fff;
 | 
				
			||||||
 | 
					  font-size: 11px;
 | 
				
			||||||
 | 
					  cursor: default;
 | 
				
			||||||
 | 
					  background: Window;
 | 
				
			||||||
 | 
					  color: WindowText;
 | 
				
			||||||
 | 
					  font-family: tahoma,verdana,sans-serif;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Header part -- contains navigation buttons and day names. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
 | 
					  padding: 1px;
 | 
				
			||||||
 | 
					  border: 1px solid;
 | 
				
			||||||
 | 
					  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
 | 
				
			||||||
 | 
					  background: ButtonFace;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar .nav {
 | 
				
			||||||
 | 
					  background: ButtonFace url(menuarrow.gif) no-repeat 100% 100%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar thead .title { /* This holds the current "month, year" */
 | 
				
			||||||
 | 
					  font-weight: bold;
 | 
				
			||||||
 | 
					  padding: 1px;
 | 
				
			||||||
 | 
					  border: 1px solid #000;
 | 
				
			||||||
 | 
					  background: ActiveCaption;
 | 
				
			||||||
 | 
					  color: CaptionText;
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar thead .headrow { /* Row <TR> containing navigation buttons */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar thead .daynames { /* Row <TR> containing the day names */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar thead .name { /* Cells <TD> containing the day names */
 | 
				
			||||||
 | 
					  border-bottom: 1px solid ButtonShadow;
 | 
				
			||||||
 | 
					  padding: 2px;
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
 | 
					  background: ButtonFace;
 | 
				
			||||||
 | 
					  color: ButtonText;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar thead .weekend { /* How a weekend day name shows in header */
 | 
				
			||||||
 | 
					  color: #f00;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar thead .hilite { /* How do the buttons in header appear when hover */
 | 
				
			||||||
 | 
					  border: 2px solid;
 | 
				
			||||||
 | 
					  padding: 0px;
 | 
				
			||||||
 | 
					  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar thead .active { /* Active (pressed) buttons in header */
 | 
				
			||||||
 | 
					  border-width: 1px;
 | 
				
			||||||
 | 
					  padding: 2px 0px 0px 2px;
 | 
				
			||||||
 | 
					  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The body part -- contains all the days in month. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tbody .day { /* Cells <TD> containing month days dates */
 | 
				
			||||||
 | 
					  width: 2em;
 | 
				
			||||||
 | 
					  text-align: right;
 | 
				
			||||||
 | 
					  padding: 2px 4px 2px 2px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.calendar tbody .day.othermonth {
 | 
				
			||||||
 | 
					  font-size: 80%;
 | 
				
			||||||
 | 
					  color: #aaa;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.calendar tbody .day.othermonth.oweekend {
 | 
				
			||||||
 | 
					  color: #faa;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar table .wn {
 | 
				
			||||||
 | 
					  padding: 2px 3px 2px 2px;
 | 
				
			||||||
 | 
					  border-right: 1px solid ButtonShadow;
 | 
				
			||||||
 | 
					  background: ButtonFace;
 | 
				
			||||||
 | 
					  color: ButtonText;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tbody .rowhilite td {
 | 
				
			||||||
 | 
					  background: Highlight;
 | 
				
			||||||
 | 
					  color: HighlightText;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tbody td.hilite { /* Hovered cells <TD> */
 | 
				
			||||||
 | 
					  padding: 1px 3px 1px 1px;
 | 
				
			||||||
 | 
					  border-top: 1px solid #fff;
 | 
				
			||||||
 | 
					  border-right: 1px solid #000;
 | 
				
			||||||
 | 
					  border-bottom: 1px solid #000;
 | 
				
			||||||
 | 
					  border-left: 1px solid #fff;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tbody td.active { /* Active (pressed) cells <TD> */
 | 
				
			||||||
 | 
					  padding: 2px 2px 0px 2px;
 | 
				
			||||||
 | 
					  border: 1px solid;
 | 
				
			||||||
 | 
					  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tbody td.selected { /* Cell showing selected date */
 | 
				
			||||||
 | 
					  font-weight: bold;
 | 
				
			||||||
 | 
					  border: 1px solid;
 | 
				
			||||||
 | 
					  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
 | 
				
			||||||
 | 
					  padding: 2px 2px 0px 2px;
 | 
				
			||||||
 | 
					  background: ButtonFace;
 | 
				
			||||||
 | 
					  color: ButtonText;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tbody td.weekend { /* Cells showing weekend days */
 | 
				
			||||||
 | 
					  color: #f00;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tbody td.today { /* Cell showing today date */
 | 
				
			||||||
 | 
					  font-weight: bold;
 | 
				
			||||||
 | 
					  color: #00f;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tbody td.disabled { color: GrayText; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
 | 
				
			||||||
 | 
					  visibility: hidden;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
 | 
				
			||||||
 | 
					  display: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The footer part -- status bar and "Close" button */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
 | 
				
			||||||
 | 
					  background: ButtonFace;
 | 
				
			||||||
 | 
					  padding: 1px;
 | 
				
			||||||
 | 
					  border: 1px solid;
 | 
				
			||||||
 | 
					  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
 | 
				
			||||||
 | 
					  color: ButtonText;
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tfoot .hilite { /* Hover style for buttons in footer */
 | 
				
			||||||
 | 
					  border-top: 1px solid #fff;
 | 
				
			||||||
 | 
					  border-right: 1px solid #000;
 | 
				
			||||||
 | 
					  border-bottom: 1px solid #000;
 | 
				
			||||||
 | 
					  border-left: 1px solid #fff;
 | 
				
			||||||
 | 
					  padding: 1px;
 | 
				
			||||||
 | 
					  background: #e4e0d8;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
 | 
				
			||||||
 | 
					  padding: 2px 0px 0px 2px;
 | 
				
			||||||
 | 
					  border-top: 1px solid #000;
 | 
				
			||||||
 | 
					  border-right: 1px solid #fff;
 | 
				
			||||||
 | 
					  border-bottom: 1px solid #fff;
 | 
				
			||||||
 | 
					  border-left: 1px solid #000;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Combo boxes (menus that display months/years for direct selection) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar .combo {
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  display: none;
 | 
				
			||||||
 | 
					  width: 4em;
 | 
				
			||||||
 | 
					  top: 0px;
 | 
				
			||||||
 | 
					  left: 0px;
 | 
				
			||||||
 | 
					  cursor: default;
 | 
				
			||||||
 | 
					  border: 1px solid;
 | 
				
			||||||
 | 
					  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
 | 
				
			||||||
 | 
					  background: Menu;
 | 
				
			||||||
 | 
					  color: MenuText;
 | 
				
			||||||
 | 
					  font-size: 90%;
 | 
				
			||||||
 | 
					  padding: 1px;
 | 
				
			||||||
 | 
					  z-index: 100;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar .combo .label,
 | 
				
			||||||
 | 
					.calendar .combo .label-IEfix {
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
 | 
					  display: block;
 | 
				
			||||||
 | 
					  padding: 1px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar .combo .label-IEfix {
 | 
				
			||||||
 | 
					  width: 4em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar .combo .active {
 | 
				
			||||||
 | 
					  padding: 0px;
 | 
				
			||||||
 | 
					  border: 1px solid #000;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar .combo .hilite {
 | 
				
			||||||
 | 
					  background: Highlight;
 | 
				
			||||||
 | 
					  color: HighlightText;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar td.time {
 | 
				
			||||||
 | 
					  border-top: 1px solid ButtonShadow;
 | 
				
			||||||
 | 
					  padding: 1px 0px;
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
 | 
					  background-color: ButtonFace;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar td.time .hour,
 | 
				
			||||||
 | 
					.calendar td.time .minute,
 | 
				
			||||||
 | 
					.calendar td.time .ampm {
 | 
				
			||||||
 | 
					  padding: 0px 3px 0px 4px;
 | 
				
			||||||
 | 
					  border: 1px solid #889;
 | 
				
			||||||
 | 
					  font-weight: bold;
 | 
				
			||||||
 | 
					  background-color: Menu;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar td.time .ampm {
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar td.time .colon {
 | 
				
			||||||
 | 
					  padding: 0px 2px 0px 3px;
 | 
				
			||||||
 | 
					  font-weight: bold;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar td.time span.hilite {
 | 
				
			||||||
 | 
					  border-color: #000;
 | 
				
			||||||
 | 
					  background-color: Highlight;
 | 
				
			||||||
 | 
					  color: HighlightText;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.calendar td.time span.active {
 | 
				
			||||||
 | 
					  border-color: #f00;
 | 
				
			||||||
 | 
					  background-color: #000;
 | 
				
			||||||
 | 
					  color: #0f0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								gen/plone25/skin/calendar.gif
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 953 B  | 
							
								
								
									
										140
									
								
								gen/plone25/skin/calendar.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
					@ -4,11 +4,8 @@
 | 
				
			||||||
<tal:call tal:define="macroName  options/macroName;
 | 
					<tal:call tal:define="macroName  options/macroName;
 | 
				
			||||||
                      page       python: options['page'];
 | 
					                      page       python: options['page'];
 | 
				
			||||||
                      contextObj python: options['contextObj'];
 | 
					                      contextObj python: options['contextObj'];
 | 
				
			||||||
                      tool       python: contextObj.getTool();
 | 
					                      tool       contextObj/getTool;
 | 
				
			||||||
                      layoutType python:'view';
 | 
					                      layoutType python:'view';
 | 
				
			||||||
                      putils     python: contextObj.plone_utils;
 | 
					 | 
				
			||||||
                      portal     python: contextObj.portal_url.getPortalObject();
 | 
					 | 
				
			||||||
                      portal_url python: contextObj.portal_url();
 | 
					 | 
				
			||||||
                      phaseInfo  python: contextObj.getAppyPhases(currentOnly=True, layoutType='view');
 | 
					                      phaseInfo  python: contextObj.getAppyPhases(currentOnly=True, layoutType='view');
 | 
				
			||||||
                      phase      phaseInfo/name;">
 | 
					                      phase      phaseInfo/name;">
 | 
				
			||||||
  <metal:callMacro use-macro="python: page.macros[macroName]"/>
 | 
					  <metal:callMacro use-macro="python: page.macros[macroName]"/>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 476 B After Width: | Height: | Size: 475 B  | 
| 
						 | 
					@ -1,65 +1,37 @@
 | 
				
			||||||
<tal:edit metal:define-macro="master"
 | 
					<tal:main define="tool context/getTool">
 | 
				
			||||||
          define="contextObj  python:context.getParentNode();
 | 
					<html metal:use-macro="context/skyn/template/macros/main">
 | 
				
			||||||
                  errors      request/errors | python:{};
 | 
					 <metal:fill fill-slot="content"
 | 
				
			||||||
                  layoutType  python:'edit';
 | 
					    tal:define="contextObj  python:context.getParentNode();
 | 
				
			||||||
                  layout      python: contextObj.getPageLayout(layoutType);
 | 
					                errors      request/errors | python:{};
 | 
				
			||||||
                  tool        contextObj/getTool;
 | 
					                layoutType  python:'edit';
 | 
				
			||||||
                  appFolder   tool/getAppFolder;
 | 
					                layout      python: contextObj.getPageLayout(layoutType);
 | 
				
			||||||
                  appName     appFolder/getId;
 | 
					                phaseInfo   python: contextObj.getAppyPhases(currentOnly=True, layoutType=layoutType);
 | 
				
			||||||
                  phaseInfo   python: contextObj.getAppyPhases(currentOnly=True, layoutType=layoutType);
 | 
					                phase       phaseInfo/name;
 | 
				
			||||||
                  phase       phaseInfo/name;
 | 
					                page        request/page|python:'main';
 | 
				
			||||||
                  page        request/page|python:'main';
 | 
					                cssJs       python: contextObj.getCssAndJs(contextObj.getAppyTypes(layoutType, page), layoutType);
 | 
				
			||||||
                  cssJs       python: contextObj.getCssAndJs(contextObj.getAppyTypes(layoutType, page), layoutType);
 | 
					                confirmMsg  request/confirmMsg | nothing;">
 | 
				
			||||||
                  confirmMsg  request/confirmMsg | nothing;">
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
 | 
					 | 
				
			||||||
      xmlns:tal="http://xml.zope.org/namespaces/tal"
 | 
					 | 
				
			||||||
      xmlns:metal="http://xml.zope.org/namespaces/metal"
 | 
					 | 
				
			||||||
      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
 | 
					 | 
				
			||||||
      metal:use-macro="here/main_template/macros/master">
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  <tal:comment replace="nothing">Disable the Standard Plone green tab</tal:comment>
 | 
					 | 
				
			||||||
  <div metal:fill-slot="top_slot">
 | 
					 | 
				
			||||||
    <metal:block metal:use-macro="here/global_defines/macros/defines" />
 | 
					 | 
				
			||||||
    <div tal:define="dummy python:request.set('disable_border', 1)" />
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:comment replace="nothing">Include type-specific CSS and JS.</tal:comment>
 | 
					  <tal:comment replace="nothing">Include type-specific CSS and JS.</tal:comment>
 | 
				
			||||||
  <metal:js fill-slot="javascript_head_slot">
 | 
					  <link tal:repeat="cssFile cssJs/css" rel="stylesheet" type="text/css"
 | 
				
			||||||
    <tal:js condition="cssJs/js" repeat="jsFile cssJs/js">
 | 
					        tal:attributes="href string:$appUrl/skyn/$cssFile"/>
 | 
				
			||||||
      <script type="text/javascript" charset="iso-8859-1"
 | 
					  <script tal:repeat="jsFile cssJs/js" type="text/javascript"
 | 
				
			||||||
              tal:condition="python:exists('portal/%s' % jsFile)"
 | 
					          tal:attributes="src string:$appUrl/skyn/$jsFile"></script>
 | 
				
			||||||
              tal:attributes="src string:$portal_url/$jsFile">
 | 
					 | 
				
			||||||
      </script>
 | 
					 | 
				
			||||||
    </tal:js>
 | 
					 | 
				
			||||||
  </metal:js>
 | 
					 | 
				
			||||||
  <metal:css fill-slot="css_slot">
 | 
					 | 
				
			||||||
    <tal:css condition="cssJs/css" repeat="cssFile cssJs/css">
 | 
					 | 
				
			||||||
      <style type="text/css" media="all"
 | 
					 | 
				
			||||||
             tal:condition="python:exists('portal/%s' % cssFile)"
 | 
					 | 
				
			||||||
             tal:content="structure string:<!-- @import url($portal_url/$cssFile); -->">
 | 
					 | 
				
			||||||
      </style>
 | 
					 | 
				
			||||||
    </tal:css>
 | 
					 | 
				
			||||||
  </metal:css>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <body>
 | 
					  <metal:prologue use-macro="here/skyn/page/macros/prologue"/>
 | 
				
			||||||
    <metal:fill fill-slot="main">
 | 
					  <form id="appyEditForm" name="appyEditForm" method="post" enctype="multipart/form-data"
 | 
				
			||||||
      <metal:prologue use-macro="here/skyn/page/macros/prologue"/>
 | 
					        tal:attributes="action python: contextObj.absolute_url()+'/skyn/do';
 | 
				
			||||||
      <form id="appyEditForm" name="appyEditForm" method="post" enctype="multipart/form-data"
 | 
					                        class python: test(confirmMsg, 'atBaseEditForm', 'enableUnloadProtection atBaseEditForm')">
 | 
				
			||||||
            tal:attributes="action python: contextObj.absolute_url()+'/skyn/do';
 | 
					    <input type="hidden" name="action" value="Update"/>
 | 
				
			||||||
                            class python: test(confirmMsg, 'atBaseEditForm', 'enableUnloadProtection atBaseEditForm')">
 | 
					    <input type="hidden" name="page" tal:attributes="value page"/>
 | 
				
			||||||
        <input type="hidden" name="action" value="Update"/>
 | 
					    <input type="hidden" name="nav" tal:attributes="value request/nav|nothing"/>
 | 
				
			||||||
        <input type="hidden" name="page" tal:attributes="value page"/>
 | 
					    <input type="hidden" name="is_new" tal:attributes="value contextObj/isTemporary"/>
 | 
				
			||||||
        <input type="hidden" name="nav" tal:attributes="value request/nav|nothing"/>
 | 
					    <input type="hidden" name="confirmed" value="False"/>
 | 
				
			||||||
        <input type="hidden" name="is_new" tal:attributes="value contextObj/isTemporary"/>
 | 
					    <metal:show use-macro="here/skyn/page/macros/show"/>
 | 
				
			||||||
        <input type="hidden" name="confirmed" value="False"/>
 | 
					  </form>
 | 
				
			||||||
        <metal:show use-macro="here/skyn/page/macros/show"/>
 | 
					  <script tal:condition="confirmMsg"
 | 
				
			||||||
      </form>
 | 
					          tal:content="python: 'askConfirm(\'script\', \'postConfirmedEditForm()\', \'%s\')' % confirmMsg">
 | 
				
			||||||
      <script tal:condition="confirmMsg"
 | 
					  </script>
 | 
				
			||||||
              tal:content="python: 'askConfirm(\'script\', \'postConfirmedEditForm()\', \'%s\')' % confirmMsg">
 | 
					  <metal:footer use-macro="here/skyn/page/macros/footer"/>
 | 
				
			||||||
      </script>
 | 
					</metal:fill>
 | 
				
			||||||
      <metal:footer use-macro="here/skyn/page/macros/footer"/>
 | 
					 | 
				
			||||||
    </metal:fill>
 | 
					 | 
				
			||||||
  </body>
 | 
					 | 
				
			||||||
</html>
 | 
					</html>
 | 
				
			||||||
</tal:edit>
 | 
					</tal:main>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,14 +83,14 @@
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
      <th tal:repeat="columnHeader python: importElems[0]">
 | 
					      <th tal:repeat="columnHeader python: importElems[0]">
 | 
				
			||||||
        <img tal:condition="python: repeat['columnHeader'].number() == 1"
 | 
					        <img tal:condition="python: repeat['columnHeader'].number() == 1"
 | 
				
			||||||
             tal:attributes="src string:$portal_url/skyn/eye.png;
 | 
					             tal:attributes="src string:$appUrl/skyn/eye.png;
 | 
				
			||||||
                             title python: tool.translate('import_show_hide')"
 | 
					                             title python: tool.translate('import_show_hide')"
 | 
				
			||||||
             style="cursor:pointer" onClick="toggleViewableElements()" align="left" />
 | 
					             style="cursor:pointer" onClick="toggleViewableElements()" align="left" />
 | 
				
			||||||
        <span tal:replace="columnHeader"/>
 | 
					        <span tal:replace="columnHeader"/>
 | 
				
			||||||
      </th>
 | 
					      </th>
 | 
				
			||||||
      <th tal:content="python: tool.translate('ref_actions')"></th>
 | 
					      <th tal:content="python: tool.translate('ref_actions')"></th>
 | 
				
			||||||
      <th width="20px"><img
 | 
					      <th width="20px"><img
 | 
				
			||||||
        tal:attributes="src string: $portal_url/skyn/select_elems.png;
 | 
					        tal:attributes="src string: $appUrl/skyn/select_elems.png;
 | 
				
			||||||
                        title python: tool.translate('select_delesect')"
 | 
					                        title python: tool.translate('select_delesect')"
 | 
				
			||||||
        onClick="toggleCheckboxes()" style="cursor:pointer"/>
 | 
					        onClick="toggleCheckboxes()" style="cursor:pointer"/>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,46 +2,46 @@
 | 
				
			||||||
  <tal:comment replace="nothing">
 | 
					  <tal:comment replace="nothing">
 | 
				
			||||||
     Buttons for navigating among a list of elements (next, back, first, last, etc).
 | 
					     Buttons for navigating among a list of elements (next, back, first, last, etc).
 | 
				
			||||||
  </tal:comment>
 | 
					  </tal:comment>
 | 
				
			||||||
  <table cellpadding="0" cellspacing="0" class="appyNav"
 | 
					  <table class="listNavigate"
 | 
				
			||||||
         tal:define="mustSortAndFilter  python: ajaxHookId == 'queryResult';
 | 
					         tal:define="mustSortAndFilter  python: ajaxHookId == 'queryResult';
 | 
				
			||||||
                     sortKey            sortKey|python:'';
 | 
					                     sortKey            sortKey|python:'';
 | 
				
			||||||
                     sortOrder          sortOrder|python:'';
 | 
					                     sortOrder          sortOrder|python:'';
 | 
				
			||||||
                     filterKey          filterKey|python:'';
 | 
					                     filterKey          filterKey|python:'';
 | 
				
			||||||
                     sortAndFilter      python: test(mustSortAndFilter, ',\'%s\',\'%s\',\'%s\'' % (sortKey, sortOrder, filterKey), '')">
 | 
					                     sortAndFilter      python: test(mustSortAndFilter, ',\'%s\',\'%s\',\'%s\'' % (sortKey, sortOrder, filterKey), '')">
 | 
				
			||||||
    <tr>
 | 
					    <tr valign="middle">
 | 
				
			||||||
      <tal:comment replace="nothing">Go to the first page</tal:comment>
 | 
					      <tal:comment replace="nothing">Go to the first page</tal:comment>
 | 
				
			||||||
      <td><img style="cursor:pointer" tal:condition="python: (startNumber != 0) and (startNumber != batchSize)"
 | 
					      <td tal:condition="python: (startNumber != 0) and (startNumber != batchSize)"><img style="cursor:pointer"
 | 
				
			||||||
        tal:attributes="src string: $portal_url/skyn/arrowLeftDouble.png;
 | 
					          tal:attributes="src string: $appUrl/skyn/arrowLeftDouble.png;
 | 
				
			||||||
                        title python: tool.translate('goto_first');
 | 
					                        title python: tool.translate('goto_first');
 | 
				
			||||||
                        onClick python: navBaseCall.replace('**v**', '0'+sortAndFilter)"/></td>
 | 
					                        onClick python: navBaseCall.replace('**v**', '0'+sortAndFilter)"/></td>
 | 
				
			||||||
      <tal:comment replace="nothing">Go to the previous page</tal:comment>
 | 
					      <tal:comment replace="nothing">Go to the previous page</tal:comment>
 | 
				
			||||||
      <td><img style="cursor:pointer" tal:condition="python: startNumber != 0"
 | 
					      <td tal:define="sNumber python: startNumber - batchSize"
 | 
				
			||||||
        tal:define="sNumber python: startNumber - batchSize"
 | 
					          tal:condition="python: startNumber != 0"><img style="cursor:pointer"
 | 
				
			||||||
        tal:attributes="src string: $portal_url/skyn/arrowLeftSimple.png;
 | 
					          tal:attributes="src string: $appUrl/skyn/arrowLeftSimple.png;
 | 
				
			||||||
                        title python: tool.translate('goto_previous');
 | 
					                          title python: tool.translate('goto_previous');
 | 
				
			||||||
                        onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
 | 
					                          onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
 | 
				
			||||||
      <tal:comment replace="nothing">Explain which elements are currently shown</tal:comment>
 | 
					      <tal:comment replace="nothing">Explain which elements are currently shown</tal:comment>
 | 
				
			||||||
      <td class="discreet" valign="middle"> 
 | 
					      <td class="discreet"> 
 | 
				
			||||||
        <span tal:replace="python: startNumber+1"/>
 | 
					        <span tal:replace="python: startNumber+1"/>
 | 
				
			||||||
        <img tal:attributes="src string: $portal_url/skyn/to.png"/>
 | 
					        <img tal:attributes="src string: $appUrl/skyn/to.png"/>
 | 
				
			||||||
        <span tal:replace="python: startNumber+len(objs)"/> <b>//</b>
 | 
					        <span tal:replace="python: startNumber+len(objs)"/> <b>//</b>
 | 
				
			||||||
        <span tal:replace="python: totalNumber"/>  
 | 
					        <span tal:replace="python: totalNumber"/>  
 | 
				
			||||||
      </td>
 | 
					      </td>
 | 
				
			||||||
      <tal:comment replace="nothing">Go to the next page</tal:comment>
 | 
					      <tal:comment replace="nothing">Go to the next page</tal:comment>
 | 
				
			||||||
      <td><img style="cursor:pointer" tal:condition="python: sNumber < totalNumber"
 | 
					      <td tal:define="sNumber python: startNumber + batchSize"
 | 
				
			||||||
        tal:define="sNumber python: startNumber + batchSize"
 | 
					          tal:condition="python: sNumber < totalNumber"><img style="cursor:pointer"
 | 
				
			||||||
        tal:attributes="src string: $portal_url/skyn/arrowRightSimple.png;
 | 
					          tal:attributes="src string: $appUrl/skyn/arrowRightSimple.png;
 | 
				
			||||||
                        title python: tool.translate('goto_next');
 | 
					                          title python: tool.translate('goto_next');
 | 
				
			||||||
                        onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
 | 
					                          onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
 | 
				
			||||||
      <tal:comment replace="nothing">Go to the last page</tal:comment>
 | 
					      <tal:comment replace="nothing">Go to the last page</tal:comment>
 | 
				
			||||||
      <td><img style="cursor:pointer" tal:condition="python: (startNumber != sNumber) and (startNumber != sNumber-batchSize)"
 | 
					      <td tal:define="lastPageIsIncomplete python: totalNumber % batchSize;
 | 
				
			||||||
        tal:define="lastPageIsIncomplete python: totalNumber % batchSize;
 | 
					 | 
				
			||||||
                    nbOfCompletePages python: totalNumber/batchSize;
 | 
					                    nbOfCompletePages python: totalNumber/batchSize;
 | 
				
			||||||
                    nbOfCountedPages python: test(lastPageIsIncomplete, nbOfCompletePages, nbOfCompletePages-1);
 | 
					                    nbOfCountedPages python: test(lastPageIsIncomplete, nbOfCompletePages, nbOfCompletePages-1);
 | 
				
			||||||
                    sNumber python: (nbOfCountedPages*batchSize)"
 | 
					                    sNumber python: (nbOfCountedPages*batchSize)"
 | 
				
			||||||
        tal:attributes="src string: $portal_url/skyn/arrowRightDouble.png;
 | 
					          tal:condition="python: (startNumber != sNumber) and (startNumber != sNumber-batchSize)"><img style="cursor:pointer"
 | 
				
			||||||
                        title python: tool.translate('goto_last');
 | 
					          tal:attributes="src string: $appUrl/skyn/arrowRightDouble.png;
 | 
				
			||||||
                        onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
 | 
					                          title python: tool.translate('goto_last');
 | 
				
			||||||
 | 
					                          onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
  </table>
 | 
					  </table>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@
 | 
				
			||||||
     Buttons for going to next/previous elements if this one is among bunch of referenced or searched objects.
 | 
					     Buttons for going to next/previous elements if this one is among bunch of referenced or searched objects.
 | 
				
			||||||
     currentNumber starts with 1.
 | 
					     currentNumber starts with 1.
 | 
				
			||||||
  </tal:comment>
 | 
					  </tal:comment>
 | 
				
			||||||
  <table cellpadding="0" cellspacing="0"
 | 
					  <table class="objectNavigate"
 | 
				
			||||||
         tal:define="navInfo   tool/getNavigationInfo;
 | 
					         tal:define="navInfo   tool/getNavigationInfo;
 | 
				
			||||||
                 currentNumber navInfo/currentNumber;
 | 
					                 currentNumber navInfo/currentNumber;
 | 
				
			||||||
                 totalNumber   navInfo/totalNumber;
 | 
					                 totalNumber   navInfo/totalNumber;
 | 
				
			||||||
| 
						 | 
					@ -61,32 +61,32 @@
 | 
				
			||||||
                 lastUrl       navInfo/lastUrl;
 | 
					                 lastUrl       navInfo/lastUrl;
 | 
				
			||||||
                 sourceUrl     navInfo/sourceUrl;
 | 
					                 sourceUrl     navInfo/sourceUrl;
 | 
				
			||||||
                 backText      navInfo/backText">
 | 
					                 backText      navInfo/backText">
 | 
				
			||||||
    <tr>
 | 
					    <tr valign="middle">
 | 
				
			||||||
      <tal:comment replace="nothing">Go to the source URL (search or referred object)</tal:comment>
 | 
					      <tal:comment replace="nothing">Go to the source URL (search or referred object)</tal:comment>
 | 
				
			||||||
      <td><a tal:condition="sourceUrl" tal:attributes="href sourceUrl"><img style="cursor:pointer" 
 | 
					      <td tal:condition="sourceUrl"><a tal:attributes="href sourceUrl"><img style="cursor:pointer" 
 | 
				
			||||||
        tal:attributes="src string: $portal_url/skyn/gotoSource.png;
 | 
					          tal:attributes="src string: $appUrl/skyn/gotoSource.png;
 | 
				
			||||||
                        title python: backText + ' : ' + tool.translate('goto_source')"/></a></td>
 | 
					                          title python: backText + ' : ' + tool.translate('goto_source')"/></a></td>
 | 
				
			||||||
      <tal:comment replace="nothing">Go to the first page</tal:comment>
 | 
					      <tal:comment replace="nothing">Go to the first page</tal:comment>
 | 
				
			||||||
      <td><a tal:condition="firstUrl" tal:attributes="href firstUrl"><img style="cursor:pointer" 
 | 
					      <td tal:condition="firstUrl"><a tal:attributes="href firstUrl"><img style="cursor:pointer" 
 | 
				
			||||||
        tal:attributes="src string: $portal_url/skyn/arrowLeftDouble.png;
 | 
					          tal:attributes="src string: $appUrl/skyn/arrowLeftDouble.png;
 | 
				
			||||||
                        title python: tool.translate('goto_first')"/></a></td>
 | 
					                          title python: tool.translate('goto_first')"/></a></td>
 | 
				
			||||||
      <tal:comment replace="nothing">Go to the previous page</tal:comment>
 | 
					      <tal:comment replace="nothing">Go to the previous page</tal:comment>
 | 
				
			||||||
      <td><a tal:condition="previousUrl" tal:attributes="href previousUrl"><img style="cursor:pointer" 
 | 
					      <td tal:condition="previousUrl"><a tal:attributes="href previousUrl"><img style="cursor:pointer" 
 | 
				
			||||||
        tal:attributes="src string: $portal_url/skyn/arrowLeftSimple.png;
 | 
					          tal:attributes="src string: $appUrl/skyn/arrowLeftSimple.png;
 | 
				
			||||||
                        title python: tool.translate('goto_previous')"/></a></td>
 | 
					                          title python: tool.translate('goto_previous')"/></a></td>
 | 
				
			||||||
      <tal:comment replace="nothing">Explain which element is currently shown</tal:comment>
 | 
					      <tal:comment replace="nothing">Explain which element is currently shown</tal:comment>
 | 
				
			||||||
      <td class="discreet" valign="middle"> 
 | 
					      <td class="discreet"> 
 | 
				
			||||||
        <span tal:replace="python: currentNumber"/> <b>//</b>
 | 
					        <span tal:replace="python: currentNumber"/> <b>//</b>
 | 
				
			||||||
        <span tal:replace="python: totalNumber"/>  
 | 
					        <span tal:replace="python: totalNumber"/>  
 | 
				
			||||||
      </td>
 | 
					      </td>
 | 
				
			||||||
      <tal:comment replace="nothing">Go to the next page</tal:comment>
 | 
					      <tal:comment replace="nothing">Go to the next page</tal:comment>
 | 
				
			||||||
      <td><a tal:condition="python: nextUrl" tal:attributes="href nextUrl"><img style="cursor:pointer" 
 | 
					      <td tal:condition="python: nextUrl"><a tal:attributes="href nextUrl"><img style="cursor:pointer" 
 | 
				
			||||||
        tal:attributes="src string: $portal_url/skyn/arrowRightSimple.png;
 | 
					          tal:attributes="src string: $appUrl/skyn/arrowRightSimple.png;
 | 
				
			||||||
                        title python: tool.translate('goto_next')"/></a></td>
 | 
					                          title python: tool.translate('goto_next')"/></a></td>
 | 
				
			||||||
      <tal:comment replace="nothing">Go to the last page</tal:comment>
 | 
					      <tal:comment replace="nothing">Go to the last page</tal:comment>
 | 
				
			||||||
      <td><a tal:condition="lastUrl" tal:attributes="href lastUrl"><img style="cursor:pointer" 
 | 
					      <td tal:condition="lastUrl"><a tal:attributes="href lastUrl"><img style="cursor:pointer" 
 | 
				
			||||||
        tal:attributes="src string: $portal_url/skyn/arrowRightDouble.png;
 | 
					          tal:attributes="src string: $appUrl/skyn/arrowRightDouble.png;
 | 
				
			||||||
                        title python: tool.translate('goto_last')"/></a></td>
 | 
					                          title python: tool.translate('goto_last')"/></a></td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
  </table>
 | 
					  </table>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
| 
						 | 
					@ -97,11 +97,11 @@
 | 
				
			||||||
</tal:comment>
 | 
					</tal:comment>
 | 
				
			||||||
<metal:sortAndFilter define-macro="sortAndFilter" tal:define="fieldName widget/name">
 | 
					<metal:sortAndFilter define-macro="sortAndFilter" tal:define="fieldName widget/name">
 | 
				
			||||||
  <tal:sort condition="sortable">
 | 
					  <tal:sort condition="sortable">
 | 
				
			||||||
  <img tal:attributes="src string: $portal_url/skyn/sortDown.gif;
 | 
					  <img tal:attributes="src string: $appUrl/skyn/sortDown.gif;
 | 
				
			||||||
                       onClick python: navBaseCall.replace('**v**', '0,\'%s\',\'asc\',\'%s\'' % (fieldName, filterKey))"
 | 
					                       onClick python: navBaseCall.replace('**v**', '0,\'%s\',\'asc\',\'%s\'' % (fieldName, filterKey))"
 | 
				
			||||||
       tal:condition="python: (sortKey != fieldName) or (sortOrder == 'desc')"
 | 
					       tal:condition="python: (sortKey != fieldName) or (sortOrder == 'desc')"
 | 
				
			||||||
       style="cursor:pointer"/>
 | 
					       style="cursor:pointer"/>
 | 
				
			||||||
  <img tal:attributes="src string: $portal_url/skyn/sortUp.gif;
 | 
					  <img tal:attributes="src string: $appUrl/skyn/sortUp.gif;
 | 
				
			||||||
                       onClick python: navBaseCall.replace('**v**', '0,\'%s\',\'desc\',\'%s\'' % (fieldName, filterKey))"
 | 
					                       onClick python: navBaseCall.replace('**v**', '0,\'%s\',\'desc\',\'%s\'' % (fieldName, filterKey))"
 | 
				
			||||||
       tal:condition="python: (sortKey != fieldName) or (sortOrder == 'asc')"
 | 
					       tal:condition="python: (sortKey != fieldName) or (sortOrder == 'asc')"
 | 
				
			||||||
       style="cursor:pointer"/>
 | 
					       style="cursor:pointer"/>
 | 
				
			||||||
| 
						 | 
					@ -110,7 +110,7 @@
 | 
				
			||||||
    <input type="text" size="7"
 | 
					    <input type="text" size="7"
 | 
				
			||||||
           tal:attributes="id python: '%s_%s' % (ajaxHookId, fieldName);
 | 
					           tal:attributes="id python: '%s_%s' % (ajaxHookId, fieldName);
 | 
				
			||||||
                           value python: test(filterKey == fieldName, filterValue, '')"/>
 | 
					                           value python: test(filterKey == fieldName, filterValue, '')"/>
 | 
				
			||||||
    <img tal:attributes="src string: $portal_url/skyn/funnel.png;
 | 
					    <img tal:attributes="src string: $appUrl/skyn/funnel.png;
 | 
				
			||||||
                         onClick python: navBaseCall.replace('**v**', '0,\'%s\',\'%s\',\'%s\'' % (sortKey, sortOrder, fieldName))"
 | 
					                         onClick python: navBaseCall.replace('**v**', '0,\'%s\',\'%s\',\'%s\'' % (sortKey, sortOrder, fieldName))"
 | 
				
			||||||
         style="cursor:pointer"/>
 | 
					         style="cursor:pointer"/>
 | 
				
			||||||
  </tal:filter>
 | 
					  </tal:filter>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,374 +2,9 @@
 | 
				
			||||||
  This macro contains global page-related Javascripts.
 | 
					  This macro contains global page-related Javascripts.
 | 
				
			||||||
</tal:comment>
 | 
					</tal:comment>
 | 
				
			||||||
<div metal:define-macro="prologue">
 | 
					<div metal:define-macro="prologue">
 | 
				
			||||||
  <tal:comment replace="nothing">Global elements used in every page.</tal:comment>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  <tal:comment replace="nothing">Javascript messages</tal:comment>
 | 
					  <tal:comment replace="nothing">Javascript messages</tal:comment>
 | 
				
			||||||
  <script language="javascript" tal:content="tool/getJavascriptMessages"></script>
 | 
					  <script language="javascript" tal:content="tool/getJavascriptMessages"></script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:comment replace="nothing">"Static" javascripts</tal:comment>
 | 
					 | 
				
			||||||
  <script language="javascript">
 | 
					 | 
				
			||||||
  <!--
 | 
					 | 
				
			||||||
  var isIe = (navigator.appName == "Microsoft Internet Explorer");
 | 
					 | 
				
			||||||
  // AJAX machinery
 | 
					 | 
				
			||||||
  var xhrObjects = new Array(); // An array of XMLHttpRequest objects
 | 
					 | 
				
			||||||
  function XhrObject() { // Wraps a XmlHttpRequest object
 | 
					 | 
				
			||||||
    this.freed = 1; // Is this xhr object already dealing with a request or not?
 | 
					 | 
				
			||||||
    this.xhr = false;
 | 
					 | 
				
			||||||
    if (window.XMLHttpRequest) this.xhr = new XMLHttpRequest();
 | 
					 | 
				
			||||||
    else this.xhr = new ActiveXObject("Microsoft.XMLHTTP");
 | 
					 | 
				
			||||||
    this.hook = '';  /* The ID of the HTML element in the page that will be
 | 
					 | 
				
			||||||
                        replaced by result of executing the Ajax request. */
 | 
					 | 
				
			||||||
    this.onGet = ''; /* The name of a Javascript function to call once we
 | 
					 | 
				
			||||||
                        receive the result. */
 | 
					 | 
				
			||||||
    this.info = {};  /* An associative array for putting anything else. */
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  function getAjaxChunk(pos) {
 | 
					 | 
				
			||||||
    // This function is the callback called by the AJAX machinery (see function
 | 
					 | 
				
			||||||
    // askAjaxChunk below) when an Ajax response is available.
 | 
					 | 
				
			||||||
    // First, find back the correct XMLHttpRequest object
 | 
					 | 
				
			||||||
    if ( (typeof(xhrObjects[pos]) != 'undefined') &&
 | 
					 | 
				
			||||||
         (xhrObjects[pos].freed == 0)) {
 | 
					 | 
				
			||||||
      var hook = xhrObjects[pos].hook;
 | 
					 | 
				
			||||||
      if (xhrObjects[pos].xhr.readyState == 1) {
 | 
					 | 
				
			||||||
        // The request has been initialized: display the waiting radar
 | 
					 | 
				
			||||||
        var hookElem = document.getElementById(hook);
 | 
					 | 
				
			||||||
        if (hookElem) hookElem.innerHTML = "<div align=\"center\"><img src=\"skyn/waiting.gif\"/><\/div>";
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (xhrObjects[pos].xhr.readyState == 4) {
 | 
					 | 
				
			||||||
        // We have received the HTML chunk
 | 
					 | 
				
			||||||
        var hookElem = document.getElementById(hook);
 | 
					 | 
				
			||||||
        if (hookElem && (xhrObjects[pos].xhr.status == 200)) {
 | 
					 | 
				
			||||||
          hookElem.innerHTML = xhrObjects[pos].xhr.responseText;
 | 
					 | 
				
			||||||
          // Call a custom Javascript function if required
 | 
					 | 
				
			||||||
          if (xhrObjects[pos].onGet) {
 | 
					 | 
				
			||||||
            xhrObjects[pos].onGet(xhrObjects[pos], hookElem);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
          // Eval inner scripts if any.
 | 
					 | 
				
			||||||
          var innerScripts = document.getElementsByName("appyHook");
 | 
					 | 
				
			||||||
          for (var i=0; i<innerScripts.length; i++) {
 | 
					 | 
				
			||||||
            eval(innerScripts[i].innerHTML);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
          xhrObjects[pos].freed = 1;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  function askAjaxChunk(hook,mode,url,page,macro,params,beforeSend,onGet) {
 | 
					 | 
				
			||||||
    /* This function will ask to get a chunk of HTML on the server through a
 | 
					 | 
				
			||||||
       XMLHttpRequest. p_mode can be 'GET' or 'POST'. p_url is the URL of a
 | 
					 | 
				
			||||||
       given server object. On this URL we will call the page "ajax.pt" that
 | 
					 | 
				
			||||||
       will call a specific p_macro in a given p_page with some additional
 | 
					 | 
				
			||||||
       p_params (must be an associative array) if required.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       p_hook is the ID of the HTML element that will be filled with the HTML
 | 
					 | 
				
			||||||
       result from the server.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       p_beforeSend is a Javascript function to call before sending the request.
 | 
					 | 
				
			||||||
       This function will get 2 args: the XMLHttpRequest object and the
 | 
					 | 
				
			||||||
       p_params. This method can return, in a string, additional parameters to
 | 
					 | 
				
			||||||
       send, ie: "¶m1=blabla¶m2=blabla".
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       p_onGet is a Javascript function to call when we will receive the answer.
 | 
					 | 
				
			||||||
       This function will get 2 args, too: the XMLHttpRequest object and the
 | 
					 | 
				
			||||||
       HTML node element into which the result has been inserted.
 | 
					 | 
				
			||||||
    */
 | 
					 | 
				
			||||||
    // First, get a non-busy XMLHttpRequest object.
 | 
					 | 
				
			||||||
    var pos = -1;
 | 
					 | 
				
			||||||
    for (var i=0; i < xhrObjects.length; i++) {
 | 
					 | 
				
			||||||
      if (xhrObjects[i].freed == 1) { pos = i; break; }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (pos == -1) {
 | 
					 | 
				
			||||||
      pos = xhrObjects.length;
 | 
					 | 
				
			||||||
      xhrObjects[pos] = new XhrObject();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    xhrObjects[pos].hook = hook;
 | 
					 | 
				
			||||||
    xhrObjects[pos].onGet = onGet;
 | 
					 | 
				
			||||||
    if (xhrObjects[pos].xhr) {
 | 
					 | 
				
			||||||
      var rq = xhrObjects[pos];
 | 
					 | 
				
			||||||
      rq.freed = 0;
 | 
					 | 
				
			||||||
      // Construct parameters
 | 
					 | 
				
			||||||
      var paramsFull = 'page=' + page + '¯o=' + macro;
 | 
					 | 
				
			||||||
      if (params) {
 | 
					 | 
				
			||||||
        for (var paramName in params)
 | 
					 | 
				
			||||||
          paramsFull = paramsFull + '&' + paramName + '=' + params[paramName];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      // Call beforeSend if required
 | 
					 | 
				
			||||||
      if (beforeSend) {
 | 
					 | 
				
			||||||
         var res = beforeSend(rq, params);
 | 
					 | 
				
			||||||
         if (res) paramsFull = paramsFull + res;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      // Construct the URL to call
 | 
					 | 
				
			||||||
      var urlFull = url + '/skyn/ajax';
 | 
					 | 
				
			||||||
      if (mode == 'GET') {
 | 
					 | 
				
			||||||
        urlFull = urlFull + '?' + paramsFull;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      // Perform the asynchronous HTTP GET or POST
 | 
					 | 
				
			||||||
      rq.xhr.open(mode, urlFull, true);
 | 
					 | 
				
			||||||
      if (mode == 'POST') {
 | 
					 | 
				
			||||||
        // Set the correct HTTP headers
 | 
					 | 
				
			||||||
        rq.xhr.setRequestHeader(
 | 
					 | 
				
			||||||
          "Content-Type", "application/x-www-form-urlencoded");
 | 
					 | 
				
			||||||
        rq.xhr.setRequestHeader("Content-length", paramsFull.length);
 | 
					 | 
				
			||||||
        rq.xhr.setRequestHeader("Connection", "close");
 | 
					 | 
				
			||||||
        rq.xhr.onreadystatechange = function(){ getAjaxChunk(pos); }
 | 
					 | 
				
			||||||
        rq.xhr.send(paramsFull);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      else if (mode == 'GET') {
 | 
					 | 
				
			||||||
        rq.xhr.onreadystatechange = function() { getAjaxChunk(pos); }
 | 
					 | 
				
			||||||
        if (window.XMLHttpRequest) { rq.xhr.send(null); }
 | 
					 | 
				
			||||||
        else if (window.ActiveXObject) { rq.xhr.send(); }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* The functions below wrap askAjaxChunk for getting specific content through
 | 
					 | 
				
			||||||
     an Ajax request. */
 | 
					 | 
				
			||||||
  function askQueryResult(hookId, objectUrl, contentType, searchName,
 | 
					 | 
				
			||||||
                          startNumber, sortKey, sortOrder, filterKey) {
 | 
					 | 
				
			||||||
    // Sends an Ajax request for getting the result of a query.
 | 
					 | 
				
			||||||
    var params = {'type_name': contentType, 'search': searchName,
 | 
					 | 
				
			||||||
                  'startNumber': startNumber};
 | 
					 | 
				
			||||||
    if (sortKey) params['sortKey'] = sortKey;
 | 
					 | 
				
			||||||
    if (sortOrder) params['sortOrder'] = sortOrder;
 | 
					 | 
				
			||||||
    if (filterKey) {
 | 
					 | 
				
			||||||
      var filterWidget = document.getElementById(hookId + '_' + filterKey);
 | 
					 | 
				
			||||||
      if (filterWidget && filterWidget.value) {
 | 
					 | 
				
			||||||
        params['filterKey'] = filterKey;
 | 
					 | 
				
			||||||
        params['filterValue'] = filterWidget.value;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    askAjaxChunk(hookId,'GET',objectUrl, 'result', 'queryResult', params);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  function askObjectHistory(hookId, objectUrl, maxPerPage, startNumber) {
 | 
					 | 
				
			||||||
    // Sends an Ajax request for getting the history of an object
 | 
					 | 
				
			||||||
    var params = {'maxPerPage': maxPerPage, 'startNumber': startNumber};
 | 
					 | 
				
			||||||
    askAjaxChunk(hookId, 'GET', objectUrl, 'page', 'objectHistory', params);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  function askRefField(hookId, objectUrl, fieldName, innerRef, startNumber,
 | 
					 | 
				
			||||||
                       action, actionParams){
 | 
					 | 
				
			||||||
    // Sends an Ajax request for getting the content of a reference field.
 | 
					 | 
				
			||||||
    var startKey = hookId + '_startNumber';
 | 
					 | 
				
			||||||
    var params = {'fieldName': fieldName, 'innerRef': innerRef, };
 | 
					 | 
				
			||||||
    params[startKey] =  startNumber;
 | 
					 | 
				
			||||||
    if (action) params['action'] = action;
 | 
					 | 
				
			||||||
    if (actionParams) {
 | 
					 | 
				
			||||||
        for (key in actionParams) { params[key] = actionParams[key]; };
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    askAjaxChunk(hookId, 'GET', objectUrl, 'widgets/ref', 'viewContent',params);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  function askComputedField(hookId, objectUrl, fieldName) {
 | 
					 | 
				
			||||||
    // Sends an Ajax request for getting the content of a computed field
 | 
					 | 
				
			||||||
    var params = {'fieldName': fieldName};
 | 
					 | 
				
			||||||
    askAjaxChunk(hookId, 'GET', objectUrl, 'widgets/computed', 'viewContent',
 | 
					 | 
				
			||||||
                 params);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Function used by checkbox widgets for having radio-button-like behaviour
 | 
					 | 
				
			||||||
  function toggleCheckbox(visibleCheckbox, hiddenBoolean) {
 | 
					 | 
				
			||||||
    vis = document.getElementById(visibleCheckbox);
 | 
					 | 
				
			||||||
    hidden = document.getElementById(hiddenBoolean);
 | 
					 | 
				
			||||||
    if (vis.checked) hidden.value = 'True';
 | 
					 | 
				
			||||||
    else hidden.value = 'False';
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Functions used for master/slave relationships between widgets
 | 
					 | 
				
			||||||
  function getMasterValue(widget) {
 | 
					 | 
				
			||||||
    // Returns an array of selected options in a select widget
 | 
					 | 
				
			||||||
    res = new Array();
 | 
					 | 
				
			||||||
    if (widget.type == 'checkbox') {
 | 
					 | 
				
			||||||
      var mv = widget.checked + '';
 | 
					 | 
				
			||||||
      mv = mv.charAt(0).toUpperCase() + mv.substr(1);
 | 
					 | 
				
			||||||
      res.push(mv);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else { // SELECT widget
 | 
					 | 
				
			||||||
      for (var i=0; i < widget.options.length; i++) {
 | 
					 | 
				
			||||||
        if (widget.options[i].selected) res.push(widget.options[i].value);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return res;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  function updateSlaves(masterValues, appyTypeId) {
 | 
					 | 
				
			||||||
    // Given the value(s) selected in a master field, this function updates the
 | 
					 | 
				
			||||||
    // state of all corresponding slaves.
 | 
					 | 
				
			||||||
    var slaves = cssQuery('table.slave_' + appyTypeId);
 | 
					 | 
				
			||||||
    for (var i=0; i< slaves.length; i++){
 | 
					 | 
				
			||||||
      slaves[i].style.display = "none";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    for (var i=0; i < masterValues.length; i++) {
 | 
					 | 
				
			||||||
      var activeSlaves = cssQuery('table.slaveValue_' + appyTypeId + '_' + masterValues[i]);
 | 
					 | 
				
			||||||
      for (var j=0; j < activeSlaves.length; j++){
 | 
					 | 
				
			||||||
        activeSlaves[j].style.display = "";
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Function used for triggering a workflow transition
 | 
					 | 
				
			||||||
  function triggerTransition(transitionId, msg) {
 | 
					 | 
				
			||||||
    var theForm = document.getElementById('triggerTransitionForm');
 | 
					 | 
				
			||||||
    theForm.workflow_action.value = transitionId;
 | 
					 | 
				
			||||||
    if (!msg) {
 | 
					 | 
				
			||||||
      theForm.submit();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else { // Ask the user to confirm.
 | 
					 | 
				
			||||||
      askConfirm('form', 'triggerTransitionForm', msg);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  function onDeleteObject(objectUid) {
 | 
					 | 
				
			||||||
    f = document.getElementById('deleteForm');
 | 
					 | 
				
			||||||
    f.objectUid.value = objectUid;
 | 
					 | 
				
			||||||
    askConfirm('form', 'deleteForm', delete_confirm);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  function toggleCookie(cookieId) {
 | 
					 | 
				
			||||||
    // What is the state of this boolean (expanded/collapsed) cookie?
 | 
					 | 
				
			||||||
    var state = readCookie(cookieId);
 | 
					 | 
				
			||||||
    if ((state != 'collapsed') && (state != 'expanded')) {
 | 
					 | 
				
			||||||
      // No cookie yet, create it.
 | 
					 | 
				
			||||||
      createCookie(cookieId, 'collapsed');
 | 
					 | 
				
			||||||
      state = 'collapsed';
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    var hook = document.getElementById(cookieId); // The hook is the part of
 | 
					 | 
				
			||||||
    // the HTML document that needs to be shown or hidden.
 | 
					 | 
				
			||||||
    var displayValue = 'none';
 | 
					 | 
				
			||||||
    var newState = 'collapsed';
 | 
					 | 
				
			||||||
    var imgSrc = 'skyn/expand.gif';
 | 
					 | 
				
			||||||
    if (state == 'collapsed') {
 | 
					 | 
				
			||||||
      // Show the HTML zone
 | 
					 | 
				
			||||||
      displayValue = 'block';
 | 
					 | 
				
			||||||
      imgSrc = 'skyn/collapse.gif';
 | 
					 | 
				
			||||||
      newState = 'expanded';
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    // Update the corresponding HTML element
 | 
					 | 
				
			||||||
    hook.style.display = displayValue;
 | 
					 | 
				
			||||||
    var img = document.getElementById(cookieId + '_img');
 | 
					 | 
				
			||||||
    img.src = imgSrc;
 | 
					 | 
				
			||||||
    // Inverse the cookie value
 | 
					 | 
				
			||||||
    createCookie(cookieId, newState);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Function that allows to generate a document from a pod template.
 | 
					 | 
				
			||||||
  function generatePodDocument(contextUid, fieldName, podFormat, queryData) {
 | 
					 | 
				
			||||||
    var theForm = document.getElementsByName("podTemplateForm")[0];
 | 
					 | 
				
			||||||
    theForm.objectUid.value = contextUid;
 | 
					 | 
				
			||||||
    theForm.fieldName.value = fieldName;
 | 
					 | 
				
			||||||
    theForm.podFormat.value = podFormat;
 | 
					 | 
				
			||||||
    theForm.askAction.value = "False";
 | 
					 | 
				
			||||||
    theForm.queryData.value = queryData;
 | 
					 | 
				
			||||||
    var askActionWidget = document.getElementById(contextUid + '_' + fieldName);
 | 
					 | 
				
			||||||
    if (askActionWidget && askActionWidget.checked) {
 | 
					 | 
				
			||||||
        theForm.askAction.value = "True";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    theForm.submit();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Functions for opening and closing a popup
 | 
					 | 
				
			||||||
  function openPopup(popupId, msg) {
 | 
					 | 
				
			||||||
    // Put the message into the popup
 | 
					 | 
				
			||||||
    var confirmElem = document.getElementById('appyConfirmText');
 | 
					 | 
				
			||||||
    confirmElem.innerHTML = msg;
 | 
					 | 
				
			||||||
    // Open the popup
 | 
					 | 
				
			||||||
    var popup = document.getElementById(popupId);
 | 
					 | 
				
			||||||
    // Put it at the right place on the screen
 | 
					 | 
				
			||||||
    var scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0;
 | 
					 | 
				
			||||||
    popup.style.top = (scrollTop + 150) + 'px';
 | 
					 | 
				
			||||||
    popup.style.display = "block";
 | 
					 | 
				
			||||||
    // Show the greyed zone
 | 
					 | 
				
			||||||
    var greyed = document.getElementById('appyGrey');
 | 
					 | 
				
			||||||
    greyed.style.top = scrollTop + 'px';
 | 
					 | 
				
			||||||
    greyed.style.display = "block";
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  function closePopup(popupId) {
 | 
					 | 
				
			||||||
    // Close the popup
 | 
					 | 
				
			||||||
    var popup = document.getElementById(popupId);
 | 
					 | 
				
			||||||
    popup.style.display = "none";
 | 
					 | 
				
			||||||
    // Hide the greyed zone
 | 
					 | 
				
			||||||
    var greyed = document.getElementById('appyGrey');
 | 
					 | 
				
			||||||
    greyed.style.display = "none";
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Function triggered when an action needs to be confirmed by the user
 | 
					 | 
				
			||||||
  function askConfirm(actionType, action, msg) {
 | 
					 | 
				
			||||||
    /* Store the actionType (send a form, call an URL or call a script) and the
 | 
					 | 
				
			||||||
       related action, and shows the confirm popup. If the user confirms, we
 | 
					 | 
				
			||||||
       will perform the action. */
 | 
					 | 
				
			||||||
    var confirmForm = document.getElementById('confirmActionForm');
 | 
					 | 
				
			||||||
    confirmForm.actionType.value = actionType;
 | 
					 | 
				
			||||||
    confirmForm.action.value = action;
 | 
					 | 
				
			||||||
    openPopup("confirmActionPopup", msg);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Function triggered when an action confirmed by the user must be performed
 | 
					 | 
				
			||||||
  function doConfirm() {
 | 
					 | 
				
			||||||
    // The user confirmed: perform the required action.
 | 
					 | 
				
			||||||
    closePopup('confirmActionPopup');
 | 
					 | 
				
			||||||
    var confirmForm = document.getElementById('confirmActionForm');
 | 
					 | 
				
			||||||
    var actionType = confirmForm.actionType.value;
 | 
					 | 
				
			||||||
    var action = confirmForm.action.value;
 | 
					 | 
				
			||||||
    if (actionType == 'form') {
 | 
					 | 
				
			||||||
      // We must submit the form whose id is in "action"
 | 
					 | 
				
			||||||
      document.getElementById(action).submit();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else if (actionType == 'url') {
 | 
					 | 
				
			||||||
      // We must go to the URL defined in "action"
 | 
					 | 
				
			||||||
      window.location = action;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else if (actionType == 'script') {
 | 
					 | 
				
			||||||
      // We must execute Javascript code in "action"
 | 
					 | 
				
			||||||
      eval(action);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Function that finally posts the edit form after the user has confirmed that
 | 
					 | 
				
			||||||
  // she really wants to post it.
 | 
					 | 
				
			||||||
  function postConfirmedEditForm() {
 | 
					 | 
				
			||||||
    var theForm = document.getElementById('appyEditForm');
 | 
					 | 
				
			||||||
    theForm.confirmed.value = "True";
 | 
					 | 
				
			||||||
    theForm.submit();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Function that shows or hides a tab. p_action is 'show' or 'hide'.
 | 
					 | 
				
			||||||
  function manageTab(tabId, action) {
 | 
					 | 
				
			||||||
    // Manage the tab content (show it or hide it)
 | 
					 | 
				
			||||||
    var content = document.getElementById('tabcontent_' + tabId);
 | 
					 | 
				
			||||||
    if (action == 'show')   { content.style.display = 'table-row'; }
 | 
					 | 
				
			||||||
    else                    { content.style.display = 'none'; }
 | 
					 | 
				
			||||||
    // Manage the tab itself (show as selected or unselected)
 | 
					 | 
				
			||||||
    var left = document.getElementById('tab_' + tabId + '_left');
 | 
					 | 
				
			||||||
    var tab = document.getElementById('tab_' + tabId);
 | 
					 | 
				
			||||||
    var right = document.getElementById('tab_' + tabId + '_right');
 | 
					 | 
				
			||||||
    if (action == 'show') {
 | 
					 | 
				
			||||||
        left.src  = "skyn/tabLeft.png";
 | 
					 | 
				
			||||||
        tab.style.backgroundImage = "url(skyn/tabBg.png)";
 | 
					 | 
				
			||||||
        right.src = "skyn/tabRight.png";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (action == 'hide') {
 | 
					 | 
				
			||||||
        left.src  = "skyn/tabLeftu.png";
 | 
					 | 
				
			||||||
        tab.style.backgroundImage = "url(skyn/tabBgu.png)";
 | 
					 | 
				
			||||||
        right.src = "skyn/tabRightu.png";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Function used for displaying/hiding content of a tab
 | 
					 | 
				
			||||||
  function showTab(tabId) {
 | 
					 | 
				
			||||||
    // 1st, show the tab to show
 | 
					 | 
				
			||||||
    manageTab(tabId, 'show');
 | 
					 | 
				
			||||||
    // Compute the number of tabs.
 | 
					 | 
				
			||||||
    var idParts = tabId.split('_');
 | 
					 | 
				
			||||||
    var prefix = idParts[0] + '_';
 | 
					 | 
				
			||||||
    // Store the currently selected tab in a cookie.
 | 
					 | 
				
			||||||
    createCookie('tab_' + idParts[0], tabId);
 | 
					 | 
				
			||||||
    var nbOfTabs = idParts[2]*1;
 | 
					 | 
				
			||||||
    // Then, hide the other tabs.
 | 
					 | 
				
			||||||
    for (var i=0; i<nbOfTabs; i++) {
 | 
					 | 
				
			||||||
       var idTab = prefix + (i+1) + '_' + nbOfTabs;
 | 
					 | 
				
			||||||
       if (idTab != tabId) {
 | 
					 | 
				
			||||||
         manageTab(idTab, 'hide');
 | 
					 | 
				
			||||||
       }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Function that initializes the state of a tab
 | 
					 | 
				
			||||||
  function initTab(cookieId, defaultValue) {
 | 
					 | 
				
			||||||
    var toSelect = readCookie(cookieId);
 | 
					 | 
				
			||||||
    if (!toSelect) { showTab(defaultValue) }
 | 
					 | 
				
			||||||
    else { showTab(toSelect); }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
-->
 | 
					 | 
				
			||||||
  </script>
 | 
					 | 
				
			||||||
  <tal:comment replace="nothing">Global form for deleting an object</tal:comment>
 | 
					  <tal:comment replace="nothing">Global form for deleting an object</tal:comment>
 | 
				
			||||||
  <form id="deleteForm" method="post" action="skyn/do">
 | 
					  <form id="deleteForm" method="post" action="skyn/do">
 | 
				
			||||||
    <input type="hidden" name="action" value="Delete"/>
 | 
					    <input type="hidden" name="action" value="Delete"/>
 | 
				
			||||||
| 
						 | 
					@ -405,14 +40,14 @@
 | 
				
			||||||
    layoutType         We must know if we must render the widgets in a "view",
 | 
					    layoutType         We must know if we must render the widgets in a "view",
 | 
				
			||||||
                       "edit" or "cell" layout
 | 
					                       "edit" or "cell" layout
 | 
				
			||||||
</tal:comment>
 | 
					</tal:comment>
 | 
				
			||||||
<table metal:define-macro="widgets" cellpadding="0" cellspacing="0"
 | 
					<table metal:define-macro="widgets"
 | 
				
			||||||
       tal:attributes="width layout/width">
 | 
					       tal:attributes="width layout/width">
 | 
				
			||||||
  <tr tal:repeat="widget python: contextObj.getGroupedAppyTypes(layoutType, page)">
 | 
					  <tr tal:repeat="widget python: contextObj.getGroupedAppyTypes(layoutType, page)">
 | 
				
			||||||
    <td tal:condition="python: widget['type'] == 'group'">
 | 
					    <td tal:condition="python: widget['type'] == 'group'">
 | 
				
			||||||
      <metal:call use-macro="portal/skyn/widgets/show/macros/group"/>
 | 
					      <metal:call use-macro="app/skyn/widgets/show/macros/group"/>
 | 
				
			||||||
    </td>
 | 
					    </td>
 | 
				
			||||||
    <td tal:condition="python: widget['type'] != 'group'">
 | 
					    <td tal:condition="python: widget['type'] != 'group'">
 | 
				
			||||||
      <metal:call use-macro="portal/skyn/widgets/show/macros/field"/>
 | 
					      <metal:call use-macro="app/skyn/widgets/show/macros/field"/>
 | 
				
			||||||
    </td>
 | 
					    </td>
 | 
				
			||||||
  </tr>
 | 
					  </tr>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
| 
						 | 
					@ -501,7 +136,7 @@
 | 
				
			||||||
            tal:content="python: tool.translate(contextObj.getWorkflowLabel(stateInfo['name']))">
 | 
					            tal:content="python: tool.translate(contextObj.getWorkflowLabel(stateInfo['name']))">
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
        <td tal:condition="python: stateInfo['name'] != states[-1]['name']">
 | 
					        <td tal:condition="python: stateInfo['name'] != states[-1]['name']">
 | 
				
			||||||
          <img tal:attributes="src string: $portal_url/skyn/nextState.png"/>
 | 
					          <img tal:attributes="src string: $appUrl/skyn/nextState.png"/>
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
      </tal:state>
 | 
					      </tal:state>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
| 
						 | 
					@ -558,15 +193,13 @@
 | 
				
			||||||
     tal:condition="not: contextObj/isTemporary">
 | 
					     tal:condition="not: contextObj/isTemporary">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <tal:comment replace="nothing">Information that is common to all tabs (object title, state, etc)</tal:comment>
 | 
					    <tal:comment replace="nothing">Information that is common to all tabs (object title, state, etc)</tal:comment>
 | 
				
			||||||
    <table width="100%" tal:condition="showCommonInfo" class="appyCommonInfo">
 | 
					    <table width="100%" tal:condition="showCommonInfo" class="summary">
 | 
				
			||||||
      <tr valign="bottom" align="left">
 | 
					      <tr>
 | 
				
			||||||
        <tal:comment replace="nothing">Title and state</tal:comment>
 | 
					        <tal:comment replace="nothing">Title</tal:comment>
 | 
				
			||||||
        <td width="80%">
 | 
					        <td colspan="2" class="objectTitle" tal:content="contextObj/title_or_id"></td>
 | 
				
			||||||
          <b class="appyTitle" tal:content="contextObj/title_or_id"></b>
 | 
					 | 
				
			||||||
        </td>
 | 
					 | 
				
			||||||
      </tr>
 | 
					      </tr>
 | 
				
			||||||
      <tr align="left">
 | 
					      <tr class="underTitle">
 | 
				
			||||||
        <td class="documentByLine" colspan="2">
 | 
					        <td class="by" colspan="2">
 | 
				
			||||||
          <tal:comment replace="nothing">Creator and last modification date</tal:comment>
 | 
					          <tal:comment replace="nothing">Creator and last modification date</tal:comment>
 | 
				
			||||||
            <tal:comment replace="nothing">Plus/minus icon for accessing history</tal:comment>
 | 
					            <tal:comment replace="nothing">Plus/minus icon for accessing history</tal:comment>
 | 
				
			||||||
            <tal:accessHistory condition="hasHistory">
 | 
					            <tal:accessHistory condition="hasHistory">
 | 
				
			||||||
| 
						 | 
					@ -579,34 +212,32 @@
 | 
				
			||||||
            <tal:comment replace="nothing">Show document creator</tal:comment>
 | 
					            <tal:comment replace="nothing">Show document creator</tal:comment>
 | 
				
			||||||
            <tal:creator condition="creator"
 | 
					            <tal:creator condition="creator"
 | 
				
			||||||
                 define="author python:contextObj.portal_membership.getMemberInfo(creator)">
 | 
					                 define="author python:contextObj.portal_membership.getMemberInfo(creator)">
 | 
				
			||||||
            <span class="documentAuthor" i18n:domain="plone" i18n:translate="label_by_author">
 | 
					            <span i18n:domain="plone" i18n:translate="label_by_author">
 | 
				
			||||||
            by <a tal:attributes="href string:${portal_url}/author/${creator}"
 | 
					            by <span tal:content="python:author and author['fullname'] or creator"
 | 
				
			||||||
                  tal:content="python:author and author['fullname'] or creator"
 | 
					                     tal:omit-tag="not:author" i18n:name="author"/>
 | 
				
			||||||
                  tal:omit-tag="not:author" i18n:name="author"/>
 | 
					 | 
				
			||||||
            —
 | 
					            —
 | 
				
			||||||
            </span>
 | 
					            </span>
 | 
				
			||||||
            </tal:creator>
 | 
					            </tal:creator>
 | 
				
			||||||
            <tal:comment replace="nothing">Show last modification date</tal:comment>
 | 
					            <tal:comment replace="nothing">Show last modification date</tal:comment>
 | 
				
			||||||
            <span i18n:translate="box_last_modified" i18n:domain="plone"></span>
 | 
					 | 
				
			||||||
            <span tal:replace="python:contextObj.restrictedTraverse('@@plone').toLocalizedTime(contextObj.ModificationDate(),long_format=1)"></span>
 | 
					            <span tal:replace="python:contextObj.restrictedTraverse('@@plone').toLocalizedTime(contextObj.ModificationDate(),long_format=1)"></span>
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
      </tr>
 | 
					      </tr>
 | 
				
			||||||
      <tal:comment replace="nothing">Object history</tal:comment>
 | 
					      <tal:comment replace="nothing">Object history</tal:comment>
 | 
				
			||||||
      <tr tal:condition="hasHistory" align="left">
 | 
					      <tr tal:condition="hasHistory">
 | 
				
			||||||
        <td colspan="2">
 | 
					        <td colspan="2">
 | 
				
			||||||
          <span id="appyHistory"
 | 
					          <span id="appyHistory"
 | 
				
			||||||
                tal:attributes="style python:test(historyExpanded, 'display:block', 'display:none')">
 | 
					                tal:attributes="style python:test(historyExpanded, 'display:block', 'display:none')">
 | 
				
			||||||
          <div tal:define="ajaxHookId python: contextObj.UID() + '_history';"
 | 
					          <div tal:define="ajaxHookId python: contextObj.UID() + '_history';"
 | 
				
			||||||
               tal:attributes="id ajaxHookId">
 | 
					               tal:attributes="id ajaxHookId">
 | 
				
			||||||
             <script language="javascript" tal:content="python: 'askObjectHistory(\'%s\',\'%s\',%d,0)' % (ajaxHookId, contextObj.absolute_url(),historyMaxPerPage)">
 | 
					             <script tal:content="python: 'askObjectHistory(\'%s\',\'%s\',%d,0)' % (ajaxHookId, contextObj.absolute_url(),historyMaxPerPage)">
 | 
				
			||||||
             </script>
 | 
					             </script>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
          </span>
 | 
					          </span>
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
      </tr>
 | 
					      </tr>
 | 
				
			||||||
      <tal:comment replace="nothing">Workflow-related information and actions</tal:comment>
 | 
					      <tal:comment replace="nothing">Workflow-related information and actions</tal:comment>
 | 
				
			||||||
      <tr tal:condition="python: showWorkflow and contextObj.getWorkflowLabel()" align="left">
 | 
					      <tr tal:condition="python: showWorkflow and contextObj.getWorkflowLabel()">
 | 
				
			||||||
        <td colspan="2" class="appyWorkflow">
 | 
					        <td colspan="2" class="workflow">
 | 
				
			||||||
          <table width="100%">
 | 
					          <table width="100%">
 | 
				
			||||||
            <tr>
 | 
					            <tr>
 | 
				
			||||||
              <td><metal:states use-macro="here/skyn/page/macros/states"/></td>
 | 
					              <td><metal:states use-macro="here/skyn/page/macros/states"/></td>
 | 
				
			||||||
| 
						 | 
					@ -622,7 +253,7 @@
 | 
				
			||||||
  The page footer.
 | 
					  The page footer.
 | 
				
			||||||
</tal:comment>
 | 
					</tal:comment>
 | 
				
			||||||
<metal:footer define-macro="footer">
 | 
					<metal:footer define-macro="footer">
 | 
				
			||||||
<tal:dummy define="messages putils/showPortalMessages"/>
 | 
					<tal:dummy define="messages app/plone_utils/showPortalMessages"/>
 | 
				
			||||||
<script language="javascript">
 | 
					<script language="javascript">
 | 
				
			||||||
<!--
 | 
					<!--
 | 
				
			||||||
  // When the current page is loaded, we must set the correct state for all slave fields.
 | 
					  // When the current page is loaded, we must set the correct state for all slave fields.
 | 
				
			||||||
| 
						 | 
					@ -674,12 +305,12 @@
 | 
				
			||||||
    <tal:button condition="isEdit">
 | 
					    <tal:button condition="isEdit">
 | 
				
			||||||
      <input type="image" class="imageInput" style="cursor:pointer" name="buttonPrevious"
 | 
					      <input type="image" class="imageInput" style="cursor:pointer" name="buttonPrevious"
 | 
				
			||||||
             title="label_previous" i18n:attributes="title" i18n:domain="plone"
 | 
					             title="label_previous" i18n:attributes="title" i18n:domain="plone"
 | 
				
			||||||
             tal:attributes="src string:$portal_url/skyn/previous.png"/>
 | 
					             tal:attributes="src string:$appUrl/skyn/previous.png"/>
 | 
				
			||||||
      <input type="hidden" name="previousPage"  tal:attributes="value previousPage"/>
 | 
					      <input type="hidden" name="previousPage"  tal:attributes="value previousPage"/>
 | 
				
			||||||
    </tal:button>
 | 
					    </tal:button>
 | 
				
			||||||
    <tal:link condition="not: isEdit">
 | 
					    <tal:link condition="not: isEdit">
 | 
				
			||||||
      <a tal:attributes="href python: contextObj.getUrl(page=previousPage)">
 | 
					      <a tal:attributes="href python: contextObj.getUrl(page=previousPage)">
 | 
				
			||||||
        <img tal:attributes="src string:$portal_url/skyn/previous.png"
 | 
					        <img tal:attributes="src string:$appUrl/skyn/previous.png"
 | 
				
			||||||
             title="label_previous" i18n:attributes="title" i18n:domain="plone"/>
 | 
					             title="label_previous" i18n:attributes="title" i18n:domain="plone"/>
 | 
				
			||||||
      </a>
 | 
					      </a>
 | 
				
			||||||
    </tal:link>
 | 
					    </tal:link>
 | 
				
			||||||
| 
						 | 
					@ -688,38 +319,38 @@
 | 
				
			||||||
  <tal:save condition="python: isEdit and pageInfo['showSave']">
 | 
					  <tal:save condition="python: isEdit and pageInfo['showSave']">
 | 
				
			||||||
    <input type="image" class="imageInput" style="cursor:pointer" name="buttonOk"
 | 
					    <input type="image" class="imageInput" style="cursor:pointer" name="buttonOk"
 | 
				
			||||||
           title="label_save" i18n:attributes="title" i18n:domain="plone"
 | 
					           title="label_save" i18n:attributes="title" i18n:domain="plone"
 | 
				
			||||||
           tal:attributes="src string:$portal_url/skyn/save.png"/>
 | 
					           tal:attributes="src string:$appUrl/skyn/save.png"/>
 | 
				
			||||||
  </tal:save>
 | 
					  </tal:save>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:cancel condition="python: isEdit and pageInfo['showCancel']">
 | 
					  <tal:cancel condition="python: isEdit and pageInfo['showCancel']">
 | 
				
			||||||
    <input type="image" class="imageInput" style="cursor:pointer" name="buttonCancel"
 | 
					    <input type="image" class="imageInput" style="cursor:pointer" name="buttonCancel"
 | 
				
			||||||
           title="label_cancel" i18n:attributes="title" i18n:domain="plone"
 | 
					           title="label_cancel" i18n:attributes="title" i18n:domain="plone"
 | 
				
			||||||
           tal:attributes="src string:$portal_url/skyn/cancel.png"/>
 | 
					           tal:attributes="src string:$appUrl/skyn/cancel.png"/>
 | 
				
			||||||
  </tal:cancel>
 | 
					  </tal:cancel>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:edit condition="python: not isEdit and pageInfo['showOnEdit']">
 | 
					  <tal:edit condition="python: not isEdit and pageInfo['showOnEdit']">
 | 
				
			||||||
    <img title="Edit" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
 | 
					    <img title="Edit" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
 | 
				
			||||||
         tal:attributes="onClick python: 'href: window.location=\'%s\'' % contextObj.getUrl(mode='edit', page=page);
 | 
					         tal:attributes="onClick python: 'href: window.location=\'%s\'' % contextObj.getUrl(mode='edit', page=page);
 | 
				
			||||||
                         src string: $portal_url/skyn/editBig.png"
 | 
					                         src string: $appUrl/skyn/editBig.png"
 | 
				
			||||||
         tal:condition="python: member.has_permission('Modify portal content', contextObj)"/>
 | 
					         tal:condition="python: contextObj.allows('Modify portal content')"/>
 | 
				
			||||||
  </tal:edit>
 | 
					  </tal:edit>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:refresh condition="contextObj/isDebug">
 | 
					  <tal:refresh condition="contextObj/isDebug">
 | 
				
			||||||
    <img title="Refresh" style="cursor:pointer"
 | 
					    <img title="Refresh" style="cursor:pointer"
 | 
				
			||||||
         tal:attributes="onClick python: 'href: window.location=\'%s\'' % contextObj.getUrl(mode=layoutType, page=page, refresh='yes');
 | 
					         tal:attributes="onClick python: 'href: window.location=\'%s\'' % contextObj.getUrl(mode=layoutType, page=page, refresh='yes');
 | 
				
			||||||
                         src string: $portal_url/skyn/refresh.png"/>
 | 
					                         src string: $appUrl/skyn/refresh.png"/>
 | 
				
			||||||
  </tal:refresh>
 | 
					  </tal:refresh>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:next condition="python: nextPage and pageInfo['showNext']">
 | 
					  <tal:next condition="python: nextPage and pageInfo['showNext']">
 | 
				
			||||||
    <tal:button condition="isEdit">
 | 
					    <tal:button condition="isEdit">
 | 
				
			||||||
      <input type="image" class="imageInput" style="cursor:pointer" name="buttonNext"
 | 
					      <input type="image" class="imageInput" style="cursor:pointer" name="buttonNext"
 | 
				
			||||||
             title="label_next" i18n:attributes="title" i18n:domain="plone"
 | 
					             title="label_next" i18n:attributes="title" i18n:domain="plone"
 | 
				
			||||||
             tal:attributes="src string:$portal_url/skyn/next.png"/>
 | 
					             tal:attributes="src string:$appUrl/skyn/next.png"/>
 | 
				
			||||||
      <input type="hidden" name="nextPage"  tal:attributes="value nextPage"/>
 | 
					      <input type="hidden" name="nextPage"  tal:attributes="value nextPage"/>
 | 
				
			||||||
    </tal:button>
 | 
					    </tal:button>
 | 
				
			||||||
    <tal:link condition="not: isEdit">
 | 
					    <tal:link condition="not: isEdit">
 | 
				
			||||||
      <a tal:attributes="href python: contextObj.getUrl(page=nextPage)">
 | 
					      <a tal:attributes="href python: contextObj.getUrl(page=nextPage)">
 | 
				
			||||||
        <img tal:attributes="src string:$portal_url/skyn/next.png"
 | 
					        <img tal:attributes="src string:$appUrl/skyn/next.png"
 | 
				
			||||||
             title="label_next" i18n:attributes="title" i18n:domain="plone"/>
 | 
					             title="label_next" i18n:attributes="title" i18n:domain="plone"/>
 | 
				
			||||||
      </a>
 | 
					      </a>
 | 
				
			||||||
    </tal:link>
 | 
					    </tal:link>
 | 
				
			||||||
| 
						 | 
					@ -731,17 +362,12 @@
 | 
				
			||||||
</tal:comment>
 | 
					</tal:comment>
 | 
				
			||||||
<metal:message define-macro="message">
 | 
					<metal:message define-macro="message">
 | 
				
			||||||
  <tal:comment replace="nothing">Single message from portal_status_message request key</tal:comment>
 | 
					  <tal:comment replace="nothing">Single message from portal_status_message request key</tal:comment>
 | 
				
			||||||
  <div tal:define="msg request/portal_status_message | nothing"
 | 
					  <div tal:define="msg req/portal_status_message | nothing"
 | 
				
			||||||
       tal:condition="msg" class="portalMessage" tal:content="structure msg"></div>
 | 
					       tal:condition="msg" class="message" tal:content="structure msg"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:comment replace="nothing">Messages added via plone_utils</tal:comment>
 | 
					  <tal:comment replace="nothing">Messages added via plone_utils</tal:comment>
 | 
				
			||||||
  <tal:messages define="messages putils/showPortalMessages" condition="messages">
 | 
					  <tal:messages define="messages python: ''.join([m.message for m in app.plone_utils.showPortalMessages()])"
 | 
				
			||||||
    <tal:msgs define="type_css_map python: {'info':'portalMessage', 'warn':'portalWarningMessage',
 | 
					                condition="messages">
 | 
				
			||||||
                                            'stop':'portalStopMessage'};"
 | 
					    <div class="message" tal:content="structure messages"></div>
 | 
				
			||||||
              repeat="msg messages">
 | 
					 | 
				
			||||||
      <div tal:define="mtype msg/type | nothing;"
 | 
					 | 
				
			||||||
           tal:attributes="class python:mtype and type_css_map[mtype] or 'info';"
 | 
					 | 
				
			||||||
           tal:content="structure msg/message | nothing"></div>
 | 
					 | 
				
			||||||
    </tal:msgs>
 | 
					 | 
				
			||||||
  </tal:messages>
 | 
					  </tal:messages>
 | 
				
			||||||
</metal:message>
 | 
					</metal:message>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 225 B After Width: | Height: | Size: 246 B  | 
| 
						 | 
					@ -1,76 +1,57 @@
 | 
				
			||||||
<tal:comment replace="nothing">
 | 
					<tal:comment replace="nothing">
 | 
				
			||||||
    This macro displays the content of the application portlet.
 | 
					    This macro displays the content of the application portlet.
 | 
				
			||||||
</tal:comment>
 | 
					</tal:comment>
 | 
				
			||||||
<metal:portletContent define-macro="portletContent"
 | 
					<metal:portlet define-macro="portlet"
 | 
				
			||||||
   tal:define="queryUrl           python: '%s/skyn/query' % appFolder.absolute_url();
 | 
					   tal:define="queryUrl           python: '%s/skyn/query' % tool.absolute_url();
 | 
				
			||||||
               currentSearch      request/search|nothing;
 | 
					               toolUrl            tool/absolute_url;
 | 
				
			||||||
               currentType        request/type_name|nothing;
 | 
					               currentSearch      req/search|nothing;
 | 
				
			||||||
               contextObj         python: tool.getPublishedObject()">
 | 
					               currentType        req/type_name|nothing;
 | 
				
			||||||
  <tal:comment replace="nothing">Portlet title, with link to tool.</tal:comment>
 | 
					               contextObj         tool/getPublishedObject;
 | 
				
			||||||
  <dt class="portletHeader">
 | 
					               rootClasses        tool/getRootClasses">
 | 
				
			||||||
    <tal:comment replace="nothing">For the Manager, clicking on the portlet
 | 
					 | 
				
			||||||
        title allows to see all root objects in the database.</tal:comment>
 | 
					 | 
				
			||||||
    <table cellpadding="0" cellspacing="0" width="100%">
 | 
					 | 
				
			||||||
    <tr>
 | 
					 | 
				
			||||||
      <td tal:define="titleIsClickable python: member.has_role('Manager') and rootClasses">
 | 
					 | 
				
			||||||
        <a tal:condition="titleIsClickable"
 | 
					 | 
				
			||||||
           tal:attributes="href python:'%s?type_name=%s' % (queryUrl, ','.join(rootClasses))"
 | 
					 | 
				
			||||||
           tal:content="structure python: tool.translate(appName)"></a>
 | 
					 | 
				
			||||||
        <span tal:condition="not: titleIsClickable"
 | 
					 | 
				
			||||||
              tal:replace="structure python: tool.translate(appName)"/>
 | 
					 | 
				
			||||||
      </td>
 | 
					 | 
				
			||||||
    <td align="right">
 | 
					 | 
				
			||||||
      <img style="cursor:pointer"
 | 
					 | 
				
			||||||
           tal:condition="python: member.has_role('Manager')"
 | 
					 | 
				
			||||||
           tal:attributes="onClick python: 'href: window.location=\'%s\'' % tool.getUrl(page='main', nav='');
 | 
					 | 
				
			||||||
                           title python: tool.translate('%sTool' % appName);
 | 
					 | 
				
			||||||
                           src string:$portal_url/skyn/appyConfig.gif"/>
 | 
					 | 
				
			||||||
    </td>
 | 
					 | 
				
			||||||
  </dt>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:publishedObject condition="python: contextObj and contextObj.mayNavigate()">
 | 
					  <tal:publishedObject condition="python: contextObj and contextObj.mayNavigate()">
 | 
				
			||||||
  <dt class="portletAppyItem portletCurrent"><b tal:content="contextObj/Title"></b></dt>
 | 
					  <b tal:content="contextObj/Title"></b>
 | 
				
			||||||
  <dt class="portletAppyItem"><metal:phases use-macro="here/skyn/portlet/macros/phases"/></dt>
 | 
					  <span><metal:phases use-macro="here/skyn/portlet/macros/phases"/></span>
 | 
				
			||||||
  </tal:publishedObject>
 | 
					  </tal:publishedObject>
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  <tal:comment replace="nothing">Create a section for every root class.</tal:comment>
 | 
					  <tal:comment replace="nothing">One section for every searchable root class.</tal:comment>
 | 
				
			||||||
  <tal:section repeat="rootClass python: [rc for rc in rootClasses if tool.userMaySearch(rc)]">
 | 
					  <tal:section repeat="rootClass python: [rc for rc in rootClasses if tool.userMaySearch(rc)]">
 | 
				
			||||||
    <tal:comment replace="nothing">Section title, with action icons</tal:comment>
 | 
					    <tal:comment replace="nothing">Section title, with action icons</tal:comment>
 | 
				
			||||||
    <dt tal:attributes="class python:test((repeat['rootClass'].number()==1) and not contextObj, 'portletAppyItem', 'portletAppyItem portletSep')">
 | 
					    <table width="100%"
 | 
				
			||||||
      <table width="100%" cellspacing="0" cellpadding="0" class="no-style-table">
 | 
					           tal:define="afUrl appFolder/absolute_url"
 | 
				
			||||||
        <tr>
 | 
					           tal:attributes="class python:test((repeat['rootClass'].number()==1) and not contextObj, '', 'portletSep')">
 | 
				
			||||||
          <td>
 | 
					     <tr>
 | 
				
			||||||
            <a tal:attributes="href python: '%s?type_name=%s' % (queryUrl, rootClass);
 | 
					      <td>
 | 
				
			||||||
                               class python:test(not currentSearch and (currentType==rootClass), 'portletCurrent', '')"
 | 
					       <a tal:attributes="href python: '%s?type_name=%s' % (queryUrl, rootClass);
 | 
				
			||||||
               tal:content="structure python: tool.translate(rootClass + '_plural')"></a>
 | 
					                          class python:test(not currentSearch and (currentType==rootClass), 'portletCurrent', '')"
 | 
				
			||||||
          </td>
 | 
					          tal:content="structure python: _(rootClass + '_plural')"></a>
 | 
				
			||||||
          <td align="right"
 | 
					      </td>
 | 
				
			||||||
              tal:define="addPermission python: '%s: Add %s' % (appName, rootClass);
 | 
					      <td align="right"
 | 
				
			||||||
                          userMayAdd python: member.has_permission(addPermission, appFolder);
 | 
					          tal:define="addPermission python: '%s: Add %s' % (appName, rootClass);
 | 
				
			||||||
                          createMeans python: tool.getCreateMeans(rootClass)">
 | 
					                      userMayAdd python: user.has_permission(addPermission, appFolder);
 | 
				
			||||||
            <tal:comment replace="nothing">Create a new object from a web form</tal:comment>
 | 
					                      createMeans python: tool.getCreateMeans(rootClass)">
 | 
				
			||||||
            <img style="cursor:pointer"
 | 
					       <tal:comment replace="nothing">Create a new object from a web form</tal:comment>
 | 
				
			||||||
                 tal:condition="python: ('form' in createMeans) and userMayAdd"
 | 
					       <img style="cursor:pointer"
 | 
				
			||||||
                 tal:attributes="onClick python: 'href: window.location=\'%s/skyn/do?action=Create&type_name=%s\'' % (appFolder.absolute_url(), rootClass);
 | 
					            tal:condition="python: ('form' in createMeans) and userMayAdd"
 | 
				
			||||||
                                 src string: $portal_url/skyn/plus.png;
 | 
					            tal:attributes="onClick python: 'href: window.location=\'%s/skyn/do?action=Create&type_name=%s\'' % (afUrl, rootClass);
 | 
				
			||||||
                                 title python: tool.translate('query_create')"/>
 | 
					                            src string: $appUrl/skyn/plus.png;
 | 
				
			||||||
            <tal:comment replace="nothing">Create (a) new object(s) by importing data</tal:comment>
 | 
					                            title python: _('query_create')"/>
 | 
				
			||||||
            <img style="cursor:pointer"
 | 
					       <tal:comment replace="nothing">Create (a) new object(s) by importing data</tal:comment>
 | 
				
			||||||
                 tal:condition="python: ('import' in createMeans) and userMayAdd"
 | 
					       <img style="cursor:pointer"
 | 
				
			||||||
                 tal:attributes="onClick python: 'href: window.location=\'%s/skyn/import?type_name=%s\'' % (appFolder.absolute_url(), rootClass);
 | 
					            tal:condition="python: ('import' in createMeans) and userMayAdd"
 | 
				
			||||||
                                 src string: $portal_url/skyn/import.png;
 | 
					            tal:attributes="onClick python: 'href: window.location=\'%s/skyn/import?type_name=%s\'' % (toolUrl, rootClass);
 | 
				
			||||||
                                 title python: tool.translate('query_import')"/>
 | 
					                            src string: $appUrl/skyn/import.png;
 | 
				
			||||||
            <tal:comment replace="nothing">Search objects of this type</tal:comment>
 | 
					                            title python: _('query_import')"/>
 | 
				
			||||||
            <img style="cursor:pointer"
 | 
					       <tal:comment replace="nothing">Search objects of this type</tal:comment>
 | 
				
			||||||
                 tal:define="showSearch python: tool.getAttr('enableAdvancedSearchFor%s' % rootClass)"
 | 
					       <img style="cursor:pointer"
 | 
				
			||||||
                 tal:condition="showSearch"
 | 
					            tal:define="showSearch python: tool.getAttr('enableAdvancedSearchFor%s' % rootClass)"
 | 
				
			||||||
                 tal:attributes="onClick python: 'href: window.location=\'%s/skyn/search?type_name=%s\'' % (appFolder.absolute_url(), rootClass);
 | 
					            tal:condition="showSearch"
 | 
				
			||||||
                                 src string: $portal_url/skyn/search.gif;
 | 
					            tal:attributes="onClick python: 'href: window.location=\'%s/skyn/search?type_name=%s\'' % (toolUrl, rootClass);
 | 
				
			||||||
                                 title python: tool.translate('search_objects')"/>
 | 
					                            src string: $appUrl/skyn/search.gif;
 | 
				
			||||||
          </td>
 | 
					                            title python: _('search_objects')"/>
 | 
				
			||||||
        </tr>
 | 
					      </td>
 | 
				
			||||||
      </table>
 | 
					     </tr>
 | 
				
			||||||
    </dt>
 | 
					    </table>
 | 
				
			||||||
    <tal:comment replace="nothing">Searches for this content type.</tal:comment>
 | 
					    <tal:comment replace="nothing">Searches for this content type.</tal:comment>
 | 
				
			||||||
    <tal:searchOrGroup repeat="searchOrGroup python: tool.getSearches(rootClass)">
 | 
					    <tal:searchOrGroup repeat="searchOrGroup python: tool.getSearches(rootClass)">
 | 
				
			||||||
      <tal:group condition="searchOrGroup/isGroup">
 | 
					      <tal:group condition="searchOrGroup/isGroup">
 | 
				
			||||||
| 
						 | 
					@ -106,28 +87,7 @@
 | 
				
			||||||
      </dt>
 | 
					      </dt>
 | 
				
			||||||
    </tal:searchOrGroup>
 | 
					    </tal:searchOrGroup>
 | 
				
			||||||
  </tal:section>
 | 
					  </tal:section>
 | 
				
			||||||
 | 
					</metal:portlet>
 | 
				
			||||||
  <tal:comment replace="nothing">
 | 
					 | 
				
			||||||
    Greyed transparent zone that is deployed on the
 | 
					 | 
				
			||||||
    whole screen when a popup is displayed.
 | 
					 | 
				
			||||||
  </tal:comment>
 | 
					 | 
				
			||||||
  <div id="appyGrey" class="appyGrey"></div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  <tal:comment replace="nothing">Popup for confirming an action</tal:comment>
 | 
					 | 
				
			||||||
  <div id="confirmActionPopup" class="appyPopup">
 | 
					 | 
				
			||||||
  <form id="confirmActionForm" method="post">
 | 
					 | 
				
			||||||
    <div align="center">
 | 
					 | 
				
			||||||
      <p id="appyConfirmText"></p>
 | 
					 | 
				
			||||||
      <input type="hidden" name="actionType"/>
 | 
					 | 
				
			||||||
      <input type="hidden" name="action"/>
 | 
					 | 
				
			||||||
      <input type="button" onClick="doConfirm()"
 | 
					 | 
				
			||||||
             tal:attributes="value python:tool.translate('yes')"/>
 | 
					 | 
				
			||||||
      <input type="button" value="No" onClick="closePopup('confirmActionPopup')"
 | 
					 | 
				
			||||||
             tal:attributes="value python:tool.translate('no')"/>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
  </form>
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
</metal:portletContent>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
<tal:comment replace="nothing">
 | 
					<tal:comment replace="nothing">
 | 
				
			||||||
   This macro displays, within the portlet, the navigation tree for the
 | 
					   This macro displays, within the portlet, the navigation tree for the
 | 
				
			||||||
| 
						 | 
					@ -135,48 +95,48 @@
 | 
				
			||||||
</tal:comment>
 | 
					</tal:comment>
 | 
				
			||||||
<metal:phases define-macro="phases">
 | 
					<metal:phases define-macro="phases">
 | 
				
			||||||
<table tal:define="phases contextObj/getAppyPhases|nothing;
 | 
					<table tal:define="phases contextObj/getAppyPhases|nothing;
 | 
				
			||||||
                   page python: request.get('page', 'main')"
 | 
					                   page python: req.get('page', 'main')"
 | 
				
			||||||
       tal:condition="python: phases and not ((len(phases)==1) and len(phases[0]['pages'])==1)"
 | 
					       tal:condition="python: phases and not ((len(phases)==1) and len(phases[0]['pages'])==1)"
 | 
				
			||||||
       cellspacing="1" cellpadding="2" width="100%">
 | 
					       width="100%">
 | 
				
			||||||
  <tal:phase repeat="phase phases">
 | 
					  <tal:phase repeat="phase phases">
 | 
				
			||||||
    <tal:comment replace="nothing">The box containing phase-related information</tal:comment>
 | 
					    <tal:comment replace="nothing">The box containing phase-related information</tal:comment>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
      <td tal:define="label python:'%s_phase_%s' % (contextObj.meta_type, phase['name']);
 | 
					      <td tal:define="label python:'%s_phase_%s' % (contextObj.meta_type, phase['name']);
 | 
				
			||||||
                      displayLink python: (phase['phaseStatus'] != 'Future') and ('/portal_factory' not in contextObj.absolute_url()) and (len(phase['pages']) == 1)"
 | 
					                      displayLink python: (phase['phaseStatus'] != 'Future') and ('/portal_factory' not in contextObj.absolute_url()) and (len(phase['pages']) == 1)"
 | 
				
			||||||
          tal:attributes="class python: (len(phases) > 1) and ('appyPhase step%s' % phase['phaseStatus']) or 'appyPhase'">
 | 
					          tal:attributes="class python: (len(phases) > 1) and 'phase' or ''">
 | 
				
			||||||
        <div class="portletGroup" tal:condition="python: len(phases) > 1">
 | 
					        <div class="portletGroup" tal:condition="python: len(phases) > 1">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <tal:comment replace="nothing">A single page in the phase</tal:comment>
 | 
					        <tal:comment replace="nothing">A single page in the phase</tal:comment>
 | 
				
			||||||
        <table tal:condition="displayLink" cellpadding="0" cellspacing="0" width="100%">
 | 
					        <table tal:condition="displayLink" width="100%">
 | 
				
			||||||
          <tr tal:define="pageName python: phase['pages'][0]">
 | 
					          <tr tal:define="pageName python: phase['pages'][0]">
 | 
				
			||||||
            <td><a tal:attributes="href python: contextObj.getUrl(page=pageName)"
 | 
					            <td><a tal:attributes="href python: contextObj.getUrl(page=pageName)"
 | 
				
			||||||
                   tal:content="structure python: tool.translate(label)"></a>
 | 
					                   tal:content="structure python: _(label)"></a>
 | 
				
			||||||
            </td>
 | 
					            </td>
 | 
				
			||||||
            <td align="right">
 | 
					            <td align="right">
 | 
				
			||||||
              <img title="Edit" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
 | 
					              <img title="Edit" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
 | 
				
			||||||
                   tal:attributes="onClick python: 'href: window.location=\'%s\'' % contextObj.getUrl(mode='edit', page=pageName);
 | 
					                   tal:attributes="onClick python: 'href: window.location=\'%s\'' % contextObj.getUrl(mode='edit', page=pageName);
 | 
				
			||||||
                                   src string: $portal_url/skyn/edit.gif"
 | 
					                                   src string: $appUrl/skyn/edit.gif"
 | 
				
			||||||
                   tal:condition="python: member.has_permission('Modify portal content', contextObj) and phase['pagesInfo'][pageName]['showOnEdit']"/>
 | 
					                   tal:condition="python: contextObj.allows('Modify portal content') and phase['pagesInfo'][pageName]['showOnEdit']"/>
 | 
				
			||||||
            </td>
 | 
					            </td>
 | 
				
			||||||
          </tr>
 | 
					          </tr>
 | 
				
			||||||
        </table>
 | 
					        </table>
 | 
				
			||||||
        <tal:comment replace="nothing">Several pages in the phase</tal:comment>
 | 
					        <tal:comment replace="nothing">Several pages in the phase</tal:comment>
 | 
				
			||||||
        <span tal:condition="not: displayLink" tal:replace="structure python: tool.translate(label)"/>
 | 
					        <span tal:condition="not: displayLink" tal:replace="structure python: _(label)"/>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="portletMenu">
 | 
					        <div class="portletMenu">
 | 
				
			||||||
        <table cellpadding="0" cellspacing="0" width="100%"
 | 
					        <table cellpadding="0" cellspacing="0" width="100%"
 | 
				
			||||||
               tal:condition="python: len(phase['pages']) > 1">
 | 
					               tal:condition="python: len(phase['pages']) > 1">
 | 
				
			||||||
          <tr tal:repeat="aPage phase/pages" valign="top">
 | 
					          <tr tal:repeat="aPage phase/pages" valign="top">
 | 
				
			||||||
            <td tal:attributes="class python: test(aPage == page, 'portletCurrent portletPageItem', 'portletPageItem')">
 | 
					            <td tal:attributes="class python: test(aPage == page, 'portletCurrent portletPage', 'portletPage')">
 | 
				
			||||||
              <a tal:attributes="href python: contextObj.getUrl(page=aPage)"
 | 
					              <a tal:attributes="href python: contextObj.getUrl(page=aPage)"
 | 
				
			||||||
                 tal:content="structure python: tool.translate('%s_page_%s' % (contextObj.meta_type, aPage))">
 | 
					                 tal:content="structure python: _('%s_page_%s' % (contextObj.meta_type, aPage))">
 | 
				
			||||||
              </a>
 | 
					              </a>
 | 
				
			||||||
            </td>
 | 
					            </td>
 | 
				
			||||||
            <td align="right">
 | 
					            <td align="right">
 | 
				
			||||||
              <img title="Edit" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
 | 
					              <img title="Edit" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
 | 
				
			||||||
                   tal:attributes="onClick python: 'href: window.location=\'%s\'' % contextObj.getUrl(mode='edit', page=aPage);
 | 
					                   tal:attributes="onClick python: 'href: window.location=\'%s\'' % contextObj.getUrl(mode='edit', page=aPage);
 | 
				
			||||||
                                   src string: $portal_url/skyn/edit.gif"
 | 
					                                   src string: $appUrl/skyn/edit.gif"
 | 
				
			||||||
                   tal:condition="python: member.has_permission('Modify portal content', contextObj) and phase['pagesInfo'][aPage]['showOnEdit']"/>
 | 
					                   tal:condition="python: user.has_permission('Modify portal content', contextObj) and phase['pagesInfo'][aPage]['showOnEdit']"/>
 | 
				
			||||||
            </td>
 | 
					            </td>
 | 
				
			||||||
          </tr>
 | 
					          </tr>
 | 
				
			||||||
        </table>
 | 
					        </table>
 | 
				
			||||||
| 
						 | 
					@ -185,7 +145,7 @@
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    <tal:comment replace="nothing">The down arrow pointing to the next phase (if any)</tal:comment>
 | 
					    <tal:comment replace="nothing">The down arrow pointing to the next phase (if any)</tal:comment>
 | 
				
			||||||
    <tr tal:condition="python: phase['name'] != phases[-1]['name']">
 | 
					    <tr tal:condition="python: phase['name'] != phases[-1]['name']">
 | 
				
			||||||
      <td>  <img tal:attributes="src string: $portal_url/skyn/nextPhase.png"/></td>
 | 
					      <td>  <img tal:attributes="src string: $appUrl/skyn/nextPhase.png"/></td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
  </tal:phase>
 | 
					  </tal:phase>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,22 +1,8 @@
 | 
				
			||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
 | 
					<tal:main define="tool context/getParentNode">
 | 
				
			||||||
      metal:use-macro="here/main_template/macros/master">
 | 
					<html metal:use-macro="context/skyn/template/macros/main">
 | 
				
			||||||
 | 
					 <metal:fill fill-slot="content"
 | 
				
			||||||
<tal:comment replace="nothing">This page presents results of queries</tal:comment>
 | 
					   tal:define="contentType request/type_name;
 | 
				
			||||||
<body>
 | 
					               searchName request/search|python:''">
 | 
				
			||||||
 | 
					 | 
				
			||||||
<tal:comment replace="nothing">Disable standard Plone green tabs</tal:comment>
 | 
					 | 
				
			||||||
<div metal:fill-slot="top_slot">
 | 
					 | 
				
			||||||
  <metal:block metal:use-macro="here/global_defines/macros/defines" />
 | 
					 | 
				
			||||||
  <div tal:define="dummy python:request.set('disable_border', 1)" />
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<tal:comment replace="nothing">We suppose we are in the app folder here.</tal:comment>
 | 
					 | 
				
			||||||
<div metal:fill-slot="main"
 | 
					 | 
				
			||||||
     tal:define="appFolder context/getParentNode;
 | 
					 | 
				
			||||||
                 appName appFolder/id;
 | 
					 | 
				
			||||||
                 tool python: portal.get('portal_%s' % appName.lower());
 | 
					 | 
				
			||||||
                 contentType request/type_name;
 | 
					 | 
				
			||||||
                 searchName request/search|python:''">
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <div metal:use-macro="here/skyn/page/macros/prologue"/>
 | 
					  <div metal:use-macro="here/skyn/page/macros/prologue"/>
 | 
				
			||||||
  <tal:comment replace="nothing">Query result</tal:comment>
 | 
					  <tal:comment replace="nothing">Query result</tal:comment>
 | 
				
			||||||
| 
						 | 
					@ -26,6 +12,6 @@
 | 
				
			||||||
    tal:define="ajaxUrl python: tool.getQueryUrl(contentType, searchName)"
 | 
					    tal:define="ajaxUrl python: tool.getQueryUrl(contentType, searchName)"
 | 
				
			||||||
    tal:content="python: 'askQueryResult(\'queryResult\', \'%s\',\'%s\',\'%s\',0)' % (tool.absolute_url(), contentType, searchName)">
 | 
					    tal:content="python: 'askQueryResult(\'queryResult\', \'%s\',\'%s\',\'%s\',0)' % (tool.absolute_url(), contentType, searchName)">
 | 
				
			||||||
  </script>
 | 
					  </script>
 | 
				
			||||||
</div>
 | 
					 </metal:fill>
 | 
				
			||||||
</body>
 | 
					 | 
				
			||||||
</html>
 | 
					</html>
 | 
				
			||||||
 | 
					</tal:main>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,5 @@
 | 
				
			||||||
<metal:queryResults define-macro="queryResult"
 | 
					<metal:queryResults define-macro="queryResult"
 | 
				
			||||||
   tal:define="tool          python: contextObj;
 | 
					   tal:define="contentType   request/type_name;
 | 
				
			||||||
               contentType   request/type_name;
 | 
					 | 
				
			||||||
               refInfo       tool/getRefInfo;
 | 
					               refInfo       tool/getRefInfo;
 | 
				
			||||||
               refField      python: refInfo[1];
 | 
					               refField      python: refInfo[1];
 | 
				
			||||||
               refInfo       python: refInfo[0];
 | 
					               refInfo       python: refInfo[0];
 | 
				
			||||||
| 
						 | 
					@ -21,7 +20,7 @@
 | 
				
			||||||
               batchSize     queryResult/batchSize;
 | 
					               batchSize     queryResult/batchSize;
 | 
				
			||||||
               ajaxHookId    python:'queryResult';
 | 
					               ajaxHookId    python:'queryResult';
 | 
				
			||||||
               navBaseCall   python: 'askQueryResult(\'%s\',\'%s\',\'%s\',\'%s\',**v**)' % (ajaxHookId, tool.absolute_url(), contentType, searchName);
 | 
					               navBaseCall   python: 'askQueryResult(\'%s\',\'%s\',\'%s\',\'%s\',**v**)' % (ajaxHookId, tool.absolute_url(), contentType, searchName);
 | 
				
			||||||
               newSearchUrl  python: '%s/skyn/search?type_name=%s&ref=%s' % (tool.getAppFolder().absolute_url(), contentType, refInfo);">
 | 
					               newSearchUrl  python: '%s/skyn/search?type_name=%s&ref=%s' % (tool.absolute_url(), contentType, refInfo);">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:result condition="objs">
 | 
					  <tal:result condition="objs">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,7 +35,7 @@
 | 
				
			||||||
    </legend>
 | 
					    </legend>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <tal:comment replace="nothing">Display here POD templates if required.</tal:comment>
 | 
					    <tal:comment replace="nothing">Display here POD templates if required.</tal:comment>
 | 
				
			||||||
    <table align="right" cellpadding="0" cellspacing="0"
 | 
					    <table align="right"
 | 
				
			||||||
           tal:define="widgets python: tool.getResultPodFields(contentType);
 | 
					           tal:define="widgets python: tool.getResultPodFields(contentType);
 | 
				
			||||||
                       layoutType python:'view'"
 | 
					                       layoutType python:'view'"
 | 
				
			||||||
           tal:condition="python: objs and widgets">
 | 
					           tal:condition="python: objs and widgets">
 | 
				
			||||||
| 
						 | 
					@ -46,7 +45,7 @@
 | 
				
			||||||
      </td></tr>
 | 
					      </td></tr>
 | 
				
			||||||
    </table>
 | 
					    </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <table cellpadding="0" cellspacing="0" width="100%">
 | 
					    <table width="100%">
 | 
				
			||||||
     <tr>
 | 
					     <tr>
 | 
				
			||||||
      <tal:descr condition="searchName">
 | 
					      <tal:descr condition="searchName">
 | 
				
			||||||
      <td tal:define="descr python: tool.translate('%s_descr' % labelId)"
 | 
					      <td tal:define="descr python: tool.translate('%s_descr' % labelId)"
 | 
				
			||||||
| 
						 | 
					@ -63,7 +62,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <table tal:define="fieldNames python: tool.getResultColumnsNames(contentType, refField);
 | 
					    <table tal:define="fieldNames python: tool.getResultColumnsNames(contentType, refField);
 | 
				
			||||||
                       widgets python: objs[0].getAppyTypesFromNames(fieldNames);"
 | 
					                       widgets python: objs[0].getAppyTypesFromNames(fieldNames);"
 | 
				
			||||||
           class="listing nosort" width="100%" cellpadding="0" cellspacing="0">
 | 
					           class="list" width="100%">
 | 
				
			||||||
    <tal:comment replace="nothing">Headers, with filters and sort arrows</tal:comment>
 | 
					    <tal:comment replace="nothing">Headers, with filters and sort arrows</tal:comment>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
      <tal:header repeat="widget widgets">
 | 
					      <tal:header repeat="widget widgets">
 | 
				
			||||||
| 
						 | 
					@ -118,21 +117,21 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <tal:comment replace="nothing">Column "Actions"</tal:comment>
 | 
					      <tal:comment replace="nothing">Column "Actions"</tal:comment>
 | 
				
			||||||
      <td align="right">
 | 
					      <td align="right">
 | 
				
			||||||
        <table class="no-style-table" cellpadding="0" cellspacing="0">
 | 
					        <table class="noStyle">
 | 
				
			||||||
          <tr>
 | 
					          <tr>
 | 
				
			||||||
            <tal:comment replace="nothing">Edit the element</tal:comment>
 | 
					            <tal:comment replace="nothing">Edit the element</tal:comment>
 | 
				
			||||||
            <td class="noPadding">
 | 
					            <td>
 | 
				
			||||||
              <a tal:define="navInfo python:'search.%s.%s.%d.%d' % (contentType, searchName, repeat['obj'].number()+startNumber, totalNumber);"
 | 
					              <a tal:define="navInfo python:'search.%s.%s.%d.%d' % (contentType, searchName, repeat['obj'].number()+startNumber, totalNumber);"
 | 
				
			||||||
                 tal:attributes="href python: obj.getUrl(mode='edit', page='main', nav=navInfo)"
 | 
					                 tal:attributes="href python: obj.getUrl(mode='edit', page='main', nav=navInfo)"
 | 
				
			||||||
                 tal:condition="python: member.has_permission('Modify portal content', obj)">
 | 
					                 tal:condition="python: obj.allows('Modify portal content')">
 | 
				
			||||||
                <img title="Edit" i18n:domain="plone" i18n:attributes="title"
 | 
					                <img title="Edit" i18n:domain="plone" i18n:attributes="title"
 | 
				
			||||||
                     tal:attributes="src string: $portal_url/skyn/edit.gif"/>
 | 
					                     tal:attributes="src string: $appUrl/skyn/edit.gif"/>
 | 
				
			||||||
            </a></td>
 | 
					            </a></td>
 | 
				
			||||||
            <tal:comment replace="nothing">Delete the element</tal:comment>
 | 
					            <tal:comment replace="nothing">Delete the element</tal:comment>
 | 
				
			||||||
            <td class="noPadding">
 | 
					            <td>
 | 
				
			||||||
              <img tal:condition="python: member.has_permission('Delete objects', obj) and obj.mayDelete()"
 | 
					              <img tal:condition="python: obj.allows('Delete objects') and obj.mayDelete()"
 | 
				
			||||||
                   title="Delete" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
 | 
					                   title="Delete" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
 | 
				
			||||||
                   tal:attributes="src string: $portal_url/skyn/delete.png;
 | 
					                   tal:attributes="src string: $appUrl/skyn/delete.png;
 | 
				
			||||||
                                   onClick python:'onDeleteObject(\'%s\')' % obj.UID()"/>
 | 
					                                   onClick python:'onDeleteObject(\'%s\')' % obj.UID()"/>
 | 
				
			||||||
            </td>
 | 
					            </td>
 | 
				
			||||||
          </tr>
 | 
					          </tr>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 433 B After Width: | Height: | Size: 189 B  | 
| 
						 | 
					@ -1,43 +1,16 @@
 | 
				
			||||||
<tal:search metal:define-macro="master"
 | 
					<tal:main define="tool context/getParentNode">
 | 
				
			||||||
     define="appFolder context/getParentNode;
 | 
					<html metal:use-macro="context/skyn/template/macros/main">
 | 
				
			||||||
             contentType request/type_name;
 | 
					 <metal:fill fill-slot="content"
 | 
				
			||||||
             refInfo request/ref|nothing;
 | 
					   tal:define="contentType request/type_name;
 | 
				
			||||||
             tool python: here.portal_url.getPortalObject().get('portal_%s' % appFolder.id.lower());
 | 
					               refInfo request/ref|nothing;
 | 
				
			||||||
             searchInfo python: tool.getSearchInfo(contentType, refInfo);
 | 
					               searchInfo python: tool.getSearchInfo(contentType, refInfo);
 | 
				
			||||||
             cssJs python: tool.getCssAndJs(searchInfo['fields'], 'edit')">
 | 
					               cssJs python: tool.getCssAndJs(searchInfo['fields'], 'edit')">
 | 
				
			||||||
 | 
					 | 
				
			||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
 | 
					 | 
				
			||||||
      lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal"
 | 
					 | 
				
			||||||
      xmlns:metal="http://xml.zope.org/namespaces/metal"
 | 
					 | 
				
			||||||
      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
 | 
					 | 
				
			||||||
      metal:use-macro="here/main_template/macros/master">
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  <tal:comment replace="nothing">Disable standard Plone green tabs</tal:comment>
 | 
					 | 
				
			||||||
  <div metal:fill-slot="top_slot">
 | 
					 | 
				
			||||||
    <metal:block metal:use-macro="here/global_defines/macros/defines" />
 | 
					 | 
				
			||||||
    <div tal:define="dummy python:request.set('disable_border', 1)" />
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:comment replace="nothing">Include type-specific CSS and JS.</tal:comment>
 | 
					  <tal:comment replace="nothing">Include type-specific CSS and JS.</tal:comment>
 | 
				
			||||||
  <metal:js fill-slot="javascript_head_slot">
 | 
					  <link tal:repeat="cssFile cssJs/css" rel="stylesheet" type="text/css"
 | 
				
			||||||
    <tal:js condition="cssJs/js" repeat="jsFile cssJs/js">
 | 
					        tal:attributes="href string:$appUrl/skyn/$cssFile"/>
 | 
				
			||||||
      <script type="text/javascript" charset="iso-8859-1"
 | 
					  <script tal:repeat="jsFile cssJs/js" type="text/javascript"
 | 
				
			||||||
              tal:condition="python:exists('portal/%s' % jsFile)"
 | 
					          tal:attributes="src string:$appUrl/skyn/$jsFile"></script>
 | 
				
			||||||
              tal:attributes="src string:$portal_url/$jsFile">
 | 
					 | 
				
			||||||
      </script>
 | 
					 | 
				
			||||||
    </tal:js>
 | 
					 | 
				
			||||||
  </metal:js>
 | 
					 | 
				
			||||||
  <metal:css fill-slot="css_slot">
 | 
					 | 
				
			||||||
    <tal:css condition="cssJs/css" repeat="cssFile cssJs/css">
 | 
					 | 
				
			||||||
      <style type="text/css" media="all"
 | 
					 | 
				
			||||||
             tal:condition="python:exists('portal/%s' % cssFile)"
 | 
					 | 
				
			||||||
             tal:content="structure string:<!-- @import url($portal_url/$cssFile); -->">
 | 
					 | 
				
			||||||
      </style>
 | 
					 | 
				
			||||||
    </tal:css>
 | 
					 | 
				
			||||||
  </metal:css>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  <body>
 | 
					 | 
				
			||||||
  <metal:fill fill-slot="main">
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:comment replace="nothing">Search title</tal:comment>  
 | 
					  <tal:comment replace="nothing">Search title</tal:comment>  
 | 
				
			||||||
  <h1><span tal:replace="python: tool.translate('%s_plural' % contentType)"/> —
 | 
					  <h1><span tal:replace="python: tool.translate('%s_plural' % contentType)"/> —
 | 
				
			||||||
| 
						 | 
					@ -49,7 +22,7 @@
 | 
				
			||||||
    <input type="hidden" name="type_name" tal:attributes="value contentType"/>
 | 
					    <input type="hidden" name="type_name" tal:attributes="value contentType"/>
 | 
				
			||||||
    <input tal:condition="refInfo" type="hidden" name="ref" tal:attributes="value refInfo"/>
 | 
					    <input tal:condition="refInfo" type="hidden" name="ref" tal:attributes="value refInfo"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <table class="no-style-table" cellpadding="0" cellspacing="0" width="100%">
 | 
					    <table width="100%">
 | 
				
			||||||
      <tr tal:repeat="searchRow python: tool.tabularize(searchInfo['fieldDicts'], searchInfo['nbOfColumns'])"
 | 
					      <tr tal:repeat="searchRow python: tool.tabularize(searchInfo['fieldDicts'], searchInfo['nbOfColumns'])"
 | 
				
			||||||
          valign="top">
 | 
					          valign="top">
 | 
				
			||||||
        <td tal:repeat="widget searchRow" tal:attributes="width python:'%d%%' % (100/searchInfo['nbOfColumns'])">
 | 
					        <td tal:repeat="widget searchRow" tal:attributes="width python:'%d%%' % (100/searchInfo['nbOfColumns'])">
 | 
				
			||||||
| 
						 | 
					@ -69,7 +42,6 @@
 | 
				
			||||||
    <input type="submit" tal:attributes="value python:tool.translate('search_button')"/>
 | 
					    <input type="submit" tal:attributes="value python:tool.translate('search_button')"/>
 | 
				
			||||||
  </p>
 | 
					  </p>
 | 
				
			||||||
  </form>
 | 
					  </form>
 | 
				
			||||||
</metal:fill>
 | 
					 </metal:fill>
 | 
				
			||||||
</body>
 | 
					 | 
				
			||||||
</html>
 | 
					</html>
 | 
				
			||||||
</tal:search>
 | 
					</tal:main>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,14 +1,16 @@
 | 
				
			||||||
<html metal:define-macro="main"
 | 
					<html metal:define-macro="main"
 | 
				
			||||||
      tal:define="user context/portal_membership/getAuthenticatedMember;
 | 
					      tal:define="user context/portal_membership/getAuthenticatedMember;
 | 
				
			||||||
                  isAnon python: user.getUserName() == 'Anonymous User';
 | 
					                  isAnon python: user.getUserName() == 'Anonymous User';
 | 
				
			||||||
                  app python: tool.getParentNode();
 | 
					                  app tool/getApp;
 | 
				
			||||||
                  appUrl app/absolute_url;
 | 
					                  appUrl app/absolute_url;
 | 
				
			||||||
 | 
					                  appFolder tool/getAppFolder;
 | 
				
			||||||
 | 
					                  appName appFolder/getId;
 | 
				
			||||||
                  _ python: tool.translate;
 | 
					                  _ python: tool.translate;
 | 
				
			||||||
                  req python: request;
 | 
					                  req python: request;
 | 
				
			||||||
                  resp req/RESPONSE;
 | 
					                  resp req/RESPONSE;
 | 
				
			||||||
                  x python: resp.setHeader('Content-Type', 'text/html;;charset=utf-8');
 | 
					                  x python: resp.setHeader('Content-Type', 'text/html;;charset=utf-8');
 | 
				
			||||||
                  x python: resp.setHeader('Expires', 'Thu, 11 Dec 1975 12:05:00 GMT+2');
 | 
					                  x python: resp.setHeader('Expires', 'Thu, 11 Dec 1975 12:05:00 GMT+2');
 | 
				
			||||||
                  x python: resp.setHeader('Content-Language', request.get('language', 'en'))">
 | 
					                  x python: resp.setHeader('Content-Language', req.get('language', 'en'))">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<head>
 | 
					<head>
 | 
				
			||||||
  <title tal:content="tool/getAppName"></title>
 | 
					  <title tal:content="tool/getAppName"></title>
 | 
				
			||||||
| 
						 | 
					@ -17,14 +19,14 @@
 | 
				
			||||||
</head>
 | 
					</head>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<body>
 | 
					<body>
 | 
				
			||||||
<table class="main" align="center">
 | 
					<table class="main" align="center" cellpadding="0">
 | 
				
			||||||
 <tal:comment replace="nothing">Top banner</tal:comment>
 | 
					 <tal:comment replace="nothing">Top banner</tal:comment>
 | 
				
			||||||
 <tr class="top" metal:define-slot="top">
 | 
					 <tr class="top" metal:define-slot="top">
 | 
				
			||||||
  <td>
 | 
					  <td>
 | 
				
			||||||
   <table width="100%">
 | 
					   <table width="100%">
 | 
				
			||||||
    <tr valign="top">
 | 
					    <tr valign="top">
 | 
				
			||||||
     <tal:comment replace="nothing">Logo</tal:comment>
 | 
					     <tal:comment replace="nothing">Logo</tal:comment>
 | 
				
			||||||
     <td><a tal:attributes="href appUrl"><img src="skyn/logo.jpg"/></a></td>
 | 
					     <td><a tal:attributes="href appUrl"><img tal:attributes="src string: $appUrl/skyn/logo.jpg"/></a></td>
 | 
				
			||||||
     <tal:comment replace="nothing">Language selector (links or listbox)</tal:comment>
 | 
					     <tal:comment replace="nothing">Language selector (links or listbox)</tal:comment>
 | 
				
			||||||
     <td align="right"
 | 
					     <td align="right"
 | 
				
			||||||
         tal:define="appLangs app/portal_languages/listSupportedLanguages;
 | 
					         tal:define="appLangs app/portal_languages/listSupportedLanguages;
 | 
				
			||||||
| 
						 | 
					@ -55,6 +57,31 @@
 | 
				
			||||||
   </table>
 | 
					   </table>
 | 
				
			||||||
  </td>
 | 
					  </td>
 | 
				
			||||||
 </tr>
 | 
					 </tr>
 | 
				
			||||||
 | 
					 <tal:comment replace="nothing">The message strip</tal:comment>
 | 
				
			||||||
 | 
					 <tr>
 | 
				
			||||||
 | 
					  <td>
 | 
				
			||||||
 | 
					   <div style="position: relative" align="right">
 | 
				
			||||||
 | 
					    <metal:msg use-macro="app/skyn/page/macros/message"/>
 | 
				
			||||||
 | 
					   </div>
 | 
				
			||||||
 | 
					   <tal:comment replace="nothing">Grey background shown when popups are shown</tal:comment>
 | 
				
			||||||
 | 
					   <div id="grey" class="grey"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   <tal:comment replace="nothing">Popup for confirming an action</tal:comment>
 | 
				
			||||||
 | 
					    <div id="confirmActionPopup" class="popup">
 | 
				
			||||||
 | 
					    <form id="confirmActionForm" method="post">
 | 
				
			||||||
 | 
					     <div align="center">
 | 
				
			||||||
 | 
					      <p id="appyConfirmText"></p>
 | 
				
			||||||
 | 
					      <input type="hidden" name="actionType"/>
 | 
				
			||||||
 | 
					      <input type="hidden" name="action"/>
 | 
				
			||||||
 | 
					      <input type="button" onClick="doConfirm()"
 | 
				
			||||||
 | 
					             tal:attributes="value python:_('yes')"/>
 | 
				
			||||||
 | 
					      <input type="button" value="No" onClick="closePopup('confirmActionPopup')"
 | 
				
			||||||
 | 
					             tal:attributes="value python:_('no')"/>
 | 
				
			||||||
 | 
					     </div>
 | 
				
			||||||
 | 
					    </form>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  </td>
 | 
				
			||||||
 | 
					 </tr>
 | 
				
			||||||
 <tal:comment replace="nothing">The user data strip</tal:comment>
 | 
					 <tal:comment replace="nothing">The user data strip</tal:comment>
 | 
				
			||||||
 <tr>
 | 
					 <tr>
 | 
				
			||||||
  <td>
 | 
					  <td>
 | 
				
			||||||
| 
						 | 
					@ -88,12 +115,17 @@
 | 
				
			||||||
        <td>
 | 
					        <td>
 | 
				
			||||||
         <!-- Go home -->
 | 
					         <!-- Go home -->
 | 
				
			||||||
         <a tal:attributes="href appUrl; title python: _('home')">
 | 
					         <a tal:attributes="href appUrl; title python: _('home')">
 | 
				
			||||||
          <img src="skyn/home.gif"/>
 | 
					          <img tal:attributes="src string: $appUrl/skyn/home.gif"/>
 | 
				
			||||||
         </a>
 | 
					         </a>
 | 
				
			||||||
 | 
					         <!-- Config -->
 | 
				
			||||||
 | 
					         <img style="cursor:pointer" tal:condition="python: user.has_role('Manager')"
 | 
				
			||||||
 | 
					           tal:attributes="onClick python: 'href: window.location=\'%s\'' % tool.getUrl(page='main', nav='');
 | 
				
			||||||
 | 
					                           title python: _('%sTool' % appName);
 | 
				
			||||||
 | 
					                           src string:$appUrl/skyn/appyConfig.gif"/>
 | 
				
			||||||
         <!-- Logout -->
 | 
					         <!-- Logout -->
 | 
				
			||||||
         <a tal:attributes="href python: tool.absolute_url() + '/performLogout';
 | 
					         <a tal:attributes="href python: tool.absolute_url() + '/performLogout';
 | 
				
			||||||
                            title python: _('logout')">
 | 
					                            title python: _('logout')">
 | 
				
			||||||
          <img src="skyn/logout.gif"/>
 | 
					          <img tal:attributes="src string: $appUrl/skyn/logout.gif"/>
 | 
				
			||||||
         </a>
 | 
					         </a>
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
       </tr>
 | 
					       </tr>
 | 
				
			||||||
| 
						 | 
					@ -103,20 +135,16 @@
 | 
				
			||||||
   </table>
 | 
					   </table>
 | 
				
			||||||
  </td>
 | 
					  </td>
 | 
				
			||||||
 </tr>
 | 
					 </tr>
 | 
				
			||||||
 <tal:comment replace="nothing">The message strip</tal:comment>
 | 
					 | 
				
			||||||
 <tr tal:define="msg request/portal_status_message | nothing">
 | 
					 | 
				
			||||||
  <td>
 | 
					 | 
				
			||||||
   <div style="position: relative" align="right">
 | 
					 | 
				
			||||||
    <div tal:condition="msg" class="message" tal:content="structure msg"></div>
 | 
					 | 
				
			||||||
   </div>
 | 
					 | 
				
			||||||
  </td>
 | 
					 | 
				
			||||||
 </tr>
 | 
					 | 
				
			||||||
 <tr>
 | 
					 <tr>
 | 
				
			||||||
  <td>
 | 
					  <td>
 | 
				
			||||||
    <table class="content" width="100%">
 | 
					    <table width="99%">
 | 
				
			||||||
     <tr>
 | 
					     <tr valign="top">
 | 
				
			||||||
      <td><span metal:define-slot="content"></span>
 | 
					      <tal:comment replace="nothing">Portlet</tal:comment>
 | 
				
			||||||
 | 
					      <td tal:condition="python: tool.showPortlet(context)" class="portlet">
 | 
				
			||||||
 | 
					        <metal:portlet use-macro="app/skyn/portlet/macros/portlet"/>
 | 
				
			||||||
      </td>
 | 
					      </td>
 | 
				
			||||||
 | 
					      <tal:comment replace="nothing">Page content</tal:comment>
 | 
				
			||||||
 | 
					      <td class="content"><span metal:define-slot="content"></span></td>
 | 
				
			||||||
     </tr> 
 | 
					     </tr> 
 | 
				
			||||||
    </table>
 | 
					    </table>
 | 
				
			||||||
   </td> 
 | 
					   </td> 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,34 +1,17 @@
 | 
				
			||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
 | 
					<tal:main define="tool context/getTool">
 | 
				
			||||||
      lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal"
 | 
					<html metal:use-macro="context/skyn/template/macros/main">
 | 
				
			||||||
      xmlns:metal="http://xml.zope.org/namespaces/metal"
 | 
					 <metal:fill fill-slot="content"
 | 
				
			||||||
      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
 | 
					    tal:define="contextObj   python:context.getParentNode();
 | 
				
			||||||
      metal:use-macro="here/main_template/macros/master">
 | 
					                portal_type  python:here.getPortalTypeName().lower().replace(' ', '_');
 | 
				
			||||||
 | 
					                errors       python:req.get('errors', {});
 | 
				
			||||||
  <head><title></title></head>
 | 
					                layoutType   python:'view';
 | 
				
			||||||
 | 
					                layout       python: contextObj.getPageLayout(layoutType);
 | 
				
			||||||
  <tal:comment replace="nothing">Disable standard Plone green tabs</tal:comment>
 | 
					                phaseInfo    python: contextObj.getAppyPhases(currentOnly=True, layoutType='view');
 | 
				
			||||||
  <div metal:fill-slot="top_slot">
 | 
					                page         req/page|python:'main';
 | 
				
			||||||
    <metal:block metal:use-macro="here/global_defines/macros/defines" />
 | 
					                phase        phaseInfo/name;">
 | 
				
			||||||
    <div tal:define="dummy python:request.set('disable_border', 1)" />
 | 
					    <metal:prologue use-macro="here/skyn/page/macros/prologue"/>
 | 
				
			||||||
  </div>
 | 
					    <metal:show     use-macro="here/skyn/page/macros/show"/>
 | 
				
			||||||
 | 
					    <metal:footer   use-macro="here/skyn/page/macros/footer"/>
 | 
				
			||||||
  <tal:comment replace="nothing">Fill main slot of Plone main_template</tal:comment>
 | 
					   </metal:fill>
 | 
				
			||||||
  <body>
 | 
					 | 
				
			||||||
    <metal:fill fill-slot="main"
 | 
					 | 
				
			||||||
      tal:define="contextObj   python:context.getParentNode();
 | 
					 | 
				
			||||||
                  portal_type  python:here.getPortalTypeName().lower().replace(' ', '_');
 | 
					 | 
				
			||||||
                  errors       python:request.get('errors', {});
 | 
					 | 
				
			||||||
                  layoutType   python:'view';
 | 
					 | 
				
			||||||
                  layout       python: contextObj.getPageLayout(layoutType);
 | 
					 | 
				
			||||||
                  tool         contextObj/getTool;
 | 
					 | 
				
			||||||
                  appFolder    tool/getAppFolder;
 | 
					 | 
				
			||||||
                  appName      appFolder/getId;
 | 
					 | 
				
			||||||
                  phaseInfo    python: contextObj.getAppyPhases(currentOnly=True, layoutType='view');
 | 
					 | 
				
			||||||
                  page         request/page|python:'main';
 | 
					 | 
				
			||||||
                  phase        phaseInfo/name;">
 | 
					 | 
				
			||||||
      <metal:prologue use-macro="here/skyn/page/macros/prologue"/>
 | 
					 | 
				
			||||||
      <metal:show     use-macro="here/skyn/page/macros/show"/>
 | 
					 | 
				
			||||||
      <metal:footer   use-macro="here/skyn/page/macros/footer"/>
 | 
					 | 
				
			||||||
    </metal:fill>
 | 
					 | 
				
			||||||
  </body>
 | 
					 | 
				
			||||||
</html>
 | 
					</html>
 | 
				
			||||||
 | 
					</tal:main>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,17 +20,17 @@
 | 
				
			||||||
                        widget python: contextObj.getAppyType(name, asDict=True);
 | 
					                        widget python: contextObj.getAppyType(name, asDict=True);
 | 
				
			||||||
                        value python: contextObj.getFieldValue(name);
 | 
					                        value python: contextObj.getFieldValue(name);
 | 
				
			||||||
                        sync python:True">
 | 
					                        sync python:True">
 | 
				
			||||||
  <metal:call use-macro="portal/skyn/widgets/computed/macros/view"/>
 | 
					  <metal:call use-macro="app/skyn/widgets/computed/macros/view"/>
 | 
				
			||||||
</metal:view>
 | 
					</metal:view>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<tal:comment replace="nothing">Edit macro for a Computed.</tal:comment>
 | 
					<tal:comment replace="nothing">Edit macro for a Computed.</tal:comment>
 | 
				
			||||||
<metal:edit define-macro="edit">
 | 
					<metal:edit define-macro="edit">
 | 
				
			||||||
  <metal:call use-macro="portal/skyn/widgets/computed/macros/view"/>
 | 
					  <metal:call use-macro="app/skyn/widgets/computed/macros/view"/>
 | 
				
			||||||
</metal:edit>
 | 
					</metal:edit>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<tal:comment replace="nothing">Cell macro for a Computed.</tal:comment>
 | 
					<tal:comment replace="nothing">Cell macro for a Computed.</tal:comment>
 | 
				
			||||||
<metal:cell define-macro="cell">
 | 
					<metal:cell define-macro="cell">
 | 
				
			||||||
  <metal:call use-macro="portal/skyn/widgets/computed/macros/view"/>
 | 
					  <metal:call use-macro="app/skyn/widgets/computed/macros/view"/>
 | 
				
			||||||
</metal:cell>
 | 
					</metal:cell>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<tal:comment replace="nothing">Search macro for a Computed.</tal:comment>
 | 
					<tal:comment replace="nothing">Search macro for a Computed.</tal:comment>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,7 +44,7 @@
 | 
				
			||||||
  </select>
 | 
					  </select>
 | 
				
			||||||
  <tal:comment replace="nothing">The icon for displaying the calendar (=date chooser)</tal:comment>
 | 
					  <tal:comment replace="nothing">The icon for displaying the calendar (=date chooser)</tal:comment>
 | 
				
			||||||
  <a tal:condition="widget/calendar"
 | 
					  <a tal:condition="widget/calendar"
 | 
				
			||||||
     tal:attributes="onclick python: 'return showJsCalendar(\'%s_month\', \'%s\', \'%s_year\', \'%s_month\', \'%s_day\', null, null, %d, %d)' % (name, dummyName, name, name, name, years[0], years[-1])"><img tal:attributes="src string: $portal_url/popup_calendar.gif"/></a>
 | 
					     tal:attributes="onclick python: 'return showJsCalendar(\'%s_month\', \'%s\', \'%s_year\', \'%s_month\', \'%s_day\', null, null, %d, %d)' % (name, dummyName, name, name, name, years[0], years[-1])"><img tal:attributes="src string: $appUrl/calendar.gif"/></a>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:hour condition="python: widget['format'] == 0">
 | 
					  <tal:hour condition="python: widget['format'] == 0">
 | 
				
			||||||
    <select tal:define="hours python:range(0,24);"
 | 
					    <select tal:define="hours python:range(0,24);"
 | 
				
			||||||
| 
						 | 
					@ -111,7 +111,7 @@
 | 
				
			||||||
       <tal:comment replace="nothing">The icon for displaying the calendar (=date chooser)</tal:comment>
 | 
					       <tal:comment replace="nothing">The icon for displaying the calendar (=date chooser)</tal:comment>
 | 
				
			||||||
       <a tal:condition="widget/calendar"
 | 
					       <a tal:condition="widget/calendar"
 | 
				
			||||||
          tal:attributes="onclick python: 'return showJsCalendar(\'%s\', \'%s\', \'%s\', \'%s\', \'%s\', null, null, %d, %d)' % (monthFromName, dummyFromName, yearFromName, monthFromName, dayFromName, years[0], years[-1])">
 | 
					          tal:attributes="onclick python: 'return showJsCalendar(\'%s\', \'%s\', \'%s\', \'%s\', \'%s\', null, null, %d, %d)' % (monthFromName, dummyFromName, yearFromName, monthFromName, dayFromName, years[0], years[-1])">
 | 
				
			||||||
          <img tal:attributes="src string: $portal_url/popup_calendar.gif"/></a>
 | 
					          <img tal:attributes="src string: $appUrl/calendar.gif"/></a>
 | 
				
			||||||
      </td>
 | 
					      </td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    <tal:comment replace="nothing">To</tal:comment>
 | 
					    <tal:comment replace="nothing">To</tal:comment>
 | 
				
			||||||
| 
						 | 
					@ -142,7 +142,7 @@
 | 
				
			||||||
        </select>
 | 
					        </select>
 | 
				
			||||||
       <a tal:condition="widget/calendar"
 | 
					       <a tal:condition="widget/calendar"
 | 
				
			||||||
          tal:attributes="onclick python: 'return showJsCalendar(\'%s\', \'%s\', \'%s\', \'%s\', \'%s\', null, null, %d, %d)' % (monthToName, dummyToName, yearToName, monthToName, dayToName, years[0], years[-1])">
 | 
					          tal:attributes="onclick python: 'return showJsCalendar(\'%s\', \'%s\', \'%s\', \'%s\', \'%s\', null, null, %d, %d)' % (monthToName, dummyToName, yearToName, monthToName, dayToName, years[0], years[-1])">
 | 
				
			||||||
          <img tal:attributes="src string: $portal_url/popup_calendar.gif"/></a>
 | 
					          <img tal:attributes="src string: $appUrl/calendar.gif"/></a>
 | 
				
			||||||
      </td>
 | 
					      </td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
  </table>
 | 
					  </table>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@
 | 
				
			||||||
                        imageSrc string:${contextObj/absolute_url}/download?name=$name">
 | 
					                        imageSrc string:${contextObj/absolute_url}/download?name=$name">
 | 
				
			||||||
  <tal:file condition="python: not empty and not widget['isImage']">
 | 
					  <tal:file condition="python: not empty and not widget['isImage']">
 | 
				
			||||||
    <img tal:define="icon value/getBestIcon"
 | 
					    <img tal:define="icon value/getBestIcon"
 | 
				
			||||||
         tal:condition="icon" tal:attributes="src string: $portal_url/$icon"/>
 | 
					         tal:condition="icon" tal:attributes="src string: $appUrl/$icon"/>
 | 
				
			||||||
    <a tal:attributes="href imageSrc"
 | 
					    <a tal:attributes="href imageSrc"
 | 
				
			||||||
       tal:content="value/filename">
 | 
					       tal:content="value/filename">
 | 
				
			||||||
    </a>  -
 | 
					    </a>  -
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@
 | 
				
			||||||
           tal:content="python: tool.translate(doLabel)"></label>
 | 
					           tal:content="python: tool.translate(doLabel)"></label>
 | 
				
			||||||
  </tal:askAction>
 | 
					  </tal:askAction>
 | 
				
			||||||
  <img tal:repeat="podFormat python: tool.getPodInfo(contextObj, name)[1]"
 | 
					  <img tal:repeat="podFormat python: tool.getPodInfo(contextObj, name)[1]"
 | 
				
			||||||
       tal:attributes="src string: $portal_url/skyn/${podFormat}.png;
 | 
					       tal:attributes="src string: $appUrl/skyn/${podFormat}.png;
 | 
				
			||||||
                       onClick python: 'generatePodDocument(\'%s\',\'%s\',\'%s\',\'%s\')' % (contextObj.UID(), name, podFormat, tool.getQueryInfo());
 | 
					                       onClick python: 'generatePodDocument(\'%s\',\'%s\',\'%s\',\'%s\')' % (contextObj.UID(), name, podFormat, tool.getQueryInfo());
 | 
				
			||||||
                       title podFormat/capitalize"
 | 
					                       title podFormat/capitalize"
 | 
				
			||||||
       style="cursor:pointer"/>
 | 
					       style="cursor:pointer"/>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,39 +19,39 @@
 | 
				
			||||||
<metal:objectActions define-macro="objectActions">
 | 
					<metal:objectActions define-macro="objectActions">
 | 
				
			||||||
  <tal:comment replace="nothing">Displays icons for triggering actions on a given
 | 
					  <tal:comment replace="nothing">Displays icons for triggering actions on a given
 | 
				
			||||||
    referenced object (edit, delete, etc).</tal:comment>
 | 
					    referenced object (edit, delete, etc).</tal:comment>
 | 
				
			||||||
  <table class="no-style-table" cellpadding="0" cellspacing="0">
 | 
					  <table class="noStyle">
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
    <tal:comment replace="nothing">Arrows for moving objects up or down</tal:comment>
 | 
					    <tal:comment replace="nothing">Arrows for moving objects up or down</tal:comment>
 | 
				
			||||||
    <td class="noPadding" tal:condition="python: not appyType['isBack'] and (len(objs)>1) and member.has_permission('Modify portal content', contextObj)">
 | 
					    <td tal:condition="python: not appyType['isBack'] and (len(objs)>1) and context.allows('Modify portal content')">
 | 
				
			||||||
      <tal:moveRef define="objectIndex  python: contextObj.getAppyRefIndex(fieldName, obj);
 | 
					      <tal:moveRef define="objectIndex  python: contextObj.getAppyRefIndex(fieldName, obj);
 | 
				
			||||||
                           ajaxBaseCall python: navBaseCall.replace('**v**', '\'%s\',\'ChangeRefOrder\', {\'refObjectUid\':\'%s\', \'move\':\'**v**\'}' % (startNumber, obj.UID()))">
 | 
					                           ajaxBaseCall python: navBaseCall.replace('**v**', '\'%s\',\'ChangeRefOrder\', {\'refObjectUid\':\'%s\', \'move\':\'**v**\'}' % (startNumber, obj.UID()))">
 | 
				
			||||||
      <tal:comment replace="nothing">Move up</tal:comment>
 | 
					      <tal:comment replace="nothing">Move up</tal:comment>
 | 
				
			||||||
      <img tal:condition="python: objectIndex > 0"
 | 
					      <img tal:condition="python: objectIndex > 0"
 | 
				
			||||||
        tal:attributes="src string: $portal_url/skyn/arrowUp.png;
 | 
					        tal:attributes="src string: $appUrl/skyn/arrowUp.png;
 | 
				
			||||||
                        title python: tool.translate('move_up');
 | 
					                        title python: tool.translate('move_up');
 | 
				
			||||||
                        onClick python: ajaxBaseCall.replace('**v**', 'up')"
 | 
					                        onClick python: ajaxBaseCall.replace('**v**', 'up')"
 | 
				
			||||||
        style="cursor:pointer"/>
 | 
					        style="cursor:pointer"/>
 | 
				
			||||||
      <tal:comment replace="nothing">Move down</tal:comment>
 | 
					      <tal:comment replace="nothing">Move down</tal:comment>
 | 
				
			||||||
      <img tal:condition="python: objectIndex < (totalNumber-1)"
 | 
					      <img tal:condition="python: objectIndex < (totalNumber-1)"
 | 
				
			||||||
        tal:attributes="src string: $portal_url/skyn/arrowDown.png;
 | 
					        tal:attributes="src string: $appUrl/skyn/arrowDown.png;
 | 
				
			||||||
                        title python: tool.translate('move_down');
 | 
					                        title python: tool.translate('move_down');
 | 
				
			||||||
                        onClick python: ajaxBaseCall.replace('**v**', 'down')"
 | 
					                        onClick python: ajaxBaseCall.replace('**v**', 'down')"
 | 
				
			||||||
        style="cursor:pointer"/>
 | 
					        style="cursor:pointer"/>
 | 
				
			||||||
      </tal:moveRef>
 | 
					      </tal:moveRef>
 | 
				
			||||||
    </td>
 | 
					    </td>
 | 
				
			||||||
    <tal:comment replace="nothing">Edit the element</tal:comment>
 | 
					    <tal:comment replace="nothing">Edit the element</tal:comment>
 | 
				
			||||||
    <td class="noPadding" tal:condition="python: member.has_permission('Modify portal content', obj) and not appyType['noForm']">
 | 
					    <td tal:condition="python: obj.allows('Modify portal content') and not appyType['noForm']">
 | 
				
			||||||
       <a tal:define="navInfo python:'ref.%s.%s:%s.%d.%d' % (contextObj.UID(), fieldName, appyType['pageName'], repeat['obj'].number()+startNumber, totalNumber);"
 | 
					       <a tal:define="navInfo python:'ref.%s.%s:%s.%d.%d' % (contextObj.UID(), fieldName, appyType['pageName'], repeat['obj'].number()+startNumber, totalNumber);"
 | 
				
			||||||
          tal:attributes="href python: obj.getUrl(mode='edit', page='main', nav=navInfo)">
 | 
					          tal:attributes="href python: obj.getUrl(mode='edit', page='main', nav=navInfo)">
 | 
				
			||||||
        <img title="label_edit" i18n:domain="plone" i18n:attributes="title"
 | 
					        <img title="label_edit" i18n:domain="plone" i18n:attributes="title"
 | 
				
			||||||
             tal:attributes="src string: $portal_url/skyn/edit.gif"/>
 | 
					             tal:attributes="src string: $appUrl/skyn/edit.gif"/>
 | 
				
			||||||
       </a>
 | 
					       </a>
 | 
				
			||||||
    </td>
 | 
					    </td>
 | 
				
			||||||
    <tal:comment replace="nothing">Delete the element</tal:comment>
 | 
					    <tal:comment replace="nothing">Delete the element</tal:comment>
 | 
				
			||||||
    <td class="noPadding">
 | 
					    <td>
 | 
				
			||||||
      <img tal:condition="python: not appyType['isBack'] and member.has_permission('Delete objects', obj) and obj.mayDelete()"
 | 
					      <img tal:condition="python: not appyType['isBack'] and obj.allows('Delete objects') and obj.mayDelete()"
 | 
				
			||||||
           title="Delete" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
 | 
					           title="Delete" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
 | 
				
			||||||
           tal:attributes="src string: $portal_url/skyn/delete.png;
 | 
					           tal:attributes="src string: $appUrl/skyn/delete.png;
 | 
				
			||||||
                           onClick python:'onDeleteObject(\'%s\')' % obj.UID()"/>
 | 
					                           onClick python:'onDeleteObject(\'%s\')' % obj.UID()"/>
 | 
				
			||||||
    </td>
 | 
					    </td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
| 
						 | 
					@ -68,7 +68,7 @@
 | 
				
			||||||
                   formCall python: test(appyType['addConfirm'], 'askConfirm(\'script\', "%s", "%s")' % (formCall, addConfirmMsg), formCall);
 | 
					                   formCall python: test(appyType['addConfirm'], 'askConfirm(\'script\', "%s", "%s")' % (formCall, addConfirmMsg), formCall);
 | 
				
			||||||
                   noFormCall python: navBaseCall.replace('**v**', '%d, \'CreateWithoutForm\'' % startNumber);
 | 
					                   noFormCall python: navBaseCall.replace('**v**', '%d, \'CreateWithoutForm\'' % startNumber);
 | 
				
			||||||
                   noFormCall python: test(appyType['addConfirm'], 'askConfirm(\'script\', "%s", "%s")' % (noFormCall, addConfirmMsg), noFormCall)"
 | 
					                   noFormCall python: test(appyType['addConfirm'], 'askConfirm(\'script\', "%s", "%s")' % (noFormCall, addConfirmMsg), noFormCall)"
 | 
				
			||||||
       tal:attributes="src string:$portal_url/skyn/plus.png;
 | 
					       tal:attributes="src string:$appUrl/skyn/plus.png;
 | 
				
			||||||
                       title python: tool.translate('add_ref');
 | 
					                       title python: tool.translate('add_ref');
 | 
				
			||||||
                       onClick python: test(appyType['noForm'], noFormCall, formCall)"/>
 | 
					                       onClick python: test(appyType['noForm'], noFormCall, formCall)"/>
 | 
				
			||||||
</metal:plusIcon>
 | 
					</metal:plusIcon>
 | 
				
			||||||
| 
						 | 
					@ -81,10 +81,10 @@
 | 
				
			||||||
    tal:define="ajaxBaseCall python: navBaseCall.replace('**v**', '\'%s\',\'SortReference\', {\'sortKey\':\'%s\', \'reverse\':\'**v**\'}' % (startNumber, widget['name']))"
 | 
					    tal:define="ajaxBaseCall python: navBaseCall.replace('**v**', '\'%s\',\'SortReference\', {\'sortKey\':\'%s\', \'reverse\':\'**v**\'}' % (startNumber, widget['name']))"
 | 
				
			||||||
    tal:condition="python: canWrite and tool.isSortable(widget['name'], objs[0].meta_type, 'ref')">
 | 
					    tal:condition="python: canWrite and tool.isSortable(widget['name'], objs[0].meta_type, 'ref')">
 | 
				
			||||||
  <img style="cursor:pointer"
 | 
					  <img style="cursor:pointer"
 | 
				
			||||||
       tal:attributes="src string:$portal_url/skyn/sortAsc.png;
 | 
					       tal:attributes="src string:$appUrl/skyn/sortAsc.png;
 | 
				
			||||||
                       onClick python: ajaxBaseCall.replace('**v**', 'False')"/>
 | 
					                       onClick python: ajaxBaseCall.replace('**v**', 'False')"/>
 | 
				
			||||||
  <img style="cursor:pointer"
 | 
					  <img style="cursor:pointer"
 | 
				
			||||||
       tal:attributes="src string:$portal_url/skyn/sortDesc.png;
 | 
					       tal:attributes="src string:$appUrl/skyn/sortDesc.png;
 | 
				
			||||||
                       onClick python: ajaxBaseCall.replace('**v**', 'True')"/>
 | 
					                       onClick python: ajaxBaseCall.replace('**v**', 'True')"/>
 | 
				
			||||||
</metal:sortIcons>
 | 
					</metal:sortIcons>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -115,16 +115,16 @@
 | 
				
			||||||
                 folder python: contextObj.isPrincipiaFolderish and contextObj or contextObj.getParentNode();
 | 
					                 folder python: contextObj.isPrincipiaFolderish and contextObj or contextObj.getParentNode();
 | 
				
			||||||
                 linkedPortalType python: tool.getPortalType(appyType['klass']);
 | 
					                 linkedPortalType python: tool.getPortalType(appyType['klass']);
 | 
				
			||||||
                 addPermission python: '%s: Add %s' % (tool.getAppName(), linkedPortalType);
 | 
					                 addPermission python: '%s: Add %s' % (tool.getAppName(), linkedPortalType);
 | 
				
			||||||
                 canWrite python: not appyType['isBack'] and member.has_permission(appyType['writePermission'], contextObj);
 | 
					                 canWrite python: not appyType['isBack'] and contextObj.allows(appyType['writePermission']);
 | 
				
			||||||
                 multiplicity appyType/multiplicity;
 | 
					                 multiplicity appyType/multiplicity;
 | 
				
			||||||
                 maxReached python:(multiplicity[1] != None) and (len(objs) >= multiplicity[1]);
 | 
					                 maxReached python:(multiplicity[1] != None) and (len(objs) >= multiplicity[1]);
 | 
				
			||||||
                 showPlusIcon python:not appyType['isBack'] and appyType['add'] and not maxReached and member.has_permission(addPermission, folder) and canWrite;
 | 
					                 showPlusIcon python:not appyType['isBack'] and appyType['add'] and not maxReached and user.has_permission(addPermission, folder) and canWrite;
 | 
				
			||||||
                 atMostOneRef python: (multiplicity[1] == 1) and (len(objs)<=1);
 | 
					                 atMostOneRef python: (multiplicity[1] == 1) and (len(objs)<=1);
 | 
				
			||||||
                 label python: contextObj.translate('label', field=appyType);
 | 
					                 label python: contextObj.translate('label', field=appyType);
 | 
				
			||||||
                 addConfirmMsg python: appyType['addConfirm'] and tool.translate('%s_addConfirm' % appyType['labelId']) or '';
 | 
					                 addConfirmMsg python: appyType['addConfirm'] and tool.translate('%s_addConfirm' % appyType['labelId']) or '';
 | 
				
			||||||
                 navBaseCall python: 'askRefField(\'%s\',\'%s\',\'%s\',\'%s\',**v**)' % (ajaxHookId, contextObj.absolute_url(), fieldName, innerRef)">
 | 
					                 navBaseCall python: 'askRefField(\'%s\',\'%s\',\'%s\',\'%s\',**v**)' % (ajaxHookId, contextObj.absolute_url(), fieldName, innerRef)">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <tal:comment replace="nothing">This macro displays the Reference widget on a "consult" page.
 | 
					  <tal:comment replace="nothing">This macro displays the Reference widget on a "view" page.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  The definition of "atMostOneRef" above may sound strange: we shouldn't check the actual number
 | 
					  The definition of "atMostOneRef" above may sound strange: we shouldn't check the actual number
 | 
				
			||||||
  of referenced objects. But for back references people often forget to specify multiplicities.
 | 
					  of referenced objects. But for back references people often forget to specify multiplicities.
 | 
				
			||||||
| 
						 | 
					@ -133,20 +133,20 @@
 | 
				
			||||||
  <tal:atMostOneReference condition="atMostOneRef">
 | 
					  <tal:atMostOneReference condition="atMostOneRef">
 | 
				
			||||||
    <tal:comment replace="nothing">Display a simplified widget if maximum number of
 | 
					    <tal:comment replace="nothing">Display a simplified widget if maximum number of
 | 
				
			||||||
      referenced objects is 1.</tal:comment>
 | 
					      referenced objects is 1.</tal:comment>
 | 
				
			||||||
    <table class="no-style-table" cellpadding="0" cellspacing="0"><tr valign="top">
 | 
					    <table><tr valign="top">
 | 
				
			||||||
      <td><span class="appyLabel" tal:condition="python: not innerRef and not appyType['link']"
 | 
					      <td><span class="appyLabel" tal:condition="python: not innerRef and not appyType['link']"
 | 
				
			||||||
                tal:content="structure label"></span></td>
 | 
					                tal:content="structure label"></span></td>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <tal:comment replace="nothing">If there is no object...</tal:comment>
 | 
					      <tal:comment replace="nothing">If there is no object...</tal:comment>
 | 
				
			||||||
      <tal:noObject condition="not:objs">
 | 
					      <tal:noObject condition="not:objs">
 | 
				
			||||||
        <td tal:content="python: tool.translate('no_ref')"></td>
 | 
					        <td tal:content="python: tool.translate('no_ref')"></td>
 | 
				
			||||||
        <td><metal:plusIcon use-macro="portal/skyn/widgets/ref/macros/plusIcon"/></td>
 | 
					        <td><metal:plusIcon use-macro="app/skyn/widgets/ref/macros/plusIcon"/></td>
 | 
				
			||||||
      </tal:noObject>
 | 
					      </tal:noObject>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <tal:comment replace="nothing">If there is an object...</tal:comment>
 | 
					      <tal:comment replace="nothing">If there is an object...</tal:comment>
 | 
				
			||||||
      <tal:objectIsPresent condition="objs">
 | 
					      <tal:objectIsPresent condition="objs">
 | 
				
			||||||
        <tal:obj repeat="obj objs">
 | 
					        <tal:obj repeat="obj objs">
 | 
				
			||||||
          <td tal:define="includeShownInfo python:True"><metal:showObjectTitle use-macro="portal/skyn/widgets/ref/macros/objectTitle" /></td>
 | 
					          <td tal:define="includeShownInfo python:True"><metal:showObjectTitle use-macro="app/skyn/widgets/ref/macros/objectTitle" /></td>
 | 
				
			||||||
        </tal:obj>
 | 
					        </tal:obj>
 | 
				
			||||||
      </tal:objectIsPresent>
 | 
					      </tal:objectIsPresent>
 | 
				
			||||||
    </tr></table>
 | 
					    </tr></table>
 | 
				
			||||||
| 
						 | 
					@ -158,7 +158,7 @@
 | 
				
			||||||
      <legend tal:condition="python: not innerRef or showPlusIcon">
 | 
					      <legend tal:condition="python: not innerRef or showPlusIcon">
 | 
				
			||||||
        <span tal:condition="not: innerRef" tal:content="label"/>
 | 
					        <span tal:condition="not: innerRef" tal:content="label"/>
 | 
				
			||||||
        (<span tal:replace="totalNumber"/>)
 | 
					        (<span tal:replace="totalNumber"/>)
 | 
				
			||||||
        <metal:plusIcon use-macro="portal/skyn/widgets/ref/macros/plusIcon"/>
 | 
					        <metal:plusIcon use-macro="app/skyn/widgets/ref/macros/plusIcon"/>
 | 
				
			||||||
        <tal:comment replace="nothing">The search icon if field is queryable</tal:comment>
 | 
					        <tal:comment replace="nothing">The search icon if field is queryable</tal:comment>
 | 
				
			||||||
        <a tal:condition="appyType/queryable"
 | 
					        <a tal:condition="appyType/queryable"
 | 
				
			||||||
           tal:attributes="href python: '%s/skyn/search?type_name=%s&ref=%s:%s' % (tool.getAppFolder().absolute_url(), linkedPortalType, contextObj.meta_type, appyType['name'])">
 | 
					           tal:attributes="href python: '%s/skyn/search?type_name=%s&ref=%s:%s' % (tool.getAppFolder().absolute_url(), linkedPortalType, contextObj.meta_type, appyType['name'])">
 | 
				
			||||||
| 
						 | 
					@ -175,28 +175,27 @@
 | 
				
			||||||
      <tal:comment replace="nothing">No object is present</tal:comment>
 | 
					      <tal:comment replace="nothing">No object is present</tal:comment>
 | 
				
			||||||
      <p tal:condition="not:objs" tal:content="python: tool.translate('no_ref')"></p>
 | 
					      <p tal:condition="not:objs" tal:content="python: tool.translate('no_ref')"></p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <table width="100%" cellspacing="0" cellpadding="0" tal:condition="objs"
 | 
					      <table width="100%" tal:condition="python: objs"
 | 
				
			||||||
             tal:attributes="class python:test(innerRef, 'innerAppyTable', '')">
 | 
					             tal:attributes="class python:test(innerRef, 'innerAppyTable', '')">
 | 
				
			||||||
        <tr valign="bottom"><td>
 | 
					        <tr valign="bottom"><td>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <tal:comment replace="nothing">Show forward or backward reference(s)</tal:comment>
 | 
					        <tal:comment replace="nothing">Show forward or backward reference(s)</tal:comment>
 | 
				
			||||||
        <table tal:attributes="class python:test(innerRef, '', 'listing nosort');
 | 
					        <table tal:attributes="class python:test(innerRef, '', 'list');
 | 
				
			||||||
                               width python:test(innerRef, '100%', appyType['layouts']['view']['width']);"
 | 
					                               width python:test(innerRef, '100%', appyType['layouts']['view']['width']);">
 | 
				
			||||||
               align="right" tal:condition="python: objs" cellpadding="0" cellspacing="0">
 | 
					 | 
				
			||||||
          <tal:widgets define="widgets python: objs[0].getAppyTypesFromNames(appyType['shownInfo'])">
 | 
					          <tal:widgets define="widgets python: objs[0].getAppyTypesFromNames(appyType['shownInfo'])">
 | 
				
			||||||
          <tr tal:condition="appyType/showHeaders">
 | 
					          <tr tal:condition="appyType/showHeaders">
 | 
				
			||||||
            <th tal:repeat="widget widgets">
 | 
					            <th tal:repeat="widget widgets">
 | 
				
			||||||
              <span tal:content="python: tool.translate(widget['labelId'])"></span>
 | 
					              <span tal:content="python: tool.translate(widget['labelId'])"></span>
 | 
				
			||||||
              <metal:sortIcons use-macro="portal/skyn/widgets/ref/macros/sortIcons" />
 | 
					              <metal:sortIcons use-macro="app/skyn/widgets/ref/macros/sortIcons" />
 | 
				
			||||||
            </th>
 | 
					            </th>
 | 
				
			||||||
            <th tal:content="python: tool.translate('ref_actions')"></th>
 | 
					            <th tal:content="python: tool.translate('ref_actions')"></th>
 | 
				
			||||||
          </tr>
 | 
					          </tr>
 | 
				
			||||||
          <tal:row repeat="obj objs">
 | 
					          <tal:row repeat="obj objs">
 | 
				
			||||||
          <tr valign="top" tal:define="odd repeat/obj/odd"
 | 
					          <tr valign="middle" tal:define="odd repeat/obj/odd"
 | 
				
			||||||
              tal:attributes="class python:test(odd, 'even', 'odd')">
 | 
					              tal:attributes="class python:test(odd, 'even', 'odd')">
 | 
				
			||||||
            <td tal:repeat="widget widgets">
 | 
					            <td tal:repeat="widget widgets">
 | 
				
			||||||
              <tal:title condition="python: widget['name'] == 'title'">
 | 
					              <tal:title condition="python: widget['name'] == 'title'">
 | 
				
			||||||
                <metal:showObjectTitle use-macro="portal/skyn/widgets/ref/macros/objectTitle"/>
 | 
					                <metal:showObjectTitle use-macro="app/skyn/widgets/ref/macros/objectTitle"/>
 | 
				
			||||||
              </tal:title>
 | 
					              </tal:title>
 | 
				
			||||||
              <tal:state condition="python: widget['name'] == 'state'"
 | 
					              <tal:state condition="python: widget['name'] == 'state'"
 | 
				
			||||||
                         content="python: tool.translate(obj.getWorkflowLabel())">
 | 
					                         content="python: tool.translate(obj.getWorkflowLabel())">
 | 
				
			||||||
| 
						 | 
					@ -205,13 +204,13 @@
 | 
				
			||||||
                <tal:field define="contextObj python:obj;
 | 
					                <tal:field define="contextObj python:obj;
 | 
				
			||||||
                                   layoutType python: 'cell';
 | 
					                                   layoutType python: 'cell';
 | 
				
			||||||
                                   innerRef python:True">
 | 
					                                   innerRef python:True">
 | 
				
			||||||
                  <metal:field use-macro="portal/skyn/widgets/show/macros/field" />
 | 
					                  <metal:field use-macro="app/skyn/widgets/show/macros/field" />
 | 
				
			||||||
                </tal:field>
 | 
					                </tal:field>
 | 
				
			||||||
              </tal:other>
 | 
					              </tal:other>
 | 
				
			||||||
            </td>
 | 
					            </td>
 | 
				
			||||||
            <tal:comment replace="nothing">Actions</tal:comment>
 | 
					            <tal:comment replace="nothing">Actions</tal:comment>
 | 
				
			||||||
            <td align="right">
 | 
					            <td align="right">
 | 
				
			||||||
              <metal:showObjectActions use-macro="portal/skyn/widgets/ref/macros/objectActions" />
 | 
					              <metal:showObjectActions use-macro="app/skyn/widgets/ref/macros/objectActions" />
 | 
				
			||||||
            </td>
 | 
					            </td>
 | 
				
			||||||
          </tr>
 | 
					          </tr>
 | 
				
			||||||
          </tal:row>
 | 
					          </tal:row>
 | 
				
			||||||
| 
						 | 
					@ -254,7 +253,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<tal:comment replace="nothing">Cell macro for a Ref.</tal:comment>
 | 
					<tal:comment replace="nothing">Cell macro for a Ref.</tal:comment>
 | 
				
			||||||
<metal:cell define-macro="cell">
 | 
					<metal:cell define-macro="cell">
 | 
				
			||||||
  <metal:call use-macro="portal/skyn/widgets/ref/macros/view"/>
 | 
					  <metal:call use-macro="app/skyn/widgets/ref/macros/view"/>
 | 
				
			||||||
</metal:cell>
 | 
					</metal:cell>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<tal:comment replace="nothing">Search macro for a Ref.</tal:comment>
 | 
					<tal:comment replace="nothing">Search macro for a Ref.</tal:comment>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,10 +8,10 @@
 | 
				
			||||||
  Options:
 | 
					  Options:
 | 
				
			||||||
    contextMacro       The base folder containing the macros to call for
 | 
					    contextMacro       The base folder containing the macros to call for
 | 
				
			||||||
                       rendering the elements within the layout.
 | 
					                       rendering the elements within the layout.
 | 
				
			||||||
                       Defaults to portal.skyn
 | 
					                       Defaults to app.skyn
 | 
				
			||||||
</tal:comment>
 | 
					</tal:comment>
 | 
				
			||||||
<metal:show define-macro="layout"
 | 
					<metal:show define-macro="layout"
 | 
				
			||||||
            tal:define="contextMacro contextMacro| python: portal.skyn">
 | 
					            tal:define="contextMacro contextMacro| python: app.skyn">
 | 
				
			||||||
 <table tal:attributes="cellpadding  layout/cellpadding;
 | 
					 <table tal:attributes="cellpadding  layout/cellpadding;
 | 
				
			||||||
                        cellspacing  layout/cellspacing;
 | 
					                        cellspacing  layout/cellspacing;
 | 
				
			||||||
                        width        layout/width;
 | 
					                        width        layout/width;
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@
 | 
				
			||||||
   <tr tal:repeat="row layout/rows" tal:attributes="valign row/valign">
 | 
					   <tr tal:repeat="row layout/rows" tal:attributes="valign row/valign">
 | 
				
			||||||
     <td tal:repeat="cell row/cells"
 | 
					     <td tal:repeat="cell row/cells"
 | 
				
			||||||
         tal:attributes="align cell/align; colspan cell/colspan;
 | 
					         tal:attributes="align cell/align; colspan cell/colspan;
 | 
				
			||||||
                         style python: test(repeat['cell'].end, '', 'padding-right: 0.4em')"><tal:content repeat="elem cell/content"><tal:field condition="python: elem == '?'"><metal:call use-macro="python: contextMacro.get(widget['type'].lower()).macros.get(layoutType)"/></tal:field><tal:other condition="python: elem != '?'"><metal:call use-macro="python: contextMacro.get(elem[0]).macros.get(elem[1])"/></tal:other><img tal:condition="not: repeat/elem/end" tal:attributes="src string: $portal_url/skyn/space.gif"/></tal:content>
 | 
					                         style python: test(repeat['cell'].end, '', 'padding-right: 0.4em')"><tal:content repeat="elem cell/content"><tal:field condition="python: elem == '?'"><metal:call use-macro="python: contextMacro.get(widget['type'].lower()).macros.get(layoutType)"/></tal:field><tal:other condition="python: elem != '?'"><metal:call use-macro="python: contextMacro.get(elem[0]).macros.get(elem[1])"/></tal:other><img tal:condition="not: repeat/elem/end" tal:attributes="src string: $appUrl/skyn/space.gif"/></tal:content>
 | 
				
			||||||
     </td>
 | 
					     </td>
 | 
				
			||||||
   </tr>
 | 
					   </tr>
 | 
				
			||||||
 </table>
 | 
					 </table>
 | 
				
			||||||
| 
						 | 
					@ -42,7 +42,7 @@
 | 
				
			||||||
    widget             The widget to render
 | 
					    widget             The widget to render
 | 
				
			||||||
</tal:comment>
 | 
					</tal:comment>
 | 
				
			||||||
<metal:field define-macro="field"
 | 
					<metal:field define-macro="field"
 | 
				
			||||||
       tal:define="contextMacro    python: portal.skyn.widgets;
 | 
					       tal:define="contextMacro    python: app.skyn.widgets;
 | 
				
			||||||
                   layout          python: widget['layouts'][layoutType];
 | 
					                   layout          python: widget['layouts'][layoutType];
 | 
				
			||||||
                   name            widget/name;
 | 
					                   name            widget/name;
 | 
				
			||||||
                   sync            python: widget['sync'][layoutType];
 | 
					                   sync            python: widget['sync'][layoutType];
 | 
				
			||||||
| 
						 | 
					@ -70,15 +70,15 @@
 | 
				
			||||||
    <legend tal:condition="widget/hasLabel">
 | 
					    <legend tal:condition="widget/hasLabel">
 | 
				
			||||||
      <i tal:content="structure python: contextObj.translate(widget['labelId'])"></i>
 | 
					      <i tal:content="structure python: contextObj.translate(widget['labelId'])"></i>
 | 
				
			||||||
      <tal:help condition="widget/hasHelp">
 | 
					      <tal:help condition="widget/hasHelp">
 | 
				
			||||||
        <metal:call use-macro="portal/skyn/widgets/show/macros/help"/>
 | 
					        <metal:call use-macro="app/skyn/widgets/show/macros/help"/>
 | 
				
			||||||
      </tal:help>
 | 
					      </tal:help>
 | 
				
			||||||
    </legend>
 | 
					    </legend>
 | 
				
			||||||
    <div tal:condition="widget/hasDescr" class="discreet" 
 | 
					    <div tal:condition="widget/hasDescr" class="discreet" 
 | 
				
			||||||
         tal:content="structure python: contextObj.translate(widget['descrId'])"></div>
 | 
					         tal:content="structure python: contextObj.translate(widget['descrId'])"></div>
 | 
				
			||||||
    <metal:content use-macro="portal/skyn/widgets/show/macros/groupContent"/>
 | 
					    <metal:content use-macro="app/skyn/widgets/show/macros/groupContent"/>
 | 
				
			||||||
  </fieldset>
 | 
					  </fieldset>
 | 
				
			||||||
  <tal:asSection condition="python: widget['style'] not in ('fieldset', 'tabs')">
 | 
					  <tal:asSection condition="python: widget['style'] not in ('fieldset', 'tabs')">
 | 
				
			||||||
    <metal:content use-macro="portal/skyn/widgets/show/macros/groupContent"/>
 | 
					    <metal:content use-macro="app/skyn/widgets/show/macros/groupContent"/>
 | 
				
			||||||
  </tal:asSection>
 | 
					  </tal:asSection>
 | 
				
			||||||
  <tal:asTabs condition="python: widget['style'] == 'tabs'">
 | 
					  <tal:asTabs condition="python: widget['style'] == 'tabs'">
 | 
				
			||||||
  <table cellpadding="0" cellspacing="0"
 | 
					  <table cellpadding="0" cellspacing="0"
 | 
				
			||||||
| 
						 | 
					@ -90,15 +90,15 @@
 | 
				
			||||||
        <tr valign="middle">
 | 
					        <tr valign="middle">
 | 
				
			||||||
          <tal:tab repeat="widgetRow widget/widgets">
 | 
					          <tal:tab repeat="widgetRow widget/widgets">
 | 
				
			||||||
          <tal:id define="tabId python:'tab_%s_%d_%d' % (widget['name'], repeat['widgetRow'].number(), len(widget['widgets']))">
 | 
					          <tal:id define="tabId python:'tab_%s_%d_%d' % (widget['name'], repeat['widgetRow'].number(), len(widget['widgets']))">
 | 
				
			||||||
          <td><img tal:attributes="src string: $portal_url/skyn/tabLeft.png;
 | 
					          <td><img tal:attributes="src string: $appUrl/skyn/tabLeft.png;
 | 
				
			||||||
                                   id python: '%s_left' % tabId"/><td>
 | 
					                                   id python: '%s_left' % tabId"/><td>
 | 
				
			||||||
          <td tal:attributes="style python:'background-image: url(%s/skyn/tabBg.png)' % portal_url;
 | 
					          <td tal:attributes="style python:'background-image: url(%s/skyn/tabBg.png)' % appUrl;
 | 
				
			||||||
                              id tabId">
 | 
					                              id tabId">
 | 
				
			||||||
            <a style="cursor:pointer"
 | 
					            <a style="cursor:pointer"
 | 
				
			||||||
               tal:content="python: tool.translate('%s_col%d' % (widget['labelId'], repeat['widgetRow'].number()))"
 | 
					               tal:content="python: tool.translate('%s_col%d' % (widget['labelId'], repeat['widgetRow'].number()))"
 | 
				
			||||||
               tal:attributes="onClick python: 'showTab(\'%s_%d_%d\')' % (widget['name'], repeat['widgetRow'].number(), len(widget['widgets']))"></a>
 | 
					               tal:attributes="onClick python: 'showTab(\'%s_%d_%d\')' % (widget['name'], repeat['widgetRow'].number(), len(widget['widgets']))"></a>
 | 
				
			||||||
          </td>
 | 
					          </td>
 | 
				
			||||||
          <td><img tal:attributes="src string: $portal_url/skyn/tabRight.png;
 | 
					          <td><img tal:attributes="src string: $appUrl/skyn/tabRight.png;
 | 
				
			||||||
                                   id python: '%s_right' % tabId"/><td>
 | 
					                                   id python: '%s_right' % tabId"/><td>
 | 
				
			||||||
          </tal:id>
 | 
					          </tal:id>
 | 
				
			||||||
          </tal:tab>
 | 
					          </tal:tab>
 | 
				
			||||||
| 
						 | 
					@ -111,10 +111,10 @@
 | 
				
			||||||
                        style python: test(repeat['widgetRow'].number()==1, 'display:table-row', 'display:none')">
 | 
					                        style python: test(repeat['widgetRow'].number()==1, 'display:table-row', 'display:none')">
 | 
				
			||||||
      <td tal:define="widget python: widgetRow[0]">
 | 
					      <td tal:define="widget python: widgetRow[0]">
 | 
				
			||||||
        <tal:group condition="python: widget['type'] == 'group'">
 | 
					        <tal:group condition="python: widget['type'] == 'group'">
 | 
				
			||||||
          <metal:call use-macro="portal/skyn/widgets/show/macros/group"/>
 | 
					          <metal:call use-macro="app/skyn/widgets/show/macros/group"/>
 | 
				
			||||||
        </tal:group>
 | 
					        </tal:group>
 | 
				
			||||||
        <tal:field condition="python: widget['type'] != 'group'">
 | 
					        <tal:field condition="python: widget['type'] != 'group'">
 | 
				
			||||||
          <metal:call use-macro="portal/skyn/widgets/show/macros/field"/>
 | 
					          <metal:call use-macro="app/skyn/widgets/show/macros/field"/>
 | 
				
			||||||
        </tal:field>
 | 
					        </tal:field>
 | 
				
			||||||
      </td>
 | 
					      </td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
| 
						 | 
					@ -141,7 +141,7 @@
 | 
				
			||||||
                        class widget/style" align="left">
 | 
					                        class widget/style" align="left">
 | 
				
			||||||
      <span tal:replace="structure python: contextObj.translate(widget['labelId'])"/>
 | 
					      <span tal:replace="structure python: contextObj.translate(widget['labelId'])"/>
 | 
				
			||||||
      <tal:help condition="widget/hasHelp">
 | 
					      <tal:help condition="widget/hasHelp">
 | 
				
			||||||
        <metal:call use-macro="portal/skyn/widgets/show/macros/help"/>
 | 
					        <metal:call use-macro="app/skyn/widgets/show/macros/help"/>
 | 
				
			||||||
      </tal:help>
 | 
					      </tal:help>
 | 
				
			||||||
    </td>
 | 
					    </td>
 | 
				
			||||||
  </tr>
 | 
					  </tr>
 | 
				
			||||||
| 
						 | 
					@ -164,10 +164,10 @@
 | 
				
			||||||
                        style python: test(repeat['widget'].number() != len(widgetRow), 'padding-right: %s'%cellgap, '')">
 | 
					                        style python: test(repeat['widget'].number() != len(widgetRow), 'padding-right: %s'%cellgap, '')">
 | 
				
			||||||
      <tal:showWidget condition="widget">
 | 
					      <tal:showWidget condition="widget">
 | 
				
			||||||
        <tal:group condition="python: widget['type'] == 'group'">
 | 
					        <tal:group condition="python: widget['type'] == 'group'">
 | 
				
			||||||
          <metal:call use-macro="portal/skyn/widgets/show/macros/group"/>
 | 
					          <metal:call use-macro="app/skyn/widgets/show/macros/group"/>
 | 
				
			||||||
        </tal:group>
 | 
					        </tal:group>
 | 
				
			||||||
        <tal:field condition="python: widget['type'] != 'group'">
 | 
					        <tal:field condition="python: widget['type'] != 'group'">
 | 
				
			||||||
          <metal:call use-macro="portal/skyn/widgets/show/macros/field"/>
 | 
					          <metal:call use-macro="app/skyn/widgets/show/macros/field"/>
 | 
				
			||||||
        </tal:field>
 | 
					        </tal:field>
 | 
				
			||||||
      </tal:showWidget>
 | 
					      </tal:showWidget>
 | 
				
			||||||
    </td>
 | 
					    </td>
 | 
				
			||||||
| 
						 | 
					@ -182,10 +182,10 @@
 | 
				
			||||||
</tal:description>
 | 
					</tal:description>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<tal:comment replace="nothing">Displays a field help.</tal:comment>
 | 
					<tal:comment replace="nothing">Displays a field help.</tal:comment>
 | 
				
			||||||
<tal:help metal:define-macro="help"><acronym tal:attributes="title python: contextObj.translate('help', field=widget)"><img tal:attributes="src string: $portal_url/skyn/help.png"/></acronym></tal:help>
 | 
					<tal:help metal:define-macro="help"><acronym tal:attributes="title python: contextObj.translate('help', field=widget)"><img tal:attributes="src string: $appUrl/skyn/help.png"/></acronym></tal:help>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<tal:comment replace="nothing">Displays validation-error-related info about a field.</tal:comment>
 | 
					<tal:comment replace="nothing">Displays validation-error-related info about a field.</tal:comment>
 | 
				
			||||||
<tal:validation metal:define-macro="validation"><acronym tal:condition="inError" tal:attributes="title python: errors[name]"><img tal:attributes="src string: $portal_url/skyn/warning.png"/></acronym><img tal:condition="not: inError" tal:attributes="src string: $portal_url/skyn/warning_no.gif"/></tal:validation>
 | 
					<tal:validation metal:define-macro="validation"><acronym tal:condition="inError" tal:attributes="title python: errors[name]"><img tal:attributes="src string: $appUrl/skyn/warning.png"/></acronym><img tal:condition="not: inError" tal:attributes="src string: $appUrl/skyn/warning_no.gif"/></tal:validation>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<tal:comment replace="nothing">Displays the fact that a field is required.</tal:comment>
 | 
					<tal:comment replace="nothing">Displays the fact that a field is required.</tal:comment>
 | 
				
			||||||
<tal:required metal:define-macro="required"><img tal:attributes="src string: $portal_url/skyn/required.gif"/></tal:required>
 | 
					<tal:required metal:define-macro="required"><img tal:attributes="src string: $appUrl/skyn/required.gif"/></tal:required>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,7 +74,7 @@
 | 
				
			||||||
                content="python: ', '.join(value)">
 | 
					                content="python: ', '.join(value)">
 | 
				
			||||||
  </tal:multiple>
 | 
					  </tal:multiple>
 | 
				
			||||||
  <tal:notMultiple condition="not: multipleValues">
 | 
					  <tal:notMultiple condition="not: multipleValues">
 | 
				
			||||||
    <metal:call use-macro="portal/skyn/widgets/string/macros/view"/>
 | 
					    <metal:call use-macro="app/skyn/widgets/string/macros/view"/>
 | 
				
			||||||
  </tal:notMultiple>
 | 
					  </tal:notMultiple>
 | 
				
			||||||
</metal:cell>
 | 
					</metal:cell>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,82 +0,0 @@
 | 
				
			||||||
/* Appy-specific IE-fixes */
 | 
					 | 
				
			||||||
.portletSearch { font-size: 85%;  border-left: 1px solid #8cacbb;  border-right: 1px solid #8cacbb; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Stylesheet with Internet Explorer-specific workarounds. */
 | 
					 | 
				
			||||||
* html #portal-columns { width: 100%; }
 | 
					 | 
				
			||||||
* html*#portal-columns { width: auto; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* <dtml-with base_properties> */
 | 
					 | 
				
			||||||
#topIcons { right: 238px; }
 | 
					 | 
				
			||||||
#portal-globalnav { margin-top: -1px; }
 | 
					 | 
				
			||||||
#portal-globalnav th { height: 32px; }
 | 
					 | 
				
			||||||
.navTreeItem a, dd.portletItem .navTreeItem a { font-size: 105%; }
 | 
					 | 
				
			||||||
#portlet-navigation-tree { margin-top: 8px; }
 | 
					 | 
				
			||||||
.navigation-section-header { height: 28px; }
 | 
					 | 
				
			||||||
#portal-globalnav a {  font-size: 110%; }
 | 
					 | 
				
			||||||
#portal-column-two .portletHeader { font-size:110%; padding-bottom:11px; }
 | 
					 | 
				
			||||||
#portlet-hp-news .portletHeader { margin-top: 1px; }
 | 
					 | 
				
			||||||
.section-ncp-home .portletHeader { font-size:110%; }
 | 
					 | 
				
			||||||
input { margin-bottom: 1px; }
 | 
					 | 
				
			||||||
table.listing td.top { position: relative; left: -1px; top: -1px; }
 | 
					 | 
				
			||||||
div#portal-columns div.portlet { text-align: left; }
 | 
					 | 
				
			||||||
div#portal-columns div#portal-column-one,
 | 
					 | 
				
			||||||
div#portal-columns div#portal-column-two { overflow: hidden; }
 | 
					 | 
				
			||||||
textarea { width: 97%; }
 | 
					 | 
				
			||||||
.visualOverflow { width: 88%; }
 | 
					 | 
				
			||||||
.visualGhosted { filter:alpha(opacity=20); }
 | 
					 | 
				
			||||||
#portal-logo {
 | 
					 | 
				
			||||||
  height /**/: <dtml-var "_[logoName].height">px;
 | 
					 | 
				
			||||||
  overflow: hidden;
 | 
					 | 
				
			||||||
}       
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#clear-space-before-wrapper-table { display: none };
 | 
					 | 
				
			||||||
/* Fix bottom margin on tabs in IE */
 | 
					 | 
				
			||||||
#portal-globalnav li.selected a { position: relative; }
 | 
					 | 
				
			||||||
#portal-colophon .colophonIcon { height: 0px !important; height /**/: 15px; }
 | 
					 | 
				
			||||||
.actionMenu .actionMenuHeader a { display: inline; }
 | 
					 | 
				
			||||||
.actionMenu .actionMenuContent { top: 1.4em; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Calendar fixes */
 | 
					 | 
				
			||||||
.ploneCalendar { border-collapse:collapse; width:auto; height:1%; }
 | 
					 | 
				
			||||||
.ploneCalendar td { width:1%; }
 | 
					 | 
				
			||||||
.ploneCalendar .todaynoevent,
 | 
					 | 
				
			||||||
.ploneCalendar .todayevent { position: relative; }
 | 
					 | 
				
			||||||
.hiddenStructure { position: absolute; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
body { /* These work in IE only, changes the look of the scrollbar + textareas */
 | 
					 | 
				
			||||||
  scrollbar-base-color: &dtml-globalBackgroundColor;;
 | 
					 | 
				
			||||||
  scrollbar-highlight-color: &dtml-globalBackgroundColor;;
 | 
					 | 
				
			||||||
  scrollbar-track-color: &dtml-evenRowBackgroundColor;;
 | 
					 | 
				
			||||||
  scrollbar-darkshadow-color: &dtml-evenRowBackgroundColor;;
 | 
					 | 
				
			||||||
  scrollbar-3dlight-color: &dtml-globalBorderColor;;
 | 
					 | 
				
			||||||
  scrollbar-shadow-color: &dtml-globalBorderColor;;
 | 
					 | 
				
			||||||
  scrollbar-arrow-color: &dtml-globalFontColor;;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#floatholder, #float { height: 1%; }
 | 
					 | 
				
			||||||
* html .link-external,
 | 
					 | 
				
			||||||
* html .link-external a,
 | 
					 | 
				
			||||||
* html .link-mailto a,
 | 
					 | 
				
			||||||
* html .link-mailto { height: 1%; } 
 | 
					 | 
				
			||||||
* html .visualIEFloatFix,
 | 
					 | 
				
			||||||
* html h1,
 | 
					 | 
				
			||||||
* html h2,
 | 
					 | 
				
			||||||
* html h3,
 | 
					 | 
				
			||||||
* html h4,
 | 
					 | 
				
			||||||
* html h5,
 | 
					 | 
				
			||||||
* html h6,
 | 
					 | 
				
			||||||
* html dd,
 | 
					 | 
				
			||||||
* html .documentDescription,
 | 
					 | 
				
			||||||
* html .visualClear,
 | 
					 | 
				
			||||||
* html .portalMessage,
 | 
					 | 
				
			||||||
* html .portalWarningMessage,
 | 
					 | 
				
			||||||
* html .portalStopMessage,
 | 
					 | 
				
			||||||
* html .system-message,
 | 
					 | 
				
			||||||
* html #error-handling,
 | 
					 | 
				
			||||||
* html .documentContent { height: 0.1%; }
 | 
					 | 
				
			||||||
* html p { position: relative; }
 | 
					 | 
				
			||||||
* html h1.documentFirstHeading { height: auto; }
 | 
					 | 
				
			||||||
* html #objectMenu.actionMenu .actionMenuContent li { height: auto; }
 | 
					 | 
				
			||||||
#portal-searchbox { overflow: hidden; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* </dtml-with> */
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,17 +0,0 @@
 | 
				
			||||||
<html xmlns:tal="http://xml.zope.org/namespaces/tal"
 | 
					 | 
				
			||||||
      xmlns:metal="http://xml.zope.org/namespaces/metal"
 | 
					 | 
				
			||||||
      i18n:domain="<!applicationName!>">
 | 
					 | 
				
			||||||
  <body>
 | 
					 | 
				
			||||||
    <div metal:define-macro="portlet"
 | 
					 | 
				
			||||||
         tal:define="tool python: context.<!toolInstanceName!>;"
 | 
					 | 
				
			||||||
         tal:condition="python: tool.showPortlet(context)">
 | 
					 | 
				
			||||||
      <metal:block metal:use-macro="here/global_defines/macros/defines" />
 | 
					 | 
				
			||||||
      <metal:prologue use-macro="here/skyn/page/macros/prologue"/>
 | 
					 | 
				
			||||||
      <dl tal:define="rootClasses tool/getRootClasses;
 | 
					 | 
				
			||||||
                      appName string:<!applicationName!>;
 | 
					 | 
				
			||||||
                      appFolder tool/getAppFolder" class="portlet">
 | 
					 | 
				
			||||||
        <metal:content use-macro="here/skyn/portlet/macros/portletContent"/>
 | 
					 | 
				
			||||||
      </dl>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
  </body>
 | 
					 | 
				
			||||||
</html>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,20 +1,11 @@
 | 
				
			||||||
/* <dtml-var "enableHTTPCompression(request=REQUEST, debug=1, css=1)"> (this is for http compression) */
 | 
					 | 
				
			||||||
/* <dtml-with base_properties> (do not remove this :) */
 | 
					 | 
				
			||||||
/* <dtml-call "REQUEST.set('portal_url', portal_url())"> (not this either :) */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
textarea { width: 99%; }
 | 
					textarea { width: 99%; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#portal-breadcrumbs { display: none; }
 | 
					 | 
				
			||||||
#importedElem { color: grey; font-style: italic; }
 | 
					#importedElem { color: grey; font-style: italic; }
 | 
				
			||||||
label         { font-weight: bold; font-style: italic; line-height: 1.4em; font-size: 92%;}
 | 
					label         { font-weight: bold; font-style: italic; line-height: 1.4em; font-size: 92%;}
 | 
				
			||||||
.discreet     { font-size: 94%; }
 | 
					 | 
				
			||||||
.appyList     { line-height: 1.1em; margin: 0 0 0.5em 1.2em;  padding: 0; }
 | 
					.appyList     { line-height: 1.1em; margin: 0 0 0.5em 1.2em;  padding: 0; }
 | 
				
			||||||
.appyBullet   { margin: 0; }
 | 
					.appyBullet   { margin: 0; }
 | 
				
			||||||
.appyPod      { float:right; }
 | 
					.appyPod      { float:right; }
 | 
				
			||||||
.appyNav      { padding: 0.4em 0 0.4em 0; }
 | 
					 | 
				
			||||||
.appyFocus    { color: #900101; }
 | 
					.appyFocus    { color: #900101; }
 | 
				
			||||||
.appyTitle    { padding-top: 0.5em; font-size: 110%; }
 | 
					 | 
				
			||||||
.appyWorkflow { text-align: center; background-color: &dtml-globalBackgroundColor;;}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
.appyPlusImg {
 | 
					.appyPlusImg {
 | 
				
			||||||
  vertical-align: top;
 | 
					  vertical-align: top;
 | 
				
			||||||
| 
						 | 
					@ -23,12 +14,6 @@ label         { font-weight: bold; font-style: italic; line-height: 1.4em; font-
 | 
				
			||||||
  top: -0.55em;
 | 
					  top: -0.55em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.appyPhase {
 | 
					 | 
				
			||||||
  border-style: dashed;
 | 
					 | 
				
			||||||
  border-width: thin;
 | 
					 | 
				
			||||||
  padding: 0 0.6em 0 1em;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.appyState {
 | 
					.appyState {
 | 
				
			||||||
  font-size: 85%;
 | 
					  font-size: 85%;
 | 
				
			||||||
  font-style: normal;
 | 
					  font-style: normal;
 | 
				
			||||||
| 
						 | 
					@ -61,54 +46,6 @@ label         { font-weight: bold; font-style: italic; line-height: 1.4em; font-
 | 
				
			||||||
  font-size: 105%;
 | 
					  font-size: 105%;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Following classes are used for displaying status of a phase or state. */
 | 
					 | 
				
			||||||
.stepDone {
 | 
					 | 
				
			||||||
  background-color: #cde2a7;
 | 
					 | 
				
			||||||
  background-image: url(&dtml-portal_url;/skyn/done.png);
 | 
					 | 
				
			||||||
  background-repeat: no-repeat;
 | 
					 | 
				
			||||||
  background-position: -1px 7px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.stepDoneState {
 | 
					 | 
				
			||||||
  background-color: #cde2a7;
 | 
					 | 
				
			||||||
  background-image: url(&dtml-portal_url;/skyn/done.png);
 | 
					 | 
				
			||||||
  background-repeat: no-repeat;
 | 
					 | 
				
			||||||
  background-position: -1px 4px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.stepCurrent {
 | 
					 | 
				
			||||||
  background-color: #eef3f5;
 | 
					 | 
				
			||||||
  background-image: url(&dtml-portal_url;/skyn/current.png);
 | 
					 | 
				
			||||||
  background-repeat: no-repeat;
 | 
					 | 
				
			||||||
  background-position: -1px 7px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.stepCurrentState {
 | 
					 | 
				
			||||||
  background-color: #eef3f5;
 | 
					 | 
				
			||||||
  background-image: url(&dtml-portal_url;/skyn/current.png);
 | 
					 | 
				
			||||||
  background-repeat: no-repeat;
 | 
					 | 
				
			||||||
  background-position: -1px 4px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.stepFuture {
 | 
					 | 
				
			||||||
  background-color: #ffffff;
 | 
					 | 
				
			||||||
  color: #C8C8C8;
 | 
					 | 
				
			||||||
  border-style: dashed;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.stepUnselected {
 | 
					 | 
				
			||||||
  background-color: #ffffff;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.appyCommonInfo {
 | 
					 | 
				
			||||||
  border-color: #ffa500;
 | 
					 | 
				
			||||||
  background-color: &dtml-evenRowBackgroundColor;;
 | 
					 | 
				
			||||||
  border-style: solid;
 | 
					 | 
				
			||||||
  border-width: 2px;
 | 
					 | 
				
			||||||
  margin-bottom: 0.5em;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* With fields layout in columns, standard error frame is too large */
 | 
					 | 
				
			||||||
.odd {  background-color: white; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Tooltip */
 | 
					/* Tooltip */
 | 
				
			||||||
a.tooltip span {
 | 
					a.tooltip span {
 | 
				
			||||||
  display:none;
 | 
					  display:none;
 | 
				
			||||||
| 
						 | 
					@ -126,18 +63,6 @@ a.tooltip:hover span {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Table styles */
 | 
					/* Table styles */
 | 
				
			||||||
.no-style-table {
 | 
					 | 
				
			||||||
  border: 0 !important;
 | 
					 | 
				
			||||||
  padding: 0 !important;
 | 
					 | 
				
			||||||
  margin: 0 !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.no-style-table td {
 | 
					 | 
				
			||||||
  border: 0 !important;
 | 
					 | 
				
			||||||
  padding-left: 0 !important;
 | 
					 | 
				
			||||||
  margin: 0 !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fieldset {
 | 
					fieldset {
 | 
				
			||||||
  line-height: 1em;
 | 
					  line-height: 1em;
 | 
				
			||||||
  border: 2px solid #8CACBB;
 | 
					  border: 2px solid #8CACBB;
 | 
				
			||||||
| 
						 | 
					@ -145,41 +70,6 @@ fieldset {
 | 
				
			||||||
  padding: 0 0.7em 0.5em;
 | 
					  padding: 0 0.7em 0.5em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
th {
 | 
					 | 
				
			||||||
  font-style: italic;
 | 
					 | 
				
			||||||
  font-weight: normal;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.section1 {
 | 
					 | 
				
			||||||
  font-size: 120%;
 | 
					 | 
				
			||||||
  margin: 0.45em 0em 0.1em 0;
 | 
					 | 
				
			||||||
  padding: 0.3em 0em 0.2em 0.1em;
 | 
					 | 
				
			||||||
  background-color: #eef3f5;
 | 
					 | 
				
			||||||
  border-top: 1px solid #8CACBB;
 | 
					 | 
				
			||||||
  border-bottom: 1px solid #8CACBB;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.section2 {
 | 
					 | 
				
			||||||
  font-size: 110%;
 | 
					 | 
				
			||||||
  font-style: italic;
 | 
					 | 
				
			||||||
  margin: 0.45em 0em 0.1em 0;
 | 
					 | 
				
			||||||
  border-bottom: 2px solid #8CACBB;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.section3 {
 | 
					 | 
				
			||||||
  font-size: 100%;
 | 
					 | 
				
			||||||
  font-style: italic;
 | 
					 | 
				
			||||||
  margin: 0.45em 0em 0.1em 0;
 | 
					 | 
				
			||||||
  background-color: #efeae8;
 | 
					 | 
				
			||||||
  text-align: center;
 | 
					 | 
				
			||||||
  color: grey;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.imageInput {
 | 
					 | 
				
			||||||
  border-width: 0px;
 | 
					 | 
				
			||||||
  background: none;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.noPadding {
 | 
					.noPadding {
 | 
				
			||||||
  padding-right: 0em !important;
 | 
					  padding-right: 0em !important;
 | 
				
			||||||
  padding-left: 0em !important;
 | 
					  padding-left: 0em !important;
 | 
				
			||||||
| 
						 | 
					@ -238,14 +128,6 @@ th {
 | 
				
			||||||
  text-transform: none;
 | 
					  text-transform: none;
 | 
				
			||||||
  padding: 1px 0.5em;
 | 
					  padding: 1px 0.5em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
.portletAppyItem {
 | 
					 | 
				
			||||||
  margin: 0;
 | 
					 | 
				
			||||||
  padding: 1px 0.5em;
 | 
					 | 
				
			||||||
  border-left: 1px solid #8cacbb;
 | 
					 | 
				
			||||||
  border-right: 1px solid #8cacbb;
 | 
					 | 
				
			||||||
  font-weight: normal;
 | 
					 | 
				
			||||||
  text-transform: none;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.portletSearch {
 | 
					.portletSearch {
 | 
				
			||||||
  padding: 0 0 0 0.6em;
 | 
					  padding: 0 0 0 0.6em;
 | 
				
			||||||
  font-style: normal;
 | 
					  font-style: normal;
 | 
				
			||||||
| 
						 | 
					@ -256,53 +138,10 @@ th {
 | 
				
			||||||
  font-weight: bold;
 | 
					  font-weight: bold;
 | 
				
			||||||
  font-style: normal;
 | 
					  font-style: normal;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
.portletSep       {  border-top: 1px dashed #8cacbb; }
 | 
					
 | 
				
			||||||
.portletGroupItem { padding-left: 0.8em; font-style: italic; }
 | 
					.portletGroupItem { padding-left: 0.8em; font-style: italic; }
 | 
				
			||||||
.portletPageItem  { font-style: italic; }
 | 
					 | 
				
			||||||
.portletCurrent   { font-weight: bold; }
 | 
					 | 
				
			||||||
.portletMenu      { margin-bottom: 0.4em; }
 | 
					.portletMenu      { margin-bottom: 0.4em; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
div.appyGrey {
 | 
					 | 
				
			||||||
  display: none;
 | 
					 | 
				
			||||||
  position: absolute;
 | 
					 | 
				
			||||||
  left: 0px;
 | 
					 | 
				
			||||||
  top: 0px;
 | 
					 | 
				
			||||||
  width:100%;
 | 
					 | 
				
			||||||
  height:100%;
 | 
					 | 
				
			||||||
  background:gray;
 | 
					 | 
				
			||||||
  filter:alpha(Opacity=50);
 | 
					 | 
				
			||||||
  opacity:0.5;
 | 
					 | 
				
			||||||
  -moz-opacity:0.5;
 | 
					 | 
				
			||||||
  -khtml-opacity:0.5
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
div.appyPopup {
 | 
					 | 
				
			||||||
  display: none;
 | 
					 | 
				
			||||||
  position: absolute;
 | 
					 | 
				
			||||||
  top: 30%;
 | 
					 | 
				
			||||||
  left: 35%;
 | 
					 | 
				
			||||||
  width: 350px;
 | 
					 | 
				
			||||||
  z-index : 100;
 | 
					 | 
				
			||||||
  background: white;
 | 
					 | 
				
			||||||
  padding: 8px;
 | 
					 | 
				
			||||||
  border: 1px solid gray;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.translationLabel {
 | 
					 | 
				
			||||||
  background-color: #EAEAEA;
 | 
					 | 
				
			||||||
  border-bottom: 1px dashed grey;
 | 
					 | 
				
			||||||
  margin-top: 1em;
 | 
					 | 
				
			||||||
  margin-bottom: 0.5em;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Uncomment this if you want to hide breadcrumbs */
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
#portal-breadcrumbs {
 | 
					 | 
				
			||||||
  display: none;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* </dtml-with> */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* image-right, but without border */
 | 
					/* image-right, but without border */
 | 
				
			||||||
.image-right {
 | 
					.image-right {
 | 
				
			||||||
  border:0px solid Black;
 | 
					  border:0px solid Black;
 | 
				
			||||||
| 
						 | 
					@ -311,47 +150,4 @@ div.appyPopup {
 | 
				
			||||||
  margin:0.5em;
 | 
					  margin:0.5em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* DOCUMENTATION ON PRE-DEFINED PROPERTIES FROM PLONE */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 /* You can insert colors and other variables from Plone's 
 | 
					 | 
				
			||||||
    base_properties by doing:
 | 
					 | 
				
			||||||
    & dtml-variableName ; (without the spaces, excluded here to not make it render)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Example:
 | 
					 | 
				
			||||||
    myLink {
 | 
					 | 
				
			||||||
        color: & dtml-fontColor ;   (again, without the spaces)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
   This means you can generate your own elements that use Plone's defaults,
 | 
					 | 
				
			||||||
   and respect any customizations people have done. See base_properties for
 | 
					 | 
				
			||||||
   the default values.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   These are the available properties:
 | 
					 | 
				
			||||||
   logoName - the file name of the portal logo. 
 | 
					 | 
				
			||||||
   fontFamily - the font family used for all text that is not headers
 | 
					 | 
				
			||||||
   fontBaseSize - the base font size that everything is calculated from
 | 
					 | 
				
			||||||
   fontColor - the main font color
 | 
					 | 
				
			||||||
   backgroundColor - the background color 
 | 
					 | 
				
			||||||
   linkColor - the color used on normal links
 | 
					 | 
				
			||||||
   linkActiveColor - color used on active links
 | 
					 | 
				
			||||||
   linkVisitedColor - color used on visited links
 | 
					 | 
				
			||||||
   borderWidth - the width of most borders in Plone
 | 
					 | 
				
			||||||
   borderStyle - the style of the border lines, normally solid
 | 
					 | 
				
			||||||
   borderStyleAnnotations - style of border lines on comments etc
 | 
					 | 
				
			||||||
   globalBorderColor - the border color used on the main tabs, the portlets etc
 | 
					 | 
				
			||||||
   globalBackgroundColor - background color for the selected tabs, portlet headings etc
 | 
					 | 
				
			||||||
   globalFontColor - the color of the font in the tabs and in portlet headings
 | 
					 | 
				
			||||||
   headingFontFamily - font family for h1/h2/h3/h4/h5/h6 headlines.
 | 
					 | 
				
			||||||
   headingFontBaseSize - the base size used when calculating the different headline sizes
 | 
					 | 
				
			||||||
   contentViewBorderColor - the content view tabs border color
 | 
					 | 
				
			||||||
   contentViewBackgroundColor - the content view tabs background color
 | 
					 | 
				
			||||||
   contentViewFontColor - the font color used in the content view tabs
 | 
					 | 
				
			||||||
   textTransform - whether to lowercase text in portlets, tabs etc.
 | 
					 | 
				
			||||||
   evenRowBackgroundColor - the background color of even rows in listings
 | 
					 | 
				
			||||||
   oddRowBackgroundColor - the background color of even rows in listings
 | 
					 | 
				
			||||||
   notifyBorderColor - border color of notification elements like the status message, the calendar focus
 | 
					 | 
				
			||||||
   notifyBackgroundColor - background color of notification elements like the status message, the calendar focus
 | 
					 | 
				
			||||||
   discreetColor:string=#999999
 | 
					 | 
				
			||||||
   helpBackgroundColor:string=#ffffe1
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +0,0 @@
 | 
				
			||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
 | 
					 | 
				
			||||||
      i18n:domain="<!applicationName!>">
 | 
					 | 
				
			||||||
<body>
 | 
					 | 
				
			||||||
  <div id="portal-colophon" metal:define-macro="colophon">
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
</body>
 | 
					 | 
				
			||||||
</html>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -66,10 +66,8 @@ applicationGlobalRoles = [<!gRoles!>]
 | 
				
			||||||
grantableRoles = [<!grRoles!>]
 | 
					grantableRoles = [<!grRoles!>]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Configuration options
 | 
					# Configuration options
 | 
				
			||||||
showPortlet = <!showPortlet!>
 | 
					 | 
				
			||||||
languages = [<!languages!>]
 | 
					languages = [<!languages!>]
 | 
				
			||||||
languageSelector = <!languageSelector!>
 | 
					languageSelector = <!languageSelector!>
 | 
				
			||||||
minimalistPlone = <!minimalistPlone!>
 | 
					 | 
				
			||||||
appFrontPage = <!appFrontPage!>
 | 
					appFrontPage = <!appFrontPage!>
 | 
				
			||||||
sourceLanguage = '<!sourceLanguage!>'
 | 
					sourceLanguage = '<!sourceLanguage!>'
 | 
				
			||||||
# ------------------------------------------------------------------------------
 | 
					# ------------------------------------------------------------------------------
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +0,0 @@
 | 
				
			||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
 | 
					 | 
				
			||||||
      i18n:domain="<!applicationName!>">
 | 
					 | 
				
			||||||
<body>
 | 
					 | 
				
			||||||
  <div id="portal-footer" metal:define-macro="portal_footer">
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
</body>
 | 
					 | 
				
			||||||
</html>
 | 
					 | 
				
			||||||