Index: quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/configure.zcml
===================================================================
--- quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/configure.zcml	(revision 3679)
+++ quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/configure.zcml	(revision 3680)
@@ -2,6 +2,4 @@
     xmlns="http://namespaces.zope.org/zope"
     xmlns:browser="http://namespaces.zope.org/browser">
-    
-    <include file="kssactions.zcml" />
     
     <include file="resources.zcml" />
Index: quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/kssactions.zcml
===================================================================
--- quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/kssactions.zcml	(revision 3679)
+++ 	(revision )
@@ -1,112 +1,0 @@
-<configure
-    xmlns="http://namespaces.zope.org/zope"
-    xmlns:browser="http://namespaces.zope.org/browser">
-    
-    <browser:page
-        for="plone.app.kss.interfaces.IPortalObject"
-        attribute="kss_toggleGeneratedTabs"
-        class=".plonetabs.PloneTabsControlPanel"
-        name="plonetabs-toggleGeneratedTabs"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        permission="cmf.ManagePortal"
-        />
-    
-    <browser:page
-        for="plone.app.kss.interfaces.IPortalObject"
-        attribute="kss_toggleActionsVisibility"
-        class=".plonetabs.PloneTabsControlPanel"
-        name="plonetabs-toggleActionsVisibility"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        permission="cmf.ManagePortal"
-        />
-    
-    <browser:page
-        for="plone.app.kss.interfaces.IPortalObject"
-        attribute="kss_toggleRootsVisibility"
-        class=".plonetabs.PloneTabsControlPanel"
-        name="plonetabs-toggleRootsVisibility"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        permission="cmf.ManagePortal"
-        />
-    
-    <browser:page
-        for="plone.app.kss.interfaces.IPortalObject"
-        attribute="kss_deleteAction"
-        class=".plonetabs.PloneTabsControlPanel"
-        name="plonetabs-deleteAction"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        permission="cmf.ManagePortal"
-        />
-    
-    <browser:page
-        for="plone.app.kss.interfaces.IPortalObject"
-        attribute="kss_addAction"
-        class=".plonetabs.PloneTabsControlPanel"
-        name="plonetabs-addAction"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        permission="cmf.ManagePortal"
-        />
-    
-    <browser:page
-        for="plone.app.kss.interfaces.IPortalObject"
-        attribute="kss_showEditForm"
-        class=".plonetabs.PloneTabsControlPanel"
-        name="plonetabs-showEditForm"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        permission="cmf.ManagePortal"
-        />
-    
-    <browser:page
-        for="plone.app.kss.interfaces.IPortalObject"
-        attribute="kss_hideEditForm"
-        class=".plonetabs.PloneTabsControlPanel"
-        name="plonetabs-hideEditForm"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        permission="cmf.ManagePortal"
-        />
-    
-    <browser:page
-        for="plone.app.kss.interfaces.IPortalObject"
-        attribute="kss_hideAddForm"
-        class=".plonetabs.PloneTabsControlPanel"
-        name="plonetabs-hideAddForm"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        permission="cmf.ManagePortal"
-        />
-    
-    <browser:page
-        for="plone.app.kss.interfaces.IPortalObject"
-        attribute="kss_editAction"
-        class=".plonetabs.PloneTabsControlPanel"
-        name="plonetabs-editAction"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        permission="cmf.ManagePortal"
-        />
-    
-    <browser:page
-        for="plone.app.kss.interfaces.IPortalObject"
-        attribute="kss_orderActions"
-        class=".plonetabs.PloneTabsControlPanel"
-        name="plonetabs-orderActions"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        permission="cmf.ManagePortal"
-        />
-    <browser:page
-        for="plone.app.kss.interfaces.IPortalObject"
-        attribute="kss_changeCategory"
-        class=".plonetabs.PloneTabsControlPanel"
-        name="plonetabs-changeCategory"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        permission="cmf.ManagePortal"
-        />
-    
-    <browser:page
-        for="plone.app.kss.interfaces.IPortalObject"
-        attribute="kss_insertModeLink"
-        class=".plonetabs.PloneTabsControlPanel"
-        name="plonetabs-insertModeLink"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        permission="cmf.ManagePortal"
-        />
-    
-</configure>
Index: quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/plonetabs.py
===================================================================
--- quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/plonetabs.py	(revision 3679)
+++ quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/plonetabs.py	(revision 3680)
@@ -1,4 +1,5 @@
 import urllib
 import re
+import json
 
 from Acquisition import aq_inner
@@ -17,9 +18,5 @@
     from zope.container.interfaces import INameChooser
 
-from zope.viewlet.interfaces import IViewletManager, IViewlet
-
 from plone.app.layout.navigation.root import getNavigationRoot
-from plone.app.kss.plonekssview import PloneKSSView
-from kss.core import kssaction, KSSExplicitError
 
 from Products.CMFCore.utils import getToolByName
@@ -50,5 +47,5 @@
 
 
-class PloneTabsControlPanel(PloneKSSView):
+class PloneTabsControlPanel():
 
     implements(IPloneTabsControlPanel)
@@ -70,10 +67,14 @@
         """Perform the update and redirect if necessary, or render the page"""
         postback = True
+        ajaxback = False
         errors = {}
 
         form = self.request.form
         submitted = form.get('form.submitted', False)
+        ajax_request = form.get('ajax_request', False)
 
         # action handler def handler(self, form)
+        if ajax_request:
+            ajaxback = self.ajax_postback(form, errors)
         if submitted:
             postback = self.submitted_postback(form, errors)
@@ -86,5 +87,7 @@
                                             expires=expires)
 
-        if postback:
+        if ajaxback:
+            return json.dumps(ajaxback)
+        elif postback:
             return self.template(errors=errors)
 
@@ -107,4 +110,26 @@
         return postback
 
+
+    def ajax_postback(self, form, errors):
+        """ajax_postback ajaxback"""
+        conv_dict = {
+            "edit_moveact": "manage_ajax_moveAction",
+            "category_change": "manage_ajax_changeCategory",
+            "edit_delete": "manage_ajax_deleteAction",
+            "edit_save": "manage_ajax_saveAction",
+            "edit_cancel": "manage_ajax_cancelEditting",
+            "tabslist_visible": "manage_ajax_toggleActionsVisibility",
+            "roottabs_visible": "manage_ajax_toggleRootsVisibility",
+            "generated_tabs": "manage_ajax_toggleGeneratedTabs",
+            "add_add": "manage_ajax_addAction",
+        }
+        
+        for method in conv_dict.keys():
+            if method in form.keys():
+                method_val = conv_dict.get(method)
+                return  getattr(self, method_val)(form, errors)
+
+        return False
+
     @property
     def plone_portal_state(self):
@@ -122,4 +147,243 @@
         """portal_actions"""
         return getToolByName(self.context, 'portal_actions')
+
+    ########################################
+    # AJAX Methods
+    ########################################
+
+    def manage_ajax_addAction(self, form, errs):
+        # extract posted data
+        resp_dict = {}
+        cat_name = form['cat_name']
+        id, ie7bad_category, data = self.parseAddForm(self.request.form)
+
+        # validate posted data
+        errors = self.validateActionFields(cat_name, data)
+
+        if not errors:
+            action = self.addAction(cat_name, data)
+            # add one more action to actions list
+            content = self.getActionsList(category=cat_name, tabs=[action, ])
+            resp_dict['content'] = content
+            resp_dict['status_code'] = 200
+            resp_dict['status_message'] = "%s action successfully added." % action.id
+        else:
+            resp_dict['status_message'] = "Please correct the indicated errors."
+            resp_dict['status_code'] = 500
+            resp_dict['content'] = errors
+        return resp_dict
+
+    def manage_ajax_toggleGeneratedTabs(self, form, errs):
+        """Toggle autogenaration setting on configlet"""
+        resp_dict = {}
+        errors = []
+        
+        #TODO: parse, validate form
+        checked = form['generated_tabs']
+        field = form['field']
+        
+        if not errors:
+            if checked == 'true':
+                self.setSiteProperties(**{field: False})
+                message = _(u"Generated tabs switched on.")
+            else:
+                self.setSiteProperties(**{field: True})
+                message = _(u"Generated tabs switched off.")
+            content = self.getGeneratedTabs()
+            resp_dict['content'] = content
+            resp_dict['status_code'] = 200
+            resp_dict['status_message'] = message
+        else:
+            resp_dict['status_message'] = errors
+            resp_dict['status_code'] = 500
+        return resp_dict
+
+    def manage_ajax_toggleRootsVisibility(self, form, errs):
+        #Toggle visibility for portal actions
+        resp_dict = {}
+        errors = []
+        
+        #TODO: parse, validate form
+        id = form['orig_id']
+        checked = form['visibility']
+
+        portal = getMultiAdapter((aq_inner(self.context), self.request),
+                                 name='plone_portal_state').portal()
+
+        # remove prefix, added for making ids on configlet unique ("roottabs_")
+        obj_id = id[len("roottabs_"):]
+
+        if obj_id not in portal.objectIds():
+            errors.append("Object with %s id doesn't exist in portal root." % obj_id)
+
+        checked = True if checked == 'true' else False
+
+        if not errors:
+            portal[obj_id].update(excludeFromNav=not checked)
+
+            if checked:
+                message = "%s object was included into navigation." % obj_id
+            else:
+                message = "%s object was excluded from navigation." % obj_id
+            resp_dict['status_message'] = message
+            resp_dict['status_code'] = 200
+        else:
+            resp_dict['status_message'] = errors
+            resp_dict['status_code'] = 500
+        return resp_dict
+
+    def manage_ajax_toggleActionsVisibility(self, form, errs):
+        #Toggle visibility for portal actions
+        resp_dict = {}
+        
+        #TODO: parse, validate form
+        id = form['orig_id']
+        cat_name = form['category']
+        checked = form['visibility']
+
+        act_id, category, action, errors = self.manage_validateAction(id, cat_name)
+
+        if not errors:
+            self.updateAction(act_id, cat_name,
+                              {'id': act_id, 'visible': (checked == 'true') or False})
+            if checked == 'true':
+                message = "%s action is now visible." % act_id
+            else:
+                message = "%s action is now invisible." % act_id
+            resp_dict['status_message'] = message
+            resp_dict['status_code'] = 200
+        else:
+            resp_dict['status_message'] = errors
+            resp_dict['status_code'] = 500
+        return resp_dict
+    
+    def manage_ajax_deleteAction(self, form, errs):
+        """Delete portal action with given id & category"""
+        resp_dict = {}
+        
+        #TODO: parse, validate form
+        id = form['orig_id']
+        cat_name = form['category']
+
+        act_id, category, action, errors = self.manage_validateAction(id, cat_name)
+        if not errors:
+            self.deleteAction(act_id, cat_name)
+            resp_dict['status_message'] =  "%s action successfully removed." % act_id
+            resp_dict['status_code'] = 200
+        else:
+            resp_dict['status_message'] = errors
+            resp_dict['status_code'] = 500
+        return resp_dict
+
+    def manage_ajax_cancelEditting(self, form, errs):
+        """Hide edit form for given action"""
+        resp_dict = {}
+        #TODO: parse, validate form
+        id = form['orig_id']
+        cat_name = form['category']
+
+        act_id, category, action, errors = self.manage_validateAction(id, cat_name)
+
+        if not errors:
+            content = self.getActionsList(category=cat_name, tabs=[action, ])
+            resp_dict['content'] = content
+            resp_dict['status_message'] =  "Changes discarded."
+            resp_dict['status_code'] = 200
+        else:
+            resp_dict['status_message'] = errors
+            resp_dict['status_code'] = 500
+        return resp_dict
+
+    def manage_validateAction(self, action_id, cat_name):
+        """Check whether action with given id exists in cat_name category"""
+        errors = []
+        act_id = ""
+        category = ""
+        action = ""
+
+        act_id = action_id
+
+        try:
+            category = self.getActionCategory(cat_name)
+        except Exception:
+            errors.append("%s action category does not exist." % cat_name)
+
+        try:
+            action = category[act_id]
+        except Exception:
+            errors.append("No %s action in %s category." %
+                                   (act_id, cat_name))
+        return (act_id, category, action, errors)
+
+    def manage_ajax_saveAction(self, form, errs):
+        """Manage Method to update action"""
+        # extract posted data
+        resp_dict = {}
+        id, cat_name, data = self.parseEditForm(form)
+
+        # get category and action to edit
+        category = self.getActionCategory(cat_name)
+        action = category[id]
+
+        # validate posted data
+        errors = self.validateActionFields(
+            cat_name, data, allow_dup=(id == data['id']))
+
+        if not errors:
+            action = self.updateAction(id, cat_name, data)
+            content = self.getActionsList(category=cat_name, tabs=[action, ])
+            resp_dict['content'] = content
+            resp_dict['status_code'] = 200
+            resp_dict['status_message'] = "%s action successfully updated." % action.id
+        else:
+            resp_dict['status_code'] = 500
+            resp_dict['content'] = errors
+            resp_dict['status_message'] = "Please correct the indicated errors."
+        return resp_dict
+
+    def manage_ajax_moveAction(self, form, errs):
+        resp_dict = {}
+        cat_name = form['cat_name']
+        category = self.getActionCategory(cat_name)
+        components = urllib.unquote(form['actions']).split('&')
+        if self.sufix == '':
+            ids = [component[len(self.prefix):] for component in components]
+        else:
+            ids = [component[len(self.prefix):-len(self.sufix)]
+                   for component in components]
+        # do actual sorting
+        resp = category.moveObjectsByDelta(ids, -len(category.objectIds()))
+
+        if resp:
+            resp_dict['status_code'] = 200
+            resp_dict['status_message'] = "Actions successfully sorted."
+        else:
+            resp_dict['status_code'] = 500
+            resp_dict['status_message'] = "There was error while sorting, or list not changed"
+        return resp_dict
+
+    def manage_ajax_changeCategory(self, form, errs):
+        resp_dict = {}
+        errors = []
+
+        """Change action category to manage"""
+        cat_name = form['category']
+        # update actions list
+        resp_dict['actionslist'] = self.getActionsList(category=cat_name)
+        # update autogenerated sections
+        resp_dict['section'] = self.getAutoGenereatedSection(cat_name)
+        # and title
+        ts = getToolByName(self.context, 'translation_service')
+        resp_dict['title'] = ts.translate(self.getPageTitle(cat_name), context=self.context)
+    
+        if not errors:
+            resp_dict['status_code'] = 200
+            resp_dict['status_message'] = "Category changed successfully"
+        else:
+            resp_dict['status_code'] = 500
+            resp_dict['status_message'] = "There was error while changed category"
+
+        return resp_dict
+
 
     ########################################
