Index: main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser.py	(revision 11254)
@@ -22,5 +22,4 @@
 from zope.component import getUtility
 from hurry.workflow.interfaces import InvalidTransitionError
-from waeup.kofa.browser.resources import datatable
 from waeup.kofa.browser.layout import KofaPage, KofaAddFormPage, NullValidator
 from waeup.kofa.browser.breadcrumbs import Breadcrumb
@@ -52,5 +51,5 @@
             return
         if not batches:
-            self.flash(_('No batch selected.'))
+            self.flash(_('No batch selected.'), type='warning')
             return
         if isinstance(batches, basestring):
@@ -102,5 +101,5 @@
     @action(_('Cancel'), validator=NullValidator)
     def cancel(self, *args, **kw):
-        self.flash(_('Batch creation cancelled.'))
+        self.flash(_('Batch creation cancelled.'), type='warning')
         self.redirect(self.url(self.context))
 
@@ -120,5 +119,5 @@
     def update(self, filenames=None, reimport=None, cancel=None):
         if cancel is not None:
-            self.flash(_('Reimport cancelled.'))
+            self.flash(_('Reimport cancelled.'), type='warning')
             self.redirect(self.url(self.context))
             return
@@ -126,5 +125,5 @@
             return
         if not filenames:
-            self.flash(_('No file chosen. Action cancelled.'))
+            self.flash(_('No file chosen. Action cancelled.'), type='warning')
             self.redirect(self.url(self.context))
             return
@@ -137,5 +136,5 @@
             except KeyError:
                 self.flash(_('This batch already exists: ${a}',
-                    mapping = {'a':filename}))
+                    mapping = {'a':filename}), type='warning')
                 continue
             self.flash(_('Successfully reimported: ${a}',
@@ -156,8 +155,11 @@
     disable_button = _('Disable ACs')
     enable_button = _('Enable ACs')
+    cancel_button = _('Cancel Search')
 
     def update(self, *args, **kw):
-        datatable.need()
         form = self.request.form
+        if 'cancel' in form:
+            self.redirect(self.url(self.context))
+            return
         self.hitlist = []
         if 'searchterm' in form and form['searchterm']:
@@ -187,5 +189,5 @@
                 except InvalidTransitionError:
                     self.flash(_('${a}: Disable transition not allowed.',
-                        mapping = {'a':entry}))
+                        mapping = {'a':entry}), type='danger')
             elif 'enable' in form:
                 try:
@@ -196,5 +198,6 @@
                     self.context.logger_info(ob_class, message)
                 except InvalidTransitionError:
-                    self.flash(_('${a}: Re-enable transition not allowed.', mapping = {'a':entry}))
+                    self.flash(_('${a}: Re-enable transition not allowed.',
+                               mapping = {'a':entry}), type='danger')
         self.hitlist = search(query=self.searchterm,
             searchtype=self.searchtype, view=self)
Index: main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser.txt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser.txt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser.txt	(revision 11254)
@@ -273,5 +273,5 @@
     >>> ctrl.getControl(value='code').selected = True
     >>> browser.getControl(name='searchterm').value = app_1_codes.keys()[0]
-    >>> browser.getControl('Search').click()
+    >>> browser.getControl(name='search').click()
 
 The first access code in the ``APP-1`` batch is displayed:
@@ -295,5 +295,5 @@
     >>> ctrl.getControl(value='batch_serial').selected = True
     >>> browser.getControl(name='searchterm').value = '1'
-    >>> browser.getControl('Search').click()
+    >>> browser.getControl(name='search').click()
     >>> print browser.contents
     <!DOCTYPE html ...
@@ -311,5 +311,5 @@
     >>> ctrl.getControl(value='batch_serial').selected = True
     >>> browser.getControl(name='searchterm').value = 'xyz'
-    >>> browser.getControl('Search').click()
+    >>> browser.getControl(name='search').click()
     >>> print browser.contents
     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
@@ -324,5 +324,5 @@
     >>> ctrl.getControl(value='history').selected = True
     >>> browser.getControl(name='searchterm').value = 'initialized'
-    >>> browser.getControl('Search').click()
+    >>> browser.getControl(name='search').click()
     >>> print browser.contents
     <!DOCTYPE html ...
@@ -345,5 +345,5 @@
     >>> ctrl.getControl(value='history').selected = True
     >>> browser.getControl(name='searchterm').value = 'initialized'
-    >>> browser.getControl('Search').click()
+    >>> browser.getControl(name='search').click()
 
 This lists all access codes. We now tick one to disable it and click
Index: main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser_templates/batchcontainer.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser_templates/batchcontainer.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser_templates/batchcontainer.pt	(revision 11254)
@@ -3,5 +3,5 @@
     The following batches are available:
   </p>
-  <table>
+  <table class="table">
     <thead>
       <tr>
@@ -48,7 +48,7 @@
     </tbody>
   </table>
-  <input type="submit" class="btn" name="archive"
+  <input type="submit" class="btn btn-default" name="archive"
       tal:attributes="value view/archive_button" />
-  <input type="submit" class="btn" name="delete"
+  <input type="submit" class="btn btn-default" name="delete"
        tal:attributes="value view/delete_button" />
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser_templates/reimportbatchpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser_templates/reimportbatchpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser_templates/reimportbatchpage.pt	(revision 11254)
@@ -4,5 +4,5 @@
 </p>
 <form method="POST" i18n:domain="waeup.kofa">
-  <table>
+  <table class="table">
     <thead>
       <tr>
@@ -25,7 +25,7 @@
     </tbody>
   </table>
-  <input type="submit" class="btn primary" name="reimport"
+  <input type="submit" class="btn btn-primary" name="reimport"
       tal:attributes="value view/reimport_button" />
-  <input type="submit" class="btn" name="cancel"
+  <input type="submit" class="btn btn-default" name="cancel"
       tal:attributes="value view/cancel_button" />
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser_templates/searchpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser_templates/searchpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser_templates/searchpage.pt	(revision 11254)
@@ -1,13 +1,19 @@
-<form method="POST" i18n:domain="waeup.kofa">
+<form method="POST" i18n:domain="waeup.kofa" class="form-inline">
 <br />
-  <input type="submit" class="btn primary" name="search"
-      tal:attributes="value view/search_button" />
+  <div class="form-group">
+    <input type="submit" class="btn btn-primary" name="search"
+        tal:attributes="value view/search_button" />
   <span i18n:translate="">for access codes</span>
-  <select name="searchtype">
-    <option i18n:translate="" value="code">with PIN</option>
-    <option i18n:translate="" value="batch_serial">with serial</option>
-    <option i18n:translate="" value="history">with message term</option>
-  </select>
-  <input type="text" name="searchterm" />
+  </div>
+  <div class="form-group">
+    <select name="searchtype" class="form-control">
+      <option i18n:translate="" value="code">with PIN</option>
+      <option i18n:translate="" value="batch_serial">with serial</option>
+      <option i18n:translate="" value="history">with message term</option>
+    </select>
+  </div>
+  <div class="form-group">
+    <input type="text" class="form-control" name="searchterm" />
+  </div>
   <p>&nbsp;</p>
   <div tal:condition="view/hitlist">
@@ -17,5 +23,5 @@
     <input type="hidden" name="old_searchtype"
          tal:attributes="value view/searchtype" />
-    <table class="display dataTableManage">
+    <table class="kofa-data-table dataTableManage">
       <thead>
       <tr>
@@ -43,10 +49,15 @@
     </table>
     <div>
-      <input type="submit" class="btn" name="disable"
+      <input type="submit" class="btn btn-default" name="disable"
           tal:attributes="value view/disable_button" />
-      <input type="submit" class="btn" name="enable"
+      <input type="submit" class="btn btn-default" name="enable"
           tal:attributes="value view/enable_button" />
+      <input type="submit" class="btn btn-default" name="cancel"
+          tal:attributes="value view/cancel_button" />
     </div>
-
+  </div>
+  <div tal:condition="not: view/hitlist">
+    <input type="submit" class="btn btn-default" name="cancel"
+        tal:attributes="value view/cancel_button" />
   </div>
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 11254)
@@ -46,10 +46,8 @@
 from waeup.kofa.browser.interfaces import ICaptchaManager
 from waeup.kofa.browser.breadcrumbs import Breadcrumb
-from waeup.kofa.browser.resources import toggleall
 from waeup.kofa.browser.layout import (
     NullValidator, jsaction, action, UtilityView, JSAction)
 from waeup.kofa.browser.pages import (
     add_local_role, del_local_roles, doll_up, ExportCSVView)
-from waeup.kofa.browser.resources import datepicker, tabs, datatable, warning
 from waeup.kofa.interfaces import (
     IKofaObject, ILocalRolesAssignable, IExtFileStore, IPDF,
@@ -116,5 +114,4 @@
 
     def update(self, *args, **kw):
-        datatable.need()
         form = self.request.form
         self.results = []
@@ -127,10 +124,10 @@
         else:
             if 'search' in form:
-                self.flash(_('Empty search string'))
+                self.flash(_('Empty search string'), type='warning')
             return
         self.results = search(query=self.searchterm,
             searchtype=self.searchtype, view=self)
         if not self.results:
-            self.flash(_('No applicant found.'))
+            self.flash(_('No applicant found.'), type='warning')
         return
 
@@ -149,15 +146,4 @@
     subunits = _('Applicants Containers')
 
-    def update(self):
-        tabs.need()
-        datatable.need()
-        warning.need()
-        self.tab1 = self.tab2 = self.tab3 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
-        return super(ApplicantsRootManageFormPage, self).update()
-
     def getLocalRoles(self):
         roles = ILocalRolesAssignable(self.context)
@@ -180,6 +166,6 @@
             child_id = form['val_id']
         else:
-            self.flash(_('No container selected!'))
-            self.redirect(self.url(self.context, '@@manage')+'?tab2')
+            self.flash(_('No container selected!'), type='warning')
+            self.redirect(self.url(self.context, '@@manage')+'#tab2')
             return
         if not isinstance(child_id, list):
@@ -192,9 +178,9 @@
             except:
                 self.flash(_('Could not delete:') + ' %s: %s: %s' % (
-                        id, sys.exc_info()[0], sys.exc_info()[1]))
+                    id, sys.exc_info()[0], sys.exc_info()[1]), type='danger')
         if len(deleted):
             self.flash(_('Successfully removed: ${a}',
                 mapping = {'a':', '.join(deleted)}))
-        self.redirect(self.url(self.context, '@@manage')+'?tab2')
+        self.redirect(self.url(self.context, '@@manage')+'#tab2')
         return
 
@@ -235,8 +221,4 @@
     form_fields = grok.AutoFields(
         IApplicantsContainerAdd).omit('code').omit('title')
-
-    def update(self):
-        datepicker.need() # Enable jQuery datepicker in date fields.
-        return super(ApplicantsContainerAddFormPage, self).update()
 
     @action(_('Add applicants container'))
@@ -249,5 +231,7 @@
         if code in self.context.keys():
             self.flash(
-                _('An applicants container for the same application type and entrance year exists already in the database.'))
+              _('An applicants container for the same application '
+                'type and entrance year exists already in the database.'),
+                type='warning')
             return
         # Add new applicants container...
@@ -378,17 +362,4 @@
         return False
 
-    def update(self):
-        datepicker.need() # Enable jQuery datepicker in date fields.
-        tabs.need()
-        toggleall.need()
-        self.tab1 = self.tab2 = self.tab3 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
-        warning.need()
-        datatable.need()  # Enable jQurey datatables for contents listing
-        return super(ApplicantsContainerManageFormPage, self).update()
-
     def getLocalRoles(self):
         roles = ILocalRolesAssignable(self.context)
@@ -436,6 +407,6 @@
             child_id = form['val_id']
         else:
-            self.flash(_('No applicant selected!'))
-            self.redirect(self.url(self.context, '@@manage')+'?tab2')
+            self.flash(_('No applicant selected!'), type='warning')
+            self.redirect(self.url(self.context, '@@manage')+'#tab2')
             return
         if not isinstance(child_id, list):
@@ -448,9 +419,9 @@
             except:
                 self.flash(_('Could not delete:') + ' %s: %s: %s' % (
-                        id, sys.exc_info()[0], sys.exc_info()[1]))
+                    id, sys.exc_info()[0], sys.exc_info()[1]), type='danger')
         if len(deleted):
             self.flash(_('Successfully removed: ${a}',
                 mapping = {'a':', '.join(deleted)}))
-        self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+        self.redirect(self.url(self.context, u'@@manage')+'#tab2')
         return
 
@@ -461,6 +432,6 @@
             child_id = form['val_id']
         else:
-            self.flash(_('No applicant selected!'))
-            self.redirect(self.url(self.context, '@@manage')+'?tab2')
+            self.flash(_('No applicant selected!'), type='warning')
+            self.redirect(self.url(self.context, '@@manage')+'#tab2')
             return
         if not isinstance(child_id, list):
@@ -475,6 +446,6 @@
                 mapping = {'a': len(created)}))
         else:
-            self.flash(_('No student could be created.'))
-        self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+            self.flash(_('No student could be created.'), type='warning')
+        self.redirect(self.url(self.context, u'@@manage')+'#tab2')
         return
 
@@ -612,5 +583,5 @@
     def update(self):
         msg = self.context.createStudent(view=self)[1]
-        self.flash(msg)
+        self.flash(msg, type='warning')
         self.redirect(self.url(self.context))
         return
@@ -652,5 +623,5 @@
                 mapping = {'a': len(created)}))
         else:
-            self.flash(_('No student could be created.'))
+            self.flash(_('No student could be created.'), type='warning')
         self.redirect(self.url(self.context))
         return
@@ -672,5 +643,6 @@
             if ticket.p_state == 'paid':
                   self.flash(
-                      _('This type of payment has already been made.'))
+                      _('This type of payment has already been made.'),
+                      type='warning')
                   self.redirect(self.url(self.context))
                   return
@@ -678,8 +650,8 @@
         container = self.context.__parent__
         payment = createObject(self.factory)
-        error = applicants_utils.setPaymentDetails(
+        failure = applicants_utils.setPaymentDetails(
             container, payment, self.context)
-        if error is not None:
-            self.flash(error)
+        if failure is not None:
+            self.flash(failure[0], type='danger')
             self.redirect(self.url(self.context))
             return
@@ -731,5 +703,5 @@
                 self.context.p_id, self.context.p_category,
                 self.context.amount_auth, self.context.r_code))
-        self.flash(msg)
+        self.flash(msg, type='warning')
         return
 
@@ -785,5 +757,6 @@
         if self.context.state in ('initialized', 'started', 'paid'):
             self.flash(
-                _('Please pay and submit before trying to download the application slip.'))
+                _('Please pay and submit before trying to download '
+                  'the application slip.'), type='warning')
             return self.redirect(self.url(self.context))
         return
@@ -806,10 +779,10 @@
     size = file_size(upload)
     if size > MAX_UPLOAD_SIZE:
-        view.flash(_('Uploaded image is too big!'))
+        view.flash(_('Uploaded image is too big!'), type='danger')
         return False
     dummy, ext = os.path.splitext(upload.filename)
     ext.lower()
     if ext != '.jpg':
-        view.flash(_('jpg file extension expected.'))
+        view.flash(_('jpg file extension expected.'), type='danger')
         return False
     upload.seek(0) # file pointer moved when determining size
@@ -851,6 +824,4 @@
 
     def update(self):
-        datepicker.need() # Enable jQuery datepicker in date fields.
-        warning.need()
         super(ApplicantManageFormPage, self).update()
         self.wf_info = IWorkflowInfo(self.context)
@@ -894,5 +865,5 @@
             errors = validator.validate_password(password, password_ctl)
             if errors:
-                self.flash( ' '.join(errors))
+                self.flash( ' '.join(errors), type='danger')
                 return
         if self.upload_success is False:  # False is not None!
@@ -927,5 +898,5 @@
             child_id = form['val_id']
         else:
-            self.flash(_('No payment selected.'))
+            self.flash(_('No payment selected.'), type='warning')
             self.redirect(self.url(self.context))
             return
@@ -941,5 +912,5 @@
                 except:
                     self.flash(_('Could not delete:') + ' %s: %s: %s' % (
-                            id, sys.exc_info()[0], sys.exc_info()[1]))
+                      id, sys.exc_info()[0], sys.exc_info()[1]), type='danger')
         if len(deleted):
             self.flash(_('Successfully removed: ${a}',
@@ -1013,5 +984,6 @@
 
     def emit_lock_message(self):
-        self.flash(_('The requested form is locked (read-only).'))
+        self.flash(_('The requested form is locked (read-only).'),
+                   type='warning')
         self.redirect(self.url(self.context))
         return
@@ -1054,5 +1026,6 @@
             return
         if data.get('course1', 1) == data.get('course2', 2):
-            self.flash(_('1st and 2nd choice must be different.'))
+            self.flash(_('1st and 2nd choice must be different.'),
+                       type='warning')
             return
         self.applyData(self.context, **data)
@@ -1065,5 +1038,5 @@
             return # error during image upload. Ignore other values
         if self.dataNotComplete():
-            self.flash(self.dataNotComplete())
+            self.flash(self.dataNotComplete(), type='danger')
             return
         self.applyData(self.context, **data)
@@ -1072,5 +1045,6 @@
         # might have forgotten to lock the form after changing the state
         if state != self.submit_state:
-            self.flash(_('The form cannot be submitted. Wrong state!'))
+            self.flash(_('The form cannot be submitted. Wrong state!'),
+                       type='danger')
             return
         IWorkflowInfo(self.context).fireTransition('submit')
@@ -1126,5 +1100,5 @@
     def update(self):
         if self.context.expired:
-            self.flash(_('Outside application period.'))
+            self.flash(_('Outside application period.'), type='warning')
             self.redirect(self.url(self.context))
             return
@@ -1164,5 +1138,5 @@
                 applicant = results[0]
                 if getattr(applicant,'firstname',None) is None:
-                    self.flash(_('An error occurred.'))
+                    self.flash(_('An error occurred.'), type='danger')
                     return
                 elif applicant.firstname.lower() != firstname.lower():
@@ -1170,10 +1144,11 @@
                     # know that a record was found and only the firstname
                     # verification failed.
-                    self.flash(_('No application record found.'))
+                    self.flash(_('No application record found.'), type='warning')
                     return
                 elif applicant.password is not None and \
                     applicant.state != INITIALIZED:
                     self.flash(_('Your password has already been set and used. '
-                                 'Please proceed to the login page.'))
+                                 'Please proceed to the login page.'),
+                               type='warning')
                     return
                 # Store email address but nothing else.
@@ -1182,5 +1157,5 @@
             else:
                 # No record found, this is the truth.
-                self.flash(_('No application record found.'))
+                self.flash(_('No application record found.'), type='warning')
                 return
         else:
@@ -1227,5 +1202,5 @@
     grok.name('index.html')
     grok.template('exportjobsindex')
-    label = _('Applicant Data Exports')
+    label = _('Data Exports')
     pnav = 3
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantcontainerstatistics.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantcontainerstatistics.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantcontainerstatistics.pt	(revision 11254)
@@ -1,5 +1,5 @@
 <tal:statistics define="stats context/statistics" i18n:domain="waeup.kofa">
   <h2 i18n:translate="">Container Statistics</h2>
-  <table class="span8">
+  <table class="table">
     <thead>
       <tr>
@@ -17,5 +17,5 @@
     </tbody>
   </table>
-  <table class="span8" tal:condition="python: stats[1]">
+  <table class="table" tal:condition="python: stats[1]">
     <thead>
       <tr>
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantdisplaypage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantdisplaypage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantdisplaypage.pt	(revision 11254)
@@ -41,5 +41,5 @@
     Application Fee Payment Tickets
 </h3>
-<table i18n:domain="waeup.kofa">
+<table i18n:domain="waeup.kofa" class="table table-condensed">
   <thead>
     <tr>
@@ -54,5 +54,5 @@
   <tbody>
     <tr tal:repeat="value context/values">
-      <td> <a tal:attributes="href value/__name__">
+      <td> <a tal:attributes="href python:view.url(value)">
       <span tal:content="value/p_id">PID</span></a></td>
       <td tal:content="python: layout.formatDatetime(value.creation_date)">CREATION DATE</td>
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicanteditpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicanteditpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicanteditpage.pt	(revision 11254)
@@ -38,5 +38,5 @@
         <td class="fieldname" i18n:translate="">Password:</td>
         <td>
-          <input name="password" type="password"  />
+          <input class="form-control" name="password" type="password"  />
         </td>
       </tr>
@@ -44,5 +44,5 @@
         <td class="fieldname" i18n:translate="">Retype Password:</td>
         <td>
-          <input name="control_password" type="password" />
+          <input class="form-control" name="control_password" type="password" />
         </td>
       </tr>
@@ -50,5 +50,5 @@
         <td class="fieldname" i18n:translate="">Application Transition:</td>
         <td>
-          <select id="transition" name="transition">
+          <select id="transition" name="transition" class="form-control half">
             <option tal:repeat="transition view/getTransitions"
                     tal:attributes="value transition/name">
@@ -84,5 +84,5 @@
   </h3>
 
-  <table>
+  <table i18n:domain="waeup.kofa" class="table table-condensed">
     <thead>
     <tr>
@@ -104,5 +104,5 @@
          tal:condition="python: not view.unremovable(cl)" />
         </td>
-        <td> <a tal:attributes="href cl/__name__">
+        <td> <a tal:attributes="href python:view.url(cl)">
         <span tal:content="cl/p_id">PID</span></a></td>
         <td tal:content="python: layout.formatDatetime(cl.creation_date)">CREATION DATE</td>
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantregemailsent.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantregemailsent.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantregemailsent.pt	(revision 11254)
@@ -19,5 +19,5 @@
 <tal:credentials condition = "view/password" i18n:domain="waeup.kofa">
   <h3 i18n:translate="">Your login credentials are:</h3>
-  <table class="bordered-table span6">
+  <table class="table-bordered">
     <tr>
       <td i18n:translate="">User Name:</td>
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantscontaineraddpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantscontaineraddpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantscontaineraddpage.pt	(revision 11254)
@@ -1,4 +1,4 @@
 <form action="." tal:attributes="action request/URL" method="post"
-  class="edit-form" enctype="multipart/form-data">
+  enctype="multipart/form-data">
 
   <table class="form-table">
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantscontainermanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantscontainermanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantscontainermanagepage.pt	(revision 11254)
@@ -1,18 +1,18 @@
 <form action="." tal:attributes="action request/URL" method="POST"
-  i18n:domain="waeup.kofa" class="edit-form" enctype="multipart/form-data">
+  i18n:domain="waeup.kofa" enctype="multipart/form-data">
 
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1">
-    <a href="#tab-1">
+ <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+    <a href="#tab1" data-toggle="tab">
       <span i18n:translate="">Settings
       </span></a>
     </li>
-    <li tal:attributes="class view/tab2">
-    <a href="#tab-2">
+    <li>
+    <a href="#tab2" data-toggle="tab">
       <span i18n:translate="">Applicants
       </span></a>
     </li>
-    <li tal:attributes="class view/tab3">
-    <a href="#tab-3">
+    <li>
+    <a href="#tab3" data-toggle="tab">
       <span i18n:translate="">Local Roles
       </span></a>
@@ -20,5 +20,6 @@
   </ul>
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+    <div id="tab1" class="active tab-pane">
+      <br />
       <table class="form-table">
         <tbody>
@@ -33,11 +34,8 @@
       </div>
     </div>
-    <div id="tab-2" tal:attributes="class view/tab2">
+    <div id="tab2" class="tab-pane">
     <tal:showApplicants  condition="view/showApplicants">
-    <input type="checkbox" onClick="toggle(this, 'val_id')" />
-    <span  i18n:translate="">Select all</span>
-    <br /><br />
-
-      <table class="display dataTableManage">
+      <br />
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -55,5 +53,5 @@
         </thead>
         <tbody>
-          <tr class="gradeC" tal:repeat="appl context/values">
+          <tr tal:repeat="appl context/values">
             <td>
               <input type="checkbox" name="val_id" tal:attributes="value appl/__name__" />
@@ -78,4 +76,7 @@
         </tbody>
       </table>
+      <input type="checkbox" onClick="toggle(this, 'val_id')" />
+      <span  i18n:translate="">Select all</span>
+      <br /><br />
       <div tal:condition="view/availableActions">
         <span tal:repeat="action view/actions" tal:omit-tag="">
@@ -100,6 +101,6 @@
     </tal:showNoApplicants>
     </div>
-    <div id="tab-3" tal:attributes="class view/tab3"> <br />
-      <table class="display dataTableManage">
+    <div id="tab3" class="tab-pane"> <br />
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -115,5 +116,5 @@
         </thead>
         <tbody>
-          <tr tal:repeat="entry view/getUsersWithLocalRoles" class="gradeC"> <td>
+          <tr tal:repeat="entry view/getUsersWithLocalRoles"> <td>
               <input type="checkbox" name="role_id"
                 tal:attributes="value python: entry['user_name']+'|'+entry['local_role']" /> </td>
@@ -132,5 +133,5 @@
       <table class="form-table">
         <tr> <td>
-            <select id="user" name="user">
+            <select id="user" name="user" class="form-control">
               <option tal:repeat="user view/getUsers"
                       tal:attributes="value user/name">
@@ -139,5 +140,5 @@
               </option>
             </select> </td> <td>
-            <select id="local_role" name="local_role">
+            <select id="local_role" name="local_role" class="form-control">
               <option tal:repeat="localrole view/getLocalRoles"
                       tal:attributes="value localrole/name">
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantsrootmanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantsrootmanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantsrootmanagepage.pt	(revision 11254)
@@ -1,17 +1,17 @@
 <form action="." tal:attributes="action request/URL"
   i18n:domain="waeup.kofa" method="POST"  enctype="multipart/form-data">
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1">
-    <a href="#tab-1">
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+    <a href="#tab1" data-toggle="tab">
       <span i18n:translate="">Introduction
       </span></a>
     </li>
-    <li tal:attributes="class view/tab2">
-    <a href="#tab-2">
+    <li>
+    <a href="#tab2" data-toggle="tab">
       <span tal:content="view/subunits">Contents
       </span></a>
     </li>
-    <li tal:attributes="class view/tab3">
-    <a href="#tab-3">
+    <li>
+    <a href="#tab3" data-toggle="tab">
       <span i18n:translate="">Local Roles
       </span></a>
@@ -19,5 +19,6 @@
   </ul>
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+    <div id="tab1" class="active tab-pane">
+     <br />
       <table class="form-table">
         <tbody>
@@ -25,5 +26,4 @@
         </tbody>
       </table>
-
       <div tal:condition="view/availableActions">
         <span tal:repeat="action view/actions" tal:omit-tag="">
@@ -33,7 +33,6 @@
       </div>
     </div>
-    <div id="tab-2" tal:attributes="class view/tab2">
-      <h3 tal:content="view/subunits">SUBUNITS</h3>
-
+    <div id="tab2" class="tab-pane">
+      <br />
       <p i18n:translate="note_armp">
         Please note that containers will be opened in manage mode here.
@@ -42,6 +41,5 @@
         Please be patient until all records have been loaded.
       </p>
-
-      <table class="display dataTableManage">
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -59,5 +57,5 @@
         </thead>
         <tbody>
-          <tr tal:repeat="entry context/values" 	class="gradeC"> <td>
+          <tr tal:repeat="entry context/values"> <td>
               <input type="checkbox" name="val_id"
                 tal:attributes="value entry/__name__" /> </td>
@@ -78,7 +76,7 @@
       </div>
     </div>
-    <div id="tab-3" tal:attributes="class view/tab3">
+    <div id="tab3" class="tab-pane">
       <br />
-      <table class="display dataTableManage">
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -94,5 +92,5 @@
         </thead>
         <tbody>
-          <tr tal:repeat="entry view/getUsersWithLocalRoles" class="gradeC">
+          <tr tal:repeat="entry view/getUsersWithLocalRoles">
             <td> <input type="checkbox" name="role_id"
                     tal:attributes="value python: entry['user_name']+'|'+entry['local_role']" />  </td>
@@ -109,28 +107,31 @@
         </span>
       </div> <br /><br />
-      <table class="form-table">
-        <tr> <td>
-            <select id="user" name="user">
-              <option tal:repeat="user view/getUsers"
-                tal:attributes="value user/name">
-              <span tal:replace="user/val/title">USERTITLE
-              </span>
-              </option>
-            </select> </td> <td>
-            <select id="local_role" name="local_role">
-              <option tal:repeat="localrole view/getLocalRoles"
-                tal:attributes="value localrole/name">
-              <span tal:replace="localrole/title">LOCALROLETITLE
-              </span>
-              </option>
-            </select> </td> <td>
-            <div tal:condition="view/availableActions">
-              <span tal:repeat="action view/actions" tal:omit-tag="">
-                <input tal:condition="python:action.label in view.tabthreeactions2"
-                  tal:replace="structure action/render"/>
-              </span>
-            </div> </td>
-        </tr>
-      </table>
+      <div class="form-inline">
+        <br />
+        <div class="form-group">
+          <select id="user" name="user" class="form-control">
+            <option tal:repeat="user view/getUsers"
+                    tal:attributes="value user/name">
+            <span tal:replace="user/val/title">USERTITLE
+            </span>
+            </option>
+          </select>
+        </div>
+        <div class="form-group">
+          <select id="local_role" name="local_role" class="form-control">
+            <option tal:repeat="localrole view/getLocalRoles"
+                    tal:attributes="value localrole/name">
+            <span tal:replace="localrole/title">LOCALROLETITLE
+            </span>
+            </option>
+          </select>
+        </div>
+        <div class="form-group" tal:condition="view/availableActions">
+          <span tal:repeat="action view/actions" tal:omit-tag="">
+            <input tal:condition="python:action.label in view.tabthreeactions2"
+                   tal:replace="structure action/render"/>
+          </span>
+        </div>
+      </div>
     </div>
   </div>
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantsrootpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantsrootpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantsrootpage.pt	(revision 11254)
@@ -4,5 +4,5 @@
 </span>
 
-<table i18n:domain="waeup.kofa">
+<table i18n:domain="waeup.kofa" class="table table-hover">
   <thead>
     <tr>
@@ -14,5 +14,5 @@
   </thead>
   <tbody>
-    <tr tal:repeat="entry view/containers" class="gradeC">
+    <tr tal:repeat="entry view/containers">
       <td tal:content="entry/year">Year
       </td>
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantssearchpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantssearchpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantssearchpage.pt	(revision 11254)
@@ -1,17 +1,21 @@
-<form method="POST" i18n:domain="waeup.kofa">
+<form method="POST" i18n:domain="waeup.kofa" class="form-inline">
 <br />
-  <input class="btn primary" type="submit" name="search"
-    tal:attributes="value view/search_button" />
+  <div class="form-group">
+    <input class="btn btn-primary" type="submit" name="search"
+      tal:attributes="value view/search_button" />
+  </div>
+  <div class="form-group">
+    <select name="searchtype" class="form-control">
+      <option i18n:translate="" value="applicant_id">with id</option>
+      <option i18n:translate="" value="fullname">with name</option>
+      <option i18n:translate="" value="reg_number">with registration number</option>
+      <option i18n:translate="" value="email">with email address</option>
+    </select>
+  </div>
+  <div class="form-group">
+    <input type="text" class="form-control" name="searchterm" />
+  </div>
 
-  <select name="searchtype">
-    <option i18n:translate="" value="applicant_id">with id</option>
-    <option i18n:translate="" value="fullname">with name</option>
-    <option i18n:translate="" value="reg_number">with registration number</option>
-    <option i18n:translate="" value="email">with email address</option>
-  </select>
-
-  <input type="text" name="searchterm" />
-
-  <p>&nbsp;</p>
+  <br /><br />
   <div tal:condition="view/results">
     <h3 i18n:translate="">Search Results</h3>
@@ -20,5 +24,5 @@
     <input type="hidden" name="old_searchtype"
          tal:attributes="value view/searchtype" />
-    <table class="display dataTable">
+    <table class="kofa-data-table dataTable">
       <thead>
       <tr>
@@ -30,5 +34,5 @@
       </thead>
       <tbody>
-      <tr tal:repeat="item view/results" class="gradeC">
+      <tr tal:repeat="item view/results">
         <td> <a tal:attributes="href python:view.url(item)">
           <span tal:content="item/applicant_id">XXXX_1234</span></a>
@@ -42,5 +46,4 @@
       </tbody>
     </table>
-    <br />
   </div>
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/exportjobsindex.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/exportjobsindex.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/exportjobsindex.pt	(revision 11254)
@@ -1,3 +1,3 @@
-<table i18n:domain="waeup.kofa">
+<table i18n:domain="waeup.kofa" class="table table-condensed table-hover">
   <thead>
     <tr>
@@ -25,5 +25,5 @@
         <span tal:replace="job/creator">CREATOR</span>
       </td>
-      <td nowrap>
+      <td>
         <span tal:replace="job/start_time">DATETIME</span>
       </td>
@@ -32,18 +32,17 @@
       </td>
       <td nowrap>
-        <a href="" class="btn" i18n:translate=""
+        <a href="" class="btn btn-default btn-xs" i18n:translate=""
            tal:condition="job/show_refresh_button">
-          <img tal:attributes="src static/actionicon_reload.png" />
+          <img src="/static/img/actionicon_reload.png" />
           Reload
         </a>
         <form method="POST">
-          <a href="" class="btn primary small"
+          <a href="" class="btn btn-primary btn-xs"
                  tal:attributes="href job/download_url"
                  tal:condition="job/show_download_button">
             Download</a>
-
           <input type="hidden" name="job_id"
                  tal:attributes="value job/job" />
-          <input type="submit" class="btn small"
+          <input type="submit" class="btn btn-default btn-xs"
                  name="DISCARD" value="Discard"
                  tal:condition="job/show_discard_button" />
@@ -53,9 +52,7 @@
   </tbody>
 </table>
+
 <form method="POST" i18n:domain="waeup.kofa">
-  <div class="span12">
-
-  </div>
-  <input class="btn primary" type="submit" name="CREATE"
+  <input class="btn btn-primary" type="submit" name="CREATE"
          value="Start new export"
           />
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/utils.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/utils.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/utils.py	(revision 11254)
@@ -51,5 +51,5 @@
             session_config = grok.getSite()['configuration'][session]
         except KeyError:
-            return _(u'Session configuration object is not available.')
+            return _(u'Session configuration object is not available.'), None
         payment.p_id = "p%s" % timestamp
         payment.p_item = container.title
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/async.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/async.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/async.py	(revision 11254)
@@ -4,5 +4,4 @@
 from waeup.kofa.async import IJob, IJobManager
 from waeup.kofa.browser.layout import KofaPage
-from waeup.kofa.browser.resources import jquery, loadbar
 from waeup.kofa.interfaces import IKofaObject, IDataCenter
 from waeup.kofa.interfaces import MessageFactory as _
@@ -51,5 +50,4 @@
         self.exports = self.getRunningExports()
         self.uncompleted = [x for x in self.exports if x[0] != 'completed']
-        loadbar.need()
 
     def render(self):
@@ -126,5 +124,4 @@
 
     def update(self, START_NEW=None, REMOVE=None, job_id=None):
-        jquery.need()
         if REMOVE and job_id:
             self.context.remove(job_id)
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/batchprocessing.txt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/batchprocessing.txt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/batchprocessing.txt	(revision 11254)
@@ -55,5 +55,5 @@
     >>> 'Given storage path cannot be used.' in browser.contents
     True
-    >>> browser.getControl('Cancel').click()
+    >>> browser.getControl('Back to Data Center').click()
 
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/browser.txt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/browser.txt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/browser.txt	(revision 11254)
@@ -30,11 +30,9 @@
   >>> browser = Browser()
 
-Let's get the default view of a university and see if the
-favicon is properly referenced::
+Let's get the default view of a university::
 
   >>> browser.open('http://localhost/myuniversity')
   >>> print browser.contents
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"...
-  ...href="http://localhost/myuniversity/@@/waeup_kofa/favicon.ico"
   ...Welcome to WAeUP.Kofa...
   ...
@@ -102,9 +100,4 @@
 
   >>> 'Sample University' in browser.contents
-  True
-
-The edit form contains the default value for the portal skin::
-
-  >>> 'waeup-base.css' in browser.contents
   True
 
@@ -311,5 +304,5 @@
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   ...<h1 class="kofa-content-label">Academic Section</h1>
-  ...<td> <a href="TF"> <span>TF</span></a></td>
+  ...<td> <a href="http://localhost/myuniversity/faculties/TF"> <span>TF</span></a></td>
   ...
 
@@ -355,5 +348,5 @@
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"...
   ...<h1 class="kofa-content-label">Academic Section</h1>
-  ...<td> <a href="TF"> <span>TF</span></a></td>
+  ...<td> <a href="http://localhost/myuniversity/faculties/TF"> <span>TF</span></a></td>
   ...<td>Faculty of My renamed faculty (TF)</td>
   ...
@@ -481,5 +474,5 @@
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"...
   ...<h1 class="kofa-content-label">Departments</h1>
-  ...<td> <a href="TD"> <span>TD</span></a></td>
+  ...<td> <a href="http://localhost/myuniversity/faculties/TF/TD"> <span>TD</span></a></td>
   ...<td>Department of TestDept (TD)</td>
   ...
@@ -514,5 +507,5 @@
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   ...<h1 class="kofa-content-label">Departments</h1>
-  ...<td> <a href="TD"> <span>TD</span></a></td>
+  ...<td> <a href="http://localhost/myuniversity/faculties/TF/TD"> <span>TD</span></a></td>
   ...<td>Department of My renamed dept (TD)</td>
   ...
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/captcha.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/captcha.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/captcha.py	(revision 11254)
@@ -28,5 +28,4 @@
 from zope.interface import Interface
 from zope.publisher.interfaces.http import IHTTPRequest
-from waeup.kofa.browser import resources
 from waeup.kofa.browser.layout import KofaPage
 from waeup.kofa.browser.interfaces import (
@@ -229,6 +228,4 @@
     #: name of challenge field in HTTP request
     chal_field = 'recaptcha_challenge_field'
-    #: resource to set theme and other options
-    theme = resources.recaptcha_white
 
     # Do not use the following keys in productive environments!  As
@@ -294,6 +291,4 @@
         form).
         """
-        if self.theme is not None:
-            self.theme.need()
         error_param = ''
         if error_code:
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/interfaces.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/interfaces.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/interfaces.py	(revision 11254)
@@ -59,39 +59,4 @@
         """Get the list of breadcrumbs as real Python list.
         """
-class ITheme(Interface):
-    """An theme or 'skin'.
-
-    Themes are basically collections of CSS- and/or JavaScript files
-    stored somewhere. In Grok-contexts these files can be registered
-    as 'resources' (see :mod:`waeup.kofa.browser.resources`).
-
-    Furthermore, to make themes selectable and distinctable from each
-    other we assign them short descriptions.
-
-    Themes should be registered as named utilities so that they can be
-    defined also in third-party packages and be looked up by other
-    components like theme-selectors.
-    """
-    description = schema.TextLine(
-        title = u'Description',
-        description = u'Short description of the theme for choice fields',
-        required = False,
-        )
-
-    def getResources():
-        """Get resources of the theme.
-
-        Deliver a list of resources that must be included in a web page to
-        let it be rendered in the theme's style.
-
-        A resource is normally defined in the `resources` module. If a
-        theme needs several of them which normally do not depend on
-        each other then all these resources can be returned by this
-        method. Normally, you will only return one resource.
-
-        These resources will (if the theme is selected) be `need()`-ed
-        by the `update()` method of the general site layout.
-        """
-
 class ICaptchaRequest(Interface):
     """A set of data required to verify captcha solutions.
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/layout.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/layout.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/layout.py	(revision 11254)
@@ -26,5 +26,4 @@
 from zope.i18n import translate
 from zope.i18nmessageid import Message
-from hurry.resource import mode
 from megrok.layout import Page, Layout, Form, EditForm, DisplayForm, AddForm
 from z3c.flashmessage.interfaces import IMessageSource, IMessageReceiver
@@ -37,6 +36,5 @@
 from waeup.kofa.utils.helpers import to_timezone
 from waeup.kofa.browser.interfaces import (
-    ITheme, IStudentNavigationBase, IApplicantBase)
-from waeup.kofa.browser.theming import get_all_themes, KofaThemeBase
+    IStudentNavigationBase, IApplicantBase)
 from waeup.kofa.authentication import get_principal_role_manager
 
@@ -74,4 +72,7 @@
         super(KofaAction, self).__init__(label, **options)
         self.style = style
+        if style == '':
+            self.style = 'default'
+        
 
     def render(self):
@@ -82,5 +83,5 @@
             label = translate(self.label, context=self.form.request)
         return ('<input type="submit" id="%s" name="%s" value="%s"'
-                ' class="btn %s"/>' %
+                ' class="btn btn-%s"/>' %
                 (self.__name__, self.__name__, escape(label, quote=True),
                 self.style))
@@ -96,4 +97,10 @@
 
     msg = _('\'Are you sure?\'')
+
+    def __init__(self, label, style='', **options):
+        super(JSAction, self).__init__(label, **options)
+        self.style = style
+        if style == '':
+            self.style = 'default'
 
     def render(self):
@@ -105,6 +112,7 @@
         msg = translate(self.msg, context=self.form.request)
         return ('<input type="submit" id="%s" name="%s" value="%s"'
-                ' class="btn" onclick="return confirmPost(%s)" />' %
-                (self.__name__, self.__name__, escape(label, quote=True), msg)
+                ' class="btn btn-%s" onclick="return window.confirm(%s)" />' %
+                (self.__name__, self.__name__, escape(label, quote=True),
+                 self.style, msg)
                 )
 
@@ -151,11 +159,12 @@
         return self.url(site, name)
 
-    def flash(self, message, type='alert-message warning'):
+    def flash(self, message, type='success'):
         """Send a short message to the user.
         """
+        cssClass = 'alert alert-%s' % type
         source = queryUtility(IMessageSource, name='session')
         if source is None:
             return None
-        source.send(message, type)
+        source.send(message, cssClass)
         return True
 
@@ -174,10 +183,6 @@
         # Width parameters will be overridden by Bootstrap
         # so we have to set the css class
-        if self.widgets.get('subject'):
-            self.widgets['subject'].cssClass = 'span9'
         if self.widgets.get('body'):
             self.widgets['body'].height = 10
-        if self.widgets.get('body'):
-            self.widgets['body'].cssClass = 'span9'
 
 class KofaPage(UtilityView,Page):
@@ -202,27 +207,12 @@
         super(KofaEditFormPage,self).setUpWidgets(ignore_request)
         for widget in self.widgets:
-            if widget.__class__.__name__ == 'TextWidget':
-                widget.cssClass = 'span8'
-            elif widget.__class__.__name__ == 'IntWidget':
-                widget.cssClass = 'span2'
             if 'address' in widget.name or \
                 'comment' in widget.name or \
                 'notice' in widget.name:
-                widget.cssClass = 'span8'
                 widget.height = 6
-        if self.widgets.get('title'):
-            self.widgets['title'].cssClass = 'span12'
-        if self.widgets.get('frontpage'):
-            self.widgets['frontpage'].cssClass = 'span12'
-        if self.widgets.get('phone'):
-            self.widgets['phone'].cssClass = 'span4'
         if self.widgets.get('transcript_comment'):
-            self.widgets['transcript_comment'].cssClass = 'span12'
             self.widgets['transcript_comment'].height = 12
         if self.widgets.get('jamb_subjects'):
-            self.widgets['jamb_subjects'].cssClass = 'span8'
             self.widgets['jamb_subjects'].height = 6
-        if self.widgets.get('description'):
-            self.widgets['description'].cssClass = 'span12'
 
 class KofaAddFormPage(UtilityView,AddForm):
@@ -238,5 +228,4 @@
 
     #: An instance of the default theme to use for the site layout
-    default_theme = KofaThemeBase()
     stafftemp = grok.PageTemplateFile('templates/staffsitelayout.pt')
     studenttemp = grok.PageTemplateFile('templates/studentsitelayout.pt')
@@ -318,26 +307,4 @@
             return None          
 
-    def update(self):
-        """Include the resources required by the chosen skin/theme.
-
-        University instances provide a 'skin' attribute, that should
-        hold the internal name of a theme.
-
-        A theme in the waeup.kofa sense consists of a list of
-        CSS/JavaScript resources defined in the
-        :mod:`waeup.kofa.browser.resources` module.
-
-        If the context University object has no such attribute or the
-        set value is not a valid theme name, we pick 'gray waeup
-        theme' as default.
-        """
-        mode('minified')
-        theme_name = getattr(grok.getSite()['configuration'], 'skin', '')
-        theme = queryUtility(ITheme, name=theme_name,
-                             default=self.default_theme)
-        for resource in theme.getResources():
-            resource.need()
-        return
-
     def render(self):
         if self.isStudent() or self.isApplicant() or not self.isAuthenticated():
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py	(revision 11254)
@@ -51,6 +51,4 @@
     ICaptchaManager, IChangePassword)
 from waeup.kofa.browser.layout import jsaction, action, UtilityView
-from waeup.kofa.browser.resources import (
-    warning, tabs, datatable)
 from waeup.kofa.interfaces import MessageFactory as _
 from waeup.kofa.interfaces import(
@@ -85,6 +83,6 @@
     user = view.request.form.get('user', None)
     if user is None or localrole is None:
-        view.flash('No user selected.')
-        view.redirect(view.url(view.context, '@@manage')+'?tab%s' % tab)
+        view.flash('No user selected.', type='danger')
+        view.redirect(view.url(view.context, '@@manage')+'#tab%s' % tab)
         return
     role_manager = IPrincipalRoleManager(view.context)
@@ -94,5 +92,5 @@
     grok.getSite().logger.info(
         '%s - added: %s|%s' % (ob_class, user, localrole))
-    view.redirect(view.url(view.context, u'@@manage')+'?tab%s' % tab)
+    view.redirect(view.url(view.context, u'@@manage')+'#tab%s' % tab)
     return
 
@@ -100,6 +98,6 @@
     child_ids = view.request.form.get('role_id', None)
     if child_ids is None:
-        view.flash(_('No local role selected.'))
-        view.redirect(view.url(view.context, '@@manage')+'?tab%s' % tab)
+        view.flash(_('No local role selected.'), type='danger')
+        view.redirect(view.url(view.context, '@@manage')+'#tab%s' % tab)
         return
     if not isinstance(child_ids, list):
@@ -117,5 +115,6 @@
         except:
             view.flash('Could not remove %s: %s: %s' % (
-                    child_id, sys.exc_info()[0], sys.exc_info()[1]))
+                    child_id, sys.exc_info()[0], sys.exc_info()[1]),
+                    type='danger')
     if len(deleted):
         view.flash(
@@ -125,5 +124,5 @@
         grok.getSite().logger.info(
             '%s - removed: %s' % (ob_class, ', '.join(deleted)))
-    view.redirect(view.url(view.context, u'@@manage')+'?tab%s' % tab)
+    view.redirect(view.url(view.context, u'@@manage')+'#tab%s' % tab)
     return
 
@@ -133,7 +132,7 @@
         child_id = form['val_id']
     else:
-        view.flash(_('No item selected.'))
+        view.flash(_('No item selected.'), type='danger')
         if tab:
-            view.redirect(view.url(view.context, redirect)+'?tab%s' % tab)
+            view.redirect(view.url(view.context, redirect)+'#tab%s' % tab)
         else:
             view.redirect(view.url(view.context, redirect))
@@ -152,5 +151,5 @@
         except:
             view.flash('Could not delete %s: %s: %s' % (
-                    id, sys.exc_info()[0], sys.exc_info()[1]))
+                    id, sys.exc_info()[0], sys.exc_info()[1]), type='danger')
     if len(deleted):
         view.flash(_('Successfully removed: ${a}',
@@ -160,5 +159,5 @@
             '%s - removed: %s' % (ob_class, ', '.join(deleted)))
     if tab:
-        view.redirect(view.url(view.context, redirect)+'?tab%s' % tab)
+        view.redirect(view.url(view.context, redirect)+'#tab%s' % tab)
     else:
         view.redirect(view.url(view.context, redirect))
@@ -282,5 +281,6 @@
                             self.request.principal.id)
                         self.flash(
-                          _('Your personal data record is outdated. Please update.'))
+                          _('Your personal data record is outdated. Please update.'),
+                          type='warning')
                     self.redirect(self.application_url() + rel_link)
                     return
@@ -316,14 +316,16 @@
                         now < temp_password_dict.get('timestamp', now) + delta:
                         self.flash(
-                            _('Your account has been temporarily deactivated.'))
+                            _('Your account has been temporarily deactivated.'),
+                            type='warning')
                         return
                     # Now we know that the student is suspended.
                     comment = self._comment(student)
                     if comment:
-                        self.flash(comment)
+                        self.flash(comment, type='warning')
                     else:
-                        self.flash(_('Your account has been deactivated.'))
+                        self.flash(_('Your account has been deactivated.'),
+                                   type='warning')
                     return
-            self.flash(_('You entered invalid credentials.'))
+            self.flash(_('You entered invalid credentials.'), type='danger')
             return
 
@@ -441,5 +443,5 @@
             self.flash(_('Your message has been sent.'))
         else:
-            self.flash(_('A smtp server error occurred.'))
+            self.flash(_('A smtp server error occurred.'), type='danger')
         return
 
@@ -528,5 +530,4 @@
 
     def update(self, userid=None, adduser=None, manage=None, delete=None):
-        datatable.need()
         if manage is not None and userid is not None:
             self.redirect(self.url(userid) + '/@@manage')
@@ -588,5 +589,5 @@
             errors = validator.validate_password(password, password_ctl)
             if errors:
-                self.flash( ' '.join(errors))
+                self.flash( ' '.join(errors), type='danger')
                 return
         try:
@@ -601,5 +602,5 @@
         except KeyError:
             self.status = self.flash('The userid chosen already exists '
-                                  'in the database.')
+                                  'in the database.', type='danger')
             return
         self.redirect(self.url(self.context))
@@ -632,5 +633,5 @@
             errors = validator.validate_password(password, password_ctl)
             if errors:
-                self.flash( ' '.join(errors))
+                self.flash( ' '.join(errors), type='danger')
                 return
         changed_fields = self.applyData(self.context, **data)
@@ -744,5 +745,4 @@
 
     def update(self, *args, **kw):
-        datatable.need()
         form = self.request.form
         self.hitlist = []
@@ -769,4 +769,5 @@
     form_fields = grok.AutoFields(IConfigurationContainer)
     form_fields['frontpage'].custom_widget = HTMLDisplayWidget
+
 
 class ConfigurationContainerManageFormPage(KofaEditFormPage):
@@ -784,16 +785,6 @@
         _('Add session configuration'),
         _('Remove selected')]
-    form_fields = grok.AutoFields(IConfigurationContainer).omit('frontpage_dict')
-
-    def update(self):
-        tabs.need()
-        self.tab1 = self.tab2 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
-        datatable.need()
-        warning.need()
-        return super(ConfigurationContainerManageFormPage, self).update()
+    form_fields = grok.AutoFields(IConfigurationContainer).omit(
+        'frontpage_dict')
 
     def _frontpage(self):
@@ -857,12 +848,12 @@
                 ob_class, sessionconfiguration.academic_session))
         except KeyError:
-            self.flash(_('The session chosen already exists.'))
-            return
-        self.redirect(self.url(self.context, '@@index')+'?tab2')
+            self.flash(_('The session chosen already exists.'), type='danger')
+            return
+        self.redirect(self.url(self.context, '@@index')+'#tab2')
         return
 
     @action(_('Cancel'), validator=NullValidator)
     def cancel(self):
-        self.redirect(self.url(self.context, '@@index')+'?tab2')
+        self.redirect(self.url(self.context, '@@index')+'#tab2')
         return
 
@@ -885,10 +876,10 @@
     def save(self, **data):
         msave(self, **data)
-        self.redirect(self.url(self.context.__parent__, '@@index')+'?tab2')
+        self.redirect(self.url(self.context.__parent__, '@@index')+'#tab2')
         return
 
     @action(_('Cancel'), validator=NullValidator)
     def cancel(self):
-        self.redirect(self.url(self.context.__parent__, '@@index')+'?tab2')
+        self.redirect(self.url(self.context.__parent__, '@@index')+'#tab2')
         return
 
@@ -904,9 +895,4 @@
     pnav = 0
 
-    def update(self):
-        datatable.need()
-        warning.need()
-        return super(DatacenterPage, self).update()
-
     @jsaction(_('Remove selected'))
     def delFiles(self, **data):
@@ -915,5 +901,5 @@
             child_id = form['val_id']
         else:
-            self.flash(_('No item selected.'))
+            self.flash(_('No item selected.'), type='danger')
             return
         if not isinstance(child_id, list):
@@ -926,5 +912,6 @@
                 deleted.append(id)
             except OSError:
-                self.flash(_('OSError: The file could not be deleted.'))
+                self.flash(_('OSError: The file could not be deleted.'),
+                           type='danger')
                 return
         if len(deleted):
@@ -942,7 +929,10 @@
     label = _(u'Processed Files')
     pnav = 0
-
-    def update(self):
-        datatable.need()
+    cancel_button =_('Back to Data Center')
+
+    def update(self, CANCEL=None):
+        if CANCEL is not None:
+            self.redirect(self.url(self.context))
+            return
         return super(DatacenterFinishedPage, self).update()
 
@@ -955,5 +945,5 @@
     max_files = 20
     upload_button =_(u'Upload')
-    cancel_button =_(u'Cancel')
+    cancel_button =_(u'Back to Data Center')
 
     def getPreviewHeader(self):
@@ -1027,5 +1017,5 @@
                     _('All import managers have been notified by email.'))
             else:
-                self.flash(_('An smtp server error occurred.'))
+                self.flash(_('An smtp server error occurred.'), type='danger')
             return
 
@@ -1035,5 +1025,6 @@
         if number_of_pendings > self.max_files:
             self.flash(
-                _('Maximum number of files in the data center exceeded.'))
+                _('Maximum number of files in the data center exceeded.'),
+                  type='danger')
             self.redirect(self.url(self.context))
             return
@@ -1046,8 +1037,8 @@
             filename = uploadfile.filename
             #if 'pending' in filename:
-            #    self.flash(_("You can't re-upload pending data files."))
+            #    self.flash(_("You can't re-upload pending data files."), type='danger')
             #    return
             if not filename.endswith('.csv'):
-                self.flash(_("Only csv files are allowed."))
+                self.flash(_("Only csv files are allowed."), type='danger')
                 return
             normalized_filename = self.getNormalizedFileName(filename)
@@ -1057,5 +1048,6 @@
                 self.context.storage, 'unfinished', normalized_filename)
             if os.path.exists(finished_file) or os.path.exists(unfinished_file):
-                self.flash(_("File with same name was uploaded earlier."))
+                self.flash(_("File with same name was uploaded earlier."),
+                           type='danger')
                 return
             target = os.path.join(self.context.storage, normalized_filename)
@@ -1071,5 +1063,5 @@
                     "has invalid CSV format. "
                     "First problematic line detected: line %s. "
-                    "Please replace." % invalid_line))
+                    "Please replace." % invalid_line), type='danger')
                 logger.info('%s - invalid file uploaded: %s' %
                             (ob_class, target))
@@ -1083,6 +1075,6 @@
 
         except IOError:
-            self.flash('Error while uploading file. Please retry.')
-            self.flash('I/O error: %s' % sys.exc_info()[1])
+            self.flash('Error while uploading file. Please retry.', type='danger')
+            self.flash('I/O error: %s' % sys.exc_info()[1], type='danger')
             return
         self.redirect(self.url(self.context))
@@ -1181,5 +1173,5 @@
     label = _(u'Process CSV file')
     pnav = 0
-    cancel_button =_(u'Cancel')
+    cancel_button =_(u'Back to Data Center')
 
     def getFiles(self):
@@ -1193,5 +1185,4 @@
     def update(self, filename=None, select=None, cancel=None):
         if cancel is not None:
-            self.flash(_('Import aborted.'))
             self.redirect(self.url(self.context))
             return
@@ -1277,5 +1268,5 @@
             return
         if cancel is not None:
-            self.flash(_('Import aborted.'))
+            self.flash(_('Import aborted.'), type='warning')
             self.redirect(self.url(self.context))
             return
@@ -1289,5 +1280,5 @@
         if self.importer and 'update' in self.importer:
             if self.mode != 'update':
-                self.flash(_('Update mode only!'))
+                self.flash(_('Update mode only!'), type='warning')
                 self.mode_locked = True
                 self.mode = 'update'
@@ -1303,5 +1294,5 @@
         else:
             self.reader = ()
-            self.flash(warnings)
+            self.flash(warnings, type='warning')
 
 class DatacenterImportStep3(KofaPage):
@@ -1388,5 +1379,4 @@
 
     def update(self, headerfield=None, back2=None, cancel=None, proceed=None):
-        datatable.need()
         session = ISession(self.request)['waeup.kofa']
         self.filename = session.get('import_filename', None)
@@ -1401,5 +1391,5 @@
             return
         if cancel is not None:
-            self.flash(_('Import aborted.'))
+            self.flash(_('Import aborted.'), type='warning')
             self.redirect(self.url(self.context))
             return
@@ -1416,5 +1406,5 @@
         warnings = self.getWarnings()
         if warnings:
-            self.flash(warnings)
+            self.flash(warnings, type='warning')
 
 class DatacenterImportStep4(KofaPage):
@@ -1478,5 +1468,5 @@
         if self.warn_num:
             self.flash(_('Processing of ${a} rows failed.',
-                mapping = {'a':self.warn_num}))
+                mapping = {'a':self.warn_num}), type='warning')
         self.flash(_('Successfully processed ${a} rows.',
             mapping = {'a':linenum - self.warn_num}))
@@ -1506,5 +1496,5 @@
     pnav = 0
     search_button = _('Search')
-    back_button = _('Back')
+    back_button = _('Back to Data Center')
     placeholder = _('Enter a regular expression here...')
 
@@ -1516,5 +1506,5 @@
             self.flash(
                 _('Log files can only be searched ' +
-                  'on Unix-based operating systems.'))
+                  'on Unix-based operating systems.'), type='danger')
             self.redirect(self.url(self.context, '@@logs'))
             return
@@ -1530,8 +1520,8 @@
                 self.context.queryLogfiles(logname, query))
         except ValueError:
-            self.flash(_('Invalid search expression.'))
+            self.flash(_('Invalid search expression.'), type='danger')
             return
         if not self.result:
-            self.flash(_('No search results found.'))
+            self.flash(_('No search results found.'), type='warning')
         return
 
@@ -1545,5 +1535,5 @@
     save_button =_(u'Save')
     reset_button =_(u'Reset')
-    cancel_button =_(u'Cancel')
+    cancel_button =_(u'Back to Data Center')
 
     def update(self, newpath=None, move=False, overwrite=False,
@@ -1562,8 +1552,8 @@
             for name in not_copied:
                 self.flash(_('File already existed (not copied): ${a}',
-                    mapping = {'a':name}))
+                    mapping = {'a':name}), type='danger')
         except:
-            self.flash(_('Given storage path cannot be used.'))
-            self.flash(_('Error: ${a}', mapping = {'a':sys.exc_info()[1]}))
+            self.flash(_('Given storage path cannot be used. ${a}',
+                        mapping = {'a':sys.exc_info()[1]}), type='danger')
             return
         if newpath:
@@ -1583,4 +1573,5 @@
     pnav = 0
     export_button = _(u'Create CSV file')
+    cancel_button =_(u'Back to Data Center')
 
     def getExporters(self):
@@ -1594,5 +1585,9 @@
         return sorted(title_name_tuples)
 
-    def update(self, CREATE=None, DISCARD=None, exporter=None, job_id=None):
+    def update(self, CREATE=None, DISCARD=None, exporter=None,
+               job_id=None, CANCEL=None):
+        if CANCEL is not None:
+            self.redirect(self.url(self.context))
+            return
         if CREATE:
             job_id = self.context.start_export_job(
@@ -1718,12 +1713,9 @@
         return _('Manage academic section')
 
-    def update(self):
-        warning.need()
-        return super(FacultiesContainerManageFormPage, self).update()
-
     @jsaction(_('Remove selected'))
     def delFaculties(self, **data):
         if not checkPermission('waeup.managePortal', self.context):
-            self.flash(_('You are not allowed to remove entire faculties.'))
+            self.flash(_('You are not allowed to remove entire faculties.'),
+                       type='warning')
             return
         delSubobjects(self, redirect='@@manage', tab='1')
@@ -1758,10 +1750,11 @@
             self.context.addFaculty(faculty)
         except KeyError:
-            self.flash(_('The faculty code chosen already exists.'))
+            self.flash(_('The faculty code chosen already exists.'),
+                       type='danger')
             return
         ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
         self.context.__parent__.logger.info(
             '%s - added: %s' % (ob_class, faculty.code))
-        self.redirect(self.url(self.context, u'@@manage')+'?tab1')
+        self.redirect(self.url(self.context, u'@@manage')+'#tab1')
         return
 
@@ -1806,19 +1799,9 @@
         return _('Manage faculty')
 
-    def update(self):
-        tabs.need()
-        self.tab1 = self.tab2 = self.tab3 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
-        warning.need()
-        datatable.need()
-        return super(FacultyManageFormPage, self).update()
-
     @jsaction(_('Remove selected'))
     def delDepartments(self, **data):
         if not checkPermission('waeup.managePortal', self.context):
-            self.flash(_('You are not allowed to remove entire departments.'))
+            self.flash(_('You are not allowed to remove entire departments.'),
+                       type='danger')
             return
         delSubobjects(self, redirect='@@manage', tab='2')
@@ -1841,5 +1824,5 @@
     @action(_('Add local role'), validator=NullValidator)
     def addLocalRole(self, **data):
-        return add_local_role(self, '3', **data)
+        return add_local_role(self,3,**data)
 
     @action(_('Remove selected local roles'))
@@ -1878,5 +1861,4 @@
 
     def update(self, *args, **kw):
-        datatable.need()
         form = self.request.form
         self.hitlist = []
@@ -1889,10 +1871,10 @@
         else:
             if 'search' in form:
-                self.flash(_('Empty search string'))
+                self.flash(_('Empty search string'), type='warning')
             return
         self.hitlist = self._find_students(query=self.searchterm,
             searchtype=self.searchtype, view=self)
         if not self.hitlist:
-            self.flash(_('No student found.'))
+            self.flash(_('No student found.'), type='warning')
         return
 
@@ -1914,5 +1896,6 @@
             self.context.addDepartment(department)
         except KeyError:
-            self.flash(_('The code chosen already exists in this faculty.'))
+            self.flash(_('The code chosen already exists in this faculty.'),
+                       type='danger')
             return
         self.status = self.flash(
@@ -1921,5 +1904,5 @@
         self.context.__parent__.__parent__.logger.info(
             '%s - added: %s' % (ob_class, data['code']))
-        self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+        self.redirect(self.url(self.context, u'@@manage')+'#tab2')
         return
 
@@ -1942,6 +1925,4 @@
 
     def update(self):
-        tabs.need()
-        datatable.need()
         super(DepartmentPage, self).update()
         return
@@ -1997,16 +1978,4 @@
             yield(dict(url=url, name=key, container=val))
 
-    def update(self):
-        tabs.need()
-        self.tab1 = self.tab2 = self.tab3 = self.tab4 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
-        warning.need()
-        datatable.need()
-        super(DepartmentManageFormPage, self).update()
-        return
-
     @action(_('Save'), style='primary')
     def save(self, **data):
@@ -2022,5 +1991,6 @@
     def delCertificates(self, **data):
         if not checkPermission('waeup.managePortal', self.context):
-            self.flash(_('You are not allowed to remove certificates.'))
+            self.flash(_('You are not allowed to remove certificates.'),
+                       type='warning')
             return
         delSubobjects(
@@ -2045,5 +2015,5 @@
     @action(_('Add local role'), validator=NullValidator)
     def addLocalRole(self, **data):
-        return add_local_role(self, 4, **data)
+        return add_local_role(self,4,**data)
 
     @action(_('Remove selected local roles'))
@@ -2076,5 +2046,5 @@
                 message += '<a href="%s">%s</a>' % (
                     self.url(entry), getattr(entry, '__name__', u'Unnamed'))
-                self.flash(message)
+                self.flash(message, type='warning')
             self.redirect(self.url(self.context, u'@@addcourse'))
             return
@@ -2084,5 +2054,5 @@
         self.context.__parent__.__parent__.__parent__.logger.info(
             '%s - added: %s' % (ob_class, data['code']))
-        self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+        self.redirect(self.url(self.context, u'@@manage')+'#tab2')
         return
 
@@ -2117,5 +2087,5 @@
                 message += '<a href="%s">%s</a>' % (
                     self.url(entry), getattr(entry, '__name__', u'Unnamed'))
-                self.flash(message)
+                self.flash(message, type='warning')
             self.redirect(self.url(self.context, u'@@addcertificate'))
             return
@@ -2125,5 +2095,5 @@
         self.context.__parent__.__parent__.__parent__.logger.info(
             '%s - added: %s' % (ob_class, data['code']))
-        self.redirect(self.url(self.context, u'@@manage')+'?tab3')
+        self.redirect(self.url(self.context, u'@@manage')+'#tab3')
         return
 
@@ -2165,15 +2135,4 @@
     form_fields = grok.AutoFields(ICourse).omit('code')
 
-    def update(self):
-        tabs.need()
-        self.tab1 = self.tab2 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
-        warning.need()
-        datatable.need()
-        return super(CourseManageFormPage, self).update()
-
     @action(_('Save'), style='primary')
     def save(self, **data):
@@ -2187,5 +2146,5 @@
     @action(_('Add local role'), validator=NullValidator)
     def addLocalRole(self, **data):
-        return add_local_role(self, 2, **data)
+        return add_local_role(self,2,**data)
 
     @action(_('Remove selected local roles'))
@@ -2211,5 +2170,4 @@
 
     def update(self):
-        datatable.need()
         return super(CertificatePage, self).update()
 
@@ -2238,15 +2196,4 @@
         return _('Manage certificate')
 
-    def update(self):
-        tabs.need()
-        self.tab1 = self.tab2 = self.tab3 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
-        warning.need()
-        datatable.need()
-        return super(CertificateManageFormPage, self).update()
-
     @action(_('Save'), style='primary')
     def save(self, **data):
@@ -2270,5 +2217,5 @@
     @action(_('Add local role'), validator=NullValidator)
     def addLocalRole(self, **data):
-        return add_local_role(self, 3, **data)
+        return add_local_role(self,3,**data)
 
     @action(_('Remove selected local roles'))
@@ -2293,5 +2240,5 @@
         except KeyError:
             self.status = self.flash(_('The chosen certificate course is already '
-                                  'part of this certificate.'))
+                                  'part of this certificate.'), type='warning')
             return
         self.status = self.flash(
@@ -2301,5 +2248,5 @@
         ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
         grok.getSite().logger.info('%s - added: %s' % (ob_class, code))
-        self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+        self.redirect(self.url(self.context, u'@@manage')+'#tab2')
         return
 
@@ -2421,5 +2368,5 @@
         user = self._searchUser(identifier, email)
         if user is None:
-            self.flash(_('No record found.'))
+            self.flash(_('No record found.'), type='warning')
             return
         # Change password
@@ -2442,5 +2389,5 @@
                 'has been sent to ${a}.', mapping = {'a':email}))
         else:
-            self.flash(_('An smtp server error occurred.'))
+            self.flash(_('An smtp server error occurred.'), type='danger')
         ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
         self.context.logger.info(
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/resources.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/resources.py	(revision 11253)
+++ 	(revision )
@@ -1,314 +1,0 @@
-## $Id$
-##
-## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 2 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, write to the Free Software
-## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-##
-"""Special JavaScript and CSS resources provided by waeup.kofa.
-"""
-#from hurry import yui
-from hurry.resource import Library, ResourceInclusion
-from hurry.resource.core import inclusion_renderers, EXTENSIONS
-from hurry.jqueryui import jqueryui, base, blitzer, ui_lightness, humanity
-from hurry.jquery import jquery
-
-
-#: All local resources are registered under the name ``waeup_kofa``.
-waeup_kofa = Library('waeup_kofa', 'static')
-
-def render_ico(url):
-    """An inclusion renderer for hurry.resource for files with .ico extension.
-    """
-    return '<link rel="shortcut icon" type="image/x-icon" href="%s" />' % url
-
-# Monkey patch hurry.resource to support .ico inclusions.
-inclusion_renderers['.ico'] = render_ico
-EXTENSIONS.append('.ico')
-
-#: A resource that includes a favicon.
-#:
-#: In the `getResource()` method of any theme include the
-#: HTML code to be rendered into the page::
-#:
-#:   from waeup.kofa.browser.resources import favicon
-#:   # ...
-#:   class MyTheme(grok.GlobalUtility):
-#:     # ...
-#:     def getResources(self):
-#:       return [favicon, ...]
-#:
-favicon = ResourceInclusion(waeup_kofa, 'favicon.ico')
-
-
-#: A resource that binds a jQueryUI datepicker widget to each
-#: <div> or <input> tag with class ``datepicker``.
-#: If you want to let a JavaScript datepicker appear when
-#: clicking into some input field, then you have to perform
-#: two steps:
-#:
-#: * In the `update()` method of the responsible view/page/form
-#:   require the JavaScript code to be rendered into the page::
-#:
-#:     from waeup.kofa.browser.resources import datepicker
-#:     # ...
-#:     class MyPage(...):
-#:       # ...
-#:       def update(self):
-#:         datepicker.need()
-#:
-#:   This way all required JavaScript will be rendered correctly
-#:   into the HTML page generated.
-#:
-#: * In your HTML code add some ``<input>`` or ``<div>`` tag with
-#:   ``class`` set to ``datepicker``, like this:
-#:
-#:   .. code-block:: html
-#:
-#:     <input type="text" name="entrydate" class="datepicker" />
-#:
-#: When the HTML is rendered, clicking into the field will open
-#: a datepicker widget. The datepicker functionality will be
-#: delivered by jQueryUI for every ``<div>/<input>`` field with class
-#: ``datepicker`` set.
-#:
-#: That means, you can also have several date input fields on a
-#: single page as long as each one has class ``datepicker``.
-#:
-#: Furthermore :func:`datepicker` supports different kinds of date
-#: representation from which you can choose simply by setting a
-#: different CSS class. The ``datepicker`` CSS mentioned above is
-#: only one of the following possibilities:
-#:
-#: ``"datepicker"``
-#:    renders date in format ``YYYY-MM-DD`` (ISO standard)
-#:
-#: ``"datepicker-year"``
-#:    same but also adds a select field for year
-#:
-#: ``"datepicker-le"``
-#:    renders date in format ``DD/MM/YYYY`` (little endian)
-#:
-#: ``"datepicker-le-year"``
-#:    same but also adds a select field for year
-#:
-#: ``"datepicker-de"``
-#:    renders date in format ``DD.MM.YYYY`` (german format)
-#:
-#: ``"datepicker-de-year"``
-#:    same but also adds a select field for year
-#:
-#: ``"datepicker-us"``
-#:    renders date in format ``MM/DD/YYYY`` (U.S. format)
-#:
-#: ``"datepicker-us-year"``
-#:    same but also adds a select field for year
-datepicker = ResourceInclusion(waeup_kofa, 'datepicker.js',
-                               depends=[jqueryui])
-
-
-#: If you want generate alert or confirm messages then you have to perform
-#: two steps:
-#:
-#: * In the `update()` method of the responsible view/page/form
-#:   require the JavaScript code to be rendered into the page::
-#:
-#:     from waeup.kofa.browser.resources import warning
-#:     # ...
-#:     class MyPage(...):
-#:       # ...
-#:       def update(self):
-#:         warning.need()
-#:
-#:   This way all required JavaScripts will be rendered correctly
-#:   into the HTML page generated.
-#:
-#:   In your HTML code add some <input> or <a> tag with onClick event:
-#:
-#:   .. code-block:: html
-#:
-#:        <input type="submit" name="xyz" value="abc">
-#:               onclick="return confirmPost('Are you sure?')"/>
-warning = ResourceInclusion(waeup_kofa, 'warning.js')
-
-#: If you have many select boxes in a from which have to be selected at the same
-#: time you have to perform two steps:
-#:
-#: * In the `update()` method of the responsible view/page/form
-#:   require the JavaScript code to be rendered into the page::
-#:
-#:     from waeup.kofa.browser.resources import toggleall
-#:     # ...
-#:     class MyPage(...):
-#:       # ...
-#:       def update(self):
-#:         toggleall.need()
-#:
-#:   This way all required JavaScripts will be rendered correctly
-#:   into the HTML page generated.
-#:
-#:   In your HTML code add some <input> tag with onClick event:
-#:
-#:   .. code-block:: html
-#:
-#:    <input type="checkbox" onClick="toggle(this, 'entries')" />
-toggleall = ResourceInclusion(waeup_kofa, 'toggleall.js')
-
-#: A resource that binds Bootstrap tabs to <div> tags with class
-#: ``tabs``.
-#:
-#: If you want Bootstrap tabs in your page then you
-#: have to perform two steps:
-#:
-#: * In the `update()` method of the responsible view/page/form
-#:   require the JavaScript code to be rendered into the page and set
-#:   tab for redirection::
-#:
-#:     from waeup.kofa.browser.resources import tabs
-#:
-#:     class MyPage(...):
-#:
-#:       def update(self):
-#:         tabs.need()
-#:         self.tab1 = self.tab2 = self.tab3 = ''
-#:         qs = self.request.get('QUERY_STRING', '')
-#:         if not qs:
-#:           qs = 'tab1'
-#:         setattr(self, qs, 'active')
-#:
-#:   This way all required JavaScripts will be rendered correctly
-#:   into the HTML page generated.
-#:
-#: * In your HTML code add some tags with like this:
-#:
-#:    .. code-block:: html
-#:
-#:     <ul class="tabs" data-tabs="tabs" >
-#:       <li tal:attributes="class view/tab1"><a href="#tab-1">Tab 1 Heading</a></li>
-#:       <li tal:attributes="class view/tab2"><a href="#tab-2">Tab 2 Heading</a></li>
-#:       <li tal:attributes="class view/tab3"><a href="#tab-3">Tab 3 Heading</a></li>
-#:     </ul>
-
-#:     <div class="tab-content">
-#:       <div id="tab-1" tal:attributes="class view/tab1">...</div>
-#:       <div id="tab-2" tal:attributes="class view/tab2">...</div>
-#:       <div id="tab-3" tal:attributes="class view/tab3">...</div>
-#:     </div>
-#:
-#: When the HTML is rendered, clicking into one of the tabs will make
-#: other <div>s disappear. See
-#:
-#:   http://twitter.github.com/bootstrap/javascript.html#tabs
-#:
-#: for details.
-#:
-tabs = ResourceInclusion(waeup_kofa, 'bootstrap-tabs-1.4.0.js',
-                          depends=[jquery])
-
-
-#: Resource that makes datatables for jQuery UI available.
-#:
-#: We register a normal version and a minified version. To make real
-#: use of datatables you might want to add some specialized CSS like
-#: `datatable_css` below.
-datatables = ResourceInclusion(waeup_kofa, 'jquery.dataTables.js',
-                               minified='jquery.dataTables.min.js',
-                               depends=[jquery])
-
-#: A stylesheet for datatables
-datatables_css = ResourceInclusion(waeup_kofa, 'datatables.css')
-
-#: A resource that turns HTML tables into sortable, searchable and :
-#: multi-page widgets using jQuery and the dataTables plugin available
-#: from http://www.datatables.net.
-#:
-#: If you want jQuery datatables for some <table> in your page then you
-#: have to perform two steps:
-#:
-#: * In the `update()` method of the responsible view/page/form
-#:   require the JavaScript code to be rendered into the page::
-#:
-#:     from waeup.kofa.browser.resources import datatable
-#:     # ...
-#:     class MyPage(...):
-#:       # ...
-#:       def update(self):
-#:         datatable.need()
-#:
-#:   This way all required JavaScripts will be rendered correctly
-#:   into the HTML page generated.
-#:
-#: * Assign a ``display dataTable`` class to the HTML table you want to tune:
-#:
-#:   .. code-block:: html
-#:
-#:      <table class="display dataTable">
-#:        <thead>
-#:          <tr>
-#:            <th>Name</th><th>Title</th>
-#:          </tr>
-#:        </thead>
-#:        <tbody>
-#:          <tr class="gradeA">
-#: 	      <td>Manfred</td><td>Mammoth of the year</td>
-#:          </tr>
-#:          <tr class="gradeA">
-#: 	      <td>Wolfgang</td><td>Junior</td>
-#:          </tr>
-#:        </tbody>
-#:      </table>
-#:
-#: When the HTML is rendered, clicking into one of the tabs will make
-#: other <div>s disappear. See
-#:
-#:   http://www.datatables.net/
-#:
-#: for details.
-#:
-datatable = ResourceInclusion(waeup_kofa, 'datatable.js',
-                              depends=[datatables, datatables_css])
-
-#: Register Twitter's Bootsrap css including dropdown js as a resource.
-bootstrap_min = ResourceInclusion(
-    waeup_kofa, 'bootstrap-1.4.0.css')
-
-dropdown = ResourceInclusion(
-    waeup_kofa, 'bootstrap-dropdown-1.4.0.js',
-    depends=[jquery])
-
-#: Register basic Kofa CSS (which is based on ``bootstrap.min-1.4.0.css``
-#: and ``base`` as a resource.
-waeup_base_css = ResourceInclusion(
-    waeup_kofa, 'waeup-base.css',
-    depends=[dropdown,bootstrap_min, base])
-
-#: A basic theme based on jQuery only (crappy yet).
-waeuptheme_empty = ResourceInclusion(
-    waeup_kofa, 'empty.css',
-    depends=[humanity])
-
-#: Render ReCaptcha with white theme.
-recaptcha_white = ResourceInclusion(
-    waeup_kofa, 'recaptcha_white.js'
-    )
-
-#: A page reloader (reloads after 3 secs)
-page_reloader = ResourceInclusion(
-    waeup_kofa, 'page_reloader.js', depends=[jquery])
-
-#: Disables page reloader (which is triggered by a JavaScript timer).
-page_not_reloader = ResourceInclusion(
-    waeup_kofa, 'page_not_reloader.js', depends=[jquery])
-
-loadbar = ResourceInclusion(
-    waeup_kofa, 'loadbar.js', depends=[jquery])
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/bootstrap-1.4.0.css
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/bootstrap-1.4.0.css	(revision 11253)
+++ 	(revision )
@@ -1,2467 +1,0 @@
-/*!
- * Bootstrap v1.4.0
- *
- * Copyright 2011 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- * Date: Sat Nov 12 01:04:51 PST 2011
- */
-/* Reset.less
- * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here	that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc).
- * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */
-html, body {
-  margin: 0;
-  padding: 0;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-p,
-blockquote,
-pre,
-a,
-abbr,
-acronym,
-address,
-cite,
-code,
-del,
-dfn,
-em,
-img,
-q,
-s,
-samp,
-small,
-strike,
-strong,
-sub,
-sup,
-tt,
-var,
-dd,
-dl,
-dt,
-li,
-ol,
-ul,
-fieldset,
-form,
-label,
-legend,
-button,
-table,
-caption,
-tbody,
-tfoot,
-thead,
-tr,
-th,
-td {
-  margin: 0;
-  padding: 0;
-  border: 0;
-  font-weight: normal;
-  font-style: normal;
-  font-size: 100%;
-  line-height: 1;
-  font-family: inherit;
-}
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-ol, ul {
-  list-style: none;
-}
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
-  content: "";
-}
-html {
-  overflow-y: scroll;
-  font-size: 100%;
-  -webkit-text-size-adjust: 100%;
-  -ms-text-size-adjust: 100%;
-}
-a:focus {
-  outline: thin dotted;
-}
-a:hover, a:active {
-  outline: 0;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
-  display: block;
-}
-audio, canvas, video {
-  display: inline-block;
-  *display: inline;
-  *zoom: 1;
-}
-audio:not([controls]) {
-  display: none;
-}
-sub, sup {
-  font-size: 75%;
-  line-height: 0;
-  position: relative;
-  vertical-align: baseline;
-}
-sup {
-  top: -0.5em;
-}
-sub {
-  bottom: -0.25em;
-}
-img {
-  border: 0;
-  -ms-interpolation-mode: bicubic;
-}
-button,
-input,
-select,
-textarea {
-  font-size: 100%;
-  margin: 0;
-  vertical-align: baseline;
-  *vertical-align: middle;
-}
-button, input {
-  line-height: normal;
-  *overflow: visible;
-}
-button::-moz-focus-inner, input::-moz-focus-inner {
-  border: 0;
-  padding: 0;
-}
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"] {
-  cursor: pointer;
-  -webkit-appearance: button;
-}
-input[type="search"] {
-  -webkit-appearance: textfield;
-  -webkit-box-sizing: content-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-}
-input[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-textarea {
-  overflow: auto;
-  vertical-align: top;
-}
-/* Variables.less
- * Variables to customize the look and feel of Bootstrap
- * ----------------------------------------------------- */
-/* Mixins.less
- * Snippets of reusable CSS to develop faster and keep code readable
- * ----------------------------------------------------------------- */
-/*
- * Scaffolding
- * Basic and global styles for generating a grid system, structural layout, and page templates
- * ------------------------------------------------------------------------------------------- */
-body {
-  background-color: #ffffff;
-  margin: 0;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  font-weight: normal;
-  line-height: 18px;
-  color: #404040;
-}
-.container {
-  width: 940px;
-  margin-left: auto;
-  margin-right: auto;
-  zoom: 1;
-}
-.container:before, .container:after {
-  display: table;
-  content: "";
-  zoom: 1;
-}
-.container:after {
-  clear: both;
-}
-.container-fluid {
-  position: relative;
-  min-width: 940px;
-  padding-left: 20px;
-  padding-right: 20px;
-  zoom: 1;
-}
-.container-fluid:before, .container-fluid:after {
-  display: table;
-  content: "";
-  zoom: 1;
-}
-.container-fluid:after {
-  clear: both;
-}
-.container-fluid > .sidebar {
-  position: absolute;
-  top: 0;
-  left: 20px;
-  width: 220px;
-}
-.container-fluid > .content {
-  margin-left: 240px;
-}
-a {
-  color: #0069d6;
-  text-decoration: none;
-  line-height: inherit;
-  font-weight: inherit;
-}
-a:hover {
-  color: #00438a;
-  text-decoration: underline;
-}
-.pull-right {
-  float: right;
-}
-.pull-left {
-  float: left;
-}
-.hide {
-  display: none;
-}
-.show {
-  display: block;
-}
-.row {
-  zoom: 1;
-  margin-left: -20px;
-}
-.row:before, .row:after {
-  display: table;
-  content: "";
-  zoom: 1;
-}
-.row:after {
-  clear: both;
-}
-.row > [class*="span"] {
-  display: inline;
-  float: left;
-  margin-left: 20px;
-}
-.span1 {
-  width: 40px;
-}
-.span2 {
-  width: 100px;
-}
-.span3 {
-  width: 160px;
-}
-.span4 {
-  width: 220px;
-}
-.span5 {
-  width: 280px;
-}
-.span6 {
-  width: 340px;
-}
-.span7 {
-  width: 400px;
-}
-.span8 {
-  width: 460px;
-}
-.span9 {
-  width: 520px;
-}
-.span10 {
-  width: 580px;
-}
-.span11 {
-  width: 640px;
-}
-.span12 {
-  width: 700px;
-}
-.span13 {
-  width: 760px;
-}
-.span14 {
-  width: 820px;
-}
-.span15 {
-  width: 880px;
-}
-.span16 {
-  width: 940px;
-}
-.span17 {
-  width: 1000px;
-}
-.span18 {
-  width: 1060px;
-}
-.span19 {
-  width: 1120px;
-}
-.span20 {
-  width: 1180px;
-}
-.span21 {
-  width: 1240px;
-}
-.span22 {
-  width: 1300px;
-}
-.span23 {
-  width: 1360px;
-}
-.span24 {
-  width: 1420px;
-}
-.row > .offset1 {
-  margin-left: 80px;
-}
-.row > .offset2 {
-  margin-left: 140px;
-}
-.row > .offset3 {
-  margin-left: 200px;
-}
-.row > .offset4 {
-  margin-left: 260px;
-}
-.row > .offset5 {
-  margin-left: 320px;
-}
-.row > .offset6 {
-  margin-left: 380px;
-}
-.row > .offset7 {
-  margin-left: 440px;
-}
-.row > .offset8 {
-  margin-left: 500px;
-}
-.row > .offset9 {
-  margin-left: 560px;
-}
-.row > .offset10 {
-  margin-left: 620px;
-}
-.row > .offset11 {
-  margin-left: 680px;
-}
-.row > .offset12 {
-  margin-left: 740px;
-}
-.span-one-third {
-  width: 300px;
-}
-.span-two-thirds {
-  width: 620px;
-}
-.row > .offset-one-third {
-  margin-left: 340px;
-}
-.row > .offset-two-thirds {
-  margin-left: 660px;
-}
-/* Typography.less
- * Headings, body text, lists, code, and more for a versatile and durable typography system
- * ---------------------------------------------------------------------------------------- */
-p {
-  font-size: 13px;
-  font-weight: normal;
-  line-height: 18px;
-  margin-bottom: 9px;
-}
-p small {
-  font-size: 11px;
-  color: #bfbfbf;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  font-weight: bold;
-  color: #404040;
-}
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
-  color: #bfbfbf;
-}
-h1 {
-  margin-bottom: 18px;
-  font-size: 30px;
-  line-height: 36px;
-}
-h1 small {
-  font-size: 18px;
-}
-h2 {
-  font-size: 24px;
-  line-height: 36px;
-}
-h2 small {
-  font-size: 14px;
-}
-h3,
-h4,
-h5,
-h6 {
-  line-height: 36px;
-}
-h3 {
-  font-size: 18px;
-}
-h3 small {
-  font-size: 14px;
-}
-h4 {
-  font-size: 16px;
-}
-h4 small {
-  font-size: 12px;
-}
-h5 {
-  font-size: 14px;
-}
-h6 {
-  font-size: 13px;
-  color: #bfbfbf;
-  text-transform: uppercase;
-}
-ul, ol {
-  margin: 0 0 18px 25px;
-}
-ul ul,
-ul ol,
-ol ol,
-ol ul {
-  margin-bottom: 0;
-}
-ul {
-  list-style: disc;
-}
-ol {
-  list-style: decimal;
-}
-li {
-  line-height: 18px;
-  color: #808080;
-}
-ul.unstyled {
-  list-style: none;
-  margin-left: 0;
-}
-dl {
-  margin-bottom: 18px;
-}
-dl dt, dl dd {
-  line-height: 18px;
-}
-dl dt {
-  font-weight: bold;
-}
-dl dd {
-  margin-left: 9px;
-}
-hr {
-  margin: 20px 0 19px;
-  border: 0;
-  border-bottom: 1px solid #eee;
-}
-strong {
-  font-style: inherit;
-  font-weight: bold;
-}
-em {
-  font-style: italic;
-  font-weight: inherit;
-  line-height: inherit;
-}
-.muted {
-  color: #bfbfbf;
-}
-blockquote {
-  margin-bottom: 18px;
-  border-left: 5px solid #eee;
-  padding-left: 15px;
-}
-blockquote p {
-  font-size: 14px;
-  font-weight: 300;
-  line-height: 18px;
-  margin-bottom: 0;
-}
-blockquote small {
-  display: block;
-  font-size: 12px;
-  font-weight: 300;
-  line-height: 18px;
-  color: #bfbfbf;
-}
-blockquote small:before {
-  content: '\2014 \00A0';
-}
-address {
-  display: block;
-  line-height: 18px;
-  margin-bottom: 18px;
-}
-code, pre {
-  padding: 0 3px 2px;
-  font-family: Monaco, Andale Mono, Courier New, monospace;
-  font-size: 12px;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-}
-code {
-  background-color: #fee9cc;
-  color: rgba(0, 0, 0, 0.75);
-  padding: 1px 3px;
-}
-pre {
-  background-color: #f5f5f5;
-  display: block;
-  padding: 8.5px;
-  margin: 0 0 18px;
-  line-height: 18px;
-  font-size: 12px;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-  white-space: pre;
-  white-space: pre-wrap;
-  word-wrap: break-word;
-}
-/* Forms.less
- * Base styles for various input types, form layouts, and states
- * ------------------------------------------------------------- */
-form {
-  margin-bottom: 18px;
-}
-fieldset {
-  margin-bottom: 18px;
-  padding-top: 18px;
-}
-fieldset legend {
-  display: block;
-  padding-left: 150px;
-  font-size: 19.5px;
-  line-height: 1;
-  color: #404040;
-  *padding: 0 0 5px 145px;
-  /* IE6-7 */
-
-  *line-height: 1.5;
-  /* IE6-7 */
-
-}
-form .clearfix {
-  margin-bottom: 18px;
-  zoom: 1;
-}
-form .clearfix:before, form .clearfix:after {
-  display: table;
-  content: "";
-  zoom: 1;
-}
-form .clearfix:after {
-  clear: both;
-}
-label,
-input,
-select,
-textarea {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  font-weight: normal;
-  line-height: normal;
-}
-label {
-  padding-top: 6px;
-  font-size: 13px;
-  line-height: 18px;
-  float: left;
-  width: 130px;
-  text-align: right;
-  color: #404040;
-}
-form .input {
-  margin-left: 150px;
-}
-input[type=checkbox], input[type=radio] {
-  cursor: pointer;
-}
-input,
-textarea,
-select,
-.uneditable-input {
-  display: inline-block;
-  width: 210px;
-  height: 18px;
-  padding: 4px;
-  font-size: 13px;
-  line-height: 18px;
-  color: #808080;
-  border: 1px solid #ccc;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-}
-select {
-  padding: initial;
-}
-input[type=checkbox], input[type=radio] {
-  width: auto;
-  height: auto;
-  padding: 0;
-  margin: 3px 0;
-  *margin-top: 0;
-  /* IE6-7 */
-
-  line-height: normal;
-  border: none;
-}
-input[type=file] {
-  background-color: #ffffff;
-  padding: initial;
-  border: initial;
-  line-height: initial;
-  -webkit-box-shadow: none;
-  -moz-box-shadow: none;
-  box-shadow: none;
-}
-input[type=button], input[type=reset], input[type=submit] {
-  width: auto;
-  height: auto;
-}
-select, input[type=file] {
-  height: 27px;
-  *height: auto;
-  line-height: 27px;
-  *margin-top: 4px;
-  /* For IE7, add top margin to align select with labels */
-
-}
-select[multiple] {
-  height: inherit;
-  background-color: #ffffff;
-}
-textarea {
-  height: auto;
-}
-.uneditable-input {
-  background-color: #ffffff;
-  display: block;
-  border-color: #eee;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-  cursor: not-allowed;
-}
-:-moz-placeholder {
-  color: #bfbfbf;
-}
-::-webkit-input-placeholder {
-  color: #bfbfbf;
-}
-input, textarea {
-  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
-  -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
-  -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
-  -o-transition: border linear 0.2s, box-shadow linear 0.2s;
-  transition: border linear 0.2s, box-shadow linear 0.2s;
-  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
-  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
-}
-input:focus, textarea:focus {
-  outline: 0;
-  border-color: rgba(82, 168, 236, 0.8);
-  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
-  -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
-  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
-}
-input[type=file]:focus, input[type=checkbox]:focus, select:focus {
-  -webkit-box-shadow: none;
-  -moz-box-shadow: none;
-  box-shadow: none;
-  outline: 1px dotted #666;
-}
-form .clearfix.error > label, form .clearfix.error .help-block, form .clearfix.error .help-inline {
-  color: #b94a48;
-}
-form .clearfix.error input, form .clearfix.error textarea {
-  color: #b94a48;
-  border-color: #ee5f5b;
-}
-form .clearfix.error input:focus, form .clearfix.error textarea:focus {
-  border-color: #e9322d;
-  -webkit-box-shadow: 0 0 6px #f8b9b7;
-  -moz-box-shadow: 0 0 6px #f8b9b7;
-  box-shadow: 0 0 6px #f8b9b7;
-}
-form .clearfix.error .input-prepend .add-on, form .clearfix.error .input-append .add-on {
-  color: #b94a48;
-  background-color: #fce6e6;
-  border-color: #b94a48;
-}
-form .clearfix.warning > label, form .clearfix.warning .help-block, form .clearfix.warning .help-inline {
-  color: #c09853;
-}
-form .clearfix.warning input, form .clearfix.warning textarea {
-  color: #c09853;
-  border-color: #ccae64;
-}
-form .clearfix.warning input:focus, form .clearfix.warning textarea:focus {
-  border-color: #be9a3f;
-  -webkit-box-shadow: 0 0 6px #e5d6b1;
-  -moz-box-shadow: 0 0 6px #e5d6b1;
-  box-shadow: 0 0 6px #e5d6b1;
-}
-form .clearfix.warning .input-prepend .add-on, form .clearfix.warning .input-append .add-on {
-  color: #c09853;
-  background-color: #d2b877;
-  border-color: #c09853;
-}
-form .clearfix.success > label, form .clearfix.success .help-block, form .clearfix.success .help-inline {
-  color: #468847;
-}
-form .clearfix.success input, form .clearfix.success textarea {
-  color: #468847;
-  border-color: #57a957;
-}
-form .clearfix.success input:focus, form .clearfix.success textarea:focus {
-  border-color: #458845;
-  -webkit-box-shadow: 0 0 6px #9acc9a;
-  -moz-box-shadow: 0 0 6px #9acc9a;
-  box-shadow: 0 0 6px #9acc9a;
-}
-form .clearfix.success .input-prepend .add-on, form .clearfix.success .input-append .add-on {
-  color: #468847;
-  background-color: #bcddbc;
-  border-color: #468847;
-}
-.input-mini,
-input.mini,
-textarea.mini,
-select.mini {
-  width: 60px;
-}
-.input-small,
-input.small,
-textarea.small,
-select.small {
-  width: 90px;
-}
-.input-medium,
-input.medium,
-textarea.medium,
-select.medium {
-  width: 150px;
-}
-.input-large,
-input.large,
-textarea.large,
-select.large {
-  width: 210px;
-}
-.input-xlarge,
-input.xlarge,
-textarea.xlarge,
-select.xlarge {
-  width: 270px;
-}
-.input-xxlarge,
-input.xxlarge,
-textarea.xxlarge,
-select.xxlarge {
-  width: 530px;
-}
-textarea.xxlarge {
-  overflow-y: auto;
-}
-input.span1, textarea.span1 {
-  display: inline-block;
-  float: none;
-  width: 30px;
-  margin-left: 0;
-}
-input.span2, textarea.span2 {
-  display: inline-block;
-  float: none;
-  width: 90px;
-  margin-left: 0;
-}
-input.span3, textarea.span3 {
-  display: inline-block;
-  float: none;
-  width: 150px;
-  margin-left: 0;
-}
-input.span4, textarea.span4 {
-  display: inline-block;
-  float: none;
-  width: 210px;
-  margin-left: 0;
-}
-input.span5, textarea.span5 {
-  display: inline-block;
-  float: none;
-  width: 270px;
-  margin-left: 0;
-}
-input.span6, textarea.span6 {
-  display: inline-block;
-  float: none;
-  width: 330px;
-  margin-left: 0;
-}
-input.span7, textarea.span7 {
-  display: inline-block;
-  float: none;
-  width: 390px;
-  margin-left: 0;
-}
-input.span8, textarea.span8 {
-  display: inline-block;
-  float: none;
-  width: 450px;
-  margin-left: 0;
-}
-input.span9, textarea.span9 {
-  display: inline-block;
-  float: none;
-  width: 510px;
-  margin-left: 0;
-}
-input.span10, textarea.span10 {
-  display: inline-block;
-  float: none;
-  width: 570px;
-  margin-left: 0;
-}
-input.span11, textarea.span11 {
-  display: inline-block;
-  float: none;
-  width: 630px;
-  margin-left: 0;
-}
-input.span12, textarea.span12 {
-  display: inline-block;
-  float: none;
-  width: 690px;
-  margin-left: 0;
-}
-input.span13, textarea.span13 {
-  display: inline-block;
-  float: none;
-  width: 750px;
-  margin-left: 0;
-}
-input.span14, textarea.span14 {
-  display: inline-block;
-  float: none;
-  width: 810px;
-  margin-left: 0;
-}
-input.span15, textarea.span15 {
-  display: inline-block;
-  float: none;
-  width: 870px;
-  margin-left: 0;
-}
-input.span16, textarea.span16 {
-  display: inline-block;
-  float: none;
-  width: 930px;
-  margin-left: 0;
-}
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
-  background-color: #f5f5f5;
-  border-color: #ddd;
-  cursor: not-allowed;
-}
-.actions {
-  background: #f5f5f5;
-  margin-top: 18px;
-  margin-bottom: 18px;
-  padding: 17px 20px 18px 150px;
-  border-top: 1px solid #ddd;
-  -webkit-border-radius: 0 0 3px 3px;
-  -moz-border-radius: 0 0 3px 3px;
-  border-radius: 0 0 3px 3px;
-}
-.actions .secondary-action {
-  float: right;
-}
-.actions .secondary-action a {
-  line-height: 30px;
-}
-.actions .secondary-action a:hover {
-  text-decoration: underline;
-}
-.help-inline, .help-block {
-  font-size: 13px;
-  line-height: 18px;
-  color: #bfbfbf;
-}
-.help-inline {
-  padding-left: 5px;
-  *position: relative;
-  /* IE6-7 */
-
-  *top: -5px;
-  /* IE6-7 */
-
-}
-.help-block {
-  display: block;
-  max-width: 600px;
-}
-.inline-inputs {
-  color: #808080;
-}
-.inline-inputs span {
-  padding: 0 2px 0 1px;
-}
-.input-prepend input, .input-append input {
-  -webkit-border-radius: 0 3px 3px 0;
-  -moz-border-radius: 0 3px 3px 0;
-  border-radius: 0 3px 3px 0;
-}
-.input-prepend .add-on, .input-append .add-on {
-  position: relative;
-  background: #f5f5f5;
-  border: 1px solid #ccc;
-  z-index: 2;
-  float: left;
-  display: block;
-  width: auto;
-  min-width: 16px;
-  height: 18px;
-  padding: 4px 4px 4px 5px;
-  margin-right: -1px;
-  font-weight: normal;
-  line-height: 18px;
-  color: #bfbfbf;
-  text-align: center;
-  text-shadow: 0 1px 0 #ffffff;
-  -webkit-border-radius: 3px 0 0 3px;
-  -moz-border-radius: 3px 0 0 3px;
-  border-radius: 3px 0 0 3px;
-}
-.input-prepend .active, .input-append .active {
-  background: #a9dba9;
-  border-color: #46a546;
-}
-.input-prepend .add-on {
-  *margin-top: 1px;
-  /* IE6-7 */
-
-}
-.input-append input {
-  float: left;
-  -webkit-border-radius: 3px 0 0 3px;
-  -moz-border-radius: 3px 0 0 3px;
-  border-radius: 3px 0 0 3px;
-}
-.input-append .add-on {
-  -webkit-border-radius: 0 3px 3px 0;
-  -moz-border-radius: 0 3px 3px 0;
-  border-radius: 0 3px 3px 0;
-  margin-right: 0;
-  margin-left: -1px;
-}
-.inputs-list {
-  margin: 0 0 5px;
-  width: 100%;
-}
-.inputs-list li {
-  display: block;
-  padding: 0;
-  width: 100%;
-}
-.inputs-list label {
-  display: block;
-  float: none;
-  width: auto;
-  padding: 0;
-  margin-left: 20px;
-  line-height: 18px;
-  text-align: left;
-  white-space: normal;
-}
-.inputs-list label strong {
-  color: #808080;
-}
-.inputs-list label small {
-  font-size: 11px;
-  font-weight: normal;
-}
-.inputs-list .inputs-list {
-  margin-left: 25px;
-  margin-bottom: 10px;
-  padding-top: 0;
-}
-.inputs-list:first-child {
-  padding-top: 6px;
-}
-.inputs-list li + li {
-  padding-top: 2px;
-}
-.inputs-list input[type=radio], .inputs-list input[type=checkbox] {
-  margin-bottom: 0;
-  margin-left: -20px;
-  float: left;
-}
-.form-stacked {
-  padding-left: 20px;
-}
-.form-stacked fieldset {
-  padding-top: 9px;
-}
-.form-stacked legend {
-  padding-left: 0;
-}
-.form-stacked label {
-  display: block;
-  float: none;
-  width: auto;
-  font-weight: bold;
-  text-align: left;
-  line-height: 20px;
-  padding-top: 0;
-}
-.form-stacked .clearfix {
-  margin-bottom: 9px;
-}
-.form-stacked .clearfix div.input {
-  margin-left: 0;
-}
-.form-stacked .inputs-list {
-  margin-bottom: 0;
-}
-.form-stacked .inputs-list li {
-  padding-top: 0;
-}
-.form-stacked .inputs-list li label {
-  font-weight: normal;
-  padding-top: 0;
-}
-.form-stacked div.clearfix.error {
-  padding-top: 10px;
-  padding-bottom: 10px;
-  padding-left: 10px;
-  margin-top: 0;
-  margin-left: -10px;
-}
-.form-stacked .actions {
-  margin-left: -20px;
-  padding-left: 20px;
-}
-/*
- * Tables.less
- * Tables for, you guessed it, tabular data
- * ---------------------------------------- */
-table {
-  width: 100%;
-  margin-bottom: 18px;
-  padding: 0;
-  font-size: 13px;
-  border-collapse: collapse;
-}
-table th, table td {
-  padding: 10px 10px 9px;
-  line-height: 18px;
-  text-align: left;
-}
-table th {
-  padding-top: 9px;
-  font-weight: bold;
-  vertical-align: middle;
-}
-table td {
-  vertical-align: top;
-  border-top: 1px solid #ddd;
-}
-table tbody th {
-  border-top: 1px solid #ddd;
-  vertical-align: top;
-}
-.condensed-table th, .condensed-table td {
-  padding: 5px 5px 4px;
-}
-.bordered-table {
-  border: 1px solid #ddd;
-  border-collapse: separate;
-  *border-collapse: collapse;
-  /* IE7, collapse table to remove spacing */
-
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.bordered-table th + th, .bordered-table td + td, .bordered-table th + td {
-  border-left: 1px solid #ddd;
-}
-.bordered-table thead tr:first-child th:first-child, .bordered-table tbody tr:first-child td:first-child {
-  -webkit-border-radius: 4px 0 0 0;
-  -moz-border-radius: 4px 0 0 0;
-  border-radius: 4px 0 0 0;
-}
-.bordered-table thead tr:first-child th:last-child, .bordered-table tbody tr:first-child td:last-child {
-  -webkit-border-radius: 0 4px 0 0;
-  -moz-border-radius: 0 4px 0 0;
-  border-radius: 0 4px 0 0;
-}
-.bordered-table tbody tr:last-child td:first-child {
-  -webkit-border-radius: 0 0 0 4px;
-  -moz-border-radius: 0 0 0 4px;
-  border-radius: 0 0 0 4px;
-}
-.bordered-table tbody tr:last-child td:last-child {
-  -webkit-border-radius: 0 0 4px 0;
-  -moz-border-radius: 0 0 4px 0;
-  border-radius: 0 0 4px 0;
-}
-table .span1 {
-  width: 20px;
-}
-table .span2 {
-  width: 60px;
-}
-table .span3 {
-  width: 100px;
-}
-table .span4 {
-  width: 140px;
-}
-table .span5 {
-  width: 180px;
-}
-table .span6 {
-  width: 220px;
-}
-table .span7 {
-  width: 260px;
-}
-table .span8 {
-  width: 300px;
-}
-table .span9 {
-  width: 340px;
-}
-table .span10 {
-  width: 380px;
-}
-table .span11 {
-  width: 420px;
-}
-table .span12 {
-  width: 460px;
-}
-table .span13 {
-  width: 500px;
-}
-table .span14 {
-  width: 540px;
-}
-table .span15 {
-  width: 580px;
-}
-table .span16 {
-  width: 620px;
-}
-.zebra-striped tbody tr:nth-child(odd) td, .zebra-striped tbody tr:nth-child(odd) th {
-  background-color: #f9f9f9;
-}
-.zebra-striped tbody tr:hover td, .zebra-striped tbody tr:hover th {
-  background-color: #f5f5f5;
-}
-table .header {
-  cursor: pointer;
-}
-table .header:after {
-  content: "";
-  float: right;
-  margin-top: 7px;
-  border-width: 0 4px 4px;
-  border-style: solid;
-  border-color: #000 transparent;
-  visibility: hidden;
-}
-table .headerSortUp, table .headerSortDown {
-  background-color: rgba(141, 192, 219, 0.25);
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-}
-table .header:hover:after {
-  visibility: visible;
-}
-table .headerSortDown:after, table .headerSortDown:hover:after {
-  visibility: visible;
-  filter: alpha(opacity=60);
-  -khtml-opacity: 0.6;
-  -moz-opacity: 0.6;
-  opacity: 0.6;
-}
-table .headerSortUp:after {
-  border-bottom: none;
-  border-left: 4px solid transparent;
-  border-right: 4px solid transparent;
-  border-top: 4px solid #000;
-  visibility: visible;
-  -webkit-box-shadow: none;
-  -moz-box-shadow: none;
-  box-shadow: none;
-  filter: alpha(opacity=60);
-  -khtml-opacity: 0.6;
-  -moz-opacity: 0.6;
-  opacity: 0.6;
-}
-table .blue {
-  color: #049cdb;
-  border-bottom-color: #049cdb;
-}
-table .headerSortUp.blue, table .headerSortDown.blue {
-  background-color: #ade6fe;
-}
-table .green {
-  color: #46a546;
-  border-bottom-color: #46a546;
-}
-table .headerSortUp.green, table .headerSortDown.green {
-  background-color: #cdeacd;
-}
-table .red {
-  color: #9d261d;
-  border-bottom-color: #9d261d;
-}
-table .headerSortUp.red, table .headerSortDown.red {
-  background-color: #f4c8c5;
-}
-table .yellow {
-  color: #ffc40d;
-  border-bottom-color: #ffc40d;
-}
-table .headerSortUp.yellow, table .headerSortDown.yellow {
-  background-color: #fff6d9;
-}
-table .orange {
-  color: #f89406;
-  border-bottom-color: #f89406;
-}
-table .headerSortUp.orange, table .headerSortDown.orange {
-  background-color: #fee9cc;
-}
-table .purple {
-  color: #7a43b6;
-  border-bottom-color: #7a43b6;
-}
-table .headerSortUp.purple, table .headerSortDown.purple {
-  background-color: #e2d5f0;
-}
-/* Patterns.less
- * Repeatable UI elements outside the base styles provided from the scaffolding
- * ---------------------------------------------------------------------------- */
-.topbar {
-  height: 40px;
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  z-index: 10000;
-  overflow: visible;
-}
-.topbar a {
-  color: #bfbfbf;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-.topbar h3 a:hover, .topbar .brand:hover, .topbar ul .active > a {
-  background-color: #333;
-  background-color: rgba(255, 255, 255, 0.05);
-  color: #ffffff;
-  text-decoration: none;
-}
-.topbar h3 {
-  position: relative;
-}
-.topbar h3 a, .topbar .brand {
-  float: left;
-  display: block;
-  padding: 8px 20px 12px;
-  margin-left: -20px;
-  color: #ffffff;
-  font-size: 20px;
-  font-weight: 200;
-  line-height: 1;
-}
-.topbar p {
-  margin: 0;
-  line-height: 40px;
-}
-.topbar p a:hover {
-  background-color: transparent;
-  color: #ffffff;
-}
-.topbar form {
-  float: left;
-  margin: 5px 0 0 0;
-  position: relative;
-  filter: alpha(opacity=100);
-  -khtml-opacity: 1;
-  -moz-opacity: 1;
-  opacity: 1;
-}
-.topbar form.pull-right {
-  float: right;
-}
-.topbar input {
-  background-color: #444;
-  background-color: rgba(255, 255, 255, 0.3);
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: normal;
-  font-weight: 13px;
-  line-height: 1;
-  padding: 4px 9px;
-  color: #ffffff;
-  color: rgba(255, 255, 255, 0.75);
-  border: 1px solid #111;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25);
-  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25);
-  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25);
-  -webkit-transition: none;
-  -moz-transition: none;
-  -ms-transition: none;
-  -o-transition: none;
-  transition: none;
-}
-.topbar input:-moz-placeholder {
-  color: #e6e6e6;
-}
-.topbar input::-webkit-input-placeholder {
-  color: #e6e6e6;
-}
-.topbar input:hover {
-  background-color: #bfbfbf;
-  background-color: rgba(255, 255, 255, 0.5);
-  color: #ffffff;
-}
-.topbar input:focus, .topbar input.focused {
-  outline: 0;
-  background-color: #ffffff;
-  color: #404040;
-  text-shadow: 0 1px 0 #ffffff;
-  border: 0;
-  padding: 5px 10px;
-  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-}
-.topbar-inner, .topbar .fill {
-  background-color: #222;
-  background-color: #222222;
-  background-repeat: repeat-x;
-  background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));
-  background-image: -moz-linear-gradient(top, #333333, #222222);
-  background-image: -ms-linear-gradient(top, #333333, #222222);
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));
-  background-image: -webkit-linear-gradient(top, #333333, #222222);
-  background-image: -o-linear-gradient(top, #333333, #222222);
-  background-image: linear-gradient(top, #333333, #222222);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
-  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
-}
-.topbar div > ul, .nav {
-  display: block;
-  float: left;
-  margin: 0 10px 0 0;
-  position: relative;
-  left: 0;
-}
-.topbar div > ul > li, .nav > li {
-  display: block;
-  float: left;
-}
-.topbar div > ul a, .nav a {
-  display: block;
-  float: none;
-  padding: 10px 10px 11px;
-  line-height: 19px;
-  text-decoration: none;
-}
-.topbar div > ul a:hover, .nav a:hover {
-  color: #ffffff;
-  text-decoration: none;
-}
-.topbar div > ul .active > a, .nav .active > a {
-  background-color: #222;
-  background-color: rgba(0, 0, 0, 0.5);
-}
-.topbar div > ul.secondary-nav, .nav.secondary-nav {
-  float: right;
-  margin-left: 10px;
-  margin-right: 0;
-}
-.topbar div > ul.secondary-nav .menu-dropdown,
-.nav.secondary-nav .menu-dropdown,
-.topbar div > ul.secondary-nav .dropdown-menu,
-.nav.secondary-nav .dropdown-menu {
-  right: 0;
-  border: 0;
-}
-.topbar div > ul a.menu:hover,
-.nav a.menu:hover,
-.topbar div > ul li.open .menu,
-.nav li.open .menu,
-.topbar div > ul .dropdown-toggle:hover,
-.nav .dropdown-toggle:hover,
-.topbar div > ul .dropdown.open .dropdown-toggle,
-.nav .dropdown.open .dropdown-toggle {
-  background: #444;
-  background: rgba(255, 255, 255, 0.05);
-}
-.topbar div > ul .menu-dropdown,
-.nav .menu-dropdown,
-.topbar div > ul .dropdown-menu,
-.nav .dropdown-menu {
-  background-color: #333;
-}
-.topbar div > ul .menu-dropdown a.menu,
-.nav .menu-dropdown a.menu,
-.topbar div > ul .dropdown-menu a.menu,
-.nav .dropdown-menu a.menu,
-.topbar div > ul .menu-dropdown .dropdown-toggle,
-.nav .menu-dropdown .dropdown-toggle,
-.topbar div > ul .dropdown-menu .dropdown-toggle,
-.nav .dropdown-menu .dropdown-toggle {
-  color: #ffffff;
-}
-.topbar div > ul .menu-dropdown a.menu.open,
-.nav .menu-dropdown a.menu.open,
-.topbar div > ul .dropdown-menu a.menu.open,
-.nav .dropdown-menu a.menu.open,
-.topbar div > ul .menu-dropdown .dropdown-toggle.open,
-.nav .menu-dropdown .dropdown-toggle.open,
-.topbar div > ul .dropdown-menu .dropdown-toggle.open,
-.nav .dropdown-menu .dropdown-toggle.open {
-  background: #444;
-  background: rgba(255, 255, 255, 0.05);
-}
-.topbar div > ul .menu-dropdown li a,
-.nav .menu-dropdown li a,
-.topbar div > ul .dropdown-menu li a,
-.nav .dropdown-menu li a {
-  color: #999;
-  text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5);
-}
-.topbar div > ul .menu-dropdown li a:hover,
-.nav .menu-dropdown li a:hover,
-.topbar div > ul .dropdown-menu li a:hover,
-.nav .dropdown-menu li a:hover {
-  background-color: #191919;
-  background-repeat: repeat-x;
-  background-image: -khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919));
-  background-image: -moz-linear-gradient(top, #292929, #191919);
-  background-image: -ms-linear-gradient(top, #292929, #191919);
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919));
-  background-image: -webkit-linear-gradient(top, #292929, #191919);
-  background-image: -o-linear-gradient(top, #292929, #191919);
-  background-image: linear-gradient(top, #292929, #191919);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);
-  color: #ffffff;
-}
-.topbar div > ul .menu-dropdown .active a,
-.nav .menu-dropdown .active a,
-.topbar div > ul .dropdown-menu .active a,
-.nav .dropdown-menu .active a {
-  color: #ffffff;
-}
-.topbar div > ul .menu-dropdown .divider,
-.nav .menu-dropdown .divider,
-.topbar div > ul .dropdown-menu .divider,
-.nav .dropdown-menu .divider {
-  background-color: #222;
-  border-color: #444;
-}
-.topbar ul .menu-dropdown li a, .topbar ul .dropdown-menu li a {
-  padding: 4px 15px;
-}
-li.menu, .dropdown {
-  position: relative;
-}
-a.menu:after, .dropdown-toggle:after {
-  width: 0;
-  height: 0;
-  display: inline-block;
-  content: "&darr;";
-  text-indent: -99999px;
-  vertical-align: top;
-  margin-top: 8px;
-  margin-left: 4px;
-  border-left: 4px solid transparent;
-  border-right: 4px solid transparent;
-  border-top: 4px solid #ffffff;
-  filter: alpha(opacity=50);
-  -khtml-opacity: 0.5;
-  -moz-opacity: 0.5;
-  opacity: 0.5;
-}
-.menu-dropdown, .dropdown-menu {
-  background-color: #ffffff;
-  float: left;
-  display: none;
-  position: absolute;
-  top: 40px;
-  z-index: 900;
-  min-width: 160px;
-  max-width: 220px;
-  _width: 160px;
-  margin-left: 0;
-  margin-right: 0;
-  padding: 6px 0;
-  zoom: 1;
-  border-color: #999;
-  border-color: rgba(0, 0, 0, 0.2);
-  border-style: solid;
-  border-width: 0 1px 1px;
-  -webkit-border-radius: 0 0 6px 6px;
-  -moz-border-radius: 0 0 6px 6px;
-  border-radius: 0 0 6px 6px;
-  -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
-  -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
-  -webkit-background-clip: padding-box;
-  -moz-background-clip: padding-box;
-  background-clip: padding-box;
-}
-.menu-dropdown li, .dropdown-menu li {
-  float: none;
-  display: block;
-  background-color: none;
-}
-.menu-dropdown .divider, .dropdown-menu .divider {
-  height: 1px;
-  margin: 5px 0;
-  overflow: hidden;
-  background-color: #eee;
-  border-bottom: 1px solid #ffffff;
-}
-.topbar .dropdown-menu a, .dropdown-menu a {
-  display: block;
-  padding: 4px 15px;
-  clear: both;
-  font-weight: normal;
-  line-height: 18px;
-  color: #808080;
-  text-shadow: 0 1px 0 #ffffff;
-}
-.topbar .dropdown-menu a:hover,
-.dropdown-menu a:hover,
-.topbar .dropdown-menu a.hover,
-.dropdown-menu a.hover {
-  background-color: #dddddd;
-  background-repeat: repeat-x;
-  background-image: -khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd));
-  background-image: -moz-linear-gradient(top, #eeeeee, #dddddd);
-  background-image: -ms-linear-gradient(top, #eeeeee, #dddddd);
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd));
-  background-image: -webkit-linear-gradient(top, #eeeeee, #dddddd);
-  background-image: -o-linear-gradient(top, #eeeeee, #dddddd);
-  background-image: linear-gradient(top, #eeeeee, #dddddd);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);
-  color: #404040;
-  text-decoration: none;
-  -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025);
-  -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025);
-  box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025);
-}
-.open .menu,
-.dropdown.open .menu,
-.open .dropdown-toggle,
-.dropdown.open .dropdown-toggle {
-  color: #ffffff;
-  background: #ccc;
-  background: rgba(0, 0, 0, 0.3);
-}
-.open .menu-dropdown,
-.dropdown.open .menu-dropdown,
-.open .dropdown-menu,
-.dropdown.open .dropdown-menu {
-  display: block;
-}
-.tabs, .pills {
-  margin: 0 0 18px;
-  padding: 0;
-  list-style: none;
-  zoom: 1;
-}
-.tabs:before,
-.pills:before,
-.tabs:after,
-.pills:after {
-  display: table;
-  content: "";
-  zoom: 1;
-}
-.tabs:after, .pills:after {
-  clear: both;
-}
-.tabs > li, .pills > li {
-  float: left;
-}
-.tabs > li > a, .pills > li > a {
-  display: block;
-}
-.tabs {
-  border-color: #ddd;
-  border-style: solid;
-  border-width: 0 0 1px;
-}
-.tabs > li {
-  position: relative;
-  margin-bottom: -1px;
-}
-.tabs > li > a {
-  padding: 0 15px;
-  margin-right: 2px;
-  line-height: 34px;
-  border: 1px solid transparent;
-  -webkit-border-radius: 4px 4px 0 0;
-  -moz-border-radius: 4px 4px 0 0;
-  border-radius: 4px 4px 0 0;
-}
-.tabs > li > a:hover {
-  text-decoration: none;
-  background-color: #eee;
-  border-color: #eee #eee #ddd;
-}
-.tabs .active > a, .tabs .active > a:hover {
-  color: #808080;
-  background-color: #ffffff;
-  border: 1px solid #ddd;
-  border-bottom-color: transparent;
-  cursor: default;
-}
-.tabs .menu-dropdown, .tabs .dropdown-menu {
-  top: 35px;
-  border-width: 1px;
-  -webkit-border-radius: 0 6px 6px 6px;
-  -moz-border-radius: 0 6px 6px 6px;
-  border-radius: 0 6px 6px 6px;
-}
-.tabs a.menu:after, .tabs .dropdown-toggle:after {
-  border-top-color: #999;
-  margin-top: 15px;
-  margin-left: 5px;
-}
-.tabs li.open.menu .menu, .tabs .open.dropdown .dropdown-toggle {
-  border-color: #999;
-}
-.tabs li.open a.menu:after, .tabs .dropdown.open .dropdown-toggle:after {
-  border-top-color: #555;
-}
-.pills a {
-  margin: 5px 3px 5px 0;
-  padding: 0 15px;
-  line-height: 30px;
-  text-shadow: 0 1px 1px #ffffff;
-  -webkit-border-radius: 15px;
-  -moz-border-radius: 15px;
-  border-radius: 15px;
-}
-.pills a:hover {
-  color: #ffffff;
-  text-decoration: none;
-  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25);
-  background-color: #00438a;
-}
-.pills .active a {
-  color: #ffffff;
-  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25);
-  background-color: #0069d6;
-}
-.pills-vertical > li {
-  float: none;
-}
-.tab-content > .tab-pane,
-.pill-content > .pill-pane,
-.tab-content > div,
-.pill-content > div {
-  display: none;
-}
-.tab-content > .active, .pill-content > .active {
-  display: block;
-}
-.breadcrumb {
-  padding: 7px 14px;
-  margin: 0 0 18px;
-  background-color: #f5f5f5;
-  background-repeat: repeat-x;
-  background-image: -khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5));
-  background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
-  background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5));
-  background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
-  background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
-  background-image: linear-gradient(top, #ffffff, #f5f5f5);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);
-  border: 1px solid #ddd;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-  -webkit-box-shadow: inset 0 1px 0 #ffffff;
-  -moz-box-shadow: inset 0 1px 0 #ffffff;
-  box-shadow: inset 0 1px 0 #ffffff;
-}
-.breadcrumb li {
-  display: inline;
-  text-shadow: 0 1px 0 #ffffff;
-}
-.breadcrumb .divider {
-  padding: 0 5px;
-  color: #bfbfbf;
-}
-.breadcrumb .active a {
-  color: #404040;
-}
-.hero-unit {
-  background-color: #f5f5f5;
-  margin-bottom: 30px;
-  padding: 60px;
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-}
-.hero-unit h1 {
-  margin-bottom: 0;
-  font-size: 60px;
-  line-height: 1;
-  letter-spacing: -1px;
-}
-.hero-unit p {
-  font-size: 18px;
-  font-weight: 200;
-  line-height: 27px;
-}
-footer {
-  margin-top: 17px;
-  padding-top: 17px;
-  border-top: 1px solid #eee;
-}
-.page-header {
-  margin-bottom: 17px;
-  border-bottom: 1px solid #ddd;
-  -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-.page-header h1 {
-  margin-bottom: 8px;
-}
-.btn.danger,
-.alert-message.danger,
-.btn.danger:hover,
-.alert-message.danger:hover,
-.btn.error,
-.alert-message.error,
-.btn.error:hover,
-.alert-message.error:hover,
-.btn.success,
-.alert-message.success,
-.btn.success:hover,
-.alert-message.success:hover,
-.btn.info,
-.alert-message.info,
-.btn.info:hover,
-.alert-message.info:hover {
-  color: #ffffff;
-}
-.btn .close, .alert-message .close {
-  font-family: Arial, sans-serif;
-  line-height: 18px;
-}
-.btn.danger,
-.alert-message.danger,
-.btn.error,
-.alert-message.error {
-  background-color: #c43c35;
-  background-repeat: repeat-x;
-  background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
-  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: linear-gradient(top, #ee5f5b, #c43c35);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  border-color: #c43c35 #c43c35 #882a25;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-}
-.btn.success, .alert-message.success {
-  background-color: #57a957;
-  background-repeat: repeat-x;
-  background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
-  background-image: -moz-linear-gradient(top, #62c462, #57a957);
-  background-image: -ms-linear-gradient(top, #62c462, #57a957);
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
-  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
-  background-image: -o-linear-gradient(top, #62c462, #57a957);
-  background-image: linear-gradient(top, #62c462, #57a957);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  border-color: #57a957 #57a957 #3d773d;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-}
-.btn.info, .alert-message.info {
-  background-color: #339bb9;
-  background-repeat: repeat-x;
-  background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
-  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: linear-gradient(top, #5bc0de, #339bb9);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  border-color: #339bb9 #339bb9 #22697d;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-}
-.btn {
-  cursor: pointer;
-  display: inline-block;
-  background-color: #e6e6e6;
-  background-repeat: no-repeat;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-  background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-  background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-  background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-  background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-  background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
-  padding: 5px 14px 6px;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-  color: #333;
-  font-size: 13px;
-  line-height: normal;
-  border: 1px solid #ccc;
-  border-bottom-color: #bbb;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-  -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-  -webkit-transition: 0.1s linear all;
-  -moz-transition: 0.1s linear all;
-  -ms-transition: 0.1s linear all;
-  -o-transition: 0.1s linear all;
-  transition: 0.1s linear all;
-}
-.btn:hover {
-  background-position: 0 -15px;
-  color: #333;
-  text-decoration: none;
-}
-.btn:focus {
-  outline: 1px dotted #666;
-}
-.btn.primary {
-  color: #ffffff;
-  background-color: #0064cd;
-  background-repeat: repeat-x;
-  background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));
-  background-image: -moz-linear-gradient(top, #049cdb, #0064cd);
-  background-image: -ms-linear-gradient(top, #049cdb, #0064cd);
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));
-  background-image: -webkit-linear-gradient(top, #049cdb, #0064cd);
-  background-image: -o-linear-gradient(top, #049cdb, #0064cd);
-  background-image: linear-gradient(top, #049cdb, #0064cd);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  border-color: #0064cd #0064cd #003f81;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-}
-.btn.active, .btn:active {
-  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
-  -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
-  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-.btn.disabled {
-  cursor: default;
-  background-image: none;
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  filter: alpha(opacity=65);
-  -khtml-opacity: 0.65;
-  -moz-opacity: 0.65;
-  opacity: 0.65;
-  -webkit-box-shadow: none;
-  -moz-box-shadow: none;
-  box-shadow: none;
-}
-.btn[disabled] {
-  cursor: default;
-  background-image: none;
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  filter: alpha(opacity=65);
-  -khtml-opacity: 0.65;
-  -moz-opacity: 0.65;
-  opacity: 0.65;
-  -webkit-box-shadow: none;
-  -moz-box-shadow: none;
-  box-shadow: none;
-}
-.btn.large {
-  font-size: 15px;
-  line-height: normal;
-  padding: 9px 14px 9px;
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-}
-.btn.small {
-  padding: 7px 9px 7px;
-  font-size: 11px;
-}
-:root .alert-message, :root .btn {
-  border-radius: 0 \0;
-}
-button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-.close {
-  float: right;
-  color: #000000;
-  font-size: 20px;
-  font-weight: bold;
-  line-height: 13.5px;
-  text-shadow: 0 1px 0 #ffffff;
-  filter: alpha(opacity=25);
-  -khtml-opacity: 0.25;
-  -moz-opacity: 0.25;
-  opacity: 0.25;
-}
-.close:hover {
-  color: #000000;
-  text-decoration: none;
-  filter: alpha(opacity=40);
-  -khtml-opacity: 0.4;
-  -moz-opacity: 0.4;
-  opacity: 0.4;
-}
-.alert-message {
-  position: relative;
-  padding: 7px 15px;
-  margin-bottom: 18px;
-  color: #404040;
-  background-color: #eedc94;
-  background-repeat: repeat-x;
-  background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));
-  background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
-  background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));
-  background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
-  background-image: -o-linear-gradient(top, #fceec1, #eedc94);
-  background-image: linear-gradient(top, #fceec1, #eedc94);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  border-color: #eedc94 #eedc94 #e4c652;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  border-width: 1px;
-  border-style: solid;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
-  -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
-  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
-}
-.alert-message .close {
-  margin-top: 1px;
-  *margin-top: 0;
-}
-.alert-message a {
-  font-weight: bold;
-  color: #404040;
-}
-.alert-message.danger p a,
-.alert-message.error p a,
-.alert-message.success p a,
-.alert-message.info p a {
-  color: #ffffff;
-}
-.alert-message h5 {
-  line-height: 18px;
-}
-.alert-message p {
-  margin-bottom: 0;
-}
-.alert-message div {
-  margin-top: 5px;
-  margin-bottom: 2px;
-  line-height: 28px;
-}
-.alert-message .btn {
-  -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
-  -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
-  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
-}
-.alert-message.block-message {
-  background-image: none;
-  background-color: #fdf5d9;
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  padding: 14px;
-  border-color: #fceec1;
-  -webkit-box-shadow: none;
-  -moz-box-shadow: none;
-  box-shadow: none;
-}
-.alert-message.block-message ul, .alert-message.block-message p {
-  margin-right: 30px;
-}
-.alert-message.block-message ul {
-  margin-bottom: 0;
-}
-.alert-message.block-message li {
-  color: #404040;
-}
-.alert-message.block-message .alert-actions {
-  margin-top: 5px;
-}
-.alert-message.block-message.error, .alert-message.block-message.success, .alert-message.block-message.info {
-  color: #404040;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-.alert-message.block-message.error {
-  background-color: #fddfde;
-  border-color: #fbc7c6;
-}
-.alert-message.block-message.success {
-  background-color: #d1eed1;
-  border-color: #bfe7bf;
-}
-.alert-message.block-message.info {
-  background-color: #ddf4fb;
-  border-color: #c6edf9;
-}
-.alert-message.block-message.danger p a,
-.alert-message.block-message.error p a,
-.alert-message.block-message.success p a,
-.alert-message.block-message.info p a {
-  color: #404040;
-}
-.pagination {
-  height: 36px;
-  margin: 18px 0;
-}
-.pagination ul {
-  float: left;
-  margin: 0;
-  border: 1px solid #ddd;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-.pagination li {
-  display: inline;
-}
-.pagination a {
-  float: left;
-  padding: 0 14px;
-  line-height: 34px;
-  border-right: 1px solid;
-  border-right-color: #ddd;
-  border-right-color: rgba(0, 0, 0, 0.15);
-  *border-right-color: #ddd;
-  /* IE6-7 */
-
-  text-decoration: none;
-}
-.pagination a:hover, .pagination .active a {
-  background-color: #c7eefe;
-}
-.pagination .disabled a, .pagination .disabled a:hover {
-  background-color: transparent;
-  color: #bfbfbf;
-}
-.pagination .next a {
-  border: 0;
-}
-.well {
-  background-color: #f5f5f5;
-  margin-bottom: 20px;
-  padding: 19px;
-  min-height: 20px;
-  border: 1px solid #eee;
-  border: 1px solid rgba(0, 0, 0, 0.05);
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-.well blockquote {
-  border-color: #ddd;
-  border-color: rgba(0, 0, 0, 0.15);
-}
-.modal-backdrop {
-  background-color: #000000;
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  z-index: 10000;
-}
-.modal-backdrop.fade {
-  opacity: 0;
-}
-.modal-backdrop, .modal-backdrop.fade.in {
-  filter: alpha(opacity=80);
-  -khtml-opacity: 0.8;
-  -moz-opacity: 0.8;
-  opacity: 0.8;
-}
-.modal {
-  position: fixed;
-  top: 50%;
-  left: 50%;
-  z-index: 11000;
-  width: 560px;
-  margin: -250px 0 0 -280px;
-  background-color: #ffffff;
-  border: 1px solid #999;
-  border: 1px solid rgba(0, 0, 0, 0.3);
-  *border: 1px solid #999;
-  /* IE6-7 */
-
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -webkit-background-clip: padding-box;
-  -moz-background-clip: padding-box;
-  background-clip: padding-box;
-}
-.modal .close {
-  margin-top: 7px;
-}
-.modal.fade {
-  -webkit-transition: opacity .3s linear, top .3s ease-out;
-  -moz-transition: opacity .3s linear, top .3s ease-out;
-  -ms-transition: opacity .3s linear, top .3s ease-out;
-  -o-transition: opacity .3s linear, top .3s ease-out;
-  transition: opacity .3s linear, top .3s ease-out;
-  top: -25%;
-}
-.modal.fade.in {
-  top: 50%;
-}
-.modal-header {
-  border-bottom: 1px solid #eee;
-  padding: 5px 15px;
-}
-.modal-body {
-  padding: 15px;
-}
-.modal-body form {
-  margin-bottom: 0;
-}
-.modal-footer {
-  background-color: #f5f5f5;
-  padding: 14px 15px 15px;
-  border-top: 1px solid #ddd;
-  -webkit-border-radius: 0 0 6px 6px;
-  -moz-border-radius: 0 0 6px 6px;
-  border-radius: 0 0 6px 6px;
-  -webkit-box-shadow: inset 0 1px 0 #ffffff;
-  -moz-box-shadow: inset 0 1px 0 #ffffff;
-  box-shadow: inset 0 1px 0 #ffffff;
-  zoom: 1;
-  margin-bottom: 0;
-}
-.modal-footer:before, .modal-footer:after {
-  display: table;
-  content: "";
-  zoom: 1;
-}
-.modal-footer:after {
-  clear: both;
-}
-.modal-footer .btn {
-  float: right;
-  margin-left: 5px;
-}
-.modal .popover, .modal .twipsy {
-  z-index: 12000;
-}
-.twipsy {
-  display: block;
-  position: absolute;
-  visibility: visible;
-  padding: 5px;
-  font-size: 11px;
-  z-index: 1000;
-  filter: alpha(opacity=80);
-  -khtml-opacity: 0.8;
-  -moz-opacity: 0.8;
-  opacity: 0.8;
-}
-.twipsy.fade.in {
-  filter: alpha(opacity=80);
-  -khtml-opacity: 0.8;
-  -moz-opacity: 0.8;
-  opacity: 0.8;
-}
-.twipsy.above .twipsy-arrow {
-  bottom: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-left: 5px solid transparent;
-  border-right: 5px solid transparent;
-  border-top: 5px solid #000000;
-}
-.twipsy.left .twipsy-arrow {
-  top: 50%;
-  right: 0;
-  margin-top: -5px;
-  border-top: 5px solid transparent;
-  border-bottom: 5px solid transparent;
-  border-left: 5px solid #000000;
-}
-.twipsy.below .twipsy-arrow {
-  top: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-left: 5px solid transparent;
-  border-right: 5px solid transparent;
-  border-bottom: 5px solid #000000;
-}
-.twipsy.right .twipsy-arrow {
-  top: 50%;
-  left: 0;
-  margin-top: -5px;
-  border-top: 5px solid transparent;
-  border-bottom: 5px solid transparent;
-  border-right: 5px solid #000000;
-}
-.twipsy-inner {
-  padding: 3px 8px;
-  background-color: #000000;
-  color: white;
-  text-align: center;
-  max-width: 200px;
-  text-decoration: none;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.twipsy-arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-}
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 1000;
-  padding: 5px;
-  display: none;
-}
-.popover.above .arrow {
-  bottom: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-left: 5px solid transparent;
-  border-right: 5px solid transparent;
-  border-top: 5px solid #000000;
-}
-.popover.right .arrow {
-  top: 50%;
-  left: 0;
-  margin-top: -5px;
-  border-top: 5px solid transparent;
-  border-bottom: 5px solid transparent;
-  border-right: 5px solid #000000;
-}
-.popover.below .arrow {
-  top: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-left: 5px solid transparent;
-  border-right: 5px solid transparent;
-  border-bottom: 5px solid #000000;
-}
-.popover.left .arrow {
-  top: 50%;
-  right: 0;
-  margin-top: -5px;
-  border-top: 5px solid transparent;
-  border-bottom: 5px solid transparent;
-  border-left: 5px solid #000000;
-}
-.popover .arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-}
-.popover .inner {
-  background: #000000;
-  background: rgba(0, 0, 0, 0.8);
-  padding: 3px;
-  overflow: hidden;
-  width: 280px;
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-}
-.popover .title {
-  background-color: #f5f5f5;
-  padding: 9px 15px;
-  line-height: 1;
-  -webkit-border-radius: 3px 3px 0 0;
-  -moz-border-radius: 3px 3px 0 0;
-  border-radius: 3px 3px 0 0;
-  border-bottom: 1px solid #eee;
-}
-.popover .content {
-  background-color: #ffffff;
-  padding: 14px;
-  -webkit-border-radius: 0 0 3px 3px;
-  -moz-border-radius: 0 0 3px 3px;
-  border-radius: 0 0 3px 3px;
-  -webkit-background-clip: padding-box;
-  -moz-background-clip: padding-box;
-  background-clip: padding-box;
-}
-.popover .content p, .popover .content ul, .popover .content ol {
-  margin-bottom: 0;
-}
-.fade {
-  -webkit-transition: opacity 0.15s linear;
-  -moz-transition: opacity 0.15s linear;
-  -ms-transition: opacity 0.15s linear;
-  -o-transition: opacity 0.15s linear;
-  transition: opacity 0.15s linear;
-  opacity: 0;
-}
-.fade.in {
-  opacity: 1;
-}
-.label {
-  padding: 1px 3px 2px;
-  font-size: 9.75px;
-  font-weight: bold;
-  color: #ffffff;
-  text-transform: uppercase;
-  white-space: nowrap;
-  background-color: #bfbfbf;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-}
-.label.important {
-  background-color: #c43c35;
-}
-.label.warning {
-  background-color: #f89406;
-}
-.label.success {
-  background-color: #46a546;
-}
-.label.notice {
-  background-color: #62cffc;
-}
-.media-grid {
-  margin-left: -20px;
-  margin-bottom: 0;
-  zoom: 1;
-}
-.media-grid:before, .media-grid:after {
-  display: table;
-  content: "";
-  zoom: 1;
-}
-.media-grid:after {
-  clear: both;
-}
-.media-grid li {
-  display: inline;
-}
-.media-grid a {
-  float: left;
-  padding: 4px;
-  margin: 0 0 18px 20px;
-  border: 1px solid #ddd;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
-  -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.media-grid a img {
-  display: block;
-}
-.media-grid a:hover {
-  border-color: #0069d6;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/bootstrap-dropdown-1.4.0.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/bootstrap-dropdown-1.4.0.js	(revision 11253)
+++ 	(revision )
@@ -1,55 +1,0 @@
-/* ============================================================
- * bootstrap-dropdown.js v1.4.0
- * http://twitter.github.com/bootstrap/javascript.html#dropdown
- * ============================================================
- * Copyright 2011 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function( $ ){
-
-  "use strict"
-
-  /* DROPDOWN PLUGIN DEFINITION
-   * ========================== */
-
-  $.fn.dropdown = function ( selector ) {
-    return this.each(function () {
-      $(this).delegate(selector || d, 'click', function (e) {
-        var li = $(this).parent('li')
-          , isActive = li.hasClass('open')
-
-        clearMenus()
-        !isActive && li.toggleClass('open')
-        return false
-      })
-    })
-  }
-
-  /* APPLY TO STANDARD DROPDOWN ELEMENTS
-   * =================================== */
-
-  var d = 'a.menu, .dropdown-toggle'
-
-  function clearMenus() {
-    $(d).parent('li').removeClass('open')
-  }
-
-  $(function () {
-    $('html').bind("click", clearMenus)
-    $('body').dropdown( '[data-dropdown] a.menu, [data-dropdown] .dropdown-toggle' )
-  })
-
-}( window.jQuery || window.ender );
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/bootstrap-tabs-1.4.0.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/bootstrap-tabs-1.4.0.js	(revision 11253)
+++ 	(revision )
@@ -1,80 +1,0 @@
-/* ========================================================
- * bootstrap-tabs.js v1.4.0
- * http://twitter.github.com/bootstrap/javascript.html#tabs
- * ========================================================
- * Copyright 2011 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================== */
-
-
-!function( $ ){
-
-  "use strict"
-
-  function activate ( element, container ) {
-    container
-      .find('> .active')
-      .removeClass('active')
-      .find('> .dropdown-menu > .active')
-      .removeClass('active')
-
-    element.addClass('active')
-
-    if ( element.parent('.dropdown-menu') ) {
-      element.closest('li.dropdown').addClass('active')
-    }
-  }
-
-  function tab( e ) {
-    var $this = $(this)
-      , $ul = $this.closest('ul:not(.dropdown-menu)')
-      , href = $this.attr('href')
-      , previous
-      , $href
-
-    if ( /^#\w+/.test(href) ) {
-      e.preventDefault()
-
-      if ( $this.parent('li').hasClass('active') ) {
-        return
-      }
-
-      previous = $ul.find('.active a').last()[0]
-      $href = $(href)
-
-      activate($this.parent('li'), $ul)
-      activate($href, $href.parent())
-
-      $this.trigger({
-        type: 'change'
-      , relatedTarget: previous
-      })
-    }
-  }
-
-
- /* TABS/PILLS PLUGIN DEFINITION
-  * ============================ */
-
-  $.fn.tabs = $.fn.pills = function ( selector ) {
-    return this.each(function () {
-      $(this).delegate(selector || '.tabs li > a, .pills > li > a', 'click', tab)
-    })
-  }
-
-  $(document).ready(function () {
-    $('body').tabs('ul[data-tabs] li > a, ul[data-pills] > li > a')
-  })
-
-}( window.jQuery || window.ender );
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/datatable.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/datatable.js	(revision 11253)
+++ 	(revision )
@@ -1,20 +1,0 @@
-$(document).ready(function(){
-  $('.dataTable').dataTable();
-
-	$('.dataTableFiles').dataTable( {
-		"aaSorting": [[ 2, "desc" ]],
-	} );
-
-	$('.dataTableManage').dataTable( {
-		"aaSorting": [[ 1, "asc" ]],
-		"aoColumnDefs":[{ "bSortable": false, "aTargets": [ 0 ] }]
-	} );
-
-	$('.dataTableManageFiles').dataTable( {
-		"aaSorting": [[ 3, "desc" ]],
-		"aoColumnDefs":[{ "bSortable": false, "aTargets": [ 0 ] }]
-	} );
-
-
-});
-
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/datatables.css
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/datatables.css	(revision 11253)
+++ 	(revision )
@@ -1,521 +1,0 @@
-/*
- *  File:         demo_table_jui.css
- *  CVS:          $Id$
- *  Description:  CSS descriptions for DataTables demo pages
- *  Author:       Allan Jardine
- *  Created:      Tue May 12 06:47:22 BST 2009
- *  Modified:     $Date$ by $Author$
- *  Language:     CSS
- *  Project:      DataTables
- *
- *  Copyright 2009 Allan Jardine. All Rights Reserved.
- *
- * ***************************************************************************
- * DESCRIPTION
- *
- * The styles given here are suitable for the demos that are used with the standard DataTables
- * distribution (see www.datatables.net). You will most likely wish to modify these styles to
- * meet the layout requirements of your site.
- *
- * Common issues:
- *   'full_numbers' pagination - I use an extra selector on the body tag to ensure that there is
- *     no conflict between the two pagination types. If you want to use full_numbers pagination
- *     ensure that you either have "example_alt_pagination" as a body class name, or better yet,
- *     modify that selector.
- *   Note that the path used for Images is relative. All images are by default located in
- *     ../images/ - relative to this CSS file.
- */
-
-
-/*
- * jQuery UI specific styling
- */
-
-.paging_two_button .ui-button {
-	float: left;
-	cursor: pointer;
-	* cursor: hand;
-}
-
-.paging_full_numbers .ui-button {
-	padding: 2px 6px;
-	margin: 0;
-	cursor: pointer;
-	* cursor: hand;
-}
-
-.dataTables_paginate .ui-button {
-	margin-right: -0.1em !important;
-}
-
-.paging_full_numbers {
-	width: 350px !important;
-}
-
-.dataTables_wrapper .ui-toolbar {
-	padding: 5px;
-}
-
-.dataTables_paginate {
-	width: auto;
-}
-
-.dataTables_info {
-	padding-top: 3px;
-}
-
-table.display thead th {
-	padding: 3px 0px 3px 10px;
-	cursor: pointer;
-	* cursor: hand;
-}
-
-div.dataTables_wrapper .ui-widget-header {
-	font-weight: normal;
-}
-
-
-/*
- * Sort arrow icon positioning
- */
-table.display thead th div.DataTables_sort_wrapper {
-	position: relative;
-	padding-right: 20px;
-	padding-right: 20px;
-}
-
-table.display thead th div.DataTables_sort_wrapper span {
-	position: absolute;
-	top: 50%;
-	margin-top: -8px;
-	right: 0;
-}
-
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * Everything below this line is the same as demo_table.css. This file is
- * required for 'cleanliness' of the markup
- *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * DataTables features
- */
-
-.dataTables_wrapper {
-	position: relative;
-	min-height: 302px;
-	_height: 302px;
-	clear: both;
-}
-
-.dataTables_processing {
-	position: absolute;
-	top: 0px;
-	left: 50%;
-	width: 250px;
-	margin-left: -125px;
-	border: 1px solid #ddd;
-	text-align: center;
-	color: #999;
-	font-size: 11px;
-	padding: 2px 0;
-}
-
-.dataTables_length {
-	width: 40%;
-	float: left;
-}
-
-.dataTables_filter {
-	width: 50%;
-	float: right;
-	text-align: right;
-}
-
-.dataTables_info {
-	width: 50%;
-	float: left;
-}
-
-.dataTables_paginate {
-	float: right;
-	text-align: right;
-}
-
-/* Pagination nested */
-.paginate_disabled_previous, .paginate_enabled_previous, .paginate_disabled_next, .paginate_enabled_next {
-	height: 19px;
-	width: 19px;
-	margin-left: 3px;
-	float: left;
-}
-
-.paginate_disabled_previous {
-	background-image: url('back_disabled.jpg');
-}
-
-.paginate_enabled_previous {
-	background-image: url('back_enabled.jpg');
-}
-
-.paginate_disabled_next {
-	background-image: url('forward_disabled.jpg');
-}
-
-.paginate_enabled_next {
-	background-image: url('forward_enabled.jpg');
-}
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * DataTables display
- */
-table.display {
-	margin: 0 auto;
-	width: 100%;
-	clear: both;
-	border-collapse: collapse;
-}
-
-table.display tfoot th {
-	padding: 3px 0px 3px 10px;
-	font-weight: bold;
-	font-weight: normal;
-}
-
-table.display tr.heading2 td {
-	border-bottom: 1px solid #aaa;
-}
-
-table.display td {
-	padding: 3px 10px;
-}
-
-table.display td.center {
-	text-align: center;
-}
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * DataTables sorting
- */
-
-.sorting_asc {
-	background: url('sort_asc.png') no-repeat center right;
-}
-
-.sorting_desc {
-	background: url('sort_desc.png') no-repeat center right;
-}
-
-.sorting {
-	background: url('sort_both.png') no-repeat center right;
-}
-
-.sorting_asc_disabled {
-	background: url('sort_asc_disabled.png') no-repeat center right;
-}
-
-.sorting_desc_disabled {
-	background: url('sort_desc_disabled.png') no-repeat center right;
-}
-
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * DataTables row classes
- */
-table.display tr.odd.gradeA {
-	background-color: #ddffdd;
-}
-
-table.display tr.even.gradeA {
-	background-color: #eeffee;
-}
-
-
-
-
-table.display tr.odd.gradeA {
-	background-color: #ddffdd;
-}
-
-table.display tr.even.gradeA {
-	background-color: #eeffee;
-}
-
-table.display tr.odd.gradeC {
-	background-color: #ddddff;
-}
-
-table.display tr.even.gradeC {
-	background-color: #eeeeff;
-}
-
-table.display tr.odd.gradeX {
-	background-color: #ffdddd;
-}
-
-table.display tr.even.gradeX {
-	background-color: #ffeeee;
-}
-
-table.display tr.odd.gradeU {
-	background-color: #ddd;
-}
-
-table.display tr.even.gradeU {
-	background-color: #eee;
-}
-
-
-tr.odd {
-	background-color: #E2E4FF;
-}
-
-tr.even {
-	background-color: white;
-}
-
-
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Misc
- */
-.dataTables_scroll {
-	clear: both;
-}
-
-.top, .bottom {
-	padding: 15px;
-	background-color: #F5F5F5;
-	border: 1px solid #CCCCCC;
-}
-
-.top .dataTables_info {
-	float: none;
-}
-
-.clear {
-	clear: both;
-}
-
-.dataTables_empty {
-	text-align: center;
-}
-
-tfoot input {
-	margin: 0.5em 0;
-	width: 100%;
-	color: #444;
-}
-
-tfoot input.search_init {
-	color: #999;
-}
-
-td.group {
-	background-color: #d1cfd0;
-	border-bottom: 2px solid #A19B9E;
-	border-top: 2px solid #A19B9E;
-}
-
-td.details {
-	background-color: #d1cfd0;
-	border: 2px solid #A19B9E;
-}
-
-
-.example_alt_pagination div.dataTables_info {
-	width: 40%;
-}
-
-.paging_full_numbers span.paginate_button,
- 	.paging_full_numbers span.paginate_active {
-	border: 1px solid #aaa;
-	-webkit-border-radius: 5px;
-	-moz-border-radius: 5px;
-	padding: 2px 5px;
-	margin: 0 3px;
-	cursor: pointer;
-	*cursor: hand;
-}
-
-.paging_full_numbers span.paginate_button {
-	background-color: #ddd;
-}
-
-.paging_full_numbers span.paginate_button:hover {
-	background-color: #ccc;
-}
-
-.paging_full_numbers span.paginate_active {
-	background-color: #99B3FF;
-}
-
-table.display tr.even.row_selected td {
-	background-color: #B0BED9;
-}
-
-table.display tr.odd.row_selected td {
-	background-color: #9FAFD1;
-}
-
-
-/*
- * Sorting classes for columns
- */
-/* For the standard odd/even */
-tr.odd td.sorting_1 {
-	background-color: #D3D6FF;
-}
-
-tr.odd td.sorting_2 {
-	background-color: #DADCFF;
-}
-
-tr.odd td.sorting_3 {
-	background-color: #E0E2FF;
-}
-
-tr.even td.sorting_1 {
-	background-color: #EAEBFF;
-}
-
-tr.even td.sorting_2 {
-	background-color: #F2F3FF;
-}
-
-tr.even td.sorting_3 {
-	background-color: #F9F9FF;
-}
-
-
-/* For the Conditional-CSS grading rows */
-/*
- 	Colour calculations (based off the main row colours)
-  Level 1:
-		dd > c4
-		ee > d5
-	Level 2:
-	  dd > d1
-	  ee > e2
- */
-tr.odd.gradeA td.sorting_1 {
-	background-color: #c4ffc4;
-}
-
-tr.odd.gradeA td.sorting_2 {
-	background-color: #d1ffd1;
-}
-
-tr.odd.gradeA td.sorting_3 {
-	background-color: #d1ffd1;
-}
-
-tr.even.gradeA td.sorting_1 {
-	background-color: #d5ffd5;
-}
-
-tr.even.gradeA td.sorting_2 {
-	background-color: #e2ffe2;
-}
-
-tr.even.gradeA td.sorting_3 {
-	background-color: #e2ffe2;
-}
-
-tr.odd.gradeC td.sorting_1 {
-	background-color: #c4c4ff;
-}
-
-tr.odd.gradeC td.sorting_2 {
-	background-color: #d1d1ff;
-}
-
-tr.odd.gradeC td.sorting_3 {
-	background-color: #d1d1ff;
-}
-
-tr.even.gradeC td.sorting_1 {
-	background-color: #d5d5ff;
-}
-
-tr.even.gradeC td.sorting_2 {
-	background-color: #e2e2ff;
-}
-
-tr.even.gradeC td.sorting_3 {
-	background-color: #e2e2ff;
-}
-
-tr.odd.gradeX td.sorting_1 {
-	background-color: #ffc4c4;
-}
-
-tr.odd.gradeX td.sorting_2 {
-	background-color: #ffd1d1;
-}
-
-tr.odd.gradeX td.sorting_3 {
-	background-color: #ffd1d1;
-}
-
-tr.even.gradeX td.sorting_1 {
-	background-color: #ffd5d5;
-}
-
-tr.even.gradeX td.sorting_2 {
-	background-color: #ffe2e2;
-}
-
-tr.even.gradeX td.sorting_3 {
-	background-color: #ffe2e2;
-}
-
-tr.odd.gradeU td.sorting_1 {
-	background-color: #c4c4c4;
-}
-
-tr.odd.gradeU td.sorting_2 {
-	background-color: #d1d1d1;
-}
-
-tr.odd.gradeU td.sorting_3 {
-	background-color: #d1d1d1;
-}
-
-tr.even.gradeU td.sorting_1 {
-	background-color: #d5d5d5;
-}
-
-tr.even.gradeU td.sorting_2 {
-	background-color: #e2e2e2;
-}
-
-tr.even.gradeU td.sorting_3 {
-	background-color: #e2e2e2;
-}
-
-
-/*
- * Row highlighting example
- */
-.ex_highlight #example tbody tr.even:hover, #example tbody tr.even td.highlighted {
-	background-color: #ECFFB3;
-}
-
-.ex_highlight #example tbody tr.odd:hover, #example tbody tr.odd td.highlighted {
-	background-color: #E6FF99;
-}
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/datepicker.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/datepicker.js	(revision 11253)
+++ 	(revision )
@@ -1,55 +1,0 @@
-$(function() {
-  $( ".datepicker" ).datepicker({ dateFormat: 'yy-mm-dd',
-                                  duration: 'fast'
-  });
-});
-
-$(function() {
-  $( ".datepicker-le" ).datepicker({dateFormat: 'dd/mm/yy',
-	duration: 'fast'
-	});
-  });
-
-$(function() {
-  $( ".datepicker-de" ).datepicker({dateFormat: 'dd.mm.yy',
-	duration: 'fast'
-	});
-  });
-
-$(function() {
-  $( ".datepicker-us" ).datepicker({dateFormat: 'mm/dd/yy',
-	duration: 'fast'
-	});
-  });
-
-$(function() {
-  $( ".datepicker-year" ).datepicker({ dateFormat: 'yy-mm-dd',
-	duration: 'fast',
-	changeYear: true,
-	yearRange: '1900:2020'
-	});
-});
-
-$(function() {
-  $( ".datepicker-le-year" ).datepicker({dateFormat: 'dd/mm/yy',
-	duration: 'fast',
-	changeYear: true,
-	yearRange: '1900:2020'
-	});
-  });
-
-$(function() {
-  $( ".datepicker-de-year" ).datepicker({dateFormat: 'dd.mm.yy',
-	duration: 'fast',
-	changeYear: true,
-	yearRange: '1900:2020'
-	});
-  });
-
-$(function() {
-  $( ".datepicker-us-year" ).datepicker({dateFormat: 'mm/dd/yy',
-	duration: 'fast',
-	changeYear: true,
-	yearRange: '1900:2020'
-	});
-  });
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/empty.css
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/empty.css	(revision 11253)
+++ 	(revision )
@@ -1,1 +1,0 @@
-/* Nothing here */
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/jquery.dataTables.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/jquery.dataTables.js	(revision 11253)
+++ 	(revision )
@@ -1,6862 +1,0 @@
-/*
- * File:        jquery.dataTables.js
- * Version:     1.7.6
- * Description: Paginate, search and sort HTML tables
- * Author:      Allan Jardine (www.sprymedia.co.uk)
- * Created:     28/3/2008
- * Language:    Javascript
- * License:     GPL v2 or BSD 3 point style
- * Project:     Mtaala
- * Contact:     allan.jardine@sprymedia.co.uk
- * 
- * Copyright 2008-2010 Allan Jardine, all rights reserved.
- *
- * This source file is free software, under either the GPL v2 license or a
- * BSD style license, as supplied with this software.
- * 
- * This source file is distributed in the hope that it will be useful, but 
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
- * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
- * 
- * For details please refer to: http://www.datatables.net
- */
-
-/*
- * When considering jsLint, we need to allow eval() as it it is used for reading cookies and 
- * building the dynamic multi-column sort functions.
- */
-/*jslint evil: true, undef: true, browser: true */
-/*globals $, jQuery,_fnExternApiFunc,_fnInitalise,_fnInitComplete,_fnLanguageProcess,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnGatherData,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxUpdateDraw,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnArrayCmp,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap*/
-
-(function($, window, document) {
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Section - DataTables variables
-	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-	
-	/*
-	 * Variable: dataTableSettings
-	 * Purpose:  Store the settings for each dataTables instance
-	 * Scope:    jQuery.fn
-	 */
-	$.fn.dataTableSettings = [];
-	var _aoSettings = $.fn.dataTableSettings; /* Short reference for fast internal lookup */
-	
-	/*
-	 * Variable: dataTableExt
-	 * Purpose:  Container for customisable parts of DataTables
-	 * Scope:    jQuery.fn
-	 */
-	$.fn.dataTableExt = {};
-	var _oExt = $.fn.dataTableExt;
-	
-	
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Section - DataTables extensible objects
-	 * 
-	 * The _oExt object is used to provide an area where user dfined plugins can be 
-	 * added to DataTables. The following properties of the object are used:
-	 *   oApi - Plug-in API functions
-	 *   aTypes - Auto-detection of types
-	 *   oSort - Sorting functions used by DataTables (based on the type)
-	 *   oPagination - Pagination functions for different input styles
-	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-	
-	/*
-	 * Variable: sVersion
-	 * Purpose:  Version string for plug-ins to check compatibility
-	 * Scope:    jQuery.fn.dataTableExt
-	 * Notes:    Allowed format is a.b.c.d.e where:
-	 *   a:int, b:int, c:int, d:string(dev|beta), e:int. d and e are optional
-	 */
-	_oExt.sVersion = "1.7.6";
-	
-	/*
-	 * Variable: sErrMode
-	 * Purpose:  How should DataTables report an error. Can take the value 'alert' or 'throw'
-	 * Scope:    jQuery.fn.dataTableExt
-	 */
-	_oExt.sErrMode = "alert";
-	
-	/*
-	 * Variable: iApiIndex
-	 * Purpose:  Index for what 'this' index API functions should use
-	 * Scope:    jQuery.fn.dataTableExt
-	 */
-	_oExt.iApiIndex = 0;
-	
-	/*
-	 * Variable: oApi
-	 * Purpose:  Container for plugin API functions
-	 * Scope:    jQuery.fn.dataTableExt
-	 */
-	_oExt.oApi = { };
-	
-	/*
-	 * Variable: aFiltering
-	 * Purpose:  Container for plugin filtering functions
-	 * Scope:    jQuery.fn.dataTableExt
-	 */
-	_oExt.afnFiltering = [ ];
-	
-	/*
-	 * Variable: aoFeatures
-	 * Purpose:  Container for plugin function functions
-	 * Scope:    jQuery.fn.dataTableExt
-	 * Notes:    Array of objects with the following parameters:
-	 *   fnInit: Function for initialisation of Feature. Takes oSettings and returns node
-	 *   cFeature: Character that will be matched in sDom - case sensitive
-	 *   sFeature: Feature name - just for completeness :-)
-	 */
-	_oExt.aoFeatures = [ ];
-	
-	/*
-	 * Variable: ofnSearch
-	 * Purpose:  Container for custom filtering functions
-	 * Scope:    jQuery.fn.dataTableExt
-	 * Notes:    This is an object (the name should match the type) for custom filtering function,
-	 *   which can be used for live DOM checking or formatted text filtering
-	 */
-	_oExt.ofnSearch = { };
-	
-	/*
-	 * Variable: afnSortData
-	 * Purpose:  Container for custom sorting data source functions
-	 * Scope:    jQuery.fn.dataTableExt
-	 * Notes:    Array (associative) of functions which is run prior to a column of this 
-	 *   'SortDataType' being sorted upon.
-	 *   Function input parameters:
-	 *     object:oSettings-  DataTables settings object
-	 *     int:iColumn - Target column number
-	 *   Return value: Array of data which exactly matched the full data set size for the column to
-	 *     be sorted upon
-	 */
-	_oExt.afnSortData = [ ];
-	
-	/*
-	 * Variable: oStdClasses
-	 * Purpose:  Storage for the various classes that DataTables uses
-	 * Scope:    jQuery.fn.dataTableExt
-	 */
-	_oExt.oStdClasses = {
-		/* Two buttons buttons */
-		"sPagePrevEnabled": "paginate_enabled_previous",
-		"sPagePrevDisabled": "paginate_disabled_previous",
-		"sPageNextEnabled": "paginate_enabled_next",
-		"sPageNextDisabled": "paginate_disabled_next",
-		"sPageJUINext": "",
-		"sPageJUIPrev": "",
-		
-		/* Full numbers paging buttons */
-		"sPageButton": "paginate_button",
-		"sPageButtonActive": "paginate_active",
-		"sPageButtonStaticDisabled": "paginate_button",
-		"sPageFirst": "first",
-		"sPagePrevious": "previous",
-		"sPageNext": "next",
-		"sPageLast": "last",
-		
-		/* Stripping classes */
-		"sStripOdd": "odd",
-		"sStripEven": "even",
-		
-		/* Empty row */
-		"sRowEmpty": "dataTables_empty",
-		
-		/* Features */
-		"sWrapper": "dataTables_wrapper",
-		"sFilter": "dataTables_filter",
-		"sInfo": "dataTables_info",
-		"sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
-		"sLength": "dataTables_length",
-		"sProcessing": "dataTables_processing",
-		
-		/* Sorting */
-		"sSortAsc": "sorting_asc",
-		"sSortDesc": "sorting_desc",
-		"sSortable": "sorting", /* Sortable in both directions */
-		"sSortableAsc": "sorting_asc_disabled",
-		"sSortableDesc": "sorting_desc_disabled",
-		"sSortableNone": "sorting_disabled",
-		"sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
-		"sSortJUIAsc": "",
-		"sSortJUIDesc": "",
-		"sSortJUI": "",
-		"sSortJUIAscAllowed": "",
-		"sSortJUIDescAllowed": "",
-		"sSortJUIWrapper": "",
-		
-		/* Scrolling */
-		"sScrollWrapper": "dataTables_scroll",
-		"sScrollHead": "dataTables_scrollHead",
-		"sScrollHeadInner": "dataTables_scrollHeadInner",
-		"sScrollBody": "dataTables_scrollBody",
-		"sScrollFoot": "dataTables_scrollFoot",
-		"sScrollFootInner": "dataTables_scrollFootInner",
-		
-		/* Misc */
-		"sFooterTH": ""
-	};
-	
-	/*
-	 * Variable: oJUIClasses
-	 * Purpose:  Storage for the various classes that DataTables uses - jQuery UI suitable
-	 * Scope:    jQuery.fn.dataTableExt
-	 */
-	_oExt.oJUIClasses = {
-		/* Two buttons buttons */
-		"sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left",
-		"sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled",
-		"sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right",
-		"sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled",
-		"sPageJUINext": "ui-icon ui-icon-circle-arrow-e",
-		"sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w",
-		
-		/* Full numbers paging buttons */
-		"sPageButton": "fg-button ui-button ui-state-default",
-		"sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled",
-		"sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled",
-		"sPageFirst": "first ui-corner-tl ui-corner-bl",
-		"sPagePrevious": "previous",
-		"sPageNext": "next",
-		"sPageLast": "last ui-corner-tr ui-corner-br",
-		
-		/* Stripping classes */
-		"sStripOdd": "odd",
-		"sStripEven": "even",
-		
-		/* Empty row */
-		"sRowEmpty": "dataTables_empty",
-		
-		/* Features */
-		"sWrapper": "dataTables_wrapper",
-		"sFilter": "dataTables_filter",
-		"sInfo": "dataTables_info",
-		"sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
-			"ui-buttonset-multi paging_", /* Note that the type is postfixed */
-		"sLength": "dataTables_length",
-		"sProcessing": "dataTables_processing",
-		
-		/* Sorting */
-		"sSortAsc": "ui-state-default",
-		"sSortDesc": "ui-state-default",
-		"sSortable": "ui-state-default",
-		"sSortableAsc": "ui-state-default",
-		"sSortableDesc": "ui-state-default",
-		"sSortableNone": "ui-state-default",
-		"sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
-		"sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n",
-		"sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s",
-		"sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s",
-		"sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n",
-		"sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s",
-		"sSortJUIWrapper": "DataTables_sort_wrapper",
-		
-		/* Scrolling */
-		"sScrollWrapper": "dataTables_scroll",
-		"sScrollHead": "dataTables_scrollHead ui-state-default",
-		"sScrollHeadInner": "dataTables_scrollHeadInner",
-		"sScrollBody": "dataTables_scrollBody",
-		"sScrollFoot": "dataTables_scrollFoot ui-state-default",
-		"sScrollFootInner": "dataTables_scrollFootInner",
-		
-		/* Misc */
-		"sFooterTH": "ui-state-default"
-	};
-	
-	/*
-	 * Variable: oPagination
-	 * Purpose:  Container for the various type of pagination that dataTables supports
-	 * Scope:    jQuery.fn.dataTableExt
-	 */
-	_oExt.oPagination = {
-		/*
-		 * Variable: two_button
-		 * Purpose:  Standard two button (forward/back) pagination
-	 	 * Scope:    jQuery.fn.dataTableExt.oPagination
-		 */
-		"two_button": {
-			/*
-			 * Function: oPagination.two_button.fnInit
-			 * Purpose:  Initalise dom elements required for pagination with forward/back buttons only
-			 * Returns:  -
-	 		 * Inputs:   object:oSettings - dataTables settings object
-	     *           node:nPaging - the DIV which contains this pagination control
-			 *           function:fnCallbackDraw - draw function which must be called on update
-			 */
-			"fnInit": function ( oSettings, nPaging, fnCallbackDraw )
-			{
-				var nPrevious, nNext, nPreviousInner, nNextInner;
-				
-				/* Store the next and previous elements in the oSettings object as they can be very
-				 * usful for automation - particularly testing
-				 */
-				if ( !oSettings.bJUI )
-				{
-					nPrevious = document.createElement( 'div' );
-					nNext = document.createElement( 'div' );
-				}
-				else
-				{
-					nPrevious = document.createElement( 'a' );
-					nNext = document.createElement( 'a' );
-					
-					nNextInner = document.createElement('span');
-					nNextInner.className = oSettings.oClasses.sPageJUINext;
-					nNext.appendChild( nNextInner );
-					
-					nPreviousInner = document.createElement('span');
-					nPreviousInner.className = oSettings.oClasses.sPageJUIPrev;
-					nPrevious.appendChild( nPreviousInner );
-				}
-				
-				nPrevious.className = oSettings.oClasses.sPagePrevDisabled;
-				nNext.className = oSettings.oClasses.sPageNextDisabled;
-				
-				nPrevious.title = oSettings.oLanguage.oPaginate.sPrevious;
-				nNext.title = oSettings.oLanguage.oPaginate.sNext;
-				
-				nPaging.appendChild( nPrevious );
-				nPaging.appendChild( nNext );
-				
-				$(nPrevious).bind( 'click.DT', function() {
-					if ( oSettings.oApi._fnPageChange( oSettings, "previous" ) )
-					{
-						/* Only draw when the page has actually changed */
-						fnCallbackDraw( oSettings );
-					}
-				} );
-				
-				$(nNext).bind( 'click.DT', function() {
-					if ( oSettings.oApi._fnPageChange( oSettings, "next" ) )
-					{
-						fnCallbackDraw( oSettings );
-					}
-				} );
-				
-				/* Take the brutal approach to cancelling text selection */
-				$(nPrevious).bind( 'selectstart.DT', function () { return false; } );
-				$(nNext).bind( 'selectstart.DT', function () { return false; } );
-				
-				/* ID the first elements only */
-				if ( oSettings.sTableId !== '' && typeof oSettings.aanFeatures.p == "undefined" )
-				{
-					nPaging.setAttribute( 'id', oSettings.sTableId+'_paginate' );
-					nPrevious.setAttribute( 'id', oSettings.sTableId+'_previous' );
-					nNext.setAttribute( 'id', oSettings.sTableId+'_next' );
-				}
-			},
-			
-			/*
-			 * Function: oPagination.two_button.fnUpdate
-			 * Purpose:  Update the two button pagination at the end of the draw
-			 * Returns:  -
-	 		 * Inputs:   object:oSettings - dataTables settings object
-			 *           function:fnCallbackDraw - draw function to call on page change
-			 */
-			"fnUpdate": function ( oSettings, fnCallbackDraw )
-			{
-				if ( !oSettings.aanFeatures.p )
-				{
-					return;
-				}
-				
-				/* Loop over each instance of the pager */
-				var an = oSettings.aanFeatures.p;
-				for ( var i=0, iLen=an.length ; i<iLen ; i++ )
-				{
-					if ( an[i].childNodes.length !== 0 )
-					{
-						an[i].childNodes[0].className = 
-							( oSettings._iDisplayStart === 0 ) ? 
-							oSettings.oClasses.sPagePrevDisabled : oSettings.oClasses.sPagePrevEnabled;
-						
-						an[i].childNodes[1].className = 
-							( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ? 
-							oSettings.oClasses.sPageNextDisabled : oSettings.oClasses.sPageNextEnabled;
-					}
-				}
-			}
-		},
-		
-		
-		/*
-		 * Variable: iFullNumbersShowPages
-		 * Purpose:  Change the number of pages which can be seen
-	 	 * Scope:    jQuery.fn.dataTableExt.oPagination
-		 */
-		"iFullNumbersShowPages": 5,
-		
-		/*
-		 * Variable: full_numbers
-		 * Purpose:  Full numbers pagination
-	 	 * Scope:    jQuery.fn.dataTableExt.oPagination
-		 */
-		"full_numbers": {
-			/*
-			 * Function: oPagination.full_numbers.fnInit
-			 * Purpose:  Initalise dom elements required for pagination with a list of the pages
-			 * Returns:  -
-	 		 * Inputs:   object:oSettings - dataTables settings object
-	     *           node:nPaging - the DIV which contains this pagination control
-			 *           function:fnCallbackDraw - draw function which must be called on update
-			 */
-			"fnInit": function ( oSettings, nPaging, fnCallbackDraw )
-			{
-				var nFirst = document.createElement( 'span' );
-				var nPrevious = document.createElement( 'span' );
-				var nList = document.createElement( 'span' );
-				var nNext = document.createElement( 'span' );
-				var nLast = document.createElement( 'span' );
-				
-				nFirst.innerHTML = oSettings.oLanguage.oPaginate.sFirst;
-				nPrevious.innerHTML = oSettings.oLanguage.oPaginate.sPrevious;
-				nNext.innerHTML = oSettings.oLanguage.oPaginate.sNext;
-				nLast.innerHTML = oSettings.oLanguage.oPaginate.sLast;
-				
-				var oClasses = oSettings.oClasses;
-				nFirst.className = oClasses.sPageButton+" "+oClasses.sPageFirst;
-				nPrevious.className = oClasses.sPageButton+" "+oClasses.sPagePrevious;
-				nNext.className= oClasses.sPageButton+" "+oClasses.sPageNext;
-				nLast.className = oClasses.sPageButton+" "+oClasses.sPageLast;
-				
-				nPaging.appendChild( nFirst );
-				nPaging.appendChild( nPrevious );
-				nPaging.appendChild( nList );
-				nPaging.appendChild( nNext );
-				nPaging.appendChild( nLast );
-				
-				$(nFirst).bind( 'click.DT', function () {
-					if ( oSettings.oApi._fnPageChange( oSettings, "first" ) )
-					{
-						fnCallbackDraw( oSettings );
-					}
-				} );
-				
-				$(nPrevious).bind( 'click.DT', function() {
-					if ( oSettings.oApi._fnPageChange( oSettings, "previous" ) )
-					{
-						fnCallbackDraw( oSettings );
-					}
-				} );
-				
-				$(nNext).bind( 'click.DT', function() {
-					if ( oSettings.oApi._fnPageChange( oSettings, "next" ) )
-					{
-						fnCallbackDraw( oSettings );
-					}
-				} );
-				
-				$(nLast).bind( 'click.DT', function() {
-					if ( oSettings.oApi._fnPageChange( oSettings, "last" ) )
-					{
-						fnCallbackDraw( oSettings );
-					}
-				} );
-				
-				/* Take the brutal approach to cancelling text selection */
-				$('span', nPaging)
-					.bind( 'mousedown.DT', function () { return false; } )
-					.bind( 'selectstart.DT', function () { return false; } );
-				
-				/* ID the first elements only */
-				if ( oSettings.sTableId !== '' && typeof oSettings.aanFeatures.p == "undefined" )
-				{
-					nPaging.setAttribute( 'id', oSettings.sTableId+'_paginate' );
-					nFirst.setAttribute( 'id', oSettings.sTableId+'_first' );
-					nPrevious.setAttribute( 'id', oSettings.sTableId+'_previous' );
-					nNext.setAttribute( 'id', oSettings.sTableId+'_next' );
-					nLast.setAttribute( 'id', oSettings.sTableId+'_last' );
-				}
-			},
-			
-			/*
-			 * Function: oPagination.full_numbers.fnUpdate
-			 * Purpose:  Update the list of page buttons shows
-			 * Returns:  -
-	 		 * Inputs:   object:oSettings - dataTables settings object
-			 *           function:fnCallbackDraw - draw function to call on page change
-			 */
-			"fnUpdate": function ( oSettings, fnCallbackDraw )
-			{
-				if ( !oSettings.aanFeatures.p )
-				{
-					return;
-				}
-				
-				var iPageCount = _oExt.oPagination.iFullNumbersShowPages;
-				var iPageCountHalf = Math.floor(iPageCount / 2);
-				var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength);
-				var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
-				var sList = "";
-				var iStartButton, iEndButton, i, iLen;
-				var oClasses = oSettings.oClasses;
-				
-				/* Pages calculation */
-				if (iPages < iPageCount)
-				{
-					iStartButton = 1;
-					iEndButton = iPages;
-				}
-				else
-				{
-					if (iCurrentPage <= iPageCountHalf)
-					{
-						iStartButton = 1;
-						iEndButton = iPageCount;
-					}
-					else
-					{
-						if (iCurrentPage >= (iPages - iPageCountHalf))
-						{
-							iStartButton = iPages - iPageCount + 1;
-							iEndButton = iPages;
-						}
-						else
-						{
-							iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;
-							iEndButton = iStartButton + iPageCount - 1;
-						}
-					}
-				}
-				
-				/* Build the dynamic list */
-				for ( i=iStartButton ; i<=iEndButton ; i++ )
-				{
-					if ( iCurrentPage != i )
-					{
-						sList += '<span class="'+oClasses.sPageButton+'">'+i+'</span>';
-					}
-					else
-					{
-						sList += '<span class="'+oClasses.sPageButtonActive+'">'+i+'</span>';
-					}
-				}
-				
-				/* Loop over each instance of the pager */
-				var an = oSettings.aanFeatures.p;
-				var anButtons, anStatic, nPaginateList;
-				var fnClick = function() {
-					/* Use the information in the element to jump to the required page */
-					var iTarget = (this.innerHTML * 1) - 1;
-					oSettings._iDisplayStart = iTarget * oSettings._iDisplayLength;
-					fnCallbackDraw( oSettings );
-					return false;
-				};
-				var fnFalse = function () { return false; };
-				
-				for ( i=0, iLen=an.length ; i<iLen ; i++ )
-				{
-					if ( an[i].childNodes.length === 0 )
-					{
-						continue;
-					}
-					
-					/* Build up the dynamic list forst - html and listeners */
-					var qjPaginateList = $('span:eq(2)', an[i]);
-					qjPaginateList.html( sList );
-					$('span', qjPaginateList).bind( 'click.DT', fnClick ).bind( 'mousedown.DT', fnFalse )
-						.bind( 'selectstart.DT', fnFalse );
-					
-					/* Update the 'premanent botton's classes */
-					anButtons = an[i].getElementsByTagName('span');
-					anStatic = [
-						anButtons[0], anButtons[1], 
-						anButtons[anButtons.length-2], anButtons[anButtons.length-1]
-					];
-					$(anStatic).removeClass( oClasses.sPageButton+" "+oClasses.sPageButtonActive+" "+oClasses.sPageButtonStaticDisabled );
-					if ( iCurrentPage == 1 )
-					{
-						anStatic[0].className += " "+oClasses.sPageButtonStaticDisabled;
-						anStatic[1].className += " "+oClasses.sPageButtonStaticDisabled;
-					}
-					else
-					{
-						anStatic[0].className += " "+oClasses.sPageButton;
-						anStatic[1].className += " "+oClasses.sPageButton;
-					}
-					
-					if ( iPages === 0 || iCurrentPage == iPages || oSettings._iDisplayLength == -1 )
-					{
-						anStatic[2].className += " "+oClasses.sPageButtonStaticDisabled;
-						anStatic[3].className += " "+oClasses.sPageButtonStaticDisabled;
-					}
-					else
-					{
-						anStatic[2].className += " "+oClasses.sPageButton;
-						anStatic[3].className += " "+oClasses.sPageButton;
-					}
-				}
-			}
-		}
-	};
-	
-	/*
-	 * Variable: oSort
-	 * Purpose:  Wrapper for the sorting functions that can be used in DataTables
-	 * Scope:    jQuery.fn.dataTableExt
-	 * Notes:    The functions provided in this object are basically standard javascript sort
-	 *   functions - they expect two inputs which they then compare and then return a priority
-	 *   result. For each sort method added, two functions need to be defined, an ascending sort and
-	 *   a descending sort.
-	 */
-	_oExt.oSort = {
-		/*
-		 * text sorting
-		 */
-		"string-asc": function ( a, b )
-		{
-			var x = a.toLowerCase();
-			var y = b.toLowerCase();
-			return ((x < y) ? -1 : ((x > y) ? 1 : 0));
-		},
-		
-		"string-desc": function ( a, b )
-		{
-			var x = a.toLowerCase();
-			var y = b.toLowerCase();
-			return ((x < y) ? 1 : ((x > y) ? -1 : 0));
-		},
-		
-		
-		/*
-		 * html sorting (ignore html tags)
-		 */
-		"html-asc": function ( a, b )
-		{
-			var x = a.replace( /<.*?>/g, "" ).toLowerCase();
-			var y = b.replace( /<.*?>/g, "" ).toLowerCase();
-			return ((x < y) ? -1 : ((x > y) ? 1 : 0));
-		},
-		
-		"html-desc": function ( a, b )
-		{
-			var x = a.replace( /<.*?>/g, "" ).toLowerCase();
-			var y = b.replace( /<.*?>/g, "" ).toLowerCase();
-			return ((x < y) ? 1 : ((x > y) ? -1 : 0));
-		},
-		
-		
-		/*
-		 * date sorting
-		 */
-		"date-asc": function ( a, b )
-		{
-			var x = Date.parse( a );
-			var y = Date.parse( b );
-			
-			if ( isNaN(x) || x==="" )
-			{
-    		x = Date.parse( "01/01/1970 00:00:00" );
-			}
-			if ( isNaN(y) || y==="" )
-			{
-				y =	Date.parse( "01/01/1970 00:00:00" );
-			}
-			
-			return x - y;
-		},
-		
-		"date-desc": function ( a, b )
-		{
-			var x = Date.parse( a );
-			var y = Date.parse( b );
-			
-			if ( isNaN(x) || x==="" )
-			{
-    		x = Date.parse( "01/01/1970 00:00:00" );
-			}
-			if ( isNaN(y) || y==="" )
-			{
-				y =	Date.parse( "01/01/1970 00:00:00" );
-			}
-			
-			return y - x;
-		},
-		
-		
-		/*
-		 * numerical sorting
-		 */
-		"numeric-asc": function ( a, b )
-		{
-			var x = (a=="-" || a==="") ? 0 : a*1;
-			var y = (b=="-" || b==="") ? 0 : b*1;
-			return x - y;
-		},
-		
-		"numeric-desc": function ( a, b )
-		{
-			var x = (a=="-" || a==="") ? 0 : a*1;
-			var y = (b=="-" || b==="") ? 0 : b*1;
-			return y - x;
-		}
-	};
-	
-	
-	/*
-	 * Variable: aTypes
-	 * Purpose:  Container for the various type of type detection that dataTables supports
-	 * Scope:    jQuery.fn.dataTableExt
-	 * Notes:    The functions in this array are expected to parse a string to see if it is a data
-	 *   type that it recognises. If so then the function should return the name of the type (a
-	 *   corresponding sort function should be defined!), if the type is not recognised then the
-	 *   function should return null such that the parser and move on to check the next type.
-	 *   Note that ordering is important in this array - the functions are processed linearly,
-	 *   starting at index 0.
-	 *   Note that the input for these functions is always a string! It cannot be any other data
-	 *   type
-	 */
-	_oExt.aTypes = [
-		/*
-		 * Function: -
-		 * Purpose:  Check to see if a string is numeric
-		 * Returns:  string:'numeric' or null
-		 * Inputs:   string:sText - string to check
-		 */
-		function ( sData )
-		{
-			/* Allow zero length strings as a number */
-			if ( sData.length === 0 )
-			{
-				return 'numeric';
-			}
-			
-			var sValidFirstChars = "0123456789-";
-			var sValidChars = "0123456789.";
-			var Char;
-			var bDecimal = false;
-			
-			/* Check for a valid first char (no period and allow negatives) */
-			Char = sData.charAt(0); 
-			if (sValidFirstChars.indexOf(Char) == -1) 
-			{
-				return null;
-			}
-			
-			/* Check all the other characters are valid */
-			for ( var i=1 ; i<sData.length ; i++ ) 
-			{
-				Char = sData.charAt(i); 
-				if (sValidChars.indexOf(Char) == -1) 
-				{
-					return null;
-				}
-				
-				/* Only allowed one decimal place... */
-				if ( Char == "." )
-				{
-					if ( bDecimal )
-					{
-						return null;
-					}
-					bDecimal = true;
-				}
-			}
-			
-			return 'numeric';
-		},
-		
-		/*
-		 * Function: -
-		 * Purpose:  Check to see if a string is actually a formatted date
-		 * Returns:  string:'date' or null
-		 * Inputs:   string:sText - string to check
-		 */
-		function ( sData )
-		{
-			var iParse = Date.parse(sData);
-			if ( (iParse !== null && !isNaN(iParse)) || sData.length === 0 )
-			{
-				return 'date';
-			}
-			return null;
-		},
-		
-		/*
-		 * Function: -
-		 * Purpose:  Check to see if a string should be treated as an HTML string
-		 * Returns:  string:'html' or null
-		 * Inputs:   string:sText - string to check
-		 */
-		function ( sData )
-		{
-			if ( sData.indexOf('<') != -1 && sData.indexOf('>') != -1 )
-			{
-				return 'html';
-			}
-			return null;
-		}
-	];
-	
-	/*
-	 * Function: fnVersionCheck
-	 * Purpose:  Check a version string against this version of DataTables. Useful for plug-ins
-	 * Returns:  bool:true -this version of DataTables is greater or equal to the required version
-	 *                false -this version of DataTales is not suitable
-	 * Inputs:   string:sVersion - the version to check against. May be in the following formats:
-	 *             "a", "a.b" or "a.b.c"
-	 * Notes:    This function will only check the first three parts of a version string. It is
-	 *   assumed that beta and dev versions will meet the requirements. This might change in future
-	 */
-	_oExt.fnVersionCheck = function( sVersion )
-	{
-		/* This is cheap, but very effective */
-		var fnZPad = function (Zpad, count)
-		{
-			while(Zpad.length < count) {
-				Zpad += '0';
-			}
-			return Zpad;
-		};
-		var aThis = _oExt.sVersion.split('.');
-		var aThat = sVersion.split('.');
-		var sThis = '', sThat = '';
-		
-		for ( var i=0, iLen=aThat.length ; i<iLen ; i++ )
-		{
-			sThis += fnZPad( aThis[i], 3 );
-			sThat += fnZPad( aThat[i], 3 );
-		}
-		
-		return parseInt(sThis, 10) >= parseInt(sThat, 10);
-	};
-	
-	/*
-	 * Variable: _oExternConfig
-	 * Purpose:  Store information for DataTables to access globally about other instances
-	 * Scope:    jQuery.fn.dataTableExt
-	 */
-	_oExt._oExternConfig = {
-		/* int:iNextUnique - next unique number for an instance */
-		"iNextUnique": 0
-	};
-	
-	
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Section - DataTables prototype
-	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-	
-	/*
-	 * Function: dataTable
-	 * Purpose:  DataTables information
-	 * Returns:  -
-	 * Inputs:   object:oInit - initalisation options for the table
-	 */
-	$.fn.dataTable = function( oInit )
-	{
-		/*
-		 * Function: classSettings
-		 * Purpose:  Settings container function for all 'class' properties which are required
-		 *   by dataTables
-		 * Returns:  -
-		 * Inputs:   -
-		 */
-		function classSettings ()
-		{
-			this.fnRecordsTotal = function ()
-			{
-				if ( this.oFeatures.bServerSide ) {
-					return parseInt(this._iRecordsTotal, 10);
-				} else {
-					return this.aiDisplayMaster.length;
-				}
-			};
-			
-			this.fnRecordsDisplay = function ()
-			{
-				if ( this.oFeatures.bServerSide ) {
-					return parseInt(this._iRecordsDisplay, 10);
-				} else {
-					return this.aiDisplay.length;
-				}
-			};
-			
-			this.fnDisplayEnd = function ()
-			{
-				if ( this.oFeatures.bServerSide ) {
-					if ( this.oFeatures.bPaginate === false || this._iDisplayLength == -1 ) {
-						return this._iDisplayStart+this.aiDisplay.length;
-					} else {
-						return Math.min( this._iDisplayStart+this._iDisplayLength, 
-							this._iRecordsDisplay );
-					}
-				} else {
-					return this._iDisplayEnd;
-				}
-			};
-			
-			/*
-			 * Variable: oInstance
-			 * Purpose:  The DataTables object for this table
-			 * Scope:    jQuery.dataTable.classSettings 
-			 */
-			this.oInstance = null;
-			
-			/*
-			 * Variable: sInstance
-			 * Purpose:  Unique idendifier for each instance of the DataTables object
-			 * Scope:    jQuery.dataTable.classSettings 
-			 */
-			this.sInstance = null;
-			
-			/*
-			 * Variable: oFeatures
-			 * Purpose:  Indicate the enablement of key dataTable features
-			 * Scope:    jQuery.dataTable.classSettings 
-			 */
-			this.oFeatures = {
-				"bPaginate": true,
-				"bLengthChange": true,
-				"bFilter": true,
-				"bSort": true,
-				"bInfo": true,
-				"bAutoWidth": true,
-				"bProcessing": false,
-				"bSortClasses": true,
-				"bStateSave": false,
-				"bServerSide": false
-			};
-			
-			/*
-			 * Variable: oScroll
-			 * Purpose:  Container for scrolling options
-			 * Scope:    jQuery.dataTable.classSettings 
-			 */
-			this.oScroll = {
-				"sX": "",
-				"sXInner": "",
-				"sY": "",
-				"bCollapse": false,
-				"bInfinite": false,
-				"iLoadGap": 100,
-				"iBarWidth": 0,
-				"bAutoCss": true
-			};
-			
-			/*
-			 * Variable: aanFeatures
-			 * Purpose:  Array referencing the nodes which are used for the features
-			 * Scope:    jQuery.dataTable.classSettings 
-			 * Notes:    The parameters of this object match what is allowed by sDom - i.e.
-			 *   'l' - Length changing
-			 *   'f' - Filtering input
-			 *   't' - The table!
-			 *   'i' - Information
-			 *   'p' - Pagination
-			 *   'r' - pRocessing
-			 */
-			this.aanFeatures = [];
-			
-			/*
-			 * Variable: oLanguage
-			 * Purpose:  Store the language strings used by dataTables
-			 * Scope:    jQuery.dataTable.classSettings
-			 * Notes:    The words in the format _VAR_ are variables which are dynamically replaced
-			 *   by javascript
-			 */
-			this.oLanguage = {
-				"sProcessing": "Processing...",
-				"sLengthMenu": "Show _MENU_ entries",
-				"sZeroRecords": "No matching records found",
-				"sEmptyTable": "No data available in table",
-				"sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
-				"sInfoEmpty": "Showing 0 to 0 of 0 entries",
-				"sInfoFiltered": "(filtered from _MAX_ total entries)",
-				"sInfoPostFix": "",
-				"sSearch": "Search:",
-				"sUrl": "",
-				"oPaginate": {
-					"sFirst":    "First",
-					"sPrevious": "Previous",
-					"sNext":     "Next",
-					"sLast":     "Last"
-				},
-				"fnInfoCallback": null
-			};
-			
-			/*
-			 * Variable: aoData
-			 * Purpose:  Store data information
-			 * Scope:    jQuery.dataTable.classSettings 
-			 * Notes:    This is an array of objects with the following parameters:
-			 *   int: _iId - internal id for tracking
-			 *   array: _aData - internal data - used for sorting / filtering etc
-			 *   node: nTr - display node
-			 *   array node: _anHidden - hidden TD nodes
-			 *   string: _sRowStripe
-			 */
-			this.aoData = [];
-			
-			/*
-			 * Variable: aiDisplay
-			 * Purpose:  Array of indexes which are in the current display (after filtering etc)
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.aiDisplay = [];
-			
-			/*
-			 * Variable: aiDisplayMaster
-			 * Purpose:  Array of indexes for display - no filtering
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.aiDisplayMaster = [];
-							
-			/*
-			 * Variable: aoColumns
-			 * Purpose:  Store information about each column that is in use
-			 * Scope:    jQuery.dataTable.classSettings 
-			 */
-			this.aoColumns = [];
-			
-			/*
-			 * Variable: iNextId
-			 * Purpose:  Store the next unique id to be used for a new row
-			 * Scope:    jQuery.dataTable.classSettings 
-			 */
-			this.iNextId = 0;
-			
-			/*
-			 * Variable: asDataSearch
-			 * Purpose:  Search data array for regular expression searching
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.asDataSearch = [];
-			
-			/*
-			 * Variable: oPreviousSearch
-			 * Purpose:  Store the previous search incase we want to force a re-search
-			 *   or compare the old search to a new one
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.oPreviousSearch = {
-				"sSearch": "",
-				"bRegex": false,
-				"bSmart": true
-			};
-			
-			/*
-			 * Variable: aoPreSearchCols
-			 * Purpose:  Store the previous search for each column
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.aoPreSearchCols = [];
-			
-			/*
-			 * Variable: aaSorting
-			 * Purpose:  Sorting information
-			 * Scope:    jQuery.dataTable.classSettings
-			 * Notes:    Index 0 - column number
-			 *           Index 1 - current sorting direction
-			 *           Index 2 - index of asSorting for this column
-			 */
-			this.aaSorting = [ [0, 'asc', 0] ];
-			
-			/*
-			 * Variable: aaSortingFixed
-			 * Purpose:  Sorting information that is always applied
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.aaSortingFixed = null;
-			
-			/*
-			 * Variable: asStripClasses
-			 * Purpose:  Classes to use for the striping of a table
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.asStripClasses = [];
-			
-			/*
-			 * Variable: asDestoryStrips
-			 * Purpose:  If restoring a table - we should restore it's striping classes as well
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.asDestoryStrips = [];
-			
-			/*
-			 * Variable: sDestroyWidth
-			 * Purpose:  If restoring a table - we should restore it's width
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.sDestroyWidth = 0;
-			
-			/*
-			 * Variable: fnRowCallback
-			 * Purpose:  Call this function every time a row is inserted (draw)
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.fnRowCallback = null;
-			
-			/*
-			 * Variable: fnHeaderCallback
-			 * Purpose:  Callback function for the header on each draw
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.fnHeaderCallback = null;
-			
-			/*
-			 * Variable: fnFooterCallback
-			 * Purpose:  Callback function for the footer on each draw
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.fnFooterCallback = null;
-			
-			/*
-			 * Variable: aoDrawCallback
-			 * Purpose:  Array of callback functions for draw callback functions
-			 * Scope:    jQuery.dataTable.classSettings
-			 * Notes:    Each array element is an object with the following parameters:
-			 *   function:fn - function to call
-			 *   string:sName - name callback (feature). useful for arranging array
-			 */
-			this.aoDrawCallback = [];
-			
-			/*
-			 * Variable: fnInitComplete
-			 * Purpose:  Callback function for when the table has been initalised
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.fnInitComplete = null;
-			
-			/*
-			 * Variable: sTableId
-			 * Purpose:  Cache the table ID for quick access
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.sTableId = "";
-			
-			/*
-			 * Variable: nTable
-			 * Purpose:  Cache the table node for quick access
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.nTable = null;
-			
-			/*
-			 * Variable: nTHead
-			 * Purpose:  Permanent ref to the thead element
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.nTHead = null;
-			
-			/*
-			 * Variable: nTFoot
-			 * Purpose:  Permanent ref to the tfoot element - if it exists
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.nTFoot = null;
-			
-			/*
-			 * Variable: nTBody
-			 * Purpose:  Permanent ref to the tbody element
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.nTBody = null;
-			
-			/*
-			 * Variable: nTableWrapper
-			 * Purpose:  Cache the wrapper node (contains all DataTables controlled elements)
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.nTableWrapper = null;
-			
-			/*
-			 * Variable: bInitialised
-			 * Purpose:  Indicate if all required information has been read in
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.bInitialised = false;
-			
-			/*
-			 * Variable: aoOpenRows
-			 * Purpose:  Information about open rows
-			 * Scope:    jQuery.dataTable.classSettings
-			 * Notes:    Has the parameters 'nTr' and 'nParent'
-			 */
-			this.aoOpenRows = [];
-			
-			/*
-			 * Variable: sDom
-			 * Purpose:  Dictate the positioning that the created elements will take
-			 * Scope:    jQuery.dataTable.classSettings
-			 * Notes:    
-			 *   The following options are allowed:
-			 *     'l' - Length changing
-			 *     'f' - Filtering input
-			 *     't' - The table!
-			 *     'i' - Information
-			 *     'p' - Pagination
-			 *     'r' - pRocessing
-			 *   The following constants are allowed:
-			 *     'H' - jQueryUI theme "header" classes
-			 *     'F' - jQueryUI theme "footer" classes
-			 *   The following syntax is expected:
-			 *     '<' and '>' - div elements
-			 *     '<"class" and '>' - div with a class
-			 *   Examples:
-			 *     '<"wrapper"flipt>', '<lf<t>ip>'
-			 */
-			this.sDom = 'lfrtip';
-			
-			/*
-			 * Variable: sPaginationType
-			 * Purpose:  Note which type of sorting should be used
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.sPaginationType = "two_button";
-			
-			/*
-			 * Variable: iCookieDuration
-			 * Purpose:  The cookie duration (for bStateSave) in seconds - default 2 hours
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.iCookieDuration = 60 * 60 * 2;
-			
-			/*
-			 * Variable: sCookiePrefix
-			 * Purpose:  The cookie name prefix
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.sCookiePrefix = "SpryMedia_DataTables_";
-			
-			/*
-			 * Variable: fnCookieCallback
-			 * Purpose:  Callback function for cookie creation
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.fnCookieCallback = null;
-			
-			/*
-			 * Variable: aoStateSave
-			 * Purpose:  Array of callback functions for state saving
-			 * Scope:    jQuery.dataTable.classSettings
-			 * Notes:    Each array element is an object with the following parameters:
-			 *   function:fn - function to call. Takes two parameters, oSettings and the JSON string to
-			 *     save that has been thus far created. Returns a JSON string to be inserted into a 
-			 *     json object (i.e. '"param": [ 0, 1, 2]')
-			 *   string:sName - name of callback
-			 */
-			this.aoStateSave = [];
-			
-			/*
-			 * Variable: aoStateLoad
-			 * Purpose:  Array of callback functions for state loading
-			 * Scope:    jQuery.dataTable.classSettings
-			 * Notes:    Each array element is an object with the following parameters:
-			 *   function:fn - function to call. Takes two parameters, oSettings and the object stored.
-			 *     May return false to cancel state loading.
-			 *   string:sName - name of callback
-			 */
-			this.aoStateLoad = [];
-			
-			/*
-			 * Variable: oLoadedState
-			 * Purpose:  State that was loaded from the cookie. Useful for back reference
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.oLoadedState = null;
-			
-			/*
-			 * Variable: sAjaxSource
-			 * Purpose:  Source url for AJAX data for the table
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.sAjaxSource = null;
-			
-			/*
-			 * Variable: bAjaxDataGet
-			 * Purpose:  Note if draw should be blocked while getting data
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.bAjaxDataGet = true;
-			
-			/*
-			 * Variable: fnServerData
-			 * Purpose:  Function to get the server-side data - can be overruled by the developer
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.fnServerData = function ( url, data, callback ) {
-				$.ajax( {
-					"url": url,
-					"data": data,
-					"success": callback,
-					"dataType": "json",
-					"cache": false,
-					"error": function (xhr, error, thrown) {
-						if ( error == "parsererror" ) {
-							alert( "DataTables warning: JSON data from server could not be parsed. "+
-								"This is caused by a JSON formatting error." );
-						}
-					}
-				} );
-			};
-			
-			/*
-			 * Variable: fnFormatNumber
-			 * Purpose:  Format numbers for display
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.fnFormatNumber = function ( iIn )
-			{
-				if ( iIn < 1000 )
-				{
-					/* A small optimisation for what is likely to be the vast majority of use cases */
-					return iIn;
-				}
-				else
-				{
-					var s=(iIn+""), a=s.split(""), out="", iLen=s.length;
-					
-					for ( var i=0 ; i<iLen ; i++ )
-					{
-						if ( i%3 === 0 && i !== 0 )
-						{
-							out = ','+out;
-						}
-						out = a[iLen-i-1]+out;
-					}
-				}
-				return out;
-			};
-			
-			/*
-			 * Variable: aLengthMenu
-			 * Purpose:  List of options that can be used for the user selectable length menu
-			 * Scope:    jQuery.dataTable.classSettings
-			 * Note:     This varaible can take for form of a 1D array, in which case the value and the 
-			 *   displayed value in the menu are the same, or a 2D array in which case the value comes
-			 *   from the first array, and the displayed value to the end user comes from the second
-			 *   array. 2D example: [ [ 10, 25, 50, 100, -1 ], [ 10, 25, 50, 100, 'All' ] ];
-			 */
-			this.aLengthMenu = [ 10, 25, 50, 100 ];
-			
-			/*
-			 * Variable: iDraw
-			 * Purpose:  Counter for the draws that the table does. Also used as a tracker for
-			 *   server-side processing
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.iDraw = 0;
-			
-			/*
-			 * Variable: bDrawing
-			 * Purpose:  Indicate if a redraw is being done - useful for Ajax
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.bDrawing = 0;
-			
-			/*
-			 * Variable: iDrawError
-			 * Purpose:  Last draw error
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.iDrawError = -1;
-			
-			/*
-			 * Variable: _iDisplayLength, _iDisplayStart, _iDisplayEnd
-			 * Purpose:  Display length variables
-			 * Scope:    jQuery.dataTable.classSettings
-			 * Notes:    These variable must NOT be used externally to get the data length. Rather, use
-			 *   the fnRecordsTotal() (etc) functions.
-			 */
-			this._iDisplayLength = 10;
-			this._iDisplayStart = 0;
-			this._iDisplayEnd = 10;
-			
-			/*
-			 * Variable: _iRecordsTotal, _iRecordsDisplay
-			 * Purpose:  Display length variables used for server side processing
-			 * Scope:    jQuery.dataTable.classSettings
-			 * Notes:    These variable must NOT be used externally to get the data length. Rather, use
-			 *   the fnRecordsTotal() (etc) functions.
-			 */
-			this._iRecordsTotal = 0;
-			this._iRecordsDisplay = 0;
-			
-			/*
-			 * Variable: bJUI
-			 * Purpose:  Should we add the markup needed for jQuery UI theming?
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.bJUI = false;
-			
-			/*
-			 * Variable: bJUI
-			 * Purpose:  Should we add the markup needed for jQuery UI theming?
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.oClasses = _oExt.oStdClasses;
-			
-			/*
-			 * Variable: bFiltered and bSorted
-			 * Purpose:  Flags to allow callback functions to see what actions have been performed
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.bFiltered = false;
-			this.bSorted = false;
-			
-			/*
-			 * Variable: oInit
-			 * Purpose:  Initialisation object that is used for the table
-			 * Scope:    jQuery.dataTable.classSettings
-			 */
-			this.oInit = null;
-		}
-		
-		/*
-		 * Variable: oApi
-		 * Purpose:  Container for publicly exposed 'private' functions
-		 * Scope:    jQuery.dataTable
-		 */
-		this.oApi = {};
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - API functions
-		 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-		
-		/*
-		 * Function: fnDraw
-		 * Purpose:  Redraw the table
-		 * Returns:  -
-		 * Inputs:   bool:bComplete - Refilter and resort (if enabled) the table before the draw.
-		 *             Optional: default - true
-		 */
-		this.fnDraw = function( bComplete )
-		{
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			if ( typeof bComplete != 'undefined' && bComplete === false )
-			{
-				_fnCalculateEnd( oSettings );
-				_fnDraw( oSettings );
-			}
-			else
-			{
-				_fnReDraw( oSettings );
-			}
-		};
-		
-		/*
-		 * Function: fnFilter
-		 * Purpose:  Filter the input based on data
-		 * Returns:  -
-		 * Inputs:   string:sInput - string to filter the table on
-		 *           int:iColumn - optional - column to limit filtering to
-		 *           bool:bRegex - optional - treat as regular expression or not - default false
-		 *           bool:bSmart - optional - perform smart filtering or not - default true
-		 *           bool:bShowGlobal - optional - show the input global filter in it's input box(es)
-		 *              - default true
-		 */
-		this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal )
-		{
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			
-			if ( !oSettings.oFeatures.bFilter )
-			{
-				return;
-			}
-			
-			if ( typeof bRegex == 'undefined' )
-			{
-				bRegex = false;
-			}
-			
-			if ( typeof bSmart == 'undefined' )
-			{
-				bSmart = true;
-			}
-			
-			if ( typeof bShowGlobal == 'undefined' )
-			{
-				bShowGlobal = true;
-			}
-			
-			if ( typeof iColumn == "undefined" || iColumn === null )
-			{
-				/* Global filter */
-				_fnFilterComplete( oSettings, {
-					"sSearch":sInput,
-					"bRegex": bRegex,
-					"bSmart": bSmart
-				}, 1 );
-				
-				if ( bShowGlobal && typeof oSettings.aanFeatures.f != 'undefined' )
-				{
-					var n = oSettings.aanFeatures.f;
-					for ( var i=0, iLen=n.length ; i<iLen ; i++ )
-					{
-						$('input', n[i]).val( sInput );
-					}
-				}
-			}
-			else
-			{
-				/* Single column filter */
-				oSettings.aoPreSearchCols[ iColumn ].sSearch = sInput;
-				oSettings.aoPreSearchCols[ iColumn ].bRegex = bRegex;
-				oSettings.aoPreSearchCols[ iColumn ].bSmart = bSmart;
-				_fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
-			}
-		};
-		
-		/*
-		 * Function: fnSettings
-		 * Purpose:  Get the settings for a particular table for extern. manipulation
-		 * Returns:  -
-		 * Inputs:   -
-		 */
-		this.fnSettings = function( nNode  )
-		{
-			return _fnSettingsFromNode( this[_oExt.iApiIndex] );
-		};
-		
-		/*
-		 * Function: fnVersionCheck
-		 * Notes:    The function is the same as the 'static' function provided in the ext variable
-		 */
-		this.fnVersionCheck = _oExt.fnVersionCheck;
-		
-		/*
-		 * Function: fnSort
-		 * Purpose:  Sort the table by a particular row
-		 * Returns:  -
-		 * Inputs:   int:iCol - the data index to sort on. Note that this will
-		 *   not match the 'display index' if you have hidden data entries
-		 */
-		this.fnSort = function( aaSort )
-		{
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			oSettings.aaSorting = aaSort;
-			_fnSort( oSettings );
-		};
-		
-		/*
-		 * Function: fnSortListener
-		 * Purpose:  Attach a sort listener to an element for a given column
-		 * Returns:  -
-		 * Inputs:   node:nNode - the element to attach the sort listener to
-		 *           int:iColumn - the column that a click on this node will sort on
-		 *           function:fnCallback - callback function when sort is run - optional
-		 */
-		this.fnSortListener = function( nNode, iColumn, fnCallback )
-		{
-			_fnSortAttachListener( _fnSettingsFromNode( this[_oExt.iApiIndex] ), nNode, iColumn,
-			 	fnCallback );
-		};
-		
-		/*
-		 * Function: fnAddData
-		 * Purpose:  Add new row(s) into the table
-		 * Returns:  array int: array of indexes (aoData) which have been added (zero length on error)
-		 * Inputs:   array:mData - the data to be added. The length must match
-		 *               the original data from the DOM
-		 *             or
-		 *             array array:mData - 2D array of data to be added
-		 *           bool:bRedraw - redraw the table or not - default true
-		 * Notes:    Warning - the refilter here will cause the table to redraw
-		 *             starting at zero
-		 * Notes:    Thanks to Yekimov Denis for contributing the basis for this function!
-		 */
-		this.fnAddData = function( mData, bRedraw )
-		{
-			if ( mData.length === 0 )
-			{
-				return [];
-			}
-			
-			var aiReturn = [];
-			var iTest;
-			
-			/* Find settings from table node */
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			
-			/* Check if we want to add multiple rows or not */
-			if ( typeof mData[0] == "object" )
-			{
-				for ( var i=0 ; i<mData.length ; i++ )
-				{
-					iTest = _fnAddData( oSettings, mData[i] );
-					if ( iTest == -1 )
-					{
-						return aiReturn;
-					}
-					aiReturn.push( iTest );
-				}
-			}
-			else
-			{
-				iTest = _fnAddData( oSettings, mData );
-				if ( iTest == -1 )
-				{
-					return aiReturn;
-				}
-				aiReturn.push( iTest );
-			}
-			
-			oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
-			
-			if ( typeof bRedraw == 'undefined' || bRedraw )
-			{
-				_fnReDraw( oSettings );
-			}
-			return aiReturn;
-		};
-		
-		/*
-		 * Function: fnDeleteRow
-		 * Purpose:  Remove a row for the table
-		 * Returns:  array:aReturn - the row that was deleted
-		 * Inputs:   mixed:mTarget - 
-		 *             int: - index of aoData to be deleted, or
-		 *             node(TR): - TR element you want to delete
-		 *           function:fnCallBack - callback function - default null
-		 *           bool:bRedraw - redraw the table or not - default true
-		 */
-		this.fnDeleteRow = function( mTarget, fnCallBack, bRedraw )
-		{
-			/* Find settings from table node */
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			var i, iAODataIndex;
-			
-			iAODataIndex = (typeof mTarget == 'object') ? 
-				_fnNodeToDataIndex(oSettings, mTarget) : mTarget;
-			
-			/* Return the data array from this row */
-			var oData = oSettings.aoData.splice( iAODataIndex, 1 );
-			
-			/* Remove the target row from the search array */
-			var iDisplayIndex = $.inArray( iAODataIndex, oSettings.aiDisplay );
-			oSettings.asDataSearch.splice( iDisplayIndex, 1 );
-			
-			/* Delete from the display arrays */
-			_fnDeleteIndex( oSettings.aiDisplayMaster, iAODataIndex );
-			_fnDeleteIndex( oSettings.aiDisplay, iAODataIndex );
-			
-			/* If there is a user callback function - call it */
-			if ( typeof fnCallBack == "function" )
-			{
-				fnCallBack.call( this, oSettings, oData );
-			}
-			
-			/* Check for an 'overflow' they case for dislaying the table */
-			if ( oSettings._iDisplayStart >= oSettings.aiDisplay.length )
-			{
-				oSettings._iDisplayStart -= oSettings._iDisplayLength;
-				if ( oSettings._iDisplayStart < 0 )
-				{
-					oSettings._iDisplayStart = 0;
-				}
-			}
-			
-			if ( typeof bRedraw == 'undefined' || bRedraw )
-			{
-				_fnCalculateEnd( oSettings );
-				_fnDraw( oSettings );
-			}
-			
-			return oData;
-		};
-		
-		/*
-		 * Function: fnClearTable
-		 * Purpose:  Quickly and simply clear a table
-		 * Returns:  -
-		 * Inputs:   bool:bRedraw - redraw the table or not - default true
-		 * Notes:    Thanks to Yekimov Denis for contributing the basis for this function!
-		 */
-		this.fnClearTable = function( bRedraw )
-		{
-			/* Find settings from table node */
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			_fnClearTable( oSettings );
-			
-			if ( typeof bRedraw == 'undefined' || bRedraw )
-			{
-				_fnDraw( oSettings );
-			}
-		};
-		
-		/*
-		 * Function: fnOpen
-		 * Purpose:  Open a display row (append a row after the row in question)
-		 * Returns:  node:nNewRow - the row opened
-		 * Inputs:   node:nTr - the table row to 'open'
-		 *           string:sHtml - the HTML to put into the row
-		 *           string:sClass - class to give the new TD cell
-		 */
-		this.fnOpen = function( nTr, sHtml, sClass )
-		{
-			/* Find settings from table node */
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			
-			/* the old open one if there is one */
-			this.fnClose( nTr );
-			
-			var nNewRow = document.createElement("tr");
-			var nNewCell = document.createElement("td");
-			nNewRow.appendChild( nNewCell );
-			nNewCell.className = sClass;
-			nNewCell.colSpan = _fnVisbleColumns( oSettings );
-			nNewCell.innerHTML = sHtml;
-			
-			/* If the nTr isn't on the page at the moment - then we don't insert at the moment */
-			var nTrs = $('tr', oSettings.nTBody);
-			if ( $.inArray(nTr, nTrs) != -1 )
-			{
-				$(nNewRow).insertAfter(nTr);
-			}
-			
-			oSettings.aoOpenRows.push( {
-				"nTr": nNewRow,
-				"nParent": nTr
-			} );
-			
-			return nNewRow;
-		};
-		
-		/*
-		 * Function: fnClose
-		 * Purpose:  Close a display row
-		 * Returns:  int: 0 (success) or 1 (failed)
-		 * Inputs:   node:nTr - the table row to 'close'
-		 */
-		this.fnClose = function( nTr )
-		{
-			/* Find settings from table node */
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			
-			for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )
-			{
-				if ( oSettings.aoOpenRows[i].nParent == nTr )
-				{
-					var nTrParent = oSettings.aoOpenRows[i].nTr.parentNode;
-					if ( nTrParent )
-					{
-						/* Remove it if it is currently on display */
-						nTrParent.removeChild( oSettings.aoOpenRows[i].nTr );
-					}
-					oSettings.aoOpenRows.splice( i, 1 );
-					return 0;
-				}
-			}
-			return 1;
-		};
-		
-		/*
-		 * Function: fnGetData
-		 * Purpose:  Return an array with the data which is used to make up the table
-		 * Returns:  array array string: 2d data array ([row][column]) or array string: 1d data array
-		 *           or
-		 *           array string (if iRow specified)
-		 * Inputs:   mixed:mRow - optional - if not present, then the full 2D array for the table 
-		 *             if given then:
-		 *               int: - return 1D array for aoData entry of this index
-		 *               node(TR): - return 1D array for this TR element
-		 * Inputs:   int:iRow - optional - if present then the array returned will be the data for
-		 *             the row with the index 'iRow'
-		 */
-		this.fnGetData = function( mRow )
-		{
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			
-			if ( typeof mRow != 'undefined' )
-			{
-				var iRow = (typeof mRow == 'object') ? 
-					_fnNodeToDataIndex(oSettings, mRow) : mRow;
-				return ( (aRowData = oSettings.aoData[iRow]) ? aRowData._aData : null);
-			}
-			return _fnGetDataMaster( oSettings );
-		};
-		
-		/*
-		 * Function: fnGetNodes
-		 * Purpose:  Return an array with the TR nodes used for drawing the table
-		 * Returns:  array node: TR elements
-		 *           or
-		 *           node (if iRow specified)
-		 * Inputs:   int:iRow - optional - if present then the array returned will be the node for
-		 *             the row with the index 'iRow'
-		 */
-		this.fnGetNodes = function( iRow )
-		{
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			
-			if ( typeof iRow != 'undefined' )
-			{
-				return ( (aRowData = oSettings.aoData[iRow]) ? aRowData.nTr : null );
-			}
-			return _fnGetTrNodes( oSettings );
-		};
-		
-		/*
-		 * Function: fnGetPosition
-		 * Purpose:  Get the array indexes of a particular cell from it's DOM element
-		 * Returns:  int: - row index, or array[ int, int, int ]: - row index, column index (visible)
-		 *             and column index including hidden columns
-		 * Inputs:   node:nNode - this can either be a TR or a TD in the table, the return is
-		 *             dependent on this input
-		 */
-		this.fnGetPosition = function( nNode )
-		{
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			var i;
-			
-			if ( nNode.nodeName.toUpperCase() == "TR" )
-			{
-				return _fnNodeToDataIndex(oSettings, nNode);
-			}
-			else if ( nNode.nodeName.toUpperCase() == "TD" )
-			{
-				var iDataIndex = _fnNodeToDataIndex(oSettings, nNode.parentNode);
-				var iCorrector = 0;
-				for ( var j=0 ; j<oSettings.aoColumns.length ; j++ )
-				{
-					if ( oSettings.aoColumns[j].bVisible )
-					{
-						if ( oSettings.aoData[iDataIndex].nTr.getElementsByTagName('td')[j-iCorrector] == nNode )
-						{
-							return [ iDataIndex, j-iCorrector, j ];
-						}
-					}
-					else
-					{
-						iCorrector++;
-					}
-				}
-			}
-			return null;
-		};
-		
-		/*
-		 * Function: fnUpdate
-		 * Purpose:  Update a table cell or row
-		 * Returns:  int: 0 okay, 1 error
-		 * Inputs:   array string 'or' string:mData - data to update the cell/row with
-		 *           mixed:mRow - 
-		 *             int: - index of aoData to be updated, or
-		 *             node(TR): - TR element you want to update
-		 *           int:iColumn - the column to update - optional (not used of mData is 2D)
-		 *           bool:bRedraw - redraw the table or not - default true
-		 *           bool:bAction - perform predraw actions or not (you will want this as 'true' if
-		 *             you have bRedraw as true) - default true
-		 */
-		this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
-		{
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			var iVisibleColumn;
-			var sDisplay;
-			var iRow = (typeof mRow == 'object') ? 
-				_fnNodeToDataIndex(oSettings, mRow) : mRow;
-			
-			if ( typeof mData != 'object' )
-			{
-				sDisplay = mData;
-				oSettings.aoData[iRow]._aData[iColumn] = sDisplay;
-				
-				if ( oSettings.aoColumns[iColumn].fnRender !== null )
-				{
-					sDisplay = oSettings.aoColumns[iColumn].fnRender( {
-						"iDataRow": iRow,
-						"iDataColumn": iColumn,
-						"aData": oSettings.aoData[iRow]._aData,
-						"oSettings": oSettings
-					} );
-					
-					if ( oSettings.aoColumns[iColumn].bUseRendered )
-					{
-						oSettings.aoData[iRow]._aData[iColumn] = sDisplay;
-					}
-				}
-				
-				iVisibleColumn = _fnColumnIndexToVisible( oSettings, iColumn );
-				if ( iVisibleColumn !== null )
-				{
-					oSettings.aoData[iRow].nTr.getElementsByTagName('td')[iVisibleColumn].innerHTML = 
-						sDisplay;
-				}
-				else
-				{
-					oSettings.aoData[iRow]._anHidden[iColumn].innerHTML = sDisplay;
-				}
-			}
-			else
-			{
-				if ( mData.length != oSettings.aoColumns.length )
-				{
-					_fnLog( oSettings, 0, 'An array passed to fnUpdate must have the same number of '+
-						'columns as the table in question - in this case '+oSettings.aoColumns.length );
-					return 1;
-				}
-				
-				for ( var i=0 ; i<mData.length ; i++ )
-				{
-					sDisplay = mData[i];
-					oSettings.aoData[iRow]._aData[i] = sDisplay;
-					
-					if ( oSettings.aoColumns[i].fnRender !== null )
-					{
-						sDisplay = oSettings.aoColumns[i].fnRender( {
-							"iDataRow": iRow,
-							"iDataColumn": i,
-							"aData": oSettings.aoData[iRow]._aData,
-							"oSettings": oSettings
-						} );
-						
-						if ( oSettings.aoColumns[i].bUseRendered )
-						{
-							oSettings.aoData[iRow]._aData[i] = sDisplay;
-						}
-					}
-					
-					iVisibleColumn = _fnColumnIndexToVisible( oSettings, i );
-					if ( iVisibleColumn !== null )
-					{
-						oSettings.aoData[iRow].nTr.getElementsByTagName('td')[iVisibleColumn].innerHTML = 
-							sDisplay;
-					}
-					else
-					{
-						oSettings.aoData[iRow]._anHidden[i].innerHTML = sDisplay;
-					}
-				}
-			}
-			
-			/* Modify the search index for this row (strictly this is likely not needed, since fnReDraw
-			 * will rebuild the search array - however, the redraw might be disabled by the user)
-			 */
-			var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay );
-			oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow( oSettings, 
-				oSettings.aoData[iRow]._aData );
-			
-			/* Perform pre-draw actions */
-			if ( typeof bAction == 'undefined' || bAction )
-			{
-				_fnAjustColumnSizing( oSettings );
-			}
-			
-			/* Redraw the table */
-			if ( typeof bRedraw == 'undefined' || bRedraw )
-			{
-				_fnReDraw( oSettings );
-			}
-			return 0;
-		};
-		
-		
-		/*
-		 * Function: fnShowColoumn
-		 * Purpose:  Show a particular column
-		 * Returns:  -
-		 * Inputs:   int:iCol - the column whose display should be changed
-		 *           bool:bShow - show (true) or hide (false) the column
-		 *           bool:bRedraw - redraw the table or not - default true
-		 */
-		this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
-		{
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			var i, iLen;
-			var iColumns = oSettings.aoColumns.length;
-			var nTd, anTds, nCell, anTrs, jqChildren;
-			
-			/* No point in doing anything if we are requesting what is already true */
-			if ( oSettings.aoColumns[iCol].bVisible == bShow )
-			{
-				return;
-			}
-			
-			var nTrHead = $('>tr', oSettings.nTHead)[0];
-			var nTrFoot = $('>tr', oSettings.nTFoot)[0];
-			var anTheadTh = [];
-			var anTfootTh = [];
-			for ( i=0 ; i<iColumns ; i++ )
-			{
-				anTheadTh.push( oSettings.aoColumns[i].nTh );
-				anTfootTh.push( oSettings.aoColumns[i].nTf );
-			}
-			
-			/* Show the column */
-			if ( bShow )
-			{
-				var iInsert = 0;
-				for ( i=0 ; i<iCol ; i++ )
-				{
-					if ( oSettings.aoColumns[i].bVisible )
-					{
-						iInsert++;
-					}
-				}
-				
-				/* Need to decide if we should use appendChild or insertBefore */
-				if ( iInsert >= _fnVisbleColumns( oSettings ) )
-				{
-					nTrHead.appendChild( anTheadTh[iCol] );
-					anTrs = $('>tr', oSettings.nTHead);
-					for ( i=1, iLen=anTrs.length ; i<iLen ; i++ )
-					{
-						anTrs[i].appendChild( oSettings.aoColumns[iCol].anThExtra[i-1] );
-					}	
-					
-					if ( nTrFoot )
-					{
-						nTrFoot.appendChild( anTfootTh[iCol] );
-						anTrs = $('>tr', oSettings.nTFoot);
-						for ( i=1, iLen=anTrs.length ; i<iLen ; i++ )
-						{
-							anTrs[i].appendChild( oSettings.aoColumns[iCol].anTfExtra[i-1] );
-						}	
-					}
-					
-					for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
-					{
-						nTd = oSettings.aoData[i]._anHidden[iCol];
-						oSettings.aoData[i].nTr.appendChild( nTd );
-					}
-				}
-				else
-				{
-					/* Which coloumn should we be inserting before? */
-					var iBefore;
-					for ( i=iCol ; i<iColumns ; i++ )
-					{
-						iBefore = _fnColumnIndexToVisible( oSettings, i );
-						if ( iBefore !== null )
-						{
-							break;
-						}
-					}
-					
-					nTrHead.insertBefore( anTheadTh[iCol], nTrHead.getElementsByTagName('th')[iBefore] );
-					anTrs = $('>tr', oSettings.nTHead);
-					for ( i=1, iLen=anTrs.length ; i<iLen ; i++ )
-					{
-						jqChildren = $(anTrs[i]).children();
-						anTrs[i].insertBefore( oSettings.aoColumns[iCol].anThExtra[i-1], jqChildren[iBefore] );
-					}	
-					
-					if ( nTrFoot )
-					{
-						nTrFoot.insertBefore( anTfootTh[iCol], nTrFoot.getElementsByTagName('th')[iBefore] );
-						anTrs = $('>tr', oSettings.nTFoot);
-						for ( i=1, iLen=anTrs.length ; i<iLen ; i++ )
-						{
-							jqChildren = $(anTrs[i]).children();
-							anTrs[i].insertBefore( oSettings.aoColumns[iCol].anTfExtra[i-1], jqChildren[iBefore] );
-						}	
-					}
-					
-					anTds = _fnGetTdNodes( oSettings );
-					for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
-					{
-						nTd = oSettings.aoData[i]._anHidden[iCol];
-						oSettings.aoData[i].nTr.insertBefore( nTd, $('>td:eq('+iBefore+')', 
-							oSettings.aoData[i].nTr)[0] );
-					}
-				}
-				
-				oSettings.aoColumns[iCol].bVisible = true;
-			}
-			else
-			{
-				/* Remove a column from display */
-				nTrHead.removeChild( anTheadTh[iCol] );
-				for ( i=0, iLen=oSettings.aoColumns[iCol].anThExtra.length ; i<iLen ; i++ )
-				{
-					nCell = oSettings.aoColumns[iCol].anThExtra[i];
-					nCell.parentNode.removeChild( nCell );
-				}
-				
-				if ( nTrFoot )
-				{
-					nTrFoot.removeChild( anTfootTh[iCol] );
-					for ( i=0, iLen=oSettings.aoColumns[iCol].anTfExtra.length ; i<iLen ; i++ )
-					{
-						nCell = oSettings.aoColumns[iCol].anTfExtra[i];
-						nCell.parentNode.removeChild( nCell );
-					}
-				}
-				
-				anTds = _fnGetTdNodes( oSettings );
-				for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
-				{
-					nTd = anTds[ ( i*oSettings.aoColumns.length) + (iCol*1) ];
-					oSettings.aoData[i]._anHidden[iCol] = nTd;
-					nTd.parentNode.removeChild( nTd );
-				}
-				
-				oSettings.aoColumns[iCol].bVisible = false;
-			}
-			
-			/* If there are any 'open' rows, then we need to alter the colspan for this col change */
-			for ( i=0, iLen=oSettings.aoOpenRows.length ; i<iLen ; i++ )
-			{
-				oSettings.aoOpenRows[i].nTr.colSpan = _fnVisbleColumns( oSettings );
-			}
-			
-			/* Do a redraw incase anything depending on the table columns needs it 
-			 * (built-in: scrolling) 
-			 */
-			if ( typeof bRedraw == 'undefined' || bRedraw )
-			{
-				_fnAjustColumnSizing( oSettings );
-				_fnDraw( oSettings );
-			}
-			
-			_fnSaveState( oSettings );
-		};
-		
-		/*
-		 * Function: fnPageChange
-		 * Purpose:  Change the pagination
-		 * Returns:  -
-		 * Inputs:   string:sAction - paging action to take: "first", "previous", "next" or "last"
-		 *           bool:bRedraw - redraw the table or not - optional - default true
-		 */
-		this.fnPageChange = function ( sAction, bRedraw )
-		{
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			_fnPageChange( oSettings, sAction );
-			_fnCalculateEnd( oSettings );
-			
-			if ( typeof bRedraw == 'undefined' || bRedraw )
-			{
-				_fnDraw( oSettings );
-			}
-		};
-		
-		/*
-		 * Function: fnDestroy
-		 * Purpose:  Destructor for the DataTable
-		 * Returns:  -
-		 * Inputs:   -
-		 */
-		this.fnDestroy = function ( )
-		{
-			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
-			var nOrig = oSettings.nTableWrapper.parentNode;
-			var nBody = oSettings.nTBody;
-			var i, iLen;
-			
-			/* Flag to note that the table is currently being destoryed - no action should be taken */
-			oSettings.bDestroying = true;
-			
-			/* Blitz all DT events */
-			$(oSettings.nTableWrapper).find('*').andSelf().unbind('.DT');
-			
-			/* Restore hidden columns */
-			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-			{
-				if ( oSettings.aoColumns[i].bVisible === false )
-				{
-					this.fnSetColumnVis( i, true );
-				}
-			}
-			
-			/* If there is an 'empty' indicator row, remove it */
-			$('tbody>tr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove();
-			
-			/* When scrolling we had to break the table up - restore it */
-			if ( oSettings.nTable != oSettings.nTHead.parentNode )
-			{
-				$('>thead', oSettings.nTable).remove();
-				oSettings.nTable.appendChild( oSettings.nTHead );
-			}
-			
-			if ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode )
-			{
-				$('>tfoot', oSettings.nTable).remove();
-				oSettings.nTable.appendChild( oSettings.nTFoot );
-			}
-			
-			/* Remove the DataTables generated nodes, events and classes */
-			oSettings.nTable.parentNode.removeChild( oSettings.nTable );
-			$(oSettings.nTableWrapper).remove();
-			
-			oSettings.aaSorting = [];
-			oSettings.aaSortingFixed = [];
-			_fnSortingClasses( oSettings );
-			
-			$(_fnGetTrNodes( oSettings )).removeClass( oSettings.asStripClasses.join(' ') );
-			
-			if ( !oSettings.bJUI )
-			{
-				$('th', oSettings.nTHead).removeClass( [ _oExt.oStdClasses.sSortable,
-					_oExt.oStdClasses.sSortableAsc,
-					_oExt.oStdClasses.sSortableDesc,
-					_oExt.oStdClasses.sSortableNone ].join(' ')
-				);
-			}
-			else
-			{
-				$('th', oSettings.nTHead).removeClass( [ _oExt.oStdClasses.sSortable,
-					_oExt.oJUIClasses.sSortableAsc,
-					_oExt.oJUIClasses.sSortableDesc,
-					_oExt.oJUIClasses.sSortableNone ].join(' ')
-				);
-				$('th span', oSettings.nTHead).remove();
-			}
-			
-			/* Add the TR elements back into the table in their original order */
-			nOrig.appendChild( oSettings.nTable );
-			for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
-			{
-				nBody.appendChild( oSettings.aoData[i].nTr );
-			}
-			
-			/* Restore the width of the original table */
-			oSettings.nTable.style.width = _fnStringToCss(oSettings.sDestroyWidth);
-			
-			/* If the were originally odd/even type classes - then we add them back here. Note
-			 * this is not fool proof (for example if not all rows as odd/even classes - but 
-			 * it's a good effort without getting carried away
-			 */
-			$('>tr:even', nBody).addClass( oSettings.asDestoryStrips[0] );
-			$('>tr:odd', nBody).addClass( oSettings.asDestoryStrips[1] );
-			
-			/* Remove the settings object from the settings array */
-			for ( i=0, iLen=_aoSettings.length ; i<iLen ; i++ )
-			{
-				if ( _aoSettings[i] == oSettings )
-				{
-					_aoSettings.splice( i, 1 );
-				}
-			}
-			
-			/* End it all */
-			oSettings = null;
-		};
-		
-		/*
-		 * Function: fnAjustColumnSizing
-		 * Purpose:  Update tale sizing based on content. This would most likely be used for scrolling
-		 *   and will typically need a redraw after it.
-		 * Returns:  -
-		 * Inputs:   bool:bRedraw - redraw the table or not, you will typically want to - default true
-		 */
-		this.fnAdjustColumnSizing = function ( bRedraw )
-		{
-			var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
-			_fnAjustColumnSizing( oSettings );
-			
-			if ( typeof bRedraw == 'undefined' || bRedraw )
-			{
-				this.fnDraw( false );
-			}
-			else if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
-			{
-				/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
-				this.oApi._fnScrollDraw(oSettings);
-			}
-		};
-		
-		/*
-		 * Plugin API functions
-		 * 
-		 * This call will add the functions which are defined in _oExt.oApi to the
-		 * DataTables object, providing a rather nice way to allow plug-in API functions. Note that
-		 * this is done here, so that API function can actually override the built in API functions if
-		 * required for a particular purpose.
-		 */
-		
-		/*
-		 * Function: _fnExternApiFunc
-		 * Purpose:  Create a wrapper function for exporting an internal func to an external API func
-		 * Returns:  function: - wrapped function
-		 * Inputs:   string:sFunc - API function name
-		 */
-		function _fnExternApiFunc (sFunc)
-		{
-			return function() {
-					var aArgs = [_fnSettingsFromNode(this[_oExt.iApiIndex])].concat( 
-						Array.prototype.slice.call(arguments) );
-					return _oExt.oApi[sFunc].apply( this, aArgs );
-				};
-		}
-		
-		for ( var sFunc in _oExt.oApi )
-		{
-			if ( sFunc )
-			{
-				/*
-				 * Function: anon
-				 * Purpose:  Wrap the plug-in API functions in order to provide the settings as 1st arg 
-				 *   and execute in this scope
-				 * Returns:  -
-				 * Inputs:   -
-				 */
-				this[sFunc] = _fnExternApiFunc(sFunc);
-			}
-		}
-		
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Local functions
-		 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Initalisation
-		 */
-		
-		/*
-		 * Function: _fnInitalise
-		 * Purpose:  Draw the table for the first time, adding all required features
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnInitalise ( oSettings )
-		{
-			var i, iLen;
-			
-			/* Ensure that the table data is fully initialised */
-			if ( oSettings.bInitialised === false )
-			{
-				setTimeout( function(){ _fnInitalise( oSettings ); }, 200 );
-				return;
-			}
-			
-			/* Show the display HTML options */
-			_fnAddOptionsHtml( oSettings );
-			
-			/* Draw the headers for the table */
-			_fnDrawHead( oSettings );
-			
-			/* Okay to show that something is going on now */
-			_fnProcessingDisplay( oSettings, true );
-			
-			/* Calculate sizes for columns */
-			if ( oSettings.oFeatures.bAutoWidth )
-			{
-				_fnCalculateColumnWidths( oSettings );
-			}
-			
-			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-			{
-				if ( oSettings.aoColumns[i].sWidth !== null )
-				{
-					oSettings.aoColumns[i].nTh.style.width = _fnStringToCss( oSettings.aoColumns[i].sWidth );
-				}
-			}
-			
-			/* If there is default sorting required - let's do it. The sort function will do the
-			 * drawing for us. Otherwise we draw the table regardless of the Ajax source - this allows
-			 * the table to look initialised for Ajax sourcing data (show 'loading' message possibly)
-			 */
-			if ( oSettings.oFeatures.bSort )
-			{
-				_fnSort( oSettings );
-			}
-			else
-			{
-				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
-				_fnCalculateEnd( oSettings );
-				_fnDraw( oSettings );
-			}
-			
-			/* if there is an ajax source load the data */
-			if ( oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
-			{
-				oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, [], function(json) {
-					/* Got the data - add it to the table */
-					for ( i=0 ; i<json.aaData.length ; i++ )
-					{
-						_fnAddData( oSettings, json.aaData[i] );
-					}
-					
-					/* Reset the init display for cookie saving. We've already done a filter, and
-					 * therefore cleared it before. So we need to make it appear 'fresh'
-					 */
-					oSettings.iInitDisplayStart = oSettings._iDisplayStart;
-					
-					if ( oSettings.oFeatures.bSort )
-					{
-						_fnSort( oSettings );
-					}
-					else
-					{
-						oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
-						_fnCalculateEnd( oSettings );
-						_fnDraw( oSettings );
-					}
-					
-					_fnProcessingDisplay( oSettings, false );
-					_fnInitComplete( oSettings, json );
-				} );
-				return;
-			}
-			
-			/* Server-side processing initialisation complete is done at the end of _fnDraw */
-			if ( !oSettings.oFeatures.bServerSide )
-			{
-				_fnProcessingDisplay( oSettings, false );
-				_fnInitComplete( oSettings );
-			}
-		}
-		
-		/*
-		 * Function: _fnInitalise
-		 * Purpose:  Draw the table for the first time, adding all required features
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnInitComplete ( oSettings, json )
-		{
-			oSettings._bInitComplete = true;
-			if ( typeof oSettings.fnInitComplete == 'function' )
-			{
-				if ( typeof json != 'undefined' )
-				{
-					oSettings.fnInitComplete.call( oSettings.oInstance, oSettings, json );
-				}
-				else
-				{
-					oSettings.fnInitComplete.call( oSettings.oInstance, oSettings );
-				}
-			}
-		}
-		
-		/*
-		 * Function: _fnLanguageProcess
-		 * Purpose:  Copy language variables from remote object to a local one
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           object:oLanguage - Language information
-		 *           bool:bInit - init once complete
-		 */
-		function _fnLanguageProcess( oSettings, oLanguage, bInit )
-		{
-			_fnMap( oSettings.oLanguage, oLanguage, 'sProcessing' );
-			_fnMap( oSettings.oLanguage, oLanguage, 'sLengthMenu' );
-			_fnMap( oSettings.oLanguage, oLanguage, 'sEmptyTable' );
-			_fnMap( oSettings.oLanguage, oLanguage, 'sZeroRecords' );
-			_fnMap( oSettings.oLanguage, oLanguage, 'sInfo' );
-			_fnMap( oSettings.oLanguage, oLanguage, 'sInfoEmpty' );
-			_fnMap( oSettings.oLanguage, oLanguage, 'sInfoFiltered' );
-			_fnMap( oSettings.oLanguage, oLanguage, 'sInfoPostFix' );
-			_fnMap( oSettings.oLanguage, oLanguage, 'sSearch' );
-			
-			if ( typeof oLanguage.oPaginate != 'undefined' )
-			{
-				_fnMap( oSettings.oLanguage.oPaginate, oLanguage.oPaginate, 'sFirst' );
-				_fnMap( oSettings.oLanguage.oPaginate, oLanguage.oPaginate, 'sPrevious' );
-				_fnMap( oSettings.oLanguage.oPaginate, oLanguage.oPaginate, 'sNext' );
-				_fnMap( oSettings.oLanguage.oPaginate, oLanguage.oPaginate, 'sLast' );
-			}
-			
-			/* Backwards compatibility - if there is no sEmptyTable given, then use the same as
-			 * sZeroRecords - assuming that is given.
-			 */
-			if ( typeof oLanguage.sEmptyTable == 'undefined' && 
-			     typeof oLanguage.sZeroRecords != 'undefined' )
-			{
-				_fnMap( oSettings.oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' );
-			}
-			
-			if ( bInit )
-			{
-				_fnInitalise( oSettings );
-			}
-		}
-		
-		/*
-		 * Function: _fnAddColumn
-		 * Purpose:  Add a column to the list used for the table with default values
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           node:nTh - the th element for this column
-		 */
-		function _fnAddColumn( oSettings, nTh )
-		{
-			oSettings.aoColumns[ oSettings.aoColumns.length++ ] = {
-				"sType": null,
-				"_bAutoType": true,
-				"bVisible": true,
-				"bSearchable": true,
-				"bSortable": true,
-				"asSorting": [ 'asc', 'desc' ],
-				"sSortingClass": oSettings.oClasses.sSortable,
-				"sSortingClassJUI": oSettings.oClasses.sSortJUI,
-				"sTitle": nTh ? nTh.innerHTML : '',
-				"sName": '',
-				"sWidth": null,
-				"sWidthOrig": null,
-				"sClass": null,
-				"fnRender": null,
-				"bUseRendered": true,
-				"iDataSort": oSettings.aoColumns.length-1,
-				"sSortDataType": 'std',
-				"nTh": nTh ? nTh : document.createElement('th'),
-				"nTf": null,
-				"anThExtra": [],
-				"anTfExtra": []
-			};
-			
-			var iCol = oSettings.aoColumns.length-1;
-			var oCol = oSettings.aoColumns[ iCol ];
-			
-			/* Add a column specific filter */
-			if ( typeof oSettings.aoPreSearchCols[ iCol ] == 'undefined' ||
-			     oSettings.aoPreSearchCols[ iCol ] === null )
-			{
-				oSettings.aoPreSearchCols[ iCol ] = {
-					"sSearch": "",
-					"bRegex": false,
-					"bSmart": true
-				};
-			}
-			else
-			{
-				/* Don't require that the user must specify bRegex and / or bSmart */
-				if ( typeof oSettings.aoPreSearchCols[ iCol ].bRegex == 'undefined' )
-				{
-					oSettings.aoPreSearchCols[ iCol ].bRegex = true;
-				}
-				
-				if ( typeof oSettings.aoPreSearchCols[ iCol ].bSmart == 'undefined' )
-				{
-					oSettings.aoPreSearchCols[ iCol ].bSmart = true;
-				}
-			} 
-			
-			/* Use the column options function to initialise classes etc */
-			_fnColumnOptions( oSettings, iCol, null );
-		}
-		
-		/*
-		 * Function: _fnColumnOptions
-		 * Purpose:  Apply options for a column
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           int:iCol - column index to consider
-		 *           object:oOptions - object with sType, bVisible and bSearchable
-		 */
-		function _fnColumnOptions( oSettings, iCol, oOptions )
-		{
-			var oCol = oSettings.aoColumns[ iCol ];
-			
-			/* User specified column options */
-			if ( typeof oOptions != 'undefined' && oOptions !== null )
-			{
-				if ( typeof oOptions.sType != 'undefined' )
-				{
-					oCol.sType = oOptions.sType;
-					oCol._bAutoType = false;
-				}
-				
-				_fnMap( oCol, oOptions, "bVisible" );
-				_fnMap( oCol, oOptions, "bSearchable" );
-				_fnMap( oCol, oOptions, "bSortable" );
-				_fnMap( oCol, oOptions, "sTitle" );
-				_fnMap( oCol, oOptions, "sName" );
-				_fnMap( oCol, oOptions, "sWidth" );
-				_fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
-				_fnMap( oCol, oOptions, "sClass" );
-				_fnMap( oCol, oOptions, "fnRender" );
-				_fnMap( oCol, oOptions, "bUseRendered" );
-				_fnMap( oCol, oOptions, "iDataSort" );
-				_fnMap( oCol, oOptions, "asSorting" );
-				_fnMap( oCol, oOptions, "sSortDataType" );
-			}
-			
-			/* Feature sorting overrides column specific when off */
-			if ( !oSettings.oFeatures.bSort )
-			{
-				oCol.bSortable = false;
-			}
-			
-			/* Check that the class assignment is correct for sorting */
-			if ( !oCol.bSortable ||
-					 ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) )
-			{
-				oCol.sSortingClass = oSettings.oClasses.sSortableNone;
-				oCol.sSortingClassJUI = "";
-			}
-			else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 )
-			{
-				oCol.sSortingClass = oSettings.oClasses.sSortableAsc;
-				oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed;
-			}
-			else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 )
-			{
-				oCol.sSortingClass = oSettings.oClasses.sSortableDesc;
-				oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed;
-			}
-		}
-		
-		/*
-		 * Function: _fnAddData
-		 * Purpose:  Add a data array to the table, creating DOM node etc
-		 * Returns:  int: - >=0 if successful (index of new aoData entry), -1 if failed
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           array:aData - data array to be added
-		 * Notes:    There are two basic methods for DataTables to get data to display - a JS array
-		 *   (which is dealt with by this function), and the DOM, which has it's own optimised
-		 *   function (_fnGatherData). Be careful to make the same changes here as there and vice-versa
-		 */
-		function _fnAddData ( oSettings, aDataSupplied )
-		{
-			/* Sanity check the length of the new array */
-			if ( aDataSupplied.length != oSettings.aoColumns.length &&
-				oSettings.iDrawError != oSettings.iDraw )
-			{
-				_fnLog( oSettings, 0, "Added data (size "+aDataSupplied.length+") does not match known "+
-					"number of columns ("+oSettings.aoColumns.length+")" );
-				oSettings.iDrawError = oSettings.iDraw;
-				return -1;
-			}
-			
-			
-			/* Create the object for storing information about this new row */
-			var aData = aDataSupplied.slice();
-			var iThisIndex = oSettings.aoData.length;
-			oSettings.aoData.push( {
-				"nTr": document.createElement('tr'),
-				"_iId": oSettings.iNextId++,
-				"_aData": aData,
-				"_anHidden": [],
-				"_sRowStripe": ''
-			} );
-			
-			/* Create the cells */
-			var nTd, sThisType;
-			for ( var i=0 ; i<aData.length ; i++ )
-			{
-				nTd = document.createElement('td');
-				
-				/* Allow null data (from a data array) - simply deal with it as a blank string */
-				if ( aData[i] === null )
-				{
-					aData[i] = '';
-				}
-				
-				if ( typeof oSettings.aoColumns[i].fnRender == 'function' )
-				{
-					var sRendered = oSettings.aoColumns[i].fnRender( {
-							"iDataRow": iThisIndex,
-							"iDataColumn": i,
-							"aData": aData,
-							"oSettings": oSettings
-						} );
-					nTd.innerHTML = sRendered;
-					if ( oSettings.aoColumns[i].bUseRendered )
-					{
-						/* Use the rendered data for filtering/sorting */
-						oSettings.aoData[iThisIndex]._aData[i] = sRendered;
-					}
-				}
-				else
-				{
-					nTd.innerHTML = aData[i];
-				}
-				
-				/* Cast everything as a string - so we can treat everything equally when sorting */
-				if ( typeof aData[i] != 'string' )
-				{
-					aData[i] += "";
-				}
-				aData[i] = $.trim(aData[i]);
-				
-				/* Add user defined class */
-				if ( oSettings.aoColumns[i].sClass !== null )
-				{
-					nTd.className = oSettings.aoColumns[i].sClass;
-				}
-				
-				/* See if we should auto-detect the column type */
-				if ( oSettings.aoColumns[i]._bAutoType && oSettings.aoColumns[i].sType != 'string' )
-				{
-					/* Attempt to auto detect the type - same as _fnGatherData() */
-					sThisType = _fnDetectType( oSettings.aoData[iThisIndex]._aData[i] );
-					if ( oSettings.aoColumns[i].sType === null )
-					{
-						oSettings.aoColumns[i].sType = sThisType;
-					}
-					else if ( oSettings.aoColumns[i].sType != sThisType )
-					{
-						/* String is always the 'fallback' option */
-						oSettings.aoColumns[i].sType = 'string';
-					}
-				}
-					
-				if ( oSettings.aoColumns[i].bVisible )
-				{
-					oSettings.aoData[iThisIndex].nTr.appendChild( nTd );
-					oSettings.aoData[iThisIndex]._anHidden[i] = null;
-				}
-				else
-				{
-					oSettings.aoData[iThisIndex]._anHidden[i] = nTd;
-				}
-			}
-			
-			/* Add to the display array */
-			oSettings.aiDisplayMaster.push( iThisIndex );
-			return iThisIndex;
-		}
-		
-		/*
-		 * Function: _fnGatherData
-		 * Purpose:  Read in the data from the target table from the DOM
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 * Notes:    This is a optimised version of _fnAddData (more or less) for reading information
-		 *   from the DOM. The basic actions must be identical in the two functions.
-		 */
-		function _fnGatherData( oSettings )
-		{
-			var iLoop, i, iLen, j, jLen, jInner,
-			 	nTds, nTrs, nTd, aLocalData, iThisIndex,
-				iRow, iRows, iColumn, iColumns;
-			
-			/*
-			 * Process by row first
-			 * Add the data object for the whole table - storing the tr node. Note - no point in getting
-			 * DOM based data if we are going to go and replace it with Ajax source data.
-			 */
-			if ( oSettings.sAjaxSource === null )
-			{
-				nTrs = oSettings.nTBody.childNodes;
-				for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
-				{
-					if ( nTrs[i].nodeName.toUpperCase() == "TR" )
-					{
-						iThisIndex = oSettings.aoData.length;
-						oSettings.aoData.push( {
-							"nTr": nTrs[i],
-							"_iId": oSettings.iNextId++,
-							"_aData": [],
-							"_anHidden": [],
-							"_sRowStripe": ''
-						} );
-						
-						oSettings.aiDisplayMaster.push( iThisIndex );
-						
-						aLocalData = oSettings.aoData[iThisIndex]._aData;
-						nTds = nTrs[i].childNodes;
-						jInner = 0;
-						
-						for ( j=0, jLen=nTds.length ; j<jLen ; j++ )
-						{
-							if ( nTds[j].nodeName.toUpperCase() == "TD" )
-							{
-								aLocalData[jInner] = $.trim(nTds[j].innerHTML);
-								jInner++;
-							}
-						}
-					}
-				}
-			}
-			
-			/* Gather in the TD elements of the Table - note that this is basically the same as
-			 * fnGetTdNodes, but that function takes account of hidden columns, which we haven't yet
-			 * setup!
-			 */
-			nTrs = _fnGetTrNodes( oSettings );
-			nTds = [];
-			for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
-			{
-				for ( j=0, jLen=nTrs[i].childNodes.length ; j<jLen ; j++ )
-				{
-					nTd = nTrs[i].childNodes[j];
-					if ( nTd.nodeName.toUpperCase() == "TD" )
-					{
-						nTds.push( nTd );
-					}
-				}
-			}
-			
-			/* Sanity check */
-			if ( nTds.length != nTrs.length * oSettings.aoColumns.length )
-			{
-				_fnLog( oSettings, 1, "Unexpected number of TD elements. Expected "+
-					(nTrs.length * oSettings.aoColumns.length)+" and got "+nTds.length+". DataTables does "+
-					"not support rowspan / colspan in the table body, and there must be one cell for each "+
-					"row/column combination." );
-			}
-			
-			/* Now process by column */
-			for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
-			{
-				/* Get the title of the column - unless there is a user set one */
-				if ( oSettings.aoColumns[iColumn].sTitle === null )
-				{
-					oSettings.aoColumns[iColumn].sTitle = oSettings.aoColumns[iColumn].nTh.innerHTML;
-				}
-				
-				var
-					bAutoType = oSettings.aoColumns[iColumn]._bAutoType,
-					bRender = typeof oSettings.aoColumns[iColumn].fnRender == 'function',
-					bClass = oSettings.aoColumns[iColumn].sClass !== null,
-					bVisible = oSettings.aoColumns[iColumn].bVisible,
-					nCell, sThisType, sRendered;
-				
-				/* A single loop to rule them all (and be more efficient) */
-				if ( bAutoType || bRender || bClass || !bVisible )
-				{
-					for ( iRow=0, iRows=oSettings.aoData.length ; iRow<iRows ; iRow++ )
-					{
-						nCell = nTds[ (iRow*iColumns) + iColumn ];
-						
-						/* Type detection */
-						if ( bAutoType )
-						{
-							if ( oSettings.aoColumns[iColumn].sType != 'string' )
-							{
-								sThisType = _fnDetectType( oSettings.aoData[iRow]._aData[iColumn] );
-								if ( oSettings.aoColumns[iColumn].sType === null )
-								{
-									oSettings.aoColumns[iColumn].sType = sThisType;
-								}
-								else if ( oSettings.aoColumns[iColumn].sType != sThisType )
-								{
-									/* String is always the 'fallback' option */
-									oSettings.aoColumns[iColumn].sType = 'string';
-								}
-							}
-						}
-						
-						/* Rendering */
-						if ( bRender )
-						{
-							sRendered = oSettings.aoColumns[iColumn].fnRender( {
-									"iDataRow": iRow,
-									"iDataColumn": iColumn,
-									"aData": oSettings.aoData[iRow]._aData,
-									"oSettings": oSettings
-								} );
-							nCell.innerHTML = sRendered;
-							if ( oSettings.aoColumns[iColumn].bUseRendered )
-							{
-								/* Use the rendered data for filtering/sorting */
-								oSettings.aoData[iRow]._aData[iColumn] = sRendered;
-							}
-						}
-						
-						/* Classes */
-						if ( bClass )
-						{
-							nCell.className += ' '+oSettings.aoColumns[iColumn].sClass;
-						}
-						
-						/* Column visability */
-						if ( !bVisible )
-						{
-							oSettings.aoData[iRow]._anHidden[iColumn] = nCell;
-							nCell.parentNode.removeChild( nCell );
-						}
-						else
-						{
-							oSettings.aoData[iRow]._anHidden[iColumn] = null;
-						}
-					}
-				}
-			}
-		}
-		
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Drawing functions
-		 */
-		
-		/*
-		 * Function: _fnDrawHead
-		 * Purpose:  Create the HTML header for the table
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnDrawHead( oSettings )
-		{
-			var i, nTh, iLen, j, jLen;
-			var anTr = oSettings.nTHead.getElementsByTagName('tr');
-			var iThs = oSettings.nTHead.getElementsByTagName('th').length;
-			var iCorrector = 0;
-			var jqChildren;
-			
-			/* If there is a header in place - then use it - otherwise it's going to get nuked... */
-			if ( iThs !== 0 )
-			{
-				/* We've got a thead from the DOM, so remove hidden columns and apply width to vis cols */
-				for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-				{
-					nTh = oSettings.aoColumns[i].nTh;
-					
-					if ( oSettings.aoColumns[i].sClass !== null )
-					{
-						$(nTh).addClass( oSettings.aoColumns[i].sClass );
-					}
-					
-					/* Cache and remove (if needed) any extra elements for this column in the header */
-					for ( j=1, jLen=anTr.length ; j<jLen ; j++ )
-					{
-						jqChildren = $(anTr[j]).children();
-						oSettings.aoColumns[i].anThExtra.push( jqChildren[i-iCorrector] );
-						if ( !oSettings.aoColumns[i].bVisible )
-						{
-							anTr[j].removeChild( jqChildren[i-iCorrector] );
-						}
-					}
-					
-					if ( oSettings.aoColumns[i].bVisible )
-					{
-						/* Set the title of the column if it is user defined (not what was auto detected) */
-						if ( oSettings.aoColumns[i].sTitle != nTh.innerHTML )
-						{
-							nTh.innerHTML = oSettings.aoColumns[i].sTitle;
-						}
-					}
-					else
-					{
-						nTh.parentNode.removeChild( nTh );
-						iCorrector++;
-					}
-				}
-			}
-			else
-			{
-				/* We don't have a header in the DOM - so we are going to have to create one */
-				var nTr = document.createElement( "tr" );
-				
-				for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-				{
-					nTh = oSettings.aoColumns[i].nTh;
-					nTh.innerHTML = oSettings.aoColumns[i].sTitle;
-					
-					if ( oSettings.aoColumns[i].sClass !== null )
-					{
-						$(nTh).addClass( oSettings.aoColumns[i].sClass );
-					}
-					
-					if ( oSettings.aoColumns[i].bVisible )
-					{
-						nTr.appendChild( nTh );
-					}
-				}
-				$(oSettings.nTHead).html( '' )[0].appendChild( nTr );
-			}
-			
-			/* Add the extra markup needed by jQuery UI's themes */
-			if ( oSettings.bJUI )
-			{
-				for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-				{
-					nTh = oSettings.aoColumns[i].nTh;
-					
-					var nDiv = document.createElement('div');
-					nDiv.className = oSettings.oClasses.sSortJUIWrapper;
-					$(nTh).contents().appendTo(nDiv);
-					
-					nDiv.appendChild( document.createElement('span') );
-					nTh.appendChild( nDiv );
-				}
-			}
-			
-			/* Add sort listener */
-			var fnNoSelect = function (e) {
-				this.onselectstart = function() { return false; };
-				return false;
-			};
-			
-			if ( oSettings.oFeatures.bSort )
-			{
-				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
-				{
-					if ( oSettings.aoColumns[i].bSortable !== false )
-					{
-						_fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );
-						
-						/* Take the brutal approach to cancelling text selection in header */
-						$(oSettings.aoColumns[i].nTh).bind( 'mousedown.DT', fnNoSelect );
-					}
-					else
-					{
-						$(oSettings.aoColumns[i].nTh).addClass( oSettings.oClasses.sSortableNone );
-					}
-				}
-			}
-			
-			/* Cache the footer elements */
-			if ( oSettings.nTFoot !== null )
-			{
-				iCorrector = 0;
-				anTr = oSettings.nTFoot.getElementsByTagName('tr');
-				var nTfs = anTr[0].getElementsByTagName('th');
-				
-				for ( i=0, iLen=nTfs.length ; i<iLen ; i++ )
-				{
-					if ( typeof oSettings.aoColumns[i] != 'undefined' )
-					{
-						oSettings.aoColumns[i].nTf = nTfs[i-iCorrector];
-						
-						if ( oSettings.oClasses.sFooterTH !== "" )
-						{
-							oSettings.aoColumns[i].nTf.className += " "+oSettings.oClasses.sFooterTH;
-						}
-						
-						/* Deal with any extra elements for this column from the footer */
-						for ( j=1, jLen=anTr.length ; j<jLen ; j++ )
-						{
-							jqChildren = $(anTr[j]).children();
-							oSettings.aoColumns[i].anTfExtra.push( jqChildren[i-iCorrector] );
-							if ( !oSettings.aoColumns[i].bVisible )
-							{
-								anTr[j].removeChild( jqChildren[i-iCorrector] );
-							}
-						}
-						
-						if ( !oSettings.aoColumns[i].bVisible )
-						{
-							nTfs[i-iCorrector].parentNode.removeChild( nTfs[i-iCorrector] );
-							iCorrector++;
-						}
-					}
-				}
-			}
-		}
-		
-		/*
-		 * Function: _fnDraw
-		 * Purpose:  Insert the required TR nodes into the table for display
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnDraw( oSettings )
-		{
-			var i, iLen;
-			var anRows = [];
-			var iRowCount = 0;
-			var bRowError = false;
-			var iStrips = oSettings.asStripClasses.length;
-			var iOpenRows = oSettings.aoOpenRows.length;
-			
-			oSettings.bDrawing = true;
-			
-			/* Check and see if we have an initial draw position from state saving */
-			if ( typeof oSettings.iInitDisplayStart != 'undefined' && oSettings.iInitDisplayStart != -1 )
-			{
-				if ( oSettings.oFeatures.bServerSide )
-				{
-					oSettings._iDisplayStart = oSettings.iInitDisplayStart;
-				}
-				else
-				{
-					oSettings._iDisplayStart = (oSettings.iInitDisplayStart >= oSettings.fnRecordsDisplay()) ?
-						0 : oSettings.iInitDisplayStart;
-				}
-				oSettings.iInitDisplayStart = -1;
-				_fnCalculateEnd( oSettings );
-			}
-			
-			/* If we are dealing with Ajax - do it here */
-			if ( !oSettings.bDestroying && oSettings.oFeatures.bServerSide && 
-			     !_fnAjaxUpdate( oSettings ) )
-			{
-				return;
-			}
-			else if ( !oSettings.oFeatures.bServerSide )
-			{
-				oSettings.iDraw++;
-			}
-			
-			if ( oSettings.aiDisplay.length !== 0 )
-			{
-				var iStart = oSettings._iDisplayStart;
-				var iEnd = oSettings._iDisplayEnd;
-				
-				if ( oSettings.oFeatures.bServerSide )
-				{
-					iStart = 0;
-					iEnd = oSettings.aoData.length;
-				}
-				
-				for ( var j=iStart ; j<iEnd ; j++ )
-				{
-					var aoData = oSettings.aoData[ oSettings.aiDisplay[j] ];
-					var nRow = aoData.nTr;
-					
-					/* Remove the old stripping classes and then add the new one */
-					if ( iStrips !== 0 )
-					{
-						var sStrip = oSettings.asStripClasses[ iRowCount % iStrips ];
-						if ( aoData._sRowStripe != sStrip )
-						{
-							$(nRow).removeClass( aoData._sRowStripe ).addClass( sStrip );
-							aoData._sRowStripe = sStrip;
-						}
-					}
-					
-					/* Custom row callback function - might want to manipule the row */
-					if ( typeof oSettings.fnRowCallback == "function" )
-					{
-						nRow = oSettings.fnRowCallback.call( oSettings.oInstance, nRow, 
-							oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j );
-						if ( !nRow && !bRowError )
-						{
-							_fnLog( oSettings, 0, "A node was not returned by fnRowCallback" );
-							bRowError = true;
-						}
-					}
-					
-					anRows.push( nRow );
-					iRowCount++;
-					
-					/* If there is an open row - and it is attached to this parent - attach it on redraw */
-					if ( iOpenRows !== 0 )
-					{
-						for ( var k=0 ; k<iOpenRows ; k++ )
-						{
-							if ( nRow == oSettings.aoOpenRows[k].nParent )
-							{
-								anRows.push( oSettings.aoOpenRows[k].nTr );
-							}
-						}
-					}
-				}
-			}
-			else
-			{
-				/* Table is empty - create a row with an empty message in it */
-				anRows[ 0 ] = document.createElement( 'tr' );
-				
-				if ( typeof oSettings.asStripClasses[0] != 'undefined' )
-				{
-					anRows[ 0 ].className = oSettings.asStripClasses[0];
-				}
-				
-				var nTd = document.createElement( 'td' );
-				nTd.setAttribute( 'valign', "top" );
-				nTd.colSpan = _fnVisbleColumns( oSettings );
-				nTd.className = oSettings.oClasses.sRowEmpty;
-				if ( typeof oSettings.oLanguage.sEmptyTable != 'undefined' &&
-				     oSettings.fnRecordsTotal() === 0 )
-				{
-					nTd.innerHTML = oSettings.oLanguage.sEmptyTable;
-				}
-				else
-				{
-					nTd.innerHTML = oSettings.oLanguage.sZeroRecords.replace(
-						'_MAX_', oSettings.fnFormatNumber(oSettings.fnRecordsTotal()) );
-				}
-				
-				anRows[ iRowCount ].appendChild( nTd );
-			}
-			
-			/* Callback the header and footer custom funcation if there is one */
-			if ( typeof oSettings.fnHeaderCallback == 'function' )
-			{
-				oSettings.fnHeaderCallback.call( oSettings.oInstance, $('>tr', oSettings.nTHead)[0], 
-					_fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(),
-					oSettings.aiDisplay );
-			}
-			
-			if ( typeof oSettings.fnFooterCallback == 'function' )
-			{
-				oSettings.fnFooterCallback.call( oSettings.oInstance, $('>tr', oSettings.nTFoot)[0], 
-					_fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(),
-					oSettings.aiDisplay );
-			}
-			
-			/* 
-			 * Need to remove any old row from the display - note we can't just empty the tbody using
-			 * $().html('') since this will unbind the jQuery event handlers (even although the node 
-			 * still exists!) - equally we can't use innerHTML, since IE throws an exception.
-			 */
-			var
-				nAddFrag = document.createDocumentFragment(),
-				nRemoveFrag = document.createDocumentFragment(),
-				nBodyPar, nTrs;
-			
-			if ( oSettings.nTBody )
-			{
-				nBodyPar = oSettings.nTBody.parentNode;
-				nRemoveFrag.appendChild( oSettings.nTBody );
-				
-				/* When doing infinite scrolling, only remove child rows when sorting, filtering or start
-				 * up. When not infinite scroll, always do it.
-				 */
-				if ( !oSettings.oScroll.bInfinite || !oSettings._bInitComplete ||
-				 	oSettings.bSorted || oSettings.bFiltered )
-				{
-					nTrs = oSettings.nTBody.childNodes;
-					for ( i=nTrs.length-1 ; i>=0 ; i-- )
-					{
-						nTrs[i].parentNode.removeChild( nTrs[i] );
-					}
-				}
-				
-				/* Put the draw table into the dom */
-				for ( i=0, iLen=anRows.length ; i<iLen ; i++ )
-				{
-					nAddFrag.appendChild( anRows[i] );
-				}
-				
-				oSettings.nTBody.appendChild( nAddFrag );
-				if ( nBodyPar !== null )
-				{
-					nBodyPar.appendChild( oSettings.nTBody );
-				}
-			}
-			
-			/* Call all required callback functions for the end of a draw */
-			for ( i=oSettings.aoDrawCallback.length-1 ; i>=0 ; i-- )
-			{
-				oSettings.aoDrawCallback[i].fn.call( oSettings.oInstance, oSettings );
-			}
-			
-			/* Draw is complete, sorting and filtering must be as well */
-			oSettings.bSorted = false;
-			oSettings.bFiltered = false;
-			oSettings.bDrawing = false;
-			
-			if ( oSettings.oFeatures.bServerSide )
-			{
-				_fnProcessingDisplay( oSettings, false );
-				if ( typeof oSettings._bInitComplete == 'undefined' )
-				{
-					_fnInitComplete( oSettings );
-				}
-			}
-		}
-		
-		/*
-		 * Function: _fnReDraw
-		 * Purpose:  Redraw the table - taking account of the various features which are enabled
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnReDraw( oSettings )
-		{
-			if ( oSettings.oFeatures.bSort )
-			{
-				/* Sorting will refilter and draw for us */
-				_fnSort( oSettings, oSettings.oPreviousSearch );
-			}
-			else if ( oSettings.oFeatures.bFilter )
-			{
-				/* Filtering will redraw for us */
-				_fnFilterComplete( oSettings, oSettings.oPreviousSearch );
-			}
-			else
-			{
-				_fnCalculateEnd( oSettings );
-				_fnDraw( oSettings );
-			}
-		}
-		
-		/*
-		 * Function: _fnAjaxUpdate
-		 * Purpose:  Update the table using an Ajax call
-		 * Returns:  bool: block the table drawing or not
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnAjaxUpdate( oSettings )
-		{
-			if ( oSettings.bAjaxDataGet )
-			{
-				_fnProcessingDisplay( oSettings, true );
-				var iColumns = oSettings.aoColumns.length;
-				var aoData = [];
-				var i;
-				
-				/* Paging and general */
-				oSettings.iDraw++;
-				aoData.push( { "name": "sEcho",          "value": oSettings.iDraw } );
-				aoData.push( { "name": "iColumns",       "value": iColumns } );
-				aoData.push( { "name": "sColumns",       "value": _fnColumnOrdering(oSettings) } );
-				aoData.push( { "name": "iDisplayStart",  "value": oSettings._iDisplayStart } );
-				aoData.push( { "name": "iDisplayLength", "value": oSettings.oFeatures.bPaginate !== false ?
-					oSettings._iDisplayLength : -1 } );
-				
-				/* Filtering */
-				if ( oSettings.oFeatures.bFilter !== false )
-				{
-					aoData.push( { "name": "sSearch", "value": oSettings.oPreviousSearch.sSearch } );
-					aoData.push( { "name": "bRegex",  "value": oSettings.oPreviousSearch.bRegex } );
-					for ( i=0 ; i<iColumns ; i++ )
-					{
-						aoData.push( { "name": "sSearch_"+i,     "value": oSettings.aoPreSearchCols[i].sSearch } );
-						aoData.push( { "name": "bRegex_"+i,      "value": oSettings.aoPreSearchCols[i].bRegex } );
-						aoData.push( { "name": "bSearchable_"+i, "value": oSettings.aoColumns[i].bSearchable } );
-					}
-				}
-				
-				/* Sorting */
-				if ( oSettings.oFeatures.bSort !== false )
-				{
-					var iFixed = oSettings.aaSortingFixed !== null ? oSettings.aaSortingFixed.length : 0;
-					var iUser = oSettings.aaSorting.length;
-					aoData.push( { "name": "iSortingCols",   "value": iFixed+iUser } );
-					for ( i=0 ; i<iFixed ; i++ )
-					{
-						aoData.push( { "name": "iSortCol_"+i,  "value": oSettings.aaSortingFixed[i][0] } );
-						aoData.push( { "name": "sSortDir_"+i,  "value": oSettings.aaSortingFixed[i][1] } );
-					}
-					
-					for ( i=0 ; i<iUser ; i++ )
-					{
-						aoData.push( { "name": "iSortCol_"+(i+iFixed),  "value": oSettings.aaSorting[i][0] } );
-						aoData.push( { "name": "sSortDir_"+(i+iFixed),  "value": oSettings.aaSorting[i][1] } );
-					}
-					
-					for ( i=0 ; i<iColumns ; i++ )
-					{
-						aoData.push( { "name": "bSortable_"+i,  "value": oSettings.aoColumns[i].bSortable } );
-					}
-				}
-				
-				oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData,
-					function(json) {
-						_fnAjaxUpdateDraw( oSettings, json );
-					} );
-				return false;
-			}
-			else
-			{
-				return true;
-			}
-		}
-		
-		/*
-		 * Function: _fnAjaxUpdateDraw
-		 * Purpose:  Data the data from the server (nuking the old) and redraw the table
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           object:json - json data return from the server.
-		 *             The following must be defined:
-		 *               iTotalRecords, iTotalDisplayRecords, aaData
-		 *             The following may be defined:
-		 *               sColumns
-		 */
-		function _fnAjaxUpdateDraw ( oSettings, json )
-		{
-			if ( typeof json.sEcho != 'undefined' )
-			{
-				/* Protect against old returns over-writing a new one. Possible when you get
-				 * very fast interaction, and later queires are completed much faster
-				 */
-				if ( json.sEcho*1 < oSettings.iDraw )
-				{
-					return;
-				}
-				else
-				{
-					oSettings.iDraw = json.sEcho * 1;
-				}
-			}
-			
-			if ( !oSettings.oScroll.bInfinite ||
-				   (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) )
-			{
-				_fnClearTable( oSettings );
-			}
-			oSettings._iRecordsTotal = json.iTotalRecords;
-			oSettings._iRecordsDisplay = json.iTotalDisplayRecords;
-			
-			/* Determine if reordering is required */
-			var sOrdering = _fnColumnOrdering(oSettings);
-			var bReOrder = (typeof json.sColumns != 'undefined' && sOrdering !== "" && json.sColumns != sOrdering );
-			if ( bReOrder )
-			{
-				var aiIndex = _fnReOrderIndex( oSettings, json.sColumns );
-			}
-			
-			for ( var i=0, iLen=json.aaData.length ; i<iLen ; i++ )
-			{
-				if ( bReOrder )
-				{
-					/* If we need to re-order, then create a new array with the correct order and add it */
-					var aData = [];
-					for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
-					{
-						aData.push( json.aaData[i][ aiIndex[j] ] );
-					}
-					_fnAddData( oSettings, aData );
-				}
-				else
-				{
-					/* No re-order required, sever got it "right" - just straight add */
-					_fnAddData( oSettings, json.aaData[i] );
-				}
-			}
-			oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
-			
-			oSettings.bAjaxDataGet = false;
-			_fnDraw( oSettings );
-			oSettings.bAjaxDataGet = true;
-			_fnProcessingDisplay( oSettings, false );
-		}
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Options (features) HTML
-		 */
-		
-		/*
-		 * Function: _fnAddOptionsHtml
-		 * Purpose:  Add the options to the page HTML for the table
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnAddOptionsHtml ( oSettings )
-		{
-			/*
-			 * Create a temporary, empty, div which we can later on replace with what we have generated
-			 * we do it this way to rendering the 'options' html offline - speed :-)
-			 */
-			var nHolding = document.createElement( 'div' );
-			oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable );
-			
-			/* 
-			 * All DataTables are wrapped in a div - this is not currently optional - backwards 
-			 * compatability. It can be removed if you don't want it.
-			 */
-			oSettings.nTableWrapper = document.createElement( 'div' );
-			oSettings.nTableWrapper.className = oSettings.oClasses.sWrapper;
-			if ( oSettings.sTableId !== '' )
-			{
-				oSettings.nTableWrapper.setAttribute( 'id', oSettings.sTableId+'_wrapper' );
-			}
-			
-			/* Track where we want to insert the option */
-			var nInsertNode = oSettings.nTableWrapper;
-			
-			/* Loop over the user set positioning and place the elements as needed */
-			var aDom = oSettings.sDom.split('');
-			var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j;
-			for ( var i=0 ; i<aDom.length ; i++ )
-			{
-				iPushFeature = 0;
-				cOption = aDom[i];
-				
-				if ( cOption == '<' )
-				{
-					/* New container div */
-					nNewNode = document.createElement( 'div' );
-					
-					/* Check to see if we should append an id and/or a class name to the container */
-					cNext = aDom[i+1];
-					if ( cNext == "'" || cNext == '"' )
-					{
-						sAttr = "";
-						j = 2;
-						while ( aDom[i+j] != cNext )
-						{
-							sAttr += aDom[i+j];
-							j++;
-						}
-						
-						/* Replace jQuery UI constants */
-						if ( sAttr == "H" )
-						{
-							sAttr = "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix";
-						}
-						else if ( sAttr == "F" )
-						{
-							sAttr = "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix";
-						}
-						
-						/* The attribute can be in the format of "#id.class", "#id" or "class" This logic
-						 * breaks the string into parts and applies them as needed
-						 */
-						if ( sAttr.indexOf('.') != -1 )
-						{
-							var aSplit = sAttr.split('.');
-							nNewNode.setAttribute('id', aSplit[0].substr(1, aSplit[0].length-1) );
-							nNewNode.className = aSplit[1];
-						}
-						else if ( sAttr.charAt(0) == "#" )
-						{
-							nNewNode.setAttribute('id', sAttr.substr(1, sAttr.length-1) );
-						}
-						else
-						{
-							nNewNode.className = sAttr;
-						}
-						
-						i += j; /* Move along the position array */
-					}
-					
-					nInsertNode.appendChild( nNewNode );
-					nInsertNode = nNewNode;
-				}
-				else if ( cOption == '>' )
-				{
-					/* End container div */
-					nInsertNode = nInsertNode.parentNode;
-				}
-				else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange )
-				{
-					/* Length */
-					nTmp = _fnFeatureHtmlLength( oSettings );
-					iPushFeature = 1;
-				}
-				else if ( cOption == 'f' && oSettings.oFeatures.bFilter )
-				{
-					/* Filter */
-					nTmp = _fnFeatureHtmlFilter( oSettings );
-					iPushFeature = 1;
-				}
-				else if ( cOption == 'r' && oSettings.oFeatures.bProcessing )
-				{
-					/* pRocessing */
-					nTmp = _fnFeatureHtmlProcessing( oSettings );
-					iPushFeature = 1;
-				}
-				else if ( cOption == 't' )
-				{
-					/* Table */
-					nTmp = _fnFeatureHtmlTable( oSettings );
-					iPushFeature = 1;
-				}
-				else if ( cOption ==  'i' && oSettings.oFeatures.bInfo )
-				{
-					/* Info */
-					nTmp = _fnFeatureHtmlInfo( oSettings );
-					iPushFeature = 1;
-				}
-				else if ( cOption == 'p' && oSettings.oFeatures.bPaginate )
-				{
-					/* Pagination */
-					nTmp = _fnFeatureHtmlPaginate( oSettings );
-					iPushFeature = 1;
-				}
-				else if ( _oExt.aoFeatures.length !== 0 )
-				{
-					/* Plug-in features */
-					var aoFeatures = _oExt.aoFeatures;
-					for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
-					{
-						if ( cOption == aoFeatures[k].cFeature )
-						{
-							nTmp = aoFeatures[k].fnInit( oSettings );
-							if ( nTmp )
-							{
-								iPushFeature = 1;
-							}
-							break;
-						}
-					}
-				}
-				
-				/* Add to the 2D features array */
-				if ( iPushFeature == 1 && nTmp !== null )
-				{
-					if ( typeof oSettings.aanFeatures[cOption] != 'object' )
-					{
-						oSettings.aanFeatures[cOption] = [];
-					}
-					oSettings.aanFeatures[cOption].push( nTmp );
-					nInsertNode.appendChild( nTmp );
-				}
-			}
-			
-			/* Built our DOM structure - replace the holding div with what we want */
-			nHolding.parentNode.replaceChild( oSettings.nTableWrapper, nHolding );
-		}
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Feature: Filtering
-		 */
-		
-		/*
-		 * Function: _fnFeatureHtmlTable
-		 * Purpose:  Add any control elements for the table - specifically scrolling
-		 * Returns:  node: - Node to add to the DOM
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnFeatureHtmlTable ( oSettings )
-		{
-			/* Chack if scrolling is enabled or not - if not then leave the DOM unaltered */
-			if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
-			{
-				return oSettings.nTable;
-			}
-			
-			/*
-			 * The HTML structure that we want to generate in this function is:
-			 *  div - nScroller
-			 *    div - nScrollHead
-			 *      div - nScrollHeadInner
-			 *        table - nScrollHeadTable
-			 *          thead - nThead
-			 *    div - nScrollBody
-			 *      table - oSettings.nTable
-			 *        thead - nTheadSize
-			 *        tbody - nTbody
-			 *    div - nScrollFoot
-			 *      div - nScrollFootInner
-			 *        table - nScrollFootTable
-			 *          tfoot - nTfoot
-			 */
-			var
-			 	nScroller = document.createElement('div'),
-			 	nScrollHead = document.createElement('div'),
-			 	nScrollHeadInner = document.createElement('div'),
-			 	nScrollBody = document.createElement('div'),
-			 	nScrollFoot = document.createElement('div'),
-			 	nScrollFootInner = document.createElement('div'),
-			 	nScrollHeadTable = oSettings.nTable.cloneNode(false),
-			 	nScrollFootTable = oSettings.nTable.cloneNode(false),
-				nThead = oSettings.nTable.getElementsByTagName('thead')[0],
-			 	nTfoot = oSettings.nTable.getElementsByTagName('tfoot').length === 0 ? null : 
-					oSettings.nTable.getElementsByTagName('tfoot')[0],
-				oClasses = (typeof oInit.bJQueryUI != 'undefined' && oInit.bJQueryUI) ?
-			 		_oExt.oJUIClasses : _oExt.oStdClasses;
-			
-			nScrollHead.appendChild( nScrollHeadInner );
-			nScrollFoot.appendChild( nScrollFootInner );
-			nScrollBody.appendChild( oSettings.nTable );
-			nScroller.appendChild( nScrollHead );
-			nScroller.appendChild( nScrollBody );
-			nScrollHeadInner.appendChild( nScrollHeadTable );
-			nScrollHeadTable.appendChild( nThead );
-			if ( nTfoot !== null )
-			{
-				nScroller.appendChild( nScrollFoot );
-				nScrollFootInner.appendChild( nScrollFootTable );
-				nScrollFootTable.appendChild( nTfoot );
-			}
-			
-			nScroller.className = oClasses.sScrollWrapper;
-			nScrollHead.className = oClasses.sScrollHead;
-			nScrollHeadInner.className = oClasses.sScrollHeadInner;
-			nScrollBody.className = oClasses.sScrollBody;
-			nScrollFoot.className = oClasses.sScrollFoot;
-			nScrollFootInner.className = oClasses.sScrollFootInner;
-			
-			if ( oSettings.oScroll.bAutoCss )
-			{
-				nScrollHead.style.overflow = "hidden";
-				nScrollHead.style.position = "relative";
-				nScrollFoot.style.overflow = "hidden";
-				nScrollBody.style.overflow = "auto";
-			}
-			
-			nScrollHead.style.border = "0";
-			nScrollHead.style.width = "100%";
-			nScrollFoot.style.border = "0";
-			nScrollHeadInner.style.width = "150%"; /* will be overwritten */
-			
-			/* Modify attributes to respect the clones */
-			nScrollHeadTable.removeAttribute('id');
-			nScrollHeadTable.style.marginLeft = "0";
-			oSettings.nTable.style.marginLeft = "0";
-			if ( nTfoot !== null )
-			{
-				nScrollFootTable.removeAttribute('id');
-				nScrollFootTable.style.marginLeft = "0";
-			}
-			
-			/* Move any caption elements from the body to the header */
-			var nCaptions = $('>caption', oSettings.nTable);
-			for ( var i=0, iLen=nCaptions.length ; i<iLen ; i++ )
-			{
-				nScrollHeadTable.appendChild( nCaptions[i] );
-			}
-			
-			/*
-			 * Sizing
-			 */
-			/* When xscrolling add the width and a scroller to move the header with the body */
-			if ( oSettings.oScroll.sX !== "" )
-			{
-				nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX );
-				nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX );
-				
-				if ( nTfoot !== null )
-				{
-					nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX );	
-				}
-				
-				/* When the body is scrolled, then we also want to scroll the headers */
-				$(nScrollBody).scroll( function (e) {
-					nScrollHead.scrollLeft = this.scrollLeft;
-					
-					if ( nTfoot !== null )
-					{
-						nScrollFoot.scrollLeft = this.scrollLeft;
-					}
-				} );
-			}
-			
-			/* When yscrolling, add the height */
-			if ( oSettings.oScroll.sY !== "" )
-			{
-				nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY );
-			}
-			
-			/* Redraw - align columns across the tables */
-			oSettings.aoDrawCallback.push( {
-				"fn": _fnScrollDraw,
-				"sName": "scrolling"
-			} );
-			
-			/* Infinite scrolling event handlers */
-			if ( oSettings.oScroll.bInfinite )
-			{
-				$(nScrollBody).scroll( function() {
-					/* Use a blocker to stop scrolling from loading more data while other data is still loading */
-					if ( !oSettings.bDrawing )
-					{
-						/* Check if we should load the next data set */
-						if ( $(this).scrollTop() + $(this).height() > 
-							$(oSettings.nTable).height() - oSettings.oScroll.iLoadGap )
-						{
-							/* Only do the redraw if we have to - we might be at the end of the data */
-							if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() )
-							{
-								_fnPageChange( oSettings, 'next' );
-								_fnCalculateEnd( oSettings );
-								_fnDraw( oSettings );
-							}
-						}
-					}
-				} );
-			}
-			
-			oSettings.nScrollHead = nScrollHead;
-			oSettings.nScrollFoot = nScrollFoot;
-			
-			return nScroller;
-		}
-		
-		/*
-		 * Function: _fnScrollDraw
-		 * Purpose:  Update the various tables for resizing
-		 * Returns:  node: - Node to add to the DOM
-		 * Inputs:   object:o - dataTables settings object
-		 * Notes:    It's a bit of a pig this function, but basically the idea to:
-		 *   1. Re-create the table inside the scrolling div
-		 *   2. Take live measurements from the DOM
-		 *   3. Apply the measurements
-		 *   4. Clean up
-		 */
-		function _fnScrollDraw ( o )
-		{
-			var
-				nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0],
-				nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
-				nScrollBody = o.nTable.parentNode,
-				i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis,
-				iWidth, aApplied=[], iSanityWidth;
-			
-			/*
-			 * 1. Re-create the table inside the scrolling div
-			 */
-			
-			/* Remove the old minimised thead and tfoot elements in the inner table */
-			var nTheadSize = o.nTable.getElementsByTagName('thead');
-			if ( nTheadSize.length > 0 )
-			{
-				o.nTable.removeChild( nTheadSize[0] );
-			}
-			
-			if ( o.nTFoot !== null )
-			{
-				/* Remove the old minimised footer element in the cloned header */
-				var nTfootSize = o.nTable.getElementsByTagName('tfoot');
-				if ( nTfootSize.length > 0 )
-				{
-					o.nTable.removeChild( nTfootSize[0] );
-				}
-			}
-			
-			/* Clone the current header and footer elements and then place it into the inner table */
-			nTheadSize = o.nTHead.cloneNode(true);
-			o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] );
-			
-			if ( o.nTFoot !== null )
-			{
-				nTfootSize = o.nTFoot.cloneNode(true);
-				o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] );
-			}
-			
-			/*
-			 * 2. Take live measurements from the DOM - do not alter the DOM itself!
-			 */
-			
-			/* Remove old sizing and apply the calculated column widths
-			 * Get the unique column headers in the newly created (cloned) header. We want to apply the
-			 * calclated sizes to this header
-			 */
-			var nThs = _fnGetUniqueThs( nTheadSize );
-			for ( i=0, iLen=nThs.length ; i<iLen ; i++ )
-			{
-				iVis = _fnVisibleToColumnIndex( o, i );
-				nThs[i].style.width = o.aoColumns[iVis].sWidth;
-			}
-			
-			if ( o.nTFoot !== null )
-			{
-				_fnApplyToChildren( function(n) {
-					n.style.width = "";
-				}, nTfootSize.getElementsByTagName('tr') );
-			}
-			
-			/* Size the table as a whole */
-			iSanityWidth = $(o.nTable).outerWidth();
-			if ( o.oScroll.sX === "" )
-			{
-				/* No x scrolling */
-				o.nTable.style.width = "100%";
-				
-				/* I know this is rubbish - but IE7 will make the width of the table when 100% include
-				 * the scrollbar - which is shouldn't. This needs feature detection in future - to do
-				 */
-				if ( $.browser.msie && $.browser.version <= 7 )
-				{
-					o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth()-o.oScroll.iBarWidth );
-				}
-			}
-			else
-			{
-				if ( o.oScroll.sXInner !== "" )
-				{
-					/* x scroll inner has been given - use it */
-					o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner);
-				}
-				else if ( iSanityWidth == $(nScrollBody).width() &&
-				   $(nScrollBody).height() < $(o.nTable).height() )
-				{
-					/* There is y-scrolling - try to take account of the y scroll bar */
-					o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth );
-					if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth )
-					{
-						/* Not possible to take account of it */
-						o.nTable.style.width = _fnStringToCss( iSanityWidth );
-					}
-				}
-				else
-				{
-					/* All else fails */
-					o.nTable.style.width = _fnStringToCss( iSanityWidth );
-				}
-			}
-			
-			/* Recalculate the sanity width - now that we've applied the required width, before it was
-			 * a temporary variable. This is required because the column width calculation is done
-			 * before this table DOM is created.
-			 */
-			iSanityWidth = $(o.nTable).outerWidth();
-			
-			/* We want the hidden header to have zero height, so remove padding and borders. Then
-			 * set the width based on the real headers
-			 */
-			anHeadToSize = o.nTHead.getElementsByTagName('tr');
-			anHeadSizers = nTheadSize.getElementsByTagName('tr');
-			
-			_fnApplyToChildren( function(nSizer, nToSize) {
-				oStyle = nSizer.style;
-				oStyle.paddingTop = "0";
-				oStyle.paddingBottom = "0";
-				oStyle.borderTopWidth = "0";
-				oStyle.borderBottomWidth = "0";
-				oStyle.height = 0;
-				
-				iWidth = $(nSizer).width();
-				nToSize.style.width = _fnStringToCss( iWidth );
-				aApplied.push( iWidth );
-			}, anHeadSizers, anHeadToSize );
-			$(anHeadSizers).height(0);
-			
-			if ( o.nTFoot !== null )
-			{
-				/* Clone the current footer and then place it into the body table as a "hidden header" */
-				anFootSizers = nTfootSize.getElementsByTagName('tr');
-				anFootToSize = o.nTFoot.getElementsByTagName('tr');
-				
-				_fnApplyToChildren( function(nSizer, nToSize) {
-					oStyle = nSizer.style;
-					oStyle.paddingTop = "0";
-					oStyle.paddingBottom = "0";
-					oStyle.borderTopWidth = "0";
-					oStyle.borderBottomWidth = "0";
-					oStyle.height = 0;
-					
-					iWidth = $(nSizer).width();
-					nToSize.style.width = _fnStringToCss( iWidth );
-					aApplied.push( iWidth );
-				}, anFootSizers, anFootToSize );
-				$(anFootSizers).height(0);
-			}
-			
-			/*
-			 * 3. Apply the measurements
-			 */
-			
-			/* "Hide" the header and footer that we used for the sizing. We want to also fix their width
-			 * to what they currently are
-			 */
-			_fnApplyToChildren( function(nSizer) {
-				nSizer.innerHTML = "";
-				nSizer.style.width = _fnStringToCss( aApplied.shift() );
-			}, anHeadSizers );
-			
-			if ( o.nTFoot !== null )
-			{
-				_fnApplyToChildren( function(nSizer) {
-					nSizer.innerHTML = "";
-					nSizer.style.width = _fnStringToCss( aApplied.shift() );
-				}, anFootSizers );
-			}
-			
-			/* Sanity check that the table is of a sensible width. If not then we are going to get
-			 * misalignment
-			 */
-			if ( $(o.nTable).outerWidth() < iSanityWidth )
-			{
-				if ( o.oScroll.sX === "" )
-				{
-					_fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
-						" misalignment. It is suggested that you enable x-scrolling or increase the width"+
-						" the table has in which to be drawn" );
-				}
-				else if ( o.oScroll.sXInner !== "" )
-				{
-					_fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
-						" misalignment. It is suggested that you increase the sScrollXInner property to"+
-						" allow it to draw in a larger area, or simply remove that parameter to allow"+
-						" automatic calculation" );
-				}
-			}
-			
-			
-			/*
-			 * 4. Clean up
-			 */
-			
-			if ( o.oScroll.sY === "" )
-			{
-				/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
-				 * the scrollbar height from the visible display, rather than adding it on. We need to
-				 * set the height in order to sort this. Don't want to do it in any other browsers.
-				 */
-				if ( $.browser.msie && $.browser.version <= 7 )
-				{
-					nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth );
-				}
-			}
-			
-			if ( o.oScroll.sY !== "" && o.oScroll.bCollapse )
-			{
-				nScrollBody.style.height = _fnStringToCss( o.oScroll.sY );
-				
-				var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ?
-				 	o.oScroll.iBarWidth : 0;
-				if ( o.nTable.offsetHeight < nScrollBody.offsetHeight )
-				{
-					nScrollBody.style.height = _fnStringToCss( $(o.nTable).height()+iExtra );
-				}
-			}
-			
-			/* Finally set the width's of the header and footer tables */
-			var iOuterWidth = $(o.nTable).outerWidth();
-			nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth );
-			nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth+o.oScroll.iBarWidth );
-			
-			if ( o.nTFoot !== null )
-			{
-				var
-					nScrollFootInner = o.nScrollFoot.getElementsByTagName('div')[0],
-					nScrollFootTable = nScrollFootInner.getElementsByTagName('table')[0];
-				
-				nScrollFootInner.style.width = _fnStringToCss( o.nTable.offsetWidth+o.oScroll.iBarWidth );
-				nScrollFootTable.style.width = _fnStringToCss( o.nTable.offsetWidth );
-			}
-			
-			/* If sorting or filtering has occured, jump the scrolling back to the top */
-			if ( o.bSorted || o.bFiltered )
-			{
-				nScrollBody.scrollTop = 0;
-			}
-		}
-		
-		/*
-		 * Function: _fnAjustColumnSizing
-		 * Purpose:  Ajust the table column widths for new data
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 * Notes:    You would probably want to do a redraw after calling this function!
-		 */
-		function _fnAjustColumnSizing ( oSettings )
-		{
-			/* Not interested in doing column width calculation if autowidth is disabled */
-			if ( oSettings.oFeatures.bAutoWidth === false )
-			{
-				return false;
-			}
-			
-			_fnCalculateColumnWidths( oSettings );
-			for ( var i=0 , iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-			{
-				oSettings.aoColumns[i].nTh.style.width = oSettings.aoColumns[i].sWidth;
-			}
-		}
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Feature: Filtering
-		 */
-		
-		/*
-		 * Function: _fnFeatureHtmlFilter
-		 * Purpose:  Generate the node required for filtering text
-		 * Returns:  node
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnFeatureHtmlFilter ( oSettings )
-		{
-			var nFilter = document.createElement( 'div' );
-			if ( oSettings.sTableId !== '' && typeof oSettings.aanFeatures.f == "undefined" )
-			{
-				nFilter.setAttribute( 'id', oSettings.sTableId+'_filter' );
-			}
-			nFilter.className = oSettings.oClasses.sFilter;
-			var sSpace = oSettings.oLanguage.sSearch==="" ? "" : " ";
-			nFilter.innerHTML = oSettings.oLanguage.sSearch+sSpace+'<input type="text" />';
-			
-			var jqFilter = $("input", nFilter);
-			jqFilter.val( oSettings.oPreviousSearch.sSearch.replace('"','&quot;') );
-			jqFilter.bind( 'keyup.DT', function(e) {
-				/* Update all other filter input elements for the new display */
-				var n = oSettings.aanFeatures.f;
-				for ( var i=0, iLen=n.length ; i<iLen ; i++ )
-				{
-					if ( n[i] != this.parentNode )
-					{
-						$('input', n[i]).val( this.value );
-					}
-				}
-				
-				/* Now do the filter */
-				if ( this.value != oSettings.oPreviousSearch.sSearch )
-				{
-					_fnFilterComplete( oSettings, { 
-						"sSearch": this.value, 
-						"bRegex":  oSettings.oPreviousSearch.bRegex,
-						"bSmart":  oSettings.oPreviousSearch.bSmart 
-					} );
-				}
-			} );
-			
-			jqFilter.bind( 'keypress.DT', function(e) {
-				/* Prevent default */
-				if ( e.keyCode == 13 )
-				{
-					return false;
-				}
-			} );
-			
-			return nFilter;
-		}
-		
-		/*
-		 * Function: _fnFilterComplete
-		 * Purpose:  Filter the table using both the global filter and column based filtering
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           object:oSearch: search information
-		 *           int:iForce - optional - force a research of the master array (1) or not (undefined or 0)
-		 */
-		function _fnFilterComplete ( oSettings, oInput, iForce )
-		{
-			/* Filter on everything */
-			_fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart );
-			
-			/* Now do the individual column filter */
-			for ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i++ )
-			{
-				_fnFilterColumn( oSettings, oSettings.aoPreSearchCols[i].sSearch, i, 
-					oSettings.aoPreSearchCols[i].bRegex, oSettings.aoPreSearchCols[i].bSmart );
-			}
-			
-			/* Custom filtering */
-			if ( _oExt.afnFiltering.length !== 0 )
-			{
-				_fnFilterCustom( oSettings );
-			}
-			
-			/* Tell the draw function we have been filtering */
-			oSettings.bFiltered = true;
-			
-			/* Redraw the table */
-			oSettings._iDisplayStart = 0;
-			_fnCalculateEnd( oSettings );
-			_fnDraw( oSettings );
-			
-			/* Rebuild search array 'offline' */
-			_fnBuildSearchArray( oSettings, 0 );
-		}
-		
-		/*
-		 * Function: _fnFilterCustom
-		 * Purpose:  Apply custom filtering functions
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnFilterCustom( oSettings )
-		{
-			var afnFilters = _oExt.afnFiltering;
-			for ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ )
-			{
-				var iCorrector = 0;
-				for ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ )
-				{
-					var iDisIndex = oSettings.aiDisplay[j-iCorrector];
-					
-					/* Check if we should use this row based on the filtering function */
-					if ( !afnFilters[i]( oSettings, oSettings.aoData[iDisIndex]._aData, iDisIndex ) )
-					{
-						oSettings.aiDisplay.splice( j-iCorrector, 1 );
-						iCorrector++;
-					}
-				}
-			}
-		}
-		
-		/*
-		 * Function: _fnFilterColumn
-		 * Purpose:  Filter the table on a per-column basis
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           string:sInput - string to filter on
-		 *           int:iColumn - column to filter
-		 *           bool:bRegex - treat search string as a regular expression or not
-		 *           bool:bSmart - use smart filtering or not
-		 */
-		function _fnFilterColumn ( oSettings, sInput, iColumn, bRegex, bSmart )
-		{
-			if ( sInput === "" )
-			{
-				return;
-			}
-			
-			var iIndexCorrector = 0;
-			var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart );
-			
-			for ( var i=oSettings.aiDisplay.length-1 ; i>=0 ; i-- )
-			{
-				var sData = _fnDataToSearch( oSettings.aoData[ oSettings.aiDisplay[i] ]._aData[iColumn],
-					oSettings.aoColumns[iColumn].sType );
-				if ( ! rpSearch.test( sData ) )
-				{
-					oSettings.aiDisplay.splice( i, 1 );
-					iIndexCorrector++;
-				}
-			}
-		}
-		
-		/*
-		 * Function: _fnFilter
-		 * Purpose:  Filter the data table based on user input and draw the table
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           string:sInput - string to filter on
-		 *           int:iForce - optional - force a research of the master array (1) or not (undefined or 0)
-		 *           bool:bRegex - treat as a regular expression or not
-		 *           bool:bSmart - perform smart filtering or not
-		 */
-		function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart )
-		{
-			var i;
-			var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart );
-			
-			/* Check if we are forcing or not - optional parameter */
-			if ( typeof iForce == 'undefined' || iForce === null )
-			{
-				iForce = 0;
-			}
-			
-			/* Need to take account of custom filtering functions - always filter */
-			if ( _oExt.afnFiltering.length !== 0 )
-			{
-				iForce = 1;
-			}
-			
-			/*
-			 * If the input is blank - we want the full data set
-			 */
-			if ( sInput.length <= 0 )
-			{
-				oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
-				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
-			}
-			else
-			{
-				/*
-				 * We are starting a new search or the new search string is smaller 
-				 * then the old one (i.e. delete). Search from the master array
-			 	 */
-				if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length ||
-					   oSettings.oPreviousSearch.sSearch.length > sInput.length || iForce == 1 ||
-					   sInput.indexOf(oSettings.oPreviousSearch.sSearch) !== 0 )
-				{
-					/* Nuke the old display array - we are going to rebuild it */
-					oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
-					
-					/* Force a rebuild of the search array */
-					_fnBuildSearchArray( oSettings, 1 );
-					
-					/* Search through all records to populate the search array
-					 * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 
-					 * mapping
-					 */
-					for ( i=0 ; i<oSettings.aiDisplayMaster.length ; i++ )
-					{
-						if ( rpSearch.test(oSettings.asDataSearch[i]) )
-						{
-							oSettings.aiDisplay.push( oSettings.aiDisplayMaster[i] );
-						}
-					}
-			  }
-			  else
-				{
-			  	/* Using old search array - refine it - do it this way for speed
-			  	 * Don't have to search the whole master array again
-			 		 */
-			  	var iIndexCorrector = 0;
-			  	
-			  	/* Search the current results */
-			  	for ( i=0 ; i<oSettings.asDataSearch.length ; i++ )
-					{
-			  		if ( ! rpSearch.test(oSettings.asDataSearch[i]) )
-						{
-			  			oSettings.aiDisplay.splice( i-iIndexCorrector, 1 );
-			  			iIndexCorrector++;
-			  		}
-			  	}
-			  }
-			}
-			oSettings.oPreviousSearch.sSearch = sInput;
-			oSettings.oPreviousSearch.bRegex = bRegex;
-			oSettings.oPreviousSearch.bSmart = bSmart;
-		}
-		
-		/*
-		 * Function: _fnBuildSearchArray
-		 * Purpose:  Create an array which can be quickly search through
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           int:iMaster - use the master data array - optional
-		 */
-		function _fnBuildSearchArray ( oSettings, iMaster )
-		{
-			/* Clear out the old data */
-			oSettings.asDataSearch.splice( 0, oSettings.asDataSearch.length );
-			
-			var aArray = (typeof iMaster != 'undefined' && iMaster == 1) ?
-			 	oSettings.aiDisplayMaster : oSettings.aiDisplay;
-			
-			for ( var i=0, iLen=aArray.length ; i<iLen ; i++ )
-			{
-				oSettings.asDataSearch[i] = _fnBuildSearchRow( oSettings, 
-					oSettings.aoData[ aArray[i] ]._aData );
-			}
-		}
-		
-		/*
-		 * Function: _fnBuildSearchRow
-		 * Purpose:  Create a searchable string from a single data row
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           array:aData - aoData[]._aData array to use for the data to search
-		 */
-		function _fnBuildSearchRow( oSettings, aData )
-		{
-			var sSearch = '';
-			var nTmp = document.createElement('div');
-			
-			for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
-			{
-				if ( oSettings.aoColumns[j].bSearchable )
-				{
-					var sData = aData[j];
-					sSearch += _fnDataToSearch( sData, oSettings.aoColumns[j].sType )+'  ';
-				}
-			}
-			
-			/* If it looks like there is an HTML entity in the string, attempt to decode it */
-			if ( sSearch.indexOf('&') !== -1 )
-			{
-				nTmp.innerHTML = sSearch;
-				sSearch = nTmp.textContent ? nTmp.textContent : nTmp.innerText;
-				
-				/* IE and Opera appear to put an newline where there is a <br> tag - remove it */
-				sSearch = sSearch.replace(/\n/g," ").replace(/\r/g,"");
-			}
-			
-			return sSearch;
-		}
-		
-		/*
-		 * Function: _fnFilterCreateSearch
-		 * Purpose:  Build a regular expression object suitable for searching a table
-		 * Returns:  RegExp: - constructed object
-		 * Inputs:   string:sSearch - string to search for
-		 *           bool:bRegex - treat as a regular expression or not
-		 *           bool:bSmart - perform smart filtering or not
-		 */
-		function _fnFilterCreateSearch( sSearch, bRegex, bSmart )
-		{
-			var asSearch, sRegExpString;
-			
-			if ( bSmart )
-			{
-				/* Generate the regular expression to use. Something along the lines of:
-				 * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$
-				 */
-				asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' );
-				sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$';
-				return new RegExp( sRegExpString, "i" );
-			}
-			else
-			{
-				sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch );
-				return new RegExp( sSearch, "i" );
-			}
-		}
-		
-		/*
-		 * Function: _fnDataToSearch
-		 * Purpose:  Convert raw data into something that the user can search on
-		 * Returns:  string: - search string
-		 * Inputs:   string:sData - data to be modified
-		 *           string:sType - data type
-		 */
-		function _fnDataToSearch ( sData, sType )
-		{
-			if ( typeof _oExt.ofnSearch[sType] == "function" )
-			{
-				return _oExt.ofnSearch[sType]( sData );
-			}
-			else if ( sType == "html" )
-			{
-				return sData.replace(/\n/g," ").replace( /<.*?>/g, "" );
-			}
-			else if ( typeof sData == "string" )
-			{
-				return sData.replace(/\n/g," ");
-			}
-			return sData;
-		}
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Feature: Sorting
-		 */
-		
-		/*
-	 	 * Function: _fnSort
-		 * Purpose:  Change the order of the table
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           bool:bApplyClasses - optional - should we apply classes or not
-		 * Notes:    We always sort the master array and then apply a filter again
-		 *   if it is needed. This probably isn't optimal - but atm I can't think
-		 *   of any other way which is (each has disadvantages). we want to sort aiDisplayMaster - 
-		 *   but according to aoData[]._aData
-		 */
-		function _fnSort ( oSettings, bApplyClasses )
-		{
-			var
-				iDataSort, iDataType,
-				i, iLen, j, jLen,
-				aaSort = [],
-			 	aiOrig = [],
-				oSort = _oExt.oSort,
-				aoData = oSettings.aoData,
-				aoColumns = oSettings.aoColumns;
-			
-			/* No sorting required if server-side or no sorting array */
-			if ( !oSettings.oFeatures.bServerSide && 
-				(oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) )
-			{
-				if ( oSettings.aaSortingFixed !== null )
-				{
-					aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );
-				}
-				else
-				{
-					aaSort = oSettings.aaSorting.slice();
-				}
-				
-				/* If there is a sorting data type, and a fuction belonging to it, then we need to
-				 * get the data from the developer's function and apply it for this column
-				 */
-				for ( i=0 ; i<aaSort.length ; i++ )
-				{
-					var iColumn = aaSort[i][0];
-					var iVisColumn = _fnColumnIndexToVisible( oSettings, iColumn );
-					var sDataType = oSettings.aoColumns[ iColumn ].sSortDataType;
-					if ( typeof _oExt.afnSortData[sDataType] != 'undefined' )
-					{
-						var aData = _oExt.afnSortData[sDataType]( oSettings, iColumn, iVisColumn );
-						for ( j=0, jLen=aoData.length ; j<jLen ; j++ )
-						{
-							aoData[j]._aData[iColumn] = aData[j];
-						}
-					}
-				}
-				
-				/* Create a value - key array of the current row positions such that we can use their
-				 * current position during the sort, if values match, in order to perform stable sorting
-				 */
-				for ( i=0, iLen=oSettings.aiDisplayMaster.length ; i<iLen ; i++ )
-				{
-					aiOrig[ oSettings.aiDisplayMaster[i] ] = i;
-				}
-				
-				/* Do the sort - here we want multi-column sorting based on a given data source (column)
-				 * and sorting function (from oSort) in a certain direction. It's reasonably complex to
-				 * follow on it's own, but this is what we want (example two column sorting):
-				 *  fnLocalSorting = function(a,b){
-				 *  	var iTest;
-				 *  	iTest = oSort['string-asc']('data11', 'data12');
-				 *  	if (iTest !== 0)
-				 *  		return iTest;
-				 *    iTest = oSort['numeric-desc']('data21', 'data22');
-				 *    if (iTest !== 0)
-				 *  		return iTest;
-				 *  	return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
-				 *  }
-				 * Basically we have a test for each sorting column, if the data in that column is equal,
-				 * test the next column. If all columns match, then we use a numeric sort on the row 
-				 * positions in the original data array to provide a stable sort.
-				 */
-				var iSortLen = aaSort.length;
-				oSettings.aiDisplayMaster.sort( function ( a, b ) {
-					var iTest;
-					for ( i=0 ; i<iSortLen ; i++ )
-					{
-						iDataSort = aoColumns[ aaSort[i][0] ].iDataSort;
-						iDataType = aoColumns[ iDataSort ].sType;
-						iTest = oSort[ iDataType+"-"+aaSort[i][1] ](
-							aoData[a]._aData[iDataSort],
-							aoData[b]._aData[iDataSort]
-						);
-						
-						if ( iTest !== 0 )
-						{
-							return iTest;
-						}
-					}
-					
-					return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
-				} );
-			}
-			
-			/* Alter the sorting classes to take account of the changes */
-			if ( typeof bApplyClasses == 'undefined' || bApplyClasses )
-			{
-				_fnSortingClasses( oSettings );
-			}
-			
-			/* Tell the draw function that we have sorted the data */
-			oSettings.bSorted = true;
-			
-			/* Copy the master data into the draw array and re-draw */
-			if ( oSettings.oFeatures.bFilter )
-			{
-				/* _fnFilter() will redraw the table for us */
-				_fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
-			}
-			else
-			{
-				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
-				oSettings._iDisplayStart = 0; /* reset display back to page 0 */
-				_fnCalculateEnd( oSettings );
-				_fnDraw( oSettings );
-			}
-		}
-		
-		/*
-		 * Function: _fnSortAttachListener
-		 * Purpose:  Attach a sort handler (click) to a node
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           node:nNode - node to attach the handler to
-		 *           int:iDataIndex - column sorting index
-		 *           function:fnCallback - callback function - optional
-		 */
-		function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback )
-		{
-			$(nNode).bind( 'click.DT', function (e) {
-				/* If the column is not sortable - don't to anything */
-				if ( oSettings.aoColumns[iDataIndex].bSortable === false )
-				{
-					return;
-				}
-				
-				/*
-				 * This is a little bit odd I admit... I declare a temporary function inside the scope of
-				 * _fnDrawHead and the click handler in order that the code presented here can be used 
-				 * twice - once for when bProcessing is enabled, and another time for when it is 
-				 * disabled, as we need to perform slightly different actions.
-				 *   Basically the issue here is that the Javascript engine in modern browsers don't 
-				 * appear to allow the rendering engine to update the display while it is still excuting
-				 * it's thread (well - it does but only after long intervals). This means that the 
-				 * 'processing' display doesn't appear for a table sort. To break the js thread up a bit
-				 * I force an execution break by using setTimeout - but this breaks the expected 
-				 * thread continuation for the end-developer's point of view (their code would execute
-				 * too early), so we on;y do it when we absolutely have to.
-				 */
-				var fnInnerSorting = function () {
-					var iColumn, iNextSort;
-					
-					/* If the shift key is pressed then we are multipe column sorting */
-					if ( e.shiftKey )
-					{
-						/* Are we already doing some kind of sort on this column? */
-						var bFound = false;
-						for ( var i=0 ; i<oSettings.aaSorting.length ; i++ )
-						{
-							if ( oSettings.aaSorting[i][0] == iDataIndex )
-							{
-								bFound = true;
-								iColumn = oSettings.aaSorting[i][0];
-								iNextSort = oSettings.aaSorting[i][2]+1;
-								
-								if ( typeof oSettings.aoColumns[iColumn].asSorting[iNextSort] == 'undefined' )
-								{
-									/* Reached the end of the sorting options, remove from multi-col sort */
-									oSettings.aaSorting.splice( i, 1 );
-								}
-								else
-								{
-									/* Move onto next sorting direction */
-									oSettings.aaSorting[i][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
-									oSettings.aaSorting[i][2] = iNextSort;
-								}
-								break;
-							}
-						}
-						
-						/* No sort yet - add it in */
-						if ( bFound === false )
-						{
-							oSettings.aaSorting.push( [ iDataIndex, 
-								oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
-						}
-					}
-					else
-					{
-						/* If no shift key then single column sort */
-						if ( oSettings.aaSorting.length == 1 && oSettings.aaSorting[0][0] == iDataIndex )
-						{
-							iColumn = oSettings.aaSorting[0][0];
-							iNextSort = oSettings.aaSorting[0][2]+1;
-							if ( typeof oSettings.aoColumns[iColumn].asSorting[iNextSort] == 'undefined' )
-							{
-								iNextSort = 0;
-							}
-							oSettings.aaSorting[0][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
-							oSettings.aaSorting[0][2] = iNextSort;
-						}
-						else
-						{
-							oSettings.aaSorting.splice( 0, oSettings.aaSorting.length );
-							oSettings.aaSorting.push( [ iDataIndex, 
-								oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
-						}
-					}
-					
-					/* Run the sort */
-					_fnSort( oSettings );
-				}; /* /fnInnerSorting */
-				
-				if ( !oSettings.oFeatures.bProcessing )
-				{
-					fnInnerSorting();
-				}
-				else
-				{
-					_fnProcessingDisplay( oSettings, true );
-					setTimeout( function() {
-						fnInnerSorting();
-						if ( !oSettings.oFeatures.bServerSide )
-						{
-							_fnProcessingDisplay( oSettings, false );
-						}
-					}, 0 );
-				}
-				
-				/* Call the user specified callback function - used for async user interaction */
-				if ( typeof fnCallback == 'function' )
-				{
-					fnCallback( oSettings );
-				}
-			} );
-		}
-		
-		/*
-		 * Function: _fnSortingClasses
-		 * Purpose:  Set the sortting classes on the header
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 * Notes:    It is safe to call this function when bSort and bSortClasses are false
-		 */
-		function _fnSortingClasses( oSettings )
-		{
-			var i, iLen, j, jLen, iFound;
-			var aaSort, sClass;
-			var iColumns = oSettings.aoColumns.length;
-			var oClasses = oSettings.oClasses;
-			
-			for ( i=0 ; i<iColumns ; i++ )
-			{
-				if ( oSettings.aoColumns[i].bSortable )
-				{
-					$(oSettings.aoColumns[i].nTh).removeClass( oClasses.sSortAsc +" "+ oClasses.sSortDesc +
-				 		" "+ oSettings.aoColumns[i].sSortingClass );
-				}
-			}
-			
-			if ( oSettings.aaSortingFixed !== null )
-			{
-				aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );
-			}
-			else
-			{
-				aaSort = oSettings.aaSorting.slice();
-			}
-			
-			/* Apply the required classes to the header */
-			for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
-			{
-				if ( oSettings.aoColumns[i].bSortable )
-				{
-					sClass = oSettings.aoColumns[i].sSortingClass;
-					iFound = -1;
-					for ( j=0 ; j<aaSort.length ; j++ )
-					{
-						if ( aaSort[j][0] == i )
-						{
-							sClass = ( aaSort[j][1] == "asc" ) ?
-								oClasses.sSortAsc : oClasses.sSortDesc;
-							iFound = j;
-							break;
-						}
-					}
-					$(oSettings.aoColumns[i].nTh).addClass( sClass );
-					
-					if ( oSettings.bJUI )
-					{
-						/* jQuery UI uses extra markup */
-						var jqSpan = $("span", oSettings.aoColumns[i].nTh);
-						jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+ 
-							oClasses.sSortJUI +" "+ oClasses.sSortJUIAscAllowed +" "+ oClasses.sSortJUIDescAllowed );
-						
-						var sSpanClass;
-						if ( iFound == -1 )
-						{
-						 	sSpanClass = oSettings.aoColumns[i].sSortingClassJUI;
-						}
-						else if ( aaSort[iFound][1] == "asc" )
-						{
-							sSpanClass = oClasses.sSortJUIAsc;
-						}
-						else
-						{
-							sSpanClass = oClasses.sSortJUIDesc;
-						}
-						
-						jqSpan.addClass( sSpanClass );
-					}
-				}
-				else
-				{
-					/* No sorting on this column, so add the base class. This will have been assigned by
-					 * _fnAddColumn
-					 */
-					$(oSettings.aoColumns[i].nTh).addClass( oSettings.aoColumns[i].sSortingClass );
-				}
-			}
-			
-			/* 
-			 * Apply the required classes to the table body
-			 * Note that this is given as a feature switch since it can significantly slow down a sort
-			 * on large data sets (adding and removing of classes is always slow at the best of times..)
-			 * Further to this, note that this code is admitadly fairly ugly. It could be made a lot 
-			 * simpiler using jQuery selectors and add/removeClass, but that is significantly slower
-			 * (on the order of 5 times slower) - hence the direct DOM manipulation here.
-			 */
-			sClass = oClasses.sSortColumn;
-			
-			if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses )
-			{
-				var nTds = _fnGetTdNodes( oSettings );
-				
-				/* Remove the old classes */
-				if ( nTds.length >= iColumns )
-				{
-					for ( i=0 ; i<iColumns ; i++ )
-					{
-						if ( nTds[i].className.indexOf(sClass+"1") != -1 )
-						{
-							for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
-							{
-								nTds[(iColumns*j)+i].className = 
-									$.trim( nTds[(iColumns*j)+i].className.replace( sClass+"1", "" ) );
-							}
-						}
-						else if ( nTds[i].className.indexOf(sClass+"2") != -1 )
-						{
-							for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
-							{
-								nTds[(iColumns*j)+i].className = 
-									$.trim( nTds[(iColumns*j)+i].className.replace( sClass+"2", "" ) );
-							}
-						}
-						else if ( nTds[i].className.indexOf(sClass+"3") != -1 )
-						{
-							for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
-							{
-								nTds[(iColumns*j)+i].className = 
-									$.trim( nTds[(iColumns*j)+i].className.replace( " "+sClass+"3", "" ) );
-							}
-						}
-					}
-				}
-				
-				/* Add the new classes to the table */
-				var iClass = 1, iTargetCol;
-				for ( i=0 ; i<aaSort.length ; i++ )
-				{
-					iTargetCol = parseInt( aaSort[i][0], 10 );
-					for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
-					{
-						nTds[(iColumns*j)+iTargetCol].className += " "+sClass+iClass;
-					}
-					
-					if ( iClass < 3 )
-					{
-						iClass++;
-					}
-				}
-			}
-		}
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Feature: Pagination. Note that most of the paging logic is done in 
-		 * _oExt.oPagination
-		 */
-		
-		/*
-		 * Function: _fnFeatureHtmlPaginate
-		 * Purpose:  Generate the node required for default pagination
-		 * Returns:  node
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnFeatureHtmlPaginate ( oSettings )
-		{
-			if ( oSettings.oScroll.bInfinite )
-			{
-				return null;
-			}
-			
-			var nPaginate = document.createElement( 'div' );
-			nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType;
-			
-			_oExt.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate, 
-				function( oSettings ) {
-					_fnCalculateEnd( oSettings );
-					_fnDraw( oSettings );
-				}
-			);
-			
-			/* Add a draw callback for the pagination on first instance, to update the paging display */
-			if ( typeof oSettings.aanFeatures.p == "undefined" )
-			{
-				oSettings.aoDrawCallback.push( {
-					"fn": function( oSettings ) {
-						_oExt.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) {
-							_fnCalculateEnd( oSettings );
-							_fnDraw( oSettings );
-						} );
-					},
-					"sName": "pagination"
-				} );
-			}
-			return nPaginate;
-		}
-		
-		/*
-		 * Function: _fnPageChange
-		 * Purpose:  Alter the display settings to change the page
-		 * Returns:  bool:true - page has changed, false - no change (no effect) eg 'first' on page 1
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           string:sAction - paging action to take: "first", "previous", "next" or "last"
-		 */
-		function _fnPageChange ( oSettings, sAction )
-		{
-			var iOldStart = oSettings._iDisplayStart;
-			
-			if ( sAction == "first" )
-			{
-				oSettings._iDisplayStart = 0;
-			}
-			else if ( sAction == "previous" )
-			{
-				oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ?
-					oSettings._iDisplayStart - oSettings._iDisplayLength :
-					0;
-				
-				/* Correct for underrun */
-				if ( oSettings._iDisplayStart < 0 )
-				{
-				  oSettings._iDisplayStart = 0;
-				}
-			}
-			else if ( sAction == "next" )
-			{
-				if ( oSettings._iDisplayLength >= 0 )
-				{
-					/* Make sure we are not over running the display array */
-					if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() )
-					{
-						oSettings._iDisplayStart += oSettings._iDisplayLength;
-					}
-				}
-				else
-				{
-					oSettings._iDisplayStart = 0;
-				}
-			}
-			else if ( sAction == "last" )
-			{
-				if ( oSettings._iDisplayLength >= 0 )
-				{
-					var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1;
-					oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength;
-				}
-				else
-				{
-					oSettings._iDisplayStart = 0;
-				}
-			}
-			else
-			{
-				_fnLog( oSettings, 0, "Unknown paging action: "+sAction );
-			}
-			
-			return iOldStart != oSettings._iDisplayStart;
-		}
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Feature: HTML info
-		 */
-		
-		/*
-		 * Function: _fnFeatureHtmlInfo
-		 * Purpose:  Generate the node required for the info display
-		 * Returns:  node
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnFeatureHtmlInfo ( oSettings )
-		{
-			var nInfo = document.createElement( 'div' );
-			nInfo.className = oSettings.oClasses.sInfo;
-			
-			/* Actions that are to be taken once only for this feature */
-			if ( typeof oSettings.aanFeatures.i == "undefined" )
-			{
-				/* Add draw callback */
-				oSettings.aoDrawCallback.push( {
-					"fn": _fnUpdateInfo,
-					"sName": "information"
-				} );
-				
-				/* Add id */
-				if ( oSettings.sTableId !== '' )
-				{
-					nInfo.setAttribute( 'id', oSettings.sTableId+'_info' );
-				}
-			}
-			
-			return nInfo;
-		}
-		
-		/*
-		 * Function: _fnUpdateInfo
-		 * Purpose:  Update the information elements in the display
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnUpdateInfo ( oSettings )
-		{
-			/* Show information about the table */
-			if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 )
-			{
-				return;
-			}
-			
-			var
-				iStart = oSettings._iDisplayStart+1, iEnd = oSettings.fnDisplayEnd(),
-				iMax = oSettings.fnRecordsTotal(), iTotal = oSettings.fnRecordsDisplay(),
-				sStart = oSettings.fnFormatNumber( iStart ), sEnd = oSettings.fnFormatNumber( iEnd ),
-				sMax = oSettings.fnFormatNumber( iMax ), sTotal = oSettings.fnFormatNumber( iTotal ),
-				sOut;
-			
-			/* When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
-			 * internally
-			 */
-			if ( oSettings.oScroll.bInfinite )
-			{
-				sStart = oSettings.fnFormatNumber( 1 );
-			}
-			
-			if ( oSettings.fnRecordsDisplay() === 0 && 
-				   oSettings.fnRecordsDisplay() == oSettings.fnRecordsTotal() )
-			{
-				/* Empty record set */
-				sOut = oSettings.oLanguage.sInfoEmpty+ oSettings.oLanguage.sInfoPostFix;
-			}
-			else if ( oSettings.fnRecordsDisplay() === 0 )
-			{
-				/* Rmpty record set after filtering */
-				sOut = oSettings.oLanguage.sInfoEmpty +' '+ 
-					oSettings.oLanguage.sInfoFiltered.replace('_MAX_', sMax)+
-						oSettings.oLanguage.sInfoPostFix;
-			}
-			else if ( oSettings.fnRecordsDisplay() == oSettings.fnRecordsTotal() )
-			{
-				/* Normal record set */
-				sOut = oSettings.oLanguage.sInfo.
-						replace('_START_', sStart).
-						replace('_END_',   sEnd).
-						replace('_TOTAL_', sTotal)+ 
-					oSettings.oLanguage.sInfoPostFix;
-			}
-			else
-			{
-				/* Record set after filtering */
-				sOut = oSettings.oLanguage.sInfo.
-						replace('_START_', sStart).
-						replace('_END_',   sEnd).
-						replace('_TOTAL_', sTotal) +' '+ 
-					oSettings.oLanguage.sInfoFiltered.replace('_MAX_', 
-						oSettings.fnFormatNumber(oSettings.fnRecordsTotal()))+ 
-					oSettings.oLanguage.sInfoPostFix;
-			}
-			
-			if ( oSettings.oLanguage.fnInfoCallback !== null )
-			{
-				sOut = oSettings.oLanguage.fnInfoCallback( oSettings, iStart, iEnd, iMax, iTotal, sOut );
-			}
-			
-			var n = oSettings.aanFeatures.i;
-			for ( var i=0, iLen=n.length ; i<iLen ; i++ )
-			{
-				$(n[i]).html( sOut );
-			}
-		}
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Feature: Length change
-		 */
-		
-		/*
-		 * Function: _fnFeatureHtmlLength
-		 * Purpose:  Generate the node required for user display length changing
-		 * Returns:  node
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnFeatureHtmlLength ( oSettings )
-		{
-			if ( oSettings.oScroll.bInfinite )
-			{
-				return null;
-			}
-			
-			/* This can be overruled by not using the _MENU_ var/macro in the language variable */
-			var sName = (oSettings.sTableId === "") ? "" : 'name="'+oSettings.sTableId+'_length"';
-			var sStdMenu = '<select size="1" '+sName+'>';
-			var i, iLen;
-			
-			if ( oSettings.aLengthMenu.length == 2 && typeof oSettings.aLengthMenu[0] == 'object' && 
-					typeof oSettings.aLengthMenu[1] == 'object' )
-			{
-				for ( i=0, iLen=oSettings.aLengthMenu[0].length ; i<iLen ; i++ )
-				{
-					sStdMenu += '<option value="'+oSettings.aLengthMenu[0][i]+'">'+
-						oSettings.aLengthMenu[1][i]+'</option>';
-				}
-			}
-			else
-			{
-				for ( i=0, iLen=oSettings.aLengthMenu.length ; i<iLen ; i++ )
-				{
-					sStdMenu += '<option value="'+oSettings.aLengthMenu[i]+'">'+
-						oSettings.aLengthMenu[i]+'</option>';
-				}
-			}
-			sStdMenu += '</select>';
-			
-			var nLength = document.createElement( 'div' );
-			if ( oSettings.sTableId !== '' && typeof oSettings.aanFeatures.l == "undefined" )
-			{
-				nLength.setAttribute( 'id', oSettings.sTableId+'_length' );
-			}
-			nLength.className = oSettings.oClasses.sLength;
-			nLength.innerHTML = oSettings.oLanguage.sLengthMenu.replace( '_MENU_', sStdMenu );
-			
-			/*
-			 * Set the length to the current display length - thanks to Andrea Pavlovic for this fix,
-			 * and Stefan Skopnik for fixing the fix!
-			 */
-			$('select option[value="'+oSettings._iDisplayLength+'"]',nLength).attr("selected",true);
-			
-			$('select', nLength).bind( 'change.DT', function(e) {
-				var iVal = $(this).val();
-				
-				/* Update all other length options for the new display */
-				var n = oSettings.aanFeatures.l;
-				for ( i=0, iLen=n.length ; i<iLen ; i++ )
-				{
-					if ( n[i] != this.parentNode )
-					{
-						$('select', n[i]).val( iVal );
-					}
-				}
-				
-				/* Redraw the table */
-				oSettings._iDisplayLength = parseInt(iVal, 10);
-				_fnCalculateEnd( oSettings );
-				
-				/* If we have space to show extra rows (backing up from the end point - then do so */
-				if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() )
-				{
-					oSettings._iDisplayStart = oSettings.fnDisplayEnd() - oSettings._iDisplayLength;
-					if ( oSettings._iDisplayStart < 0 )
-					{
-						oSettings._iDisplayStart = 0;
-					}
-				}
-				
-				if ( oSettings._iDisplayLength == -1 )
-				{
-					oSettings._iDisplayStart = 0;
-				}
-				
-				_fnDraw( oSettings );
-			} );
-			
-			return nLength;
-		}
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Feature: Processing incidator
-		 */
-		
-		/*
-		 * Function: _fnFeatureHtmlProcessing
-		 * Purpose:  Generate the node required for the processing node
-		 * Returns:  node
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnFeatureHtmlProcessing ( oSettings )
-		{
-			var nProcessing = document.createElement( 'div' );
-			
-			if ( oSettings.sTableId !== '' && typeof oSettings.aanFeatures.r == "undefined" )
-			{
-				nProcessing.setAttribute( 'id', oSettings.sTableId+'_processing' );
-			}
-			nProcessing.innerHTML = oSettings.oLanguage.sProcessing;
-			nProcessing.className = oSettings.oClasses.sProcessing;
-			oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable );
-			
-			return nProcessing;
-		}
-		
-		/*
-		 * Function: _fnProcessingDisplay
-		 * Purpose:  Display or hide the processing indicator
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           bool:
-		 *   true - show the processing indicator
-		 *   false - don't show
-		 */
-		function _fnProcessingDisplay ( oSettings, bShow )
-		{
-			if ( oSettings.oFeatures.bProcessing )
-			{
-				var an = oSettings.aanFeatures.r;
-				for ( var i=0, iLen=an.length ; i<iLen ; i++ )
-				{
-					an[i].style.visibility = bShow ? "visible" : "hidden";
-				}
-			}
-		}
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Support functions
-		 */
-		
-		/*
-		 * Function: _fnVisibleToColumnIndex
-		 * Purpose:  Covert the index of a visible column to the index in the data array (take account
-		 *   of hidden columns)
-		 * Returns:  int:i - the data index
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnVisibleToColumnIndex( oSettings, iMatch )
-		{
-			var iColumn = -1;
-			
-			for ( var i=0 ; i<oSettings.aoColumns.length ; i++ )
-			{
-				if ( oSettings.aoColumns[i].bVisible === true )
-				{
-					iColumn++;
-				}
-				
-				if ( iColumn == iMatch )
-				{
-					return i;
-				}
-			}
-			
-			return null;
-		}
-		
-		/*
-		 * Function: _fnColumnIndexToVisible
-		 * Purpose:  Covert the index of an index in the data array and convert it to the visible
-		 *   column index (take account of hidden columns)
-		 * Returns:  int:i - the data index
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnColumnIndexToVisible( oSettings, iMatch )
-		{
-			var iVisible = -1;
-			for ( var i=0 ; i<oSettings.aoColumns.length ; i++ )
-			{
-				if ( oSettings.aoColumns[i].bVisible === true )
-				{
-					iVisible++;
-				}
-				
-				if ( i == iMatch )
-				{
-					return oSettings.aoColumns[i].bVisible === true ? iVisible : null;
-				}
-			}
-			
-			return null;
-		}
-		
-		
-		/*
-		 * Function: _fnNodeToDataIndex
-		 * Purpose:  Take a TR element and convert it to an index in aoData
-		 * Returns:  int:i - index if found, null if not
-		 * Inputs:   object:s - dataTables settings object
-		 *           node:n - the TR element to find
-		 */
-		function _fnNodeToDataIndex( s, n )
-		{
-			var i, iLen;
-			
-			/* Optimisation - see if the nodes which are currently visible match, since that is
-			 * the most likely node to be asked for (a selector or event for example)
-			 */
-			for ( i=s._iDisplayStart, iLen=s._iDisplayEnd ; i<iLen ; i++ )
-			{
-				if ( s.aoData[ s.aiDisplay[i] ].nTr == n )
-				{
-					return s.aiDisplay[i];
-				}
-			}
-			
-			/* Otherwise we are in for a slog through the whole data cache */
-			for ( i=0, iLen=s.aoData.length ; i<iLen ; i++ )
-			{
-				if ( s.aoData[i].nTr == n )
-				{
-					return i;
-				}
-			}
-			return null;
-		}
-		
-		/*
-		 * Function: _fnVisbleColumns
-		 * Purpose:  Get the number of visible columns
-		 * Returns:  int:i - the number of visible columns
-		 * Inputs:   object:oS - dataTables settings object
-		 */
-		function _fnVisbleColumns( oS )
-		{
-			var iVis = 0;
-			for ( var i=0 ; i<oS.aoColumns.length ; i++ )
-			{
-				if ( oS.aoColumns[i].bVisible === true )
-				{
-					iVis++;
-				}
-			}
-			return iVis;
-		}
-		
-		/*
-		 * Function: _fnCalculateEnd
-		 * Purpose:  Rcalculate the end point based on the start point
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnCalculateEnd( oSettings )
-		{
-			if ( oSettings.oFeatures.bPaginate === false )
-			{
-				oSettings._iDisplayEnd = oSettings.aiDisplay.length;
-			}
-			else
-			{
-				/* Set the end point of the display - based on how many elements there are
-				 * still to display
-				 */
-				if ( oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length ||
-					   oSettings._iDisplayLength == -1 )
-				{
-					oSettings._iDisplayEnd = oSettings.aiDisplay.length;
-				}
-				else
-				{
-					oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength;
-				}
-			}
-		}
-		
-		/*
-		 * Function: _fnConvertToWidth
-		 * Purpose:  Convert a CSS unit width to pixels (e.g. 2em)
-		 * Returns:  int:iWidth - width in pixels
-		 * Inputs:   string:sWidth - width to be converted
-		 *           node:nParent - parent to get the with for (required for
-		 *             relative widths) - optional
-		 */
-		function _fnConvertToWidth ( sWidth, nParent )
-		{
-			if ( !sWidth || sWidth === null || sWidth === '' )
-			{
-				return 0;
-			}
-			
-			if ( typeof nParent == "undefined" )
-			{
-				nParent = document.getElementsByTagName('body')[0];
-			}
-			
-			var iWidth;
-			var nTmp = document.createElement( "div" );
-			nTmp.style.width = sWidth;
-			
-			nParent.appendChild( nTmp );
-			iWidth = nTmp.offsetWidth;
-			nParent.removeChild( nTmp );
-			
-			return ( iWidth );
-		}
-		
-		/*
-		 * Function: _fnCalculateColumnWidths
-		 * Purpose:  Calculate the width of columns for the table
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnCalculateColumnWidths ( oSettings )
-		{
-			var iTableWidth = oSettings.nTable.offsetWidth;
-			var iUserInputs = 0;
-			var iTmpWidth;
-			var iVisibleColumns = 0;
-			var iColums = oSettings.aoColumns.length;
-			var i;
-			var oHeaders = $('th', oSettings.nTHead);
-			
-			/* Convert any user input sizes into pixel sizes */
-			for ( i=0 ; i<iColums ; i++ )
-			{
-				if ( oSettings.aoColumns[i].bVisible )
-				{
-					iVisibleColumns++;
-					
-					if ( oSettings.aoColumns[i].sWidth !== null )
-					{
-						iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig, 
-							oSettings.nTable.parentNode );
-						if ( iTmpWidth !== null )
-						{
-							oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
-						}
-							
-						iUserInputs++;
-					}
-				}
-			}
-			
-			/* If the number of columns in the DOM equals the number that we have to process in 
-			 * DataTables, then we can use the offsets that are created by the web-browser. No custom 
-			 * sizes can be set in order for this to happen, nor scrolling used
-			 */
-			if ( iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums &&
-				oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
-			{
-				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
-				{
-					iTmpWidth = $(oHeaders[i]).width();
-					if ( iTmpWidth !== null )
-					{
-						oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
-					}
-				}
-			}
-			else
-			{
-				/* Otherwise we are going to have to do some calculations to get the width of each column.
-				 * Construct a 1 row table with the widest node in the data, and any user defined widths,
-				 * then insert it into the DOM and allow the browser to do all the hard work of
-				 * calculating table widths.
-				 */
-				var
-					nCalcTmp = oSettings.nTable.cloneNode( false ),
-					nBody = document.createElement( 'tbody' ),
-					nTr = document.createElement( 'tr' ),
-					nDivSizing;
-				
-				nCalcTmp.removeAttribute( "id" );
-				nCalcTmp.appendChild( oSettings.nTHead.cloneNode(true) );
-				if ( oSettings.nTFoot !== null )
-				{
-					nCalcTmp.appendChild( oSettings.nTFoot.cloneNode(true) );
-					_fnApplyToChildren( function(n) {
-						n.style.width = "";
-					}, nCalcTmp.getElementsByTagName('tr') );
-				}
-				
-				nCalcTmp.appendChild( nBody );
-				nBody.appendChild( nTr );
-				
-				/* Remove any sizing that was previously applied by the styles */
-				var jqColSizing = $('thead th', nCalcTmp);
-				if ( jqColSizing.length === 0 )
-				{
-					jqColSizing = $('tbody tr:eq(0)>td', nCalcTmp);
-				}
-				jqColSizing.each( function (i) {
-					this.style.width = "";
-					
-					var iIndex = _fnVisibleToColumnIndex( oSettings, i );
-					if ( iIndex !== null && oSettings.aoColumns[iIndex].sWidthOrig !== "" )
-					{
-						this.style.width = oSettings.aoColumns[iIndex].sWidthOrig;
-					}
-				} );
-				
-				/* Find the biggest td for each column and put it into the table */
-				for ( i=0 ; i<iColums ; i++ )
-				{
-					if ( oSettings.aoColumns[i].bVisible )
-					{
-						var nTd = _fnGetWidestNode( oSettings, i );
-						if ( nTd !== null )
-						{
-							nTd = nTd.cloneNode(true);
-							nTr.appendChild( nTd );
-						}
-					}
-				}
-				
-				/* Build the table and 'display' it */
-				var nWrapper = oSettings.nTable.parentNode;
-				nWrapper.appendChild( nCalcTmp );
-				
-				/* When scrolling (X or Y) we want to set the width of the table as appropriate. However,
-				 * when not scrolling leave the table width as it is. This results in slightly different,
-				 * but I think correct behaviour
-				 */
-				if ( oSettings.oScroll.sX !== "" && oSettings.oScroll.sXInner !== "" )
-				{
-					nCalcTmp.style.width = _fnStringToCss(oSettings.oScroll.sXInner);
-				}
-				else if ( oSettings.oScroll.sX !== "" )
-				{
-					nCalcTmp.style.width = "";
-					if ( $(nCalcTmp).width() < nWrapper.offsetWidth )
-					{
-						nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
-					}
-				}
-				else if ( oSettings.oScroll.sY !== "" )
-				{
-					nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
-				}
-				nCalcTmp.style.visibility = "hidden";
-				
-				/* Scrolling considerations */
-				_fnScrollingWidthAdjust( oSettings, nCalcTmp );
-				
-				/* Read the width's calculated by the browser and store them for use by the caller. We
-				 * first of all try to use the elements in the body, but it is possible that there are
-				 * no elements there, under which circumstances we use the header elements
-				 */
-				var oNodes = $("tbody tr:eq(0)>td", nCalcTmp);
-				if ( oNodes.length === 0 )
-				{
-					oNodes = $("thead tr:eq(0)>th", nCalcTmp);
-				}
-				
-				var iIndex, iCorrector = 0, iWidth;
-				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
-				{
-					if ( oSettings.aoColumns[i].bVisible )
-					{
-						iWidth = $(oNodes[iCorrector]).outerWidth();
-						if ( iWidth !== null && iWidth > 0 )
-						{
-							oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth );
-						}
-						iCorrector++;
-					}
-				}
-				
-				oSettings.nTable.style.width = _fnStringToCss( $(nCalcTmp).outerWidth() );
-				nCalcTmp.parentNode.removeChild( nCalcTmp );
-			}
-		}
-		
-		/*
-		 * Function: _fnScrollingWidthAdjust
-		 * Purpose:  Adjust a table's width to take account of scrolling
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           node:n - table node
-		 */
-		function _fnScrollingWidthAdjust ( oSettings, n )
-		{
-			if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" )
-			{
-				/* When y-scrolling only, we want to remove the width of the scroll bar so the table
-				 * + scroll bar will fit into the area avaialble.
-				 */
-				var iOrigWidth = $(n).width();
-				n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth );
-			}
-			else if ( oSettings.oScroll.sX !== "" )
-			{
-				/* When x-scrolling both ways, fix the table at it's current size, without adjusting */
-				n.style.width = _fnStringToCss( $(n).outerWidth() );
-			}
-		}
-		
-		/*
-		 * Function: _fnGetWidestNode
-		 * Purpose:  Get the widest node
-		 * Returns:  string: - max strlens for each column
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           int:iCol - column of interest
-		 *           boolean:bFast - Should we use fast (but non-accurate) calculation - optional,
-		 *             default true
-		 * Notes:    This operation is _expensive_ (!!!). It requires a lot of DOM interaction, but
-		 *   this is the only way to reliably get the widest string. For example 'mmm' would be wider
-		 *   than 'iiii' so we can't just ocunt characters. If this can be optimised it would be good
-		 *   to do so!
-		 */
-		function _fnGetWidestNode( oSettings, iCol, bFast )
-		{
-			/* Use fast not non-accurate calculate based on the strlen */
-			if ( typeof bFast == 'undefined' || bFast )
-			{
-				var iMaxLen = _fnGetMaxLenString( oSettings, iCol );
-				var iFastVis = _fnColumnIndexToVisible( oSettings, iCol);
-				if ( iMaxLen < 0 )
-				{
-					return null;
-				}
-				return oSettings.aoData[iMaxLen].nTr.getElementsByTagName('td')[iFastVis];
-			}
-			
-			/* Use the slow approach, but get high quality answers - note that this code is not actually
-			 * used by DataTables by default. If you want to use it you can alter the call to 
-			 * _fnGetWidestNode to pass 'false' as the third argument
-			 */
-			var
-				iMax = -1, i, iLen,
-				iMaxIndex = -1,
-				n = document.createElement('div');
-			
-			n.style.visibility = "hidden";
-			n.style.position = "absolute";
-			document.body.appendChild( n );
-			
-			for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
-			{
-				n.innerHTML = oSettings.aoData[i]._aData[iCol];
-				if ( n.offsetWidth > iMax )
-				{
-					iMax = n.offsetWidth;
-					iMaxIndex = i;
-				}
-			}
-			document.body.removeChild( n );
-			
-			if ( iMaxIndex >= 0 )
-			{
-				var iVis = _fnColumnIndexToVisible( oSettings, iCol);
-				var nRet = oSettings.aoData[iMaxIndex].nTr.getElementsByTagName('td')[iVis];
-				if ( nRet )
-				{
-					return nRet;
-				}
-			}
-			return null;
-		}
-		
-		/*
-		 * Function: _fnGetMaxLenString
-		 * Purpose:  Get the maximum strlen for each data column
-		 * Returns:  string: - max strlens for each column
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           int:iCol - column of interest
-		 */
-		function _fnGetMaxLenString( oSettings, iCol )
-		{
-			var iMax = -1;
-			var iMaxIndex = -1;
-			
-			for ( var i=0 ; i<oSettings.aoData.length ; i++ )
-			{
-				var s = oSettings.aoData[i]._aData[iCol];
-				if ( s.length > iMax )
-				{
-					iMax = s.length;
-					iMaxIndex = i;
-				}
-			}
-			
-			return iMaxIndex;
-		}
-		
-		/*
-		 * Function: _fnStringToCss
-		 * Purpose:  Append a CSS unit (only if required) to a string
-		 * Returns:  0 if match, 1 if length is different, 2 if no match
-		 * Inputs:   array:aArray1 - first array
-		 *           array:aArray2 - second array
-		 */
-		function _fnStringToCss( s )
-		{
-			if ( s === null )
-			{
-				return "0px";
-			}
-			
-			if ( typeof s == 'number' )
-			{
-				if ( s < 0 )
-				{
-					return "0px";
-				}
-				return s+"px";
-			}
-			
-			/* Check if the last character is not 0-9 */
-			var c = s.charCodeAt( s.length-1 );
-			if (c < 0x30 || c > 0x39)
-			{
-				return s;
-			}
-			return s+"px";
-		}
-		
-		/*
-		 * Function: _fnArrayCmp
-		 * Purpose:  Compare two arrays
-		 * Returns:  0 if match, 1 if length is different, 2 if no match
-		 * Inputs:   array:aArray1 - first array
-		 *           array:aArray2 - second array
-		 */
-		function _fnArrayCmp( aArray1, aArray2 )
-		{
-			if ( aArray1.length != aArray2.length )
-			{
-				return 1;
-			}
-			
-			for ( var i=0 ; i<aArray1.length ; i++ )
-			{
-				if ( aArray1[i] != aArray2[i] )
-				{
-					return 2;
-				}
-			}
-			
-			return 0;
-		}
-		
-		/*
-		 * Function: _fnDetectType
-		 * Purpose:  Get the sort type based on an input string
-		 * Returns:  string: - type (defaults to 'string' if no type can be detected)
-		 * Inputs:   string:sData - data we wish to know the type of
-		 * Notes:    This function makes use of the DataTables plugin objct _oExt 
-		 *   (.aTypes) such that new types can easily be added.
-		 */
-		function _fnDetectType( sData )
-		{
-			var aTypes = _oExt.aTypes;
-			var iLen = aTypes.length;
-			
-			for ( var i=0 ; i<iLen ; i++ )
-			{
-				var sType = aTypes[i]( sData );
-				if ( sType !== null )
-				{
-					return sType;
-				}
-			}
-			
-			return 'string';
-		}
-		
-		/*
-		 * Function: _fnSettingsFromNode
-		 * Purpose:  Return the settings object for a particular table
-		 * Returns:  object: Settings object - or null if not found
-		 * Inputs:   node:nTable - table we are using as a dataTable
-		 */
-		function _fnSettingsFromNode ( nTable )
-		{
-			for ( var i=0 ; i<_aoSettings.length ; i++ )
-			{
-				if ( _aoSettings[i].nTable == nTable )
-				{
-					return _aoSettings[i];
-				}
-			}
-			
-			return null;
-		}
-		
-		/*
-		 * Function: _fnGetDataMaster
-		 * Purpose:  Return an array with the full table data
-		 * Returns:  array array:aData - Master data array
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnGetDataMaster ( oSettings )
-		{
-			var aData = [];
-			var iLen = oSettings.aoData.length;
-			for ( var i=0 ; i<iLen; i++ )
-			{
-				aData.push( oSettings.aoData[i]._aData );
-			}
-			return aData;
-		}
-		
-		/*
-		 * Function: _fnGetTrNodes
-		 * Purpose:  Return an array with the TR nodes for the table
-		 * Returns:  array: - TR array
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnGetTrNodes ( oSettings )
-		{
-			var aNodes = [];
-			var iLen = oSettings.aoData.length;
-			for ( var i=0 ; i<iLen ; i++ )
-			{
-				aNodes.push( oSettings.aoData[i].nTr );
-			}
-			return aNodes;
-		}
-		
-		/*
-		 * Function: _fnGetTdNodes
-		 * Purpose:  Return an array with the TD nodes for the table
-		 * Returns:  array: - TD array
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnGetTdNodes ( oSettings )
-		{
-			var nTrs = _fnGetTrNodes( oSettings );
-			var nTds = [], nTd;
-			var anReturn = [];
-			var iCorrector;
-			var iRow, iRows, iColumn, iColumns;
-			
-			for ( iRow=0, iRows=nTrs.length ; iRow<iRows ; iRow++ )
-			{
-				nTds = [];
-				for ( iColumn=0, iColumns=nTrs[iRow].childNodes.length ; iColumn<iColumns ; iColumn++ )
-				{
-					nTd = nTrs[iRow].childNodes[iColumn];
-					if ( nTd.nodeName.toUpperCase() == "TD" )
-					{
-						nTds.push( nTd );
-					}
-				}
-				
-				iCorrector = 0;
-				for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
-				{
-					if ( oSettings.aoColumns[iColumn].bVisible )
-					{
-						anReturn.push( nTds[iColumn-iCorrector] );
-					}
-					else
-					{
-						anReturn.push( oSettings.aoData[iRow]._anHidden[iColumn] );
-						iCorrector++;
-					}
-				}
-			}
-			return anReturn;
-		}
-		
-		/*
-		 * Function: _fnEscapeRegex
-		 * Purpose:  scape a string stuch that it can be used in a regular expression
-		 * Returns:  string: - escaped string
-		 * Inputs:   string:sVal - string to escape
-		 */
-		function _fnEscapeRegex ( sVal )
-		{
-			var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^' ];
-		  var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' );
-		  return sVal.replace(reReplace, '\\$1');
-		}
-		
-		/*
-		 * Function: _fnDeleteIndex
-		 * Purpose:  Take an array of integers (index array) and remove a target integer (value - not 
-		 *             the key!)
-		 * Returns:  -
-		 * Inputs:   a:array int - Index array to target
-		 *           int:iTarget - value to find
-		 */
-		function _fnDeleteIndex( a, iTarget )
-		{
-			var iTargetIndex = -1;
-			
-			for ( var i=0, iLen=a.length ; i<iLen ; i++ )
-			{
-				if ( a[i] == iTarget )
-				{
-					iTargetIndex = i;
-				}
-				else if ( a[i] > iTarget )
-				{
-					a[i]--;
-				}
-			}
-			
-			if ( iTargetIndex != -1 )
-			{
-				a.splice( iTargetIndex, 1 );
-			}
-		}
-		
-		/*
-		 * Function: _fnReOrderIndex
-		 * Purpose:  Figure out how to reorder a display list
-		 * Returns:  array int:aiReturn - index list for reordering
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnReOrderIndex ( oSettings, sColumns )
-		{
-			var aColumns = sColumns.split(',');
-			var aiReturn = [];
-			
-			for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-			{
-				for ( var j=0 ; j<iLen ; j++ )
-				{
-					if ( oSettings.aoColumns[i].sName == aColumns[j] )
-					{
-						aiReturn.push( j );
-						break;
-					}
-				}
-			}
-			
-			return aiReturn;
-		}
-		
-		/*
-		 * Function: _fnColumnOrdering
-		 * Purpose:  Get the column ordering that DataTables expects
-		 * Returns:  string: - comma separated list of names
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnColumnOrdering ( oSettings )
-		{
-			var sNames = '';
-			for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-			{
-				sNames += oSettings.aoColumns[i].sName+',';
-			}
-			if ( sNames.length == iLen )
-			{
-				return "";
-			}
-			return sNames.slice(0, -1);
-		}
-		
-		/*
-		 * Function: _fnLog
-		 * Purpose:  Log an error message
-		 * Returns:  -
-		 * Inputs:   int:iLevel - log error messages, or display them to the user
-		 *           string:sMesg - error message
-		 */
-		function _fnLog( oSettings, iLevel, sMesg )
-		{
-			var sAlert = oSettings.sTableId === "" ?
-			 	"DataTables warning: " +sMesg :
-			 	"DataTables warning (table id = '"+oSettings.sTableId+"'): " +sMesg;
-			
-			if ( iLevel === 0 )
-			{
-				if ( _oExt.sErrMode == 'alert' )
-				{
-					alert( sAlert );
-				}
-				else
-				{
-					throw sAlert;
-				}
-				return;
-			}
-			else if ( typeof console != 'undefined' && typeof console.log != 'undefined' )
-			{
-				console.log( sAlert );
-			}
-		}
-		
-		/*
-		 * Function: _fnClearTable
-		 * Purpose:  Nuke the table
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnClearTable( oSettings )
-		{
-			oSettings.aoData.splice( 0, oSettings.aoData.length );
-			oSettings.aiDisplayMaster.splice( 0, oSettings.aiDisplayMaster.length );
-			oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length );
-			_fnCalculateEnd( oSettings );
-		}
-		
-		/*
-		 * Function: _fnSaveState
-		 * Purpose:  Save the state of a table in a cookie such that the page can be reloaded
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 */
-		function _fnSaveState ( oSettings )
-		{
-			if ( !oSettings.oFeatures.bStateSave || typeof oSettings.bDestroying != 'undefined' )
-			{
-				return;
-			}
-			
-			/* Store the interesting variables */
-			var i, iLen, sTmp;
-			var sValue = "{";
-			sValue += '"iCreate":'+ new Date().getTime()+',';
-			sValue += '"iStart":'+ oSettings._iDisplayStart+',';
-			sValue += '"iEnd":'+ oSettings._iDisplayEnd+',';
-			sValue += '"iLength":'+ oSettings._iDisplayLength+',';
-			sValue += '"sFilter":"'+ encodeURIComponent(oSettings.oPreviousSearch.sSearch)+'",';
-			sValue += '"sFilterEsc":'+ !oSettings.oPreviousSearch.bRegex+',';
-			
-			sValue += '"aaSorting":[ ';
-			for ( i=0 ; i<oSettings.aaSorting.length ; i++ )
-			{
-				sValue += '['+oSettings.aaSorting[i][0]+',"'+oSettings.aaSorting[i][1]+'"],';
-			}
-			sValue = sValue.substring(0, sValue.length-1);
-			sValue += "],";
-			
-			sValue += '"aaSearchCols":[ ';
-			for ( i=0 ; i<oSettings.aoPreSearchCols.length ; i++ )
-			{
-				sValue += '["'+encodeURIComponent(oSettings.aoPreSearchCols[i].sSearch)+
-					'",'+!oSettings.aoPreSearchCols[i].bRegex+'],';
-			}
-			sValue = sValue.substring(0, sValue.length-1);
-			sValue += "],";
-			
-			sValue += '"abVisCols":[ ';
-			for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
-			{
-				sValue += oSettings.aoColumns[i].bVisible+",";
-			}
-			sValue = sValue.substring(0, sValue.length-1);
-			sValue += "]";
-			
-			/* Save state from any plug-ins */
-			for ( i=0, iLen=oSettings.aoStateSave.length ; i<iLen ; i++ )
-			{
-				sTmp = oSettings.aoStateSave[i].fn( oSettings, sValue );
-				if ( sTmp !== "" )
-				{
-					sValue = sTmp;
-				}
-			}
-			
-			sValue += "}";
-			
-			_fnCreateCookie( oSettings.sCookiePrefix+oSettings.sInstance, sValue, 
-				oSettings.iCookieDuration, oSettings.sCookiePrefix, oSettings.fnCookieCallback );
-		}
-		
-		/*
-		 * Function: _fnLoadState
-		 * Purpose:  Attempt to load a saved table state from a cookie
-		 * Returns:  -
-		 * Inputs:   object:oSettings - dataTables settings object
-		 *           object:oInit - DataTables init object so we can override settings
-		 */
-		function _fnLoadState ( oSettings, oInit )
-		{
-			if ( !oSettings.oFeatures.bStateSave )
-			{
-				return;
-			}
-			
-			var oData, i, iLen;
-			var sData = _fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance );
-			if ( sData !== null && sData !== '' )
-			{
-				/* Try/catch the JSON eval - if it is bad then we ignore it - note that 1.7.0 and before
-				 * incorrectly used single quotes for some strings - hence the replace below
-				 */
-				try
-				{
-					oData = (typeof $.parseJSON == 'function') ? 
-						$.parseJSON( sData.replace(/'/g, '"') ) : eval( '('+sData+')' );
-				}
-				catch( e )
-				{
-					return;
-				}
-				
-				/* Allow custom and plug-in manipulation functions to alter the data set which was
-				 * saved, and also reject any saved state by returning false
-				 */
-				for ( i=0, iLen=oSettings.aoStateLoad.length ; i<iLen ; i++ )
-				{
-					if ( !oSettings.aoStateLoad[i].fn( oSettings, oData ) )
-					{
-						return;
-					}
-				}
-				
-				/* Store the saved state so it might be accessed at any time (particualrly a plug-in */
-				oSettings.oLoadedState = $.extend( true, {}, oData );
-				
-				/* Restore key features */
-				oSettings._iDisplayStart = oData.iStart;
-				oSettings.iInitDisplayStart = oData.iStart;
-				oSettings._iDisplayEnd = oData.iEnd;
-				oSettings._iDisplayLength = oData.iLength;
-				oSettings.oPreviousSearch.sSearch = decodeURIComponent(oData.sFilter);
-				oSettings.aaSorting = oData.aaSorting.slice();
-				oSettings.saved_aaSorting = oData.aaSorting.slice();
-				
-				/*
-				 * Search filtering - global reference added in 1.4.1
-				 * Note that we use a 'not' for the value of the regular expression indicator to maintain
-				 * compatibility with pre 1.7 versions, where this was basically inverted. Added in 1.7.0
-				 */
-				if ( typeof oData.sFilterEsc != 'undefined' )
-				{
-					oSettings.oPreviousSearch.bRegex = !oData.sFilterEsc;
-				}
-				
-				/* Column filtering - added in 1.5.0 beta 6 */
-				if ( typeof oData.aaSearchCols != 'undefined' )
-				{
-					for ( i=0 ; i<oData.aaSearchCols.length ; i++ )
-					{
-						oSettings.aoPreSearchCols[i] = {
-							"sSearch": decodeURIComponent(oData.aaSearchCols[i][0]),
-							"bRegex": !oData.aaSearchCols[i][1]
-						};
-					}
-				}
-				
-				/* Column visibility state - added in 1.5.0 beta 10 */
-				if ( typeof oData.abVisCols != 'undefined' )
-				{
-					/* Pass back visibiliy settings to the init handler, but to do not here override
-					 * the init object that the user might have passed in
-					 */
-					oInit.saved_aoColumns = [];
-					for ( i=0 ; i<oData.abVisCols.length ; i++ )
-					{
-						oInit.saved_aoColumns[i] = {};
-						oInit.saved_aoColumns[i].bVisible = oData.abVisCols[i];
-					}
-				}
-			}
-		}
-		
-		/*
-		 * Function: _fnCreateCookie
-		 * Purpose:  Create a new cookie with a value to store the state of a table
-		 * Returns:  -
-		 * Inputs:   string:sName - name of the cookie to create
-		 *           string:sValue - the value the cookie should take
-		 *           int:iSecs - duration of the cookie
-		 *           string:sBaseName - sName is made up of the base + file name - this is the base
-		 *           function:fnCallback - User definable function to modify the cookie
-		 */
-		function _fnCreateCookie ( sName, sValue, iSecs, sBaseName, fnCallback )
-		{
-			var date = new Date();
-			date.setTime( date.getTime()+(iSecs*1000) );
-			
-			/* 
-			 * Shocking but true - it would appear IE has major issues with having the path not having
-			 * a trailing slash on it. We need the cookie to be available based on the path, so we
-			 * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the
-			 * patch to use at least some of the path
-			 */
-			var aParts = window.location.pathname.split('/');
-			var sNameFile = sName + '_' + aParts.pop().replace(/[\/:]/g,"").toLowerCase();
-			var sFullCookie, oData;
-			
-			if ( fnCallback !== null )
-			{
-				oData = (typeof $.parseJSON == 'function') ? 
-					$.parseJSON( sValue ) : eval( '('+sValue+')' );
-				sFullCookie = fnCallback( sNameFile, oData, date.toGMTString(),
-					aParts.join('/')+"/" );
-			}
-			else
-			{
-				sFullCookie = sNameFile + "=" + encodeURIComponent(sValue) +
-					"; expires=" + date.toGMTString() +"; path=" + aParts.join('/')+"/";
-			}
-			
-			/* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies
-			 * belonging to DataTables. This is FAR from bullet proof
-			 */
-			var sOldName="", iOldTime=9999999999999;
-			var iLength = _fnReadCookie( sNameFile )!==null ? document.cookie.length : 
-				sFullCookie.length + document.cookie.length;
-			
-			if ( iLength+10 > 4096 ) /* Magic 10 for padding */
-			{
-				var aCookies =document.cookie.split(';');
-				for ( var i=0, iLen=aCookies.length ; i<iLen ; i++ )
-				{
-					if ( aCookies[i].indexOf( sBaseName ) != -1 )
-					{
-						/* It's a DataTables cookie, so eval it and check the time stamp */
-						var aSplitCookie = aCookies[i].split('=');
-						try { oData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' ); }
-						catch( e ) { continue; }
-						
-						if ( typeof oData.iCreate != 'undefined' && oData.iCreate < iOldTime )
-						{
-							sOldName = aSplitCookie[0];
-							iOldTime = oData.iCreate;
-						}
-					}
-				}
-				
-				if ( sOldName !== "" )
-				{
-					document.cookie = sOldName+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+
-						aParts.join('/') + "/";
-				}
-			}
-			
-			document.cookie = sFullCookie;
-		}
-		
-		/*
-		 * Function: _fnReadCookie
-		 * Purpose:  Read an old cookie to get a cookie with an old table state
-		 * Returns:  string: - contents of the cookie - or null if no cookie with that name found
-		 * Inputs:   string:sName - name of the cookie to read
-		 */
-		function _fnReadCookie ( sName )
-		{
-			var
-				aParts = window.location.pathname.split('/'),
-				sNameEQ = sName + '_' + aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase() + '=',
-			 	sCookieContents = document.cookie.split(';');
-			
-			for( var i=0 ; i<sCookieContents.length ; i++ )
-			{
-				var c = sCookieContents[i];
-				
-				while (c.charAt(0)==' ')
-				{
-					c = c.substring(1,c.length);
-				}
-				
-				if (c.indexOf(sNameEQ) === 0)
-				{
-					return decodeURIComponent( c.substring(sNameEQ.length,c.length) );
-				}
-			}
-			return null;
-		}
-		
-		/*
-		 * Function: _fnGetUniqueThs
-		 * Purpose:  Get an array of unique th elements, one for each column
-		 * Returns:  array node:aReturn - list of unique ths
-		 * Inputs:   node:nThead - The thead element for the table
-		 */
-		function _fnGetUniqueThs ( nThead )
-		{
-			var nTrs = nThead.getElementsByTagName('tr');
-			
-			/* Nice simple case */
-			if ( nTrs.length == 1 )
-			{
-				return nTrs[0].getElementsByTagName('th');
-			}
-			
-			/* Otherwise we need to figure out the layout array to get the nodes */
-			var aLayout = [], aReturn = [];
-			var ROWSPAN = 2, COLSPAN = 3, TDELEM = 4;
-			var i, j, k, iLen, jLen, iColumnShifted;
-			var fnShiftCol = function ( a, i, j ) {
-				while ( typeof a[i][j] != 'undefined' ) {
-					j++;
-				}
-				return j;
-			};
-			var fnAddRow = function ( i ) {
-				if ( typeof aLayout[i] == 'undefined' ) {
-					aLayout[i] = [];
-				}
-			};
-			
-			/* Calculate a layout array */
-			for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
-			{
-				fnAddRow( i );
-				var iColumn = 0;
-				var nTds = [];
-				
-				for ( j=0, jLen=nTrs[i].childNodes.length ; j<jLen ; j++ )
-				{
-					if ( nTrs[i].childNodes[j].nodeName.toUpperCase() == "TD" ||
-					     nTrs[i].childNodes[j].nodeName.toUpperCase() == "TH" )
-					{
-						nTds.push( nTrs[i].childNodes[j] );
-					}
-				}
-				
-				for ( j=0, jLen=nTds.length ; j<jLen ; j++ )
-				{
-					var iColspan = nTds[j].getAttribute('colspan') * 1;
-					var iRowspan = nTds[j].getAttribute('rowspan') * 1;
-					
-					if ( !iColspan || iColspan===0 || iColspan===1 )
-					{
-						iColumnShifted = fnShiftCol( aLayout, i, iColumn );
-						aLayout[i][iColumnShifted] = (nTds[j].nodeName.toUpperCase()=="TD") ? TDELEM : nTds[j];
-						if ( iRowspan || iRowspan===0 || iRowspan===1 )
-						{
-							for ( k=1 ; k<iRowspan ; k++ )
-							{
-								fnAddRow( i+k );
-								aLayout[i+k][iColumnShifted] = ROWSPAN;
-							}
-						}
-						iColumn++;
-					}
-					else
-					{
-						iColumnShifted = fnShiftCol( aLayout, i, iColumn );
-						for ( k=0 ; k<iColspan ; k++ )
-						{
-							aLayout[i][iColumnShifted+k] = COLSPAN;
-						}
-						iColumn += iColspan;
-					}
-				}
-			}
-			
-			/* Convert the layout array into a node array */
-			for ( i=0, iLen=aLayout.length ; i<iLen ; i++ )
-			{
-				for ( j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
-				{
-					if ( typeof aLayout[i][j] == 'object' && typeof aReturn[j] == 'undefined' )
-					{
-						aReturn[j] = aLayout[i][j];
-					}
-				}
-			}
-			
-			return aReturn;
-		}
-		
-		/*
-		 * Function: _fnScrollBarWidth
-		 * Purpose:  Get the width of a scroll bar in this browser being used
-		 * Returns:  int: - width in pixels
-		 * Inputs:   -
-		 * Notes:    All credit for this function belongs to Alexandre Gomes. Thanks for sharing!
-		 *   http://www.alexandre-gomes.com/?p=115
-		 */
-		function _fnScrollBarWidth ()
-		{  
-			var inner = document.createElement('p');  
-			var style = inner.style;
-			style.width = "100%";  
-			style.height = "200px";  
-			
-			var outer = document.createElement('div');  
-			style = outer.style;
-			style.position = "absolute";  
-			style.top = "0px";  
-			style.left = "0px";  
-			style.visibility = "hidden";  
-			style.width = "200px";  
-			style.height = "150px";  
-			style.overflow = "hidden";  
-			outer.appendChild(inner);  
-			
-			document.body.appendChild(outer);  
-			var w1 = inner.offsetWidth;  
-			outer.style.overflow = 'scroll';  
-			var w2 = inner.offsetWidth;  
-			if ( w1 == w2 )
-			{
-				w2 = outer.clientWidth;  
-			}
-			
-			document.body.removeChild(outer); 
-			return (w1 - w2);  
-		}
-		
-		/*
-		 * Function: _fnApplyToChildren
-		 * Purpose:  Apply a given function to the display child nodes of an element array (typically
-		 *   TD children of TR rows
-		 * Returns:  - (done by reference)
-		 * Inputs:   function:fn - Method to apply to the objects
-		 *           array nodes:an1 - List of elements to look through for display children
-		 *           array nodes:an2 - Another list (identical structure to the first) - optional
-		 */
-		function _fnApplyToChildren( fn, an1, an2 )
-		{
-			for ( var i=0, iLen=an1.length ; i<iLen ; i++ )
-			{
-				for ( var j=0, jLen=an1[i].childNodes.length ; j<jLen ; j++ )
-				{
-					if ( an1[i].childNodes[j].nodeType == 1 )
-					{
-						if ( typeof an2 != 'undefined' )
-						{
-							fn( an1[i].childNodes[j], an2[i].childNodes[j] );
-						}
-						else
-						{
-							fn( an1[i].childNodes[j] );
-						}
-					}
-				}
-			}
-		}
-		
-		/*
-		 * Function: _fnMap
-		 * Purpose:  See if a property is defined on one object, if so assign it to the other object
-		 * Returns:  - (done by reference)
-		 * Inputs:   object:oRet - target object
-		 *           object:oSrc - source object
-		 *           string:sName - property
-		 *           string:sMappedName - name to map too - optional, sName used if not given
-		 */
-		function _fnMap( oRet, oSrc, sName, sMappedName )
-		{
-			if ( typeof sMappedName == 'undefined' )
-			{
-				sMappedName = sName;
-			}
-			if ( typeof oSrc[sName] != 'undefined' )
-			{
-				oRet[sMappedName] = oSrc[sName];
-			}
-		}
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - API
-		 * 
-		 * I'm not overly happy with this solution - I'd much rather that there was a way of getting
-		 * a list of all the private functions and do what we need to dynamically - but that doesn't
-		 * appear to be possible. Bonkers. A better solution would be to provide a 'bind' type object
-		 * To do - bind type method in DTs 2.x.
-		 */
-		this.oApi._fnExternApiFunc = _fnExternApiFunc;
-		this.oApi._fnInitalise = _fnInitalise;
-		this.oApi._fnLanguageProcess = _fnLanguageProcess;
-		this.oApi._fnAddColumn = _fnAddColumn;
-		this.oApi._fnColumnOptions = _fnColumnOptions;
-		this.oApi._fnAddData = _fnAddData;
-		this.oApi._fnGatherData = _fnGatherData;
-		this.oApi._fnDrawHead = _fnDrawHead;
-		this.oApi._fnDraw = _fnDraw;
-		this.oApi._fnReDraw = _fnReDraw;
-		this.oApi._fnAjaxUpdate = _fnAjaxUpdate;
-		this.oApi._fnAjaxUpdateDraw = _fnAjaxUpdateDraw;
-		this.oApi._fnAddOptionsHtml = _fnAddOptionsHtml;
-		this.oApi._fnFeatureHtmlTable = _fnFeatureHtmlTable;
-		this.oApi._fnScrollDraw = _fnScrollDraw;
-		this.oApi._fnAjustColumnSizing = _fnAjustColumnSizing;
-		this.oApi._fnFeatureHtmlFilter = _fnFeatureHtmlFilter;
-		this.oApi._fnFilterComplete = _fnFilterComplete;
-		this.oApi._fnFilterCustom = _fnFilterCustom;
-		this.oApi._fnFilterColumn = _fnFilterColumn;
-		this.oApi._fnFilter = _fnFilter;
-		this.oApi._fnBuildSearchArray = _fnBuildSearchArray;
-		this.oApi._fnBuildSearchRow = _fnBuildSearchRow;
-		this.oApi._fnFilterCreateSearch = _fnFilterCreateSearch;
-		this.oApi._fnDataToSearch = _fnDataToSearch;
-		this.oApi._fnSort = _fnSort;
-		this.oApi._fnSortAttachListener = _fnSortAttachListener;
-		this.oApi._fnSortingClasses = _fnSortingClasses;
-		this.oApi._fnFeatureHtmlPaginate = _fnFeatureHtmlPaginate;
-		this.oApi._fnPageChange = _fnPageChange;
-		this.oApi._fnFeatureHtmlInfo = _fnFeatureHtmlInfo;
-		this.oApi._fnUpdateInfo = _fnUpdateInfo;
-		this.oApi._fnFeatureHtmlLength = _fnFeatureHtmlLength;
-		this.oApi._fnFeatureHtmlProcessing = _fnFeatureHtmlProcessing;
-		this.oApi._fnProcessingDisplay = _fnProcessingDisplay;
-		this.oApi._fnVisibleToColumnIndex = _fnVisibleToColumnIndex;
-		this.oApi._fnColumnIndexToVisible = _fnColumnIndexToVisible;
-		this.oApi._fnNodeToDataIndex = _fnNodeToDataIndex;
-		this.oApi._fnVisbleColumns = _fnVisbleColumns;
-		this.oApi._fnCalculateEnd = _fnCalculateEnd;
-		this.oApi._fnConvertToWidth = _fnConvertToWidth;
-		this.oApi._fnCalculateColumnWidths = _fnCalculateColumnWidths;
-		this.oApi._fnScrollingWidthAdjust = _fnScrollingWidthAdjust;
-		this.oApi._fnGetWidestNode = _fnGetWidestNode;
-		this.oApi._fnGetMaxLenString = _fnGetMaxLenString;
-		this.oApi._fnStringToCss = _fnStringToCss;
-		this.oApi._fnArrayCmp = _fnArrayCmp;
-		this.oApi._fnDetectType = _fnDetectType;
-		this.oApi._fnSettingsFromNode = _fnSettingsFromNode;
-		this.oApi._fnGetDataMaster = _fnGetDataMaster;
-		this.oApi._fnGetTrNodes = _fnGetTrNodes;
-		this.oApi._fnGetTdNodes = _fnGetTdNodes;
-		this.oApi._fnEscapeRegex = _fnEscapeRegex;
-		this.oApi._fnDeleteIndex = _fnDeleteIndex;
-		this.oApi._fnReOrderIndex = _fnReOrderIndex;
-		this.oApi._fnColumnOrdering = _fnColumnOrdering;
-		this.oApi._fnLog = _fnLog;
-		this.oApi._fnClearTable = _fnClearTable;
-		this.oApi._fnSaveState = _fnSaveState;
-		this.oApi._fnLoadState = _fnLoadState;
-		this.oApi._fnCreateCookie = _fnCreateCookie;
-		this.oApi._fnReadCookie = _fnReadCookie;
-		this.oApi._fnGetUniqueThs = _fnGetUniqueThs;
-		this.oApi._fnScrollBarWidth = _fnScrollBarWidth;
-		this.oApi._fnApplyToChildren = _fnApplyToChildren;
-		this.oApi._fnMap = _fnMap;
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Section - Constructor
-		 */
-		
-		/* Want to be able to reference "this" inside the this.each function */
-		var _that = this;
-		return this.each(function()
-		{
-			var i=0, iLen, j, jLen, k, kLen;
-			
-			/* Check to see if we are re-initalising a table */
-			for ( i=0, iLen=_aoSettings.length ; i<iLen ; i++ )
-			{
-				/* Base check on table node */
-				if ( _aoSettings[i].nTable == this )
-				{
-					if ( typeof oInit == 'undefined' || 
-					   ( typeof oInit.bRetrieve != 'undefined' && oInit.bRetrieve === true ) )
-					{
-						return _aoSettings[i].oInstance;
-					}
-					else if ( typeof oInit.bDestroy != 'undefined' && oInit.bDestroy === true )
-					{
-						_aoSettings[i].oInstance.fnDestroy();
-						break;
-					}
-					else
-					{
-						_fnLog( _aoSettings[i], 0, "Cannot reinitialise DataTable.\n\n"+
-							"To retrieve the DataTables object for this table, please pass either no arguments "+
-							"to the dataTable() function, or set bRetrieve to true. Alternatively, to destory "+
-							"the old table and create a new one, set bDestroy to true (note that a lot of "+
-							"changes to the configuration can be made through the API which is usually much "+
-							"faster)." );
-						return;
-					}
-				}
-				
-				/* If the element we are initialising has the same ID as a table which was previously
-				 * initialised, but the table nodes don't match (from before) then we destory the old
-				 * instance by simply deleting it. This is under the assumption that the table has been
-				 * destroyed by other methods. Anyone using non-id selectors will need to do this manually
-				 */
-				if ( _aoSettings[i].sTableId !== "" && _aoSettings[i].sTableId == this.getAttribute('id') )
-				{
-					_aoSettings.splice( i, 1 );
-					break;
-				}
-			}
-			
-			/* Make a complete and independent copy of the settings object */
-			var oSettings = new classSettings();
-			_aoSettings.push( oSettings );
-			
-			var bInitHandedOff = false;
-			var bUsePassedData = false;
-			
-			/* Set the id */
-			var sId = this.getAttribute( 'id' );
-			if ( sId !== null )
-			{
-				oSettings.sTableId = sId;
-				oSettings.sInstance = sId;
-			}
-			else
-			{
-				oSettings.sInstance = _oExt._oExternConfig.iNextUnique ++;
-			}
-			
-			/* Sanity check */
-			if ( this.nodeName.toLowerCase() != 'table' )
-			{
-				_fnLog( oSettings, 0, "Attempted to initialise DataTables on a node which is not a "+
-					"table: "+this.nodeName );
-				return;
-			}
-			
-			/* Set the table node */
-			oSettings.nTable = this;
-			
-			/* Keep a reference to the 'this' instance for the table. Note that if this table is being
-			 * created with others, we retrieve a unique instance to ease API access.
-			 */
-			oSettings.oInstance = _that.length == 1 ? _that : $(this).dataTable();
-			
-			/* Bind the API functions to the settings, so we can perform actions whenever oSettings is
-			 * available
-			 */
-			oSettings.oApi = _that.oApi;
-			
-			/* State the table's width for if a destroy is called at a later time */
-			oSettings.sDestroyWidth = $(this).width();
-			
-			/* Store the features that we have available */
-			if ( typeof oInit != 'undefined' && oInit !== null )
-			{
-				oSettings.oInit = oInit;
-				_fnMap( oSettings.oFeatures, oInit, "bPaginate" );
-				_fnMap( oSettings.oFeatures, oInit, "bLengthChange" );
-				_fnMap( oSettings.oFeatures, oInit, "bFilter" );
-				_fnMap( oSettings.oFeatures, oInit, "bSort" );
-				_fnMap( oSettings.oFeatures, oInit, "bInfo" );
-				_fnMap( oSettings.oFeatures, oInit, "bProcessing" );
-				_fnMap( oSettings.oFeatures, oInit, "bAutoWidth" );
-				_fnMap( oSettings.oFeatures, oInit, "bSortClasses" );
-				_fnMap( oSettings.oFeatures, oInit, "bServerSide" );
-				_fnMap( oSettings.oScroll, oInit, "sScrollX", "sX" );
-				_fnMap( oSettings.oScroll, oInit, "sScrollXInner", "sXInner" );
-				_fnMap( oSettings.oScroll, oInit, "sScrollY", "sY" );
-				_fnMap( oSettings.oScroll, oInit, "bScrollCollapse", "bCollapse" );
-				_fnMap( oSettings.oScroll, oInit, "bScrollInfinite", "bInfinite" );
-				_fnMap( oSettings.oScroll, oInit, "iScrollLoadGap", "iLoadGap" );
-				_fnMap( oSettings.oScroll, oInit, "bScrollAutoCss", "bAutoCss" );
-				_fnMap( oSettings, oInit, "asStripClasses" );
-				_fnMap( oSettings, oInit, "fnRowCallback" );
-				_fnMap( oSettings, oInit, "fnHeaderCallback" );
-				_fnMap( oSettings, oInit, "fnFooterCallback" );
-				_fnMap( oSettings, oInit, "fnCookieCallback" );
-				_fnMap( oSettings, oInit, "fnInitComplete" );
-				_fnMap( oSettings, oInit, "fnServerData" );
-				_fnMap( oSettings, oInit, "fnFormatNumber" );
-				_fnMap( oSettings, oInit, "aaSorting" );
-				_fnMap( oSettings, oInit, "aaSortingFixed" );
-				_fnMap( oSettings, oInit, "aLengthMenu" );
-				_fnMap( oSettings, oInit, "sPaginationType" );
-				_fnMap( oSettings, oInit, "sAjaxSource" );
-				_fnMap( oSettings, oInit, "iCookieDuration" );
-				_fnMap( oSettings, oInit, "sCookiePrefix" );
-				_fnMap( oSettings, oInit, "sDom" );
-				_fnMap( oSettings, oInit, "oSearch", "oPreviousSearch" );
-				_fnMap( oSettings, oInit, "aoSearchCols", "aoPreSearchCols" );
-				_fnMap( oSettings, oInit, "iDisplayLength", "_iDisplayLength" );
-				_fnMap( oSettings, oInit, "bJQueryUI", "bJUI" );
-				_fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
-				
-				/* Callback functions which are array driven */
-				if ( typeof oInit.fnDrawCallback == 'function' )
-				{
-					oSettings.aoDrawCallback.push( {
-						"fn": oInit.fnDrawCallback,
-						"sName": "user"
-					} );
-				}
-				
-				if ( typeof oInit.fnStateSaveCallback == 'function' )
-				{
-					oSettings.aoStateSave.push( {
-						"fn": oInit.fnStateSaveCallback,
-						"sName": "user"
-					} );
-				}
-				
-				if ( typeof oInit.fnStateLoadCallback == 'function' )
-				{
-					oSettings.aoStateLoad.push( {
-						"fn": oInit.fnStateLoadCallback,
-						"sName": "user"
-					} );
-				}
-				
-				if ( oSettings.oFeatures.bServerSide && oSettings.oFeatures.bSort &&
-					   oSettings.oFeatures.bSortClasses )
-				{
-					/* Enable sort classes for server-side processing. Safe to do it here, since server-side
-					 * processing must be enabled by the developer
-					 */
-					oSettings.aoDrawCallback.push( {
-						"fn": _fnSortingClasses,
-						"sName": "server_side_sort_classes"
-					} );
-				}
-				
-				if ( typeof oInit.bJQueryUI != 'undefined' && oInit.bJQueryUI )
-				{
-					/* Use the JUI classes object for display. You could clone the oStdClasses object if 
-					 * you want to have multiple tables with multiple independent classes 
-					 */
-					oSettings.oClasses = _oExt.oJUIClasses;
-					
-					if ( typeof oInit.sDom == 'undefined' )
-					{
-						/* Set the DOM to use a layout suitable for jQuery UI's theming */
-						oSettings.sDom = '<"H"lfr>t<"F"ip>';
-					}
-				}
-				
-				/* Calculate the scroll bar width and cache it for use later on */
-				if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
-				{
-					oSettings.oScroll.iBarWidth = _fnScrollBarWidth();
-				}
-				
-				if ( typeof oInit.iDisplayStart != 'undefined' && 
-				     typeof oSettings.iInitDisplayStart == 'undefined' )
-				{
-					/* Display start point, taking into account the save saving */
-					oSettings.iInitDisplayStart = oInit.iDisplayStart;
-					oSettings._iDisplayStart = oInit.iDisplayStart;
-				}
-				
-				/* Must be done after everything which can be overridden by a cookie! */
-				if ( typeof oInit.bStateSave != 'undefined' )
-				{
-					oSettings.oFeatures.bStateSave = oInit.bStateSave;
-					_fnLoadState( oSettings, oInit );
-					oSettings.aoDrawCallback.push( {
-						"fn": _fnSaveState,
-						"sName": "state_save"
-					} );
-				}
-				
-				if ( typeof oInit.aaData != 'undefined' )
-				{
-					bUsePassedData = true;
-				}
-				
-				/* Backwards compatability */
-				/* aoColumns / aoData - remove at some point... */
-				if ( typeof oInit != 'undefined' && typeof oInit.aoData != 'undefined' )
-				{
-					oInit.aoColumns = oInit.aoData;
-				}
-				
-				/* Language definitions */
-				if ( typeof oInit.oLanguage != 'undefined' )
-				{
-					if ( typeof oInit.oLanguage.sUrl != 'undefined' && oInit.oLanguage.sUrl !== "" )
-					{
-						/* Get the language definitions from a file */
-						oSettings.oLanguage.sUrl = oInit.oLanguage.sUrl;
-						$.getJSON( oSettings.oLanguage.sUrl, null, function( json ) { 
-							_fnLanguageProcess( oSettings, json, true ); } );
-						bInitHandedOff = true;
-					}
-					else
-					{
-						_fnLanguageProcess( oSettings, oInit.oLanguage, false );
-					}
-				}
-				/* Warning: The _fnLanguageProcess function is async to the remainder of this function due
-				 * to the XHR. We use _bInitialised in _fnLanguageProcess() to check this the processing 
-				 * below is complete. The reason for spliting it like this is optimisation - we can fire
-				 * off the XHR (if needed) and then continue processing the data.
-				 */
-			}
-			else
-			{
-				/* Create a dummy object for quick manipulation later on. */
-				oInit = {};
-			}
-			
-			/*
-			 * Stripes
-			 * Add the strip classes now that we know which classes to apply - unless overruled
-			 */
-			if ( typeof oInit.asStripClasses == 'undefined' )
-			{
-				oSettings.asStripClasses.push( oSettings.oClasses.sStripOdd );
-				oSettings.asStripClasses.push( oSettings.oClasses.sStripEven );
-			}
-			
-			/* Remove row stripe classes if they are already on the table row */
-			var bStripeRemove = false;
-			var anRows = $('>tbody>tr', this);
-			for ( i=0, iLen=oSettings.asStripClasses.length ; i<iLen ; i++ )
-			{
-				if ( anRows.filter(":lt(2)").hasClass( oSettings.asStripClasses[i]) )
-				{
-					bStripeRemove = true;
-					break;
-				}
-			}
-					
-			if ( bStripeRemove )
-			{
-				/* Store the classes which we are about to remove so they can be readded on destory */
-				oSettings.asDestoryStrips = [ '', '' ];
-				if ( $(anRows[0]).hasClass(oSettings.oClasses.sStripOdd) )
-				{
-					oSettings.asDestoryStrips[0] += oSettings.oClasses.sStripOdd+" ";
-				}
-				if ( $(anRows[0]).hasClass(oSettings.oClasses.sStripEven) )
-				{
-					oSettings.asDestoryStrips[0] += oSettings.oClasses.sStripEven;
-				}
-				if ( $(anRows[1]).hasClass(oSettings.oClasses.sStripOdd) )
-				{
-					oSettings.asDestoryStrips[1] += oSettings.oClasses.sStripOdd+" ";
-				}
-				if ( $(anRows[1]).hasClass(oSettings.oClasses.sStripEven) )
-				{
-					oSettings.asDestoryStrips[1] += oSettings.oClasses.sStripEven;
-				}
-				
-				anRows.removeClass( oSettings.asStripClasses.join(' ') );
-			}
-			
-			/*
-			 * Columns
-			 * See if we should load columns automatically or use defined ones
-			 */
-			var nThead = this.getElementsByTagName('thead');
-			var anThs = nThead.length===0 ? [] : _fnGetUniqueThs( nThead[0] );
-			var aoColumnsInit;
-			
-			/* If not given a column array, generate one with nulls */
-			if ( typeof oInit.aoColumns == 'undefined' )
-			{
-				aoColumnsInit = [];
-				for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
-				{
-					aoColumnsInit.push( null );
-				}
-			}
-			else
-			{
-				aoColumnsInit = oInit.aoColumns;
-			}
-			
-			/* Add the columns */
-			for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
-			{
-				/* Check if we have column visibilty state to restore */
-				if ( typeof oInit.saved_aoColumns != 'undefined' && oInit.saved_aoColumns.length == iLen )
-				{
-					if ( aoColumnsInit[i] === null )
-					{
-						aoColumnsInit[i] = {};
-					}
-					aoColumnsInit[i].bVisible = oInit.saved_aoColumns[i].bVisible;
-				}
-				
-				_fnAddColumn( oSettings, anThs ? anThs[i] : null );
-			}
-			
-			/* Add options from column definations */
-			if ( typeof oInit.aoColumnDefs != 'undefined' )
-			{
-				/* Loop over the column defs array - loop in reverse so first instace has priority */
-				for ( i=oInit.aoColumnDefs.length-1 ; i>=0 ; i-- )
-				{
-					/* Each column def can target multiple columns, as it is an array */
-					var aTargets = oInit.aoColumnDefs[i].aTargets;
-					if ( !$.isArray( aTargets ) )
-					{
-						_fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) );
-					}
-					for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
-					{
-						if ( typeof aTargets[j] == 'number' && aTargets[j] >= 0 )
-						{
-							/* 0+ integer, left to right column counting. We add columns which are unknown
-							 * automatically. Is this the right behaviour for this? We should at least
-							 * log it in future. We cannot do this for the negative or class targets, only here.
-							 */
-							while( oSettings.aoColumns.length <= aTargets[j] )
-							{
-								_fnAddColumn( oSettings );
-							}
-							_fnColumnOptions( oSettings, aTargets[j], oInit.aoColumnDefs[i] );
-						}
-						else if ( typeof aTargets[j] == 'number' && aTargets[j] < 0 )
-						{
-							/* Negative integer, right to left column counting */
-							_fnColumnOptions( oSettings, oSettings.aoColumns.length+aTargets[j], 
-								oInit.aoColumnDefs[i] );
-						}
-						else if ( typeof aTargets[j] == 'string' )
-						{
-							/* Class name matching on TH element */
-							for ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ )
-							{
-								if ( aTargets[j] == "_all" ||
-								     oSettings.aoColumns[k].nTh.className.indexOf( aTargets[j] ) != -1 )
-								{
-									_fnColumnOptions( oSettings, k, oInit.aoColumnDefs[i] );
-								}
-							}
-						}
-					}
-				}
-			}
-			
-			/* Add options from column array - after the defs array so this has priority */
-			if ( typeof aoColumnsInit != 'undefined' )
-			{
-				for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
-				{
-					_fnColumnOptions( oSettings, i, aoColumnsInit[i] );
-				}
-			}
-			
-			/*
-			 * Sorting
-			 * Check the aaSorting array
-			 */
-			for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ )
-			{
-				if ( oSettings.aaSorting[i][0] >= oSettings.aoColumns.length )
-				{
-					oSettings.aaSorting[i][0] = 0;
-				}
-				var oColumn = oSettings.aoColumns[ oSettings.aaSorting[i][0] ];
-				
-				/* Add a default sorting index */
-				if ( typeof oSettings.aaSorting[i][2] == 'undefined' )
-				{
-					oSettings.aaSorting[i][2] = 0;
-				}
-				
-				/* If aaSorting is not defined, then we use the first indicator in asSorting */
-				if ( typeof oInit.aaSorting == "undefined" && 
-						 typeof oSettings.saved_aaSorting == "undefined" )
-				{
-					oSettings.aaSorting[i][1] = oColumn.asSorting[0];
-				}
-				
-				/* Set the current sorting index based on aoColumns.asSorting */
-				for ( j=0, jLen=oColumn.asSorting.length ; j<jLen ; j++ )
-				{
-					if ( oSettings.aaSorting[i][1] == oColumn.asSorting[j] )
-					{
-						oSettings.aaSorting[i][2] = j;
-						break;
-					}
-				}
-			}
-				
-			/* Do a first pass on the sorting classes (allows any size changes to be taken into
-			 * account, and also will apply sorting disabled classes if disabled
-			 */
-			_fnSortingClasses( oSettings );
-			
-			/*
-			 * Final init
-			 * Sanity check that there is a thead and tbody. If not let's just create them
-			 */
-			if ( this.getElementsByTagName('thead').length === 0 )
-			{
-				this.appendChild( document.createElement( 'thead' ) );
-			}
-			
-			if ( this.getElementsByTagName('tbody').length === 0 )
-			{
-				this.appendChild( document.createElement( 'tbody' ) );
-			}
-			
-			oSettings.nTHead = this.getElementsByTagName('thead')[0];
-			oSettings.nTBody = this.getElementsByTagName('tbody')[0];
-			if ( this.getElementsByTagName('tfoot').length > 0 )
-			{
-				oSettings.nTFoot = this.getElementsByTagName('tfoot')[0];
-			}
-			
-			/* Check if there is data passing into the constructor */
-			if ( bUsePassedData )
-			{
-				for ( i=0 ; i<oInit.aaData.length ; i++ )
-				{
-					_fnAddData( oSettings, oInit.aaData[ i ] );
-				}
-			}
-			else
-			{
-				/* Grab the data from the page */
-				_fnGatherData( oSettings );
-			}
-			
-			/* Copy the data index array */
-			oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
-			
-			/* Initialisation complete - table can be drawn */
-			oSettings.bInitialised = true;
-			
-			/* Check if we need to initialise the table (it might not have been handed off to the
-			 * language processor)
-			 */
-			if ( bInitHandedOff === false )
-			{
-				_fnInitalise( oSettings );
-			}
-		});
-	};
-})(jQuery, window, document);
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/jquery.dataTables.min.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/jquery.dataTables.min.js	(revision 11253)
+++ 	(revision )
@@ -1,148 +1,0 @@
-/*
- * File:        jquery.dataTables.min.js
- * Version:     1.7.6
- * Author:      Allan Jardine (www.sprymedia.co.uk)
- * Info:        www.datatables.net
- * 
- * Copyright 2008-2010 Allan Jardine, all rights reserved.
- *
- * This source file is free software, under either the GPL v2 license or a
- * BSD style license, available at:
- *   http://datatables.net/license_gpl2
- *   http://datatables.net/license_bsd
- * 
- * This source file is distributed in the hope that it will be useful, but 
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
- * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
- *
- * Customized by Henrik Bettermann: this.aLengthMenu, this._iDisplayLength, this._iDisplayEnd
- *
- */
-(function(j,ra,p){j.fn.dataTableSettings=[];var D=j.fn.dataTableSettings;j.fn.dataTableExt={};var n=j.fn.dataTableExt;n.sVersion="1.7.6";n.sErrMode="alert";n.iApiIndex=0;n.oApi={};n.afnFiltering=[];n.aoFeatures=[];n.ofnSearch={};n.afnSortData=[];n.oStdClasses={sPagePrevEnabled:"paginate_enabled_previous",sPagePrevDisabled:"paginate_disabled_previous",sPageNextEnabled:"paginate_enabled_next",sPageNextDisabled:"paginate_disabled_next",sPageJUINext:"",sPageJUIPrev:"",sPageButton:"paginate_button",sPageButtonActive:"paginate_active",
-sPageButtonStaticDisabled:"paginate_button",sPageFirst:"first",sPagePrevious:"previous",sPageNext:"next",sPageLast:"last",sStripOdd:"odd",sStripEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",
-sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sFooterTH:""};n.oJUIClasses={sPagePrevEnabled:"fg-button ui-button ui-state-default ui-corner-left",sPagePrevDisabled:"fg-button ui-button ui-state-default ui-corner-left ui-state-disabled",
-sPageNextEnabled:"fg-button ui-button ui-state-default ui-corner-right",sPageNextDisabled:"fg-button ui-button ui-state-default ui-corner-right ui-state-disabled",sPageJUINext:"ui-icon ui-icon-circle-arrow-e",sPageJUIPrev:"ui-icon ui-icon-circle-arrow-w",sPageButton:"fg-button ui-button ui-state-default",sPageButtonActive:"fg-button ui-button ui-state-default ui-state-disabled",sPageButtonStaticDisabled:"fg-button ui-button ui-state-default ui-state-disabled",sPageFirst:"first ui-corner-tl ui-corner-bl",
-sPagePrevious:"previous",sPageNext:"next",sPageLast:"last ui-corner-tr ui-corner-br",sStripOdd:"odd",sStripEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"ui-state-default",sSortDesc:"ui-state-default",sSortable:"ui-state-default",sSortableAsc:"ui-state-default",
-sSortableDesc:"ui-state-default",sSortableNone:"ui-state-default",sSortColumn:"sorting_",sSortJUIAsc:"css_right ui-icon ui-icon-triangle-1-n",sSortJUIDesc:"css_right ui-icon ui-icon-triangle-1-s",sSortJUI:"css_right ui-icon ui-icon-carat-2-n-s",sSortJUIAscAllowed:"css_right ui-icon ui-icon-carat-1-n",sSortJUIDescAllowed:"css_right ui-icon ui-icon-carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead ui-state-default",sScrollHeadInner:"dataTables_scrollHeadInner",
-sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot ui-state-default",sScrollFootInner:"dataTables_scrollFootInner",sFooterTH:"ui-state-default"};n.oPagination={two_button:{fnInit:function(g,m,r){var s,w,y;if(g.bJUI){s=p.createElement("a");w=p.createElement("a");y=p.createElement("span");y.className=g.oClasses.sPageJUINext;w.appendChild(y);y=p.createElement("span");y.className=g.oClasses.sPageJUIPrev;s.appendChild(y)}else{s=p.createElement("div");w=p.createElement("div")}s.className=
-g.oClasses.sPagePrevDisabled;w.className=g.oClasses.sPageNextDisabled;s.title=g.oLanguage.oPaginate.sPrevious;w.title=g.oLanguage.oPaginate.sNext;m.appendChild(s);m.appendChild(w);j(s).bind("click.DT",function(){g.oApi._fnPageChange(g,"previous")&&r(g)});j(w).bind("click.DT",function(){g.oApi._fnPageChange(g,"next")&&r(g)});j(s).bind("selectstart.DT",function(){return false});j(w).bind("selectstart.DT",function(){return false});if(g.sTableId!==""&&typeof g.aanFeatures.p=="undefined"){m.setAttribute("id",
-g.sTableId+"_paginate");s.setAttribute("id",g.sTableId+"_previous");w.setAttribute("id",g.sTableId+"_next")}},fnUpdate:function(g){if(g.aanFeatures.p)for(var m=g.aanFeatures.p,r=0,s=m.length;r<s;r++)if(m[r].childNodes.length!==0){m[r].childNodes[0].className=g._iDisplayStart===0?g.oClasses.sPagePrevDisabled:g.oClasses.sPagePrevEnabled;m[r].childNodes[1].className=g.fnDisplayEnd()==g.fnRecordsDisplay()?g.oClasses.sPageNextDisabled:g.oClasses.sPageNextEnabled}}},iFullNumbersShowPages:5,full_numbers:{fnInit:function(g,
-m,r){var s=p.createElement("span"),w=p.createElement("span"),y=p.createElement("span"),F=p.createElement("span"),x=p.createElement("span");s.innerHTML=g.oLanguage.oPaginate.sFirst;w.innerHTML=g.oLanguage.oPaginate.sPrevious;F.innerHTML=g.oLanguage.oPaginate.sNext;x.innerHTML=g.oLanguage.oPaginate.sLast;var u=g.oClasses;s.className=u.sPageButton+" "+u.sPageFirst;w.className=u.sPageButton+" "+u.sPagePrevious;F.className=u.sPageButton+" "+u.sPageNext;x.className=u.sPageButton+" "+u.sPageLast;m.appendChild(s);
-m.appendChild(w);m.appendChild(y);m.appendChild(F);m.appendChild(x);j(s).bind("click.DT",function(){g.oApi._fnPageChange(g,"first")&&r(g)});j(w).bind("click.DT",function(){g.oApi._fnPageChange(g,"previous")&&r(g)});j(F).bind("click.DT",function(){g.oApi._fnPageChange(g,"next")&&r(g)});j(x).bind("click.DT",function(){g.oApi._fnPageChange(g,"last")&&r(g)});j("span",m).bind("mousedown.DT",function(){return false}).bind("selectstart.DT",function(){return false});if(g.sTableId!==""&&typeof g.aanFeatures.p==
-"undefined"){m.setAttribute("id",g.sTableId+"_paginate");s.setAttribute("id",g.sTableId+"_first");w.setAttribute("id",g.sTableId+"_previous");F.setAttribute("id",g.sTableId+"_next");x.setAttribute("id",g.sTableId+"_last")}},fnUpdate:function(g,m){if(g.aanFeatures.p){var r=n.oPagination.iFullNumbersShowPages,s=Math.floor(r/2),w=Math.ceil(g.fnRecordsDisplay()/g._iDisplayLength),y=Math.ceil(g._iDisplayStart/g._iDisplayLength)+1,F="",x,u=g.oClasses;if(w<r){s=1;x=w}else if(y<=s){s=1;x=r}else if(y>=w-s){s=
-w-r+1;x=w}else{s=y-Math.ceil(r/2)+1;x=s+r-1}for(r=s;r<=x;r++)F+=y!=r?'<span class="'+u.sPageButton+'">'+r+"</span>":'<span class="'+u.sPageButtonActive+'">'+r+"</span>";x=g.aanFeatures.p;var z,U=function(){g._iDisplayStart=(this.innerHTML*1-1)*g._iDisplayLength;m(g);return false},C=function(){return false};r=0;for(s=x.length;r<s;r++)if(x[r].childNodes.length!==0){z=j("span:eq(2)",x[r]);z.html(F);j("span",z).bind("click.DT",U).bind("mousedown.DT",C).bind("selectstart.DT",C);z=x[r].getElementsByTagName("span");
-z=[z[0],z[1],z[z.length-2],z[z.length-1]];j(z).removeClass(u.sPageButton+" "+u.sPageButtonActive+" "+u.sPageButtonStaticDisabled);if(y==1){z[0].className+=" "+u.sPageButtonStaticDisabled;z[1].className+=" "+u.sPageButtonStaticDisabled}else{z[0].className+=" "+u.sPageButton;z[1].className+=" "+u.sPageButton}if(w===0||y==w||g._iDisplayLength==-1){z[2].className+=" "+u.sPageButtonStaticDisabled;z[3].className+=" "+u.sPageButtonStaticDisabled}else{z[2].className+=" "+u.sPageButton;z[3].className+=" "+
-u.sPageButton}}}}}};n.oSort={"string-asc":function(g,m){g=g.toLowerCase();m=m.toLowerCase();return g<m?-1:g>m?1:0},"string-desc":function(g,m){g=g.toLowerCase();m=m.toLowerCase();return g<m?1:g>m?-1:0},"html-asc":function(g,m){g=g.replace(/<.*?>/g,"").toLowerCase();m=m.replace(/<.*?>/g,"").toLowerCase();return g<m?-1:g>m?1:0},"html-desc":function(g,m){g=g.replace(/<.*?>/g,"").toLowerCase();m=m.replace(/<.*?>/g,"").toLowerCase();return g<m?1:g>m?-1:0},"date-asc":function(g,m){g=Date.parse(g);m=Date.parse(m);
-if(isNaN(g)||g==="")g=Date.parse("01/01/1970 00:00:00");if(isNaN(m)||m==="")m=Date.parse("01/01/1970 00:00:00");return g-m},"date-desc":function(g,m){g=Date.parse(g);m=Date.parse(m);if(isNaN(g)||g==="")g=Date.parse("01/01/1970 00:00:00");if(isNaN(m)||m==="")m=Date.parse("01/01/1970 00:00:00");return m-g},"numeric-asc":function(g,m){return(g=="-"||g===""?0:g*1)-(m=="-"||m===""?0:m*1)},"numeric-desc":function(g,m){return(m=="-"||m===""?0:m*1)-(g=="-"||g===""?0:g*1)}};n.aTypes=[function(g){if(g.length===
-0)return"numeric";var m,r=false;m=g.charAt(0);if("0123456789-".indexOf(m)==-1)return null;for(var s=1;s<g.length;s++){m=g.charAt(s);if("0123456789.".indexOf(m)==-1)return null;if(m=="."){if(r)return null;r=true}}return"numeric"},function(g){var m=Date.parse(g);if(m!==null&&!isNaN(m)||g.length===0)return"date";return null},function(g){if(g.indexOf("<")!=-1&&g.indexOf(">")!=-1)return"html";return null}];n.fnVersionCheck=function(g){var m=function(x,u){for(;x.length<u;)x+="0";return x},r=n.sVersion.split(".");
-g=g.split(".");for(var s="",w="",y=0,F=g.length;y<F;y++){s+=m(r[y],3);w+=m(g[y],3)}return parseInt(s,10)>=parseInt(w,10)};n._oExternConfig={iNextUnique:0};j.fn.dataTable=function(g){function m(){this.fnRecordsTotal=function(){return this.oFeatures.bServerSide?parseInt(this._iRecordsTotal,10):this.aiDisplayMaster.length};this.fnRecordsDisplay=function(){return this.oFeatures.bServerSide?parseInt(this._iRecordsDisplay,10):this.aiDisplay.length};this.fnDisplayEnd=function(){return this.oFeatures.bServerSide?
-this.oFeatures.bPaginate===false||this._iDisplayLength==-1?this._iDisplayStart+this.aiDisplay.length:Math.min(this._iDisplayStart+this._iDisplayLength,this._iRecordsDisplay):this._iDisplayEnd};this.sInstance=this.oInstance=null;this.oFeatures={bPaginate:true,bLengthChange:true,bFilter:true,bSort:true,bInfo:true,bAutoWidth:true,bProcessing:false,bSortClasses:true,bStateSave:false,bServerSide:false};this.oScroll={sX:"",sXInner:"",sY:"",bCollapse:false,bInfinite:false,iLoadGap:100,iBarWidth:0,bAutoCss:true};
-this.aanFeatures=[];this.oLanguage={sProcessing:"Processing...",sLengthMenu:"Show _MENU_ entries",sZeroRecords:"No matching records found",sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sSearch:"Search:",sUrl:"",oPaginate:{sFirst:"First",sPrevious:"Previous",sNext:"Next",sLast:"Last"},fnInfoCallback:null};this.aoData=[];this.aiDisplay=[];this.aiDisplayMaster=
-[];this.aoColumns=[];this.iNextId=0;this.asDataSearch=[];this.oPreviousSearch={sSearch:"",bRegex:false,bSmart:true};this.aoPreSearchCols=[];this.aaSorting=[[0,"asc",0]];this.aaSortingFixed=null;this.asStripClasses=[];this.asDestoryStrips=[];this.sDestroyWidth=0;this.fnFooterCallback=this.fnHeaderCallback=this.fnRowCallback=null;this.aoDrawCallback=[];this.fnInitComplete=null;this.sTableId="";this.nTableWrapper=this.nTBody=this.nTFoot=this.nTHead=this.nTable=null;this.bInitialised=false;this.aoOpenRows=
-[];this.sDom="lfrtip";this.sPaginationType="two_button";this.iCookieDuration=7200;this.sCookiePrefix="SpryMedia_DataTables_";this.fnCookieCallback=null;this.aoStateSave=[];this.aoStateLoad=[];this.sAjaxSource=this.oLoadedState=null;this.bAjaxDataGet=true;this.fnServerData=function(a,b,c){j.ajax({url:a,data:b,success:c,dataType:"json",cache:false,error:function(d,f){f=="parsererror"&&alert("DataTables warning: JSON data from server could not be parsed. This is caused by a JSON formatting error.")}})};
-this.fnFormatNumber=function(a){if(a<1E3)return a;else{var b=a+"";a=b.split("");var c="";b=b.length;for(var d=0;d<b;d++){if(d%3===0&&d!==0)c=","+c;c=a[b-d-1]+c}}return c};this.aLengthMenu=[10,25,50,100,1000,5000];this.bDrawing=this.iDraw=0;this.iDrawError=-1;this._iDisplayLength=1000;this._iDisplayStart=0;this._iDisplayEnd=1000;this._iRecordsDisplay=this._iRecordsTotal=0;this.bJUI=false;this.oClasses=n.oStdClasses;this.bSorted=this.bFiltered=false;this.oInit=null}function r(a){return function(){var b=[A(this[n.iApiIndex])].concat(Array.prototype.slice.call(arguments));
-return n.oApi[a].apply(this,b)}}function s(a){var b,c;if(a.bInitialised===false)setTimeout(function(){s(a)},200);else{sa(a);U(a);K(a,true);a.oFeatures.bAutoWidth&&$(a);b=0;for(c=a.aoColumns.length;b<c;b++)if(a.aoColumns[b].sWidth!==null)a.aoColumns[b].nTh.style.width=v(a.aoColumns[b].sWidth);if(a.oFeatures.bSort)O(a);else{a.aiDisplay=a.aiDisplayMaster.slice();E(a);C(a)}if(a.sAjaxSource!==null&&!a.oFeatures.bServerSide)a.fnServerData.call(a.oInstance,a.sAjaxSource,[],function(d){for(b=0;b<d.aaData.length;b++)u(a,
-d.aaData[b]);a.iInitDisplayStart=a._iDisplayStart;if(a.oFeatures.bSort)O(a);else{a.aiDisplay=a.aiDisplayMaster.slice();E(a);C(a)}K(a,false);w(a,d)});else if(!a.oFeatures.bServerSide){K(a,false);w(a)}}}function w(a,b){a._bInitComplete=true;if(typeof a.fnInitComplete=="function")typeof b!="undefined"?a.fnInitComplete.call(a.oInstance,a,b):a.fnInitComplete.call(a.oInstance,a)}function y(a,b,c){o(a.oLanguage,b,"sProcessing");o(a.oLanguage,b,"sLengthMenu");o(a.oLanguage,b,"sEmptyTable");o(a.oLanguage,
-b,"sZeroRecords");o(a.oLanguage,b,"sInfo");o(a.oLanguage,b,"sInfoEmpty");o(a.oLanguage,b,"sInfoFiltered");o(a.oLanguage,b,"sInfoPostFix");o(a.oLanguage,b,"sSearch");if(typeof b.oPaginate!="undefined"){o(a.oLanguage.oPaginate,b.oPaginate,"sFirst");o(a.oLanguage.oPaginate,b.oPaginate,"sPrevious");o(a.oLanguage.oPaginate,b.oPaginate,"sNext");o(a.oLanguage.oPaginate,b.oPaginate,"sLast")}typeof b.sEmptyTable=="undefined"&&typeof b.sZeroRecords!="undefined"&&o(a.oLanguage,b,"sZeroRecords","sEmptyTable");
-c&&s(a)}function F(a,b){a.aoColumns[a.aoColumns.length++]={sType:null,_bAutoType:true,bVisible:true,bSearchable:true,bSortable:true,asSorting:["asc","desc"],sSortingClass:a.oClasses.sSortable,sSortingClassJUI:a.oClasses.sSortJUI,sTitle:b?b.innerHTML:"",sName:"",sWidth:null,sWidthOrig:null,sClass:null,fnRender:null,bUseRendered:true,iDataSort:a.aoColumns.length-1,sSortDataType:"std",nTh:b?b:p.createElement("th"),nTf:null,anThExtra:[],anTfExtra:[]};b=a.aoColumns.length-1;if(typeof a.aoPreSearchCols[b]==
-"undefined"||a.aoPreSearchCols[b]===null)a.aoPreSearchCols[b]={sSearch:"",bRegex:false,bSmart:true};else{if(typeof a.aoPreSearchCols[b].bRegex=="undefined")a.aoPreSearchCols[b].bRegex=true;if(typeof a.aoPreSearchCols[b].bSmart=="undefined")a.aoPreSearchCols[b].bSmart=true}x(a,b,null)}function x(a,b,c){b=a.aoColumns[b];if(typeof c!="undefined"&&c!==null){if(typeof c.sType!="undefined"){b.sType=c.sType;b._bAutoType=false}o(b,c,"bVisible");o(b,c,"bSearchable");o(b,c,"bSortable");o(b,c,"sTitle");o(b,
-c,"sName");o(b,c,"sWidth");o(b,c,"sWidth","sWidthOrig");o(b,c,"sClass");o(b,c,"fnRender");o(b,c,"bUseRendered");o(b,c,"iDataSort");o(b,c,"asSorting");o(b,c,"sSortDataType")}if(!a.oFeatures.bSort)b.bSortable=false;if(!b.bSortable||j.inArray("asc",b.asSorting)==-1&&j.inArray("desc",b.asSorting)==-1){b.sSortingClass=a.oClasses.sSortableNone;b.sSortingClassJUI=""}else if(j.inArray("asc",b.asSorting)!=-1&&j.inArray("desc",b.asSorting)==-1){b.sSortingClass=a.oClasses.sSortableAsc;b.sSortingClassJUI=a.oClasses.sSortJUIAscAllowed}else if(j.inArray("asc",
-b.asSorting)==-1&&j.inArray("desc",b.asSorting)!=-1){b.sSortingClass=a.oClasses.sSortableDesc;b.sSortingClassJUI=a.oClasses.sSortJUIDescAllowed}}function u(a,b){if(b.length!=a.aoColumns.length&&a.iDrawError!=a.iDraw){H(a,0,"Added data (size "+b.length+") does not match known number of columns ("+a.aoColumns.length+")");a.iDrawError=a.iDraw;return-1}b=b.slice();var c=a.aoData.length;a.aoData.push({nTr:p.createElement("tr"),_iId:a.iNextId++,_aData:b,_anHidden:[],_sRowStripe:""});for(var d,f,e=0;e<b.length;e++){d=
-p.createElement("td");if(b[e]===null)b[e]="";if(typeof a.aoColumns[e].fnRender=="function"){f=a.aoColumns[e].fnRender({iDataRow:c,iDataColumn:e,aData:b,oSettings:a});d.innerHTML=f;if(a.aoColumns[e].bUseRendered)a.aoData[c]._aData[e]=f}else d.innerHTML=b[e];if(typeof b[e]!="string")b[e]+="";b[e]=j.trim(b[e]);if(a.aoColumns[e].sClass!==null)d.className=a.aoColumns[e].sClass;if(a.aoColumns[e]._bAutoType&&a.aoColumns[e].sType!="string"){f=aa(a.aoData[c]._aData[e]);if(a.aoColumns[e].sType===null)a.aoColumns[e].sType=
-f;else if(a.aoColumns[e].sType!=f)a.aoColumns[e].sType="string"}if(a.aoColumns[e].bVisible){a.aoData[c].nTr.appendChild(d);a.aoData[c]._anHidden[e]=null}else a.aoData[c]._anHidden[e]=d}a.aiDisplayMaster.push(c);return c}function z(a){var b,c,d,f,e,i,h,k;if(a.sAjaxSource===null){h=a.nTBody.childNodes;b=0;for(c=h.length;b<c;b++)if(h[b].nodeName.toUpperCase()=="TR"){i=a.aoData.length;a.aoData.push({nTr:h[b],_iId:a.iNextId++,_aData:[],_anHidden:[],_sRowStripe:""});a.aiDisplayMaster.push(i);k=a.aoData[i]._aData;
-i=h[b].childNodes;d=e=0;for(f=i.length;d<f;d++)if(i[d].nodeName.toUpperCase()=="TD"){k[e]=j.trim(i[d].innerHTML);e++}}}h=R(a);i=[];b=0;for(c=h.length;b<c;b++){d=0;for(f=h[b].childNodes.length;d<f;d++){e=h[b].childNodes[d];e.nodeName.toUpperCase()=="TD"&&i.push(e)}}i.length!=h.length*a.aoColumns.length&&H(a,1,"Unexpected number of TD elements. Expected "+h.length*a.aoColumns.length+" and got "+i.length+". DataTables does not support rowspan / colspan in the table body, and there must be one cell for each row/column combination.");
-h=0;for(d=a.aoColumns.length;h<d;h++){if(a.aoColumns[h].sTitle===null)a.aoColumns[h].sTitle=a.aoColumns[h].nTh.innerHTML;f=a.aoColumns[h]._bAutoType;e=typeof a.aoColumns[h].fnRender=="function";k=a.aoColumns[h].sClass!==null;var l=a.aoColumns[h].bVisible,q,t;if(f||e||k||!l){b=0;for(c=a.aoData.length;b<c;b++){q=i[b*d+h];if(f)if(a.aoColumns[h].sType!="string"){t=aa(a.aoData[b]._aData[h]);if(a.aoColumns[h].sType===null)a.aoColumns[h].sType=t;else if(a.aoColumns[h].sType!=t)a.aoColumns[h].sType="string"}if(e){t=
-a.aoColumns[h].fnRender({iDataRow:b,iDataColumn:h,aData:a.aoData[b]._aData,oSettings:a});q.innerHTML=t;if(a.aoColumns[h].bUseRendered)a.aoData[b]._aData[h]=t}if(k)q.className+=" "+a.aoColumns[h].sClass;if(l)a.aoData[b]._anHidden[h]=null;else{a.aoData[b]._anHidden[h]=q;q.parentNode.removeChild(q)}}}}}function U(a){var b,c,d,f,e,i=a.nTHead.getElementsByTagName("tr"),h=0,k;if(a.nTHead.getElementsByTagName("th").length!==0){b=0;for(d=a.aoColumns.length;b<d;b++){c=a.aoColumns[b].nTh;a.aoColumns[b].sClass!==
-null&&j(c).addClass(a.aoColumns[b].sClass);f=1;for(e=i.length;f<e;f++){k=j(i[f]).children();a.aoColumns[b].anThExtra.push(k[b-h]);a.aoColumns[b].bVisible||i[f].removeChild(k[b-h])}if(a.aoColumns[b].bVisible){if(a.aoColumns[b].sTitle!=c.innerHTML)c.innerHTML=a.aoColumns[b].sTitle}else{c.parentNode.removeChild(c);h++}}}else{f=p.createElement("tr");b=0;for(d=a.aoColumns.length;b<d;b++){c=a.aoColumns[b].nTh;c.innerHTML=a.aoColumns[b].sTitle;a.aoColumns[b].sClass!==null&&j(c).addClass(a.aoColumns[b].sClass);
-a.aoColumns[b].bVisible&&f.appendChild(c)}j(a.nTHead).html("")[0].appendChild(f)}if(a.bJUI){b=0;for(d=a.aoColumns.length;b<d;b++){c=a.aoColumns[b].nTh;f=p.createElement("div");f.className=a.oClasses.sSortJUIWrapper;j(c).contents().appendTo(f);f.appendChild(p.createElement("span"));c.appendChild(f)}}d=function(){this.onselectstart=function(){return false};return false};if(a.oFeatures.bSort)for(b=0;b<a.aoColumns.length;b++)if(a.aoColumns[b].bSortable!==false){ba(a,a.aoColumns[b].nTh,b);j(a.aoColumns[b].nTh).bind("mousedown.DT",
-d)}else j(a.aoColumns[b].nTh).addClass(a.oClasses.sSortableNone);if(a.nTFoot!==null){h=0;i=a.nTFoot.getElementsByTagName("tr");c=i[0].getElementsByTagName("th");b=0;for(d=c.length;b<d;b++)if(typeof a.aoColumns[b]!="undefined"){a.aoColumns[b].nTf=c[b-h];if(a.oClasses.sFooterTH!=="")a.aoColumns[b].nTf.className+=" "+a.oClasses.sFooterTH;f=1;for(e=i.length;f<e;f++){k=j(i[f]).children();a.aoColumns[b].anTfExtra.push(k[b-h]);a.aoColumns[b].bVisible||i[f].removeChild(k[b-h])}if(!a.aoColumns[b].bVisible){c[b-
-h].parentNode.removeChild(c[b-h]);h++}}}}function C(a){var b,c,d=[],f=0,e=false;b=a.asStripClasses.length;c=a.aoOpenRows.length;a.bDrawing=true;if(typeof a.iInitDisplayStart!="undefined"&&a.iInitDisplayStart!=-1){a._iDisplayStart=a.oFeatures.bServerSide?a.iInitDisplayStart:a.iInitDisplayStart>=a.fnRecordsDisplay()?0:a.iInitDisplayStart;a.iInitDisplayStart=-1;E(a)}if(!(!a.bDestroying&&a.oFeatures.bServerSide&&!ta(a))){a.oFeatures.bServerSide||a.iDraw++;if(a.aiDisplay.length!==0){var i=a._iDisplayStart,
-h=a._iDisplayEnd;if(a.oFeatures.bServerSide){i=0;h=a.aoData.length}for(i=i;i<h;i++){var k=a.aoData[a.aiDisplay[i]],l=k.nTr;if(b!==0){var q=a.asStripClasses[f%b];if(k._sRowStripe!=q){j(l).removeClass(k._sRowStripe).addClass(q);k._sRowStripe=q}}if(typeof a.fnRowCallback=="function"){l=a.fnRowCallback.call(a.oInstance,l,a.aoData[a.aiDisplay[i]]._aData,f,i);if(!l&&!e){H(a,0,"A node was not returned by fnRowCallback");e=true}}d.push(l);f++;if(c!==0)for(k=0;k<c;k++)l==a.aoOpenRows[k].nParent&&d.push(a.aoOpenRows[k].nTr)}}else{d[0]=
-p.createElement("tr");if(typeof a.asStripClasses[0]!="undefined")d[0].className=a.asStripClasses[0];e=p.createElement("td");e.setAttribute("valign","top");e.colSpan=S(a);e.className=a.oClasses.sRowEmpty;e.innerHTML=typeof a.oLanguage.sEmptyTable!="undefined"&&a.fnRecordsTotal()===0?a.oLanguage.sEmptyTable:a.oLanguage.sZeroRecords.replace("_MAX_",a.fnFormatNumber(a.fnRecordsTotal()));d[f].appendChild(e)}typeof a.fnHeaderCallback=="function"&&a.fnHeaderCallback.call(a.oInstance,j(">tr",a.nTHead)[0],
-V(a),a._iDisplayStart,a.fnDisplayEnd(),a.aiDisplay);typeof a.fnFooterCallback=="function"&&a.fnFooterCallback.call(a.oInstance,j(">tr",a.nTFoot)[0],V(a),a._iDisplayStart,a.fnDisplayEnd(),a.aiDisplay);f=p.createDocumentFragment();b=p.createDocumentFragment();if(a.nTBody){e=a.nTBody.parentNode;b.appendChild(a.nTBody);if(!a.oScroll.bInfinite||!a._bInitComplete||a.bSorted||a.bFiltered){c=a.nTBody.childNodes;for(b=c.length-1;b>=0;b--)c[b].parentNode.removeChild(c[b])}b=0;for(c=d.length;b<c;b++)f.appendChild(d[b]);
-a.nTBody.appendChild(f);e!==null&&e.appendChild(a.nTBody)}for(b=a.aoDrawCallback.length-1;b>=0;b--)a.aoDrawCallback[b].fn.call(a.oInstance,a);a.bSorted=false;a.bFiltered=false;a.bDrawing=false;if(a.oFeatures.bServerSide){K(a,false);typeof a._bInitComplete=="undefined"&&w(a)}}}function W(a){if(a.oFeatures.bSort)O(a,a.oPreviousSearch);else if(a.oFeatures.bFilter)P(a,a.oPreviousSearch);else{E(a);C(a)}}function ta(a){if(a.bAjaxDataGet){K(a,true);var b=a.aoColumns.length,c=[],d;a.iDraw++;c.push({name:"sEcho",
-value:a.iDraw});c.push({name:"iColumns",value:b});c.push({name:"sColumns",value:ca(a)});c.push({name:"iDisplayStart",value:a._iDisplayStart});c.push({name:"iDisplayLength",value:a.oFeatures.bPaginate!==false?a._iDisplayLength:-1});if(a.oFeatures.bFilter!==false){c.push({name:"sSearch",value:a.oPreviousSearch.sSearch});c.push({name:"bRegex",value:a.oPreviousSearch.bRegex});for(d=0;d<b;d++){c.push({name:"sSearch_"+d,value:a.aoPreSearchCols[d].sSearch});c.push({name:"bRegex_"+d,value:a.aoPreSearchCols[d].bRegex});
-c.push({name:"bSearchable_"+d,value:a.aoColumns[d].bSearchable})}}if(a.oFeatures.bSort!==false){var f=a.aaSortingFixed!==null?a.aaSortingFixed.length:0,e=a.aaSorting.length;c.push({name:"iSortingCols",value:f+e});for(d=0;d<f;d++){c.push({name:"iSortCol_"+d,value:a.aaSortingFixed[d][0]});c.push({name:"sSortDir_"+d,value:a.aaSortingFixed[d][1]})}for(d=0;d<e;d++){c.push({name:"iSortCol_"+(d+f),value:a.aaSorting[d][0]});c.push({name:"sSortDir_"+(d+f),value:a.aaSorting[d][1]})}for(d=0;d<b;d++)c.push({name:"bSortable_"+
-d,value:a.aoColumns[d].bSortable})}a.fnServerData.call(a.oInstance,a.sAjaxSource,c,function(i){ua(a,i)});return false}else return true}function ua(a,b){if(typeof b.sEcho!="undefined")if(b.sEcho*1<a.iDraw)return;else a.iDraw=b.sEcho*1;if(!a.oScroll.bInfinite||a.oScroll.bInfinite&&(a.bSorted||a.bFiltered))da(a);a._iRecordsTotal=b.iTotalRecords;a._iRecordsDisplay=b.iTotalDisplayRecords;var c=ca(a);if(c=typeof b.sColumns!="undefined"&&c!==""&&b.sColumns!=c)var d=va(a,b.sColumns);for(var f=0,e=b.aaData.length;f<
-e;f++)if(c){for(var i=[],h=0,k=a.aoColumns.length;h<k;h++)i.push(b.aaData[f][d[h]]);u(a,i)}else u(a,b.aaData[f]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=false;C(a);a.bAjaxDataGet=true;K(a,false)}function sa(a){var b=p.createElement("div");a.nTable.parentNode.insertBefore(b,a.nTable);a.nTableWrapper=p.createElement("div");a.nTableWrapper.className=a.oClasses.sWrapper;a.sTableId!==""&&a.nTableWrapper.setAttribute("id",a.sTableId+"_wrapper");for(var c=a.nTableWrapper,d=a.sDom.split(""),
-f,e,i,h,k,l,q,t=0;t<d.length;t++){e=0;i=d[t];if(i=="<"){h=p.createElement("div");k=d[t+1];if(k=="'"||k=='"'){l="";for(q=2;d[t+q]!=k;){l+=d[t+q];q++}if(l=="H")l="fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix";else if(l=="F")l="fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix";if(l.indexOf(".")!=-1){k=l.split(".");h.setAttribute("id",k[0].substr(1,k[0].length-1));h.className=k[1]}else if(l.charAt(0)=="#")h.setAttribute("id",l.substr(1,
-l.length-1));else h.className=l;t+=q}c.appendChild(h);c=h}else if(i==">")c=c.parentNode;else if(i=="l"&&a.oFeatures.bPaginate&&a.oFeatures.bLengthChange){f=wa(a);e=1}else if(i=="f"&&a.oFeatures.bFilter){f=xa(a);e=1}else if(i=="r"&&a.oFeatures.bProcessing){f=ya(a);e=1}else if(i=="t"){f=za(a);e=1}else if(i=="i"&&a.oFeatures.bInfo){f=Aa(a);e=1}else if(i=="p"&&a.oFeatures.bPaginate){f=Ba(a);e=1}else if(n.aoFeatures.length!==0){h=n.aoFeatures;q=0;for(k=h.length;q<k;q++)if(i==h[q].cFeature){if(f=h[q].fnInit(a))e=
-1;break}}if(e==1&&f!==null){if(typeof a.aanFeatures[i]!="object")a.aanFeatures[i]=[];a.aanFeatures[i].push(f);c.appendChild(f)}}b.parentNode.replaceChild(a.nTableWrapper,b)}function za(a){if(a.oScroll.sX===""&&a.oScroll.sY==="")return a.nTable;var b=p.createElement("div"),c=p.createElement("div"),d=p.createElement("div"),f=p.createElement("div"),e=p.createElement("div"),i=p.createElement("div"),h=a.nTable.cloneNode(false),k=a.nTable.cloneNode(false),l=a.nTable.getElementsByTagName("thead")[0],q=a.nTable.getElementsByTagName("tfoot").length===
-0?null:a.nTable.getElementsByTagName("tfoot")[0],t=typeof g.bJQueryUI!="undefined"&&g.bJQueryUI?n.oJUIClasses:n.oStdClasses;c.appendChild(d);e.appendChild(i);f.appendChild(a.nTable);b.appendChild(c);b.appendChild(f);d.appendChild(h);h.appendChild(l);if(q!==null){b.appendChild(e);i.appendChild(k);k.appendChild(q)}b.className=t.sScrollWrapper;c.className=t.sScrollHead;d.className=t.sScrollHeadInner;f.className=t.sScrollBody;e.className=t.sScrollFoot;i.className=t.sScrollFootInner;if(a.oScroll.bAutoCss){c.style.overflow=
-"hidden";c.style.position="relative";e.style.overflow="hidden";f.style.overflow="auto"}c.style.border="0";c.style.width="100%";e.style.border="0";d.style.width="150%";h.removeAttribute("id");h.style.marginLeft="0";a.nTable.style.marginLeft="0";if(q!==null){k.removeAttribute("id");k.style.marginLeft="0"}d=j(">caption",a.nTable);i=0;for(k=d.length;i<k;i++)h.appendChild(d[i]);if(a.oScroll.sX!==""){c.style.width=v(a.oScroll.sX);f.style.width=v(a.oScroll.sX);if(q!==null)e.style.width=v(a.oScroll.sX);j(f).scroll(function(){c.scrollLeft=
-this.scrollLeft;if(q!==null)e.scrollLeft=this.scrollLeft})}if(a.oScroll.sY!=="")f.style.height=v(a.oScroll.sY);a.aoDrawCallback.push({fn:Ca,sName:"scrolling"});a.oScroll.bInfinite&&j(f).scroll(function(){if(!a.bDrawing)if(j(this).scrollTop()+j(this).height()>j(a.nTable).height()-a.oScroll.iLoadGap)if(a.fnDisplayEnd()<a.fnRecordsDisplay()){ea(a,"next");E(a);C(a)}});a.nScrollHead=c;a.nScrollFoot=e;return b}function Ca(a){var b=a.nScrollHead.getElementsByTagName("div")[0],c=b.getElementsByTagName("table")[0],
-d=a.nTable.parentNode,f,e,i,h,k,l,q,t,G=[];i=a.nTable.getElementsByTagName("thead");i.length>0&&a.nTable.removeChild(i[0]);if(a.nTFoot!==null){k=a.nTable.getElementsByTagName("tfoot");k.length>0&&a.nTable.removeChild(k[0])}i=a.nTHead.cloneNode(true);a.nTable.insertBefore(i,a.nTable.childNodes[0]);if(a.nTFoot!==null){k=a.nTFoot.cloneNode(true);a.nTable.insertBefore(k,a.nTable.childNodes[1])}var J=fa(i);f=0;for(e=J.length;f<e;f++){q=ga(a,f);J[f].style.width=a.aoColumns[q].sWidth}a.nTFoot!==null&&L(function(B){B.style.width=
-""},k.getElementsByTagName("tr"));f=j(a.nTable).outerWidth();if(a.oScroll.sX===""){a.nTable.style.width="100%";if(j.browser.msie&&j.browser.version<=7)a.nTable.style.width=v(j(a.nTable).outerWidth()-a.oScroll.iBarWidth)}else if(a.oScroll.sXInner!=="")a.nTable.style.width=v(a.oScroll.sXInner);else if(f==j(d).width()&&j(d).height()<j(a.nTable).height()){a.nTable.style.width=v(f-a.oScroll.iBarWidth);if(j(a.nTable).outerWidth()>f-a.oScroll.iBarWidth)a.nTable.style.width=v(f)}else a.nTable.style.width=
-v(f);f=j(a.nTable).outerWidth();e=a.nTHead.getElementsByTagName("tr");i=i.getElementsByTagName("tr");L(function(B,I){l=B.style;l.paddingTop="0";l.paddingBottom="0";l.borderTopWidth="0";l.borderBottomWidth="0";l.height=0;t=j(B).width();I.style.width=v(t);G.push(t)},i,e);j(i).height(0);if(a.nTFoot!==null){h=k.getElementsByTagName("tr");k=a.nTFoot.getElementsByTagName("tr");L(function(B,I){l=B.style;l.paddingTop="0";l.paddingBottom="0";l.borderTopWidth="0";l.borderBottomWidth="0";l.height=0;t=j(B).width();
-I.style.width=v(t);G.push(t)},h,k);j(h).height(0)}L(function(B){B.innerHTML="";B.style.width=v(G.shift())},i);a.nTFoot!==null&&L(function(B){B.innerHTML="";B.style.width=v(G.shift())},h);if(j(a.nTable).outerWidth()<f)if(a.oScroll.sX==="")H(a,1,"The table cannot fit into the current element which will cause column misalignment. It is suggested that you enable x-scrolling or increase the width the table has in which to be drawn");else a.oScroll.sXInner!==""&&H(a,1,"The table cannot fit into the current element which will cause column misalignment. It is suggested that you increase the sScrollXInner property to allow it to draw in a larger area, or simply remove that parameter to allow automatic calculation");
-if(a.oScroll.sY==="")if(j.browser.msie&&j.browser.version<=7)d.style.height=v(a.nTable.offsetHeight+a.oScroll.iBarWidth);if(a.oScroll.sY!==""&&a.oScroll.bCollapse){d.style.height=v(a.oScroll.sY);h=a.oScroll.sX!==""&&a.nTable.offsetWidth>d.offsetWidth?a.oScroll.iBarWidth:0;if(a.nTable.offsetHeight<d.offsetHeight)d.style.height=v(j(a.nTable).height()+h)}h=j(a.nTable).outerWidth();c.style.width=v(h);b.style.width=v(h+a.oScroll.iBarWidth);if(a.nTFoot!==null){b=a.nScrollFoot.getElementsByTagName("div")[0];
-c=b.getElementsByTagName("table")[0];b.style.width=v(a.nTable.offsetWidth+a.oScroll.iBarWidth);c.style.width=v(a.nTable.offsetWidth)}if(a.bSorted||a.bFiltered)d.scrollTop=0}function X(a){if(a.oFeatures.bAutoWidth===false)return false;$(a);for(var b=0,c=a.aoColumns.length;b<c;b++)a.aoColumns[b].nTh.style.width=a.aoColumns[b].sWidth}function xa(a){var b=p.createElement("div");a.sTableId!==""&&typeof a.aanFeatures.f=="undefined"&&b.setAttribute("id",a.sTableId+"_filter");b.className=a.oClasses.sFilter;
-b.innerHTML=a.oLanguage.sSearch+(a.oLanguage.sSearch===""?"":" ")+'<input type="text" />';var c=j("input",b);c.val(a.oPreviousSearch.sSearch.replace('"',"&quot;"));c.bind("keyup.DT",function(){for(var d=a.aanFeatures.f,f=0,e=d.length;f<e;f++)d[f]!=this.parentNode&&j("input",d[f]).val(this.value);this.value!=a.oPreviousSearch.sSearch&&P(a,{sSearch:this.value,bRegex:a.oPreviousSearch.bRegex,bSmart:a.oPreviousSearch.bSmart})});c.bind("keypress.DT",function(d){if(d.keyCode==13)return false});return b}
-function P(a,b,c){Da(a,b.sSearch,c,b.bRegex,b.bSmart);for(b=0;b<a.aoPreSearchCols.length;b++)Ea(a,a.aoPreSearchCols[b].sSearch,b,a.aoPreSearchCols[b].bRegex,a.aoPreSearchCols[b].bSmart);n.afnFiltering.length!==0&&Fa(a);a.bFiltered=true;a._iDisplayStart=0;E(a);C(a);ha(a,0)}function Fa(a){for(var b=n.afnFiltering,c=0,d=b.length;c<d;c++)for(var f=0,e=0,i=a.aiDisplay.length;e<i;e++){var h=a.aiDisplay[e-f];if(!b[c](a,a.aoData[h]._aData,h)){a.aiDisplay.splice(e-f,1);f++}}}function Ea(a,b,c,d,f){if(b!==
-""){var e=0;b=ia(b,d,f);for(d=a.aiDisplay.length-1;d>=0;d--){f=ja(a.aoData[a.aiDisplay[d]]._aData[c],a.aoColumns[c].sType);if(!b.test(f)){a.aiDisplay.splice(d,1);e++}}}}function Da(a,b,c,d,f){var e=ia(b,d,f);if(typeof c=="undefined"||c===null)c=0;if(n.afnFiltering.length!==0)c=1;if(b.length<=0){a.aiDisplay.splice(0,a.aiDisplay.length);a.aiDisplay=a.aiDisplayMaster.slice()}else if(a.aiDisplay.length==a.aiDisplayMaster.length||a.oPreviousSearch.sSearch.length>b.length||c==1||b.indexOf(a.oPreviousSearch.sSearch)!==
-0){a.aiDisplay.splice(0,a.aiDisplay.length);ha(a,1);for(c=0;c<a.aiDisplayMaster.length;c++)e.test(a.asDataSearch[c])&&a.aiDisplay.push(a.aiDisplayMaster[c])}else{var i=0;for(c=0;c<a.asDataSearch.length;c++)if(!e.test(a.asDataSearch[c])){a.aiDisplay.splice(c-i,1);i++}}a.oPreviousSearch.sSearch=b;a.oPreviousSearch.bRegex=d;a.oPreviousSearch.bSmart=f}function ha(a,b){a.asDataSearch.splice(0,a.asDataSearch.length);b=typeof b!="undefined"&&b==1?a.aiDisplayMaster:a.aiDisplay;for(var c=0,d=b.length;c<d;c++)a.asDataSearch[c]=
-ka(a,a.aoData[b[c]]._aData)}function ka(a,b){for(var c="",d=p.createElement("div"),f=0,e=a.aoColumns.length;f<e;f++)if(a.aoColumns[f].bSearchable)c+=ja(b[f],a.aoColumns[f].sType)+"  ";if(c.indexOf("&")!==-1){d.innerHTML=c;c=d.textContent?d.textContent:d.innerText;c=c.replace(/\n/g," ").replace(/\r/g,"")}return c}function ia(a,b,c){if(c){a=b?a.split(" "):la(a).split(" ");a="^(?=.*?"+a.join(")(?=.*?")+").*$";return new RegExp(a,"i")}else{a=b?a:la(a);return new RegExp(a,"i")}}function ja(a,b){if(typeof n.ofnSearch[b]==
-"function")return n.ofnSearch[b](a);else if(b=="html")return a.replace(/\n/g," ").replace(/<.*?>/g,"");else if(typeof a=="string")return a.replace(/\n/g," ");return a}function O(a,b){var c,d,f,e,i,h,k=[],l=[],q=n.oSort,t=a.aoData,G=a.aoColumns;if(!a.oFeatures.bServerSide&&(a.aaSorting.length!==0||a.aaSortingFixed!==null)){k=a.aaSortingFixed!==null?a.aaSortingFixed.concat(a.aaSorting):a.aaSorting.slice();for(f=0;f<k.length;f++){e=k[f][0];i=M(a,e);h=a.aoColumns[e].sSortDataType;if(typeof n.afnSortData[h]!=
-"undefined"){var J=n.afnSortData[h](a,e,i);i=0;for(h=t.length;i<h;i++)t[i]._aData[e]=J[i]}}f=0;for(e=a.aiDisplayMaster.length;f<e;f++)l[a.aiDisplayMaster[f]]=f;var B=k.length;a.aiDisplayMaster.sort(function(I,Y){var N;for(f=0;f<B;f++){c=G[k[f][0]].iDataSort;d=G[c].sType;N=q[d+"-"+k[f][1]](t[I]._aData[c],t[Y]._aData[c]);if(N!==0)return N}return q["numeric-asc"](l[I],l[Y])})}if(typeof b=="undefined"||b)T(a);a.bSorted=true;if(a.oFeatures.bFilter)P(a,a.oPreviousSearch,1);else{a.aiDisplay=a.aiDisplayMaster.slice();
-a._iDisplayStart=0;E(a);C(a)}}function ba(a,b,c,d){j(b).bind("click.DT",function(f){if(a.aoColumns[c].bSortable!==false){var e=function(){var i,h;if(f.shiftKey){for(var k=false,l=0;l<a.aaSorting.length;l++)if(a.aaSorting[l][0]==c){k=true;i=a.aaSorting[l][0];h=a.aaSorting[l][2]+1;if(typeof a.aoColumns[i].asSorting[h]=="undefined")a.aaSorting.splice(l,1);else{a.aaSorting[l][1]=a.aoColumns[i].asSorting[h];a.aaSorting[l][2]=h}break}k===false&&a.aaSorting.push([c,a.aoColumns[c].asSorting[0],0])}else if(a.aaSorting.length==
-1&&a.aaSorting[0][0]==c){i=a.aaSorting[0][0];h=a.aaSorting[0][2]+1;if(typeof a.aoColumns[i].asSorting[h]=="undefined")h=0;a.aaSorting[0][1]=a.aoColumns[i].asSorting[h];a.aaSorting[0][2]=h}else{a.aaSorting.splice(0,a.aaSorting.length);a.aaSorting.push([c,a.aoColumns[c].asSorting[0],0])}O(a)};if(a.oFeatures.bProcessing){K(a,true);setTimeout(function(){e();a.oFeatures.bServerSide||K(a,false)},0)}else e();typeof d=="function"&&d(a)}})}function T(a){var b,c,d,f,e,i=a.aoColumns.length,h=a.oClasses;for(b=
-0;b<i;b++)a.aoColumns[b].bSortable&&j(a.aoColumns[b].nTh).removeClass(h.sSortAsc+" "+h.sSortDesc+" "+a.aoColumns[b].sSortingClass);f=a.aaSortingFixed!==null?a.aaSortingFixed.concat(a.aaSorting):a.aaSorting.slice();for(b=0;b<a.aoColumns.length;b++)if(a.aoColumns[b].bSortable){e=a.aoColumns[b].sSortingClass;d=-1;for(c=0;c<f.length;c++)if(f[c][0]==b){e=f[c][1]=="asc"?h.sSortAsc:h.sSortDesc;d=c;break}j(a.aoColumns[b].nTh).addClass(e);if(a.bJUI){c=j("span",a.aoColumns[b].nTh);c.removeClass(h.sSortJUIAsc+
-" "+h.sSortJUIDesc+" "+h.sSortJUI+" "+h.sSortJUIAscAllowed+" "+h.sSortJUIDescAllowed);c.addClass(d==-1?a.aoColumns[b].sSortingClassJUI:f[d][1]=="asc"?h.sSortJUIAsc:h.sSortJUIDesc)}}else j(a.aoColumns[b].nTh).addClass(a.aoColumns[b].sSortingClass);e=h.sSortColumn;if(a.oFeatures.bSort&&a.oFeatures.bSortClasses){d=Z(a);if(d.length>=i)for(b=0;b<i;b++)if(d[b].className.indexOf(e+"1")!=-1){c=0;for(a=d.length/i;c<a;c++)d[i*c+b].className=j.trim(d[i*c+b].className.replace(e+"1",""))}else if(d[b].className.indexOf(e+
-"2")!=-1){c=0;for(a=d.length/i;c<a;c++)d[i*c+b].className=j.trim(d[i*c+b].className.replace(e+"2",""))}else if(d[b].className.indexOf(e+"3")!=-1){c=0;for(a=d.length/i;c<a;c++)d[i*c+b].className=j.trim(d[i*c+b].className.replace(" "+e+"3",""))}h=1;var k;for(b=0;b<f.length;b++){k=parseInt(f[b][0],10);c=0;for(a=d.length/i;c<a;c++)d[i*c+k].className+=" "+e+h;h<3&&h++}}}function Ba(a){if(a.oScroll.bInfinite)return null;var b=p.createElement("div");b.className=a.oClasses.sPaging+a.sPaginationType;n.oPagination[a.sPaginationType].fnInit(a,
-b,function(c){E(c);C(c)});typeof a.aanFeatures.p=="undefined"&&a.aoDrawCallback.push({fn:function(c){n.oPagination[c.sPaginationType].fnUpdate(c,function(d){E(d);C(d)})},sName:"pagination"});return b}function ea(a,b){var c=a._iDisplayStart;if(b=="first")a._iDisplayStart=0;else if(b=="previous"){a._iDisplayStart=a._iDisplayLength>=0?a._iDisplayStart-a._iDisplayLength:0;if(a._iDisplayStart<0)a._iDisplayStart=0}else if(b=="next")if(a._iDisplayLength>=0){if(a._iDisplayStart+a._iDisplayLength<a.fnRecordsDisplay())a._iDisplayStart+=
-a._iDisplayLength}else a._iDisplayStart=0;else if(b=="last")if(a._iDisplayLength>=0){b=parseInt((a.fnRecordsDisplay()-1)/a._iDisplayLength,10)+1;a._iDisplayStart=(b-1)*a._iDisplayLength}else a._iDisplayStart=0;else H(a,0,"Unknown paging action: "+b);return c!=a._iDisplayStart}function Aa(a){var b=p.createElement("div");b.className=a.oClasses.sInfo;if(typeof a.aanFeatures.i=="undefined"){a.aoDrawCallback.push({fn:Ga,sName:"information"});a.sTableId!==""&&b.setAttribute("id",a.sTableId+"_info")}return b}
-function Ga(a){if(!(!a.oFeatures.bInfo||a.aanFeatures.i.length===0)){var b=a._iDisplayStart+1,c=a.fnDisplayEnd(),d=a.fnRecordsTotal(),f=a.fnRecordsDisplay(),e=a.fnFormatNumber(b),i=a.fnFormatNumber(c),h=a.fnFormatNumber(d),k=a.fnFormatNumber(f);if(a.oScroll.bInfinite)e=a.fnFormatNumber(1);e=a.fnRecordsDisplay()===0&&a.fnRecordsDisplay()==a.fnRecordsTotal()?a.oLanguage.sInfoEmpty+a.oLanguage.sInfoPostFix:a.fnRecordsDisplay()===0?a.oLanguage.sInfoEmpty+" "+a.oLanguage.sInfoFiltered.replace("_MAX_",
-h)+a.oLanguage.sInfoPostFix:a.fnRecordsDisplay()==a.fnRecordsTotal()?a.oLanguage.sInfo.replace("_START_",e).replace("_END_",i).replace("_TOTAL_",k)+a.oLanguage.sInfoPostFix:a.oLanguage.sInfo.replace("_START_",e).replace("_END_",i).replace("_TOTAL_",k)+" "+a.oLanguage.sInfoFiltered.replace("_MAX_",a.fnFormatNumber(a.fnRecordsTotal()))+a.oLanguage.sInfoPostFix;if(a.oLanguage.fnInfoCallback!==null)e=a.oLanguage.fnInfoCallback(a,b,c,d,f,e);a=a.aanFeatures.i;b=0;for(c=a.length;b<c;b++)j(a[b]).html(e)}}
-function wa(a){if(a.oScroll.bInfinite)return null;var b='<select size="1" '+(a.sTableId===""?"":'name="'+a.sTableId+'_length"')+">",c,d;if(a.aLengthMenu.length==2&&typeof a.aLengthMenu[0]=="object"&&typeof a.aLengthMenu[1]=="object"){c=0;for(d=a.aLengthMenu[0].length;c<d;c++)b+='<option value="'+a.aLengthMenu[0][c]+'">'+a.aLengthMenu[1][c]+"</option>"}else{c=0;for(d=a.aLengthMenu.length;c<d;c++)b+='<option value="'+a.aLengthMenu[c]+'">'+a.aLengthMenu[c]+"</option>"}b+="</select>";var f=p.createElement("div");
-a.sTableId!==""&&typeof a.aanFeatures.l=="undefined"&&f.setAttribute("id",a.sTableId+"_length");f.className=a.oClasses.sLength;f.innerHTML=a.oLanguage.sLengthMenu.replace("_MENU_",b);j('select option[value="'+a._iDisplayLength+'"]',f).attr("selected",true);j("select",f).bind("change.DT",function(){var e=j(this).val(),i=a.aanFeatures.l;c=0;for(d=i.length;c<d;c++)i[c]!=this.parentNode&&j("select",i[c]).val(e);a._iDisplayLength=parseInt(e,10);E(a);if(a.fnDisplayEnd()==a.fnRecordsDisplay()){a._iDisplayStart=
-a.fnDisplayEnd()-a._iDisplayLength;if(a._iDisplayStart<0)a._iDisplayStart=0}if(a._iDisplayLength==-1)a._iDisplayStart=0;C(a)});return f}function ya(a){var b=p.createElement("div");a.sTableId!==""&&typeof a.aanFeatures.r=="undefined"&&b.setAttribute("id",a.sTableId+"_processing");b.innerHTML=a.oLanguage.sProcessing;b.className=a.oClasses.sProcessing;a.nTable.parentNode.insertBefore(b,a.nTable);return b}function K(a,b){if(a.oFeatures.bProcessing){a=a.aanFeatures.r;for(var c=0,d=a.length;c<d;c++)a[c].style.visibility=
-b?"visible":"hidden"}}function ga(a,b){for(var c=-1,d=0;d<a.aoColumns.length;d++){a.aoColumns[d].bVisible===true&&c++;if(c==b)return d}return null}function M(a,b){for(var c=-1,d=0;d<a.aoColumns.length;d++){a.aoColumns[d].bVisible===true&&c++;if(d==b)return a.aoColumns[d].bVisible===true?c:null}return null}function Q(a,b){var c,d;c=a._iDisplayStart;for(d=a._iDisplayEnd;c<d;c++)if(a.aoData[a.aiDisplay[c]].nTr==b)return a.aiDisplay[c];c=0;for(d=a.aoData.length;c<d;c++)if(a.aoData[c].nTr==b)return c;
-return null}function S(a){for(var b=0,c=0;c<a.aoColumns.length;c++)a.aoColumns[c].bVisible===true&&b++;return b}function E(a){a._iDisplayEnd=a.oFeatures.bPaginate===false?a.aiDisplay.length:a._iDisplayStart+a._iDisplayLength>a.aiDisplay.length||a._iDisplayLength==-1?a.aiDisplay.length:a._iDisplayStart+a._iDisplayLength}function Ha(a,b){if(!a||a===null||a==="")return 0;if(typeof b=="undefined")b=p.getElementsByTagName("body")[0];var c=p.createElement("div");c.style.width=a;b.appendChild(c);a=c.offsetWidth;
-b.removeChild(c);return a}function $(a){var b=0,c,d=0,f=a.aoColumns.length,e,i=j("th",a.nTHead);for(e=0;e<f;e++)if(a.aoColumns[e].bVisible){d++;if(a.aoColumns[e].sWidth!==null){c=Ha(a.aoColumns[e].sWidthOrig,a.nTable.parentNode);if(c!==null)a.aoColumns[e].sWidth=v(c);b++}}if(f==i.length&&b===0&&d==f&&a.oScroll.sX===""&&a.oScroll.sY==="")for(e=0;e<a.aoColumns.length;e++){c=j(i[e]).width();if(c!==null)a.aoColumns[e].sWidth=v(c)}else{b=a.nTable.cloneNode(false);e=p.createElement("tbody");c=p.createElement("tr");
-b.removeAttribute("id");b.appendChild(a.nTHead.cloneNode(true));if(a.nTFoot!==null){b.appendChild(a.nTFoot.cloneNode(true));L(function(h){h.style.width=""},b.getElementsByTagName("tr"))}b.appendChild(e);e.appendChild(c);e=j("thead th",b);if(e.length===0)e=j("tbody tr:eq(0)>td",b);e.each(function(h){this.style.width="";h=ga(a,h);if(h!==null&&a.aoColumns[h].sWidthOrig!=="")this.style.width=a.aoColumns[h].sWidthOrig});for(e=0;e<f;e++)if(a.aoColumns[e].bVisible){d=Ia(a,e);if(d!==null){d=d.cloneNode(true);
-c.appendChild(d)}}e=a.nTable.parentNode;e.appendChild(b);if(a.oScroll.sX!==""&&a.oScroll.sXInner!=="")b.style.width=v(a.oScroll.sXInner);else if(a.oScroll.sX!==""){b.style.width="";if(j(b).width()<e.offsetWidth)b.style.width=v(e.offsetWidth)}else if(a.oScroll.sY!=="")b.style.width=v(e.offsetWidth);b.style.visibility="hidden";Ja(a,b);f=j("tbody tr:eq(0)>td",b);if(f.length===0)f=j("thead tr:eq(0)>th",b);for(e=c=0;e<a.aoColumns.length;e++)if(a.aoColumns[e].bVisible){d=j(f[c]).outerWidth();if(d!==null&&
-d>0)a.aoColumns[e].sWidth=v(d);c++}a.nTable.style.width=v(j(b).outerWidth());b.parentNode.removeChild(b)}}function Ja(a,b){if(a.oScroll.sX===""&&a.oScroll.sY!==""){j(b).width();b.style.width=v(j(b).outerWidth()-a.oScroll.iBarWidth)}else if(a.oScroll.sX!=="")b.style.width=v(j(b).outerWidth())}function Ia(a,b,c){if(typeof c=="undefined"||c){c=Ka(a,b);b=M(a,b);if(c<0)return null;return a.aoData[c].nTr.getElementsByTagName("td")[b]}var d=-1,f,e;c=-1;var i=p.createElement("div");i.style.visibility="hidden";
-i.style.position="absolute";p.body.appendChild(i);f=0;for(e=a.aoData.length;f<e;f++){i.innerHTML=a.aoData[f]._aData[b];if(i.offsetWidth>d){d=i.offsetWidth;c=f}}p.body.removeChild(i);if(c>=0){b=M(a,b);if(a=a.aoData[c].nTr.getElementsByTagName("td")[b])return a}return null}function Ka(a,b){for(var c=-1,d=-1,f=0;f<a.aoData.length;f++){var e=a.aoData[f]._aData[b];if(e.length>c){c=e.length;d=f}}return d}function v(a){if(a===null)return"0px";if(typeof a=="number"){if(a<0)return"0px";return a+"px"}var b=
-a.charCodeAt(a.length-1);if(b<48||b>57)return a;return a+"px"}function Oa(a,b){if(a.length!=b.length)return 1;for(var c=0;c<a.length;c++)if(a[c]!=b[c])return 2;return 0}function aa(a){for(var b=n.aTypes,c=b.length,d=0;d<c;d++){var f=b[d](a);if(f!==null)return f}return"string"}function A(a){for(var b=0;b<D.length;b++)if(D[b].nTable==a)return D[b];return null}function V(a){for(var b=[],c=a.aoData.length,d=0;d<c;d++)b.push(a.aoData[d]._aData);return b}function R(a){for(var b=[],c=a.aoData.length,d=0;d<
-c;d++)b.push(a.aoData[d].nTr);return b}function Z(a){var b=R(a),c=[],d,f=[],e,i,h,k;e=0;for(i=b.length;e<i;e++){c=[];h=0;for(k=b[e].childNodes.length;h<k;h++){d=b[e].childNodes[h];d.nodeName.toUpperCase()=="TD"&&c.push(d)}h=d=0;for(k=a.aoColumns.length;h<k;h++)if(a.aoColumns[h].bVisible)f.push(c[h-d]);else{f.push(a.aoData[e]._anHidden[h]);d++}}return f}function la(a){return a.replace(new RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^)","g"),"\\$1")}function ma(a,b){for(var c=
--1,d=0,f=a.length;d<f;d++)if(a[d]==b)c=d;else a[d]>b&&a[d]--;c!=-1&&a.splice(c,1)}function va(a,b){b=b.split(",");for(var c=[],d=0,f=a.aoColumns.length;d<f;d++)for(var e=0;e<f;e++)if(a.aoColumns[d].sName==b[e]){c.push(e);break}return c}function ca(a){for(var b="",c=0,d=a.aoColumns.length;c<d;c++)b+=a.aoColumns[c].sName+",";if(b.length==d)return"";return b.slice(0,-1)}function H(a,b,c){a=a.sTableId===""?"DataTables warning: "+c:"DataTables warning (table id = '"+a.sTableId+"'): "+c;if(b===0)if(n.sErrMode==
-"alert")alert(a);else throw a;else typeof console!="undefined"&&typeof console.log!="undefined"&&console.log(a)}function da(a){a.aoData.splice(0,a.aoData.length);a.aiDisplayMaster.splice(0,a.aiDisplayMaster.length);a.aiDisplay.splice(0,a.aiDisplay.length);E(a)}function na(a){if(!(!a.oFeatures.bStateSave||typeof a.bDestroying!="undefined")){var b,c,d,f="{";f+='"iCreate":'+(new Date).getTime()+",";f+='"iStart":'+a._iDisplayStart+",";f+='"iEnd":'+a._iDisplayEnd+",";f+='"iLength":'+a._iDisplayLength+
-",";f+='"sFilter":"'+encodeURIComponent(a.oPreviousSearch.sSearch)+'",';f+='"sFilterEsc":'+!a.oPreviousSearch.bRegex+",";f+='"aaSorting":[ ';for(b=0;b<a.aaSorting.length;b++)f+="["+a.aaSorting[b][0]+',"'+a.aaSorting[b][1]+'"],';f=f.substring(0,f.length-1);f+="],";f+='"aaSearchCols":[ ';for(b=0;b<a.aoPreSearchCols.length;b++)f+='["'+encodeURIComponent(a.aoPreSearchCols[b].sSearch)+'",'+!a.aoPreSearchCols[b].bRegex+"],";f=f.substring(0,f.length-1);f+="],";f+='"abVisCols":[ ';for(b=0;b<a.aoColumns.length;b++)f+=
-a.aoColumns[b].bVisible+",";f=f.substring(0,f.length-1);f+="]";b=0;for(c=a.aoStateSave.length;b<c;b++){d=a.aoStateSave[b].fn(a,f);if(d!=="")f=d}f+="}";La(a.sCookiePrefix+a.sInstance,f,a.iCookieDuration,a.sCookiePrefix,a.fnCookieCallback)}}function Ma(a,b){if(a.oFeatures.bStateSave){var c,d,f;d=oa(a.sCookiePrefix+a.sInstance);if(d!==null&&d!==""){try{c=typeof j.parseJSON=="function"?j.parseJSON(d.replace(/'/g,'"')):eval("("+d+")")}catch(e){return}d=0;for(f=a.aoStateLoad.length;d<f;d++)if(!a.aoStateLoad[d].fn(a,
-c))return;a.oLoadedState=j.extend(true,{},c);a._iDisplayStart=c.iStart;a.iInitDisplayStart=c.iStart;a._iDisplayEnd=c.iEnd;a._iDisplayLength=c.iLength;a.oPreviousSearch.sSearch=decodeURIComponent(c.sFilter);a.aaSorting=c.aaSorting.slice();a.saved_aaSorting=c.aaSorting.slice();if(typeof c.sFilterEsc!="undefined")a.oPreviousSearch.bRegex=!c.sFilterEsc;if(typeof c.aaSearchCols!="undefined")for(d=0;d<c.aaSearchCols.length;d++)a.aoPreSearchCols[d]={sSearch:decodeURIComponent(c.aaSearchCols[d][0]),bRegex:!c.aaSearchCols[d][1]};
-if(typeof c.abVisCols!="undefined"){b.saved_aoColumns=[];for(d=0;d<c.abVisCols.length;d++){b.saved_aoColumns[d]={};b.saved_aoColumns[d].bVisible=c.abVisCols[d]}}}}}function La(a,b,c,d,f){var e=new Date;e.setTime(e.getTime()+c*1E3);c=ra.location.pathname.split("/");a=a+"_"+c.pop().replace(/[\/:]/g,"").toLowerCase();var i;if(f!==null){i=typeof j.parseJSON=="function"?j.parseJSON(b):eval("("+b+")");b=f(a,i,e.toGMTString(),c.join("/")+"/")}else b=a+"="+encodeURIComponent(b)+"; expires="+e.toGMTString()+
-"; path="+c.join("/")+"/";f="";e=9999999999999;if((oa(a)!==null?p.cookie.length:b.length+p.cookie.length)+10>4096){a=p.cookie.split(";");for(var h=0,k=a.length;h<k;h++)if(a[h].indexOf(d)!=-1){var l=a[h].split("=");try{i=eval("("+decodeURIComponent(l[1])+")")}catch(q){continue}if(typeof i.iCreate!="undefined"&&i.iCreate<e){f=l[0];e=i.iCreate}}if(f!=="")p.cookie=f+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+c.join("/")+"/"}p.cookie=b}function oa(a){var b=ra.location.pathname.split("/");a=a+"_"+
-b[b.length-1].replace(/[\/:]/g,"").toLowerCase()+"=";b=p.cookie.split(";");for(var c=0;c<b.length;c++){for(var d=b[c];d.charAt(0)==" ";)d=d.substring(1,d.length);if(d.indexOf(a)===0)return decodeURIComponent(d.substring(a.length,d.length))}return null}function fa(a){a=a.getElementsByTagName("tr");if(a.length==1)return a[0].getElementsByTagName("th");var b=[],c=[],d,f,e,i,h,k,l=function(I,Y,N){for(;typeof I[Y][N]!="undefined";)N++;return N},q=function(I){if(typeof b[I]=="undefined")b[I]=[]};d=0;for(i=
-a.length;d<i;d++){q(d);var t=0,G=[];f=0;for(h=a[d].childNodes.length;f<h;f++)if(a[d].childNodes[f].nodeName.toUpperCase()=="TD"||a[d].childNodes[f].nodeName.toUpperCase()=="TH")G.push(a[d].childNodes[f]);f=0;for(h=G.length;f<h;f++){var J=G[f].getAttribute("colspan")*1,B=G[f].getAttribute("rowspan")*1;if(!J||J===0||J===1){k=l(b,d,t);b[d][k]=G[f].nodeName.toUpperCase()=="TD"?4:G[f];if(B||B===0||B===1)for(e=1;e<B;e++){q(d+e);b[d+e][k]=2}t++}else{k=l(b,d,t);for(e=0;e<J;e++)b[d][k+e]=3;t+=J}}}d=0;for(i=
-b.length;d<i;d++){f=0;for(h=b[d].length;f<h;f++)if(typeof b[d][f]=="object"&&typeof c[f]=="undefined")c[f]=b[d][f]}return c}function Na(){var a=p.createElement("p"),b=a.style;b.width="100%";b.height="200px";var c=p.createElement("div");b=c.style;b.position="absolute";b.top="0px";b.left="0px";b.visibility="hidden";b.width="200px";b.height="150px";b.overflow="hidden";c.appendChild(a);p.body.appendChild(c);b=a.offsetWidth;c.style.overflow="scroll";a=a.offsetWidth;if(b==a)a=c.clientWidth;p.body.removeChild(c);
-return b-a}function L(a,b,c){for(var d=0,f=b.length;d<f;d++)for(var e=0,i=b[d].childNodes.length;e<i;e++)if(b[d].childNodes[e].nodeType==1)typeof c!="undefined"?a(b[d].childNodes[e],c[d].childNodes[e]):a(b[d].childNodes[e])}function o(a,b,c,d){if(typeof d=="undefined")d=c;if(typeof b[c]!="undefined")a[d]=b[c]}this.oApi={};this.fnDraw=function(a){var b=A(this[n.iApiIndex]);if(typeof a!="undefined"&&a===false){E(b);C(b)}else W(b)};this.fnFilter=function(a,b,c,d,f){var e=A(this[n.iApiIndex]);if(e.oFeatures.bFilter){if(typeof c==
-"undefined")c=false;if(typeof d=="undefined")d=true;if(typeof f=="undefined")f=true;if(typeof b=="undefined"||b===null){P(e,{sSearch:a,bRegex:c,bSmart:d},1);if(f&&typeof e.aanFeatures.f!="undefined"){b=e.aanFeatures.f;c=0;for(d=b.length;c<d;c++)j("input",b[c]).val(a)}}else{e.aoPreSearchCols[b].sSearch=a;e.aoPreSearchCols[b].bRegex=c;e.aoPreSearchCols[b].bSmart=d;P(e,e.oPreviousSearch,1)}}};this.fnSettings=function(){return A(this[n.iApiIndex])};this.fnVersionCheck=n.fnVersionCheck;this.fnSort=function(a){var b=
-A(this[n.iApiIndex]);b.aaSorting=a;O(b)};this.fnSortListener=function(a,b,c){ba(A(this[n.iApiIndex]),a,b,c)};this.fnAddData=function(a,b){if(a.length===0)return[];var c=[],d,f=A(this[n.iApiIndex]);if(typeof a[0]=="object")for(var e=0;e<a.length;e++){d=u(f,a[e]);if(d==-1)return c;c.push(d)}else{d=u(f,a);if(d==-1)return c;c.push(d)}f.aiDisplay=f.aiDisplayMaster.slice();if(typeof b=="undefined"||b)W(f);return c};this.fnDeleteRow=function(a,b,c){var d=A(this[n.iApiIndex]);a=typeof a=="object"?Q(d,a):
-a;var f=d.aoData.splice(a,1),e=j.inArray(a,d.aiDisplay);d.asDataSearch.splice(e,1);ma(d.aiDisplayMaster,a);ma(d.aiDisplay,a);typeof b=="function"&&b.call(this,d,f);if(d._iDisplayStart>=d.aiDisplay.length){d._iDisplayStart-=d._iDisplayLength;if(d._iDisplayStart<0)d._iDisplayStart=0}if(typeof c=="undefined"||c){E(d);C(d)}return f};this.fnClearTable=function(a){var b=A(this[n.iApiIndex]);da(b);if(typeof a=="undefined"||a)C(b)};this.fnOpen=function(a,b,c){var d=A(this[n.iApiIndex]);this.fnClose(a);var f=
-p.createElement("tr"),e=p.createElement("td");f.appendChild(e);e.className=c;e.colSpan=S(d);e.innerHTML=b;b=j("tr",d.nTBody);j.inArray(a,b)!=-1&&j(f).insertAfter(a);d.aoOpenRows.push({nTr:f,nParent:a});return f};this.fnClose=function(a){for(var b=A(this[n.iApiIndex]),c=0;c<b.aoOpenRows.length;c++)if(b.aoOpenRows[c].nParent==a){(a=b.aoOpenRows[c].nTr.parentNode)&&a.removeChild(b.aoOpenRows[c].nTr);b.aoOpenRows.splice(c,1);return 0}return 1};this.fnGetData=function(a){var b=A(this[n.iApiIndex]);if(typeof a!=
-"undefined"){a=typeof a=="object"?Q(b,a):a;return(aRowData=b.aoData[a])?aRowData._aData:null}return V(b)};this.fnGetNodes=function(a){var b=A(this[n.iApiIndex]);if(typeof a!="undefined")return(aRowData=b.aoData[a])?aRowData.nTr:null;return R(b)};this.fnGetPosition=function(a){var b=A(this[n.iApiIndex]);if(a.nodeName.toUpperCase()=="TR")return Q(b,a);else if(a.nodeName.toUpperCase()=="TD")for(var c=Q(b,a.parentNode),d=0,f=0;f<b.aoColumns.length;f++)if(b.aoColumns[f].bVisible){if(b.aoData[c].nTr.getElementsByTagName("td")[f-
-d]==a)return[c,f-d,f]}else d++;return null};this.fnUpdate=function(a,b,c,d,f){var e=A(this[n.iApiIndex]),i,h;b=typeof b=="object"?Q(e,b):b;if(typeof a!="object"){h=a;e.aoData[b]._aData[c]=h;if(e.aoColumns[c].fnRender!==null){h=e.aoColumns[c].fnRender({iDataRow:b,iDataColumn:c,aData:e.aoData[b]._aData,oSettings:e});if(e.aoColumns[c].bUseRendered)e.aoData[b]._aData[c]=h}i=M(e,c);if(i!==null)e.aoData[b].nTr.getElementsByTagName("td")[i].innerHTML=h;else e.aoData[b]._anHidden[c].innerHTML=h}else{if(a.length!=
-e.aoColumns.length){H(e,0,"An array passed to fnUpdate must have the same number of columns as the table in question - in this case "+e.aoColumns.length);return 1}for(c=0;c<a.length;c++){h=a[c];e.aoData[b]._aData[c]=h;if(e.aoColumns[c].fnRender!==null){h=e.aoColumns[c].fnRender({iDataRow:b,iDataColumn:c,aData:e.aoData[b]._aData,oSettings:e});if(e.aoColumns[c].bUseRendered)e.aoData[b]._aData[c]=h}i=M(e,c);if(i!==null)e.aoData[b].nTr.getElementsByTagName("td")[i].innerHTML=h;else e.aoData[b]._anHidden[c].innerHTML=
-h}}a=j.inArray(b,e.aiDisplay);e.asDataSearch[a]=ka(e,e.aoData[b]._aData);if(typeof f=="undefined"||f)X(e);if(typeof d=="undefined"||d)W(e);return 0};this.fnSetColumnVis=function(a,b,c){var d=A(this[n.iApiIndex]),f,e;e=d.aoColumns.length;var i,h,k,l,q;if(d.aoColumns[a].bVisible!=b){l=j(">tr",d.nTHead)[0];i=j(">tr",d.nTFoot)[0];q=[];h=[];for(f=0;f<e;f++){q.push(d.aoColumns[f].nTh);h.push(d.aoColumns[f].nTf)}if(b){for(f=b=0;f<a;f++)d.aoColumns[f].bVisible&&b++;if(b>=S(d)){l.appendChild(q[a]);l=j(">tr",
-d.nTHead);f=1;for(e=l.length;f<e;f++)l[f].appendChild(d.aoColumns[a].anThExtra[f-1]);if(i){i.appendChild(h[a]);l=j(">tr",d.nTFoot);f=1;for(e=l.length;f<e;f++)l[f].appendChild(d.aoColumns[a].anTfExtra[f-1])}f=0;for(e=d.aoData.length;f<e;f++){i=d.aoData[f]._anHidden[a];d.aoData[f].nTr.appendChild(i)}}else{for(f=a;f<e;f++){k=M(d,f);if(k!==null)break}l.insertBefore(q[a],l.getElementsByTagName("th")[k]);l=j(">tr",d.nTHead);f=1;for(e=l.length;f<e;f++){q=j(l[f]).children();l[f].insertBefore(d.aoColumns[a].anThExtra[f-
-1],q[k])}if(i){i.insertBefore(h[a],i.getElementsByTagName("th")[k]);l=j(">tr",d.nTFoot);f=1;for(e=l.length;f<e;f++){q=j(l[f]).children();l[f].insertBefore(d.aoColumns[a].anTfExtra[f-1],q[k])}}Z(d);f=0;for(e=d.aoData.length;f<e;f++){i=d.aoData[f]._anHidden[a];d.aoData[f].nTr.insertBefore(i,j(">td:eq("+k+")",d.aoData[f].nTr)[0])}}d.aoColumns[a].bVisible=true}else{l.removeChild(q[a]);f=0;for(e=d.aoColumns[a].anThExtra.length;f<e;f++){k=d.aoColumns[a].anThExtra[f];k.parentNode.removeChild(k)}if(i){i.removeChild(h[a]);
-f=0;for(e=d.aoColumns[a].anTfExtra.length;f<e;f++){k=d.aoColumns[a].anTfExtra[f];k.parentNode.removeChild(k)}}h=Z(d);f=0;for(e=d.aoData.length;f<e;f++){i=h[f*d.aoColumns.length+a*1];d.aoData[f]._anHidden[a]=i;i.parentNode.removeChild(i)}d.aoColumns[a].bVisible=false}f=0;for(e=d.aoOpenRows.length;f<e;f++)d.aoOpenRows[f].nTr.colSpan=S(d);if(typeof c=="undefined"||c){X(d);C(d)}na(d)}};this.fnPageChange=function(a,b){var c=A(this[n.iApiIndex]);ea(c,a);E(c);if(typeof b=="undefined"||b)C(c)};this.fnDestroy=
-function(){var a=A(this[n.iApiIndex]),b=a.nTableWrapper.parentNode,c=a.nTBody,d,f;a.bDestroying=true;j(a.nTableWrapper).find("*").andSelf().unbind(".DT");d=0;for(f=a.aoColumns.length;d<f;d++)a.aoColumns[d].bVisible===false&&this.fnSetColumnVis(d,true);j("tbody>tr>td."+a.oClasses.sRowEmpty,a.nTable).parent().remove();if(a.nTable!=a.nTHead.parentNode){j(">thead",a.nTable).remove();a.nTable.appendChild(a.nTHead)}if(a.nTFoot&&a.nTable!=a.nTFoot.parentNode){j(">tfoot",a.nTable).remove();a.nTable.appendChild(a.nTFoot)}a.nTable.parentNode.removeChild(a.nTable);
-j(a.nTableWrapper).remove();a.aaSorting=[];a.aaSortingFixed=[];T(a);j(R(a)).removeClass(a.asStripClasses.join(" "));if(a.bJUI){j("th",a.nTHead).removeClass([n.oStdClasses.sSortable,n.oJUIClasses.sSortableAsc,n.oJUIClasses.sSortableDesc,n.oJUIClasses.sSortableNone].join(" "));j("th span",a.nTHead).remove()}else j("th",a.nTHead).removeClass([n.oStdClasses.sSortable,n.oStdClasses.sSortableAsc,n.oStdClasses.sSortableDesc,n.oStdClasses.sSortableNone].join(" "));b.appendChild(a.nTable);d=0;for(f=a.aoData.length;d<
-f;d++)c.appendChild(a.aoData[d].nTr);a.nTable.style.width=v(a.sDestroyWidth);j(">tr:even",c).addClass(a.asDestoryStrips[0]);j(">tr:odd",c).addClass(a.asDestoryStrips[1]);d=0;for(f=D.length;d<f;d++)D[d]==a&&D.splice(d,1)};this.fnAdjustColumnSizing=function(a){var b=A(this[n.iApiIndex]);X(b);if(typeof a=="undefined"||a)this.fnDraw(false);else if(b.oScroll.sX!==""||b.oScroll.sY!=="")this.oApi._fnScrollDraw(b)};for(var pa in n.oApi)if(pa)this[pa]=r(pa);this.oApi._fnExternApiFunc=r;this.oApi._fnInitalise=
-s;this.oApi._fnLanguageProcess=y;this.oApi._fnAddColumn=F;this.oApi._fnColumnOptions=x;this.oApi._fnAddData=u;this.oApi._fnGatherData=z;this.oApi._fnDrawHead=U;this.oApi._fnDraw=C;this.oApi._fnReDraw=W;this.oApi._fnAjaxUpdate=ta;this.oApi._fnAjaxUpdateDraw=ua;this.oApi._fnAddOptionsHtml=sa;this.oApi._fnFeatureHtmlTable=za;this.oApi._fnScrollDraw=Ca;this.oApi._fnAjustColumnSizing=X;this.oApi._fnFeatureHtmlFilter=xa;this.oApi._fnFilterComplete=P;this.oApi._fnFilterCustom=Fa;this.oApi._fnFilterColumn=
-Ea;this.oApi._fnFilter=Da;this.oApi._fnBuildSearchArray=ha;this.oApi._fnBuildSearchRow=ka;this.oApi._fnFilterCreateSearch=ia;this.oApi._fnDataToSearch=ja;this.oApi._fnSort=O;this.oApi._fnSortAttachListener=ba;this.oApi._fnSortingClasses=T;this.oApi._fnFeatureHtmlPaginate=Ba;this.oApi._fnPageChange=ea;this.oApi._fnFeatureHtmlInfo=Aa;this.oApi._fnUpdateInfo=Ga;this.oApi._fnFeatureHtmlLength=wa;this.oApi._fnFeatureHtmlProcessing=ya;this.oApi._fnProcessingDisplay=K;this.oApi._fnVisibleToColumnIndex=ga;
-this.oApi._fnColumnIndexToVisible=M;this.oApi._fnNodeToDataIndex=Q;this.oApi._fnVisbleColumns=S;this.oApi._fnCalculateEnd=E;this.oApi._fnConvertToWidth=Ha;this.oApi._fnCalculateColumnWidths=$;this.oApi._fnScrollingWidthAdjust=Ja;this.oApi._fnGetWidestNode=Ia;this.oApi._fnGetMaxLenString=Ka;this.oApi._fnStringToCss=v;this.oApi._fnArrayCmp=Oa;this.oApi._fnDetectType=aa;this.oApi._fnSettingsFromNode=A;this.oApi._fnGetDataMaster=V;this.oApi._fnGetTrNodes=R;this.oApi._fnGetTdNodes=Z;this.oApi._fnEscapeRegex=
-la;this.oApi._fnDeleteIndex=ma;this.oApi._fnReOrderIndex=va;this.oApi._fnColumnOrdering=ca;this.oApi._fnLog=H;this.oApi._fnClearTable=da;this.oApi._fnSaveState=na;this.oApi._fnLoadState=Ma;this.oApi._fnCreateCookie=La;this.oApi._fnReadCookie=oa;this.oApi._fnGetUniqueThs=fa;this.oApi._fnScrollBarWidth=Na;this.oApi._fnApplyToChildren=L;this.oApi._fnMap=o;var qa=this;return this.each(function(){var a=0,b,c,d,f;a=0;for(b=D.length;a<b;a++){if(D[a].nTable==this)if(typeof g=="undefined"||typeof g.bRetrieve!=
-"undefined"&&g.bRetrieve===true)return D[a].oInstance;else if(typeof g.bDestroy!="undefined"&&g.bDestroy===true){D[a].oInstance.fnDestroy();break}else{H(D[a],0,"Cannot reinitialise DataTable.\n\nTo retrieve the DataTables object for this table, please pass either no arguments to the dataTable() function, or set bRetrieve to true. Alternatively, to destory the old table and create a new one, set bDestroy to true (note that a lot of changes to the configuration can be made through the API which is usually much faster).");
-return}if(D[a].sTableId!==""&&D[a].sTableId==this.getAttribute("id")){D.splice(a,1);break}}var e=new m;D.push(e);var i=false,h=false;a=this.getAttribute("id");if(a!==null){e.sTableId=a;e.sInstance=a}else e.sInstance=n._oExternConfig.iNextUnique++;if(this.nodeName.toLowerCase()!="table")H(e,0,"Attempted to initialise DataTables on a node which is not a table: "+this.nodeName);else{e.nTable=this;e.oInstance=qa.length==1?qa:j(this).dataTable();e.oApi=qa.oApi;e.sDestroyWidth=j(this).width();if(typeof g!=
-"undefined"&&g!==null){e.oInit=g;o(e.oFeatures,g,"bPaginate");o(e.oFeatures,g,"bLengthChange");o(e.oFeatures,g,"bFilter");o(e.oFeatures,g,"bSort");o(e.oFeatures,g,"bInfo");o(e.oFeatures,g,"bProcessing");o(e.oFeatures,g,"bAutoWidth");o(e.oFeatures,g,"bSortClasses");o(e.oFeatures,g,"bServerSide");o(e.oScroll,g,"sScrollX","sX");o(e.oScroll,g,"sScrollXInner","sXInner");o(e.oScroll,g,"sScrollY","sY");o(e.oScroll,g,"bScrollCollapse","bCollapse");o(e.oScroll,g,"bScrollInfinite","bInfinite");o(e.oScroll,
-g,"iScrollLoadGap","iLoadGap");o(e.oScroll,g,"bScrollAutoCss","bAutoCss");o(e,g,"asStripClasses");o(e,g,"fnRowCallback");o(e,g,"fnHeaderCallback");o(e,g,"fnFooterCallback");o(e,g,"fnCookieCallback");o(e,g,"fnInitComplete");o(e,g,"fnServerData");o(e,g,"fnFormatNumber");o(e,g,"aaSorting");o(e,g,"aaSortingFixed");o(e,g,"aLengthMenu");o(e,g,"sPaginationType");o(e,g,"sAjaxSource");o(e,g,"iCookieDuration");o(e,g,"sCookiePrefix");o(e,g,"sDom");o(e,g,"oSearch","oPreviousSearch");o(e,g,"aoSearchCols","aoPreSearchCols");
-o(e,g,"iDisplayLength","_iDisplayLength");o(e,g,"bJQueryUI","bJUI");o(e.oLanguage,g,"fnInfoCallback");typeof g.fnDrawCallback=="function"&&e.aoDrawCallback.push({fn:g.fnDrawCallback,sName:"user"});typeof g.fnStateSaveCallback=="function"&&e.aoStateSave.push({fn:g.fnStateSaveCallback,sName:"user"});typeof g.fnStateLoadCallback=="function"&&e.aoStateLoad.push({fn:g.fnStateLoadCallback,sName:"user"});e.oFeatures.bServerSide&&e.oFeatures.bSort&&e.oFeatures.bSortClasses&&e.aoDrawCallback.push({fn:T,sName:"server_side_sort_classes"});
-if(typeof g.bJQueryUI!="undefined"&&g.bJQueryUI){e.oClasses=n.oJUIClasses;if(typeof g.sDom=="undefined")e.sDom='<"H"lfr>t<"F"ip>'}if(e.oScroll.sX!==""||e.oScroll.sY!=="")e.oScroll.iBarWidth=Na();if(typeof g.iDisplayStart!="undefined"&&typeof e.iInitDisplayStart=="undefined"){e.iInitDisplayStart=g.iDisplayStart;e._iDisplayStart=g.iDisplayStart}if(typeof g.bStateSave!="undefined"){e.oFeatures.bStateSave=g.bStateSave;Ma(e,g);e.aoDrawCallback.push({fn:na,sName:"state_save"})}if(typeof g.aaData!="undefined")h=
-true;if(typeof g!="undefined"&&typeof g.aoData!="undefined")g.aoColumns=g.aoData;if(typeof g.oLanguage!="undefined")if(typeof g.oLanguage.sUrl!="undefined"&&g.oLanguage.sUrl!==""){e.oLanguage.sUrl=g.oLanguage.sUrl;j.getJSON(e.oLanguage.sUrl,null,function(q){y(e,q,true)});i=true}else y(e,g.oLanguage,false)}else g={};if(typeof g.asStripClasses=="undefined"){e.asStripClasses.push(e.oClasses.sStripOdd);e.asStripClasses.push(e.oClasses.sStripEven)}c=false;d=j(">tbody>tr",this);a=0;for(b=e.asStripClasses.length;a<
-b;a++)if(d.filter(":lt(2)").hasClass(e.asStripClasses[a])){c=true;break}if(c){e.asDestoryStrips=["",""];if(j(d[0]).hasClass(e.oClasses.sStripOdd))e.asDestoryStrips[0]+=e.oClasses.sStripOdd+" ";if(j(d[0]).hasClass(e.oClasses.sStripEven))e.asDestoryStrips[0]+=e.oClasses.sStripEven;if(j(d[1]).hasClass(e.oClasses.sStripOdd))e.asDestoryStrips[1]+=e.oClasses.sStripOdd+" ";if(j(d[1]).hasClass(e.oClasses.sStripEven))e.asDestoryStrips[1]+=e.oClasses.sStripEven;d.removeClass(e.asStripClasses.join(" "))}a=this.getElementsByTagName("thead");
-c=a.length===0?[]:fa(a[0]);var k;if(typeof g.aoColumns=="undefined"){k=[];a=0;for(b=c.length;a<b;a++)k.push(null)}else k=g.aoColumns;a=0;for(b=k.length;a<b;a++){if(typeof g.saved_aoColumns!="undefined"&&g.saved_aoColumns.length==b){if(k[a]===null)k[a]={};k[a].bVisible=g.saved_aoColumns[a].bVisible}F(e,c?c[a]:null)}if(typeof g.aoColumnDefs!="undefined")for(a=g.aoColumnDefs.length-1;a>=0;a--){var l=g.aoColumnDefs[a].aTargets;j.isArray(l)||H(e,1,"aTargets must be an array of targets, not a "+typeof l);
-c=0;for(d=l.length;c<d;c++)if(typeof l[c]=="number"&&l[c]>=0){for(;e.aoColumns.length<=l[c];)F(e);x(e,l[c],g.aoColumnDefs[a])}else if(typeof l[c]=="number"&&l[c]<0)x(e,e.aoColumns.length+l[c],g.aoColumnDefs[a]);else if(typeof l[c]=="string"){b=0;for(f=e.aoColumns.length;b<f;b++)if(l[c]=="_all"||e.aoColumns[b].nTh.className.indexOf(l[c])!=-1)x(e,b,g.aoColumnDefs[a])}}if(typeof k!="undefined"){a=0;for(b=k.length;a<b;a++)x(e,a,k[a])}a=0;for(b=e.aaSorting.length;a<b;a++){if(e.aaSorting[a][0]>=e.aoColumns.length)e.aaSorting[a][0]=
-0;k=e.aoColumns[e.aaSorting[a][0]];if(typeof e.aaSorting[a][2]=="undefined")e.aaSorting[a][2]=0;if(typeof g.aaSorting=="undefined"&&typeof e.saved_aaSorting=="undefined")e.aaSorting[a][1]=k.asSorting[0];c=0;for(d=k.asSorting.length;c<d;c++)if(e.aaSorting[a][1]==k.asSorting[c]){e.aaSorting[a][2]=c;break}}T(e);this.getElementsByTagName("thead").length===0&&this.appendChild(p.createElement("thead"));this.getElementsByTagName("tbody").length===0&&this.appendChild(p.createElement("tbody"));e.nTHead=this.getElementsByTagName("thead")[0];
-e.nTBody=this.getElementsByTagName("tbody")[0];if(this.getElementsByTagName("tfoot").length>0)e.nTFoot=this.getElementsByTagName("tfoot")[0];if(h)for(a=0;a<g.aaData.length;a++)u(e,g.aaData[a]);else z(e);e.aiDisplay=e.aiDisplayMaster.slice();e.bInitialised=true;i===false&&s(e)}})}})(jQuery,window,document);
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/loadbar.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/loadbar.js	(revision 11253)
+++ 	(revision )
@@ -1,23 +1,0 @@
-
-var loadbar_interval = null;
-$(document).ready(
-    function update() {
-	$.getJSON(
-	    $("#status_url").attr("value"),
-	    {},
-	    function(data) {
-		$('input[name="reload"]').remove();
-		clearInterval(loadbar_interval);
-		$("#loadbar").html(data.html);
-		if (data.reload == true) {
-		    if ($('input[name="download"]').attr("value") == null) {
-			location.reload();
-		    }
-		}
-		if (data.interval != 0) {
-		    loadbar_interval = setInterval(update, data.interval);
-		}
-	    }
-	)
-    }
-)
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/mobile.css
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/mobile.css	(revision 11253)
+++ 	(revision )
@@ -1,7 +1,0 @@
-.container {
-  width:900px;
-}
-
-.student-info-bar{
-  width: 900px;
-}
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/page_not_reloader.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/page_not_reloader.js	(revision 11253)
+++ 	(revision )
@@ -1,8 +1,0 @@
-$(document).ready(function() {
-    if(window.top==window) {
-	// you're not in a frame so you reload the site
-	window.clearTimeout('location.reload()'); //reloads after 1.5 seconds
-    } else {
-	//you're inside a frame, so you stop reloading
-    }
-});
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/page_reloader.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/page_reloader.js	(revision 11253)
+++ 	(revision )
@@ -1,8 +1,0 @@
-$(document).ready(function() {
-    if(window.top==window) {
-	// you're not in a frame so you reload the site
-	window.setTimeout('location.reload()', 1500); //reloads after 1.5 seconds
-    } else {
-	//you're inside a frame, so you stop reloading
-    }
-});
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/recaptcha_white.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/recaptcha_white.js	(revision 11253)
+++ 	(revision )
@@ -1,3 +1,0 @@
-var RecaptchaOptions = {
-    theme : 'white'
- };
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/tabs.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/tabs.js	(revision 11253)
+++ 	(revision )
@@ -1,4 +1,0 @@
-/* See http://docs.jquery.com/UI/Tabs */
-$(document).ready(function() {
-    $("#tabs").tabs();
-  });
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/toggleall.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/toggleall.js	(revision 11253)
+++ 	(revision )
@@ -1,5 +1,0 @@
-function toggle(source, name) {
-  checkboxes = document.getElementsByName(name);
-  for(var i in checkboxes)
-    checkboxes[i].checked = source.checked;
-}
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/waeup-base.css
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/waeup-base.css	(revision 11253)
+++ 	(revision )
@@ -1,264 +1,0 @@
-/* This is the base stylesheet for KOFA. It defines base styles
-additionally or modifying Bootstrap styles. For themes, please create
-a stylesheet overriding values set here in a file named
-'waeuptheme-<SOME-NAME>.css' and include a utility and a resource in theming.py 
-and resources.py respectively. */
-
-/* bootstrap.min customizations */
-
-body {
-  padding-top: 56px;
-  background-color: #EEEEEE;
-}
-
-.container-fluid>.sidebar {
-  width: 165px;
-}
-
-.container-fluid > .content {
-  margin-left: 180px;
-}
-
-.well {
-  border: 0px;
-  background-color: #FFFFFF;
-  padding-bottom: 12px;
-  padding-left: 12px;
-  padding-right: 12px;
-  padding-top: 12px;
-  box-shadow: none;
-}
-
-.content {
-  background-color: #FFFFFF;
-  margin-left: -20px;
-  margin-right: -20px;
-  padding-bottom: 16px;
-  padding-left: 20px;
-  padding-right: 20px;
-  padding-top: 16px;
-  border-top-left-radius: 3px;
-  border-top-right-radius: 3px;
-}
-
-.container {
-  width: 800px;
-}
-
-h2 {
-  margin-bottom: 12px;
-}
-
-.breadcrumb {
-  margin-left: 20px;
-  margin-right: 20px;
-  margin-bottom: 14px;
-  padding-left: 20px;
-  padding-right: 20px;
-  width: 940px;
-  background-color: #FFFFFF;
-  background-image: None;
-  border: 0px;
-  border-top-left-radius: 3px;
-  border-top-right-radius: 3px;
-  border-bottom-left-radius: 3px;
-  border-bottom-right-radius: 3px;
-}
-
-
-select {
-  width: 310px;
-  padding: 4px;
-}
-
-h1 {
-  font-size: 22px;
-}
-h2 {
-  font-size: 18px;
-}
-h3 {
-  font-size: 16px;
-}
-h4 {
-  font-size: 14px;
-}
-h5 {
-  font-size: 13px;
-  line-height: 18px;
-  padding-bottom: 9px;
-  padding-top: 9px;
-}
-h6 {
-  font-size: 12px;
-}
-
-.btn {
-  padding-bottom: 4px;
-  padding-left: 8px;
-  padding-right: 8px;
-  padding-top: 4px;
-  text-align: center;
-}
-
-.btn.small {
-    font-size: 11px;
-    padding: 3px 0px;
-    width: 60px;
-}
-
-.breadcrumb .divider {
-  padding: 0 3px;
-  color: #bfbfbf;
-}
-
-textarea {
-  font-family: Courier, "Courier New", monospace;
-}
-
- /* IE doesn't like the footer tag*/
-.footer {
-  padding-top: 17px;
-  border-top: 1px solid #eee;
-  margin-top: 50px;
-}
-
- /* dataTables stuff */
-
-.dataTables_wrapper {
-  min-height: 50px;
-  margin-bottom: 50px;
-}
-
-.dataTables_filter {
-  margin-bottom: 20px;
-}
-
-/* Background temporarily disabled */
-
-.sorting_asc, .sorting_desc, .sorting {
-  background: None;
-}
-
- /* KOFA stuff */
-
-div.actionbar {
-  margin-top: -24px;
-  margin-left: -15px;
-  margin-bottom: 6px;
-}
-
-a.actionbar {
-  margin-bottom: 6px;
-}
-
-.error {
-  color: red;
-}
-
-.form-table {
-  width: 100%;
-}
-
-.input-table {
-  width: 50%;
-}
-
-.form-table td, .input-table td {
-  padding: 5px 0px 5px 4px;
-  border-top: none;
-}
-
-input, textarea, select, .uneditable-input {
-  width: 250px;
-}
-
-.fieldname {
-  width: 25%;
-}
-
-.workflow {
-  border:1px solid #1fdf00;
-  background-color:#bbffb6;
-  font-family: courier;
-  font-size: 100%;
-  padding: 4px;
-  margin-bottom: 8px;
-  line-height: 16px;
-}
-
-.student-info-bar{
-  padding: 7px 14px;
-  margin-left: -20px;
-  margin-right: -20px;
-  margin-bottom: 14px;
-  padding-left: 20px;
-  padding-right: 20px;
-  width: 800px;
-  background-color: #FFFFFF;
-  background-image: None;
-  border: 0px;
-  border-top-left-radius: 3px;
-  border-top-right-radius: 3px;
-  border-bottom-left-radius: 3px;
-  border-bottom-right-radius: 3px;
-}
-
-.student-info-bar li {
-  display: inline;
-  text-shadow: 0 1px 0 #ffffff;
-}
-.student-info-bar .divider {
-  padding: 0 0px;
-  color: #bfbfbf;
-}
-.student-info-bar .active a {
-  color: #404040;
-}
-.wfstatus {
-  float: right;
-  line-height: 18px;
-}
-
-.language {
-  color: #BFBFBF;
-  position:relative;
-  top:10px;
-  right:-60px;
-}
-
-.language a {
-  color: #BFBFBF;
-}
-
-.language a:hover {
-  color: #ffffff;
-}
-
-.hint {
-  padding: 0px 0px 5px 0px;
-  color: #bfbfbf;
-}
-
-.separator {
-  font-size: 16px;
-  color: #404040;
-  font-weight: bold;
-  line-height: 36px;
-}
-
-table .ordered-selection-field select {
-  width: 250px;
-}
-
-.alert-message.error ul {
-    margin: 0 0 0px 25px
-}
-
-.alert-message.error, .alert-message.error error, .alert-message.error li {
-    color: white;
-}
-
-#alert-error .error{
-    color: white;
-}
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/warning.js
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/warning.js	(revision 11253)
+++ 	(revision )
@@ -1,7 +1,0 @@
-function confirmPost(question) {
-    var agree=confirm(question);
-    if (agree)
-    return true ;
-    else
-    return false ;
-};
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/actionbutton.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/actionbutton.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/actionbutton.pt	(revision 11254)
@@ -1,3 +1,3 @@
-<a class="btn actionbar" tal:condition="viewlet/target_url"
+<a class="btn btn-default" tal:condition="viewlet/target_url"
    tal:attributes="href viewlet/target_url; onclick viewlet/onclick">
   <img src="" alt="edit"
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/breadcrumbs.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/breadcrumbs.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/breadcrumbs.pt	(revision 11254)
@@ -1,8 +1,5 @@
-<span tal:repeat="item viewlet/getEntries">
-  <li>
-    <a href="#" tal:attributes="href item/url">
-      <span tal:content="item/title">Entry</span>
-    </a>
-    <span tal:condition="not: repeat/item/end" class="divider">/</span>
-  </li>
-</span>
+<li tal:repeat="item viewlet/getEntries">
+  <a href="#" tal:attributes="href item/url">
+    <span tal:replace="item/title">Entry</span>
+  </a>
+</li>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/certificatemanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/certificatemanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/certificatemanagepage.pt	(revision 11254)
@@ -2,31 +2,35 @@
       enctype="multipart/form-data" i18n:domain="waeup.kofa">
 
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1"><a href="#tab-1" i18n:translate="">Settings</a></li>
-    <li tal:attributes="class view/tab2"><a href="#tab-2" i18n:translate="">Certificate Courses</a></li>
-    <li tal:attributes="class view/tab3"><a href="#tab-3" i18n:translate="">Local Roles</a></li>
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+      <a href="#tab1" data-toggle="tab" i18n:translate="">Settings</a>
+    </li>
+    <li>
+      <a href="#tab2" data-toggle="tab"
+         i18n:translate="">Certificate Courses</a>
+    </li>
+    <li>
+      <a href="#tab3" data-toggle="tab" i18n:translate="">Local Roles</a>
+    </li>
   </ul>
 
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
-    <table class="form-table">
-      <tbody>
-        <tal:widgets content="structure provider:widgets" />
-      </tbody>
-    </table>
-    <div tal:condition="view/availableActions">
-      <span tal:repeat="action view/actions"
-            tal:omit-tag="">
-        <input tal:condition="python:action.label in view.taboneactions"
-               tal:replace="structure action/render"/>
-      </span>
+    <div id="tab1" class="active tab-pane">
+      <table class="form-table">
+        <tbody>
+          <tal:widgets content="structure provider:widgets" />
+        </tbody>
+      </table>
+      <div tal:condition="view/availableActions">
+        <span tal:repeat="action view/actions"
+              tal:omit-tag="">
+          <input tal:condition="python:action.label in view.taboneactions"
+                 tal:replace="structure action/render"/>
+        </span>
+      </div>
     </div>
-    </div>
-    <div id="tab-2" tal:attributes="class view/tab2">
-      <h3>
-        <span tal:content="context/__name__">Code</span>
-        <span i18n:domain="waeup.kofa" i18n:translate="">Courses</span>
-      </h3>
-      <table class="display dataTableManage">
+    <div id="tab2" class="tab-pane">
+      <br />
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -41,12 +45,12 @@
         </thead>
         <tbody>
-          <tr tal:repeat="cc context/values" class="gradeC">
-             <td>
+          <tr tal:repeat="cc context/values">
+            <td>
               <input type="checkbox" name="val_id"
-        		 tal:attributes="value cc/__name__" />
+                     tal:attributes="value cc/__name__" />
             </td>
-             <td>
+            <td>
               <span tal:content="cc/level">
-        	   LEVEL
+                LEVEL
               </span>
             </td>
@@ -54,5 +58,5 @@
             <td>
               <a tal:attributes="href python: view.url(cc)"
-        	     tal:content="cc/__name__">
+                 tal:content="cc/__name__">
             	REFERRER CODE
               </a>
@@ -60,5 +64,5 @@
             <td>
               <a tal:attributes="href python:view.url(cc.course)"
-        	     tal:content="cc/course/code">
+                 tal:content="cc/course/code">
             	COURSE CODE
               </a>
@@ -66,10 +70,10 @@
             <td>
               <span tal:content="cc/course/title">
-        	   COURSE TITLE
+                COURSE TITLE
               </span>
             </td>
             <td>
               <span tal:content="cc/mandatory">
-        	   REQUIRED
+                REQUIRED
               </span>
             </td>
@@ -85,6 +89,7 @@
       </div>
     </div>
-    <div id="tab-3" tal:attributes="class view/tab3"> <br />
-      <table class="display dataTableManage">
+    <div id="tab3" class="tab-pane">
+      <br />
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -100,7 +105,7 @@
         </thead>
         <tbody>
-          <tr tal:repeat="entry view/getUsersWithLocalRoles" class="gradeC"> <td>
-              <input type="checkbox" name="role_id"
-                tal:attributes="value python: entry['user_name']+'|'+entry['local_role']" /> </td>
+          <tr tal:repeat="entry view/getUsersWithLocalRoles"> <td>
+            <input type="checkbox" name="role_id"
+                   tal:attributes="value python: entry['user_name']+'|'+entry['local_role']" /> </td>
             <td tal:content="entry/user_name"> USERNAME </td>
             <td tal:content="entry/user_title"> USERTITLE </td>
@@ -112,35 +117,37 @@
         <span tal:repeat="action view/actions" tal:omit-tag="">
           <input tal:condition="python:action.label in view.tabthreeactions1"
-            tal:replace="structure action/render"/>
+                 tal:replace="structure action/render"/>
         </span>
       </div><br /><br />
-      <table class="form-table">
-        <tr> <td>
-            <select id="user" name="user">
-              <option tal:repeat="user view/getUsers"
-                tal:attributes="value user/name">
-              <span tal:replace="user/val/title">USERTITLE
-              </span>
-              </option>
-            </select> </td> <td>
-            <select id="local_role" name="local_role">
-              <option tal:repeat="localrole view/getLocalRoles"
-                tal:attributes="value localrole/name">
-              <span tal:replace="localrole/title">LOCALROLETITLE
-              </span>
-              </option>
-            </select> </td> <td>
-            <div tal:condition="view/availableActions">
-              <span tal:repeat="action view/actions" tal:omit-tag="">
-                <input tal:condition="python:action.label in view.tabthreeactions2"
-                  tal:replace="structure action/render"/>
-              </span>
-            </div> </td>
-        </tr>
-      </table>
+      <div class="form-inline">
+        <br />
+        <div class="form-group">
+          <select id="user" name="user" class="form-control">
+            <option tal:repeat="user view/getUsers"
+                    tal:attributes="value user/name">
+            <span tal:replace="user/val/title">USERTITLE
+            </span>
+            </option>
+          </select>
+        </div>
+        <div class="form-group">
+          <select id="local_role" name="local_role" class="form-control">
+            <option tal:repeat="localrole view/getLocalRoles"
+                    tal:attributes="value localrole/name">
+            <span tal:replace="localrole/title">LOCALROLETITLE
+            </span>
+            </option>
+          </select>
+        </div>
+        <div class="form-group">
+          <div tal:condition="view/availableActions">
+            <span tal:repeat="action view/actions" tal:omit-tag="">
+              <input tal:condition="python:action.label in view.tabthreeactions2"
+                     tal:replace="structure action/render"/>
+            </span>
+          </div>
+        </div>
+      </div>
     </div>
   </div>
 </form>
-
-
-
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/certificatepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/certificatepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/certificatepage.pt	(revision 11254)
@@ -23,5 +23,5 @@
 </h3>
 <br />
-<table i18n:domain="waeup.kofa" class="display dataTable">
+<table i18n:domain="waeup.kofa" class="kofa-data-table dataTable">
 <thead>
   <tr>
@@ -35,5 +35,5 @@
 </thead>
 <tbody>
-  <tr tal:repeat="cc context/values" class="gradeC">
+  <tr tal:repeat="cc context/values">
      <td>
       <span tal:content="cc/level">
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/configurationmanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/configurationmanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/configurationmanagepage.pt	(revision 11254)
@@ -1,14 +1,16 @@
 <form action="." tal:attributes="action request/URL" method="POST"
-  enctype="multipart/form-data" i18n:domain="waeup.kofa">
-    <ul class="tabs" data-tabs="tabs">
-      <li tal:attributes="class view/tab1">
-      <a href="#tab-1" i18n:translate="">Site Settings</a>
-      </li>
-      <li tal:attributes="class view/tab2">
-      <a href="#tab-2" i18n:translate="">Session Configurations</a>
-      </li>
-    </ul>
-    <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+      enctype="multipart/form-data" i18n:domain="waeup.kofa">
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+      <a href="#tab1" data-toggle="tab"
+         i18n:translate="">Site Settings</a>
+    </li>
+    <li>
+      <a href="#tab2"  data-toggle="tab"
+         i18n:translate="">Session Configurations</a>
+    </li>
+  </ul>
+  <div class="tab-content">
+    <div id="tab1" class="active tab-pane">
       <table class="form-table">
         <tbody>
@@ -23,6 +25,7 @@
       </div>
     </div>
-    <div id="tab-2" tal:attributes="class view/tab2"> <br />
-      <table class="display dataTableManage">
+    <div id="tab2" class="tab-pane">
+      <br />
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -34,7 +37,10 @@
         </thead>
         <tbody>
-          <tr tal:repeat="entry view/getSessionConfigurations" class="gradeC"> <td>
-              <input type="checkbox" name="val_id" tal:attributes="value entry/name" /> </td> <td>
-              <a href="" tal:attributes="href entry/url" tal:content="entry/title">Name</a> </td>
+          <tr tal:repeat="entry view/getSessionConfigurations">
+            <td>
+            <input type="checkbox" name="val_id"
+                   tal:attributes="value entry/name" /> </td> <td>
+            <a href="" tal:attributes="href entry/url"
+               tal:content="entry/title">Name</a> </td>
           </tr>
         </tbody>
@@ -43,8 +49,8 @@
         <span tal:repeat="action view/actions" tal:omit-tag="">
           <input tal:condition="python:action.label in view.tabtwoactions"
-            tal:replace="structure action/render"/>
+                 tal:replace="structure action/render"/>
         </span>
       </div>
-    </div>
-  </div>
+    </div><!-- /tab2 -->
+  </div><!-- /tab-content -->
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/coursemanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/coursemanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/coursemanagepage.pt	(revision 11254)
@@ -2,26 +2,31 @@
       enctype="multipart/form-data" i18n:domain="waeup.kofa">
 
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1"><a href="#tab-1" i18n:translate="">Settings</a></li>
-    <li tal:attributes="class view/tab2"><a href="#tab-3" i18n:translate="">Local Roles</a></li>
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+      <a href="#tab1" data-toggle="tab" i18n:translate="">Settings</a>
+    </li>
+    <li>
+      <a href="#tab3" data-toggle="tab" i18n:translate="">Local Roles</a>
+    </li>
   </ul>
 
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
-    <table class="form-table">
-      <tbody>
-        <tal:widgets content="structure provider:widgets" />
-      </tbody>
-    </table>
-    <div tal:condition="view/availableActions">
-      <span tal:repeat="action view/actions"
-            tal:omit-tag="">
-        <input tal:condition="python:action.label in view.taboneactions"
-               tal:replace="structure action/render"/>
-      </span>
+    <div id="tab1" class="tab-pane active">
+      <table class="form-table">
+        <tbody>
+          <tal:widgets content="structure provider:widgets" />
+        </tbody>
+      </table>
+      <div tal:condition="view/availableActions">
+        <span tal:repeat="action view/actions"
+              tal:omit-tag="">
+          <input tal:condition="python:action.label in view.taboneactions"
+                 tal:replace="structure action/render"/>
+        </span>
+      </div>
     </div>
-    </div>
-    <div id="tab-3" tal:attributes="class view/tab2"> <br />
-      <table class="display dataTableManage">
+    <div id="tab3" class="tab-pane">
+      <br />
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -37,7 +42,7 @@
         </thead>
         <tbody>
-          <tr tal:repeat="entry view/getUsersWithLocalRoles" class="gradeC"> <td>
-              <input type="checkbox" name="role_id"
-                tal:attributes="value python: entry['user_name']+'|'+entry['local_role']" /> </td>
+          <tr tal:repeat="entry view/getUsersWithLocalRoles"> <td>
+            <input type="checkbox" name="role_id"
+                   tal:attributes="value python: entry['user_name']+'|'+entry['local_role']" /> </td>
             <td tal:content="entry/user_name"> USERNAME </td>
             <td tal:content="entry/user_title"> USERTITLE </td>
@@ -49,35 +54,37 @@
         <span tal:repeat="action view/actions" tal:omit-tag="">
           <input tal:condition="python:action.label in view.tabtwoactions1"
-            tal:replace="structure action/render"/>
+                 tal:replace="structure action/render"/>
         </span>
       </div><br /><br />
-      <table class="form-table">
-        <tr> <td>
-            <select id="user" name="user">
-              <option tal:repeat="user view/getUsers"
-                tal:attributes="value user/name">
-              <span tal:replace="user/val/title">USERTITLE
-              </span>
-              </option>
-            </select> </td> <td>
-            <select id="local_role" name="local_role">
-              <option tal:repeat="localrole view/getLocalRoles"
-                tal:attributes="value localrole/name">
-              <span tal:replace="localrole/title">LOCALROLETITLE
-              </span>
-              </option>
-            </select> </td> <td>
-            <div tal:condition="view/availableActions">
-              <span tal:repeat="action view/actions" tal:omit-tag="">
-                <input tal:condition="python:action.label in view.tabtwoactions2"
-                  tal:replace="structure action/render"/>
-              </span>
-            </div> </td>
-        </tr>
-      </table>
+      <div class="form-inline">
+        <br />
+        <div class="form-group">
+          <select id="user" name="user" class="form-control">
+            <option tal:repeat="user view/getUsers"
+                    tal:attributes="value user/name">
+            <span tal:replace="user/val/title">USERTITLE
+            </span>
+            </option>
+          </select>
+        </div>
+        <div class="form-group">
+          <select id="local_role" name="local_role" class="form-control">
+            <option tal:repeat="localrole view/getLocalRoles"
+                    tal:attributes="value localrole/name">
+            <span tal:replace="localrole/title">LOCALROLETITLE
+            </span>
+            </option>
+          </select>
+        </div>
+        <div class="form-group">
+          <div tal:condition="view/availableActions">
+                <span tal:repeat="action view/actions" tal:omit-tag="">
+                  <input tal:condition="python:action.label in view.tabtwoactions2"
+                         tal:replace="structure action/render"/>
+                </span>
+          </div>
+        </div>
+      </div>
     </div>
   </div>
 </form>
-
-
-
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterexportpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterexportpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterexportpage.pt	(revision 11254)
@@ -8,10 +8,10 @@
 <br />
 
-<form  method="POST">
+<form  method="POST" class="form-inline">
   <label for="exporter">
     Exporter (Data Type):
   </label>
-  <div class="input">
-    <select name="exporter">
+  <div class="form-group">
+    <select name="exporter" class="form-control half">
       <span tal:repeat="items view/getExporters" tal:omit-tag="">
         <option tal:define="name python: items[1]; title python: items[0]"
@@ -23,8 +23,11 @@
     </select>
   </div>
-  <br />
-  <div class="input">
-    <input i18n:translate="" type="submit" class="btn primary"
+  <div class="form-group">
+    <input i18n:translate="" type="submit" class="btn btn-primary"
       name="CREATE" tal:attributes="value view/export_button" />
+  </div>
+  <div class="form-group">
+  <input type="submit" name="CANCEL" class="btn btn-default"
+      tal:attributes="value view/cancel_button" />
   </div>
 </form>
@@ -39,5 +42,5 @@
 <br /><br />
 
-<table i18n:domain="waeup.kofa">
+<table i18n:domain="waeup.kofa" class="table table-condensed table-hover">
   <thead>
     <tr>
@@ -65,5 +68,5 @@
         <span tal:replace="job/creator">CREATOR</span>
       </td>
-      <td nowrap>
+      <td>
         <span tal:replace="job/start_time">DATETIME</span>
       </td>
@@ -72,18 +75,17 @@
       </td>
       <td nowrap>
-        <a href="" class="btn small" i18n:translate=""
+        <a href="" class="btn btn-default btn-xs" i18n:translate=""
            tal:condition="job/show_refresh_button">
-          <img tal:attributes="src static/actionicon_reload.png" />
+          <img src="/static/img/actionicon_reload.png" />
           Reload
         </a>
         <form method="POST">
-          <a href="" class="btn primary small"
+          <a href="" class="btn btn-primary btn-xs"
                  tal:attributes="href job/download_url"
                  tal:condition="job/show_download_button">
             Download</a>
-
           <input type="hidden" name="job_id"
                  tal:attributes="value job/job" />
-          <input type="submit" class="btn small"
+          <input type="submit" class="btn btn-default btn-xs"
                  name="DISCARD" value="Discard"
                  tal:condition="job/show_discard_button" />
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterfinishedpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterfinishedpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterfinishedpage.pt	(revision 11254)
@@ -4,5 +4,5 @@
   imports. The files contain the imported datasets.
 </p>
-<table i18n:domain="waeup.kofa" class="display dataTableFiles">
+<table i18n:domain="waeup.kofa" class="kofa-data-table dataTableFiles">
   <thead>
     <tr>
@@ -13,5 +13,5 @@
   </thead>
   <tbody>
-    <tr tal:repeat="file context/getFinishedFiles" class="gradeC">
+    <tr tal:repeat="file context/getFinishedFiles">
       <td><a tal:attributes="href python: 'download?filename=' + file.rel_path"
              tal:content="file/name">FILENAME</a></td>
@@ -21,2 +21,6 @@
   </tbody>
 </table>
+<form method="POST">
+  <input i18n:translate="" type="submit" class="btn btn-default" name="CANCEL"
+      tal:attributes="value view/cancel_button"/>
+</form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterimport1page.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterimport1page.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterimport1page.pt	(revision 11254)
@@ -8,5 +8,5 @@
 </p>
 <form i18n:domain="waeup.kofa" method="POST">
-  <table>
+  <table class="table">
     <thead>
       <th />
@@ -20,5 +20,5 @@
         <td>
           <button i18n:translate=""
-            type="submit" name="select" class="btn primary"
+            type="submit" name="select" class="btn btn-primary"
             tal:attributes="value file/name">Select</button>
         </td>
@@ -30,5 +30,5 @@
     </tbody>
   </table>
-  <input type="submit" name="cancel" class="btn"
+  <input type="submit" name="cancel" class="btn btn-default"
       tal:attributes="value view/cancel_button" />
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterimport2page.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterimport2page.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterimport2page.pt	(revision 11254)
@@ -9,25 +9,23 @@
     Please select a file-processor and a processing-mode from the selections below.
   </p>
-  <div>
-    <table tal:define="prev_table view/getPreviewTable;">
-      <thead>
-        <tr>
-          <th i18n:translate="">Header</th>
-          <th i18n:translate="">Sample Record 1</th>
-          <th i18n:translate="">Sample Record 2</th>
-          <th i18n:translate="">Sample Record 3</th>
-        </tr>
-      </thead>
-      <tbody>
-        <tr tal:repeat="row prev_table">
-          <td tal:repeat="value row"
-              tal:content="value"> value
-          </td>
-        </tr>
-      </tbody>
-    </table>
-  </div>
+  <table tal:define="prev_table view/getPreviewTable;" class="table table-condensed">
+    <thead>
+      <tr>
+        <th i18n:translate="">Header</th>
+        <th i18n:translate="">Sample Record 1</th>
+        <th i18n:translate="">Sample Record 2</th>
+        <th i18n:translate="">Sample Record 3</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr tal:repeat="row prev_table">
+        <td tal:repeat="value row"
+            tal:content="value"> value
+        </td>
+      </tr>
+    </tbody>
+  </table>
   <div> <b i18n:translate="">Processor:</b>
-    <select name="importer">
+    <select name="importer" class="form-control">
       <option tal:repeat="importer view/getImporters"
           tal:attributes="value importer/name;
@@ -55,7 +53,7 @@
     </p>
   </div>
-  <input class="btn" type="submit" name="cancel" tal:attributes="value view/cancel_button" />
-  <input class="btn danger" type="submit" name="back1" tal:attributes="value view/back_button" />
-  <input class="btn primary"
+  <input class="btn btn-default" type="submit" name="cancel" tal:attributes="value view/cancel_button" />
+  <input class="btn btn-danger" type="submit" name="back1" tal:attributes="value view/back_button" />
+  <input class="btn btn-primary"
     tal:attributes="disabled python: view.getWarnings() and 'disabled' or ''; value view/proceed_button"
     type="submit" name="proceed" />
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterimport3page.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterimport3page.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterimport3page.pt	(revision 11254)
@@ -1,4 +1,4 @@
 <div i18n:domain="waeup.kofa" i18n:translate=""
-  class="alert-message success" tal:condition="not: view/getWarnings">
+  class="alert alert-success" tal:condition="not: view/getWarnings">
   Header fields OK
 </div>
@@ -29,8 +29,7 @@
 
   <div>
-
-
     <table tal:define="prev_table view/getPreviewTable;
-                       headers view/headerfields;">
+                       headers view/headerfields;"
+            class="table">
       <thead>
         <tr>
@@ -45,5 +44,5 @@
           </td>
           <td>
-            <select class="span4" name="headerfield">
+            <select name="headerfield" class="form-control">
               <option tal:repeat="opt view/getPossibleHeaders"
                 tal:attributes="value opt/value;
@@ -62,14 +61,14 @@
   </div>
 
-  <input class="btn" type="submit" name="cancel"
+  <input class="btn btn-default" type="submit" name="cancel"
     tal:attributes="value view/cancel_button" />
-  <input class="btn" type="reset" name="reset"
+  <input class="btn btn-default" type="reset" name="reset"
     tal:attributes="value view/reset_button" />
-  <input class="btn" type="submit" name="update"
+  <input class="btn btn-default" type="submit" name="update"
     tal:attributes="value view/update_button" />
   <br /><br />
-  <input class="btn danger" type="submit" name="back2"
+  <input class="btn btn-danger" type="submit" name="back2"
     tal:attributes="value view/back_button" />
-  <input class="btn primary"
+  <input class="btn btn-primary"
     tal:attributes="disabled python: view.getWarnings() and 'disabled' or ''; value view/proceed_button"
     type="submit" name="proceed"/>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterimport4page.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterimport4page.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterimport4page.pt	(revision 11254)
@@ -15,5 +15,5 @@
 </p>
 <form method="POST" i18n:domain="waeup.kofa">
-  <input class="btn primary" type="submit" name="finish"
+  <input class="btn btn-primary" type="submit" name="finish"
     tal:attributes="value view/back_button" />
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterlogspage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterlogspage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterlogspage.pt	(revision 11254)
@@ -3,5 +3,5 @@
   Currently no log files are available.
   </p>
-  <table tal:condition="files" class="table condensed-table">
+  <table tal:condition="files" class="table">
     <thead>
       <tr>
@@ -17,12 +17,11 @@
     </thead>
     <tbody>
-      <tr tal:repeat="file files"
-          tal:attributes="class python: repeat['file'].odd() and 'odd' or 'even'">
-        <td class="text-center">
+      <tr tal:repeat="file files">
+        <td>
           <form method="POST" action="@@show">
-            <input i18n:translate="" type="submit" class="btn primary"
-		   name="show" tal:attributes="value view/show_button" />
+            <input i18n:translate="" type="submit" class="btn btn-primary"
+                   name="show" tal:attributes="value view/show_button" />
             <input type="hidden" name="logname"
-		   tal:attributes="value file/name" />
+                   tal:attributes="value file/name" />
           </form></td>
         <td tal:content="file/name">file.name</td>
@@ -33,8 +32,5 @@
   </table>
   <form method="POST">
-    <button class="btn primary">
-      <span i18n:translate="">Reload page</span>
-    </button>
-    <input i18n:translate="" type="submit" class="btn" name="back"
+    <input i18n:translate="" type="submit" class="btn btn-default" name="back"
         tal:attributes="value view/back_button"/>
   </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterlogsshowfilepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterlogsshowfilepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterlogsshowfilepage.pt	(revision 11254)
@@ -1,8 +1,8 @@
 <form method="post" class="form-horizontal">
-  <input type="text" name="query"
+  <input type="text" name="query" class="form-control"
 	 tal:attributes="value view/query; placeholder view/placeholder" />
-  <input class="btn primary" type="submit" name="search"
+  <input class="btn btn-primary" type="submit" name="search"
 	 tal:attributes="value view/search_button" />
-  <input class="btn" type="submit" name="back"
+  <input class="btn btn-default" type="submit" name="back"
 	 tal:attributes="value view/back_button" />
   <input type="hidden" name="logname"
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacentermanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacentermanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacentermanagepage.pt	(revision 11254)
@@ -1,24 +1,30 @@
 <form  i18n:domain="waeup.kofa" method="POST">
-  <div>
-    <span  i18n:translate="">Storage path:</span>
-    <input type="text" name="newpath"
-     tal:attributes="value context/storage" />
-    <br /><br />
-    <span  i18n:translate="">
-    Copy existing data to new storage?
-    </span>&nbsp;&nbsp;
-    <input type="checkbox" name="move" checked="checked" />
-    <br /><br />
-    <span  i18n:translate="">
-    Overwrite contents in new location?
-    </span>&nbsp;&nbsp;
-    <input type="checkbox" name="overwrite" checked="no" />
-    <br /><br />
-    <input class="btn primary" type="submit" name="save"
-        tal:attributes="value view/save_button" />
-    <input class="btn" type="reset" name="reset"
-        tal:attributes="value view/reset_button" />
-    <input class="btn" type="submit" name="cancel"
-        tal:attributes="value view/cancel_button" />
+
+  <br />
+  <div class="form-group">
+    <label i18n:translate="">Storage path</label>
+        <input type="text" name="newpath" class="form-control"
+               tal:attributes="value context/storage" />
   </div>
+
+  <div class="checkbox">
+    <label>
+      <input type="checkbox" name="move"  checked="checked">
+      Copy existing data to new storage?
+    </label>
+  </div>
+
+  <div class="checkbox">
+    <label>
+      <input type="checkbox" name="overwrite">
+      Overwrite contents in new location?
+    </label>
+  </div>
+
+  <input class="btn btn-primary" type="submit" name="save"
+      tal:attributes="value view/save_button" />
+  <input class="btn btn-default" type="reset" name="reset"
+      tal:attributes="value view/reset_button" />
+  <input class="btn btn-default" type="submit" name="cancel"
+      tal:attributes="value view/cancel_button" />
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenterpage.pt	(revision 11254)
@@ -11,5 +11,5 @@
 <form action="." tal:attributes="action request/URL" method="post"
       i18n:domain="waeup.kofa" enctype="multipart/form-data">
-    <table i18n:domain="waeup.kofa" class="display dataTableManageFiles">
+    <table i18n:domain="waeup.kofa" class="kofa-data-table dataTableManageFiles">
       <thead>
         <tr>
@@ -21,5 +21,5 @@
       </thead>
       <tbody>
-        <tr tal:repeat="file context/getPendingFiles" class="gradeC">
+        <tr tal:repeat="file context/getPendingFiles">
           <td>
             <input type="checkbox" name="val_id"
@@ -33,8 +33,8 @@
       </tbody>
     </table>
-      <div tal:condition="view/availableActions">
-        <span tal:repeat="action view/actions" tal:omit-tag="">
-          <input tal:replace="structure action/render"/>
-        </span>
-      </div>
+    <div tal:condition="view/availableActions">
+      <span tal:repeat="action view/actions" tal:omit-tag="">
+        <input tal:replace="structure action/render"/>
+      </span>
+    </div>
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenteruploadpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenteruploadpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenteruploadpage.pt	(revision 11254)
@@ -24,5 +24,5 @@
       </td>
       <td>
-        <select name="importer">
+        <select name="importer" class="form-control half">
           <option tal:repeat="importer view/getImporters"
               tal:attributes="value importer/title"
@@ -37,5 +37,5 @@
       </td>
       <td>
-        <select name="import_mode">
+        <select name="import_mode" class="form-control half">
           <option value='Create'>Create</option>
           <option value='Update'>Update</option>
@@ -44,17 +44,12 @@
       </td>
     </tr>
-    <tr>
-      <td>
-        <input class="btn primary" type="submit" name="SUBMIT"
-            tal:attributes="value view/upload_button" />
-        <input class="btn" type="submit" name="CANCEL"
-            tal:attributes="value view/cancel_button"/>
-      </td>
-      <td>
-      </td>
-    </tr>
   </table>
+  <br />
+  <input class="btn btn-primary" type="submit" name="SUBMIT"
+      tal:attributes="value view/upload_button" />
+  <input class="btn btn-default" type="submit" name="CANCEL"
+      tal:attributes="value view/cancel_button"/>
 </form>
-
+<br />
 <p i18n:translate="">
     Import managers will be automatically informed by email after file upload.
@@ -67,5 +62,5 @@
 <h2 i18n:translate="">Available Processors (Importers)</h2>
 
-<table i18n:domain="waeup.kofa">
+<table i18n:domain="waeup.kofa" class="table table-condensed">
   <thead>
     <tr>
@@ -74,9 +69,14 @@
       <th i18n:translate="">Optional Schema Fields</th>
       <th i18n:translate="">Non-Schema Fields</th>
-      <th i18n:translate="">CSV Skeleton File</th>
     </tr>
   </thead>
   <tr tal:repeat="importer view/getImporters">
-    <td tal:content="importer/title"></td>
+    <td>
+      <span tal:content="importer/title">TITLE</span><br /><br />
+      <a i18n:translate="" class="btn btn-primary btn-xs"
+         tal:attributes="href python: 'skeleton?name=' + importer['name']">
+         Download CSV Skeleton File
+      </a>
+    </td>
     <td nowrap>
       <span tal:repeat="field importer/fields">
@@ -110,8 +110,4 @@
     </td>
 
-    <td>
-      <a i18n:translate=""
-         tal:attributes="href python: 'skeleton?name=' + importer['name']">Download</a>
-    </td>
   </tr>
 </table>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/departmentmanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/departmentmanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/departmentmanagepage.pt	(revision 11254)
@@ -1,22 +1,21 @@
 <form action="." tal:attributes="action request/URL" method="POST"
-  i18n:domain="waeup.kofa" enctype="multipart/form-data">
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1">
-    <a href="#tab-1">
-      <span i18n:translate="">Settings
-      </span></a>
+      i18n:domain="waeup.kofa" enctype="multipart/form-data">
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+      <a href="#tab1" data-toggle="tab">
+      <span i18n:translate="">Settings</span></a>
     </li>
-    <li tal:attributes="class view/tab2">
-    <a href="#tab-2" i18n:translate="">Courses</a>
+    <li>
+      <a href="#tab2"  data-toggle="tab" i18n:translate="">Courses</a>
     </li>
-    <li tal:attributes="class view/tab3">
-    <a href="#tab-3" i18n:translate="">Certificates</a>
+    <li>
+      <a href="#tab3"  data-toggle="tab" i18n:translate="">Certificates</a>
     </li>
-    <li tal:attributes="class view/tab4">
-    <a href="#tab-4" i18n:translate="">Local Roles</a>
+    <li>
+      <a href="#tab4"  data-toggle="tab" i18n:translate="">Local Roles</a>
     </li>
   </ul>
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+    <div id="tab1" class="active tab-pane">
       <table class="form-table">
         <tbody>
@@ -27,10 +26,11 @@
         <span tal:repeat="action view/actions" tal:omit-tag="">
           <input tal:condition="python:action.label in view.taboneactions"
-            tal:replace="structure action/render"/>
+                 tal:replace="structure action/render"/>
         </span>
       </div>
     </div>
-    <div id="tab-2" tal:attributes="class view/tab2"> <br />
-      <table class="display dataTableManage">
+    <div id="tab2" class="tab-pane">
+      <br />
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -44,9 +44,9 @@
         </thead>
         <tbody>
-          <tr tal:repeat="entry view/getCourses" class="gradeC"> <td>
-              <input type="checkbox" name="val_id"
-                tal:attributes="value entry/name" /> </td> <td>
-              <a href="" tal:attributes="href entry/url"
-                tal:content="entry/name">Name</a> </td>
+          <tr tal:repeat="entry view/getCourses"> <td>
+            <input type="checkbox" name="val_id"
+                   tal:attributes="value entry/name" /> </td> <td>
+            <a href="" tal:attributes="href entry/url"
+               tal:content="entry/name">Name</a> </td>
             <td tal:content="entry/container/title"> Title </td>
           </tr>
@@ -56,10 +56,11 @@
         <span tal:repeat="action view/actions" tal:omit-tag="">
           <input tal:condition="python:action.label in view.tabtwoactions"
-            tal:replace="structure action/render"/>
+                 tal:replace="structure action/render"/>
         </span>
       </div>
     </div>
-    <div id="tab-3" tal:attributes="class view/tab3"> <br />
-      <table class="display dataTableManage">
+    <div id="tab3" class="tab-pane">
+      <br />
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -73,9 +74,9 @@
         </thead>
         <tbody>
-          <tr tal:repeat="entry view/getCertificates" class="gradeC"> <td>
-              <input type="checkbox" name="val_id"
-                tal:attributes="value entry/name" /> </td> <td>
-              <a href="" tal:attributes="href entry/url"
-                tal:content="entry/name">Name</a> </td>
+          <tr tal:repeat="entry view/getCertificates"> <td>
+            <input type="checkbox" name="val_id"
+                   tal:attributes="value entry/name" /> </td> <td>
+            <a href="" tal:attributes="href entry/url"
+               tal:content="entry/name">Name</a> </td>
             <td tal:content="entry/container/title"> Title  </td>
           </tr>
@@ -85,10 +86,10 @@
         <span tal:repeat="action view/actions" tal:omit-tag="">
           <input tal:condition="python:action.label in view.tabthreeactions"
-            tal:replace="structure action/render"/>
+                 tal:replace="structure action/render"/>
         </span>
       </div>
     </div>
-    <div id="tab-4" tal:attributes="class view/tab4"> <br />
-      <table class="display dataTableManage">
+    <div id="tab4" class="tab-pane"> <br />
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -104,7 +105,7 @@
         </thead>
         <tbody>
-          <tr tal:repeat="entry view/getUsersWithLocalRoles" class="gradeC">
+          <tr tal:repeat="entry view/getUsersWithLocalRoles">
             <td> <input type="checkbox" name="role_id"
-                tal:attributes="value python: entry['user_name']+'|'+entry['local_role']" /> </td>
+            tal:attributes="value python: entry['user_name']+'|'+entry['local_role']" /> </td>
             <td tal:content="entry/user_name"> USERNAME </td>
             <td tal:content="entry/user_title"> USERTITLE </td>
@@ -116,30 +117,36 @@
         <span tal:repeat="action view/actions" tal:omit-tag="">
           <input tal:condition="python:action.label in view.tabfouractions1"
-            tal:replace="structure action/render"/>
+                 tal:replace="structure action/render"/>
         </span>
       </div> <br /><br />
-      <table class="form-table">
-        <tr> <td>
-            <select id="user" name="user">
-              <option tal:attributes="value user/name" tal:repeat="user view/getUsers">
-              <span tal:replace="user/val/title">USERTITLE
-              </span>
-              </option>
-            </select> </td> <td>
-            <select id="local_role" name="local_role">
-              <option tal:attributes="value localrole/name"
-                tal:repeat="localrole view/getLocalRoles">
-              <span tal:replace="localrole/title">LOCALROLETITLE
-              </span>
-              </option>
-            </select> </td> <td>
-            <div tal:condition="view/availableActions">
-              <span tal:repeat="action view/actions" tal:omit-tag="">
-                <input tal:condition="python:action.label in view.tabfouractions2"
-                  tal:replace="structure action/render"/>
-              </span>
-            </div> </td>
-        </tr>
-      </table>
+      <div class="form-inline">
+        <br />
+        <div class="form-group">
+          <select class="form-control" id="user" name="user">
+            <option tal:repeat="user view/getUsers"
+                    tal:attributes="value user/name">
+            <span tal:replace="user/val/title">USERTITLE
+            </span>
+            </option>
+          </select>
+        </div>
+        <div class="form-group">
+          <select class="form-control" id="local_role" name="local_role">
+            <option tal:repeat="localrole view/getLocalRoles"
+                    tal:attributes="value localrole/name">
+            <span tal:replace="localrole/title">LOCALROLETITLE
+            </span>
+            </option>
+          </select>
+        </div>
+        <div class="form-group">
+          <div tal:condition="view/availableActions">
+            <span tal:repeat="action view/actions" tal:omit-tag="">
+              <input tal:condition="python:action.label in view.tabfouractions2"
+                     tal:replace="structure action/render"/>
+            </span>
+          </div>
+        </div>
+      </div>
     </div>
   </div>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/departmentpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/departmentpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/departmentpage.pt	(revision 11254)
@@ -1,14 +1,14 @@
-<ul i18n:domain="waeup.kofa" class="tabs" data-tabs="tabs">
-  <li class="active"><a href="#tab-1">
-   <span i18n:translate="">Courses</span></a>
+<ul i18n:domain="waeup.kofa" class="tabs nav nav-tabs" data-tabs="tabs">
+  <li class="active"><a href="#tab1" data-toggle="tab">
+    <span i18n:translate="">Courses</span></a>
   </li>
-  <li><a href="#tab-2">
+  <li><a href="#tab2" data-toggle="tab">
     <span i18n:translate="">Certificates</span></a>
   </li>
 </ul>
-<div  i18n:domain="waeup.kofa" class="tab-content">
-    <div id="tab-1" class="active">
+<div i18n:domain="waeup.kofa" class="tab-content">
+  <div id="tab1" class="active tab-pane">
     <br />
-    <table class="display dataTable">
+    <table class="kofa-data-table dataTable">
       <thead>
         <tr>
@@ -18,20 +18,20 @@
       </thead>
       <tbody>
-        <tr tal:repeat="entry view/getCourses" class="gradeC">
+        <tr tal:repeat="entry view/getCourses">
           <td>
-        	<a href=""
-        	   tal:attributes="href entry/url"
-        	   tal:content="entry/name">Name</a>
+            <a href=""
+               tal:attributes="href entry/url"
+               tal:content="entry/name">Name</a>
           </td>
           <td tal:content="entry/container/title">
-    	       Title
+            Title
           </td>
         </tr>
       </tbody>
     </table>
-    </div>
-    <div id="tab-2">
+  </div>
+  <div id="tab2" class="tab-pane">
     <br />
-    <table class="display dataTable">
+    <table class="kofa-data-table dataTable">
       <thead>
         <tr>
@@ -41,16 +41,16 @@
       </thead>
       <tbody>
-        <tr tal:repeat="entry view/getCertificates" class="gradeC">
+        <tr tal:repeat="entry view/getCertificates">
           <td>
-        	<a href=""
-        	   tal:attributes="href entry/url"
-        	   tal:content="entry/name">Name</a>
+            <a href=""
+               tal:attributes="href entry/url"
+               tal:content="entry/name">Name</a>
           </td>
           <td tal:content="entry/container/title">
-    	       Title
+            Title
           </td>
         </tr>
       </tbody>
     </table>
-    </div>
+  </div>
 </div>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/facultiescontainermanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/facultiescontainermanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/facultiescontainermanagepage.pt	(revision 11254)
@@ -2,5 +2,5 @@
       enctype="multipart/form-data">
 
-  <table>
+  <table class="table table-hover">
     <thead>
       <tr>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/facultymanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/facultymanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/facultymanagepage.pt	(revision 11254)
@@ -1,17 +1,17 @@
 <form action="." tal:attributes="action request/URL"
   i18n:domain="waeup.kofa" method="POST" enctype="multipart/form-data">
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1">
-    <a href="#tab-1">
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+    <a href="#tab1" data-toggle="tab">
       <span i18n:translate="">Settings
       </span></a>
     </li>
-    <li tal:attributes="class view/tab2">
-    <a href="#tab-2">
+    <li>
+    <a href="#tab2" data-toggle="tab">
       <span tal:content="view/subunits">CONTENTS
       </span> </a>
     </li>
-    <li tal:attributes="class view/tab3">
-    <a href="#tab-3">
+    <li>
+    <a href="#tab3" data-toggle="tab">
       <span i18n:translate="">Local Roles
       </span></a>
@@ -19,5 +19,5 @@
   </ul>
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+    <div id="tab1" class="active tab-pane">
       <table class="form-table">
         <tbody>
@@ -32,7 +32,7 @@
       </div>
     </div>
-    <div id="tab-2" tal:attributes="class view/tab2">
+    <div id="tab2" class="tab-pane">
       <h3 tal:content="view/subunits">DEPARTMENTS</h3>
-      <table>
+      <table class="table table-hover">
         <thead>
           <tr>
@@ -63,6 +63,6 @@
       </div>
     </div>
-    <div id="tab-3" tal:attributes="class view/tab3"> <br />
-      <table class="display dataTableManage">
+    <div id="tab3" class="tab-pane"> <br />
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -78,5 +78,6 @@
         </thead>
         <tbody>
-          <tr tal:repeat="entry view/getUsersWithLocalRoles" class="gradeC"> <td>
+          <tr tal:repeat="entry view/getUsersWithLocalRoles">
+            <td>
               <input type="checkbox" name="role_id"
               tal:attributes="value python: entry['user_name']+'|'+entry['local_role']" /> </td>
@@ -93,27 +94,32 @@
         </span>
       </div><br /><br />
-      <table class="form-table">
-        <tr> <td>
-            <select id="user" name="user">
-              <option tal:repeat="user view/getUsers" tal:attributes="value user/name">
-              <span tal:replace="user/val/title">USERTITLE
-              </span>
-              </option>
-            </select> </td> <td>
-            <select id="local_role" name="local_role">
-              <option tal:repeat="localrole view/getLocalRoles"
-                      tal:attributes="value localrole/name">
-              <span tal:replace="localrole/title">LOCALROLETITLE
-              </span>
-              </option>
-            </select> </td> <td>
-            <div tal:condition="view/availableActions">
-              <span tal:repeat="action view/actions" tal:omit-tag="">
-                <input tal:condition="python:action.label in view.tabthreeactions2"
-                       tal:replace="structure action/render"/>
-              </span>
-            </div> </td>
-        </tr>
-      </table>
+      <div class="form-inline">
+        <br />
+        <div class="form-group">
+          <select id="user" name="user" class="form-control">
+            <option tal:repeat="user view/getUsers"
+                    tal:attributes="value user/name">
+            <span tal:replace="user/val/title">USERTITLE
+            </span>
+            </option>
+          </select>
+        </div>
+        <div class="form-group">
+          <select id="local_role" name="local_role" class="form-control">
+            <option tal:repeat="localrole view/getLocalRoles"
+                    tal:attributes="value localrole/name">
+            <span tal:replace="localrole/title">LOCALROLETITLE
+            </span>
+            </option>
+          </select>
+        </div>
+        <div class="form-group" tal:condition="view/availableActions">
+          <span tal:repeat="action view/actions" tal:omit-tag="">
+            <input tal:condition="python:action.label in view.tabthreeactions2"
+                   tal:replace="structure action/render"/>
+          </span>
+        </div>
+      </div>
+
     </div>
   </div>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/facultypage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/facultypage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/facultypage.pt	(revision 11254)
@@ -3,5 +3,5 @@
 </div>
 
-<table i18n:domain="waeup.kofa">
+<table class="table table-hover" i18n:domain="waeup.kofa">
   <thead>
     <tr>
@@ -12,5 +12,5 @@
   <tbody>
     <tr tal:repeat="value context/values">
-      <td> <a tal:attributes="href value/__name__">
+      <td> <a tal:attributes="href python: view.url(value)">
           <span tal:content="value/code">Name</span></a></td>
       <td tal:content="value/longtitle">Title</td>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/filedisplay.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/filedisplay.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/filedisplay.pt	(revision 11254)
@@ -4,5 +4,5 @@
   </td>
   <td>
-    <a tal:attributes="href viewlet/download_name"
+    <a tal:attributes="href python: view.url(context, viewlet.download_name)"
        tal:content="viewlet/download_name"
        target="image">
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/fileupload.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/fileupload.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/fileupload.pt	(revision 11254)
@@ -5,5 +5,5 @@
   <td>
     <tal:file tal:condition="viewlet/file_exists">
-      <a tal:attributes="href viewlet/download_name"
+      <a tal:attributes="href python: view.url(context, viewlet.download_name)"
          tal:content="viewlet/title"
          target="image">
@@ -11,17 +11,16 @@
       </a>
     </tal:file>
+    <input type="file" tal:attributes="name viewlet/input_name"/>
     <br />
-    <input type="file" tal:attributes="name viewlet/input_name"/>
-    <br /><br />
     <input type="submit" tal:condition="viewlet/file_exists"
            tal:attributes="id python:('delete_%s' % viewlet.input_name);
               name python:('delete_%s' % viewlet.input_name);
               value viewlet/delete_button"
-           class="btn error" />
+           class="btn btn-danger" />
     <input type="submit"
              tal:attributes="id python:('upload_%s' % viewlet.input_name);
                 name python:('upload_%s' % viewlet.input_name);
                 value viewlet/upload_button"
-             class="btn primary" />
+             class="btn btn-primary" />
     <span i18n:translate="">
       Max. file size:
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/findstudentspage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/findstudentspage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/findstudentspage.pt	(revision 11254)
@@ -1,50 +1,53 @@
-<form method="POST" i18n:domain="waeup.kofa">
+<form method="POST" i18n:domain="waeup.kofa" class="form-inline">
 <br />
-  <input class="btn primary" type="submit" name="search"
-    tal:attributes="value view/search_button" />
-
-  <select name="searchtype">
-    <option i18n:translate="" value="student_id">with id</option>
-    <option i18n:translate="" value="fullname">with name</option>
-    <option i18n:translate="" value="reg_number">with registration number</option>
-    <option i18n:translate="" value="matric_number">with matriculation number</option>
-  </select>
-
-  <input type="text" name="searchterm" />
-
-  <p>&nbsp;</p>
-  <div tal:condition="view/hitlist">
-    <h3 i18n:translate="">Search Results</h3>
-    <input type="hidden" name="old_searchterm"
-         tal:attributes="value view/searchterm" />
-    <input type="hidden" name="old_searchtype"
-         tal:attributes="value view/searchtype" />
-    <table class="display dataTable">
-      <thead>
-      <tr>
-        <th i18n:translate="">Student Id</th>
-        <th i18n:translate="">Reg. Number</th>
-        <th i18n:translate="">Matric. Number</th>
-        <th i18n:translate="">State</th>
-        <th i18n:translate="">Full Name</th>
-      </tr>
-      </thead>
-      <tbody>
-      <tr tal:repeat="item view/hitlist" class="gradeC">
-        <td> <a tal:attributes="href item/url">
-          <span tal:content="item/student_id">A123456</span></a>
-        </td>
-        <td class="center"> <a tal:attributes="href item/url">
-          <span tal:content="item/reg_number">9999999</span></a>
-        </td>
-        <td class="center"> <a tal:attributes="href item/url">
-          <span tal:content="item/matric_number">9999999</span></a>
-        </td>
-        <td tal:content="item/state">admitted</td>
-        <td tal:content="item/display_fullname">Bob</td>
-      </tr>
-      </tbody>
-    </table>
-    <br />
+  <div class="form-group">
+    <input class="btn btn-primary" type="submit" name="search"
+      tal:attributes="value view/search_button" />
+  </div>
+  <div class="form-group">
+    <select name="searchtype" class="form-control">
+      <option i18n:translate="" value="student_id">with id</option>
+      <option i18n:translate="" value="fullname">with name</option>
+      <option i18n:translate="" value="reg_number">with registration number</option>
+      <option i18n:translate="" value="matric_number">with matriculation number</option>
+    </select>
+  </div>
+  <div class="form-group">
+    <input type="text" class="form-control" name="searchterm" />
   </div>
 </form>
+
+<p>&nbsp;</p>
+<div tal:condition="view/hitlist">
+  <h3 i18n:translate="">Search Results</h3>
+  <input type="hidden" name="old_searchterm"
+       tal:attributes="value view/searchterm" />
+  <input type="hidden" name="old_searchtype"
+       tal:attributes="value view/searchtype" />
+  <table class="kofa-data-table dataTable">
+    <thead>
+    <tr>
+      <th i18n:translate="">Student Id</th>
+      <th i18n:translate="">Reg. Number</th>
+      <th i18n:translate="">Matric. Number</th>
+      <th i18n:translate="">State</th>
+      <th i18n:translate="">Full Name</th>
+    </tr>
+    </thead>
+    <tbody>
+    <tr tal:repeat="item view/hitlist">
+      <td> <a tal:attributes="href item/url">
+        <span tal:content="item/student_id">A123456</span></a>
+      </td>
+      <td class="center"> <a tal:attributes="href item/url">
+        <span tal:content="item/reg_number">9999999</span></a>
+      </td>
+      <td class="center"> <a tal:attributes="href item/url">
+        <span tal:content="item/matric_number">9999999</span></a>
+      </td>
+      <td tal:content="item/state">admitted</td>
+      <td tal:content="item/display_fullname">Bob</td>
+    </tr>
+    </tbody>
+  </table>
+</div>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/loginpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/loginpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/loginpage.pt	(revision 11254)
@@ -1,37 +1,21 @@
-<form i18n:domain="waeup.kofa" method="post">
-  <table id="login" class="form-table" summary="Table for entering login information">
-    <tbody>
-      <tr>
-        <td i18n:translate="" class="fieldname">
-          User Name or Id:
-        </td>
-        <td>
-          <input type="text" id="login" name="form.login" size="20" />
-        </td>
-      </tr>
-      <tr>
-        <td i18n:translate="" class="fieldname">
-          Password:
-        </td>
-        <td>
-          <input type="password" id="password" name="form.password"  size="20" value="" />
-          &nbsp;&nbsp;
-          </td>
-      </tr>
-      <tr>
-        <td>&nbsp;</td>
-        <td>
-          <font  i18n:translate="" color="red"> Notice: User names, Ids and passwords are case sensitive.</font>
-        </td>
-      </tr>
-    </tbody>
-  </table>
+<form i18n:domain="waeup.kofa" method="post" class="form-horizontal">
+  <br />
+  <div class="form-group">
+    <label i18n:translate="" class="col-sm-2 control-label">User Name or Id</label>
+    <div class="col-sm-10">
+      <input name="form.login" type="text" class="form-control" id="login">
+    </div>
+  </div>
+  <div class="form-group">
+    <label i18n:translate="" class="col-sm-2 control-label">Password</label>
+    <div class="col-sm-10">
+      <input name="form.password" type="password" class="form-control" id="password">
+      <font  i18n:translate="" color="red"> Notice: User names, Ids and passwords are case sensitive.</font>
+    </div>
+  </div>
   <input type="hidden" name="camefrom"   tal:attributes="value view/camefrom" />
-  <input class="btn primary" type="submit" name="SUBMIT"
+  <input class="btn btn-primary" type="submit" name="SUBMIT"
     tal:attributes="value view/login_button" />
-
-
   <br /><br /><br />
-
   <p  i18n:translate="login_trouble1">Don't forget to logout or exit your browser when you're done.
     If you are having trouble logging in, make sure to enable  cookies in your web browser.
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/reportscontainercreate.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/reportscontainercreate.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/reportscontainercreate.pt	(revision 11254)
@@ -8,25 +8,20 @@
   </p>
   <br />
-  <div class="clearfix">
-    <label for="generator">Report Type:</label>
-    <div class="input">
-      <select name="generator">
-        <span tal:repeat="items view/creators" tal:omit-tag="">
-          <option
-              tal:define="name python: items[1]; title python: items[0]"
-              tal:attributes="value name">
-            <span tal:replace="title">TITLE</span>
-          </option>
-        </span>
-      </select>
-      <div class="help-inline" i18n:translate="">
-        Type of report to create
-      </div>
-    </div>
+  <div class="form-group">
+    <label for="generator">Report Type</label>
+    <select name="generator" class="form-control half">
+      <span tal:repeat="items view/creators" tal:omit-tag="">
+        <option
+            tal:define="name python: items[1]; title python: items[0]"
+            tal:attributes="value name">
+          <span tal:replace="title">TITLE</span>
+        </option>
+      </span>
+    </select>
   </div>
-  <div class="input">
-    <input i18n:translate="" type="submit" class="btn primary"
+  <div class="form-group">
+    <input i18n:translate="" type="submit" class="btn btn-primary"
            name="START_GENERATOR" value="Configure" />
-    <a class="btn secondary" href=""
+    <a class="btn btn-default" href=""
        tal:attributes="href python:view.url(context)">Cancel</a>
   </div>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/reportscontainerpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/reportscontainerpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/reportscontainerpage.pt	(revision 11254)
@@ -1,3 +1,3 @@
-<table i18n:domain="waeup.kofa">
+<table i18n:domain="waeup.kofa" class="table">
   <thead>
     <tr>
@@ -31,13 +31,13 @@
           <input type="hidden" name="job_id"
                  tal:attributes="value python: entry[0]" />
-          <input type="submit" class="btn small primary"
+          <input type="submit" class="btn btn-sm btn-primary"
                  name="DOWNLOAD" value="Download"
                  tal:condition="python: entry[4]" />
-          <input type="submit" class="btn small secondary"
+          <input type="submit" class="btn btn-sm btn-default"
                  name="DISCARD" value="Discard"
                  tal:condition="python: entry[3]" />
-          <a href="" class="btn" i18n:translate=""
+          <a href="" class="btn btn-sm btn-default" i18n:translate=""
              tal:condition="python: entry[5]">
-            <img tal:attributes="src static/actionicon_reload.png" />
+            <img src="/static/img/actionicon_reload.png" />
             Reload
           </a>
@@ -48,8 +48,7 @@
 </table>
 <form method="POST" i18n:domain="waeup.kofa">
-  <div class="span12">
-    <a href="create" class="btn primary" i18n:translate="">
-      Create new report
-    </a>
-  </div>
+  <a tal:attributes="href python:view.url(context, 'create')"
+     class="btn btn-primary" i18n:translate="">
+    Create new report
+  </a>
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/searchpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/searchpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/searchpage.pt	(revision 11254)
@@ -1,12 +1,17 @@
-<form method="post">
-  <input type="text" name="query"
-	 tal:attributes="value view/query" />
-    <input class="btn primary" type="submit" name="SUBMIT"
+<form method="POST" class="form-inline">
+<br />
+  <div class="form-group">
+      <input type="text" name="query" class="form-control"
+    	 tal:attributes="value view/query" />
+  </div>
+  <div class="form-group">
+    <input class="btn btn-primary" type="submit" name="SUBMIT"
       tal:attributes="value view/search_button"/>
+  </div>
 </form>
 <br />
 <span  i18n:domain="waeup.kofa" tal:condition="view/hitlist">
     <h3 i18n:translate="">Search Results</h3>
-    <table class="display dataTable">
+    <table class="kofa-data-table dataTable">
         <thead>
             <tr>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/staffsitelayout.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/staffsitelayout.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/staffsitelayout.pt	(revision 11254)
@@ -2,7 +2,11 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" i18n:domain="waeup.kofa">
   <head>
+
+    <!-- Diazo element-->
     <title i18n:translate="">
       WAeUP.Kofa - Student Management System
-    </title>
+    </title>  
+    <!-- /Diazo element-->
+
     <!--base href="http://localhost:8080/app/@@page"
      tal:attributes="href python: view.url(layout.site)" / -->
@@ -14,121 +18,130 @@
             href python: view.url(layout.site, 'feed.rss')" />
   </head>
-  <body>
-    <div class="topbar" data-scrollspy="scrollspy" >
-      <div class="topbar-inner">
-        <div class="container-fluid">
-          <a class="brand" href="#"
-              tal:attributes="href python: view.url(layout.site)"
-              tal:content="layout/getAppAcronym">ACRONYM</a>
-          <ul class="nav kofa-navbar-left">
-            <tal:primary_nav content="structure provider:primary_nav" />
-          </ul>
-          <ul class="nav secondary-nav kofa-navbar-right">
-            <li tal:condition="not: layout/isAuthenticated">
-            <a href="#" i18n:translate=""
-                tal:attributes="href python: view.url(layout.site, 'login')">
-                Login
-            </a>
-            </li>
-            <li tal:condition="layout/isAuthenticated">
-            <a href="#" i18n:translate=""
-               tal:attributes="href python: view.url(layout.site, '@@contactadmin')">
-               Contact
-            </a>
-            </li>
-            <li tal:condition="layout/isAuthenticated">
-            <a href="#" i18n:translate=""
-               tal:attributes="href python: view.url(context, '@@logout')">
-               Logout
-            </a>
-            </li>
-          </ul>
-          <span class="language"
-                tal:define="langs provider:languages"
-                tal:condition="langs">
-            <tal:languages
-                  tal:content="structure langs" /> |
-          </span>
-        </div>
-      </div>
-    </div>
 
+  <!-- Diazo element-->
+  <body class="kofa-body">
+
+    <!-- Diazo element-->
+    <a class="kofa-brand-link" href="#"
+        tal:attributes="href python: view.url(layout.site)"
+        tal:content="layout/getAppAcronym">ACRONYM
+    </a>
+    <!-- /Diazo element-->
+
+    <!-- Diazo element-->
+    <ul class="nav kofa-navbar-left"> 
+      <tal:primary_nav content="structure provider:primary_nav" />
+    </ul>
+    <!-- /Diazo element-->
+
+    <!-- Diazo element-->
+    <ul class="nav secondary-nav kofa-navbar-right">
+      <li tal:condition="not: layout/isAuthenticated">
+      <a href="#" i18n:translate=""
+          tal:attributes="href python: view.url(layout.site, 'login')">
+          Login
+      </a>
+      </li>
+      <li tal:condition="layout/isAuthenticated">
+      <a href="#" i18n:translate=""
+         tal:attributes="href python: view.url(layout.site, '@@contactadmin')">
+         Contact
+      </a>
+      </li>
+      <li tal:condition="layout/isAuthenticated">
+      <a href="#" i18n:translate=""
+         tal:attributes="href python: view.url(context, '@@logout')">
+         Logout
+      </a>
+      </li>
+    </ul>
+    <!-- /Diazo element-->
+
+    <span tal:define="langs provider:languages"
+          tal:condition="langs"
+          class="language">
+      <tal:languages tal:content="structure langs" /> |
+    </span>
+
+    <!-- Diazo element-->
     <ul class="breadcrumb">
       <tal:breadcrumbs
             tal:condition="python: layout.isAuthenticated()"
             tal:content="structure provider:breadcrumbs" />
-      <span
-        tal:condition="layout/getStudentName" class="wfstatus">
-          <span i18n:translate="">Student Id:</span>
-          <span tal:replace="python:context.student.student_id">
-            ID
-          </span>&nbsp;&nbsp;
-          <span i18n:translate="">State:</span>
-          <span tal:replace="python:context.student.translated_state">
-            STATE
-          </span>
-      </span>
     </ul>
+    <!-- /Diazo element-->
 
-    <div class="container-fluid">
-      <div class="sidebar">
-        <div class="well">
-          <div tal:condition="layout/getStudentName">
-            <h5 tal:content="layout/getStudentName">STUDENTNAME</h5>
-            <ul>
-              <tal:left content="structure provider:left_studentmanage" />
-            </ul>
-          </div>
-          <div tal:condition="layout/isAuthenticated">
-            <h5 tal:content="layout/getUserTitle">USERNAME</h5>
-            <ul>
-              <tal:left content="structure provider:left_manage" />
-            </ul>
-          </div>
+    <!-- Diazo element-->
+    <span tal:condition="layout/getStudentName">
+      <div class="wfstatus">
+            <span tal:replace="python:context.student.student_id">
+              Id
+            </span>
+            &bull;
+            <span tal:replace="python:context.student.translated_state">
+              State
+            </span>
+      </div>
+    </span>
+    <!-- /Diazo element-->
+
+    <!-- Diazo element-->
+    <div class="sidebar well">
+        <div tal:condition="layout/getStudentName">
+          <div class="kofa-sidebar-title" tal:content="layout/getStudentName">STUDENTNAME</div>
+          <ul class="nav">
+            <tal:left content="structure provider:left_studentmanage" />
+          </ul>
+        </div>
+        <div tal:condition="layout/isAuthenticated">
+          <div class="kofa-sidebar-title" tal:content="layout/getUserTitle">USERNAME</div>
+          <ul class="nav">
+            <tal:left content="structure provider:left_manage" />
+          </ul>
+      </div>
+    </div>
+    <!-- /Diazo element-->
+
+    <!-- Diazo element-->
+    <div class="kofa-content">
+      <div class="actionbar" tal:condition="provider:actionbar">
+        <tal:actionbar content="structure provider:actionbar" />&nbsp;
+      </div>
+      <div
+          tal:define="message context/@@messages"
+          tal:condition="python: len(message)>11">
+        <div tal:content="structure message">
         </div>
       </div>
-      <div class="span13 content">
-        <div class="actionbar" tal:condition="provider:actionbar">
-          <tal:actionbar content="structure provider:actionbar" />&nbsp;
-        </div>
-        <div
-            tal:define="message context/@@messages"
-            tal:condition="python: len(message)>11">
-          <div tal:content="structure message">
-          </div>
-        </div>
-        <div class="alert-message error"
-          tal:define="status view/status|nothing"
-          tal:condition="status">
-          <span tal:content="view/status">
-            FORM STATUS SUMMARY
-          </span>:
-          <ul id="alert-error" tal:condition="view/errors">
-            <li tal:repeat="error view/error_views">
-               <span tal:replace="structure error">Error Type</span>
-            </li>
-          </ul>
-        </div>
-        <div class="pull-right">
-          <a i18n:translate="" href="#footer">Back to bottom</a>
-        </div>
-        <h1 class="kofa-content-label"
-            tal:condition="view/label|nothing"
-            tal:content="structure view/label">LABEL</h1>
-        <div tal:content="structure view/content"> THE CONTENT
-        </div>
-        <div id="footer" class="footer">
-          <div class="pull-right">
-            <a i18n:translate="" href="#">Back to top</a>
-          </div>
-          <div i18n:translate="">
-            Kofa - Student Management System
-          </div>
-          <div i18n:translate="">
-            Copyright &copy; WAeUP Group 2008-2014
-          </div>
-        </div>
+      <div class="alert alert-danger"
+        tal:define="status view/status|nothing"
+        tal:condition="status">
+        <span tal:content="view/status">
+          FORM STATUS SUMMARY
+        </span>:
+        <ul id="alert-error" tal:condition="view/errors">
+          <li tal:repeat="error view/error_views">
+             <span tal:replace="structure error">Error Type</span>
+          </li>
+        </ul>
       </div>
+      <div class="pull-right">
+        <a i18n:translate="" href="#bottom">Back to bottom</a>
+      </div>
+      <h1 class="kofa-content-label"
+          tal:condition="view/label|nothing"
+          tal:content="structure view/label">LABEL</h1>
+      <div tal:content="structure view/content"> THE CONTENT
+      </div>
+      <div id="bottom" class="pull-right">
+        <a i18n:translate="" href="#">Back to top</a>
+      </div>
+      <br />
+
     </div>
+    <!-- /Diazo element-->
+
   </body>
+  <!-- /Diazo element-->
+
 </html>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/studentsitelayout.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/studentsitelayout.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/studentsitelayout.pt	(revision 11254)
@@ -17,103 +17,112 @@
             href python: view.url(layout.site, 'feed.rss')" />
   </head>
-  <body>
-    <div class="topbar" data-scrollspy="scrollspy" >
-      <div class="topbar-inner">
-        <div  class="container">
-          <a class="brand" href="#"
-              tal:attributes="href python: view.url(layout.site)"
-              tal:content="layout/getAppAcronym">ACRONYM</a>
-          <ul class="nav kofa-navbar-left">
-              <tal:primary_nav content="structure provider:primary_nav" />
-              <tal:primary_nav content="structure provider:primary_nav_student" />
-          </ul>
-          <ul class="nav secondary-nav kofa-navbar-right">
-            <li tal:condition="not: layout/isAuthenticated">
-            <a href="#" i18n:translate=""
-               tal:attributes="href python: view.url(layout.site, 'login')">
-                Login
-            </a>
-            </li>
-            <li tal:condition="layout/isAuthenticated">
-            <a href="#" i18n:translate=""
-               tal:attributes="href python: view.url(layout.site, '@@contactadmin')">
-                Contact
-            </a>
-            </li>
-            <li tal:condition="layout/isAuthenticated">
-            <a href="#" i18n:translate=""
-               tal:attributes="href python: view.url(context, '@@logout')">
-               Logout
-            </a>
-            </li>
-          </ul>
-          <span class="language"
-                tal:define="langs provider:languages"
-                tal:condition="langs">
-            <tal:languages
-                  tal:content="structure langs" /> |
-          </span>
-        </div>
-      </div>
-    </div>
 
-    <div class="container">
-      <ul class="student-info-bar" tal:condition="layout/isAuthenticated">
-        <tal:breadcrumbs
-              tal:condition="python: layout.isAuthenticated()"
-              tal:content="structure provider:breadcrumbs" />
-        <span tal:condition="layout/getStudentName" class="wfstatus">
+  <!-- Diazo element-->
+  <body class="kofa-body">
+
+    <!-- Diazo element-->
+    <a class="kofa-brand-link" href="#"
+        tal:attributes="href python: view.url(layout.site)"
+        tal:content="layout/getAppAcronym">ACRONYM</a>
+    <!-- /Diazo element-->
+
+    <!-- Diazo element-->
+    <ul class="nav kofa-navbar-left">
+        <tal:primary_nav content="structure provider:primary_nav" />
+        <tal:primary_nav content="structure provider:primary_nav_student" />
+    </ul>
+    <!-- /Diazo element-->
+
+    <!-- Diazo element-->
+    <ul class="nav secondary-nav kofa-navbar-right">
+      <li tal:condition="not: layout/isAuthenticated">
+      <a href="#" i18n:translate=""
+         tal:attributes="href python: view.url(layout.site, 'login')">
+          Login
+      </a>
+      </li>
+      <li tal:condition="layout/isAuthenticated">
+      <a href="#" i18n:translate=""
+         tal:attributes="href python: view.url(layout.site, '@@contactadmin')">
+          Contact
+      </a>
+      </li>
+      <li tal:condition="layout/isAuthenticated">
+      <a href="#" i18n:translate=""
+         tal:attributes="href python: view.url(context, '@@logout')">
+         Logout
+      </a>
+      </li>
+    </ul>
+    <!-- Diazo element-->
+
+    <span tal:define="langs provider:languages"
+          tal:condition="langs"
+          class="language">
+      <tal:languages tal:content="structure langs" /> |
+    </span>
+
+    <!-- Diazo element-->
+    <ul class="breadcrumb" tal:condition="layout/isAuthenticated">
+      <tal:breadcrumbs
+            tal:condition="python: layout.isAuthenticated()"
+            tal:content="structure provider:breadcrumbs" />
+    </ul>
+    <!-- /Diazo element-->
+
+    <!-- Diazo element-->
+    <span tal:condition="layout/getStudentName">
+      <div class="wfstatus">
             <span tal:replace="python:context.student.student_id">
               Id
             </span>
-            |
+            &bull;
             <span tal:replace="python:context.student.translated_state">
               State
             </span>
-        </span>
-      </ul>
-      <div class="content">
-        <div class="actionbar" tal:condition="provider:actionbar">
-          <tal:actionbar content="structure provider:actionbar" />&nbsp;
-        </div>
-        <div tal:define="message context/@@messages"
-             tal:condition="python: len(message)>11">
-          <div tal:content="structure message">
-          </div>
-        </div>
-        <div class="alert-message error"
-          tal:define="status view/status|nothing"
-          tal:condition="status">
-          <span tal:content="view/status">
-            FORM STATUS SUMMARY
-          </span>:
-          <ul id="alert-error" tal:condition="view/errors">
-            <li tal:repeat="error view/error_views">
-               <span tal:replace="structure error">Error Type</span>
-            </li>
-          </ul>
-        </div>
-        <div class="pull-right">
-          <a i18n:translate="" href="#footer">Back to bottom</a>
-        </div>
-        <h1 class="kofa-content-label"
-            tal:condition="view/label|nothing"
-            tal:content="structure view/label">Label</h1>
-        <div tal:content="structure view/content">
-          THE CONTENT
-        </div>
-        <div id="footer" class="footer">
-          <div class="pull-right">
-            <a i18n:translate="" href="#">Back to top</a>
-          </div>
-          <div i18n:translate="">
-            Kofa - Student Management System
-          </div>
-          <div i18n:translate="">
-            Copyright &copy; WAeUP Group 2008-2014
-          </div>
+      </div>
+    </span>
+    <!-- /Diazo element-->
+
+    <!-- Diazo element-->
+    <div class="kofa-content">
+      <div class="actionbar" tal:condition="provider:actionbar">
+        <tal:actionbar content="structure provider:actionbar" />&nbsp;
+      </div>
+      <div tal:define="message context/@@messages"
+           tal:condition="python: len(message)>11">
+        <div tal:content="structure message">
         </div>
       </div>
+      <div class="alert alert-danger"
+        tal:define="status view/status|nothing"
+        tal:condition="status">
+        <span tal:content="view/status">
+          FORM STATUS SUMMARY
+        </span>:
+        <ul id="alert-error" tal:condition="view/errors">
+          <li tal:repeat="error view/error_views">
+             <span tal:replace="structure error">Error Type</span>
+          </li>
+        </ul>
+      </div>
+      <div class="pull-right">
+        <a i18n:translate="" href="#bottom">Back to bottom</a>
+      </div>
+      <h1 class="kofa-content-label"
+          tal:condition="view/label|nothing"
+          tal:content="structure view/label">Label</h1>
+      <div tal:content="structure view/content">
+        THE CONTENT
+      </div>
+      <div id="bottom" class="pull-right">
+        <a i18n:translate="" href="#">Back to top</a>
+      </div>
+      <br />
     </div>
+    <!-- /Diazo element-->
+
   </body>
+  <!-- /Diazo element-->
+
 </html>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/usereditformpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/usereditformpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/usereditformpage.pt	(revision 11254)
@@ -9,5 +9,5 @@
         <td i18n:translate="" class="fieldname">Password:</td>
         <td>
-          <input name="password" type="password"  />
+          <input class="form-control" name="password" type="password"  />
         </td>
       </tr>
@@ -15,5 +15,5 @@
         <td i18n:translate="" class="fieldname">Retype Password:</td>
         <td>
-          <input name="control_password" type="password" />
+          <input class="form-control" name="control_password" type="password" />
         </td>
       </tr>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/userscontainerpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/userscontainerpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/userscontainerpage.pt	(revision 11254)
@@ -1,6 +1,6 @@
-<table i18n:domain="waeup.kofa" class="display dataTable">
+<table i18n:domain="waeup.kofa" class="kofa-data-table dataTable">
   <thead>
     <tr>
-      <th i18n:translate="">User Id</th>
+      <th i18n:translate="">Id</th>
       <th i18n:translate="">Name</th>
       <th i18n:translate="">Portal Roles</th>
@@ -19,7 +19,7 @@
           <input type="hidden" name="userid"
            tal:attributes="value account/name"/>
-            <input class="btn" type="submit" name="manage"
+            <input class="btn btn-sm btn-primary" type="submit" name="manage"
               tal:attributes="value view/manage_button" />
-            <input class="btn" type="submit" name="delete"
+            <input class="btn btn-sm btn-default" type="submit" name="delete"
               tal:attributes="value view/delete_button" />
         </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/tests/test_browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/tests/test_browser.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/tests/test_browser.py	(revision 11254)
@@ -374,7 +374,4 @@
         self.browser.open(self.datacenter_path)
         self.browser.getLink("Upload data").click()
-        self.assertTrue(
-            '<a href="skeleton?name=facultyprocessor">Download</a>'
-            in self.browser.contents)
         self.browser.getLink(url='skeleton?name=facultyprocessor').click()
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/theming.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/theming.py	(revision 11253)
+++ 	(revision )
@@ -1,97 +1,0 @@
-## $Id$
-##
-## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 2 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, write to the Free Software
-## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-##
-"""
-Components to support themes.
-"""
-import grok
-from zope.component import getUtilitiesFor
-from zope.interface import Interface
-from zope.schema.interfaces import IVocabularyFactory
-from waeup.kofa.interfaces import SimpleKofaVocabulary
-from waeup.kofa.browser.interfaces import ITheme
-from waeup.kofa.browser.resources import (
-    waeuptheme_empty, waeup_base_css, favicon
-    )
-
-class KofaThemeBase(grok.GlobalUtility):
-    grok.implements(ITheme)
-    grok.name('base waeup theme')
-
-    description = u"Base Theme"
-
-    def getResources(self):
-        return [waeup_base_css, favicon]
-
-class KofaThemeEmpty(grok.GlobalUtility):
-    """A theme based on jQuery only.
-
-    XXX: crappy yet.
-    """
-    grok.implements(ITheme)
-    grok.name('empty theme')
-    description = u'Empty Theme'
-
-    def getResources(self):
-        return [waeuptheme_empty]
-
-def get_all_themes():
-    """Return all themes registered as `ITheme` somewhere.
-
-    Returns a list of ``(<NAME>, <THEME>)`` tuples where ``<NAME>`` is
-    the internal name under which a theme was registered and
-    ``<THEME>`` is the real theme implementing `ITheme`.
-    """
-    for name, theme in getUtilitiesFor(ITheme):
-        yield name, theme
-
-class ThemesVocabulary(grok.GlobalUtility):
-    """A vocabulary that provides all themes available.
-
-    A named global utility implementing
-
-      :class:`zope.schema.interfaces.IVocabularyFactory`
-
-    and registered under the name
-
-      'waeup.kofa.browser.theming.ThemesVocabulary'
-
-    Interface fields that wish to provide a list of available themes
-    can require a 'named vocabulary', i.e. set:
-
-      vocabulary = 'waeup.kofa.browser.theming.ThemesVocabulary'
-
-    and the vocabulary will deliver themes and their descriptive text
-    for instance in select boxes of forms.
-
-    The name is chosen so that the location of this vocabulary can be
-    found easily when used in an interface definition.
-    """
-    grok.implements(IVocabularyFactory)
-    grok.name('waeup.kofa.browser.theming.ThemesVocabulary')
-
-    def __call__(self, context):
-        """Deliver a vocabulary of available themes.
-
-        The `description`s of available themes are used as 'title' and
-        the utility names delivering the different themes as 'value'
-        and 'token'.
-        """
-        terms = [(theme.description, name)
-                 for name, theme in get_all_themes()]
-        vocab = SimpleKofaVocabulary(*terms)
-        return vocab
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/viewlets.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/viewlets.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/viewlets.py	(revision 11254)
@@ -124,20 +124,5 @@
         """Get the icon URL.
         """
-        static = self.view.static
-        if static is None or static.get(self.icon, None) is None:
-            # In derived classes defined in other modules/packages
-            # than w.k.browser, ``static`` might refer to a static dir
-            # local to the derived class' module. As we often like to
-            # get the icons from here
-            # (i.e. waeup.kofa.browser/static), we set the directory
-            # resource appropiately.
-            #
-            # XXX: The hardcoding of 'w.k.browser' should be replaced
-            #      by something smarter.
-            #
-            # TODO: notes in here should go to general documentation.
-            static = queryAdapter(
-                self.request, Interface, name='waeup.kofa.browser')
-        return static[self.icon]()
+        return '/static/img/%s' % self.icon
 
     @property
Index: main/waeup.kofa/trunk/src/waeup/kofa/frontpage.html
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/frontpage.html	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/frontpage.html	(revision 11254)
@@ -1,8 +1,8 @@
 <h1>Welcome to WAeUP.Kofa
 <br>
-<small>
+<p class="kofa-content-desc">
 the Information and Registration Portal
 for Schools, Colleges and Universities
-</small>
+</p>
 </h1>
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/hostels/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/hostels/browser.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/hostels/browser.py	(revision 11254)
@@ -26,5 +26,4 @@
     NullValidator)
 from waeup.kofa.browser.breadcrumbs import Breadcrumb
-from waeup.kofa.browser.resources import datepicker, datatable, tabs, warning
 from waeup.kofa.browser.layout import default_primary_nav_template
 from waeup.kofa.browser.pages import delSubobjects
@@ -134,15 +133,4 @@
         _('Clear all hostels'),
         _('Remove selected')]
-
-    def update(self):
-        tabs.need()
-        self.tab1 = self.tab2 = self.tab3 = self.tab4 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
-        warning.need()
-        datatable.need()
-        return super(HostelsContainerManagePage, self).update()
 
     # It's quite dangerous to remove entire hostels with its content (beds).
@@ -167,10 +155,10 @@
         return
 
-    @jsaction(_('Clear all hostels'))
+    @jsaction(_('Clear all hostels'), style='danger')
     def clearHostels(self, **data):
         self.context.clearAllHostels()
         self.flash(_('All hostels cleared.'))
         write_log_message(self, 'all hostels cleared')
-        self.redirect(self.url(self.context, '@@manage')+'?tab2')
+        self.redirect(self.url(self.context, '@@manage')+'#tab2')
         return
 
@@ -201,5 +189,5 @@
             self.context.addHostel(hostel)
         except KeyError:
-            self.flash(_('The hostel already exists.'))
+            self.flash(_('The hostel already exists.'), type='warning')
             return
         self.flash(_('Hostel created.'))
@@ -251,23 +239,10 @@
         return self.url(grok.getSite(),'students')
 
-    def update(self):
-        datepicker.need() # Enable jQuery datepicker in date fields.
-        tabs.need()
-        datatable.need()
-        warning.need()
-        self.tab1 = self.tab2 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
-        super(HostelManageFormPage, self).update()
-        return
-
-    @action(_('Save'))
+    @action(_('Save'), style='primary')
     def save(self, **data):
         msave(self, **data)
         return
 
-    @action(_('Update all beds'))
+    @action(_('Update all beds'), style='primary')
     def updateBeds(self, **data):
         removed, added, modified, modified_beds = self.context.updateBeds()
@@ -280,5 +255,5 @@
         self.flash(flash_message)
         write_log_message(self, message)
-        self.redirect(self.url(self.context, '@@manage')+'?tab2')
+        self.redirect(self.url(self.context, '@@manage')+'#tab2')
         return
 
@@ -289,6 +264,6 @@
             child_id = form['val_id']
         else:
-            self.flash(_('No item selected.'))
-            self.redirect(self.url(self.context, '@@manage')+'?tab2')
+            self.flash(_('No item selected.'), type='warning')
+            self.redirect(self.url(self.context, '@@manage')+'#tab2')
             return
         if not isinstance(child_id, list):
@@ -310,5 +285,5 @@
                 mapping = {'a':m_translated}))
             write_log_message(self, 'switched: %s' % message)
-            self.redirect(self.url(self.context, '@@manage')+'?tab2')
+            self.redirect(self.url(self.context, '@@manage')+'#tab2')
         return
 
@@ -319,6 +294,6 @@
             child_id = form['val_id']
         else:
-            self.flash(_('No item selected.'))
-            self.redirect(self.url(self.context, '@@manage')+'?tab2')
+            self.flash(_('No item selected.'), type='warning')
+            self.redirect(self.url(self.context, '@@manage')+'#tab2')
             return
         if not isinstance(child_id, list):
@@ -334,16 +309,16 @@
                 mapping = {'a':message}))
             write_log_message(self, 'released: %s' % message)
-            self.redirect(self.url(self.context, '@@manage')+'?tab2')
+            self.redirect(self.url(self.context, '@@manage')+'#tab2')
         else:
-            self.flash(_('No allocated bed selected.'))
-            self.redirect(self.url(self.context, '@@manage')+'?tab2')
-        return
-
-    @jsaction(_('Clear hostel'))
+            self.flash(_('No allocated bed selected.'), type='warning')
+            self.redirect(self.url(self.context, '@@manage')+'#tab2')
+        return
+
+    @jsaction(_('Clear hostel'), style='danger')
     def clearHostel(self, **data):
         self.context.clearHostel()
         self.flash(_('Hostel cleared.'))
         write_log_message(self, 'cleared')
-        self.redirect(self.url(self.context, '@@manage')+'?tab2')
+        self.redirect(self.url(self.context, '@@manage')+'#tab2')
         return
 
@@ -362,9 +337,9 @@
     def save(self, **data):
         if data['owner'] == NOT_OCCUPIED:
-            self.flash(_('No valid student id.'))
+            self.flash(_('No valid student id.'), type='warning')
             self.redirect(self.url(self.context))
             return
         msave(self, **data)
-        self.redirect(self.url(self.context.__parent__, '@@manage')+'?tab2')
+        self.redirect(self.url(self.context.__parent__, '@@manage')+'#tab2')
         return
 
@@ -374,4 +349,4 @@
             # Beds must be released first before they can be allocated to
             # other students.
-            self.redirect(self.url(self.context.__parent__, '@@manage')+'?tab2')
-        return
+            self.redirect(self.url(self.context.__parent__, '@@manage')+'#tab2')
+        return
Index: main/waeup.kofa/trunk/src/waeup/kofa/hostels/browser_templates/containermanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/hostels/browser_templates/containermanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/hostels/browser_templates/containermanagepage.pt	(revision 11254)
@@ -4,17 +4,20 @@
 
 
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1">
-    <a href="#tab-1">
-      <span i18n:translate="">Settings
-      </span></a>
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+      <a href="#tab1" data-toggle="tab" i18n:translate="">
+        Settings
+      </a>
     </li>
-    <li tal:attributes="class view/tab2">
-    <a href="#tab-2" i18n:translate="">Hostels</a>
+    <li>
+      <a href="#tab2" data-toggle="tab" i18n:translate="">
+        Hostels
+      </a>
     </li>
   </ul>
 
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+    <div id="tab1" class="active tab-pane">
+      <br />
       <table class="form-table">
         <tbody>
@@ -29,6 +32,7 @@
       </div>
     </div>
-    <div id="tab-2" tal:attributes="class view/tab2"> <br />
-      <table class="display dataTableManage">
+    <div id="tab2" class="tab-pane">
+      <br />
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
Index: main/waeup.kofa/trunk/src/waeup/kofa/hostels/browser_templates/containerpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/hostels/browser_templates/containerpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/hostels/browser_templates/containerpage.pt	(revision 11254)
@@ -16,5 +16,5 @@
 </table>
 
-<table i18n:domain="waeup.kofa">
+<table i18n:domain="waeup.kofa" class="table">
   <thead>
     <tr>
Index: main/waeup.kofa/trunk/src/waeup/kofa/hostels/browser_templates/hostelmanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/hostels/browser_templates/hostelmanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/hostels/browser_templates/hostelmanagepage.pt	(revision 11254)
@@ -2,15 +2,20 @@
       i18n:domain="waeup.kofa" enctype="multipart/form-data">
 
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1"><a href="#tab-1">
-      <span i18n:translate="">Hostel Data</span></a>
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+      <a href="#tab1" data-toggle="tab">
+        <span i18n:translate="">Hostel Data</span>
+      </a>
     </li>
-    <li tal:attributes="class view/tab2"><a href="#tab-2">
-      <span i18n:translate="">Beds</span></a>
+    <li>
+      <a href="#tab2" data-toggle="tab">
+        <span i18n:translate="">Beds</span>
+      </a>
     </li>
   </ul>
 
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+    <div id="tab1" class="active tab-pane">
+      <br />
       <table class="form-table">
       <tbody>
@@ -37,39 +42,39 @@
     </div>
 
-    <div id="tab-2" tal:attributes="class view/tab2">
-      <h3>Beds</h3>
-      <table class="display dataTableManage">
-      <thead>
-        <tr>
-          <th>&nbsp;</th>
-          <th i18n:translate="">Id</th>
-          <th i18n:translate="">Type</th>
-          <th i18n:translate="">Number</th>
-          <th i18n:translate="">Owner</th>
-        </tr>
-      </thead>
-      <tbody>
-        <tr tal:repeat="value context/values">
-           <td>
-            <input type="checkbox" name="val_id"
-      		  tal:attributes="value value/__name__" />
-          </td>
-          <td tal:content="value/bed_id">ID</td>
-          <td tal:content="value/bed_type">TYPE</td>
-          <td tal:content="value/bed_number">NUMBER</td>
-          <td>
-            <a tal:condition="python: value.owner != view.not_occupied"
-               tal:attributes="href python: '%s/%s/accommodation' %
-                    (view.students_url,value.owner)">
-              <span tal:content="value/owner">OWNER</span>
-            </a>
-            <a tal:condition="python: value.owner == view.not_occupied"
-               tal:attributes="href python: view.url(value)"
-               i18n:translate="">
-            [allocate student]
-            </a>
-          </td>
-        </tr>
-      </tbody>
+    <div id="tab2" class="tab-pane">
+      <br />
+      <table class="kofa-data-table dataTableManage">
+        <thead>
+          <tr>
+            <th>&nbsp;</th>
+            <th i18n:translate="">Id</th>
+            <th i18n:translate="">Type</th>
+            <th i18n:translate="">Number</th>
+            <th i18n:translate="">Owner</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr tal:repeat="value context/values">
+             <td>
+              <input type="checkbox" name="val_id"
+        		  tal:attributes="value value/__name__" />
+            </td>
+            <td tal:content="value/bed_id">ID</td>
+            <td tal:content="value/bed_type">TYPE</td>
+            <td tal:content="value/bed_number">NUMBER</td>
+            <td>
+              <a tal:condition="python: value.owner != view.not_occupied"
+                 tal:attributes="href python: '%s/%s/accommodation' %
+                      (view.students_url,value.owner)">
+                <span tal:content="value/owner">OWNER</span>
+              </a>
+              <a tal:condition="python: value.owner == view.not_occupied"
+                 tal:attributes="href python: view.url(value)"
+                 i18n:translate="">
+              [allocate student]
+              </a>
+            </td>
+          </tr>
+        </tbody>
       </table>
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/hostels/tests.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/hostels/tests.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/hostels/tests.py	(revision 11254)
@@ -368,5 +368,5 @@
         self.browser.open(self.container_path + '/hall-1/hall-1_A_101_A')
         self.assertEqual(self.browser.url,
-            self.container_path + '/hall-1/@@manage?tab2')
+            self.container_path + '/hall-1/@@manage#tab2')
         # Updating the beds again will not affect the allocation and also
         # the bed numbering remains the same
Index: main/waeup.kofa/trunk/src/waeup/kofa/interfaces.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/interfaces.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/interfaces.py	(revision 11254)
@@ -585,11 +585,4 @@
         )
 
-    skin = schema.Choice(
-        title = _(u'Skin'),
-        default = u'gray waeup theme',
-        vocabulary = 'waeup.kofa.browser.theming.ThemesVocabulary',
-        required = True,
-        )
-
     frontpage = schema.Text(
         title = _(u'Content in HTML format'),
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 11254)
@@ -39,6 +39,4 @@
 from waeup.kofa.browser.breadcrumbs import Breadcrumb
 from waeup.kofa.browser.pages import ContactAdminForm, ExportCSVView, doll_up
-from waeup.kofa.browser.resources import (
-    datepicker, datatable, tabs, warning, toggleall)
 from waeup.kofa.browser.layout import jsaction, action, UtilityView
 from waeup.kofa.browser.interfaces import ICaptchaManager
@@ -107,5 +105,5 @@
     """Flash a lock message.
     """
-    view.flash(_('The requested form is locked (read-only).'))
+    view.flash(_('The requested form is locked (read-only).'), type="warning")
     view.redirect(view.url(view.context))
     return
@@ -122,4 +120,5 @@
         value._p_activate()
         value_dict = dict([i for i in value.__dict__.items()])
+        value_dict['url'] = view.url(value)
         value_dict['removable_by_student'] = value.removable_by_student
         value_dict['mandatory'] = translate(str(value.mandatory), 'zope',
@@ -155,10 +154,10 @@
         view.flash(_(
             'Total credits exceed ${a}.',
-            mapping = {'a': max_credits}))
+            mapping = {'a': max_credits}), type="warning")
         return False
     try:
         view.context.addCourseTicket(ticket, course)
     except KeyError:
-        view.flash(_('The ticket exists.'))
+        view.flash(_('The ticket exists.'), type="warning")
         return False
     view.flash(_('Successfully added ${a}.',
@@ -258,10 +257,9 @@
     grok.require('waeup.viewStudentsContainer')
     grok.template('containerpage')
-    label = _('Student Section')
+    label = _('Find students')
     search_button = _('Find student(s)')
     pnav = 4
 
     def update(self, *args, **kw):
-        datatable.need()
         form = self.request.form
         self.hitlist = []
@@ -280,5 +278,5 @@
         else:
             if 'search' in form:
-                self.flash(_('Empty search string'))
+                self.flash(_('Empty search string'), type="warning")
             return
         if self.searchtype == 'current_session':
@@ -286,10 +284,11 @@
                 self.searchterm = int(self.searchterm)
             except ValueError:
-                self.flash(_('Only year dates allowed (e.g. 2011).'))
+                self.flash(_('Only year dates allowed (e.g. 2011).'),
+                           type="danger")
                 return
         self.hitlist = search(query=self.searchterm,
             searchtype=self.searchtype, view=self)
         if not self.hitlist:
-            self.flash(_('No student found.'))
+            self.flash(_('No student found.'), type="warning")
         return
 
@@ -307,7 +306,4 @@
 
     def update(self, *args, **kw):
-        datatable.need()
-        toggleall.need()
-        warning.need()
         form = self.request.form
         self.hitlist = []
@@ -323,5 +319,5 @@
         else:
             if 'search' in form:
-                self.flash(_('Empty search string'))
+                self.flash(_('Empty search string'), type="warning")
             return
         if self.searchtype == 'current_session':
@@ -329,5 +325,6 @@
                 self.searchterm = int(self.searchterm)
             except ValueError:
-                self.flash('Only year dates allowed (e.g. 2011).')
+                self.flash(_('Only year dates allowed (e.g. 2011).'),
+                           type="danger")
                 return
         if not 'entries' in form:
@@ -335,7 +332,7 @@
                 searchtype=self.searchtype, view=self)
             if not self.hitlist:
-                self.flash(_('No student found.'))
+                self.flash(_('No student found.'), type="warning")
             if 'remove' in form:
-                self.flash(_('No item selected.'))
+                self.flash(_('No item selected.'), type="warning")
             return
         entries = form['entries']
@@ -495,5 +492,5 @@
             self.flash(_('Your message has been sent.'))
         else:
-            self.flash(_('An smtp server error occurred.'))
+            self.flash(_('An smtp server error occurred.'), type="danger")
         return
 
@@ -535,11 +532,4 @@
 
     def update(self):
-        datepicker.need() # Enable jQuery datepicker in date fields.
-        tabs.need()
-        self.tab1 = self.tab2 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
         super(StudentBaseManageFormPage, self).update()
         self.wf_info = IWorkflowInfo(self.context)
@@ -555,5 +545,5 @@
             errors = validator.validate_password(password, password_ctl)
             if errors:
-                self.flash( ' '.join(errors))
+                self.flash( ' '.join(errors), type="danger")
                 return
         changed_fields = self.applyData(self.context, **data)
@@ -764,14 +754,4 @@
         return form_fields
 
-    def update(self):
-        datepicker.need() # Enable jQuery datepicker in date fields.
-        tabs.need()
-        self.tab1 = self.tab2 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
-        return super(StudentClearanceManageFormPage, self).update()
-
     @action(_('Save'), style='primary')
     def save(self, **data):
@@ -795,5 +775,5 @@
             self.flash(_('Student has been cleared.'))
         else:
-            self.flash(_('Student is in wrong state.'))
+            self.flash(_('Student is in wrong state.'), type="warning")
         self.redirect(self.url(self.context,'view_clearance'))
         return
@@ -814,5 +794,5 @@
     def update(self):
         if clearance_disabled_message(self.context):
-            self.flash(clearance_disabled_message(self.context))
+            self.flash(clearance_disabled_message(self.context), type="warning")
             self.redirect(self.url(self.context,'view_clearance'))
             return
@@ -824,11 +804,11 @@
             IWorkflowInfo(self.context).fireTransition('reset4')
             message = _('Clearance has been annulled.')
-            self.flash(message)
+            self.flash(message, type="warning")
         elif self.context.state == REQUESTED:
             IWorkflowInfo(self.context).fireTransition('reset3')
             message = _('Clearance request has been rejected.')
-            self.flash(message)
-        else:
-            self.flash(_('Student is in wrong state.'))
+            self.flash(message, type="warning")
+        else:
+            self.flash(_('Student is in wrong state.'), type="warning")
             self.redirect(self.url(self.context,'view_clearance'))
             return
@@ -987,12 +967,4 @@
             return
         super(StudyCourseManageFormPage, self).update()
-        tabs.need()
-        self.tab1 = self.tab2 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
-        warning.need()
-        datatable.need()
         return
 
@@ -1003,5 +975,6 @@
         except ConstraintNotSatisfied:
             # The selected level might not exist in certificate
-            self.flash(_('Current level not available for certificate.'))
+            self.flash(_('Current level not available for certificate.'),
+                       type="warning")
             return
         notify(grok.ObjectModifiedEvent(self.context.__parent__))
@@ -1023,11 +996,12 @@
             yield(dict(code=code, title=title))
 
-    @action(_('Add study level'))
+    @action(_('Add study level'), style='primary')
     def addStudyLevel(self, **data):
         level_code = self.request.form.get('addlevel', None)
         level_session = self.request.form.get('level_session', None)
         if not level_session:
-            self.flash(_('You must select a session for the level.'))
-            self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+            self.flash(_('You must select a session for the level.'),
+                       type="warning")
+            self.redirect(self.url(self.context, u'@@manage')+'#tab2')
             return
         studylevel = createObject(u'waeup.StudentStudyLevel')
@@ -1039,6 +1013,6 @@
             self.flash(_('Study level has been added.'))
         except KeyError:
-            self.flash(_('This level exists.'))
-        self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+            self.flash(_('This level exists.'), type="warning")
+        self.redirect(self.url(self.context, u'@@manage')+'#tab2')
         return
 
@@ -1049,6 +1023,6 @@
             child_id = form['val_id']
         else:
-            self.flash(_('No study level selected.'))
-            self.redirect(self.url(self.context, '@@manage')+'?tab2')
+            self.flash(_('No study level selected.'), type="warning")
+            self.redirect(self.url(self.context, '@@manage')+'#tab2')
             return
         if not isinstance(child_id, list):
@@ -1063,5 +1037,5 @@
             self.context.writeLogMessage(
                 self,'removed: %s' % ', '.join(deleted))
-        self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+        self.redirect(self.url(self.context, u'@@manage')+'#tab2')
         return
 
@@ -1082,12 +1056,6 @@
     def update(self, SUBMIT=None):
         super(StudentTranscriptRequestPage, self).update()
-        tabs.need()
-        self.tab1 = self.tab2 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
         if not self.context.state == GRADUATED:
-            self.flash(_("Wrong state"))
+            self.flash(_("Wrong state"), type="danger")
             self.redirect(self.url(self.context))
             return
@@ -1106,8 +1074,9 @@
             code = get_access_code(pin)
             if not code:
-                self.flash(_('Activation code is invalid.'))
+                self.flash(_('Activation code is invalid.'), type="warning")
                 return
             if code.state == USED:
-                self.flash(_('Activation code has already been used.'))
+                self.flash(_('Activation code has already been used.'),
+                           type="warning")
                 return
             # Mark pin as used (this also fires a pin related transition)
@@ -1117,5 +1086,6 @@
             # expect an exception, but the owner might be different
             if not invalidate_accesscode(pin, comment, self.context.student_id):
-                self.flash(_('You are not the owner of this access code.'))
+                self.flash(_('You are not the owner of this access code.'),
+                           type="warning")
                 return
             self.context.clr_code = pin
@@ -1157,12 +1127,6 @@
     def update(self, SUBMIT=None):
         super(StudentTranscriptRequestProcessFormPage, self).update()
-        tabs.need()
-        self.tab1 = self.tab2 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
         if self.context.state != TRANSCRIPT:
-            self.flash(_('Student is in wrong state.'))
+            self.flash(_('Student is in wrong state.'), type="warning")
             self.redirect(self.url(self.context))
             return
@@ -1222,5 +1186,6 @@
     def update(self):
         if not self.context.student.transcript_enabled:
-            self.flash(_('You are not allowed to view the transcript.'))
+            self.flash(_('You are not allowed to view the transcript.'),
+                       type="warning")
             self.redirect(self.url(self.context))
             return
@@ -1255,5 +1220,6 @@
     def update(self):
         if not self.context.student.transcript_enabled:
-            self.flash(_('You are not allowed to download the transcript.'))
+            self.flash(_('You are not allowed to download the transcript.'),
+                       type="warning")
             self.redirect(self.url(self.context))
             return
@@ -1319,18 +1285,16 @@
     pnav = 4
 
-    def update(self):
-        super(StudentTransferFormPage, self).update()
-        warning.need()
-        return
-
     @jsaction(_('Transfer'))
     def transferStudent(self, **data):
         error = self.context.transfer(**data)
         if error == -1:
-            self.flash(_('Current level does not match certificate levels.'))
+            self.flash(_('Current level does not match certificate levels.'),
+                       type="warning")
         elif error == -2:
-            self.flash(_('Former study course record incomplete.'))
+            self.flash(_('Former study course record incomplete.'),
+                       type="warning")
         elif error == -3:
-            self.flash(_('Maximum number of transfers exceeded.'))
+            self.flash(_('Maximum number of transfers exceeded.'),
+                       type="warning")
         else:
             self.flash(_('Successfully transferred.'))
@@ -1347,7 +1311,6 @@
 
     def update(self):
-        warning.need()
         if not self.context.has_key('studycourse_1'):
-            self.flash(_('No previous transfer.'))
+            self.flash(_('No previous transfer.'), type="warning")
             self.redirect(self.url(self.context))
             return
@@ -1375,5 +1338,4 @@
     def update(self):
         super(StudyLevelDisplayFormPage, self).update()
-        datatable.need()
         return
 
@@ -1486,4 +1448,5 @@
     tabtwoactions = [_('Add course ticket'),
         _('Remove selected tickets'),_('Cancel')]
+    placeholder = _('Enter valid course code')
 
     def update(self, ADD=None, course=None):
@@ -1492,25 +1455,17 @@
             return
         super(StudyLevelManageFormPage, self).update()
-        tabs.need()
-        self.tab1 = self.tab2 = ''
-        qs = self.request.get('QUERY_STRING', '')
-        if not qs:
-            qs = 'tab1'
-        setattr(self, qs, 'active')
-        warning.need()
-        datatable.need()
         if ADD is not None:
             if not course:
-                self.flash(_('No valid course code entered.'))
-                self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+                self.flash(_('No valid course code entered.'), type="warning")
+                self.redirect(self.url(self.context, u'@@manage')+'#tab2')
                 return
             cat = queryUtility(ICatalog, name='courses_catalog')
             result = cat.searchResults(code=(course, course))
             if len(result) != 1:
-                self.flash(_('Course not found.'))
+                self.flash(_('Course not found.'), type="warning")
             else:
                 course = list(result)[0]
                 addCourseTicket(self, course)
-            self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+            self.redirect(self.url(self.context, u'@@manage')+'#tab2')
         return
 
@@ -1539,6 +1494,6 @@
             child_id = form['val_id']
         else:
-            self.flash(_('No ticket selected.'))
-            self.redirect(self.url(self.context, '@@manage')+'?tab2')
+            self.flash(_('No ticket selected.'), type="warning")
+            self.redirect(self.url(self.context, '@@manage')+'#tab2')
             return
         if not isinstance(child_id, list):
@@ -1554,5 +1509,5 @@
                 self,'removed: %s at %s' %
                 (', '.join(deleted), self.context.level))
-        self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+        self.redirect(self.url(self.context, u'@@manage')+'#tab2')
         return
 
@@ -1569,5 +1524,6 @@
             return
         if str(self.context.__parent__.current_level) != self.context.__name__:
-            self.flash(_('This level does not correspond current level.'))
+            self.flash(_('This level does not correspond current level.'),
+                       type="danger")
         elif self.context.student.state == REGISTERED:
             IWorkflowInfo(self.context.student).fireTransition(
@@ -1575,5 +1531,5 @@
             self.flash(_('Course list has been validated.'))
         else:
-            self.flash(_('Student is in the wrong state.'))
+            self.flash(_('Student is in the wrong state.'), type="warning")
         self.redirect(self.url(self.context))
         return
@@ -1594,5 +1550,6 @@
             return
         if str(self.context.__parent__.current_level) != self.context.__name__:
-            self.flash(_('This level does not correspond current level.'))
+            self.flash(_('This level does not correspond current level.'),
+                       type="danger")
             self.redirect(self.url(self.context))
             return
@@ -1606,5 +1563,5 @@
             self.flash(message)
         else:
-            self.flash(_('Student is in the wrong state.'))
+            self.flash(_('Student is in the wrong state.'), type="warning")
             self.redirect(self.url(self.context))
             return
@@ -1634,10 +1591,10 @@
         return
 
-    @action(_('Add course ticket'))
+    @action(_('Add course ticket'), style='primary')
     def addCourseTicket(self, **data):
         course = data['course']
         success = addCourseTicket(self, course)
         if success:
-            self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+            self.redirect(self.url(self.context, u'@@manage')+'#tab2')
         return
 
@@ -1719,10 +1676,4 @@
             mapping = {'a':self.context.__parent__.display_fullname})
 
-    def update(self):
-        super(PaymentsManageFormPage, self).update()
-        datatable.need()
-        warning.need()
-        return
-
     @jsaction(_('Remove selected tickets'))
     def delPaymentTicket(self, **data):
@@ -1731,5 +1682,5 @@
             child_id = form['val_id']
         else:
-            self.flash(_('No payment selected.'))
+            self.flash(_('No payment selected.'), type="warning")
             self.redirect(self.url(self.context))
             return
@@ -1783,10 +1734,11 @@
                 self.flash(
                     _('Your current session does not match ' + \
-                    'accommodation session.'))
+                    'accommodation session.'), type="danger")
                 return
         if 'maintenance' in p_category:
             current_session = str(student['studycourse'].current_session)
             if not current_session in student['accommodation']:
-                self.flash(_('You have not yet booked accommodation.'))
+                self.flash(_('You have not yet booked accommodation.'),
+                           type="warning")
                 return
         students_utils = getUtility(IStudentsUtils)
@@ -1794,5 +1746,5 @@
             p_category, student, previous_session, previous_level)
         if error is not None:
-            self.flash(error)
+            self.flash(error, type="danger")
             return
         self.context[payment.p_id] = payment
@@ -1817,5 +1769,5 @@
     def update(self):
         if self.context.student.before_payment:
-            self.flash(_("No previous payment to be made."))
+            self.flash(_("No previous payment to be made."), type="warning")
             self.redirect(self.url(self.context))
         super(PreviousPaymentAddFormPage, self).update()
@@ -1832,5 +1784,5 @@
             p_category, student, previous_session, previous_level)
         if error is not None:
-            self.flash(error)
+            self.flash(error, type="danger")
             return
         self.context[payment.p_id] = payment
@@ -1865,5 +1817,5 @@
             balance_level, balance_amount)
         if error is not None:
-            self.flash(error)
+            self.flash(error, type="danger")
             return
         self.context[payment.p_id] = payment
@@ -1989,14 +1941,9 @@
             mapping = {'a':self.context.__parent__.display_fullname})
 
-    def update(self):
-        super(AccommodationManageFormPage, self).update()
-        datatable.need()
-        warning.need()
-        return
-
     @jsaction(_('Remove selected'))
     def delBedTickets(self, **data):
         if getattr(self.request.principal, 'user_type', None) == 'student':
-            self.flash(_('You are not allowed to remove bed tickets.'))
+            self.flash(_('You are not allowed to remove bed tickets.'),
+                       type="warning")
             self.redirect(self.url(self.context))
             return
@@ -2005,5 +1952,5 @@
             child_id = form['val_id']
         else:
-            self.flash(_('No bed ticket selected.'))
+            self.flash(_('No bed ticket selected.'), type="warning")
             self.redirect(self.url(self.context))
             return
@@ -2057,15 +2004,16 @@
                     enddate, tz).strftime("%d/%m/%Y %H:%M:%S")
                 self.flash(_("Outside booking period: ${a} - ${b}",
-                    mapping = {'a': startdate, 'b': enddate}))
+                    mapping = {'a': startdate, 'b': enddate}), type="warning")
             else:
-                self.flash(_("Outside booking period."))
+                self.flash(_("Outside booking period."), type="warning")
             self.redirect(self.url(self.context))
             return
         if not acc_details:
-            self.flash(_("Your data are incomplete."))
+            self.flash(_("Your data are incomplete."), type="warning")
             self.redirect(self.url(self.context))
             return
         if not student.state in acc_details['allowed_states']:
-            self.flash(_("You are in the wrong registration state."))
+            self.flash(_("You are in the wrong registration state."),
+                       type="warning")
             self.redirect(self.url(self.context))
             return
@@ -2073,5 +2021,6 @@
             'booking_session']:
             self.flash(
-                _('Your current session does not match accommodation session.'))
+                _('Your current session does not match accommodation session.'),
+                type="warning")
             self.redirect(self.url(self.context))
             return
@@ -2079,5 +2028,5 @@
             self.flash(
                 _('You already booked a bed space in current ' \
-                    + 'accommodation session.'))
+                    + 'accommodation session.'), type="warning")
             self.redirect(self.url(self.context))
             return
@@ -2091,5 +2040,5 @@
             code = get_access_code(pin)
             if not code:
-                self.flash(_('Activation code is invalid.'))
+                self.flash(_('Activation code is invalid.'), type="warning")
                 return
         # Search and book bed
@@ -2103,5 +2052,6 @@
             # XXX: Can be remove if nobody complains.
             if bed.__parent__.__parent__ is None:
-                self.flash(_('System error: Please contact the adminsitrator.'))
+                self.flash(_('System error: Please contact the adminsitrator.'),
+                           type="danger")
                 self.context.writeLogMessage(self, 'fatal error: %s' % bed.bed_id)
                 return
@@ -2118,5 +2068,6 @@
                 # XXX: Can be remove if nobody complains.
                 if bed.__parent__.__parent__ is None:
-                    self.flash(_('System error: Please contact the adminsitrator.'))
+                    self.flash(_('System error: Please contact the adminsitrator.'),
+                               type="warning")
                     self.context.writeLogMessage(self, 'fatal error: %s' % bed.bed_id)
                     return
@@ -2124,10 +2075,11 @@
             else:
                 self.flash(_('There is no free bed in your category ${a}.',
-                    mapping = {'a':acc_details['bt']}))
+                    mapping = {'a':acc_details['bt']}), type="warning")
                 return
         if self.with_ac:
             # Mark pin as used (this also fires a pin related transition)
             if code.state == USED:
-                self.flash(_('Activation code has already been used.'))
+                self.flash(_('Activation code has already been used.'),
+                           type="warning")
                 return
             else:
@@ -2137,5 +2089,6 @@
                 if not invalidate_accesscode(
                     pin,comment,self.context.student.student_id):
-                    self.flash(_('You are not the owner of this access code.'))
+                    self.flash(_('You are not the owner of this access code.'),
+                               type="warning")
                     return
         # Create bed ticket
@@ -2231,5 +2184,6 @@
         if self.context.bed != None and \
               'reserved' in self.context.bed.bed_type:
-            self.flash(_("Students in reserved beds can't be relocated."))
+            self.flash(_("Students in reserved beds can't be relocated."),
+                       type="warning")
             self.redirect(self.url(self.context))
             return
@@ -2237,5 +2191,5 @@
                 self.context.bed != None and \
                 self.context.bed.bed_type == self.context.bed_type:
-            self.flash(_("Student can't be relocated."))
+            self.flash(_("Student can't be relocated."), type="warning")
             self.redirect(self.url(self.context))
             return
@@ -2260,5 +2214,5 @@
             else:
                 self.flash(_('There is no free bed in your category ${a}.',
-                    mapping = {'a':acc_details['bt']}))
+                    mapping = {'a':acc_details['bt']}), type="warning")
                 self.redirect(self.url(self.context))
                 return
@@ -2343,5 +2297,5 @@
                 self.flash(_('Password changed.'))
             else:
-                self.flash( ' '.join(errors))
+                self.flash( ' '.join(errors), type="warning")
         return
 
@@ -2391,13 +2345,13 @@
     def update(self, SUBMIT=None):
         if not self.context.state == ADMITTED:
-            self.flash(_("Wrong state"))
+            self.flash(_("Wrong state"), type="warning")
             self.redirect(self.url(self.context))
             return
         if not self.portrait_uploaded:
-            self.flash(_("No portrait uploaded."))
+            self.flash(_("No portrait uploaded."), type="warning")
             self.redirect(self.url(self.context, 'change_portrait'))
             return
         if not self.all_required_fields_filled:
-            self.flash(_("Not all required fields filled."))
+            self.flash(_("Not all required fields filled."), type="warning")
             self.redirect(self.url(self.context, 'edit_base'))
             return
@@ -2411,8 +2365,9 @@
             code = get_access_code(pin)
             if not code:
-                self.flash(_('Activation code is invalid.'))
+                self.flash(_('Activation code is invalid.'), type="warning")
                 return
             if code.state == USED:
-                self.flash(_('Activation code has already been used.'))
+                self.flash(_('Activation code has already been used.'),
+                           type="warning")
                 return
             # Mark pin as used (this also fires a pin related transition)
@@ -2422,5 +2377,6 @@
             # expect an exception, but the owner might be different
             if not invalidate_accesscode(pin, comment, self.context.student_id):
-                self.flash(_('You are not the owner of this access code.'))
+                self.flash(_('You are not the owner of this access code.'),
+                           type="warning")
                 return
             self.context.clr_code = pin
@@ -2469,5 +2425,5 @@
         self.applyData(self.context, **data)
         if self.dataNotComplete():
-            self.flash(self.dataNotComplete())
+            self.flash(self.dataNotComplete(), type="warning")
             return
         self.flash(_('Clearance form has been saved.'))
@@ -2482,5 +2438,6 @@
                 # This shouldn't happen, but the application officer
                 # might have forgotten to lock the form after changing the state
-                self.flash(_('This form cannot be submitted. Wrong state!'))
+                self.flash(_('This form cannot be submitted. Wrong state!'),
+                           type="danger")
                 return
             IWorkflowInfo(self.context).fireTransition('request_clearance')
@@ -2510,5 +2467,5 @@
             pin = '%s-%s-%s' % (self.ac_prefix, self.ac_series, self.ac_number)
             if self.context.clr_code and self.context.clr_code != pin:
-                self.flash(_("This isn't your CLR access code."))
+                self.flash(_("This isn't your CLR access code."), type="danger")
                 return
         state = IWorkflowState(self.context).getState()
@@ -2516,5 +2473,6 @@
             # This shouldn't happen, but the application officer
             # might have forgotten to lock the form after changing the state
-            self.flash(_('This form cannot be submitted. Wrong state!'))
+            self.flash(_('This form cannot be submitted. Wrong state!'),
+                       type="danger")
             return
         IWorkflowInfo(self.context).fireTransition('request_clearance')
@@ -2541,5 +2499,6 @@
         super(StartSessionPage, self).update()
         if not self.context.next_session_allowed:
-            self.flash(_("You are not entitled to start session."))
+            self.flash(_("You are not entitled to start session."),
+                       type="warning")
             self.redirect(self.url(self.context))
             return
@@ -2553,9 +2512,10 @@
             code = get_access_code(pin)
             if not code:
-                self.flash(_('Activation code is invalid.'))
+                self.flash(_('Activation code is invalid.'), type="warning")
                 return
             # Mark pin as used (this also fires a pin related transition)
             if code.state == USED:
-                self.flash(_('Activation code has already been used.'))
+                self.flash(_('Activation code has already been used.'),
+                           type="warning")
                 return
             else:
@@ -2565,5 +2525,6 @@
                 if not invalidate_accesscode(
                     pin,comment,self.context.student.student_id):
-                    self.flash(_('You are not the owner of this access code.'))
+                    self.flash(_('You are not the owner of this access code.'),
+                               type="warning")
                     return
         try:
@@ -2578,5 +2539,6 @@
                     'pay_pg_fee')
         except ConstraintNotSatisfied:
-            self.flash(_('An error occurred, please contact the system administrator.'))
+            self.flash(_('An error occurred, please contact the system administrator.'),
+                       type="danger")
             return
         self.flash(_('Session started.'))
@@ -2607,4 +2569,9 @@
         if self.context.student.state != PAID:
             emit_lock_message(self)
+            return
+        code = self.context.current_level
+        if code is None:
+            self.flash(_('Your data are incomplete'), type="danger")
+            self.redirect(self.url(self.context))
             return
         super(AddStudyLevelFormPage, self).update()
@@ -2620,7 +2587,7 @@
                 self.context.certificate,studylevel)
         except KeyError:
-            self.flash(_('This level exists.'))
+            self.flash(_('This level exists.'), type="warning")
         except RequiredMissing:
-            self.flash(_('Your data are incomplete'))
+            self.flash(_('Your data are incomplete'), type="danger")
         self.redirect(self.url(self.context))
         return
@@ -2646,14 +2613,12 @@
             return
         super(StudyLevelEditFormPage, self).update()
-        datatable.need()
-        warning.need()
         if ADD is not None:
             if not course:
-                self.flash(_('No valid course code entered.'))
+                self.flash(_('No valid course code entered.'), type="warning")
                 return
             cat = queryUtility(ICatalog, name='courses_catalog')
             result = cat.searchResults(code=(course, course))
             if len(result) != 1:
-                self.flash(_('Course not found.'))
+                self.flash(_('Course not found.'), type="warning")
                 return
             course = list(result)[0]
@@ -2679,5 +2644,5 @@
             child_id = form['val_id']
         else:
-            self.flash(_('No ticket selected.'))
+            self.flash(_('No ticket selected.'), type="warning")
             self.redirect(self.url(self.context, '@@edit'))
             return
@@ -2710,5 +2675,5 @@
             self.flash(_(
                 "You are a postgraduate student, "
-                "your course list can't bee registered."))
+                "your course list can't bee registered."), type="warning")
             self.redirect(self.url(self.context))
             return
@@ -2717,5 +2682,5 @@
         if self.context.total_credits > max_credits:
             self.flash(_('Maximum credits of ${a} exceeded.',
-                mapping = {'a':max_credits}))
+                mapping = {'a':max_credits}), type="warning")
             return
         IWorkflowInfo(self.context.student).fireTransition(
@@ -2776,8 +2741,8 @@
             searchtype='reg_number', view=self)
         if not hitlist:
-            self.flash(_('No student found.'))
+            self.flash(_('No student found.'), type="warning")
             return
         if len(hitlist) != 1:   # Cannot happen but anyway
-            self.flash(_('More than one student found.'))
+            self.flash(_('More than one student found.'), type="warning")
             return
         student = hitlist[0].context
@@ -2787,5 +2752,5 @@
         code = get_access_code(pin)
         if not code:
-            self.flash(_('Access code is invalid.'))
+            self.flash(_('Access code is invalid.'), type="warning")
             return
         if student_pw and pin == student.adm_code:
@@ -2797,10 +2762,10 @@
             self.flash(
                 _('Password has already been set. You are using the ' +
-                'wrong Access Code.'))
+                'wrong Access Code.'), type="warning")
             return
         # Mark pin as used (this also fires a pin related transition)
         # and set student password
         if code.state == USED:
-            self.flash(_('Access code has already been used.'))
+            self.flash(_('Access code has already been used.'), type="warning")
             return
         else:
@@ -2860,5 +2825,5 @@
             student = results[0]
             if getattr(student,'firstname',None) is None:
-                self.flash(_('An error occurred.'))
+                self.flash(_('An error occurred.'), type="danger")
                 return
             elif student.firstname.lower() != firstname.lower():
@@ -2866,9 +2831,10 @@
                 # know that a record was found and only the firstname
                 # verification failed.
-                self.flash(_('No student record found.'))
+                self.flash(_('No student record found.'), type="warning")
                 return
             elif student.password is not None and self._pw_used:
                 self.flash(_('Your password has already been set and used. '
-                             'Please proceed to the login page.'))
+                             'Please proceed to the login page.'),
+                           type="warning")
                 return
             # Store email address but nothing else.
@@ -2877,5 +2843,5 @@
         else:
             # No record found, this is the truth.
-            self.flash(_('No student record found.'))
+            self.flash(_('No student record found.'), type="warning")
             return
 
@@ -2965,5 +2931,4 @@
 
     def update(self, SHOW=None, session=None, level=None):
-        datatable.need()
         self.parent_url = self.url(self.context.__parent__)
         self._set_session_values()
@@ -2988,5 +2953,5 @@
             self.hitlist = self._searchCatalog(self.session, self.level)
             if not self.hitlist:
-                self.flash(_('No student found.'))
+                self.flash(_('No student found.'), type="warning")
         return
 
@@ -3073,17 +3038,16 @@
             'configuration'].current_academic_session
         if self.context.__parent__.__parent__.score_editing_disabled:
-            self.flash(_('Score editing disabled.'))
+            self.flash(_('Score editing disabled.'), type="warning")
             self.redirect(self.url(self.context))
             return
         if not self.current_academic_session:
-            self.flash(_('Current academic session not set.'))
+            self.flash(_('Current academic session not set.'), type="warning")
             self.redirect(self.url(self.context))
             return
-        datatable.need()
         self.tickets = self._searchCatalog(self.current_academic_session)
         editable_tickets = [
             ticket for ticket in self.tickets if ticket.editable_by_lecturer]
         if not self.tickets:
-            self.flash(_('No student found.'))
+            self.flash(_('No student found.'), type="warning")
             self.redirect(self.url(self.context))
             return
@@ -3115,5 +3079,6 @@
             if error:
                 self.flash(_('Error: Score(s) of %s have not be updated. '
-                  'Only integers are allowed.' % error.strip(', ')))
+                  'Only integers are allowed.' % error.strip(', ')),
+                  type="danger")
         return
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/accommodationmanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/accommodationmanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/accommodationmanagepage.pt	(revision 11254)
@@ -2,5 +2,5 @@
       i18n:domain="waeup.kofa" enctype="multipart/form-data">
 
-  <table class="display dataTableManage">
+  <table class="kofa-data-table dataTableManage">
     <thead>
     <tr>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/basemanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/basemanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/basemanagepage.pt	(revision 11254)
@@ -3,13 +3,19 @@
       autocomplete="off">
 
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1"><a href="#tab-1">
-    <span i18n:translate="">Base Data</span></a></li>
-    <li tal:attributes="class view/tab2"><a href="#tab-2">
-    <span i18n:translate="">Passport Picture</span></a></li>
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+      <a href="#tab1" data-toggle="tab">
+      <span i18n:translate="">Base Data</span></a>
+    </li>
+    <li>
+      <a href="#tab2" data-toggle="tab">
+        <span i18n:translate="">Passport Picture</span>
+      </a>
+    </li>
   </ul>
 
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+    <div id="tab1" class="active tab-pane">
+      <br />
       <table class="form-table">
         <tbody>
@@ -18,5 +24,5 @@
             <td class="fieldname" i18n:translate="">Password:</td>
             <td>
-              <input name="password" type="password"  />
+              <input name="password" class="form-control" type="password"  />
             </td>
           </tr>
@@ -24,5 +30,5 @@
             <td class="fieldname" i18n:translate="">Retype Password:</td>
             <td>
-              <input name="control_password" type="password" />
+              <input name="control_password" class="form-control" type="password" />
             </td>
           </tr>
@@ -38,5 +44,6 @@
     </div>
 
-    <div id="tab-2"  tal:attributes="class view/tab2">
+    <div id="tab2" class="tab-pane">
+      <br />
       <table class="form-table">
         <tbody>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/change_password.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/change_password.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/change_password.pt	(revision 11254)
@@ -10,5 +10,5 @@
         <td class="fieldname" i18n:translate="">Password:</td>
         <td>
-          <input name="change_password" type="password"  />
+          <input name="change_password" class="form-control" type="password"  />
         </td>
       </tr>
@@ -16,5 +16,5 @@
         <td class="fieldname" i18n:translate="">Retype Password:</td>
         <td>
-          <input name="change_password_repeat" type="password" />
+          <input name="change_password_repeat" class="form-control" type="password" />
         </td>
       </tr>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/clearanceeditpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/clearanceeditpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/clearanceeditpage.pt	(revision 11254)
@@ -2,12 +2,19 @@
       i18n:domain="waeup.kofa" enctype="multipart/form-data">
 
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1"><a href="#tab-1">
-    <span i18n:translate="">Clearance Data</span></a></li>
-    <li tal:attributes="class view/tab2"><a href="#tab-2">
-    <span i18n:translate="">Scans</span></a></li>
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+      <a href="#tab1" data-toggle="tab">
+        <span i18n:translate="">Clearance Data</span>
+      </a>
+    </li>
+    <li>
+      <a href="#tab2" data-toggle="tab">
+        <span i18n:translate="">Scans</span>
+      </a>
+    </li>
   </ul>
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+    <div id="tab1" class="active tab-pane">
+      <br />
       <table class="form-table">
         <tbody>
@@ -23,5 +30,6 @@
     </div>
 
-    <div id="tab-2" tal:attributes="class view/tab2">
+    <div id="tab2" class="tab-pane">
+      <br />
       <table class="form-table">
         <tbody>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/containermanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/containermanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/containermanagepage.pt	(revision 11254)
@@ -1,21 +1,28 @@
-<form method="POST" i18n:domain="waeup.kofa">
+<form method="POST" i18n:domain="waeup.kofa" class="form-inline">
 <br />
-  <input class="btn primary" type="submit" name="search"
-    tal:attributes="value view/search_button" />
-
-  <select name="searchtype">
-    <option i18n:translate="" value="student_id">with id</option>
-    <option i18n:translate="" value="fullname">with name</option>
-    <option i18n:translate="" value="reg_number">with registration number</option>
-    <option i18n:translate="" value="matric_number">with matriculation number</option>
-    <option i18n:translate="" value="current_session">in session</option>
-    <option i18n:translate="" value="depcode">in department</option>
-    <option i18n:translate="" value="current_mode">in study mode</option>
-    <option i18n:translate="" value="suspended">
-      with deactivated account (search term omitted)
-    </option>
-  </select>
-
-  <input type="text" name="searchterm" />
+  <div class="form-group">
+    <input class="btn btn-primary" type="submit" name="search"
+      tal:attributes="value view/search_button" />
+  </div>
+  <div class="form-group">
+    <select name="searchtype" class="form-control">
+      <option i18n:translate="" value="student_id">with id</option>
+      <option i18n:translate="" value="fullname">with name</option>
+      <option i18n:translate="" value="reg_number">with registration number</option>
+      <option i18n:translate="" value="matric_number">with matriculation number</option>
+      <option i18n:translate="" value="current_session">in session</option>
+      <option i18n:translate="" value="depcode">in department</option>
+      <option i18n:translate="" value="current_mode">in study mode</option>
+      <option i18n:translate="" value="suspended">
+        with deactivated account (search term omitted)
+      </option>
+      <option i18n:translate="" value="transcript">
+        who requested transcript (search term omitted)
+      </option>
+    </select>
+  </div>
+  <div class="form-group">
+    <input type="text" class="form-control" name="searchterm" />
+  </div>
 
   <p>&nbsp;</p>
@@ -27,9 +34,6 @@
          tal:attributes="value view/searchtype" />
 
-    <input type="checkbox" onClick="toggle(this, 'entries')" />
-    <span  i18n:translate="">Select all</span>
     <br /><br />
-
-    <table class="display dataTableManage">
+    <table class="kofa-data-table dataTableManage">
       <thead>
     	<tr>
@@ -43,5 +47,5 @@
       </thead>
       <tbody>
-    	<tr tal:repeat="item view/hitlist" class="gradeC">
+    	<tr tal:repeat="item view/hitlist">
     	  <td><input type="checkbox" name="entries"
     	             tal:attributes="value item/context/__name__" /></td>
@@ -60,7 +64,9 @@
       </tbody>
     </table>
-    
+    <input type="checkbox" onClick="toggle(this, 'entries')" />
+    <span  i18n:translate="">Select all</span>
+    <br /><br />
     <input type="submit" name="remove"
-           tal:attributes="value view/remove_button" class="btn"
+           tal:attributes="value view/remove_button" class="btn btn-default"
            onclick="return confirmPost('Are you sure?')"/>
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/containerpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/containerpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/containerpage.pt	(revision 11254)
@@ -1,59 +1,62 @@
-<form method="POST" i18n:domain="waeup.kofa">
+<form method="POST" i18n:domain="waeup.kofa" class="form-inline">
 <br />
-  <input class="btn primary" type="submit" name="search"
-    tal:attributes="value view/search_button" />
-
-  <select name="searchtype">
-    <option i18n:translate="" value="student_id">with id</option>
-    <option i18n:translate="" value="fullname">with name</option>
-    <option i18n:translate="" value="reg_number">with registration number</option>
-    <option i18n:translate="" value="matric_number">with matriculation number</option>
-    <option i18n:translate="" value="current_session">in session</option>
-    <option i18n:translate="" value="depcode">in department</option>
-    <option i18n:translate="" value="current_mode">in study mode</option>
-    <option i18n:translate="" value="suspended">
-      with deactivated account (search term omitted)
-    </option>
-    <option i18n:translate="" value="transcript">
-      who requested transcript (search term omitted)
-    </option>
-  </select>
-
-  <input type="text" name="searchterm" />
-
-  <p>&nbsp;</p>
-  <div tal:condition="view/hitlist">
-    <h3 i18n:translate="">Search Results</h3>
-    <input type="hidden" name="old_searchterm"
-         tal:attributes="value view/searchterm" />
-    <input type="hidden" name="old_searchtype"
-         tal:attributes="value view/searchtype" />
-    <table class="display dataTable">
-      <thead>
-      <tr>
-        <th i18n:translate="">Student Id</th>
-        <th i18n:translate="">Reg. Number</th>
-        <th i18n:translate="">Matric. Number</th>
-        <th i18n:translate="">State</th>
-        <th i18n:translate="">Full Name</th>
-      </tr>
-      </thead>
-      <tbody>
-      <tr tal:repeat="item view/hitlist" class="gradeC">
-        <td> <a tal:attributes="href item/url">
-          <span tal:content="item/student_id">A123456</span></a>
-        </td>
-        <td class="center"> <a tal:attributes="href item/url">
-          <span tal:content="item/reg_number">9999999</span></a>
-        </td>
-        <td class="center"> <a tal:attributes="href item/url">
-          <span tal:content="item/matric_number">9999999</span></a>
-        </td>
-        <td tal:content="item/state">admitted</td>
-        <td tal:content="item/display_fullname">Bob</td>
-      </tr>
-      </tbody>
-    </table>
-    <br />
+  <div class="form-group">
+    <input class="btn btn-primary" type="submit" name="search"
+      tal:attributes="value view/search_button" />
+  </div>
+  <div class="form-group">
+    <select name="searchtype" class="form-control">
+      <option i18n:translate="" value="student_id">with id</option>
+      <option i18n:translate="" value="fullname">with name</option>
+      <option i18n:translate="" value="reg_number">with registration number</option>
+      <option i18n:translate="" value="matric_number">with matriculation number</option>
+      <option i18n:translate="" value="current_session">in session</option>
+      <option i18n:translate="" value="depcode">in department</option>
+      <option i18n:translate="" value="current_mode">in study mode</option>
+      <option i18n:translate="" value="suspended">
+        with deactivated account (search term omitted)
+      </option>
+      <option i18n:translate="" value="transcript">
+        who requested transcript (search term omitted)
+      </option>
+    </select>
+  </div>
+  <div class="form-group">
+    <input type="text" class="form-control" name="searchterm" />
   </div>
 </form>
+<br />
+<div tal:condition="view/hitlist">
+  <h3 i18n:translate="">Search Results</h3>
+  <input type="hidden" name="old_searchterm"
+       tal:attributes="value view/searchterm" />
+  <input type="hidden" name="old_searchtype"
+       tal:attributes="value view/searchtype" />
+  <table class="kofa-data-table dataTable">
+    <thead>
+    <tr>
+      <th i18n:translate="">Student Id</th>
+      <th i18n:translate="">Reg. Number</th>
+      <th i18n:translate="">Matric. Number</th>
+      <th i18n:translate="">State</th>
+      <th i18n:translate="">Full Name</th>
+    </tr>
+    </thead>
+    <tbody>
+    <tr tal:repeat="item view/hitlist">
+      <td> <a tal:attributes="href item/url">
+        <span tal:content="item/student_id">A123456</span></a>
+      </td>
+      <td class="center"> <a tal:attributes="href item/url">
+        <span tal:content="item/reg_number">9999999</span></a>
+      </td>
+      <td class="center"> <a tal:attributes="href item/url">
+        <span tal:content="item/matric_number">9999999</span></a>
+      </td>
+      <td tal:content="item/state">admitted</td>
+      <td tal:content="item/display_fullname">Bob</td>
+    </tr>
+    </tbody>
+  </table>
+</div>
+
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/editscorespage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/editscorespage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/editscorespage.pt	(revision 11254)
@@ -2,6 +2,5 @@
   <br />
 
-
-  <table class="display dataTable">
+  <table class="kofa-data-table dataTable">
     <thead>
   	<tr>
@@ -17,5 +16,5 @@
     </thead>
     <tbody>
-  	<tr tal:repeat="ticket view/tickets" class="gradeC">
+  	<tr tal:repeat="ticket view/tickets">
       <td tal:content="ticket/student/matric_number">MATRIC_NUMBER</td>
   	  <td tal:condition="ticket/editable_by_lecturer">
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/enterpin.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/enterpin.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/enterpin.pt	(revision 11254)
@@ -8,7 +8,7 @@
         <td>
         <span tal:replace="view/ac_prefix">PIN Prefix</span> -
-        <input name="ac_series" type="text" class="span1" maxlength="3"
+        <input name="ac_series" type="text" maxlength="3"
                value="" tal:attributes="value view/ac_series"/> -
-        <input name="ac_number" type="text" class="span3" maxlength="10"
+        <input name="ac_number" type="text" maxlength="10"
                value="" tal:attributes="value view/ac_number" />
         <font color="red"><span tal:replace="view/notice">Notice</span>
@@ -24,5 +24,5 @@
       <tr>
         <td colspan="2">
-          <input type="submit" name="SUBMIT" class="btn primary"
+          <input type="submit" name="SUBMIT" class="btn btn-primary"
                  tal:attributes="value view/buttonname" />
         </td>
@@ -36,5 +36,5 @@
       clicking the button below.
     </p>
-    <input type="submit" name="SUBMIT" class="btn primary"
+    <input type="submit" name="SUBMIT" class="btn btn-primary"
            tal:attributes="value view/buttonname" />
   </span>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportconfig.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportconfig.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportconfig.pt	(revision 11254)
@@ -1,3 +1,3 @@
-<p class="alert-message warning"  i18n:domain="waeup.kofa"
+<p class="alert alert-warning"  i18n:domain="waeup.kofa"
    i18n:translate="student_export_warning">
   <strong>NOTICE:</strong>
@@ -12,55 +12,45 @@
 <form i18n:domain="waeup.kofa" method="POST">
   <label for="mode" i18n:translate="">
-    Exporter (Data Type):
+    Exporter (Data Type)
   </label>
-  <div class="input">
-    <select name="exporter">
-      <option tal:repeat="item view/exporters"
-              tal:attributes="value python:item[1]">
-        <span tal:replace="python: item[0]">Students</span>
-      </option>
-    </select>
-  </div>
+  <select name="exporter" class="form-control half">
+    <option tal:repeat="item view/exporters"
+            tal:attributes="value python:item[1]">
+      <span tal:replace="python: item[0]">Students</span>
+    </option>
+  </select>
   <br />
   <label for="session" i18n:translate="">
-    Current Session:
+    Current Session
   </label>
-  <div class="input">
-    <select name="session">
-      <option tal:repeat="item view/sessions"
-              tal:attributes="value python:item[1]">
-        <span tal:replace="python: item[0]">2012/2013</span>
-      </option>
-    </select>
-  </div>
+  <select name="session" class="form-control half">
+    <option tal:repeat="item view/sessions"
+            tal:attributes="value python:item[1]">
+      <span tal:replace="python: item[0]">2012/2013</span>
+    </option>
+  </select>
   <br />
   <label for="level" i18n:translate="">
-    Current Level:
+    Current Level
   </label>
-  <div class="input">
-    <select name="level">
-      <option tal:repeat="item view/levels"
-              tal:attributes="value python:item[1]">
-        <span tal:replace="python: item[0]">200</span>
-      </option>
-    </select>
-  </div>
+  <select name="level" class="form-control half">
+    <option tal:repeat="item view/levels"
+            tal:attributes="value python:item[1]">
+      <span tal:replace="python: item[0]">200</span>
+    </option>
+  </select>
   <br />
   <label for="mode" i18n:translate="">
-    Current Study Mode:
+    Current Study Mode
   </label>
-  <div class="input">
-    <select name="mode">
-      <option tal:repeat="item view/modes"
-              tal:attributes="value python:item[1]">
-        <span tal:replace="python: item[0]">ug_ft</span>
-      </option>
-    </select>
-  </div>
+  <select name="mode" class="form-control half">
+    <option tal:repeat="item view/modes"
+            tal:attributes="value python:item[1]">
+      <span tal:replace="python: item[0]">ug_ft</span>
+    </option>
+  </select>
   <br /><br />
-  <div class="input">
   <input type="submit" name="START"  i18n:translate=""
     value="Create CSV file"
-    class="btn primary" />
-  </div>
+    class="btn btn-primary" />
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportconfig_certificate.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportconfig_certificate.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportconfig_certificate.pt	(revision 11254)
@@ -1,3 +1,3 @@
-<p class="alert-message warning"  i18n:domain="waeup.kofa"
+<p class="alert alert-warning"  i18n:domain="waeup.kofa"
    i18n:translate="student_export_warning">
   <strong>NOTICE:</strong>
@@ -12,43 +12,35 @@
 <form i18n:domain="waeup.kofa" method="POST">
   <label for="mode" i18n:translate="">
-    Exporter (Data Type):
+    Exporter (Data Type)
   </label>
-  <div class="input">
-    <select name="exporter">
-      <option tal:repeat="item view/exporters"
-              tal:attributes="value python:item[1]">
-        <span tal:replace="python: item[0]">Students</span>
-      </option>
-    </select>
-  </div>
+  <select name="exporter" class="form-control half">
+    <option tal:repeat="item view/exporters"
+            tal:attributes="value python:item[1]">
+      <span tal:replace="python: item[0]">Students</span>
+    </option>
+  </select>
   <br />
   <label for="session" i18n:translate="">
-    Current Session:
+    Current Session
   </label>
-  <div class="input">
-    <select name="session">
-      <option tal:repeat="item view/sessions"
-              tal:attributes="value python:item[1]">
-        <span tal:replace="python: item[0]">2012/2013</span>
-      </option>
-    </select>
-  </div>
+  <select name="session" class="form-control half">
+    <option tal:repeat="item view/sessions"
+            tal:attributes="value python:item[1]">
+      <span tal:replace="python: item[0]">2012/2013</span>
+    </option>
+  </select>
   <br />
   <label for="level" i18n:translate="">
-    Current Level:
+    Current Level
   </label>
-  <div class="input">
-    <select name="level">
-      <option tal:repeat="item view/levels"
-              tal:attributes="value python:item[1]">
-        <span tal:replace="python: item[0]">200</span>
-      </option>
-    </select>
-  </div>
+  <select name="level" class="form-control half">
+    <option tal:repeat="item view/levels"
+            tal:attributes="value python:item[1]">
+      <span tal:replace="python: item[0]">200</span>
+    </option>
+  </select>
   <br /><br />
-  <div class="input">
   <input type="submit" name="START"  i18n:translate=""
     value="Create CSV file"
-    class="btn primary" />
-  </div>
+    class="btn btn-primary" />
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportconfig_course.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportconfig_course.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportconfig_course.pt	(revision 11254)
@@ -1,43 +1,46 @@
+<p class="alert alert-warning"  i18n:domain="waeup.kofa"
+   i18n:translate="student_export_warning">
+  <strong>NOTICE:</strong>
+  Student data exports are very computation intensive.
+  Depending on the filter selected and the portal traffic load, exports may take
+  longer than 15 minutes. You are advised to export data outside high-traffic
+  time periods.
+</p>
+
+<br />
+
 <form i18n:domain="waeup.kofa" method="POST">
   <label for="mode" i18n:translate="">
-    Exporter (Data Type):
+    Exporter (Data Type)
   </label>
-  <div class="input">
-    <select name="exporter">
-      <option tal:repeat="item view/exporters"
-              tal:attributes="value python:item[1]">
-        <span tal:replace="python: item[0]">Students</span>
-      </option>
-    </select>
-  </div>
+  <select name="exporter" class="form-control half">
+    <option tal:repeat="item view/exporters"
+            tal:attributes="value python:item[1]">
+      <span tal:replace="python: item[0]">Students</span>
+    </option>
+  </select>
   <br />
   <label for="session" i18n:translate="">
-    Level Session:
+    Level Session
   </label>
-  <div class="input">
-    <select name="session">
-      <option tal:repeat="item view/sessions"
-              tal:attributes="value python:item[1]">
-        <span tal:replace="python: item[0]">2012/2013</span>
-      </option>
-    </select>
-  </div>
+  <select name="session" class="form-control half">
+    <option tal:repeat="item view/sessions"
+            tal:attributes="value python:item[1]">
+      <span tal:replace="python: item[0]">2012/2013</span>
+    </option>
+  </select>
   <br />
   <label for="level" i18n:translate="">
-    Level:
+    Level
   </label>
-  <div class="input">
-    <select name="level">
-      <option tal:repeat="item view/levels"
-              tal:attributes="value python:item[1]">
-        <span tal:replace="python: item[0]">200</span>
-      </option>
-    </select>
-  </div>
+  <select name="level" class="form-control half">
+    <option tal:repeat="item view/levels"
+            tal:attributes="value python:item[1]">
+      <span tal:replace="python: item[0]">200</span>
+    </option>
+  </select>
   <br /><br />
-  <div class="input">
   <input type="submit" name="START"  i18n:translate=""
     value="Create CSV file"
-    class="btn primary" />
-  </div>
+    class="btn btn-primary" />
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportjobsindex.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportjobsindex.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportjobsindex.pt	(revision 11254)
@@ -1,3 +1,3 @@
-<table i18n:domain="waeup.kofa">
+<table i18n:domain="waeup.kofa" class="table table-condensed">
   <thead>
     <tr>
@@ -25,5 +25,5 @@
         <span tal:replace="job/creator">CREATOR</span>
       </td>
-      <td nowrap>
+      <td>
         <span tal:replace="job/start_time">DATETIME</span>
       </td>
@@ -32,11 +32,11 @@
       </td>
       <td nowrap>
-        <a href="" class="btn" i18n:translate=""
+        <a href="" class="btn btn-default" i18n:translate=""
            tal:condition="job/show_refresh_button">
-          <img tal:attributes="src static/actionicon_reload.png" />
+          <img src="/static/img/actionicon_reload.png" />
           Reload
         </a>
         <form method="POST">
-          <a href="" class="btn primary small"
+          <a href="" class="btn btn-primary btn-xs"
                  tal:attributes="href job/download_url"
                  tal:condition="job/show_download_button">
@@ -45,5 +45,5 @@
           <input type="hidden" name="job_id"
                  tal:attributes="value job/job" />
-          <input type="submit" class="btn small"
+          <input type="submit" class="btn btn-default btn-xs"
                  name="DISCARD" value="Discard"
                  tal:condition="job/show_discard_button" />
@@ -53,9 +53,7 @@
   </tbody>
 </table>
+
 <form method="POST" i18n:domain="waeup.kofa">
-  <div class="span12">
-
-  </div>
-  <input class="btn primary" type="submit" name="CREATE"
+  <input class="btn btn-primary" type="submit" name="CREATE"
          value="Configure new export"
           />
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/filterstudentspage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/filterstudentspage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/filterstudentspage.pt	(revision 11254)
@@ -2,25 +2,22 @@
   <br />
   <label for="session">
-    <span tal:replace="view/session_label">SESSION</span>:
+    <span tal:replace="view/session_label">SESSION</span>
   </label>
-  <div class="input">
-    <select name="session">
-      <span tal:repeat="item view/sessions" tal:omit-tag="">
-        <option
-            tal:define="name python: item[1];
-                        title python: item[0];
-                        selected python: view.session_default == name"
-            tal:attributes="value name; selected selected">
-          <span tal:replace="title">TITLE</span>
-        </option>
-      </span>
-    </select>
-  </div>
+  <select name="session" class="form-control half">
+    <span tal:repeat="item view/sessions" tal:omit-tag="">
+      <option
+          tal:define="name python: item[1];
+                      title python: item[0];
+                      selected python: view.session_default == name"
+          tal:attributes="value name; selected selected">
+        <span tal:replace="title">TITLE</span>
+      </option>
+    </span>
+  </select>
   <br />
   <label for="levels">
-    <span tal:replace="view/level_label">LEVEL</span>:
+    <span tal:replace="view/level_label">LEVEL</span>
   </label>
-  <div class="input">
-  <select name="level">
+  <select name="level" class="form-control half">
     <span tal:repeat="item view/levels" tal:omit-tag="">
       <option
@@ -33,12 +30,9 @@
     </span>
   </select>
-  </div>
   <br /><br />
-  <div class="input">
-    <input i18n:translate="" type="submit" class="btn primary"
-           name="SHOW" value="Show" />
-    <a class="btn secondary" href=""
-       tal:attributes="href view/parent_url">Cancel</a>
-  </div>
+  <input i18n:translate="" type="submit" class="btn btn-primary"
+         name="SHOW" value="Show" />
+  <a class="btn btn-default" href=""
+     tal:attributes="href view/parent_url">Cancel</a>
 
   <br /><br />
@@ -51,5 +45,5 @@
       <span tal:replace="view/level_string">LEVEL</span>
     </h3>
-    <table class="display dataTable">
+    <table class="kofa-data-table dataTable">
       <thead>
     	<tr>
@@ -65,5 +59,5 @@
       </thead>
       <tbody>
-    	<tr tal:repeat="item view/hitlist" class="gradeC">
+    	<tr tal:repeat="item view/hitlist">
     	  <td> <a tal:attributes="href item/url"
                 target="_blank">
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/imagedisplay.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/imagedisplay.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/imagedisplay.pt	(revision 11254)
@@ -4,5 +4,6 @@
   </td>
   <td>
-      <img height="125px" tal:attributes="src viewlet/download_name" />
+      <img height="125px"
+         tal:attributes="src python: view.url(context, viewlet.download_name)" />
       <br />
   </td>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/imageupload.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/imageupload.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/imageupload.pt	(revision 11254)
@@ -5,9 +5,9 @@
   <td>
     <img align="middle" height="125px"
-         tal:attributes="src viewlet/download_name" />
+         tal:attributes="src python: view.url(context, viewlet.download_name)" />
     <input type="submit" tal:condition="viewlet/file_exists"
      tal:attributes="id python:('delete_%s' % viewlet.input_name);
         name python:('delete_%s' % viewlet.input_name)"
-     value="Delete" class="btn error" />
+     value="Delete" class="btn btn-danger" />
     <br /><br />
     <input type="file" tal:attributes="name viewlet/input_name"/>
@@ -17,5 +17,5 @@
                 name python:('upload_%s' % viewlet.input_name);
                 value viewlet/upload_button"
-             value="Upload" class="btn primary" />
+             value="Upload" class="btn btn-primary" />
     <span i18n:translate="">
       Max. file size:
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/loginasstep2.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/loginasstep2.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/loginasstep2.pt	(revision 11254)
@@ -9,5 +9,5 @@
   <input type="hidden" name="form.login" tal:attributes="value view/context/student_id" />
   <input type="hidden" name="form.password"   tal:attributes="value view/password" />
-  <input class="btn primary" type="submit" name="SUBMIT"
+  <input class="btn btn-primary" type="submit" name="SUBMIT"
     tal:attributes="value view/login_button" />
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/mydatadropdowntabs.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/mydatadropdowntabs.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/mydatadropdowntabs.pt	(revision 11254)
@@ -1,5 +1,8 @@
-<li tal:attributes="class viewlet/active" data-dropdown="dropdown" >
+<li  tal:attributes="class viewlet/active">
   <a href="#" class="dropdown-toggle"
-    tal:content="viewlet/tab_title">Tab Title</a>
+     data-toggle="dropdown">
+     <span tal:replace="viewlet/tab_title">My Data</span>
+     <b class="caret"></b>
+  </a>
   <ul class="dropdown-menu">
     <li tal:repeat="target viewlet/targets">
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/onlinepaymentaddform.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/onlinepaymentaddform.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/onlinepaymentaddform.pt	(revision 11254)
@@ -8,5 +8,6 @@
         </td>
         <td>
-          <select id="form.p_category" name="form.p_category" size="1" >
+          <select id="form.p_category" name="form.p_category" size="1"
+                  class="form-control half">
             <option tal:repeat="item view/selectable_categories"
                     tal:attributes="value python:item[0]">
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/paymentsmanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/paymentsmanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/paymentsmanagepage.pt	(revision 11254)
@@ -2,5 +2,5 @@
       i18n:domain="waeup.kofa" enctype="multipart/form-data">
 
-  <table class="display dataTableManage">
+  <table class="kofa-data-table dataTableManage">
     <thead>
     <tr>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studycoursemanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studycoursemanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studycoursemanagepage.pt	(revision 11254)
@@ -2,15 +2,20 @@
       i18n:domain="waeup.kofa" enctype="multipart/form-data">
 
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1"><a href="#tab-1">
-      <span i18n:translate="">Study Course Data</span></a>
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+      <a href="#tab1" data-toggle="tab">
+        <span i18n:translate="">Study Course Data</span>
+      </a>
     </li>
-    <li tal:attributes="class view/tab2"><a href="#tab-2">
-      <span i18n:translate="">Study Levels</span></a>
+    <li t>
+      <a href="#tab2" data-toggle="tab">
+        <span i18n:translate="">Study Levels</span>
+      </a>
     </li>
   </ul>
 
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+    <div id="tab1" class="active tab-pane">
+      <br />
       <table class="form-table">
       <tbody>
@@ -27,7 +32,7 @@
     </div>
 
-    <div id="tab-2" tal:attributes="class view/tab2">
-      <h3 i18n:translate="">Study Levels (Course Lists)</h3>
-      <table class="display dataTableManage">
+    <div id="tab2" class="tab-pane">
+      <br />
+      <table class="kofa-data-table dataTableManage">
         <thead>
           <tr>
@@ -44,5 +49,5 @@
         		 tal:attributes="value cl/__name__" />
             </td>
-            <td> <a tal:attributes="href cl/__name__">
+            <td> <a tal:attributes="href python:view.url(cl)">
               <span tal:content="cl/level">CODE</span></a>
             </td>
@@ -62,26 +67,33 @@
       </div>
       <br /><br /><br />
-      <div>
+
+
+      <div class="form-inline">
         <span tal:condition="view/availableActions">
-          <span tal:repeat="action view/actions"
-                tal:omit-tag="">
-            <input tal:condition="python:action.label in view.tabthreeactions"
-                   tal:replace="structure action/render"/>
-          </span>
+          <div tal:repeat="action view/actions"
+              class="form-group">
+              <input tal:condition="python:action.label in view.tabthreeactions"
+                     tal:replace="structure action/render"/>
+          </div>
         </span>
-        <select id="addlevel" name="addlevel" class='span5'>
-          <option tal:attributes="value level/code" tal:repeat="level view/level_dicts">
-            <span tal:replace="level/title">LEVELTITLE
-          </span>
-          </option>
-        </select>
+        <div class="form-group">
+          <select id="addlevel" name="addlevel" class="form-control">
+            <option tal:attributes="value level/code" tal:repeat="level view/level_dicts">
+              <span tal:replace="level/title">LEVELTITLE
+            </span>
+            </option>
+          </select>
+        </div>
         &nbsp;&nbsp;<span i18n:translate="">in session</span>&nbsp;&nbsp;
-        <select id="level_session" name="level_session" class='span3'>
-          <option tal:attributes="value session/code" tal:repeat="session view/session_dicts">
-            <span tal:replace="session/title">LEVELSESSION
-          </span>
-          </option>
-        </select>
+        <div class="form-group">
+          <select id="level_session" name="level_session" class="form-control">
+            <option tal:attributes="value session/code" tal:repeat="session view/session_dicts">
+              <span tal:replace="session/title">LEVELSESSION
+            </span>
+            </option>
+          </select>
+        </div>
       </div>
+
     </div>
   </div>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studycoursepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studycoursepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studycoursepage.pt	(revision 11254)
@@ -64,5 +64,5 @@
 <h3 i18n:domain="waeup.kofa" i18n:translate="">Study Levels (Course Lists)</h3>
 
-<table i18n:domain="waeup.kofa">
+<table i18n:domain="waeup.kofa" class="table">
   <thead>
     <tr>
@@ -72,6 +72,6 @@
   </thead>
   <tbody>
-    <tr class="gradeC" tal:repeat="value context/values">
-      <td> <a tal:attributes="href value/__name__">
+    <tr tal:repeat="value context/values">
+      <td> <a tal:attributes="href python:view.url(value)">
       <span tal:content="value/level">CODE</span></a></td>
       <td tal:content="value/level_title">TITLE</td>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studyleveleditpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studyleveleditpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studyleveleditpage.pt	(revision 11254)
@@ -8,5 +8,5 @@
       tal:replace="view/context/total_credits">TOTAL</span>)
   </h3>
-  <table class="display dataTableManage">
+  <table class="kofa-data-table dataTableManage">
   <thead>
     <tr>
@@ -23,5 +23,5 @@
   </thead>
   <tbody>
-    <tr tal:repeat="value view/translated_values" class="gradeC">
+    <tr tal:repeat="value view/translated_values">
        <td>
         <input type="checkbox" name="val_id"
@@ -30,5 +30,5 @@
       </td>
       <td tal:content="value/semester" nowrap>TERM</td>
-      <td> <a tal:attributes="href value/__name__">
+      <td> <a tal:attributes="href value/url">
       <span tal:content="value/code">CODE</span>
       </a></td>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studylevelmanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studylevelmanagepage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studylevelmanagepage.pt	(revision 11254)
@@ -2,15 +2,20 @@
       i18n:domain="waeup.kofa" enctype="multipart/form-data">
 
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1"><a href="#tab-1">
-      <span i18n:translate="">Study Level Data</span></a>
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+      <a href="#tab1" data-toggle="tab">
+        <span i18n:translate="">Study Level Data</span>
+      </a>
     </li>
-    <li tal:attributes="class view/tab2"><a href="#tab-2">
-      <span i18n:translate="">Course Tickets</span>
-    </a></li>
+    <li>
+      <a href="#tab2" data-toggle="tab">
+        <span i18n:translate="">Course Tickets</span>
+      </a>
+    </li>
   </ul>
 
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+    <div id="tab1" class="active tab-pane">
+      <br />
       <table class="form-table">
       <tbody>
@@ -27,42 +32,42 @@
     </div>
 
-    <div id="tab-2" tal:attributes="class view/tab2">
-      <h3 i18n:translate="">Course Tickets</h3>
-      <table class="display dataTableManage">
-      <thead>
-        <tr>
-          <th>&nbsp;</th>
-          <th i18n:translate="">Term</th>
-          <th i18n:translate="">Code</th>
-          <th i18n:translate="">Title</th>
-          <th i18n:translate="">Dept.</th>
-          <th i18n:translate="">Fact.</th>
-          <th i18n:translate="">Cred.</th>
-          <th i18n:translate="">Requ.</th>
-          <th i18n:translate="">Score</th>
-          <th i18n:translate="">CO</th>
-          <th i18n:translate="">Auto</th>
-        </tr>
-      </thead>
-      <tbody>
-        <tr tal:repeat="value view/translated_values" class="gradeC">
-          <td>
-            <input type="checkbox" name="val_id"
-      		  tal:attributes="value value/__name__" />
-          </td>
-          <td tal:content="value/semester" nowrap>TERM</td>
-          <td> <a tal:attributes="href value/__name__">
-          <span tal:content="value/code">CODE</span>
-          </a></td>
-          <td tal:content="value/title">TITLE</td>
-          <td tal:content="value/dcode">DEPARTMENT</td>
-          <td tal:content="value/fcode">FACULTY</td>
-          <td tal:content="value/credits">CREDITS</td>
-          <td tal:content="value/mandatory">MANDATORY</td>
-          <td tal:content="value/score|nothing">SCORE</td>
-          <td tal:content="value/carry_over">CO</td>
-          <td tal:content="value/automatic">AUTO</td>
-        </tr>
-      </tbody>
+    <div id="tab2" class="tab-pane">
+      <br /><br />
+      <table class="kofa-data-table dataTableManage">
+        <thead>
+          <tr>
+            <th>&nbsp;</th>
+            <th i18n:translate="">Term</th>
+            <th i18n:translate="">Code</th>
+            <th i18n:translate="">Title</th>
+            <th i18n:translate="">Dept.</th>
+            <th i18n:translate="">Fact.</th>
+            <th i18n:translate="">Cred.</th>
+            <th i18n:translate="">Requ.</th>
+            <th i18n:translate="">Score</th>
+            <th i18n:translate="">CO</th>
+            <th i18n:translate="">Auto</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr tal:repeat="value view/translated_values">
+            <td>
+              <input type="checkbox" name="val_id"
+        		  tal:attributes="value value/__name__" />
+            </td>
+            <td tal:content="value/semester" nowrap>TERM</td>
+            <td> <a tal:attributes="href value/url">
+            <span tal:content="value/code">CODE</span>
+            </a></td>
+            <td tal:content="value/title">TITLE</td>
+            <td tal:content="value/dcode">DEPARTMENT</td>
+            <td tal:content="value/fcode">FACULTY</td>
+            <td tal:content="value/credits">CREDITS</td>
+            <td tal:content="value/mandatory">MANDATORY</td>
+            <td tal:content="value/score|nothing">SCORE</td>
+            <td tal:content="value/carry_over">CO</td>
+            <td tal:content="value/automatic">AUTO</td>
+          </tr>
+        </tbody>
       </table>
 
@@ -74,21 +79,17 @@
         </span>
       </div>
-
       <br /><br /><br />
-      <table class="input-table">
-        <tr>
-          <td>
-            <input class="btn primary" type="submit" name="ADD"
+      <div class="form-inline">
+        <div class="form-group">
+            <input class="btn btn-primary" type="submit" name="ADD"
                    i18n:translate=""
                    value="Add course ticket" />
-          </td>
-          <td>
-            <input type="text" name="course" />
-            <div class="hint" i18n:translate="">
-                Enter valid course code.
-            </div>
-          </td>
-        </tr>
-      </table>
+        </div>
+        <div class="form-group">
+            <input type="text" name="course" class="form-control"
+                   tal:attributes="placeholder view/placeholder" />
+        </div>
+      </div>
+      <br />
       <p i18n:translate="">
         You don't know the course code? Then select a course
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studylevelpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studylevelpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studylevelpage.pt	(revision 11254)
@@ -1,5 +1,3 @@
 <table class="form-table" i18n:domain="waeup.kofa">
-  <thead>
-  </thead>
   <tbody>
     <tal:block repeat="widget view/widgets">
@@ -20,5 +18,5 @@
 <h3 i18n:domain="waeup.kofa" i18n:translate="">Course Tickets</h3>
 
-<table class="display dataTable" i18n:domain="waeup.kofa">
+<table class="kofa-data-table dataTable" i18n:domain="waeup.kofa">
   <thead>
     <tr>
@@ -37,7 +35,7 @@
   </thead>
   <tbody>
-    <tr tal:repeat="value view/translated_values" class="gradeC">
+    <tr tal:repeat="value view/translated_values">
       <td tal:content="value/semester" nowrap>TERM</td>
-      <td> <a tal:attributes="href value/__name__">
+      <td> <a tal:attributes="href value/url">
       <span tal:content="value/code">CODE</span>
       </a></td>
@@ -55,5 +53,4 @@
 </table>
 
-
 <div i18n:domain="waeup.kofa"
   tal:condition="python: not len(context.keys())" i18n:translate="">
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/transcript.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/transcript.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/transcript.pt	(revision 11254)
@@ -45,5 +45,5 @@
       <tal:semesters tal:repeat="semester_tickets python:(level['tickets_1'],
                                       level['tickets_2'], level['tickets_3'])">
-      <tr tal:repeat="ticket semester_tickets" class="gradeC">
+      <tr tal:repeat="ticket semester_tickets">
         <td tal:content="python: view.level_dict[ticket.level]">LEVEL</td>
         <td tal:content="python: view.session_dict[ticket.level_session]">SESSION</td>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/transcriptprocess.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/transcriptprocess.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/transcriptprocess.pt	(revision 11254)
@@ -1,13 +1,19 @@
 <form method="POST" i18n:domain="waeup.kofa">
 
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1"><a href="#tab-1">
-    <span i18n:translate="">Process request</span></a></li>
-    <li tal:attributes="class view/tab2"><a href="#tab-2">
-    <span i18n:translate="">View correspondence</span></a></li>
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+      <a href="#tab1" data-toggle="tab">
+        <span i18n:translate="">Process request</span>
+      </a>
+    </li>
+    <li>
+      <a href="#tab2" data-toggle="tab">
+        <span i18n:translate="">View correspondence</span>
+      </a>
+    </li>
   </ul>
 
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+    <div id="tab1" class="active tab-pane">
 
       <table class="form-table">
@@ -32,5 +38,5 @@
     </div>
 
-    <div id="tab-2" tal:attributes="class view/tab2">
+    <div id="tab2" class="tab-pane">
       <p tal:content="structure view/correspondence"></p>
     </div>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/transcriptrequest.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/transcriptrequest.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/transcriptrequest.pt	(revision 11254)
@@ -1,13 +1,18 @@
 <form method="POST" i18n:domain="waeup.kofa">
 
-  <ul class="tabs" data-tabs="tabs">
-    <li tal:attributes="class view/tab1"><a href="#tab-1">
-    <span i18n:translate="">Send new request</span></a></li>
-    <li tal:attributes="class view/tab2"><a href="#tab-2">
-    <span i18n:translate="">View correspondence</span></a></li>
+  <ul class="tabs nav nav-tabs" data-tabs="tabs">
+    <li class="active">
+      <a href="#tab1" data-toggle="tab">
+        <span i18n:translate="">Send new request</span>
+      </a></li>
+    <li>
+      <a href="#tab2" data-toggle="tab">
+        <span i18n:translate="">View correspondence</span>
+      </a>
+    </li>
   </ul>
 
   <div class="tab-content">
-    <div id="tab-1" tal:attributes="class view/tab1">
+    <div id="tab1" class="active tab-pane">
 
       <p i18n:translate="transcript_request"></p>
@@ -65,5 +70,5 @@
     </div>
 
-    <div id="tab-2"  tal:attributes="class view/tab2">
+    <div id="tab2" class="tab-pane">
       <p tal:content="structure view/correspondence"></p>
     </div>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/trigtrans.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/trigtrans.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/trigtrans.pt	(revision 11254)
@@ -4,5 +4,5 @@
 
 
-    <select id="transition" name="transition">
+    <select id="transition" name="transition" class="form-control half">
       <option tal:repeat="transition view/getTransitions"
               tal:attributes="value transition/name">
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/dynamicroles.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/dynamicroles.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/dynamicroles.py	(revision 11254)
@@ -79,5 +79,5 @@
                     # Found a Course Adviser role in external attribute or parent
                     # thereof. We need a special treatment for Course Advisers.
-                    if str(100*(current_level/100)) in role_id:
+                    if current_level and str(100*(current_level/100)) in role_id:
                         # Grant additional role, which allows to validate or reject
                         # course lists, only if external role corresponds
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/reports/browser_templates/levelreportgeneratorpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/reports/browser_templates/levelreportgeneratorpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/reports/browser_templates/levelreportgeneratorpage.pt	(revision 11254)
@@ -7,59 +7,42 @@
   </p>
   <br />
-  <div class="clearfix">
-    <label for="session" i18n:translate="">Department:</label>
-    <div class="input">
-      <select name="faccode_depcode">
-        <span tal:repeat="items view/faccode_depcodes" tal:omit-tag="">
-          <option
-              tal:define="name python: items[1]; title python: items[0]"
-              tal:attributes="value name">
-            <span tal:replace="title">TITLE</span>
-          </option>
-        </span>
-      </select>
-      <div class="help-inline" i18n:translate="">
-        Set department filter.
-      </div>
-    </div>
-    <br />
-    <label for="session">Academic Session:</label>
-    <div class="input">
-      <select name="session" i18n:translate="">
-        <span tal:repeat="items view/sessions" tal:omit-tag="">
-          <option
-              tal:define="name python: items[1]; title python: items[0]"
-              tal:attributes="value name">
-            <span tal:replace="title">TITLE</span>
-          </option>
-        </span>
-      </select>
-      <div class="help-inline" i18n:translate="">
-        Select academic session to report.
-      </div>
-    </div>
-    <br />
-    <label for="session">Level:</label>
-    <div class="input">
-      <select name="level" i18n:translate="">
-        <span tal:repeat="items view/levels" tal:omit-tag="">
-          <option
-              tal:define="name python: items[1]; title python: items[0]"
-              tal:attributes="value name">
-            <span tal:replace="title">TITLE</span>
-          </option>
-        </span>
-      </select>
-      <div class="help-inline" i18n:translate="">
-        Select level to report.
-      </div>
-    </div>
-
+  <label for="session" i18n:translate="">Department</label>
+  <select name="faccode_depcode" class="form-control half">
+    <span tal:repeat="items view/faccode_depcodes" tal:omit-tag="">
+      <option
+          tal:define="name python: items[1]; title python: items[0]"
+          tal:attributes="value name">
+        <span tal:replace="title">TITLE</span>
+      </option>
+    </span>
+  </select>
+  <br />
+  <label for="session">Academic Session</label>
+  <div class="input">
+    <select name="session" i18n:translate="" class="form-control half">
+      <span tal:repeat="items view/sessions" tal:omit-tag="">
+        <option
+            tal:define="name python: items[1]; title python: items[0]"
+            tal:attributes="value name">
+          <span tal:replace="title">TITLE</span>
+        </option>
+      </span>
+    </select>
   </div>
-  <div class="input">
-    <input i18n:translate="" type="submit" class="btn primary"
-           name="CREATE" value="Create" />
-    <a class="btn secondary" href=""
-       tal:attributes="href view/parent_url">Cancel</a>
-  </div>
+  <br />
+  <label for="session">Level</label>
+  <select name="level" i18n:translate="" class="form-control half">
+    <span tal:repeat="items view/levels" tal:omit-tag="">
+      <option
+          tal:define="name python: items[1]; title python: items[0]"
+          tal:attributes="value name">
+        <span tal:replace="title">TITLE</span>
+      </option>
+    </span>
+  </select>
+  <br />
+  <input i18n:translate="" type="submit" class="btn btn-primary"
+         name="CREATE" value="Create" />
+  <a class="btn btn-default" href=""
+     tal:attributes="href view/parent_url">Cancel</a>
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/reports/browser_templates/studentstatisticsreportgeneratorpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/reports/browser_templates/studentstatisticsreportgeneratorpage.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/reports/browser_templates/studentstatisticsreportgeneratorpage.pt	(revision 11254)
@@ -7,43 +7,29 @@
   </p>
   <br />
-  <div class="clearfix">
-    <label for="session" i18n:translate="">Study Modes Group:</label>
-    <div class="input">
-      <select name="mode">
-        <span tal:repeat="items view/modes" tal:omit-tag="">
-          <option
-              tal:define="name python: items[1]; title python: items[0]"
-              tal:attributes="value name">
-            <span tal:replace="title">TITLE</span>
-          </option>
-        </span>
-      </select>
-      <div class="help-inline" i18n:translate="">
-        Set study modes filter.
-      </div>
-    </div>
-    <br />
-    <label for="session">Academic Session:</label>
-    <div class="input">
-      <select name="session" i18n:translate="">
-        <span tal:repeat="items view/sessions" tal:omit-tag="">
-          <option
-              tal:define="name python: items[1]; title python: items[0]"
-              tal:attributes="value name">
-            <span tal:replace="title">TITLE</span>
-          </option>
-        </span>
-      </select>
-      <div class="help-inline" i18n:translate="">
-        Select academic session to report.
-      </div>
-    </div>
-
-  </div>
-  <div class="input">
-    <input i18n:translate="" type="submit" class="btn primary"
-           name="CREATE" value="Create" />
-    <a class="btn secondary" href=""
-       tal:attributes="href view/parent_url">Cancel</a>
-  </div>
+  <label for="session" i18n:translate="">Study Modes Group</label>
+    <select name="mode" class="form-control half">
+      <span tal:repeat="items view/modes" tal:omit-tag="">
+        <option
+            tal:define="name python: items[1]; title python: items[0]"
+            tal:attributes="value name">
+          <span tal:replace="title">TITLE</span>
+        </option>
+      </span>
+    </select>
+  <br />
+  <label for="session">Academic Session</label>
+  <select name="session" i18n:translate="" class="form-control half">
+    <span tal:repeat="items view/sessions" tal:omit-tag="">
+      <option
+          tal:define="name python: items[1]; title python: items[0]"
+          tal:attributes="value name">
+        <span tal:replace="title">TITLE</span>
+      </option>
+    </span>
+  </select>
+  <br />
+  <input i18n:translate="" type="submit" class="btn btn-primary"
+         name="CREATE" value="Create" />
+  <a class="btn btn-default" href=""
+     tal:attributes="href view/parent_url">Cancel</a>
 </form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/reports/level_report.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/reports/level_report.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/reports/level_report.py	(revision 11254)
@@ -208,4 +208,5 @@
 from waeup.kofa.interfaces import academic_sessions_vocab
 from waeup.kofa.reports import get_generators
+from waeup.kofa.browser.breadcrumbs import Breadcrumb
 grok.templatedir('browser_templates')
 class LevelReportGeneratorPage(KofaPage):
@@ -291,2 +292,8 @@
             self.context.creation_dt_string)
 
+class LevelReportBreadcrumb(Breadcrumb):
+    """A breadcrumb for reports.
+    """
+    grok.context(LevelReportGenerator)
+    title = _(u'Level Report')
+    target = None
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/reports/session_results_presentation.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/reports/session_results_presentation.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/reports/session_results_presentation.py	(revision 11254)
@@ -198,4 +198,5 @@
 from waeup.kofa.interfaces import academic_sessions_vocab
 from waeup.kofa.reports import get_generators
+from waeup.kofa.browser.breadcrumbs import Breadcrumb
 grok.templatedir('browser_templates')
 class SessionResultsPresentationGeneratorPage(LevelReportGeneratorPage):
@@ -230,2 +231,9 @@
             self.context.sessioncode, self.context.levelcode,
             self.context.creation_dt_string)
+
+class SessionResultsPresentationBreadcrumb(Breadcrumb):
+    """A breadcrumb for reports.
+    """
+    grok.context(SessionResultsPresentationGenerator)
+    title = _(u'Session Results Presentation')
+    target = None
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/reports/student_statistics.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/reports/student_statistics.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/reports/student_statistics.py	(revision 11254)
@@ -168,4 +168,5 @@
 from waeup.kofa.interfaces import academic_sessions_vocab
 from waeup.kofa.reports import get_generators
+from waeup.kofa.browser.breadcrumbs import Breadcrumb
 grok.templatedir('browser_templates')
 class StudentStatisticsReportGeneratorPage(KofaPage):
@@ -240,2 +241,9 @@
             ob_class, self.context.__name__, filename))
         return pdf_stream
+
+class StudentStatsBreadcrumb(Breadcrumb):
+    """A breadcrumb for reports.
+    """
+    grok.context(StudentStatisticsReportGenerator)
+    title = _(u'Student Statistics')
+    target = None
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 11254)
@@ -613,5 +613,5 @@
         # There is a correct <img> link included
         self.assertTrue(
-            '<a target="image" href="birth_certificate">'
+            'href="http://localhost/app/students/K1000000/birth_certificate"'
             in self.browser.contents)
         # Browsing the link shows a real image
@@ -673,5 +673,5 @@
             name='upload_passportuploadmanage').click()
         self.assertTrue(
-            '<img align="middle" height="125px" src="passport.jpg" />'
+            'src="http://localhost/app/students/K1000000/passport.jpg"'
             in self.browser.contents)
         # We remove the passport file again
@@ -1958,5 +1958,8 @@
         # We are logged in as student and can see the 'My Data' tab
         self.assertMatches(
-            '...<a href="#" class="dropdown-toggle">My Data</a>...',
+            '...<a href="#" class="dropdown-toggle" data-toggle="dropdown">...',
+            self.browser.contents)
+        self.assertMatches(
+            '...My Data...',
             self.browser.contents)
         self.browser.getLink("Logout").click()
@@ -2198,5 +2201,5 @@
         self.browser.getControl("Login").click()
         self.assertMatches(
-            '...<div class="alert-message warning">'
+            '...<div class="alert alert-warning">'
             'Your account has been deactivated.</div>...', self.browser.contents)
         # If suspended_comment is set this message will be flashed instead
@@ -2206,5 +2209,5 @@
         self.browser.getControl("Login").click()
         self.assertMatches(
-            '...<div class="alert-message warning">Aetsch baetsch!</div>...',
+            '...<div class="alert alert-warning">Aetsch baetsch!</div>...',
             self.browser.contents)
         self.student.suspended = False
@@ -2265,5 +2268,5 @@
             name='upload_passportuploadedit').click()
         self.assertTrue(
-            '<img align="middle" height="125px" src="passport.jpg" />'
+            'src="http://localhost/app/students/K1000000/passport.jpg"'
             in self.browser.contents)
         # Students can open admission letter
@@ -2323,5 +2326,5 @@
             name='upload_birthcertificateupload').click()
         self.assertTrue(
-            '<a target="image" href="birth_certificate">Birth Certificate Scan</a>'
+            'href="http://localhost/app/students/K1000000/birth_certificate"'
             in self.browser.contents)
         # Students can open clearance slip
@@ -2358,4 +2361,9 @@
         # Now students can add the current study level
         self.browser.getLink("Study Course").click()
+        self.student['studycourse'].current_level = None
+        self.browser.getLink("Add course list").click()
+        self.assertMatches('...Your data are incomplete...',
+                           self.browser.contents)
+        self.student['studycourse'].current_level = 100
         self.browser.getLink("Add course list").click()
         self.assertMatches('...Add current level 100 (Year 1)...',
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 11254)
@@ -825,5 +825,5 @@
     size = file_size(upload)
     if size > max_size:
-        view.flash(_('Uploaded file is too big.'))
+        view.flash(_('Uploaded file is too big.'), type="danger")
         return False
     upload.seek(0) # file pointer moved when determining size
@@ -831,5 +831,5 @@
     upload.seek(0) # same here
     if file_format is None:
-        view.flash(_('Could not determine file type.'))
+        view.flash(_('Could not determine file type.'), type="danger")
         return False
     basename, expected_ext = os.path.splitext(download_name)
@@ -837,5 +837,5 @@
         if '.' + file_format != expected_ext:
             view.flash(_('${a} file extension expected.',
-                mapping = {'a':expected_ext[1:]}))
+                mapping = {'a':expected_ext[1:]}), type="danger")
             return False
     else:
@@ -843,5 +843,6 @@
             view.flash(
                 _('Only the following extensions are allowed: ${a}',
-                mapping = {'a':', '.join(ALLOWED_FILE_EXTENSIONS)}))
+                mapping = {'a':', '.join(ALLOWED_FILE_EXTENSIONS)}),
+                type="danger")
             return False
         download_name += '.' + file_format
@@ -891,5 +892,5 @@
     template = default_fileupload_template
     grok.require('waeup.uploadStudentFile')
-    tab_redirect = '?tab2'
+    tab_redirect = '#tab2-top'
     mus = 1024 * 150
     upload_button =_('Upload new file')
@@ -931,5 +932,5 @@
                         self.context, self.view.__name__) + self.tab_redirect)
             else:
-                self.view.flash(_('No local file selected.'))
+                self.view.flash(_('No local file selected.'), type="danger")
                 self.view.redirect(
                     self.view.url(
@@ -959,5 +960,5 @@
     mus = 1024 * 50
     download_name = u'passport.jpg'
-    tab_redirect = '?tab2'
+    tab_redirect = '#tab2'
 
 class PassportUploadEdit(PassportUploadManage):
@@ -986,5 +987,5 @@
     mus = 1024 * 150
     download_name = u'birth_certificate'
-    tab_redirect = '?tab2'
+    tab_redirect = '#tab2-top'
 
 class Image(grok.View):
Index: main/waeup.kofa/trunk/src/waeup/kofa/widgets/phonewidget.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/widgets/phonewidget.py	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/widgets/phonewidget.py	(revision 11254)
@@ -37,5 +37,5 @@
 
     subwidget_names = ('country', 'area', 'ext')
-    bootstrap_span = 'span2'
+    cssClass = 'phone-input'
 
     def _renderPrefixWidget(self, value):
@@ -51,7 +51,8 @@
                 '<option value="%s"%s>%s</option>' % (pval, selected, ptitle))
         options = '\n'.join(options)
-        return '<select id="%s" name="%s" size="1" class="span4">\n%s\n</select>' % (
+        return '<select id="%s" name="%s" size="1" class="%s">\n%s\n</select>' % (
             '%s.%s' % (self.name, 'country'),
             '%s.%s' % (self.name, 'country'),
+            self.cssClass,
             options)
 
@@ -83,6 +84,5 @@
             kwargs.update(name = '%s.%s' % (self.name, subname))
             kwargs.update(id=kwargs['name'])
-            # kwargs.update(cssClass = '%s %s' % (self.cssClass, 'span1'))
-            kwargs.update(cssClass = '%s %s' % ('', self.bootstrap_span))
+            kwargs.update(cssClass = '%s %s' % ('', self.cssClass))
             kwargs.update(value = subvalues[num])
             fields.append(renderElement(self.tag, **kwargs))
Index: main/waeup.kofa/trunk/src/waeup/kofa/widgets/sequencewidget.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/widgets/sequencewidget.pt	(revision 11253)
+++ main/waeup.kofa/trunk/src/waeup/kofa/widgets/sequencewidget.pt	(revision 11254)
@@ -1,4 +1,3 @@
-<table border="0" class="sequencewidget"
-  i18n:domain="waeup.kofa">
+<table i18n:domain="waeup.kofa">
   <tr tal:repeat="widget view/widgets">
     <td>
@@ -19,14 +18,13 @@
       Don't forget to save the form after adding or deleting items.
       </p>
-      <input type="submit" value="Remove selected items"
-             class="btn"
+      <button type="submit"
+             class="btn btn-default"
+             tal:condition="view/need_add"
+             tal:attributes="name string:${view/name}.add"
+             tal:content="view/addButtonLabel" />
+      <button type="submit" class="btn btn-default"
              tal:condition="view/need_delete"
              tal:attributes="name string:${view/name}.remove"
-             i18n:attributes="value remove-selected-items" />
-      <input type="submit" value="Add foo"
-             class="btn"
-             tal:condition="view/need_add"
-             tal:attributes="name string:${view/name}.add;
-                             value view/addButtonLabel" />
+             i18n:translate="remove-selected-items">Remove selected items</button>
     </td>
   </tr>