@@ -504,360 +768,4 @@
         return selected_tabs['portal']
 
-    ##########################
-    #
-    # KSS Server Actions
-    #
-    ##########################
-
-    @kssaction
-    def kss_insertModeLink(self):
-        """Insert link which allows change categories between plain and rich"""
-        ksscore = self.getCommandSet('core')
-
-        html = self.link_template()
-        target = ksscore.getCssSelector('.link-parent')
-        ksscore.insertHTMLAfter(target, html, withKssSetup='False')
-
-    @kssaction
-    def kss_changeCategory(self, cat_name):
-        """Change action category to manage"""
-        ksscore = self.getCommandSet('core')
-
-        # update actions list
-        actionslist = self.getActionsList(category=cat_name)
-        ksscore.replaceInnerHTML(ksscore.getHtmlIdSelector('tabslist'),
-                                 actionslist)
-
-        # update autogenerated sections
-        section = self.getAutoGenereatedSection(cat_name)
-        ksscore.replaceHTML(
-            ksscore.getHtmlIdSelector('autogeneration_section'), section)
-        # and title
-        ts = getToolByName(self.context, 'translation_service')
-        title = ts.translate(self.getPageTitle(cat_name), context=self.context)
-        ksscore.replaceInnerHTML(
-            ksscore.getHtmlIdSelector('plonetabs-form-title'), title)
-
-        # update category hidden field on adding form
-        ksscore.setAttribute(ksscore.getCssSelector(
-            'form[name=addaction_form] input[name=category]'),
-            'value',
-            cat_name)
-
-        # update state variable 'plonetabs-category' on client
-        ksscore.setStateVar('plonetabs-category', cat_name)
-
-        # hide adding form
-        self.kss_hideAddForm()
-
-        # issue portal status message
-        self.kss_issueMessage(_(u"Category changed successfully."))
-
-    @kssaction
-    def kss_toggleGeneratedTabs(self, field, checked='0'):
-        """Toggle autogenaration setting on configlet"""
-        if checked == '1':
-            self.setSiteProperties(**{field: False})
-            if field == 'disable_nonfolderish_sections':
-                message = _(u"Generated not folderish tabs switched on.")
-            else:
-                message = _(u"Generated tabs switched on.")
-        else:
-            self.setSiteProperties(**{field: True})
-            if field == 'disable_nonfolderish_sections':
-                message = _(u"Generated not folderish tabs switched off.")
-            else:
-                message = _(u"Generated tabs switched off.")
-
-        # update client
-        ksscore = self.getCommandSet("core")
-        content = self.getGeneratedTabs()
-        ksscore.replaceInnerHTML(ksscore.getHtmlIdSelector('roottabs'),
-                                 content)
-
-        # update global-sections viewlet
-        self.updatePortalTabsPageSection()
-
-        # issue portal status message
-        self.kss_issueMessage(message)
-
-    @kssaction
-    def kss_toggleRootsVisibility(self, id, checked='0'):
-        """Toggle visibility for portal root objects (exclude_from_nav)"""
-        portal = self.plone_portal_state.portal()
-
-        # remove prefix, added for making ids on configlet unique ("roottabs_")
-        obj_id = id[len("roottabs_"):]
-
-        if obj_id not in portal.objectIds():
-            raise KSSExplicitError("Object with %s id doesn't"
-                                   " exist in portal root." % obj_id)
-
-        if checked == '1':
-            checked = True
-        else:
-            checked = False
-
-        portal[obj_id].update(excludeFromNav=not checked)
-
-        # update client
-        ksscore = self.getCommandSet("core")
-        if checked:
-            ksscore.removeClass(ksscore.getHtmlIdSelector(id),
-                                value="invisible")
-            message = _(u"'${id}' object was included into navigation.",
-                        mapping={'id': obj_id})
-        else:
-            ksscore.addClass(ksscore.getHtmlIdSelector(id), value="invisible")
-            message = _(u"'${id}' object was excluded from navigation.",
-                        mapping={'id': obj_id})
-
-        # update global-sections viewlet
-        self.updatePortalTabsPageSection()
-
-        # issue portal status message
-        self.kss_issueMessage(message)
-
-    @kssaction
-    def kss_toggleActionsVisibility(self, id, checked='0', cat_name=None):
-        """Toggle visibility for portal actions"""
-        # validate input
-        act_id, category, action = self.kss_validateAction(id, cat_name)
-        self.updateAction(act_id, cat_name,
-                          {'id': act_id, 'visible': (checked == '1') or False})
-
-        # update client
-        ksscore = self.getCommandSet("core")
-        if checked == '1':
-            ksscore.removeClass(ksscore.getHtmlIdSelector(id),
-                                value="invisible")
-            message = _(u"'${id}' action is now visible.",
-                        mapping={'id': act_id})
-        else:
-            ksscore.addClass(ksscore.getHtmlIdSelector(id), value="invisible")
-            message = _(u"'${id}' action is now invisible.",
-                        mapping={'id': act_id})
-        self.updatePage(cat_name)
-
-        # issue portal status message
-        self.kss_issueMessage(message)
-
-    @kssaction
-    def kss_deleteAction(self, id, cat_name):
-        """Delete portal action with given id & category"""
-        # validate input
-        act_id, category, action = self.kss_validateAction(id, cat_name)
-        self.deleteAction(act_id, cat_name)
-
-        # update client
-        ksscore = self.getCommandSet("core")
-        # XXX TODO: fade effect during removing, to do this
-        # we need kukit js action/command plugin
-        ksscore.deleteNode(ksscore.getHtmlIdSelector(id))
-
-        # update different sections of page depending on actions category
-        self.updatePage(cat_name)
-
-        # issue portal status message
-        self.kss_issueMessage(_(u"'${id}' action successfully removed.",
-                                mapping={'id': act_id}))
-
-    @kssaction
-    def kss_addAction(self, cat_name):
-        """KSS method to add new portal action"""
-        # extract posted data
-        id, ie7bad_category, data = self.parseAddForm(self.request.form)
-
-        # validate posted data
-        errors = self.validateActionFields(cat_name, data)
-
-        # if not errors find (or create) category and set action to it
-        ksscore = self.getCommandSet('core')
-        if not errors:
-            action = self.addAction(cat_name, data)
-
-            # update client
-            # add one more action to actions list
-            content = self.getActionsList(category=cat_name, tabs=[action, ])
-            ksscore.insertHTMLAsLastChild(
-                ksscore.getHtmlIdSelector('tabslist'),
-                content)
-
-            # update reorder controls
-            # self.kss_checkReorderControls(cat_name)
-
-            # hide adding form
-            ksscore.removeClass(ksscore.getHtmlIdSelector('addaction'),
-                                'adding')
-            self.kss_toggleCollapsible(
-                ksscore.getCssSelector('form[name=addaction_form] '
-                                       '.headerAdvanced'), collapse='true')
-
-            # set client state var 'plonetabs-addingTitle' to empty
-            # string for correct id autogeneration functionality
-            ksscore.setStateVar('plonetabs-addingTitle', '')
-
-            # reset adding form
-            self.kss_resetForm(ksscore.getHtmlIdSelector('addaction'))
-
-            # remove focus from name input
-            self.kss_blur(ksscore.getHtmlIdSelector('actname'))
-
-            message = _(u"'${id}' action successfully added.",
-                        mapping={'id': action.id})
-            msgtype = "info"
-
-            # update page
-            self.updatePage(cat_name)
-        else:
-            # expand advanced section if there are errors in id or condition
-            if 'id' in errors or 'available_expr' in errors:
-                self.kss_toggleCollapsible(
-                    ksscore.getCssSelector('form[name=addaction_form] '
-                                           '.headerAdvanced'),
-                    collapse='false')
-
-            message = _(u"Please correct the indicated errors.")
-            msgtype = "error"
-
-        # update errors on client form
-        self.kss_issueErrors(errors)
-
-        # issue portal status message
-        self.kss_issueMessage(message, msgtype)
-
-    @kssaction
-    def kss_hideAddForm(self):
-        """"Hide Add form, reset it and remove error messages"""
-        # no server changes, only update client
-        ksscore = self.getCommandSet("core")
-
-        # hide form itself
-        ksscore.removeClass(ksscore.getHtmlIdSelector('addaction'), 'adding')
-
-        # collapse advanced section
-        self.kss_toggleCollapsible(
-            ksscore.getCssSelector(
-                'form[name=addaction_form] .headerAdvanced'),
-            collapse='true')
-
-        # reset form inputs
-        self.kss_resetForm(ksscore.getHtmlIdSelector('addaction'))
-
-        # set client state var 'plonetabs-addingTitle' to empty string for
-        # correct id autogeneration functionality
-        ksscore.setStateVar('plonetabs-addingTitle', '')
-
-        # remove form errors if such exist
-        self.kss_issueErrors({})
-
-        # issue portal status message
-        self.kss_issueMessage(_(u"Adding canceled."))
-
-    @kssaction
-    def kss_showEditForm(self, id, cat_name):
-        """Show edit form for given action"""
-        act_id, category, action = self.kss_validateAction(id, cat_name)
-
-        # fetch data
-        action_info = self.copyAction(action)
-        action_info["editing"] = True
-
-        # update client
-        ksscore = self.getCommandSet("core")
-        content = self.getActionsList(category=cat_name, tabs=[action_info, ])
-        ksscore.replaceHTML(ksscore.getHtmlIdSelector(id), content)
-
-        # focus name field
-        ksscore.focus(
-            ksscore.getCssSelector("#%s input[name=title_%s]" % (id, act_id)))
-
-        # issue portal status message
-        self.kss_issueMessage(_(u"Fill in required fields and click on Add."))
-
-    @kssaction
-    def kss_hideEditForm(self, id, cat_name):
-        """Hide edit form for given action"""
-        act_id, category, action = self.kss_validateAction(id, cat_name)
-
-        # update client
-        ksscore = self.getCommandSet("core")
-        content = self.getActionsList(category=cat_name, tabs=[action, ])
-        ksscore.replaceHTML(ksscore.getHtmlIdSelector(id), content)
-
-        # issue portal status message
-        self.kss_issueMessage(_(u"Changes discarded."))
-
-    @kssaction
-    def kss_editAction(self):
-        """Update action's properties"""
-        id, cat_name, data = self.parseEditForm(self.request.form)
-
-        # get category and action to edit
-        category = self.getActionCategory(cat_name)
-        action = category[id]
-
-        # validate posted data
-        errors = self.validateActionFields(cat_name, data,
-                                           allow_dup=(id == data['id']))
-
-        html_id = '%s%s%s' % (self.prefix, id, self.sufix)
-        ksscore = self.getCommandSet('core')
-        if not errors:
-            action = self.updateAction(id, cat_name, data)
-
-            # update client
-            # replace action item with updated one
-            content = self.getActionsList(category=cat_name, tabs=[action, ])
-            ksscore.replaceHTML(ksscore.getHtmlIdSelector(html_id), content)
-
-            message = _(u"'${id}' action successfully updated.",
-                        mapping={'id': action.id})
-            msgtype = "info"
-
-            # update page
-            self.updatePage(cat_name)
-        else:
-            # issue error messages
-            self.kss_issueErrors(errors, editform=id)
-
-            # expand advanced section if there are errors in id,
-            # action url or condition
-            if 'id' in errors or 'available_expr' in errors or \
-                    'url_expr' in errors:
-                self.kss_toggleCollapsible(
-                    ksscore.getCssSelector('#%s .headerAdvanced' % html_id),
-                    collapse='false')
-
-            message = _(u"Please correct the indicated errors.")
-            msgtype = "error"
-
-        # issue portal status message
-        self.kss_issueMessage(message, msgtype)
-
-    @kssaction
-    def kss_orderActions(self):
-        """Update actions order in the given category"""
-        form = self.request.form
-        cat_name = form['cat_name']
-        category = self.getActionCategory(cat_name)
-
-        # decode URI components and collect ids from request
-        components = urllib.unquote(form['actions']).split('&')
-        if self.sufix == '':
-            ids = [component[len(self.prefix):] for component in components]
-        else:
-            ids = [component[len(self.prefix):-len(self.sufix)]
-                   for component in components]
-
-        # do actual sorting
-        category.moveObjectsByDelta(ids, -len(category.objectIds()))
-
-        # update client
-        self.updatePage(cat_name)
-
-        # issue portal status message
-        self.kss_issueMessage(_(u"Actions successfully sorted."))
-
     #
     # Utility Methods
@@ -1015,129 +923,4 @@
 
     #
-    # Utility methods for the kss actions management
-    #
-
-    def kss_validateAction(self, id, cat_name):
-        """Check whether action with given id exists in cat_name category"""
-        try:
-            category = self.getActionCategory(cat_name)
-        except Exception:
-            raise KSSExplicitError(u"%s action category does not exist." %
-                                   cat_name)
-
-        # extract action id from given list item id on client
-        action_id = self.sufix and id[len(self.prefix):-len(self.sufix)] or \
-            id[len(self.prefix):]
-        try:
-            action = category[action_id]
-        except Exception:
-            raise KSSExplicitError("No %s action in %s category." %
-                                   (action_id, cat_name))
-
-        return (action_id, category, action)
-
-    def kss_issueErrors(self, errors, editform=False, fields=ACTION_ATTRS):
-        """Display error messages on the client"""
-        ksscore = self.getCommandSet('core')
-        ts = getToolByName(self.context, 'translation_service')
-        for field in fields:
-            self.kss_issueFieldError(ksscore, field,
-                                     errors.get(field, False), editform, ts)
-
-    def kss_issueFieldError(self, ksscore, name, error, editform, ts):
-        """Issue this error message for the field"""
-        if editform:
-            id = '%s%s%s' % (self.prefix, editform, self.sufix)
-            field_selector = ksscore.getCssSelector(
-                '#%s .edit-field-%s' % (id, UI_ATTRS.get(name, name)))
-            field_error_selector = ksscore.getCssSelector(
-                '#%s .edit-field-%s .error-container' % (id,
-                                                         UI_ATTRS.get(name,
-                                                                      name)))
-        else:
-            field_selector = ksscore.getCssSelector(
-                'form[name=addaction_form] .field-%s' % UI_ATTRS.get(name,
-                                                                     name))
-            field_error_selector = ksscore.getCssSelector(
-                'form[name=addaction_form] .field-%s '
-                '.error-container' % UI_ATTRS.get(name, name))
-
-        if error:
-            error = ts.translate(error, context=self.context)
-            ksscore.replaceInnerHTML(field_error_selector, error)
-            ksscore.addClass(field_selector, 'error')
-        else:
-            ksscore.clearChildNodes(field_error_selector)
-            ksscore.removeClass(field_selector, 'error')
-
-    def kss_toggleCollapsible(self, selector, collapsed=None,
-                              expanded=None, collapse=None):
-        """KSS Server command to add plonetabs-toggleCollapsible client
-        action to response
-        """
-        command = self.commands.addCommand('plonetabs-toggleCollapsible',
-                                           selector)
-        if collapsed is not None:
-            command.addParam('collapsed', collapsed)
-        if expanded is not None:
-            command.addParam('expanded', expanded)
-        if collapse is not None:
-            command.addParam('collapse', collapse)
-
-    def kss_resetForm(self, selector):
-        """KSS Server command to reset form on client"""
-
-    def kss_blur(self, selector):
-        """KSS Server command to remove focus from input"""
-        self.commands.addCommand('plonetabs-blur', selector)
-
-    def kss_replaceOrInsert(self, selector, parentSelector, html,
-                            withKssSetup='True', alternativeHTML='',
-                            selectorType='', position='', positionSelector='',
-                            positionSelectorType=''):
-        """KSS Server command to execute replaceOrInsert client action"""
-        command = self.commands.addCommand('plonetabs-replaceOrInsert',
-                                           selector)
-        command.addParam('selector', parentSelector)
-        command.addHtmlParam('html', html)
-        command.addParam('withKssSetup', withKssSetup)
-        if alternativeHTML:
-            command.addHtmlParam('alternativeHTML', alternativeHTML)
-        if selectorType:
-            command.addParam('selectorType', selectorType)
-        if position:
-            command.addParam('position', position)
-        if positionSelector:
-            command.addParam('positionSelector', positionSelector)
-        if positionSelectorType:
-            command.addParam('positionSelectorType',
-                             positionSelectorType)
-
-    def kss_issueMessage(self, message, msgtype="info"):
-        """"Issues portal status message and removes it afte 10 seconds"""
-        ksscore = self.getCommandSet('core')
-        self.getCommandSet('plone').issuePortalMessage(message,
-                                                       msgtype=msgtype)
-        self.kss_timeout(
-            ksscore.getHtmlIdSelector('kssPortalMessage'),
-            delay='10000', repeat='false',
-            cmd_name='setStyle', name='display', value='none'
-        )
-
-    def kss_timeout(self, selector, **kw):
-        """KSS Server command to execute plonetabs-timeout client action"""
-        self.commands.addCommand('plonetabs-timeout', selector, **kw)
-
-    def renderViewlet(self, manager, name):
-        if isinstance(manager, basestring):
-            manager = getMultiAdapter((self.context, self.request, self,),
-                                      IViewletManager, name=manager)
-        renderer = getMultiAdapter((self.context, self.request, self, manager),
-                                   IViewlet, name=name)
-        renderer = renderer.__of__(self.context)
-        renderer.update()
-        return renderer.render()
-
-    #
     # Basic API to work with portal actions tool in a more pleasent way
     #
@@ -1187,57 +970,4 @@
         return False
 
-    #
-    # KSS Methods that are used to update different parts of the page
-    # accordingly to category
-    #
-
-    def updatePage(self, category):
-        """Seek for according method in class and calls it if found
-        Example of making up method's name:
-            portal_tabs => updatePortalTabsPageSection
-        """
-        method_name = 'update%sPageSection' % ''.join(
-            map(lambda x: x.capitalize(), category.split('_')))
-        if hasattr(self, method_name):
-            getattr(self, method_name)()
-
-    def updatePortalTabsPageSection(self):
-        """Method for updating global-sections on client"""
-        ksscore = self.getCommandSet("core")
-        self.kss_replaceOrInsert(ksscore.getHtmlIdSelector("portal-header"),
-                                 "portal-globalnav",
-                                 self.sections_template(),
-                                 withKssSetup='False',
-                                 selectorType='htmlid')
-
-    def updateSiteActionsPageSection(self):
-        """Method for updating site action on client"""
-        ksscore = self.getCommandSet("core")
-        self.kss_replaceOrInsert(ksscore.getHtmlIdSelector("portal-header"),
-                                 "portal-siteactions",
-                                 self.renderViewlet("plone.portalheader",
-                                                    "plone.site_actions"),
-                                 withKssSetup='False',
-                                 selectorType='htmlid',
-                                 position="before",
-                                 positionSelector="portal-searchbox",
-                                 positionSelectorType="htmlid")
-
-        # ksszope = self.getCommandSet("zope")
-        # ksszope.refreshViewlet(
-           # self.getCommandSet("core").getHtmlIdSelector("portal-siteactions"
-           #     ""),
-           #"plone.portalheader",
-           #"plone.site_actions")
-
-    def updateUserPageSection(self):
-        """Method for updating site action on client"""
-        ksszope = self.getCommandSet("zope")
-        ksszope.refreshViewlet(
-            self.getCommandSet("core").getHtmlIdSelector(
-                "portal-personaltools-wrapper"),
-            "plone.portaltop",
-            "plone.personal_bar")
-
 
 class PloneTabsMode(BrowserView):
Index: quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/resources.zcml
===================================================================
--- quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/resources.zcml	(revision 3679)
+++ quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/resources.zcml	(revision 3680)
@@ -45,31 +45,4 @@
         file="./resources/plonetabs.css"
         layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        />
-    
-    <!-- Register kukit stylesheets -->
-    <browser:resource
-        name="plonetabs.kss"
-        file="./resources/plonetabs.kss"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        />
-
-    <browser:resource
-        name="plonetabsmode.kss"
-        file="./resources/plonetabsmode.kss"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        />
-    
-    <!-- Register scriptaculous dragdrop js library -->
-    <browser:resource
-        name="sa_dragdrop.js"
-        file="./resources/dragdrop.js"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        />
-
-    <browser:resource
-        name="pt_effects.js"
-        file="./resources/effects.js"
-        layer="quintagroup.plonetabs.interfaces.IPloneTabsProductLayer"
-        />
-    
+        />    
 </configure>
Index: quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/resources/dragdrop.js
===================================================================
--- quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/resources/dragdrop.js	(revision 3679)
+++ 	(revision )
@@ -1,944 +1,0 @@
-// script.aculo.us dragdrop.js v1.6.5, Wed Nov 08 14:17:49 CET 2006
-
-// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//           (c) 2005, 2006 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
-// 
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-if(typeof Effect == 'undefined')
-  throw("dragdrop.js requires including script.aculo.us' effects.js library");
-
-var Droppables = {
-  drops: [],
-
-  remove: function(element) {
-    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
-  },
-
-  add: function(element) {
-    element = $(element);
-    var options = Object.extend({
-      greedy:     true,
-      hoverclass: null,
-      tree:       false
-    }, arguments[1] || {});
-
-    // cache containers
-    if(options.containment) {
-      options._containers = [];
-      var containment = options.containment;
-      if((typeof containment == 'object') && 
-        (containment.constructor == Array)) {
-        containment.each( function(c) { options._containers.push($(c)) });
-      } else {
-        options._containers.push($(containment));
-      }
-    }
-    
-    if(options.accept) options.accept = [options.accept].flatten();
-
-    Element.makePositioned(element); // fix IE
-    options.element = element;
-
-    this.drops.push(options);
-  },
-  
-  findDeepestChild: function(drops) {
-    deepest = drops[0];
-      
-    for (i = 1; i < drops.length; ++i)
-      if (Element.isParent(drops[i].element, deepest.element))
-        deepest = drops[i];
-    
-    return deepest;
-  },
-
-  isContained: function(element, drop) {
-    var containmentNode;
-    if(drop.tree) {
-      containmentNode = element.treeNode; 
-    } else {
-      containmentNode = element.parentNode;
-    }
-    return drop._containers.detect(function(c) { return containmentNode == c });
-  },
-  
-  isAffected: function(point, element, drop) {
-    return (
-      (drop.element!=element) &&
-      ((!drop._containers) ||
-        this.isContained(element, drop)) &&
-      ((!drop.accept) ||
-        (Element.classNames(element).detect( 
-          function(v) { return drop.accept.include(v) } ) )) &&
-      Position.within(drop.element, point[0], point[1]) );
-  },
-
-  deactivate: function(drop) {
-    if(drop.hoverclass)
-      Element.removeClassName(drop.element, drop.hoverclass);
-    this.last_active = null;
-  },
-
-  activate: function(drop) {
-    if(drop.hoverclass)
-      Element.addClassName(drop.element, drop.hoverclass);
-    this.last_active = drop;
-  },
-
-  show: function(point, element) {
-    if(!this.drops.length) return;
-    var affected = [];
-    
-    if(this.last_active) this.deactivate(this.last_active);
-    this.drops.each( function(drop) {
-      if(Droppables.isAffected(point, element, drop))
-        affected.push(drop);
-    });
-        
-    if(affected.length>0) {
-      drop = Droppables.findDeepestChild(affected);
-      Position.within(drop.element, point[0], point[1]);
-      if(drop.onHover)
-        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
-      
-      Droppables.activate(drop);
-    }
-  },
-
-  fire: function(event, element) {
-    if(!this.last_active) return;
-    Position.prepare();
-
-    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
-      if (this.last_active.onDrop) 
-        this.last_active.onDrop(element, this.last_active.element, event);
-  },
-
-  reset: function() {
-    if(this.last_active)
-      this.deactivate(this.last_active);
-  }
-}
-
-var Draggables = {
-  drags: [],
-  observers: [],
-  
-  register: function(draggable) {
-    if(this.drags.length == 0) {
-      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
-      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
-      this.eventKeypress  = this.keyPress.bindAsEventListener(this);
-      
-      Event.observe(document, "mouseup", this.eventMouseUp);
-      Event.observe(document, "mousemove", this.eventMouseMove);
-      Event.observe(document, "keypress", this.eventKeypress);
-    }
-    this.drags.push(draggable);
-  },
-  
-  unregister: function(draggable) {
-    this.drags = this.drags.reject(function(d) { return d==draggable });
-    if(this.drags.length == 0) {
-      Event.stopObserving(document, "mouseup", this.eventMouseUp);
-      Event.stopObserving(document, "mousemove", this.eventMouseMove);
-      Event.stopObserving(document, "keypress", this.eventKeypress);
-    }
-  },
-  
-  activate: function(draggable) {
-    if(draggable.options.delay) { 
-      this._timeout = setTimeout(function() { 
-        Draggables._timeout = null; 
-        window.focus(); 
-        Draggables.activeDraggable = draggable; 
-      }.bind(this), draggable.options.delay); 
-    } else {
-      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
-      this.activeDraggable = draggable;
-    }
-  },
-  
-  deactivate: function() {
-    this.activeDraggable = null;
-  },
-  
-  updateDrag: function(event) {
-    if(!this.activeDraggable) return;
-    var pointer = [Event.pointerX(event), Event.pointerY(event)];
-    // Mozilla-based browsers fire successive mousemove events with
-    // the same coordinates, prevent needless redrawing (moz bug?)
-    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
-    this._lastPointer = pointer;
-    
-    this.activeDraggable.updateDrag(event, pointer);
-  },
-  
-  endDrag: function(event) {
-    if(this._timeout) { 
-      clearTimeout(this._timeout); 
-      this._timeout = null; 
-    }
-    if(!this.activeDraggable) return;
-    this._lastPointer = null;
-    this.activeDraggable.endDrag(event);
-    this.activeDraggable = null;
-  },
-  
-  keyPress: function(event) {
-    if(this.activeDraggable)
-      this.activeDraggable.keyPress(event);
-  },
-  
-  addObserver: function(observer) {
-    this.observers.push(observer);
-    this._cacheObserverCallbacks();
-  },
-  
-  removeObserver: function(element) {  // element instead of observer fixes mem leaks
-    this.observers = this.observers.reject( function(o) { return o.element==element });
-    this._cacheObserverCallbacks();
-  },
-  
-  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
-    if(this[eventName+'Count'] > 0)
-      this.observers.each( function(o) {
-        if(o[eventName]) o[eventName](eventName, draggable, event);
-      });
-    if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
-  },
-  
-  _cacheObserverCallbacks: function() {
-    ['onStart','onEnd','onDrag'].each( function(eventName) {
-      Draggables[eventName+'Count'] = Draggables.observers.select(
-        function(o) { return o[eventName]; }
-      ).length;
-    });
-  }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var Draggable = Class.create();
-Draggable._dragging    = {};
-
-Draggable.prototype = {
-  initialize: function(element) {
-    var defaults = {
-      handle: false,
-      reverteffect: function(element, top_offset, left_offset) {
-        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
-        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
-          queue: {scope:'_draggable', position:'end'}
-        });
-      },
-      endeffect: function(element) {
-        var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;
-        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, 
-          queue: {scope:'_draggable', position:'end'},
-          afterFinish: function(){ 
-            Draggable._dragging[element] = false 
-          }
-        }); 
-      },
-      zindex: 1000,
-      revert: false,
-      scroll: false,
-      scrollSensitivity: 20,
-      scrollSpeed: 15,
-      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] }
-      delay: 0
-    };
-    
-    if(!arguments[1] || typeof arguments[1].endeffect == 'undefined')
-      Object.extend(defaults, {
-        starteffect: function(element) {
-          element._opacity = Element.getOpacity(element);
-          Draggable._dragging[element] = true;
-          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); 
-        }
-      });
-    
-    var options = Object.extend(defaults, arguments[1] || {});
-
-    this.element = $(element);
-    
-    if(options.handle && (typeof options.handle == 'string'))
-      this.handle = this.element.down('.'+options.handle, 0);
-    
-    if(!this.handle) this.handle = $(options.handle);
-    if(!this.handle) this.handle = this.element;
-    
-    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
-      options.scroll = $(options.scroll);
-      this._isScrollChild = Element.childOf(this.element, options.scroll);
-    }
-
-    Element.makePositioned(this.element); // fix IE    
-
-    this.delta    = this.currentDelta();
-    this.options  = options;
-    this.dragging = false;   
-
-    this.eventMouseDown = this.initDrag.bindAsEventListener(this);
-    Event.observe(this.handle, "mousedown", this.eventMouseDown);
-    
-    Draggables.register(this);
-  },
-  
-  destroy: function() {
-    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
-    Draggables.unregister(this);
-  },
-  
-  currentDelta: function() {
-    return([
-      parseInt(Element.getStyle(this.element,'left') || '0'),
-      parseInt(Element.getStyle(this.element,'top') || '0')]);
-  },
-  
-  initDrag: function(event) {
-    if(typeof Draggable._dragging[this.element] != 'undefined' &&
-      Draggable._dragging[this.element]) return;
-    if(Event.isLeftClick(event)) {    
-      // abort on form elements, fixes a Firefox issue
-      var src = Event.element(event);
-      if(src.tagName && (
-        src.tagName=='INPUT' ||
-        src.tagName=='SELECT' ||
-        src.tagName=='OPTION' ||
-        src.tagName=='BUTTON' ||
-        src.tagName=='TEXTAREA')) return;
-        
-      var pointer = [Event.pointerX(event), Event.pointerY(event)];
-      var pos     = Position.cumulativeOffset(this.element);
-      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
-      
-      Draggables.activate(this);
-      Event.stop(event);
-    }
-  },
-  
-  startDrag: function(event) {
-    this.dragging = true;
-    
-    if(this.options.zindex) {
-      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
-      this.element.style.zIndex = this.options.zindex;
-    }
-    
-    if(this.options.ghosting) {
-      this._clone = this.element.cloneNode(true);
-      Position.absolutize(this.element);
-      this.element.parentNode.insertBefore(this._clone, this.element);
-    }
-    
-    if(this.options.scroll) {
-      if (this.options.scroll == window) {
-        var where = this._getWindowScroll(this.options.scroll);
-        this.originalScrollLeft = where.left;
-        this.originalScrollTop = where.top;
-      } else {
-        this.originalScrollLeft = this.options.scroll.scrollLeft;
-        this.originalScrollTop = this.options.scroll.scrollTop;
-      }
-    }
-    
-    Draggables.notify('onStart', this, event);
-        
-    if(this.options.starteffect) this.options.starteffect(this.element);
-  },
-  
-  updateDrag: function(event, pointer) {
-    if(!this.dragging) this.startDrag(event);
-    Position.prepare();
-    Droppables.show(pointer, this.element);
-    Draggables.notify('onDrag', this, event);
-    
-    this.draw(pointer);
-    if(this.options.change) this.options.change(this);
-    
-    if(this.options.scroll) {
-      this.stopScrolling();
-      
-      var p;
-      if (this.options.scroll == window) {
-        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
-      } else {
-        p = Position.page(this.options.scroll);
-        p[0] += this.options.scroll.scrollLeft + Position.deltaX;
-        p[1] += this.options.scroll.scrollTop + Position.deltaY;
-        p.push(p[0]+this.options.scroll.offsetWidth);
-        p.push(p[1]+this.options.scroll.offsetHeight);
-      }
-      var speed = [0,0];
-      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
-      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
-      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
-      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
-      this.startScrolling(speed);
-    }
-    
-    // fix AppleWebKit rendering
-    if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
-    
-    Event.stop(event);
-  },
-  
-  finishDrag: function(event, success) {
-    this.dragging = false;
-
-    if(this.options.ghosting) {
-      Position.relativize(this.element);
-      Element.remove(this._clone);
-      this._clone = null;
-    }
-
-    if(success) Droppables.fire(event, this.element);
-    Draggables.notify('onEnd', this, event);
-
-    var revert = this.options.revert;
-    if(revert && typeof revert == 'function') revert = revert(this.element);
-    
-    var d = this.currentDelta();
-    if(revert && this.options.reverteffect) {
-      this.options.reverteffect(this.element, 
-        d[1]-this.delta[1], d[0]-this.delta[0]);
-    } else {
-      this.delta = d;
-    }
-
-    if(this.options.zindex)
-      this.element.style.zIndex = this.originalZ;
-
-    if(this.options.endeffect) 
-      this.options.endeffect(this.element);
-      
-    Draggables.deactivate(this);
-    Droppables.reset();
-  },
-  
-  keyPress: function(event) {
-    if(event.keyCode!=Event.KEY_ESC) return;
-    this.finishDrag(event, false);
-    Event.stop(event);
-  },
-  
-  endDrag: function(event) {
-    if(!this.dragging) return;
-    this.stopScrolling();
-    this.finishDrag(event, true);
-    Event.stop(event);
-  },
-  
-  draw: function(point) {
-    var pos = Position.cumulativeOffset(this.element);
-    if(this.options.ghosting) {
-      var r   = Position.realOffset(this.element);
-      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
-    }
-    
-    var d = this.currentDelta();
-    pos[0] -= d[0]; pos[1] -= d[1];
-    
-    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
-      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
-      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
-    }
-    
-    var p = [0,1].map(function(i){ 
-      return (point[i]-pos[i]-this.offset[i]) 
-    }.bind(this));
-    
-    if(this.options.snap) {
-      if(typeof this.options.snap == 'function') {
-        p = this.options.snap(p[0],p[1],this);
-      } else {
-      if(this.options.snap instanceof Array) {
-        p = p.map( function(v, i) {
-          return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
-      } else {
-        p = p.map( function(v) {
-          return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
-      }
-    }}
-    
-    var style = this.element.style;
-    if((!this.options.constraint) || (this.options.constraint=='horizontal'))
-      style.left = p[0] + "px";
-    if((!this.options.constraint) || (this.options.constraint=='vertical'))
-      style.top  = p[1] + "px";
-    
-    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
-  },
-  
-  stopScrolling: function() {
-    if(this.scrollInterval) {
-      clearInterval(this.scrollInterval);
-      this.scrollInterval = null;
-      Draggables._lastScrollPointer = null;
-    }
-  },
-  
-  startScrolling: function(speed) {
-    if(!(speed[0] || speed[1])) return;
-    this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
-    this.lastScrolled = new Date();
-    this.scrollInterval = setInterval(this.scroll.bind(this), 10);
-  },
-  
-  scroll: function() {
-    var current = new Date();
-    var delta = current - this.lastScrolled;
-    this.lastScrolled = current;
-    if(this.options.scroll == window) {
-      with (this._getWindowScroll(this.options.scroll)) {
-        if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
-          var d = delta / 1000;
-          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
-        }
-      }
-    } else {
-      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
-      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
-    }
-    
-    Position.prepare();
-    Droppables.show(Draggables._lastPointer, this.element);
-    Draggables.notify('onDrag', this);
-    if (this._isScrollChild) {
-      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
-      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
-      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
-      if (Draggables._lastScrollPointer[0] < 0)
-        Draggables._lastScrollPointer[0] = 0;
-      if (Draggables._lastScrollPointer[1] < 0)
-        Draggables._lastScrollPointer[1] = 0;
-      this.draw(Draggables._lastScrollPointer);
-    }
-    
-    if(this.options.change) this.options.change(this);
-  },
-  
-  _getWindowScroll: function(w) {
-    var T, L, W, H;
-    with (w.document) {
-      if (w.document.documentElement && documentElement.scrollTop) {
-        T = documentElement.scrollTop;
-        L = documentElement.scrollLeft;
-      } else if (w.document.body) {
-        T = body.scrollTop;
-        L = body.scrollLeft;
-      }
-      if (w.innerWidth) {
-        W = w.innerWidth;
-        H = w.innerHeight;
-      } else if (w.document.documentElement && documentElement.clientWidth) {
-        W = documentElement.clientWidth;
-        H = documentElement.clientHeight;
-      } else {
-        W = body.offsetWidth;
-        H = body.offsetHeight
-      }
-    }
-    return { top: T, left: L, width: W, height: H };
-  }
-}
-
-/*--------------------------------------------------------------------------*/
-
-var SortableObserver = Class.create();
-SortableObserver.prototype = {
-  initialize: function(element, observer) {
-    this.element   = $(element);
-    this.observer  = observer;
-    this.lastValue = Sortable.serialize(this.element);
-  },
-  
-  onStart: function() {
-    this.lastValue = Sortable.serialize(this.element);
-  },
-  
-  onEnd: function() {
-    Sortable.unmark();
-    if(this.lastValue != Sortable.serialize(this.element))
-      this.observer(this.element)
-  }
-}
-
-var Sortable = {
-  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
-  
-  sortables: {},
-  
-  _findRootElement: function(element) {
-    while (element.tagName != "BODY") {  
-      if(element.id && Sortable.sortables[element.id]) return element;
-      element = element.parentNode;
-    }
-  },
-
-  options: function(element) {
-    element = Sortable._findRootElement($(element));
-    if(!element) return;
-    return Sortable.sortables[element.id];
-  },
-  
-  destroy: function(element){
-    var s = Sortable.options(element);
-    
-    if(s) {
-      Draggables.removeObserver(s.element);
-      s.droppables.each(function(d){ Droppables.remove(d) });
-      s.draggables.invoke('destroy');
-      
-      delete Sortable.sortables[s.element.id];
-    }
-  },
-
-  create: function(element) {
-    element = $(element);
-    var options = Object.extend({ 
-      element:     element,
-      tag:         'li',       // assumes li children, override with tag: 'tagname'
-      dropOnEmpty: false,
-      tree:        false,
-      treeTag:     'ul',
-      overlap:     'vertical', // one of 'vertical', 'horizontal'
-      constraint:  'vertical', // one of 'vertical', 'horizontal', false
-      containment: element,    // also takes array of elements (or id's); or false
-      handle:      false,      // or a CSS class
-      only:        false,
-      delay:       0,
-      hoverclass:  null,
-      ghosting:    false,
-      scroll:      false,
-      scrollSensitivity: 20,
-      scrollSpeed: 15,
-      format:      this.SERIALIZE_RULE,
-      onChange:    Prototype.emptyFunction,
-      onUpdate:    Prototype.emptyFunction
-    }, arguments[1] || {});
-
-    // clear any old sortable with same element
-    this.destroy(element);
-
-    // build options for the draggables
-    var options_for_draggable = {
-      revert:      true,
-      scroll:      options.scroll,
-      scrollSpeed: options.scrollSpeed,
-      scrollSensitivity: options.scrollSensitivity,
-      delay:       options.delay,
-      ghosting:    options.ghosting,
-      constraint:  options.constraint,
-      handle:      options.handle };
-
-    if(options.starteffect)
-      options_for_draggable.starteffect = options.starteffect;
-
-    if(options.reverteffect)
-      options_for_draggable.reverteffect = options.reverteffect;
-    else
-      if(options.ghosting) options_for_draggable.reverteffect = function(element) {
-        element.style.top  = 0;
-        element.style.left = 0;
-      };
-
-    if(options.endeffect)
-      options_for_draggable.endeffect = options.endeffect;
-
-    if(options.zindex)
-      options_for_draggable.zindex = options.zindex;
-
-    // build options for the droppables  
-    var options_for_droppable = {
-      overlap:     options.overlap,
-      containment: options.containment,
-      tree:        options.tree,
-      hoverclass:  options.hoverclass,
-      onHover:     Sortable.onHover
-    }
-    
-    var options_for_tree = {
-      onHover:      Sortable.onEmptyHover,
-      overlap:      options.overlap,
-      containment:  options.containment,
-      hoverclass:   options.hoverclass
-    }
-
-    // fix for gecko engine
-    Element.cleanWhitespace(element); 
-
-    options.draggables = [];
-    options.droppables = [];
-
-    // drop on empty handling
-    if(options.dropOnEmpty || options.tree) {
-      Droppables.add(element, options_for_tree);
-      options.droppables.push(element);
-    }
-
-    (this.findElements(element, options) || []).each( function(e) {
-      // handles are per-draggable
-      var handle = options.handle ? 
-        $(e).down('.'+options.handle,0) : e;    
-      options.draggables.push(
-        new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
-      Droppables.add(e, options_for_droppable);
-      if(options.tree) e.treeNode = element;
-      options.droppables.push(e);      
-    });
-    
-    if(options.tree) {
-      (Sortable.findTreeElements(element, options) || []).each( function(e) {
-        Droppables.add(e, options_for_tree);
-        e.treeNode = element;
-        options.droppables.push(e);
-      });
-    }
-
-    // keep reference
-    this.sortables[element.id] = options;
-
-    // for onupdate
-    Draggables.addObserver(new SortableObserver(element, options.onUpdate));
-
-  },
-
-  // return all suitable-for-sortable elements in a guaranteed order
-  findElements: function(element, options) {
-    return Element.findChildren(
-      element, options.only, options.tree ? true : false, options.tag);
-  },
-  
-  findTreeElements: function(element, options) {
-    return Element.findChildren(
-      element, options.only, options.tree ? true : false, options.treeTag);
-  },
-
-  onHover: function(element, dropon, overlap) {
-    if(Element.isParent(dropon, element)) return;
-
-    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
-      return;
-    } else if(overlap>0.5) {
-      Sortable.mark(dropon, 'before');
-      if(dropon.previousSibling != element) {
-        var oldParentNode = element.parentNode;
-        element.style.visibility = "hidden"; // fix gecko rendering
-        dropon.parentNode.insertBefore(element, dropon);
-        if(dropon.parentNode!=oldParentNode) 
-          Sortable.options(oldParentNode).onChange(element);
-        Sortable.options(dropon.parentNode).onChange(element);
-      }
-    } else {
-      Sortable.mark(dropon, 'after');
-      var nextElement = dropon.nextSibling || null;
-      if(nextElement != element) {
-        var oldParentNode = element.parentNode;
-        element.style.visibility = "hidden"; // fix gecko rendering
-        dropon.parentNode.insertBefore(element, nextElement);
-        if(dropon.parentNode!=oldParentNode) 
-          Sortable.options(oldParentNode).onChange(element);
-        Sortable.options(dropon.parentNode).onChange(element);
-      }
-    }
-  },
-  
-  onEmptyHover: function(element, dropon, overlap) {
-    var oldParentNode = element.parentNode;
-    var droponOptions = Sortable.options(dropon);
-        
-    if(!Element.isParent(dropon, element)) {
-      var index;
-      
-      var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
-      var child = null;
-            
-      if(children) {
-        var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
-        
-        for (index = 0; index < children.length; index += 1) {
-          if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
-            offset -= Element.offsetSize (children[index], droponOptions.overlap);
-          } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
-            child = index + 1 < children.length ? children[index + 1] : null;
-            break;
-          } else {
-            child = children[index];
-            break;
-          }
-        }
-      }
-      
-      dropon.insertBefore(element, child);
-      
-      Sortable.options(oldParentNode).onChange(element);
-      droponOptions.onChange(element);
-    }
-  },
-
-  unmark: function() {
-    if(Sortable._marker) Sortable._marker.hide();
-  },
-
-  mark: function(dropon, position) {
-    // mark on ghosting only
-    var sortable = Sortable.options(dropon.parentNode);
-    if(sortable && !sortable.ghosting) return; 
-
-    if(!Sortable._marker) {
-      Sortable._marker = 
-        ($('dropmarker') || Element.extend(document.createElement('DIV'))).
-          hide().addClassName('dropmarker').setStyle({position:'absolute'});
-      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
-    }    
-    var offsets = Position.cumulativeOffset(dropon);
-    Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
-    
-    if(position=='after')
-      if(sortable.overlap == 'horizontal') 
-        Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
-      else
-        Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
-    
-    Sortable._marker.show();
-  },
-  
-  _tree: function(element, options, parent) {
-    var children = Sortable.findElements(element, options) || [];
-  
-    for (var i = 0; i < children.length; ++i) {
-      var match = children[i].id.match(options.format);
-
-      if (!match) continue;
-      
-      var child = {
-        id: encodeURIComponent(match ? match[1] : null),
-        element: element,
-        parent: parent,
-        children: [],
-        position: parent.children.length,
-        container: $(children[i]).down(options.treeTag)
-      }
-      
-      /* Get the element containing the children and recurse over it */
-      if (child.container)
-        this._tree(child.container, options, child)
-      
-      parent.children.push (child);
-    }
-
-    return parent; 
-  },
-
-  tree: function(element) {
-    element = $(element);
-    var sortableOptions = this.options(element);
-    var options = Object.extend({
-      tag: sortableOptions.tag,
-      treeTag: sortableOptions.treeTag,
-      only: sortableOptions.only,
-      name: element.id,
-      format: sortableOptions.format
-    }, arguments[1] || {});
-    
-    var root = {
-      id: null,
-      parent: null,
-      children: [],
-      container: element,
-      position: 0
-    }
-    
-    return Sortable._tree(element, options, root);
-  },
-
-  /* Construct a [i] index for a particular node */
-  _constructIndex: function(node) {
-    var index = '';
-    do {
-      if (node.id) index = '[' + node.position + ']' + index;
-    } while ((node = node.parent) != null);
-    return index;
-  },
-
-  sequence: function(element) {
-    element = $(element);
-    var options = Object.extend(this.options(element), arguments[1] || {});
-    
-    return $(this.findElements(element, options) || []).map( function(item) {
-      return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
-    });
-  },
-
-  setSequence: function(element, new_sequence) {
-    element = $(element);
-    var options = Object.extend(this.options(element), arguments[2] || {});
-    
-    var nodeMap = {};
-    this.findElements(element, options).each( function(n) {
-        if (n.id.match(options.format))
-            nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
-        n.parentNode.removeChild(n);
-    });
-   
-    new_sequence.each(function(ident) {
-      var n = nodeMap[ident];
-      if (n) {
-        n[1].appendChild(n[0]);
-        delete nodeMap[ident];
-      }
-    });
-  },
-  
-  serialize: function(element) {
-    element = $(element);
-    var options = Object.extend(Sortable.options(element), arguments[1] || {});
-    var name = encodeURIComponent(
-      (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
-    
-    if (options.tree) {
-      return Sortable.tree(element, arguments[1]).children.map( function (item) {
-        return [name + Sortable._constructIndex(item) + "[id]=" + 
-                encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
-      }).flatten().join('&');
-    } else {
-      return Sortable.sequence(element, arguments[1]).map( function(item) {
-        return name + "[]=" + encodeURIComponent(item);
-      }).join('&');
-    }
-  }
-}
-
-// Returns true if child is contained within element
-Element.isParent = function(child, element) {
-  if (!child.parentNode || child == element) return false;
-  if (child.parentNode == element) return true;
-  return Element.isParent(child.parentNode, element);
-}
-
-Element.findChildren = function(element, only, recursive, tagName) {    
-  if(!element.hasChildNodes()) return null;
-  tagName = tagName.toUpperCase();
-  if(only) only = [only].flatten();
-  var elements = [];
-  $A(element.childNodes).each( function(e) {
-    if(e.tagName && e.tagName.toUpperCase()==tagName &&
-      (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
-        elements.push(e);
-    if(recursive) {
-      var grandchildren = Element.findChildren(e, only, recursive, tagName);
-      if(grandchildren) elements.push(grandchildren);
-    }
-  });
-
-  return (elements.length>0 ? elements.flatten() : []);
-}
-
-Element.offsetSize = function (element, type) {
-  return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
-}
Index: quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/resources/effects.js
===================================================================
--- quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/resources/effects.js	(revision 3679)
+++ 	(revision )
@@ -1,960 +1,0 @@
-// script.aculo.us effects.js v1.6.5, Wed Nov 08 14:17:49 CET 2006
-
-// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// Contributors:
-//  Justin Palmer (http://encytemedia.com/)
-//  Mark Pilgrim (http://diveintomark.org/)
-//  Martin Bialasinki
-// 
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/ 
-
-// converts rgb() and #xxx to #xxxxxx format,  
-// returns self (or first argument) if not convertable  
-String.prototype.parseColor = function() {  
-  var color = '#';  
-  if(this.slice(0,4) == 'rgb(') {  
-    var cols = this.slice(4,this.length-1).split(',');  
-    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
-  } else {  
-    if(this.slice(0,1) == '#') {  
-      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
-      if(this.length==7) color = this.toLowerCase();  
-    }  
-  }  
-  return(color.length==7 ? color : (arguments[0] || this));  
-}
-
-/*--------------------------------------------------------------------------*/
-
-Element.collectTextNodes = function(element) {  
-  return $A($(element).childNodes).collect( function(node) {
-    return (node.nodeType==3 ? node.nodeValue : 
-      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
-  }).flatten().join('');
-}
-
-Element.collectTextNodesIgnoreClass = function(element, className) {  
-  return $A($(element).childNodes).collect( function(node) {
-    return (node.nodeType==3 ? node.nodeValue : 
-      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
-        Element.collectTextNodesIgnoreClass(node, className) : ''));
-  }).flatten().join('');
-}
-
-Element.setContentZoom = function(element, percent) {
-  element = $(element);  
-  element.setStyle({fontSize: (percent/100) + 'em'});   
-  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
-  return element;
-}
-
-Element.getOpacity = function(element){
-  element = $(element);
-  var opacity;
-  if (opacity = element.getStyle('opacity'))  
-    return parseFloat(opacity);  
-  if (opacity = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))  
-    if(opacity[1]) return parseFloat(opacity[1]) / 100;  
-  return 1.0;  
-}
-
-Element.setOpacity = function(element, value){  
-  element= $(element);  
-  if (value == 1){
-    element.setStyle({ opacity: 
-      (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 
-      0.999999 : 1.0 });
-    if(/MSIE/.test(navigator.userAgent) && !window.opera)  
-      element.setStyle({filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});  
-  } else {  
-    if(value < 0.00001) value = 0;  
-    element.setStyle({opacity: value});
-    if(/MSIE/.test(navigator.userAgent) && !window.opera)  
-      element.setStyle(
-        { filter: element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
-            'alpha(opacity='+value*100+')' });  
-  }
-  return element;
-}  
- 
-Element.getInlineOpacity = function(element){  
-  return $(element).style.opacity || '';
-}  
-
-Element.forceRerendering = function(element) {
-  try {
-    element = $(element);
-    var n = document.createTextNode(' ');
-    element.appendChild(n);
-    element.removeChild(n);
-  } catch(e) { }
-};
-
-/*--------------------------------------------------------------------------*/
-
-// Don't patch Array, this breaks jQuery library
-// Maybe it will cause some problems with drag and drop functionality
-// provided by scriptaculous library, but right now it's working ;-)
-
-// Array.prototype.call = function() {
-//   var args = arguments;
-//   this.each(function(f){ f.apply(this, args) });
-// }
-
-/*--------------------------------------------------------------------------*/
-
-var Effect = {
-  _elementDoesNotExistError: {
-    name: 'ElementDoesNotExistError',
-    message: 'The specified DOM element does not exist, but is required for this effect to operate'
-  },
-  tagifyText: function(element) {
-    if(typeof Builder == 'undefined')
-      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
-      
-    var tagifyStyle = 'position:relative';
-    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
-    
-    element = $(element);
-    $A(element.childNodes).each( function(child) {
-      if(child.nodeType==3) {
-        child.nodeValue.toArray().each( function(character) {
-          element.insertBefore(
-            Builder.node('span',{style: tagifyStyle},
-              character == ' ' ? String.fromCharCode(160) : character), 
-              child);
-        });
-        Element.remove(child);
-      }
-    });
-  },
-  multiple: function(element, effect) {
-    var elements;
-    if(((typeof element == 'object') || 
-        (typeof element == 'function')) && 
-       (element.length))
-      elements = element;
-    else
-      elements = $(element).childNodes;
-      
-    var options = Object.extend({
-      speed: 0.1,
-      delay: 0.0
-    }, arguments[2] || {});
-    var masterDelay = options.delay;
-
-    $A(elements).each( function(element, index) {
-      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
-    });
-  },
-  PAIRS: {
-    'slide':  ['SlideDown','SlideUp'],
-    'blind':  ['BlindDown','BlindUp'],
-    'appear': ['Appear','Fade']
-  },
-  toggle: function(element, effect) {
-    element = $(element);
-    effect = (effect || 'appear').toLowerCase();
-    var options = Object.extend({
-      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
-    }, arguments[2] || {});
-    Effect[element.visible() ? 
-      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
-  }
-};
-
-var Effect2 = Effect; // deprecated
-
-/* ------------- transitions ------------- */
-
-Effect.Transitions = {
-  linear: Prototype.K,
-  sinoidal: function(pos) {
-    return (-Math.cos(pos*Math.PI)/2) + 0.5;
-  },
-  reverse: function(pos) {
-    return 1-pos;
-  },
-  flicker: function(pos) {
-    return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
-  },
-  wobble: function(pos) {
-    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
-  },
-  pulse: function(pos, pulses) { 
-    pulses = pulses || 5; 
-    return (
-      Math.round((pos % (1/pulses)) * pulses) == 0 ? 
-            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
-        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
-      );
-  },
-  none: function(pos) {
-    return 0;
-  },
-  full: function(pos) {
-    return 1;
-  }
-};
-
-/* ------------- core effects ------------- */
-
-Effect.ScopedQueue = Class.create();
-Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
-  initialize: function() {
-    this.effects  = [];
-    this.interval = null;
-  },
-  _each: function(iterator) {
-    this.effects._each(iterator);
-  },
-  add: function(effect) {
-    var timestamp = new Date().getTime();
-    
-    var position = (typeof effect.options.queue == 'string') ? 
-      effect.options.queue : effect.options.queue.position;
-    
-    switch(position) {
-      case 'front':
-        // move unstarted effects after this effect  
-        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
-            e.startOn  += effect.finishOn;
-            e.finishOn += effect.finishOn;
-          });
-        break;
-      case 'with-last':
-        timestamp = this.effects.pluck('startOn').max() || timestamp;
-        break;
-      case 'end':
-        // start effect after last queued effect has finished
-        timestamp = this.effects.pluck('finishOn').max() || timestamp;
-        break;
-    }
-    
-    effect.startOn  += timestamp;
-    effect.finishOn += timestamp;
-
-    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
-      this.effects.push(effect);
-    
-    if(!this.interval) 
-      this.interval = setInterval(this.loop.bind(this), 40);
-  },
-  remove: function(effect) {
-    this.effects = this.effects.reject(function(e) { return e==effect });
-    if(this.effects.length == 0) {
-      clearInterval(this.interval);
-      this.interval = null;
-    }
-  },
-  loop: function() {
-    var timePos = new Date().getTime();
-    this.effects.invoke('loop', timePos);
-  }
-});
-
-Effect.Queues = {
-  instances: $H(),
-  get: function(queueName) {
-    if(typeof queueName != 'string') return queueName;
-    
-    if(!this.instances[queueName])
-      this.instances[queueName] = new Effect.ScopedQueue();
-      
-    return this.instances[queueName];
-  }
-}
-Effect.Queue = Effect.Queues.get('global');
-
-Effect.DefaultOptions = {
-  transition: Effect.Transitions.sinoidal,
-  duration:   1.0,   // seconds
-  fps:        25.0,  // max. 25fps due to Effect.Queue implementation
-  sync:       false, // true for combining
-  from:       0.0,
-  to:         1.0,
-  delay:      0.0,
-  queue:      'parallel'
-}
-
-Effect.Base = function() {};
-Effect.Base.prototype = {
-  position: null,
-  start: function(options) {
-    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
-    this.currentFrame = 0;
-    this.state        = 'idle';
-    this.startOn      = this.options.delay*1000;
-    this.finishOn     = this.startOn + (this.options.duration*1000);
-    this.event('beforeStart');
-    if(!this.options.sync)
-      Effect.Queues.get(typeof this.options.queue == 'string' ? 
-        'global' : this.options.queue.scope).add(this);
-  },
-  loop: function(timePos) {
-    if(timePos >= this.startOn) {
-      if(timePos >= this.finishOn) {
-        this.render(1.0);
-        this.cancel();
-        this.event('beforeFinish');
-        if(this.finish) this.finish(); 
-        this.event('afterFinish');
-        return;  
-      }
-      var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
-      var frame = Math.round(pos * this.options.fps * this.options.duration);
-      if(frame > this.currentFrame) {
-        this.render(pos);
-        this.currentFrame = frame;
-      }
-    }
-  },
-  render: function(pos) {
-    if(this.state == 'idle') {
-      this.state = 'running';
-      this.event('beforeSetup');
-      if(this.setup) this.setup();
-      this.event('afterSetup');
-    }
-    if(this.state == 'running') {
-      if(this.options.transition) pos = this.options.transition(pos);
-      pos *= (this.options.to-this.options.from);
-      pos += this.options.from;
-      this.position = pos;
-      this.event('beforeUpdate');
-      if(this.update) this.update(pos);
-      this.event('afterUpdate');
-    }
-  },
-  cancel: function() {
-    if(!this.options.sync)
-      Effect.Queues.get(typeof this.options.queue == 'string' ? 
-        'global' : this.options.queue.scope).remove(this);
-    this.state = 'finished';
-  },
-  event: function(eventName) {
-    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
-    if(this.options[eventName]) this.options[eventName](this);
-  },
-  inspect: function() {
-    return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
-  }
-}
-
-Effect.Parallel = Class.create();
-Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
-  initialize: function(effects) {
-    this.effects = effects || [];
-    this.start(arguments[1]);
-  },
-  update: function(position) {
-    this.effects.invoke('render', position);
-  },
-  finish: function(position) {
-    this.effects.each( function(effect) {
-      effect.render(1.0);
-      effect.cancel();
-      effect.event('beforeFinish');
-      if(effect.finish) effect.finish(position);
-      effect.event('afterFinish');
-    });
-  }
-});
-
-Effect.Event = Class.create();
-Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
-  initialize: function() {
-    var options = Object.extend({
-      duration: 0
-    }, arguments[0] || {});
-    this.start(options);
-  },
-  update: Prototype.emptyFunction
-});
-
-Effect.Opacity = Class.create();
-Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
-  initialize: function(element) {
-    this.element = $(element);
-    if(!this.element) throw(Effect._elementDoesNotExistError);
-    // make this work on IE on elements without 'layout'
-    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
-      this.element.setStyle({zoom: 1});
-    var options = Object.extend({
-      from: this.element.getOpacity() || 0.0,
-      to:   1.0
-    }, arguments[1] || {});
-    this.start(options);
-  },
-  update: function(position) {
-    this.element.setOpacity(position);
-  }
-});
-
-Effect.Move = Class.create();
-Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
-  initialize: function(element) {
-    this.element = $(element);
-    if(!this.element) throw(Effect._elementDoesNotExistError);
-    var options = Object.extend({
-      x:    0,
-      y:    0,
-      mode: 'relative'
-    }, arguments[1] || {});
-    this.start(options);
-  },
-  setup: function() {
-    // Bug in Opera: Opera returns the "real" position of a static element or
-    // relative element that does not have top/left explicitly set.
-    // ==> Always set top and left for position relative elements in your stylesheets 
-    // (to 0 if you do not need them) 
-    this.element.makePositioned();
-    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
-    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
-    if(this.options.mode == 'absolute') {
-      // absolute movement, so we need to calc deltaX and deltaY
-      this.options.x = this.options.x - this.originalLeft;
-      this.options.y = this.options.y - this.originalTop;
-    }
-  },
-  update: function(position) {
-    this.element.setStyle({
-      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
-      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
-    });
-  }
-});
-
-// for backwards compatibility
-Effect.MoveBy = function(element, toTop, toLeft) {
-  return new Effect.Move(element, 
-    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
-};
-
-Effect.Scale = Class.create();
-Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
-  initialize: function(element, percent) {
-    this.element = $(element);
-    if(!this.element) throw(Effect._elementDoesNotExistError);
-    var options = Object.extend({
-      scaleX: true,
-      scaleY: true,
-      scaleContent: true,
-      scaleFromCenter: false,
-      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
-      scaleFrom: 100.0,
-      scaleTo:   percent
-    }, arguments[2] || {});
-    this.start(options);
-  },
-  setup: function() {
-    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
-    this.elementPositioning = this.element.getStyle('position');
-    
-    this.originalStyle = {};
-    ['top','left','width','height','fontSize'].each( function(k) {
-      this.originalStyle[k] = this.element.style[k];
-    }.bind(this));
-      
-    this.originalTop  = this.element.offsetTop;
-    this.originalLeft = this.element.offsetLeft;
-    
-    var fontSize = this.element.getStyle('font-size') || '100%';
-    ['em','px','%','pt'].each( function(fontSizeType) {
-      if(fontSize.indexOf(fontSizeType)>0) {
-        this.fontSize     = parseFloat(fontSize);
-        this.fontSizeType = fontSizeType;
-      }
-    }.bind(this));
-    
-    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
-    
-    this.dims = null;
-    if(this.options.scaleMode=='box')
-      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
-    if(/^content/.test(this.options.scaleMode))
-      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
-    if(!this.dims)
-      this.dims = [this.options.scaleMode.originalHeight,
-                   this.options.scaleMode.originalWidth];
-  },
-  update: function(position) {
-    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
-    if(this.options.scaleContent && this.fontSize)
-      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
-    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
-  },
-  finish: function(position) {
-    if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
-  },
-  setDimensions: function(height, width) {
-    var d = {};
-    if(this.options.scaleX) d.width = Math.round(width) + 'px';
-    if(this.options.scaleY) d.height = Math.round(height) + 'px';
-    if(this.options.scaleFromCenter) {
-      var topd  = (height - this.dims[0])/2;
-      var leftd = (width  - this.dims[1])/2;
-      if(this.elementPositioning == 'absolute') {
-        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
-        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
-      } else {
-        if(this.options.scaleY) d.top = -topd + 'px';
-        if(this.options.scaleX) d.left = -leftd + 'px';
-      }
-    }
-    this.element.setStyle(d);
-  }
-});
-
-Effect.Highlight = Class.create();
-Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
-  initialize: function(element) {
-    this.element = $(element);
-    if(!this.element) throw(Effect._elementDoesNotExistError);
-    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
-    this.start(options);
-  },
-  setup: function() {
-    // Prevent executing on elements not in the layout flow
-    if(this.element.getStyle('display')=='none') { this.cancel(); return; }
-    // Disable background image during the effect
-    this.oldStyle = {
-      backgroundImage: this.element.getStyle('background-image') };
-    this.element.setStyle({backgroundImage: 'none'});
-    if(!this.options.endcolor)
-      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
-    if(!this.options.restorecolor)
-      this.options.restorecolor = this.element.getStyle('background-color');
-    // init color calculations
-    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
-    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
-  },
-  update: function(position) {
-    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
-      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
-  },
-  finish: function() {
-    this.element.setStyle(Object.extend(this.oldStyle, {
-      backgroundColor: this.options.restorecolor
-    }));
-  }
-});
-
-Effect.ScrollTo = Class.create();
-Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
-  initialize: function(element) {
-    this.element = $(element);
-    this.start(arguments[1] || {});
-  },
-  setup: function() {
-    Position.prepare();
-    var offsets = Position.cumulativeOffset(this.element);
-    if(this.options.offset) offsets[1] += this.options.offset;
-    var max = window.innerHeight ? 
-      window.height - window.innerHeight :
-      document.body.scrollHeight - 
-        (document.documentElement.clientHeight ? 
-          document.documentElement.clientHeight : document.body.clientHeight);
-    this.scrollStart = Position.deltaY;
-    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
-  },
-  update: function(position) {
-    Position.prepare();
-    window.scrollTo(Position.deltaX, 
-      this.scrollStart + (position*this.delta));
-  }
-});
-
-/* ------------- combination effects ------------- */
-
-Effect.Fade = function(element) {
-  element = $(element);
-  var oldOpacity = element.getInlineOpacity();
-  var options = Object.extend({
-  from: element.getOpacity() || 1.0,
-  to:   0.0,
-  afterFinishInternal: function(effect) { 
-    if(effect.options.to!=0) return;
-    effect.element.hide().setStyle({opacity: oldOpacity}); 
-  }}, arguments[1] || {});
-  return new Effect.Opacity(element,options);
-}
-
-Effect.Appear = function(element) {
-  element = $(element);
-  var options = Object.extend({
-  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
-  to:   1.0,
-  // force Safari to render floated elements properly
-  afterFinishInternal: function(effect) {
-    effect.element.forceRerendering();
-  },
-  beforeSetup: function(effect) {
-    effect.element.setOpacity(effect.options.from).show(); 
-  }}, arguments[1] || {});
-  return new Effect.Opacity(element,options);
-}
-
-Effect.Puff = function(element) {
-  element = $(element);
-  var oldStyle = { 
-    opacity: element.getInlineOpacity(), 
-    position: element.getStyle('position'),
-    top:  element.style.top,
-    left: element.style.left,
-    width: element.style.width,
-    height: element.style.height
-  };
-  return new Effect.Parallel(
-   [ new Effect.Scale(element, 200, 
-      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
-     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
-     Object.extend({ duration: 1.0, 
-      beforeSetupInternal: function(effect) {
-        Position.absolutize(effect.effects[0].element)
-      },
-      afterFinishInternal: function(effect) {
-         effect.effects[0].element.hide().setStyle(oldStyle); }
-     }, arguments[1] || {})
-   );
-}
-
-Effect.BlindUp = function(element) {
-  element = $(element);
-  element.makeClipping();
-  return new Effect.Scale(element, 0,
-    Object.extend({ scaleContent: false, 
-      scaleX: false, 
-      restoreAfterFinish: true,
-      afterFinishInternal: function(effect) {
-        effect.element.hide().undoClipping();
-      } 
-    }, arguments[1] || {})
-  );
-}
-
-Effect.BlindDown = function(element) {
-  element = $(element);
-  var elementDimensions = element.getDimensions();
-  return new Effect.Scale(element, 100, Object.extend({ 
-    scaleContent: false, 
-    scaleX: false,
-    scaleFrom: 0,
-    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
-    restoreAfterFinish: true,
-    afterSetup: function(effect) {
-      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
-    },  
-    afterFinishInternal: function(effect) {
-      effect.element.undoClipping();
-    }
-  }, arguments[1] || {}));
-}
-
-Effect.SwitchOff = function(element) {
-  element = $(element);
-  var oldOpacity = element.getInlineOpacity();
-  return new Effect.Appear(element, Object.extend({
-    duration: 0.4,
-    from: 0,
-    transition: Effect.Transitions.flicker,
-    afterFinishInternal: function(effect) {
-      new Effect.Scale(effect.element, 1, { 
-        duration: 0.3, scaleFromCenter: true,
-        scaleX: false, scaleContent: false, restoreAfterFinish: true,
-        beforeSetup: function(effect) { 
-          effect.element.makePositioned().makeClipping();
-        },
-        afterFinishInternal: function(effect) {
-          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
-        }
-      })
-    }
-  }, arguments[1] || {}));
-}
-
-Effect.DropOut = function(element) {
-  element = $(element);
-  var oldStyle = {
-    top: element.getStyle('top'),
-    left: element.getStyle('left'),
-    opacity: element.getInlineOpacity() };
-  return new Effect.Parallel(
-    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
-      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
-    Object.extend(
-      { duration: 0.5,
-        beforeSetup: function(effect) {
-          effect.effects[0].element.makePositioned(); 
-        },
-        afterFinishInternal: function(effect) {
-          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
-        } 
-      }, arguments[1] || {}));
-}
-
-Effect.Shake = function(element) {
-  element = $(element);
-  var oldStyle = {
-    top: element.getStyle('top'),
-    left: element.getStyle('left') };
-    return new Effect.Move(element, 
-      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
-    new Effect.Move(effect.element,
-      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
-    new Effect.Move(effect.element,
-      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
-    new Effect.Move(effect.element,
-      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
-    new Effect.Move(effect.element,
-      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
-    new Effect.Move(effect.element,
-      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
-        effect.element.undoPositioned().setStyle(oldStyle);
-  }}) }}) }}) }}) }}) }});
-}
-
-Effect.SlideDown = function(element) {
-  element = $(element).cleanWhitespace();
-  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
-  var oldInnerBottom = element.down().getStyle('bottom');
-  var elementDimensions = element.getDimensions();
-  return new Effect.Scale(element, 100, Object.extend({ 
-    scaleContent: false, 
-    scaleX: false, 
-    scaleFrom: window.opera ? 0 : 1,
-    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
-    restoreAfterFinish: true,
-    afterSetup: function(effect) {
-      effect.element.makePositioned();
-      effect.element.down().makePositioned();
-      if(window.opera) effect.element.setStyle({top: ''});
-      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
-    },
-    afterUpdateInternal: function(effect) {
-      effect.element.down().setStyle({bottom:
-        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
-    },
-    afterFinishInternal: function(effect) {
-      effect.element.undoClipping().undoPositioned();
-      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
-    }, arguments[1] || {})
-  );
-}
-
-Effect.SlideUp = function(element) {
-  element = $(element).cleanWhitespace();
-  var oldInnerBottom = element.down().getStyle('bottom');
-  return new Effect.Scale(element, window.opera ? 0 : 1,
-   Object.extend({ scaleContent: false, 
-    scaleX: false, 
-    scaleMode: 'box',
-    scaleFrom: 100,
-    restoreAfterFinish: true,
-    beforeStartInternal: function(effect) {
-      effect.element.makePositioned();
-      effect.element.down().makePositioned();
-      if(window.opera) effect.element.setStyle({top: ''});
-      effect.element.makeClipping().show();
-    },  
-    afterUpdateInternal: function(effect) {
-      effect.element.down().setStyle({bottom:
-        (effect.dims[0] - effect.element.clientHeight) + 'px' });
-    },
-    afterFinishInternal: function(effect) {
-      effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
-      effect.element.down().undoPositioned();
-    }
-   }, arguments[1] || {})
-  );
-}
-
-// Bug in opera makes the TD containing this element expand for a instance after finish 
-Effect.Squish = function(element) {
-  return new Effect.Scale(element, window.opera ? 1 : 0, { 
-    restoreAfterFinish: true,
-    beforeSetup: function(effect) {
-      effect.element.makeClipping(); 
-    },  
-    afterFinishInternal: function(effect) {
-      effect.element.hide().undoClipping(); 
-    }
-  });
-}
-
-Effect.Grow = function(element) {
-  element = $(element);
-  var options = Object.extend({
-    direction: 'center',
-    moveTransition: Effect.Transitions.sinoidal,
-    scaleTransition: Effect.Transitions.sinoidal,
-    opacityTransition: Effect.Transitions.full
-  }, arguments[1] || {});
-  var oldStyle = {
-    top: element.style.top,
-    left: element.style.left,
-    height: element.style.height,
-    width: element.style.width,
-    opacity: element.getInlineOpacity() };
-
-  var dims = element.getDimensions();    
-  var initialMoveX, initialMoveY;
-  var moveX, moveY;
-  
-  switch (options.direction) {
-    case 'top-left':
-      initialMoveX = initialMoveY = moveX = moveY = 0; 
-      break;
-    case 'top-right':
-      initialMoveX = dims.width;
-      initialMoveY = moveY = 0;
-      moveX = -dims.width;
-      break;
-    case 'bottom-left':
-      initialMoveX = moveX = 0;
-      initialMoveY = dims.height;
-      moveY = -dims.height;
-      break;
-    case 'bottom-right':
-      initialMoveX = dims.width;
-      initialMoveY = dims.height;
-      moveX = -dims.width;
-      moveY = -dims.height;
-      break;
-    case 'center':
-      initialMoveX = dims.width / 2;
-      initialMoveY = dims.height / 2;
-      moveX = -dims.width / 2;
-      moveY = -dims.height / 2;
-      break;
-  }
-  
-  return new Effect.Move(element, {
-    x: initialMoveX,
-    y: initialMoveY,
-    duration: 0.01, 
-    beforeSetup: function(effect) {
-      effect.element.hide().makeClipping().makePositioned();
-    },
-    afterFinishInternal: function(effect) {
-      new Effect.Parallel(
-        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
-          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
-          new Effect.Scale(effect.element, 100, {
-            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
-            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
-        ], Object.extend({
-             beforeSetup: function(effect) {
-               effect.effects[0].element.setStyle({height: '0px'}).show(); 
-             },
-             afterFinishInternal: function(effect) {
-               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 
-             }
-           }, options)
-      )
-    }
-  });
-}
-
-Effect.Shrink = function(element) {
-  element = $(element);
-  var options = Object.extend({
-    direction: 'center',
-    moveTransition: Effect.Transitions.sinoidal,
-    scaleTransition: Effect.Transitions.sinoidal,
-    opacityTransition: Effect.Transitions.none
-  }, arguments[1] || {});
-  var oldStyle = {
-    top: element.style.top,
-    left: element.style.left,
-    height: element.style.height,
-    width: element.style.width,
-    opacity: element.getInlineOpacity() };
-
-  var dims = element.getDimensions();
-  var moveX, moveY;
-  
-  switch (options.direction) {
-    case 'top-left':
-      moveX = moveY = 0;
-      break;
-    case 'top-right':
-      moveX = dims.width;
-      moveY = 0;
-      break;
-    case 'bottom-left':
-      moveX = 0;
-      moveY = dims.height;
-      break;
-    case 'bottom-right':
-      moveX = dims.width;
-      moveY = dims.height;
-      break;
-    case 'center':  
-      moveX = dims.width / 2;
-      moveY = dims.height / 2;
-      break;
-  }
-  
-  return new Effect.Parallel(
-    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
-      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
-      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
-    ], Object.extend({            
-         beforeStartInternal: function(effect) {
-           effect.effects[0].element.makePositioned().makeClipping(); 
-         },
-         afterFinishInternal: function(effect) {
-           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
-       }, options)
-  );
-}
-
-Effect.Pulsate = function(element) {
-  element = $(element);
-  var options    = arguments[1] || {};
-  var oldOpacity = element.getInlineOpacity();
-  var transition = options.transition || Effect.Transitions.sinoidal;
-  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
-  reverser.bind(transition);
-  return new Effect.Opacity(element, 
-    Object.extend(Object.extend({  duration: 2.0, from: 0,
-      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
-    }, options), {transition: reverser}));
-}
-
-Effect.Fold = function(element) {
-  element = $(element);
-  var oldStyle = {
-    top: element.style.top,
-    left: element.style.left,
-    width: element.style.width,
-    height: element.style.height };
-  element.makeClipping();
-  return new Effect.Scale(element, 5, Object.extend({   
-    scaleContent: false,
-    scaleX: false,
-    afterFinishInternal: function(effect) {
-    new Effect.Scale(element, 1, { 
-      scaleContent: false, 
-      scaleY: false,
-      afterFinishInternal: function(effect) {
-        effect.element.hide().undoClipping().setStyle(oldStyle);
-      } });
-  }}, arguments[1] || {}));
-};
-
-['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
- 'collectTextNodes','collectTextNodesIgnoreClass'].each( 
-  function(f) { Element.Methods[f] = Element[f]; }
-);
-
-Element.Methods.visualEffect = function(element, effect, options) {
-  s = effect.gsub(/_/, '-').camelize();
-  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
-  new Effect[effect_class](element, options);
-  return $(element);
-};
-
-Element.addMethods();
Index: quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/resources/plonetabs.kss
===================================================================
--- quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/resources/plonetabs.kss	(revision 3679)
+++ 	(revision )
@@ -1,185 +1,0 @@
-/* <dtml-call expr="RESPONSE.setHeader('pragma','no-cache')"> */
-
-/*
-    The above trick to let this file not be cached does not work, unless this file is renamed to have
-    a kss.dtml extension.
-*/
-
-
-/* General sheet for Plone Tabs AJAX configlet */
-
-/* Add 'kssTabsActive' class to application root element
-   to enable ajax styles when kss is available */
-#plonetabs_form:load {
-  action-client: addClass;
-  addClass-value: kssTabsActive;
-}
-
-
-/* Add allowMultiSubmit class to submit buttons
-   to avoid those annoying warnings about form 'multisubmittion' */
-.add-controls input:load {
-    action-client: addClass;
-    addClass-value: allowMultiSubmit;
-}
-
-.edit-controls input:load {
-    action-client: addClass;
-    addClass-value: allowMultiSubmit;
-}
-
-/* Collapse expanded sections on load */
-.collapseAdvanced:load {
-    action-client: removeClass;
-    removeClass-value: expandedBlock;
-    action-client: addClass;
-    addClass-value: collapsedBlock;
-}
-
-/* Remember portal actions category */
-#select_category:load {
-    action-client: setStateVar;
-    setStateVar-varname: plonetabs-category;
-    setStateVar-value: currentFormVar();
-}
-
-/* Change portal actions category page */
-#select_category:change {
-    action-server: plonetabs-changeCategory;
-    plonetabs-changeCategory-cat_name: currentFormVar();
-    plonetabs-changeCategory-error: plonetabs-handleServerError;
-}
-
- /*Hovering for IE especially */
-/*#app li:mouseover {
-    action-client: addClass;
-    addClass-value: onHover;
-}
-
-#app li:mouseout {
-    action-client: removeClass;
-    removeClass-value: onHover;
-}*/
-
-
-/* Automatically generated tabs */
-#generated_tabs:click {
-    action-server: plonetabs-toggleGeneratedTabs;
-    plonetabs-toggleGeneratedTabs-field: disable_folder_sections;
-    plonetabs-toggleGeneratedTabs-checked: currentFormVar();
-    plonetabs-toggleGeneratedTabs-error: plonetabs-handleServerError;
-}
-
-#nonfolderish_tabs:click {
-    action-server: plonetabs-toggleGeneratedTabs;
-    plonetabs-toggleGeneratedTabs-field: disable_nonfolderish_sections;
-    plonetabs-toggleGeneratedTabs-checked: currentFormVar();
-    plonetabs-toggleGeneratedTabs-error: plonetabs-handleServerError;
-}
-
-/* Visibility switching */
-#tabslist input.visibility:click {
-    action-server: plonetabs-toggleActionsVisibility;
-    plonetabs-toggleActionsVisibility-id: nodeAttr(id, true);
-    plonetabs-toggleActionsVisibility-checked: currentFormVar();
-    plonetabs-toggleActionsVisibility-cat_name: stateVar(plonetabs-category);
-    plonetabs-toggleActionsVisibility-error: plonetabs-handleServerError;
-}
-
-#roottabs .visibility:click {
-    action-server: plonetabs-toggleRootsVisibility;
-    plonetabs-toggleRootsVisibility-id: nodeAttr(id, true);
-    plonetabs-toggleRootsVisibility-checked: currentFormVar();
-    plonetabs-toggleRootsVisibility-error: plonetabs-handleServerError;
-}
-
-/* Delete action link */
-#tabslist .delete:click {
-    evt-click-preventdefault: true;
-    action-server: plonetabs-deleteAction;
-    plonetabs-deleteAction-id: nodeAttr(id, true);
-    plonetabs-deleteAction-cat_name: stateVar(plonetabs-category);
-    plonetabs-deleteAction-error: plonetabs-handleServerError;
-}
-
-/* Add form rules */
-
-/* Save initial value of title field on adding form */
-#actname:load {
-    action-client: setStateVar;
-    setStateVar-varname: plonetabs-addingTitle;
-    setStateVar-value: currentFormVar();
-}
-
-#actname:focus {
-    action-client: addClass;
-    addClass-kssSelector: htmlid(addaction);
-    addClass-value: adding;
-}
-
-#buttoncancel:click {
-    evt-click-preventdefault: true;
-    action-server: plonetabs-hideAddForm;
-    plonetabs-hideAddForm-error: plonetabs-handleServerError;
-    action-client: setStyle;
-    setStyle-kssSelector: htmlid(kssPortalMessage);
-    setStyle-name: display;
-    setStyle-value: none;
-}
-
-#buttonadd:click,
-#addaction:submit {
-    evt-click-preventdefault: true;
-    action-server: plonetabs-addAction;
-    plonetabs-addAction-kssSubmitForm: currentForm();
-    plonetabs-addAction-cat_name: stateVar(plonetabs-category);
-    plonetabs-addAction-error: plonetabs-handleServerError;
-}
-
-/* autogenerate value for id field */
-#actname:keyup {
-    action-client: plonetabs-generateId;
-    plonetabs-generateId-target: actid;
-    plonetabs-generateId-var_name: plonetabs-addingTitle;
-}
-
-/* Actions edit */
-#tabslist .titleWrapper:click {
-    evt-click-allowbubbling: true;
-    action-client: addClass;
-    addClass-kssSelector: parentnode('#tabslist li');
-    addClass-value: editing;
-}
-
-/* Edit cancel button */
-#tabslist .editcancel:click {
-    evt-click-preventdefault: true;
-    action-server: plonetabs-hideEditForm;
-    plonetabs-hideEditForm-id: nodeAttr(id, true);
-    plonetabs-hideEditForm-cat_name: stateVar(plonetabs-category);
-    plonetabs-hideEditForm-error: plonetabs-handleServerError;
-}
-
-/* Edit save button */
-#tabslist .editsave:click {
-    evt-click-preventdefault: true;
-    action-server: plonetabs-editAction;
-    plonetabs-editAction-kssSubmitForm: currentForm();
-    plonetabs-editAction-error: plonetabs-handleServerError;
-}
-
-/* Collapsible sections */
-.collapseAdvanced .headerAdvanced:click {
-    action-client: plonetabs-toggleCollapsible;
-}
-
-/* Reordering rules */
-#tabslist:load {
-    action-client: plonetabs-createSortable;
-    plonetabs-createSortable-handle: 'drag-handle';
-}
-
-#tabslist li:load {
-    action-client: plonetabs-updateSortable;
-    plonetabs-updateSortable-handle: 'drag-handle';
-}
Index: quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/resources/plonetabsmode.kss
===================================================================
--- quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/resources/plonetabsmode.kss	(revision 3679)
+++ 	(revision )
@@ -1,4 +1,0 @@
-/* Add change mode link */
-#app:load {
-  action-server: plonetabs-insertModeLink;
-}
Index: quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/templates/plonetabs.pt
===================================================================
--- quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/templates/plonetabs.pt	(revision 3679)
+++ quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/browser/templates/plonetabs.pt	(revision 3680)
@@ -158,5 +158,437 @@
 
 </div>
-
+<script>
+  (function(a){var b,c=a();a.fn.sortable=function(d){var e=String(d);return d=a.extend({connectWith:!1},d),this.each(function(){if(/^enable|disable|destroy$/.test(e)){var f=a(this).children(a(this).data("items")).attr("draggable",e=="enable");e=="destroy"&&f.add(this).removeData("connectWith items").off("dragstart.h5s dragend.h5s selectstart.h5s dragover.h5s dragenter.h5s drop.h5s");return}var g,h,f=a(this).children(d.items),i=a("<"+(/^ul|ol$/i.test(this.tagName)?"li":"div")+' class="sortable-placeholder">');f.find(d.handle).mousedown(function(){g=!0}).mouseup(function(){g=!1}),a(this).data("items",d.items),c=c.add(i),d.connectWith&&a(d.connectWith).add(this).data("connectWith",d.connectWith),f.attr("draggable","true").on("dragstart.h5s",function(c){if(d.handle&&!g)return!1;g=!1;var e=c.originalEvent.dataTransfer;e.effectAllowed="move",e.setData("Text","dummy"),h=(b=a(this)).addClass("sortable-dragging").index()}).on("dragend.h5s",function(){b.removeClass("sortable-dragging").show(),c.detach(),h!=b.index()&&f.parent().trigger("sortupdate",{item:b}),b=null}).not("a[href], img").on("selectstart.h5s",function(){return this.dragDrop&&this.dragDrop(),!1}).end().add([this,i]).on("dragover.h5s dragenter.h5s drop.h5s",function(e){return!f.is(b)&&d.connectWith!==a(b).parent().data("connectWith")?!0:e.type=="drop"?(e.stopPropagation(),c.filter(":visible").after(b),!1):(e.preventDefault(),e.originalEvent.dataTransfer.dropEffect="move",f.is(this)?(d.forcePlaceholderSize&&i.height(b.outerHeight()),b.hide(),a(this)[i.index()<a(this).index()?"after":"before"](i),c.not(i).detach()):!c.is(this)&&!a(this).children(d.items).length&&(c.detach(),a(this).append(i)),!1)})})}})(jQuery);
+</script>
+
+<script>
+//Functions declaration
+
+  function sortableList() {
+    console.log('sort changed');
+    var formData = {};
+
+    //?TODO formData.ajax_request = "edit_moveact"
+
+    formData.ajax_request = true;
+    var liIds = $('#tabslist li').map(function(i,n) {
+      return $(n).attr('id');
+    }).get().join('&');
+    cat_name = $('#select_category').val();
+    formData.cat_name  = cat_name;
+    formData.actions  = liIds;
+    formData.edit_moveact  = 'Move Action';
+    //formData.push({ name: 'edit.moveact', value: 'Move Action'});
+    $.ajax({
+      type:'POST', 
+      url: '@@plonetabs-controlpanel', 
+      data: formData, 
+      success: function(response) {
+            var json = JSON.parse(response)
+            console.log("response from server: ");
+            console.log(json);
+
+            if (json.status_code === 200){
+                console.log('display success messages'); 
+            }
+            else{
+                console.log('display error messages');
+            }
+      }
+    });
+  }
+
+  function toggleCollapsible(el, collapse) {
+    collapse = typeof collapse !== 'undefined' ? collapse : 'default';
+
+    var node = el.parent(".collapseAdvanced"); 
+
+    if(collapse!=='default'){
+      if (collapse==true){
+          console.log("removeClass expandedBlock; addClass collapsedBlock");
+          node.removeClass('expandedBlock');
+          node.addClass('collapsedBlock');
+      } 
+      else{
+          console.log("removeClass collapsedBlock; addClass expandedBlock");
+          node.removeClass('collapsedBlock');
+          node.addClass('expandedBlock');
+      }
+    }
+    else{
+      if (node.hasClass('collapsedBlock')){
+          console.log("removeClass collapsedBlock; addClass expandedBlock");
+          node.removeClass('collapsedBlock');
+          node.addClass('expandedBlock');
+      } 
+      else{
+          console.log("removeClass expandedBlock; addClass collapsedBlock");
+          node.removeClass('expandedBlock');
+          node.addClass('collapsedBlock');
+      }
+    }
+
+  }
+
+  function startupActions() {
+    console.log('running basic methods');
+    $(".add-controls input").addClass('allowMultiSubmit');
+    $(".edit-controls input").addClass('allowMultiSubmit');
+    $(".collapseAdvanced").removeClass('expandedBlock').addClass('collapsedBlock');
+  }
+</script>
+
+<script>
+  $(document).ready(function() {
+    console.log('document ready');
+    $("#plonetabs_form").addClass('kssTabsActive');
+    startupActions()
+  });
+</script>
+
+
+<script>
+/*CLIENTS METHODS*/
+
+//titleWrapper
+    $("#tabslist .titleWrapper").live("click", function() {
+        console.log("#tabslist .titleWrapper clicked");
+        ($(this).closest('li')).addClass('editing');
+    });
+
+//collapse
+    $(".collapseAdvanced .headerAdvanced").live("click", function(event) {
+        console.log(".collapseAdvanced .headerAdvanced clicked");
+        toggleCollapsible($(this));
+    });
+</script>
+
+<script> 
+/*AJAX METHODS*/
+
+//save(edit) 
+  $('#tabslist .editsave').live("click", function(event) {
+      console.log('.editsave clicked ');
+      event.preventDefault();
+      var formData = $(this).closest('form').serializeArray();
+      formData.push({ name: "edit_save", value: this.value });
+
+      //?TODO formData.ajax_request = "edit_save"
+
+      formData.push({ name: "ajax_request", value: true });
+      $.ajax({
+        type:'POST', 
+        url: '@@plonetabs-controlpanel', 
+        data: formData, 
+        success: function(response) {
+            var json = JSON.parse(response)
+            console.log("response from server: ");
+            console.log(json);
+            if (json.status_code === 200){
+                console.log('display success messages');  
+
+                $(this).closest('li').replaceWith(json.content);
+            }
+            else{
+                console.log('display error messages');
+
+                //if 'id' in errors or 'available_expr' in errors or 'url_expr' in errors:
+                toggleCollapsible($(this).find('.headerAdvanced'), false);
+            }
+        }
+    });
+  });
+
+//reset(cancel) 
+  $('#tabslist .editcancel').live("click", function(event) {
+      console.log('.editcancel clicked ');
+      event.preventDefault();
+      var formData={};
+      formData.ajax_request = true;
+
+      //?TODO formData.ajax_request = "edit_cancel"
+
+      formData.edit_cancel = 'Cancel';
+      var parentFormSelect = $(this).closest('li');
+      formData.orig_id = parentFormSelect.find('.editform input[name="orig_id"]').val();
+      formData.category = parentFormSelect.find('.editform input[name="category"]').val();
+      $.ajax({
+        type:'POST', 
+        url: '@@plonetabs-controlpanel', 
+        data: formData, 
+        success: function(response) {
+            var json = JSON.parse(response)
+            console.log("response from server: ");
+            console.log(json);
+
+            if (json.status_code === 200){
+                console.log('display success messages');
+                parentFormSelect.replaceWith(json.content);
+                
+            }
+            else{
+                console.log('display error messages');
+            }
+        }
+              
+  });
+});
+
+//delete
+  $('#tabslist .delete').live("click", function(event) {
+      console.log('.delete clicked ');
+      event.preventDefault();
+      var formData={};
+      formData.ajax_request = true;
+
+      //?TODO formData.ajax_request = "edit_delete"
+
+      formData.edit_delete = 'Delete';
+      var parentFormSelect = $(this).closest('li');
+      formData.orig_id = parentFormSelect.find('.editform input[name="orig_id"]').val();
+      formData.category = parentFormSelect.find('.editform input[name="category"]').val();
+      $.ajax({
+        type:'POST', 
+        url: '@@plonetabs-controlpanel', 
+        data: formData, 
+        success: function(response) {
+            var json = JSON.parse(response)
+            console.log("response from server: ");
+            console.log(json);
+            if (json.status_code === 200){
+                console.log('display success messages');
+                parentFormSelect.remove()
+            }
+            else{
+                console.log('display error messages');
+            }
+            
+        }
+              
+  });
+});
+
+//visibility
+  $('#tabslist input.visibility').live("click", function(event) {
+      var formData={};
+      formData.ajax_request = true;
+      console.log('#tabslist input.visibility clicked ');
+      formData.tabslist_visible = 'Set visibillity';
+      var parentFormSelect = $(this).closest('li');
+      formData.orig_id = parentFormSelect.find('.editform input[name="orig_id"]').val();
+      formData.category = parentFormSelect.find('.editform input[name="category"]').val();
+      formData.visibility = $(this).is(":checked");
+
+      $.ajax({
+        type:'POST', 
+        url: '@@plonetabs-controlpanel', 
+        data: formData, 
+        success: function(response) {
+            var json = JSON.parse(response)
+            console.log("response from server: ");
+            console.log(json);
+
+
+            if (json.status_code === 200){
+                console.log('display success messages');
+                
+                if (formData.visibility === true){
+                    parentFormSelect.removeClass("invisible");
+                }
+                else{
+                    parentFormSelect.addClass("invisible");
+                }
+            }
+            else{
+                console.log('display error messages');
+            }
+        }
+              
+  });
+});
+
+//changing category
+  $('#select_category').change(function(event) {
+        var formData={};
+        formData.ajax_request = true;
+        console.log('select_category changed ');
+        formData.category = $(this).val();
+        formData.category_change = 'Change';
+        $.ajax({
+          type: 'POST', 
+          url:  '@@plonetabs-controlpanel', 
+          data: formData, 
+          success: function(response) {
+              var json = JSON.parse(response)
+              console.log(json);
+              if (json.status_code === 200){
+                  console.log('display success messages');
+                  $('form[name=addaction_form] input[name=category]').text($('#select_category').val());
+                  $('#tabslist').html(json.actionslist);
+                  $('#autogeneration_section').html(json.section);
+                  $('#plonetabs-form-title').text(json.title);
+
+                  $('#addaction').removeClass('adding');
+                  toggleCollapsible($('form[name=addaction_form] .headerAdvanced'), true);
+
+                  //Sorting lists
+                  $('#tabslist').unbind();
+                  $('#tabslist').sortable().bind('sortupdate', function(){sortableList()});
+
+                  //Running startupActions
+                  startupActions();
+              }
+              else{
+                  console.log('display error messages');
+              }
+          }
+        });
+  });
+</script>
+
+<script> 
+//portal_tabs methods
+
+//visibility
+  $('#roottabs .visibility').live("click", function(event) {
+      var formData={};
+      formData.ajax_request = true;
+      console.log('#roottabs .visibility clicked ');
+      formData.roottabs_visible = 'Visibillity';
+      var parentFormSelect = $(this).closest('li');
+      formData.orig_id = parentFormSelect.attr('id');
+      formData.visibility = $(this).is(":checked");
+      $.ajax({
+        type:'POST', 
+        url: '@@plonetabs-controlpanel', 
+        data: formData, 
+        success: function(response) {
+            var json = JSON.parse(response)
+            console.log("response from server: ");
+            console.log(json);
+            if (json.status_code === 200){
+                console.log('display success messages');
+                $('#portal-globalnav').load(' #portal-globalnav>*');
+                if (formData.visibility === true){
+                    parentFormSelect.removeClass("invisible");
+                }
+                else{
+                    parentFormSelect.addClass("invisible");
+                }
+                
+            }
+            else{
+                console.log('display error messages');
+            }
+        }
+              
+  });
+});
+
+//General func for toggleGeneratedTabs and nonfolderish_tabs request 
+  function sendRequest(field_name, checked_status){
+    var formData={};
+    formData.ajax_request = true;
+    formData.field = field_name;
+    formData.generated_tabs = checked_status;
+    $.ajax({
+      type:'POST', 
+      url: '@@plonetabs-controlpanel', 
+      data: formData, 
+      success: function(response) {
+          var json = JSON.parse(response)
+          console.log("response from server: ");
+          console.log(json);
+          if (json.status_code === 200){
+              $('#roottabs').html(json.content);
+              $('#portal-globalnav').load(' #portal-globalnav>*');
+              console.log('display success messages');
+          }
+          else{
+              console.log('display error messages');
+          }
+      }     
+    });
+  }
+
+//toggleGeneratedTabs
+  $('#generated_tabs').live("click", function() {
+      console.log('#generated_tabs clicked ');
+      var field_name = 'disable_folder_sections';
+      var checked_status = $(this).is(":checked");
+      sendRequest(field_name, checked_status);
+  });
+
+//nonfolderish_tabs
+  $('#nonfolderish_tabs').live("click", function() {
+      console.log('#nonfolderish_tabs clicked ');
+      var field_name = 'disable_nonfolderish_sections';
+      var checked_status = $(this).is(":checked");
+      sendRequest(field_name, checked_status);
+  });
+</script>
+
+
+
+<script> 
+//Add new action methods
+
+//focus
+    $("#actname").live("focus", function() {
+        console.log("#actname on focus");
+        $('#addaction').addClass('adding');
+    });
+
+//cancel
+  $('#buttoncancel').live("click", function(event) {
+      console.log('#buttoncancel clicked ');
+      event.preventDefault();
+      $('#addaction').removeClass('adding');
+      toggleCollapsible($('form[name=addaction_form] .headerAdvanced'), true);
+      //('#kssPortalMessage').css("display", "none");
+  });
+
+//add
+  //TODO: add #addaction:submit event processing
+  $('#buttonadd').live("click", function(event) {
+      console.log('#buttonadd clicked ');
+      event.preventDefault();
+      var formData = $(this).closest('form').serializeArray();
+      formData.push({ name: "add_add", value: this.value });
+      formData.push({ name: "ajax_request", value: true });
+      formData.push({ name: "cat_name", value: $('#select_category').val() });
+
+      $.ajax({
+        type:'POST', 
+        url: '@@plonetabs-controlpanel', 
+        data: formData, 
+        success: function(response) {
+          var json = JSON.parse(response)
+          console.log("response from server: ");
+          console.log(json);
+          if (json.status_code === 200){
+            console.log('display success messages');
+
+            $("#tabslist").append(json.content)    
+            $("addaction").removeClass("adding");
+            toggleCollapsible($('form[name=addaction_form] .headerAdvanced'), true);
+
+            //TODO
+            //self.kss_blur(ksscore.getHtmlIdSelector('actname'))
+
+          }
+          else{
+            console.log('display error messages');
+
+            //TODO
+            //if 'id' in errors or 'available_expr' in errors:
+            toggleCollapsible($('form[name=addaction_form] .headerAdvanced'), false);
+            
+            
+          }
+        }
+    });
+  });
+</script>
 </div>
 
Index: quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/configure.zcml
===================================================================
--- quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/configure.zcml	(revision 3679)
+++ quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/configure.zcml	(revision 3680)
@@ -20,6 +20,4 @@
     <include package=".browser" />
 
-    <include package=".plugins" />
-
     <!-- Javascript testing support -->
     <configure zcml:condition="have kss_demo_version_1_2">
Index: quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/profiles/default/kssregistry.xml
===================================================================
--- quintagroup.plonetabs/branches/nokss/quintagroup/plonetabs/profiles/default/kssregistry.xml	(revision 3679)
+++ 	(revision )
@@ -1,7 +1,0 @@
-<?xml version="1.0"?>
-<object name="portal_kss" meta_type="KSS Registry">
- <kineticstylesheet cacheable="True" compression="safe" cookable="True"
-    enabled="1" expression="python:request['URL'].find('/@@plonetabs-controlpanel')>0 and portal.restrictedTraverse('@@plonetabs-mode')()!='plain'" id="++resource++plonetabs.kss"/>
- <kineticstylesheet cacheable="True" compression="safe" cookable="True"
-    enabled="1" expression="python:request['URL'].find('/@@plonetabs-controlpanel')>0" id="++resource++plonetabsmode.kss"/>
-</object>
