[Mapbender-commits] r4900 - in trunk/mapbender/http/extensions: . dataTables-1.5 dataTables-1.5/examples dataTables-1.5/examples/advanced_init dataTables-1.5/examples/api dataTables-1.5/examples/basic_init dataTables-1.5/examples/data_sources dataTables-1.5/examples/examples_support dataTables-1.5/examples/examples_support/themes dataTables-1.5/examples/examples_support/themes/smoothness dataTables-1.5/examples/examples_support/themes/smoothness/images dataTables-1.5/examples/examples_support/themes/ui-lightness dataTables-1.5/examples/examples_support/themes/ui-lightness/images dataTables-1.5/examples/server_side dataTables-1.5/extras dataTables-1.5/extras/FixedHeader dataTables-1.5/extras/TableTools dataTables-1.5/extras/TableTools/media dataTables-1.5/extras/TableTools/media/ZeroClipboard dataTables-1.5/extras/TableTools/media/css dataTables-1.5/extras/TableTools/media/images dataTables-1.5/extras/TableTools/media/js dataTables-1.5/extras/TableTools/media/support dataTables-1.5/extras/TableTools/media/swf dataTables-1.5/media dataTables-1.5/media/css dataTables-1.5/media/images dataTables-1.5/media/js dataTables-1.5/media/unit_testing dataTables-1.5/media/unit_testing/templates dataTables-1.5/media/unit_testing/tests dataTables-1.5/media/unit_testing/tests/1_dom dataTables-1.5/media/unit_testing/tests_onhold dataTables-1.5/media/unit_testing/tests_onhold/1_dom dataTables-1.5/media/unit_testing/tests_onhold/2_js dataTables-1.5/media/unit_testing/tests_onhold/3_ajax dataTables-1.5/media/unit_testing/tests_onhold/4_server-side

svn_mapbender at osgeo.org svn_mapbender at osgeo.org
Tue Nov 3 04:52:26 EST 2009


Author: christoph
Date: 2009-11-03 04:52:24 -0500 (Tue, 03 Nov 2009)
New Revision: 4900

Added:
   trunk/mapbender/http/extensions/dataTables-1.5/
   trunk/mapbender/http/extensions/dataTables-1.5/Readme.txt
   trunk/mapbender/http/extensions/dataTables-1.5/examples/
   trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/
   trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/column_render.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/complex_header.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/events_post_init.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/events_pre_init.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/footer_callback.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/html_sort.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/language_file.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/row_callback.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/row_grouping.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/sorting_control.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/add_row.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/counter_column.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/dom_sort.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/editable.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/form.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/highlight.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/multi_filter.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/paging_plugin.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/plugin_api.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/range_filtering.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/regex.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/row_details.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/select_row.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/select_single_row.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/show_hide.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/api/sorting_plugin.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/
   trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/alt_pagination.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/dom.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/filter_only.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/hidden_columns.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/language.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/multi_col_sort.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/multiple_tables.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/state_save.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/table_sorting.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/themes.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/zero_config.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/
   trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/ajax.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/dom.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/js_array.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/server_side.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/data.sql
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/de_DE.txt
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/details_close.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/details_open.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/editable_ajax.php
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/index.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.dimensions.js
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.jeditable.js
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.tooltip.css
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.tooltip.js
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/json_source.txt
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/json_source2.txt
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing.php
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_details_col.php
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_filter_col.php
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_id.php
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_ordering.php
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_post.php
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_222222_256x240.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_2e83ff_256x240.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_454545_256x240.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_888888_256x240.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_cd0a0a_256x240.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/jquery-ui-1.7.2.custom.css
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_222222_256x240.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_228ef1_256x240.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_ef8c08_256x240.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_ffd27a_256x240.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_ffffff_256x240.png
   trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/jquery-ui-1.7.2.custom.css
   trunk/mapbender/http/extensions/dataTables-1.5/examples/index.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/
   trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/column_ordering.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/custom_vars.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/editable.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/pipeline.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/post.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/row_details.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/select_rows.html
   trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/server_side.html
   trunk/mapbender/http/extensions/dataTables-1.5/extras/
   trunk/mapbender/http/extensions/dataTables-1.5/extras/FixedHeader/
   trunk/mapbender/http/extensions/dataTables-1.5/extras/FixedHeader/FixedHeader.js
   trunk/mapbender/http/extensions/dataTables-1.5/extras/FixedHeader/index.html
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/index.html
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/ZeroClipboard/
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/ZeroClipboard/ZeroClipboard.as
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/ZeroClipboard/ZeroClipboard.fla
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/ZeroClipboard/ZeroClipboard.js
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/css/
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/css/TableTools.css
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/copy document.psd
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/copy.png
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/copy_hover.png
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/csv.png
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/csv_hover.png
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/file_types.psd
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/print.png
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/print_hover.png
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/printer.psd
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/xls.png
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/xls_hover.png
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/js/
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/js/TableTools.js
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/js/TableTools.js.zip
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/jquery.dataTables.min.js
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/jquery.jeditable.js
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/jquery.js
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/swf/
   trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/swf/ZeroClipboard.swf
   trunk/mapbender/http/extensions/dataTables-1.5/license-bsd.txt
   trunk/mapbender/http/extensions/dataTables-1.5/license-gpl2.txt
   trunk/mapbender/http/extensions/dataTables-1.5/media/
   trunk/mapbender/http/extensions/dataTables-1.5/media/css/
   trunk/mapbender/http/extensions/dataTables-1.5/media/css/demo_page.css
   trunk/mapbender/http/extensions/dataTables-1.5/media/css/demo_table.css
   trunk/mapbender/http/extensions/dataTables-1.5/media/css/demo_table_jui.css
   trunk/mapbender/http/extensions/dataTables-1.5/media/images/
   trunk/mapbender/http/extensions/dataTables-1.5/media/images/back_disabled.jpg
   trunk/mapbender/http/extensions/dataTables-1.5/media/images/back_enabled.jpg
   trunk/mapbender/http/extensions/dataTables-1.5/media/images/forward_disabled.jpg
   trunk/mapbender/http/extensions/dataTables-1.5/media/images/forward_enabled.jpg
   trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_asc.jpg
   trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_asc_disabled.jpg
   trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_both.jpg
   trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_desc.jpg
   trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_desc_disabled.jpg
   trunk/mapbender/http/extensions/dataTables-1.5/media/js/
   trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.dataTables.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.dataTables.min.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.dataTables.min.js.gz
   trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/controller.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/controller.php
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/index.html
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/dom_data.php
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/empty_table.php
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/js_data.php
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests/
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests/1_dom/
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests/1_dom/_zero_config.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aaSorting.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aaSortingFixed.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bSearchable.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bSortable.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bUseRendered.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bVisible.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.fnRender.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.iDataSort.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sClass.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sName.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sTitle.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sWidth.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoSearchCols.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/asStripClasses.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bAutoWidth.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bFilter.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bInfo.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bLengthChange.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bPaginate.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bProcessing.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bServerSide.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bSort.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bSortClasses.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnDrawCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnFooterCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnHeaderCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnInitComplete.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnRowCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnServerData.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/iDisplayLength.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.oPaginate.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sInfo.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sInfoEmpty.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sInfoPostFix.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sLengthMenu.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sProcessing.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sSearch.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sUrl.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sZeroRecords.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oSearch.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/sAjaxSource.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/sDom.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/sPaginationType.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/_zero_config.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aaSorting.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aaSortingFixed.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bSearchable.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bSortable.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bUseRendered.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bVisible.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.fnRender.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.iDataSort.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sClass.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sName.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sTitle.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sWidth.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoSearchCols.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/asStripClasses.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bAutoWidth.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bFilter.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bInfo.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bLengthChange.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bPaginate.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bProcessing.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bServerSide.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bSort.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bSortClasses.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnDrawCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnFooterCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnHeaderCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnInitComplete.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnRowCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnServerData.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/iDisplayLength.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.oPaginate.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sInfo.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sInfoEmpty.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sInfoPostFix.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sLengthMenu.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sProcessing.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sSearch.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sUrl.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sZeroRecords.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oSearch.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/sAjaxSource.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/sDom.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/sPaginationType.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/_zero_config.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aaSorting.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aaSortingFixed.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bSearchable.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bSortable.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bUseRendered.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bVisible.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.fnRender.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.iDataSort.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sClass.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sName.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sTitle.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sWidth.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoSearchCols.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/asStripClasses.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bAutoWidth.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bFilter.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bInfo.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bLengthChange.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bPaginate.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bProcessing.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bServerSide.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bSort.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bSortClasses.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnDrawCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnHeaderCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnInitComplete.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnRowCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnServerData.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/iDisplayLength.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.oPaginate.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sInfo.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sInfoEmpty.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sInfoPostFix.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sLengthMenu.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sProcessing.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sSearch.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sUrl.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sZeroRecords.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oSearch.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/sAjaxSource.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/sDom.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/sPaginationType.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/_zero_config.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aaSorting.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aaSortingFixed.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bSearchable.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bSortable.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bUseRendered.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bVisible.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.fnRender.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sClass.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sName.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sTitle.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sWidth.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoSearchCols.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/asStripClasses.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bAutoWidth.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bFilter.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bInfo.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bLengthChange.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bPaginate.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bProcessing.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bServerSide.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bSort.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bSortClasses.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnDrawCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnHeaderCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnInitComplete.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnRowCallback.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnServerData.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/iDisplayLength.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.oPaginate.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sInfo.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sInfoEmpty.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sInfoPostFix.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sLengthMenu.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sProcessing.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sSearch.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sUrl.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sZeroRecords.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oSearch.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/sAjaxSource.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/sDom.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/sPaginationType.js
   trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/unit_test.js
Log:


Added: trunk/mapbender/http/extensions/dataTables-1.5/Readme.txt
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/Readme.txt	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/Readme.txt	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,11 @@
+This DataTables plugin (v1.5.x) for jQuery was developed out of the desire to allow highly configurable access to HTML tables with advanced access features.
+
+For detailed installation, usage and API instructions, please refer to the DataTables web-pages: http://www.datatables.net
+
+Questions, feature requests and bug reports (etc) can all be asked on the DataTables forums: http://www.datatables.net/forums/
+
+The DataTables source can be found in the media/js/ directory of this archive.
+
+DataTables is released with dual licensing, using the GPL v2 (license-gpl2.txt) and an BSD style license (license-bsd.txt). Please see the corresponding license file for details of these licenses. You are free to use, modify and distribute this software, but all copyright information must remain.
+
+If you discover any bugs in DataTables, have any suggestions for improvements or even if you just like using it, please free to get in touch with me: www.sprymedia.co.uk/contact
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/column_render.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/column_render.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/column_render.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,560 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"aoColumns": [ 
+						/* Engine */   { "fnRender": function ( oObj ) {
+							return oObj.aData[0] +' '+ oObj.aData[3];
+						} },
+						/* Browser */  null,
+						/* Platform */ null,
+						/* Version */  { "bVisible": false },
+						/* Grade */    { "sClass": "center" }
+					] } );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> with column rendering
+			</div>
+
+			<h1>Preamble</h1>
+			<p>You may specify a function for each column to render the available data in a specific manner which will be called when the table is drawn. In this example I've appended the rendering engine version to the rendering engine name in the first column, and hidden the version column.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"aoColumns": [ 
+			/* Engine */   { "fnRender": function ( oObj ) {
+				return oObj.aData[0] +' '+ oObj.aData[3];
+			} },
+			/* Browser */  null,
+			/* Platform */ null,
+			/* Version */  { "bVisible": false },
+			/* Grade */    { "sClass": "center" }
+		] } );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/complex_header.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/complex_header.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/complex_header.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,565 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+			.bt { border-top: 1px solid black; }
+			.br { border-right: 1px solid black; }
+			.bb { border-bottom: 1px solid black; }
+			.bl { border-left: 1px solid black; }
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable();
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> complex header example (row and colspans)
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>When using tables to display data, you will often wish to display column information in groups. DataTables fully supports colspan and rowspans in the header, assigning the required sorting listeners to the TH element suitable for that column. Each column must have one TH cell (and only one) which is unique to it for the listeners to be added. The example shown below has the core browser information grouped together.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th rowspan="2" class="bl bt">Rendering engine</th>
+			<th colspan="3" class="bl br bt">Browser details</th>
+			<th rowspan="2" class="br bt">CSS grade</th>
+		</tr>
+		<tr>
+			<th class="bl">Browser</th>
+			<th>Platform(s)</th>
+			<th class="br">Engine version</th>
+		</tr>
+		<!--
+		<tr>
+			<th rowspan="2">Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th rowspan="2">CSS grade</th>
+		</tr>
+		<tr>
+			<th colspan="3">Browser details</th>
+		</tr>
+		-->
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable();
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.
+				</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/events_post_init.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/events_post_init.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/events_post_init.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,617 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+			@import "../examples_support/jquery.tooltip.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" language="javascript" src="../examples_support/jquery.dimensions.js"></script>
+		<script type="text/javascript" language="javascript" src="../examples_support/jquery.tooltip.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var oTable;
+			
+			$(document).ready(function() {
+				/*
+				 * First step is to create title attributes for the rows in the table
+				 * This isn't needed if the required 'title' attribute is already set in the HTML in the
+				 * DOM 
+				 */
+				$('#example tbody tr').each( function() {
+					var sTitle;
+					var nTds = $('td', this);
+					var sBrowser = $(nTds[1]).text();
+					var sGrade = $(nTds[4]).text();
+					
+					if ( sGrade == "A" )
+						sTitle =  sBrowser+' will provide a first class (A) level of CSS support.';
+					else if ( sGrade == "C" )
+						sTitle = sBrowser+' will provide a core (C) level of CSS support.';
+					else if ( sGrade == "X" )
+						sTitle = sBrowser+' does not provide CSS support or has a broken implementation. Block CSS.';
+					else
+						sTitle = sBrowser+' will provide an undefined level of CSS support.';
+					
+					this.setAttribute( 'title', sTitle );
+				} );
+				
+				/* Init DataTables */
+				oTable = $('#example').dataTable();
+				
+				/* Apply the tooltips */
+				$( oTable.fnGetNodes() ).tooltip( {
+					"delay": 0,
+					"track": true,
+					"fade": 250
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> events (post-initialisation) example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>Events which are assigned to the table elements are retained by <i>DataTables</i> such that they will still work as you would expect, even after changing the sort order etc. (no need to reapply the event handlers). You can do this at any time, although if you apply the handlers after the table has been initialised there is an extra set. Rather then queriing the DOM to get all rows (since they aren't there) you need to use the <b>fnGetNodes()</b> API function. This is shown in this example.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 
+				4.0
+				</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>var oTable;
+
+$(document).ready(function() {
+	/*
+	 * First step is to create title attributes for the rows in the table
+	 * This isn't needed if the required 'title' attribute is already set in the HTML in the
+	 * DOM 
+	 */
+	$('#example tbody tr').each( function() {
+		var sTitle;
+		var nTds = $('td', this);
+		var sBrowser = $(nTds[1]).text();
+		var sGrade = $(nTds[4]).text();
+		
+		if ( sGrade == "A" )
+			sTitle =  sBrowser+' will provide a first class (A) level of CSS support.';
+		else if ( sGrade == "C" )
+			sTitle = sBrowser+' will provide a core (C) level of CSS support.';
+		else if ( sGrade == "X" )
+			sTitle = sBrowser+' does not provide CSS support or has a broken implementation. Block CSS.';
+		else
+			sTitle = sBrowser+' will provide an undefined level of CSS support.';
+		
+		this.setAttribute( 'title', sTitle );
+	} );
+	
+	/* Init DataTables */
+	oTable = $('#example').dataTable();
+	
+	/* Apply the tooltips */
+	$( oTable.fnGetNodes() ).tooltip( {
+		"delay": 0,
+		"track": true,
+		"fade": 250
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/events_pre_init.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/events_pre_init.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/events_pre_init.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,613 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+			@import "../examples_support/jquery.tooltip.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" language="javascript" src="../examples_support/jquery.dimensions.js"></script>
+		<script type="text/javascript" language="javascript" src="../examples_support/jquery.tooltip.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				/*
+				 * First step is to create title attributes for the rows in the table
+				 * This isn't needed if the required 'title' attribute is already set in the HTML in the
+				 * DOM 
+				 */
+				$('#example tbody tr').each( function() {
+					var sTitle;
+					var nTds = $('td', this);
+					var sBrowser = $(nTds[1]).text();
+					var sGrade = $(nTds[4]).text();
+					
+					if ( sGrade == "A" )
+						sTitle =  sBrowser+' will provide a first class (A) level of CSS support.';
+					else if ( sGrade == "C" )
+						sTitle = sBrowser+' will provide a core (C) level of CSS support.';
+					else if ( sGrade == "X" )
+						sTitle = sBrowser+' does not provide CSS support or has a broken implementation. Block CSS.';
+					else
+						sTitle = sBrowser+' will provide an undefined level of CSS support.';
+					
+					this.setAttribute( 'title', sTitle );
+				} );
+				
+				/* Apply the tooltips */
+				$('#example tbody tr[title]').tooltip( {
+					"delay": 0,
+					"track": true,
+					"fade": 250
+				} );
+				
+				/* Init DataTables */
+				$('#example').dataTable();
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> events (pre-initialisation) example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>Events which are assigned to the table elements are retained by <i>DataTables</i> such that they will still work as you would expect, even after changing the sort order etc. (no need to reapply the event handlers). If you apply the event handlers before you initialise <i>DataTables</i>, you just do this in the normal way. This is shown in this example where the call <b>$('#example tbody tr[title]').tooltip();</b> is made before the table is initialised.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 
+				4.0
+				</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	/*
+	 * First step is to create title attributes for the rows in the table
+	 * This isn't needed if the required 'title' attribute is already set in the HTML in the
+	 * DOM 
+	 */
+	$('#example tbody tr').each( function() {
+		var sTitle;
+		var nTds = $('td', this);
+		var sBrowser = $(nTds[1]).text();
+		var sGrade = $(nTds[4]).text();
+		
+		if ( sGrade == "A" )
+			sTitle =  sBrowser+' will provide a first class (A) level of CSS support.';
+		else if ( sGrade == "C" )
+			sTitle = sBrowser+' will provide a core (C) level of CSS support.';
+		else if ( sGrade == "X" )
+			sTitle = sBrowser+' does not provide CSS support or has a broken implementation. Block CSS.';
+		else
+			sTitle = sBrowser+' will provide an undefined level of CSS support.';
+		
+		this.setAttribute( 'title', sTitle );
+	} );
+	
+	/* Apply the tooltips */
+	$('#example tbody tr[title]').tooltip( {
+		"delay": 0,
+		"track": true,
+		"fade": 250
+	} );
+	
+	/* Init DataTables */
+	$('#example').dataTable();
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/footer_callback.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/footer_callback.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/footer_callback.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,596 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
+						/*
+						 * Calculate the total market share for all browsers in this table (ie inc. outside
+						 * the pagination)
+						 */
+						var iTotalMarket = 0;
+						for ( var i=0 ; i<aaData.length ; i++ )
+						{
+							iTotalMarket += aaData[i][4]*1;
+						}
+						
+						/* Calculate the market share for browsers on this page */
+						var iPageMarket = 0;
+						for ( var i=iStart ; i<iEnd ; i++ )
+						{
+							iPageMarket += aaData[ aiDisplay[i] ][4]*1;
+						}
+						
+						/* Modify the footer row to match what we want */
+						var nCells = nRow.getElementsByTagName('th');
+						nCells[1].innerHTML = parseInt(iPageMarket * 100)/100 +
+							'% ('+ parseInt(iTotalMarket * 100)/100 +'% total)';
+					}
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> footer callback example
+			</div>
+
+			<h1>Preamble</h1>
+			<p><i>DataTables</i> using the header and footer callback manipulation functions (fnHeaderCallback() and fnFooterCallback()) you can perform some powerful and useful data manipulation. The example given below shows how a callback function can be used to total up visible (and hidden) data, taking into account all of DataTable's features (pagination, filtering etc).</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+			<th style="width: 150px">Market share (%)</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>
+				Internet
+				 Explorer 
+				4.0
+				</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+			<td class="center">0.1</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+			<td class="center">0.5</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+			<td class="center">36</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+			<td class="center">41</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+			<td class="center">1</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+			<td class="center">0.1</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center">0.5</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center">7</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+			<td class="center">9</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+			<td class="center">1</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+			<td class="center">2.2</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+			<td class="center">0.05</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center">0.1</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center">0.2</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center">0.8</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+			<td class="center">0.01</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+			<td class="center">0.04</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th style="text-align:right" colspan="4">Total:</th>
+			<th></th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			<p class="space">Warning! The market share information given in this table is <b>fabricated</b> using a combination of (mild) judgement, the <a href="http://www.mail-archive.com/backstage@lists.bbc.co.uk/msg03899.html">BBC Browser Statistics</a> information and statistics from <a href="http://www.thecounter.com/stats/2008/August/browser.php">TheCounter.com</a>. THe lowest usage given to anyone browser is 0.01 for reasons of this example.</p> 
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
+			/*
+			 * Calculate the total market share for all browsers in this table (ie inc. outside
+			 * the pagination)
+			 */
+			var iTotalMarket = 0;
+			for ( var i=0 ; i&lt;aaData.length ; i++ )
+			{
+				iTotalMarket += aaData[i][4]*1;
+			}
+			
+			/* Calculate the market share for browsers on this page */
+			var iPageMarket = 0;
+			for ( var i=iStart ; i&lt;iEnd ; i++ )
+			{
+				iPageMarket += aaData[ aiDisplay[i] ][4]*1;
+			}
+			
+			/* Modify the footer row to match what we want */
+			var nCells = nRow.getElementsByTagName('th');
+			nCells[1].innerHTML = parseInt(iPageMarket * 100)/100 +
+				'% ('+ parseInt(iTotalMarket * 100)/100 +'% total)';
+		}
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/html_sort.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/html_sort.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/html_sort.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,152 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"aoColumns": [
+						null,
+						{ "sType": "html" }
+					]
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> HTML sorting example
+			</div>
+
+			<h1>Preamble</h1>
+			<p>With <i>DataTables</i> you can specify what the data type of a particular column is. This will effect how the sorting of that column is done. For example date stamps ('date'), numeric ('numeric') data and strings (default) are all sorted differently. The fourth type is 'html' which will strip the HTML tags from a string (you typically wouldn't want to sort on them since they are invisible to the user) and will sort the resulting blank string. This shows and example of that where the two links to 'Integrity' are identical but the link with the text 'A ...' will come top of the list when sorted upon, and the link with the text 'Integrity' will come bottom of the list.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Reflection</th>
+			<th>Link</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td>DataTables</td>
+			<td><a href="http://www.sprymedia.co.uk/article/DataTables">DataTables</a></td>
+		</tr>
+		<tr>
+			<td>Integrity</td>
+			<td><a href="http://www.sprymedia.co.uk/article/Integrity">A link to Integrity</a></td>
+		</tr>
+		<tr>
+			<td>Integrity</td>
+			<td><a href="http://www.sprymedia.co.uk/article/Integrity">Integrity</a></td>
+		</tr>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"aoColumns": [
+			null,
+			{ "sType": "html" }
+		]
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/language_file.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/language_file.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/language_file.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,554 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"oLanguage": {
+						"sUrl": "../examples_support/de_DE.txt"
+					}
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> language file example
+			</div>
+
+			<h1>Preamble</h1>
+			<p>As well as being able to pass language information to <i>DataTables</i> through the initialisation object, you can also store the language information in a file, which <i>DataTables</i> will then read. Useful if you are using server-side processes to switch language. The following example shows <i>DataTables</i> reading a German language file.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"oLanguage": {
+			"sUrl": "media/language/de_DE.txt"
+		}
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/row_callback.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/row_callback.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/row_callback.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,578 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"fnRowCallback": function( nRow, aData, iDisplayIndex ) {
+						/* Append the grade to the default row class name */
+						if ( aData[4] == "A" )
+						{
+							$('td:eq(4)', nRow).html( '<b>A</b>' );
+						}
+						return nRow;
+					},
+					"aoColumns": [ 
+						/* Engine */   null,
+						/* Browser */  null,
+						/* Platform */ null,
+						/* Version */  { "sClass": "center" },
+						/* Grade */    { "sClass": "center" }
+					]
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				DataTables example with row callback
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>The following example shows how a callback function can be used to format a particular row at draw time. For each row that is generated for display, the <b>fnRowCallback()</b> function is called. It is passed the row node which can then be modified and returned. In this case a trivial example of making the 'grade' column bold if the grade is 'A' is shown (note that this could also be performed using the <b>fnRender()</b> function, but this is just for example).</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+				<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"fnRowCallback": function( nRow, aData, iDisplayIndex ) {
+			/* Append the grade to the default row class name */
+			if ( aData[4] == "A" )
+			{
+				$('td:eq(4)', nRow).html( '&lt;b&gt;A&lt;/b&gt;' );
+			}
+			return nRow;
+		},
+		"aoColumns": [ 
+			/* Engine */   null,
+			/* Browser */  null,
+			/* Platform */ null,
+			/* Version */  { "sClass": "center" },
+			/* Grade */    { "sClass": "center" }
+		]
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/row_grouping.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/row_grouping.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/row_grouping.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,617 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+			div.giveHeight {
+				/* Stop the controls at the bottom bouncing around */
+				min-height: 380px;
+			}
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				oTable = $('#example').dataTable({
+					"fnDrawCallback": function ( oSettings ) {
+						if ( oSettings.aiDisplay.length == 0 )
+						{
+							return;
+						}
+						
+						var nTrs = $('#example tbody tr');
+						var iColspan = nTrs[0].getElementsByTagName('td').length;
+						var sLastGroup = "";
+						var i=0;
+						for ( var i=0 ; i<nTrs.length ; i++ )
+						{
+							var iDisplayIndex = oSettings._iDisplayStart + i;
+							var sGroup = oSettings.aoData[ oSettings.aiDisplay[iDisplayIndex] ]._aData[0];
+							if ( sGroup != sLastGroup )
+							{
+								var nGroup = document.createElement( 'tr' );
+								var nCell = document.createElement( 'td' );
+								nCell.colSpan = iColspan;
+								nCell.className = "group";
+								nCell.innerHTML = sGroup;
+								nGroup.appendChild( nCell );
+								nTrs[i].parentNode.insertBefore( nGroup, nTrs[i] );
+								sLastGroup = sGroup;
+							}
+						}
+					},
+					"aoColumns": [
+						{ "bVisible": false },
+						null,
+						null,
+						null,
+						null
+					],
+					"aaSortingFixed": [[ 0, 'asc' ]],
+					"aaSorting": [[ 1, 'asc' ]],
+					"sDom": 'lfr<"giveHeight"t>ip'
+				});
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> zero configuration example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p><i>DataTables</i> has most features enabled by default, so all you need to do to use it with one of your own tables is to call the construction function (as shown below).</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	oTable = $('#example').dataTable({
+		"fnDrawCallback": function ( oSettings ) {
+			if ( oSettings.aiDisplay.length == 0 )
+			{
+				return;
+			}
+			
+			var nTrs = $('#example tbody tr');
+			var iColspan = nTrs[0].getElementsByTagName('td').length;
+			var sLastGroup = "";
+			var i=0;
+			for ( var i=0 ; i&lt;nTrs.length ; i++ )
+			{
+				var iDisplayIndex = oSettings._iDisplayStart + i;
+				var sGroup = oSettings.aoData[ oSettings.aiDisplay[iDisplayIndex] ]._aData[0];
+				if ( sGroup != sLastGroup )
+				{
+					var nGroup = document.createElement( 'tr' );
+					var nCell = document.createElement( 'td' );
+					nCell.colSpan = iColspan;
+					nCell.className = "group";
+					nCell.innerHTML = sGroup;
+					nGroup.appendChild( nCell );
+					nTrs[i].parentNode.insertBefore( nGroup, nTrs[i] );
+					sLastGroup = sGroup;
+				}
+			}
+		},
+		"aoColumns": [
+			{ "bVisible": false },
+			null,
+			null,
+			null,
+			null
+		],
+		"aaSortingFixed": [[ 0, 'asc' ]],
+		"aaSorting": [[ 1, 'asc' ]],
+		"sDom": 'lfr&lt;"giveHeight"t&gt;ip'
+	});
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/sorting_control.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/sorting_control.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/advanced_init/sorting_control.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,571 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"aoColumns": [
+						null,
+						{ "asSorting": [ "asc" ] },
+						{ "asSorting": [ "desc", "asc", "asc" ] },
+						{ "asSorting": [ "desc" ] },
+						null
+					]
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> sorting direction control example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>At times you may wish to change the default sorting direction for columns (all or some of them) to be 'descending' rather than DataTables' default ascending. This can be done through the use of the aoColumns[].asSorting initialisation parameter. This parameter also allows you to limit the sorting to a single direction, or you could add complex behaviour to the sorting interaction.</p>
+			<p>The example below shows:</p>
+			<ul>
+				<li>Column 1 - default sorting</li>
+				<li>Column 2 - ascending sorting only</li>
+				<li>Column 3 - descending sorting, followed by ascending and then ascending again</li>
+				<li>Column 4 - descending sorting only</li>
+				<li>Column 5 - default sorting</li>
+			</ul>
+			<p>It's worth noting that I don't have a good use case for when you might what to use the complex behaviour that is possible with this, but it is there should you want to use it!</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"aoColumns": [
+			null,
+			{ "asSorting": [ "asc" ] },
+			{ "asSorting": [ "desc", "asc", "asc" ] },
+			{ "asSorting": [ "desc" ] },
+			null
+		]
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.
+				</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/add_row.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/add_row.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/add_row.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,173 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			/* Global variable for the DataTables object */
+			var oTable;
+			
+			/* Global var for counter */
+			var giCount = 2;
+			
+			$(document).ready(function() {
+				oTable = $('#example').dataTable();
+			} );
+			
+			function fnClickAddRow() {
+				oTable.fnAddData( [
+					giCount+".1",
+					giCount+".2",
+					giCount+".3",
+					giCount+".4" ] );
+				
+				giCount++;
+			}
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> add row example
+			</div>
+
+			<h1>Preamble</h1>
+			<p><i>DataTables</i> adding rows in DataTables is done by assigning the DataTables jQuery object to a variable when initialising it, and then using it's API methods to add a new row. Deleting rows can be done in a similar manner.</p>
+			
+			<h1>Live example</h1>
+			<p><a href="javascript:void(0);" onclick="fnClickAddRow();">Click to add a new row</a></p>
+			
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Column 1</th>
+			<th>Column 2</th>
+			<th>Column 3</th>
+			<th>Column 4</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td>1.1</td>
+			<td>1.2</td>
+			<td>1.3</td>
+			<td>1.4</td>
+		</tr>
+	</tbody>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>/* Global variable for the DataTables object */
+var oTable;
+
+/* Global var for counter */
+var giCount = 2;
+
+$(document).ready(function() {
+	oTable = $('#example').dataTable();
+} );
+
+function fnClickAddRow() {
+	oTable.fnAddData( [
+		giCount+".1",
+		giCount+".2",
+		giCount+".3",
+		giCount+".4" ] );
+	
+	giCount++;
+}</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/counter_column.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/counter_column.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/counter_column.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,646 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"fnDrawCallback": function ( oSettings ) {
+						/* Need to redo the counters if filtered or sorted */
+						if ( oSettings.bSorted || oSettings.bFiltered )
+						{
+							for ( var i=0, iLen=oSettings.aiDisplay.length ; i<iLen ; i++ )
+							{
+								$('td:eq(0)', oSettings.aoData[ oSettings.aiDisplay[i] ].nTr ).html( i+1 );
+							}
+						}
+					},
+					"aoColumns": [
+						{ "bSortable": false },
+						null,
+						null,
+						null,
+						null,
+						null
+					],
+					"aaSorting": [[ 1, 'asc' ]]
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> row numbers example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>A fairly common requirement for highly interactive tables which are displayed on the web is to have a column which with a 'counter' for the row number. This column should not be sortable, and change dynamically as the sorting and filtering applied to the table is altered by the end user.</p>
+			<p>This example shows how this can be achieved with DataTables, where the first column is the counter column, and is updated when sorting or filtering occurs. Also the first column is marked as un-sortable and initial sorting is applied only on the second column.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Index</th>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td class="center">1</td>
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td class="center">2</td>
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">3</td>
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">4</td>
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">5</td>
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">6</td>
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">7</td>
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">8</td>
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">9</td>
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">10</td>
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">11</td>
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">12</td>
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">13</td>
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">14</td>
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">15</td>
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">16</td>
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">17</td>
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">18</td>
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">19</td>
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">20</td>
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">21</td>
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">22</td>
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">23</td>
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">24</td>
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">25</td>
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">26</td>
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">27</td>
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">28</td>
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">29</td>
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">30</td>
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">31</td>
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">32</td>
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">33</td>
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">34</td>
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">35</td>
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">36</td>
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">37</td>
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">38</td>
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">39</td>
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">40</td>
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">41</td>
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">42</td>
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">43</td>
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td class="center">44</td>
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">45</td>
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">46</td>
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td class="center">47</td>
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td class="center">48</td>
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td class="center">49</td>
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">50</td>
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td class="center">51</td>
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td class="center">52</td>
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td class="center">53</td>
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td class="center">54</td>
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td class="center">55</td>
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td class="center">56</td>
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td class="center">57</td>
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Index</th>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"fnDrawCallback": function ( oSettings ) {
+			/* Need to redo the counters if filtered or sorted */
+			if ( oSettings.bSorted || oSettings.bFiltered )
+			{
+				for ( var i=0, iLen=oSettings.aiDisplay.length ; i&lt;iLen ; i++ )
+				{
+					$('td:eq(0)', oSettings.aoData[ oSettings.aiDisplay[i] ].nTr ).html( i+1 );
+				}
+			}
+		},
+		"aoColumns": [
+			{ "bSortable": false },
+			null,
+			null,
+			null,
+			null,
+			null
+		],
+		"aaSorting": [[ 1, 'asc' ]]
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.
+				</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/dom_sort.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/dom_sort.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/dom_sort.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,1088 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+			input.engine { width: 100%; }
+			input.version { width: 50px; }
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			/* Create an array with the values of all the input boxes in a column */
+			$.fn.dataTableExt.afnSortData['dom-text'] = function  ( oSettings, iColumn )
+			{
+				var aData = [];
+				$( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {
+					aData.push( this.value );
+				} );
+				return aData;
+			}
+			
+			/* Create an array with the values of all the select options in a column */
+			$.fn.dataTableExt.afnSortData['dom-select'] = function  ( oSettings, iColumn )
+			{
+				var aData = [];
+				$( 'td:eq('+iColumn+') select', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {
+					aData.push( $(this).val() );
+				} );
+				return aData;
+			}
+			
+			/* Create an array with the values of all the checkboxes in a column */
+			$.fn.dataTableExt.afnSortData['dom-checkbox'] = function  ( oSettings, iColumn )
+			{
+				var aData = [];
+				$( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {
+					aData.push( this.checked==true ? "1" : "0" );
+				} );
+				return aData;
+			}
+			
+			/* Initialise the table with the required column sorting data types */
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"aoColumns": [
+						null,
+						null,
+						{ "sSortDataType": "dom-text" },
+						{ "sSortDataType": "dom-text", "sType": "numeric" },
+						{ "sSortDataType": "dom-select" },
+						{ "sSortDataType": "dom-checkbox" }
+					]
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> live DOM sorting example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>This example shows how you can use information available in the DOM to sort columns. Typically DataTables will read information to be sorted during it's initialisation phase, and this will not be updated based on user interaction, so sorting on columns which have, for example, form elements in them, may not reflect the current value of the input. To overcome this problem, you must update the data that DataTables will sort on, just prior to the sort. This method is much more efficient than actually sorting using the DOM, since only one DOM query is needed for each cell to be sorted.</p>
+			<p>The example below shows the first two columns as normal text with sorting as you would expect. The following columns all have a form input element of different kinds, and the information contained within is what DataTables will perform the sort on, based on the value at the time of the sort.</p>
+			<p>This is a fairly simple example, but it you aren't constrained to just using form input elements, you could use anything and customise your DOM queries to suit yourself. You could also update the sorting live as a user in entered data into a form using an event handler calling fnSort() or fnDraw().</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+			<th>Check</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td><input type="text" class="engine" value="Win 95+"></td>
+			<td class="center"><input type="text" class="version" value="4"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C">C</option>
+					<option value="X" selected="selected">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td><input type="text" class="engine" value="Win 95+"></td>
+			<td class="center"><input type="text" class="version" value="5"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C" selected="selected">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td><input type="text" class="engine" value="Win 95+"></td>
+			<td class="center"><input type="text" class="version" value="5.5"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td><input type="text" class="engine" value="Win 98+"></td>
+			<td class="center"><input type="text" class="version" value="6"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td><input type="text" class="engine" value="Win XP SP2+"></td>
+			<td class="center"><input type="text" class="version" value="7"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td><input type="text" class="engine" value="Win XP"></td>
+			<td class="center"><input type="text" class="version" value="6"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td><input type="text" class="engine" value="Win 98+ / OSX.2+"></td>
+			<td class="center"><input type="text" class="version" value="1.7"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td><input type="text" class="engine" value="Win 98+ / OSX.2+"></td>
+			<td class="center"><input type="text" class="version" value="1.8"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td><input type="text" class="engine" value="Win 98+ / OSX.2+"></td>
+			<td class="center"><input type="text" class="version" value="1.8"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td><input type="text" class="engine" value="Win 2k+ / OSX.3+"></td>
+			<td class="center"><input type="text" class="version" value="1.9"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td><input type="text" class="engine" value="OSX.2+"></td>
+			<td class="center"><input type="text" class="version" value="1.8"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td><input type="text" class="engine" value="OSX.3+"></td>
+			<td class="center"><input type="text" class="version" value="1.8"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td><input type="text" class="engine" value="Win 95+ / Mac OS 8.6-9.2"></td>
+			<td class="center"><input type="text" class="version" value="1.7"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td><input type="text" class="engine" value="Win 98SE+"></td>
+			<td class="center"><input type="text" class="version" value="1.7"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td><input type="text" class="engine" value="Win 98+ / OSX.2+"></td>
+			<td class="center"><input type="text" class="version" value="1.8"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td><input type="text" class="engine" value="Win 95+ / OSX.1+"></td>
+			<td class="center"><input type="text" class="version" value="1"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td><input type="text" class="engine" value="Win 95+ / OSX.1+"></td>
+			<td class="center"><input type="text" class="version" value="1.1"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td><input type="text" class="engine" value="Win 95+ / OSX.1+"></td>
+			<td class="center"><input type="text" class="version" value="1.2"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td><input type="text" class="engine" value="Win 95+ / OSX.1+"></td>
+			<td class="center"><input type="text" class="version" value="1.3"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td><input type="text" class="engine" value="Win 95+ / OSX.1+"></td>
+			<td class="center"><input type="text" class="version" value="1.4"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td><input type="text" class="engine" value="Win 95+ / OSX.1+"></td>
+			<td class="center"><input type="text" class="version" value="1.5"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td><input type="text" class="engine" value="Win 95+ / OSX.1+"></td>
+			<td class="center"><input type="text" class="version" value="1.6"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td><input type="text" class="engine" value="Win 98+ / OSX.1+"></td>
+			<td class="center"><input type="text" class="version" value="1.7"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td><input type="text" class="engine" value="Win 98+ / OSX.1+"></td>
+			<td class="center"><input type="text" class="version" value="1.8"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td><input type="text" class="engine" value="Win 98+ / OSX.2+"></td>
+			<td class="center"><input type="text" class="version" value="1.8"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td><input type="text" class="engine" value="Gnome"></td>
+			<td class="center"><input type="text" class="version" value="1.8"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td><input type="text" class="engine" value="OSX.3"></td>
+			<td class="center"><input type="text" class="version" value="125.5"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td><input type="text" class="engine" value="OSX.3"></td>
+			<td class="center"><input type="text" class="version" value="312.8"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td><input type="text" class="engine" value="OSX.4+"></td>
+			<td class="center"><input type="text" class="version" value="419.3"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td><input type="text" class="engine" value="OSX.4+"></td>
+			<td class="center"><input type="text" class="version" value="522.1"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td><input type="text" class="engine" value="OSX.4+"></td>
+			<td class="center"><input type="text" class="version" value="420"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td><input type="text" class="engine" value="iPod"></td>
+			<td class="center"><input type="text" class="version" value="420.1"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td><input type="text" class="engine" value="S60"></td>
+			<td class="center"><input type="text" class="version" value="413"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td><input type="text" class="engine" value="Win 95+ / OSX.1+"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td><input type="text" class="engine" value="Win 95+ / OSX.2+"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td><input type="text" class="engine" value="Win 95+ / OSX.2+"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td><input type="text" class="engine" value="Win 95+ / OSX.2+"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td><input type="text" class="engine" value="Win 95+ / OSX.3+"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td><input type="text" class="engine" value="Win 88+ / OSX.3+"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td><input type="text" class="engine" value="Win 88+ / OSX.3+"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td><input type="text" class="engine" value="Wii"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td><input type="text" class="engine" value="N800"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td><input type="text" class="engine" value="Nintendo DS"></td>
+			<td class="center"><input type="text" class="version" value="8.5"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C" selected="selected">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td><input type="text" class="engine" value="KDE 3.1"></td>
+			<td class="center"><input type="text" class="version" value="3.1"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C" selected="selected">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td><input type="text" class="engine" value="KDE 3.3"></td>
+			<td class="center"><input type="text" class="version" value="3.3"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td><input type="text" class="engine" value="KDE 3.5"></td>
+			<td class="center"><input type="text" class="version" value="3.5"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td><input type="text" class="engine" value="Mac OS 8-9"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C">C</option>
+					<option value="X" selected="selected">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td><input type="text" class="engine" value="Mac OS 7.6-9"></td>
+			<td class="center"><input type="text" class="version" value="1"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C" selected="selected">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td><input type="text" class="engine" value="Mac OS 8-X"></td>
+			<td class="center"><input type="text" class="version" value="1"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C" selected="selected">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td><input type="text" class="engine" value="Embedded devices"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C" selected="selected">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td><input type="text" class="engine" value="Embedded devices"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A" selected="selected">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td><input type="text" class="engine" value="Embedded devices"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C">C</option>
+					<option value="X" selected="selected">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox" checked="checked"></td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td><input type="text" class="engine" value="Text only"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C">C</option>
+					<option value="X" selected="selected">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td><input type="text" class="engine" value="Text only"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C">C</option>
+					<option value="X" selected="selected">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td><input type="text" class="engine" value="Windows Mobile 6"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C" selected="selected">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td><input type="text" class="engine" value="PSP"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C" selected="selected">C</option>
+					<option value="X">X</option>
+					<option value="U">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td><input type="text" class="engine" value="-"></td>
+			<td class="center"><input type="text" class="version" value="-"></td>
+			<td class="center">
+				<select size="1">
+					<option value="A">A</option>
+					<option value="C">C</option>
+					<option value="X">X</option>
+					<option value="U" selected="selected">U</option>
+				</select>
+			</td>
+			<td class="center"><input type="checkbox"></td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+			<th>Check</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>/* Create an array with the values of all the input boxes in a column */
+$.fn.dataTableExt.afnSortData['dom-text'] = function  ( oSettings, iColumn )
+{
+	var aData = [];
+	$( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {
+		aData.push( this.value );
+	} );
+	return aData;
+}
+
+/* Create an array with the values of all the select options in a column */
+$.fn.dataTableExt.afnSortData['dom-select'] = function  ( oSettings, iColumn )
+{
+	var aData = [];
+	$( 'td:eq('+iColumn+') select', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {
+		aData.push( $(this).val() );
+	} );
+	return aData;
+}
+
+/* Create an array with the values of all the checkboxes in a column */
+$.fn.dataTableExt.afnSortData['dom-checkbox'] = function  ( oSettings, iColumn )
+{
+	var aData = [];
+	$( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {
+		aData.push( this.checked==true ? "1" : "0" );
+	} );
+	return aData;
+}
+
+/* Initialise the table with the required column sorting data types */
+$(document).ready(function() {
+	$('#example').dataTable( {
+		"aoColumns": [
+			null,
+			null,
+			{ "sSortDataType": "dom-text" },
+			{ "sSortDataType": "dom-text", "sType": "numeric" },
+			{ "sSortDataType": "dom-select" },
+			{ "sSortDataType": "dom-checkbox" }
+		]
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.
+				</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/editable.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/editable.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/editable.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,573 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../examples_support/jquery.jeditable.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var oTable;
+			
+			$(document).ready(function() {
+				/* Apply the jEditable handlers to the table */
+				$('#example tbody td').editable( '../examples_support/editable_ajax.php', {
+					"callback": function( sValue, y ) {
+						var aPos = oTable.fnGetPosition( this );
+						oTable.fnUpdate( sValue, aPos[0], aPos[1] );
+					},
+					"height": "14px"
+				} );
+				
+				/* Init DataTables */
+				oTable = $('#example').dataTable();
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> editing example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>Using <i>DataTables</i> in-combination with the excellent <a href="http://www.appelsiini.net/projects/jeditable">jEditable</a> plugin for jQuery allows you to produce a table which can have individual cells edited. The table can then be updated such that filtering, sorting etc. will all work as expected. This is showing in the demo below.</p>
+			<p>The example shows how a table element can be edited (you could limit to a particular column if you wish using the selector), posted to the server (for saving in a database or whatever) and then placed back into the DataTable. The server-side processing in this example simply appends the string '(server updated)' to indicate that something has happened on the server-side.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 
+				4.0
+				</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>var oTable;
+
+$(document).ready(function() {
+	/* Apply the jEditable handlers to the table */
+	$('#example tbody td').editable( 'media/examples_support/editable_ajax.php', {
+		"callback": function( sValue, y ) {
+			var aPos = oTable.fnGetPosition( this );
+			oTable.fnUpdate( sValue, aPos[0], aPos[1] );
+		}
+	} );
+	
+	/* Init DataTables */
+	oTable = $('#example').dataTable();
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/form.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/form.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/form.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,626 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var oTable;
+			
+			$(document).ready(function() {
+				$('#form').submit( function() {
+					var sData = $('input', oTable.fnGetNodes()).serialize();
+					alert( "The following data would have been submitted to the server: \n\n"+sData );
+					return false;
+				} );
+				
+				oTable = $('#example').dataTable();
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> with form elements example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>The following example shows how form elements can be used within a <i>DataTables</i> enhanced table. The trick here is that <i>DataTables</i> does not include the DOM elements which are not currently being displayed, therefore you need to add a submit event handler to gather together all of the input elements from the table, and then use the handy jQuery <b>serialize()</b> function to string together the data. It can then be posted to the server as you wish.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+				<form id="form">
+					<div style="text-align:right; padding-bottom:1em;">
+						<button type="submit">Submit form</button>
+					</div>
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+			<th>Check</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+			<td class="center"><input type="checkbox" name="check1" value="1"></td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+			<td class="center"><input type="checkbox" name="check2" value="2"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check3" value="3"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check4" value="4"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check5" value="5"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check6" value="6"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check7" value="7"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check8" value="8"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check9" value="9"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check10" value="10"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check11" value="11"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check12" value="12"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check13" value="13"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check14" value="14"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check15" value="15"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check16" value="16"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check17" value="17"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check18" value="18"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check19" value="19"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check20" value="20"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check21" value="21"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check22" value="22"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check23" value="23"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check24" value="24"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check25" value="25"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check26" value="26"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check27" value="27"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check28" value="28"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check29" value="29"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check30" value="30"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check31" value="31"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check32" value="32"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check33" value="33"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check34" value="34"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check35" value="35"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check36" value="36"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check37" value="37"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check38" value="38"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check39" value="39"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check40" value="40"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check41" value="41"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check42" value="42"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+			<td class="center"><input type="checkbox" name="check43" value="43"></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+			<td class="center"><input type="checkbox" name="check44" value="44"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check45" value="45"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check46" value="46"></td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+			<td class="center"><input type="checkbox" name="check47" value="47"></td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+			<td class="center"><input type="checkbox" name="check48" value="48"></td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+			<td class="center"><input type="checkbox" name="check49" value="49"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+			<td class="center"><input type="checkbox" name="check50" value="50"></td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+			<td class="center"><input type="checkbox" name="check51" value="51"></td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+			<td class="center"><input type="checkbox" name="check52" value="52"></td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+			<td class="center"><input type="checkbox" name="check53" value="53"></td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+			<td class="center"><input type="checkbox" name="check54" value="54"></td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+			<td class="center"><input type="checkbox" name="check55" value="55"></td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+			<td class="center"><input type="checkbox" name="check56" value="56"></td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+			<td class="center"><input type="checkbox" name="check57" value="57"></td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+			<th>Check</th>
+		</tr>
+	</tfoot>
+</table>
+				</form>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>var oTable;
+
+$(document).ready(function() {
+	$('#form').submit( function() {
+		var sData = $('input', oTable.fnGetNodes()).serialize();
+		alert( "The following data would have been submitted to the server: \n\n"+sData );
+		return false;
+	} );
+	
+	oTable = $('#example').dataTable();
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/highlight.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/highlight.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/highlight.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,572 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var oTable;
+			
+			$(document).ready(function() {
+				$('#example tbody td').hover( function() {
+					var iCol = $('td').index(this) % 5;
+					var nTrs = oTable.fnGetNodes();
+					$('td:nth-child('+(iCol+1)+')', nTrs).addClass( 'highlighted' );
+				}, function() {
+					var nTrs = oTable.fnGetNodes();
+					$('td.highlighted', nTrs).removeClass('highlighted');
+				} );
+				
+				oTable = $('#example').dataTable( {
+					"bSortClasses": false
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example" class="ex_highlight">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> highlighting example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>The highlighting of rows and columns have be quite useful for attracting attention to where the user's cursor is in the data array. Of course the highlighting of a row is easy enough using CSS, but for column highlighting, you need to use a little bit of Javascript. This example shows that in action on a <i>DataTables</i> enhanced table - this type of effect would be particularly effective on tables with dense information.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>var oTable;
+
+$(document).ready(function() {
+	$('#example tbody td').hover( function() {
+		var iCol = $('td').index(this) % 5;
+		var nTrs = oTable.fnGetNodes();
+		$('td:nth-child('+(iCol+1)+')', nTrs).addClass( 'highlighted' );
+	}, function() {
+		var nTrs = oTable.fnGetNodes();
+		$('td.highlighted', nTrs).removeClass('highlighted');
+	} );
+	
+	oTable = $('#example').dataTable( {
+		"bSortClasses": false
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/multi_filter.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/multi_filter.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/multi_filter.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,624 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var oTable;
+			var asInitVals = new Array();
+			
+			$(document).ready(function() {
+				oTable = $('#example').dataTable( {
+					"oLanguage": {
+						"sSearch": "Search all columns:"
+					}
+				} );
+				
+				$("tfoot input").keyup( function () {
+					/* Filter on the column (the index) of this element */
+					oTable.fnFilter( this.value, $("tfoot input").index(this) );
+				} );
+				
+				
+				
+				/*
+				 * Support functions to provide a little bit of 'user friendlyness' to the textboxes in 
+				 * the footer
+				 */
+				$("tfoot input").each( function (i) {
+					asInitVals[i] = this.value;
+				} );
+				
+				$("tfoot input").focus( function () {
+					if ( this.className == "search_init" )
+					{
+						this.className = "";
+						this.value = "";
+					}
+				} );
+				
+				$("tfoot input").blur( function (i) {
+					if ( this.value == "" )
+					{
+						this.className = "search_init";
+						this.value = asInitVals[$("tfoot input").index(this)];
+					}
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> individual column filtering example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>The filtering functionality that is provided by <i>DataTables</i> is very useful for quickly search through the information in the table - however the search is global, and you (or the end user) may wish to filter only on a particular column of data. To met this need the <i>DataTables</i> <b>fnFilter()</b> API function allow you to specify a column to limit to search to. Note that this works in-combination with the global search filter!</p>
+			<p>The example below shows a table which has a text input box for each column in the footer element of the table. This allows the data in each column to be quickly filtered upon by the end user.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th><input type="text" name="search_engine" value="Search engines" class="search_init" /></th>
+			<th><input type="text" name="search_browser" value="Search browsers" class="search_init" /></th>
+			<th><input type="text" name="search_platform" value="Search platforms" class="search_init" /></th>
+			<th><input type="text" name="search_version" value="Search versions" class="search_init" /></th>
+			<th><input type="text" name="search_grade" value="Search grades" class="search_init" /></th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>var oTable;
+var asInitVals = new Array();
+
+$(document).ready(function() {
+	oTable = $('#example').dataTable( {
+		"oLanguage": {
+			"sSearch": "Search all columns:"
+		}
+	} );
+	
+	$("tfoot input").keyup( function () {
+		/* Filter on the column (the index) of this element */
+		oTable.fnFilter( this.value, $("tfoot input").index(this) );
+	} );
+	
+	
+	
+	/*
+	 * Support functions to provide a little bit of 'user friendlyness' to the textboxes in 
+	 * the footer
+	 */
+	$("tfoot input").each( function (i) {
+		asInitVals[i] = this.value;
+	} );
+	
+	$("tfoot input").focus( function () {
+		if ( this.className == "search_init" )
+		{
+			this.className = "";
+			this.value = "";
+		}
+	} );
+	
+	$("tfoot input").blur( function (i) {
+		if ( this.value == "" )
+		{
+			this.className = "search_init";
+			this.value = asInitVals[$("tfoot input").index(this)];
+		}
+	} );
+} );</pre>
+			<p>Note that in the above code, the support functions are provided to ensure that the end user knows what data is being filtered upon. <b>fnFilter()</b> is the function of primary import here.</p>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/paging_plugin.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/paging_plugin.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/paging_plugin.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,774 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			/* Time between each scrolling frame */
+			$.fn.dataTableExt.oPagination.iTweenTime = 100;
+			
+			$.fn.dataTableExt.oPagination.scrolling = {
+				"fnInit": function ( oSettings, fnCallbackDraw )
+				{
+					var nPaging = oSettings.anFeatures.p;
+					
+					/* Store the next and previous elements in the oSettings object as they can be very
+					 * usful for automation - particularly testing
+					 */
+					oSettings.nPrevious = document.createElement( 'div' );
+					oSettings.nNext = document.createElement( 'div' );
+					
+					if ( oSettings.sTableId !== '' )
+					{
+						nPaging.setAttribute( 'id', oSettings.sTableId+'_paginate' );
+						oSettings.nPrevious.setAttribute( 'id', oSettings.sTableId+'_previous' );
+						oSettings.nNext.setAttribute( 'id', oSettings.sTableId+'_next' );
+					}
+					
+					oSettings.nPrevious.className = "paginate_disabled_previous";
+					oSettings.nNext.className = "paginate_disabled_next";
+					
+					oSettings.nPrevious.title = oSettings.oLanguage.oPaginate.sPrevious;
+					oSettings.nNext.title = oSettings.oLanguage.oPaginate.sNext;
+					
+					nPaging.appendChild( oSettings.nPrevious );
+					nPaging.appendChild( oSettings.nNext );
+					$(nPaging).insertAfter( oSettings.nTable );
+					
+					$(oSettings.nPrevious).click( function() {
+						/* Disallow paging event during a current paging event */
+						if ( typeof oSettings.iPagingLoopStart != 'undefined' && oSettings.iPagingLoopStart != -1 )
+						{
+							return;
+						}
+						
+						oSettings.iPagingLoopStart = oSettings._iDisplayStart;
+						oSettings.iPagingEnd = oSettings._iDisplayStart - oSettings._iDisplayLength;
+						
+						/* Correct for underrun */
+						if ( oSettings.iPagingEnd < 0 )
+						{
+						  oSettings.iPagingEnd = 0;
+						}
+						
+						var iTween = $.fn.dataTableExt.oPagination.iTweenTime;
+						var innerLoop = function () {
+							if ( oSettings.iPagingLoopStart > oSettings.iPagingEnd ) {
+								oSettings.iPagingLoopStart--;
+								oSettings._iDisplayStart = oSettings.iPagingLoopStart;
+								fnCallbackDraw( oSettings );
+								setTimeout( function() { innerLoop(); }, iTween );
+							} else {
+								oSettings.iPagingLoopStart = -1;
+							}
+						};
+						innerLoop();
+					} );
+					
+					$(oSettings.nNext).click( function() {
+						/* Disallow paging event during a current paging event */
+						if ( typeof oSettings.iPagingLoopStart != 'undefined' && oSettings.iPagingLoopStart != -1 )
+						{
+							return;
+						}
+						
+						oSettings.iPagingLoopStart = oSettings._iDisplayStart;
+						
+						/* Make sure we are not over running the display array */
+						if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() )
+						{
+							oSettings.iPagingEnd = oSettings._iDisplayStart + oSettings._iDisplayLength;
+						}
+						
+						var iTween = $.fn.dataTableExt.oPagination.iTweenTime;
+						var innerLoop = function () {
+							if ( oSettings.iPagingLoopStart < oSettings.iPagingEnd ) {
+								oSettings.iPagingLoopStart++;
+								oSettings._iDisplayStart = oSettings.iPagingLoopStart;
+								fnCallbackDraw( oSettings );
+								setTimeout( function() { innerLoop(); }, iTween );
+							} else {
+								oSettings.iPagingLoopStart = -1;
+							}
+						};
+						innerLoop();
+					} );
+					
+					/* Take the brutal approach to cancelling text selection */
+					$(oSettings.nPrevious).bind( 'selectstart', function () { return false; } );
+					$(oSettings.nNext).bind( 'selectstart', function () { return false; } );
+				},
+				
+				"fnUpdate": function ( oSettings, fnCallbackDraw )
+				{
+					if ( !oSettings.anFeatures.p )
+					{
+						return;
+					}
+					
+					oSettings.nPrevious.className = 
+						( oSettings._iDisplayStart === 0 ) ? 
+						"paginate_disabled_previous" : "paginate_enabled_previous";
+					
+					oSettings.nNext.className = 
+						( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ? 
+						"paginate_disabled_next" : "paginate_enabled_next";
+				}
+			}
+			
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"sPaginationType": "scrolling"
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> custom pagination plug-in example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>The two default pagination styles that DataTables comes with are great for basic tables, but you might which to add extra customisation or a bit of 'glitz'. This plug-in will scroll the table in an animated style.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>/* Time between each scrolling frame */
+$.fn.dataTableExt.oPagination.iTweenTime = 100;
+
+$.fn.dataTableExt.oPagination.scrolling = {
+	"fnInit": function ( oSettings, fnCallbackDraw )
+	{
+		var nPaging = oSettings.anFeatures.p;
+		
+		/* Store the next and previous elements in the oSettings object as they can be very
+		 * usful for automation - particularly testing
+		 */
+		oSettings.nPrevious = document.createElement( 'div' );
+		oSettings.nNext = document.createElement( 'div' );
+		
+		if ( oSettings.sTableId !== '' )
+		{
+			nPaging.setAttribute( 'id', oSettings.sTableId+'_paginate' );
+			oSettings.nPrevious.setAttribute( 'id', oSettings.sTableId+'_previous' );
+			oSettings.nNext.setAttribute( 'id', oSettings.sTableId+'_next' );
+		}
+		
+		oSettings.nPrevious.className = "paginate_disabled_previous";
+		oSettings.nNext.className = "paginate_disabled_next";
+		
+		oSettings.nPrevious.title = oSettings.oLanguage.oPaginate.sPrevious;
+		oSettings.nNext.title = oSettings.oLanguage.oPaginate.sNext;
+		
+		nPaging.appendChild( oSettings.nPrevious );
+		nPaging.appendChild( oSettings.nNext );
+		$(nPaging).insertAfter( oSettings.nTable );
+		
+		$(oSettings.nPrevious).click( function() {
+			/* Disallow paging event during a current paging event */
+			if ( typeof oSettings.iPagingLoopStart != 'undefined' &amp;&amp; oSettings.iPagingLoopStart != -1 )
+			{
+				return;
+			}
+			
+			oSettings.iPagingLoopStart = oSettings._iDisplayStart;
+			oSettings.iPagingEnd = oSettings._iDisplayStart - oSettings._iDisplayLength;
+			
+			/* Correct for underrun */
+			if ( oSettings.iPagingEnd &lt; 0 )
+			{
+			  oSettings.iPagingEnd = 0;
+			}
+			
+			var iTween = $.fn.dataTableExt.oPagination.iTweenTime;
+			var innerLoop = function () {
+				if ( oSettings.iPagingLoopStart &gt; oSettings.iPagingEnd ) {
+					oSettings.iPagingLoopStart--;
+					oSettings._iDisplayStart = oSettings.iPagingLoopStart;
+					fnCallbackDraw( oSettings );
+					setTimeout( function() { innerLoop(); }, iTween );
+				} else {
+					oSettings.iPagingLoopStart = -1;
+				}
+			};
+			innerLoop();
+		} );
+		
+		$(oSettings.nNext).click( function() {
+			/* Disallow paging event during a current paging event */
+			if ( typeof oSettings.iPagingLoopStart != 'undefined' &amp;&amp; oSettings.iPagingLoopStart != -1 )
+			{
+				return;
+			}
+			
+			oSettings.iPagingLoopStart = oSettings._iDisplayStart;
+			
+			/* Make sure we are not over running the display array */
+			if ( oSettings._iDisplayStart + oSettings._iDisplayLength &lt; oSettings.fnRecordsDisplay() )
+			{
+				oSettings.iPagingEnd = oSettings._iDisplayStart + oSettings._iDisplayLength;
+			}
+			
+			var iTween = $.fn.dataTableExt.oPagination.iTweenTime;
+			var innerLoop = function () {
+				if ( oSettings.iPagingLoopStart &lt; oSettings.iPagingEnd ) {
+					oSettings.iPagingLoopStart++;
+					oSettings._iDisplayStart = oSettings.iPagingLoopStart;
+					fnCallbackDraw( oSettings );
+					setTimeout( function() { innerLoop(); }, iTween );
+				} else {
+					oSettings.iPagingLoopStart = -1;
+				}
+			};
+			innerLoop();
+		} );
+		
+		/* Take the brutal approach to cancelling text selection */
+		$(oSettings.nPrevious).bind( 'selectstart', function () { return false; } );
+		$(oSettings.nNext).bind( 'selectstart', function () { return false; } );
+	},
+	
+	"fnUpdate": function ( oSettings, fnCallbackDraw )
+	{
+		if ( !oSettings.anFeatures.p )
+		{
+			return;
+		}
+		
+		oSettings.nPrevious.className = 
+			( oSettings._iDisplayStart === 0 ) ? 
+			"paginate_disabled_previous" : "paginate_enabled_previous";
+		
+		oSettings.nNext.className = 
+			( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ? 
+			"paginate_disabled_next" : "paginate_enabled_next";
+	}
+}
+
+$(document).ready(function() {
+	$('#example').dataTable( {
+		"sPaginationType": "scrolling"
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/plugin_api.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/plugin_api.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/plugin_api.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,614 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			/*
+			 * Function: fnGetHiddenTrNodes
+			 * Purpose:  Get all of the hidden TR nodes (i.e. the ones which aren't on display)
+			 * Returns:  array:
+			 * Inputs:   object:oSettings - DataTables settings object
+			 */
+			$.fn.dataTableExt.oApi.fnGetHiddenTrNodes = function ( oSettings )
+			{
+				/* Note the use of a DataTables 'private' function thought the 'oApi' object */
+				var anNodes = this.oApi._fnGetTrNodes( oSettings );
+				var anDisplay = $('tbody tr', oSettings.nTable);
+				
+				/* Remove nodes which are being displayed */
+				for ( var i=0 ; i<anDisplay.length ; i++ )
+				{
+					var iIndex = jQuery.inArray( anDisplay[i], anNodes );
+					if ( iIndex != -1 )
+					{
+						anNodes.splice( iIndex, 1 );
+					}
+				}
+				
+				/* Fire back the array to the caller */
+				return anNodes;
+			}
+			
+			/* Init the table and fire off a call to get the hidden nodes. */
+			var oTable;
+			$(document).ready(function() {
+				var oTable = $('#example').dataTable();
+				
+				$('#button').click( function () {
+					var nHidden = oTable.fnGetHiddenTrNodes( );
+					alert( nHidden.length +' nodes were returned' );
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> new API function plug-in example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p><i>DataTables</i> presents a number of useful API functions to the calling code which can be used to manipulate the table data as required. But there are times when <i>DataTables</i> doesn't provide the API function that you want - so for this <i>DataTables</i> allows a method by which custom API functions can be defined (effectively a plug-in). This is done by adding functions the <b>$.fn.dataTableExt.oApi</b> object, which will be registered by <i>DataTables</i>. Each function is passed a single parameter, the settings object for the table in question.</p>
+			<p>In the example below, I present an API function which is used to obtain all of the TR rows which are currently not on display (useful for building a form from the table).</p>
+			
+			<h1>Live example</h1>
+			<a id="button" href="javascript:void(0);">Click to get hidden rows</a>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>/*
+ * Function: fnGetHiddenTrNodes
+ * Purpose:  Get all of the hidden TR nodes (i.e. the ones which aren't on display)
+ * Returns:  array:
+ * Inputs:   object:oSettings - DataTables settings object
+ */
+$.fn.dataTableExt.oApi.fnGetHiddenTrNodes = function ( oSettings )
+{
+	/* Note the use of a DataTables 'private' function thought the 'oApi' object */
+	var anNodes = this.oApi._fnGetTrNodes( oSettings );
+	var anDisplay = $('tbody tr', oSettings.nTable);
+	
+	/* Remove nodes which are being displayed */
+	for ( var i=0 ; i&lt;anDisplay.length ; i++ )
+	{
+		var iIndex = jQuery.inArray( anDisplay[i], anNodes );
+		if ( iIndex != -1 )
+		{
+			anNodes.splice( iIndex, 1 );
+		}
+	}
+	
+	/* Fire back the array to the caller */
+	return anNodes;
+}
+
+/* Init the table and fire off a call to get the hidden nodes. */
+var oTable;
+$(document).ready(function() {
+	var oTable = $('#example').dataTable();
+	
+	$('#button').click( function () {
+		var nHidden = oTable.fnGetHiddenTrNodes();
+		alert( nHidden.length +' nodes were returned' );
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/range_filtering.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/range_filtering.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/range_filtering.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,618 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			/* Custom filtering function which will filter data in column four between two values */
+			$.fn.dataTableExt.afnFiltering.push(
+				function( oSettings, aData, iDataIndex ) {
+					var iMin = document.getElementById('min').value * 1;
+					var iMax = document.getElementById('max').value * 1;
+					var iVersion = aData[3] == "-" ? 0 : aData[3]*1;
+					if ( iMin == "" && iMax == "" )
+					{
+						return true;
+					}
+					else if ( iMin == "" && iVersion < iMax )
+					{
+						return true;
+					}
+					else if ( iMin < iVersion && "" == iMax )
+					{
+						return true;
+					}
+					else if ( iMin < iVersion && iVersion < iMax )
+					{
+						return true;
+					}
+					return false;
+				}
+			);
+			
+			$(document).ready(function() {
+				/* Initialise datatables */
+				var oTable = $('#example').dataTable();
+				
+				/* Add event listeners to the two range filtering inputs */
+				$('#min').keyup( function() { oTable.fnDraw(); } );
+				$('#max').keyup( function() { oTable.fnDraw(); } );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> custom filtering (range filtering) example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>There may be occasions when you wish to filter data presented to the end user in your own manner, common examples are number range filtering (in between two numbers) and date range filtering. DataTables provide an API method to add your own filtering functions, <b>$.fn.dataTableExt.afnFiltering</b>. This is an array of functions (push your own onto it) which will will be run at table draw time to see if a particular row should be included or not.</p>
+			
+			<h1>Live example</h1>
+			<table border="0" cellspacing="5" cellpadding="5">
+				<tr>
+					<td>Minimum engine version:</td>
+					<td><input type="text" id="min" name="min"></td>
+				</tr>
+				<tr>
+					<td>Maximum engine version:</td>
+					<td><input type="text" id="max" name="max"></td>
+				</tr>
+			</table>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>/* Custom filtering function which will filter data in column four between two values */
+$.fn.dataTableExt.afnFiltering.push(
+	function( oSettings, aData, iDataIndex ) {
+		var iMin = document.getElementById('min').value * 1;
+		var iMax = document.getElementById('max').value * 1;
+		var iVersion = aData[3] == "-" ? 0 : aData[3]*1;
+		if ( iMin == "" &amp;&amp; iMax == "" )
+		{
+			return true;
+		}
+		else if ( iMin == "" &amp;&amp; iVersion &lt; iMax )
+		{
+			return true;
+		}
+		else if ( iMin &lt; iVersion &amp;&amp; "" == iMax )
+		{
+			return true;
+		}
+		else if ( iMin &lt; iVersion &amp;&amp; iVersion &lt; iMax )
+		{
+			return true;
+		}
+		return false;
+	}
+);
+
+$(document).ready(function() {
+	/* Initialise datatables */
+	var oTable = $('#example').dataTable();
+	
+	/* Add event listeners to the two range filtering inputs */
+	$('#min').keyup( function() { oTable.fnDraw(); } );
+	$('#max').keyup( function() { oTable.fnDraw(); } );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.
+				</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/regex.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/regex.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/regex.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,603 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var goTable;
+			
+			function fnFilterNormal ()
+			{
+				var jqInputs = $('#filter_norm input');
+				var iColumn = jqInputs[1].value == "" ? null : jqInputs[1].value;
+				goTable.fnFilter( jqInputs[0].value, iColumn );
+			}
+			
+			function fnFilterRegex ()
+			{
+				var jqInputs = $('#filter_regex input');
+				var iColumn = jqInputs[1].value == "" ? null : jqInputs[1].value;
+				goTable.fnFilter( jqInputs[0].value, iColumn, false );
+			}
+			
+			$(document).ready(function() {
+				goTable = $('#example').dataTable();
+				
+				$('#filter_norm input').keyup( fnFilterNormal );
+				$('#filter_regex input').keyup( fnFilterRegex );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> filtering API example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>Regular expression filtering is very powerful and can allow you to customise the filtering done by DataTables to a very high degree. The example shown below has two custom input filters, one for "normal" filtering and the other for regular expression inputs. You can also specify which column you want the filter to apply to.</p>
+			
+			<h1>Live example</h1>
+			
+			<table cellpadding="0" cellspacing="5" border="0">
+				<tr>
+					<td></td>
+					<td>Filter</td>
+					<td>Column (leave blank for all - starts at index 0)</td>
+				</tr>
+				<tr id="filter_norm">
+					<td align="right">Normal filtering:</td>
+					<td><input type="text" name="normal_filter"></td>
+					<td><input type="text" name="normal_filter_col"></td>
+				</tr>
+				<tr id="filter_regex">
+					<td align="right">Regex filtering:</td>
+					<td><input type="text" name="regex_filter"></td>
+					<td><input type="text" name="regex_filter_col"></td>
+				</tr>
+			</table>
+			
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5,5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1,7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1,9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1,7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1,1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1,2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1,3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1,4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1,5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1,6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1,7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125,5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419,3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522,1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420,1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8,5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3,1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3,3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3,5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>var goTable;
+
+function fnFilterNormal ()
+{
+	var jqInputs = $('#filter_norm input');
+	var iColumn = jqInputs[1].value == "" ? null : jqInputs[1].value;
+	goTable.fnFilter( jqInputs[0].value, iColumn );
+}
+
+function fnFilterRegex ()
+{
+	var jqInputs = $('#filter_regex input');
+	var iColumn = jqInputs[1].value == "" ? null : jqInputs[1].value;
+	goTable.fnFilter( jqInputs[0].value, iColumn, false );
+}
+
+$(document).ready(function() {
+	goTable = $('#example').dataTable();
+	
+	$('#filter_norm input').keyup( fnFilterNormal );
+	$('#filter_regex input').keyup( fnFilterRegex );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/row_details.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/row_details.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/row_details.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,665 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var oTable;
+			
+			/* Formating function for row details */
+			function fnFormatDetails ( nTr )
+			{
+				var iIndex = oTable.fnGetPosition( nTr );
+				var aData = oTable.fnSettings().aoData[iIndex]._aData;
+				
+				var sOut = '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">';
+				sOut += '<tr><td>Rendering engine:</td><td>'+aData[1]+' '+aData[4]+'</td></tr>';
+				sOut += '<tr><td>Link to source:</td><td>Could provide a link here</td></tr>';
+				sOut += '<tr><td>Extra info:</td><td>And any further details here (images etc)</td></tr>';
+				sOut += '</table>';
+				
+				return sOut;
+			}
+			
+			$(document).ready(function() {
+				/*
+				 * Insert a 'details' column to the table
+				 */
+				var nCloneTh = document.createElement( 'th' );
+				var nCloneTd = document.createElement( 'td' );
+				nCloneTd.innerHTML = '<img src="../examples_support/details_open.png">';
+				nCloneTd.className = "center";
+				
+				$('#example thead tr').each( function () {
+					this.insertBefore( nCloneTh, this.childNodes[0] );
+				} );
+				
+				$('#example tbody tr').each( function () {
+					this.insertBefore(  nCloneTd.cloneNode( true ), this.childNodes[0] );
+				} );
+				
+				/*
+				 * Initialse DataTables, with no sorting on the 'details' column
+				 */
+				oTable = $('#example').dataTable( {
+					"aoColumns": [
+						{ "bSortable": false },
+						null, null, null, null, null
+					],
+					"aaSorting": [[1, 'asc']]
+				});
+				
+				/* Add event listener for opening and closing details
+				 * Note that the indicator for showing which row is open is not controlled by DataTables,
+				 * rather it is done here
+				 */
+				$('td img', oTable.fnGetNodes() ).each( function () {
+					$(this).click( function () {
+						var nTr = this.parentNode.parentNode;
+						if ( this.src.match('details_close') )
+						{
+							/* This row is already open - close it */
+							this.src = "../examples_support/details_open.png";
+							oTable.fnClose( nTr );
+						}
+						else
+						{
+							/* Open this row */
+							this.src = "../examples_support/details_close.png";
+							oTable.fnOpen( nTr, fnFormatDetails(nTr), 'details' );
+						}
+					} );
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> hidden row details example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p><i>DataTables</i> has most features enabled by default, so all you need to do to use it with one of your own tables is to call the construction function (as shown below).</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>var oTable;
+
+/* Formating function for row details */
+function fnFormatDetails ( nTr )
+{
+	var iIndex = oTable.fnGetPosition( nTr );
+	var aData = oTable.fnSettings().aoData[iIndex]._aData;
+	
+	var sOut = '&lt;table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;"&gt;';
+	sOut += '&lt;tr&gt;&lt;td&gt;Rendering engine:&lt;/td&gt;&lt;td&gt;'+aData[1]+' '+aData[4]+'&lt;/td&gt;&lt;/tr&gt;';
+	sOut += '&lt;tr&gt;&lt;td&gt;Link to source:&lt;/td&gt;&lt;td&gt;Could provide a link here&lt;/td&gt;&lt;/tr&gt;';
+	sOut += '&lt;tr&gt;&lt;td&gt;Extra info:&lt;/td&gt;&lt;td&gt;And any further details here (images etc)&lt;/td&gt;&lt;/tr&gt;';
+	sOut += '&lt;/table&gt;';
+	
+	return sOut;
+}
+
+$(document).ready(function() {
+	/*
+	 * Insert a 'details' column to the table
+	 */
+	var nCloneTh = document.createElement( 'th' );
+	var nCloneTd = document.createElement( 'td' );
+	nCloneTd.innerHTML = '&lt;img src="../examples_support/details_open.png"&gt;';
+	nCloneTd.className = "center";
+	
+	$('#example thead tr').each( function () {
+		this.insertBefore( nCloneTh, this.childNodes[0] );
+	} );
+	
+	$('#example tbody tr').each( function () {
+		this.insertBefore(  nCloneTd.cloneNode( true ), this.childNodes[0] );
+	} );
+	
+	/*
+	 * Initialse DataTables, with no sorting on the 'details' column
+	 */
+	oTable = $('#example').dataTable( {
+		"aoColumns": [
+			{ "bSortable": false },
+			null, null, null, null, null
+		],
+		"aaSorting": [[1, 'asc']]
+	});
+	
+	/* Add event listener for opening and closing details
+	 * Note that the indicator for showing which row is open is not controlled by DataTables,
+	 * rather it is done here
+	 */
+	$('td img', oTable.fnGetNodes() ).each( function () {
+		$(this).click( function () {
+			var nTr = this.parentNode.parentNode;
+			if ( this.src.match('details_close') )
+			{
+				/* This row is already open - close it */
+				this.src = "../examples_support/details_open.png";
+				oTable.fnClose( nTr );
+			}
+			else
+			{
+				/* Open this row */
+				this.src = "../examples_support/details_close.png";
+				oTable.fnOpen( nTr, fnFormatDetails(nTr), 'details' );
+			}
+		} );
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/select_row.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/select_row.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/select_row.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,606 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var oTable;
+			
+			$(document).ready(function() {
+				/* Add a click handler to the rows - this could be used as a callback */
+				$('#example tr').click( function() {
+					if ( $(this).hasClass('row_selected') )
+						$(this).removeClass('row_selected');
+					else
+						$(this).addClass('row_selected');
+				} );
+				
+				/* Init the table */
+				oTable = $('#example').dataTable( );
+			} );
+			
+			/*
+			 * I don't actually use this here, but it is provided as it might be useful and demonstrates
+			 * getting the TR nodes from DataTables
+			 */
+			function fnGetSelected( oTableLocal )
+			{
+				var aReturn = new Array();
+				var aTrs = oTableLocal.fnGetNodes();
+				
+				for ( var i=0 ; i<aTrs.length ; i++ )
+				{
+					if ( $(aTrs[i]).hasClass('row_selected') )
+					{
+						aReturn.push( aTrs[i] );
+					}
+				}
+				return aReturn;
+			}
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> row select example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>It can be quite useful at times to provide the user with the option to select rows in a DataTable. This can be done using the API functions that <i>DataTables</i> provides. The example below uses the <b>fnRowCallback()</b> function to add a 'click' listener to each row, which will highlight the required row when selected. The indexes of the selected rows are then provided through the custom function <b>fnGetSelected()</b> for later processing.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>var oTable;
+
+$(document).ready(function() {
+	/* Add a click handler to the rows - this could be used as a callback */
+	$('#example tr').click( function() {
+		if ( $(this).hasClass('row_selected') )
+			$(this).removeClass('row_selected');
+		else
+			$(this).addClass('row_selected');
+	} );
+	
+	/* Init the table */
+	oTable = $('#example').dataTable( );
+} );
+
+/*
+ * I don't actually use this here, but it is provided as it might be useful and demonstrates
+ * getting the TR nodes from DataTables
+ */
+function fnGetSelected( oTableLocal )
+{
+	var aReturn = new Array();
+	var aTrs = oTableLocal.fnGetNodes();
+	
+	for ( var i=0 ; i&lt;aTrs.length ; i++ )
+	{
+		if ( $(aTrs[i]).hasClass('row_selected') )
+		{
+			aReturn.push( aTrs[i] );
+		}
+	}
+	return aReturn;
+}</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/select_single_row.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/select_single_row.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/select_single_row.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,619 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var oTable;
+			var giRedraw = false;
+			
+			$(document).ready(function() {
+				/* Add a click handler to the rows - this could be used as a callback */
+				$("#example tbody").click(function(event) {
+					$(oTable.fnSettings().aoData).each(function (){
+						$(this.nTr).removeClass('row_selected');
+					});
+					$(event.target.parentNode).addClass('row_selected');
+				});
+				
+				/* Add a click handler for the delete row */
+				$('#delete').click( function() {
+					var anSelected = fnGetSelected( oTable );
+					var iRow = oTable.fnGetPosition( anSelected[0] );
+					oTable.fnDeleteRow( iRow );
+				} );
+				
+				/* Init the table */
+				oTable = $('#example').dataTable( );
+			} );
+			
+			
+			/* Get the rows which are currently selected */
+			function fnGetSelected( oTableLocal )
+			{
+				var aReturn = new Array();
+				var aTrs = oTableLocal.fnGetNodes();
+				
+				for ( var i=0 ; i<aTrs.length ; i++ )
+				{
+					if ( $(aTrs[i]).hasClass('row_selected') )
+					{
+						aReturn.push( aTrs[i] );
+					}
+				}
+				return aReturn;
+			}
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> row select example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>It can be quite useful at times to provide the user with the option to select rows in a DataTable. This can be done using the API functions that <i>DataTables</i> provides. The example below uses the <b>fnRowCallback()</b> function to add a 'click' listener to each row, which will highlight the required row when selected. The indexes of the selected rows are then provided through the custom function <b>fnGetSelected()</b> for later processing.</p>
+			
+			<h1>Live example</h1>
+			<p><a href="javascript:void(0)" id="delete">Delete selected row</a></p>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>var oTable;
+var giRedraw = false;
+
+$(document).ready(function() {
+	/* Add a click handler to the rows - this could be used as a callback */
+	$("#example tbody").click(function(event) {
+		$(oTable.fnSettings().aoData).each(function (){
+			$(this.nTr).removeClass('row_selected');
+		});
+		$(event.target.parentNode).addClass('row_selected');
+	});
+	
+	/* Add a click handler for the delete row */
+	$('#delete').click( function() {
+		var anSelected = fnGetSelected( oTable );
+		var iRow = oTable.fnGetPosition( anSelected[0] );
+		oTable.fnDeleteRow( iRow );
+	} );
+	
+	/* Init the table */
+	oTable = $('#example').dataTable( );
+} );
+
+
+/* Get the rows which are currently selected */
+function fnGetSelected( oTableLocal )
+{
+	var aReturn = new Array();
+	var aTrs = oTableLocal.fnGetNodes();
+	
+	for ( var i=0 ; i&lt;aTrs.length ; i++ )
+	{
+		if ( $(aTrs[i]).hasClass('row_selected') )
+		{
+			aReturn.push( aTrs[i] );
+		}
+	}
+	return aReturn;
+}</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/show_hide.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/show_hide.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/show_hide.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,560 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var oTable;
+			
+			$(document).ready(function() {
+				oTable = $('#example').dataTable();
+			} );
+			
+			function fnShowHide( iCol )
+			{
+				var bVis = oTable.fnSettings().aoColumns[iCol].bVisible;
+				oTable.fnSetColumnVis( iCol, bVis ? false : true );
+			}
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> zero configuration example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p><i>DataTables</i> has most features enabled by default, so all you need to do to use it with one of your own tables is to call the construction function (as shown below).</p>
+			
+			<a href="javascript:void(0);" onclick="fnShowHide(0);">Toggle column 1<br></a>
+			<a href="javascript:void(0);" onclick="fnShowHide(1);">Toggle column 2<br></a>
+			<a href="javascript:void(0);" onclick="fnShowHide(2);">Toggle column 3<br></a>
+			<a href="javascript:void(0);" onclick="fnShowHide(3);">Toggle column 4<br></a>
+			<a href="javascript:void(0);" onclick="fnShowHide(4);">Toggle column 5<br></a>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable();
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/api/sorting_plugin.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/api/sorting_plugin.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/api/sorting_plugin.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,641 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			jQuery.fn.dataTableExt.aTypes.push(
+				function ( sData )
+				{
+					var sValidChars = "0123456789-,";
+					var Char;
+					var bDecimal = false;
+					
+					/* Check the numeric part */
+					for ( i=0 ; 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-comma';
+				}
+			);
+			
+			jQuery.fn.dataTableExt.oSort['numeric-comma-asc']  = function(a,b) {
+				var x = (a == "-") ? 0 : a.replace( /,/, "." );
+				var y = (b == "-") ? 0 : b.replace( /,/, "." );
+				x = parseFloat( x );
+				y = parseFloat( y );
+				return ((x < y) ? -1 : ((x > y) ?  1 : 0));
+			};
+			
+			jQuery.fn.dataTableExt.oSort['numeric-comma-desc'] = function(a,b) {
+				var x = (a == "-") ? 0 : a.replace( /,/, "." );
+				var y = (b == "-") ? 0 : b.replace( /,/, "." );
+				x = parseFloat( x );
+				y = parseFloat( y );
+				return ((x < y) ?  1 : ((x > y) ? -1 : 0));
+			};
+			
+			$(document).ready(function() {
+				$('#example').dataTable();
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> sorting and type detection example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>When dealing with your own data formatting, it can often be very useful to have DataTables detect data types and sorting them accordingly for types which are not build into DataTables. For this reason plug-in support is provided to allow custom type detection and sorting.</p>
+			<p>This example shows sorting with a comma (',') for a decimal place. These plug-ins (and others can be found on <a href="http://www.datatables.net/plug-ins">DataTables.net</a>.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5,5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1,7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1,9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1,7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1,1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1,2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1,3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1,4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1,5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1,6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1,7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125,5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312,8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419,3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522,1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420,1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8,5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3,1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3,3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3,5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>jQuery.fn.dataTableExt.aTypes.push(
+	function ( sData )
+	{
+		var sValidChars = "0123456789-,";
+		var Char;
+		var bDecimal = false;
+		
+		/* Check the numeric part */
+		for ( i=0 ; i&lt;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-comma';
+	}
+);
+
+jQuery.fn.dataTableExt.oSort['numeric-comma-asc']  = function(a,b) {
+	var x = (a == "-") ? 0 : a.replace( /,/, "." );
+	var y = (b == "-") ? 0 : b.replace( /,/, "." );
+	x = parseFloat( x );
+	y = parseFloat( y );
+	return ((x &lt; y) ? -1 : ((x > y) ?  1 : 0));
+};
+
+jQuery.fn.dataTableExt.oSort['numeric-comma-desc'] = function(a,b) {
+	var x = (a == "-") ? 0 : a.replace( /,/, "." );
+	var y = (b == "-") ? 0 : b.replace( /,/, "." );
+	x = parseFloat( x );
+	y = parseFloat( y );
+	return ((x &lt; y) ?  1 : ((x > y) ? -1 : 0));
+};
+
+$(document).ready(function() {
+	$('#example').dataTable();
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about it's API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/alt_pagination.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/alt_pagination.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/alt_pagination.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,513 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"sPaginationType": "full_numbers"
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example" class="example_alt_pagination">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> alternative pagination example
+			</div>
+
+			<h1>Preamble</h1>
+			<p>The page controls which are used by default in <i>DataTables</i> (forward and backward buttons only) are great for most situations, but there are cases where you may wish to customise the controls presented to the end user. This is made simple by <i>DataTables</i> through it's extensible pagination mechanism. There are two types of pagination controls built into <i>DataTables</i>: <b>two_button</b> (default) and <b>full_numbers</b>. To switch between these two types, use the <b>sPaginationType</b> initialisation parameter. You can add additional types of pagination control by extending the <b>$.fn.dataTableExt.oPagination</b> object.</p>
+			<p>Note also that the number of pages which are shown with direct links (the 1, 2, 3...) can be changed by setting the variable <b>jQuery.fn.dataTableExt.oPagination.iFullNumbersShowPages</b> (default 5). Odd numbers are best to keep the display even.</p>
+			<p>The example below shows the <b>full_numbers</b> type of pagination, where 'first', 'previous', 'next' and 'last' buttons are presented, as well as the five pages around the current page.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>
+				Internet
+				 Explorer 
+				4.0
+				</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"sPaginationType": "full_numbers"
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/dom.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/dom.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/dom.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,565 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"sDom": '<"top"i>rt<"bottom"flp<"clear">'
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> DOM positioning example
+			</div>
+
+			<h1>Preamble</h1>
+			<p>When customising <i>DataTables</i> for your own usage, you might find that the default position of the feature elements (filter input etc) is not quite to your liking. To address this issue <i>DataTables</i> takes inspiration from the CSS 3 Advanced Layout Module and provides the <b>sDom</b> initialisation parameter which can be set to indicate where you which particular features to appear in the DOM. You can also specify <b>div</b> wrapping containers (with classes) to provide complete layout flexibility. The syntax available is:</p>
+			<ul>
+				<li><b>l</b> - Length changing</li>
+				<li><b>f</b> - Filtering input</li>
+				<li><b>t</b> - The table!</li>
+				<li><b>i</b> - Information</li>
+				<li><b>p</b> - Pagination</li>
+				<li><b>r</b> - pRocessing</li>
+				<li><b>&lt;</b> and <b>&gt;</b> - div elements</li>
+				<li><b>&lt;"class"</b> and <b>&gt;</b> - div with a class</li>
+				<li>Examples: <b>&lt;"wrapper"flipt&gt;</b>, <b>&lt;lf&lt;t&gt;ip&gt;</b></li>
+			</ul>
+			<p>In the example below I've moved the table information to the top of the table, and all the interaction elements to the bottom, each wrapper in a container <b>div</b>.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>
+				Internet
+				 Explorer 
+				4.0
+				</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"sDom": '<"top"i>rt<"bottom"flp<"clear">'
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/filter_only.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/filter_only.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/filter_only.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,554 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"bPaginate": false,
+					"bLengthChange": false,
+					"bFilter": true,
+					"bSort": false,
+					"bInfo": false,
+					"bAutoWidth": false } );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> with only the filter feature
+			</div>
+
+			<h1>Preamble</h1>
+			<p>Disabling features that you don't wish to use for a particular table is easily done by setting a variable in the initialisation object. In the following example only the filter feature is left enabled (although I've explicitly declared it as enabled).</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"bPaginate": false,
+		"bLengthChange": false,
+		"bFilter": true,
+		"bSort": false,
+		"bInfo": false,
+		"bAutoWidth": false } );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/hidden_columns.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/hidden_columns.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/hidden_columns.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,558 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"aoColumns": [ 
+						/* Engine */   null,
+						/* Browser */  null,
+						/* Platform */ { "bSearchable": false,
+						                 "bVisible":    false },
+						/* Version */  { "bVisible":    false },
+						/* Grade */    null
+					] } );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> with hidden columns
+			</div>
+
+			<h1>Preamble</h1>
+			<p>There are times when you might find it useful to display only a sub-set of the information that was available in the original table. For example you might want to reduce the amount of data shown on screen to make it clearer for the user. This hidden data can still be filtered upon allowing the user access to that data (for example 'tag' information for a row entry), or this can be disabled. In the table below both the platform and engine version columns have been hidden, the former is searchable, the latter is not.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"aoColumns": [ 
+			/* Engine */   null,
+			/* Browser */  null,
+			/* Platform */ { "bSearchable": false,
+			                 "bVisible":    false },
+			/* Version */  { "bVisible":    false },
+			/* Grade */    null
+		] } );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/language.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/language.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/language.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,558 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"oLanguage": {
+						"sLengthMenu": "Display _MENU_ records per page",
+						"sZeroRecords": "Nothing found - sorry",
+						"sInfo": "Showing _START_ to _END_ of _TOTAL_ records",
+						"sInfoEmtpy": "Showing 0 to 0 of 0 records",
+						"sInfoFiltered": "(filtered from _MAX_ total records)"
+					}
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> dynamic language
+			</div>
+
+			<h1>Preamble</h1>
+			<p>Changing the language information displayed by <i>DataTables</i> is as simple as passing in a language object to the dataTable constructor. The example above shows a different set of English language definitions to be used, rather than the defaults.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"oLanguage": {
+			"sLengthMenu": "Display _MENU_ records per page",
+			"sZeroRecords": "Nothing found - sorry",
+			"sInfo": "Showing _START_ to _END_ of _TOTAL_ records",
+			"sInfoEmtpy": "Showing 0 to 0 of 0 records",
+			"sInfoFiltered": "(filtered from _MAX_ total records)"
+		}
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/multi_col_sort.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/multi_col_sort.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/multi_col_sort.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,585 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			/* Define two custom functions (asc and desc) for string sorting */
+			jQuery.fn.dataTableExt.oSort['string-case-asc']  = function(x,y) {
+				return ((x < y) ? -1 : ((x > y) ?  1 : 0));
+			};
+			
+			jQuery.fn.dataTableExt.oSort['string-case-desc'] = function(x,y) {
+				return ((x < y) ?  1 : ((x > y) ? -1 : 0));
+			};
+			
+			$(document).ready(function() {
+				/* Build the DataTable with third column using our custom sort functions */
+				$('#example').dataTable( {
+					"aaSorting": [ [0,'asc'], [1,'asc'] ],
+					"aoColumns": [
+						null,
+						null,
+						{ "sType": 'string-case' },
+						null,
+						null
+					]
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> multi column and custom sort example
+			</div>
+
+			<h1>Preamble</h1>
+			<p>As you would expect with a desktop application, <i>DataTables</i> allows you to sort by multiple columns at the same time. This multiple sorting mechanism is always active if the <b>bSort</b> initialiser is <b>true</b> (it is by default) and the end user can activate it by 'shift' clicking on the column they want to add to the sort. You can also pass in an array of information using the <b>aaSorting</b> initialiser, as I have done in the example below there the first column is sorted as the primary column and the second one then used if the elements in the first column match. As many columns as you wish can be added to the sort.</p>
+			<p><i>DataTables</i> also provides a method to add your own sorting functions, to extend those built into DataTables. This can be very useful if you wish to sort on data formats such as currency and non-Javascript standard date formats (<a href="http://www.overset.com/2008/09/01/javascript-natural-sort-algorithm/">this natural sort</a> algorithm is a popular useage). This is achieved by extending the <b>jQuery.fn.dataTableExt</b> object with ascending and descending sort functions. In the example below I've added case sensitive sorting functions.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>/* Define two custom functions (asc and desc) for string sorting */
+jQuery.fn.dataTableExt.oSort['string-case-asc']  = function(x,y) {
+	return ((x < y) ? -1 : ((x > y) ?  1 : 0));
+};
+
+jQuery.fn.dataTableExt.oSort['string-case-desc'] = function(x,y) {
+	return ((x < y) ?  1 : ((x > y) ? -1 : 0));
+};
+
+$(document).ready(function() {
+	/* Build the DataTable with third column using our custom sort functions */
+	$('#example').dataTable( {
+		"aaSorting": [ [0,'asc'], [1,'asc'] ],
+		"aoColumns": [
+			null,
+			null,
+			{ "sType": 'string-case' },
+			null,
+			null
+		]
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/multiple_tables.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/multiple_tables.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/multiple_tables.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,362 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('.dataTable').dataTable();
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> multiple tables example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>Using standard jQuery selector syntax with <i>DataTables</i> it is trivial to initialise multiple tables with a single line of Javascript, as shown below. All tables are completely independent, but share the parameters passed thought the initialiser object (for example if you specific the Spanish language file, all tables will be shown in Spanish).</p>
+			
+			<h1>Live example</h1>
+			
+			<p style="font-weight: bold;">Trident based browsers</p>
+			<div id="demo_trident">
+<table cellpadding="0" cellspacing="0" border="0" class="display dataTable" id="allan">
+	<thead>
+		<tr>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+	</table>
+			</div>
+			<div class="clear"></div>
+	
+	
+			<p style="clear:both; margin-top:4em; font-weight: bold;">Gecko based browsers</p>
+			<div id="demo_gecko">
+<table cellpadding="0" cellspacing="0" border="0" class="display dataTable">
+	<thead>
+		<tr>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeA">
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+	</table>
+			</div>
+			<div class="clear"></div>
+	
+	
+			<p style="clear:both; margin-top:4em; font-weight: bold;">WebKit based browsers (note no platform)</p>
+			<div id="demo_webkit">
+<table cellpadding="0" cellspacing="0" border="0" class="display dataTable">
+	<thead>
+		<tr>
+			<th>Browser</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeA">
+			<td>Safari 1.2</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Safari 1.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Safari 2.0</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Safari 3.0</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>OmniWeb 5.5</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>iPod Touch / iPhone</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+	</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('.dataTable').dataTable();
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/state_save.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/state_save.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/state_save.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,554 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+		var oTable;
+		var oS;
+			$(document).ready(function() {
+				oTable = $('#example').dataTable( {
+					"bStateSave": true
+				} );
+				oS = oTable.fnSettings();
+				console.dir( oS.aoColumns );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> state saving example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p><i>DataTables</i> can use cookies in the end user's web-browser in order to store it's state after each change in drawing. What this means is that if the user were to reload the page, the table should remain exactly as it was (length, filtering, pagination and sorting). This feature is disabled by default, but can be easily enabled using the <b>bStateSave</b> initialisation parameter as shown in this example. Note also that the duration of the cookie can be set using the <b>iCookieDuration</b> initialisation parameter (which is in seconds).</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"bStateSave": true
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/table_sorting.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/table_sorting.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/table_sorting.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,550 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"aaSorting": [[ 4, "desc" ]]
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> table sorting example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>With <i>DataTables</i> you can alter the sorting characteristics of the table at initialisation time. Using the <b>aaSorting</b> initialisation parameter, you can get the table exactly how you want to present the information. The <b>aaSorting</b> parameter is an array of arrays where the first value is the column to sort on, and the second is 'asc' or 'desc' as required (it is a double array for <a href="../basic_init/multi_col_sort.html">multi-column sorting</a>). The table below is sorted (descending) by the CSS grade. Note also that the 'Engine version' column is automatically detected as a numeric column and sorted accordingly.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"aaSorting": [[ 4, "desc" ]]
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/themes.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/themes.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/themes.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,551 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table_jui.css";
+			@import "../examples_support/themes/smoothness/jquery-ui-1.7.2.custom.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				oTable = $('#example').dataTable({
+					"bJQueryUI": true,
+					"sPaginationType": "full_numbers",
+					"aoColumns": [
+						{ bSortable: false },
+						null,
+						null,
+						null,
+						null
+					]
+				});
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> with jQuery UI themes example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>Styling widgets such as DataTables can often take a considerable amount of time to fully integrate it into your site/application, with the demo styles as a base. This holes true for all widgets, and the jQuery UI team have addressed this issue by introducing themes through their excellent <a href="http://jqueryui.com/themeroller/">ThemeRoller</a>. DataTables has full support for ThemeRoller created themes, all you need to do is enable the <b>bJQueryUI</b> flag in the initialisation object, and the required mark-up and classes will be added by DataTables.</p>
+			
+			<h1>Live example</h1>
+			<div class="demo_jui">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	oTable = $('#example').dataTable({
+		"bJQueryUI": true,
+		"sPaginationType": "full_numbers"
+	});
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/zero_config.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/zero_config.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/basic_init/zero_config.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,546 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable();
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> zero configuration example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p><i>DataTables</i> has most features enabled by default, so all you need to do to use it with one of your own tables is to call the construction function (as shown below).</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable();
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.
+				</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/ajax.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/ajax.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/ajax.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,150 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"bProcessing": true,
+					"sAjaxSource": '../examples_support/json_source.txt'
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> AJAX source example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>Although <i>DataTables</i> is built from the principle of progressive enhancement, it is often useful to be able to construct a table from an AJAX source. This can be done in one of two ways - either using the <b>aData</b> initialisation parameter which takes an array of data, or using the <b>sAjaxSource</b> initialisation parameter which will have <i>DataTables</i> go to that source with an XHR call and load data from there. This example shows the latter method in action. <i>DataTables</i> expects an object with an array called "aaData" with the data source.</p>
+			
+			<h1>Live example</h1>
+			<div id="dynamic">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th width="20%">Rendering engine</th>
+			<th width="25%">Browser</th>
+			<th width="25%">Platform(s)</th>
+			<th width="15%">Engine version</th>
+			<th width="15%">CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"bProcessing": true,
+		"sAjaxSource": '../examples_support/json_source.txt'
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/dom.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/dom.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/dom.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,546 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable();
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> zero configuration example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>The foundation for DataTables is progressive enhancement, so it is very adept at reading table information directly from the DOM. Therefore, if your user's browser is capable the user will get a DataTables enhanced experience. Otherwise they get the plain HTML.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable();
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/js_array.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/js_array.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/js_array.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,236 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			/* Data set - can contain whatever information you want */
+			var aDataSet = [
+				['Trident','Internet Explorer 4.0','Win 95+','4','X'],
+				['Trident','Internet Explorer 5.0','Win 95+','5','C'],
+				['Trident','Internet Explorer 5.5','Win 95+','5.5','A'],
+				['Trident','Internet Explorer 6','Win 98+','6','A'],
+				['Trident','Internet Explorer 7','Win XP SP2+','7','A'],
+				['Trident','AOL browser (AOL desktop)','Win XP','6','A'],
+				['Gecko','Firefox 1.0','Win 98+ / OSX.2+','1.7','A'],
+				['Gecko','Firefox 1.5','Win 98+ / OSX.2+','1.8','A'],
+				['Gecko','Firefox 2.0','Win 98+ / OSX.2+','1.8','A'],
+				['Gecko','Firefox 3.0','Win 2k+ / OSX.3+','1.9','A'],
+				['Gecko','Camino 1.0','OSX.2+','1.8','A'],
+				['Gecko','Camino 1.5','OSX.3+','1.8','A'],
+				['Gecko','Netscape 7.2','Win 95+ / Mac OS 8.6-9.2','1.7','A'],
+				['Gecko','Netscape Browser 8','Win 98SE+','1.7','A'],
+				['Gecko','Netscape Navigator 9','Win 98+ / OSX.2+','1.8','A'],
+				['Gecko','Mozilla 1.0','Win 95+ / OSX.1+',1,'A'],
+				['Gecko','Mozilla 1.1','Win 95+ / OSX.1+',1.1,'A'],
+				['Gecko','Mozilla 1.2','Win 95+ / OSX.1+',1.2,'A'],
+				['Gecko','Mozilla 1.3','Win 95+ / OSX.1+',1.3,'A'],
+				['Gecko','Mozilla 1.4','Win 95+ / OSX.1+',1.4,'A'],
+				['Gecko','Mozilla 1.5','Win 95+ / OSX.1+',1.5,'A'],
+				['Gecko','Mozilla 1.6','Win 95+ / OSX.1+',1.6,'A'],
+				['Gecko','Mozilla 1.7','Win 98+ / OSX.1+',1.7,'A'],
+				['Gecko','Mozilla 1.8','Win 98+ / OSX.1+',1.8,'A'],
+				['Gecko','Seamonkey 1.1','Win 98+ / OSX.2+','1.8','A'],
+				['Gecko','Epiphany 2.20','Gnome','1.8','A'],
+				['Webkit','Safari 1.2','OSX.3','125.5','A'],
+				['Webkit','Safari 1.3','OSX.3','312.8','A'],
+				['Webkit','Safari 2.0','OSX.4+','419.3','A'],
+				['Webkit','Safari 3.0','OSX.4+','522.1','A'],
+				['Webkit','OmniWeb 5.5','OSX.4+','420','A'],
+				['Webkit','iPod Touch / iPhone','iPod','420.1','A'],
+				['Webkit','S60','S60','413','A'],
+				['Presto','Opera 7.0','Win 95+ / OSX.1+','-','A'],
+				['Presto','Opera 7.5','Win 95+ / OSX.2+','-','A'],
+				['Presto','Opera 8.0','Win 95+ / OSX.2+','-','A'],
+				['Presto','Opera 8.5','Win 95+ / OSX.2+','-','A'],
+				['Presto','Opera 9.0','Win 95+ / OSX.3+','-','A'],
+				['Presto','Opera 9.2','Win 88+ / OSX.3+','-','A'],
+				['Presto','Opera 9.5','Win 88+ / OSX.3+','-','A'],
+				['Presto','Opera for Wii','Wii','-','A'],
+				['Presto','Nokia N800','N800','-','A'],
+				['Presto','Nintendo DS browser','Nintendo DS','8.5','C/A<sup>1</sup>'],
+				['KHTML','Konqureror 3.1','KDE 3.1','3.1','C'],
+				['KHTML','Konqureror 3.3','KDE 3.3','3.3','A'],
+				['KHTML','Konqureror 3.5','KDE 3.5','3.5','A'],
+				['Tasman','Internet Explorer 4.5','Mac OS 8-9','-','X'],
+				['Tasman','Internet Explorer 5.1','Mac OS 7.6-9','1','C'],
+				['Tasman','Internet Explorer 5.2','Mac OS 8-X','1','C'],
+				['Misc','NetFront 3.1','Embedded devices','-','C'],
+				['Misc','NetFront 3.4','Embedded devices','-','A'],
+				['Misc','Dillo 0.8','Embedded devices','-','X'],
+				['Misc','Links','Text only','-','X'],
+				['Misc','Lynx','Text only','-','X'],
+				['Misc','IE Mobile','Windows Mobile 6','-','C'],
+				['Misc','PSP browser','PSP','-','C'],
+				['Other browsers','All others','-','-','U']
+			];
+			
+			$(document).ready(function() {
+				$('#dynamic').html( '<table cellpadding="0" cellspacing="0" border="0" class="display" id="example"></table>' );
+				$('#example').dataTable( {
+					"aaData": aDataSet,
+					"aoColumns": [
+						{ "sTitle": "Engine" },
+						{ "sTitle": "Browser" },
+						{ "sTitle": "Platform" },
+						{ "sTitle": "Version", "sClass": "center" },
+						{
+							"sTitle": "Grade",
+							"sClass": "center",
+							"fnRender": function(obj) {
+								var sReturn = obj.aData[ obj.iDataColumn ];
+								if ( sReturn == "A" ) {
+									sReturn = "<b>A</b>";
+								}
+								return sReturn;
+							}
+						}
+					]
+				} );	
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> dynamic creation example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>At times you will wish to be able to create a table from dynamic information passed directly to <i>DataTables</i>, rather than having it read from the document. This is achieved using the "aaData" array in the initialisation object. A table node must first be created before the initialiser is called (as shown in the code below). This is also useful for optimisation - if you are able to format the data as required, this method can save a lot of DOM parsing to create a table.</p>
+			
+			<h1>Live example</h1>
+			<div id="dynamic"></div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#demo').html( '&lt;table cellpadding="0" cellspacing="0" border="0" class="display" id="example"&gt;&lt;/table&gt;' );
+	$('#example').dataTable( {
+		"aaData": [
+			/* Reduced data set */
+			[ "Trident", "Internet Explorer 4.0", "Win 95+", 4, "X" ],
+			[ "Trident", "Internet Explorer 5.0", "Win 95+", 5, "C" ],
+			[ "Trident", "Internet Explorer 5.5", "Win 95+", 5.5, "A" ],
+			[ "Trident", "Internet Explorer 6.0", "Win 98+", 6, "A" ],
+			[ "Trident", "Internet Explorer 7.0", "Win XP SP2+", 7, "A" ],
+			[ "Gecko", "Firefox 1.5", "Win 98+ / OSX.2+", 1.8, "A" ],
+			[ "Gecko", "Firefox 2", "Win 98+ / OSX.2+", 1.8, "A" ],
+			[ "Gecko", "Firefox 3", "Win 2k+ / OSX.3+", 1.9, "A" ],
+			[ "Webkit", "Safari 1.2", "OSX.3", 125.5, "A" ],
+			[ "Webkit", "Safari 1.3", "OSX.3", 312.8, "A" ],
+			[ "Webkit", "Safari 2.0", "OSX.4+", 419.3, "A" ],
+			[ "Webkit", "Safari 3.0", "OSX.4+", 522.1, "A" ]
+		],
+		"aoColumns": [
+			{ "sTitle": "Engine" },
+			{ "sTitle": "Browser" },
+			{ "sTitle": "Platform" },
+			{ "sTitle": "Version", "sClass": "center" },
+			{
+				"sTitle": "Grade",
+				"sClass": "center",
+				"fnRender": function(obj) {
+					var sReturn = obj.aData[ obj.iDataColumn ];
+					if ( sReturn == "A" ) {
+						sReturn = "&lt;b&gt;A&lt;/b&gt;";
+					}
+					return sReturn;
+				}
+			}
+		]
+	} );	
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/server_side.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/server_side.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/data_sources/server_side.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,269 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"bProcessing": true,
+					"bServerSide": true,
+					"sAjaxSource": "../examples_support/server_processing.php"
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> server-side processing example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>There are many ways to get your data into DataTables, and if you are working with seriously large databases, you might want to consider using the server-side options that DataTables provides. Basically all of the paging, filtering, sorting etc that DataTables does can be handed off to a server (or any other data source - Google Gears or Adobe Air for example!) and DataTables is just an events and display module.</p>
+			<p>The example here shows a very simple display of the CSS data (used in all my other examples), but in this instance coming from the server on each draw. Filtering, multi-column sorting etc all work as you would expect.</p>
+			
+			<h1>Live example</h1>
+			<div id="dynamic">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th width="20%">Rendering engine</th>
+			<th width="25%">Browser</th>
+			<th width="25%">Platform(s)</th>
+			<th width="15%">Engine version</th>
+			<th width="15%">CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td colspan="5" class="dataTables_empty">Loading data from server</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"bProcessing": true,
+		"bServerSide": true,
+		"sAjaxSource": "../examples_support/server_processing.php"
+	} );
+} );</pre>
+			
+			
+			<h1>Server side (PHP) code</h1>
+			<pre>&lt;?php
+  /* MySQL connection */
+	$gaSql['user']       = "*********";
+	$gaSql['password']   = "*********";
+	$gaSql['db']         = "*********";
+	$gaSql['server']     = "*********";
+	$gaSql['type']       = "mysql";
+	
+	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
+		die( 'Could not open connection to server' );
+	
+	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or 
+		die( 'Could not select database '. $gaSql['db'] );
+	
+	/* Paging */
+	$sLimit = "";
+	if ( isset( $_GET['iDisplayStart'] ) )
+	{
+		$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
+			mysql_real_escape_string( $_GET['iDisplayLength'] );
+	}
+	
+	/* Ordering */
+	if ( isset( $_GET['iSortCol_0'] ) )
+	{
+		$sOrder = "ORDER BY  ";
+		for ( $i=0 ; $i&lt;mysql_real_escape_string( $_GET['iSortingCols'] ) ; $i++ )
+		{
+			$sOrder .= fnColumnToField(mysql_real_escape_string( $_GET['iSortCol_'.$i] ))."
+			 	".mysql_real_escape_string( $_GET['iSortDir_'.$i] ) .", ";
+		}
+		$sOrder = substr_replace( $sOrder, "", -2 );
+	}
+	
+	/* Filtering - NOTE this does not match the built-in DataTables filtering which does it
+	 * word by word on any field. It's possible to do here, but concerned about efficiency
+	 * on very large tables, and MySQL's regex functionality is very limited
+	 */
+	$sWhere = "";
+	if ( $_GET['sSearch'] != "" )
+	{
+		$sWhere = "WHERE engine LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "browser LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "platform LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "version LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "grade LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%'";
+	}
+	
+	$sQuery = "
+		SELECT SQL_CALC_FOUND_ROWS id, engine, browser, platform, version, grade
+		FROM   ajax
+		$sWhere
+		$sOrder
+		$sLimit
+	";
+	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	
+	$sQuery = "
+		SELECT FOUND_ROWS()
+	";
+	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
+	$iFilteredTotal = $aResultFilterTotal[0];
+	
+	$sQuery = "
+		SELECT COUNT(id)
+		FROM   ajax
+	";
+	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultTotal = mysql_fetch_array($rResultTotal);
+	$iTotal = $aResultTotal[0];
+	
+	$sOutput = '{';
+	$sOutput .= '"sEcho": '.$_GET['sEcho'].', ';
+	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
+	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
+	$sOutput .= '"aaData": [ ';
+	while ( $aRow = mysql_fetch_array( $rResult ) )
+	{
+		$sOutput .= "[";
+		$sOutput .= '"'.addslashes($aRow['engine']).'",';
+		$sOutput .= '"'.addslashes($aRow['browser']).'",';
+		$sOutput .= '"'.addslashes($aRow['platform']).'",';
+		if ( $aRow['version'] == "0" )
+			$sOutput .= '"-",';
+		else
+			$sOutput .= '"'.addslashes($aRow['version']).'",';
+		$sOutput .= '"'.addslashes($aRow['grade']).'"';
+		$sOutput .= "],";
+	}
+	$sOutput = substr_replace( $sOutput, "", -1 );
+	$sOutput .= '] }';
+	
+	echo $sOutput;
+	
+	
+	function fnColumnToField( $i )
+	{
+		if ( $i == 0 )
+			return "engine";
+		else if ( $i == 1 )
+			return "browser";
+		else if ( $i == 2 )
+			return "platform";
+		else if ( $i == 3 )
+			return "version";
+		else if ( $i == 4 )
+			return "grade";
+	}
+?&gt;</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/data.sql
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/data.sql	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/data.sql	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,67 @@
+CREATE TABLE IF NOT EXISTS `ajax` (
+  `id` int(10) NOT NULL auto_increment,
+  `engine` varchar(255) NOT NULL default '',
+  `browser` varchar(255) NOT NULL default '',
+  `platform` varchar(255) NOT NULL default '',
+  `version` float NOT NULL default '0',
+  `grade` varchar(20) NOT NULL default '',
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
+
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Trident', 'Internet Explorer 4.0', 'Win 95+', '4', 'X' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Trident', 'Internet Explorer 5.0', 'Win 95+', '5', 'C' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Trident', 'Internet Explorer 5.5', 'Win 95+', '5.5', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Trident', 'Internet Explorer 6', 'Win 98+', '6', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Trident', 'Internet Explorer 7', 'Win XP SP2+', '7', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Trident', 'AOL browser (AOL desktop)', 'Win XP', '6', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Firefox 1.0', 'Win 98+ / OSX.2+', '1.7', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Firefox 1.5', 'Win 98+ / OSX.2+', '1.8', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Firefox 2.0', 'Win 98+ / OSX.2+', '1.8', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Firefox 3.0', 'Win 2k+ / OSX.3+', '1.9', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Camino 1.0', 'OSX.2+', '1.8', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Camino 1.5', 'OSX.3+', '1.8', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Netscape 7.2', 'Win 95+ / Mac OS 8.6-9.2', '1.7', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Netscape Browser 8', 'Win 98SE+', '1.7', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Netscape Navigator 9', 'Win 98+ / OSX.2+', '1.8', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Mozilla 1.0', 'Win 95+ / OSX.1+', '1', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Mozilla 1.1', 'Win 95+ / OSX.1+', '1.1', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Mozilla 1.2', 'Win 95+ / OSX.1+', '1.2', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Mozilla 1.3', 'Win 95+ / OSX.1+', '1.3', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Mozilla 1.4', 'Win 95+ / OSX.1+', '1.4', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Mozilla 1.5', 'Win 95+ / OSX.1+', '1.5', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Mozilla 1.6', 'Win 95+ / OSX.1+', '1.6', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Mozilla 1.7', 'Win 98+ / OSX.1+', '1.7', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Mozilla 1.8', 'Win 98+ / OSX.1+', '1.8', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Seamonkey 1.1', 'Win 98+ / OSX.2+', '1.8', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Gecko', 'Epiphany 2.20', 'Gnome', '1.8', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Webkit', 'Safari 1.2', 'OSX.3', '125.5', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Webkit', 'Safari 1.3', 'OSX.3', '312.8', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Webkit', 'Safari 2.0', 'OSX.4+', '419.3', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Webkit', 'Safari 3.0', 'OSX.4+', '522.1', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Webkit', 'OmniWeb 5.5', 'OSX.4+', '420', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Webkit', 'iPod Touch / iPhone', 'iPod', '420.1', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Webkit', 'S60', 'S60', '413', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Presto', 'Opera 7.0', 'Win 95+ / OSX.1+', '-', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Presto', 'Opera 7.5', 'Win 95+ / OSX.2+', '-', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Presto', 'Opera 8.0', 'Win 95+ / OSX.2+', '-', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Presto', 'Opera 8.5', 'Win 95+ / OSX.2+', '-', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Presto', 'Opera 9.0', 'Win 95+ / OSX.3+', '-', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Presto', 'Opera 9.2', 'Win 88+ / OSX.3+', '-', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Presto', 'Opera 9.5', 'Win 88+ / OSX.3+', '-', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Presto', 'Opera for Wii', 'Wii', '-', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Presto', 'Nokia N800', 'N800', '-', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Presto', 'Nintendo DS browser', 'Nintendo DS', '8.5', 'C/A<sup>1</sup>' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'KHTML', 'Konqureror 3.1', 'KDE 3.1', '3.1', 'C' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'KHTML', 'Konqureror 3.3', 'KDE 3.3', '3.3', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'KHTML', 'Konqureror 3.5', 'KDE 3.5', '3.5', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Tasman', 'Internet Explorer 4.5', 'Mac OS 8-9', '-', 'X' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Tasman', 'Internet Explorer 5.1', 'Mac OS 7.6-9', '1', 'C' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Tasman', 'Internet Explorer 5.2', 'Mac OS 8-X', '1', 'C' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Misc', 'NetFront 3.1', 'Embedded devices', '-', 'C' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Misc', 'NetFront 3.4', 'Embedded devices', '-', 'A' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Misc', 'Dillo 0.8', 'Embedded devices', '-', 'X' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Misc', 'Links', 'Text only', '-', 'X' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Misc', 'Lynx', 'Text only', '-', 'X' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Misc', 'IE Mobile', 'Windows Mobile 6', '-', 'C' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Misc', 'PSP browser', 'PSP', '-', 'C' );
+INSERT INTO ajax ( engine, browser, platform, version, grade ) VALUES ( 'Other browsers', 'All others', '-', '-', 'U' );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/de_DE.txt
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/de_DE.txt	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/de_DE.txt	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,17 @@
+{
+	"sProcessing": "Bitte warten...",
+	"sLengthMenu": "_MENU_ Einträge anzeigen",
+	"sZeroRecords": "Keine Einträge vorhanden.",
+	"sInfo": "_START_ bis _END_ von _TOTAL_ Einträgen",
+	"sInfoEmpty": "0 bis 0 von 0 Einträgen",
+	"sInfoFiltered": "(gefiltert von _MAX_  Einträgen)",
+	"sInfoPostFix": "",
+	"sSearch": "Suchen",
+	"sUrl": "",
+	"oPaginate": {
+		"sFirst":    "Erster",
+		"sPrevious": "Zurück",
+		"sNext":     "Nächster",
+		"sLast":     "Letzter"
+	}
+}
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/details_close.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/details_close.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/details_open.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/details_open.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/editable_ajax.php
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/editable_ajax.php	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/editable_ajax.php	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,3 @@
+<?php
+	echo $_POST['value'].' (server updated)';
+?>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/index.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/index.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/index.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,7 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<html>
+	<frameset rows="15%,85%">
+		<frame src="controller.html">
+		<frame>
+	</frameset>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.dimensions.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.dimensions.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.dimensions.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,119 @@
+/* Copyright (c) 2007 Paul Bakaus (paul.bakaus at googlemail.com) and Brandon Aaron (brandon.aaron at gmail.com || http://brandonaaron.net)
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ *
+ * $LastChangedDate: 2007-12-20 08:46:55 -0600 (Thu, 20 Dec 2007) $
+ * $Rev: 4259 $
+ *
+ * Version: 1.2
+ *
+ * Requires: jQuery 1.2+
+ */
+
+(function($){
+	
+$.dimensions = {
+	version: '1.2'
+};
+
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+$.each( [ 'Height', 'Width' ], function(i, name){
+	
+	// innerHeight and innerWidth
+	$.fn[ 'inner' + name ] = function() {
+		if (!this[0]) return;
+		
+		var torl = name == 'Height' ? 'Top'    : 'Left',  // top or left
+		    borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right
+		
+		return this.is(':visible') ? this[0]['client' + name] : num( this, name.toLowerCase() ) + num(this, 'padding' + torl) + num(this, 'padding' + borr);
+	};
+	
+	// outerHeight and outerWidth
+	$.fn[ 'outer' + name ] = function(options) {
+		if (!this[0]) return;
+		
+		var torl = name == 'Height' ? 'Top'    : 'Left',  // top or left
+		    borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right
+		
+		options = $.extend({ margin: false }, options || {});
+		
+		var val = this.is(':visible') ? 
+				this[0]['offset' + name] : 
+				num( this, name.toLowerCase() )
+					+ num(this, 'border' + torl + 'Width') + num(this, 'border' + borr + 'Width')
+					+ num(this, 'padding' + torl) + num(this, 'padding' + borr);
+		
+		return val + (options.margin ? (num(this, 'margin' + torl) + num(this, 'margin' + borr)) : 0);
+	};
+});
+
+// Create scrollLeft and scrollTop methods
+$.each( ['Left', 'Top'], function(i, name) {
+	$.fn[ 'scroll' + name ] = function(val) {
+		if (!this[0]) return;
+		
+		return val != undefined ?
+		
+			// Set the scroll offset
+			this.each(function() {
+				this == window || this == document ?
+					window.scrollTo( 
+						name == 'Left' ? val : $(window)[ 'scrollLeft' ](),
+						name == 'Top'  ? val : $(window)[ 'scrollTop'  ]()
+					) :
+					this[ 'scroll' + name ] = val;
+			}) :
+			
+			// Return the scroll offset
+			this[0] == window || this[0] == document ?
+				self[ (name == 'Left' ? 'pageXOffset' : 'pageYOffset') ] ||
+					$.boxModel && document.documentElement[ 'scroll' + name ] ||
+					document.body[ 'scroll' + name ] :
+				this[0][ 'scroll' + name ];
+	};
+});
+
+$.fn.extend({
+	position: function() {
+		var left = 0, top = 0, elem = this[0], offset, parentOffset, offsetParent, results;
+		
+		if (elem) {
+			// Get *real* offsetParent
+			offsetParent = this.offsetParent();
+			
+			// Get correct offsets
+			offset       = this.offset();
+			parentOffset = offsetParent.offset();
+			
+			// Subtract element margins
+			offset.top  -= num(elem, 'marginTop');
+			offset.left -= num(elem, 'marginLeft');
+			
+			// Add offsetParent borders
+			parentOffset.top  += num(offsetParent, 'borderTopWidth');
+			parentOffset.left += num(offsetParent, 'borderLeftWidth');
+			
+			// Subtract the two offsets
+			results = {
+				top:  offset.top  - parentOffset.top,
+				left: offset.left - parentOffset.left
+			};
+		}
+		
+		return results;
+	},
+	
+	offsetParent: function() {
+		var offsetParent = this[0].offsetParent;
+		while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && $.css(offsetParent, 'position') == 'static') )
+			offsetParent = offsetParent.offsetParent;
+		return $(offsetParent);
+	}
+});
+
+function num(el, prop) {
+	return parseInt($.curCSS(el.jquery?el[0]:el,prop,true))||0;
+};
+
+})(jQuery);
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.jeditable.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.jeditable.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.jeditable.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,505 @@
+/*
+ * Jeditable - jQuery in place edit plugin
+ *
+ * Copyright (c) 2006-2008 Mika Tuupola, Dylan Verheul
+ *
+ * Licensed under the MIT license:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *
+ * Project home:
+ *   http://www.appelsiini.net/projects/jeditable
+ *
+ * Based on editable by Dylan Verheul <dylan_at_dyve.net>:
+ *    http://www.dyve.net/jquery/?editable
+ *
+ */
+
+/**
+  * Version 1.6.2
+  *
+  * ** means there is basic unit tests for this parameter. 
+  *
+  * @name  Jeditable
+  * @type  jQuery
+  * @param String  target             (POST) URL or function to send edited content to **
+  * @param Hash    options            additional options 
+  * @param String  options[method]    method to use to send edited content (POST or PUT) **
+  * @param Function options[callback] Function to run after submitting edited content **
+  * @param String  options[name]      POST parameter name of edited content
+  * @param String  options[id]        POST parameter name of edited div id
+  * @param Hash    options[submitdata] Extra parameters to send when submitting edited content.
+  * @param String  options[type]      text, textarea or select (or any 3rd party input type) **
+  * @param Integer options[rows]      number of rows if using textarea ** 
+  * @param Integer options[cols]      number of columns if using textarea **
+  * @param Mixed   options[height]    'auto', 'none' or height in pixels **
+  * @param Mixed   options[width]     'auto', 'none' or width in pixels **
+  * @param String  options[loadurl]   URL to fetch input content before editing **
+  * @param String  options[loadtype]  Request type for load url. Should be GET or POST.
+  * @param String  options[loadtext]  Text to display while loading external content.
+  * @param Mixed   options[loaddata]  Extra parameters to pass when fetching content before editing.
+  * @param Mixed   options[data]      Or content given as paramameter. String or function.**
+  * @param String  options[indicator] indicator html to show when saving
+  * @param String  options[tooltip]   optional tooltip text via title attribute **
+  * @param String  options[event]     jQuery event such as 'click' of 'dblclick' **
+  * @param String  options[submit]    submit button value, empty means no button **
+  * @param String  options[cancel]    cancel button value, empty means no button **
+  * @param String  options[cssclass]  CSS class to apply to input form. 'inherit' to copy from parent. **
+  * @param String  options[style]     Style to apply to input form 'inherit' to copy from parent. **
+  * @param String  options[select]    true or false, when true text is highlighted ??
+  * @param String  options[placeholder] Placeholder text or html to insert when element is empty. **
+  * @param String  options[onblur]    'cancel', 'submit', 'ignore' or function ??
+  *             
+  * @param Function options[onsubmit] function(settings, original) { ... } called before submit
+  * @param Function options[onreset]  function(settings, original) { ... } called before reset
+  * @param Function options[onerror]  function(settings, original, xhr) { ... } called on error
+  *             
+  * @param Hash    options[ajaxoptions]  jQuery Ajax options. See docs.jquery.com.
+  *             
+  */
+
+(function($) {
+
+    $.fn.editable = function(target, options) {
+    
+        var settings = {
+            target     : target,
+            name       : 'value',
+            id         : 'id',
+            type       : 'text',
+            width      : 'auto',
+            height     : 'auto',
+            event      : 'click',
+            onblur     : 'cancel',
+            loadtype   : 'GET',
+            loadtext   : 'Loading...',
+            placeholder: 'Click to edit',
+            loaddata   : {},
+            submitdata : {},
+            ajaxoptions: {}
+        };
+        
+        if(options) {
+            $.extend(settings, options);
+        }
+    
+        /* setup some functions */
+        var plugin   = $.editable.types[settings.type].plugin || function() { };
+        var submit   = $.editable.types[settings.type].submit || function() { };
+        var buttons  = $.editable.types[settings.type].buttons 
+                    || $.editable.types['defaults'].buttons;
+        var content  = $.editable.types[settings.type].content 
+                    || $.editable.types['defaults'].content;
+        var element  = $.editable.types[settings.type].element 
+                    || $.editable.types['defaults'].element;
+        var reset    = $.editable.types[settings.type].reset 
+                    || $.editable.types['defaults'].reset;
+        var callback = settings.callback || function() { };
+        var onsubmit = settings.onsubmit || function() { };
+        var onreset  = settings.onreset  || function() { };
+        var onerror  = settings.onerror  || reset;
+        
+        /* add custom event if it does not exist */
+        if  (!$.isFunction($(this)[settings.event])) {
+            $.fn[settings.event] = function(fn){
+                return fn ? this.bind(settings.event, fn) : this.trigger(settings.event);
+            }
+        }
+          
+        /* show tooltip */
+        $(this).attr('title', settings.tooltip);
+        
+        settings.autowidth  = 'auto' == settings.width;
+        settings.autoheight = 'auto' == settings.height;
+
+        return this.each(function() {
+                        
+            /* save this to self because this changes when scope changes */
+            var self = this;  
+                   
+            /* inlined block elements lose their width and height after first edit */
+            /* save them for later use as workaround */
+            var savedwidth  = $(self).width();
+            var savedheight = $(self).height();
+            
+            /* if element is empty add something clickable (if requested) */
+            if (!$.trim($(this).html())) {
+                $(this).html(settings.placeholder);
+            }
+            
+            $(this)[settings.event](function(e) {
+
+                /* prevent throwing an exeption if edit field is clicked again */
+                if (self.editing) {
+                    return;
+                }
+
+                /* remove tooltip */
+                $(self).removeAttr('title');
+                
+                /* figure out how wide and tall we are, saved width and height */
+                /* are workaround for http://dev.jquery.com/ticket/2190 */
+                if (0 == $(self).width()) {
+                    //$(self).css('visibility', 'hidden');
+                    settings.width  = savedwidth;
+                    settings.height = savedheight;
+                } else {
+                    if (settings.width != 'none') {
+                        settings.width = 
+                            settings.autowidth ? $(self).width()  : settings.width;
+                    }
+                    if (settings.height != 'none') {
+                        settings.height = 
+                            settings.autoheight ? $(self).height() : settings.height;
+                    }
+                }
+                //$(this).css('visibility', '');
+                
+                /* remove placeholder text, replace is here because of IE */
+                if ($(this).html().toLowerCase().replace(/;/, '') == 
+                    settings.placeholder.toLowerCase().replace(/;/, '')) {
+                        $(this).html('');
+                }
+                                
+                self.editing    = true;
+                self.revert     = $(self).html();
+                $(self).html('');
+
+                /* create the form object */
+                var form = $('<form />');
+                
+                /* apply css or style or both */
+                if (settings.cssclass) {
+                    if ('inherit' == settings.cssclass) {
+                        form.attr('class', $(self).attr('class'));
+                    } else {
+                        form.attr('class', settings.cssclass);
+                    }
+                }
+
+                if (settings.style) {
+                    if ('inherit' == settings.style) {
+                        form.attr('style', $(self).attr('style'));
+                        /* IE needs the second line or display wont be inherited */
+                        form.css('display', $(self).css('display'));                
+                    } else {
+                        form.attr('style', settings.style);
+                    }
+                }
+
+                /* add main input element to form and store it in input */
+                var input = element.apply(form, [settings, self]);
+
+                /* set input content via POST, GET, given data or existing value */
+                var input_content;
+                
+                if (settings.loadurl) {
+                    var t = setTimeout(function() {
+                        input.disabled = true;
+                        content.apply(form, [settings.loadtext, settings, self]);
+                    }, 100);
+
+                    var loaddata = {};
+                    loaddata[settings.id] = self.id;
+                    if ($.isFunction(settings.loaddata)) {
+                        $.extend(loaddata, settings.loaddata.apply(self, [self.revert, settings]));
+                    } else {
+                        $.extend(loaddata, settings.loaddata);
+                    }
+                    $.ajax({
+                       type : settings.loadtype,
+                       url  : settings.loadurl,
+                       data : loaddata,
+                       async : false,
+                       success: function(result) {
+                          window.clearTimeout(t);
+                          input_content = result;
+                          input.disabled = false;
+                       }
+                    });
+                } else if (settings.data) {
+                    input_content = settings.data;
+                    if ($.isFunction(settings.data)) {
+                        input_content = settings.data.apply(self, [self.revert, settings]);
+                    }
+                } else {
+                    input_content = self.revert; 
+                }
+                content.apply(form, [input_content, settings, self]);
+
+                input.attr('name', settings.name);
+        
+                /* add buttons to the form */
+                buttons.apply(form, [settings, self]);
+         
+                /* add created form to self */
+                $(self).append(form);
+         
+                /* attach 3rd party plugin if requested */
+                plugin.apply(form, [settings, self]);
+
+                /* focus to first visible form element */
+                $(':input:visible:enabled:first', form).focus();
+
+                /* highlight input contents when requested */
+                if (settings.select) {
+                    input.select();
+                }
+        
+                /* discard changes if pressing esc */
+                input.keydown(function(e) {
+                    if (e.keyCode == 27) {
+                        e.preventDefault();
+                        //self.reset();
+                        reset.apply(form, [settings, self]);
+                    }
+                });
+
+                /* discard, submit or nothing with changes when clicking outside */
+                /* do nothing is usable when navigating with tab */
+                var t;
+                if ('cancel' == settings.onblur) {
+                    input.blur(function(e) {
+                        /* prevent canceling if submit was clicked */
+                        t = setTimeout(function() {
+                            reset.apply(form, [settings, self]);
+                        }, 500);
+                    });
+                } else if ('submit' == settings.onblur) {
+                    input.blur(function(e) {
+                        /* prevent double submit if submit was clicked */
+                        t = setTimeout(function() {
+                            form.submit();
+                        }, 200);
+                    });
+                } else if ($.isFunction(settings.onblur)) {
+                    input.blur(function(e) {
+                        settings.onblur.apply(self, [input.val(), settings]);
+                    });
+                } else {
+                    input.blur(function(e) {
+                      /* TODO: maybe something here */
+                    });
+                }
+
+                form.submit(function(e) {
+
+                    if (t) { 
+                        clearTimeout(t);
+                    }
+
+                    /* do no submit */
+                    e.preventDefault(); 
+            
+                    /* call before submit hook. */
+                    /* if it returns false abort submitting */                    
+                    if (false !== onsubmit.apply(form, [settings, self])) { 
+                        /* custom inputs call before submit hook. */
+                        /* if it returns false abort submitting */
+                        if (false !== submit.apply(form, [settings, self])) { 
+
+                          /* check if given target is function */
+                          if ($.isFunction(settings.target)) {
+                              var str = settings.target.apply(self, [input.val(), settings]);
+                              $(self).html(str);
+                              self.editing = false;
+                              callback.apply(self, [self.innerHTML, settings]);
+                              /* TODO: this is not dry */                              
+                              if (!$.trim($(self).html())) {
+                                  $(self).html(settings.placeholder);
+                              }
+                          } else {
+                              /* add edited content and id of edited element to POST */
+                              var submitdata = {};
+                              submitdata[settings.name] = input.val();
+                              submitdata[settings.id] = self.id;
+                              /* add extra data to be POST:ed */
+                              if ($.isFunction(settings.submitdata)) {
+                                  $.extend(submitdata, settings.submitdata.apply(self, [self.revert, settings]));
+                              } else {
+                                  $.extend(submitdata, settings.submitdata);
+                              }
+
+                              /* quick and dirty PUT support */
+                              if ('PUT' == settings.method) {
+                                  submitdata['_method'] = 'put';
+                              }
+
+                              /* show the saving indicator */
+                              $(self).html(settings.indicator);
+                              
+                              /* defaults for ajaxoptions */
+                              var ajaxoptions = {
+                                  type    : 'POST',
+                                  data    : submitdata,
+                                  url     : settings.target,
+                                  success : function(result, status) {
+                                      $(self).html(result);
+                                      self.editing = false;
+                                      callback.apply(self, [self.innerHTML, settings]);
+                                      if (!$.trim($(self).html())) {
+                                          $(self).html(settings.placeholder);
+                                      }
+                                  },
+                                  error   : function(xhr, status, error) {
+                                      onerror.apply(form, [settings, self, xhr]);
+                                  }
+                              }
+                              
+                              /* override with what is given in settings.ajaxoptions */
+                              $.extend(ajaxoptions, settings.ajaxoptions);   
+                              $.ajax(ajaxoptions);          
+                              
+                            }
+                        }
+                    }
+                    
+                    /* show tooltip again */
+                    $(self).attr('title', settings.tooltip);
+                    
+                    return false;
+                });
+            });
+            
+            /* privileged methods */
+            this.reset = function(form) {
+                /* prevent calling reset twice when blurring */
+                if (this.editing) {
+                    /* before reset hook, if it returns false abort reseting */
+                    if (false !== onreset.apply(form, [settings, self])) { 
+                        $(self).html(self.revert);
+                        self.editing   = false;
+                        if (!$.trim($(self).html())) {
+                            $(self).html(settings.placeholder);
+                        }
+                        /* show tooltip again */
+                        $(self).attr('title', settings.tooltip);                
+                    }                    
+                }
+            }            
+        });
+
+    };
+
+
+    $.editable = {
+        types: {
+            defaults: {
+                element : function(settings, original) {
+                    var input = $('<input type="hidden"></input>');                
+                    $(this).append(input);
+                    return(input);
+                },
+                content : function(string, settings, original) {
+                    $(':input:first', this).val(string);
+                },
+                reset : function(settings, original) {
+                  original.reset(this);
+                },
+                buttons : function(settings, original) {
+                    var form = this;
+                    if (settings.submit) {
+                        /* if given html string use that */
+                        if (settings.submit.match(/>$/)) {
+                            var submit = $(settings.submit).click(function() {
+                                if (submit.attr("type") != "submit") {
+                                    form.submit();
+                                }
+                            });
+                        /* otherwise use button with given string as text */
+                        } else {
+                            var submit = $('<button type="submit" />');
+                            submit.html(settings.submit);                            
+                        }
+                        $(this).append(submit);
+                    }
+                    if (settings.cancel) {
+                        /* if given html string use that */
+                        if (settings.cancel.match(/>$/)) {
+                            var cancel = $(settings.cancel);
+                        /* otherwise use button with given string as text */
+                        } else {
+                            var cancel = $('<button type="cancel" />');
+                            cancel.html(settings.cancel);
+                        }
+                        $(this).append(cancel);
+
+                        $(cancel).click(function(event) {
+                            //original.reset();
+                            if ($.isFunction($.editable.types[settings.type].reset)) {
+                                var reset = $.editable.types[settings.type].reset;                                                                
+                            } else {
+                                var reset = $.editable.types['defaults'].reset;                                
+                            }
+                            reset.apply(form, [settings, original]);
+                            return false;
+                        });
+                    }
+                }
+            },
+            text: {
+                element : function(settings, original) {
+                    var input = $('<input />');
+                    if (settings.width  != 'none') { input.width(settings.width);  }
+                    if (settings.height != 'none') { input.height(settings.height); }
+                    /* https://bugzilla.mozilla.org/show_bug.cgi?id=236791 */
+                    //input[0].setAttribute('autocomplete','off');
+                    input.attr('autocomplete','off');
+                    $(this).append(input);
+                    return(input);
+                }
+            },
+            textarea: {
+                element : function(settings, original) {
+                    var textarea = $('<textarea />');
+                    if (settings.rows) {
+                        textarea.attr('rows', settings.rows);
+                    } else {
+                        textarea.height(settings.height);
+                    }
+                    if (settings.cols) {
+                        textarea.attr('cols', settings.cols);
+                    } else {
+                        textarea.width(settings.width);
+                    }
+                    $(this).append(textarea);
+                    return(textarea);
+                }
+            },
+            select: {
+               element : function(settings, original) {
+                    var select = $('<select />');
+                    $(this).append(select);
+                    return(select);
+                },
+                content : function(string, settings, original) {
+                    if (String == string.constructor) {      
+                        eval ('var json = ' + string);
+                        for (var key in json) {
+                            if (!json.hasOwnProperty(key)) {
+                                continue;
+                            }
+                            if ('selected' == key) {
+                                continue;
+                            } 
+                            var option = $('<option />').val(key).append(json[key]);
+                            $('select', this).append(option);    
+                        }
+                    }
+                    /* Loop option again to set selected. IE needed this... */ 
+                    $('select', this).children().each(function() {
+                        if ($(this).val() == json['selected'] || 
+                            $(this).text() == original.revert) {
+                                $(this).attr('selected', 'selected');
+                        };
+                    });
+                }
+            }
+        },
+
+        /* Add new input type */
+        addInputType: function(name, input) {
+            $.editable.types[name] = input;
+        }
+    };
+
+})(jQuery);

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.tooltip.css
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.tooltip.css	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.tooltip.css	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,12 @@
+#tooltip{
+	position: absolute;
+	display: none;
+	border: 1px solid #333;
+	background: #BDCDFF;
+	padding: 5px 20px;
+	color: #333;
+	
+	border-radius: 5px;
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+}
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.tooltip.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.tooltip.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/jquery.tooltip.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,294 @@
+/*
+ * jQuery Tooltip plugin 1.3
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/
+ * http://docs.jquery.com/Plugins/Tooltip
+ *
+ * Copyright (c) 2006 - 2008 Jörn Zaefferer
+ *
+ * $Id: jquery.tooltip.js 5741 2008-06-21 15:22:16Z joern.zaefferer $
+ * 
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ */
+ 
+;(function($) {
+	
+		// the tooltip element
+	var helper = {},
+		// the current tooltipped element
+		current,
+		// the title of the current element, used for restoring
+		title,
+		// timeout id for delayed tooltips
+		tID,
+		// IE 5.5 or 6
+		IE = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent),
+		// flag for mouse tracking
+		track = false;
+	
+	$.tooltip = {
+		blocked: false,
+		defaults: {
+			delay: 200,
+			fade: false,
+			showURL: true,
+			extraClass: "",
+			top: 15,
+			left: 15,
+			id: "tooltip"
+		},
+		block: function() {
+			$.tooltip.blocked = !$.tooltip.blocked;
+		}
+	};
+	
+	$.fn.extend({
+		tooltip: function(settings) {
+			settings = $.extend({}, $.tooltip.defaults, settings);
+			createHelper(settings);
+			return this.each(function() {
+					$.data(this, "tooltip", settings);
+					this.tOpacity = helper.parent.css("opacity");
+					// copy tooltip into its own expando and remove the title
+					this.tooltipText = this.title;
+					$(this).removeAttr("title");
+					// also remove alt attribute to prevent default tooltip in IE
+					this.alt = "";
+				})
+				.mouseover(save)
+				.mouseout(hide)
+				.click(hide);
+		},
+		fixPNG: IE ? function() {
+			return this.each(function () {
+				var image = $(this).css('backgroundImage');
+				if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) {
+					image = RegExp.$1;
+					$(this).css({
+						'backgroundImage': 'none',
+						'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
+					}).each(function () {
+						var position = $(this).css('position');
+						if (position != 'absolute' && position != 'relative')
+							$(this).css('position', 'relative');
+					});
+				}
+			});
+		} : function() { return this; },
+		unfixPNG: IE ? function() {
+			return this.each(function () {
+				$(this).css({'filter': '', backgroundImage: ''});
+			});
+		} : function() { return this; },
+		hideWhenEmpty: function() {
+			return this.each(function() {
+				$(this)[ $(this).html() ? "show" : "hide" ]();
+			});
+		},
+		url: function() {
+			return this.attr('href') || this.attr('src');
+		}
+	});
+	
+	function createHelper(settings) {
+		// there can be only one tooltip helper
+		if( helper.parent )
+			return;
+		// create the helper, h3 for title, div for url
+		helper.parent = $('<div id="' + settings.id + '"><h3></h3><div class="body"></div><div class="url"></div></div>')
+			// add to document
+			.appendTo(document.body)
+			// hide it at first
+			.hide();
+			
+		// apply bgiframe if available
+		if ( $.fn.bgiframe )
+			helper.parent.bgiframe();
+		
+		// save references to title and url elements
+		helper.title = $('h3', helper.parent);
+		helper.body = $('div.body', helper.parent);
+		helper.url = $('div.url', helper.parent);
+	}
+	
+	function settings(element) {
+		return $.data(element, "tooltip");
+	}
+	
+	// main event handler to start showing tooltips
+	function handle(event) {
+		// show helper, either with timeout or on instant
+		if( settings(this).delay )
+			tID = setTimeout(show, settings(this).delay);
+		else
+			show();
+		
+		// if selected, update the helper position when the mouse moves
+		track = !!settings(this).track;
+		$(document.body).bind('mousemove', update);
+			
+		// update at least once
+		update(event);
+	}
+	
+	// save elements title before the tooltip is displayed
+	function save() {
+		// if this is the current source, or it has no title (occurs with click event), stop
+		if ( $.tooltip.blocked || this == current || (!this.tooltipText && !settings(this).bodyHandler) )
+			return;
+
+		// save current
+		current = this;
+		title = this.tooltipText;
+		
+		if ( settings(this).bodyHandler ) {
+			helper.title.hide();
+			var bodyContent = settings(this).bodyHandler.call(this);
+			if (bodyContent.nodeType || bodyContent.jquery) {
+				helper.body.empty().append(bodyContent)
+			} else {
+				helper.body.html( bodyContent );
+			}
+			helper.body.show();
+		} else if ( settings(this).showBody ) {
+			var parts = title.split(settings(this).showBody);
+			helper.title.html(parts.shift()).show();
+			helper.body.empty();
+			for(var i = 0, part; (part = parts[i]); i++) {
+				if(i > 0)
+					helper.body.append("<br/>");
+				helper.body.append(part);
+			}
+			helper.body.hideWhenEmpty();
+		} else {
+			helper.title.html(title).show();
+			helper.body.hide();
+		}
+		
+		// if element has href or src, add and show it, otherwise hide it
+		if( settings(this).showURL && $(this).url() )
+			helper.url.html( $(this).url().replace('http://', '') ).show();
+		else 
+			helper.url.hide();
+		
+		// add an optional class for this tip
+		helper.parent.addClass(settings(this).extraClass);
+
+		// fix PNG background for IE
+		if (settings(this).fixPNG )
+			helper.parent.fixPNG();
+			
+		handle.apply(this, arguments);
+	}
+	
+	// delete timeout and show helper
+	function show() {
+		tID = null;
+		if ((!IE || !$.fn.bgiframe) && settings(current).fade) {
+			if (helper.parent.is(":animated"))
+				helper.parent.stop().show().fadeTo(settings(current).fade, current.tOpacity);
+			else
+				helper.parent.is(':visible') ? helper.parent.fadeTo(settings(current).fade, current.tOpacity) : helper.parent.fadeIn(settings(current).fade);
+		} else {
+			helper.parent.show();
+		}
+		update();
+	}
+	
+	/**
+	 * callback for mousemove
+	 * updates the helper position
+	 * removes itself when no current element
+	 */
+	function update(event)	{
+		if($.tooltip.blocked)
+			return;
+		
+		if (event && event.target.tagName == "OPTION") {
+			return;
+		}
+		
+		// stop updating when tracking is disabled and the tooltip is visible
+		if ( !track && helper.parent.is(":visible")) {
+			$(document.body).unbind('mousemove', update)
+		}
+		
+		// if no current element is available, remove this listener
+		if( current == null ) {
+			$(document.body).unbind('mousemove', update);
+			return;	
+		}
+		
+		// remove position helper classes
+		helper.parent.removeClass("viewport-right").removeClass("viewport-bottom");
+		
+		var left = helper.parent[0].offsetLeft;
+		var top = helper.parent[0].offsetTop;
+		if (event) {
+			// position the helper 15 pixel to bottom right, starting from mouse position
+			left = event.pageX + settings(current).left;
+			top = event.pageY + settings(current).top;
+			var right='auto';
+			if (settings(current).positionLeft) {
+				right = $(window).width() - left;
+				left = 'auto';
+			}
+			helper.parent.css({
+				left: left,
+				right: right,
+				top: top
+			});
+		}
+		
+		var v = viewport(),
+			h = helper.parent[0];
+		// check horizontal position
+		if (v.x + v.cx < h.offsetLeft + h.offsetWidth) {
+			left -= h.offsetWidth + 20 + settings(current).left;
+			helper.parent.css({left: left + 'px'}).addClass("viewport-right");
+		}
+		// check vertical position
+		if (v.y + v.cy < h.offsetTop + h.offsetHeight) {
+			top -= h.offsetHeight + 20 + settings(current).top;
+			helper.parent.css({top: top + 'px'}).addClass("viewport-bottom");
+		}
+	}
+	
+	function viewport() {
+		return {
+			x: $(window).scrollLeft(),
+			y: $(window).scrollTop(),
+			cx: $(window).width(),
+			cy: $(window).height()
+		};
+	}
+	
+	// hide helper and restore added classes and the title
+	function hide(event) {
+		if($.tooltip.blocked)
+			return;
+		// clear timeout if possible
+		if(tID)
+			clearTimeout(tID);
+		// no more current element
+		current = null;
+		
+		var tsettings = settings(this);
+		function complete() {
+			helper.parent.removeClass( tsettings.extraClass ).hide().css("opacity", "");
+		}
+		if ((!IE || !$.fn.bgiframe) && tsettings.fade) {
+			if (helper.parent.is(':animated'))
+				helper.parent.stop().fadeTo(tsettings.fade, 0, complete);
+			else
+				helper.parent.stop().fadeOut(tsettings.fade, complete);
+		} else
+			complete();
+		
+		if( settings(this).fixPNG )
+			helper.parent.unfixPNG();
+	}
+	
+})(jQuery);

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/json_source.txt
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/json_source.txt	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/json_source.txt	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,59 @@
+{ "aaData": [
+	['Trident','Internet Explorer 4.0','Win 95+','4','X'],
+	['Trident','Internet Explorer 5.0','Win 95+','5','C'],
+	['Trident','Internet Explorer 5.5','Win 95+','5.5','A'],
+	['Trident','Internet Explorer 6','Win 98+','6','A'],
+	['Trident','Internet Explorer 7','Win XP SP2+','7','A'],
+	['Trident','AOL browser (AOL desktop)','Win XP','6','A'],
+	['Gecko','Firefox 1.0','Win 98+ / OSX.2+','1.7','A'],
+	['Gecko','Firefox 1.5','Win 98+ / OSX.2+','1.8','A'],
+	['Gecko','Firefox 2.0','Win 98+ / OSX.2+','1.8','A'],
+	['Gecko','Firefox 3.0','Win 2k+ / OSX.3+','1.9','A'],
+	['Gecko','Camino 1.0','OSX.2+','1.8','A'],
+	['Gecko','Camino 1.5','OSX.3+','1.8','A'],
+	['Gecko','Netscape 7.2','Win 95+ / Mac OS 8.6-9.2','1.7','A'],
+	['Gecko','Netscape Browser 8','Win 98SE+','1.7','A'],
+	['Gecko','Netscape Navigator 9','Win 98+ / OSX.2+','1.8','A'],
+	['Gecko','Mozilla 1.0','Win 95+ / OSX.1+',1,'A'],
+	['Gecko','Mozilla 1.1','Win 95+ / OSX.1+',1.1,'A'],
+	['Gecko','Mozilla 1.2','Win 95+ / OSX.1+',1.2,'A'],
+	['Gecko','Mozilla 1.3','Win 95+ / OSX.1+',1.3,'A'],
+	['Gecko','Mozilla 1.4','Win 95+ / OSX.1+',1.4,'A'],
+	['Gecko','Mozilla 1.5','Win 95+ / OSX.1+',1.5,'A'],
+	['Gecko','Mozilla 1.6','Win 95+ / OSX.1+',1.6,'A'],
+	['Gecko','Mozilla 1.7','Win 98+ / OSX.1+',1.7,'A'],
+	['Gecko','Mozilla 1.8','Win 98+ / OSX.1+',1.8,'A'],
+	['Gecko','Seamonkey 1.1','Win 98+ / OSX.2+','1.8','A'],
+	['Gecko','Epiphany 2.20','Gnome','1.8','A'],
+	['Webkit','Safari 1.2','OSX.3','125.5','A'],
+	['Webkit','Safari 1.3','OSX.3','312.8','A'],
+	['Webkit','Safari 2.0','OSX.4+','419.3','A'],
+	['Webkit','Safari 3.0','OSX.4+','522.1','A'],
+	['Webkit','OmniWeb 5.5','OSX.4+','420','A'],
+	['Webkit','iPod Touch / iPhone','iPod','420.1','A'],
+	['Webkit','S60','S60','413','A'],
+	['Presto','Opera 7.0','Win 95+ / OSX.1+','-','A'],
+	['Presto','Opera 7.5','Win 95+ / OSX.2+','-','A'],
+	['Presto','Opera 8.0','Win 95+ / OSX.2+','-','A'],
+	['Presto','Opera 8.5','Win 95+ / OSX.2+','-','A'],
+	['Presto','Opera 9.0','Win 95+ / OSX.3+','-','A'],
+	['Presto','Opera 9.2','Win 88+ / OSX.3+','-','A'],
+	['Presto','Opera 9.5','Win 88+ / OSX.3+','-','A'],
+	['Presto','Opera for Wii','Wii','-','A'],
+	['Presto','Nokia N800','N800','-','A'],
+	['Presto','Nintendo DS browser','Nintendo DS','8.5','C/A<sup>1</sup>'],
+	['KHTML','Konqureror 3.1','KDE 3.1','3.1','C'],
+	['KHTML','Konqureror 3.3','KDE 3.3','3.3','A'],
+	['KHTML','Konqureror 3.5','KDE 3.5','3.5','A'],
+	['Tasman','Internet Explorer 4.5','Mac OS 8-9','-','X'],
+	['Tasman','Internet Explorer 5.1','Mac OS 7.6-9','1','C'],
+	['Tasman','Internet Explorer 5.2','Mac OS 8-X','1','C'],
+	['Misc','NetFront 3.1','Embedded devices','-','C'],
+	['Misc','NetFront 3.4','Embedded devices','-','A'],
+	['Misc','Dillo 0.8','Embedded devices','-','X'],
+	['Misc','Links','Text only','-','X'],
+	['Misc','Lynx','Text only','-','X'],
+	['Misc','IE Mobile','Windows Mobile 6','-','C'],
+	['Misc','PSP browser','PSP','-','C'],
+	['Other browsers','All others','-','-','U']
+] }
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/json_source2.txt
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/json_source2.txt	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/json_source2.txt	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,14 @@
+{ "aaData": [
+	[ "ALLAN", "Internet Explorer 4.0", "Win 95+", 4, "X" ],
+	[ "Trident", "Internet Explorer 5.0", "Win 95+", 5, "C" ],
+	[ "Trident", "Internet Explorer 5.5", "Win 95+", 5.5, "A" ],
+	[ "Trident", "Internet Explorer 6.0", "Win 98+", 6, "A" ],
+	[ "Trident", "Internet Explorer 7.0", "Win XP SP2+", 7, "A" ],
+	[ "Gecko", "Firefox 1.5", "Win 98+ / OSX.2+", 1.8, "A" ],
+	[ "Gecko", "Firefox 2", "Win 98+ / OSX.2+", 1.8, "A" ],
+	[ "Gecko", "Firefox 3", "Win 2k+ / OSX.3+", 1.9, "A" ],
+	[ "Webkit", "Safari 1.2", "OSX.3", 125.5, "A" ],
+	[ "Webkit", "Safari 1.3", "OSX.3", 312.8, "A" ],
+	[ "Webkit", "Safari 2.0", "OSX.4+", 419.3, "A" ],
+	[ "Webkit", "Safari 3.0", "OSX.4+", 522.1, "A" ]
+] }
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing.php
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing.php	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing.php	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,106 @@
+<?php
+  /* MySQL connection */
+	include( $_SERVER['DOCUMENT_ROOT']."/datatables/mysql.php" ); /* ;-) */
+	
+	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
+		die( 'Could not open connection to server' );
+	
+	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or 
+		die( 'Could not select database '. $gaSql['db'] );
+	
+	/* Paging */
+	$sLimit = "";
+	if ( isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' )
+	{
+		$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
+			mysql_real_escape_string( $_GET['iDisplayLength'] );
+	}
+	
+	/* Ordering */
+	if ( isset( $_GET['iSortCol_0'] ) )
+	{
+		$sOrder = "ORDER BY  ";
+		for ( $i=0 ; $i<mysql_real_escape_string( $_GET['iSortingCols'] ) ; $i++ )
+		{
+			$sOrder .= fnColumnToField(mysql_real_escape_string( $_GET['iSortCol_'.$i] ))."
+			 	".mysql_real_escape_string( $_GET['iSortDir_'.$i] ) .", ";
+		}
+		$sOrder = substr_replace( $sOrder, "", -2 );
+	}
+	
+	/* Filtering - NOTE this does not match the built-in DataTables filtering which does it
+	 * word by word on any field. It's possible to do here, but concerned about efficiency
+	 * on very large tables, and MySQL's regex functionality is very limited
+	 */
+	$sWhere = "";
+	if ( $_GET['sSearch'] != "" )
+	{
+		$sWhere = "WHERE engine LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "browser LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "platform LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "version LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "grade LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%'";
+	}
+	
+	$sQuery = "
+		SELECT SQL_CALC_FOUND_ROWS id, engine, browser, platform, version, grade
+		FROM   ajax
+		$sWhere
+		$sOrder
+		$sLimit
+	";
+	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	
+	$sQuery = "
+		SELECT FOUND_ROWS()
+	";
+	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
+	$iFilteredTotal = $aResultFilterTotal[0];
+	
+	$sQuery = "
+		SELECT COUNT(id)
+		FROM   ajax
+	";
+	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultTotal = mysql_fetch_array($rResultTotal);
+	$iTotal = $aResultTotal[0];
+	
+	$sOutput = '{';
+	$sOutput .= '"sEcho": '.$_GET['sEcho'].', ';
+	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
+	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
+	$sOutput .= '"aaData": [ ';
+	while ( $aRow = mysql_fetch_array( $rResult ) )
+	{
+		$sOutput .= "[";
+		$sOutput .= '"'.addslashes($aRow['engine']).'",';
+		$sOutput .= '"'.addslashes($aRow['browser']).'",';
+		$sOutput .= '"'.addslashes($aRow['platform']).'",';
+		if ( $aRow['version'] == "0" )
+			$sOutput .= '"-",';
+		else
+			$sOutput .= '"'.addslashes($aRow['version']).'",';
+		$sOutput .= '"'.addslashes($aRow['grade']).'"';
+		$sOutput .= "],";
+	}
+	$sOutput = substr_replace( $sOutput, "", -1 );
+	$sOutput .= '] }';
+	
+	echo $sOutput;
+	
+	
+	function fnColumnToField( $i )
+	{
+		if ( $i == 0 )
+			return "engine";
+		else if ( $i == 1 )
+			return "browser";
+		else if ( $i == 2 )
+			return "platform";
+		else if ( $i == 3 )
+			return "version";
+		else if ( $i == 4 )
+			return "grade";
+	}
+?>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_details_col.php
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_details_col.php	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_details_col.php	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,106 @@
+<?php
+  /* MySQL connection */
+	include( $_SERVER['DOCUMENT_ROOT']."/datatables/mysql.php" ); /* ;-) */
+	
+	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
+		die( 'Could not open connection to server' );
+	
+	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or 
+		die( 'Could not select database '. $gaSql['db'] );
+	
+	/* Paging */
+	$sLimit = "";
+	if ( isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' )
+	{
+		$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
+			mysql_real_escape_string( $_GET['iDisplayLength'] );
+	}
+	
+	/* Ordering */
+	if ( isset( $_GET['iSortCol_0'] ) )
+	{
+		$sOrder = "ORDER BY  ";
+		for ( $i=0 ; $i<mysql_real_escape_string( $_GET['iSortingCols'] ) ; $i++ )
+		{
+			$sOrder .= fnColumnToField(mysql_real_escape_string( $_GET['iSortCol_'.$i] ))."
+			 	".mysql_real_escape_string( $_GET['iSortDir_'.$i] ) .", ";
+		}
+		$sOrder = substr_replace( $sOrder, "", -2 );
+	}
+	
+	/* Filtering */
+	$sWhere = "";
+	if ( $_GET['sSearch'] != "" )
+	{
+		$sWhere = "WHERE engine LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "browser LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "platform LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "version LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "grade LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%'";
+	}
+	
+	$sQuery = "
+		SELECT SQL_CALC_FOUND_ROWS id, engine, browser, platform, version, grade
+		FROM   ajax
+		$sWhere
+		$sOrder
+		$sLimit
+	";
+	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	
+	$sQuery = "
+		SELECT FOUND_ROWS()
+	";
+	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
+	$iFilteredTotal = $aResultFilterTotal[0];
+	
+	$sQuery = "
+		SELECT COUNT(id)
+		FROM   ajax
+	";
+	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultTotal = mysql_fetch_array($rResultTotal);
+	$iTotal = $aResultTotal[0];
+	
+	
+	$sOutput = '{';
+	$sOutput .= '"sEcho": '.$_GET['sEcho'].', ';
+	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
+	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
+	$sOutput .= '"aaData": [ ';
+	while ( $aRow = mysql_fetch_array( $rResult ) )
+	{
+		$sOutput .= "[";
+		$sOutput .= '"<img src=\"../examples_support/details_open.png\">",';
+		$sOutput .= '"'.addslashes($aRow['engine']).'",';
+		$sOutput .= '"'.addslashes($aRow['browser']).'",';
+		$sOutput .= '"'.addslashes($aRow['platform']).'",';
+		if ( $aRow['version'] == "0" )
+			$sOutput .= '"-",';
+		else
+			$sOutput .= '"'.addslashes($aRow['version']).'",';
+		$sOutput .= '"'.addslashes($aRow['grade']).'"';
+		$sOutput .= "],";
+	}
+	$sOutput = substr_replace( $sOutput, "", -1 );
+	$sOutput .= '] }';
+	
+	echo $sOutput;
+	
+	
+	function fnColumnToField( $i )
+	{
+		/* Note that column 0 is the details column */
+		if ( $i == 0 ||$i == 1 )
+			return "engine";
+		else if ( $i == 2 )
+			return "browser";
+		else if ( $i == 3 )
+			return "platform";
+		else if ( $i == 4 )
+			return "version";
+		else if ( $i == 5 )
+			return "grade";
+	}
+?>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_filter_col.php
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_filter_col.php	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_filter_col.php	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,122 @@
+<?php
+  /* MySQL connection */
+	include( $_SERVER['DOCUMENT_ROOT']."/datatables/mysql.php" ); /* ;-) */
+	
+	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
+		die( 'Could not open connection to server' );
+	
+	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or 
+		die( 'Could not select database '. $gaSql['db'] );
+	
+	/* Paging */
+	$sLimit = "";
+	if ( isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' )
+	{
+		$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
+			mysql_real_escape_string( $_GET['iDisplayLength'] );
+	}
+	
+	/* Ordering */
+	if ( isset( $_GET['iSortCol_0'] ) )
+	{
+		$sOrder = "ORDER BY  ";
+		for ( $i=0 ; $i<mysql_real_escape_string( $_GET['iSortingCols'] ) ; $i++ )
+		{
+			$sOrder .= fnColumnToField(mysql_real_escape_string( $_GET['iSortCol_'.$i] ))."
+			 	".mysql_real_escape_string( $_GET['iSortDir_'.$i] ) .", ";
+		}
+		$sOrder = substr_replace( $sOrder, "", -2 );
+	}
+	
+	/* Filtering - NOTE this does not match the built-in DataTables filtering which does it
+	 * word by word on any field. It's possible to do here, but concerned about efficiency
+	 * on very large tables, and MySQL's regex functionality is very limited
+	 */
+	$sWhere = "";
+	if ( $_GET['sSearch'] != "" )
+	{
+		$sWhere = "WHERE ( engine LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "browser LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "platform LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "version LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "grade LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' )";
+	}
+	
+	for ( $i=0 ; $i<$_GET['iColumns'] ; $i++ )
+	{
+		if ( $_GET['sSearch_'.$i] != '' )
+		{
+			if ( $sWhere != "" )
+			{
+				$sWhere .= " AND ";
+			}
+			else
+			{
+				$sWhere .= "WHERE ";
+			}
+			$sWhere .= fnColumnToField($i) ." LIKE '%".mysql_real_escape_string( $_GET['sSearch_'.$i] )."%'";
+		}
+	}
+	
+	$sQuery = "
+		SELECT SQL_CALC_FOUND_ROWS id, engine, browser, platform, version, grade
+		FROM   ajax
+		$sWhere
+		$sOrder
+		$sLimit
+	";
+	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	
+	$sQuery = "
+		SELECT FOUND_ROWS()
+	";
+	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
+	$iFilteredTotal = $aResultFilterTotal[0];
+	
+	$sQuery = "
+		SELECT COUNT(id)
+		FROM   ajax
+	";
+	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultTotal = mysql_fetch_array($rResultTotal);
+	$iTotal = $aResultTotal[0];
+	
+	$sOutput = '{';
+	$sOutput .= '"sEcho": '.$_GET['sEcho'].', ';
+	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
+	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
+	$sOutput .= '"aaData": [ ';
+	while ( $aRow = mysql_fetch_array( $rResult ) )
+	{
+		$sOutput .= "[";
+		$sOutput .= '"'.addslashes($aRow['engine']).'",';
+		$sOutput .= '"'.addslashes($aRow['browser']).'",';
+		$sOutput .= '"'.addslashes($aRow['platform']).'",';
+		if ( $aRow['version'] == "0" )
+			$sOutput .= '"-",';
+		else
+			$sOutput .= '"'.addslashes($aRow['version']).'",';
+		$sOutput .= '"'.addslashes($aRow['grade']).'"';
+		$sOutput .= "],";
+	}
+	$sOutput = substr_replace( $sOutput, "", -1 );
+	$sOutput .= '] }';
+	
+	echo $sOutput;
+	
+	
+	function fnColumnToField( $i )
+	{
+		if ( $i == 0 )
+			return "engine";
+		else if ( $i == 1 )
+			return "browser";
+		else if ( $i == 2 )
+			return "platform";
+		else if ( $i == 3 )
+			return "version";
+		else if ( $i == 4 )
+			return "grade";
+	}
+?>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_id.php
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_id.php	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_id.php	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,107 @@
+<?php
+  /* MySQL connection */
+	include( $_SERVER['DOCUMENT_ROOT']."/datatables/mysql.php" ); /* ;-) */
+	
+	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
+		die( 'Could not open connection to server' );
+	
+	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or 
+		die( 'Could not select database '. $gaSql['db'] );
+	
+	/* Paging */
+	$sLimit = "";
+	if ( isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' )
+	{
+		$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
+			mysql_real_escape_string( $_GET['iDisplayLength'] );
+	}
+	
+	/* Ordering */
+	if ( isset( $_GET['iSortCol_0'] ) )
+	{
+		$sOrder = "ORDER BY  ";
+		for ( $i=0 ; $i<mysql_real_escape_string( $_GET['iSortingCols'] ) ; $i++ )
+		{
+			$sOrder .= fnColumnToField(mysql_real_escape_string( $_GET['iSortCol_'.$i] ))."
+			 	".mysql_real_escape_string( $_GET['iSortDir_'.$i] ) .", ";
+		}
+		$sOrder = substr_replace( $sOrder, "", -2 );
+	}
+	
+	/* Filtering - NOTE this does not match the built-in DataTables filtering which does it
+	 * word by word on any field. It's possible to do here, but concerned about efficiency
+	 * on very large tables, and MySQL's regex functionality is very limited
+	 */
+	$sWhere = "";
+	if ( $_GET['sSearch'] != "" )
+	{
+		$sWhere = "WHERE engine LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "browser LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "platform LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "version LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "grade LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%'";
+	}
+	
+	$sQuery = "
+		SELECT SQL_CALC_FOUND_ROWS id, engine, browser, platform, version, grade
+		FROM   ajax
+		$sWhere
+		$sOrder
+		$sLimit
+	";
+	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	
+	$sQuery = "
+		SELECT FOUND_ROWS()
+	";
+	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
+	$iFilteredTotal = $aResultFilterTotal[0];
+	
+	$sQuery = "
+		SELECT COUNT(id)
+		FROM   ajax
+	";
+	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultTotal = mysql_fetch_array($rResultTotal);
+	$iTotal = $aResultTotal[0];
+	
+	$sOutput = '{';
+	$sOutput .= '"sEcho": '.$_GET['sEcho'].', ';
+	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
+	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
+	$sOutput .= '"aaData": [ ';
+	while ( $aRow = mysql_fetch_array( $rResult ) )
+	{
+		$sOutput .= "[";
+		$sOutput .= '"'.addslashes($aRow['id']).'",';
+		$sOutput .= '"'.addslashes($aRow['engine']).'",';
+		$sOutput .= '"'.addslashes($aRow['browser']).'",';
+		$sOutput .= '"'.addslashes($aRow['platform']).'",';
+		if ( $aRow['version'] == "0" )
+			$sOutput .= '"-",';
+		else
+			$sOutput .= '"'.addslashes($aRow['version']).'",';
+		$sOutput .= '"'.addslashes($aRow['grade']).'"';
+		$sOutput .= "],";
+	}
+	$sOutput = substr_replace( $sOutput, "", -1 );
+	$sOutput .= '] }';
+	
+	echo $sOutput;
+	
+	
+	function fnColumnToField( $i )
+	{
+		if ( $i == 0 )
+			return "engine";
+		else if ( $i == 1 )
+			return "browser";
+		else if ( $i == 2 )
+			return "platform";
+		else if ( $i == 3 )
+			return "version";
+		else if ( $i == 4 )
+			return "grade";
+	}
+?>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_ordering.php
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_ordering.php	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_ordering.php	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,104 @@
+<?php
+  /* MySQL connection */
+	include( $_SERVER['DOCUMENT_ROOT']."/datatables/mysql.php" ); /* ;-) */
+	
+	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
+		die( 'Could not open connection to server' );
+	
+	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or 
+		die( 'Could not select database '. $gaSql['db'] );
+	
+	/* Paging */
+	$sLimit = "";
+	if ( isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' )
+	{
+		$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
+			mysql_real_escape_string( $_GET['iDisplayLength'] );
+	}
+	
+	/* Ordering */
+	if ( isset( $_GET['iSortCol_0'] ) )
+	{
+		$sOrder = "ORDER BY  ";
+		for ( $i=0 ; $i<mysql_real_escape_string( $_GET['iSortingCols'] ) ; $i++ )
+		{
+			$sOrder .= fnColumnToField(mysql_real_escape_string( $_GET['iSortCol_'.$i] ))."
+			 	".mysql_real_escape_string( $_GET['iSortDir_'.$i] ) .", ";
+		}
+		$sOrder = substr_replace( $sOrder, "", -2 );
+	}
+	
+	/* Filtering */
+	$sWhere = "";
+	if ( $_GET['sSearch'] != "" )
+	{
+		$sWhere = "WHERE engine LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "browser LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "platform LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "version LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "grade LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%'";
+	}
+	
+	$sQuery = "
+		SELECT SQL_CALC_FOUND_ROWS id, engine, browser, platform, version, grade
+		FROM   ajax
+		$sWhere
+		$sOrder
+		$sLimit
+	";
+	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	
+	$sQuery = "
+		SELECT FOUND_ROWS()
+	";
+	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
+	$iFilteredTotal = $aResultFilterTotal[0];
+	
+	$sQuery = "
+		SELECT COUNT(id)
+		FROM   ajax
+	";
+	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultTotal = mysql_fetch_array($rResultTotal);
+	$iTotal = $aResultTotal[0];
+	
+	$sOutput = '{';
+	$sOutput .= '"sEcho": '.$_GET['sEcho'].', ';
+	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
+	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
+	$sOutput .= '"sColumns": "platform,engine,browser,grade,version",';
+	$sOutput .= '"aaData": [ ';
+	while ( $aRow = mysql_fetch_array( $rResult ) )
+	{
+		$sOutput .= "[";
+		$sOutput .= '"'.addslashes($aRow['platform']).'",';
+		$sOutput .= '"'.addslashes($aRow['engine']).'",';
+		$sOutput .= '"'.addslashes($aRow['browser']).'",';
+		$sOutput .= '"'.addslashes($aRow['grade']).'",';
+		if ( $aRow['version'] == "0" )
+			$sOutput .= '"-"';
+		else
+			$sOutput .= '"'.addslashes($aRow['version']).'"';
+		$sOutput .= "],";
+	}
+	$sOutput = substr_replace( $sOutput, "", -1 );
+	$sOutput .= '] }';
+	
+	echo $sOutput;
+	
+	
+	function fnColumnToField( $i )
+	{
+		if ( $i == 0 )
+			return "engine";
+		else if ( $i == 1 )
+			return "browser";
+		else if ( $i == 2 )
+			return "platform";
+		else if ( $i == 3 )
+			return "version";
+		else if ( $i == 4 )
+			return "grade";
+	}
+?>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_post.php
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_post.php	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/server_processing_post.php	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,103 @@
+<?php
+  /* MySQL connection */
+	include( $_SERVER['DOCUMENT_ROOT']."/datatables/mysql.php" ); /* ;-) */
+	
+	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
+		die( 'Could not open connection to server' );
+	
+	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or 
+		die( 'Could not select database '. $gaSql['db'] );
+	
+	/* Paging */
+	$sLimit = "";
+	if ( isset( $_POST['iDisplayStart'] ) && $_POST['iDisplayLength'] != '-1' )
+	{
+		$sLimit = "LIMIT ".mysql_real_escape_string( $_POST['iDisplayStart'] ).", ".
+			mysql_real_escape_string( $_POST['iDisplayLength'] );
+	}
+	
+	/* Ordering */
+	if ( isset( $_POST['iSortCol_0'] ) )
+	{
+		$sOrder = "ORDER BY  ";
+		for ( $i=0 ; $i<mysql_real_escape_string( $_POST['iSortingCols'] ) ; $i++ )
+		{
+			$sOrder .= fnColumnToField(mysql_real_escape_string( $_POST['iSortCol_'.$i] ))."
+			 	".mysql_real_escape_string( $_GET['iSortDir_'.$i] ) .", ";
+		}
+		$sOrder = substr_replace( $sOrder, "", -2 );
+	}
+	
+	/* Filtering */
+	$sWhere = "";
+	if ( $_POST['sSearch'] != "" )
+	{
+		$sWhere = "WHERE engine LIKE '%".mysql_real_escape_string( $_POST['sSearch'] )."%' OR ".
+		                "browser LIKE '%".mysql_real_escape_string( $_POST['sSearch'] )."%' OR ".
+		                "platform LIKE '%".mysql_real_escape_string( $_POST['sSearch'] )."%' OR ".
+		                "version LIKE '%".mysql_real_escape_string( $_POST['sSearch'] )."%' OR ".
+		                "grade LIKE '%".mysql_real_escape_string( $_POST['sSearch'] )."%'";
+	}
+	
+	$sQuery = "
+		SELECT SQL_CALC_FOUND_ROWS id, engine, browser, platform, version, grade
+		FROM   ajax
+		$sWhere
+		$sOrder
+		$sLimit
+	";
+	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	
+	$sQuery = "
+		SELECT FOUND_ROWS()
+	";
+	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
+	$iFilteredTotal = $aResultFilterTotal[0];
+	
+	$sQuery = "
+		SELECT COUNT(id)
+		FROM   ajax
+	";
+	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultTotal = mysql_fetch_array($rResultTotal);
+	$iTotal = $aResultTotal[0];
+	
+	$sOutput = '{';
+	$sOutput .= '"sEcho": '.$_POST['sEcho'].', ';
+	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
+	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
+	$sOutput .= '"aaData": [ ';
+	while ( $aRow = mysql_fetch_array( $rResult ) )
+	{
+		$sOutput .= "[";
+		$sOutput .= '"'.addslashes($aRow['engine']).'",';
+		$sOutput .= '"'.addslashes($aRow['browser']).'",';
+		$sOutput .= '"'.addslashes($aRow['platform']).'",';
+		if ( $aRow['version'] == "0" )
+			$sOutput .= '"-",';
+		else
+			$sOutput .= '"'.addslashes($aRow['version']).'",';
+		$sOutput .= '"'.addslashes($aRow['grade']).'"';
+		$sOutput .= "],";
+	}
+	$sOutput = substr_replace( $sOutput, "", -1 );
+	$sOutput .= '] }';
+	
+	echo $sOutput;
+	
+	
+	function fnColumnToField( $i )
+	{
+		if ( $i == 0 )
+			return "engine";
+		else if ( $i == 1 )
+			return "browser";
+		else if ( $i == 2 )
+			return "platform";
+		else if ( $i == 3 )
+			return "version";
+		else if ( $i == 4 )
+			return "grade";
+	}
+?>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_222222_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_222222_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_2e83ff_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_2e83ff_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_454545_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_454545_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_888888_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_888888_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_cd0a0a_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/images/ui-icons_cd0a0a_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/jquery-ui-1.7.2.custom.css
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/jquery-ui-1.7.2.custom.css	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/smoothness/jquery-ui-1.7.2.custom.css	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,406 @@
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+*/
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+*/
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; outline: none; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; outline: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; outline: none; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; outline: none; }
+.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; outline: none; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; outline: none; text-decoration: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #cd0a0a; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; }
+.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; }
+.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; }
+.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; }
+.ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; }
+.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; }
+.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; }/* Accordion
+----------------------------------*/
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; }
+.ui-accordion .ui-accordion-content-active { display: block; }/* Datepicker
+----------------------------------*/
+.ui-datepicker { width: 17em; padding: .2em .2em 0; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; }
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/* Dialog
+----------------------------------*/
+.ui-dialog { position: relative; padding: .2em; width: 300px; }
+.ui-dialog .ui-dialog-titlebar { padding: .5em .3em .3em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/* Progressbar
+----------------------------------*/
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Resizable
+----------------------------------*/
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Slider
+----------------------------------*/
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs
+----------------------------------*/
+.ui-tabs { padding: .2em; zoom: 1; }
+.ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { position: relative; float: left; border-bottom-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; }
+.ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_222222_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_222222_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_228ef1_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_228ef1_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_ef8c08_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_ef8c08_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_ffd27a_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_ffd27a_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_ffffff_256x240.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/images/ui-icons_ffffff_256x240.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/jquery-ui-1.7.2.custom.css
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/jquery-ui-1.7.2.custom.css	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/examples_support/themes/ui-lightness/jquery-ui-1.7.2.custom.css	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,406 @@
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+*/
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+*/
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
+.ui-widget-content a { color: #333333; }
+.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
+.ui-widget-header a { color: #ffffff; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; outline: none; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; outline: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; outline: none; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; outline: none; }
+.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; outline: none; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; outline: none; text-decoration: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
+.ui-state-error a, .ui-widget-content .ui-state-error a { color: #ffffff; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #ffffff; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; }
+.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; }
+.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; }
+.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; }
+.ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; }
+.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; }
+.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
+.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; }/* Accordion
+----------------------------------*/
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; }
+.ui-accordion .ui-accordion-content-active { display: block; }/* Datepicker
+----------------------------------*/
+.ui-datepicker { width: 17em; padding: .2em .2em 0; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; }
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/* Dialog
+----------------------------------*/
+.ui-dialog { position: relative; padding: .2em; width: 300px; }
+.ui-dialog .ui-dialog-titlebar { padding: .5em .3em .3em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/* Progressbar
+----------------------------------*/
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Resizable
+----------------------------------*/
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Slider
+----------------------------------*/
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs
+----------------------------------*/
+.ui-tabs { padding: .2em; zoom: 1; }
+.ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { position: relative; float: left; border-bottom-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; }
+.ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/index.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/index.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/index.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../media/css/demo_page.css";
+			@import "../media/css/demo_table.css";
+		</style>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> examples
+			</div>
+			
+			<p>This DataTables package comes with a number of examples of how you can use this software, and demonstrates it's capabilities and flexibility.</p>
+			
+			<h1>Examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="basic_init/state_save.html">State saving</a></li>
+				<li><a href="basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="basic_init/language.html">Change language information (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+				<li><a href="basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="data_sources/dom.html">DOM</a></li>
+				<li><a href="data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="server_side/row_details.html">Show and hide details about a particular record</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="api/form.html">Submit form with elements in table</a></li>
+				<li><a href="api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.
+				</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/column_ordering.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/column_ordering.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/column_ordering.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,169 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"bProcessing": true,
+					"bServerSide": true,
+					"sAjaxSource": "../examples_support/server_processing_ordering.php",
+					"aoColumns": [
+						{ "sName": "engine" },
+						{ "sName": "browser" },
+						{ "sName": "platform" },
+						{ "sName": "version" },
+						{ "sName": "grade" }
+					]
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> server-side column ordering example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>When using server-side processing it may be considerably easier on the server-side to output the data in an order which is not exactly that shown by the table to the end user. For this reason you can 'name' each column and this information will be sent to the server (comma delimited) as the variable 'sColumns' - this is the column information that DataTables expects to get back from a request.</p>
+			<p>Equally there you can defined an 'sColumns' in the JSON return which tells DataTables the order of the columns that has been returned. If the order is different from what it expects, then it will automatically re-order for you. The following example shows a server-side return which gives the columns "out of order".</p>
+			
+			<h1>Live example</h1>
+			<div id="dynamic">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th width="20%">Rendering engine</th>
+			<th width="25%">Browser</th>
+			<th width="25%">Platform(s)</th>
+			<th width="15%">Engine version</th>
+			<th width="15%">CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td colspan="5" class="dataTables_empty">Loading data from server</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"bProcessing": true,
+		"bServerSide": true,
+		"sAjaxSource": "../examples_support/server_processing_ordering.php",
+		"aoColumns": [
+			{ "sName": "engine" },
+			{ "sName": "browser" },
+			{ "sName": "platform" },
+			{ "sName": "version" },
+			{ "sName": "grade" }
+		]
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/custom_vars.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/custom_vars.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/custom_vars.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,171 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"bProcessing": true,
+					"bServerSide": true,
+					"sAjaxSource": "../examples_support/server_processing.php",
+					"fnServerData": function ( sSource, aoData, fnCallback ) {
+						/* Add some extra data to the sender */
+						aoData.push( { "name": "more_data", "value": "my_value" } );
+						$.getJSON( sSource, aoData, function (json) { 
+							/* Do whatever additional processing you want on the callback, then tell DataTables */
+							fnCallback(json)
+						} );
+					}
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> server-side processing example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>It can often be useful to send a little bit of extra information to the server when utilising DataTables' server-side processing option. This can be done by overriding the function used internally to get the JSON data from the server through the use of the "fnServerData" callback. This function takes three parameters (the same as <a href="http://docs.jquery.com/Ajax/jQuery.getJSON">$.getJSON()</a>, to be manipulated as you wish. This allows you to add extra data to the second parameter and then make the AJAX call, or you can call a Google Gears DB, or whatever you want. This example shows adding a single extra HTTP variable.</p>
+			
+			<h1>Live example</h1>
+			<div id="dynamic">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th width="20%">Rendering engine</th>
+			<th width="25%">Browser</th>
+			<th width="25%">Platform(s)</th>
+			<th width="15%">Engine version</th>
+			<th width="15%">CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td colspan="5" class="dataTables_empty">Loading data from server</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"bProcessing": true,
+		"bServerSide": true,
+		"sAjaxSource": "../examples_support/server_processing.php",
+		"fnServerData": function ( sSource, aoData, fnCallback ) {
+			/* Add some extra data to the sender */
+			aoData.push( { "name": "more_data", "value": "my_value" } );
+			$.getJSON( sSource, aoData, function (json) { 
+				/* Do whatever additional processing you want on the callback, then tell DataTables */
+				fnCallback(json)
+			} );
+		}
+	} );
+} );</pre>
+			
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/editable.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/editable.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/editable.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,279 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../examples_support/jquery.jeditable.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var oTable;
+			$(document).ready(function() {
+				oTable = $('#example').dataTable( {
+					"bProcessing": true,
+					"bServerSide": true,
+					"sAjaxSource": "../examples_support/server_processing.php",
+					"fnDrawCallback": function () {
+						$('#example tbody td').editable( '../examples_support/editable_ajax.php', {
+							"callback": function( sValue, y ) {
+								/* Redraw the table from the new data on the server */
+								oTable.fnDraw();
+							},
+							"height": "14px"
+						} );
+					}
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> server-side processing example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>There are many ways to get your data into DataTables, and if you are working with seriously large databases, you might want to consider using the server-side options that DataTables provides. Basically all of the paging, filtering, sorting etc that DataTables does can be handed off to a server (or any other data source - Google Gears or Adobe Air for example!) and DataTables is just an events and display module.</p>
+			<p>The example here shows a very simple display of the CSS data (used in all my other examples), but in this instance coming from the server on each draw. Filtering, multi-column sorting etc all work as you would expect.</p>
+			
+			<h1>Live example</h1>
+			<div id="dynamic">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th width="20%">Rendering engine</th>
+			<th width="25%">Browser</th>
+			<th width="25%">Platform(s)</th>
+			<th width="15%">Engine version</th>
+			<th width="15%">CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td colspan="5" class="dataTables_empty">Loading data from server</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"bProcessing": true,
+		"bServerSide": true,
+		"sAjaxSource": "../examples_support/server_processing.php"
+	} );
+} );</pre>
+			
+			
+			<h1>Server side (PHP) code</h1>
+			<pre>&lt;?php
+  /* MySQL connection */
+	$gaSql['user']       = "*********";
+	$gaSql['password']   = "*********";
+	$gaSql['db']         = "*********";
+	$gaSql['server']     = "*********";
+	$gaSql['type']       = "mysql";
+	
+	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
+		die( 'Could not open connection to server' );
+	
+	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or 
+		die( 'Could not select database '. $gaSql['db'] );
+	
+	/* Paging */
+	$sLimit = "";
+	if ( isset( $_GET['iDisplayStart'] ) )
+	{
+		$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
+			mysql_real_escape_string( $_GET['iDisplayLength'] );
+	}
+	
+	/* Ordering */
+	if ( isset( $_GET['iSortCol_0'] ) )
+	{
+		$sOrder = "ORDER BY  ";
+		for ( $i=0 ; $i&lt;mysql_real_escape_string( $_GET['iSortingCols'] ) ; $i++ )
+		{
+			$sOrder .= fnColumnToField(mysql_real_escape_string( $_GET['iSortCol_'.$i] ))."
+			 	".mysql_real_escape_string( $_GET['iSortDir_'.$i] ) .", ";
+		}
+		$sOrder = substr_replace( $sOrder, "", -2 );
+	}
+	
+	/* Filtering */
+	$sWhere = "";
+	if ( mysql_real_escape_string( $_GET['sSearch'] ) != "" )
+	{
+		$sWhere = "WHERE engine LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "browser LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "platform LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "version LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "grade LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%'";
+	}
+	
+	$sQuery = "
+		SELECT id, engine, browser, platform, version, grade
+		FROM   ajax
+		$sWhere
+		$sOrder
+		$sLimit
+	";
+	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	
+	$sQuery = "
+		SELECT id
+		FROM   ajax
+	";
+	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$iTotal = mysql_num_rows($rResultTotal);
+	
+	if ( $sWhere != "" )
+	{
+		$sQuery = "
+			SELECT id
+			FROM   ajax
+			$sWhere
+		";
+		$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+		$iFilteredTotal = mysql_num_rows($rResultFilterTotal);
+	}
+	else
+	{
+		$iFilteredTotal = $iTotal;
+	}
+	
+	$sOutput = '{';
+	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
+	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
+	$sOutput .= '"aaData": [ ';
+	while ( $aRow = mysql_fetch_array( $rResult ) )
+	{
+		$sOutput .= "[";
+		$sOutput .= "'".$aRow['engine']."',";
+		$sOutput .= "'".$aRow['browser']."',";
+		$sOutput .= "'".$aRow['platform']."',";
+		$sOutput .= "'".$aRow['version']."',";
+		$sOutput .= "'".$aRow['grade']."'";
+		$sOutput .= "],";
+	}
+	$sOutput = substr_replace( $sOutput, "", -1 );
+	$sOutput .= '] }';
+	
+	echo $sOutput;
+	
+	
+	function fnColumnToField( $i )
+	{
+		if ( $i == 0 )
+			return "engine";
+		else if ( $i == 1 )
+			return "browser";
+		else if ( $i == 2 )
+			return "platform";
+		else if ( $i == 3 )
+			return "version";
+		else if ( $i == 4 )
+			return "grade";
+	}
+?&gt;</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/pipeline.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/pipeline.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/pipeline.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,364 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var oCache = {
+				iCacheLower: -1
+			};
+			
+			function fnSetKey( aoData, sKey, mValue )
+			{
+				for ( var i=0, iLen=aoData.length ; i<iLen ; i++ )
+				{
+					if ( aoData[i].name == sKey )
+					{
+						aoData[i].value = mValue;
+					}
+				}
+			}
+			
+			function fnGetKey( aoData, sKey )
+			{
+				for ( var i=0, iLen=aoData.length ; i<iLen ; i++ )
+				{
+					if ( aoData[i].name == sKey )
+					{
+						return aoData[i].value;
+					}
+				}
+				return null;
+			}
+			
+			function fnDataTablesPipeline ( sSource, aoData, fnCallback ) {
+				var iPipe = 5; /* Ajust the pipe size */
+				
+				var bNeedServer = false;
+				var sEcho = fnGetKey(aoData, "sEcho");
+				var iRequestStart = fnGetKey(aoData, "iDisplayStart");
+				var iRequestLength = fnGetKey(aoData, "iDisplayLength");
+				var iRequestEnd = iRequestStart + iRequestLength;
+				oCache.iDisplayStart = iRequestStart;
+				
+				/* outside pipeline? */
+				if ( oCache.iCacheLower < 0 || iRequestStart < oCache.iCacheLower || iRequestEnd > oCache.iCacheUpper )
+				{
+					bNeedServer = true;
+				}
+				
+				/* sorting etc changed? */
+				if ( oCache.lastRequest && !bNeedServer )
+				{
+					for( var i=0, iLen=aoData.length ; i<iLen ; i++ )
+					{
+						if ( aoData[i].name != "iDisplayStart" && aoData[i].name != "iDisplayLength" && aoData[i].name != "sEcho" )
+						{
+							if ( aoData[i].value != oCache.lastRequest[i].value )
+							{
+								bNeedServer = true;
+								break;
+							}
+						}
+					}
+				}
+				
+				/* Store the request for checking next time around */
+				oCache.lastRequest = aoData.slice();
+				
+				if ( bNeedServer )
+				{
+					if ( iRequestStart < oCache.iCacheLower )
+					{
+						iRequestStart = iRequestStart - (iRequestLength*(iPipe-1));
+						if ( iRequestStart < 0 )
+						{
+							iRequestStart = 0;
+						}
+					}
+					
+					oCache.iCacheLower = iRequestStart;
+					oCache.iCacheUpper = iRequestStart + (iRequestLength * iPipe);
+					oCache.iDisplayLength = fnGetKey( aoData, "iDisplayLength" );
+					fnSetKey( aoData, "iDisplayStart", iRequestStart );
+					fnSetKey( aoData, "iDisplayLength", iRequestLength*iPipe );
+					
+					$.getJSON( sSource, aoData, function (json) { 
+						/* Callback processing */
+						oCache.lastJson = jQuery.extend(true, {}, json);
+						
+						if ( oCache.iCacheLower != oCache.iDisplayStart )
+						{
+							json.aaData.splice( 0, oCache.iDisplayStart-oCache.iCacheLower );
+						}
+						json.aaData.splice( oCache.iDisplayLength, json.aaData.length );
+						
+						fnCallback(json)
+					} );
+				}
+				else
+				{
+					json = jQuery.extend(true, {}, oCache.lastJson);
+					json.sEcho = sEcho; /* Update the echo for each response */
+					json.aaData.splice( 0, iRequestStart-oCache.iCacheLower );
+					json.aaData.splice( iRequestLength, json.aaData.length );
+					fnCallback(json);
+					return;
+				}
+			}
+			
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"bProcessing": true,
+					"bServerSide": true,
+					"sAjaxSource": "../examples_support/server_processing.php",
+					"fnServerData": fnDataTablesPipeline
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> server-side processing with pipelining example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>When using server-side processing with DataTables, it can be quite intensive on your server having an Ajax call every time the user performs some kind of interaction - you can effectively DDOS your server with your own application!</p>
+			<p>This example shows how you might over-come this by modifying the request set to the server to retrieve more information than is actually required for a single page's display. This means that the user can page multiple times (5 times the display size is the default) before a request must be made of the server. Paging is typically the most common interaction performed with a DataTable, so this can be most beneficial to your server's resource usage. Of course the pipeline must be cleared for interactions other than paging (sorting, filtering etc), but that's the trade off that can be made (sending extra information is cheep - while another XHR is expensive).</p>
+			
+			<h1>Live example</h1>
+			<div id="dynamic">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th width="20%">Rendering engine</th>
+			<th width="25%">Browser</th>
+			<th width="25%">Platform(s)</th>
+			<th width="15%">Engine version</th>
+			<th width="15%">CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td colspan="5" class="dataTables_empty">Loading data from server</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>var oCache = {
+	iCacheLower: -1
+};
+
+function fnSetKey( aoData, sKey, mValue )
+{
+	for ( var i=0, iLen=aoData.length ; i&lt;iLen ; i++ )
+	{
+		if ( aoData[i].name == sKey )
+		{
+			aoData[i].value = mValue;
+		}
+	}
+}
+
+function fnGetKey( aoData, sKey )
+{
+	for ( var i=0, iLen=aoData.length ; i&lt;iLen ; i++ )
+	{
+		if ( aoData[i].name == sKey )
+		{
+			return aoData[i].value;
+		}
+	}
+	return null;
+}
+
+function fnDataTablesPipeline ( sSource, aoData, fnCallback ) {
+	var iPipe = 5; /* Ajust the pipe size */
+	
+	var bNeedServer = false;
+	var sEcho = fnGetKey(aoData, "sEcho");
+	var iRequestStart = fnGetKey(aoData, "iDisplayStart");
+	var iRequestLength = fnGetKey(aoData, "iDisplayLength");
+	var iRequestEnd = iRequestStart + iRequestLength;
+	oCache.iDisplayStart = iRequestStart;
+	
+	/* outside pipeline? */
+	if ( oCache.iCacheLower &lt; 0 || iRequestStart &lt; oCache.iCacheLower || iRequestEnd &gt; oCache.iCacheUpper )
+	{
+		bNeedServer = true;
+	}
+	
+	/* sorting etc changed? */
+	if ( oCache.lastRequest &amp;&amp; !bNeedServer )
+	{
+		for( var i=0, iLen=aoData.length ; i&lt;iLen ; i++ )
+		{
+			if ( aoData[i].name != "iDisplayStart" &amp;&amp; aoData[i].name != "iDisplayLength" &amp;&amp; aoData[i].name != "sEcho" )
+			{
+				if ( aoData[i].value != oCache.lastRequest[i].value )
+				{
+					bNeedServer = true;
+					break;
+				}
+			}
+		}
+	}
+	
+	/* Store the request for checking next time around */
+	oCache.lastRequest = aoData.slice();
+	
+	if ( bNeedServer )
+	{
+		if ( iRequestStart &lt; oCache.iCacheLower )
+		{
+			iRequestStart = iRequestStart - (iRequestLength*(iPipe-1));
+			if ( iRequestStart &lt; 0 )
+			{
+				iRequestStart = 0;
+			}
+		}
+		
+		oCache.iCacheLower = iRequestStart;
+		oCache.iCacheUpper = iRequestStart + (iRequestLength * iPipe);
+		oCache.iDisplayLength = fnGetKey( aoData, "iDisplayLength" );
+		fnSetKey( aoData, "iDisplayStart", iRequestStart );
+		fnSetKey( aoData, "iDisplayLength", iRequestLength*iPipe );
+		
+		$.getJSON( sSource, aoData, function (json) { 
+			/* Callback processing */
+			oCache.lastJson = jQuery.extend(true, {}, json);
+			
+			if ( oCache.iCacheLower != oCache.iDisplayStart )
+			{
+				json.aaData.splice( 0, oCache.iDisplayStart-oCache.iCacheLower );
+			}
+			json.aaData.splice( oCache.iDisplayLength, json.aaData.length );
+			
+			fnCallback(json)
+		} );
+	}
+	else
+	{
+		json = jQuery.extend(true, {}, oCache.lastJson);
+		json.sEcho = sEcho; /* Update the echo for each response */
+		json.aaData.splice( 0, iRequestStart-oCache.iCacheLower );
+		json.aaData.splice( iRequestLength, json.aaData.length );
+		fnCallback(json);
+		return;
+	}
+}
+
+$(document).ready(function() {
+	$('#example').dataTable( {
+		"bProcessing": true,
+		"bServerSide": true,
+		"sAjaxSource": "../examples_support/server_processing.php",
+		"fnServerData": fnDataTablesPipeline
+	} );
+} );</pre>
+			
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/post.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/post.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/post.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,173 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"bProcessing": true,
+					"bServerSide": true,
+					"sAjaxSource": "../examples_support/server_processing_post.php",
+					"fnServerData": function ( sSource, aoData, fnCallback ) {
+						$.ajax( {
+							"dataType": 'json', 
+							"type": "POST", 
+							"url": sSource, 
+							"data": aoData, 
+							"success": fnCallback
+						} );
+					}
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> server-side processing with POST example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>The default HTTP method that DataTables uses to get data from the server-side if GET, however, there are times when you may wish to use POST. This is very easy using the fnServerData() initialisation parameter, as shown in this example.</p>
+			
+			<h1>Live example</h1>
+			<div id="dynamic">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th width="20%">Rendering engine</th>
+			<th width="25%">Browser</th>
+			<th width="25%">Platform(s)</th>
+			<th width="15%">Engine version</th>
+			<th width="15%">CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td colspan="5" class="dataTables_empty">Loading data from server</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"bProcessing": true,
+		"bServerSide": true,
+		"sAjaxSource": "../examples_support/server_processing_post.php",
+		"fnServerData": function ( sSource, aoData, fnCallback ) {
+			$.ajax( {
+				"dataType": 'json', 
+				"type": "POST", 
+				"url": sSource, 
+				"data": aoData, 
+				"success": fnCallback
+			} );
+		}
+	} );
+} );</pre>
+			
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/row_details.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/row_details.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/row_details.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,258 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var oTable;
+			
+			/* Formating function for row details */
+			function fnFormatDetails ( nTr )
+			{
+				var iIndex = oTable.fnGetPosition( nTr );
+				var aData = oTable.fnSettings().aoData[iIndex]._aData;
+				
+				var sOut = '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">';
+				sOut += '<tr><td>Rendering engine:</td><td>'+aData[2]+' '+aData[5]+'</td></tr>';
+				sOut += '<tr><td>Link to source:</td><td>Could provide a link here</td></tr>';
+				sOut += '<tr><td>Extra info:</td><td>And any further details here (images etc)</td></tr>';
+				sOut += '</table>';
+				
+				return sOut;
+			}
+			
+			/* Event handler function */
+			function fnOpenClose ( oSettings )
+			{
+				$('td img', oTable.fnGetNodes() ).each( function () {
+					$(this).click( function () {
+						var nTr = this.parentNode.parentNode;
+						if ( this.src.match('details_close') )
+						{
+							/* This row is already open - close it */
+							this.src = "../examples_support/details_open.png";
+							/* fnClose doesn't do anything for server-side processing - do it ourselves :-) */
+							var nRemove = $(nTr).next()[0];
+							nRemove.parentNode.removeChild( nRemove );
+						}
+						else
+						{
+							/* Open this row */
+							this.src = "../examples_support/details_close.png";
+							oTable.fnOpen( nTr, fnFormatDetails(nTr), 'details' );
+						}
+					} );
+				} );
+			}
+			
+			$(document).ready(function() {
+				oTable = $('#example').dataTable( {
+					"bProcessing": true,
+					"bServerSide": true,
+					"sAjaxSource": "../examples_support/server_processing_details_col.php",
+					"aoColumns": [
+						{ "sClass": "center", "bSortable": false },
+						null,
+						null,
+						null,
+						{ "sClass": "center" },
+						{ "sClass": "center" }
+					],
+					"aaSorting": [[1, 'asc']],
+					"fnDrawCallback": fnOpenClose
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> server-side processing example with hidden row information
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>This example shows how you might modify the client-side show/hide details rows example for use with DataTables 1.5's server-side processing option.</p>
+			
+			<h1>Live example</h1>
+			<div id="dynamic">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th width="4%"></th>
+			<th width="25%">Rendering engine</th>
+			<th width="20%">Browser</th>
+			<th width="25%">Platform(s)</th>
+			<th width="16%">Engine version</th>
+			<th width="10%">CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td colspan="5" class="dataTables_empty">Loading data from server</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th></th>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>var oTable;
+
+/* Formating function for row details */
+function fnFormatDetails ( nTr )
+{
+	var iIndex = oTable.fnGetPosition( nTr );
+	var aData = oTable.fnSettings().aoData[iIndex]._aData;
+	
+	var sOut = '&lt;table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;"&gt;';
+	sOut += '&lt;tr&gt;&lt;td&gt;Rendering engine:&lt;/td&gt;&lt;td&gt;'+aData[2]+' '+aData[5]+'&lt;/td&gt;&lt;/tr&gt;';
+	sOut += '&lt;tr&gt;&lt;td&gt;Link to source:&lt;/td&gt;&lt;td&gt;Could provide a link here&lt;/td&gt;&lt;/tr&gt;';
+	sOut += '&lt;tr&gt;&lt;td&gt;Extra info:&lt;/td&gt;&lt;td&gt;And any further details here (images etc)&lt;/td&gt;&lt;/tr&gt;';
+	sOut += '&lt;/table&gt;';
+	
+	return sOut;
+}
+
+/* Event handler function */
+function fnOpenClose ( oSettings )
+{
+	$('td img', oTable.fnGetNodes() ).each( function () {
+		$(this).click( function () {
+			var nTr = this.parentNode.parentNode;
+			if ( this.src.match('details_close') )
+			{
+				/* This row is already open - close it */
+				this.src = "../examples_support/details_open.png";
+				/* fnClose doesn't do anything for server-side processing - do it ourselves :-) */
+				var nRemove = $(nTr).next()[0];
+				nRemove.parentNode.removeChild( nRemove );
+			}
+			else
+			{
+				/* Open this row */
+				this.src = "../examples_support/details_close.png";
+				oTable.fnOpen( nTr, fnFormatDetails(nTr), 'details' );
+			}
+		} );
+	} );
+}
+
+$(document).ready(function() {
+	oTable = $('#example').dataTable( {
+		"bProcessing": true,
+		"bServerSide": true,
+		"sAjaxSource": "../examples_support/server_processing_details_col.php",
+		"aoColumns": [
+			{ "sClass": "center", "bSortable": false },
+			null,
+			null,
+			null,
+			{ "sClass": "center" },
+			{ "sClass": "center" }
+		],
+		"aaSorting": [[1, 'asc']],
+		"fnDrawCallback": fnOpenClose
+	} );
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/select_rows.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/select_rows.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/select_rows.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,275 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+var oTable;
+var gaiSelected =  [];
+
+$(document).ready(function() {
+	$('#form').submit( function() {
+		alert (gaiSelected);
+		return false;
+	} );
+
+	/* Init the table */
+	oTable = $("#example").dataTable({
+		"bProcessing": true,
+		"bServerSide": true,
+		"sAjaxSource": "../examples_support/server_processing_id.php",
+		"fnRowCallback": function( nRow, aData, iDisplayIndex ) {
+			$('#example tbody tr').each( function () {
+				if ( jQuery.inArray(aData[0], gaiSelected) != -1 )
+				{
+					$(this).addClass('row_selected');
+				}
+			});
+			return nRow;
+		},
+		"fnDrawCallback": function ( oSettings ) {
+			$('#example tbody tr').each( function () {
+				var iPos = oTable.fnGetPosition( this );
+				
+				if ( iPos != null )
+				{
+					var aData = oTable.fnGetData( iPos );
+					if ( jQuery.inArray(aData[0], gaiSelected) != -1 )
+					{
+						$(this).addClass('row_selected');
+					}
+				}
+				
+				$(this).click( function () {
+					var iPos = oTable.fnGetPosition( this );
+					var aData = oTable.fnGetData( iPos );
+					var iId = aData[0];
+					
+					if ( jQuery.inArray(iId, gaiSelected) == -1 )
+					{
+						gaiSelected[gaiSelected.length++] = iId;
+					}
+					else
+					{
+						gaiSelected = jQuery.grep(gaiSelected, function(value) {
+							return value != iId;
+						} );
+					}
+					
+					$(this).toggleClass('row_selected');
+				});
+			});
+		},
+		"aoColumns": [
+			{ "bVisible": 0 }, /* ID column */
+			null,
+			null,
+			null,
+			null,
+			null
+		]
+	});
+} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> server-side processing with user selectable rows example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>When you want to detail with user selectable rows and DataTables, it is relatively simple when using DOM based data - but if using server-side processing, DataTables doesn't retain state over pages / filters etc, leaving this to the server-side instead. As such, you will need to keep a track of which rows a user as selected and mark them as selected on each draw. This is shown in this demo, which uses a unique ID in the first (and hidden) column.</p>
+			<p>Credit for this example belongs with forum member <a href="http://datatables.net/forums/comments.php?DiscussionID=582&page=1#Item_4">iuliandum</a>. Thanks!</p>
+			
+			<h1>Live example</h1>
+			<div id="dynamic">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th width="0%">ID</th>
+			<th width="20%">Rendering engine</th>
+			<th width="25%">Browser</th>
+			<th width="25%">Platform(s)</th>
+			<th width="15%">Engine version</th>
+			<th width="15%">CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td colspan="5" class="dataTables_empty">Loading data from server</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>ID</th>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>var oTable;
+var gaiSelected =  [];
+
+$(document).ready(function() {
+	$('#form').submit( function() {
+		alert (gaiSelected);
+		return false;
+	} );
+
+	/* Init the table */
+	oTable = $("#example").dataTable({
+		"bProcessing": true,
+		"bServerSide": true,
+		"sAjaxSource": "../examples_support/server_processing_id.php",
+		"fnRowCallback": function( nRow, aData, iDisplayIndex ) {
+			$('#example tbody tr').each( function () {
+				if ( jQuery.inArray(aData[0], gaiSelected) != -1 )
+				{
+					$(this).addClass('row_selected');
+				}
+			});
+			return nRow;
+		},
+		"fnDrawCallback": function ( oSettings ) {
+			$('#example tbody tr').each( function () {
+				var iPos = oTable.fnGetPosition( this );
+				
+				if ( iPos != null )
+				{
+					var aData = oTable.fnGetData( iPos );
+					if ( jQuery.inArray(aData[0], gaiSelected) != -1 )
+					{
+						$(this).addClass('row_selected');
+					}
+				}
+				
+				$(this).click( function () {
+					var iPos = oTable.fnGetPosition( this );
+					var aData = oTable.fnGetData( iPos );
+					var iId = aData[0];
+					
+					if ( jQuery.inArray(iId, gaiSelected) == -1 )
+					{
+						gaiSelected[gaiSelected.length++] = iId;
+					}
+					else
+					{
+						gaiSelected = jQuery.grep(gaiSelected, function(value) {
+							return value != iId;
+						} );
+					}
+					
+					$(this).toggleClass('row_selected');
+				});
+			});
+		},
+		"aoColumns": [
+			{ "bVisible": 0 }, /* ID column */
+			null,
+			null,
+			null,
+			null,
+			null
+		]
+	});
+} );</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/server_side.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/server_side.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/examples/server_side/server_side.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,268 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready(function() {
+				$('#example').dataTable( {
+					"bProcessing": true,
+					"bServerSide": true,
+					"sAjaxSource": "../examples_support/server_processing.php"
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> server-side processing example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>There are many ways to get your data into DataTables, and if you are working with seriously large databases, you might want to consider using the server-side options that DataTables provides. Basically all of the paging, filtering, sorting etc that DataTables does can be handed off to a server (or any other data source - Google Gears or Adobe Air for example!) and DataTables is just an events and display module.</p>
+			<p>The example here shows a very simple display of the CSS data (used in all my other examples), but in this instance coming from the server on each draw. Filtering, multi-column sorting etc all work as you would expect.</p>
+			
+			<h1>Live example</h1>
+			<div id="dynamic">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th width="20%">Rendering engine</th>
+			<th width="25%">Browser</th>
+			<th width="25%">Platform(s)</th>
+			<th width="15%">Engine version</th>
+			<th width="15%">CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td colspan="5" class="dataTables_empty">Loading data from server</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready(function() {
+	$('#example').dataTable( {
+		"bProcessing": true,
+		"bServerSide": true,
+		"sAjaxSource": "../examples_support/server_processing.php"
+	} );
+} );</pre>
+			
+			
+			<h1>Server side (PHP) code</h1>
+			<pre>&lt;?php
+  /* MySQL connection */
+	$gaSql['user']       = "*********";
+	$gaSql['password']   = "*********";
+	$gaSql['db']         = "*********";
+	$gaSql['server']     = "*********";
+	$gaSql['type']       = "mysql";
+	
+	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
+		die( 'Could not open connection to server' );
+	
+	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or 
+		die( 'Could not select database '. $gaSql['db'] );
+	
+	/* Paging */
+	$sLimit = "";
+	if ( isset( $_GET['iDisplayStart'] ) )
+	{
+		$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
+			mysql_real_escape_string( $_GET['iDisplayLength'] );
+	}
+	
+	/* Ordering */
+	if ( isset( $_GET['iSortCol_0'] ) )
+	{
+		$sOrder = "ORDER BY  ";
+		for ( $i=0 ; $i&lt;mysql_real_escape_string( $_GET['iSortingCols'] ) ; $i++ )
+		{
+			$sOrder .= fnColumnToField(mysql_real_escape_string( $_GET['iSortCol_'.$i] ))."
+			 	".mysql_real_escape_string( $_GET['iSortDir_'.$i] ) .", ";
+		}
+		$sOrder = substr_replace( $sOrder, "", -2 );
+	}
+	
+	/* Filtering - NOTE this does not match the built-in DataTables filtering which does it
+	 * word by word on any field. It's possible to do here, but concerned about efficiency
+	 * on very large tables, and MySQL's regex functionality is very limited
+	 */
+	$sWhere = "";
+	if ( $_GET['sSearch'] != "" )
+	{
+		$sWhere = "WHERE engine LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "browser LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "platform LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "version LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
+		                "grade LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%'";
+	}
+	
+	$sQuery = "
+		SELECT SQL_CALC_FOUND_ROWS id, engine, browser, platform, version, grade
+		FROM   ajax
+		$sWhere
+		$sOrder
+		$sLimit
+	";
+	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	
+	$sQuery = "
+		SELECT FOUND_ROWS()
+	";
+	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
+	$iFilteredTotal = $aResultFilterTotal[0];
+	
+	$sQuery = "
+		SELECT COUNT(id)
+		FROM   ajax
+	";
+	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
+	$aResultTotal = mysql_fetch_array($rResultTotal);
+	$iTotal = $aResultTotal[0];
+	
+	$sOutput = '{';
+	$sOutput .= '"sEcho": '.$_GET['sEcho'].', ';
+	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
+	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
+	$sOutput .= '"aaData": [ ';
+	while ( $aRow = mysql_fetch_array( $rResult ) )
+	{
+		$sOutput .= "[";
+		$sOutput .= '"'.addslashes($aRow['engine']).'",';
+		$sOutput .= '"'.addslashes($aRow['browser']).'",';
+		$sOutput .= '"'.addslashes($aRow['platform']).'",';
+		if ( $aRow['version'] == "0" )
+			$sOutput .= '"-",';
+		else
+			$sOutput .= '"'.addslashes($aRow['version']).'",';
+		$sOutput .= '"'.addslashes($aRow['grade']).'"';
+		$sOutput .= "],";
+	}
+	$sOutput = substr_replace( $sOutput, "", -1 );
+	$sOutput .= '] }';
+	
+	echo $sOutput;
+	
+	
+	function fnColumnToField( $i )
+	{
+		if ( $i == 0 )
+			return "engine";
+		else if ( $i == 1 )
+			return "browser";
+		else if ( $i == 2 )
+			return "platform";
+		else if ( $i == 3 )
+			return "version";
+		else if ( $i == 4 )
+			return "grade";
+	}
+?&gt;</pre>
+			
+			
+			<h1>Other examples</h1>
+			<h2>Basic initialisation</h2>
+			<ul>
+				<li><a href="../basic_init/zero_config.html">Zero configuration</a></li>
+				<li><a href="../basic_init/filter_only.html">Feature enablement</a></li>
+				<li><a href="../basic_init/table_sorting.html">Sorting data</a></li>
+				<li><a href="../basic_init/multi_col_sort.html">Multi-column sorting</a></li>
+				<li><a href="../basic_init/multiple_tables.html">Multiple tables</a></li>
+				<li><a href="../basic_init/hidden_columns.html">Hidden columns</a></li>
+				<li><a href="../basic_init/dom.html">DOM positioning</a></li>
+				<li><a href="../basic_init/state_save.html">State saving</a></li>
+				<li><a href="../basic_init/alt_pagination.html">Alternative pagination styles</a></li>
+				<li><a href="../basic_init/language.html">Change language information (internationalisation)</a></li>
+				<li><a href="../basic_init/themes.html">ThemeRoller themes (Smoothness)</a></li>
+			</ul>
+			
+			<h2>Advanced initialisation</h2>
+			<ul>
+				<li><a href="../advanced_init/events_pre_init.html">Events (pre initialisation)</a></li>
+				<li><a href="../advanced_init/events_post_init.html">Events (post initialisation)</a></li>
+				<li><a href="../advanced_init/column_render.html">Column rendering</a></li>
+				<li><a href="../advanced_init/html_sort.html">Sorting without HTML tags</a></li>
+				<li><a href="../advanced_init/sorting_control.html">Set sorting controls</a></li>
+				<li><a href="../advanced_init/complex_header.html">Column grouping through col/row spans</a></li>
+				<li><a href="../advanced_init/row_grouping.html">Row grouping</a></li>
+				<li><a href="../advanced_init/row_callback.html">Row callback</a></li>
+				<li><a href="../advanced_init/footer_callback.html">Footer callback</a></li>
+				<li><a href="../advanced_init/language_file.html">Change language information from a file (internationalisation)</a></li>
+			</ul>
+			
+			<h2>Data sources</h2>
+			<ul>
+				<li><a href="../data_sources/dom.html">DOM</a></li>
+				<li><a href="../data_sources/js_array.html">Javascript array</a></li>
+				<li><a href="../data_sources/ajax.html">Ajax source</a></li>
+				<li><a href="../data_sources/server_side.html">Server side processing</a></li>
+			</ul>
+			
+			<h2>Server-side processing</h2>
+			<ul>
+				<li><a href="../server_side/server_side.html">Obtain server-side data</a></li>
+				<li><a href="../server_side/custom_vars.html">Add extra HTTP variables</a></li>
+				<li><a href="../server_side/post.html">Use HTTP POST</a></li>
+				<li><a href="../server_side/column_ordering.html">Custom column ordering (in callback data)</a></li>
+				<li><a href="../server_side/pipeline.html">Pipelining data (reduce Ajax calls for paging)</a></li>
+				<li><a href="../server_side/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../server_side/select_rows.html">User selectable rows (multiple rows)</a></li>
+			</ul>
+			
+			<h2>API</h2>
+			<ul>
+				<li><a href="../api/add_row.html">Dynamically add a new row</a></li>
+				<li><a href="../api/multi_filter.html">Individual column filtering</a></li>
+				<li><a href="../api/highlight.html">Highlight rows and columns</a></li>
+				<li><a href="../api/row_details.html">Show and hide details about a particular record</a></li>
+				<li><a href="../api/select_row.html">User selectable rows (multiple rows)</a></li>
+				<li><a href="../api/select_single_row.html">User selectable rows (single row) and delete rows</a></li>
+				<li><a href="../api/editable.html">Editable rows (with jEditable)</a></li>
+				<li><a href="../api/form.html">Submit form with elements in table</a></li>
+				<li><a href="../api/counter_column.html">Index column (static number column)</a></li>
+				<li><a href="../api/show_hide.html">Show and hide columns dynamically</a></li>
+				<li><a href="../api/plugin_api.html">Add custom API functions (plug-ins)</a></li>
+				<li><a href="../api/sorting_plugin.html">Sorting and type detection (plug-ins)</a></li>
+				<li><a href="../api/paging_plugin.html">Custom pagination controls (plug-ins)</a></li>
+				<li><a href="../api/range_filtering.html">Range filtering / custom filtering (plug-ins)</a></li>
+				<li><a href="../api/dom_sort.html">Live DOM sorting (plug-ins)</a></li>
+				<li><a href="../api/regex.html">Regular expression filtering</a></li>
+			</ul>
+			
+			
+			<p>Please refer to the <a href="http://www.datatables.net/"><i>DataTables</i> documentation</a> for full information about its API properties and methods.</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/FixedHeader/FixedHeader.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/extras/FixedHeader/FixedHeader.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/extras/FixedHeader/FixedHeader.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,262 @@
+/*
+ * File:        FixedHeader.js
+ * Version:     1.0.2
+ * CVS:         $Id$
+ * Description: "Fix" a header at the top of the table, so it scrolls with the table
+ * Author:      Allan Jardine (www.sprymedia.co.uk)
+ * Created:     Wed 16 Sep 2009 19:46:30 BST
+ * Modified:    $Date$ by $Author$
+ * Language:    Javascript
+ * License:     LGPL
+ * Project:     Just a little bit of fun :-)
+ * Contact:     www.sprymedia.co.uk/contact
+ * 
+ * Copyright 2009 Allan Jardine, all rights reserved.
+ *
+ */
+
+
+(function($) {
+
+/*
+ * Function: $.fn.dataTableExt.FixedHeader
+ * Purpose:  FixedHeader "class"
+ * Returns:  same as _fnInit
+ * Inputs:   same as _fnInit
+ */
+$.fn.dataTableExt.FixedHeader = function ( oTable )
+{
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Public functions
+	 */
+	
+	/*
+	 * Function: fnUpdate
+	 * Purpose:  Update the floating header from the current state of the DataTable
+	 * Returns:  -
+	 * Inputs:   bool:bUpdateDom - Update offset information (provided for speed options) - default true
+	 * Notes:    This would be used when the DataTables state is changed. For example using 
+	 *   fnSetColumnVis() to change the number of visible columns.
+	 */
+	this.fnUpdate = function ( bUpdateDom )
+	{
+		if ( typeof bUpdateDom == 'undefined' )
+		{
+			bUpdateDom = true;
+		}
+		
+		_fnCloneThead();
+		
+		if ( bUpdateDom )
+		{
+			_iStart = $(_oSettings.nTable).offset().top;
+			_iStartLeft = $(_oSettings.nTable).offset().left;
+		}
+	}
+	
+	
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Private variables
+	 */
+	
+	/* The DataTables object */
+	var _oTable;
+	
+	/* The DataTables settings object - easy access */
+	var _oSettings;
+	
+	/* The cloned table node */
+	var _nCTable;
+	
+	/* The starting x-position of the table on the document */
+	var _iStart;
+	
+	/* The starting x-position of the table relative to it's parent */
+	var _iOffset;
+	
+	/* Current display information, cached so we don't have to query the DOM */
+	var _oCache = {
+		"sPosition": "",
+		"sTop": "",
+		"sLeft": ""
+	};
+	
+	var _bIsIE6;
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Private functions
+	 */
+	
+	/*
+	 * Function: _fnCloneTable
+	 * Purpose:  Clone the table node and do basic initialisation
+	 * Returns:  -
+	 * Inputs:   -
+	 */
+	function _fnCloneTable ()
+	{
+		var nOrigTable = _oSettings.nTable;
+		
+		/* We know that the table _MUST_ has a DIV wrapped around it, because this is simply how
+		 * DataTables works. Therefore, we can set this to be relatively position (if it is not
+		 * alreadu absolute, and use this as the base point for the cloned header
+		 */
+		if ( $(nOrigTable.parentNode).css('position') != "absolute" )
+		{
+			nOrigTable.parentNode.style.position = "relative";
+		}
+		
+		/* Need to know the table's position relative to the other elements */
+		_iOffset = nOrigTable.offsetTop;
+		
+		/* Just a shallow clone will do - we only want the table node */
+		_nCTable = nOrigTable.cloneNode( false );
+		_nCTable.style.position = "absolute";
+		_nCTable.style.top = _iOffset+"px";
+		_nCTable.style.left = nOrigTable.offsetLeft+"px";
+		_nCTable.className += " FixedHeader_Cloned";
+		_nCTable.id += "_Cloned";
+		
+		/* Insert the newly cloned table into the DOM, on top of the "real" header */
+		nOrigTable.parentNode.insertBefore( _nCTable, nOrigTable );
+		
+		/* Dev note: for some mental reason we can't use the offset of '_nCTable' in IE. The original
+		 * table will do us nicely though
+		 */
+		_iStart = $(_oSettings.nTable).offset().top;
+		_iStartLeft = $(_oSettings.nTable).offset().left;
+		
+		/* Add the scroll event handler to move the table header */
+		$(window).scroll( function () {
+			var iWindow = $(window).scrollTop();
+			
+			if ( _bIsIE6 )
+			{
+				if ( _iStart < iWindow )
+				{
+					var iNew = iWindow-_iStart+_iOffset;
+					var iTbodyHeight = _oSettings.nTable.getElementsByTagName('tbody')[0].offsetHeight;
+					
+					if ( iNew < _iOffset+iTbodyHeight )
+					{
+						/* In the middle of the table */
+						_fnUpdateCache( 'sTop', iNew+"px", 'top', _nCTable.style );
+					}
+					else
+					{
+						/* At the bottom of the table */
+						_fnUpdateCache( 'sTop', (_iOffset+iTbodyHeight)+"px", 'top', _nCTable.style );
+					}
+				}
+				else
+				{
+					/* Above the table */
+					_fnUpdateCache( 'sTop', _iOffset+"px", 'top', _nCTable.style );
+				}
+			}
+			else
+			{
+				if ( _iStart < iWindow )
+				{
+					var iNew = iWindow-_iStart+_iOffset;
+					var iTbodyHeight = _oSettings.nTable.getElementsByTagName('tbody')[0].offsetHeight;
+					
+					if ( iNew < _iOffset+iTbodyHeight )
+					{
+						/* In the middle of the table */
+						_fnUpdateCache( 'sPosition', 'fixed',          'position', _nCTable.style );
+						_fnUpdateCache( 'sTop',      "0px",            'top',      _nCTable.style );
+						_fnUpdateCache( 'sLeft',     _iStartLeft+"px", 'left',     _nCTable.style );
+					}
+					else
+					{
+						/* At the bottom of the table */
+						_fnUpdateCache( 'sPosition', 'absolute',                 'position', _nCTable.style );
+						_fnUpdateCache( 'sTop',      _iOffset+iTbodyHeight+"px", 'top',      _nCTable.style );
+						_fnUpdateCache( 'sLeft',     "0px",                      'left',     _nCTable.style );
+					}
+				}
+				else
+				{
+					/* Above the table */
+					_fnUpdateCache( 'sPosition', 'absolute',    'position', _nCTable.style );
+					_fnUpdateCache( 'sTop',      _iOffset+"px", 'top',      _nCTable.style );
+					_fnUpdateCache( 'sLeft',     "0px",         'left',     _nCTable.style );
+				}
+			}
+		} );
+	}
+	
+	/*
+	 * Function: _fnUpdateCache
+	 * Purpose:  Check the cache and update cache and value if needed
+	 * Returns:  -
+	 * Inputs:   string:sCache - cache property
+	 *           string:sSet - value to set
+	 *           string:sProperty - object property to set
+	 *           object:oObj - object to update
+	 */
+	function _fnUpdateCache ( sCache, sSet, sProperty, oObj )
+	{
+		if ( _oCache[sCache] != sSet )
+		{
+			oObj[sProperty] = sSet;
+			_oCache[sCache] = sSet;
+		}
+	}
+	
+	/*
+	 * Function: _fnCloneThead
+	 * Purpose:  Clone the THEAD element used in the DataTable and add required event listeners
+	 * Returns:  -
+	 * Inputs:   -
+	 */
+	function _fnCloneThead ()
+	{
+		/* Remove any children the cloned table has */
+		while ( _nCTable.childNodes.length > 0 )
+		{
+			$('thead th', _nCTable).unbind( 'click' );
+			_nCTable.removeChild( _nCTable.childNodes[0] );
+		}
+		
+		/* Clone the DataTables header */
+		var nThead = $('thead', _oSettings.nTable).clone(false)[0];
+		_nCTable.appendChild( nThead );
+		
+		/* Copy the widths across - apparently a clone isn't good enough for this */
+		$("thead:eq(0)>tr th", _oSettings.nTable).each( function (i) {
+			$("thead:eq(0)>tr th:eq("+i+")", _nCTable).width( $(this).width() );
+		} );
+		
+		$("thead:eq(0)>tr td", _oSettings.nTable).each( function (i) {
+			$("thead:eq(0)>tr th:eq("+i+")", _nCTable)[0].style.width( $(this).width() );
+		} );
+		
+		/* Add the event handlers for sorting */
+		$('thead th', _nCTable).click( function (e) {
+			/* Don't try and do the sort ourselves - let DataTables take care of the logic */
+			var iTrigger = $('thead th', _nCTable).index(this);
+			$('thead th:eq('+iTrigger+')', _oSettings.nTable).click();
+			_fnCloneThead();
+		} );
+	}
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Initialisation
+	 */
+	_oTable = oTable;
+	_oSettings = _oTable.fnSettings();
+	
+	//_bIsIE6 = ($.browser.msie && $.browser.version=="6.0");
+	_bIsIE6 = ($.browser.msie && ($.browser.version=="6.0"||$.browser.version=="7.0"));
+	
+	_fnCloneTable();
+	_fnCloneThead();
+}
+
+})(jQuery);

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/FixedHeader/index.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/extras/FixedHeader/index.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/extras/FixedHeader/index.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,482 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8">
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico">
+		
+		<title>FixedHeader example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+			@import "media/css/TableTools.css";
+			table.FixedHeader_Cloned thead th { background-color: white; }
+		</style>
+		<script type="text/javascript" charset="utf-8" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" charset="utf-8" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8" src="FixedHeader.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready( function () {
+				var oTable = $('#example').dataTable();
+				$.fn.dataTableExt.FixedHeader( oTable );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				FixedHeader example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>When displaying large amounts of data in a table, it can often be useful for the end user to have the column titles (the "thead" element as a whole in fact) always visible. This is particularly true if using DataTables with pagination disabled, or the display length is set to a high value.</p>
+			<p>The "FixedHeader" add-on for DataTables will ensure that your column titles will scroll with the page, showing at the top of the table at all times. Try the demo shown below - you might want to try resizing the window for full effect! Note also that the column titles remain clickable to perform sorting on the table.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready( function () {
+	var oTable = $('#example').dataTable();
+	$.fn.dataTableExt.FixedHeader( oTable );
+} );</pre>
+		
+			<p>Empty paragraphs to force scrolling!...</p>
+			<p style="height:500px;">&nbsp;</p>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					FixedHeader and DataTables &copy; Allan Jardine 2009.<br>
+				</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/index.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/index.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/index.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,470 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8">
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico">
+		
+		<title>TableTools example</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../media/css/demo_page.css";
+			@import "../../media/css/demo_table.css";
+			@import "media/css/TableTools.css";
+		</style>
+		<script type="text/javascript" charset="utf-8" src="../../media/js/jquery.js"></script>
+		<script type="text/javascript" charset="utf-8" src="../../media/js/jquery.dataTables.js"></script>
+		<script type="text/javascript" charset="utf-8" src="media/ZeroClipboard/ZeroClipboard.js"></script>
+		<script type="text/javascript" charset="utf-8" src="media/js/TableTools.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			$(document).ready( function () {
+				$('#example').dataTable( {
+					"sDom": 'T<"clear">lfrtip'
+				} );
+			} );
+		</script>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				TableTools example
+			</div>
+			
+			<h1>Preamble</h1>
+			<p>TableTools in a features plug-in for DataTables which presents a tool bar for a table providing the end user with options for saving files Comma Separated Values (CSV) or Excel (XLS), copying data to system Clipboard, or printing the table.</p>
+			<p>Please note that DataTables 1.5 beta 9 or greater is required for TableTools and Flash 10 is used for the file saving / clipboard operations so the user will require that installed for their browser. Features and customisation options for TableTools is done through the <i>TableToolsInit</i> variable.</p>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Société</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="odd_gradeX">
+			<td>Trident</td>
+			<td>Internet Explorer 4.0 (focus once)</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="even_gradeC">
+			<td>Trident</td>
+			<td>Internet Explorer 5.0</td>
+			<td>Win 95+ (blur)</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Trident (focus)</td>
+			<td>Internet Explorer 5.5</td>
+			<td>Win 95+ (action/bold)</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 6 (focus)</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+ (blur)</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP (action/italic)</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="even_gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="odd_gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="even_gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="odd_gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="even_gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="odd_gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="even_gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="odd_gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="even_gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="odd_gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="even_gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="odd_gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<h1>Initialisation code</h1>
+			<pre>$(document).ready( function () {
+	$('#example').dataTable( {
+		"sDom": 'T<"clear">lfrtip'
+	} );
+} );</pre>
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					TableTools and DataTables &copy; Allan Jardine 2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.<br>
+					Flash 10 save / copy operations are performed by a modified version of <a href="http://code.google.com/p/zeroclipboard/">Zero Clipboard</a>.<br>
+					The icons used in the toolbar are modified from <a href="http://www.addictedtocoffee.de/">Oliver Twardowski's</a> <a href="http://www.smashingmagazine.com/2009/05/20/flavour-extended-the-ultimate-icon-set-for-web-designers/">Flavours Icon set</a>.
+				</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/ZeroClipboard/ZeroClipboard.as
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/ZeroClipboard/ZeroClipboard.as	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/ZeroClipboard/ZeroClipboard.as	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,97 @@
+package {
+	import flash.display.Stage;
+	import flash.display.Sprite;
+	import flash.display.LoaderInfo;
+	import flash.display.StageScaleMode;
+	import flash.events.*;
+	import flash.display.StageAlign;
+	import flash.display.StageScaleMode;
+	import flash.external.ExternalInterface;
+	import flash.system.Security;
+	import flash.utils.*;
+	import flash.system.System;
+	import flash.net.FileReference;
+	import flash.net.FileFilter;
+ 
+	public class ZeroClipboard extends Sprite {
+		
+		private var id:String = '';
+		private var button:Sprite;
+		private var clipText:String = 'blank';
+		private var fileName:String = '';
+		private var action:String = 'copy';
+		
+		public function ZeroClipboard() {
+			// constructor, setup event listeners and external interfaces
+			stage.scaleMode = StageScaleMode.EXACT_FIT;
+			flash.system.Security.allowDomain("*");
+			
+			// import flashvars
+			var flashvars:Object = LoaderInfo( this.root.loaderInfo ).parameters;
+			id = flashvars.id;
+			
+			// invisible button covers entire stage
+			button = new Sprite();
+			button.buttonMode = true;
+			button.useHandCursor = true;
+			button.graphics.beginFill(0xCCFF00);
+			button.graphics.drawRect(0, 0, Math.floor(flashvars.width), Math.floor(flashvars.height));
+			button.alpha = 0.0;
+			addChild(button);
+			button.addEventListener(MouseEvent.CLICK, clickHandler);
+			
+			button.addEventListener(MouseEvent.MOUSE_OVER, function(event:Event) {
+				ExternalInterface.call( 'ZeroClipboard.dispatch', id, 'mouseOver', null );
+			} );
+			button.addEventListener(MouseEvent.MOUSE_OUT, function(event:Event) {
+				ExternalInterface.call( 'ZeroClipboard.dispatch', id, 'mouseOut', null );
+			} );
+			button.addEventListener(MouseEvent.MOUSE_DOWN, function(event:Event) {
+				ExternalInterface.call( 'ZeroClipboard.dispatch', id, 'mouseDown', null );
+			} );
+			button.addEventListener(MouseEvent.MOUSE_UP, function(event:Event) {
+				ExternalInterface.call( 'ZeroClipboard.dispatch', id, 'mouseUp', null );
+			} );
+			
+			// external functions
+			ExternalInterface.addCallback("setHandCursor", setHandCursor);
+			ExternalInterface.addCallback("setText", setText);
+			ExternalInterface.addCallback("setFileName", setFileName);
+			ExternalInterface.addCallback("setAction", setAction);
+			
+			// signal to the browser that we are ready
+			ExternalInterface.call( 'ZeroClipboard.dispatch', id, 'load', null );
+		}
+		
+		public function setText(newText:String) {
+			// set the maximum number of files allowed
+			clipText = newText;
+		}
+		
+		public function setFileName(newFileName:String) {
+			fileName = newFileName;
+		}
+		
+		public function setAction(newAction:String) {
+			action = newAction;
+		}
+		
+		public function setHandCursor(enabled:Boolean) {
+			// control whether the hand cursor is shown on rollover (true)
+			// or the default arrow cursor (false)
+			button.useHandCursor = enabled;
+		}
+		
+		private function clickHandler(event:Event):void {
+			if ( action == "save" ) {
+				/* Present the user a file save dialogue */
+				var fileRef:FileReference = new FileReference();
+				fileRef.save( clipText, fileName );
+			} else {
+				/* Copy the text to the clipboard */
+				System.setClipboard( clipText );
+			}
+			ExternalInterface.call( 'ZeroClipboard.dispatch', id, 'complete', clipText );
+		}
+	}
+}
Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/ZeroClipboard/ZeroClipboard.fla
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/ZeroClipboard/ZeroClipboard.fla
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/ZeroClipboard/ZeroClipboard.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/ZeroClipboard/ZeroClipboard.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/ZeroClipboard/ZeroClipboard.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,313 @@
+// Simple Set Clipboard System
+// Author: Joseph Huckaby
+
+var ZeroClipboard = {
+	
+	version: "1.0.4",
+	clients: {}, // registered upload clients on page, indexed by id
+	moviePath: 'ZeroClipboard.swf', // URL to movie
+	nextId: 1, // ID of next movie
+	
+	$: function(thingy) {
+		// simple DOM lookup utility function
+		if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
+		if (!thingy.addClass) {
+			// extend element with a few useful methods
+			thingy.hide = function() { this.style.display = 'none'; };
+			thingy.show = function() { this.style.display = ''; };
+			thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
+			thingy.removeClass = function(name) {
+				this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, '');
+			};
+			thingy.hasClass = function(name) {
+				return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
+			}
+		}
+		return thingy;
+	},
+	
+	setMoviePath: function(path) {
+		// set path to ZeroClipboard.swf
+		this.moviePath = path;
+	},
+	
+	dispatch: function(id, eventName, args) {
+		// receive event from flash movie, send to client		
+		var client = this.clients[id];
+		if (client) {
+			client.receiveEvent(eventName, args);
+		}
+	},
+	
+	register: function(id, client) {
+		// register new client to receive events
+		this.clients[id] = client;
+	},
+	
+	getDOMObjectPosition: function(obj) {
+		// get absolute coordinates for dom element
+		var info = {
+			left: 0, 
+			top: 0, 
+			width: obj.width ? obj.width : obj.offsetWidth, 
+			height: obj.height ? obj.height : obj.offsetHeight
+		};
+		
+		if ( obj.style.width != "" )
+			info.width = obj.style.width.replace("px","");
+		
+		if ( obj.style.height != "" )
+			info.height = obj.style.height.replace("px","");
+
+		while (obj) {
+			info.left += obj.offsetLeft;
+			info.top += obj.offsetTop;
+			obj = obj.offsetParent;
+		}
+
+		return info;
+	},
+	
+	Client: function(elem) {
+		// constructor for new simple upload client
+		this.handlers = {};
+		
+		// unique ID
+		this.id = ZeroClipboard.nextId++;
+		this.movieId = 'ZeroClipboardMovie_' + this.id;
+		
+		// register client with singleton to receive flash events
+		ZeroClipboard.register(this.id, this);
+		
+		// create movie
+		if (elem) this.glue(elem);
+	}
+};
+
+ZeroClipboard.Client.prototype = {
+	
+	id: 0, // unique ID for us
+	ready: false, // whether movie is ready to receive events or not
+	movie: null, // reference to movie object
+	clipText: '', // text to copy to clipboard
+	fileName: '', // default file save name
+	action: 'copy', // action to perform
+	handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
+	cssEffects: true, // enable CSS mouse effects on dom container
+	handlers: null, // user event handlers
+	
+	glue: function(elem, title) {
+		// glue to DOM element
+		// elem can be ID or actual DOM element object
+		this.domElement = ZeroClipboard.$(elem);
+		
+		// float just above object, or zIndex 99 if dom element isn't set
+		var zIndex = 99;
+		if (this.domElement.style.zIndex) {
+			zIndex = parseInt(this.domElement.style.zIndex) + 1;
+		}
+		
+		// find X/Y position of domElement
+		var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
+		
+		// create floating DIV above element
+		this.div = document.createElement('div');
+		var style = this.div.style;
+		style.position = 'absolute';
+		style.left = '0px';
+		style.top = '0px';
+		style.width = '' + box.width + 'px';
+		style.height = '' + box.height + 'px';
+		style.zIndex = zIndex;
+		if ( typeof title != "undefined" ) {
+			this.div.title = title;
+		}
+		
+		// style.backgroundColor = '#f00'; // debug
+		this.domElement.appendChild(this.div);
+		
+		this.div.innerHTML = this.getHTML( box.width, box.height );
+	},
+	
+	getHTML: function(width, height) {
+		// return HTML for movie
+		var html = '';
+		var flashvars = 'id=' + this.id + 
+			'&width=' + width + 
+			'&height=' + height;
+			
+		if (navigator.userAgent.match(/MSIE/)) {
+			// IE gets an OBJECT tag
+			var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
+			html += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>';
+		}
+		else {
+			// all other browsers get an EMBED tag
+			html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';
+		}
+		return html;
+	},
+	
+	hide: function() {
+		// temporarily hide floater offscreen
+		if (this.div) {
+			this.div.style.left = '-2000px';
+		}
+	},
+	
+	show: function() {
+		// show ourselves after a call to hide()
+		this.reposition();
+	},
+	
+	destroy: function() {
+		// destroy control and floater
+		if (this.domElement && this.div) {
+			this.hide();
+			this.div.innerHTML = '';
+			
+			var body = document.getElementsByTagName('body')[0];
+			try { body.removeChild( this.div ); } catch(e) {;}
+			
+			this.domElement = null;
+			this.div = null;
+		}
+	},
+	
+	reposition: function(elem) {
+		// reposition our floating div, optionally to new container
+		// warning: container CANNOT change size, only position
+		if (elem) {
+			this.domElement = ZeroClipboard.$(elem);
+			if (!this.domElement) this.hide();
+		}
+		
+		if (this.domElement && this.div) {
+			var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
+			var style = this.div.style;
+			style.left = '' + box.left + 'px';
+			style.top = '' + box.top + 'px';
+		}
+	},
+	
+	setText: function(newText) {
+		// set text to be copied to clipboard
+		this.clipText = newText;
+		if (this.ready) { this.movie.setText(newText) ;}
+	},
+	
+	setFileName: function(newText) {
+		// set text to be copied to clipboard
+		this.fileName = newText;
+		if (this.ready) this.movie.setFileName(newText);
+	},
+	
+	setAction: function(newText) {
+		// set text to be copied to clipboard
+		this.action = newText;
+		if (this.ready) this.movie.setAction(newText);
+	},
+	
+	addEventListener: function(eventName, func) {
+		// add user event listener for event
+		// event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
+		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
+		if (!this.handlers[eventName]) this.handlers[eventName] = [];
+		this.handlers[eventName].push(func);
+	},
+	
+	setHandCursor: function(enabled) {
+		// enable hand cursor (true), or default arrow cursor (false)
+		this.handCursorEnabled = enabled;
+		if (this.ready) this.movie.setHandCursor(enabled);
+	},
+	
+	setCSSEffects: function(enabled) {
+		// enable or disable CSS effects on DOM container
+		this.cssEffects = !!enabled;
+	},
+	
+	receiveEvent: function(eventName, args) {
+		// receive event from flash
+		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
+				
+		// special behavior for certain events
+		switch (eventName) {
+			case 'load':
+				// movie claims it is ready, but in IE this isn't always the case...
+				// bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
+				this.movie = document.getElementById(this.movieId);
+				if (!this.movie) {
+					var self = this;
+					setTimeout( function() { self.receiveEvent('load', null); }, 1 );
+					return;
+				}
+				
+				// firefox on pc needs a "kick" in order to set these in certain cases
+				if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
+					var self = this;
+					setTimeout( function() { self.receiveEvent('load', null); }, 100 );
+					this.ready = true;
+					return;
+				}
+				
+				this.ready = true;
+				this.movie.setText( this.clipText );
+				this.movie.setFileName( this.fileName );
+				this.movie.setAction( this.action );
+				this.movie.setHandCursor( this.handCursorEnabled );
+				break;
+			
+			case 'mouseover':
+				if (this.domElement && this.cssEffects) {
+					this.domElement.addClass('hover');
+					if (this.recoverActive) this.domElement.addClass('active');
+				}
+				break;
+			
+			case 'mouseout':
+				if (this.domElement && this.cssEffects) {
+					this.recoverActive = false;
+					if (this.domElement.hasClass('active')) {
+						this.domElement.removeClass('active');
+						this.recoverActive = true;
+					}
+					this.domElement.removeClass('hover');
+				}
+				break;
+			
+			case 'mousedown':
+				if (this.domElement && this.cssEffects) {
+					this.domElement.addClass('active');
+				}
+				break;
+			
+			case 'mouseup':
+				if (this.domElement && this.cssEffects) {
+					this.domElement.removeClass('active');
+					this.recoverActive = false;
+				}
+				break;
+		} // switch eventName
+		
+		if (this.handlers[eventName]) {
+			for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
+				var func = this.handlers[eventName][idx];
+			
+				if (typeof(func) == 'function') {
+					// actual function reference
+					func(this, args);
+				}
+				else if ((typeof(func) == 'object') && (func.length == 2)) {
+					// PHP style object + method, i.e. [myObject, 'myMethod']
+					func[0][ func[1] ](this, args);
+				}
+				else if (typeof(func) == 'string') {
+					// name of function
+					window[func](this, args);
+				}
+			} // foreach event handler defined
+		} // user defined handler for event
+	}
+	
+};

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/css/TableTools.css
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/css/TableTools.css	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/css/TableTools.css	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,97 @@
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * TableTools styles
+ */
+.TableTools {
+	padding: 3px 0 3px 3px;
+	border: 1px solid #d0d0d0;
+	background-color: #f0f0f0;
+	float: right;
+	margin-bottom: 1em;
+}
+
+.TableTools_button {
+	position: relative;
+	float: left;
+	margin-right: 3px;
+}
+
+.TableTools_csv {
+	background: url(../images/csv.png) no-repeat center center;
+	border: 1px solid #f0f0f0;
+}
+
+.TableTools_csv_hover {
+	background: url(../images/csv_hover.png) no-repeat center center;
+	border: 1px solid #d0d0d0;
+	background-color: #fdfdfd;
+}
+
+.TableTools_xls {
+	background: url(../images/xls.png) no-repeat center center;
+	border: 1px solid #f0f0f0;
+}
+
+.TableTools_xls_hover {
+	background: url(../images/xls_hover.png) no-repeat center center;
+	border: 1px solid #d0d0d0;
+	background-color: #fdfdfd;
+}
+
+.TableTools_clipboard {
+	background: url(../images/copy.png) no-repeat center center;
+	border: 1px solid #f0f0f0;
+}
+
+.TableTools_clipboard_hover {
+	background: url(../images/copy_hover.png) no-repeat center center;
+	border: 1px solid #d0d0d0;
+	background-color: #fdfdfd;
+}
+
+.TableTools_print {
+	background: url(../images/print.png) no-repeat center center;
+	border: 1px solid #f0f0f0;
+}
+
+.TableTools_print_hover {
+	background: url(../images/print_hover.png) no-repeat center center;
+	border: 1px solid #d0d0d0;
+	background-color: #fdfdfd;
+}
+
+.TableTools_PrintInfo {
+	position: absolute;
+	top: 50%;
+	left: 50%;
+	width: 400px;
+	height: 150px;
+	margin-left: -200px;
+	margin-top: -75px;
+	text-align: center;
+	background-color: #3f3f3f;
+	color: white;
+	padding: 10px 30px;
+	
+	opacity: 0.9;
+	
+	border-radius: 5px;
+	-moz-border-radius: 5px;
+	-webkit-border-radius: 5px;
+	
+	box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5);
+	-moz-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5);
+	-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5);
+}
+
+.TableTools_PrintInfo h6 {
+	font-weight: normal;
+	font-size: 28px;
+	line-height: 28px;
+	margin: 1em;
+}
+
+.TableTools_PrintInfo p {
+	font-size: 14px;
+	line-height: 20px;
+}

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/copy document.psd
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/copy document.psd
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/copy.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/copy.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/copy_hover.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/copy_hover.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/csv.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/csv.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/csv_hover.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/csv_hover.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/file_types.psd
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/file_types.psd
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/print.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/print.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/print_hover.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/print_hover.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/printer.psd
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/printer.psd
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/xls.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/xls.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/xls_hover.png
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/images/xls_hover.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/js/TableTools.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/js/TableTools.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/js/TableTools.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,588 @@
+/*
+ * File:        TableTools.js
+ * Version:     1.0.4 dev
+ * CVS:         $Id$
+ * Description: Copy, save and print functions for DataTables
+ * Author:      Allan Jardine (www.sprymedia.co.uk)
+ * Created:     Wed  1 Apr 2009 08:41:58 BST
+ * Modified:    $Date$ by $Author$
+ * Language:    Javascript
+ * License:     LGPL
+ * Project:     Just a little bit of fun :-)
+ * Contact:     www.sprymedia.co.uk/contact
+ * 
+ * Copyright 2009 Allan Jardine, all rights reserved.
+ *
+ */
+
+/*
+ * Variable: TableToolsInit
+ * Purpose:  Parameters for TableTools customisation
+ * Scope:    global
+ */
+var TableToolsInit = {
+	"oFeatures": {
+		"bCsv": true,
+		"bXls": true,
+		"bCopy": true,
+		"bPrint": true
+	},
+	"bIncHiddenColumns": false,
+	"sPrintMessage": "",
+	"sTitle": "",
+	"sSwfPath": "media/swf/ZeroClipboard.swf",
+	"iButtonHeight": 30,
+	"iButtonWidth": 30,
+	"sCsvBoundary": "'",
+	"_iNextId": 1 /* Internal useage - but needs to be global */
+};
+
+
+(function($) {
+/*
+ * Function: TableTools
+ * Purpose:  TableTools "class"
+ * Returns:  same as _fnInit
+ * Inputs:   same as _fnInit
+ */
+function TableTools ( oInit )
+{
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Private parameters
+	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+	var _oSettings;
+	var nTools = null;
+	var _nTableWrapper;
+	var _aoPrintHidden = [];
+	var _iPrintScroll = 0;
+	var _nPrintMessage = null;
+	var _DTSettings;
+	var _sLastData;
+	var _iId;
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Initialisation
+	 */
+	
+	/*
+	 * Function: _fnInit
+	 * Purpose:  Initialise the table tools
+	 * Returns:  node: - The created node for the table tools wrapping
+ 	 * Inputs:   object:oInit - object with:
+ 	 *             oDTSettings - DataTables settings
+	 */
+	function _fnInit( oInit )
+	{
+		_nTools = document.createElement('div');
+		_nTools.className = "TableTools";
+		_iId = TableToolsInit._iNextId++;
+		
+		/* Copy the init object */
+		_oSettings = $.extend( true, {}, TableToolsInit );
+		
+		_DTSettings = oInit.oDTSettings;
+		
+		_nTableWrapper = fnFindParentClass( _DTSettings.nTable, "dataTables_wrapper" );
+		
+		ZeroClipboard.moviePath = _oSettings.sSwfPath;
+		
+		if ( _oSettings.oFeatures.bCopy ) {
+			fnFeatureClipboard();
+		}
+		if ( _oSettings.oFeatures.bCsv ) {
+			fnFeatureSaveCSV();
+		}
+		if ( _oSettings.oFeatures.bXls ) {
+			fnFeatureSaveXLS();
+		}
+		if ( _oSettings.oFeatures.bPrint ) {
+			fnFeaturePrint();
+		}
+		
+		return _nTools;
+	}
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Feature buttons
+	 */
+	
+	/*
+	 * Function: fnFeatureSaveCSV
+	 * Purpose:  Add a button for saving a CSV file
+	 * Returns:  -
+	 * Inputs:   -
+	 */
+	function fnFeatureSaveCSV ()
+	{
+		var sBaseClass = "TableTools_button TableTools_csv";
+		var nButton = document.createElement( 'div' );
+		nButton.id = "ToolTables_CSV_"+_iId;
+		nButton.style.height = _oSettings.iButtonHeight+'px';
+		nButton.style.width = _oSettings.iButtonWidth+'px';
+		nButton.className = sBaseClass;
+		_nTools.appendChild( nButton );
+		
+		var clip = new ZeroClipboard.Client();
+		clip.setHandCursor( true );
+		clip.setAction( 'save' );
+		clip.setFileName( fnGetTitle()+'.csv' );
+		
+		clip.addEventListener('mouseOver', function(client) {
+			nButton.className = sBaseClass+'_hover';
+		} );
+		
+		clip.addEventListener('mouseOut', function(client) {
+			nButton.className = sBaseClass;
+		} );
+		
+		clip.addEventListener('mouseDown', function(client) {
+			clip.setText( fnGetDataTablesData(",", TableToolsInit.sCsvBoundary) );
+		} );
+		
+		fnGlue( clip, nButton, "ToolTables_CSV_"+_iId, "Save as CSV" );
+	}
+	
+	
+	/*
+	 * Function: fnFeatureSaveXLS
+	 * Purpose:  Add a button for saving an XLS file
+	 * Returns:  -
+	 * Inputs:   -
+	 */
+	function fnFeatureSaveXLS ()
+	{
+		var sBaseClass = "TableTools_button TableTools_xls";
+		var nButton = document.createElement( 'div' );
+		nButton.id = "ToolTables_XLS_"+_iId;
+		nButton.style.height = _oSettings.iButtonHeight+'px';
+		nButton.style.width = _oSettings.iButtonWidth+'px';
+		nButton.className = sBaseClass;
+		_nTools.appendChild( nButton );
+		
+		var clip = new ZeroClipboard.Client();
+		clip.setHandCursor( true );
+		clip.setAction( 'save' );
+		clip.setFileName( fnGetTitle()+'.xls' );
+		
+		clip.addEventListener('mouseOver', function(client) {
+			nButton.className = sBaseClass+'_hover';
+		} );
+		
+		clip.addEventListener('mouseOut', function(client) {
+			nButton.className = sBaseClass;
+		} );
+		
+		clip.addEventListener('mouseDown', function(client) {
+			clip.setText( fnGetDataTablesData("\t") );
+		} );
+		
+		fnGlue( clip, nButton, "ToolTables_XLS_"+_iId, "Save for Excel" );
+	}
+	
+	
+	/*
+	 * Function: fnFeatureClipboard
+	 * Purpose:  Add a button for copying data to clipboard
+	 * Returns:  -
+	 * Inputs:   -
+	 */
+	function fnFeatureClipboard ()
+	{
+		var sBaseClass = "TableTools_button TableTools_clipboard";
+		var nButton = document.createElement( 'div' );
+		nButton.id = "ToolTables_Copy_"+_iId;
+		nButton.style.height = _oSettings.iButtonHeight+'px';
+		nButton.style.width = _oSettings.iButtonWidth+'px';
+		nButton.className = sBaseClass;
+		_nTools.appendChild( nButton );
+		
+		var clip = new ZeroClipboard.Client();
+		clip.setHandCursor( true );
+		clip.setAction( 'copy' );
+		
+		clip.addEventListener('mouseOver', function(client) {
+			nButton.className = sBaseClass+'_hover';
+		} );
+		
+		clip.addEventListener('mouseOut', function(client) {
+			nButton.className = sBaseClass;
+		} );
+		
+		clip.addEventListener('mouseDown', function(client) {
+			clip.setText( fnGetDataTablesData("\t") );
+		} );
+		
+		clip.addEventListener('complete', function (client, text) {
+			var aData = _sLastData.split('\n');
+			alert( 'Copied '+(aData.length-2)+' rows to the clipboard' );
+		} );
+		
+		fnGlue( clip, nButton, "ToolTables_Copy_"+_iId, "Copy to clipboard" );
+	}
+	
+	
+	/*
+	 * Function: fnFeaturePrint
+	 * Purpose:  Add a button for printing data
+	 * Returns:  -
+	 * Inputs:   -
+	 * Notes:    Fun one this function. In order to print the table, we want the table to retain
+	 *   it's position in the DOM, so all styles still apply, but we don't want to print all the
+	 *   other nonesense. So we hide that nonesese and add an event handler for 'esc' which will
+	 *   restore a normal view.
+	 */
+	function fnFeaturePrint ()
+	{
+		var sBaseClass = "TableTools_button TableTools_print";
+		var nButton = document.createElement( 'div' );
+		nButton.style.height = _oSettings.iButtonHeight+'px';
+		nButton.style.width = _oSettings.iButtonWidth+'px';
+		nButton.className = sBaseClass;
+		nButton.title = "Print table";
+		_nTools.appendChild( nButton );
+		
+		/* Could do this in CSS - but might as well be consistent with the flash buttons */
+		$(nButton).hover( function(client) {
+			nButton.className = sBaseClass+'_hover';
+		}, function(client) {
+			nButton.className = sBaseClass;
+		} );
+		
+		$(nButton).click( function() {
+			/* Parse through the DOM hiding everything that isn't needed for the table */
+			fnPrintHideNodes( _DTSettings.nTable );
+			
+			/* Show the whole table */
+			_iPrintSaveLength = _DTSettings._iDisplayLength;
+			_DTSettings._iDisplayLength = -1;
+			_DTSettings.oApi._fnCalculateEnd( _DTSettings );
+			_DTSettings.oApi._fnDraw( _DTSettings );
+			
+			/* Remove the other DataTables feature nodes - but leave the table! and info div */
+			var anFeature = _DTSettings.anFeatures;
+			for ( var cFeature in anFeature )
+			{
+				if ( cFeature != 'i' && cFeature != 't' )
+				{
+					_aoPrintHidden.push( {
+						"node": anFeature[cFeature],
+						"display": "block"
+					} );
+					anFeature[cFeature].style.display = "none";
+				}
+			}
+			
+			/* Add a node telling the user what is going on */
+			var nInfo = document.createElement( "div" );
+			nInfo.className = "TableTools_PrintInfo";
+			nInfo.innerHTML = "<h6>Print view</h6><p>Please use your browser's print function to "+
+				"print this table. Press escape when finished.";
+			document.body.appendChild( nInfo );
+			
+			/* Add a message at the top of the page */
+			if ( _oSettings.sPrintMessage !== "" )
+			{
+				_nPrintMessage = document.createElement( "p" );
+				_nPrintMessage.className = "TableTools_PrintMessage";
+				_nPrintMessage.innerHTML = _oSettings.sPrintMessage;
+				document.body.insertBefore( _nPrintMessage, document.body.childNodes[0] );
+			}
+			
+			/* Cache the scrolling and the jump to the top of the t=page */
+			_iPrintScroll = $(window).scrollTop();
+			window.scrollTo( 0, 0 );
+			
+			$(document).bind( "keydown", null, fnPrintEnd );
+			
+			setTimeout( function() {
+				$(nInfo).fadeOut( "normal", function() {
+					document.body.removeChild( nInfo );
+				} );
+			}, 2000 );
+		} );
+	}
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Printing functions
+	 */
+	
+	/*
+	 * Function: fnPrintEnd
+	 * Purpose:  Printing is finished, resume normal display
+	 * Returns:  -
+	 * Inputs:   event
+	 */
+	function fnPrintEnd ( e )
+	{
+		/* Only interested in the escape key */
+		if ( e.keyCode == 27 )
+		{
+			/* Show all hidden nodes */
+			fnPrintShowNodes();
+			
+			/* Restore the scroll */
+			window.scrollTo( 0, _iPrintScroll );
+			
+			/* Drop the print message */
+			if ( _nPrintMessage )
+			{
+				document.body.removeChild( _nPrintMessage );
+				_nPrintMessage = null;
+			}
+			
+			/* Restore the table length */
+			_DTSettings._iDisplayLength = _iPrintSaveLength;
+			_DTSettings.oApi._fnCalculateEnd( _DTSettings );
+			_DTSettings.oApi._fnDraw( _DTSettings );
+			
+			$(document).unbind( "keydown", fnPrintEnd );
+		}
+	}
+	
+	
+	/*
+	 * Function: fnPrintShowNodes
+	 * Purpose:  Resume the display of all TableTools hidden nodes
+	 * Returns:  -
+	 * Inputs:   -
+	 */
+	function fnPrintShowNodes( )
+	{
+		for ( var i=0, iLen=_aoPrintHidden.length ; i<iLen ; i++ )
+		{
+			_aoPrintHidden[i].node.style.display = _aoPrintHidden[i].display;
+		}
+		_aoPrintHidden.splice( 0, _aoPrintHidden.length );
+	}
+	
+	
+	/*
+	 * Function: fnPrintHideNodes
+	 * Purpose:  Hide nodes which are not needed in order to display the table
+	 * Returns:  -
+	 * Inputs:   node:nNode - the table node - we parse back up
+	 * Notes:    Recursive
+	 */
+	function fnPrintHideNodes( nNode )
+	{
+		var nParent = nNode.parentNode;
+		var nChildren = nParent.childNodes;
+		for ( var i=0, iLen=nChildren.length ; i<iLen ; i++ )
+		{
+			if ( nChildren[i] != nNode && nChildren[i].nodeType == 1 )
+			{
+				/* If our node is shown (don't want to show nodes which were previously hidden) */
+				var sDisplay = $(nChildren[i]).css("display");
+			 	if ( sDisplay != "none" )
+				{
+					/* Cache the node and it's previous state so we can restore it */
+					_aoPrintHidden.push( {
+						"node": nChildren[i],
+						"display": sDisplay
+					} );
+					nChildren[i].style.display = "none";
+				}
+			}
+		}
+		
+		if ( nParent.nodeName != "BODY" )
+		{
+			fnPrintHideNodes( nParent );
+		}
+	}
+	
+	
+	
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Support functions
+	 */
+	
+	/*
+	 * Function: fnGlue
+	 * Purpose:  Wait until the id is in the DOM before we "glue" the swf
+	 * Returns:  -
+	 * Inputs:   object:clip - Zero clipboard object
+	 *           node:node - node to glue swf to
+	 *           string:id - id of the element to look for
+	 *           string:text - title of the flash movie
+	 * Notes:    Recursive (setTimeout)
+	 */
+	function fnGlue ( clip, node, id, text )
+	{
+		if ( document.getElementById(id) )
+		{
+			clip.glue( node, text );
+		}
+		else
+		{
+			setTimeout( function () {
+				fnGlue( clip, node, id, text );
+			}, 100 );
+		}
+	}
+	
+	
+	/*
+	 * Function: fnGetTitle
+	 * Purpose:  Get the title of the page (from DOM or user set) for file saving
+	 * Returns:  
+	 * Inputs:   
+	 */
+	function fnGetTitle( )
+	{
+		var sTitle;
+		if ( _oSettings.sTitle !== "" ) {
+			sTitle = _oSettings.sTitle;
+		} else {
+			sTitle = document.getElementsByTagName('title')[0].innerHTML;
+		}
+		
+		/* Strip characters which the OS will object to - checking for UTF8 support in the scripting
+		 * engine
+		 */
+		if ( "\u00A1".toString().length < 4 ) {
+			return sTitle.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g, "");
+		} else {
+			return sTitle.replace(/[^a-zA-Z0-9_\.,\-_ !\(\)]/g, "");
+		}
+	}
+	
+	
+	/*
+	 * Function: fnFindParentClass
+	 * Purpose:  Parse back up the DOM to a node with a particular node
+	 * Returns:  node: - found node
+	 * Inputs:   node:n - Node to test
+	 *           string:sClass - class to find
+	 * Notes:    Recursive
+	 */
+	function fnFindParentClass ( n, sClass )
+	{
+		if ( n.className.match(sClass) || n.nodeName == "BODY" )
+		{
+			return n;
+		}
+		else
+		{
+			return fnFindParentClass( n.parentNode, sClass );
+		}
+	}
+	
+	
+	/*
+	 * Function: fnBoundData
+	 * Purpose:  Wrap data up with a boundary string
+	 * Returns:  string: - bound data
+	 * Inputs:   string:sData - data to bound
+	 *           string:sBoundary - bounding char(s)
+	 *           regexp:regex - search for the bounding chars - constructed outside for efficincy
+	 *             in the loop
+	 */
+	function fnBoundData( sData, sBoundary, regex )
+	{
+		if ( sBoundary === "" )
+		{
+			return sData;
+		}
+		else
+		{
+			return sBoundary + sData.replace(regex, "\\"+sBoundary) + sBoundary;
+		}
+	}
+	
+	
+	/*
+	 * Function: fnGetDataTablesData
+	 * Purpose:  Get data from DataTables' internals and format it for output
+	 * Returns:  string:sData - concatinated string of data
+	 * Inputs:   string:sSeperator - field separator (ie. ,)
+	 *           string:sBoundary - field boundary (ie. ') - optional - default: ""
+	 */
+	function fnGetDataTablesData( sSeperator, sBoundary )
+	{
+		var i, iLen;
+		var j, jLen;
+		var sData = '';
+		var sLoopData = '';
+		var sNewline = navigator.userAgent.match(/Windows/) ? "\r\n" : "\n";
+		
+		if ( typeof sBoundary == "undefined" )
+		{
+			sBoundary = "";
+		}
+		var regex = new RegExp(sBoundary, "g"); /* Do it here for speed */
+		
+		/* Titles */
+		for ( i=0, iLen=_DTSettings.aoColumns.length ; i<iLen ; i++ )
+		{
+			if ( _oSettings.bIncHiddenColumns === true || _DTSettings.aoColumns[i].bVisible )
+			{
+				sLoopData = _DTSettings.aoColumns[i].sTitle.replace(/\n/g," ").replace( /<.*?>/g, "" );
+				sData += fnBoundData( sLoopData, sBoundary, regex ) + sSeperator;
+			}
+		}
+		sData = sData.slice( 0, sSeperator.length*-1 );
+		sData += sNewline;
+		
+		/* Rows */
+		for ( j=0, jLen=_DTSettings.aiDisplay.length ; j<jLen ; j++ )
+		{
+			/* Columns */
+			for ( i=0, iLen=_DTSettings.aoColumns.length ; i<iLen ; i++ )
+			{
+				if ( _oSettings.bIncHiddenColumns === true || _DTSettings.aoColumns[i].bVisible )
+				{
+					/* Convert to strings (with small optimisation) */
+					var mTypeData = _DTSettings.aoData[ _DTSettings.aiDisplay[j] ]._aData[ i ];
+					if ( typeof mTypeData == "string" )
+					{
+						sLoopData = mTypeData.replace(/\n/g," ").replace( /<.*?>/g, "" );
+					}
+					else
+					{
+						sLoopData = mTypeData+"";
+					}
+					sData += fnBoundData( sLoopData, sBoundary, regex ) + sSeperator;
+				}
+			}
+			sData = sData.slice( 0, sSeperator.length*-1 );
+			sData += sNewline;
+		}
+		
+		/* Remove the last new line */
+		sData.slice( 0, -1 );
+		
+		_sLastData = sData;
+		return sData;
+	}
+	
+	
+	/* Initialise our new object */
+	return _fnInit( oInit );
+}
+
+
+/*
+ * Register a new feature with DataTables
+ */
+if ( typeof $.fn.dataTable == "function" && typeof $.fn.dataTableExt.sVersion != "undefined" )
+{
+	$.fn.dataTableExt.aoFeatures.push( {
+		"fnInit": function( oSettings ) {
+			return new TableTools( { "oDTSettings": oSettings } );
+		},
+		"cFeature": "T",
+		"sFeature": "TableTools"
+	} );
+}
+else
+{
+	alert( "Warning: TableTools requires DataTables 1.5 beta 9 or greater - "+
+		"www.datatables.net/download");
+}
+})(jQuery);

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/js/TableTools.js.zip
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/js/TableTools.js.zip
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/jquery.dataTables.min.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/jquery.dataTables.min.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/jquery.dataTables.min.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,466 @@
+/*
+ * File:        jquery.dataTables.min.js
+ * Version:     1.5.0 beta 8
+ * Author:      Allan Jardine (www.sprymedia.co.uk)
+ * 
+ * Copyright 2008-2009 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.
+ */
+(function($){$.fn.dataTableSettings=[];$.fn.dataTableExt={};$.fn.dataTableExt.iApiIndex=0;
+$.fn.dataTableExt.oApi={};$.fn.dataTableExt.afnFiltering=[];$.fn.dataTableExt.oPagination={two_button:{fnInit:function(oSettings,fnCallbackDraw){oSettings.nPrevious=document.createElement("div");
+oSettings.nNext=document.createElement("div");if(oSettings.sTableId!==""){oSettings.nPaginate.setAttribute("id",oSettings.sTableId+"_paginate");
+oSettings.nPrevious.setAttribute("id",oSettings.sTableId+"_previous");oSettings.nNext.setAttribute("id",oSettings.sTableId+"_next")
+}oSettings.nPrevious.className="paginate_disabled_previous";oSettings.nNext.className="paginate_disabled_next";
+oSettings.nPrevious.title=oSettings.oLanguage.oPaginate.sPrevious;oSettings.nNext.title=oSettings.oLanguage.oPaginate.sNext;
+oSettings.nPaginate.appendChild(oSettings.nPrevious);oSettings.nPaginate.appendChild(oSettings.nNext);
+$(oSettings.nPaginate).insertAfter(oSettings.nTable);$(oSettings.nPrevious).click(function(){oSettings._iDisplayStart-=oSettings._iDisplayLength;
+if(oSettings._iDisplayStart<0){oSettings._iDisplayStart=0}fnCallbackDraw(oSettings)
+});$(oSettings.nNext).click(function(){if(oSettings._iDisplayStart+oSettings._iDisplayLength<oSettings.fnRecordsDisplay()){oSettings._iDisplayStart+=oSettings._iDisplayLength
+}fnCallbackDraw(oSettings)})},fnUpdate:function(oSettings,fnCallbackDraw){oSettings.nPrevious.className=(oSettings._iDisplayStart===0)?"paginate_disabled_previous":"paginate_enabled_previous";
+oSettings.nNext.className=(oSettings.fnDisplayEnd()==oSettings.fnRecordsDisplay())?"paginate_disabled_next":"paginate_enabled_next"
+}},iFullNumbersShowPages:5,full_numbers:{fnInit:function(oSettings,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;
+nFirst.className="paginate_button first";nPrevious.className="paginate_button previous";
+nNext.className="paginate_button next";nLast.className="paginate_button last";oSettings.nPaginate.appendChild(nFirst);
+oSettings.nPaginate.appendChild(nPrevious);oSettings.nPaginate.appendChild(nList);
+oSettings.nPaginate.appendChild(nNext);oSettings.nPaginate.appendChild(nLast);$(nFirst).click(function(){oSettings._iDisplayStart=0;
+fnCallbackDraw(oSettings)});$(nPrevious).click(function(){oSettings._iDisplayStart-=oSettings._iDisplayLength;
+if(oSettings._iDisplayStart<0){oSettings._iDisplayStart=0}fnCallbackDraw(oSettings)
+});$(nNext).click(function(){if(oSettings._iDisplayStart+oSettings._iDisplayLength<oSettings.fnRecordsDisplay()){oSettings._iDisplayStart+=oSettings._iDisplayLength
+}fnCallbackDraw(oSettings)});$(nLast).click(function(){var iPages=parseInt((oSettings.fnRecordsDisplay()-1)/oSettings._iDisplayLength,10)+1;
+oSettings._iDisplayStart=(iPages-1)*oSettings._iDisplayLength;fnCallbackDraw(oSettings)
+});$("span",oSettings.nPaginate).bind("mousedown",function(){return false});$("span",oSettings.nPaginate).bind("selectstart",function(){return false
+});oSettings.nPaginateList=nList},fnUpdate:function(oSettings,fnCallbackDraw){var iPageCount=jQuery.fn.dataTableExt.oPagination.iFullNumbersShowPages;
+var iPageCountHalf=Math.floor(iPageCount/2);var iPages=parseInt((oSettings.fnRecordsDisplay()-1)/oSettings._iDisplayLength,10)+1;
+var iCurrentPage=parseInt(oSettings._iDisplayStart/oSettings._iDisplayLength,10)+1;
+var sList="";var iStartButton;var iEndButton;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
+}}}for(var i=iStartButton;i<=iEndButton;i++){if(iCurrentPage!=i){sList+='<span class="paginate_button">'+i+"</span>"
+}else{sList+='<span class="paginate_active">'+i+"</span>"}}oSettings.nPaginateList.innerHTML=sList;
+$("span",oSettings.nPaginateList).bind("mousedown",function(){return false});$("span",oSettings.nPaginateList).bind("selectstart",function(){return false
+});$("span",oSettings.nPaginateList).click(function(){var iTarget=(this.innerHTML*1)-1;
+oSettings._iDisplayStart=iTarget*oSettings._iDisplayLength;fnCallbackDraw(oSettings);
+return false})}}};$.fn.dataTableExt.oSort={"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-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-asc":function(a,b){var x=Date.parse(a);
+var y=Date.parse(b);if(isNaN(x)){x=Date.parse("01/01/1970 00:00:00")}if(isNaN(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=Date.parse("01/01/1970 00:00:00")
+}if(isNaN(y)){y=Date.parse("01/01/1970 00:00:00")}return y-x},"numeric-asc":function(a,b){var x=a=="-"?0:a;
+var y=b=="-"?0:b;return x-y},"numeric-desc":function(a,b){var x=a=="-"?0:a;var y=b=="-"?0:b;
+return y-x}};$.fn.dataTableExt.aTypes=[function(sData){var sValidFirstChars="0123456789-";
+var sValidChars="0123456789.";var Char;var bDecimal=false;Char=sData.charAt(0);if(sValidFirstChars.indexOf(Char)==-1){return null
+}for(i=1;i<sData.length;i++){Char=sData.charAt(i);if(sValidChars.indexOf(Char)==-1){return null
+}if(Char=="."){if(bDecimal){return null}bDecimal=true}}return"numeric"},function(sData){if(!isNaN(Date.parse(sData))){return"date"
+}return null}];$.fn.dataTableExt._oExternConfig={iNextUnique:0};$.fn.dataTable=function(oInit){var _aoSettings=$.fn.dataTableSettings;
+function classSettings(){this.fnRecordsTotal=function(){if(this.oFeatures.bServerSide){return this._iRecordsTotal
+}else{return this.aiDisplayMaster.length}};this.fnRecordsDisplay=function(){if(this.oFeatures.bServerSide){return this._iRecordsDisplay
+}else{return this.aiDisplay.length}};this.fnDisplayEnd=function(){if(this.oFeatures.bServerSide){return this._iDisplayStart+this.aiDisplay.length
+}else{return this._iDisplayEnd}};this.sInstance=null;this.oFeatures={bPaginate:true,bLengthChange:true,bFilter:true,bSort:true,bInfo:true,bAutoWidth:true,bProcessing:false,bSortClasses:true,bStateSave:false,bServerSide:false};
+this.oLanguage={sProcessing:"Processing...",sLengthMenu:"Show _MENU_ entries",sZeroRecords:"No matching records found",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"}};
+this.aoData=[];this.aiDisplay=[];this.aiDisplayMaster=[];this.aoColumns=[];this.iNextId=0;
+this.asDataSearch=[];this.oPreviousSearch={sSearch:"",bEscapeRegex:true};this.aoPreSearchCols=[];
+this.nInfo=null;this.nProcessing=null;this.aaSorting=[[0,"asc"]];this.aaSortingFixed=null;
+this.asStripClasses=["odd","even"];this.fnRowCallback=null;this.fnHeaderCallback=null;
+this.fnFooterCallback=null;this.fnDrawCallback=null;this.fnInitComplete=null;this.sTableId="";
+this.nTable=null;this.iDefaultSortIndex=0;this.bInitialised=false;this.aoOpenRows=[];
+this.nPaginate=null;this.nPrevious=null;this.nNext=null;this.sDomPositioning="lfrtip";
+this.sPaginationType="two_button";this.iCookieDuration=60*60*2;this.sAjaxSource=null;
+this.bAjaxDataGet=true;this.fnServerData=$.getJSON;this._iDisplayLength=10;this._iDisplayStart=0;
+this._iDisplayEnd=10;this._iRecordsTotal=0;this._iRecordsDisplay=0}this.oApi={};this.fnDraw=function(){_fnReDraw(_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex]))
+};this.fnFilter=function(sInput,iColumn,bEscapeRegex){var oSettings=_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex]);
+if(typeof bEscapeRegex=="undefined"){bEscapeRegex=true}if(typeof iColumn=="undefined"||iColumn===null){_fnFilterComplete(oSettings,{sSearch:sInput,bEscapeRegex:bEscapeRegex},1)
+}else{oSettings.aoPreSearchCols[iColumn].sSearch=sInput;oSettings.aoPreSearchCols[iColumn].bEscapeRegex=bEscapeRegex;
+_fnFilterComplete(oSettings,oSettings.oPreviousSearch,1)}};this.fnSettings=function(nNode){return _fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex])
+};this.fnSort=function(aaSort){var oSettings=_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex]);
+oSettings.aaSorting=aaSort;_fnSort(oSettings)};this.fnAddData=function(mData,bRedraw){var aiReturn=[];
+var iTest;if(typeof bRedraw=="undefined"){bRedraw=true}var oSettings=_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex]);
+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();
+_fnBuildSearchArray(oSettings,1);if(bRedraw){_fnReDraw(oSettings)}return aiReturn
+};this.fnDeleteRow=function(iAODataIndex,fnCallBack,bNullRow){var oSettings=_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex]);
+var i;for(i=0;i<oSettings.aiDisplayMaster.length;i++){if(oSettings.aiDisplayMaster[i]==iAODataIndex){oSettings.aiDisplayMaster.splice(i,1);
+break}}for(i=0;i<oSettings.aiDisplay.length;i++){if(oSettings.aiDisplay[i]==iAODataIndex){oSettings.aiDisplay.splice(i,1);
+break}}_fnBuildSearchArray(oSettings,1);if(typeof fnCallBack=="function"){fnCallBack.call(this)
+}if(oSettings._iDisplayStart>=oSettings.aiDisplay.length){oSettings._iDisplayStart-=oSettings._iDisplayLength;
+if(oSettings._iDisplayStart<0){oSettings._iDisplayStart=0}}_fnCalculateEnd(oSettings);
+_fnDraw(oSettings);var aData=oSettings.aoData[iAODataIndex]._aData.slice();if(typeof bNullRow!="undefined"&&bNullRow===true){oSettings.aoData[iAODataIndex]=null
+}return aData};this.fnClearTable=function(bRedraw){var oSettings=_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex]);
+_fnClearTable(oSettings);if(typeof bRedraw=="undefined"||bRedraw){_fnDraw(oSettings)
+}};this.fnOpen=function(nTr,sHtml,sClass){var oSettings=_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex]);
+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;$(nNewRow).insertAfter(nTr);if(!oSettings.oFeatures.bServerSide){oSettings.aoOpenRows.push({nTr:nNewRow,nParent:nTr})
+}};this.fnClose=function(nTr){var oSettings=_fnSettingsFromNode(this[$.fn.dataTableExt.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){nTrParent.removeChild(oSettings.aoOpenRows[i].nTr)}oSettings.aoOpenRows.splice(i,1);
+return 0}}return 1};this.fnGetData=function(iRow){var oSettings=_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex]);
+if(typeof iRow!="undefined"){return oSettings.aoData[iRow]._aData}return _fnGetDataMaster(oSettings)
+};this.fnGetNodes=function(iRow){var oSettings=_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex]);
+if(typeof iRow!="undefined"){return oSettings.aoData[iRow].nTr}return _fnGetTrNodes(oSettings)
+};this.fnGetPosition=function(nNode){var oSettings=_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex]);
+var i;if(nNode.nodeName=="TR"){for(i=0;i<oSettings.aoData.length;i++){if(oSettings.aoData[i].nTr==nNode){return i
+}}}else{if(nNode.nodeName=="TD"){for(i=0;i<oSettings.aoData.length;i++){var iCorrector=0;
+for(var j=0;j<oSettings.aoColumns.length;j++){if(oSettings.aoColumns[j].bVisible){if(oSettings.aoData[i].nTr.getElementsByTagName("td")[j-iCorrector]==nNode){return[i,j-iCorrector,j]
+}}else{iCorrector++}}}}}return null};this.fnUpdate=function(mData,iRow,iColumn,bRedraw){var oSettings=_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex]);
+var iVisibleColumn;var sDisplay;if(typeof bRedraw=="undefined"){bRedraw=true}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});
+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{if(mData.length!=oSettings.aoColumns.length){alert("Warning: 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});
+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
+}}}_fnBuildSearchArray(oSettings,1);if(bRedraw){_fnReDraw(oSettings)}return 0};this.fnSetColumnVis=function(iCol,bShow){var oSettings=_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex]);
+var i,iLen;var iColumns=oSettings.aoColumns.length;var nTd;if(oSettings.aoColumns[iCol].bVisible==bShow){return
+}var nTrHead=$("thead tr",oSettings.nTable)[0];var nTrFoot=$("tfoot tr",oSettings.nTable)[0];
+var anTheadTh=[];var anTfootTh=[];for(i=0;i<iColumns;i++){anTheadTh.push(oSettings.aoColumns[i].nTh);
+anTfootTh.push(oSettings.aoColumns[i].nTf)}if(bShow){var iInsert=0;for(i=0;i<iCol;
+i++){if(oSettings.aoColumns[i].bVisible){iInsert++}}if(iInsert>=_fnVisbleColumns(oSettings)){nTrHead.appendChild(anTheadTh[iCol]);
+if(nTrFoot){nTrFoot.appendChild(anTfootTh[iCol])}for(i=0,iLen=oSettings.aoData.length;
+i<iLen;i++){nTd=oSettings.aoData[i]._anHidden[iCol];oSettings.aoData[i].nTr.appendChild(nTd)
+}}else{var iBefore;for(i=iCol;i<iColumns;i++){iBefore=_fnColumnIndexToVisible(oSettings,i);
+if(iBefore!==null){break}}nTrHead.insertBefore(anTheadTh[iCol],nTrHead.getElementsByTagName("th")[iBefore]);
+if(nTrFoot){nTrFoot.insertBefore(anTfootTh[iCol],nTrFoot.getElementsByTagName("th")[iBefore])
+}for(i=0,iLen=oSettings.aoData.length;i<iLen;i++){nTd=oSettings.aoData[i]._anHidden[iCol];
+oSettings.aoData[i].nTr.insertBefore(nTd,oSettings.aoData[i].nTr.getElementsByTagName("td")[iBefore])
+}}oSettings.aoColumns[iCol].bVisible=true}else{nTrHead.removeChild(anTheadTh[iCol]);
+if(nTrFoot){nTrFoot.removeChild(anTfootTh[iCol])}var iVisCol=_fnColumnIndexToVisible(oSettings,iCol);
+for(i=0,iLen=oSettings.aoData.length;i<iLen;i++){nTd=oSettings.aoData[i].nTr.getElementsByTagName("td")[iVisCol];
+oSettings.aoData[i]._anHidden[iCol]=nTd;nTd.parentNode.removeChild(nTd)}oSettings.aoColumns[iCol].bVisible=false
+}};function _fnExternApiFunc(sFunc){return function(){var aArgs=[_fnSettingsFromNode(this[$.fn.dataTableExt.iApiIndex])].concat(Array.prototype.slice.call(arguments));
+return $.fn.dataTableExt.oApi[sFunc].apply(this,aArgs)}}var bApi=false;for(var sFunc in $.fn.dataTableExt.oApi){if(sFunc){this[sFunc]=_fnExternApiFunc(sFunc);
+bApi=true}}function _fnInitalise(oSettings){if(oSettings.bInitialised===false){setTimeout(function(){_fnInitalise(oSettings)
+},200);return}_fnAddOptionsHtml(oSettings);_fnDrawHead(oSettings);if(oSettings.oFeatures.bSort){_fnSort(oSettings,false);
+_fnSortingClasses(oSettings)}else{oSettings.aiDisplay=oSettings.aiDisplayMaster.slice();
+_fnCalculateEnd(oSettings);_fnDraw(oSettings)}if(oSettings.sAjaxSource!==null&&!oSettings.oFeatures.bServerSide){_fnProcessingDisplay(oSettings,true);
+$.getJSON(oSettings.sAjaxSource,null,function(json){for(var i=0;i<json.aaData.length;
+i++){_fnAddData(oSettings,json.aaData[i])}if(oSettings.oFeatures.bSort){_fnSort(oSettings)
+}else{oSettings.aiDisplay=oSettings.aiDisplayMaster.slice();_fnCalculateEnd(oSettings);
+_fnDraw(oSettings)}_fnProcessingDisplay(oSettings,false);if(typeof oSettings.fnInitComplete=="function"){oSettings.fnInitComplete(oSettings,json)
+}});return}if(typeof oSettings.fnInitComplete=="function"){oSettings.fnInitComplete(oSettings)
+}}function _fnLanguageProcess(oSettings,oLanguage,bInit){_fnMap(oSettings.oLanguage,oLanguage,"sProcessing");
+_fnMap(oSettings.oLanguage,oLanguage,"sLengthMenu");_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")}if(bInit){_fnInitalise(oSettings)
+}}function _fnAddColumn(oSettings,oOptions,nTh){oSettings.aoColumns[oSettings.aoColumns.length++]={sType:null,_bAutoType:true,bVisible:true,bSearchable:true,bSortable:true,sTitle:null,sName:"",sWidth:null,sClass:null,fnRender:null,bUseRendered:true,iDataSort:oSettings.aoColumns.length-1,nTh:nTh?nTh:document.createElement("th"),nTf:null};
+var iLength=oSettings.aoColumns.length-1;if(typeof oOptions!="undefined"&&oOptions!==null){var oCol=oSettings.aoColumns[iLength];
+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,"sClass");_fnMap(oCol,oOptions,"fnRender");_fnMap(oCol,oOptions,"bUseRendered");
+_fnMap(oCol,oOptions,"iDataSort")}if(typeof oSettings.aoPreSearchCols[iLength]=="undefined"){oSettings.aoPreSearchCols[iLength]={sSearch:"",bEscapeRegex:true}
+}}function _fnAddData(oSettings,aData){if(aData.length!=oSettings.aoColumns.length){return -1
+}var iThisIndex=oSettings.aoData.length;oSettings.aoData.push({_iId:oSettings.iNextId++,_aData:aData.slice(),nTr:document.createElement("tr"),_anHidden:[]});
+var nTd;for(var i=0;i<aData.length;i++){nTd=document.createElement("td");if(typeof oSettings.aoColumns[i].fnRender=="function"){var sRendered=oSettings.aoColumns[i].fnRender({iDataRow:iThisIndex,iDataColumn:i,aData:aData});
+nTd.innerHTML=sRendered;if(oSettings.aoColumns[i].bUseRendered){oSettings.aoData[iThisIndex]._aData[i]=sRendered
+}}else{nTd.innerHTML=aData[i]}if(oSettings.aoColumns[i].sClass!==null){nTd.className=oSettings.aoColumns[i].sClass
+}if(oSettings.aoColumns[i]._bAutoType&&oSettings.aoColumns[i].sType!="string"){if(oSettings.aoColumns[i].sType===null){oSettings.aoColumns[i].sType=_fnDetectType(aData[i])
+}else{if(oSettings.aoColumns[i].sType=="date"||oSettings.aoColumns[i].sType=="numeric"){oSettings.aoColumns[i].sType=_fnDetectType(aData[i])
+}}}if(oSettings.aoColumns[i].bVisible){oSettings.aoData[iThisIndex].nTr.appendChild(nTd)
+}else{oSettings.aoData[iThisIndex]._anHidden[i]=nTd}}oSettings.aiDisplayMaster.push(iThisIndex);
+return iThisIndex}function _fnGatherData(oSettings){var nDataNodes;var iDataLength=$("tbody:eq(0)>tr").length;
+var iLoop;var i,j;if(oSettings.sAjaxSource===null){$("tbody:eq(0)>tr",oSettings.nTable).each(function(){var iThisIndex=oSettings.aoData.length;
+oSettings.aoData.push({_iId:oSettings.iNextId++,_aData:[],nTr:this,_anHidden:[]});
+oSettings.aiDisplayMaster.push(iThisIndex);var aLocalData=oSettings.aoData[iThisIndex]._aData;
+$("td",this).each(function(i){aLocalData[i]=this.innerHTML})})}var iCorrector=0;for(i=0;
+i<oSettings.aoColumns.length;i++){if(oSettings.aoColumns[i].sTitle===null){oSettings.aoColumns[i].sTitle=oSettings.aoColumns[i].nTh.innerHTML
+}var bAutoType=oSettings.aoColumns[i]._bAutoType;var bRender=typeof oSettings.aoColumns[i].fnRender=="function";
+var bClass=oSettings.aoColumns[i].sClass!==null;var bVisible=oSettings.aoColumns[i].bVisible;
+if(bAutoType||bRender||bClass||!bVisible){iLoop=oSettings.aoData.length;for(j=0;j<iLoop;
+j++){var nCellNode=oSettings.aoData[j].nTr.getElementsByTagName("td")[i-iCorrector];
+if(bAutoType){if(oSettings.aoColumns[i].sType===null){oSettings.aoColumns[i].sType=_fnDetectType(oSettings.aoData[j]._aData[i])
+}else{if(oSettings.aoColumns[i].sType=="date"||oSettings.aoColumns[i].sType=="numeric"){oSettings.aoColumns[i].sType=_fnDetectType(oSettings.aoData[j]._aData[i])
+}}}if(bRender){var sRendered=oSettings.aoColumns[i].fnRender({iDataRow:j,iDataColumn:i,aData:oSettings.aoData[j]._aData});
+nCellNode.innerHTML=sRendered;if(oSettings.aoColumns[i].bUseRendered){oSettings.aoData[j]._aData[i]=sRendered
+}}if(bClass){nCellNode.className+=" "+oSettings.aoColumns[i].sClass}if(!bVisible){oSettings.aoData[j]._anHidden[i]=nCellNode;
+nCellNode.parentNode.removeChild(nCellNode)}}if(!bVisible){iCorrector++}}}}function _fnDrawHead(oSettings){var i,nTh;
+var iThs=oSettings.nTable.getElementsByTagName("thead")[0].getElementsByTagName("th").length;
+var iCorrector=0;if(iThs!==0){for(i=0;i<oSettings.aoColumns.length;i++){nTh=oSettings.aoColumns[i].nTh;
+if(oSettings.aoColumns[i].bVisible){if(oSettings.aoColumns[i].sWidth!==null){nTh.style.width=oSettings.aoColumns[i].sWidth
+}if(oSettings.aoColumns[i].sTitle!=nTh.innerHTML){nTh.innerHTML=oSettings.aoColumns[i].sTitle
+}}else{nTh.parentNode.removeChild(nTh);iCorrector++}}}else{var nTr=document.createElement("tr");
+for(i=0;i<oSettings.aoColumns.length;i++){if(oSettings.aoColumns[i].bVisible){nTh=oSettings.aoColumns[i].nTh;
+if(oSettings.aoColumns[i].sClass!==null){nTh.className=oSettings.aoColumns[i].sClass
+}if(oSettings.aoColumns[i].sWidth!==null){nTh.style.width=oSettings.aoColumns[i].sWidth
+}nTh.innerHTML=oSettings.aoColumns[i].sTitle;nTr.appendChild(nTh)}}$("thead",oSettings.nTable).html("")[0].appendChild(nTr)
+}if(oSettings.oFeatures.bSort){for(i=0;i<oSettings.aoColumns.length;i++){$(oSettings.aoColumns[i].nTh).click(function(e){var iDataIndex;
+for(var i=0;i<oSettings.aoColumns.length;i++){if(oSettings.aoColumns[i].nTh==this){iDataIndex=i;
+break}}if(oSettings.aoColumns[iDataIndex].bSortable===false){return}fnInnerSorting=function(){if(e.shiftKey){var bFound=false;
+for(var i=0;i<oSettings.aaSorting.length;i++){if(oSettings.aaSorting[i][0]==iDataIndex){if(oSettings.aaSorting[i][1]=="asc"){oSettings.aaSorting[i][1]="desc"
+}else{oSettings.aaSorting.splice(i,1)}bFound=true;break}}if(bFound===false){oSettings.aaSorting.push([iDataIndex,"asc"])
+}}else{if(oSettings.aaSorting.length==1&&oSettings.aaSorting[0][0]==iDataIndex){oSettings.aaSorting[0][1]=oSettings.aaSorting[0][1]=="asc"?"desc":"asc"
+}else{oSettings.aaSorting.splice(0,oSettings.aaSorting.length);oSettings.aaSorting.push([iDataIndex,"asc"])
+}}_fnSort(oSettings)};if(!oSettings.oFeatures.bProcessing){fnInnerSorting()}else{_fnProcessingDisplay(oSettings,true);
+setTimeout(function(){fnInnerSorting();_fnProcessingDisplay(oSettings,false)},0)}})
+}$("thead th",oSettings.nTable).mousedown(function(){this.onselectstart=function(){return false
+};return false})}if(oSettings.oFeatures.bAutoWidth){oSettings.nTable.style.width=oSettings.nTable.offsetWidth+"px"
+}var nTfoot=oSettings.nTable.getElementsByTagName("tfoot");if(nTfoot.length!==0){nTfs=nTfoot[0].getElementsByTagName("th");
+for(i=0,iLen=nTfs.length;i<iLen;i++){oSettings.aoColumns[i].nTf=nTfs[i]}}}function _fnDraw(oSettings){var i;
+var anRows=[];var iRowCount=0;var iStrips=oSettings.asStripClasses.length;var iOpenRows=oSettings.aoOpenRows.length;
+if(oSettings.oFeatures.bServerSide&&!_fnAjaxUpdate(oSettings)){return}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 nRow=oSettings.aoData[oSettings.aiDisplay[j]].nTr;
+$(nRow).removeClass(oSettings.asStripClasses.join(" "));$(nRow).addClass(oSettings.asStripClasses[iRowCount%iStrips]);
+if(typeof oSettings.fnRowCallback=="function"){nRow=oSettings.fnRowCallback(nRow,oSettings.aoData[oSettings.aiDisplay[j]]._aData,iRowCount,j)
+}anRows.push(nRow);iRowCount++;if(iOpenRows!==0){for(var k=0;k<iOpenRows;k++){if(nRow==oSettings.aoOpenRows[k].nParent){anRows.push(oSettings.aoOpenRows[k].nTr)
+}}}}}else{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=oSettings.aoColumns.length;
+nTd.className="dataTables_empty";nTd.innerHTML=oSettings.oLanguage.sZeroRecords;anRows[iRowCount].appendChild(nTd)
+}if(typeof oSettings.fnHeaderCallback=="function"){oSettings.fnHeaderCallback($("thead tr",oSettings.nTable)[0],_fnGetDataMaster(oSettings),oSettings._iDisplayStart,oSettings._iDisplayEnd,oSettings.aiDisplay)
+}if(typeof oSettings.fnFooterCallback=="function"){oSettings.fnFooterCallback($("tfoot tr",oSettings.nTable)[0],_fnGetDataMaster(oSettings),oSettings._iDisplayStart,oSettings._iDisplayEnd,oSettings.aiDisplay)
+}var nTrs=$("tbody:eq(0)>tr",oSettings.nTable);for(i=0;i<nTrs.length;i++){nTrs[i].parentNode.removeChild(nTrs[i])
+}var nBody=$("tbody:eq(0)",oSettings.nTable);for(i=0;i<anRows.length;i++){nBody[0].appendChild(anRows[i])
+}if(oSettings.oFeatures.bPaginate){$.fn.dataTableExt.oPagination[oSettings.sPaginationType].fnUpdate(oSettings,function(oSettings){_fnCalculateEnd(oSettings);
+_fnDraw(oSettings)})}if(oSettings.oFeatures.bInfo){if(oSettings.fnRecordsDisplay()===0&&oSettings.fnRecordsDisplay()==oSettings.fnRecordsTotal()){oSettings.nInfo.innerHTML=oSettings.oLanguage.sInfoEmpty+oSettings.oLanguage.sInfoPostFix
+}else{if(oSettings.fnRecordsDisplay()===0){oSettings.nInfo.innerHTML=oSettings.oLanguage.sInfoEmpty+" "+oSettings.oLanguage.sInfoFiltered.replace("_MAX_",oSettings.fnRecordsTotal())+oSettings.oLanguage.sInfoPostFix
+}else{if(oSettings.fnRecordsDisplay()==oSettings.fnRecordsTotal()){oSettings.nInfo.innerHTML=oSettings.oLanguage.sInfo.replace("_START_",oSettings._iDisplayStart+1).replace("_END_",oSettings.fnDisplayEnd()).replace("_TOTAL_",oSettings.fnRecordsDisplay())+oSettings.oLanguage.sInfoPostFix
+}else{oSettings.nInfo.innerHTML=oSettings.oLanguage.sInfo.replace("_START_",oSettings._iDisplayStart+1).replace("_END_",oSettings.fnDisplayEnd()).replace("_TOTAL_",oSettings.fnRecordsDisplay())+" "+oSettings.oLanguage.sInfoFiltered.replace("_MAX_",oSettings.fnRecordsTotal())+oSettings.oLanguage.sInfoPostFix
+}}}}if(oSettings.oFeatures.bServerSide&&oSettings.oFeatures.bSort){_fnSortingClasses(oSettings)
+}_fnSaveState(oSettings);if(typeof oSettings.fnDrawCallback=="function"){oSettings.fnDrawCallback(oSettings)
+}}function _fnReDraw(oSettings){if(oSettings.oFeatures.bSort){_fnSort(oSettings,oSettings.oPreviousSearch)
+}else{if(oSettings.oFeatures.bFilter){_fnFilterComplete(oSettings,oSettings.oPreviousSearch)
+}else{_fnCalculateEnd(oSettings);_fnDraw(oSettings)}}}function _fnAjaxUpdate(oSettings){if(oSettings.bAjaxDataGet){_fnProcessingDisplay(oSettings,true);
+var iColumns=oSettings.aoColumns.length;var aoData=[];var i;aoData.push({name:"iColumns",value:iColumns});
+aoData.push({name:"sColumns",value:_fnColumnOrdering(oSettings)});aoData.push({name:"iDisplayLength",value:oSettings._iDisplayLength});
+aoData.push({name:"iDisplayStart",value:oSettings._iDisplayStart});aoData.push({name:"sSearch",value:oSettings.oPreviousSearch.sSearch});
+aoData.push({name:"bEscapeRegex",value:oSettings.oPreviousSearch.bEscapeRegex});for(i=0;
+i<iColumns;i++){aoData.push({name:"sSearch_"+i,value:oSettings.aoPreSearchCols[i].sSearch});
+aoData.push({name:"bEscapeRegex_"+i,value:oSettings.aoPreSearchCols[i].bEscapeRegex})
+}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:"iSortDir_"+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:"iSortDir_"+(i+iFixed),value:oSettings.aaSorting[i][1]})
+}oSettings.fnServerData(oSettings.sAjaxSource,aoData,function(json){_fnAjaxUpdateDraw(oSettings,json)
+});return false}else{return true}}function _fnAjaxUpdateDraw(oSettings,json){_fnClearTable(oSettings);
+oSettings._iRecordsTotal=json.iTotalRecords;oSettings._iRecordsDisplay=json.iTotalDisplayRecords;
+var sOrdering=_fnColumnOrdering(oSettings);bReOrder=(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){var aData=[];for(var j=0,jLen=oSettings.aoColumns.length;
+j<jLen;j++){aData.push(json.aaData[i][aiIndex[j]])}_fnAddData(oSettings,aData)}else{_fnAddData(oSettings,json.aaData[i])
+}}oSettings.aiDisplay=oSettings.aiDisplayMaster.slice();oSettings.bAjaxDataGet=false;
+_fnDraw(oSettings);oSettings.bAjaxDataGet=true;_fnProcessingDisplay(oSettings,false)
+}function _fnAddOptionsHtml(oSettings){var nHolding=document.createElement("div");
+oSettings.nTable.parentNode.insertBefore(nHolding,oSettings.nTable);var nWrapper=document.createElement("div");
+nWrapper.className="dataTables_wrapper";if(oSettings.sTableId!==""){nWrapper.setAttribute("id",oSettings.sTableId+"_wrapper")
+}var nInsertNode=nWrapper;var sDom=oSettings.sDomPositioning.split("");for(var i=0;
+i<sDom.length;i++){var cOption=sDom[i];if(cOption=="<"){var nNewNode=document.createElement("div");
+var cNext=sDom[i+1];if(cNext=="'"||cNext=='"'){var sClass="";var j=2;while(sDom[i+j]!=cNext){sClass+=sDom[i+j];
+j++}nNewNode.className=sClass;i+=j}nInsertNode.appendChild(nNewNode);nInsertNode=nNewNode
+}else{if(cOption==">"){nInsertNode=nInsertNode.parentNode}else{if(cOption=="l"&&oSettings.oFeatures.bPaginate&&oSettings.oFeatures.bLengthChange){nInsertNode.appendChild(_fnFeatureHtmlLength(oSettings))
+}else{if(cOption=="f"&&oSettings.oFeatures.bFilter){nInsertNode.appendChild(_fnFeatureHtmlFilter(oSettings))
+}else{if(cOption=="r"&&oSettings.oFeatures.bProcessing){nInsertNode.appendChild(_fnFeatureHtmlProcessing(oSettings))
+}else{if(cOption=="t"){nInsertNode.appendChild(oSettings.nTable)}else{if(cOption=="i"&&oSettings.oFeatures.bInfo){nInsertNode.appendChild(_fnFeatureHtmlInfo(oSettings))
+}else{if(cOption=="p"&&oSettings.oFeatures.bPaginate){nInsertNode.appendChild(_fnFeatureHtmlPaginate(oSettings))
+}}}}}}}}}nHolding.parentNode.replaceChild(nWrapper,nHolding)}function _fnFeatureHtmlFilter(oSettings){var nFilter=document.createElement("div");
+if(oSettings.sTableId!==""){nFilter.setAttribute("id",oSettings.sTableId+"_filter")
+}nFilter.className="dataTables_filter";nFilter.innerHTML=oSettings.oLanguage.sSearch+' <input type="text" value="'+oSettings.oPreviousSearch.sSearch.replace('"',"&quot;")+'" />';
+$("input",nFilter).keyup(function(e){_fnFilterComplete(oSettings,{sSearch:this.value,bEscapeRegex:oSettings.oPreviousSearch.bEscapeRegex})
+});return nFilter}function _fnFeatureHtmlInfo(oSettings){var nInfo=document.createElement("div");
+oSettings.nInfo=nInfo;if(oSettings.sTableId!==""){oSettings.nInfo.setAttribute("id",oSettings.sTableId+"_info")
+}oSettings.nInfo.className="dataTables_info";return nInfo}function _fnFeatureHtmlPaginate(oSettings){var nPaginate=document.createElement("div");
+nPaginate.className="dataTables_paginate paging_"+oSettings.sPaginationType;oSettings.nPaginate=nPaginate;
+$.fn.dataTableExt.oPagination[oSettings.sPaginationType].fnInit(oSettings,function(oSettings){_fnCalculateEnd(oSettings);
+_fnDraw(oSettings)});return nPaginate}function _fnFeatureHtmlLength(oSettings){var sName=(oSettings.sTableId==="")?"":'name="'+oSettings.sTableId+'_length"';
+var sStdMenu='<select size="1" '+sName+'><option value="10">10</option><option value="25">25</option><option value="50">50</option><option value="100">100</option></select>';
+var nLength=document.createElement("div");if(oSettings.sTableId!==""){nLength.setAttribute("id",oSettings.sTableId+"_length")
+}nLength.className="dataTables_length";nLength.innerHTML=oSettings.oLanguage.sLengthMenu.replace("_MENU_",sStdMenu);
+$('select option[value="'+oSettings._iDisplayLength+'"]',nLength).attr("selected",true);
+$("select",nLength).change(function(e){oSettings._iDisplayLength=parseInt($(this).val(),10);
+_fnCalculateEnd(oSettings);if(oSettings._iDisplayEnd==oSettings.aiDisplay.length){oSettings._iDisplayStart=oSettings._iDisplayEnd-oSettings._iDisplayLength;
+if(oSettings._iDisplayStart<0){oSettings._iDisplayStart=0}}if(oSettings._iDisplayLength==-1){oSettings._iDisplayStart=0
+}_fnDraw(oSettings)});return nLength}function _fnFeatureHtmlProcessing(oSettings){var nProcessing=document.createElement("div");
+oSettings.nProcessing=nProcessing;if(oSettings.sTableId!==""){oSettings.nProcessing.setAttribute("id",oSettings.sTableId+"_processing")
+}oSettings.nProcessing.innerHTML=oSettings.oLanguage.sProcessing;oSettings.nProcessing.className="dataTables_processing";
+oSettings.nProcessing.style.visibility="hidden";oSettings.nTable.parentNode.insertBefore(oSettings.nProcessing,oSettings.nTable);
+return nProcessing}function _fnProcessingDisplay(oSettings,bShow){if(oSettings.oFeatures.bProcessing){oSettings.nProcessing.style.visibility=bShow?"visible":"hidden"
+}}function _fnFilterComplete(oSettings,oInput,iForce){_fnFilter(oSettings,oInput.sSearch,iForce,oInput.bEscapeRegex);
+for(var i=0;i<oSettings.aoPreSearchCols.length;i++){_fnFilterColumn(oSettings,oSettings.aoPreSearchCols[i].sSearch,i,oSettings.aoPreSearchCols[i].bEscapeRegex)
+}if($.fn.dataTableExt.afnFiltering.length!==0){_fnFilterCustom(oSettings)}if(typeof oSettings.iInitDisplayStart!="undefined"&&oSettings.iInitDisplayStart!=-1){oSettings._iDisplayStart=oSettings.iInitDisplayStart;
+oSettings.iInitDisplayStart=-1}else{oSettings._iDisplayStart=0}_fnCalculateEnd(oSettings);
+_fnDraw(oSettings);_fnBuildSearchArray(oSettings,0)}function _fnFilterCustom(oSettings){var afnFilters=$.fn.dataTableExt.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 aData=[];var iDisIndex=oSettings.aiDisplay[j-iCorrector];if(!afnFilters[i](oSettings,oSettings.aoData[iDisIndex]._aData,iDisIndex)){oSettings.aiDisplay.splice(j-iCorrector,1);
+iCorrector++}}}}function _fnFilterColumn(oSettings,sInput,iColumn,bEscapeRegex){if(sInput===""){return
+}var iIndexCorrector=0;var sRegexMatch=bEscapeRegex?_fnEscapeRegex(sInput):sInput;
+var rpSearch=new RegExp(sRegexMatch,"i");for(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(oSettings,sInput,iForce,bEscapeRegex){var flag,i,j;
+if(typeof iForce=="undefined"||iForce===null){iForce=0}if($.fn.dataTableExt.afnFiltering.length!==0){iForce=1
+}if(typeof bRedraw=="undefined"||bRedraw===null){bRedraw=true}var asSearch=bEscapeRegex?_fnEscapeRegex(sInput).split(" "):sInput.split(" ");
+var sRegExpString="^(?=.*?"+asSearch.join(")(?=.*?")+").*$";var rpSearch=new RegExp(sRegExpString,"i");
+if(sInput.length<=0){oSettings.aiDisplay.splice(0,oSettings.aiDisplay.length);oSettings.aiDisplay=oSettings.aiDisplayMaster.slice()
+}else{if(oSettings.aiDisplay.length==oSettings.aiDisplayMaster.length||oSettings.oPreviousSearch.sSearch.length>sInput.length||iForce==1||sInput.indexOf(oSettings.oPreviousSearch.sSearch)!==0){oSettings.aiDisplay.splice(0,oSettings.aiDisplay.length);
+_fnBuildSearchArray(oSettings,1);for(i=0;i<oSettings.aiDisplayMaster.length;i++){if(rpSearch.test(oSettings.asDataSearch[i])){oSettings.aiDisplay.push(oSettings.aiDisplayMaster[i])
+}}}else{var iIndexCorrector=0;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.bEscapeRegex=bEscapeRegex
+}function _fnSort(oSettings,bApplyClasses){var aaSort=[];var oSort=$.fn.dataTableExt.oSort;
+var aoData=oSettings.aoData;var iDataSort;var iDataType;var i;if(oSettings.aaSorting.length!==0||oSettings.aaSortingFixed!==null){if(oSettings.aaSortingFixed!==null){aaSort=oSettings.aaSortingFixed.concat(oSettings.aaSorting)
+}else{aaSort=oSettings.aaSorting.slice()}if(!window.runtime){var sDynamicSort="var fnLocalSorting = function(a,b){var iTest;";
+for(i=0;i<aaSort.length-1;i++){iDataSort=oSettings.aoColumns[aaSort[i][0]].iDataSort;
+iDataType=oSettings.aoColumns[iDataSort].sType;sDynamicSort+="iTest = oSort['"+iDataType+"-"+aaSort[i][1]+"']( aoData[a]._aData["+iDataSort+"], aoData[b]._aData["+iDataSort+"] ); if ( iTest === 0 )"
+}iDataSort=oSettings.aoColumns[aaSort[aaSort.length-1][0]].iDataSort;iDataType=oSettings.aoColumns[iDataSort].sType;
+sDynamicSort+="iTest = oSort['"+iDataType+"-"+aaSort[aaSort.length-1][1]+"']( aoData[a]._aData["+iDataSort+"], aoData[b]._aData["+iDataSort+"] ); return iTest;}";
+eval(sDynamicSort);oSettings.aiDisplayMaster.sort(fnLocalSorting)}else{var aAirSort=[];
+var iLen=aaSort.length;for(i=0;i<iLen;i++){iDataSort=oSettings.aoColumns[aaSort[i][0]].iDataSort;
+aAirSort.push([iDataSort,oSettings.aoColumns[iDataSort].sType+"-"+aaSort[i][1]])}oSettings.aiDisplayMaster.sort(function(a,b){var iTest;
+for(var i=0;i<iLen;i++){iTest=oSort[aAirSort[i][1]](aoData[a]._aData[aAirSort[i][0]],aoData[b]._aData[aAirSort[i][0]]);
+if(iTest!==0){return iTest}}return 0})}}if(typeof bApplyClasses=="undefined"||bApplyClasses){_fnSortingClasses(oSettings)
+}if(oSettings.oFeatures.bFilter){_fnFilterComplete(oSettings,oSettings.oPreviousSearch,1)
+}else{oSettings.aiDisplay=oSettings.aiDisplayMaster.slice();oSettings._iDisplayStart=0;
+_fnCalculateEnd(oSettings);_fnDraw(oSettings)}}function _fnSortingClasses(oSettings){var i;
+var aaSort;var iColumns=oSettings.aoColumns.length;for(i=0;i<iColumns;i++){$(oSettings.aoColumns[i].nTh).removeClass("sorting_asc sorting_desc sorting")
+}if(oSettings.aaSortingFixed!==null){aaSort=oSettings.aaSortingFixed.concat(oSettings.aaSorting)
+}else{aaSort=oSettings.aaSorting.slice()}for(i=0;i<oSettings.aoColumns.length;i++){if(oSettings.aoColumns[i].bSortable&&oSettings.aoColumns[i].bVisible){var sClass="sorting";
+for(var j=0;j<aaSort.length;j++){if(aaSort[j][0]==i){sClass=(aaSort[j][1]=="asc")?"sorting_asc":"sorting_desc";
+break}}$(oSettings.aoColumns[i].nTh).addClass(sClass)}}if(oSettings.oFeatures.bSortClasses){var nTrs=_fnGetTrNodes(oSettings);
+$("td",nTrs).removeClass("sorting_1 sorting_2 sorting_3");var iClass=1;for(i=0;i<aaSort.length;
+i++){var iVis=_fnColumnIndexToVisible(oSettings,aaSort[i][0]);if(iVis!==null){if(iClass<=2){$("td:eq("+iVis+")",nTrs).addClass("sorting_"+iClass)
+}else{$("td:eq("+iVis+")",nTrs).addClass("sorting_3")}iClass++}}}}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(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 _fnVisbleColumns(oS){var iVis=0;for(var i=0;i<oS.aoColumns.length;i++){if(oS.aoColumns[i].bVisible===true){iVis++
+}}return iVis}function _fnBuildSearchArray(oSettings,iMaster){oSettings.asDataSearch.splice(0,oSettings.asDataSearch.length);
+var aArray=(typeof iMaster!="undefined"&&iMaster==1)?oSettings.aiDisplayMaster:oSettings.aiDisplay;
+for(i=0;i<aArray.length;i++){oSettings.asDataSearch[i]="";for(j=0;j<oSettings.aoColumns.length;
+j++){if(oSettings.aoColumns[j].bSearchable){var sData=oSettings.aoData[aArray[i]]._aData[j];
+oSettings.asDataSearch[i]+=_fnDataToSearch(sData,oSettings.aoColumns[j].sType)+" "
+}}}}function _fnDataToSearch(sData,sType){if(sType=="html"){return sData.replace(/\n/g," ").replace(/<.*?>/g,"")
+}else{if(typeof sData=="string"){return sData.replace(/\n/g," ")}}return sData}function _fnCalculateEnd(oSettings){if(oSettings.oFeatures.bPaginate===false){oSettings._iDisplayEnd=oSettings.aiDisplay.length
+}else{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(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(oSettings){var iTableWidth=oSettings.nTable.offsetWidth;
+var iTotalUserIpSize=0;var iTmpWidth;var iVisibleColumns=0;var iColums=oSettings.aoColumns.length;
+var i;var oHeaders=$("thead th",oSettings.nTable);for(i=0;i<iColums;i++){if(oSettings.aoColumns[i].bVisible){iVisibleColumns++;
+if(oSettings.aoColumns[i].sWidth!==null){iTmpWidth=_fnConvertToWidth(oSettings.aoColumns[i].sWidth,oSettings.nTable.parentNode);
+iTotalUserIpSize+=iTmpWidth;oSettings.aoColumns[i].sWidth=iTmpWidth+"px"}}}if(iColums==oHeaders.length&&iTotalUserIpSize===0&&iVisibleColumns==iColums){for(i=0;
+i<oSettings.aoColumns.length;i++){oSettings.aoColumns[i].sWidth=oHeaders[i].offsetWidth+"px"
+}}else{var nCalcTmp=oSettings.nTable.cloneNode(false);nCalcTmp.setAttribute("id","");
+var sTableTmp='<table class="'+nCalcTmp.className+'">';var sCalcHead="<tr>";var sCalcHtml="<tr>";
+for(i=0;i<iColums;i++){if(oSettings.aoColumns[i].bVisible){sCalcHead+="<th>"+oSettings.aoColumns[i].sTitle+"</th>";
+if(oSettings.aoColumns[i].sWidth!==null){var sWidth="";if(oSettings.aoColumns[i].sWidth!==null){sWidth=' style="width:'+oSettings.aoColumns[i].sWidth+';"'
+}sCalcHtml+="<td"+sWidth+' tag_index="'+i+'">'+fnGetMaxLenString(oSettings,i)+"</td>"
+}else{sCalcHtml+='<td tag_index="'+i+'">'+fnGetMaxLenString(oSettings,i)+"</td>"}}}sCalcHead+="</tr>";
+sCalcHtml+="</tr>";nCalcTmp=$(sTableTmp+sCalcHead+sCalcHtml+"</table>")[0];nCalcTmp.style.width=iTableWidth+"px";
+nCalcTmp.style.visibility="hidden";nCalcTmp.style.position="absolute";oSettings.nTable.parentNode.appendChild(nCalcTmp);
+var oNodes=$("td",nCalcTmp);var iIndex;for(i=0;i<oNodes.length;i++){iIndex=oNodes[i].getAttribute("tag_index");
+oSettings.aoColumns[iIndex].sWidth=$("td",nCalcTmp)[i].offsetWidth+"px"}oSettings.nTable.parentNode.removeChild(nCalcTmp)
+}}function fnGetMaxLenString(oSettings,iCol){var iMax=0;var iMaxIndex=-1;for(var i=0;
+i<oSettings.aoData.length;i++){if(oSettings.aoData[i]._aData[iCol].length>iMax){iMax=oSettings.aoData[i]._aData[iCol].length;
+iMaxIndex=i}}if(iMaxIndex>=0){return oSettings.aoData[iMaxIndex]._aData[iCol]}return""
+}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(sData){var aTypes=$.fn.dataTableExt.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(nTable){for(var i=0;i<_aoSettings.length;
+i++){if(_aoSettings[i].nTable==nTable){return _aoSettings[i]}}return null}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(oSettings){var aNodes=[];var iLen=oSettings.aoData.length;
+for(var i=0;i<iLen;i++){aNodes.push(oSettings.aoData[i].nTr)}return aNodes}function _fnEscapeRegex(sVal){var acEscape=["/",".","*","+","?","|","(",")","[","]","{","}","\\","$","^"];
+var reReplace=new RegExp("(\\"+acEscape.join("|\\")+")","g");return sVal.replace(reReplace,"\\$1")
+}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(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 _fnClearTable(oSettings){oSettings.aoData.length=0;
+oSettings.aiDisplayMaster.length=0;oSettings.aiDisplay.length=0;_fnCalculateEnd(oSettings)
+}function _fnSaveState(oSettings){if(!oSettings.oFeatures.bStateSave){return}var i;
+var sValue="{";sValue+='"iStart": '+oSettings._iDisplayStart+",";sValue+='"iEnd": '+oSettings._iDisplayEnd+",";
+sValue+='"iLength": '+oSettings._iDisplayLength+",";sValue+='"sFilter": "'+oSettings.oPreviousSearch.sSearch.replace('"','\\"')+'",';
+sValue+='"sFilterEsc": '+oSettings.oPreviousSearch.bEscapeRegex+",";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+="['"+oSettings.aoPreSearchCols[i].sSearch.replace("'","'")+"',"+oSettings.aoPreSearchCols[i].bEscapeRegex+"],"
+}sValue=sValue.substring(0,sValue.length-1);sValue+="]";sValue+="}";_fnCreateCookie("SpryMedia_DataTables_"+oSettings.sInstance,sValue,oSettings.iCookieDuration)
+}function _fnLoadState(oSettings){if(!oSettings.oFeatures.bStateSave){return}var sData=_fnReadCookie("SpryMedia_DataTables_"+oSettings.sInstance);
+if(sData!==null&&sData!==""){try{if(typeof JSON=="object"&&typeof JSON.parse=="function"){oData=JSON.parse(sData.replace(/'/g,'"'))
+}else{oData=eval("("+sData+")")}}catch(e){return}oSettings._iDisplayStart=oData.iStart;
+oSettings.iInitDisplayStart=oData.iStart;oSettings._iDisplayEnd=oData.iEnd;oSettings._iDisplayLength=oData.iLength;
+oSettings.oPreviousSearch.sSearch=oData.sFilter;oSettings.aaSorting=oData.aaSorting.slice();
+if(typeof oData.sFilterEsc!="undefined"){oSettings.oPreviousSearch.bEscapeRegex=oData.sFilterEsc
+}if(typeof oData.aaSearchCols!="undefined"){for(var i=0;i<oData.aaSearchCols.length;
+i++){oSettings.aoPreSearchCols[i]={sSearch:oData.aaSearchCols[i][0],bEscapeRegex:oData.aaSearchCols[i][1]}
+}}}}function _fnCreateCookie(sName,sValue,iSecs){var date=new Date();date.setTime(date.getTime()+(iSecs*1000));
+sName+="_"+window.location.pathname.replace(/[\/:]/g,"").toLowerCase();document.cookie=sName+"="+sValue+"; expires="+date.toGMTString()+"; path=/"
+}function _fnReadCookie(sName){var sNameEQ=sName+"_"+window.location.pathname.replace(/[\/:]/g,"").toLowerCase()+"=";
+var 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 c.substring(sNameEQ.length,c.length)
+}}return null}function _fnGetUniqueThs(nThead){var nTrs=nThead.getElementsByTagName("tr");
+if(nTrs.length==1){return nTrs[0].getElementsByTagName("th")}var aLayout=[],aReturn=[];
+var ROWSPAN=2,COLSPAN=3;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]=[]
+}};for(i=0,iLen=nTrs.length;i<iLen;i++){fnAddRow(i);var iColumn=0;var nTds=nTrs[i].getElementsByTagName("th");
+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];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}}}for(i=0,iLen=aLayout[0].length;
+i<iLen;i++){for(j=0,jLen=aLayout.length;j<jLen;j++){if(typeof aLayout[j][i]=="object"){aReturn.push(aLayout[j][i])
+}}}return aReturn}function _fnMap(oRet,oSrc,sName,sMappedName){if(typeof sMappedName=="undefined"){sMappedName=sName
+}if(typeof oSrc[sName]!="undefined"){oRet[sMappedName]=oSrc[sName]}}if(bApi){this.oApi._fnInitalise=_fnInitalise;
+this.oApi._fnLanguageProcess=_fnLanguageProcess;this.oApi._fnAddColumn=_fnAddColumn;
+this.oApi._fnAddData=_fnAddData;this.oApi._fnGatherData=_fnGatherData;this.oApi._fnDrawHead=_fnDrawHead;
+this.oApi._fnDraw=_fnDraw;this.oApi._fnAjaxUpdate=_fnAjaxUpdate;this.oApi._fnAddOptionsHtml=_fnAddOptionsHtml;
+this.oApi._fnFeatureHtmlFilter=_fnFeatureHtmlFilter;this.oApi._fnFeatureHtmlInfo=_fnFeatureHtmlInfo;
+this.oApi._fnFeatureHtmlPaginate=_fnFeatureHtmlPaginate;this.oApi._fnFeatureHtmlLength=_fnFeatureHtmlLength;
+this.oApi._fnFeatureHtmlProcessing=_fnFeatureHtmlProcessing;this.oApi._fnProcessingDisplay=_fnProcessingDisplay;
+this.oApi._fnFilterComplete=_fnFilterComplete;this.oApi._fnFilterColumn=_fnFilterColumn;
+this.oApi._fnFilter=_fnFilter;this.oApi._fnSortingClasses=_fnSortingClasses;this.oApi._fnVisibleToColumnIndex=_fnVisibleToColumnIndex;
+this.oApi._fnColumnIndexToVisible=_fnColumnIndexToVisible;this.oApi._fnVisbleColumns=_fnVisbleColumns;
+this.oApi._fnBuildSearchArray=_fnBuildSearchArray;this.oApi._fnDataToSearch=_fnDataToSearch;
+this.oApi._fnCalculateEnd=_fnCalculateEnd;this.oApi._fnConvertToWidth=_fnConvertToWidth;
+this.oApi._fnCalculateColumnWidths=_fnCalculateColumnWidths;this.oApi._fnArrayCmp=_fnArrayCmp;
+this.oApi._fnDetectType=_fnDetectType;this.oApi._fnGetDataMaster=_fnGetDataMaster;
+this.oApi._fnGetTrNodes=_fnGetTrNodes;this.oApi._fnEscapeRegex=_fnEscapeRegex;this.oApi._fnReOrderIndex=_fnReOrderIndex;
+this.oApi._fnColumnOrdering=_fnColumnOrdering;this.oApi._fnClearTable=_fnClearTable;
+this.oApi._fnSaveState=_fnSaveState;this.oApi._fnLoadState=_fnLoadState;this.oApi._fnCreateCookie=_fnCreateCookie;
+this.oApi._fnReadCookie=_fnReadCookie;this.oApi._fnGetUniqueThs=_fnGetUniqueThs}return this.each(function(){var oSettings=new classSettings();
+_aoSettings.push(oSettings);var i=0,iLen;var bInitHandedOff=false;var bUsePassedData=false;
+var sId=this.getAttribute("id");if(sId!==null){oSettings.sTableId=sId;oSettings.sInstance=sId
+}else{oSettings.sInstance=$.fn.dataTableExt._oExternConfig.iNextUnique++}oSettings.nTable=this;
+if(typeof oInit!="undefined"&&oInit!==null){_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,oInit,"asStripClasses");_fnMap(oSettings,oInit,"fnRowCallback");
+_fnMap(oSettings,oInit,"fnHeaderCallback");_fnMap(oSettings,oInit,"fnFooterCallback");
+_fnMap(oSettings,oInit,"fnDrawCallback");_fnMap(oSettings,oInit,"fnInitComplete");
+_fnMap(oSettings,oInit,"fnServerData");_fnMap(oSettings,oInit,"aaSorting");_fnMap(oSettings,oInit,"aaSortingFixed");
+_fnMap(oSettings,oInit,"sPaginationType");_fnMap(oSettings,oInit,"sAjaxSource");_fnMap(oSettings,oInit,"sDom","sDomPositioning");
+_fnMap(oSettings,oInit,"oSearch","oPreviousSearch");_fnMap(oSettings,oInit,"aoSearchCols","aoPreSearchCols");
+_fnMap(oSettings,oInit,"iDisplayLength","_iDisplayLength");if(typeof oInit.iDisplayStart!="undefined"&&typeof oSettings.iInitDisplayStart=="undefined"){oSettings.iInitDisplayStart=oInit.iDisplayStart;
+oSettings._iDisplayStart=oInit.iDisplayStart}if(typeof oInit.aaData!="undefined"){bUsePassedData=true
+}if(typeof oInit.bStateSave!="undefined"){oSettings.oFeatures.bStateSave=oInit.bStateSave;
+_fnLoadState(oSettings)}if(typeof oInit!="undefined"&&typeof oInit.aoData!="undefined"){oInit.aoColumns=oInit.aoData
+}if(typeof oInit.oLanguage!="undefined"){if(typeof oInit.oLanguage.sUrl!="undefined"&&oInit.oLanguage.sUrl!==""){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)}}}var nThead=this.getElementsByTagName("thead");
+var nThs=nThead.length===0?null:_fnGetUniqueThs(nThead[0]);var bUseCols=typeof oInit!="undefined"&&typeof oInit.aoColumns!="undefined";
+for(i=0,iLen=bUseCols?oInit.aoColumns.length:nThs.length;i<iLen;i++){var col=bUseCols?oInit.aoColumns[i]:null;
+var n=nThs?nThs[i]:null;_fnAddColumn(oSettings,col,n)}if(this.getElementsByTagName("thead").length===0){this.appendChild(document.createElement("thead"))
+}if(this.getElementsByTagName("tbody").length===0){this.appendChild(document.createElement("tbody"))
+}if(bUsePassedData){for(i=0;i<oInit.aaData.length;i++){_fnAddData(oSettings,oInit.aaData[i])
+}}else{_fnGatherData(oSettings)}oSettings.aiDisplay=oSettings.aiDisplayMaster.slice();
+if(oSettings.oFeatures.bAutoWidth){_fnCalculateColumnWidths(oSettings)}oSettings.bInitialised=true;
+if(bInitHandedOff===false){_fnInitalise(oSettings)}})}})(jQuery);
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/jquery.jeditable.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/jquery.jeditable.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/jquery.jeditable.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,538 @@
+/*
+ * Jeditable - jQuery in place edit plugin
+ *
+ * Copyright (c) 2006-2009 Mika Tuupola, Dylan Verheul
+ *
+ * Licensed under the MIT license:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *
+ * Project home:
+ *   http://www.appelsiini.net/projects/jeditable
+ *
+ * Based on editable by Dylan Verheul <dylan_at_dyve.net>:
+ *    http://www.dyve.net/jquery/?editable
+ *
+ */
+
+/**
+  * Version 1.7.0
+  *
+  * ** means there is basic unit tests for this parameter. 
+  *
+  * @name  Jeditable
+  * @type  jQuery
+  * @param String  target             (POST) URL or function to send edited content to **
+  * @param Hash    options            additional options 
+  * @param String  options[method]    method to use to send edited content (POST or PUT) **
+  * @param Function options[callback] Function to run after submitting edited content **
+  * @param String  options[name]      POST parameter name of edited content
+  * @param String  options[id]        POST parameter name of edited div id
+  * @param Hash    options[submitdata] Extra parameters to send when submitting edited content.
+  * @param String  options[type]      text, textarea or select (or any 3rd party input type) **
+  * @param Integer options[rows]      number of rows if using textarea ** 
+  * @param Integer options[cols]      number of columns if using textarea **
+  * @param Mixed   options[height]    'auto', 'none' or height in pixels **
+  * @param Mixed   options[width]     'auto', 'none' or width in pixels **
+  * @param String  options[loadurl]   URL to fetch input content before editing **
+  * @param String  options[loadtype]  Request type for load url. Should be GET or POST.
+  * @param String  options[loadtext]  Text to display while loading external content.
+  * @param Mixed   options[loaddata]  Extra parameters to pass when fetching content before editing.
+  * @param Mixed   options[data]      Or content given as paramameter. String or function.**
+  * @param String  options[indicator] indicator html to show when saving
+  * @param String  options[tooltip]   optional tooltip text via title attribute **
+  * @param String  options[event]     jQuery event such as 'click' of 'dblclick' **
+  * @param String  options[submit]    submit button value, empty means no button **
+  * @param String  options[cancel]    cancel button value, empty means no button **
+  * @param String  options[cssclass]  CSS class to apply to input form. 'inherit' to copy from parent. **
+  * @param String  options[style]     Style to apply to input form 'inherit' to copy from parent. **
+  * @param String  options[select]    true or false, when true text is highlighted ??
+  * @param String  options[placeholder] Placeholder text or html to insert when element is empty. **
+  * @param String  options[onblur]    'cancel', 'submit', 'ignore' or function ??
+  *             
+  * @param Function options[onsubmit] function(settings, original) { ... } called before submit
+  * @param Function options[onreset]  function(settings, original) { ... } called before reset
+  * @param Function options[onerror]  function(settings, original, xhr) { ... } called on error
+  *             
+  * @param Hash    options[ajaxoptions]  jQuery Ajax options. See docs.jquery.com.
+  *             
+  */
+
+(function($) {
+
+    $.fn.editable = function(target, options) {
+            
+        if ('disable' == target) {
+            $(this).data('disabled.editable', true);
+            return;
+        }
+        if ('enable' == target) {
+            $(this).data('disabled.editable', false);
+            return;
+        }
+        if ('destroy' == target) {
+            $(this)
+                .unbind($(this).data('event.editable'))
+                .removeData('disabled.editable')
+                .removeData('event.editable');
+            return;
+        }
+        
+        var settings = {
+            target     : target,
+            name       : 'value',
+            id         : 'id',
+            type       : 'text',
+            width      : 'auto',
+            height     : 'auto',
+            event      : 'click',
+            onblur     : 'cancel',
+            loadtype   : 'GET',
+            loadtext   : 'Loading...',
+            placeholder: 'Click to edit',
+            loaddata   : {},
+            submitdata : {},
+            ajaxoptions: {}
+        };
+        
+        if(options) {
+            $.extend(settings, options);
+        }
+    
+        /* setup some functions */
+        var plugin   = $.editable.types[settings.type].plugin || function() { };
+        var submit   = $.editable.types[settings.type].submit || function() { };
+        var buttons  = $.editable.types[settings.type].buttons 
+                    || $.editable.types['defaults'].buttons;
+        var content  = $.editable.types[settings.type].content 
+                    || $.editable.types['defaults'].content;
+        var element  = $.editable.types[settings.type].element 
+                    || $.editable.types['defaults'].element;
+        var reset    = $.editable.types[settings.type].reset 
+                    || $.editable.types['defaults'].reset;
+        var callback = settings.callback || function() { };
+        var onedit   = settings.onedit   || function() { }; 
+        var onsubmit = settings.onsubmit || function() { };
+        var onreset  = settings.onreset  || function() { };
+        var onerror  = settings.onerror  || reset;
+          
+        /* show tooltip */
+        if (settings.tooltip) {
+            $(this).attr('title', settings.tooltip);
+        }
+        
+        settings.autowidth  = 'auto' == settings.width;
+        settings.autoheight = 'auto' == settings.height;
+        
+        return this.each(function() {
+                        
+            /* save this to self because this changes when scope changes */
+            var self = this;  
+                   
+            /* inlined block elements lose their width and height after first edit */
+            /* save them for later use as workaround */
+            var savedwidth  = $(self).width();
+            var savedheight = $(self).height();
+            
+            /* save so it can be later used by $.editable('destroy') */
+            $(this).data('event.editable', settings.event);
+            
+            /* if element is empty add something clickable (if requested) */
+            if (!$.trim($(this).html())) {
+                $(this).html(settings.placeholder);
+            }
+            
+            $(this).bind(settings.event, function(e) {
+                
+                /* abort if disabled for this element */
+                if (true === $(this).data('disabled.editable')) {
+                    return;
+                }
+                
+                /* prevent throwing an exeption if edit field is clicked again */
+                if (self.editing) {
+                    return;
+                }
+                
+                /* abort if onedit hook returns false */
+                if (false === onedit.apply(this, [settings, self])) {
+                   return;
+                }
+                
+                /* remove tooltip */
+                if (settings.tooltip) {
+                    $(self).removeAttr('title');
+                }
+                
+                /* figure out how wide and tall we are, saved width and height */
+                /* are workaround for http://dev.jquery.com/ticket/2190 */
+                if (0 == $(self).width()) {
+                    //$(self).css('visibility', 'hidden');
+                    settings.width  = savedwidth;
+                    settings.height = savedheight;
+                } else {
+                    if (settings.width != 'none') {
+                        settings.width = 
+                            settings.autowidth ? $(self).width()  : settings.width;
+                    }
+                    if (settings.height != 'none') {
+                        settings.height = 
+                            settings.autoheight ? $(self).height() : settings.height;
+                    }
+                }
+                //$(this).css('visibility', '');
+                
+                /* remove placeholder text, replace is here because of IE */
+                if ($(this).html().toLowerCase().replace(/(;|")/g, '') == 
+                    settings.placeholder.toLowerCase().replace(/(;|")/g, '')) {
+                        $(this).html('');
+                }
+                                
+                self.editing    = true;
+                self.revert     = $(self).html();
+                $(self).html('');
+
+                /* create the form object */
+                var form = $('<form />');
+                
+                /* apply css or style or both */
+                if (settings.cssclass) {
+                    if ('inherit' == settings.cssclass) {
+                        form.attr('class', $(self).attr('class'));
+                    } else {
+                        form.attr('class', settings.cssclass);
+                    }
+                }
+
+                if (settings.style) {
+                    if ('inherit' == settings.style) {
+                        form.attr('style', $(self).attr('style'));
+                        /* IE needs the second line or display wont be inherited */
+                        form.css('display', $(self).css('display'));                
+                    } else {
+                        form.attr('style', settings.style);
+                    }
+                }
+
+                /* add main input element to form and store it in input */
+                var input = element.apply(form, [settings, self]);
+
+                /* set input content via POST, GET, given data or existing value */
+                var input_content;
+                
+                if (settings.loadurl) {
+                    var t = setTimeout(function() {
+                        input.disabled = true;
+                        content.apply(form, [settings.loadtext, settings, self]);
+                    }, 100);
+
+                    var loaddata = {};
+                    loaddata[settings.id] = self.id;
+                    if ($.isFunction(settings.loaddata)) {
+                        $.extend(loaddata, settings.loaddata.apply(self, [self.revert, settings]));
+                    } else {
+                        $.extend(loaddata, settings.loaddata);
+                    }
+                    $.ajax({
+                       type : settings.loadtype,
+                       url  : settings.loadurl,
+                       data : loaddata,
+                       async : false,
+                       success: function(result) {
+                          window.clearTimeout(t);
+                          input_content = result;
+                          input.disabled = false;
+                       }
+                    });
+                } else if (settings.data) {
+                    input_content = settings.data;
+                    if ($.isFunction(settings.data)) {
+                        input_content = settings.data.apply(self, [self.revert, settings]);
+                    }
+                } else {
+                    input_content = self.revert; 
+                }
+                content.apply(form, [input_content, settings, self]);
+
+                input.attr('name', settings.name);
+        
+                /* add buttons to the form */
+                buttons.apply(form, [settings, self]);
+         
+                /* add created form to self */
+                $(self).append(form);
+         
+                /* attach 3rd party plugin if requested */
+                plugin.apply(form, [settings, self]);
+
+                /* focus to first visible form element */
+                $(':input:visible:enabled:first', form).focus();
+
+                /* highlight input contents when requested */
+                if (settings.select) {
+                    input.select();
+                }
+        
+                /* discard changes if pressing esc */
+                input.keydown(function(e) {
+                    if (e.keyCode == 27) {
+                        e.preventDefault();
+                        //self.reset();
+                        reset.apply(form, [settings, self]);
+                    }
+                });
+
+                /* discard, submit or nothing with changes when clicking outside */
+                /* do nothing is usable when navigating with tab */
+                var t;
+                if ('cancel' == settings.onblur) {
+                    input.blur(function(e) {
+                        /* prevent canceling if submit was clicked */
+                        t = setTimeout(function() {
+                            reset.apply(form, [settings, self]);
+                        }, 500);
+                    });
+                } else if ('submit' == settings.onblur) {
+                    input.blur(function(e) {
+                        /* prevent double submit if submit was clicked */
+                        t = setTimeout(function() {
+                            form.submit();
+                        }, 200);
+                    });
+                } else if ($.isFunction(settings.onblur)) {
+                    input.blur(function(e) {
+                        settings.onblur.apply(self, [input.val(), settings]);
+                    });
+                } else {
+                    input.blur(function(e) {
+                      /* TODO: maybe something here */
+                    });
+                }
+
+                form.submit(function(e) {
+
+                    if (t) { 
+                        clearTimeout(t);
+                    }
+
+                    /* do no submit */
+                    e.preventDefault(); 
+            
+                    /* call before submit hook. */
+                    /* if it returns false abort submitting */                    
+                    if (false !== onsubmit.apply(form, [settings, self])) { 
+                        /* custom inputs call before submit hook. */
+                        /* if it returns false abort submitting */
+                        if (false !== submit.apply(form, [settings, self])) { 
+
+                          /* check if given target is function */
+                          if ($.isFunction(settings.target)) {
+                              var str = settings.target.apply(self, [input.val(), settings]);
+                              $(self).html(str);
+                              self.editing = false;
+                              callback.apply(self, [self.innerHTML, settings]);
+                              /* TODO: this is not dry */                              
+                              if (!$.trim($(self).html())) {
+                                  $(self).html(settings.placeholder);
+                              }
+                          } else {
+                              /* add edited content and id of edited element to POST */
+                              var submitdata = {};
+                              submitdata[settings.name] = input.val();
+                              submitdata[settings.id] = self.id;
+                              /* add extra data to be POST:ed */
+                              if ($.isFunction(settings.submitdata)) {
+                                  $.extend(submitdata, settings.submitdata.apply(self, [self.revert, settings]));
+                              } else {
+                                  $.extend(submitdata, settings.submitdata);
+                              }
+
+                              /* quick and dirty PUT support */
+                              if ('PUT' == settings.method) {
+                                  submitdata['_method'] = 'put';
+                              }
+
+                              /* show the saving indicator */
+                              $(self).html(settings.indicator);
+                              
+                              /* defaults for ajaxoptions */
+                              var ajaxoptions = {
+                                  type    : 'POST',
+                                  data    : submitdata,
+                                  url     : settings.target,
+                                  success : function(result, status) {
+                                      $(self).html(result);
+                                      self.editing = false;
+                                      callback.apply(self, [self.innerHTML, settings]);
+                                      if (!$.trim($(self).html())) {
+                                          $(self).html(settings.placeholder);
+                                      }
+                                  },
+                                  error   : function(xhr, status, error) {
+                                      onerror.apply(form, [settings, self, xhr]);
+                                  }
+                              }
+                              
+                              /* override with what is given in settings.ajaxoptions */
+                              $.extend(ajaxoptions, settings.ajaxoptions);   
+                              $.ajax(ajaxoptions);          
+                              
+                            }
+                        }
+                    }
+                    
+                    /* show tooltip again */
+                    $(self).attr('title', settings.tooltip);
+                    
+                    return false;
+                });
+            });
+            
+            /* privileged methods */
+            this.reset = function(form) {
+                /* prevent calling reset twice when blurring */
+                if (this.editing) {
+                    /* before reset hook, if it returns false abort reseting */
+                    if (false !== onreset.apply(form, [settings, self])) { 
+                        $(self).html(self.revert);
+                        self.editing   = false;
+                        if (!$.trim($(self).html())) {
+                            $(self).html(settings.placeholder);
+                        }
+                        /* show tooltip again */
+                        if (settings.tooltip) {
+                            $(self).attr('title', settings.tooltip);                
+                        }
+                    }                    
+                }
+            }            
+        });
+
+    };
+
+
+    $.editable = {
+        types: {
+            defaults: {
+                element : function(settings, original) {
+                    var input = $('<input type="hidden"></input>');                
+                    $(this).append(input);
+                    return(input);
+                },
+                content : function(string, settings, original) {
+                    $(':input:first', this).val(string);
+                },
+                reset : function(settings, original) {
+                  original.reset(this);
+                },
+                buttons : function(settings, original) {
+                    var form = this;
+                    if (settings.submit) {
+                        /* if given html string use that */
+                        if (settings.submit.match(/>$/)) {
+                            var submit = $(settings.submit).click(function() {
+                                if (submit.attr("type") != "submit") {
+                                    form.submit();
+                                }
+                            });
+                        /* otherwise use button with given string as text */
+                        } else {
+                            var submit = $('<button type="submit" />');
+                            submit.html(settings.submit);                            
+                        }
+                        $(this).append(submit);
+                    }
+                    if (settings.cancel) {
+                        /* if given html string use that */
+                        if (settings.cancel.match(/>$/)) {
+                            var cancel = $(settings.cancel);
+                        /* otherwise use button with given string as text */
+                        } else {
+                            var cancel = $('<button type="cancel" />');
+                            cancel.html(settings.cancel);
+                        }
+                        $(this).append(cancel);
+
+                        $(cancel).click(function(event) {
+                            //original.reset();
+                            if ($.isFunction($.editable.types[settings.type].reset)) {
+                                var reset = $.editable.types[settings.type].reset;                                                                
+                            } else {
+                                var reset = $.editable.types['defaults'].reset;                                
+                            }
+                            reset.apply(form, [settings, original]);
+                            return false;
+                        });
+                    }
+                }
+            },
+            text: {
+                element : function(settings, original) {
+                    var input = $('<input />');
+                    if (settings.width  != 'none') { input.width(settings.width);  }
+                    if (settings.height != 'none') { input.height(settings.height); }
+                    /* https://bugzilla.mozilla.org/show_bug.cgi?id=236791 */
+                    //input[0].setAttribute('autocomplete','off');
+                    input.attr('autocomplete','off');
+                    $(this).append(input);
+                    return(input);
+                }
+            },
+            textarea: {
+                element : function(settings, original) {
+                    var textarea = $('<textarea />');
+                    if (settings.rows) {
+                        textarea.attr('rows', settings.rows);
+                    } else if (settings.height != "none") {
+                        textarea.height(settings.height);
+                    }
+                    if (settings.cols) {
+                        textarea.attr('cols', settings.cols);
+                    } else if (settings.width != "none") {
+                        textarea.width(settings.width);
+                    }
+                    $(this).append(textarea);
+                    return(textarea);
+                }
+            },
+            select: {
+               element : function(settings, original) {
+                    var select = $('<select />');
+                    $(this).append(select);
+                    return(select);
+                },
+                content : function(data, settings, original) {
+                    /* If it is string assume it is json. */
+                    if (String == data.constructor) {      
+                        eval ('var json = ' + data);
+                    } else {
+                    /* Otherwise assume it is a hash already. */
+                        var json = data;
+                    }
+                    for (var key in json) {
+                        if (!json.hasOwnProperty(key)) {
+                            continue;
+                        }
+                        if ('selected' == key) {
+                            continue;
+                        } 
+                        var option = $('<option />').val(key).append(json[key]);
+                        $('select', this).append(option);    
+                    }                    
+                    /* Loop option again to set selected. IE needed this... */ 
+                    $('select', this).children().each(function() {
+                        if ($(this).val() == json['selected'] || 
+                            $(this).text() == original.revert) {
+                                $(this).attr('selected', 'selected');
+                        };
+                    });
+                }
+            }
+        },
+
+        /* Add new input type */
+        addInputType: function(name, input) {
+            $.editable.types[name] = input;
+        }
+    };
+
+})(jQuery);
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/jquery.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/jquery.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/support/jquery.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,19 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/swf/ZeroClipboard.swf
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/extras/TableTools/media/swf/ZeroClipboard.swf
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/license-bsd.txt
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/license-bsd.txt	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/license-bsd.txt	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,10 @@
+Copyright (c) 2008-2009, Allan Jardine
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    * Neither the name of Allan Jardine nor SpryMedia UK may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/license-gpl2.txt
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/license-gpl2.txt	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/license-gpl2.txt	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/css/demo_page.css
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/css/demo_page.css	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/css/demo_page.css	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,93 @@
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * General page setup
+ */
+#dt_example {
+	font: 80%/1.45em "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+	margin: 0;
+	padding: 0;
+	color: #333;
+	background-color: #fff;
+}
+
+
+#dt_example #container {
+	width: 800px;
+	margin: 30px auto;
+	padding: 0;
+}
+
+
+#dt_example #footer {
+	margin: 50px auto 0 auto;
+	padding: 0;
+}
+
+#dt_example #demo {
+	margin: 30px auto 0 auto;
+}
+
+#dt_example .demo_jui {
+	margin: 30px auto 0 auto;
+}
+
+#dt_example .big {
+	font-size: 1.3em;
+	font-weight: bold;
+	line-height: 1.6em;
+	color: #4E6CA3;
+}
+
+#dt_example .spacer {
+	height: 20px;
+	clear: both;
+}
+
+#dt_example .clear {
+	clear: both;
+}
+
+#dt_example pre {
+	padding: 15px;
+	background-color: #F5F5F5;
+	border: 1px solid #CCCCCC;
+}
+
+#dt_example h1 {
+	margin-top: 2em;
+	font-size: 1.3em;
+	font-weight: normal;
+	line-height: 1.6em;
+	color: #4E6CA3;
+	border-bottom: 1px solid #B0BED9;
+	clear: both;
+}
+
+#dt_example h2 {
+	font-size: 1.2em;
+	font-weight: normal;
+	line-height: 1.6em;
+	color: #4E6CA3;
+	clear: both;
+}
+
+#dt_example a {
+	color: #0063DC;
+	text-decoration: none;
+}
+
+#dt_example a:hover {
+	text-decoration: underline;
+}
+
+#dt_example ul {
+	color: #B0BED9;
+}
+
+.css_right {
+	float: right;
+}
+
+.css_left {
+	float: left;
+}
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/css/demo_table.css
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/css/demo_table.css	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/css/demo_table.css	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,456 @@
+/*
+ *  File:         demo_table.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.
+ */
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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: 60%;
+	float: left;
+}
+
+.dataTables_paginate {
+	width: 44px;
+	* width: 50px;
+	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('../images/back_disabled.jpg');
+}
+
+.paginate_enabled_previous {
+	background-image: url('../images/back_enabled.jpg');
+}
+
+.paginate_disabled_next {
+	background-image: url('../images/forward_disabled.jpg');
+}
+
+.paginate_enabled_next {
+	background-image: url('../images/forward_enabled.jpg');
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * DataTables display
+ */
+table.display {
+	margin: 0 auto;
+	width: 100%;
+	clear: both;
+}
+
+table.display thead th {
+	padding: 3px 18px 3px 10px;
+	border-bottom: 1px solid black;
+	font-weight: bold;
+	cursor: pointer;
+	* cursor: hand;
+}
+
+table.display tfoot th {
+	padding: 3px 10px;
+	border-top: 1px solid black;
+	font-weight: bold;
+}
+
+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('../images/sort_asc.jpg') no-repeat center right;
+}
+
+.sorting_desc {
+	background: url('../images/sort_desc.jpg') no-repeat center right;
+}
+
+.sorting {
+	background: url('../images/sort_both.jpg') no-repeat center right;
+}
+
+.sorting_asc_disabled {
+	background: url('../images/sort_asc_disabled.jpg') no-repeat center right;
+}
+
+.sorting_desc_disabled {
+	background: url('../images/sort_desc_disabled.jpg') 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
+ */
+.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 {
+	width: 400px;
+	height: 22px;
+	line-height: 22px;
+}
+
+.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;
+}

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/css/demo_table_jui.css
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/css/demo_table_jui.css	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/css/demo_table_jui.css	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,476 @@
+/*
+ *  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 .fg-button {
+	float: left;
+	cursor: pointer;
+	* cursor: hand;
+}
+
+.paging_full_numbers .fg-button {
+	padding: 2px 6px;
+	cursor: pointer;
+	* cursor: hand;
+}
+
+.paging_full_numbers {
+	width: 350px !important;
+}
+
+.fg-toolbar {
+	padding: 5px;
+}
+
+.dataTables_paginate {
+	width: auto;
+}
+
+table.display thead th {
+	padding: 3px 0px 3px 10px;
+	cursor: pointer;
+	* cursor: hand;
+}
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
+ * 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('../images/back_disabled.jpg');
+}
+
+.paginate_enabled_previous {
+	background-image: url('../images/back_enabled.jpg');
+}
+
+.paginate_disabled_next {
+	background-image: url('../images/forward_disabled.jpg');
+}
+
+.paginate_enabled_next {
+	background-image: url('../images/forward_enabled.jpg');
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * DataTables display
+ */
+table.display {
+	margin: 0 auto;
+	width: 100%;
+	clear: both;
+}
+
+table.display tfoot th {
+	padding: 3px 10px;
+	border-top: 1px solid black;
+	font-weight: bold;
+}
+
+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('../images/sort_asc.jpg') no-repeat center right;
+}
+
+.sorting_desc {
+	background: url('../images/sort_desc.jpg') no-repeat center right;
+}
+
+.sorting {
+	background: url('../images/sort_both.jpg') 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
+ */
+.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;
+}
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/images/back_disabled.jpg
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/media/images/back_disabled.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/images/back_enabled.jpg
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/media/images/back_enabled.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/images/forward_disabled.jpg
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/media/images/forward_disabled.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/images/forward_enabled.jpg
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/media/images/forward_enabled.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_asc.jpg
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_asc.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_asc_disabled.jpg
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_asc_disabled.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_both.jpg
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_both.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_desc.jpg
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_desc.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_desc_disabled.jpg
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/media/images/sort_desc_disabled.jpg
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.dataTables.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.dataTables.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.dataTables.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,4720 @@
+/*
+ * File:        jquery.dataTables.js
+ * Version:     1.5.4
+ * CVS:         $Id$
+ * Description: Paginate, search and sort HTML tables
+ * Author:      Allan Jardine (www.sprymedia.co.uk)
+ * Created:     28/3/2008
+ * Modified:    $Date$ by $Author$
+ * Language:    Javascript
+ * License:     GPL v2 or BSD 3 point style
+ * Project:     Mtaala
+ * Contact:     allan.jardine at sprymedia.co.uk
+ * 
+ * Copyright 2008-2009 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 pleease 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,_fnReadCookie,_fnProcessingDisplay,_fnDraw,_fnSort,_fnReDraw,_fnDetectType,_fnSortingClasses,_fnSettingsFromNode,_fnBuildSearchArray,_fnCalculateEnd,_fnFeatureHtmlProcessing,_fnFeatureHtmlPaginate,_fnFeatureHtmlInfo,_fnFeatureHtmlFilter,_fnFilter,_fnSaveState,_fnFilterColumn,_fnEscapeRegex,_fnFilterComplete,_fnFeatureHtmlLength,_fnGetDataMaster,_fnVisibleToColumnIndex,_fnDrawHead,_fnAddData,_fnGetTrNodes,_fnColumnIndexToVisible,_fnCreateCookie,_fnAddOptionsHtml,_fnMap,_fnClearTable,_fnDataToSearch,_fnReOrderIndex,_fnFilterCustom,_fnVisbleColumns,_fnAjaxUpdate,_fnAjaxUpdateDraw,_fnColumnOrdering,fnGetMaxLenString*/
+
+(function($) {
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * DataTables variables
+	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+	
+	/*
+	 * Variable: dataTableSettings
+	 * Purpose:  Store the settings for each dataTables instance
+	 * Scope:    jQuery.fn
+	 */
+	$.fn.dataTableSettings = [];
+	
+	/*
+	 * Variable: dataTableExt
+	 * Purpose:  Container for customisable parts of DataTables
+	 * Scope:    jQuery.fn
+	 */
+	$.fn.dataTableExt = {};
+	var _oExt = $.fn.dataTableExt; /* Short reference for fast internal lookup */
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * 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
+	 */
+	_oExt.sVersion = "1.5.4";
+	
+	/*
+	 * 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": "",
+		"sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
+		"sSortJUIAsc": "",
+		"sSortJUIDesc": "",
+		"sSortJUI": "",
+		"sSortJUIAscAllowed": "",
+		"sSortJUIDescAllowed": ""
+	};
+	
+	/*
+	 * 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-state-default ui-corner-left",
+		"sPagePrevDisabled": "fg-button ui-state-default ui-corner-left ui-state-disabled",
+		"sPageNextEnabled": "fg-button ui-state-default ui-corner-right",
+		"sPageNextDisabled": "fg-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-state-default",
+		"sPageButtonActive": "fg-button ui-state-default ui-state-disabled",
+		"sPageButtonStaticDisabled": "fg-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 fg-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"
+	};
+	
+	/*
+	 * 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
+			 *           function:fnCallbackDraw - draw function which must be called on update
+			 */
+			"fnInit": function ( oSettings, fnCallbackDraw )
+			{
+				var nPaging = oSettings.anFeatures.p;
+				
+				/* Store the next and previous elements in the oSettings object as they can be very
+				 * usful for automation - particularly testing
+				 */
+				if ( !oSettings.bJUI )
+				{
+					oSettings.nPrevious = document.createElement( 'div' );
+					oSettings.nNext = document.createElement( 'div' );
+				}
+				else
+				{
+					oSettings.nPrevious = document.createElement( 'a' );
+					oSettings.nNext = document.createElement( 'a' );
+					
+					var nNextInner = document.createElement('span');
+					nNextInner.className = oSettings.oClasses.sPageJUINext;
+					oSettings.nNext.appendChild( nNextInner );
+					
+					var nPreviousInner = document.createElement('span');
+					nPreviousInner.className = oSettings.oClasses.sPageJUIPrev;
+					oSettings.nPrevious.appendChild( nPreviousInner );
+				}
+				
+				if ( oSettings.sTableId !== '' )
+				{
+					nPaging.setAttribute( 'id', oSettings.sTableId+'_paginate' );
+					oSettings.nPrevious.setAttribute( 'id', oSettings.sTableId+'_previous' );
+					oSettings.nNext.setAttribute( 'id', oSettings.sTableId+'_next' );
+				}
+				
+				oSettings.nPrevious.className = oSettings.oClasses.sPagePrevDisabled;
+				oSettings.nNext.className = oSettings.oClasses.sPageNextDisabled;
+				
+				oSettings.nPrevious.title = oSettings.oLanguage.oPaginate.sPrevious;
+				oSettings.nNext.title = oSettings.oLanguage.oPaginate.sNext;
+				
+				nPaging.appendChild( oSettings.nPrevious );
+				nPaging.appendChild( oSettings.nNext );
+				$(nPaging).insertAfter( oSettings.nTable );
+				
+				$(oSettings.nPrevious).click( function() {
+					oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ?
+						oSettings._iDisplayStart - oSettings._iDisplayLength :
+						0;
+					
+					/* Correct for underrun */
+					if ( oSettings._iDisplayStart < 0 )
+					{
+					  oSettings._iDisplayStart = 0;
+					}
+					
+					fnCallbackDraw( oSettings );
+				} );
+				
+				$(oSettings.nNext).click( function() {
+					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;
+					}
+					
+					fnCallbackDraw( oSettings );
+				} );
+				
+				/* Take the brutal approach to cancelling text selection */
+				$(oSettings.nPrevious).bind( 'selectstart', function () { return false; } );
+				$(oSettings.nNext).bind( 'selectstart', function () { return false; } );
+			},
+			
+			/*
+			 * 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 which must be called on update
+			 */
+			"fnUpdate": function ( oSettings, fnCallbackDraw )
+			{
+				if ( !oSettings.anFeatures.p )
+				{
+					return;
+				}
+				
+				oSettings.nPrevious.className = 
+					( oSettings._iDisplayStart === 0 ) ? 
+					oSettings.oClasses.sPagePrevDisabled : oSettings.oClasses.sPagePrevEnabled;
+				
+				oSettings.nNext.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
+			 *           function:fnCallbackDraw - draw function which must be called on update
+			 */
+			"fnInit": function ( oSettings, fnCallbackDraw )
+			{
+				var nPaging = oSettings.anFeatures.p;
+				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;
+				
+				if ( oSettings.sTableId !== '' )
+				{
+					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' );
+				}
+				
+				nPaging.appendChild( nFirst );
+				nPaging.appendChild( nPrevious );
+				nPaging.appendChild( nList );
+				nPaging.appendChild( nNext );
+				nPaging.appendChild( nLast );
+				
+				$(nFirst).click( function () {
+					oSettings._iDisplayStart = 0;
+					fnCallbackDraw( oSettings );
+				} );
+				
+				$(nPrevious).click( function() {
+					oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ?
+						oSettings._iDisplayStart - oSettings._iDisplayLength :
+						0;
+					
+					/* Correct for underrun */
+					if ( oSettings._iDisplayStart < 0 )
+					{
+					  oSettings._iDisplayStart = 0;
+					}
+					
+					fnCallbackDraw( oSettings );
+				} );
+				
+				$(nNext).click( function() {
+					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;
+					}
+					
+					fnCallbackDraw( oSettings );
+				} );
+				
+				$(nLast).click( function() {
+					if ( oSettings._iDisplayLength >= 0 )
+					{
+						var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1;
+						oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength;
+					}
+					else
+					{
+						oSettings._iDisplayStart = 0;
+					}
+					
+					fnCallbackDraw( oSettings );
+				} );
+				
+				/* Take the brutal approach to cancelling text selection */
+				$('span', nPaging).bind( 'mousedown', function () { return false; } );
+				$('span', nPaging).bind( 'selectstart', function () { return false; } );
+				
+				oSettings.nPaginateList = nList;
+			},
+			
+			/*
+			 * Function: oPagination.full_numbers.fnUpdate
+			 * Purpose:  Update the list of page buttons shows
+			 * Returns:  -
+	 		 * Inputs:   object:oSettings - dataTables settings object
+			 *           function:fnCallbackDraw - draw function which must be called on update
+			 */
+			"fnUpdate": function ( oSettings, fnCallbackDraw )
+			{
+				if ( !oSettings.anFeatures.p )
+				{
+					return;
+				}
+				
+				var iPageCount = jQuery.fn.dataTableExt.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;
+				var iEndButton;
+				var oClasses = oSettings.oClasses;
+				
+				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;
+						}
+					}
+				}
+				
+				for ( var i=iStartButton ; i<=iEndButton ; i++ )
+				{
+					if ( iCurrentPage != i )
+					{
+						sList += '<span class="'+oClasses.sPageButton+'">'+i+'</span>';
+					}
+					else
+					{
+						sList += '<span class="'+oClasses.sPageButtonActive+'">'+i+'</span>';
+					}
+				}
+				
+				oSettings.nPaginateList.innerHTML = sList;
+				
+				/* Take the brutal approach to cancelling text selection */
+				$('span', oSettings.nPaginateList).bind( 'mousedown', function () { return false; } );
+				$('span', oSettings.nPaginateList).bind( 'selectstart', function () { return false; } );
+				
+				$('span', oSettings.nPaginateList).click( function() {
+					var iTarget = (this.innerHTML * 1) - 1;
+					oSettings._iDisplayStart = iTarget * oSettings._iDisplayLength;
+					
+					fnCallbackDraw( oSettings );
+					return false;
+				} );
+				
+				/* Update the 'premanent botton's classes */
+				var nButtons = $('span', oSettings.anFeatures.p);
+				var nStatic = [ nButtons[0], nButtons[1], nButtons[nButtons.length-2], nButtons[nButtons.length-1] ];
+				$(nStatic).removeClass( oClasses.sPageButton+" "+oClasses.sPageButtonActive );
+				if ( iCurrentPage == 1 )
+				{
+					nStatic[0].className += " "+oClasses.sPageButtonStaticDisabled;
+					nStatic[1].className += " "+oClasses.sPageButtonStaticDisabled;
+				}
+				else
+				{
+					nStatic[0].className += " "+oClasses.sPageButton;
+					nStatic[1].className += " "+oClasses.sPageButton;
+				}
+				
+				if ( iCurrentPage == iPages || oSettings._iDisplayLength == -1 )
+				{
+					nStatic[2].className += " "+oClasses.sPageButtonStaticDisabled;
+					nStatic[3].className += " "+oClasses.sPageButtonStaticDisabled;
+				}
+				else
+				{
+					nStatic[2].className += " "+oClasses.sPageButton;
+					nStatic[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 = Date.parse( "01/01/1970 00:00:00" );
+			}
+			if ( isNaN( 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 = Date.parse( "01/01/1970 00:00:00" );
+			}
+			if ( isNaN( y ) )
+			{
+				y =	Date.parse( "01/01/1970 00:00:00" );
+			}
+			
+			return y - x;
+		},
+		
+		
+		/*
+		 * numerical sorting
+		 */
+		"numeric-asc": function ( a, b )
+		{
+			var x = a == "-" ? 0 : a;
+			var y = b == "-" ? 0 : b;
+			return x - y;
+		},
+		
+		"numeric-desc": function ( a, b )
+		{
+			var x = a == "-" ? 0 : a;
+			var y = b == "-" ? 0 : b;
+			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.
+	 */
+	_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 )
+		{
+			/* Snaity check that we are dealing with a string or quick return for a number */
+			if ( typeof sData == 'number' )
+			{
+				return 'numeric';
+			}
+			else if ( typeof sData.charAt != 'function' )
+			{
+				return null;
+			}
+			
+			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) )
+			{
+				return 'date';
+			}
+			return null;
+		}
+	];
+	
+	
+	/*
+	 * 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
+	};
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * DataTables prototype
+	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+	
+	/*
+	 * Function: dataTable
+	 * Purpose:  DataTables information
+	 * Returns:  -
+	 * Inputs:   object:oInit - initalisation options for the table
+	 */
+	$.fn.dataTable = function( oInit )
+	{
+		/*
+		 * Variable: _aoSettings
+		 * Purpose:  Easy reference to data table settings
+		 * Scope:    jQuery.dataTable
+		 */
+		var _aoSettings = $.fn.dataTableSettings;
+		
+		/*
+		 * 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 this._iRecordsTotal;
+				} else {
+					return this.aiDisplayMaster.length;
+				}
+			};
+			
+			this.fnRecordsDisplay = function ()
+			{
+				if ( this.oFeatures.bServerSide ) {
+					return this._iRecordsDisplay;
+				} else {
+					return this.aiDisplay.length;
+				}
+			};
+			
+			this.fnDisplayEnd = function ()
+			{
+				if ( this.oFeatures.bServerSide ) {
+					return this._iDisplayStart + this.aiDisplay.length;
+				} else {
+					return this._iDisplayEnd;
+				}
+			};
+			
+			/*
+			 * 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: anFeatures
+			 * 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.anFeatures = [];
+			
+			/*
+			 * 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",
+				"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"
+				}
+			};
+			
+			/*
+			 * 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
+			 */
+			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": "",
+				"bEscapeRegex": 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: 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: fnDrawCallback
+			 * Purpose:  Callback function for the whole table on each draw
+			 * Scope:    jQuery.dataTable.classSettings
+			 */
+			this.fnDrawCallback = null;
+			
+			/*
+			 * 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: iDefaultSortIndex
+			 * Purpose:  Sorting index which will be used by default
+			 * Scope:    jQuery.dataTable.classSettings
+			 */
+			this.iDefaultSortIndex = 0;
+			
+			/*
+			 * 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: sDomPositioning
+			 * Purpose:  Dictate the positioning that the created elements will take
+			 * Scope:    jQuery.dataTable.classSettings
+			 * Notes:    The following syntax is expected:
+			 *   'l' - Length changing
+			 *   'f' - Filtering input
+			 *   't' - The table!
+			 *   'i' - Information
+			 *   'p' - Pagination
+			 *   'r' - pRocessing
+			 *   '<' and '>' - div elements
+			 *   '<"class" and '>' - div with a class
+			 *    Examples: '<"wrapper"flipt>', '<lf<t>ip>'
+			 */
+			this.sDomPositioning = '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: 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 = $.getJSON;
+			
+			/*
+			 * Variable: iServerDraw
+			 * Purpose:  Counter and tracker for server-side processing draws
+			 * Scope:    jQuery.dataTable.classSettings
+			 */
+			this.iServerDraw = 0;
+			
+			/*
+			 * 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:  Flag to allow callback functions to see what action has been performed
+			 * Scope:    jQuery.dataTable.classSettings
+			 */
+			this.bFiltered = false;
+			this.bSorted = false;
+		}
+		
+		/*
+		 * Variable: oApi
+		 * Purpose:  Container for publicly exposed 'private' functions
+		 * Scope:    jQuery.dataTable
+		 */
+		this.oApi = {};
+		
+		
+		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+		 * 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:bEscapeRegex - optional - escape regex characters or not - default true
+		 */
+		this.fnFilter = function( sInput, iColumn, bEscapeRegex )
+		{
+			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+			
+			if ( typeof bEscapeRegex == 'undefined' )
+			{
+				bEscapeRegex = true;
+			}
+			
+			if ( typeof iColumn == "undefined" || iColumn === null )
+			{
+				/* Global filter */
+				_fnFilterComplete( oSettings, {"sSearch":sInput, "bEscapeRegex": bEscapeRegex}, 1 );
+			}
+			else
+			{
+				/* Single column filter */
+				oSettings.aoPreSearchCols[ iColumn ].sSearch = sInput;
+				oSettings.aoPreSearchCols[ iColumn ].bEscapeRegex = bEscapeRegex;
+				_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: 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: 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 )
+		{
+			var aiReturn = [];
+			var iTest;
+			if ( typeof bRedraw == 'undefined' )
+			{
+				bRedraw = true;
+			}
+			
+			/* 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();
+			
+			/* Rebuild the search */
+			_fnBuildSearchArray( oSettings, 1 );
+			
+			if ( bRedraw )
+			{
+				_fnReDraw( oSettings );
+			}
+			return aiReturn;
+		};
+		
+		/*
+		 * Function: fnDeleteRow
+		 * Purpose:  Remove a row for the table
+		 * Returns:  array:aReturn - the row that was deleted
+		 * Inputs:   int:iIndex - index of aoData to be deleted
+		 *           function:fnCallBack - callback function - default null
+		 *           bool:bNullRow - remove the row information from aoData by setting the value to
+		 *             null - default false
+		 * Notes:    This function requires a little explanation - we don't actually delete the data
+		 *   from aoData - rather we remove it's references from aiDisplayMastr and aiDisplay. This
+		 *   in effect prevnts DataTables from drawing it (hence deleting it) - it could be restored
+		 *   if you really wanted. The reason for this is that actually removing the aoData object
+		 *   would mess up all the subsequent indexes in the display arrays (they could be ajusted - 
+		 *   but this appears to do what is required).
+		 */
+		this.fnDeleteRow = function( iAODataIndex, fnCallBack, bNullRow )
+		{
+			/* Find settings from table node */
+			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+			var i;
+			
+			/* Delete from the display master */
+			for ( i=0 ; i<oSettings.aiDisplayMaster.length ; i++ )
+			{
+				if ( oSettings.aiDisplayMaster[i] == iAODataIndex )
+				{
+					oSettings.aiDisplayMaster.splice( i, 1 );
+					break;
+				}
+			}
+			
+			/* Delete from the current display index */
+			for ( i=0 ; i<oSettings.aiDisplay.length ; i++ )
+			{
+				if ( oSettings.aiDisplay[i] == iAODataIndex )
+				{
+					oSettings.aiDisplay.splice( i, 1 );
+					break;
+				}
+			}
+			
+			/* Rebuild the search */
+			_fnBuildSearchArray( oSettings, 1 );
+			
+			/* If there is a user callback function - call it */
+			if ( typeof fnCallBack == "function" )
+			{
+				fnCallBack.call( this );
+			}
+			
+			/* 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;
+				}
+			}
+			
+			_fnCalculateEnd( oSettings );
+			_fnDraw( oSettings );
+			
+			/* Return the data array from this row */
+			var aData = oSettings.aoData[iAODataIndex]._aData.slice();
+			
+			if ( typeof bNullRow != "undefined" && bNullRow === true )
+			{
+				oSettings.aoData[iAODataIndex] = null;
+			}
+			
+			return aData;
+		};
+		
+		/*
+		 * 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:  -
+		 * Inputs:   node:nTr - the table row to 'open'
+		 *           string:sHtml - the HTML to put into the row
+		 *           string:sClass - class to give the new 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 = $('tbody tr', oSettings.nTable);
+			if ( $.inArray(nTr, nTrs) != -1 )
+			{
+				$(nNewRow).insertAfter(nTr);
+			}
+			
+			/* No point in storing the row if using server-side processing since the nParent will be
+			 * nuked on a re-draw anyway
+			 */
+			if ( !oSettings.oFeatures.bServerSide )
+			{
+				oSettings.aoOpenRows.push( {
+					"nTr": nNewRow,
+					"nParent": nTr
+				} );
+			}
+		};
+		
+		/*
+		 * 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:   int:iRow - optional - if present then the array returned will be the data for
+		 *             the row with the index 'iRow'
+		 */
+		this.fnGetData = function( iRow )
+		{
+			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+			
+			if ( typeof iRow != 'undefined' )
+			{
+				return oSettings.aoData[iRow]._aData;
+			}
+			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 oSettings.aoData[iRow].nTr;
+			}
+			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 ]: - row index and column index
+		 * 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 == "TR" )
+			{
+				for ( i=0 ; i<oSettings.aoData.length ; i++ )
+				{
+					if ( oSettings.aoData[i] !== null && oSettings.aoData[i].nTr == nNode )
+					{
+						return i;
+					}
+				}
+			}
+			else if ( nNode.nodeName == "TD" )
+			{
+				for ( i=0 ; i<oSettings.aoData.length ; i++ )
+				{
+					var iCorrector = 0;
+					for ( var j=0 ; j<oSettings.aoColumns.length ; j++ )
+					{
+						if ( oSettings.aoColumns[j].bVisible )
+						{
+							//$('>td', oSettings.aoData[i].nTr)[j-iCorrector] == nNode )
+							if ( oSettings.aoData[i] !== null &&
+								oSettings.aoData[i].nTr.getElementsByTagName('td')[j-iCorrector] == nNode )
+							{
+								return [ i, 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
+		 *           int:iRow - the row (from aoData) to update
+		 *           int:iColumn - the column to update
+		 *           bool:bRedraw - redraw the table or not - default true
+		 */
+		this.fnUpdate = function( mData, iRow, iColumn, bRedraw )
+		{
+			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+			var iVisibleColumn;
+			var sDisplay;
+			if ( typeof bRedraw == 'undefined' )
+			{
+				bRedraw = true;
+			}
+			
+			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
+			{
+				if ( mData.length != oSettings.aoColumns.length )
+				{
+					alert( 'Warning: 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;
+					}
+				}
+			}
+			
+			/* Update the search array */
+			_fnBuildSearchArray( oSettings, 1 );
+			
+			/* Redraw the table */
+			if ( 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
+		 */
+		this.fnSetColumnVis = function ( iCol, bShow )
+		{
+			var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+			var i, iLen;
+			var iColumns = oSettings.aoColumns.length;
+			var nTd;
+			
+			/* No point in doing anything if we are requesting what is already true */
+			if ( oSettings.aoColumns[iCol].bVisible == bShow )
+			{
+				return;
+			}
+			
+			var nTrHead = $('thead:eq(0)>tr', oSettings.nTable)[0];
+			var nTrFoot = $('tfoot:eq(0)>tr', oSettings.nTable)[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] );
+					if ( nTrFoot )
+					{
+						nTrFoot.appendChild( anTfootTh[iCol] );
+					}
+					
+					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] );
+					if ( nTrFoot )
+					{
+						nTrFoot.insertBefore( anTfootTh[iCol], nTrFoot.getElementsByTagName('th')[iBefore] );
+					}
+					
+					for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+					{
+						nTd = oSettings.aoData[i]._anHidden[iCol];
+						oSettings.aoData[i].nTr.insertBefore( nTd, oSettings.aoData[i].nTr.getElementsByTagName('td')[iBefore] );
+					}
+				}
+				
+				oSettings.aoColumns[iCol].bVisible = true;
+			}
+			else
+			{
+				/* Remove a column from display */
+				nTrHead.removeChild( anTheadTh[iCol] );
+				if ( nTrFoot )
+				{
+					nTrFoot.removeChild( anTfootTh[iCol] );
+				}
+				
+				var iVisCol = _fnColumnIndexToVisible(oSettings, iCol);
+				for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+				{
+					nTd = oSettings.aoData[i].nTr.getElementsByTagName('td')[ iVisCol ];
+					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 );
+			}
+			
+			/* Since there is no redraw done here, we need to save the state manually */
+			_fnSaveState( 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);
+			}
+		}
+		
+		
+		
+		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+		 * Local functions
+		 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+		
+		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+		 * 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 )
+		{
+			/* 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 );
+			
+			/* If there is default sorting required - let's do it. The sort function
+			 * will do the drawing for us. Otherwise we draw the table
+			 */
+			if ( oSettings.oFeatures.bSort )
+			{
+				_fnSort( oSettings, false );
+				/*
+				 * Add the sorting classes to the header and the body (if needed).
+				 * Reason for doing it here after the first draw is to stop classes being applied to the
+				 * 'static' table.
+				 */
+				_fnSortingClasses( oSettings );
+			}
+			else
+			{
+				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+				_fnCalculateEnd( oSettings );
+				_fnDraw( oSettings );
+			}
+			
+			/* if there is an ajax source */
+			if ( oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
+			{
+				_fnProcessingDisplay( oSettings, true );
+				
+				$.getJSON( oSettings.sAjaxSource, null, function(json) {
+					
+					/* Got the data - add it to the table */
+					for ( var 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 );
+					
+					/* Run the init callback if there is one */
+					if ( typeof oSettings.fnInitComplete == 'function' )
+					{
+						oSettings.fnInitComplete( oSettings, json );
+					}
+				} );
+				return;
+			}
+			
+			/* Run the init callback if there is one */
+			if ( typeof oSettings.fnInitComplete == 'function' )
+			{
+				oSettings.fnInitComplete( oSettings );
+			}
+			
+			if ( !oSettings.oFeatures.bServerSide )
+			{
+				_fnProcessingDisplay( oSettings, false );
+			}
+		}
+		
+		/*
+		 * 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, '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' );
+			}
+			
+			if ( bInit )
+			{
+				_fnInitalise( oSettings );
+			}
+		}
+		
+		/*
+		 * Function: _fnAddColumn
+		 * Purpose:  Add a column to the list used for the table
+		 * Returns:  -
+		 * Inputs:   object:oSettings - dataTables settings object
+		 *           object:oOptions - object with sType, bVisible and bSearchable
+		 *           node:nTh - the th element for this column
+		 * Notes:    All options in enter column can be over-ridden by the user
+		 *   initialisation of dataTables
+		 */
+		function _fnAddColumn( oSettings, oOptions, 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,
+				"sClass": null,
+				"fnRender": null,
+				"bUseRendered": true,
+				"iDataSort": oSettings.aoColumns.length-1,
+				"sSortDataType": 'std',
+				"nTh": nTh ? nTh : document.createElement('th'),
+				"nTf": null
+			};
+			
+			/* User specified column options */
+			var iLength = oSettings.aoColumns.length-1;
+			if ( typeof oOptions != 'undefined' && oOptions !== null )
+			{
+				var oCol = oSettings.aoColumns[ iLength ];
+				
+				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, "sClass" );
+				_fnMap( oCol, oOptions, "fnRender" );
+				_fnMap( oCol, oOptions, "bUseRendered" );
+				_fnMap( oCol, oOptions, "iDataSort" );
+				_fnMap( oCol, oOptions, "asSorting" );
+				_fnMap( oCol, oOptions, "sSortDataType" );
+				
+				/* If asSorting is defined, then check that the class assignment is correct for sorting */
+				if ( typeof oOptions.asSorting != 'undefined' )
+				{
+					if ( $.inArray('asc', oOptions.asSorting) == -1 && $.inArray('desc', oOptions.asSorting) == -1 )
+					{
+						oCol.sSortingClass = oSettings.oClasses.sSortableNone;
+						oCol.sSortingClassJUI = "";
+					}
+					else if ( $.inArray('asc', oOptions.asSorting) != -1 && $.inArray('desc', oOptions.asSorting) == -1 )
+					{
+						oCol.sSortingClass = oSettings.oClasses.sSortableAsc;
+						oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed;
+					}
+					else if ( $.inArray('asc', oOptions.asSorting) == -1 && $.inArray('desc', oOptions.asSorting) != -1 )
+					{
+						oCol.sSortingClass = oSettings.oClasses.sSortableDesc;
+						oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed;
+					}
+					/* Otherwise use default */
+				}
+			}
+			
+			/* Add a column specific filter */
+			if ( typeof oSettings.aoPreSearchCols[ iLength ] == 'undefined' ||
+			     oSettings.aoPreSearchCols[ iLength ] === null )
+			{
+				oSettings.aoPreSearchCols[ iLength ] = {
+					"sSearch": "",
+					"bEscapeRegex": true
+				};
+			}
+			else if ( typeof oSettings.aoPreSearchCols[ iLength ].bEscapeRegex == 'undefined' )
+			{
+				/* Don't require that the user must specify bEscapeRegex */
+				oSettings.aoPreSearchCols[ iLength ].bEscapeRegex = true;
+			}
+		}
+		
+		/*
+		 * 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
+		 */
+		function _fnAddData ( oSettings, aData )
+		{
+			/* Sanity check the length of the new array */
+			if ( aData.length != oSettings.aoColumns.length )
+			{
+				alert( "Warning - added data does not match known number of columns" );
+				return -1;
+			}
+			
+			/* Create the object for storing information about this new row */
+			var iThisIndex = oSettings.aoData.length;
+			oSettings.aoData.push( {
+				"_iId": oSettings.iNextId++,
+				"_aData": aData.slice(),
+				"nTr": document.createElement('tr'),
+				"_anHidden": []
+			} );
+			
+			/* Create the cells */
+			var nTd;
+			for ( var i=0 ; i<aData.length ; i++ )
+			{
+				nTd = document.createElement('td');
+				
+				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];
+				}
+				
+				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() */
+					if ( oSettings.aoColumns[i].sType === null )
+					{
+						oSettings.aoColumns[i].sType = _fnDetectType( aData[i] );
+					}
+					else if ( oSettings.aoColumns[i].sType == "date" || 
+					          oSettings.aoColumns[i].sType == "numeric" )
+					{
+						oSettings.aoColumns[i].sType = _fnDetectType( aData[i] );
+					}
+				}
+					
+				if ( oSettings.aoColumns[i].bVisible )
+				{
+					oSettings.aoData[iThisIndex].nTr.appendChild( nTd );
+				}
+				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
+		 * Returns:  -
+		 * Inputs:   object:oSettings - dataTables settings object
+		 */
+		function _fnGatherData( oSettings )
+		{
+			var iLoop;
+			var i, j;
+			
+			/*
+			 * 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 )
+			{
+				$('tbody:eq(0)>tr', oSettings.nTable).each( function() {
+					var iThisIndex = oSettings.aoData.length;
+					oSettings.aoData.push( {
+						"_iId": oSettings.iNextId++,
+						"_aData": [],
+						"nTr": this,
+						"_anHidden": []
+					} );
+					
+					oSettings.aiDisplayMaster.push( iThisIndex );
+					
+					/* Add the data for this column */
+					var aLocalData = oSettings.aoData[iThisIndex]._aData;
+					$('td', this).each( function( i ) {
+						aLocalData[i] = this.innerHTML;
+					} );
+				} );
+			}
+			
+			/*
+			 * Now process by column
+			 */
+			var iCorrector = 0;
+			for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+			{
+				/* Get the title of the column - unless there is a user set one */
+				if ( oSettings.aoColumns[i].sTitle === null )
+				{
+					oSettings.aoColumns[i].sTitle = oSettings.aoColumns[i].nTh.innerHTML;
+				}
+				
+				var bAutoType = oSettings.aoColumns[i]._bAutoType;
+				var bRender = typeof oSettings.aoColumns[i].fnRender == 'function';
+				var bClass = oSettings.aoColumns[i].sClass !== null;
+				var bVisible = oSettings.aoColumns[i].bVisible;
+				
+				/* A single loop to rule them all (and be more efficient) */
+				if ( bAutoType || bRender || bClass || !bVisible )
+				{
+					iLoop = oSettings.aoData.length;
+					for ( j=0 ; j<iLoop ; j++ )
+					{
+						var nCellNode = oSettings.aoData[j].nTr.getElementsByTagName('td')[ i-iCorrector ];
+						
+						if ( bAutoType )
+						{
+							if ( oSettings.aoColumns[i].sType === null )
+							{
+								oSettings.aoColumns[i].sType = _fnDetectType( oSettings.aoData[j]._aData[i] );
+							}
+							else if ( oSettings.aoColumns[i].sType == "date" || 
+							          oSettings.aoColumns[i].sType == "numeric" )
+							{
+								/* If type is date or numeric - ensure that all collected data
+								 * in the column is of the same type
+								 */
+								oSettings.aoColumns[i].sType = _fnDetectType( oSettings.aoData[j]._aData[i] );
+							}
+							/* The else would be 'type = string' we don't want to do anything
+							 * if that is the case
+							 */
+						}
+						
+						if ( bRender )
+						{
+							var sRendered = oSettings.aoColumns[i].fnRender( {
+									"iDataRow": j,
+									"iDataColumn": i,
+									"aData": oSettings.aoData[j]._aData,
+									"oSettings": oSettings
+								} );
+							nCellNode.innerHTML = sRendered;
+							if ( oSettings.aoColumns[i].bUseRendered )
+							{
+								/* Use the rendered data for filtering/sorting */
+								oSettings.aoData[j]._aData[i] = sRendered;
+							}
+						}
+						
+						if ( bClass )
+						{
+							nCellNode.className += ' '+oSettings.aoColumns[i].sClass;
+						}
+						
+						if ( !bVisible )
+						{
+							oSettings.aoData[j]._anHidden[i] = nCellNode;
+							nCellNode.parentNode.removeChild( nCellNode );
+						}
+					}
+					
+					/* Keep an index corrector for the next loop */
+					if ( !bVisible )
+					{
+						iCorrector++;
+					}
+				}
+			}	
+		}
+		
+		
+		
+		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+		 * 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;
+			var iThs = oSettings.nTable.getElementsByTagName('thead')[0].getElementsByTagName('th').length;
+			var iCorrector = 0;
+			
+			/* 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++ )
+				{
+					//oSettings.aoColumns[i].nTh = nThs[i];
+					nTh = oSettings.aoColumns[i].nTh;
+					
+					if ( oSettings.aoColumns[i].bVisible )
+					{
+						/* Set width */
+						if ( oSettings.aoColumns[i].sWidth !== null )
+						{
+							nTh.style.width = oSettings.aoColumns[i].sWidth;
+						}
+						
+						/* 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].bVisible )
+					{
+						if ( oSettings.aoColumns[i].sClass !== null )
+						{
+							nTh.className = oSettings.aoColumns[i].sClass;
+						}
+						
+						if ( oSettings.aoColumns[i].sWidth !== null )
+						{
+							nTh.style.width = oSettings.aoColumns[i].sWidth;
+						}
+						
+						nTr.appendChild( nTh );
+					}
+				}
+				$('thead:eq(0)', oSettings.nTable).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++ )
+				{
+					oSettings.aoColumns[i].nTh.insertBefore( document.createElement('span'),
+						oSettings.aoColumns[i].nTh.firstChild );
+				}
+			}
+			
+			/* Add sort listener */
+			if ( oSettings.oFeatures.bSort )
+			{
+				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+				{
+					if ( oSettings.aoColumns[i].bSortable === false )
+					{
+						$(oSettings.aoColumns[i].nTh).addClass( oSettings.oClasses.sSortableNone );
+						continue;
+					}
+					
+					$(oSettings.aoColumns[i].nTh).click( function (e) {
+						var iDataIndex;
+						/* Find which column we are sorting on - can't use index() due to colspan etc */
+						for ( var i=0 ; i<oSettings.aoColumns.length ; i++ )
+						{
+							if ( oSettings.aoColumns[i].nTh == this )
+							{
+								iDataIndex = i;
+								break;
+							}
+						}
+						
+						/* 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 );
+						}
+					} ); /* /click */
+				} /* For each column */
+				
+				/* Take the brutal approach to cancelling text selection due to the shift key */
+				$('thead:eq(0) th', oSettings.nTable).mousedown( function (e) {
+					if ( e.shiftKey )
+					{
+						this.onselectstart = function() { return false; };
+						return false;
+					}
+				} );
+			} /* /if feature sort */
+			
+			/* Set an absolute width for the table such that pagination doesn't
+			 * cause the table to resize
+			 */
+			if ( oSettings.oFeatures.bAutoWidth && oSettings.nTable.offsetWidth !== 0 )
+			{
+				oSettings.nTable.style.width = oSettings.nTable.offsetWidth+"px";
+			}
+			
+			/* Cache the footer elements */
+			var nTfoot = oSettings.nTable.getElementsByTagName('tfoot');
+			if ( nTfoot.length !== 0 )
+			{
+				iCorrector = 0;
+				var nTfs = nTfoot[0].getElementsByTagName('th');
+				for ( i=0, iLen=nTfs.length ; i<iLen ; i++ )
+				{
+					oSettings.aoColumns[i].nTf = nTfs[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;
+			var anRows = [];
+			var iRowCount = 0;
+			var bRowError = false;
+			var iStrips = oSettings.asStripClasses.length;
+			var iOpenRows = oSettings.aoOpenRows.length;
+			
+			/* If we are dealing with Ajax - do it here */
+			if ( oSettings.oFeatures.bServerSide && 
+			     !_fnAjaxUpdate( oSettings ) )
+			{
+				return;
+			}
+			
+			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 nRow = oSettings.aoData[ oSettings.aiDisplay[j] ].nTr;
+					
+					/* Remove any old stripping classes and then add the new one */
+					if ( iStrips !== 0 )
+					{
+						$(nRow).removeClass( oSettings.asStripClasses.join(' ') );
+						$(nRow).addClass( oSettings.asStripClasses[ iRowCount % iStrips ] );
+					}
+					
+					/* Custom row callback function - might want to manipule the row */
+					if ( typeof oSettings.fnRowCallback == "function" )
+					{
+						nRow = oSettings.fnRowCallback( nRow, 
+							oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j );
+						if ( !nRow && !bRowError )
+						{
+							alert( "Error: 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 = oSettings.aoColumns.length;
+				nTd.className = oSettings.oClasses.sRowEmpty;
+				nTd.innerHTML = oSettings.oLanguage.sZeroRecords;
+				
+				anRows[ iRowCount ].appendChild( nTd );
+			}
+			
+			/* Callback the header and footer custom funcation if there is one */
+			if ( typeof oSettings.fnHeaderCallback == 'function' )
+			{
+				oSettings.fnHeaderCallback( $('thead:eq(0)>tr', oSettings.nTable)[0], 
+					_fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(),
+					oSettings.aiDisplay );
+			}
+			
+			if ( typeof oSettings.fnFooterCallback == 'function' )
+			{
+				oSettings.fnFooterCallback( $('tfoot:eq(0)>tr', oSettings.nTable)[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!) - note the initially odd ':eq(0)>tr' expression. This basically ensures that we
+			 * only get tr elements of the tbody that the data table has been initialised on. If there
+			 * are nested tables then we don't want to remove those elements.
+			 */
+			var nTrs = $('tbody:eq(0)>tr', oSettings.nTable);
+			for ( i=0 ; i<nTrs.length ; i++ )
+			{
+				nTrs[i].parentNode.removeChild( nTrs[i] );
+			}
+			
+			/* Put the draw table into the dom */
+			var nBody = $('tbody:eq(0)', oSettings.nTable);
+			if ( nBody[0] )
+			{
+				for ( i=0 ; i<anRows.length ; i++ )
+				{
+					nBody[0].appendChild( anRows[i] );
+				}
+			}
+			
+			/* Update the pagination display buttons */
+			if ( oSettings.oFeatures.bPaginate )
+			{
+				_oExt.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) {
+					_fnCalculateEnd( oSettings );
+					_fnDraw( oSettings );
+				} );
+			}
+			
+			/* Show information about the table */
+			if ( oSettings.oFeatures.bInfo && oSettings.anFeatures.i )
+			{
+				/* Update the information */
+				if ( oSettings.fnRecordsDisplay() === 0 && 
+					   oSettings.fnRecordsDisplay() == oSettings.fnRecordsTotal() )
+				{
+					oSettings.anFeatures.i.innerHTML = 
+						oSettings.oLanguage.sInfoEmpty+ oSettings.oLanguage.sInfoPostFix;
+				}
+				else if ( oSettings.fnRecordsDisplay() === 0 )
+				{
+					oSettings.anFeatures.i.innerHTML = oSettings.oLanguage.sInfoEmpty +' '+ 
+						oSettings.oLanguage.sInfoFiltered.replace('_MAX_', 
+							oSettings.fnRecordsTotal())+ oSettings.oLanguage.sInfoPostFix;
+				}
+				else if ( oSettings.fnRecordsDisplay() == oSettings.fnRecordsTotal() )
+				{
+					oSettings.anFeatures.i.innerHTML = 
+						oSettings.oLanguage.sInfo.
+							replace('_START_',oSettings._iDisplayStart+1).
+							replace('_END_',oSettings.fnDisplayEnd()).
+							replace('_TOTAL_',oSettings.fnRecordsDisplay())+ 
+						oSettings.oLanguage.sInfoPostFix;
+				}
+				else
+				{
+					oSettings.anFeatures.i.innerHTML = 
+						oSettings.oLanguage.sInfo.
+							replace('_START_',oSettings._iDisplayStart+1).
+							replace('_END_',oSettings.fnDisplayEnd()).
+							replace('_TOTAL_',oSettings.fnRecordsDisplay()) +' '+ 
+						oSettings.oLanguage.sInfoFiltered.replace('_MAX_', oSettings.fnRecordsTotal())+ 
+						oSettings.oLanguage.sInfoPostFix;
+				}
+			}
+			
+			/* Alter the sorting classes to take account of the changes */
+			if ( oSettings.oFeatures.bServerSide && oSettings.oFeatures.bSort )
+			{
+				_fnSortingClasses( oSettings );
+			}
+			
+			/* Save the table state on each draw */
+			_fnSaveState( oSettings );
+			
+			/* Drawing is finished - call the callback if there is one */
+			if ( typeof oSettings.fnDrawCallback == 'function' )
+			{
+				oSettings.fnDrawCallback( oSettings );
+			}
+			
+			/* Draw is complete, sorting and filtering must be as well */
+			oSettings.bSorted = false;
+			oSettings.bFiltered = false;
+		}
+		
+		/*
+		 * 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.iServerDraw++;
+				aoData.push( { "name": "sEcho",          "value": oSettings.iServerDraw } );
+				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": "bEscapeRegex",   "value": oSettings.oPreviousSearch.bEscapeRegex } );
+					for ( i=0 ; i<iColumns ; i++ )
+					{
+						aoData.push( { "name": "sSearch_"+i,      "value": oSettings.aoPreSearchCols[i].sSearch } );
+						aoData.push( { "name": "bEscapeRegex_"+i, "value": oSettings.aoPreSearchCols[i].bEscapeRegex } );
+					}
+				}
+				
+				/* 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": "iSortDir_"+i,  "value": oSettings.aaSortingFixed[i][1] } );
+						//1.6 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": "iSortDir_"+(i+iFixed),  "value": oSettings.aaSorting[i][1] } );
+						//1.6 aoData.push( { "name": "sSortDir_"+(i+iFixed),  "value": oSettings.aaSorting[i][1] } );
+					}
+				}
+				
+				oSettings.fnServerData( 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.iServerDraw )
+				{
+					return;
+				}
+				else
+				{
+					oSettings.iServerDraw = json.sEcho * 1;
+				}
+			}
+			
+			_fnClearTable( oSettings );
+			oSettings._iRecordsTotal = json.iTotalRecords;
+			oSettings._iRecordsDisplay = json.iTotalDisplayRecords;
+			
+			/* Determine if reordering is required */
+			var sOrdering = _fnColumnOrdering(oSettings);
+			var bReOrder = (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 );
+		}
+		
+		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+		 * 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.
+			 */
+			var nWrapper = document.createElement( 'div' );
+			nWrapper.className = oSettings.oClasses.sWrapper;
+			if ( oSettings.sTableId !== '' )
+			{
+				nWrapper.setAttribute( 'id', oSettings.sTableId+'_wrapper' );
+			}
+			
+			/* Track where we want to insert the option */
+			var nInsertNode = nWrapper;
+			
+			/* IE don't treat strings as arrays */
+			var sDom = oSettings.sDomPositioning.split('');
+			
+			/* Loop over the user set positioning and place the elements as needed */
+			var nTmp;
+			for ( var i=0 ; i<sDom.length ; i++ )
+			{
+				var cOption = sDom[i];
+				
+				if ( cOption == '<' )
+				{
+					/* New container div */
+					var nNewNode = document.createElement( 'div' );
+					
+					/* Check to see if we should append a class name to the container */
+					var cNext = sDom[i+1];
+					if ( cNext == "'" || cNext == '"' )
+					{
+						var sClass = "";
+						var j = 2;
+						while ( sDom[i+j] != cNext )
+						{
+							sClass += sDom[i+j];
+							j++;
+						}
+						nNewNode.className = sClass;
+						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 );
+					oSettings.anFeatures[cOption] = nTmp;
+					nInsertNode.appendChild( nTmp );
+				}
+				else if ( cOption == 'f' && oSettings.oFeatures.bFilter )
+				{
+					/* Filter */
+					nTmp = _fnFeatureHtmlFilter( oSettings );
+					oSettings.anFeatures[cOption] = nTmp;
+					nInsertNode.appendChild( nTmp );
+				}
+				else if ( cOption == 'r' && oSettings.oFeatures.bProcessing )
+				{
+					/* pRocessing */
+					nTmp = _fnFeatureHtmlProcessing( oSettings );
+					oSettings.anFeatures[cOption] = nTmp;
+					nInsertNode.appendChild( nTmp );
+				}
+				else if ( cOption == 't' )
+				{
+					/* Table */
+					oSettings.anFeatures[cOption] = oSettings.nTable;
+					nInsertNode.appendChild( oSettings.nTable );
+				}
+				else if ( cOption ==  'i' && oSettings.oFeatures.bInfo )
+				{
+					/* Info */
+					nTmp = _fnFeatureHtmlInfo( oSettings );
+					oSettings.anFeatures[cOption] = nTmp;
+					nInsertNode.appendChild( nTmp );
+				}
+				else if ( cOption == 'p' && oSettings.oFeatures.bPaginate )
+				{
+					/* Pagination */
+					nTmp = _fnFeatureHtmlPaginate( oSettings );
+					oSettings.anFeatures[cOption] = nTmp;
+					nInsertNode.appendChild( nTmp );
+				}
+				else if ( _oExt.aoFeatures.length !== 0 )
+				{
+					var aoFeatures = _oExt.aoFeatures;
+					for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
+					{
+						if ( cOption == aoFeatures[k].cFeature )
+						{
+							nTmp = aoFeatures[k].fnInit( oSettings );
+							oSettings.anFeatures[cOption] = nTmp;
+							nInsertNode.appendChild( nTmp );
+							break;
+						}
+					}
+				}
+			}
+			
+			/* Built our DOM structure - replace the holding div with what we want */
+			nHolding.parentNode.replaceChild( nWrapper, nHolding );
+		}
+		
+		/*
+		 * 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 !== '' )
+			{
+				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.keyup( function(e) {
+				_fnFilterComplete( oSettings, { 
+					"sSearch": this.value, 
+					"bEscapeRegex": oSettings.oPreviousSearch.bEscapeRegex 
+				} );
+			} );
+			
+			jqFilter.keypress( function(e) {
+				/* Prevent default */
+				if ( e.keyCode == 13 )
+				{
+					return false;
+				}
+			} );
+			
+			return nFilter;
+		}
+		
+		/*
+		 * 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' );
+			if ( oSettings.sTableId !== '' )
+			{
+				nInfo.setAttribute( 'id', oSettings.sTableId+'_info' );
+			}
+			nInfo.className = oSettings.oClasses.sInfo;
+			return nInfo;
+		}
+		
+		/*
+		 * Function: _fnFeatureHtmlPaginate
+		 * Purpose:  Generate the node required for default pagination
+		 * Returns:  node
+		 * Inputs:   object:oSettings - dataTables settings object
+		 */
+		function _fnFeatureHtmlPaginate ( oSettings )
+		{
+			var nPaginate = document.createElement( 'div' );
+			nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType;
+			oSettings.anFeatures.p = nPaginate; /* Need this stored in order to call paging plug-ins */
+			
+			_oExt.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, function( oSettings ) {
+				_fnCalculateEnd( oSettings );
+				_fnDraw( oSettings );
+			} );
+			return nPaginate;
+		}
+		
+		/*
+		 * Function: _fnFeatureHtmlLength
+		 * Purpose:  Generate the node required for user display length changing
+		 * Returns:  node
+		 * Inputs:   object:oSettings - dataTables settings object
+		 */
+		function _fnFeatureHtmlLength ( oSettings )
+		{
+			/* 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+'>'+
+					'<option value="10">10</option>'+
+					'<option value="25">25</option>'+
+					'<option value="50">50</option>'+
+					'<option value="100">100</option>'+
+				'</select>';
+			
+			var nLength = document.createElement( 'div' );
+			if ( oSettings.sTableId !== '' )
+			{
+				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).change( function(e) {
+				oSettings._iDisplayLength = parseInt($(this).val(), 10);
+				
+				_fnCalculateEnd( oSettings );
+				
+				/* If we have space to show extra rows (backing up from the end point - then do so */
+				if ( oSettings._iDisplayEnd == oSettings.aiDisplay.length )
+				{
+					oSettings._iDisplayStart = oSettings._iDisplayEnd - oSettings._iDisplayLength;
+					if ( oSettings._iDisplayStart < 0 )
+					{
+						oSettings._iDisplayStart = 0;
+					}
+				}
+				
+				if ( oSettings._iDisplayLength == -1 )
+				{
+					oSettings._iDisplayStart = 0;
+				}
+				
+				_fnDraw( oSettings );
+			} );
+			
+			return nLength;
+		}
+		
+		/*
+		 * 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 !== '' )
+			{
+				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 )
+			{
+				oSettings.anFeatures.r.style.visibility = bShow ? "visible" : "hidden";
+			}
+		}
+		
+		
+		
+		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+		 * Filtering
+		 */
+		
+		/*
+		 * 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.bEscapeRegex );
+			
+			/* 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].bEscapeRegex );
+			}
+			
+			/* Custom filtering */
+			if ( _oExt.afnFiltering.length !== 0 )
+			{
+				_fnFilterCustom( oSettings );
+			}
+			
+			/* Tell the draw function we have been filtering */
+			oSettings.bFiltered = true;
+			
+			/* Redraw the table */
+			if ( typeof oSettings.iInitDisplayStart != 'undefined' && oSettings.iInitDisplayStart != -1 )
+			{
+				oSettings._iDisplayStart = oSettings.iInitDisplayStart;
+				oSettings.iInitDisplayStart = -1;
+			}
+			else
+			{
+				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:bEscapeRegex - escape regex or not
+		 */
+		function _fnFilterColumn ( oSettings, sInput, iColumn, bEscapeRegex )
+		{
+			if ( sInput === "" )
+			{
+				return;
+			}
+			
+			var iIndexCorrector = 0;
+			var sRegexMatch = bEscapeRegex ? _fnEscapeRegex( sInput ) : sInput;
+			var rpSearch = new RegExp( sRegexMatch, "i" );
+			
+			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:bEscapeRegex - escape regex or not
+		 */
+		function _fnFilter( oSettings, sInput, iForce, bEscapeRegex )
+		{
+			var i;
+			
+			/* 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 */
+			if ( _oExt.afnFiltering.length !== 0 )
+			{
+				iForce = 1;
+			}
+			
+			/* Generate the regular expression to use. Something along the lines of:
+			 * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$
+			 */
+			var asSearch = bEscapeRegex ?
+				_fnEscapeRegex( sInput ).split( ' ' ) :
+				sInput.split( ' ' );
+			var sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$';
+			var rpSearch = new RegExp( sRegExpString, "i" ); /* case insensitive */
+			
+			/*
+			 * 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.bEscapeRegex = bEscapeRegex;
+		}
+		
+		
+		
+		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+		 * 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)
+		 */
+		function _fnSort ( oSettings, bApplyClasses )
+		{
+			/*
+			 * Funny one this - we want to sort aiDisplayMaster - but according to aoData[]._aData
+			 *
+			 * function _fnSortText ( a, b )
+			 * {
+			 * 	var iTest;
+			 * 	var oSort = _oExt.oSort;
+			 * 	
+			 * 	iTest = oSort['string-asc']( aoData[ a ]._aData[ COL ], aoData[ b ]._aData[ COL ] );
+			 * 	if ( iTest === 0 )
+			 * 		...
+			 * }
+			 */
+			
+			/* Here is what we are looking to achieve here (custom sort functions add complication...)
+			 * function _fnSortText ( a, b )
+			 * {
+			 * 	var iTest;
+			 *  var oSort = _oExt.oSort;
+			 * 	iTest = oSort['string-asc']( a[0], b[0] );
+			 * 	if ( iTest === 0 )
+			 * 		iTest = oSort['string-asc']( a[1], b[1] );
+			 * 		if ( iTest === 0 )
+			 * 			iTest = oSort['string-asc']( a[2], b[2] );
+			 * 	
+			 * 	return iTest;
+			 * }
+			 */
+			var aaSort = [];
+			var oSort = _oExt.oSort;
+			var aoData = oSettings.aoData;
+			var iDataSort;
+			var iDataType;
+			var i, j, jLen;
+			
+			if ( 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 sDataType = oSettings.aoColumns[ iColumn ].sSortDataType;
+					if ( typeof _oExt.afnSortData[sDataType] != 'undefined' )
+					{
+						var iCorrector = 0;
+						var aData = _oExt.afnSortData[sDataType]( oSettings, iColumn );
+						for ( j=0, jLen=aoData.length ; j<jLen ; j++ )
+						{
+							if ( aoData[j] != null )
+							{
+								aoData[j]._aData[iColumn] = aData[iCorrector];
+								iCorrector++;
+							}
+						}
+					}
+				}
+				
+				if ( !window.runtime )
+				{
+					var fnLocalSorting;
+					var sDynamicSort = "fnLocalSorting = function(a,b){"+
+						"var iTest;";
+					
+					for ( i=0 ; i<aaSort.length-1 ; i++ )
+					{
+						iDataSort = oSettings.aoColumns[ aaSort[i][0] ].iDataSort;
+						iDataType = oSettings.aoColumns[ iDataSort ].sType;
+						sDynamicSort += "iTest = oSort['"+iDataType+"-"+aaSort[i][1]+"']"+
+							"( aoData[a]._aData["+iDataSort+"], aoData[b]._aData["+iDataSort+"] ); if ( iTest === 0 )";
+					}
+					
+					iDataSort = oSettings.aoColumns[ aaSort[aaSort.length-1][0] ].iDataSort;
+					iDataType = oSettings.aoColumns[ iDataSort ].sType;
+					sDynamicSort += "iTest = oSort['"+iDataType+"-"+aaSort[aaSort.length-1][1]+"']"+
+						"( aoData[a]._aData["+iDataSort+"], aoData[b]._aData["+iDataSort+"] ); return iTest;}";
+					
+					/* The eval has to be done to a variable for IE */
+					eval( sDynamicSort );
+					oSettings.aiDisplayMaster.sort( fnLocalSorting );
+				}
+				else
+				{
+					/*
+					 * Support for Adobe AIR - AIR doesn't allow eval with a function
+					 * Note that for reasonable sized data sets this method is around 1.5 times slower than
+					 * the eval above (hence why it is not used all the time). Oddly enough, it is ever so
+					 * slightly faster for very small sets (presumably the eval has overhead).
+					 *   Single column (1083 records) - eval: 32mS   AIR: 38mS
+					 *   Two columns (1083 records) -   eval: 55mS   AIR: 66mS
+					 */
+					
+					/* Build a cached array so the sort doesn't have to process this stuff on every call */
+					var aAirSort = [];
+					var iLen = aaSort.length;
+					for ( i=0 ; i<iLen ; i++ )
+					{
+						iDataSort = oSettings.aoColumns[ aaSort[i][0] ].iDataSort;
+						aAirSort.push( [
+							iDataSort,
+							oSettings.aoColumns[ iDataSort ].sType+'-'+aaSort[i][1]
+						] );
+					}
+					
+					oSettings.aiDisplayMaster.sort( function (a,b) {
+						var iTest;
+						for ( var i=0 ; i<iLen ; i++ )
+						{
+							iTest = oSort[ aAirSort[i][1] ]( aoData[a]._aData[aAirSort[i][0]], aoData[b]._aData[aAirSort[i][0]] );
+							if ( iTest !== 0 )
+							{
+								return iTest;
+							}
+						}
+						return 0;
+					} );
+				}
+			}
+			
+			/* 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: _fnSortingClasses
+		 * Purpose:  Set the sortting classes on the header
+		 * Returns:  -
+		 * Inputs:   object:oSettings - dataTables settings object
+		 */
+		function _fnSortingClasses( oSettings )
+		{
+			var i, j, 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 && oSettings.aoColumns[i].bVisible )
+				{
+					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 );
+					}
+				}
+			}
+			
+			/* 
+			 * 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..)
+			 */
+			if ( oSettings.oFeatures.bSortClasses )
+			{
+				var nTrs = _fnGetTrNodes( oSettings );
+				sClass = oClasses.sSortColumn;
+				$('td', nTrs).removeClass( sClass+"1 "+sClass+"2 "+sClass+"3" );
+				
+				var iClass = 1;
+				for ( i=0 ; i<aaSort.length ; i++ )
+				{
+					var iVis = _fnColumnIndexToVisible(oSettings, aaSort[i][0]);
+					if ( iVis !== null )
+					{
+						/* Limit the number of classes to three */
+						if ( iClass <= 2 )
+						{
+							$('td:eq('+iVis+')', nTrs).addClass( sClass+iClass );
+						}
+						else
+						{
+							$('td:eq('+iVis+')', nTrs).addClass( sClass+'3' );
+						}
+						iClass++;
+					}
+				}
+			}
+		}
+		
+		/*
+		 * 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: _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;
+		}
+		
+		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+		 * Support functions
+		 */
+		
+		/*
+		 * 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] = '';
+				for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
+				{
+					if ( oSettings.aoColumns[j].bSearchable )
+					{
+						var sData = oSettings.aoData[ aArray[i] ]._aData[j];
+						oSettings.asDataSearch[i] += _fnDataToSearch( sData, oSettings.aoColumns[j].sType )+' ';
+					}
+				}
+			}
+		}
+		
+		/*
+		 * 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;
+		}
+		
+		/*
+		 * 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 iTotalUserIpSize = 0;
+			var iTmpWidth;
+			var iVisibleColumns = 0;
+			var iColums = oSettings.aoColumns.length;
+			var i;
+			var oHeaders = $('thead:eq(0)>th', oSettings.nTable);
+			
+			/* 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].sWidth, 
+							oSettings.nTable.parentNode );
+						
+						/* Total up the user defined widths for later calculations */
+						iTotalUserIpSize += iTmpWidth;
+						
+						oSettings.aoColumns[i].sWidth = iTmpWidth+"px";
+					}
+				}
+			}
+			
+			/* 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
+			 */
+			if ( iColums == oHeaders.length && iTotalUserIpSize === 0 && iVisibleColumns == iColums )
+			{
+				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+				{
+					oSettings.aoColumns[i].sWidth = oHeaders[i].offsetWidth+"px";
+				}
+			}
+			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 maximum
+				 * string sizes in the data, and any user defined widths
+				 */
+				var nCalcTmp = oSettings.nTable.cloneNode( false );
+				nCalcTmp.setAttribute( "id", '' );
+				
+				var sTableTmp = '<table class="'+nCalcTmp.className+'">';
+				var sCalcHead = "<tr>";
+				var sCalcHtml = "<tr>";
+				
+				/* Construct a tempory table which we will inject (invisibly) into
+				 * the dom - to let the browser do all the hard word
+				 */
+				for ( i=0 ; i<iColums ; i++ )
+				{
+					if ( oSettings.aoColumns[i].bVisible )
+					{
+						sCalcHead += '<th>'+oSettings.aoColumns[i].sTitle+'</th>';
+						
+						if ( oSettings.aoColumns[i].sWidth !== null )
+						{
+							var sWidth = '';
+							if ( oSettings.aoColumns[i].sWidth !== null )
+							{
+								sWidth = ' style="width:'+oSettings.aoColumns[i].sWidth+';"';
+							}
+							
+							sCalcHtml += '<td'+sWidth+' tag_index="'+i+'">'+fnGetMaxLenString( oSettings, i)+'</td>';
+						}
+						else
+						{
+							sCalcHtml += '<td tag_index="'+i+'">'+fnGetMaxLenString( oSettings, i)+'</td>';
+						}
+					}
+				}
+				
+				sCalcHead += "</tr>";
+				sCalcHtml += "</tr>";
+				
+				/* Create the tmp table node (thank you jQuery) */
+				nCalcTmp = $( sTableTmp + sCalcHead + sCalcHtml +'</table>' )[0];
+				nCalcTmp.style.width = iTableWidth + "px";
+				nCalcTmp.style.visibility = "hidden";
+				nCalcTmp.style.position = "absolute"; /* Try to aviod scroll bar */
+				
+				oSettings.nTable.parentNode.appendChild( nCalcTmp );
+				
+				var oNodes = $("tr:eq(1)>td", nCalcTmp);
+				var iIndex;
+				
+				/* Gather in the browser calculated widths for the rows */
+				for ( i=0 ; i<oNodes.length ; i++ )
+				{
+					iIndex = oNodes[i].getAttribute('tag_index');
+					
+					oSettings.aoColumns[iIndex].sWidth = $("td", nCalcTmp)[i].offsetWidth +"px";
+				}
+				
+				oSettings.nTable.parentNode.removeChild( nCalcTmp );
+			}
+		}
+		
+		/*
+		 * 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 = 0;
+			var iMaxIndex = -1;
+			
+			for ( var i=0 ; i<oSettings.aoData.length ; i++ )
+			{
+				if ( oSettings.aoData[i]._aData[iCol].length > iMax )
+				{
+					iMax = oSettings.aoData[i]._aData[iCol].length;
+					iMaxIndex = i;
+				}
+			}
+			
+			if ( iMaxIndex >= 0 )
+			{
+				return oSettings.aoData[iMaxIndex]._aData[iCol];
+			}
+			return '';
+		}
+		
+		/*
+		 * 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++ )
+			{
+				if ( oSettings.aoData[i] === null )
+				{
+					aData.push( null );
+				}
+				else
+				{
+					aData.push( oSettings.aoData[i]._aData );
+				}
+			}
+			return aData;
+		}
+		
+		/*
+		 * Function: _fnGetTrNodes
+		 * Purpose:  Return an array with the TR nodes for the table
+		 * Returns:  array array:aData - 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++ )
+			{
+				if ( oSettings.aoData[i] === null )
+				{
+					aNodes.push( null );
+				}
+				else
+				{
+					aNodes.push( oSettings.aoData[i].nTr );
+				}
+			}
+			return aNodes;
+		}
+		
+		/*
+		 * 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: _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: _fnClearTable
+		 * Purpose:  Nuke the table
+		 * Returns:  -
+		 * Inputs:   object:oSettings - dataTables settings object
+		 */
+		function _fnClearTable( oSettings )
+		{
+			oSettings.aoData.length = 0;
+			oSettings.aiDisplayMaster.length = 0;
+			oSettings.aiDisplay.length = 0;
+			_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 )
+			{
+				return;
+			}
+			
+			/* Store the interesting variables */
+			var i;
+			var sValue = "{";
+			sValue += '"iStart": '+oSettings._iDisplayStart+',';
+			sValue += '"iEnd": '+oSettings._iDisplayEnd+',';
+			sValue += '"iLength": '+oSettings._iDisplayLength+',';
+			sValue += '"sFilter": "'+oSettings.oPreviousSearch.sSearch.replace('"','\\"')+'",';
+			sValue += '"sFilterEsc": '+oSettings.oPreviousSearch.bEscapeRegex+',';
+			
+			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 += "['"+oSettings.aoPreSearchCols[i].sSearch.replace("'","\'")+
+					"',"+oSettings.aoPreSearchCols[i].bEscapeRegex+"],";
+			}
+			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 += "]";
+			
+			sValue += "}";
+			_fnCreateCookie( "SpryMedia_DataTables_"+oSettings.sInstance, sValue, 
+				oSettings.iCookieDuration );
+		}
+		
+		/*
+		 * 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;
+			var sData = _fnReadCookie( "SpryMedia_DataTables_"+oSettings.sInstance );
+			if ( sData !== null && sData !== '' )
+			{
+				/* Try/catch the JSON eval - if it is bad then we ignore it */
+				try
+				{
+					/* Use the JSON library for safety - if it is available */
+					if ( typeof JSON == 'object' && typeof JSON.parse == 'function' )
+					{
+						/* DT 1.4.0 used single quotes for a string - JSON.parse doesn't allow this and throws
+						 * an error. So for now we can do this. This can be removed in future it is just to
+						 * allow the tranfrer to 1.4.1+ to occur
+						 */
+						oData = JSON.parse( sData.replace(/'/g, '"') );
+					}
+					else
+					{
+						oData = eval( '('+sData+')' );
+					}
+				}
+				catch( e )
+				{
+					return;
+				}
+				
+				/* Restore key features */
+				oSettings._iDisplayStart = oData.iStart;
+				oSettings.iInitDisplayStart = oData.iStart;
+				oSettings._iDisplayEnd = oData.iEnd;
+				oSettings._iDisplayLength = oData.iLength;
+				oSettings.oPreviousSearch.sSearch = oData.sFilter;
+				oSettings.aaSorting = oData.aaSorting.slice();
+				
+				/* Search filtering - global reference added in 1.4.1 */
+				if ( typeof oData.sFilterEsc != 'undefined' )
+				{
+					oSettings.oPreviousSearch.bEscapeRegex = oData.sFilterEsc;
+				}
+				
+				/* Column filtering - added in 1.5.0 beta 6 */
+				if ( typeof oData.aaSearchCols != 'undefined' )
+				{
+					for ( var i=0 ; i<oData.aaSearchCols.length ; i++ )
+					{
+						oSettings.aoPreSearchCols[i] = {
+							"sSearch": oData.aaSearchCols[i][0],
+							"bEscapeRegex": 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
+		 */
+		function _fnCreateCookie ( sName, sValue, iSecs )
+		{
+			var date = new Date();
+			date.setTime( date.getTime()+(iSecs*1000) );
+			
+			/* 
+			 * Shocking but true - it would appear IE has major issues with having the path being
+			 * set to anything but root. We need the cookie to be available based on the path, so we
+			 * have to append the pathname to the cookie name. Appalling.
+			 */
+			sName += '_'+window.location.pathname.replace(/[\/:]/g,"").toLowerCase();
+			
+			document.cookie = sName+"="+sValue+"; expires="+date.toGMTString()+"; path=/";
+		}
+		
+		/*
+		 * 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 sNameEQ = sName +'_'+ window.location.pathname.replace(/[\/:]/g,"").toLowerCase() + "=";
+			var 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 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 == "TD" || nTrs[i].childNodes[j].nodeName == "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=="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
+			 * Note the use of aLayout[0] in the outloop, we want the outer loop to occur the same
+			 * number of times as there are columns. Unusual having nested loops this way around
+			 * but is what we need here.
+			 */
+			for ( i=0, iLen=aLayout[0].length ; i<iLen ; i++ )
+			{
+				for ( j=0, jLen=aLayout.length ; j<jLen ; j++ )
+				{
+					if ( typeof aLayout[j][i] == 'object' )
+					{
+						aReturn.push( aLayout[j][i] );
+					}
+				}
+			}
+			
+			return aReturn;
+		}
+		
+		/*
+		 * 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];
+			}
+		}
+		
+		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+		 * 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 1.6.
+		 */
+		this.oApi._fnInitalise = _fnInitalise;
+		this.oApi._fnLanguageProcess = _fnLanguageProcess;
+		this.oApi._fnAddColumn = _fnAddColumn;
+		this.oApi._fnAddData = _fnAddData;
+		this.oApi._fnGatherData = _fnGatherData;
+		this.oApi._fnDrawHead = _fnDrawHead;
+		this.oApi._fnDraw = _fnDraw;
+		this.oApi._fnAjaxUpdate = _fnAjaxUpdate;
+		this.oApi._fnAddOptionsHtml = _fnAddOptionsHtml;
+		this.oApi._fnFeatureHtmlFilter = _fnFeatureHtmlFilter;
+		this.oApi._fnFeatureHtmlInfo = _fnFeatureHtmlInfo;
+		this.oApi._fnFeatureHtmlPaginate = _fnFeatureHtmlPaginate;
+		this.oApi._fnFeatureHtmlLength = _fnFeatureHtmlLength;
+		this.oApi._fnFeatureHtmlProcessing = _fnFeatureHtmlProcessing;
+		this.oApi._fnProcessingDisplay = _fnProcessingDisplay;
+		this.oApi._fnFilterComplete = _fnFilterComplete;
+		this.oApi._fnFilterColumn = _fnFilterColumn;
+		this.oApi._fnFilter = _fnFilter;
+		this.oApi._fnSortingClasses = _fnSortingClasses;
+		this.oApi._fnVisibleToColumnIndex = _fnVisibleToColumnIndex;
+		this.oApi._fnColumnIndexToVisible = _fnColumnIndexToVisible;
+		this.oApi._fnVisbleColumns = _fnVisbleColumns;
+		this.oApi._fnBuildSearchArray = _fnBuildSearchArray;
+		this.oApi._fnDataToSearch = _fnDataToSearch;
+		this.oApi._fnCalculateEnd = _fnCalculateEnd;
+		this.oApi._fnConvertToWidth = _fnConvertToWidth;
+		this.oApi._fnCalculateColumnWidths = _fnCalculateColumnWidths;
+		this.oApi._fnArrayCmp = _fnArrayCmp;
+		this.oApi._fnDetectType = _fnDetectType;
+		this.oApi._fnGetDataMaster = _fnGetDataMaster;
+		this.oApi._fnGetTrNodes = _fnGetTrNodes;
+		this.oApi._fnEscapeRegex = _fnEscapeRegex;
+		this.oApi._fnReOrderIndex = _fnReOrderIndex;
+		this.oApi._fnColumnOrdering = _fnColumnOrdering;
+		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._fnReDraw = _fnReDraw;
+		
+		/* Want to be able to reference "this" inside the this.each function */
+		var _that = this;
+		
+		
+		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+		 * Constructor
+		 */
+		return this.each(function()
+		{
+			/* Make a complete and independent copy of the settings object */
+			var oSettings = new classSettings();
+			_aoSettings.push( oSettings );
+			
+			var i=0, iLen;
+			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 ++;
+			}
+			
+			/* Set the table node */
+			oSettings.nTable = this;
+			
+			/* Bind the API functions to the settings, so we can perform actions whenever oSettings is
+			 * available
+			 */
+			oSettings.oApi = _that.oApi;
+			
+			/* Store the features that we have available */
+			if ( typeof oInit != 'undefined' && oInit !== null )
+			{
+				_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, oInit, "asStripClasses" );
+				_fnMap( oSettings, oInit, "fnRowCallback" );
+				_fnMap( oSettings, oInit, "fnHeaderCallback" );
+				_fnMap( oSettings, oInit, "fnFooterCallback" );
+				_fnMap( oSettings, oInit, "fnDrawCallback" );
+				_fnMap( oSettings, oInit, "fnInitComplete" );
+				_fnMap( oSettings, oInit, "fnServerData" );
+				_fnMap( oSettings, oInit, "aaSorting" );
+				_fnMap( oSettings, oInit, "aaSortingFixed" );
+				_fnMap( oSettings, oInit, "sPaginationType" );
+				_fnMap( oSettings, oInit, "sAjaxSource" );
+				_fnMap( oSettings, oInit, "sDom", "sDomPositioning" );
+				_fnMap( oSettings, oInit, "oSearch", "oPreviousSearch" );
+				_fnMap( oSettings, oInit, "aoSearchCols", "aoPreSearchCols" );
+				_fnMap( oSettings, oInit, "iDisplayLength", "_iDisplayLength" );
+				_fnMap( oSettings, oInit, "bJQueryUI", "bJUI" );
+				
+				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.sDomPositioning = 
+							'<"fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix"lfr>'+
+							't'+
+							'<"fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix"ip>';
+					}
+				}
+				
+				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 );
+				}
+				
+				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 = {};
+			}
+				
+			/* 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 );
+			}
+			
+			/* See if we should load columns automatically or use defined ones - a bit messy this... */
+			var nThead = this.getElementsByTagName('thead');
+			var nThs = nThead.length===0 ? null : _fnGetUniqueThs( nThead[0] );
+			var bUseCols = typeof oInit.aoColumns != 'undefined';
+			
+			for ( i=0, iLen=bUseCols ? oInit.aoColumns.length : nThs.length ; i<iLen ; i++ )
+			{
+				var oCol = bUseCols ? oInit.aoColumns[i] : null;
+				var nTh = nThs ? nThs[i] : null;
+				
+				/* Check if we have column visibilty state to restore, and also that the length of the 
+				 * state saved columns matches the currently know number of columns
+				 */
+				if ( typeof oInit.saved_aoColumns != 'undefined' && oInit.saved_aoColumns.length == iLen )
+				{
+					if ( oCol === null )
+					{
+						oCol = {};
+					}
+					oCol.bVisible = oInit.saved_aoColumns[i].bVisible;
+				}
+				
+				_fnAddColumn( oSettings, oCol, nTh );
+			}
+			
+			/* Sanity check the aaSorting array (for user input, and 1.5.3 comptability) */
+			for ( i=0 ; i<oSettings.aaSorting.length ; i++ )
+			{
+				if ( typeof oSettings.aaSorting[i][2] == 'undefined' )
+				{
+					oSettings.aaSorting[i][2] = 0;
+				}
+			}
+			
+			/* Sanity check that there is a thead and tfoot. 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' ) );
+			}
+			
+			/* 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();
+			
+			/* Calculate sizes for columns */
+			if ( oSettings.oFeatures.bAutoWidth )
+			{
+				_fnCalculateColumnWidths( oSettings );
+			}
+			
+			/* 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);

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.dataTables.min.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.dataTables.min.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.dataTables.min.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,538 @@
+/*
+ * File:        jquery.dataTables.min.js
+ * Version:     1.5.4
+ * Author:      Allan Jardine (www.sprymedia.co.uk)
+ * Info:        www.datatables.net
+ * 
+ * Copyright 2008-2009 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.
+ */
+(function($){$.fn.dataTableSettings=[];$.fn.dataTableExt={};var _oExt=$.fn.dataTableExt;
+_oExt.sVersion="1.5.4";_oExt.iApiIndex=0;_oExt.oApi={};_oExt.afnFiltering=[];_oExt.aoFeatures=[];
+_oExt.ofnSearch={};_oExt.afnSortData=[];_oExt.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:"",sSortColumn:"sorting_",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:""};
+_oExt.oJUIClasses={sPagePrevEnabled:"fg-button ui-state-default ui-corner-left",sPagePrevDisabled:"fg-button ui-state-default ui-corner-left ui-state-disabled",sPageNextEnabled:"fg-button ui-state-default ui-corner-right",sPageNextDisabled:"fg-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-state-default",sPageButtonActive:"fg-button ui-state-default ui-state-disabled",sPageButtonStaticDisabled:"fg-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 fg-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"};
+_oExt.oPagination={two_button:{fnInit:function(oSettings,fnCallbackDraw){var nPaging=oSettings.anFeatures.p;
+if(!oSettings.bJUI){oSettings.nPrevious=document.createElement("div");oSettings.nNext=document.createElement("div")
+}else{oSettings.nPrevious=document.createElement("a");oSettings.nNext=document.createElement("a");
+var nNextInner=document.createElement("span");nNextInner.className=oSettings.oClasses.sPageJUINext;
+oSettings.nNext.appendChild(nNextInner);var nPreviousInner=document.createElement("span");
+nPreviousInner.className=oSettings.oClasses.sPageJUIPrev;oSettings.nPrevious.appendChild(nPreviousInner)
+}if(oSettings.sTableId!==""){nPaging.setAttribute("id",oSettings.sTableId+"_paginate");
+oSettings.nPrevious.setAttribute("id",oSettings.sTableId+"_previous");oSettings.nNext.setAttribute("id",oSettings.sTableId+"_next")
+}oSettings.nPrevious.className=oSettings.oClasses.sPagePrevDisabled;oSettings.nNext.className=oSettings.oClasses.sPageNextDisabled;
+oSettings.nPrevious.title=oSettings.oLanguage.oPaginate.sPrevious;oSettings.nNext.title=oSettings.oLanguage.oPaginate.sNext;
+nPaging.appendChild(oSettings.nPrevious);nPaging.appendChild(oSettings.nNext);$(nPaging).insertAfter(oSettings.nTable);
+$(oSettings.nPrevious).click(function(){oSettings._iDisplayStart=oSettings._iDisplayLength>=0?oSettings._iDisplayStart-oSettings._iDisplayLength:0;
+if(oSettings._iDisplayStart<0){oSettings._iDisplayStart=0}fnCallbackDraw(oSettings)
+});$(oSettings.nNext).click(function(){if(oSettings._iDisplayLength>=0){if(oSettings._iDisplayStart+oSettings._iDisplayLength<oSettings.fnRecordsDisplay()){oSettings._iDisplayStart+=oSettings._iDisplayLength
+}}else{oSettings._iDisplayStart=0}fnCallbackDraw(oSettings)});$(oSettings.nPrevious).bind("selectstart",function(){return false
+});$(oSettings.nNext).bind("selectstart",function(){return false})},fnUpdate:function(oSettings,fnCallbackDraw){if(!oSettings.anFeatures.p){return
+}oSettings.nPrevious.className=(oSettings._iDisplayStart===0)?oSettings.oClasses.sPagePrevDisabled:oSettings.oClasses.sPagePrevEnabled;
+oSettings.nNext.className=(oSettings.fnDisplayEnd()==oSettings.fnRecordsDisplay())?oSettings.oClasses.sPageNextDisabled:oSettings.oClasses.sPageNextEnabled
+}},iFullNumbersShowPages:5,full_numbers:{fnInit:function(oSettings,fnCallbackDraw){var nPaging=oSettings.anFeatures.p;
+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;
+if(oSettings.sTableId!==""){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")
+}nPaging.appendChild(nFirst);nPaging.appendChild(nPrevious);nPaging.appendChild(nList);
+nPaging.appendChild(nNext);nPaging.appendChild(nLast);$(nFirst).click(function(){oSettings._iDisplayStart=0;
+fnCallbackDraw(oSettings)});$(nPrevious).click(function(){oSettings._iDisplayStart=oSettings._iDisplayLength>=0?oSettings._iDisplayStart-oSettings._iDisplayLength:0;
+if(oSettings._iDisplayStart<0){oSettings._iDisplayStart=0}fnCallbackDraw(oSettings)
+});$(nNext).click(function(){if(oSettings._iDisplayLength>=0){if(oSettings._iDisplayStart+oSettings._iDisplayLength<oSettings.fnRecordsDisplay()){oSettings._iDisplayStart+=oSettings._iDisplayLength
+}}else{oSettings._iDisplayStart=0}fnCallbackDraw(oSettings)});$(nLast).click(function(){if(oSettings._iDisplayLength>=0){var iPages=parseInt((oSettings.fnRecordsDisplay()-1)/oSettings._iDisplayLength,10)+1;
+oSettings._iDisplayStart=(iPages-1)*oSettings._iDisplayLength}else{oSettings._iDisplayStart=0
+}fnCallbackDraw(oSettings)});$("span",nPaging).bind("mousedown",function(){return false
+});$("span",nPaging).bind("selectstart",function(){return false});oSettings.nPaginateList=nList
+},fnUpdate:function(oSettings,fnCallbackDraw){if(!oSettings.anFeatures.p){return}var iPageCount=jQuery.fn.dataTableExt.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;var iEndButton;var oClasses=oSettings.oClasses;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
+}}}for(var i=iStartButton;i<=iEndButton;i++){if(iCurrentPage!=i){sList+='<span class="'+oClasses.sPageButton+'">'+i+"</span>"
+}else{sList+='<span class="'+oClasses.sPageButtonActive+'">'+i+"</span>"}}oSettings.nPaginateList.innerHTML=sList;
+$("span",oSettings.nPaginateList).bind("mousedown",function(){return false});$("span",oSettings.nPaginateList).bind("selectstart",function(){return false
+});$("span",oSettings.nPaginateList).click(function(){var iTarget=(this.innerHTML*1)-1;
+oSettings._iDisplayStart=iTarget*oSettings._iDisplayLength;fnCallbackDraw(oSettings);
+return false});var nButtons=$("span",oSettings.anFeatures.p);var nStatic=[nButtons[0],nButtons[1],nButtons[nButtons.length-2],nButtons[nButtons.length-1]];
+$(nStatic).removeClass(oClasses.sPageButton+" "+oClasses.sPageButtonActive);if(iCurrentPage==1){nStatic[0].className+=" "+oClasses.sPageButtonStaticDisabled;
+nStatic[1].className+=" "+oClasses.sPageButtonStaticDisabled}else{nStatic[0].className+=" "+oClasses.sPageButton;
+nStatic[1].className+=" "+oClasses.sPageButton}if(iCurrentPage==iPages||oSettings._iDisplayLength==-1){nStatic[2].className+=" "+oClasses.sPageButtonStaticDisabled;
+nStatic[3].className+=" "+oClasses.sPageButtonStaticDisabled}else{nStatic[2].className+=" "+oClasses.sPageButton;
+nStatic[3].className+=" "+oClasses.sPageButton}}}};_oExt.oSort={"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-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-asc":function(a,b){var x=Date.parse(a);
+var y=Date.parse(b);if(isNaN(x)){x=Date.parse("01/01/1970 00:00:00")}if(isNaN(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=Date.parse("01/01/1970 00:00:00")
+}if(isNaN(y)){y=Date.parse("01/01/1970 00:00:00")}return y-x},"numeric-asc":function(a,b){var x=a=="-"?0:a;
+var y=b=="-"?0:b;return x-y},"numeric-desc":function(a,b){var x=a=="-"?0:a;var y=b=="-"?0:b;
+return y-x}};_oExt.aTypes=[function(sData){if(typeof sData=="number"){return"numeric"
+}else{if(typeof sData.charAt!="function"){return null}}var sValidFirstChars="0123456789-";
+var sValidChars="0123456789.";var Char;var bDecimal=false;Char=sData.charAt(0);if(sValidFirstChars.indexOf(Char)==-1){return null
+}for(var i=1;i<sData.length;i++){Char=sData.charAt(i);if(sValidChars.indexOf(Char)==-1){return null
+}if(Char=="."){if(bDecimal){return null}bDecimal=true}}return"numeric"},function(sData){var iParse=Date.parse(sData);
+if(iParse!==null&&!isNaN(iParse)){return"date"}return null}];_oExt._oExternConfig={iNextUnique:0};
+$.fn.dataTable=function(oInit){var _aoSettings=$.fn.dataTableSettings;function classSettings(){this.fnRecordsTotal=function(){if(this.oFeatures.bServerSide){return this._iRecordsTotal
+}else{return this.aiDisplayMaster.length}};this.fnRecordsDisplay=function(){if(this.oFeatures.bServerSide){return this._iRecordsDisplay
+}else{return this.aiDisplay.length}};this.fnDisplayEnd=function(){if(this.oFeatures.bServerSide){return this._iDisplayStart+this.aiDisplay.length
+}else{return this._iDisplayEnd}};this.sInstance=null;this.oFeatures={bPaginate:true,bLengthChange:true,bFilter:true,bSort:true,bInfo:true,bAutoWidth:true,bProcessing:false,bSortClasses:true,bStateSave:false,bServerSide:false};
+this.anFeatures=[];this.oLanguage={sProcessing:"Processing...",sLengthMenu:"Show _MENU_ entries",sZeroRecords:"No matching records found",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"}};
+this.aoData=[];this.aiDisplay=[];this.aiDisplayMaster=[];this.aoColumns=[];this.iNextId=0;
+this.asDataSearch=[];this.oPreviousSearch={sSearch:"",bEscapeRegex:true};this.aoPreSearchCols=[];
+this.aaSorting=[[0,"asc",0]];this.aaSortingFixed=null;this.asStripClasses=[];this.fnRowCallback=null;
+this.fnHeaderCallback=null;this.fnFooterCallback=null;this.fnDrawCallback=null;this.fnInitComplete=null;
+this.sTableId="";this.nTable=null;this.iDefaultSortIndex=0;this.bInitialised=false;
+this.aoOpenRows=[];this.sDomPositioning="lfrtip";this.sPaginationType="two_button";
+this.iCookieDuration=60*60*2;this.sAjaxSource=null;this.bAjaxDataGet=true;this.fnServerData=$.getJSON;
+this.iServerDraw=0;this._iDisplayLength=10;this._iDisplayStart=0;this._iDisplayEnd=10;
+this._iRecordsTotal=0;this._iRecordsDisplay=0;this.bJUI=false;this.oClasses=_oExt.oStdClasses;
+this.bFiltered=false;this.bSorted=false}this.oApi={};this.fnDraw=function(bComplete){var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
+if(typeof bComplete!="undefined"&&bComplete===false){_fnCalculateEnd(oSettings);_fnDraw(oSettings)
+}else{_fnReDraw(oSettings)}};this.fnFilter=function(sInput,iColumn,bEscapeRegex){var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
+if(typeof bEscapeRegex=="undefined"){bEscapeRegex=true}if(typeof iColumn=="undefined"||iColumn===null){_fnFilterComplete(oSettings,{sSearch:sInput,bEscapeRegex:bEscapeRegex},1)
+}else{oSettings.aoPreSearchCols[iColumn].sSearch=sInput;oSettings.aoPreSearchCols[iColumn].bEscapeRegex=bEscapeRegex;
+_fnFilterComplete(oSettings,oSettings.oPreviousSearch,1)}};this.fnSettings=function(nNode){return _fnSettingsFromNode(this[_oExt.iApiIndex])
+};this.fnSort=function(aaSort){var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
+oSettings.aaSorting=aaSort;_fnSort(oSettings)};this.fnAddData=function(mData,bRedraw){var aiReturn=[];
+var iTest;if(typeof bRedraw=="undefined"){bRedraw=true}var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
+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();
+_fnBuildSearchArray(oSettings,1);if(bRedraw){_fnReDraw(oSettings)}return aiReturn
+};this.fnDeleteRow=function(iAODataIndex,fnCallBack,bNullRow){var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
+var i;for(i=0;i<oSettings.aiDisplayMaster.length;i++){if(oSettings.aiDisplayMaster[i]==iAODataIndex){oSettings.aiDisplayMaster.splice(i,1);
+break}}for(i=0;i<oSettings.aiDisplay.length;i++){if(oSettings.aiDisplay[i]==iAODataIndex){oSettings.aiDisplay.splice(i,1);
+break}}_fnBuildSearchArray(oSettings,1);if(typeof fnCallBack=="function"){fnCallBack.call(this)
+}if(oSettings._iDisplayStart>=oSettings.aiDisplay.length){oSettings._iDisplayStart-=oSettings._iDisplayLength;
+if(oSettings._iDisplayStart<0){oSettings._iDisplayStart=0}}_fnCalculateEnd(oSettings);
+_fnDraw(oSettings);var aData=oSettings.aoData[iAODataIndex]._aData.slice();if(typeof bNullRow!="undefined"&&bNullRow===true){oSettings.aoData[iAODataIndex]=null
+}return aData};this.fnClearTable=function(bRedraw){var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
+_fnClearTable(oSettings);if(typeof bRedraw=="undefined"||bRedraw){_fnDraw(oSettings)
+}};this.fnOpen=function(nTr,sHtml,sClass){var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
+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;var nTrs=$("tbody tr",oSettings.nTable);if($.inArray(nTr,nTrs)!=-1){$(nNewRow).insertAfter(nTr)
+}if(!oSettings.oFeatures.bServerSide){oSettings.aoOpenRows.push({nTr:nNewRow,nParent:nTr})
+}};this.fnClose=function(nTr){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){nTrParent.removeChild(oSettings.aoOpenRows[i].nTr)}oSettings.aoOpenRows.splice(i,1);
+return 0}}return 1};this.fnGetData=function(iRow){var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
+if(typeof iRow!="undefined"){return oSettings.aoData[iRow]._aData}return _fnGetDataMaster(oSettings)
+};this.fnGetNodes=function(iRow){var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
+if(typeof iRow!="undefined"){return oSettings.aoData[iRow].nTr}return _fnGetTrNodes(oSettings)
+};this.fnGetPosition=function(nNode){var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
+var i;if(nNode.nodeName=="TR"){for(i=0;i<oSettings.aoData.length;i++){if(oSettings.aoData[i]!==null&&oSettings.aoData[i].nTr==nNode){return i
+}}}else{if(nNode.nodeName=="TD"){for(i=0;i<oSettings.aoData.length;i++){var iCorrector=0;
+for(var j=0;j<oSettings.aoColumns.length;j++){if(oSettings.aoColumns[j].bVisible){if(oSettings.aoData[i]!==null&&oSettings.aoData[i].nTr.getElementsByTagName("td")[j-iCorrector]==nNode){return[i,j-iCorrector,j]
+}}else{iCorrector++}}}}}return null};this.fnUpdate=function(mData,iRow,iColumn,bRedraw){var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
+var iVisibleColumn;var sDisplay;if(typeof bRedraw=="undefined"){bRedraw=true}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{if(mData.length!=oSettings.aoColumns.length){alert("Warning: 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
+}}}_fnBuildSearchArray(oSettings,1);if(bRedraw){_fnReDraw(oSettings)}return 0};this.fnSetColumnVis=function(iCol,bShow){var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
+var i,iLen;var iColumns=oSettings.aoColumns.length;var nTd;if(oSettings.aoColumns[iCol].bVisible==bShow){return
+}var nTrHead=$("thead:eq(0)>tr",oSettings.nTable)[0];var nTrFoot=$("tfoot:eq(0)>tr",oSettings.nTable)[0];
+var anTheadTh=[];var anTfootTh=[];for(i=0;i<iColumns;i++){anTheadTh.push(oSettings.aoColumns[i].nTh);
+anTfootTh.push(oSettings.aoColumns[i].nTf)}if(bShow){var iInsert=0;for(i=0;i<iCol;
+i++){if(oSettings.aoColumns[i].bVisible){iInsert++}}if(iInsert>=_fnVisbleColumns(oSettings)){nTrHead.appendChild(anTheadTh[iCol]);
+if(nTrFoot){nTrFoot.appendChild(anTfootTh[iCol])}for(i=0,iLen=oSettings.aoData.length;
+i<iLen;i++){nTd=oSettings.aoData[i]._anHidden[iCol];oSettings.aoData[i].nTr.appendChild(nTd)
+}}else{var iBefore;for(i=iCol;i<iColumns;i++){iBefore=_fnColumnIndexToVisible(oSettings,i);
+if(iBefore!==null){break}}nTrHead.insertBefore(anTheadTh[iCol],nTrHead.getElementsByTagName("th")[iBefore]);
+if(nTrFoot){nTrFoot.insertBefore(anTfootTh[iCol],nTrFoot.getElementsByTagName("th")[iBefore])
+}for(i=0,iLen=oSettings.aoData.length;i<iLen;i++){nTd=oSettings.aoData[i]._anHidden[iCol];
+oSettings.aoData[i].nTr.insertBefore(nTd,oSettings.aoData[i].nTr.getElementsByTagName("td")[iBefore])
+}}oSettings.aoColumns[iCol].bVisible=true}else{nTrHead.removeChild(anTheadTh[iCol]);
+if(nTrFoot){nTrFoot.removeChild(anTfootTh[iCol])}var iVisCol=_fnColumnIndexToVisible(oSettings,iCol);
+for(i=0,iLen=oSettings.aoData.length;i<iLen;i++){nTd=oSettings.aoData[i].nTr.getElementsByTagName("td")[iVisCol];
+oSettings.aoData[i]._anHidden[iCol]=nTd;nTd.parentNode.removeChild(nTd)}oSettings.aoColumns[iCol].bVisible=false
+}for(i=0,iLen=oSettings.aoOpenRows.length;i<iLen;i++){oSettings.aoOpenRows[i].nTr.colSpan=_fnVisbleColumns(oSettings)
+}_fnSaveState(oSettings)};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){this[sFunc]=_fnExternApiFunc(sFunc)
+}}function _fnInitalise(oSettings){if(oSettings.bInitialised===false){setTimeout(function(){_fnInitalise(oSettings)
+},200);return}_fnAddOptionsHtml(oSettings);_fnDrawHead(oSettings);if(oSettings.oFeatures.bSort){_fnSort(oSettings,false);
+_fnSortingClasses(oSettings)}else{oSettings.aiDisplay=oSettings.aiDisplayMaster.slice();
+_fnCalculateEnd(oSettings);_fnDraw(oSettings)}if(oSettings.sAjaxSource!==null&&!oSettings.oFeatures.bServerSide){_fnProcessingDisplay(oSettings,true);
+$.getJSON(oSettings.sAjaxSource,null,function(json){for(var i=0;i<json.aaData.length;
+i++){_fnAddData(oSettings,json.aaData[i])}oSettings.iInitDisplayStart=oSettings._iDisplayStart;
+if(oSettings.oFeatures.bSort){_fnSort(oSettings)}else{oSettings.aiDisplay=oSettings.aiDisplayMaster.slice();
+_fnCalculateEnd(oSettings);_fnDraw(oSettings)}_fnProcessingDisplay(oSettings,false);
+if(typeof oSettings.fnInitComplete=="function"){oSettings.fnInitComplete(oSettings,json)
+}});return}if(typeof oSettings.fnInitComplete=="function"){oSettings.fnInitComplete(oSettings)
+}if(!oSettings.oFeatures.bServerSide){_fnProcessingDisplay(oSettings,false)}}function _fnLanguageProcess(oSettings,oLanguage,bInit){_fnMap(oSettings.oLanguage,oLanguage,"sProcessing");
+_fnMap(oSettings.oLanguage,oLanguage,"sLengthMenu");_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")}if(bInit){_fnInitalise(oSettings)
+}}function _fnAddColumn(oSettings,oOptions,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,sClass:null,fnRender:null,bUseRendered:true,iDataSort:oSettings.aoColumns.length-1,sSortDataType:"std",nTh:nTh?nTh:document.createElement("th"),nTf:null};
+var iLength=oSettings.aoColumns.length-1;if(typeof oOptions!="undefined"&&oOptions!==null){var oCol=oSettings.aoColumns[iLength];
+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,"sClass");_fnMap(oCol,oOptions,"fnRender");_fnMap(oCol,oOptions,"bUseRendered");
+_fnMap(oCol,oOptions,"iDataSort");_fnMap(oCol,oOptions,"asSorting");_fnMap(oCol,oOptions,"sSortDataType");
+if(typeof oOptions.asSorting!="undefined"){if($.inArray("asc",oOptions.asSorting)==-1&&$.inArray("desc",oOptions.asSorting)==-1){oCol.sSortingClass=oSettings.oClasses.sSortableNone;
+oCol.sSortingClassJUI=""}else{if($.inArray("asc",oOptions.asSorting)!=-1&&$.inArray("desc",oOptions.asSorting)==-1){oCol.sSortingClass=oSettings.oClasses.sSortableAsc;
+oCol.sSortingClassJUI=oSettings.oClasses.sSortJUIAscAllowed}else{if($.inArray("asc",oOptions.asSorting)==-1&&$.inArray("desc",oOptions.asSorting)!=-1){oCol.sSortingClass=oSettings.oClasses.sSortableDesc;
+oCol.sSortingClassJUI=oSettings.oClasses.sSortJUIDescAllowed}}}}}if(typeof oSettings.aoPreSearchCols[iLength]=="undefined"||oSettings.aoPreSearchCols[iLength]===null){oSettings.aoPreSearchCols[iLength]={sSearch:"",bEscapeRegex:true}
+}else{if(typeof oSettings.aoPreSearchCols[iLength].bEscapeRegex=="undefined"){oSettings.aoPreSearchCols[iLength].bEscapeRegex=true
+}}}function _fnAddData(oSettings,aData){if(aData.length!=oSettings.aoColumns.length){alert("Warning - added data does not match known number of columns");
+return -1}var iThisIndex=oSettings.aoData.length;oSettings.aoData.push({_iId:oSettings.iNextId++,_aData:aData.slice(),nTr:document.createElement("tr"),_anHidden:[]});
+var nTd;for(var i=0;i<aData.length;i++){nTd=document.createElement("td");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){oSettings.aoData[iThisIndex]._aData[i]=sRendered
+}}else{nTd.innerHTML=aData[i]}if(oSettings.aoColumns[i].sClass!==null){nTd.className=oSettings.aoColumns[i].sClass
+}if(oSettings.aoColumns[i]._bAutoType&&oSettings.aoColumns[i].sType!="string"){if(oSettings.aoColumns[i].sType===null){oSettings.aoColumns[i].sType=_fnDetectType(aData[i])
+}else{if(oSettings.aoColumns[i].sType=="date"||oSettings.aoColumns[i].sType=="numeric"){oSettings.aoColumns[i].sType=_fnDetectType(aData[i])
+}}}if(oSettings.aoColumns[i].bVisible){oSettings.aoData[iThisIndex].nTr.appendChild(nTd)
+}else{oSettings.aoData[iThisIndex]._anHidden[i]=nTd}}oSettings.aiDisplayMaster.push(iThisIndex);
+return iThisIndex}function _fnGatherData(oSettings){var iLoop;var i,j;if(oSettings.sAjaxSource===null){$("tbody:eq(0)>tr",oSettings.nTable).each(function(){var iThisIndex=oSettings.aoData.length;
+oSettings.aoData.push({_iId:oSettings.iNextId++,_aData:[],nTr:this,_anHidden:[]});
+oSettings.aiDisplayMaster.push(iThisIndex);var aLocalData=oSettings.aoData[iThisIndex]._aData;
+$("td",this).each(function(i){aLocalData[i]=this.innerHTML})})}var iCorrector=0;for(i=0;
+i<oSettings.aoColumns.length;i++){if(oSettings.aoColumns[i].sTitle===null){oSettings.aoColumns[i].sTitle=oSettings.aoColumns[i].nTh.innerHTML
+}var bAutoType=oSettings.aoColumns[i]._bAutoType;var bRender=typeof oSettings.aoColumns[i].fnRender=="function";
+var bClass=oSettings.aoColumns[i].sClass!==null;var bVisible=oSettings.aoColumns[i].bVisible;
+if(bAutoType||bRender||bClass||!bVisible){iLoop=oSettings.aoData.length;for(j=0;j<iLoop;
+j++){var nCellNode=oSettings.aoData[j].nTr.getElementsByTagName("td")[i-iCorrector];
+if(bAutoType){if(oSettings.aoColumns[i].sType===null){oSettings.aoColumns[i].sType=_fnDetectType(oSettings.aoData[j]._aData[i])
+}else{if(oSettings.aoColumns[i].sType=="date"||oSettings.aoColumns[i].sType=="numeric"){oSettings.aoColumns[i].sType=_fnDetectType(oSettings.aoData[j]._aData[i])
+}}}if(bRender){var sRendered=oSettings.aoColumns[i].fnRender({iDataRow:j,iDataColumn:i,aData:oSettings.aoData[j]._aData,oSettings:oSettings});
+nCellNode.innerHTML=sRendered;if(oSettings.aoColumns[i].bUseRendered){oSettings.aoData[j]._aData[i]=sRendered
+}}if(bClass){nCellNode.className+=" "+oSettings.aoColumns[i].sClass}if(!bVisible){oSettings.aoData[j]._anHidden[i]=nCellNode;
+nCellNode.parentNode.removeChild(nCellNode)}}if(!bVisible){iCorrector++}}}}function _fnDrawHead(oSettings){var i,nTh,iLen;
+var iThs=oSettings.nTable.getElementsByTagName("thead")[0].getElementsByTagName("th").length;
+var iCorrector=0;if(iThs!==0){for(i=0,iLen=oSettings.aoColumns.length;i<iLen;i++){nTh=oSettings.aoColumns[i].nTh;
+if(oSettings.aoColumns[i].bVisible){if(oSettings.aoColumns[i].sWidth!==null){nTh.style.width=oSettings.aoColumns[i].sWidth
+}if(oSettings.aoColumns[i].sTitle!=nTh.innerHTML){nTh.innerHTML=oSettings.aoColumns[i].sTitle
+}}else{nTh.parentNode.removeChild(nTh);iCorrector++}}}else{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].bVisible){if(oSettings.aoColumns[i].sClass!==null){nTh.className=oSettings.aoColumns[i].sClass
+}if(oSettings.aoColumns[i].sWidth!==null){nTh.style.width=oSettings.aoColumns[i].sWidth
+}nTr.appendChild(nTh)}}$("thead:eq(0)",oSettings.nTable).html("")[0].appendChild(nTr)
+}if(oSettings.bJUI){for(i=0,iLen=oSettings.aoColumns.length;i<iLen;i++){oSettings.aoColumns[i].nTh.insertBefore(document.createElement("span"),oSettings.aoColumns[i].nTh.firstChild)
+}}if(oSettings.oFeatures.bSort){for(i=0;i<oSettings.aoColumns.length;i++){if(oSettings.aoColumns[i].bSortable===false){$(oSettings.aoColumns[i].nTh).addClass(oSettings.oClasses.sSortableNone);
+continue}$(oSettings.aoColumns[i].nTh).click(function(e){var iDataIndex;for(var i=0;
+i<oSettings.aoColumns.length;i++){if(oSettings.aoColumns[i].nTh==this){iDataIndex=i;
+break}}if(oSettings.aoColumns[iDataIndex].bSortable===false){return}var fnInnerSorting=function(){var iColumn,iNextSort;
+if(e.shiftKey){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"){oSettings.aaSorting.splice(i,1)
+}else{oSettings.aaSorting[i][1]=oSettings.aoColumns[iColumn].asSorting[iNextSort];
+oSettings.aaSorting[i][2]=iNextSort}break}}if(bFound===false){oSettings.aaSorting.push([iDataIndex,oSettings.aoColumns[iDataIndex].asSorting[0],0])
+}}else{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])
+}}_fnSort(oSettings)};if(!oSettings.oFeatures.bProcessing){fnInnerSorting()}else{_fnProcessingDisplay(oSettings,true);
+setTimeout(function(){fnInnerSorting();if(!oSettings.oFeatures.bServerSide){_fnProcessingDisplay(oSettings,false)
+}},0)}})}$("thead:eq(0) th",oSettings.nTable).mousedown(function(e){if(e.shiftKey){this.onselectstart=function(){return false
+};return false}})}if(oSettings.oFeatures.bAutoWidth&&oSettings.nTable.offsetWidth!==0){oSettings.nTable.style.width=oSettings.nTable.offsetWidth+"px"
+}var nTfoot=oSettings.nTable.getElementsByTagName("tfoot");if(nTfoot.length!==0){iCorrector=0;
+var nTfs=nTfoot[0].getElementsByTagName("th");for(i=0,iLen=nTfs.length;i<iLen;i++){oSettings.aoColumns[i].nTf=nTfs[i-iCorrector];
+if(!oSettings.aoColumns[i].bVisible){nTfs[i-iCorrector].parentNode.removeChild(nTfs[i-iCorrector]);
+iCorrector++}}}}function _fnDraw(oSettings){var i;var anRows=[];var iRowCount=0;var bRowError=false;
+var iStrips=oSettings.asStripClasses.length;var iOpenRows=oSettings.aoOpenRows.length;
+if(oSettings.oFeatures.bServerSide&&!_fnAjaxUpdate(oSettings)){return}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 nRow=oSettings.aoData[oSettings.aiDisplay[j]].nTr;
+if(iStrips!==0){$(nRow).removeClass(oSettings.asStripClasses.join(" "));$(nRow).addClass(oSettings.asStripClasses[iRowCount%iStrips])
+}if(typeof oSettings.fnRowCallback=="function"){nRow=oSettings.fnRowCallback(nRow,oSettings.aoData[oSettings.aiDisplay[j]]._aData,iRowCount,j);
+if(!nRow&&!bRowError){alert("Error: A node was not returned by fnRowCallback");bRowError=true
+}}anRows.push(nRow);iRowCount++;if(iOpenRows!==0){for(var k=0;k<iOpenRows;k++){if(nRow==oSettings.aoOpenRows[k].nParent){anRows.push(oSettings.aoOpenRows[k].nTr)
+}}}}}else{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=oSettings.aoColumns.length;
+nTd.className=oSettings.oClasses.sRowEmpty;nTd.innerHTML=oSettings.oLanguage.sZeroRecords;
+anRows[iRowCount].appendChild(nTd)}if(typeof oSettings.fnHeaderCallback=="function"){oSettings.fnHeaderCallback($("thead:eq(0)>tr",oSettings.nTable)[0],_fnGetDataMaster(oSettings),oSettings._iDisplayStart,oSettings.fnDisplayEnd(),oSettings.aiDisplay)
+}if(typeof oSettings.fnFooterCallback=="function"){oSettings.fnFooterCallback($("tfoot:eq(0)>tr",oSettings.nTable)[0],_fnGetDataMaster(oSettings),oSettings._iDisplayStart,oSettings.fnDisplayEnd(),oSettings.aiDisplay)
+}var nTrs=$("tbody:eq(0)>tr",oSettings.nTable);for(i=0;i<nTrs.length;i++){nTrs[i].parentNode.removeChild(nTrs[i])
+}var nBody=$("tbody:eq(0)",oSettings.nTable);if(nBody[0]){for(i=0;i<anRows.length;
+i++){nBody[0].appendChild(anRows[i])}}if(oSettings.oFeatures.bPaginate){_oExt.oPagination[oSettings.sPaginationType].fnUpdate(oSettings,function(oSettings){_fnCalculateEnd(oSettings);
+_fnDraw(oSettings)})}if(oSettings.oFeatures.bInfo&&oSettings.anFeatures.i){if(oSettings.fnRecordsDisplay()===0&&oSettings.fnRecordsDisplay()==oSettings.fnRecordsTotal()){oSettings.anFeatures.i.innerHTML=oSettings.oLanguage.sInfoEmpty+oSettings.oLanguage.sInfoPostFix
+}else{if(oSettings.fnRecordsDisplay()===0){oSettings.anFeatures.i.innerHTML=oSettings.oLanguage.sInfoEmpty+" "+oSettings.oLanguage.sInfoFiltered.replace("_MAX_",oSettings.fnRecordsTotal())+oSettings.oLanguage.sInfoPostFix
+}else{if(oSettings.fnRecordsDisplay()==oSettings.fnRecordsTotal()){oSettings.anFeatures.i.innerHTML=oSettings.oLanguage.sInfo.replace("_START_",oSettings._iDisplayStart+1).replace("_END_",oSettings.fnDisplayEnd()).replace("_TOTAL_",oSettings.fnRecordsDisplay())+oSettings.oLanguage.sInfoPostFix
+}else{oSettings.anFeatures.i.innerHTML=oSettings.oLanguage.sInfo.replace("_START_",oSettings._iDisplayStart+1).replace("_END_",oSettings.fnDisplayEnd()).replace("_TOTAL_",oSettings.fnRecordsDisplay())+" "+oSettings.oLanguage.sInfoFiltered.replace("_MAX_",oSettings.fnRecordsTotal())+oSettings.oLanguage.sInfoPostFix
+}}}}if(oSettings.oFeatures.bServerSide&&oSettings.oFeatures.bSort){_fnSortingClasses(oSettings)
+}_fnSaveState(oSettings);if(typeof oSettings.fnDrawCallback=="function"){oSettings.fnDrawCallback(oSettings)
+}oSettings.bSorted=false;oSettings.bFiltered=false}function _fnReDraw(oSettings){if(oSettings.oFeatures.bSort){_fnSort(oSettings,oSettings.oPreviousSearch)
+}else{if(oSettings.oFeatures.bFilter){_fnFilterComplete(oSettings,oSettings.oPreviousSearch)
+}else{_fnCalculateEnd(oSettings);_fnDraw(oSettings)}}}function _fnAjaxUpdate(oSettings){if(oSettings.bAjaxDataGet){_fnProcessingDisplay(oSettings,true);
+var iColumns=oSettings.aoColumns.length;var aoData=[];var i;oSettings.iServerDraw++;
+aoData.push({name:"sEcho",value:oSettings.iServerDraw});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});
+if(oSettings.oFeatures.bFilter!==false){aoData.push({name:"sSearch",value:oSettings.oPreviousSearch.sSearch});
+aoData.push({name:"bEscapeRegex",value:oSettings.oPreviousSearch.bEscapeRegex});for(i=0;
+i<iColumns;i++){aoData.push({name:"sSearch_"+i,value:oSettings.aoPreSearchCols[i].sSearch});
+aoData.push({name:"bEscapeRegex_"+i,value:oSettings.aoPreSearchCols[i].bEscapeRegex})
+}}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:"iSortDir_"+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:"iSortDir_"+(i+iFixed),value:oSettings.aaSorting[i][1]})
+}}oSettings.fnServerData(oSettings.sAjaxSource,aoData,function(json){_fnAjaxUpdateDraw(oSettings,json)
+});return false}else{return true}}function _fnAjaxUpdateDraw(oSettings,json){if(typeof json.sEcho!="undefined"){if(json.sEcho*1<oSettings.iServerDraw){return
+}else{oSettings.iServerDraw=json.sEcho*1}}_fnClearTable(oSettings);oSettings._iRecordsTotal=json.iTotalRecords;
+oSettings._iRecordsDisplay=json.iTotalDisplayRecords;var sOrdering=_fnColumnOrdering(oSettings);
+var bReOrder=(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){var aData=[];for(var j=0,jLen=oSettings.aoColumns.length;
+j<jLen;j++){aData.push(json.aaData[i][aiIndex[j]])}_fnAddData(oSettings,aData)}else{_fnAddData(oSettings,json.aaData[i])
+}}oSettings.aiDisplay=oSettings.aiDisplayMaster.slice();oSettings.bAjaxDataGet=false;
+_fnDraw(oSettings);oSettings.bAjaxDataGet=true;_fnProcessingDisplay(oSettings,false)
+}function _fnAddOptionsHtml(oSettings){var nHolding=document.createElement("div");
+oSettings.nTable.parentNode.insertBefore(nHolding,oSettings.nTable);var nWrapper=document.createElement("div");
+nWrapper.className=oSettings.oClasses.sWrapper;if(oSettings.sTableId!==""){nWrapper.setAttribute("id",oSettings.sTableId+"_wrapper")
+}var nInsertNode=nWrapper;var sDom=oSettings.sDomPositioning.split("");var nTmp;for(var i=0;
+i<sDom.length;i++){var cOption=sDom[i];if(cOption=="<"){var nNewNode=document.createElement("div");
+var cNext=sDom[i+1];if(cNext=="'"||cNext=='"'){var sClass="";var j=2;while(sDom[i+j]!=cNext){sClass+=sDom[i+j];
+j++}nNewNode.className=sClass;i+=j}nInsertNode.appendChild(nNewNode);nInsertNode=nNewNode
+}else{if(cOption==">"){nInsertNode=nInsertNode.parentNode}else{if(cOption=="l"&&oSettings.oFeatures.bPaginate&&oSettings.oFeatures.bLengthChange){nTmp=_fnFeatureHtmlLength(oSettings);
+oSettings.anFeatures[cOption]=nTmp;nInsertNode.appendChild(nTmp)}else{if(cOption=="f"&&oSettings.oFeatures.bFilter){nTmp=_fnFeatureHtmlFilter(oSettings);
+oSettings.anFeatures[cOption]=nTmp;nInsertNode.appendChild(nTmp)}else{if(cOption=="r"&&oSettings.oFeatures.bProcessing){nTmp=_fnFeatureHtmlProcessing(oSettings);
+oSettings.anFeatures[cOption]=nTmp;nInsertNode.appendChild(nTmp)}else{if(cOption=="t"){oSettings.anFeatures[cOption]=oSettings.nTable;
+nInsertNode.appendChild(oSettings.nTable)}else{if(cOption=="i"&&oSettings.oFeatures.bInfo){nTmp=_fnFeatureHtmlInfo(oSettings);
+oSettings.anFeatures[cOption]=nTmp;nInsertNode.appendChild(nTmp)}else{if(cOption=="p"&&oSettings.oFeatures.bPaginate){nTmp=_fnFeatureHtmlPaginate(oSettings);
+oSettings.anFeatures[cOption]=nTmp;nInsertNode.appendChild(nTmp)}else{if(_oExt.aoFeatures.length!==0){var aoFeatures=_oExt.aoFeatures;
+for(var k=0,kLen=aoFeatures.length;k<kLen;k++){if(cOption==aoFeatures[k].cFeature){nTmp=aoFeatures[k].fnInit(oSettings);
+oSettings.anFeatures[cOption]=nTmp;nInsertNode.appendChild(nTmp);break}}}}}}}}}}}}nHolding.parentNode.replaceChild(nWrapper,nHolding)
+}function _fnFeatureHtmlFilter(oSettings){var nFilter=document.createElement("div");
+if(oSettings.sTableId!==""){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.keyup(function(e){_fnFilterComplete(oSettings,{sSearch:this.value,bEscapeRegex:oSettings.oPreviousSearch.bEscapeRegex})
+});jqFilter.keypress(function(e){if(e.keyCode==13){return false}});return nFilter
+}function _fnFeatureHtmlInfo(oSettings){var nInfo=document.createElement("div");if(oSettings.sTableId!==""){nInfo.setAttribute("id",oSettings.sTableId+"_info")
+}nInfo.className=oSettings.oClasses.sInfo;return nInfo}function _fnFeatureHtmlPaginate(oSettings){var nPaginate=document.createElement("div");
+nPaginate.className=oSettings.oClasses.sPaging+oSettings.sPaginationType;oSettings.anFeatures.p=nPaginate;
+_oExt.oPagination[oSettings.sPaginationType].fnInit(oSettings,function(oSettings){_fnCalculateEnd(oSettings);
+_fnDraw(oSettings)});return nPaginate}function _fnFeatureHtmlLength(oSettings){var sName=(oSettings.sTableId==="")?"":'name="'+oSettings.sTableId+'_length"';
+var sStdMenu='<select size="1" '+sName+'><option value="10">10</option><option value="25">25</option><option value="50">50</option><option value="100">100</option></select>';
+var nLength=document.createElement("div");if(oSettings.sTableId!==""){nLength.setAttribute("id",oSettings.sTableId+"_length")
+}nLength.className=oSettings.oClasses.sLength;nLength.innerHTML=oSettings.oLanguage.sLengthMenu.replace("_MENU_",sStdMenu);
+$('select option[value="'+oSettings._iDisplayLength+'"]',nLength).attr("selected",true);
+$("select",nLength).change(function(e){oSettings._iDisplayLength=parseInt($(this).val(),10);
+_fnCalculateEnd(oSettings);if(oSettings._iDisplayEnd==oSettings.aiDisplay.length){oSettings._iDisplayStart=oSettings._iDisplayEnd-oSettings._iDisplayLength;
+if(oSettings._iDisplayStart<0){oSettings._iDisplayStart=0}}if(oSettings._iDisplayLength==-1){oSettings._iDisplayStart=0
+}_fnDraw(oSettings)});return nLength}function _fnFeatureHtmlProcessing(oSettings){var nProcessing=document.createElement("div");
+if(oSettings.sTableId!==""){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(oSettings,bShow){if(oSettings.oFeatures.bProcessing){oSettings.anFeatures.r.style.visibility=bShow?"visible":"hidden"
+}}function _fnFilterComplete(oSettings,oInput,iForce){_fnFilter(oSettings,oInput.sSearch,iForce,oInput.bEscapeRegex);
+for(var i=0;i<oSettings.aoPreSearchCols.length;i++){_fnFilterColumn(oSettings,oSettings.aoPreSearchCols[i].sSearch,i,oSettings.aoPreSearchCols[i].bEscapeRegex)
+}if(_oExt.afnFiltering.length!==0){_fnFilterCustom(oSettings)}oSettings.bFiltered=true;
+if(typeof oSettings.iInitDisplayStart!="undefined"&&oSettings.iInitDisplayStart!=-1){oSettings._iDisplayStart=oSettings.iInitDisplayStart;
+oSettings.iInitDisplayStart=-1}else{oSettings._iDisplayStart=0}_fnCalculateEnd(oSettings);
+_fnDraw(oSettings);_fnBuildSearchArray(oSettings,0)}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];if(!afnFilters[i](oSettings,oSettings.aoData[iDisIndex]._aData,iDisIndex)){oSettings.aiDisplay.splice(j-iCorrector,1);
+iCorrector++}}}}function _fnFilterColumn(oSettings,sInput,iColumn,bEscapeRegex){if(sInput===""){return
+}var iIndexCorrector=0;var sRegexMatch=bEscapeRegex?_fnEscapeRegex(sInput):sInput;
+var rpSearch=new RegExp(sRegexMatch,"i");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(oSettings,sInput,iForce,bEscapeRegex){var i;
+if(typeof iForce=="undefined"||iForce===null){iForce=0}if(_oExt.afnFiltering.length!==0){iForce=1
+}var asSearch=bEscapeRegex?_fnEscapeRegex(sInput).split(" "):sInput.split(" ");var sRegExpString="^(?=.*?"+asSearch.join(")(?=.*?")+").*$";
+var rpSearch=new RegExp(sRegExpString,"i");if(sInput.length<=0){oSettings.aiDisplay.splice(0,oSettings.aiDisplay.length);
+oSettings.aiDisplay=oSettings.aiDisplayMaster.slice()}else{if(oSettings.aiDisplay.length==oSettings.aiDisplayMaster.length||oSettings.oPreviousSearch.sSearch.length>sInput.length||iForce==1||sInput.indexOf(oSettings.oPreviousSearch.sSearch)!==0){oSettings.aiDisplay.splice(0,oSettings.aiDisplay.length);
+_fnBuildSearchArray(oSettings,1);for(i=0;i<oSettings.aiDisplayMaster.length;i++){if(rpSearch.test(oSettings.asDataSearch[i])){oSettings.aiDisplay.push(oSettings.aiDisplayMaster[i])
+}}}else{var iIndexCorrector=0;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.bEscapeRegex=bEscapeRegex
+}function _fnSort(oSettings,bApplyClasses){var aaSort=[];var oSort=_oExt.oSort;var aoData=oSettings.aoData;
+var iDataSort;var iDataType;var i,j,jLen;if(oSettings.aaSorting.length!==0||oSettings.aaSortingFixed!==null){if(oSettings.aaSortingFixed!==null){aaSort=oSettings.aaSortingFixed.concat(oSettings.aaSorting)
+}else{aaSort=oSettings.aaSorting.slice()}for(i=0;i<aaSort.length;i++){var iColumn=aaSort[i][0];
+var sDataType=oSettings.aoColumns[iColumn].sSortDataType;if(typeof _oExt.afnSortData[sDataType]!="undefined"){var iCorrector=0;
+var aData=_oExt.afnSortData[sDataType](oSettings,iColumn);for(j=0,jLen=aoData.length;
+j<jLen;j++){if(aoData[j]!=null){aoData[j]._aData[iColumn]=aData[iCorrector];iCorrector++
+}}}}if(!window.runtime){var fnLocalSorting;var sDynamicSort="fnLocalSorting = function(a,b){var iTest;";
+for(i=0;i<aaSort.length-1;i++){iDataSort=oSettings.aoColumns[aaSort[i][0]].iDataSort;
+iDataType=oSettings.aoColumns[iDataSort].sType;sDynamicSort+="iTest = oSort['"+iDataType+"-"+aaSort[i][1]+"']( aoData[a]._aData["+iDataSort+"], aoData[b]._aData["+iDataSort+"] ); if ( iTest === 0 )"
+}iDataSort=oSettings.aoColumns[aaSort[aaSort.length-1][0]].iDataSort;iDataType=oSettings.aoColumns[iDataSort].sType;
+sDynamicSort+="iTest = oSort['"+iDataType+"-"+aaSort[aaSort.length-1][1]+"']( aoData[a]._aData["+iDataSort+"], aoData[b]._aData["+iDataSort+"] ); return iTest;}";
+eval(sDynamicSort);oSettings.aiDisplayMaster.sort(fnLocalSorting)}else{var aAirSort=[];
+var iLen=aaSort.length;for(i=0;i<iLen;i++){iDataSort=oSettings.aoColumns[aaSort[i][0]].iDataSort;
+aAirSort.push([iDataSort,oSettings.aoColumns[iDataSort].sType+"-"+aaSort[i][1]])}oSettings.aiDisplayMaster.sort(function(a,b){var iTest;
+for(var i=0;i<iLen;i++){iTest=oSort[aAirSort[i][1]](aoData[a]._aData[aAirSort[i][0]],aoData[b]._aData[aAirSort[i][0]]);
+if(iTest!==0){return iTest}}return 0})}}if(typeof bApplyClasses=="undefined"||bApplyClasses){_fnSortingClasses(oSettings)
+}oSettings.bSorted=true;if(oSettings.oFeatures.bFilter){_fnFilterComplete(oSettings,oSettings.oPreviousSearch,1)
+}else{oSettings.aiDisplay=oSettings.aiDisplayMaster.slice();oSettings._iDisplayStart=0;
+_fnCalculateEnd(oSettings);_fnDraw(oSettings)}}function _fnSortingClasses(oSettings){var i,j,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()}for(i=0;i<oSettings.aoColumns.length;i++){if(oSettings.aoColumns[i].bSortable&&oSettings.aoColumns[i].bVisible){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){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)}}}if(oSettings.oFeatures.bSortClasses){var nTrs=_fnGetTrNodes(oSettings);
+sClass=oClasses.sSortColumn;$("td",nTrs).removeClass(sClass+"1 "+sClass+"2 "+sClass+"3");
+var iClass=1;for(i=0;i<aaSort.length;i++){var iVis=_fnColumnIndexToVisible(oSettings,aaSort[i][0]);
+if(iVis!==null){if(iClass<=2){$("td:eq("+iVis+")",nTrs).addClass(sClass+iClass)}else{$("td:eq("+iVis+")",nTrs).addClass(sClass+"3")
+}iClass++}}}}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(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 _fnVisbleColumns(oS){var iVis=0;for(var i=0;i<oS.aoColumns.length;i++){if(oS.aoColumns[i].bVisible===true){iVis++
+}}return iVis}function _fnBuildSearchArray(oSettings,iMaster){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]="";for(var j=0,jLen=oSettings.aoColumns.length;
+j<jLen;j++){if(oSettings.aoColumns[j].bSearchable){var sData=oSettings.aoData[aArray[i]]._aData[j];
+oSettings.asDataSearch[i]+=_fnDataToSearch(sData,oSettings.aoColumns[j].sType)+" "
+}}}}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}function _fnCalculateEnd(oSettings){if(oSettings.oFeatures.bPaginate===false){oSettings._iDisplayEnd=oSettings.aiDisplay.length
+}else{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(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(oSettings){var iTableWidth=oSettings.nTable.offsetWidth;
+var iTotalUserIpSize=0;var iTmpWidth;var iVisibleColumns=0;var iColums=oSettings.aoColumns.length;
+var i;var oHeaders=$("thead:eq(0)>th",oSettings.nTable);for(i=0;i<iColums;i++){if(oSettings.aoColumns[i].bVisible){iVisibleColumns++;
+if(oSettings.aoColumns[i].sWidth!==null){iTmpWidth=_fnConvertToWidth(oSettings.aoColumns[i].sWidth,oSettings.nTable.parentNode);
+iTotalUserIpSize+=iTmpWidth;oSettings.aoColumns[i].sWidth=iTmpWidth+"px"}}}if(iColums==oHeaders.length&&iTotalUserIpSize===0&&iVisibleColumns==iColums){for(i=0;
+i<oSettings.aoColumns.length;i++){oSettings.aoColumns[i].sWidth=oHeaders[i].offsetWidth+"px"
+}}else{var nCalcTmp=oSettings.nTable.cloneNode(false);nCalcTmp.setAttribute("id","");
+var sTableTmp='<table class="'+nCalcTmp.className+'">';var sCalcHead="<tr>";var sCalcHtml="<tr>";
+for(i=0;i<iColums;i++){if(oSettings.aoColumns[i].bVisible){sCalcHead+="<th>"+oSettings.aoColumns[i].sTitle+"</th>";
+if(oSettings.aoColumns[i].sWidth!==null){var sWidth="";if(oSettings.aoColumns[i].sWidth!==null){sWidth=' style="width:'+oSettings.aoColumns[i].sWidth+';"'
+}sCalcHtml+="<td"+sWidth+' tag_index="'+i+'">'+fnGetMaxLenString(oSettings,i)+"</td>"
+}else{sCalcHtml+='<td tag_index="'+i+'">'+fnGetMaxLenString(oSettings,i)+"</td>"}}}sCalcHead+="</tr>";
+sCalcHtml+="</tr>";nCalcTmp=$(sTableTmp+sCalcHead+sCalcHtml+"</table>")[0];nCalcTmp.style.width=iTableWidth+"px";
+nCalcTmp.style.visibility="hidden";nCalcTmp.style.position="absolute";oSettings.nTable.parentNode.appendChild(nCalcTmp);
+var oNodes=$("tr:eq(1)>td",nCalcTmp);var iIndex;for(i=0;i<oNodes.length;i++){iIndex=oNodes[i].getAttribute("tag_index");
+oSettings.aoColumns[iIndex].sWidth=$("td",nCalcTmp)[i].offsetWidth+"px"}oSettings.nTable.parentNode.removeChild(nCalcTmp)
+}}function fnGetMaxLenString(oSettings,iCol){var iMax=0;var iMaxIndex=-1;for(var i=0;
+i<oSettings.aoData.length;i++){if(oSettings.aoData[i]._aData[iCol].length>iMax){iMax=oSettings.aoData[i]._aData[iCol].length;
+iMaxIndex=i}}if(iMaxIndex>=0){return oSettings.aoData[iMaxIndex]._aData[iCol]}return""
+}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(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(nTable){for(var i=0;i<_aoSettings.length;
+i++){if(_aoSettings[i].nTable==nTable){return _aoSettings[i]}}return null}function _fnGetDataMaster(oSettings){var aData=[];
+var iLen=oSettings.aoData.length;for(var i=0;i<iLen;i++){if(oSettings.aoData[i]===null){aData.push(null)
+}else{aData.push(oSettings.aoData[i]._aData)}}return aData}function _fnGetTrNodes(oSettings){var aNodes=[];
+var iLen=oSettings.aoData.length;for(var i=0;i<iLen;i++){if(oSettings.aoData[i]===null){aNodes.push(null)
+}else{aNodes.push(oSettings.aoData[i].nTr)}}return aNodes}function _fnEscapeRegex(sVal){var acEscape=["/",".","*","+","?","|","(",")","[","]","{","}","\\","$","^"];
+var reReplace=new RegExp("(\\"+acEscape.join("|\\")+")","g");return sVal.replace(reReplace,"\\$1")
+}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(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 _fnClearTable(oSettings){oSettings.aoData.length=0;
+oSettings.aiDisplayMaster.length=0;oSettings.aiDisplay.length=0;_fnCalculateEnd(oSettings)
+}function _fnSaveState(oSettings){if(!oSettings.oFeatures.bStateSave){return}var i;
+var sValue="{";sValue+='"iStart": '+oSettings._iDisplayStart+",";sValue+='"iEnd": '+oSettings._iDisplayEnd+",";
+sValue+='"iLength": '+oSettings._iDisplayLength+",";sValue+='"sFilter": "'+oSettings.oPreviousSearch.sSearch.replace('"','\\"')+'",';
+sValue+='"sFilterEsc": '+oSettings.oPreviousSearch.bEscapeRegex+",";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+="['"+oSettings.aoPreSearchCols[i].sSearch.replace("'","'")+"',"+oSettings.aoPreSearchCols[i].bEscapeRegex+"],"
+}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+="]";sValue+="}";_fnCreateCookie("SpryMedia_DataTables_"+oSettings.sInstance,sValue,oSettings.iCookieDuration)
+}function _fnLoadState(oSettings,oInit){if(!oSettings.oFeatures.bStateSave){return
+}var oData;var sData=_fnReadCookie("SpryMedia_DataTables_"+oSettings.sInstance);if(sData!==null&&sData!==""){try{if(typeof JSON=="object"&&typeof JSON.parse=="function"){oData=JSON.parse(sData.replace(/'/g,'"'))
+}else{oData=eval("("+sData+")")}}catch(e){return}oSettings._iDisplayStart=oData.iStart;
+oSettings.iInitDisplayStart=oData.iStart;oSettings._iDisplayEnd=oData.iEnd;oSettings._iDisplayLength=oData.iLength;
+oSettings.oPreviousSearch.sSearch=oData.sFilter;oSettings.aaSorting=oData.aaSorting.slice();
+if(typeof oData.sFilterEsc!="undefined"){oSettings.oPreviousSearch.bEscapeRegex=oData.sFilterEsc
+}if(typeof oData.aaSearchCols!="undefined"){for(var i=0;i<oData.aaSearchCols.length;
+i++){oSettings.aoPreSearchCols[i]={sSearch:oData.aaSearchCols[i][0],bEscapeRegex:oData.aaSearchCols[i][1]}
+}}if(typeof oData.abVisCols!="undefined"){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(sName,sValue,iSecs){var date=new Date();date.setTime(date.getTime()+(iSecs*1000));
+sName+="_"+window.location.pathname.replace(/[\/:]/g,"").toLowerCase();document.cookie=sName+"="+sValue+"; expires="+date.toGMTString()+"; path=/"
+}function _fnReadCookie(sName){var sNameEQ=sName+"_"+window.location.pathname.replace(/[\/:]/g,"").toLowerCase()+"=";
+var 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 c.substring(sNameEQ.length,c.length)
+}}return null}function _fnGetUniqueThs(nThead){var nTrs=nThead.getElementsByTagName("tr");
+if(nTrs.length==1){return nTrs[0].getElementsByTagName("th")}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]=[]
+}};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=="TD"||nTrs[i].childNodes[j].nodeName=="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=="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}}}for(i=0,iLen=aLayout[0].length;
+i<iLen;i++){for(j=0,jLen=aLayout.length;j<jLen;j++){if(typeof aLayout[j][i]=="object"){aReturn.push(aLayout[j][i])
+}}}return aReturn}function _fnMap(oRet,oSrc,sName,sMappedName){if(typeof sMappedName=="undefined"){sMappedName=sName
+}if(typeof oSrc[sName]!="undefined"){oRet[sMappedName]=oSrc[sName]}}this.oApi._fnInitalise=_fnInitalise;
+this.oApi._fnLanguageProcess=_fnLanguageProcess;this.oApi._fnAddColumn=_fnAddColumn;
+this.oApi._fnAddData=_fnAddData;this.oApi._fnGatherData=_fnGatherData;this.oApi._fnDrawHead=_fnDrawHead;
+this.oApi._fnDraw=_fnDraw;this.oApi._fnAjaxUpdate=_fnAjaxUpdate;this.oApi._fnAddOptionsHtml=_fnAddOptionsHtml;
+this.oApi._fnFeatureHtmlFilter=_fnFeatureHtmlFilter;this.oApi._fnFeatureHtmlInfo=_fnFeatureHtmlInfo;
+this.oApi._fnFeatureHtmlPaginate=_fnFeatureHtmlPaginate;this.oApi._fnFeatureHtmlLength=_fnFeatureHtmlLength;
+this.oApi._fnFeatureHtmlProcessing=_fnFeatureHtmlProcessing;this.oApi._fnProcessingDisplay=_fnProcessingDisplay;
+this.oApi._fnFilterComplete=_fnFilterComplete;this.oApi._fnFilterColumn=_fnFilterColumn;
+this.oApi._fnFilter=_fnFilter;this.oApi._fnSortingClasses=_fnSortingClasses;this.oApi._fnVisibleToColumnIndex=_fnVisibleToColumnIndex;
+this.oApi._fnColumnIndexToVisible=_fnColumnIndexToVisible;this.oApi._fnVisbleColumns=_fnVisbleColumns;
+this.oApi._fnBuildSearchArray=_fnBuildSearchArray;this.oApi._fnDataToSearch=_fnDataToSearch;
+this.oApi._fnCalculateEnd=_fnCalculateEnd;this.oApi._fnConvertToWidth=_fnConvertToWidth;
+this.oApi._fnCalculateColumnWidths=_fnCalculateColumnWidths;this.oApi._fnArrayCmp=_fnArrayCmp;
+this.oApi._fnDetectType=_fnDetectType;this.oApi._fnGetDataMaster=_fnGetDataMaster;
+this.oApi._fnGetTrNodes=_fnGetTrNodes;this.oApi._fnEscapeRegex=_fnEscapeRegex;this.oApi._fnReOrderIndex=_fnReOrderIndex;
+this.oApi._fnColumnOrdering=_fnColumnOrdering;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._fnReDraw=_fnReDraw;
+var _that=this;return this.each(function(){var oSettings=new classSettings();_aoSettings.push(oSettings);
+var i=0,iLen;var bInitHandedOff=false;var bUsePassedData=false;var sId=this.getAttribute("id");
+if(sId!==null){oSettings.sTableId=sId;oSettings.sInstance=sId}else{oSettings.sInstance=_oExt._oExternConfig.iNextUnique++
+}oSettings.nTable=this;oSettings.oApi=_that.oApi;if(typeof oInit!="undefined"&&oInit!==null){_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,oInit,"asStripClasses");_fnMap(oSettings,oInit,"fnRowCallback");
+_fnMap(oSettings,oInit,"fnHeaderCallback");_fnMap(oSettings,oInit,"fnFooterCallback");
+_fnMap(oSettings,oInit,"fnDrawCallback");_fnMap(oSettings,oInit,"fnInitComplete");
+_fnMap(oSettings,oInit,"fnServerData");_fnMap(oSettings,oInit,"aaSorting");_fnMap(oSettings,oInit,"aaSortingFixed");
+_fnMap(oSettings,oInit,"sPaginationType");_fnMap(oSettings,oInit,"sAjaxSource");_fnMap(oSettings,oInit,"sDom","sDomPositioning");
+_fnMap(oSettings,oInit,"oSearch","oPreviousSearch");_fnMap(oSettings,oInit,"aoSearchCols","aoPreSearchCols");
+_fnMap(oSettings,oInit,"iDisplayLength","_iDisplayLength");_fnMap(oSettings,oInit,"bJQueryUI","bJUI");
+if(typeof oInit.bJQueryUI!="undefined"&&oInit.bJQueryUI){oSettings.oClasses=_oExt.oJUIClasses;
+if(typeof oInit.sDom=="undefined"){oSettings.sDomPositioning='<"fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix"lfr>t<"fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix"ip>'
+}}if(typeof oInit.iDisplayStart!="undefined"&&typeof oSettings.iInitDisplayStart=="undefined"){oSettings.iInitDisplayStart=oInit.iDisplayStart;
+oSettings._iDisplayStart=oInit.iDisplayStart}if(typeof oInit.bStateSave!="undefined"){oSettings.oFeatures.bStateSave=oInit.bStateSave;
+_fnLoadState(oSettings,oInit)}if(typeof oInit.aaData!="undefined"){bUsePassedData=true
+}if(typeof oInit!="undefined"&&typeof oInit.aoData!="undefined"){oInit.aoColumns=oInit.aoData
+}if(typeof oInit.oLanguage!="undefined"){if(typeof oInit.oLanguage.sUrl!="undefined"&&oInit.oLanguage.sUrl!==""){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)}}}else{oInit={}
+}if(typeof oInit.asStripClasses=="undefined"){oSettings.asStripClasses.push(oSettings.oClasses.sStripOdd);
+oSettings.asStripClasses.push(oSettings.oClasses.sStripEven)}var nThead=this.getElementsByTagName("thead");
+var nThs=nThead.length===0?null:_fnGetUniqueThs(nThead[0]);var bUseCols=typeof oInit.aoColumns!="undefined";
+for(i=0,iLen=bUseCols?oInit.aoColumns.length:nThs.length;i<iLen;i++){var oCol=bUseCols?oInit.aoColumns[i]:null;
+var nTh=nThs?nThs[i]:null;if(typeof oInit.saved_aoColumns!="undefined"&&oInit.saved_aoColumns.length==iLen){if(oCol===null){oCol={}
+}oCol.bVisible=oInit.saved_aoColumns[i].bVisible}_fnAddColumn(oSettings,oCol,nTh)
+}for(i=0;i<oSettings.aaSorting.length;i++){if(typeof oSettings.aaSorting[i][2]=="undefined"){oSettings.aaSorting[i][2]=0
+}}if(this.getElementsByTagName("thead").length===0){this.appendChild(document.createElement("thead"))
+}if(this.getElementsByTagName("tbody").length===0){this.appendChild(document.createElement("tbody"))
+}if(bUsePassedData){for(i=0;i<oInit.aaData.length;i++){_fnAddData(oSettings,oInit.aaData[i])
+}}else{_fnGatherData(oSettings)}oSettings.aiDisplay=oSettings.aiDisplayMaster.slice();
+if(oSettings.oFeatures.bAutoWidth){_fnCalculateColumnWidths(oSettings)}oSettings.bInitialised=true;
+if(bInitHandedOff===false){_fnInitalise(oSettings)}})}})(jQuery);
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.dataTables.min.js.gz
===================================================================
(Binary files differ)


Property changes on: trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.dataTables.min.js.gz
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/js/jquery.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,4376 @@
+/*!
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){
+
+var 
+	// Will speed up references to window, and allows munging its name.
+	window = this,
+	// Will speed up references to undefined, and allows munging its name.
+	undefined,
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	jQuery = window.jQuery = window.$ = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context );
+	},
+
+	// A simple way to check for HTML strings or ID strings
+	// (both of which we optimize for)
+	quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
+	// Is it a simple selector
+	isSimple = /^.[^:#\[\.,]*$/;
+
+jQuery.fn = jQuery.prototype = {
+	init: function( selector, context ) {
+		// Make sure that a selection was provided
+		selector = selector || document;
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this[0] = selector;
+			this.length = 1;
+			this.context = selector;
+			return this;
+		}
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			var match = quickExpr.exec( selector );
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] )
+					selector = jQuery.clean( [ match[1] ], context );
+
+				// HANDLE: $("#id")
+				else {
+					var elem = document.getElementById( match[3] );
+
+					// Handle the case where IE and Opera return items
+					// by name instead of ID
+					if ( elem && elem.id != match[3] )
+						return jQuery().find( selector );
+
+					// Otherwise, we inject the element directly into the jQuery object
+					var ret = jQuery( elem || [] );
+					ret.context = document;
+					ret.selector = selector;
+					return ret;
+				}
+
+			// HANDLE: $(expr, [context])
+			// (which is just equivalent to: $(content).find(expr)
+			} else
+				return jQuery( context ).find( selector );
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) )
+			return jQuery( document ).ready( selector );
+
+		// Make sure that old selector state is passed along
+		if ( selector.selector && selector.context ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return this.setArray(jQuery.isArray( selector ) ?
+			selector :
+			jQuery.makeArray(selector));
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.3.2",
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num === undefined ?
+
+			// Return a 'clean' array
+			Array.prototype.slice.call( this ) :
+
+			// Return just the object
+			this[ num ];
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = jQuery( elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" )
+			ret.selector = this.selector + (this.selector ? " " : "") + selector;
+		else if ( name )
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Force the current matched set of elements to become
+	// the specified array of elements (destroying the stack in the process)
+	// You should use pushStack() in order to do this, but maintain the stack
+	setArray: function( elems ) {
+		// Resetting the length to 0, then using the native Array push
+		// is a super-fast way to populate an object with array-like properties
+		this.length = 0;
+		Array.prototype.push.apply( this, elems );
+
+		return this;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem && elem.jquery ? elem[0] : elem
+		, this );
+	},
+
+	attr: function( name, value, type ) {
+		var options = name;
+
+		// Look for the case where we're accessing a style value
+		if ( typeof name === "string" )
+			if ( value === undefined )
+				return this[0] && jQuery[ type || "attr" ]( this[0], name );
+
+			else {
+				options = {};
+				options[ name ] = value;
+			}
+
+		// Check to see if we're setting style values
+		return this.each(function(i){
+			// Set all the styles
+			for ( name in options )
+				jQuery.attr(
+					type ?
+						this.style :
+						this,
+					name, jQuery.prop( this, options[ name ], type, i, name )
+				);
+		});
+	},
+
+	css: function( key, value ) {
+		// ignore negative width and height values
+		if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
+			value = undefined;
+		return this.attr( key, value, "curCSS" );
+	},
+
+	text: function( text ) {
+		if ( typeof text !== "object" && text != null )
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+
+		var ret = "";
+
+		jQuery.each( text || this, function(){
+			jQuery.each( this.childNodes, function(){
+				if ( this.nodeType != 8 )
+					ret += this.nodeType != 1 ?
+						this.nodeValue :
+						jQuery.fn.text( [ this ] );
+			});
+		});
+
+		return ret;
+	},
+
+	wrapAll: function( html ) {
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).clone();
+
+			if ( this[0].parentNode )
+				wrap.insertBefore( this[0] );
+
+			wrap.map(function(){
+				var elem = this;
+
+				while ( elem.firstChild )
+					elem = elem.firstChild;
+
+				return elem;
+			}).append(this);
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		return this.each(function(){
+			jQuery( this ).contents().wrapAll( html );
+		});
+	},
+
+	wrap: function( html ) {
+		return this.each(function(){
+			jQuery( this ).wrapAll( html );
+		});
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function(elem){
+			if (this.nodeType == 1)
+				this.appendChild( elem );
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function(elem){
+			if (this.nodeType == 1)
+				this.insertBefore( elem, this.firstChild );
+		});
+	},
+
+	before: function() {
+		return this.domManip(arguments, false, function(elem){
+			this.parentNode.insertBefore( elem, this );
+		});
+	},
+
+	after: function() {
+		return this.domManip(arguments, false, function(elem){
+			this.parentNode.insertBefore( elem, this.nextSibling );
+		});
+	},
+
+	end: function() {
+		return this.prevObject || jQuery( [] );
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: [].push,
+	sort: [].sort,
+	splice: [].splice,
+
+	find: function( selector ) {
+		if ( this.length === 1 ) {
+			var ret = this.pushStack( [], "find", selector );
+			ret.length = 0;
+			jQuery.find( selector, this[0], ret );
+			return ret;
+		} else {
+			return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
+				return jQuery.find( selector, elem );
+			})), "find", selector );
+		}
+	},
+
+	clone: function( events ) {
+		// Do the clone
+		var ret = this.map(function(){
+			if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
+				// IE copies events bound via attachEvent when
+				// using cloneNode. Calling detachEvent on the
+				// clone will also remove the events from the orignal
+				// In order to get around this, we use innerHTML.
+				// Unfortunately, this means some modifications to
+				// attributes in IE that are actually only stored
+				// as properties will not be copied (such as the
+				// the name attribute on an input).
+				var html = this.outerHTML;
+				if ( !html ) {
+					var div = this.ownerDocument.createElement("div");
+					div.appendChild( this.cloneNode(true) );
+					html = div.innerHTML;
+				}
+
+				return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0];
+			} else
+				return this.cloneNode(true);
+		});
+
+		// Copy the events from the original to the clone
+		if ( events === true ) {
+			var orig = this.find("*").andSelf(), i = 0;
+
+			ret.find("*").andSelf().each(function(){
+				if ( this.nodeName !== orig[i].nodeName )
+					return;
+
+				var events = jQuery.data( orig[i], "events" );
+
+				for ( var type in events ) {
+					for ( var handler in events[ type ] ) {
+						jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
+					}
+				}
+
+				i++;
+			});
+		}
+
+		// Return the cloned set
+		return ret;
+	},
+
+	filter: function( selector ) {
+		return this.pushStack(
+			jQuery.isFunction( selector ) &&
+			jQuery.grep(this, function(elem, i){
+				return selector.call( elem, i );
+			}) ||
+
+			jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
+				return elem.nodeType === 1;
+			}) ), "filter", selector );
+	},
+
+	closest: function( selector ) {
+		var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
+			closer = 0;
+
+		return this.map(function(){
+			var cur = this;
+			while ( cur && cur.ownerDocument ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
+					jQuery.data(cur, "closest", closer);
+					return cur;
+				}
+				cur = cur.parentNode;
+				closer++;
+			}
+		});
+	},
+
+	not: function( selector ) {
+		if ( typeof selector === "string" )
+			// test special case where just one selector is passed in
+			if ( isSimple.test( selector ) )
+				return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
+			else
+				selector = jQuery.multiFilter( selector, this );
+
+		var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
+		return this.filter(function() {
+			return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
+		});
+	},
+
+	add: function( selector ) {
+		return this.pushStack( jQuery.unique( jQuery.merge(
+			this.get(),
+			typeof selector === "string" ?
+				jQuery( selector ) :
+				jQuery.makeArray( selector )
+		)));
+	},
+
+	is: function( selector ) {
+		return !!selector && jQuery.multiFilter( selector, this ).length > 0;
+	},
+
+	hasClass: function( selector ) {
+		return !!selector && this.is( "." + selector );
+	},
+
+	val: function( value ) {
+		if ( value === undefined ) {			
+			var elem = this[0];
+
+			if ( elem ) {
+				if( jQuery.nodeName( elem, 'option' ) )
+					return (elem.attributes.value || {}).specified ? elem.value : elem.text;
+				
+				// We need to handle select boxes special
+				if ( jQuery.nodeName( elem, "select" ) ) {
+					var index = elem.selectedIndex,
+						values = [],
+						options = elem.options,
+						one = elem.type == "select-one";
+
+					// Nothing was selected
+					if ( index < 0 )
+						return null;
+
+					// Loop through all the selected options
+					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+						var option = options[ i ];
+
+						if ( option.selected ) {
+							// Get the specifc value for the option
+							value = jQuery(option).val();
+
+							// We don't need an array for one selects
+							if ( one )
+								return value;
+
+							// Multi-Selects return an array
+							values.push( value );
+						}
+					}
+
+					return values;				
+				}
+
+				// Everything else, we just grab the value
+				return (elem.value || "").replace(/\r/g, "");
+
+			}
+
+			return undefined;
+		}
+
+		if ( typeof value === "number" )
+			value += '';
+
+		return this.each(function(){
+			if ( this.nodeType != 1 )
+				return;
+
+			if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
+				this.checked = (jQuery.inArray(this.value, value) >= 0 ||
+					jQuery.inArray(this.name, value) >= 0);
+
+			else if ( jQuery.nodeName( this, "select" ) ) {
+				var values = jQuery.makeArray(value);
+
+				jQuery( "option", this ).each(function(){
+					this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
+						jQuery.inArray( this.text, values ) >= 0);
+				});
+
+				if ( !values.length )
+					this.selectedIndex = -1;
+
+			} else
+				this.value = value;
+		});
+	},
+
+	html: function( value ) {
+		return value === undefined ?
+			(this[0] ?
+				this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
+				null) :
+			this.empty().append( value );
+	},
+
+	replaceWith: function( value ) {
+		return this.after( value ).remove();
+	},
+
+	eq: function( i ) {
+		return this.slice( i, +i + 1 );
+	},
+
+	slice: function() {
+		return this.pushStack( Array.prototype.slice.apply( this, arguments ),
+			"slice", Array.prototype.slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function(elem, i){
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	},
+
+	domManip: function( args, table, callback ) {
+		if ( this[0] ) {
+			var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
+				scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
+				first = fragment.firstChild;
+
+			if ( first )
+				for ( var i = 0, l = this.length; i < l; i++ )
+					callback.call( root(this[i], first), this.length > 1 || i > 0 ?
+							fragment.cloneNode(true) : fragment );
+		
+			if ( scripts )
+				jQuery.each( scripts, evalScript );
+		}
+
+		return this;
+		
+		function root( elem, cur ) {
+			return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
+				(elem.getElementsByTagName("tbody")[0] ||
+				elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+				elem;
+		}
+	}
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+function evalScript( i, elem ) {
+	if ( elem.src )
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+
+	else
+		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
+
+	if ( elem.parentNode )
+		elem.parentNode.removeChild( elem );
+}
+
+function now(){
+	return +new Date;
+}
+
+jQuery.extend = jQuery.fn.extend = function() {
+	// copy reference to target object
+	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) )
+		target = {};
+
+	// extend jQuery itself if only one argument is passed
+	if ( length == i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ )
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null )
+			// Extend the base object
+			for ( var name in options ) {
+				var src = target[ name ], copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy )
+					continue;
+
+				// Recurse if we're merging object values
+				if ( deep && copy && typeof copy === "object" && !copy.nodeType )
+					target[ name ] = jQuery.extend( deep, 
+						// Never move original objects, clone them
+						src || ( copy.length != null ? [ ] : { } )
+					, copy );
+
+				// Don't bring in undefined values
+				else if ( copy !== undefined )
+					target[ name ] = copy;
+
+			}
+
+	// Return the modified object
+	return target;
+};
+
+// exclude the following css properties to add px
+var	exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
+	// cache defaultView
+	defaultView = document.defaultView || {},
+	toString = Object.prototype.toString;
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		window.$ = _$;
+
+		if ( deep )
+			window.jQuery = _jQuery;
+
+		return jQuery;
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return toString.call(obj) === "[object Function]";
+	},
+
+	isArray: function( obj ) {
+		return toString.call(obj) === "[object Array]";
+	},
+
+	// check if an element is in a (or is an) XML document
+	isXMLDoc: function( elem ) {
+		return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
+			!!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
+	},
+
+	// Evalulates a script in a global context
+	globalEval: function( data ) {
+		if ( data && /\S/.test(data) ) {
+			// Inspired by code by Andrea Giammarchi
+			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+			var head = document.getElementsByTagName("head")[0] || document.documentElement,
+				script = document.createElement("script");
+
+			script.type = "text/javascript";
+			if ( jQuery.support.scriptEval )
+				script.appendChild( document.createTextNode( data ) );
+			else
+				script.text = data;
+
+			// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+			// This arises when a base node is used (#2709).
+			head.insertBefore( script, head.firstChild );
+			head.removeChild( script );
+		}
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0, length = object.length;
+
+		if ( args ) {
+			if ( length === undefined ) {
+				for ( name in object )
+					if ( callback.apply( object[ name ], args ) === false )
+						break;
+			} else
+				for ( ; i < length; )
+					if ( callback.apply( object[ i++ ], args ) === false )
+						break;
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( length === undefined ) {
+				for ( name in object )
+					if ( callback.call( object[ name ], name, object[ name ] ) === false )
+						break;
+			} else
+				for ( var value = object[0];
+					i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
+		}
+
+		return object;
+	},
+
+	prop: function( elem, value, type, i, name ) {
+		// Handle executable functions
+		if ( jQuery.isFunction( value ) )
+			value = value.call( elem, i );
+
+		// Handle passing in a number to a CSS property
+		return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
+			value + "px" :
+			value;
+	},
+
+	className: {
+		// internal only, use addClass("class")
+		add: function( elem, classNames ) {
+			jQuery.each((classNames || "").split(/\s+/), function(i, className){
+				if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
+					elem.className += (elem.className ? " " : "") + className;
+			});
+		},
+
+		// internal only, use removeClass("class")
+		remove: function( elem, classNames ) {
+			if (elem.nodeType == 1)
+				elem.className = classNames !== undefined ?
+					jQuery.grep(elem.className.split(/\s+/), function(className){
+						return !jQuery.className.has( classNames, className );
+					}).join(" ") :
+					"";
+		},
+
+		// internal only, use hasClass("class")
+		has: function( elem, className ) {
+			return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( var name in options )
+			elem.style[ name ] = old[ name ];
+	},
+
+	css: function( elem, name, force, extra ) {
+		if ( name == "width" || name == "height" ) {
+			var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
+
+			function getWH() {
+				val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
+
+				if ( extra === "border" )
+					return;
+
+				jQuery.each( which, function() {
+					if ( !extra )
+						val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
+					if ( extra === "margin" )
+						val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
+					else
+						val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
+				});
+			}
+
+			if ( elem.offsetWidth !== 0 )
+				getWH();
+			else
+				jQuery.swap( elem, props, getWH );
+
+			return Math.max(0, Math.round(val));
+		}
+
+		return jQuery.curCSS( elem, name, force );
+	},
+
+	curCSS: function( elem, name, force ) {
+		var ret, style = elem.style;
+
+		// We need to handle opacity special in IE
+		if ( name == "opacity" && !jQuery.support.opacity ) {
+			ret = jQuery.attr( style, "opacity" );
+
+			return ret == "" ?
+				"1" :
+				ret;
+		}
+
+		// Make sure we're using the right name for getting the float value
+		if ( name.match( /float/i ) )
+			name = styleFloat;
+
+		if ( !force && style && style[ name ] )
+			ret = style[ name ];
+
+		else if ( defaultView.getComputedStyle ) {
+
+			// Only "float" is needed here
+			if ( name.match( /float/i ) )
+				name = "float";
+
+			name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
+
+			var computedStyle = defaultView.getComputedStyle( elem, null );
+
+			if ( computedStyle )
+				ret = computedStyle.getPropertyValue( name );
+
+			// We should always get a number back from opacity
+			if ( name == "opacity" && ret == "" )
+				ret = "1";
+
+		} else if ( elem.currentStyle ) {
+			var camelCase = name.replace(/\-(\w)/g, function(all, letter){
+				return letter.toUpperCase();
+			});
+
+			ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
+
+			// From the awesome hack by Dean Edwards
+			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+			// If we're not dealing with a regular pixel number
+			// but a number that has a weird ending, we need to convert it to pixels
+			if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
+				// Remember the original values
+				var left = style.left, rsLeft = elem.runtimeStyle.left;
+
+				// Put in the new values to get a computed value out
+				elem.runtimeStyle.left = elem.currentStyle.left;
+				style.left = ret || 0;
+				ret = style.pixelLeft + "px";
+
+				// Revert the changed values
+				style.left = left;
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret;
+	},
+
+	clean: function( elems, context, fragment ) {
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" )
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+
+		// If a single string is passed in and it's a single tag
+		// just do a createElement and skip the rest
+		if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
+			var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
+			if ( match )
+				return [ context.createElement( match[1] ) ];
+		}
+
+		var ret = [], scripts = [], div = context.createElement("div");
+
+		jQuery.each(elems, function(i, elem){
+			if ( typeof elem === "number" )
+				elem += '';
+
+			if ( !elem )
+				return;
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				// Fix "XHTML"-style tags in all browsers
+				elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
+					return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
+						all :
+						front + "></" + tag + ">";
+				});
+
+				// Trim whitespace, otherwise indexOf won't work as expected
+				var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
+
+				var wrap =
+					// option or optgroup
+					!tags.indexOf("<opt") &&
+					[ 1, "<select multiple='multiple'>", "</select>" ] ||
+
+					!tags.indexOf("<leg") &&
+					[ 1, "<fieldset>", "</fieldset>" ] ||
+
+					tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
+					[ 1, "<table>", "</table>" ] ||
+
+					!tags.indexOf("<tr") &&
+					[ 2, "<table><tbody>", "</tbody></table>" ] ||
+
+				 	// <thead> matched above
+					(!tags.indexOf("<td") || !tags.indexOf("<th")) &&
+					[ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
+
+					!tags.indexOf("<col") &&
+					[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
+
+					// IE can't serialize <link> and <script> tags normally
+					!jQuery.support.htmlSerialize &&
+					[ 1, "div<div>", "</div>" ] ||
+
+					[ 0, "", "" ];
+
+				// Go to html and back, then peel off extra wrappers
+				div.innerHTML = wrap[1] + elem + wrap[2];
+
+				// Move to the right depth
+				while ( wrap[0]-- )
+					div = div.lastChild;
+
+				// Remove IE's autoinserted <tbody> from table fragments
+				if ( !jQuery.support.tbody ) {
+
+					// String was a <table>, *may* have spurious <tbody>
+					var hasBody = /<tbody/i.test(elem),
+						tbody = !tags.indexOf("<table") && !hasBody ?
+							div.firstChild && div.firstChild.childNodes :
+
+						// String was a bare <thead> or <tfoot>
+						wrap[1] == "<table>" && !hasBody ?
+							div.childNodes :
+							[];
+
+					for ( var j = tbody.length - 1; j >= 0 ; --j )
+						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
+							tbody[ j ].parentNode.removeChild( tbody[ j ] );
+
+					}
+
+				// IE completely kills leading whitespace when innerHTML is used
+				if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
+					div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
+				
+				elem = jQuery.makeArray( div.childNodes );
+			}
+
+			if ( elem.nodeType )
+				ret.push( elem );
+			else
+				ret = jQuery.merge( ret, elem );
+
+		});
+
+		if ( fragment ) {
+			for ( var i = 0; ret[i]; i++ ) {
+				if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+				} else {
+					if ( ret[i].nodeType === 1 )
+						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
+					fragment.appendChild( ret[i] );
+				}
+			}
+			
+			return scripts;
+		}
+
+		return ret;
+	},
+
+	attr: function( elem, name, value ) {
+		// don't set attributes on text and comment nodes
+		if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
+			return undefined;
+
+		var notxml = !jQuery.isXMLDoc( elem ),
+			// Whether we are setting (or getting)
+			set = value !== undefined;
+
+		// Try to normalize/fix the name
+		name = notxml && jQuery.props[ name ] || name;
+
+		// Only do all the following if this is a node (faster for style)
+		// IE elem.getAttribute passes even for style
+		if ( elem.tagName ) {
+
+			// These attributes require special treatment
+			var special = /href|src|style/.test( name );
+
+			// Safari mis-reports the default selected property of a hidden option
+			// Accessing the parent's selectedIndex property fixes it
+			if ( name == "selected" && elem.parentNode )
+				elem.parentNode.selectedIndex;
+
+			// If applicable, access the attribute via the DOM 0 way
+			if ( name in elem && notxml && !special ) {
+				if ( set ){
+					// We can't allow the type property to be changed (since it causes problems in IE)
+					if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
+						throw "type property can't be changed";
+
+					elem[ name ] = value;
+				}
+
+				// browsers index elements by id/name on forms, give priority to attributes.
+				if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
+					return elem.getAttributeNode( name ).nodeValue;
+
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				if ( name == "tabIndex" ) {
+					var attributeNode = elem.getAttributeNode( "tabIndex" );
+					return attributeNode && attributeNode.specified
+						? attributeNode.value
+						: elem.nodeName.match(/(button|input|object|select|textarea)/i)
+							? 0
+							: elem.nodeName.match(/^(a|area)$/i) && elem.href
+								? 0
+								: undefined;
+				}
+
+				return elem[ name ];
+			}
+
+			if ( !jQuery.support.style && notxml &&  name == "style" )
+				return jQuery.attr( elem.style, "cssText", value );
+
+			if ( set )
+				// convert the value to a string (all browsers do this but IE) see #1070
+				elem.setAttribute( name, "" + value );
+
+			var attr = !jQuery.support.hrefNormalized && notxml && special
+					// Some attributes require a special call on IE
+					? elem.getAttribute( name, 2 )
+					: elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return attr === null ? undefined : attr;
+		}
+
+		// elem is actually elem.style ... set the style
+
+		// IE uses filters for opacity
+		if ( !jQuery.support.opacity && name == "opacity" ) {
+			if ( set ) {
+				// IE has trouble with opacity if it does not have layout
+				// Force it by setting the zoom level
+				elem.zoom = 1;
+
+				// Set the alpha filter to set the opacity
+				elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
+					(parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
+			}
+
+			return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
+				(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
+				"";
+		}
+
+		name = name.replace(/-([a-z])/ig, function(all, letter){
+			return letter.toUpperCase();
+		});
+
+		if ( set )
+			elem[ name ] = value;
+
+		return elem[ name ];
+	},
+
+	trim: function( text ) {
+		return (text || "").replace( /^\s+|\s+$/g, "" );
+	},
+
+	makeArray: function( array ) {
+		var ret = [];
+
+		if( array != null ){
+			var i = array.length;
+			// The window, strings (and functions) also have 'length'
+			if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
+				ret[0] = array;
+			else
+				while( i )
+					ret[--i] = array[i];
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array ) {
+		for ( var i = 0, length = array.length; i < length; i++ )
+		// Use === because on IE, window == document
+			if ( array[ i ] === elem )
+				return i;
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		// We have to loop this way because IE & Opera overwrite the length
+		// expando of getElementsByTagName
+		var i = 0, elem, pos = first.length;
+		// Also, we need to make sure that the correct elements are being returned
+		// (IE returns comment nodes in a '*' query)
+		if ( !jQuery.support.getAll ) {
+			while ( (elem = second[ i++ ]) != null )
+				if ( elem.nodeType != 8 )
+					first[ pos++ ] = elem;
+
+		} else
+			while ( (elem = second[ i++ ]) != null )
+				first[ pos++ ] = elem;
+
+		return first;
+	},
+
+	unique: function( array ) {
+		var ret = [], done = {};
+
+		try {
+
+			for ( var i = 0, length = array.length; i < length; i++ ) {
+				var id = jQuery.data( array[ i ] );
+
+				if ( !done[ id ] ) {
+					done[ id ] = true;
+					ret.push( array[ i ] );
+				}
+			}
+
+		} catch( e ) {
+			ret = array;
+		}
+
+		return ret;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [];
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ )
+			if ( !inv != !callback( elems[ i ], i ) )
+				ret.push( elems[ i ] );
+
+		return ret;
+	},
+
+	map: function( elems, callback ) {
+		var ret = [];
+
+		// Go through the array, translating each of the items to their
+		// new value (or values).
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			var value = callback( elems[ i ], i );
+
+			if ( value != null )
+				ret[ ret.length ] = value;
+		}
+
+		return ret.concat.apply( [], ret );
+	}
+});
+
+// Use of jQuery.browser is deprecated.
+// It's included for backwards compatibility and plugins,
+// although they should work to migrate away.
+
+var userAgent = navigator.userAgent.toLowerCase();
+
+// Figure out what browser is being used
+jQuery.browser = {
+	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
+	safari: /webkit/.test( userAgent ),
+	opera: /opera/.test( userAgent ),
+	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
+	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
+};
+
+jQuery.each({
+	parent: function(elem){return elem.parentNode;},
+	parents: function(elem){return jQuery.dir(elem,"parentNode");},
+	next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
+	prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
+	nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
+	prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
+	siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
+	children: function(elem){return jQuery.sibling(elem.firstChild);},
+	contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
+}, function(name, fn){
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = jQuery.map( this, fn );
+
+		if ( selector && typeof selector == "string" )
+			ret = jQuery.multiFilter( selector, ret );
+
+		return this.pushStack( jQuery.unique( ret ), name, selector );
+	};
+});
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function(name, original){
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [], insert = jQuery( selector );
+
+		for ( var i = 0, l = insert.length; i < l; i++ ) {
+			var elems = (i > 0 ? this.clone(true) : this).get();
+			jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
+			ret = ret.concat( elems );
+		}
+
+		return this.pushStack( ret, name, selector );
+	};
+});
+
+jQuery.each({
+	removeAttr: function( name ) {
+		jQuery.attr( this, name, "" );
+		if (this.nodeType == 1)
+			this.removeAttribute( name );
+	},
+
+	addClass: function( classNames ) {
+		jQuery.className.add( this, classNames );
+	},
+
+	removeClass: function( classNames ) {
+		jQuery.className.remove( this, classNames );
+	},
+
+	toggleClass: function( classNames, state ) {
+		if( typeof state !== "boolean" )
+			state = !jQuery.className.has( this, classNames );
+		jQuery.className[ state ? "add" : "remove" ]( this, classNames );
+	},
+
+	remove: function( selector ) {
+		if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
+			// Prevent memory leaks
+			jQuery( "*", this ).add([this]).each(function(){
+				jQuery.event.remove(this);
+				jQuery.removeData(this);
+			});
+			if (this.parentNode)
+				this.parentNode.removeChild( this );
+		}
+	},
+
+	empty: function() {
+		// Remove element nodes and prevent memory leaks
+		jQuery(this).children().remove();
+
+		// Remove any remaining nodes
+		while ( this.firstChild )
+			this.removeChild( this.firstChild );
+	}
+}, function(name, fn){
+	jQuery.fn[ name ] = function(){
+		return this.each( fn, arguments );
+	};
+});
+
+// Helper function used by the dimensions and offset modules
+function num(elem, prop) {
+	return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
+}
+var expando = "jQuery" + now(), uuid = 0, windowData = {};
+
+jQuery.extend({
+	cache: {},
+
+	data: function( elem, name, data ) {
+		elem = elem == window ?
+			windowData :
+			elem;
+
+		var id = elem[ expando ];
+
+		// Compute a unique ID for the element
+		if ( !id )
+			id = elem[ expando ] = ++uuid;
+
+		// Only generate the data cache if we're
+		// trying to access or manipulate it
+		if ( name && !jQuery.cache[ id ] )
+			jQuery.cache[ id ] = {};
+
+		// Prevent overriding the named cache with undefined values
+		if ( data !== undefined )
+			jQuery.cache[ id ][ name ] = data;
+
+		// Return the named cache data, or the ID for the element
+		return name ?
+			jQuery.cache[ id ][ name ] :
+			id;
+	},
+
+	removeData: function( elem, name ) {
+		elem = elem == window ?
+			windowData :
+			elem;
+
+		var id = elem[ expando ];
+
+		// If we want to remove a specific section of the element's data
+		if ( name ) {
+			if ( jQuery.cache[ id ] ) {
+				// Remove the section of cache data
+				delete jQuery.cache[ id ][ name ];
+
+				// If we've removed all the data, remove the element's cache
+				name = "";
+
+				for ( name in jQuery.cache[ id ] )
+					break;
+
+				if ( !name )
+					jQuery.removeData( elem );
+			}
+
+		// Otherwise, we want to remove all of the element's data
+		} else {
+			// Clean up the element expando
+			try {
+				delete elem[ expando ];
+			} catch(e){
+				// IE has trouble directly removing the expando
+				// but it's ok with using removeAttribute
+				if ( elem.removeAttribute )
+					elem.removeAttribute( expando );
+			}
+
+			// Completely remove the data cache
+			delete jQuery.cache[ id ];
+		}
+	},
+	queue: function( elem, type, data ) {
+		if ( elem ){
+	
+			type = (type || "fx") + "queue";
+	
+			var q = jQuery.data( elem, type );
+	
+			if ( !q || jQuery.isArray(data) )
+				q = jQuery.data( elem, type, jQuery.makeArray(data) );
+			else if( data )
+				q.push( data );
+	
+		}
+		return q;
+	},
+
+	dequeue: function( elem, type ){
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift();
+		
+		if( !type || type === "fx" )
+			fn = queue[0];
+			
+		if( fn !== undefined )
+			fn.call(elem);
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ){
+		var parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			if ( data === undefined && this.length )
+				data = jQuery.data( this[0], key );
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+		} else
+			return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
+				jQuery.data( this, key, value );
+			});
+	},
+
+	removeData: function( key ){
+		return this.each(function(){
+			jQuery.removeData( this, key );
+		});
+	},
+	queue: function(type, data){
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined )
+			return jQuery.queue( this[0], type );
+
+		return this.each(function(){
+			var queue = jQuery.queue( this, type, data );
+			
+			 if( type == "fx" && queue.length == 1 )
+				queue[0].call(this);
+		});
+	},
+	dequeue: function(type){
+		return this.each(function(){
+			jQuery.dequeue( this, type );
+		});
+	}
+});/*!
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
+	done = 0,
+	toString = Object.prototype.toString;
+
+var Sizzle = function(selector, context, results, seed) {
+	results = results || [];
+	context = context || document;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 )
+		return [];
+	
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var parts = [], m, set, checkSet, check, mode, extra, prune = true;
+	
+	// Reset the position of the chunker regexp (start from head)
+	chunker.lastIndex = 0;
+	
+	while ( (m = chunker.exec(selector)) !== null ) {
+		parts.push( m[1] );
+		
+		if ( m[2] ) {
+			extra = RegExp.rightContext;
+			break;
+		}
+	}
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context );
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] )
+					selector += parts.shift();
+
+				set = posProcess( selector, set );
+			}
+		}
+	} else {
+		var ret = seed ?
+			{ expr: parts.pop(), set: makeArray(seed) } :
+			Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
+		set = Sizzle.filter( ret.expr, ret.set );
+
+		if ( parts.length > 0 ) {
+			checkSet = makeArray(set);
+		} else {
+			prune = false;
+		}
+
+		while ( parts.length ) {
+			var cur = parts.pop(), pop = cur;
+
+			if ( !Expr.relative[ cur ] ) {
+				cur = "";
+			} else {
+				pop = parts.pop();
+			}
+
+			if ( pop == null ) {
+				pop = context;
+			}
+
+			Expr.relative[ cur ]( checkSet, pop, isXML(context) );
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		throw "Syntax error, unrecognized expression: " + (cur || selector);
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+		} else if ( context.nodeType === 1 ) {
+			for ( var i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+		} else {
+			for ( var i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, context, results, seed );
+
+		if ( sortOrder ) {
+			hasDuplicate = false;
+			results.sort(sortOrder);
+
+			if ( hasDuplicate ) {
+				for ( var i = 1; i < results.length; i++ ) {
+					if ( results[i] === results[i-1] ) {
+						results.splice(i--, 1);
+					}
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function(expr, set){
+	return Sizzle(expr, null, null, set);
+};
+
+Sizzle.find = function(expr, context, isXML){
+	var set, match;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+		var type = Expr.order[i], match;
+		
+		if ( (match = Expr.match[ type ].exec( expr )) ) {
+			var left = RegExp.leftContext;
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace(/\\/g, "");
+				set = Expr.find[ type ]( match, context, isXML );
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = context.getElementsByTagName("*");
+	}
+
+	return {set: set, expr: expr};
+};
+
+Sizzle.filter = function(expr, set, inplace, not){
+	var old = expr, result = [], curLoop = set, match, anyFound,
+		isXMLFilter = set && set[0] && isXML(set[0]);
+
+	while ( expr && set.length ) {
+		for ( var type in Expr.filter ) {
+			if ( (match = Expr.match[ type ].exec( expr )) != null ) {
+				var filter = Expr.filter[ type ], found, item;
+				anyFound = false;
+
+				if ( curLoop == result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							var pass = not ^ !!found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+								} else {
+									curLoop[i] = false;
+								}
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr == old ) {
+			if ( anyFound == null ) {
+				throw "Syntax error, unrecognized expression: " + expr;
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
+	},
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+	attrHandle: {
+		href: function(elem){
+			return elem.getAttribute("href");
+		}
+	},
+	relative: {
+		"+": function(checkSet, part, isXML){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !/\W/.test(part),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag && !isXML ) {
+				part = part.toUpperCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+		">": function(checkSet, part, isXML){
+			var isPartStr = typeof part === "string";
+
+			if ( isPartStr && !/\W/.test(part) ) {
+				part = isXML ? part : part.toUpperCase();
+
+				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+					var elem = checkSet[i];
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName === part ? parent : false;
+					}
+				}
+			} else {
+				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+					var elem = checkSet[i];
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+		"": function(checkSet, part, isXML){
+			var doneName = done++, checkFn = dirCheck;
+
+			if ( !part.match(/\W/) ) {
+				var nodeCheck = part = isXML ? part : part.toUpperCase();
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
+		},
+		"~": function(checkSet, part, isXML){
+			var doneName = done++, checkFn = dirCheck;
+
+			if ( typeof part === "string" && !part.match(/\W/) ) {
+				var nodeCheck = part = isXML ? part : part.toUpperCase();
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
+		}
+	},
+	find: {
+		ID: function(match, context, isXML){
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				return m ? [m] : [];
+			}
+		},
+		NAME: function(match, context, isXML){
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [], results = context.getElementsByName(match[1]);
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+		TAG: function(match, context){
+			return context.getElementsByTagName(match[1]);
+		}
+	},
+	preFilter: {
+		CLASS: function(match, curLoop, inplace, result, not, isXML){
+			match = " " + match[1].replace(/\\/g, "") + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
+						if ( !inplace )
+							result.push( elem );
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+		ID: function(match){
+			return match[1].replace(/\\/g, "");
+		},
+		TAG: function(match, curLoop){
+			for ( var i = 0; curLoop[i] === false; i++ ){}
+			return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
+		},
+		CHILD: function(match){
+			if ( match[1] == "nth" ) {
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+					match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+		ATTR: function(match, curLoop, inplace, result, not, isXML){
+			var name = match[1].replace(/\\/g, "");
+			
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+		PSEUDO: function(match, curLoop, inplace, result, not){
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+					return false;
+				}
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+			
+			return match;
+		},
+		POS: function(match){
+			match.unshift( true );
+			return match;
+		}
+	},
+	filters: {
+		enabled: function(elem){
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+		disabled: function(elem){
+			return elem.disabled === true;
+		},
+		checked: function(elem){
+			return elem.checked === true;
+		},
+		selected: function(elem){
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			elem.parentNode.selectedIndex;
+			return elem.selected === true;
+		},
+		parent: function(elem){
+			return !!elem.firstChild;
+		},
+		empty: function(elem){
+			return !elem.firstChild;
+		},
+		has: function(elem, i, match){
+			return !!Sizzle( match[3], elem ).length;
+		},
+		header: function(elem){
+			return /h\d/i.test( elem.nodeName );
+		},
+		text: function(elem){
+			return "text" === elem.type;
+		},
+		radio: function(elem){
+			return "radio" === elem.type;
+		},
+		checkbox: function(elem){
+			return "checkbox" === elem.type;
+		},
+		file: function(elem){
+			return "file" === elem.type;
+		},
+		password: function(elem){
+			return "password" === elem.type;
+		},
+		submit: function(elem){
+			return "submit" === elem.type;
+		},
+		image: function(elem){
+			return "image" === elem.type;
+		},
+		reset: function(elem){
+			return "reset" === elem.type;
+		},
+		button: function(elem){
+			return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
+		},
+		input: function(elem){
+			return /input|select|textarea|button/i.test(elem.nodeName);
+		}
+	},
+	setFilters: {
+		first: function(elem, i){
+			return i === 0;
+		},
+		last: function(elem, i, match, array){
+			return i === array.length - 1;
+		},
+		even: function(elem, i){
+			return i % 2 === 0;
+		},
+		odd: function(elem, i){
+			return i % 2 === 1;
+		},
+		lt: function(elem, i, match){
+			return i < match[3] - 0;
+		},
+		gt: function(elem, i, match){
+			return i > match[3] - 0;
+		},
+		nth: function(elem, i, match){
+			return match[3] - 0 == i;
+		},
+		eq: function(elem, i, match){
+			return match[3] - 0 == i;
+		}
+	},
+	filter: {
+		PSEUDO: function(elem, match, i, array){
+			var name = match[1], filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var i = 0, l = not.length; i < l; i++ ) {
+					if ( not[i] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+			}
+		},
+		CHILD: function(elem, match){
+			var type = match[1], node = elem;
+			switch (type) {
+				case 'only':
+				case 'first':
+					while (node = node.previousSibling)  {
+						if ( node.nodeType === 1 ) return false;
+					}
+					if ( type == 'first') return true;
+					node = elem;
+				case 'last':
+					while (node = node.nextSibling)  {
+						if ( node.nodeType === 1 ) return false;
+					}
+					return true;
+				case 'nth':
+					var first = match[2], last = match[3];
+
+					if ( first == 1 && last == 0 ) {
+						return true;
+					}
+					
+					var doneName = match[0],
+						parent = elem.parentNode;
+	
+					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+						var count = 0;
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						} 
+						parent.sizcache = doneName;
+					}
+					
+					var diff = elem.nodeIndex - last;
+					if ( first == 0 ) {
+						return diff == 0;
+					} else {
+						return ( diff % first == 0 && diff / first >= 0 );
+					}
+			}
+		},
+		ID: function(elem, match){
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+		TAG: function(elem, match){
+			return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
+		},
+		CLASS: function(elem, match){
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+		ATTR: function(elem, match){
+			var name = match[1],
+				result = Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value != check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+		POS: function(elem, match, i, array){
+			var name = match[2], filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS;
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
+}
+
+var makeArray = function(array, results) {
+	array = Array.prototype.slice.call( array );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+	
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes );
+
+// Provide a fallback method if it does not work
+} catch(e){
+	makeArray = function(array, results) {
+		var ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var i = 0, l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+			} else {
+				for ( var i = 0; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
+		if ( ret === 0 ) {
+			hasDuplicate = true;
+		}
+		return ret;
+	};
+} else if ( "sourceIndex" in document.documentElement ) {
+	sortOrder = function( a, b ) {
+		var ret = a.sourceIndex - b.sourceIndex;
+		if ( ret === 0 ) {
+			hasDuplicate = true;
+		}
+		return ret;
+	};
+} else if ( document.createRange ) {
+	sortOrder = function( a, b ) {
+		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
+		aRange.selectNode(a);
+		aRange.collapse(true);
+		bRange.selectNode(b);
+		bRange.collapse(true);
+		var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
+		if ( ret === 0 ) {
+			hasDuplicate = true;
+		}
+		return ret;
+	};
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("form"),
+		id = "script" + (new Date).getTime();
+	form.innerHTML = "<input name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	var root = document.documentElement;
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( !!document.getElementById( id ) ) {
+		Expr.find.ID = function(match, context, isXML){
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
+			}
+		};
+
+		Expr.filter.ID = function(elem, match){
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function(match, context){
+			var results = context.getElementsByTagName(match[1]);
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+		Expr.attrHandle.href = function(elem){
+			return elem.getAttribute("href", 2);
+		};
+	}
+})();
+
+if ( document.querySelectorAll ) (function(){
+	var oldSizzle = Sizzle, div = document.createElement("div");
+	div.innerHTML = "<p class='TEST'></p>";
+
+	// Safari can't handle uppercase or unicode characters when
+	// in quirks mode.
+	if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+		return;
+	}
+	
+	Sizzle = function(query, context, extra, seed){
+		context = context || document;
+
+		// Only use querySelectorAll on non-XML documents
+		// (ID selectors don't work in non-HTML documents)
+		if ( !seed && context.nodeType === 9 && !isXML(context) ) {
+			try {
+				return makeArray( context.querySelectorAll(query), extra );
+			} catch(e){}
+		}
+		
+		return oldSizzle(query, context, extra, seed);
+	};
+
+	Sizzle.find = oldSizzle.find;
+	Sizzle.filter = oldSizzle.filter;
+	Sizzle.selectors = oldSizzle.selectors;
+	Sizzle.matches = oldSizzle.matches;
+})();
+
+if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
+	var div = document.createElement("div");
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	if ( div.getElementsByClassName("e").length === 0 )
+		return;
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 )
+		return;
+
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function(match, context, isXML) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	var sibDir = dir == "previousSibling" && !isXML;
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+		if ( elem ) {
+			if ( sibDir && elem.nodeType === 1 ){
+				elem.sizcache = doneName;
+				elem.sizset = i;
+			}
+			elem = elem[dir];
+			var match = false;
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem.sizcache = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	var sibDir = dir == "previousSibling" && !isXML;
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+		if ( elem ) {
+			if ( sibDir && elem.nodeType === 1 ) {
+				elem.sizcache = doneName;
+				elem.sizset = i;
+			}
+			elem = elem[dir];
+			var match = false;
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem.sizcache = doneName;
+						elem.sizset = i;
+					}
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+var contains = document.compareDocumentPosition ?  function(a, b){
+	return a.compareDocumentPosition(b) & 16;
+} : function(a, b){
+	return a !== b && (a.contains ? a.contains(b) : true);
+};
+
+var isXML = function(elem){
+	return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
+		!!elem.ownerDocument && isXML( elem.ownerDocument );
+};
+
+var posProcess = function(selector, context){
+	var tmpSet = [], later = "", match,
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.filter = Sizzle.filter;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+
+Sizzle.selectors.filters.hidden = function(elem){
+	return elem.offsetWidth === 0 || elem.offsetHeight === 0;
+};
+
+Sizzle.selectors.filters.visible = function(elem){
+	return elem.offsetWidth > 0 || elem.offsetHeight > 0;
+};
+
+Sizzle.selectors.filters.animated = function(elem){
+	return jQuery.grep(jQuery.timers, function(fn){
+		return elem === fn.elem;
+	}).length;
+};
+
+jQuery.multiFilter = function( expr, elems, not ) {
+	if ( not ) {
+		expr = ":not(" + expr + ")";
+	}
+
+	return Sizzle.matches(expr, elems);
+};
+
+jQuery.dir = function( elem, dir ){
+	var matched = [], cur = elem[dir];
+	while ( cur && cur != document ) {
+		if ( cur.nodeType == 1 )
+			matched.push( cur );
+		cur = cur[dir];
+	}
+	return matched;
+};
+
+jQuery.nth = function(cur, result, dir, elem){
+	result = result || 1;
+	var num = 0;
+
+	for ( ; cur; cur = cur[dir] )
+		if ( cur.nodeType == 1 && ++num == result )
+			break;
+
+	return cur;
+};
+
+jQuery.sibling = function(n, elem){
+	var r = [];
+
+	for ( ; n; n = n.nextSibling ) {
+		if ( n.nodeType == 1 && n != elem )
+			r.push( n );
+	}
+
+	return r;
+};
+
+return;
+
+window.Sizzle = Sizzle;
+
+})();
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+	// Bind an event to an element
+	// Original by Dean Edwards
+	add: function(elem, types, handler, data) {
+		if ( elem.nodeType == 3 || elem.nodeType == 8 )
+			return;
+
+		// For whatever reason, IE has trouble passing the window object
+		// around, causing it to be cloned in the process
+		if ( elem.setInterval && elem != window )
+			elem = window;
+
+		// Make sure that the function being executed has a unique ID
+		if ( !handler.guid )
+			handler.guid = this.guid++;
+
+		// if data is passed, bind to handler
+		if ( data !== undefined ) {
+			// Create temporary function pointer to original handler
+			var fn = handler;
+
+			// Create unique handler function, wrapped around original handler
+			handler = this.proxy( fn );
+
+			// Store data in unique handler
+			handler.data = data;
+		}
+
+		// Init the element's event structure
+		var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
+			handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
+				// Handle the second event of a trigger and when
+				// an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
+					jQuery.event.handle.apply(arguments.callee.elem, arguments) :
+					undefined;
+			});
+		// Add elem as a property of the handle function
+		// This is to prevent a memory leak with non-native
+		// event in IE.
+		handle.elem = elem;
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		jQuery.each(types.split(/\s+/), function(index, type) {
+			// Namespaced event handlers
+			var namespaces = type.split(".");
+			type = namespaces.shift();
+			handler.type = namespaces.slice().sort().join(".");
+
+			// Get the current list of functions bound to this event
+			var handlers = events[type];
+			
+			if ( jQuery.event.specialAll[type] )
+				jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
+
+			// Init the event handler queue
+			if (!handlers) {
+				handlers = events[type] = {};
+
+				// Check for a special event handler
+				// Only use addEventListener/attachEvent if the special
+				// events handler returns false
+				if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
+					// Bind the global event handler to the element
+					if (elem.addEventListener)
+						elem.addEventListener(type, handle, false);
+					else if (elem.attachEvent)
+						elem.attachEvent("on" + type, handle);
+				}
+			}
+
+			// Add the function to the element's handler list
+			handlers[handler.guid] = handler;
+
+			// Keep track of which events have been used, for global triggering
+			jQuery.event.global[type] = true;
+		});
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	guid: 1,
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function(elem, types, handler) {
+		// don't do events on text and comment nodes
+		if ( elem.nodeType == 3 || elem.nodeType == 8 )
+			return;
+
+		var events = jQuery.data(elem, "events"), ret, index;
+
+		if ( events ) {
+			// Unbind all events for the element
+			if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
+				for ( var type in events )
+					this.remove( elem, type + (types || "") );
+			else {
+				// types is actually an event object here
+				if ( types.type ) {
+					handler = types.handler;
+					types = types.type;
+				}
+
+				// Handle multiple events seperated by a space
+				// jQuery(...).unbind("mouseover mouseout", fn);
+				jQuery.each(types.split(/\s+/), function(index, type){
+					// Namespaced event handlers
+					var namespaces = type.split(".");
+					type = namespaces.shift();
+					var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
+
+					if ( events[type] ) {
+						// remove the given handler for the given type
+						if ( handler )
+							delete events[type][handler.guid];
+
+						// remove all handlers for the given type
+						else
+							for ( var handle in events[type] )
+								// Handle the removal of namespaced events
+								if ( namespace.test(events[type][handle].type) )
+									delete events[type][handle];
+									
+						if ( jQuery.event.specialAll[type] )
+							jQuery.event.specialAll[type].teardown.call(elem, namespaces);
+
+						// remove generic event handler if no more handlers exist
+						for ( ret in events[type] ) break;
+						if ( !ret ) {
+							if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
+								if (elem.removeEventListener)
+									elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
+								else if (elem.detachEvent)
+									elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
+							}
+							ret = null;
+							delete events[type];
+						}
+					}
+				});
+			}
+
+			// Remove the expando if it's no longer used
+			for ( ret in events ) break;
+			if ( !ret ) {
+				var handle = jQuery.data( elem, "handle" );
+				if ( handle ) handle.elem = null;
+				jQuery.removeData( elem, "events" );
+				jQuery.removeData( elem, "handle" );
+			}
+		}
+	},
+
+	// bubbling is internal
+	trigger: function( event, data, elem, bubbling ) {
+		// Event object or event type
+		var type = event.type || event;
+
+		if( !bubbling ){
+			event = typeof event === "object" ?
+				// jQuery.Event object
+				event[expando] ? event :
+				// Object literal
+				jQuery.extend( jQuery.Event(type), event ) :
+				// Just the event type (string)
+				jQuery.Event(type);
+
+			if ( type.indexOf("!") >= 0 ) {
+				event.type = type = type.slice(0, -1);
+				event.exclusive = true;
+			}
+
+			// Handle a global trigger
+			if ( !elem ) {
+				// Don't bubble custom events when global (to avoid too much overhead)
+				event.stopPropagation();
+				// Only trigger if we've ever bound an event for it
+				if ( this.global[type] )
+					jQuery.each( jQuery.cache, function(){
+						if ( this.events && this.events[type] )
+							jQuery.event.trigger( event, data, this.handle.elem );
+					});
+			}
+
+			// Handle triggering a single element
+
+			// don't do events on text and comment nodes
+			if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
+				return undefined;
+			
+			// Clean up in case it is reused
+			event.result = undefined;
+			event.target = elem;
+			
+			// Clone the incoming data, if any
+			data = jQuery.makeArray(data);
+			data.unshift( event );
+		}
+
+		event.currentTarget = elem;
+
+		// Trigger the event, it is assumed that "handle" is a function
+		var handle = jQuery.data(elem, "handle");
+		if ( handle )
+			handle.apply( elem, data );
+
+		// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
+		if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
+			event.result = false;
+
+		// Trigger the native events (except for clicks on links)
+		if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
+			this.triggered = true;
+			try {
+				elem[ type ]();
+			// prevent IE from throwing an error for some hidden elements
+			} catch (e) {}
+		}
+
+		this.triggered = false;
+
+		if ( !event.isPropagationStopped() ) {
+			var parent = elem.parentNode || elem.ownerDocument;
+			if ( parent )
+				jQuery.event.trigger(event, data, parent, true);
+		}
+	},
+
+	handle: function(event) {
+		// returned undefined or false
+		var all, handlers;
+
+		event = arguments[0] = jQuery.event.fix( event || window.event );
+		event.currentTarget = this;
+		
+		// Namespaced event handlers
+		var namespaces = event.type.split(".");
+		event.type = namespaces.shift();
+
+		// Cache this now, all = true means, any handler
+		all = !namespaces.length && !event.exclusive;
+		
+		var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
+
+		handlers = ( jQuery.data(this, "events") || {} )[event.type];
+
+		for ( var j in handlers ) {
+			var handler = handlers[j];
+
+			// Filter the functions by class
+			if ( all || namespace.test(handler.type) ) {
+				// Pass in a reference to the handler function itself
+				// So that we can later remove it
+				event.handler = handler;
+				event.data = handler.data;
+
+				var ret = handler.apply(this, arguments);
+
+				if( ret !== undefined ){
+					event.result = ret;
+					if ( ret === false ) {
+						event.preventDefault();
+						event.stopPropagation();
+					}
+				}
+
+				if( event.isImmediatePropagationStopped() )
+					break;
+
+			}
+		}
+	},
+
+	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+	fix: function(event) {
+		if ( event[expando] )
+			return event;
+
+		// store a copy of the original event object
+		// and "clone" to set read-only properties
+		var originalEvent = event;
+		event = jQuery.Event( originalEvent );
+
+		for ( var i = this.props.length, prop; i; ){
+			prop = this.props[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary
+		if ( !event.target )
+			event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
+
+		// check if target is a textnode (safari)
+		if ( event.target.nodeType == 3 )
+			event.target = event.target.parentNode;
+
+		// Add relatedTarget, if necessary
+		if ( !event.relatedTarget && event.fromElement )
+			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
+
+		// Calculate pageX/Y if missing and clientX/Y available
+		if ( event.pageX == null && event.clientX != null ) {
+			var doc = document.documentElement, body = document.body;
+			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
+			event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
+		}
+
+		// Add which for key events
+		if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
+			event.which = event.charCode || event.keyCode;
+
+		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+		if ( !event.metaKey && event.ctrlKey )
+			event.metaKey = event.ctrlKey;
+
+		// Add which for click: 1 == left; 2 == middle; 3 == right
+		// Note: button is not normalized, so don't use it
+		if ( !event.which && event.button )
+			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+
+		return event;
+	},
+
+	proxy: function( fn, proxy ){
+		proxy = proxy || function(){ return fn.apply(this, arguments); };
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
+		// So proxy can be declared as an argument
+		return proxy;
+	},
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: bindReady,
+			teardown: function() {}
+		}
+	},
+	
+	specialAll: {
+		live: {
+			setup: function( selector, namespaces ){
+				jQuery.event.add( this, namespaces[0], liveHandler );
+			},
+			teardown:  function( namespaces ){
+				if ( namespaces.length ) {
+					var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
+					
+					jQuery.each( (jQuery.data(this, "events").live || {}), function(){
+						if ( name.test(this.type) )
+							remove++;
+					});
+					
+					if ( remove < 1 )
+						jQuery.event.remove( this, namespaces[0], liveHandler );
+				}
+			}
+		}
+	}
+};
+
+jQuery.Event = function( src ){
+	// Allow instantiation without the 'new' keyword
+	if( !this.preventDefault )
+		return new jQuery.Event(src);
+	
+	// Event object
+	if( src && src.type ){
+		this.originalEvent = src;
+		this.type = src.type;
+	// Event type
+	}else
+		this.type = src;
+
+	// timeStamp is buggy for some events on Firefox(#3843)
+	// So we won't rely on the native value
+	this.timeStamp = now();
+	
+	// Mark it as fixed
+	this[expando] = true;
+};
+
+function returnFalse(){
+	return false;
+}
+function returnTrue(){
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if( !e )
+			return;
+		// if preventDefault exists run it on the original event
+		if (e.preventDefault)
+			e.preventDefault();
+		// otherwise set the returnValue property of the original event to false (IE)
+		e.returnValue = false;
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if( !e )
+			return;
+		// if stopPropagation exists run it on the original event
+		if (e.stopPropagation)
+			e.stopPropagation();
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation:function(){
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function(event) {
+	// Check if mouse(over|out) are still within the same parent element
+	var parent = event.relatedTarget;
+	// Traverse up the tree
+	while ( parent && parent != this )
+		try { parent = parent.parentNode; }
+		catch(e) { parent = this; }
+	
+	if( parent != this ){
+		// set the correct event type
+		event.type = event.data;
+		// handle event if we actually just moused on to a non sub-element
+		jQuery.event.handle.apply( this, arguments );
+	}
+};
+	
+jQuery.each({ 
+	mouseover: 'mouseenter', 
+	mouseout: 'mouseleave'
+}, function( orig, fix ){
+	jQuery.event.special[ fix ] = {
+		setup: function(){
+			jQuery.event.add( this, orig, withinElement, fix );
+		},
+		teardown: function(){
+			jQuery.event.remove( this, orig, withinElement );
+		}
+	};			   
+});
+
+jQuery.fn.extend({
+	bind: function( type, data, fn ) {
+		return type == "unload" ? this.one(type, data, fn) : this.each(function(){
+			jQuery.event.add( this, type, fn || data, fn && data );
+		});
+	},
+
+	one: function( type, data, fn ) {
+		var one = jQuery.event.proxy( fn || data, function(event) {
+			jQuery(this).unbind(event, one);
+			return (fn || data).apply( this, arguments );
+		});
+		return this.each(function(){
+			jQuery.event.add( this, type, one, fn && data);
+		});
+	},
+
+	unbind: function( type, fn ) {
+		return this.each(function(){
+			jQuery.event.remove( this, type, fn );
+		});
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function(){
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+
+	triggerHandler: function( type, data ) {
+		if( this[0] ){
+			var event = jQuery.Event(type);
+			event.preventDefault();
+			event.stopPropagation();
+			jQuery.event.trigger( event, data, this[0] );
+			return event.result;
+		}		
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments, i = 1;
+
+		// link all the functions, so any of them can unbind this click handler
+		while( i < args.length )
+			jQuery.event.proxy( fn, args[i++] );
+
+		return this.click( jQuery.event.proxy( fn, function(event) {
+			// Figure out which function to execute
+			this.lastToggle = ( this.lastToggle || 0 ) % i;
+
+			// Make sure that clicks stop
+			event.preventDefault();
+
+			// and execute the function
+			return args[ this.lastToggle++ ].apply( this, arguments ) || false;
+		}));
+	},
+
+	hover: function(fnOver, fnOut) {
+		return this.mouseenter(fnOver).mouseleave(fnOut);
+	},
+
+	ready: function(fn) {
+		// Attach the listeners
+		bindReady();
+
+		// If the DOM is already ready
+		if ( jQuery.isReady )
+			// Execute the function immediately
+			fn.call( document, jQuery );
+
+		// Otherwise, remember the function for later
+		else
+			// Add the function to the wait list
+			jQuery.readyList.push( fn );
+
+		return this;
+	},
+	
+	live: function( type, fn ){
+		var proxy = jQuery.event.proxy( fn );
+		proxy.guid += this.selector + type;
+
+		jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
+
+		return this;
+	},
+	
+	die: function( type, fn ){
+		jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
+		return this;
+	}
+});
+
+function liveHandler( event ){
+	var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
+		stop = true,
+		elems = [];
+
+	jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
+		if ( check.test(fn.type) ) {
+			var elem = jQuery(event.target).closest(fn.data)[0];
+			if ( elem )
+				elems.push({ elem: elem, fn: fn });
+		}
+	});
+
+	elems.sort(function(a,b) {
+		return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest");
+	});
+	
+	jQuery.each(elems, function(){
+		if ( this.fn.call(this.elem, event, this.fn.data) === false )
+			return (stop = false);
+	});
+
+	return stop;
+}
+
+function liveConvert(type, selector){
+	return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
+}
+
+jQuery.extend({
+	isReady: false,
+	readyList: [],
+	// Handle when the DOM is ready
+	ready: function() {
+		// Make sure that the DOM is not already loaded
+		if ( !jQuery.isReady ) {
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If there are functions bound, to execute
+			if ( jQuery.readyList ) {
+				// Execute all of them
+				jQuery.each( jQuery.readyList, function(){
+					this.call( document, jQuery );
+				});
+
+				// Reset the list of functions
+				jQuery.readyList = null;
+			}
+
+			// Trigger any bound ready events
+			jQuery(document).triggerHandler("ready");
+		}
+	}
+});
+
+var readyBound = false;
+
+function bindReady(){
+	if ( readyBound ) return;
+	readyBound = true;
+
+	// Mozilla, Opera and webkit nightlies currently support this event
+	if ( document.addEventListener ) {
+		// Use the handy event callback
+		document.addEventListener( "DOMContentLoaded", function(){
+			document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
+			jQuery.ready();
+		}, false );
+
+	// If IE event model is used
+	} else if ( document.attachEvent ) {
+		// ensure firing before onload,
+		// maybe late but safe also for iframes
+		document.attachEvent("onreadystatechange", function(){
+			if ( document.readyState === "complete" ) {
+				document.detachEvent( "onreadystatechange", arguments.callee );
+				jQuery.ready();
+			}
+		});
+
+		// If IE and not an iframe
+		// continually check to see if the document is ready
+		if ( document.documentElement.doScroll && window == window.top ) (function(){
+			if ( jQuery.isReady ) return;
+
+			try {
+				// If IE is used, use the trick by Diego Perini
+				// http://javascript.nwbox.com/IEContentLoaded/
+				document.documentElement.doScroll("left");
+			} catch( error ) {
+				setTimeout( arguments.callee, 0 );
+				return;
+			}
+
+			// and execute any waiting functions
+			jQuery.ready();
+		})();
+	}
+
+	// A fallback to window.onload, that will always work
+	jQuery.event.add( window, "load", jQuery.ready );
+}
+
+jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
+	"mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
+	"change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
+
+	// Handle event binding
+	jQuery.fn[name] = function(fn){
+		return fn ? this.bind(name, fn) : this.trigger(name);
+	};
+});
+
+// Prevent memory leaks in IE
+// And prevent errors on refresh with events like mouseover in other browsers
+// Window isn't included so as not to unbind existing unload events
+jQuery( window ).bind( 'unload', function(){ 
+	for ( var id in jQuery.cache )
+		// Skip the window
+		if ( id != 1 && jQuery.cache[ id ].handle )
+			jQuery.event.remove( jQuery.cache[ id ].handle.elem );
+}); 
+(function(){
+
+	jQuery.support = {};
+
+	var root = document.documentElement,
+		script = document.createElement("script"),
+		div = document.createElement("div"),
+		id = "script" + (new Date).getTime();
+
+	div.style.display = "none";
+	div.innerHTML = '   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';
+
+	var all = div.getElementsByTagName("*"),
+		a = div.getElementsByTagName("a")[0];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return;
+	}
+
+	jQuery.support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: div.firstChild.nodeType == 3,
+		
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+		
+		// Make sure that you can get all elements in an <object> element
+		// IE 7 always returns no results
+		objectAll: !!div.getElementsByTagName("object")[0]
+			.getElementsByTagName("*").length,
+		
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+		
+		// Get the style information from getAttribute
+		// (IE uses .cssText insted)
+		style: /red/.test( a.getAttribute("style") ),
+		
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: a.getAttribute("href") === "/a",
+		
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		opacity: a.style.opacity === "0.5",
+		
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Will be defined later
+		scriptEval: false,
+		noCloneEvent: true,
+		boxModel: null
+	};
+	
+	script.type = "text/javascript";
+	try {
+		script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
+	} catch(e){}
+
+	root.insertBefore( script, root.firstChild );
+	
+	// Make sure that the execution of code works by injecting a script
+	// tag with appendChild/createTextNode
+	// (IE doesn't support this, fails, and uses .text instead)
+	if ( window[ id ] ) {
+		jQuery.support.scriptEval = true;
+		delete window[ id ];
+	}
+
+	root.removeChild( script );
+
+	if ( div.attachEvent && div.fireEvent ) {
+		div.attachEvent("onclick", function(){
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			jQuery.support.noCloneEvent = false;
+			div.detachEvent("onclick", arguments.callee);
+		});
+		div.cloneNode(true).fireEvent("onclick");
+	}
+
+	// Figure out if the W3C box model works as expected
+	// document.body must exist before we can do this
+	jQuery(function(){
+		var div = document.createElement("div");
+		div.style.width = div.style.paddingLeft = "1px";
+
+		document.body.appendChild( div );
+		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
+		document.body.removeChild( div ).style.display = 'none';
+	});
+})();
+
+var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
+
+jQuery.props = {
+	"for": "htmlFor",
+	"class": "className",
+	"float": styleFloat,
+	cssFloat: styleFloat,
+	styleFloat: styleFloat,
+	readonly: "readOnly",
+	maxlength: "maxLength",
+	cellspacing: "cellSpacing",
+	rowspan: "rowSpan",
+	tabindex: "tabIndex"
+};
+jQuery.fn.extend({
+	// Keep a copy of the old load
+	_load: jQuery.fn.load,
+
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" )
+			return this._load( url );
+
+		var off = url.indexOf(" ");
+		if ( off >= 0 ) {
+			var selector = url.slice(off, url.length);
+			url = url.slice(0, off);
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params )
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = null;
+
+			// Otherwise, build a param string
+			} else if( typeof params === "object" ) {
+				params = jQuery.param( params );
+				type = "POST";
+			}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			complete: function(res, status){
+				// If successful, inject the HTML into all the matched elements
+				if ( status == "success" || status == "notmodified" )
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div/>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						res.responseText );
+
+				if( callback )
+					self.each( callback, [res.responseText, status, res] );
+			}
+		});
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param(this.serializeArray());
+	},
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray(this.elements) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				(this.checked || /select|textarea/i.test(this.nodeName) ||
+					/text|hidden|password|search/i.test(this.type));
+		})
+		.map(function(i, elem){
+			var val = jQuery(this).val();
+			return val == null ? null :
+				jQuery.isArray(val) ?
+					jQuery.map( val, function(val, i){
+						return {name: elem.name, value: val};
+					}) :
+					{name: elem.name, value: val};
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
+	jQuery.fn[o] = function(f){
+		return this.bind(o, f);
+	};
+});
+
+var jsc = now();
+
+jQuery.extend({
+  
+	get: function( url, data, callback, type ) {
+		// shift arguments if data argument was ommited
+		if ( jQuery.isFunction( data ) ) {
+			callback = data;
+			data = null;
+		}
+
+		return jQuery.ajax({
+			type: "GET",
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get(url, null, callback, "script");
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get(url, data, callback, "json");
+	},
+
+	post: function( url, data, callback, type ) {
+		if ( jQuery.isFunction( data ) ) {
+			callback = data;
+			data = {};
+		}
+
+		return jQuery.ajax({
+			type: "POST",
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	},
+
+	ajaxSetup: function( settings ) {
+		jQuery.extend( jQuery.ajaxSettings, settings );
+	},
+
+	ajaxSettings: {
+		url: location.href,
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		username: null,
+		password: null,
+		*/
+		// Create the request object; Microsoft failed to properly
+		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
+		// This function can be overriden by calling jQuery.ajaxSetup
+		xhr:function(){
+			return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
+		},
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			script: "text/javascript, application/javascript",
+			json: "application/json, text/javascript",
+			text: "text/plain",
+			_default: "*/*"
+		}
+	},
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+
+	ajax: function( s ) {
+		// Extend the settings, but re-extend 's' so that it can be
+		// checked again later (in the test suite, specifically)
+		s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
+
+		var jsonp, jsre = /=\?(&|$)/g, status, data,
+			type = s.type.toUpperCase();
+
+		// convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" )
+			s.data = jQuery.param(s.data);
+
+		// Handle JSONP Parameter Callbacks
+		if ( s.dataType == "jsonp" ) {
+			if ( type == "GET" ) {
+				if ( !s.url.match(jsre) )
+					s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
+			} else if ( !s.data || !s.data.match(jsre) )
+				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
+			s.dataType = "json";
+		}
+
+		// Build temporary JSONP function
+		if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
+			jsonp = "jsonp" + jsc++;
+
+			// Replace the =? sequence both in the query string and the data
+			if ( s.data )
+				s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
+			s.url = s.url.replace(jsre, "=" + jsonp + "$1");
+
+			// We need to make sure
+			// that a JSONP style response is executed properly
+			s.dataType = "script";
+
+			// Handle JSONP-style loading
+			window[ jsonp ] = function(tmp){
+				data = tmp;
+				success();
+				complete();
+				// Garbage collect
+				window[ jsonp ] = undefined;
+				try{ delete window[ jsonp ]; } catch(e){}
+				if ( head )
+					head.removeChild( script );
+			};
+		}
+
+		if ( s.dataType == "script" && s.cache == null )
+			s.cache = false;
+
+		if ( s.cache === false && type == "GET" ) {
+			var ts = now();
+			// try replacing _= if it is there
+			var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
+			// if nothing was replaced, add timestamp to the end
+			s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
+		}
+
+		// If data is available, append data to url for get requests
+		if ( s.data && type == "GET" ) {
+			s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
+
+			// IE likes to send both get and post data, prevent this
+			s.data = null;
+		}
+
+		// Watch for a new set of requests
+		if ( s.global && ! jQuery.active++ )
+			jQuery.event.trigger( "ajaxStart" );
+
+		// Matches an absolute URL, and saves the domain
+		var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
+
+		// If we're requesting a remote document
+		// and trying to load JSON or Script with a GET
+		if ( s.dataType == "script" && type == "GET" && parts
+			&& ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
+
+			var head = document.getElementsByTagName("head")[0];
+			var script = document.createElement("script");
+			script.src = s.url;
+			if (s.scriptCharset)
+				script.charset = s.scriptCharset;
+
+			// Handle Script loading
+			if ( !jsonp ) {
+				var done = false;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function(){
+					if ( !done && (!this.readyState ||
+							this.readyState == "loaded" || this.readyState == "complete") ) {
+						done = true;
+						success();
+						complete();
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+						head.removeChild( script );
+					}
+				};
+			}
+
+			head.appendChild(script);
+
+			// We handle everything using the script element injection
+			return undefined;
+		}
+
+		var requestDone = false;
+
+		// Create the request object
+		var xhr = s.xhr();
+
+		// Open the socket
+		// Passing null username, generates a login popup on Opera (#2865)
+		if( s.username )
+			xhr.open(type, s.url, s.async, s.username, s.password);
+		else
+			xhr.open(type, s.url, s.async);
+
+		// Need an extra try/catch for cross domain requests in Firefox 3
+		try {
+			// Set the correct header, if data is being sent
+			if ( s.data )
+				xhr.setRequestHeader("Content-Type", s.contentType);
+
+			// Set the If-Modified-Since header, if ifModified mode.
+			if ( s.ifModified )
+				xhr.setRequestHeader("If-Modified-Since",
+					jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
+
+			// Set header so the called script knows that it's an XMLHttpRequest
+			xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+
+			// Set the Accepts header for the server, depending on the dataType
+			xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
+				s.accepts[ s.dataType ] + ", */*" :
+				s.accepts._default );
+		} catch(e){}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
+			// Handle the global AJAX counter
+			if ( s.global && ! --jQuery.active )
+				jQuery.event.trigger( "ajaxStop" );
+			// close opended socket
+			xhr.abort();
+			return false;
+		}
+
+		if ( s.global )
+			jQuery.event.trigger("ajaxSend", [xhr, s]);
+
+		// Wait for a response to come back
+		var onreadystatechange = function(isTimeout){
+			// The request was aborted, clear the interval and decrement jQuery.active
+			if (xhr.readyState == 0) {
+				if (ival) {
+					// clear poll interval
+					clearInterval(ival);
+					ival = null;
+					// Handle the global AJAX counter
+					if ( s.global && ! --jQuery.active )
+						jQuery.event.trigger( "ajaxStop" );
+				}
+			// The transfer is complete and the data is available, or the request timed out
+			} else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
+				requestDone = true;
+
+				// clear poll interval
+				if (ival) {
+					clearInterval(ival);
+					ival = null;
+				}
+
+				status = isTimeout == "timeout" ? "timeout" :
+					!jQuery.httpSuccess( xhr ) ? "error" :
+					s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
+					"success";
+
+				if ( status == "success" ) {
+					// Watch for, and catch, XML document parse errors
+					try {
+						// process the data (runs the xml through httpData regardless of callback)
+						data = jQuery.httpData( xhr, s.dataType, s );
+					} catch(e) {
+						status = "parsererror";
+					}
+				}
+
+				// Make sure that the request was successful or notmodified
+				if ( status == "success" ) {
+					// Cache Last-Modified header, if ifModified mode.
+					var modRes;
+					try {
+						modRes = xhr.getResponseHeader("Last-Modified");
+					} catch(e) {} // swallow exception thrown by FF if header is not available
+
+					if ( s.ifModified && modRes )
+						jQuery.lastModified[s.url] = modRes;
+
+					// JSONP handles its own success callback
+					if ( !jsonp )
+						success();
+				} else
+					jQuery.handleError(s, xhr, status);
+
+				// Fire the complete handlers
+				complete();
+
+				if ( isTimeout )
+					xhr.abort();
+
+				// Stop memory leaks
+				if ( s.async )
+					xhr = null;
+			}
+		};
+
+		if ( s.async ) {
+			// don't attach the handler to the request, just poll it instead
+			var ival = setInterval(onreadystatechange, 13);
+
+			// Timeout checker
+			if ( s.timeout > 0 )
+				setTimeout(function(){
+					// Check to see if the request is still happening
+					if ( xhr && !requestDone )
+						onreadystatechange( "timeout" );
+				}, s.timeout);
+		}
+
+		// Send the data
+		try {
+			xhr.send(s.data);
+		} catch(e) {
+			jQuery.handleError(s, xhr, null, e);
+		}
+
+		// firefox 1.5 doesn't fire statechange for sync requests
+		if ( !s.async )
+			onreadystatechange();
+
+		function success(){
+			// If a local callback was specified, fire it and pass it the data
+			if ( s.success )
+				s.success( data, status );
+
+			// Fire the global callback
+			if ( s.global )
+				jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
+		}
+
+		function complete(){
+			// Process result
+			if ( s.complete )
+				s.complete(xhr, status);
+
+			// The request was completed
+			if ( s.global )
+				jQuery.event.trigger( "ajaxComplete", [xhr, s] );
+
+			// Handle the global AJAX counter
+			if ( s.global && ! --jQuery.active )
+				jQuery.event.trigger( "ajaxStop" );
+		}
+
+		// return XMLHttpRequest to allow aborting the request etc.
+		return xhr;
+	},
+
+	handleError: function( s, xhr, status, e ) {
+		// If a local callback was specified, fire it
+		if ( s.error ) s.error( xhr, status, e );
+
+		// Fire the global callback
+		if ( s.global )
+			jQuery.event.trigger( "ajaxError", [xhr, s, e] );
+	},
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Determines if an XMLHttpRequest was successful or not
+	httpSuccess: function( xhr ) {
+		try {
+			// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
+			return !xhr.status && location.protocol == "file:" ||
+				( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
+		} catch(e){}
+		return false;
+	},
+
+	// Determines if an XMLHttpRequest returns NotModified
+	httpNotModified: function( xhr, url ) {
+		try {
+			var xhrRes = xhr.getResponseHeader("Last-Modified");
+
+			// Firefox always returns 200. check Last-Modified date
+			return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
+		} catch(e){}
+		return false;
+	},
+
+	httpData: function( xhr, type, s ) {
+		var ct = xhr.getResponseHeader("content-type"),
+			xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
+			data = xml ? xhr.responseXML : xhr.responseText;
+
+		if ( xml && data.documentElement.tagName == "parsererror" )
+			throw "parsererror";
+			
+		// Allow a pre-filtering function to sanitize the response
+		// s != null is checked to keep backwards compatibility
+		if( s && s.dataFilter )
+			data = s.dataFilter( data, type );
+
+		// The filter can actually parse the response
+		if( typeof data === "string" ){
+
+			// If the type is "script", eval it in global context
+			if ( type == "script" )
+				jQuery.globalEval( data );
+
+			// Get the JavaScript object, if JSON is used.
+			if ( type == "json" )
+				data = window["eval"]("(" + data + ")");
+		}
+		
+		return data;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a ) {
+		var s = [ ];
+
+		function add( key, value ){
+			s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
+		};
+
+		// If an array was passed in, assume that it is an array
+		// of form elements
+		if ( jQuery.isArray(a) || a.jquery )
+			// Serialize the form elements
+			jQuery.each( a, function(){
+				add( this.name, this.value );
+			});
+
+		// Otherwise, assume that it's an object of key/value pairs
+		else
+			// Serialize the key/values
+			for ( var j in a )
+				// If the value is an array then the key names need to be repeated
+				if ( jQuery.isArray(a[j]) )
+					jQuery.each( a[j], function(){
+						add( j, this );
+					});
+				else
+					add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
+
+		// Return the resulting serialization
+		return s.join("&").replace(/%20/g, "+");
+	}
+
+});
+var elemdisplay = {},
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	];
+
+function genFx( type, num ){
+	var obj = {};
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
+		obj[ this ] = type;
+	});
+	return obj;
+}
+
+jQuery.fn.extend({
+	show: function(speed,callback){
+		if ( speed ) {
+			return this.animate( genFx("show", 3), speed, callback);
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ){
+				var old = jQuery.data(this[i], "olddisplay");
+				
+				this[i].style.display = old || "";
+				
+				if ( jQuery.css(this[i], "display") === "none" ) {
+					var tagName = this[i].tagName, display;
+					
+					if ( elemdisplay[ tagName ] ) {
+						display = elemdisplay[ tagName ];
+					} else {
+						var elem = jQuery("<" + tagName + " />").appendTo("body");
+						
+						display = elem.css("display");
+						if ( display === "none" )
+							display = "block";
+						
+						elem.remove();
+						
+						elemdisplay[ tagName ] = display;
+					}
+					
+					jQuery.data(this[i], "olddisplay", display);
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( var i = 0, l = this.length; i < l; i++ ){
+				this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
+			}
+			
+			return this;
+		}
+	},
+
+	hide: function(speed,callback){
+		if ( speed ) {
+			return this.animate( genFx("hide", 3), speed, callback);
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ){
+				var old = jQuery.data(this[i], "olddisplay");
+				if ( !old && old !== "none" )
+					jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( var i = 0, l = this.length; i < l; i++ ){
+				this[i].style.display = "none";
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2 ){
+		var bool = typeof fn === "boolean";
+
+		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
+			this._toggle.apply( this, arguments ) :
+			fn == null || bool ?
+				this.each(function(){
+					var state = bool ? fn : jQuery(this).is(":hidden");
+					jQuery(this)[ state ? "show" : "hide" ]();
+				}) :
+				this.animate(genFx("toggle", 3), fn, fn2);
+	},
+
+	fadeTo: function(speed,to,callback){
+		return this.animate({opacity: to}, speed, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed(speed, easing, callback);
+
+		return this[ optall.queue === false ? "each" : "queue" ](function(){
+		
+			var opt = jQuery.extend({}, optall), p,
+				hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
+				self = this;
+	
+			for ( p in prop ) {
+				if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
+					return opt.complete.call(this);
+
+				if ( ( p == "height" || p == "width" ) && this.style ) {
+					// Store display property
+					opt.display = jQuery.css(this, "display");
+
+					// Make sure that nothing sneaks out
+					opt.overflow = this.style.overflow;
+				}
+			}
+
+			if ( opt.overflow != null )
+				this.style.overflow = "hidden";
+
+			opt.curAnim = jQuery.extend({}, prop);
+
+			jQuery.each( prop, function(name, val){
+				var e = new jQuery.fx( self, opt, name );
+
+				if ( /toggle|show|hide/.test(val) )
+					e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+				else {
+					var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
+						start = e.cur(true) || 0;
+
+					if ( parts ) {
+						var end = parseFloat(parts[2]),
+							unit = parts[3] || "px";
+
+						// We need to compute starting value
+						if ( unit != "px" ) {
+							self.style[ name ] = (end || 1) + unit;
+							start = ((end || 1) / e.cur(true)) * start;
+							self.style[ name ] = start + unit;
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] )
+							end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
+
+						e.custom( start, end, unit );
+					} else
+						e.custom( start, val, "" );
+				}
+			});
+
+			// For JS strict compliance
+			return true;
+		});
+	},
+
+	stop: function(clearQueue, gotoEnd){
+		var timers = jQuery.timers;
+
+		if (clearQueue)
+			this.queue([]);
+
+		this.each(function(){
+			// go in reverse order so anything added to the queue during the loop is ignored
+			for ( var i = timers.length - 1; i >= 0; i-- )
+				if ( timers[i].elem == this ) {
+					if (gotoEnd)
+						// force the next step to be the last
+						timers[i](true);
+					timers.splice(i, 1);
+				}
+		});
+
+		// start the next in the queue if the last step wasn't forced
+		if (!gotoEnd)
+			this.dequeue();
+
+		return this;
+	}
+
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show", 1),
+	slideUp: genFx("hide", 1),
+	slideToggle: genFx("toggle", 1),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" }
+}, function( name, props ){
+	jQuery.fn[ name ] = function( speed, callback ){
+		return this.animate( props, speed, callback );
+	};
+});
+
+jQuery.extend({
+
+	speed: function(speed, easing, fn) {
+		var opt = typeof speed === "object" ? speed : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
+
+		// Queueing
+		opt.old = opt.complete;
+		opt.complete = function(){
+			if ( opt.queue !== false )
+				jQuery(this).dequeue();
+			if ( jQuery.isFunction( opt.old ) )
+				opt.old.call( this );
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ){
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		if ( !options.orig )
+			options.orig = {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+
+	// Simple function for setting a style value
+	update: function(){
+		if ( this.options.step )
+			this.options.step.call( this.elem, this.now, this );
+
+		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+
+		// Set display property to block for height/width animations
+		if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
+			this.elem.style.display = "block";
+	},
+
+	// Get the current size
+	cur: function(force){
+		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
+			return this.elem[ this.prop ];
+
+		var r = parseFloat(jQuery.css(this.elem, this.prop, force));
+		return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
+	},
+
+	// Start an animation from one number to another
+	custom: function(from, to, unit){
+		this.startTime = now();
+		this.start = from;
+		this.end = to;
+		this.unit = unit || this.unit || "px";
+		this.now = this.start;
+		this.pos = this.state = 0;
+
+		var self = this;
+		function t(gotoEnd){
+			return self.step(gotoEnd);
+		}
+
+		t.elem = this.elem;
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval(function(){
+				var timers = jQuery.timers;
+
+				for ( var i = 0; i < timers.length; i++ )
+					if ( !timers[i]() )
+						timers.splice(i--, 1);
+
+				if ( !timers.length ) {
+					clearInterval( timerId );
+					timerId = undefined;
+				}
+			}, 13);
+		}
+	},
+
+	// Simple 'show' function
+	show: function(){
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any
+		// flash of content
+		this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
+
+		// Start by showing the element
+		jQuery(this.elem).show();
+	},
+
+	// Simple 'hide' function
+	hide: function(){
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom(this.cur(), 0);
+	},
+
+	// Each step of an animation
+	step: function(gotoEnd){
+		var t = now();
+
+		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			this.options.curAnim[ this.prop ] = true;
+
+			var done = true;
+			for ( var i in this.options.curAnim )
+				if ( this.options.curAnim[i] !== true )
+					done = false;
+
+			if ( done ) {
+				if ( this.options.display != null ) {
+					// Reset the overflow
+					this.elem.style.overflow = this.options.overflow;
+
+					// Reset the display
+					this.elem.style.display = this.options.display;
+					if ( jQuery.css(this.elem, "display") == "none" )
+						this.elem.style.display = "block";
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( this.options.hide )
+					jQuery(this.elem).hide();
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( this.options.hide || this.options.show )
+					for ( var p in this.options.curAnim )
+						jQuery.attr(this.elem.style, p, this.options.orig[p]);
+					
+				// Execute the complete function
+				this.options.complete.call( this.elem );
+			}
+
+			return false;
+		} else {
+			var n = t - this.startTime;
+			this.state = n / this.options.duration;
+
+			// Perform the easing function, defaults to swing
+			this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
+			this.now = this.start + ((this.end - this.start) * this.pos);
+
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+
+};
+
+jQuery.extend( jQuery.fx, {
+	speeds:{
+		slow: 600,
+ 		fast: 200,
+ 		// Default speed
+ 		_default: 400
+	},
+	step: {
+
+		opacity: function(fx){
+			jQuery.attr(fx.elem.style, "opacity", fx.now);
+		},
+
+		_default: function(fx){
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
+				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+			else
+				fx.elem[ fx.prop ] = fx.now;
+		}
+	}
+});
+if ( document.documentElement["getBoundingClientRect"] )
+	jQuery.fn.offset = function() {
+		if ( !this[0] ) return { top: 0, left: 0 };
+		if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
+		var box  = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
+			clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			top  = box.top  + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
+			left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
+		return { top: top, left: left };
+	};
+else 
+	jQuery.fn.offset = function() {
+		if ( !this[0] ) return { top: 0, left: 0 };
+		if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
+		jQuery.offset.initialized || jQuery.offset.initialize();
+
+		var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
+			doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
+			body = doc.body, defaultView = doc.defaultView,
+			prevComputedStyle = defaultView.getComputedStyle(elem, null),
+			top = elem.offsetTop, left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			computedStyle = defaultView.getComputedStyle(elem, null);
+			top -= elem.scrollTop, left -= elem.scrollLeft;
+			if ( elem === offsetParent ) {
+				top += elem.offsetTop, left += elem.offsetLeft;
+				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
+					top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
+					left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
+				prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
+			}
+			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
+				top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
+				left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
+			top  += body.offsetTop,
+			left += body.offsetLeft;
+
+		if ( prevComputedStyle.position === "fixed" )
+			top  += Math.max(docElem.scrollTop, body.scrollTop),
+			left += Math.max(docElem.scrollLeft, body.scrollLeft);
+
+		return { top: top, left: left };
+	};
+
+jQuery.offset = {
+	initialize: function() {
+		if ( this.initialized ) return;
+		var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
+			html = '<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';
+
+		rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
+		for ( prop in rules ) container.style[prop] = rules[prop];
+
+		container.innerHTML = html;
+		body.insertBefore(container, body.firstChild);
+		innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
+
+		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+		innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
+		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+		body.style.marginTop = '1px';
+		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
+		body.style.marginTop = bodyMarginTop;
+
+		body.removeChild(container);
+		this.initialized = true;
+	},
+
+	bodyOffset: function(body) {
+		jQuery.offset.initialized || jQuery.offset.initialize();
+		var top = body.offsetTop, left = body.offsetLeft;
+		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
+			top  += parseInt( jQuery.curCSS(body, 'marginTop',  true), 10 ) || 0,
+			left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
+		return { top: top, left: left };
+	}
+};
+
+
+jQuery.fn.extend({
+	position: function() {
+		var left = 0, top = 0, results;
+
+		if ( this[0] ) {
+			// Get *real* offsetParent
+			var offsetParent = this.offsetParent(),
+
+			// Get correct offsets
+			offset       = this.offset(),
+			parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+			// Subtract element margins
+			// note: when an element has margin: auto the offsetLeft and marginLeft 
+			// are the same in Safari causing offset.left to incorrectly be 0
+			offset.top  -= num( this, 'marginTop'  );
+			offset.left -= num( this, 'marginLeft' );
+
+			// Add offsetParent borders
+			parentOffset.top  += num( offsetParent, 'borderTopWidth'  );
+			parentOffset.left += num( offsetParent, 'borderLeftWidth' );
+
+			// Subtract the two offsets
+			results = {
+				top:  offset.top  - parentOffset.top,
+				left: offset.left - parentOffset.left
+			};
+		}
+
+		return results;
+	},
+
+	offsetParent: function() {
+		var offsetParent = this[0].offsetParent || document.body;
+		while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
+			offsetParent = offsetParent.offsetParent;
+		return jQuery(offsetParent);
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ['Left', 'Top'], function(i, name) {
+	var method = 'scroll' + name;
+	
+	jQuery.fn[ method ] = function(val) {
+		if (!this[0]) return null;
+
+		return val !== undefined ?
+
+			// Set the scroll offset
+			this.each(function() {
+				this == window || this == document ?
+					window.scrollTo(
+						!i ? val : jQuery(window).scrollLeft(),
+						 i ? val : jQuery(window).scrollTop()
+					) :
+					this[ method ] = val;
+			}) :
+
+			// Return the scroll offset
+			this[0] == window || this[0] == document ?
+				self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
+					jQuery.boxModel && document.documentElement[ method ] ||
+					document.body[ method ] :
+				this[0][ method ];
+	};
+});
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function(i, name){
+
+	var tl = i ? "Left"  : "Top",  // top or left
+		br = i ? "Right" : "Bottom", // bottom or right
+		lower = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn["inner" + name] = function(){
+		return this[0] ?
+			jQuery.css( this[0], lower, false, "padding" ) :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn["outer" + name] = function(margin) {
+		return this[0] ?
+			jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) :
+			null;
+	};
+	
+	var type = name.toLowerCase();
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		return this[0] == window ?
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
+			document.body[ "client" + name ] :
+
+			// Get document width or height
+			this[0] == document ?
+				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+				Math.max(
+					document.documentElement["client" + name],
+					document.body["scroll" + name], document.documentElement["scroll" + name],
+					document.body["offset" + name], document.documentElement["offset" + name]
+				) :
+
+				// Get or set width or height on the element
+				size === undefined ?
+					// Get width or height on the element
+					(this.length ? jQuery.css( this[0], type ) : null) :
+
+					// Set the width or height on the element (default to pixels if value is unitless)
+					this.css( type, typeof size === "string" ? size : size + "px" );
+	};
+
+});
+})();

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/controller.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/controller.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/controller.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,94 @@
+var giTotalTestCount = 0;
+var giActiveModule = 0;
+var giModuleTests;
+var giStartTime;
+var giTest;
+var gbStop = false;
+var gtoTest;
+
+function fnTestStart ( sTestInfo )
+{
+	gaoTest[ giActiveModule ].iTests++;
+	document.getElementById('test_info').innerHTML += 
+		(giActiveModule+1)+'.'+(giModuleTests+1)+'. '+sTestInfo+'... ';
+	document.getElementById('test_number').innerHTML = giTotalTestCount+1;
+	giModuleTests++;
+	giTotalTestCount++;
+	
+	/* Set a timer to catch stalled script */
+	gtoTest = setTimeout( function () {
+		fnMessage( '<span class="error">WARNING - test script stalled. Likely a JS error</span>' );
+		gbStop = true;
+	}, 3000 );
+}
+
+function fnTestResult ( bResult )
+{
+	clearTimeout( gtoTest );
+	if ( bResult )
+	{
+		fnMessage( 'Passed' );
+	}
+	else
+	{
+		fnMessage( '<span class="error">FAILED</span>' );
+		gbStop = true;
+		fnEnd( false );
+	}
+}
+
+function fnUnitStart( iTest )
+{
+	if ( !gbStop )
+	{
+		giModuleTests = 0;
+		window.parent.test_arena.location.href = 
+			(iTest==0?"":"../")+'templates/'+gaoTest[iTest].sTemplate+'.php?scripts='+gaoTest[iTest].sTest;
+		giTest = iTest;
+	}
+}
+
+function fnStartMessage( sMessage )
+{
+	fnMessage( '<br><b>'+gaoTest[giTest].sGroup+' - '+sMessage+'</b>' );
+}
+
+function fnMessage( sMessage )
+{
+	var nInfo = document.getElementById('test_info');
+	nInfo.innerHTML += sMessage+'<br>';
+	nInfo.scrollTop = nInfo.scrollHeight;
+}
+
+function fnUnitComplete()
+{
+	if ( giActiveModule < gaoTest.length - 1 )
+	{
+		fnUnitStart( ++giActiveModule );
+	}
+	else
+	{
+		fnEnd( true );
+	}
+}
+
+function fnEnd( bSuccess )
+{ 
+	var iEndTime = new Date().getTime();
+	var sTime = '<br>This test run took '+parseInt((iEndTime-giStartTime)/1000, 10)+
+			' second(s) to complete.';
+	
+	if ( bSuccess )
+	{
+		$('#test_running').html( 'Tests complete. '+giTotalTestCount+' tests were run.'+sTime );
+	}
+	else
+	{
+		$('#test_running').html( 'Unit tests failed at test '+giTotalTestCount+'.'+sTime );
+	}
+}
+
+$(document).ready( function () {
+	giStartTime = new Date().getTime();
+	fnUnitStart( giActiveModule );
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/controller.php
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/controller.php	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/controller.php	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,100 @@
+<?php
+	header( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' ); 
+	header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); 
+	header( 'Cache-Control: no-store, no-cache, must-revalidate' ); 
+	header( 'Cache-Control: post-check=0, pre-check=0', false ); 
+	header( 'Pragma: no-cache' ); 
+?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+	"http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="Content-type" content="text/html; charset=utf-8">
+		<title>DataTables unit test controller</title>
+		
+		<style type="text/css" media="screen">
+			#controller {
+				font: 12px/1.45em "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+				margin: 0;
+				padding: 0 0 0 0.5em;
+				color: #333;
+				background-color: #fff;
+			}
+			
+			#test_info {
+				position: absolute;
+				top: 0;
+				right: 0;
+				width: 50%;
+				height: 100%;
+				font-size: 11px;
+				overflow: auto;
+			}
+			
+			.error {
+				color: red;
+			}
+			
+			#controller h1 {
+				color: #4E6CA3;
+				font-size: 18px;
+			}
+		</style>
+		
+		<script type="text/javascript" language="javascript" src="../js/jquery.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			var gaoTest = [
+			<?php
+				function fnReadDir( &$aReturn, $path )
+				{
+					$rDir = opendir( $path );
+        	while ( ($file = readdir($rDir)) !== false )
+					{
+						if ( $file == "." || $file == ".." || $file == ".DS_Store" )
+						{
+							continue;
+						}
+						else if ( is_dir( $path.'/'.$file ) )
+						{
+							fnReadDir( $aReturn, $path.'/'.$file );
+						}
+						else
+						{
+							array_push( $aReturn, $path.'/'.$file );
+						}
+					}
+					closedir($rDir);
+				}
+				
+				/* Get the tests dynamically from the 'tests' directory, and their templates */
+				$aFiles = array();
+				fnReadDir( &$aFiles, "tests" );
+				
+				for ( $i=0 ; $i<count($aFiles) ; $i++ )
+				{
+					$sTemplate;
+					$fp = fopen( $aFiles[$i], "r" );
+					fscanf( $fp, "// DATA_TEMPLATE: %s", &$sTemplate );
+					fclose( $fp );
+					
+					$aPath = split('/', $aFiles[$i]);
+					
+					echo '{ '.
+						'"sTemplate": "'.$sTemplate.'", '.
+						'"sTest": "'.$aFiles[$i].'", '.
+						'"sGroup": "'.$aPath[1].'"},'."\n";
+				}
+				
+			?>
+			null ];
+			gaoTest.pop(); /* No interest in the null */
+		</script>
+		<script type="text/javascript" language="javascript" src="controller.js"></script>
+	</head>
+	<body id="controller">
+		<h1>DataTables unit testing</h1>
+		<div id="test_running">Running test: <span id="test_number"></span></div>
+		<div id="test_info">
+			<b>Test information:</b><br>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/index.html
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/index.html	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/index.html	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,7 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<html>
+	<frameset rows="20%,80%">
+		<frame name="controller" id="controller" src="controller.php">
+		<frame name="test_arena" id="test_arena">
+	</frameset>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/dom_data.php
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/dom_data.php	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/dom_data.php	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,472 @@
+<?php
+	header( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' ); 
+	header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); 
+	header( 'Cache-Control: no-store, no-cache, must-revalidate' ); 
+	header( 'Cache-Control: post-check=0, pre-check=0', false ); 
+	header( 'Pragma: no-cache' ); 
+?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables unit testing</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../css/demo_page.css";
+			@import "../../css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../js/jquery.dataTables.js"></script>
+		<script type="text/javascript" language="javascript" src="../unit_test.js"></script>
+		<?php
+			$aScripts = split( ":", $_GET['scripts'] );
+			for ( $i=0 ; $i<count($aScripts) ; $i++ )
+			{
+				echo '<script type="text/javascript" language="javascript" src="../'.$aScripts[$i].'?rand='.rand().'"></script>'."\n";
+			}
+		?>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> unit test template for reading DOM data
+			</div>
+			
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr class="gradeX">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 4.0</td>
+			<td>Win 95+</td>
+			<td class="center">4</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.0</td>
+			<td>Win 95+</td>
+			<td class="center">5</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 5.5</td>
+			<td>Win 95+</td>
+			<td class="center">5.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet
+				 Explorer 6</td>
+			<td>Win 98+</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>Internet Explorer 7</td>
+			<td>Win XP SP2+</td>
+			<td class="center">7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Trident</td>
+			<td>AOL browser (AOL desktop)</td>
+			<td>Win XP</td>
+			<td class="center">6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 1.5</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 2.0</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Firefox 3.0</td>
+			<td>Win 2k+ / OSX.3+</td>
+			<td class="center">1.9</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.0</td>
+			<td>OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Camino 1.5</td>
+			<td>OSX.3+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape 7.2</td>
+			<td>Win 95+ / Mac OS 8.6-9.2</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Browser 8</td>
+			<td>Win 98SE+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Netscape Navigator 9</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.1</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.2</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.2</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.3</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.4</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.4</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.5</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.6</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">1.6</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.7</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.7</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Mozilla 1.8</td>
+			<td>Win 98+ / OSX.1+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Seamonkey 1.1</td>
+			<td>Win 98+ / OSX.2+</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Gecko</td>
+			<td>Epiphany 2.20</td>
+			<td>Gnome</td>
+			<td class="center">1.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.2</td>
+			<td>OSX.3</td>
+			<td class="center">125.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 1.3</td>
+			<td>OSX.3</td>
+			<td class="center">312.8</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 2.0</td>
+			<td>OSX.4+</td>
+			<td class="center">419.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>Safari 3.0</td>
+			<td>OSX.4+</td>
+			<td class="center">522.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>OmniWeb 5.5</td>
+			<td>OSX.4+</td>
+			<td class="center">420</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>iPod Touch / iPhone</td>
+			<td>iPod</td>
+			<td class="center">420.1</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Webkit</td>
+			<td>S60</td>
+			<td>S60</td>
+			<td class="center">413</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.0</td>
+			<td>Win 95+ / OSX.1+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 7.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.0</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 8.5</td>
+			<td>Win 95+ / OSX.2+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.0</td>
+			<td>Win 95+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.2</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera 9.5</td>
+			<td>Win 88+ / OSX.3+</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Opera for Wii</td>
+			<td>Wii</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nokia N800</td>
+			<td>N800</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Presto</td>
+			<td>Nintendo DS browser</td>
+			<td>Nintendo DS</td>
+			<td class="center">8.5</td>
+			<td class="center">C/A<sup>1</sup></td>
+		</tr>
+		<tr class="gradeC">
+			<td>KHTML</td>
+			<td>Konqureror 3.1</td>
+			<td>KDE 3.1</td>
+			<td class="center">3.1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.3</td>
+			<td>KDE 3.3</td>
+			<td class="center">3.3</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeA">
+			<td>KHTML</td>
+			<td>Konqureror 3.5</td>
+			<td>KDE 3.5</td>
+			<td class="center">3.5</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Tasman</td>
+			<td>Internet Explorer 4.5</td>
+			<td>Mac OS 8-9</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.1</td>
+			<td>Mac OS 7.6-9</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Tasman</td>
+			<td>Internet Explorer 5.2</td>
+			<td>Mac OS 8-X</td>
+			<td class="center">1</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.1</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeA">
+			<td>Misc</td>
+			<td>NetFront 3.4</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">A</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Dillo 0.8</td>
+			<td>Embedded devices</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Links</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeX">
+			<td>Misc</td>
+			<td>Lynx</td>
+			<td>Text only</td>
+			<td class="center">-</td>
+			<td class="center">X</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>IE Mobile</td>
+			<td>Windows Mobile 6</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeC">
+			<td>Misc</td>
+			<td>PSP browser</td>
+			<td>PSP</td>
+			<td class="center">-</td>
+			<td class="center">C</td>
+		</tr>
+		<tr class="gradeU">
+			<td>Other browsers</td>
+			<td>All others</td>
+			<td>-</td>
+			<td class="center">-</td>
+			<td class="center">U</td>
+		</tr>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/empty_table.php
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/empty_table.php	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/empty_table.php	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,62 @@
+<?php
+	header( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' ); 
+	header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); 
+	header( 'Cache-Control: no-store, no-cache, must-revalidate' ); 
+	header( 'Cache-Control: post-check=0, pre-check=0', false ); 
+	header( 'Pragma: no-cache' ); 
+?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables unit testing</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../css/demo_page.css";
+			@import "../../css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../js/jquery.dataTables.js"></script>
+		<script type="text/javascript" language="javascript" src="../unit_test.js"></script>
+		<?php
+			$aScripts = split( ":", $_GET['scripts'] );
+			for ( $i=0 ; $i<count($aScripts) ; $i++ )
+			{
+				echo '<script type="text/javascript" language="javascript" src="../'.$aScripts[$i].'?rand='.rand().'"></script>'."\n";
+			}
+		?>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> empty table template
+			</div>
+			
+			<h1>Live example</h1>
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+		
+	</tbody>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/js_data.php
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/js_data.php	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/templates/js_data.php	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,131 @@
+<?php
+	header( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' ); 
+	header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); 
+	header( 'Cache-Control: no-store, no-cache, must-revalidate' ); 
+	header( 'Cache-Control: post-check=0, pre-check=0', false ); 
+	header( 'Pragma: no-cache' ); 
+?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" type="image/ico" href="http://www.sprymedia.co.uk/media/images/favicon.ico" />
+		
+		<title>DataTables unit testing</title>
+		<style type="text/css" title="currentStyle">
+			@import "../../css/demo_page.css";
+			@import "../../css/demo_table.css";
+		</style>
+		<script type="text/javascript" language="javascript" src="../../js/jquery.js"></script>
+		<script type="text/javascript" language="javascript" src="../../js/jquery.dataTables.js"></script>
+		<script type="text/javascript" language="javascript" src="../unit_test.js"></script>
+		<script type="text/javascript" charset="utf-8">
+			/* Make the data source available for testing */
+			var gaaData = [
+				['Trident','Internet Explorer 4.0','Win 95+','4','X'],
+				['Trident','Internet Explorer 5.0','Win 95+','5','C'],
+				['Trident','Internet Explorer 5.5','Win 95+','5.5','A'],
+				['Trident','Internet Explorer 6','Win 98+','6','A'],
+				['Trident','Internet Explorer 7','Win XP SP2+','7','A'],
+				['Trident','AOL browser (AOL desktop)','Win XP','6','A'],
+				['Gecko','Firefox 1.0','Win 98+ / OSX.2+','1.7','A'],
+				['Gecko','Firefox 1.5','Win 98+ / OSX.2+','1.8','A'],
+				['Gecko','Firefox 2.0','Win 98+ / OSX.2+','1.8','A'],
+				['Gecko','Firefox 3.0','Win 2k+ / OSX.3+','1.9','A'],
+				['Gecko','Camino 1.0','OSX.2+','1.8','A'],
+				['Gecko','Camino 1.5','OSX.3+','1.8','A'],
+				['Gecko','Netscape 7.2','Win 95+ / Mac OS 8.6-9.2','1.7','A'],
+				['Gecko','Netscape Browser 8','Win 98SE+','1.7','A'],
+				['Gecko','Netscape Navigator 9','Win 98+ / OSX.2+','1.8','A'],
+				['Gecko','Mozilla 1.0','Win 95+ / OSX.1+',1,'A'],
+				['Gecko','Mozilla 1.1','Win 95+ / OSX.1+',1.1,'A'],
+				['Gecko','Mozilla 1.2','Win 95+ / OSX.1+',1.2,'A'],
+				['Gecko','Mozilla 1.3','Win 95+ / OSX.1+',1.3,'A'],
+				['Gecko','Mozilla 1.4','Win 95+ / OSX.1+',1.4,'A'],
+				['Gecko','Mozilla 1.5','Win 95+ / OSX.1+',1.5,'A'],
+				['Gecko','Mozilla 1.6','Win 95+ / OSX.1+',1.6,'A'],
+				['Gecko','Mozilla 1.7','Win 98+ / OSX.1+',1.7,'A'],
+				['Gecko','Mozilla 1.8','Win 98+ / OSX.1+',1.8,'A'],
+				['Gecko','Seamonkey 1.1','Win 98+ / OSX.2+','1.8','A'],
+				['Gecko','Epiphany 2.20','Gnome','1.8','A'],
+				['Webkit','Safari 1.2','OSX.3','125.5','A'],
+				['Webkit','Safari 1.3','OSX.3','312.8','A'],
+				['Webkit','Safari 2.0','OSX.4+','419.3','A'],
+				['Webkit','Safari 3.0','OSX.4+','522.1','A'],
+				['Webkit','OmniWeb 5.5','OSX.4+','420','A'],
+				['Webkit','iPod Touch / iPhone','iPod','420.1','A'],
+				['Webkit','S60','S60','413','A'],
+				['Presto','Opera 7.0','Win 95+ / OSX.1+','-','A'],
+				['Presto','Opera 7.5','Win 95+ / OSX.2+','-','A'],
+				['Presto','Opera 8.0','Win 95+ / OSX.2+','-','A'],
+				['Presto','Opera 8.5','Win 95+ / OSX.2+','-','A'],
+				['Presto','Opera 9.0','Win 95+ / OSX.3+','-','A'],
+				['Presto','Opera 9.2','Win 88+ / OSX.3+','-','A'],
+				['Presto','Opera 9.5','Win 88+ / OSX.3+','-','A'],
+				['Presto','Opera for Wii','Wii','-','A'],
+				['Presto','Nokia N800','N800','-','A'],
+				['Presto','Nintendo DS browser','Nintendo DS','8.5','C/A<sup>1</sup>'],
+				['KHTML','Konqureror 3.1','KDE 3.1','3.1','C'],
+				['KHTML','Konqureror 3.3','KDE 3.3','3.3','A'],
+				['KHTML','Konqureror 3.5','KDE 3.5','3.5','A'],
+				['Tasman','Internet Explorer 4.5','Mac OS 8-9','-','X'],
+				['Tasman','Internet Explorer 5.1','Mac OS 7.6-9','1','C'],
+				['Tasman','Internet Explorer 5.2','Mac OS 8-X','1','C'],
+				['Misc','NetFront 3.1','Embedded devices','-','C'],
+				['Misc','NetFront 3.4','Embedded devices','-','A'],
+				['Misc','Dillo 0.8','Embedded devices','-','X'],
+				['Misc','Links','Text only','-','X'],
+				['Misc','Lynx','Text only','-','X'],
+				['Misc','IE Mobile','Windows Mobile 6','-','C'],
+				['Misc','PSP browser','PSP','-','C'],
+				['Other browsers','All others','-','-','U']
+			];
+		</script>
+		<?php
+			$aScripts = split( ":", $_GET['scripts'] );
+			for ( $i=0 ; $i<count($aScripts) ; $i++ )
+			{
+				echo '<script type="text/javascript" language="javascript" src="../'.$aScripts[$i].'?rand='.rand().'"></script>'."\n";
+			}
+		?>
+	</head>
+	<body id="dt_example">
+		<div id="container">
+			<div class="full_width big">
+				<i>DataTables</i> unit test template for reading DOM data
+			</div>
+			
+			<div id="demo">
+<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
+	<thead>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</thead>
+	<tbody>
+	</tbody>
+	<tfoot>
+		<tr>
+			<th>Rendering engine</th>
+			<th>Browser</th>
+			<th>Platform(s)</th>
+			<th>Engine version</th>
+			<th>CSS grade</th>
+		</tr>
+	</tfoot>
+</table>
+			</div>
+			<div class="spacer"></div>
+			
+			
+			<div id="footer" style="text-align:center;">
+				<span style="font-size:10px;">
+					DataTables &copy; Allan Jardine 2008-2009.<br>
+					Information in the table &copy; <a href="http://www.u4eatech.com">U4EA Technologies</a> 2007-2009.</span>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests/1_dom/_zero_config.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests/1_dom/_zero_config.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests/1_dom/_zero_config.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,437 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "Santiy checks for DataTables with DOM data" );
+
+oTest.fnTest( 
+	"jQuery.dataTable function",
+	null,
+	function () { return typeof jQuery().dataTable == "function"; }
+);
+
+oTest.fnTest(
+	"jQuery.dataTableSettings storage array",
+	null,
+	function () { return typeof jQuery().dataTableSettings == "object"; }
+);
+
+oTest.fnTest(
+	"jQuery.dataTableExt plugin object",
+	null,
+	function () { return typeof jQuery().dataTableExt == "object"; }
+);
+
+$(document).ready( function () {
+	$('#example').dataTable();
+	
+	/* Basic checks */
+	oTest.fnTest( 
+		"Length changing div exists",
+		null,
+		function () { return document.getElementById('example_length') != null; }
+	);
+	
+	oTest.fnTest( 
+		"Filtering div exists",
+		null,
+		function () { return document.getElementById('example_filter') != null; }
+	);
+	
+	oTest.fnTest( 
+		"Information div exists",
+		null,
+		function () { return document.getElementById('example_info') != null; }
+	);
+	
+	oTest.fnTest( 
+		"Pagination div exists",
+		null,
+		function () { return document.getElementById('example_paginate') != null; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div is off by default",
+		null,
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	oTest.fnTest( 
+		"10 rows shown on the first page",
+		null,
+		function () { return $('#example tbody tr').length == 10; }
+	);
+	
+	oTest.fnTest( 
+		"Initial sort occured",
+		null,
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	/* Need to use the WaitTest for sorting due to the setTimeout datatables uses */
+	oTest.fnTest( 
+		"Sorting (first click) on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting (second click) on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting (third click) on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting (first click) on numeric column",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "-"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting (second click) on numeric column",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "522.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting multi-column (first click)",
+		function () { 
+			$('#example thead th:eq(0)').click();
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } ); },
+		function () { var b = 
+			$('#example tbody td:eq(0)').html() == "Gecko" && 
+			$('#example tbody td:eq(1)').html() == "Camino 1.0"; return b; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting multi-column - sorting second column only",
+		function () { 
+			$('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	/* Basic paging */
+	oTest.fnTest( 
+		"Paging to second page",
+		function () { $('#example_next').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "IE Mobile"; }
+	);
+	
+	oTest.fnTest( 
+		"Paging to first page",
+		function () { $('#example_previous').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Attempting to page back beyond the first page",
+		function () { $('#example_previous').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	/* Changing length */
+	oTest.fnTest( 
+		"Changing table length to 25 records",
+		function () { $("select[name=example_length]").val('25').change(); },
+		function () { return $('#example tbody tr').length == 25; }
+	);
+	
+	oTest.fnTest( 
+		"Changing table length to 50 records",
+		function () { $("select[name=example_length]").val('50').change(); },
+		function () { return $('#example tbody tr').length == 50; }
+	);
+	
+	oTest.fnTest( 
+		"Changing table length to 100 records",
+		function () { $("select[name=example_length]").val('100').change(); },
+		function () { return $('#example tbody tr').length == 57; }
+	);
+	
+	oTest.fnTest( 
+		"Changing table length to 10 records",
+		function () { $("select[name=example_length]").val('10').change(); },
+		function () { return $('#example tbody tr').length == 10; }
+	);
+	
+	/*
+	 * Information element
+	 */
+	oTest.fnTest(
+		"Information on zero config",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information on second page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 11 to 20 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information on third page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 21 to 30 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information on last page",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 51 to 57 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information back on first page",
+		function () {
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information with 25 records",
+		function () { $("select[name=example_length]").val('25').change(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 25 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information with 25 records - second page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 26 to 50 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information with 100 records - first page",
+		function () {
+			$('#example_previous').click();
+			$("select[name=example_length]").val('100').change();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 57 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information back to 10 records",
+		function () {
+			$('#example_previous').click();
+			$("select[name=example_length]").val('10').change();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win'",
+		function () { $('#example_filter input').val("Win").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' second page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 11 to 20 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' last page",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 31 to 31 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' back to first page",
+		function () {
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' second page - second time",
+		function () {
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 11 to 20 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter increased to 'Win 98'",
+		function () { $('#example_filter input').val("Win 98").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 9 of 9 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter decreased to 'Win'",
+		function () { $('#example_filter input').val("Win").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' second page - third time",
+		function () {
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 11 to 20 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter removed",
+		function () { $('#example_filter input').val("").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	/*
+	 * Filtering
+	 */
+	oTest.fnTest(
+		"Filter 'W' - rows",
+		function () { 
+			/* Reset the table such that the old sorting doesn't mess things up */
+			oSession.fnRestore();
+			$('#example').dataTable();
+			$('#example_filter input').val("W").keyup(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Gecko"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'W' - info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 42 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Wi'",
+		function () { $('#example_filter input').val("Wi").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 32 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win'",
+		function () { $('#example_filter input').val("Win").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win' - sorting column 1",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "AOL browser (AOL desktop)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win' - sorting column 1 info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win' - sorting column 1 reverse",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win XP' - maintaing reverse sorting col 1",
+		function () { $('#example_filter input').val("Win XP").keyup(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Internet Explorer 7"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win XP' - sorting col 3",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "4"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win XP' - sorting col 3 - reversed",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "7"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win' - sorting col 3 - reversed info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 6 of 6 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'nothinghere'",
+		function () { $('#example_filter input').val("nothinghere").keyup(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 
+			"No matching records found"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'nothinghere' - info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 0 to 0 of 0 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter back to blank and 1st column sorting",
+		function () {
+			$('#example_filter input').val("").keyup();
+			$('#example thead th:eq(0)').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Prefixing a filter entry",
+		function () {
+			$('#example_filter input').val("Win").keyup();
+			$('#example_filter input').val("GeckoWin").keyup();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 0 to 0 of 0 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Prefixing a filter entry with space",
+		function () {
+			$('#example_filter input').val("Gecko Win").keyup();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 17 entries (filtered from 57 total entries)"; }
+	);
+	
+	
+	
+	
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aaSorting.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aaSorting.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aaSorting.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,183 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aaSorting" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Default sorting is single column",
+		null,
+		function () {
+			return oSettings.aaSorting.length == 1 && typeof oSettings.aaSorting[0] == 'object';
+		}
+	);
+	
+	oTest.fnTest( 
+		"Default sorting is first column asc",
+		null,
+		function () {
+			return oSettings.aaSorting[0].length == 3 && oSettings.aaSorting[0][0] == 0 &&
+				oSettings.aaSorting[0][1] == 'asc';
+		}
+	);
+	
+	oTest.fnTest( 
+		"Sorting is applied",
+		null,
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Custom sorting on single string column asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Custom sorting on single string column desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Custom sorting on single int column asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "-"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Custom sorting on single int column desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string asc / string asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['0','asc'], ['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Camino 1.0"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string asc / string desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['0','asc'], ['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string desc / string asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['0','desc'], ['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "iPod Touch / iPhone"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string desc / string desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['0','desc'], ['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Safari 3.0"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string asc / int asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['0','asc'], ['3','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "1"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string asc / int desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['0','asc'], ['3','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "1.9"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string desc / int asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['0','desc'], ['3','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "125.5"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string desc / int desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['0','desc'], ['3','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "522.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (3 column) - string asc / int asc / string asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSorting": [['0','asc'], ['3','asc'], ['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(7) td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aaSortingFixed.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aaSortingFixed.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aaSortingFixed.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,60 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aaSortingFixed" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"No fixed sorting by default",
+		null,
+		function () {
+			return oSettings.aaSortingFixed == null;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Fixed sorting on first column (string/asc) with user sorting on second column (string/asc)",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSortingFixed": [['0','asc']]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Camino 1.0"; }
+	);
+	
+	oTest.fnTest( 
+		"Fixed sorting on first column (string/asc) with user sorting on second column (string/desc)",
+		function () {
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Fixed sorting on fourth column (int/asc) with user sorting on second column (string/asc)",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaSortingFixed": [['3','asc']]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Fixed sorting on fourth column (int/asc) with user sorting on second column (string/desc)",
+		function () {
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "PSP browser"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bSearchable.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bSearchable.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bSearchable.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,67 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aoColumns.bSeachable" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Columns are searchable by default",
+		function () { oTable.fnFilter("Camino"); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html().match(/Camino/); }
+	);
+	
+	oTest.fnTest( 
+		"Disabling sorting on a column removes it from the global filter",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "bSearchable": false },
+					null,
+					null,
+					null
+				]
+			} );
+			oSettings = oTable.fnSettings();
+			oTable.fnFilter("Camino");
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	oTest.fnTest( 
+		"Disabled on one column has no effect on other columns",
+		function () { oTable.fnFilter("Webkit"); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Webkit"; }
+	);
+	
+	oTest.fnTest( 
+		"Disable filtering on multiple columns",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoColumns": [
+					{ "bSearchable": false },
+					{ "bSearchable": false },
+					null,
+					null,
+					null
+				]
+			} );
+			oSettings = oTable.fnSettings();
+			oTable.fnFilter("Webkit");
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	oTest.fnTest( 
+		"Filter on second disabled column",
+		function () { oTable.fnFilter("Camino"); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bSortable.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bSortable.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bSortable.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,105 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aoColumns.bSortable" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"All columns are sortable by default",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Can disable sorting from one column",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "bSortable": false },
+					null,
+					null,
+					null
+				]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() != "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Disabled column has no sorting class",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_asc") == false; }
+	);
+	
+	oTest.fnTest( 
+		"Other columns can still sort",
+		function () {
+			$('#example thead th:eq(4)').click();
+			$('#example thead th:eq(4)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == "X"; }
+	);
+	
+	oTest.fnTest( 
+		"Disable sorting on multiple columns - no sorting classes",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "bSortable": false },
+					null,
+					{ "bSortable": false },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn = 
+				$('#example thead th:eq(1)').hasClass("sorting") ||
+				$('#example thead th:eq(3)').hasClass("sorting")
+			return bReturn == false;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Sorting on disabled column 1 has no effect",
+		function () {
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() != "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting on disabled column 2 has no effect",
+		function () {
+			$('#example thead th:eq(3)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() != "-"; }
+	);
+	
+	oTest.fnTest( 
+		"Second sort on disabled column 2 has no effect",
+		function () {
+			$('#example thead th:eq(3)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() != "-"; }
+	);
+	
+	oTest.fnTest( 
+		"Even with multiple disabled sorting columns other columns can still sort",
+		function () {
+			$('#example thead th:eq(4)').click();
+			$('#example thead th:eq(4)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == "X"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bUseRendered.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bUseRendered.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bUseRendered.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,145 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aoColumns.bUseRendered" );
+
+/* bUseRendered is used to alter sorting data, if false then the original data is used for
+ * sorting rather than the rendered data
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var mTmp = 0;
+	
+	var oTable = $('#example').dataTable( {
+		"aoColumns": [
+			null,
+			{ "fnRender": function (a) {
+				if ( mTmp == 0 ) {
+					mTmp++;
+					return "aaa";
+				} else
+					return a.aData[a.iDataColumn];
+			} },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Default for bUseRendered is true - rendered data is used for sorting",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'aaa'; }
+	);
+	
+	oTest.fnTest( 
+		"When bUseRendered is false, original data is used for sorting",
+		function () {
+			mTmp = 0;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ 
+						"bUseRendered": false,
+						"fnRender": function (a) {
+							if ( mTmp == 0 ) {
+								mTmp++;
+								return "aaa";
+							} else {
+								return a.aData[a.iDataColumn];
+							}
+						}
+					},
+					null,
+					null,
+					null
+				]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'All others'; }
+	);
+	
+	
+	oTest.fnTest( 
+		"bUseRendered set to false on one columns and true (default) on two others",
+		function () {
+			mTmp = 0;
+			var mTmp2 = 0;
+			var mTmp3 = 0;
+			
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoColumns": [
+					{
+						"fnRender": function (a) {
+							if ( mTmp == 0 ) {
+								mTmp++;
+								return "aaa1";
+							} else {
+								return a.aData[a.iDataColumn];
+							}
+						}
+					},
+					{ 
+						"bUseRendered": false,
+						"fnRender": function (a) {
+							if ( mTmp2 == 0 ) {
+								mTmp2++;
+								return "aaa2";
+							} else {
+								return a.aData[a.iDataColumn];
+							}
+						}
+					},
+					{
+						"fnRender": function (a) {
+							if ( mTmp3 == 0 ) {
+								mTmp3++;
+								return "zzz3";
+							} else {
+								return a.aData[a.iDataColumn];
+							}
+						}
+					},
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 'aaa1'; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column rendering - 2nd column sorting",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'All others'; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column rendering - 3rd column sorting",
+		function () {
+			$('#example thead th:eq(2)').click();
+			$('#example thead th:eq(2)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(2)').html() == 'zzz3'; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column rendering - 4th column sorting",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == '-'; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column rendering - 5th column sorting",
+		function () { $('#example thead th:eq(4)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'A'; }
+	);
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bVisible.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bVisible.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.bVisible.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,132 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aoColumns.bVisible" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"All columns are visible by default",
+		null,
+		function () { return $('#example tbody tr:eq(0) td').length == 5; }
+	);
+	
+	oTest.fnTest( 
+		"Can hide one column and it removes td column from DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "bVisible": false },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td').length == 4; }
+	);
+	
+	oTest.fnTest( 
+		"Can hide one column and it removes thead th column from DOM",
+		null,
+		function () { return $('#example thead tr:eq(0) th').length == 4; }
+	);
+	
+	oTest.fnTest( 
+		"Can hide one column and it removes tfoot th column from DOM",
+		null,
+		function () { return $('#example tfoot tr:eq(0) th').length == 4; }
+	);
+	
+	oTest.fnTest( 
+		"The correct thead column has been hidden",
+		null,
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "Platform(s)" &&
+				jqNodes[2].innerHTML == "Engine version" &&
+				jqNodes[3].innerHTML == "CSS grade";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"The correct tbody column has been hidden",
+		function () {
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } );
+		},
+		function () {
+			var jqNodes = $('#example tbody tr:eq(0) td');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Gecko" &&
+				jqNodes[1].innerHTML == "Gnome" &&
+				jqNodes[2].innerHTML == "1.8" &&
+				jqNodes[3].innerHTML == "A";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Can hide multiple columns and it removes td column from DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "bVisible": false },
+					{ "bVisible": false },
+					null,
+					{ "bVisible": false }
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td').length == 2; }
+	);
+	
+	oTest.fnTest( 
+		"Multiple hide - removes thead th column from DOM",
+		null,
+		function () { return $('#example thead tr:eq(0) th').length == 2; }
+	);
+	
+	oTest.fnTest( 
+		"Multiple hide - removes tfoot th column from DOM",
+		null,
+		function () { return $('#example tfoot tr:eq(0) th').length == 2; }
+	);
+	
+	oTest.fnTest( 
+		"Multiple hide - the correct thead columns have been hidden",
+		null,
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "Engine version"
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Multiple hide - the correct tbody columns have been hidden",
+		function () {
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } );
+		},
+		function () {
+			var jqNodes = $('#example tbody tr:eq(0) td');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Gecko" &&
+				jqNodes[1].innerHTML == "1"
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.fnRender.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.fnRender.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.fnRender.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,175 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aoColumns.fnRender" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var mTmp = 0;
+	var oTable = $('#example').dataTable( {
+		"aoColumns": [
+			null,
+			{ "fnRender": function (a) {
+				mTmp++;
+				return a.aData[a.iDataColumn];
+			} },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Single column - fnRender is called once for each row",
+		null,
+		function () { return mTmp == 57; }
+	);
+	
+	oTest.fnTest( 
+		"Confirm that fnRender passes one argument (an object) with three parameters",
+		function () {
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( arguments.length != 1 || typeof a.iDataRow=='undefined' ||
+						 	typeof a.iDataColumn=='undefined' || typeof a.aData=='undefined' )
+						{
+							mTmp = false;
+						}
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnTest( 
+		"fnRender iDataColumn is row number",
+		function () {
+			var iCount = 0;
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( iCount != a.iDataRow )
+						{
+							mTmp = false;
+						}
+						iCount++;
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnTest( 
+		"fnRender iDataColumn is the column",
+		function () {
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( a.iDataColumn != 1 )
+						{
+							mTmp = false;
+						}
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnTest( 
+		"fnRender aData is data array of correct size",
+		function () {
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( a.aData.length != 5 )
+						{
+							mTmp = false;
+						}
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnTest( 
+		"Passed back data is put into the DOM",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						return 'unittest';
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'unittest'; }
+	);
+	
+	oTest.fnTest( 
+		"Passed back data is put into the DOM",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoColumns": [
+					null,
+					null,
+					{ "fnRender": function (a) {
+						return 'unittest1';
+					} },
+					{ "fnRender": function (a) {
+						return 'unittest2';
+					} },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn = 
+				$('#example tbody tr:eq(0) td:eq(2)').html() == 'unittest1' &&
+				$('#example tbody tr:eq(0) td:eq(3)').html() == 'unittest2';
+			return bReturn; }
+	);
+	
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.iDataSort.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.iDataSort.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.iDataSort.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,88 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aoColumns.iDataSort" );
+
+$(document).ready( function () {
+	/* Should know that sorting already works by default from other tests, so we can jump
+	 * right in here
+	 */
+	var oTable = $('#example').dataTable( {
+		"aoColumns": [
+			null,
+			{ "iDataSort": 4 },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Sorting on first column is uneffected",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 'Gecko'; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting on second column is the order of the fifth",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'A'; }
+	);
+	
+	oTest.fnTest( 
+		"Reserve sorting on second column uses fifth column as well",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'X'; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting on 5th column retains it's own sorting",
+		function () { $('#example thead th:eq(4)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'A'; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Use 2nd col for sorting 5th col and via-versa - no effect on first col sorting",
+		function () {
+			mTmp = 0;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "iDataSort": 4 },
+					null,
+					null,
+					{ "iDataSort": 1 }
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 'Gecko'; }
+	);
+	
+	oTest.fnTest( 
+		"2nd col sorting uses fifth col",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'A'; }
+	);
+	
+	oTest.fnTest( 
+		"2nd col sorting uses fifth col - reversed",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'X'; }
+	);
+	
+	oTest.fnTest( 
+		"5th col sorting uses 2nd col",
+		function () { $('#example thead th:eq(4)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'All others'; }
+	);
+	
+	oTest.fnTest( 
+		"5th col sorting uses 2nd col - reversed",
+		function () { $('#example thead th:eq(4)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'Seamonkey 1.1'; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sClass.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sClass.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sClass.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,111 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aoColumns.sClass" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"By default the test class hasn't been applied to the column (sanity!)",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(2)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - first row",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aoColumns": [
+					null,
+					null,
+					{ "sClass": 'unittest' },
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(1) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - third row",
+		null,
+		function () { return $('#example tbody tr:eq(3) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - last row",
+		null,
+		function () { return $('#example tbody tr:eq(9) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - has not applied to other columns - 1st",
+		null,
+		function () { return $('#example tbody tr:eq(3) td:eq(0)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - has not applied to other columns - 5th",
+		null,
+		function () { return $('#example tbody tr:eq(3) td:eq(4)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - seventh row - second page",
+		function () { $('#example_next').click(); },
+		function () { return $('#example tbody tr:eq(6) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - has not applied to header",
+		null,
+		function () { return $('#example thead tr:eq(3) th:eq(4)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - has not applied to footer",
+		null,
+		function () { return $('#example thead tr:eq(3) th:eq(4)').hasClass('unittest') == false; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Class defined for multiple columns - first row",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aoColumns": [
+					{ "sClass": 'unittest2' },
+					null,
+					null,
+					{ "sClass": 'unittest1' },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn = 
+				$('#example tbody tr:eq(3) td:eq(0)').hasClass('unittest2') &&
+				$('#example tbody tr:eq(8) td:eq(3)').hasClass('unittest1');
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Class defined for multiple columns - has not applied to other columns - 5th 1",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').hasClass('unittest1') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Class defined for multiple columns - has not applied to other columns - 5th 2",
+		null,
+		function () { return $('#example tbody tr:eq(6) td:eq(4)').hasClass('unittest2') == false; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sName.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sName.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sName.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,27 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aoColumns.sName" );
+
+/* This has no effect at all in DOM methods - so we just check that it has applied the name */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aoColumns": [
+			null,
+			null,
+			null,
+			{ "sName": 'unit test' },
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Names are stored in the columns object",
+		null,
+		function () { return oSettings.aoColumns[3].sName =="unit test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sTitle.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sTitle.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sTitle.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,78 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aoColumns.sTitle" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Column names are read from the DOM by default",
+		null,
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "Browser" &&
+				jqNodes[2].innerHTML == "Platform(s)" &&
+				jqNodes[3].innerHTML == "Engine version" &&
+				jqNodes[4].innerHTML == "CSS grade";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Can set a single column title - and others are read from DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "sTitle": 'unit test' },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "unit test" &&
+				jqNodes[2].innerHTML == "Platform(s)" &&
+				jqNodes[3].innerHTML == "Engine version" &&
+				jqNodes[4].innerHTML == "CSS grade";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Can set multiple column titles",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aoColumns": [
+					null,
+					{ "sTitle": 'unit test 1' },
+					null,
+					null,
+					{ "sTitle": 'unit test 2' }
+				]
+			} );
+		},
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "unit test 1" &&
+				jqNodes[2].innerHTML == "Platform(s)" &&
+				jqNodes[3].innerHTML == "Engine version" &&
+				jqNodes[4].innerHTML == "unit test 2";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sWidth.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sWidth.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoColumns.sWidth.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,84 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aoColumns.sWidth" );
+
+/* NOTE - we need to disable the auto width for the majority of these test in order to preform 
+ * these tests as the auto width will convert the width to a px value. We can do 'non-exact' tests
+ * with auto width enabled however to ensure it scales columns as required
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bAutoWidth": false,
+		"aoColumns": [
+			null,
+			{ "sWidth": '40%' },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"With auto width disabled the width for one column is appled",
+		null,
+		function () { return $('#example thead th:eq(1)')[0].style.width == "40%"; }
+	);
+	
+	oTest.fnTest( 
+		"With auto width disabled the width for one column is appled",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bAutoWidth": false,
+				"aoColumns": [
+					null,
+					null,
+					{ "sWidth": '20%' },
+					{ "sWidth": '30%' },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn =
+				$('#example thead th:eq(2)')[0].style.width == "20%" &&
+				$('#example thead th:eq(3)')[0].style.width == "30%";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"With auto width, it will make the smallest column the largest with percentage width given",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoColumns": [
+					null,
+					null,
+					null,
+					{ "sWidth": '40%' },
+					null
+				]
+			} );
+		},
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			
+			if ( a3>a0 && a3>a1 && a3>a2 && a3>a4 )
+				return true;
+			else
+				return false;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoSearchCols.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoSearchCols.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/aoSearchCols.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,112 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "aoSearchCols" );
+
+/* We could be here forever testing this one, so we test a limited subset on a couple of colums */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Default should be to have a empty colums array",
+		null,
+		function () {
+			var bReturn = 
+				oSettings.aoPreSearchCols[0].sSearch == 0 && oSettings.aoPreSearchCols[0].bEscapeRegex &&
+				oSettings.aoPreSearchCols[1].sSearch == 0 && oSettings.aoPreSearchCols[1].bEscapeRegex &&
+				oSettings.aoPreSearchCols[2].sSearch == 0 && oSettings.aoPreSearchCols[2].bEscapeRegex &&
+				oSettings.aoPreSearchCols[3].sSearch == 0 && oSettings.aoPreSearchCols[3].bEscapeRegex &&
+				oSettings.aoPreSearchCols[4].sSearch == 0 && oSettings.aoPreSearchCols[4].bEscapeRegex;
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Search on a single column - no regex statement given",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoSearchCols": [
+					null,
+					{ "sSearch": "Mozilla" },
+					null,
+					{ "sSearch": "1" },
+					null
+				]
+			} );
+		},
+		function () { return $('#example_info').html() == "Showing 1 to 9 of 9 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest( 
+		"Search on two columns - no regex statement given",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoSearchCols": [
+					null,
+					{ "sSearch": "Mozilla" },
+					null,
+					{ "sSearch": "1.5" },
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "1.5"; }
+	);
+	
+	oTest.fnTest( 
+		"Search on single column - escape regex false",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoSearchCols": [
+					{ "sSearch": ".*ML", "bEscapeRegex": false },
+					null,
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example_info').html() == "Showing 1 to 3 of 3 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest( 
+		"Search on two columns - escape regex false on first, true on second",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoSearchCols": [
+					{ "sSearch": ".*ML", "bEscapeRegex": false },
+					{ "sSearch": "3.3", "bEscapeRegex": true },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Konqureror 3.3"; }
+	);
+	
+	oTest.fnTest( 
+		"Search on two columns (no records) - escape regex false on first, true on second",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aoSearchCols": [
+					{ "sSearch": ".*ML", "bEscapeRegex": false },
+					{ "sSearch": "Allan", "bEscapeRegex": true },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/asStripClasses.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/asStripClasses.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/asStripClasses.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,106 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "asStripClasses" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable();
+	
+	oTest.fnTest( 
+		"Default row striping is applied",
+		null,
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('odd') &&
+			       $('#example tbody tr:eq(1)').hasClass('even') &&
+			       $('#example tbody tr:eq(2)').hasClass('odd') &&
+			       $('#example tbody tr:eq(3)').hasClass('even');
+		}
+	);
+	
+	oTest.fnTest( 
+		"Row striping does not effect current classes",
+		null,
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('gradeA') &&
+			       $('#example tbody tr:eq(1)').hasClass('gradeA') &&
+			       $('#example tbody tr:eq(2)').hasClass('gradeA') &&
+			       $('#example tbody tr:eq(3)').hasClass('gradeA');
+		}
+	);
+	
+	oTest.fnTest( 
+		"Row striping on the second page",
+		function () { $('#example_next').click(); },
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('odd') &&
+			       $('#example tbody tr:eq(1)').hasClass('even') &&
+			       $('#example tbody tr:eq(2)').hasClass('odd') &&
+			       $('#example tbody tr:eq(3)').hasClass('even');
+		}
+	);
+	
+	/* No striping */
+	oTest.fnTest( 
+		"No row striping",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"asStripClasses": []
+			} );
+		},
+		function () {
+			return $('#example tbody tr:eq(0)')[0].className == "gradeA" &&
+			       $('#example tbody tr:eq(1)')[0].className == "gradeA" &&
+			       $('#example tbody tr:eq(2)')[0].className == "gradeA" &&
+			       $('#example tbody tr:eq(3)')[0].className == "gradeA";
+		}
+	);
+	
+	/* Custom striping */
+	oTest.fnTest( 
+		"Custom striping [2]",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"asStripClasses": [ 'test1', 'test2' ]
+			} );
+		},
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('test1') &&
+			       $('#example tbody tr:eq(1)').hasClass('test2') &&
+			       $('#example tbody tr:eq(2)').hasClass('test1') &&
+			       $('#example tbody tr:eq(3)').hasClass('test2');
+		}
+	);
+	
+	
+	/* long array of striping */
+	oTest.fnTest( 
+		"Custom striping [4]",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"asStripClasses": [ 'test1', 'test2', 'test3', 'test4' ]
+			} );
+		},
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('test1') &&
+			       $('#example tbody tr:eq(1)').hasClass('test2') &&
+			       $('#example tbody tr:eq(2)').hasClass('test3') &&
+			       $('#example tbody tr:eq(3)').hasClass('test4');
+		}
+	);
+	
+	oTest.fnTest( 
+		"Custom striping is restarted on second page [2]",
+		function () { $('#example_next').click(); },
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('test1') &&
+			       $('#example tbody tr:eq(1)').hasClass('test2') &&
+			       $('#example tbody tr:eq(2)').hasClass('test3') &&
+			       $('#example tbody tr:eq(3)').hasClass('test4');
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bAutoWidth.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bAutoWidth.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bAutoWidth.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,138 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "bAutoWidth" );
+
+/* It's actually a little tricky to test this. We can't test absolute numbers because
+ * different browsers and different platforms will render the width of the columns slightly
+ * differently. However, we certainly can test the principle of what should happen (column 
+ * width doesn't change over pages)
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Auto width is enabled by default",
+		null,
+		function () { return oSettings.oFeatures.bAutoWidth; }
+	);
+	
+	oTest.fnTest( 
+		"First column has a width assigned to it",
+		null,
+		function () { return $('#example thead th:eq(0)').attr('style').match(/width/i); }
+	);
+	
+	/*
+	This would seem like a better test - but there appear to be difficulties with tables
+	which are bigger (calculated) than there is actually room for. I suspect this is actually
+	a bug in datatables
+	oTest.fnTest( 
+		"Check column widths on first page match second page",
+		null,
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			$('#example_next').click();
+			var b0 = anThs[0].offsetWidth;
+			var b1 = anThs[1].offsetWidth;
+			var b2 = anThs[2].offsetWidth;
+			var b3 = anThs[3].offsetWidth;
+			var b4 = anThs[4].offsetWidth;
+			console.log( a0, b0, a1, b1, a2, b2, a3, b3 );
+			if ( a0==b0 && a1==b1 && a2==b2 && a3==b3 )
+				return true;
+			else
+				return false;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Check column widths on second page match thid page",
+		null,
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			$('#example_next').click();
+			var b0 = anThs[0].offsetWidth;
+			var b1 = anThs[1].offsetWidth;
+			var b2 = anThs[2].offsetWidth;
+			var b3 = anThs[3].offsetWidth;
+			var b4 = anThs[4].offsetWidth;
+			if ( a0==b0 && a1==b1 && a2==b2 && a3==b3 )
+				return true;
+			else
+				return false;
+		}
+	);
+	*/
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Auto width can be disabled",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bAutoWidth": false
+			} );
+	 		oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bAutoWidth == false; }
+	);
+	
+	oTest.fnTest( 
+		"First column does not have a width assigned to it",
+		null,
+		function () { return $('#example thead th:eq(0)').attr('style') == null; }
+	);
+	
+	/*
+	oTest.fnTest( 
+		"Check column widths on first page do not match second page",
+		null,
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			$('#example_next').click();
+			var b0 = anThs[0].offsetWidth;
+			var b1 = anThs[1].offsetWidth;
+			var b2 = anThs[2].offsetWidth;
+			var b3 = anThs[3].offsetWidth;
+			var b4 = anThs[4].offsetWidth;
+			if ( a0==b0 && a1==b1 && a2==b2 && a3==b3 )
+				return false;
+			else
+				return true;
+		}
+	);
+	*/
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Auto width enabled override",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bAutoWidth": true
+			} );
+	 		oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bAutoWidth; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bFilter.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bFilter.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bFilter.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,40 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "bFilter" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable();
+	
+	oTest.fnTest( 
+		"Filtering div exists by default",
+		null,
+		function () { return document.getElementById('example_filter') != null; }
+	);
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Fltering can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bFilter": false
+			} );
+		},
+		function () { return document.getElementById('example_filter') == null; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Filtering enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bFilter": true
+			} );
+		},
+		function () { return document.getElementById('example_filter') != null; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bInfo.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bInfo.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bInfo.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,40 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "bInfo" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable();
+	
+	oTest.fnTest( 
+		"Info div exists by default",
+		null,
+		function () { return document.getElementById('example_info') != null; }
+	);
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Info can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bInfo": false
+			} );
+		},
+		function () { return document.getElementById('example_info') == null; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Info enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bInfo": true
+			} );
+		},
+		function () { return document.getElementById('example_info') != null; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bLengthChange.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bLengthChange.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bLengthChange.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,71 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "bLengthChange" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable();
+	
+	oTest.fnTest( 
+		"Length div exists by default",
+		null,
+		function () { return document.getElementById('example_length') != null; }
+	);
+	
+	oTest.fnTest(
+		"Four default options",
+		null,
+		function () { return $("select[name=example_length] option").length == 4; }
+	);
+	
+	oTest.fnTest(
+		"Default options",
+		null,
+		function () {
+			var opts = $("select[name='example_length'] option");
+			return opts[0].getAttribute('value') == 10 && opts[1].getAttribute('value') == 25 &&
+				opts[2].getAttribute('value') == 50 && opts[3].getAttribute('value') == 100;
+		}
+	);
+	
+	oTest.fnTest(
+		"Info takes length into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Change length can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bLengthChange": false
+			} );
+		},
+		function () { return document.getElementById('example_length') == null; }
+	);
+	
+	oTest.fnTest(
+		"Information takes length disabled into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Length change enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bLengthChange": true
+			} );
+		},
+		function () { return document.getElementById('example_length') != null; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bPaginate.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bPaginate.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bPaginate.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,55 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "bPaginate" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable();
+	
+	oTest.fnTest( 
+		"Pagiantion div exists by default",
+		null,
+		function () { return document.getElementById('example_paginate') != null; }
+	);
+	
+	oTest.fnTest(
+		"Information div takes paging into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Pagiantion can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bPaginate": false
+			} );
+		},
+		function () { return document.getElementById('example_paginate') == null; }
+	);
+	
+	oTest.fnTest(
+		"Information div takes paging disabled into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 57 of 57 entries"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Pagiantion enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bPaginate": true
+			} );
+		},
+		function () { return document.getElementById('example_paginate') != null; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bProcessing.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bProcessing.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bProcessing.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,99 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "bProcessing" );
+
+/* It's actually a bit hard to set this one due to the fact that it will only be shown
+ * when DataTables is doing some kind of processing. The server-side processing is a bit
+ * better to test this than here - so we just the interal functions to enable it and check
+ * that it is available
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Processing is off by default",
+		null,
+		function () { return oSettings.oFeatures.bProcessing == false; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div is not in the DOM",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div cannot be shown",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div cannot be hidden",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, false ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Processing can be enabled",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bProcessing": true
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bProcessing == true; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div is in the DOM",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing'); }
+	);
+	
+	oTest.fnTest( 
+		"Processing div is hidden by default",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing').style.visibility = "hidden"; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div can be shown",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing').style.visibility = "visible"; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div can be hidden",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, false ); },
+		function () { return document.getElementById('example_processing').style.visibility = "hidden"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Processing disabled override",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bProcessing": false
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bProcessing == false; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div is not in the DOM",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bServerSide.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bServerSide.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bServerSide.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,18 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "bServerSide" );
+
+/* Not interested in server-side processing here other than to check that it is off */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Server side is off by default",
+		null,
+		function () { return oSettings.oFeatures.bServerSide == false; }
+	);
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bSort.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bSort.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bSort.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,95 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "bSort" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable();
+	
+	oTest.fnTest( 
+		"Sorting is on by default",
+		null,
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting Asc by default class applied",
+		null,
+		function () { return $('#example thead th:eq(0)').hasClass("sorting_asc"); }
+	);
+	
+	oTest.fnTest(
+		"Click on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting class removed from first column",
+		null,
+		function () { return $('#example thead th:eq(0)').hasClass("sorting_asc") != true; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting asc class applied to second column",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_asc"); }
+	);
+	
+	oTest.fnTest(
+		"Reverse on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting acs class removed from second column",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_asc") != true; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting desc class applied to second column",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_desc"); }
+	);
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Pagiantion can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bSort": false
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "4"; }
+	);
+	
+	oTest.fnTest(
+		"Click on second column has no effect",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "4"; }
+	);
+	
+	oTest.fnTest(
+		"Reverse on second column has no effect",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "4"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Sorting enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bSort": true
+			} );
+		},
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bSortClasses.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bSortClasses.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/bSortClasses.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,128 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "bSortClasses" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable();
+	
+	oTest.fnTest( 
+		"Sorting classes are applied by default",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1'); }
+	);
+	
+	oTest.fnTest( 
+		"Sorting classes are applied to all required cells",
+		null,
+		function () { return $('#example tbody tr:eq(7) td:eq(0)').hasClass('sorting_1'); }
+	);
+	
+	oTest.fnTest( 
+		"Sorting classes are not applied to non-sorting columns",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_1') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting multi-column - add column 1",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2');
+		}
+	);
+	
+	oTest.fnTest( 
+		"Sorting multi-column - add column 2",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(2)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3');
+		}
+	);
+	
+	oTest.fnTest( 
+		"Sorting multi-column - add column 3",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(3)')[0], { 'shift': true } );
+		},
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3') &&
+						 $('#example tbody tr:eq(0) td:eq(3)').hasClass('sorting_3');
+		}
+	);
+	
+	oTest.fnTest( 
+		"Remove sorting classes on single column sort",
+		function () { 
+			$('#example thead th:eq(4)').click();
+		},
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') == false &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3') == false &&
+						 $('#example tbody tr:eq(0) td:eq(3)').hasClass('sorting_3') == false;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Sorting class 1 was added",
+		null,
+		function () { return $('#example tbody tr:eq(1) td:eq(4)').hasClass('sorting_1'); }
+	);
+	
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Sorting classes can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bSortClasses": false
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting classes disabled - add column 1 - no effect",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') == false;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Sorting classes disabled - add column 2 - no effect",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(2)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') == false &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3') == false;
+		}
+	);
+	
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Sorting classes enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bSortClasses": true
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1'); }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnDrawCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnDrawCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnDrawCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,80 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "fnDrawCallback" );
+
+/* Fairly boring function compared to the others! */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnDrawCallback == null; }
+	);
+	
+	
+	oTest.fnTest( 
+		"One argument passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"fnDrawCallback": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	
+	oTest.fnTest( 
+		"That one argument is the settings object",
+		function () {
+			oSession.fnRestore();
+			
+			oTable = $('#example').dataTable( {
+				"fnDrawCallback": function ( oSettings ) {
+					mPass = oSettings;
+				}
+			} );
+		},
+		function () { return oTable.fnSettings() == mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnRowCallback called once on first draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"fnDrawCallback": function ( ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnTest( 
+		"fnRowCallback called once on each draw there after as well",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return mPass == 4; }
+	);
+	
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnFooterCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnFooterCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnFooterCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,227 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "fnFooterCallback" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnFooterCallback == null; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Five arguments passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"fnFooterCallback": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 5; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnRowCallback called once per draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnTest( 
+		"fnRowCallback called on paging (i.e. another draw)",
+		function () { $('#example_next').click(); },
+		function () { return mPass == 2; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnRowCallback allows us to alter row information",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					nFoot.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records";
+				}
+			} );
+		},
+		function () { return $('#example tfoot th:eq(0)').html() == "Displaying 10 records"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Data array has length matching original data",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aasData.length != 57 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnTest( 
+		"Data array's column lengths match original data",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					for ( var i=0, iLen=aasData.length ; i<iLen ; i++ )
+					{
+						if ( aasData[i].length != 5 )
+						{
+							mPass = false;
+						}
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iStart correct on first page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iStart != 0 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iStart correct on second page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iStart == 10 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			$('#example_next').click();
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iEnd correct on first page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iEnd != 10 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iEnd correct on second page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iEnd == 20 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			$('#example_next').click();
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"aiDisplay length is full data when not filtered",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aiDisplay.length == 57 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnTest( 
+		"aiDisplay length is 9 when filtering on 'Mozilla'",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			oTable = $('#example').dataTable( {
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aiDisplay.length == 9 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			oTable.fnFilter( "Mozilla" );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnHeaderCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnHeaderCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnHeaderCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,227 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "fnHeaderCallback" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnHeaderCallback == null; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Five arguments passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"fnHeaderCallback": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 5; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnRowCallback called once per draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnTest( 
+		"fnRowCallback called on paging (i.e. another draw)",
+		function () { $('#example_next').click(); },
+		function () { return mPass == 2; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnRowCallback allows us to alter row information",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					nHead.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records";
+				}
+			} );
+		},
+		function () { return $('#example thead th:eq(0)').html() == "Displaying 10 records"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Data array has length matching original data",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aasData.length != 57 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnTest( 
+		"Data array's column lengths match original data",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					for ( var i=0, iLen=aasData.length ; i<iLen ; i++ )
+					{
+						if ( aasData[i].length != 5 )
+						{
+							mPass = false;
+						}
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iStart correct on first page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iStart != 0 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iStart correct on second page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iStart == 10 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			$('#example_next').click();
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iEnd correct on first page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iEnd != 10 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iEnd correct on second page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iEnd == 20 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			$('#example_next').click();
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"aiDisplay length is full data when not filtered",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aiDisplay.length == 57 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnTest( 
+		"aiDisplay length is 9 when filtering on 'Mozilla'",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			oTable = $('#example').dataTable( {
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aiDisplay.length == 9 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			oTable.fnFilter( "Mozilla" );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnInitComplete.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnInitComplete.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnInitComplete.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,78 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "fnInitComplete" );
+
+/* Fairly boring function compared to the others! */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnInitComplete == null; }
+	);
+	
+	
+	oTest.fnTest( 
+		"One argument passed (for DOM!)",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"fnInitComplete": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	
+	oTest.fnTest( 
+		"That one argument is the settings object",
+		function () {
+			oSession.fnRestore();
+			
+			oTable = $('#example').dataTable( {
+				"fnInitComplete": function ( oSettings ) {
+					mPass = oSettings;
+				}
+			} );
+		},
+		function () { return oTable.fnSettings() == mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnInitComplete called once on first draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"fnInitComplete": function ( ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnTest( 
+		"fnInitComplete never called there after",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return mPass == 1; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnRowCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnRowCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnRowCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,105 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "fnRowCallback" );
+
+/* Note - fnRowCallback MUST return the first arguments (modified or not) */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnRowCallback == null; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Four arguments passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"fnRowCallback": function ( nTr ) {
+					mPass = arguments.length;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass == 4; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnRowCallback called once for each drawn row",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					mPass++;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass == 10; }
+	);
+	
+	oTest.fnTest( 
+		"fnRowCallback allows us to alter row information",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					$(nTr).addClass('unit_test');
+					return nTr;
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(1)').hasClass('unit_test'); }
+	);
+	
+	oTest.fnTest( 
+		"Data array has length matching columns",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					if ( asData.length != 5 )
+						mPass = false;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnTest( 
+		"Data array has length matching columns",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			var iCount = 0;
+			$('#example').dataTable( {
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					if ( iCount != iDrawIndex )
+						mPass = false;
+					iCount++;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnServerData.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnServerData.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/fnServerData.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,20 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "fnServerData" );
+
+/* Not testing anything beyond the default here. SSP will do that... */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnTest( 
+		"Default should be $.getJSON",
+		null,
+		function () { return oSettings.fnServerData == $.getJSON; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/iDisplayLength.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/iDisplayLength.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/iDisplayLength.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,76 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "iDisplayLength" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable();
+	
+	oTest.fnTest( 
+		"Default length is ten",
+		null,
+		function () { return $('#example tbody tr').length == 10; }
+	);
+	
+	oTest.fnTest( 
+		"Select menu shows 10",
+		null,
+		function () { return $('#example_length select').val() == 10; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Set initial length to 25",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"iDisplayLength": 25
+			} );
+		},
+		function () { return $('#example tbody tr').length == 25; }
+	);
+	
+	oTest.fnTest( 
+		"Select menu shows 25",
+		null,
+		function () { return $('#example_length select').val() == 25; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Set initial length to 100",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"iDisplayLength": 100
+			} );
+		},
+		function () { return $('#example tbody tr').length == 57; }
+	);
+	
+	oTest.fnTest( 
+		"Select menu shows 25",
+		null,
+		function () { return $('#example_length select').val() == 100; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Set initial length to 23 (unknown select menu length)",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"iDisplayLength": 23
+			} );
+		},
+		function () { return $('#example tbody tr').length == 23; }
+	);
+	
+	oTest.fnTest( 
+		"Select menu shows 10 (since 23 is unknow)",
+		null,
+		function () { return $('#example_length select').val() == 10; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.oPaginate.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.oPaginate.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.oPaginate.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,80 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "oLanguage.oPaginate" );
+
+/* Note that the paging language information only has relevence in full numbers */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( { "sPaginationType": "full_numbers" } );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"oLanguage.oPaginate defaults",
+		null,
+		function () {
+			var bReturn = 
+				oSettings.oLanguage.oPaginate.sFirst == "First" &&
+				oSettings.oLanguage.oPaginate.sPrevious == "Previous" &&
+				oSettings.oLanguage.oPaginate.sNext == "Next" &&
+				oSettings.oLanguage.oPaginate.sLast == "Last";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"oLanguage.oPaginate defaults are in the DOM",
+		null,
+		function () {
+			var bReturn = 
+				$('#example_paginate .first').html() == "First" &&
+				$('#example_paginate .previous').html() == "Previous" &&
+				$('#example_paginate .next').html() == "Next" &&
+				$('#example_paginate .last').html() == "Last";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"oLanguage.oPaginate can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sPaginationType": "full_numbers",
+				"oLanguage": {
+					"oPaginate": {
+						"sFirst":    "unit1",
+						"sPrevious": "test2",
+						"sNext":     "unit3",
+						"sLast":     "test4"
+					}
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var bReturn = 
+				oSettings.oLanguage.oPaginate.sFirst == "unit1" &&
+				oSettings.oLanguage.oPaginate.sPrevious == "test2" &&
+				oSettings.oLanguage.oPaginate.sNext == "unit3" &&
+				oSettings.oLanguage.oPaginate.sLast == "test4";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"oLanguage.oPaginate definitions are in the DOM",
+		null,
+		function () {
+			var bReturn = 
+				$('#example_paginate .first').html() == "unit1" &&
+				$('#example_paginate .previous').html() == "test2" &&
+				$('#example_paginate .next').html() == "unit3" &&
+				$('#example_paginate .last').html() == "test4";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sInfo.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sInfo.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sInfo.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,109 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "oLanguage.sInfo" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Info language is 'Showing _START_ to _END_ of _TOTAL_ entries' by default",
+		null,
+		function () { return oSettings.oLanguage.sInfo == "Showing _START_ to _END_ of _TOTAL_ entries"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Info language can be defined - without any macros",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sInfo": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sInfo == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language definition is in the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language can be defined - with macro _START_ only",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"oLanguage": {
+					"sInfo": "unit _START_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 1 test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language can be defined - with macro _END_ only",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"oLanguage": {
+					"sInfo": "unit _END_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 10 test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language can be defined - with macro _TOTAL_ only",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"oLanguage": {
+					"sInfo": "unit _END_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 57 test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language can be defined - with macros _START_ and _END_",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"oLanguage": {
+					"sInfo": "unit _START_ _END_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 1 10 test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language can be defined - with macros _START_, _END_ and _TOTAL_",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"oLanguage": {
+					"sInfo": "unit _START_ _END_ _TOTAL_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 1 10 57 test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sInfoEmpty.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sInfoEmpty.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sInfoEmpty.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,75 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "oLanguage.sInfoEmpty" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Info empty language is 'Showing 0 to 0 of 0 entries' by default",
+		function () { oTable.fnFilter("nothinghere"); },
+		function () { return oSettings.oLanguage.sInfoEmpty == "Showing 0 to 0 of 0 entries"; }
+	);
+	
+	oTest.fnTest( 
+		"Info empty language default is in the DOM",
+		null,
+		function () {
+			var bReturn = document.getElementById('example_info').innerHTML.replace( 
+				' '+oSettings.oLanguage.sInfoFiltered.replace( '_MAX_', '57' ), "" ) ==
+					"Showing 0 to 0 of 0 entries";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Info empty language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sInfoEmpty": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+			oTable.fnFilter("nothinghere");
+		},
+		function () { return oSettings.oLanguage.sInfoEmpty == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info empty language default is in the DOM",
+		null,
+		function () {
+			var bReturn = document.getElementById('example_info').innerHTML.replace( 
+				' '+oSettings.oLanguage.sInfoFiltered.replace( '_MAX_', '57' ), "" ) ==
+					"unit test";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Macro's not replaced",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sInfoEmpty": "unit _START_ _END_ _TOTAL_ test"
+				}
+			} );
+			oTable.fnFilter("nothinghere");
+		},
+		function () {
+			var bReturn = document.getElementById('example_info').innerHTML.replace( 
+				' '+oSettings.oLanguage.sInfoFiltered.replace( '_MAX_', '57' ), "" ) ==
+					"unit _START_ _END_ _TOTAL_ test";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sInfoPostFix.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sInfoPostFix.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sInfoPostFix.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,73 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "oLanguage.sInfoPostFix" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Info post fix language is '' (blank) by default",
+		null,
+		function () { return oSettings.oLanguage.sInfoPostFix == ""; }
+	);
+	
+	oTest.fnTest( 
+		"Width no post fix, the basic info shows",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Info post fix language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sInfoPostFix": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sInfoPostFix == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info empty language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries unit test"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Macros have no effect in the post fix",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sInfoPostFix": "unit _START_ _END_ _TOTAL_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries unit _START_ _END_ _TOTAL_ test"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Post fix is applied after fintering info",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sInfoPostFix": "unit test"
+				}
+			} );
+			oTable.fnFilter("nothinghere");
+		},
+		function () { return document.getElementById('example_info').innerHTML = "Showing 0 to 0 of 0 entries unit (filtered from 57 total entries) test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sLengthMenu.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sLengthMenu.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sLengthMenu.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,101 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "oLanguage.sLengthMenu" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Menu language is 'Show _MENU_ entries' by default",
+		null,
+		function () { return oSettings.oLanguage.sLengthMenu == "Show _MENU_ entries"; }
+	);
+	
+	oTest.fnTest(
+		"_MENU_ macro is replaced by select menu in DOM",
+		null,
+		function () { return $('select', oSettings.anFeatures.l).length == 1 }
+	);
+	
+	oTest.fnTest(
+		"Default is put into DOM",
+		null,
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			var bReturn =
+				anChildren[0].nodeValue == "Show " &&
+				anChildren[2].nodeValue == " entries";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Menu length language can be defined - no _MENU_ macro",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sLengthMenu": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sLengthMenu == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Menu length language definition is in the DOM",
+		null,
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			return anChildren[0].nodeValue == "unit test";
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Menu length language can be defined - with _MENU_ macro",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sLengthMenu": "unit _MENU_ test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			var bReturn =
+				anChildren[0].nodeValue == "unit " &&
+				anChildren[2].nodeValue == " test";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Only the _MENU_ macro",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sLengthMenu": "_MENU_"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			var bReturn =
+				anChildren.length == 1 &&
+				$('select', oSettings.anFeatures.l).length == 1;
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sProcessing.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sProcessing.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sProcessing.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,47 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "oLanguage.sProcessing" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bProcessing": true
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Processing language is 'Processing...' by default",
+		null,
+		function () { return oSettings.oLanguage.sProcessing == "Processing..."; }
+	);
+	
+	oTest.fnTest( 
+		"Processing language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_processing').innerHTML = "Processing..."; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Processing language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bProcessing": true,
+				"oLanguage": {
+					"sProcessing": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sProcessing == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Processing language definition is in the DOM",
+		null,
+		function () { return document.getElementById('example_processing').innerHTML = "unit test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sSearch.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sSearch.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sSearch.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,61 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "oLanguage.sSearch" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Search language is 'Search:' by default",
+		null,
+		function () { return oSettings.oLanguage.sSearch == "Search:"; }
+	);
+	
+	oTest.fnTest( 
+		"Search language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_filter').childNodes[0].nodeValue
+		 	== "Search: "; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Search language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sSearch": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sSearch == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language definition is in the DOM",
+		null,
+		function () { return document.getElementById('example_filter').childNodes[0].nodeValue
+		 	== "unit test "; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Blank search has a no (separator) inserted",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sSearch": ""
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return document.getElementById('example_filter').childNodes.length == 1; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sUrl.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sUrl.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sUrl.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,59 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "oLanguage.sUrl" );
+
+/* Note that we only test the internal storage of language information pulled form a file here
+ * as the other language tests will check it goes into the DOM correctly
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"sUrl is blank by default",
+		null,
+		function () { return oSettings.oLanguage.sUrl == ""; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Loading of German file loads language information",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sUrl": "../../../examples/examples_support/de_DE.txt"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var bReturn = 
+				oSettings.oLanguage.sProcessing == "Bitte warten..." &&
+				oSettings.oLanguage.sLengthMenu == "_MENU_ Einträge anzeigen" &&
+				oSettings.oLanguage.sZeroRecords == "Keine Einträge vorhanden." &&
+				oSettings.oLanguage.sInfo == "_START_ bis _END_ von _TOTAL_ Einträgen" &&
+				oSettings.oLanguage.sInfoEmpty == "0 bis 0 von 0 Einträgen" &&
+				oSettings.oLanguage.sInfoFiltered == "(gefiltert von _MAX_  Einträgen)" &&
+				oSettings.oLanguage.sInfoPostFix == "" &&
+				oSettings.oLanguage.sSearch == "Suchen" &&
+				oSettings.oLanguage.oPaginate.sFirst == "Erster" &&
+				oSettings.oLanguage.oPaginate.sPrevious == "Zurück" &&
+				oSettings.oLanguage.oPaginate.sNext == "Nächster" &&
+				oSettings.oLanguage.oPaginate.sLast == "Letzter";
+				
+			return bReturn;
+		}
+	);
+	
+	/* One DOM check just to ensure that they go into the DOM */
+	oTest.fnTest(
+		"Loaded language goes into the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "1 bis 10 von 57 Einträgen"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sZeroRecords.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sZeroRecords.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oLanguage.sZeroRecords.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,45 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "oLanguage.sZeroRecords" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Zero records language is 'No matching records found' by default",
+		null,
+		function () { return oSettings.oLanguage.sZeroRecords == "No matching records found"; }
+	);
+	
+	oTest.fnTest(
+		"Text is shown when empty table (after filtering)",
+		function () { oTable.fnFilter('nothinghere'); },
+		function () { return $('#example tbody tr td')[0].innerHTML == "No matching records found" }
+	);
+	
+	
+	
+	oTest.fnTest( 
+		"Zero records language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oLanguage": {
+					"sZeroRecords": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sZeroRecords == "unit test"; }
+	);
+	
+	oTest.fnTest(
+		"Text is shown when empty table (after filtering)",
+		function () { oTable.fnFilter('nothinghere2'); },
+		function () { return $('#example tbody tr td')[0].innerHTML == "unit test" }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oSearch.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oSearch.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/oSearch.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,101 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "oSearch" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Default values should be blank",
+		null,
+		function () {
+			var bReturn = oSettings.oPreviousSearch.sSearch == "" && 
+			              oSettings.oPreviousSearch.bEscapeRegex;
+			return bReturn;
+		}
+	);
+	
+	/* This test might be considered iffy since the full object isn't given, but it's reasonable to
+	 * expect DataTables to cope with this. It should just assumine regex false
+	 */
+	oTest.fnTest( 
+		"Search term only in object",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"oSearch": {
+					"sSearch": "Mozilla"
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Gecko"; }
+	);
+	
+	oTest.fnTest( 
+		"New search will kill old one",
+		function () {
+			oTable.fnFilter("Opera");
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Presto"; }
+	);
+	
+	oTest.fnTest( 
+		"Search plain text term and escape regex true",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"oSearch": {
+					"sSearch": "DS",
+					"bEscapeRegex": true
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Nintendo DS browser"; }
+	);
+	
+	oTest.fnTest( 
+		"Search plain text term and escape regex false",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"oSearch": {
+					"sSearch": "Opera",
+					"bEscapeRegex": false
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Presto"; }
+	);
+	
+	oTest.fnTest( 
+		"Search regex text term and escape regex true",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"oSearch": {
+					"sSearch": "1.*",
+					"bEscapeRegex": true
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	oTest.fnTest( 
+		"Search regex text term and escape regex false",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"oSearch": {
+					"sSearch": "1.*",
+					"bEscapeRegex": false
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Gecko"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/sAjaxSource.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/sAjaxSource.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/sAjaxSource.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,18 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "sAjaxSource" );
+
+/* Not interested in ajax source here other than to check it's default */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Server side is off by default",
+		null,
+		function () { return oSettings.sAjaxSource == null; }
+	);
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/sDom.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/sDom.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/sDom.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,254 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "sDom" );
+
+/* This is going to be brutal on the browser! There is a lot that can be tested here... */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Default DOM varaible",
+		null,
+		function () { return oSettings.sDomPositioning == "lfrtip"; }
+	);
+	
+	oTest.fnTest( 
+		"Default DOM in document",
+		null,
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nTable &&
+				nNodes[4] == nInfo &&
+				nNodes[5] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Check example 1 in code propagates",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sDom": '<"wrapper"flipt>'
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.sDomPositioning == '<"wrapper"flipt>'; }
+	);
+	
+	oTest.fnTest( 
+		"Check example 1 in DOM",
+		null,
+		function () {
+			var jqNodes = $('#demo div, #demo table');
+			var nNodes = [];
+			
+			/* Strip the paging nodes */
+			for ( var i=0, iLen=jqNodes.length ; i<iLen ; i++ )
+			{
+				if ( jqNodes[i].getAttribute('id') != "example_previous" &&
+				     jqNodes[i].getAttribute('id') != "example_next" )
+				{
+					nNodes.push( jqNodes[i] );
+				}
+			}
+			
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			var nCustomWrapper = $('div.wrapper')[0];
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nCustomWrapper &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nLength &&
+				nNodes[4] == nInfo &&
+				nNodes[5] == nPaging &&
+				nNodes[6] == nTable;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Check example 2 in DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sDom": '<lf<t>ip>'
+			} );
+		},
+		function () {
+			var jqNodes = $('#demo div, #demo table');
+			var nNodes = [];
+			var nCustomWrappers = []
+			
+			/* Strip the paging nodes */
+			for ( var i=0, iLen=jqNodes.length ; i<iLen ; i++ )
+			{
+				if ( jqNodes[i].getAttribute('id') != "example_previous" &&
+				     jqNodes[i].getAttribute('id') != "example_next" )
+				{
+					nNodes.push( jqNodes[i] );
+				}
+				
+				/* Only the two custom divs don't have class names */
+				if ( !jqNodes[i].getAttribute('class') )
+				{
+					nCustomWrappers.push( jqNodes[i] );
+				}
+			}
+			
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nCustomWrappers[0] &&
+				nNodes[2] == nLength &&
+				nNodes[3] == nFilter &&
+				nNodes[4] == nCustomWrappers[1] &&
+				nNodes[5] == nTable &&
+				nNodes[6] == nInfo &&
+				nNodes[7] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Check no length element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sDom": 'frtip'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				null == nLength &&
+				nNodes[1] == nFilter &&
+				nNodes[2] == nTable &&
+				nNodes[3] == nInfo &&
+				nNodes[4] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Check no filter element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sDom": 'lrtip'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				null == nFilter &&
+				nNodes[2] == nTable &&
+				nNodes[3] == nInfo &&
+				nNodes[4] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	/* Note we don't test for no table as this is not supported (and it would be fairly daft! */
+	
+	oTest.fnTest( 
+		"Check no info element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sDom": 'lfrtp'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nTable &&
+				null == nInfo &&
+				nNodes[4] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Check no paging element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sDom": 'lfrti'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nTable &&
+				nNodes[4] == nInfo &&
+				null == nPaging;
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/sPaginationType.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/sPaginationType.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/1_dom/sPaginationType.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,122 @@
+// DATA_TEMPLATE: dom_data
+oTest.fnStart( "sPaginationType" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable();
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Check two button paging is the default",
+		null,
+		function () { return oSettings.sPaginationType == "two_button"; }
+	);
+	
+	oTest.fnTest( 
+		"Check class is applied",
+		null,
+		function () { return $('#example_paginate').hasClass('paging_two_button'); }
+	);
+	
+	oTest.fnTest( 
+		"Two div elements are in the wrapper",
+		null,
+		function () { return $('#example_paginate div').length == 2; }
+	);
+	
+	oTest.fnTest( 
+		"We have the previous button",
+		null,
+		function () { return document.getElementById('example_previous'); }
+	);
+	
+	oTest.fnTest( 
+		"We have the next button",
+		null,
+		function () { return document.getElementById('example_next'); }
+	);
+	
+	oTest.fnTest( 
+		"Previous button is disabled",
+		null,
+		function () { return $('#example_previous').hasClass('paginate_disabled_previous'); }
+	);
+	
+	oTest.fnTest( 
+		"Next button is enabled",
+		null,
+		function () { return $('#example_next').hasClass('paginate_enabled_next'); }
+	);
+	
+	/* Don't test paging - that's done by the zero config test script. */
+	
+	
+	/* Two buttons paging */
+	oTest.fnTest( 
+		"Can enabled full numbers paging",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sPaginationType": "full_numbers"
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.sPaginationType == "full_numbers"; }
+	);
+	
+	oTest.fnTest( 
+		"Check full numbers class is applied",
+		null,
+		function () { return $('#example_paginate').hasClass('paging_full_numbers'); }
+	);
+	
+	
+	var nFirst, nPrevious, nNext, nLast;
+	oTest.fnTest( 
+		"Jump to last page",
+		function () {
+			nFirst = $('div.dataTables_paginate span.first');
+			nPrevious = $('div.dataTables_paginate span.previous');
+			nNext = $('div.dataTables_paginate span.next');
+			nLast = $('div.dataTables_paginate span.last');
+			nLast.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 51 to 57 of 57 entries";
+		}
+	);
+	
+	oTest.fnTest( 
+		"Go to two pages previous",
+		function () {
+			nPrevious.click();
+			nPrevious.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 31 to 40 of 57 entries";
+		}
+	);
+	
+	oTest.fnTest( 
+		"Next (second last) page",
+		function () {
+			nNext.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 41 to 50 of 57 entries";
+		}
+	);
+	
+	oTest.fnTest( 
+		"Jump to first page",
+		function () {
+			nFirst.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries";
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/_zero_config.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/_zero_config.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/_zero_config.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,440 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "Santiy checks for DataTables with data from JS" );
+
+oTest.fnTest( 
+	"jQuery.dataTable function",
+	null,
+	function () { return typeof jQuery().dataTable == "function"; }
+);
+
+oTest.fnTest(
+	"jQuery.dataTableSettings storage array",
+	null,
+	function () { return typeof jQuery().dataTableSettings == "object"; }
+);
+
+oTest.fnTest(
+	"jQuery.dataTableExt plugin object",
+	null,
+	function () { return typeof jQuery().dataTableExt == "object"; }
+);
+
+$(document).ready( function () {
+	var oInit = {
+		"aaData": gaaData
+	};
+	$('#example').dataTable( oInit );
+	
+	/* Basic checks */
+	oTest.fnTest( 
+		"Length changing div exists",
+		null,
+		function () { return document.getElementById('example_length') != null; }
+	);
+	
+	oTest.fnTest( 
+		"Filtering div exists",
+		null,
+		function () { return document.getElementById('example_filter') != null; }
+	);
+	
+	oTest.fnTest( 
+		"Information div exists",
+		null,
+		function () { return document.getElementById('example_info') != null; }
+	);
+	
+	oTest.fnTest( 
+		"Pagination div exists",
+		null,
+		function () { return document.getElementById('example_paginate') != null; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div is off by default",
+		null,
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	oTest.fnTest( 
+		"10 rows shown on the first page",
+		null,
+		function () { return $('#example tbody tr').length == 10; }
+	);
+	
+	oTest.fnTest( 
+		"Initial sort occured",
+		null,
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	/* Need to use the WaitTest for sorting due to the setTimeout datatables uses */
+	oTest.fnTest( 
+		"Sorting (first click) on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting (second click) on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting (third click) on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting (first click) on numeric column",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "-"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting (second click) on numeric column",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "522.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting multi-column (first click)",
+		function () { 
+			$('#example thead th:eq(0)').click();
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } ); },
+		function () { var b = 
+			$('#example tbody td:eq(0)').html() == "Gecko" && 
+			$('#example tbody td:eq(1)').html() == "Camino 1.0"; return b; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting multi-column - sorting second column only",
+		function () { 
+			$('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	/* Basic paging */
+	oTest.fnTest( 
+		"Paging to second page",
+		function () { $('#example_next').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "IE Mobile"; }
+	);
+	
+	oTest.fnTest( 
+		"Paging to first page",
+		function () { $('#example_previous').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Attempting to page back beyond the first page",
+		function () { $('#example_previous').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	/* Changing length */
+	oTest.fnTest( 
+		"Changing table length to 25 records",
+		function () { $("select[name=example_length]").val('25').change(); },
+		function () { return $('#example tbody tr').length == 25; }
+	);
+	
+	oTest.fnTest( 
+		"Changing table length to 50 records",
+		function () { $("select[name=example_length]").val('50').change(); },
+		function () { return $('#example tbody tr').length == 50; }
+	);
+	
+	oTest.fnTest( 
+		"Changing table length to 100 records",
+		function () { $("select[name=example_length]").val('100').change(); },
+		function () { return $('#example tbody tr').length == 57; }
+	);
+	
+	oTest.fnTest( 
+		"Changing table length to 10 records",
+		function () { $("select[name=example_length]").val('10').change(); },
+		function () { return $('#example tbody tr').length == 10; }
+	);
+	
+	/*
+	 * Information element
+	 */
+	oTest.fnTest(
+		"Information on zero config",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information on second page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 11 to 20 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information on third page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 21 to 30 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information on last page",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 51 to 57 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information back on first page",
+		function () {
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information with 25 records",
+		function () { $("select[name=example_length]").val('25').change(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 25 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information with 25 records - second page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 26 to 50 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information with 100 records - first page",
+		function () {
+			$('#example_previous').click();
+			$("select[name=example_length]").val('100').change();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 57 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information back to 10 records",
+		function () {
+			$('#example_previous').click();
+			$("select[name=example_length]").val('10').change();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win'",
+		function () { $('#example_filter input').val("Win").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' second page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 11 to 20 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' last page",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 31 to 31 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' back to first page",
+		function () {
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' second page - second time",
+		function () {
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 11 to 20 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter increased to 'Win 98'",
+		function () { $('#example_filter input').val("Win 98").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 9 of 9 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter decreased to 'Win'",
+		function () { $('#example_filter input').val("Win").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' second page - third time",
+		function () {
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 11 to 20 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter removed",
+		function () { $('#example_filter input').val("").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	/*
+	 * Filtering
+	 */
+	oTest.fnTest(
+		"Filter 'W' - rows",
+		function () { 
+			/* Reset the table such that the old sorting doesn't mess things up */
+			oSession.fnRestore();
+			$('#example').dataTable( oInit );
+			$('#example_filter input').val("W").keyup(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Gecko"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'W' - info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 42 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Wi'",
+		function () { $('#example_filter input').val("Wi").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 32 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win'",
+		function () { $('#example_filter input').val("Win").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win' - sorting column 1",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "AOL browser (AOL desktop)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win' - sorting column 1 info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win' - sorting column 1 reverse",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win XP' - maintaing reverse sorting col 1",
+		function () { $('#example_filter input').val("Win XP").keyup(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Internet Explorer 7"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win XP' - sorting col 3",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "4"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win XP' - sorting col 3 - reversed",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "7"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win' - sorting col 3 - reversed info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 6 of 6 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'nothinghere'",
+		function () { $('#example_filter input').val("nothinghere").keyup(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 
+			"No matching records found"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'nothinghere' - info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 0 to 0 of 0 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter back to blank and 1st column sorting",
+		function () {
+			$('#example_filter input').val("").keyup();
+			$('#example thead th:eq(0)').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Prefixing a filter entry",
+		function () {
+			$('#example_filter input').val("Win").keyup();
+			$('#example_filter input').val("GeckoWin").keyup();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 0 to 0 of 0 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Prefixing a filter entry with space",
+		function () {
+			$('#example_filter input').val("Gecko Win").keyup();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 17 entries (filtered from 57 total entries)"; }
+	);
+	
+	
+	
+	
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aaSorting.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aaSorting.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aaSorting.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,198 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aaSorting" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Default sorting is single column",
+		null,
+		function () {
+			return oSettings.aaSorting.length == 1 && typeof oSettings.aaSorting[0] == 'object';
+		}
+	);
+	
+	oTest.fnTest( 
+		"Default sorting is first column asc",
+		null,
+		function () {
+			return oSettings.aaSorting[0].length == 3 && oSettings.aaSorting[0][0] == 0 &&
+				oSettings.aaSorting[0][1] == 'asc';
+		}
+	);
+	
+	oTest.fnTest( 
+		"Sorting is applied",
+		null,
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Custom sorting on single string column asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Custom sorting on single string column desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Custom sorting on single int column asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "-"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Custom sorting on single int column desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string asc / string asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['0','asc'], ['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Camino 1.0"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string asc / string desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['0','asc'], ['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string desc / string asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['0','desc'], ['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "iPod Touch / iPhone"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string desc / string desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['0','desc'], ['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Safari 3.0"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string asc / int asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['0','asc'], ['3','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "1"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string asc / int desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['0','asc'], ['3','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "1.9"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string desc / int asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['0','desc'], ['3','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "125.5"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (2 column) - string desc / int desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['0','desc'], ['3','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "522.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column sorting (3 column) - string asc / int asc / string asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSorting": [['0','asc'], ['3','asc'], ['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(7) td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aaSortingFixed.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aaSortingFixed.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aaSortingFixed.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,64 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aaSortingFixed" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"No fixed sorting by default",
+		null,
+		function () {
+			return oSettings.aaSortingFixed == null;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Fixed sorting on first column (string/asc) with user sorting on second column (string/asc)",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSortingFixed": [['0','asc']]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Camino 1.0"; }
+	);
+	
+	oTest.fnTest( 
+		"Fixed sorting on first column (string/asc) with user sorting on second column (string/desc)",
+		function () {
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Fixed sorting on fourth column (int/asc) with user sorting on second column (string/asc)",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aaSortingFixed": [['3','asc']]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Fixed sorting on fourth column (int/asc) with user sorting on second column (string/desc)",
+		function () {
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "PSP browser"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bSearchable.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bSearchable.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bSearchable.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,71 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aoColumns.bSeachable" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Columns are searchable by default",
+		function () { oTable.fnFilter("Camino"); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html().match(/Camino/); }
+	);
+	
+	oTest.fnTest( 
+		"Disabling sorting on a column removes it from the global filter",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "bSearchable": false },
+					null,
+					null,
+					null
+				]
+			} );
+			oSettings = oTable.fnSettings();
+			oTable.fnFilter("Camino");
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	oTest.fnTest( 
+		"Disabled on one column has no effect on other columns",
+		function () { oTable.fnFilter("Webkit"); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Webkit"; }
+	);
+	
+	oTest.fnTest( 
+		"Disable filtering on multiple columns",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					{ "bSearchable": false },
+					{ "bSearchable": false },
+					null,
+					null,
+					null
+				]
+			} );
+			oSettings = oTable.fnSettings();
+			oTable.fnFilter("Webkit");
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	oTest.fnTest( 
+		"Filter on second disabled column",
+		function () { oTable.fnFilter("Camino"); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bSortable.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bSortable.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bSortable.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,109 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aoColumns.bSortable" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"All columns are sortable by default",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Can disable sorting from one column",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "bSortable": false },
+					null,
+					null,
+					null
+				]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() != "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Disabled column has no sorting class",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_asc") == false; }
+	);
+	
+	oTest.fnTest( 
+		"Other columns can still sort",
+		function () {
+			$('#example thead th:eq(4)').click();
+			$('#example thead th:eq(4)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == "X"; }
+	);
+	
+	oTest.fnTest( 
+		"Disable sorting on multiple columns - no sorting classes",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "bSortable": false },
+					null,
+					{ "bSortable": false },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn = 
+				$('#example thead th:eq(1)').hasClass("sorting") ||
+				$('#example thead th:eq(3)').hasClass("sorting")
+			return bReturn == false;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Sorting on disabled column 1 has no effect",
+		function () {
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() != "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting on disabled column 2 has no effect",
+		function () {
+			$('#example thead th:eq(3)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() != "-"; }
+	);
+	
+	oTest.fnTest( 
+		"Second sort on disabled column 2 has no effect",
+		function () {
+			$('#example thead th:eq(3)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() != "-"; }
+	);
+	
+	oTest.fnTest( 
+		"Even with multiple disabled sorting columns other columns can still sort",
+		function () {
+			$('#example thead th:eq(4)').click();
+			$('#example thead th:eq(4)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == "X"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bUseRendered.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bUseRendered.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bUseRendered.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,148 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aoColumns.bUseRendered" );
+
+/* bUseRendered is used to alter sorting data, if false then the original data is used for
+ * sorting rather than the rendered data
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var mTmp = 0;
+	
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData,
+		"aoColumns": [
+			null,
+			{ "fnRender": function (a) {
+				if ( mTmp == 0 ) {
+					mTmp++;
+					return "aaa";
+				} else
+					return a.aData[a.iDataColumn];
+			} },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Default for bUseRendered is true - rendered data is used for sorting",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'aaa'; }
+	);
+	
+	oTest.fnTest( 
+		"When bUseRendered is false, original data is used for sorting",
+		function () {
+			mTmp = 0;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ 
+						"bUseRendered": false,
+						"fnRender": function (a) {
+							if ( mTmp == 0 ) {
+								mTmp++;
+								return "aaa";
+							} else {
+								return a.aData[a.iDataColumn];
+							}
+						}
+					},
+					null,
+					null,
+					null
+				]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'All others'; }
+	);
+	
+	
+	oTest.fnTest( 
+		"bUseRendered set to false on one columns and true (default) on two others",
+		function () {
+			mTmp = 0;
+			var mTmp2 = 0;
+			var mTmp3 = 0;
+			
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					{
+						"fnRender": function (a) {
+							if ( mTmp == 0 ) {
+								mTmp++;
+								return "aaa1";
+							} else {
+								return a.aData[a.iDataColumn];
+							}
+						}
+					},
+					{ 
+						"bUseRendered": false,
+						"fnRender": function (a) {
+							if ( mTmp2 == 0 ) {
+								mTmp2++;
+								return "aaa2";
+							} else {
+								return a.aData[a.iDataColumn];
+							}
+						}
+					},
+					{
+						"fnRender": function (a) {
+							if ( mTmp3 == 0 ) {
+								mTmp3++;
+								return "zzz3";
+							} else {
+								return a.aData[a.iDataColumn];
+							}
+						}
+					},
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 'aaa1'; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column rendering - 2nd column sorting",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'All others'; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column rendering - 3rd column sorting",
+		function () {
+			$('#example thead th:eq(2)').click();
+			$('#example thead th:eq(2)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(2)').html() == 'zzz3'; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column rendering - 4th column sorting",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == '-'; }
+	);
+	
+	oTest.fnTest( 
+		"Multi-column rendering - 5th column sorting",
+		function () { $('#example thead th:eq(4)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'A'; }
+	);
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bVisible.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bVisible.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.bVisible.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,110 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aoColumns.bVisible" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"All columns are visible by default",
+		null,
+		function () { return $('#example tbody tr:eq(0) td').length == 5; }
+	);
+	
+	oTest.fnTest( 
+		"Can hide one column and it removes td column from DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "bVisible": false },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td').length == 4; }
+	);
+	
+	oTest.fnTest( 
+		"Can hide one column and it removes thead th column from DOM",
+		null,
+		function () { return $('#example thead tr:eq(0) th').length == 4; }
+	);
+	
+	oTest.fnTest( 
+		"Can hide one column and it removes tfoot th column from DOM",
+		null,
+		function () { return $('#example tfoot tr:eq(0) th').length == 4; }
+	);
+	
+	oTest.fnTest( 
+		"The correct tbody column has been hidden",
+		function () {
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } );
+		},
+		function () {
+			var jqNodes = $('#example tbody tr:eq(0) td');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Gecko" &&
+				jqNodes[1].innerHTML == "Gnome" &&
+				jqNodes[2].innerHTML == "1.8" &&
+				jqNodes[3].innerHTML == "A";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Can hide multiple columns and it removes td column from DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "bVisible": false },
+					{ "bVisible": false },
+					null,
+					{ "bVisible": false }
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td').length == 2; }
+	);
+	
+	oTest.fnTest( 
+		"Multiple hide - removes thead th column from DOM",
+		null,
+		function () { return $('#example thead tr:eq(0) th').length == 2; }
+	);
+	
+	oTest.fnTest( 
+		"Multiple hide - removes tfoot th column from DOM",
+		null,
+		function () { return $('#example tfoot tr:eq(0) th').length == 2; }
+	);
+	
+	oTest.fnTest( 
+		"Multiple hide - the correct tbody columns have been hidden",
+		function () {
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } );
+		},
+		function () {
+			var jqNodes = $('#example tbody tr:eq(0) td');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Gecko" &&
+				jqNodes[1].innerHTML == "1"
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.fnRender.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.fnRender.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.fnRender.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,182 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aoColumns.fnRender" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var mTmp = 0;
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData,
+		"aoColumns": [
+			null,
+			{ "fnRender": function (a) {
+				mTmp++;
+				return a.aData[a.iDataColumn];
+			} },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Single column - fnRender is called once for each row",
+		null,
+		function () { return mTmp == 57; }
+	);
+	
+	oTest.fnTest( 
+		"Confirm that fnRender passes one argument (an object) with three parameters",
+		function () {
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( arguments.length != 1 || typeof a.iDataRow=='undefined' ||
+						 	typeof a.iDataColumn=='undefined' || typeof a.aData=='undefined' )
+						{
+							mTmp = false;
+						}
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnTest( 
+		"fnRender iDataColumn is row number",
+		function () {
+			var iCount = 0;
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( iCount != a.iDataRow )
+						{
+							mTmp = false;
+						}
+						iCount++;
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnTest( 
+		"fnRender iDataColumn is the column",
+		function () {
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( a.iDataColumn != 1 )
+						{
+							mTmp = false;
+						}
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnTest( 
+		"fnRender aData is data array of correct size",
+		function () {
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( a.aData.length != 5 )
+						{
+							mTmp = false;
+						}
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnTest( 
+		"Passed back data is put into the DOM",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						return 'unittest';
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'unittest'; }
+	);
+	
+	oTest.fnTest( 
+		"Passed back data is put into the DOM",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					null,
+					{ "fnRender": function (a) {
+						return 'unittest1';
+					} },
+					{ "fnRender": function (a) {
+						return 'unittest2';
+					} },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn = 
+				$('#example tbody tr:eq(0) td:eq(2)').html() == 'unittest1' &&
+				$('#example tbody tr:eq(0) td:eq(3)').html() == 'unittest2';
+			return bReturn; }
+	);
+	
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.iDataSort.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.iDataSort.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.iDataSort.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,90 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aoColumns.iDataSort" );
+
+$(document).ready( function () {
+	/* Should know that sorting already works by default from other tests, so we can jump
+	 * right in here
+	 */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData,
+		"aoColumns": [
+			null,
+			{ "iDataSort": 4 },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Sorting on first column is uneffected",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 'Gecko'; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting on second column is the order of the fifth",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'A'; }
+	);
+	
+	oTest.fnTest( 
+		"Reserve sorting on second column uses fifth column as well",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'X'; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting on 5th column retains it's own sorting",
+		function () { $('#example thead th:eq(4)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'A'; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Use 2nd col for sorting 5th col and via-versa - no effect on first col sorting",
+		function () {
+			mTmp = 0;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "iDataSort": 4 },
+					null,
+					null,
+					{ "iDataSort": 1 }
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 'Gecko'; }
+	);
+	
+	oTest.fnTest( 
+		"2nd col sorting uses fifth col",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'A'; }
+	);
+	
+	oTest.fnTest( 
+		"2nd col sorting uses fifth col - reversed",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'X'; }
+	);
+	
+	oTest.fnTest( 
+		"5th col sorting uses 2nd col",
+		function () { $('#example thead th:eq(4)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'All others'; }
+	);
+	
+	oTest.fnTest( 
+		"5th col sorting uses 2nd col - reversed",
+		function () { $('#example thead th:eq(4)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'Seamonkey 1.1'; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sClass.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sClass.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sClass.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,115 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aoColumns.sClass" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"By default the test class hasn't been applied to the column (sanity!)",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(2)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - first row",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					null,
+					{ "sClass": 'unittest' },
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(1) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - third row",
+		null,
+		function () { return $('#example tbody tr:eq(3) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - last row",
+		null,
+		function () { return $('#example tbody tr:eq(9) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - has not applied to other columns - 1st",
+		null,
+		function () { return $('#example tbody tr:eq(3) td:eq(0)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - has not applied to other columns - 5th",
+		null,
+		function () { return $('#example tbody tr:eq(3) td:eq(4)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - seventh row - second page",
+		function () { $('#example_next').click(); },
+		function () { return $('#example tbody tr:eq(6) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - has not applied to header",
+		null,
+		function () { return $('#example thead tr:eq(3) th:eq(4)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Add a class to a single column - has not applied to footer",
+		null,
+		function () { return $('#example thead tr:eq(3) th:eq(4)').hasClass('unittest') == false; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Class defined for multiple columns - first row",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					{ "sClass": 'unittest2' },
+					null,
+					null,
+					{ "sClass": 'unittest1' },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn = 
+				$('#example tbody tr:eq(3) td:eq(0)').hasClass('unittest2') &&
+				$('#example tbody tr:eq(8) td:eq(3)').hasClass('unittest1');
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Class defined for multiple columns - has not applied to other columns - 5th 1",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').hasClass('unittest1') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Class defined for multiple columns - has not applied to other columns - 5th 2",
+		null,
+		function () { return $('#example tbody tr:eq(6) td:eq(4)').hasClass('unittest2') == false; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sName.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sName.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sName.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,28 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aoColumns.sName" );
+
+/* This has no effect at all in DOM methods - so we just check that it has applied the name */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData,
+		"aoColumns": [
+			null,
+			null,
+			null,
+			{ "sName": 'unit test' },
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Names are stored in the columns object",
+		null,
+		function () { return oSettings.aoColumns[3].sName =="unit test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sTitle.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sTitle.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sTitle.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,82 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aoColumns.sTitle" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"If not given, then the columns titles are empty",
+		null,
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "Browser" &&
+				jqNodes[2].innerHTML == "Platform(s)" &&
+				jqNodes[3].innerHTML == "Engine version" &&
+				jqNodes[4].innerHTML == "CSS grade";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Can set a single column title - and others are read from DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "sTitle": 'unit test' },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "unit test" &&
+				jqNodes[2].innerHTML == "Platform(s)" &&
+				jqNodes[3].innerHTML == "Engine version" &&
+				jqNodes[4].innerHTML == "CSS grade";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Can set multiple column titles",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					{ "sTitle": 'unit test 1' },
+					null,
+					null,
+					{ "sTitle": 'unit test 2' }
+				]
+			} );
+		},
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "unit test 1" &&
+				jqNodes[2].innerHTML == "Platform(s)" &&
+				jqNodes[3].innerHTML == "Engine version" &&
+				jqNodes[4].innerHTML == "unit test 2";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sWidth.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sWidth.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoColumns.sWidth.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,87 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aoColumns.sWidth" );
+
+/* NOTE - we need to disable the auto width for the majority of these test in order to preform 
+ * these tests as the auto width will convert the width to a px value. We can do 'non-exact' tests
+ * with auto width enabled however to ensure it scales columns as required
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData,
+		"bAutoWidth": false,
+		"aoColumns": [
+			null,
+			{ "sWidth": '40%' },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"With auto width disabled the width for one column is appled",
+		null,
+		function () { return $('#example thead th:eq(1)')[0].style.width == "40%"; }
+	);
+	
+	oTest.fnTest( 
+		"With auto width disabled the width for one column is appled",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"bAutoWidth": false,
+				"aoColumns": [
+					null,
+					null,
+					{ "sWidth": '20%' },
+					{ "sWidth": '30%' },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn =
+				$('#example thead th:eq(2)')[0].style.width == "20%" &&
+				$('#example thead th:eq(3)')[0].style.width == "30%";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"With auto width, it will make the smallest column the largest with percentage width given",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoColumns": [
+					null,
+					null,
+					null,
+					{ "sWidth": '40%' },
+					null
+				]
+			} );
+		},
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			
+			if ( a3>a0 && a3>a1 && a3>a2 && a3>a4 )
+				return true;
+			else
+				return false;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoSearchCols.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoSearchCols.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/aoSearchCols.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,119 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "aoSearchCols" );
+
+/* We could be here forever testing this one, so we test a limited subset on a couple of colums */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Default should be to have a empty colums array",
+		null,
+		function () {
+			var bReturn = 
+				oSettings.aoPreSearchCols[0].sSearch == 0 && oSettings.aoPreSearchCols[0].bEscapeRegex &&
+				oSettings.aoPreSearchCols[1].sSearch == 0 && oSettings.aoPreSearchCols[1].bEscapeRegex &&
+				oSettings.aoPreSearchCols[2].sSearch == 0 && oSettings.aoPreSearchCols[2].bEscapeRegex &&
+				oSettings.aoPreSearchCols[3].sSearch == 0 && oSettings.aoPreSearchCols[3].bEscapeRegex &&
+				oSettings.aoPreSearchCols[4].sSearch == 0 && oSettings.aoPreSearchCols[4].bEscapeRegex;
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Search on a single column - no regex statement given",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoSearchCols": [
+					null,
+					{ "sSearch": "Mozilla" },
+					null,
+					{ "sSearch": "1" },
+					null
+				]
+			} );
+		},
+		function () { return $('#example_info').html() == "Showing 1 to 9 of 9 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest( 
+		"Search on two columns - no regex statement given",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoSearchCols": [
+					null,
+					{ "sSearch": "Mozilla" },
+					null,
+					{ "sSearch": "1.5" },
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "1.5"; }
+	);
+	
+	oTest.fnTest( 
+		"Search on single column - escape regex false",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoSearchCols": [
+					{ "sSearch": ".*ML", "bEscapeRegex": false },
+					null,
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example_info').html() == "Showing 1 to 3 of 3 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest( 
+		"Search on two columns - escape regex false on first, true on second",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoSearchCols": [
+					{ "sSearch": ".*ML", "bEscapeRegex": false },
+					{ "sSearch": "3.3", "bEscapeRegex": true },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Konqureror 3.3"; }
+	);
+	
+	oTest.fnTest( 
+		"Search on two columns (no records) - escape regex false on first, true on second",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"aoSearchCols": [
+					{ "sSearch": ".*ML", "bEscapeRegex": false },
+					{ "sSearch": "Allan", "bEscapeRegex": true },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/asStripClasses.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/asStripClasses.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/asStripClasses.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,100 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "asStripClasses" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	
+	oTest.fnTest( 
+		"Default row striping is applied",
+		null,
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('odd') &&
+			       $('#example tbody tr:eq(1)').hasClass('even') &&
+			       $('#example tbody tr:eq(2)').hasClass('odd') &&
+			       $('#example tbody tr:eq(3)').hasClass('even');
+		}
+	);
+	
+	oTest.fnTest( 
+		"Row striping on the second page",
+		function () { $('#example_next').click(); },
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('odd') &&
+			       $('#example tbody tr:eq(1)').hasClass('even') &&
+			       $('#example tbody tr:eq(2)').hasClass('odd') &&
+			       $('#example tbody tr:eq(3)').hasClass('even');
+		}
+	);
+	
+	/* No striping */
+	oTest.fnTest( 
+		"No row striping",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"asStripClasses": []
+			} );
+		},
+		function () {
+			return $('#example tbody tr:eq(0)')[0].className == "" &&
+			       $('#example tbody tr:eq(1)')[0].className == "" &&
+			       $('#example tbody tr:eq(2)')[0].className == "" &&
+			       $('#example tbody tr:eq(3)')[0].className == "";
+		}
+	);
+	
+	/* Custom striping */
+	oTest.fnTest( 
+		"Custom striping [2]",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"asStripClasses": [ 'test1', 'test2' ]
+			} );
+		},
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('test1') &&
+			       $('#example tbody tr:eq(1)').hasClass('test2') &&
+			       $('#example tbody tr:eq(2)').hasClass('test1') &&
+			       $('#example tbody tr:eq(3)').hasClass('test2');
+		}
+	);
+	
+	
+	/* long array of striping */
+	oTest.fnTest( 
+		"Custom striping [4]",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"asStripClasses": [ 'test1', 'test2', 'test3', 'test4' ]
+			} );
+		},
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('test1') &&
+			       $('#example tbody tr:eq(1)').hasClass('test2') &&
+			       $('#example tbody tr:eq(2)').hasClass('test3') &&
+			       $('#example tbody tr:eq(3)').hasClass('test4');
+		}
+	);
+	
+	oTest.fnTest( 
+		"Custom striping is restarted on second page [2]",
+		function () { $('#example_next').click(); },
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('test1') &&
+			       $('#example tbody tr:eq(1)').hasClass('test2') &&
+			       $('#example tbody tr:eq(2)').hasClass('test3') &&
+			       $('#example tbody tr:eq(3)').hasClass('test4');
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bAutoWidth.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bAutoWidth.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bAutoWidth.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,142 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "bAutoWidth" );
+
+/* It's actually a little tricky to test this. We can't test absolute numbers because
+ * different browsers and different platforms will render the width of the columns slightly
+ * differently. However, we certainly can test the principle of what should happen (column 
+ * width doesn't change over pages)
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Auto width is enabled by default",
+		null,
+		function () { return oSettings.oFeatures.bAutoWidth; }
+	);
+	
+	oTest.fnTest( 
+		"First column has a width assigned to it",
+		null,
+		function () { return $('#example thead th:eq(0)').attr('style').match(/width/i); }
+	);
+	
+	/*
+	This would seem like a better test - but there appear to be difficulties with tables
+	which are bigger (calculated) than there is actually room for. I suspect this is actually
+	a bug in datatables
+	oTest.fnTest( 
+		"Check column widths on first page match second page",
+		null,
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			$('#example_next').click();
+			var b0 = anThs[0].offsetWidth;
+			var b1 = anThs[1].offsetWidth;
+			var b2 = anThs[2].offsetWidth;
+			var b3 = anThs[3].offsetWidth;
+			var b4 = anThs[4].offsetWidth;
+			console.log( a0, b0, a1, b1, a2, b2, a3, b3 );
+			if ( a0==b0 && a1==b1 && a2==b2 && a3==b3 )
+				return true;
+			else
+				return false;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Check column widths on second page match thid page",
+		null,
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			$('#example_next').click();
+			var b0 = anThs[0].offsetWidth;
+			var b1 = anThs[1].offsetWidth;
+			var b2 = anThs[2].offsetWidth;
+			var b3 = anThs[3].offsetWidth;
+			var b4 = anThs[4].offsetWidth;
+			if ( a0==b0 && a1==b1 && a2==b2 && a3==b3 )
+				return true;
+			else
+				return false;
+		}
+	);
+	*/
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Auto width can be disabled",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"bAutoWidth": false
+			} );
+	 		oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bAutoWidth == false; }
+	);
+	
+	oTest.fnTest( 
+		"First column does not have a width assigned to it",
+		null,
+		function () { return $('#example thead th:eq(0)').attr('style') == null; }
+	);
+	
+	/*
+	oTest.fnTest( 
+		"Check column widths on first page do not match second page",
+		null,
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			$('#example_next').click();
+			var b0 = anThs[0].offsetWidth;
+			var b1 = anThs[1].offsetWidth;
+			var b2 = anThs[2].offsetWidth;
+			var b3 = anThs[3].offsetWidth;
+			var b4 = anThs[4].offsetWidth;
+			if ( a0==b0 && a1==b1 && a2==b2 && a3==b3 )
+				return false;
+			else
+				return true;
+		}
+	);
+	*/
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Auto width enabled override",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"bAutoWidth": true
+			} );
+	 		oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bAutoWidth; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bFilter.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bFilter.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bFilter.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,44 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "bFilter" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	
+	oTest.fnTest( 
+		"Filtering div exists by default",
+		null,
+		function () { return document.getElementById('example_filter') != null; }
+	);
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Fltering can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"bFilter": false
+			} );
+		},
+		function () { return document.getElementById('example_filter') == null; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Filtering enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"bFilter": true
+			} );
+		},
+		function () { return document.getElementById('example_filter') != null; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bInfo.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bInfo.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bInfo.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,44 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "bInfo" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	
+	oTest.fnTest( 
+		"Info div exists by default",
+		null,
+		function () { return document.getElementById('example_info') != null; }
+	);
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Info can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"bInfo": false
+			} );
+		},
+		function () { return document.getElementById('example_info') == null; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Info enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"bInfo": true
+			} );
+		},
+		function () { return document.getElementById('example_info') != null; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bLengthChange.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bLengthChange.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bLengthChange.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,75 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "bLengthChange" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	
+	oTest.fnTest( 
+		"Length div exists by default",
+		null,
+		function () { return document.getElementById('example_length') != null; }
+	);
+	
+	oTest.fnTest(
+		"Four default options",
+		null,
+		function () { return $("select[name=example_length] option").length == 4; }
+	);
+	
+	oTest.fnTest(
+		"Default options",
+		null,
+		function () {
+			var opts = $("select[name='example_length'] option");
+			return opts[0].getAttribute('value') == 10 && opts[1].getAttribute('value') == 25 &&
+				opts[2].getAttribute('value') == 50 && opts[3].getAttribute('value') == 100;
+		}
+	);
+	
+	oTest.fnTest(
+		"Info takes length into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Change length can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"bLengthChange": false
+			} );
+		},
+		function () { return document.getElementById('example_length') == null; }
+	);
+	
+	oTest.fnTest(
+		"Information takes length disabled into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Length change enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"bLengthChange": true
+			} );
+		},
+		function () { return document.getElementById('example_length') != null; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bPaginate.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bPaginate.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bPaginate.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,59 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "bPaginate" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	
+	oTest.fnTest( 
+		"Pagiantion div exists by default",
+		null,
+		function () { return document.getElementById('example_paginate') != null; }
+	);
+	
+	oTest.fnTest(
+		"Information div takes paging into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Pagiantion can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"bPaginate": false
+			} );
+		},
+		function () { return document.getElementById('example_paginate') == null; }
+	);
+	
+	oTest.fnTest(
+		"Information div takes paging disabled into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 57 of 57 entries"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Pagiantion enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"bPaginate": true
+			} );
+		},
+		function () { return document.getElementById('example_paginate') != null; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bProcessing.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bProcessing.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bProcessing.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,103 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "bProcessing" );
+
+/* It's actually a bit hard to set this one due to the fact that it will only be shown
+ * when DataTables is doing some kind of processing. The server-side processing is a bit
+ * better to test this than here - so we just the interal functions to enable it and check
+ * that it is available
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Processing is off by default",
+		null,
+		function () { return oSettings.oFeatures.bProcessing == false; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div is not in the DOM",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div cannot be shown",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div cannot be hidden",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, false ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Processing can be enabled",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"bProcessing": true
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bProcessing == true; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div is in the DOM",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing'); }
+	);
+	
+	oTest.fnTest( 
+		"Processing div is hidden by default",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing').style.visibility = "hidden"; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div can be shown",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing').style.visibility = "visible"; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div can be hidden",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, false ); },
+		function () { return document.getElementById('example_processing').style.visibility = "hidden"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Processing disabled override",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"bProcessing": false
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bProcessing == false; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div is not in the DOM",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bServerSide.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bServerSide.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bServerSide.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,20 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "bServerSide" );
+
+/* Not interested in server-side processing here other than to check that it is off */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Server side is off by default",
+		null,
+		function () { return oSettings.oFeatures.bServerSide == false; }
+	);
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bSort.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bSort.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bSort.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,99 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "bSort" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	
+	oTest.fnTest( 
+		"Sorting is on by default",
+		null,
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting Asc by default class applied",
+		null,
+		function () { return $('#example thead th:eq(0)').hasClass("sorting_asc"); }
+	);
+	
+	oTest.fnTest(
+		"Click on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting class removed from first column",
+		null,
+		function () { return $('#example thead th:eq(0)').hasClass("sorting_asc") != true; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting asc class applied to second column",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_asc"); }
+	);
+	
+	oTest.fnTest(
+		"Reverse on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting acs class removed from second column",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_asc") != true; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting desc class applied to second column",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_desc"); }
+	);
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Pagiantion can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"bSort": false
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "4"; }
+	);
+	
+	oTest.fnTest(
+		"Click on second column has no effect",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "4"; }
+	);
+	
+	oTest.fnTest(
+		"Reverse on second column has no effect",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "4"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Sorting enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"bSort": true
+			} );
+		},
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bSortClasses.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bSortClasses.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/bSortClasses.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,132 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "bSortClasses" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	
+	oTest.fnTest( 
+		"Sorting classes are applied by default",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1'); }
+	);
+	
+	oTest.fnTest( 
+		"Sorting classes are applied to all required cells",
+		null,
+		function () { return $('#example tbody tr:eq(7) td:eq(0)').hasClass('sorting_1'); }
+	);
+	
+	oTest.fnTest( 
+		"Sorting classes are not applied to non-sorting columns",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_1') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting multi-column - add column 1",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2');
+		}
+	);
+	
+	oTest.fnTest( 
+		"Sorting multi-column - add column 2",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(2)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3');
+		}
+	);
+	
+	oTest.fnTest( 
+		"Sorting multi-column - add column 3",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(3)')[0], { 'shift': true } );
+		},
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3') &&
+						 $('#example tbody tr:eq(0) td:eq(3)').hasClass('sorting_3');
+		}
+	);
+	
+	oTest.fnTest( 
+		"Remove sorting classes on single column sort",
+		function () { 
+			$('#example thead th:eq(4)').click();
+		},
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') == false &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3') == false &&
+						 $('#example tbody tr:eq(0) td:eq(3)').hasClass('sorting_3') == false;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Sorting class 1 was added",
+		null,
+		function () { return $('#example tbody tr:eq(1) td:eq(4)').hasClass('sorting_1'); }
+	);
+	
+	
+	/* Check can disable */
+	oTest.fnTest( 
+		"Sorting classes can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"bSortClasses": false
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting classes disabled - add column 1 - no effect",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') == false;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Sorting classes disabled - add column 2 - no effect",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(2)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') == false &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3') == false;
+		}
+	);
+	
+	
+	/* Enable makes no difference */
+	oTest.fnTest( 
+		"Sorting classes enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"bSortClasses": true
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1'); }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnDrawCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnDrawCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnDrawCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,85 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "fnDrawCallback" );
+
+/* Fairly boring function compared to the others! */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnDrawCallback == null; }
+	);
+	
+	
+	oTest.fnTest( 
+		"One argument passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnDrawCallback": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	
+	oTest.fnTest( 
+		"That one argument is the settings object",
+		function () {
+			oSession.fnRestore();
+			
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"fnDrawCallback": function ( oSettings ) {
+					mPass = oSettings;
+				}
+			} );
+		},
+		function () { return oTable.fnSettings() == mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnRowCallback called once on first draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnDrawCallback": function ( ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnTest( 
+		"fnRowCallback called once on each draw there after as well",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return mPass == 4; }
+	);
+	
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnFooterCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnFooterCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnFooterCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,240 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "fnFooterCallback" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnFooterCallback == null; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Five arguments passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnFooterCallback": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 5; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnRowCallback called once per draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnTest( 
+		"fnRowCallback called on paging (i.e. another draw)",
+		function () { $('#example_next').click(); },
+		function () { return mPass == 2; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnRowCallback allows us to alter row information",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					nFoot.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records";
+				}
+			} );
+		},
+		function () { return $('#example tfoot th:eq(0)').html() == "Displaying 10 records"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Data array has length matching original data",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aasData.length != 57 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnTest( 
+		"Data array's column lengths match original data",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					for ( var i=0, iLen=aasData.length ; i<iLen ; i++ )
+					{
+						if ( aasData[i].length != 5 )
+						{
+							mPass = false;
+						}
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iStart correct on first page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iStart != 0 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iStart correct on second page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iStart == 10 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			$('#example_next').click();
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iEnd correct on first page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iEnd != 10 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iEnd correct on second page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iEnd == 20 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			$('#example_next').click();
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"aiDisplay length is full data when not filtered",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aiDisplay.length == 57 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnTest( 
+		"aiDisplay length is 9 when filtering on 'Mozilla'",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"fnFooterCallback": function ( nFoot, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aiDisplay.length == 9 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			oTable.fnFilter( "Mozilla" );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnHeaderCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnHeaderCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnHeaderCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,240 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "fnHeaderCallback" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnHeaderCallback == null; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Five arguments passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnHeaderCallback": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 5; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnRowCallback called once per draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnTest( 
+		"fnRowCallback called on paging (i.e. another draw)",
+		function () { $('#example_next').click(); },
+		function () { return mPass == 2; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnRowCallback allows us to alter row information",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					nHead.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records";
+				}
+			} );
+		},
+		function () { return $('#example thead th:eq(0)').html() == "Displaying 10 records"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Data array has length matching original data",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aasData.length != 57 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnTest( 
+		"Data array's column lengths match original data",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					for ( var i=0, iLen=aasData.length ; i<iLen ; i++ )
+					{
+						if ( aasData[i].length != 5 )
+						{
+							mPass = false;
+						}
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iStart correct on first page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iStart != 0 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iStart correct on second page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iStart == 10 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			$('#example_next').click();
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iEnd correct on first page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iEnd != 10 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"iEnd correct on second page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iEnd == 20 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			$('#example_next').click();
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"aiDisplay length is full data when not filtered",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aiDisplay.length == 57 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnTest( 
+		"aiDisplay length is 9 when filtering on 'Mozilla'",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aiDisplay.length == 9 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			oTable.fnFilter( "Mozilla" );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnInitComplete.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnInitComplete.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnInitComplete.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,83 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "fnInitComplete" );
+
+/* Fairly boring function compared to the others! */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnInitComplete == null; }
+	);
+	
+	
+	oTest.fnTest( 
+		"One argument passed (for DOM!)",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnInitComplete": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	
+	oTest.fnTest( 
+		"That one argument is the settings object",
+		function () {
+			oSession.fnRestore();
+			
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"fnInitComplete": function ( oSettings ) {
+					mPass = oSettings;
+				}
+			} );
+		},
+		function () { return oTable.fnSettings() == mPass; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnInitComplete called once on first draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnInitComplete": function ( ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnTest( 
+		"fnInitComplete never called there after",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return mPass == 1; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnRowCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnRowCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnRowCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,112 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "fnRowCallback" );
+
+/* Note - fnRowCallback MUST return the first arguments (modified or not) */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnRowCallback == null; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Four arguments passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnRowCallback": function ( nTr ) {
+					mPass = arguments.length;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass == 4; }
+	);
+	
+	
+	oTest.fnTest( 
+		"fnRowCallback called once for each drawn row",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					mPass++;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass == 10; }
+	);
+	
+	oTest.fnTest( 
+		"fnRowCallback allows us to alter row information",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					$(nTr).addClass('unit_test');
+					return nTr;
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(1)').hasClass('unit_test'); }
+	);
+	
+	oTest.fnTest( 
+		"Data array has length matching columns",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					if ( asData.length != 5 )
+						mPass = false;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnTest( 
+		"Data array has length matching columns",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			var iCount = 0;
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					if ( iCount != iDrawIndex )
+						mPass = false;
+					iCount++;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnServerData.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnServerData.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/fnServerData.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,22 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "fnServerData" );
+
+/* Not testing anything beyond the default here. SSP will do that... */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnTest( 
+		"Default should be $.getJSON",
+		null,
+		function () { return oSettings.fnServerData == $.getJSON; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/iDisplayLength.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/iDisplayLength.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/iDisplayLength.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,81 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "iDisplayLength" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	
+	oTest.fnTest( 
+		"Default length is ten",
+		null,
+		function () { return $('#example tbody tr').length == 10; }
+	);
+	
+	oTest.fnTest( 
+		"Select menu shows 10",
+		null,
+		function () { return $('#example_length select').val() == 10; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Set initial length to 25",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"iDisplayLength": 25
+			} );
+		},
+		function () { return $('#example tbody tr').length == 25; }
+	);
+	
+	oTest.fnTest( 
+		"Select menu shows 25",
+		null,
+		function () { return $('#example_length select').val() == 25; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Set initial length to 100",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"iDisplayLength": 100
+			} );
+		},
+		function () { return $('#example tbody tr').length == 57; }
+	);
+	
+	oTest.fnTest( 
+		"Select menu shows 25",
+		null,
+		function () { return $('#example_length select').val() == 100; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Set initial length to 23 (unknown select menu length)",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"iDisplayLength": 23
+			} );
+		},
+		function () { return $('#example tbody tr').length == 23; }
+	);
+	
+	oTest.fnTest( 
+		"Select menu shows 10 (since 23 is unknow)",
+		null,
+		function () { return $('#example_length select').val() == 10; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.oPaginate.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.oPaginate.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.oPaginate.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,84 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "oLanguage.oPaginate" );
+
+/* Note that the paging language information only has relevence in full numbers */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData,
+		"sPaginationType": "full_numbers"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"oLanguage.oPaginate defaults",
+		null,
+		function () {
+			var bReturn = 
+				oSettings.oLanguage.oPaginate.sFirst == "First" &&
+				oSettings.oLanguage.oPaginate.sPrevious == "Previous" &&
+				oSettings.oLanguage.oPaginate.sNext == "Next" &&
+				oSettings.oLanguage.oPaginate.sLast == "Last";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"oLanguage.oPaginate defaults are in the DOM",
+		null,
+		function () {
+			var bReturn = 
+				$('#example_paginate .first').html() == "First" &&
+				$('#example_paginate .previous').html() == "Previous" &&
+				$('#example_paginate .next').html() == "Next" &&
+				$('#example_paginate .last').html() == "Last";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"oLanguage.oPaginate can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"sPaginationType": "full_numbers",
+				"oLanguage": {
+					"oPaginate": {
+						"sFirst":    "unit1",
+						"sPrevious": "test2",
+						"sNext":     "unit3",
+						"sLast":     "test4"
+					}
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var bReturn = 
+				oSettings.oLanguage.oPaginate.sFirst == "unit1" &&
+				oSettings.oLanguage.oPaginate.sPrevious == "test2" &&
+				oSettings.oLanguage.oPaginate.sNext == "unit3" &&
+				oSettings.oLanguage.oPaginate.sLast == "test4";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"oLanguage.oPaginate definitions are in the DOM",
+		null,
+		function () {
+			var bReturn = 
+				$('#example_paginate .first').html() == "unit1" &&
+				$('#example_paginate .previous').html() == "test2" &&
+				$('#example_paginate .next').html() == "unit3" &&
+				$('#example_paginate .last').html() == "test4";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sInfo.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sInfo.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sInfo.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,117 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "oLanguage.sInfo" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Info language is 'Showing _START_ to _END_ of _TOTAL_ entries' by default",
+		null,
+		function () { return oSettings.oLanguage.sInfo == "Showing _START_ to _END_ of _TOTAL_ entries"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Info language can be defined - without any macros",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sInfo": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sInfo == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language definition is in the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language can be defined - with macro _START_ only",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sInfo": "unit _START_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 1 test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language can be defined - with macro _END_ only",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sInfo": "unit _END_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 10 test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language can be defined - with macro _TOTAL_ only",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sInfo": "unit _END_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 57 test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language can be defined - with macros _START_ and _END_",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sInfo": "unit _START_ _END_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 1 10 test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language can be defined - with macros _START_, _END_ and _TOTAL_",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sInfo": "unit _START_ _END_ _TOTAL_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 1 10 57 test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sInfoEmpty.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sInfoEmpty.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sInfoEmpty.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,79 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "oLanguage.sInfoEmpty" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Info empty language is 'Showing 0 to 0 of 0 entries' by default",
+		function () { oTable.fnFilter("nothinghere"); },
+		function () { return oSettings.oLanguage.sInfoEmpty == "Showing 0 to 0 of 0 entries"; }
+	);
+	
+	oTest.fnTest( 
+		"Info empty language default is in the DOM",
+		null,
+		function () {
+			var bReturn = document.getElementById('example_info').innerHTML.replace( 
+				' '+oSettings.oLanguage.sInfoFiltered.replace( '_MAX_', '57' ), "" ) ==
+					"Showing 0 to 0 of 0 entries";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Info empty language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sInfoEmpty": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+			oTable.fnFilter("nothinghere");
+		},
+		function () { return oSettings.oLanguage.sInfoEmpty == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info empty language default is in the DOM",
+		null,
+		function () {
+			var bReturn = document.getElementById('example_info').innerHTML.replace( 
+				' '+oSettings.oLanguage.sInfoFiltered.replace( '_MAX_', '57' ), "" ) ==
+					"unit test";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Macro's not replaced",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sInfoEmpty": "unit _START_ _END_ _TOTAL_ test"
+				}
+			} );
+			oTable.fnFilter("nothinghere");
+		},
+		function () {
+			var bReturn = document.getElementById('example_info').innerHTML.replace( 
+				' '+oSettings.oLanguage.sInfoFiltered.replace( '_MAX_', '57' ), "" ) ==
+					"unit _START_ _END_ _TOTAL_ test";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sInfoPostFix.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sInfoPostFix.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sInfoPostFix.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,78 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "oLanguage.sInfoPostFix" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Info post fix language is '' (blank) by default",
+		null,
+		function () { return oSettings.oLanguage.sInfoPostFix == ""; }
+	);
+	
+	oTest.fnTest( 
+		"Width no post fix, the basic info shows",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Info post fix language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sInfoPostFix": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sInfoPostFix == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info empty language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries unit test"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Macros have no effect in the post fix",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sInfoPostFix": "unit _START_ _END_ _TOTAL_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries unit _START_ _END_ _TOTAL_ test"; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Post fix is applied after fintering info",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sInfoPostFix": "unit test"
+				}
+			} );
+			oTable.fnFilter("nothinghere");
+		},
+		function () { return document.getElementById('example_info').innerHTML = "Showing 0 to 0 of 0 entries unit (filtered from 57 total entries) test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sLengthMenu.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sLengthMenu.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sLengthMenu.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,106 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "oLanguage.sLengthMenu" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Menu language is 'Show _MENU_ entries' by default",
+		null,
+		function () { return oSettings.oLanguage.sLengthMenu == "Show _MENU_ entries"; }
+	);
+	
+	oTest.fnTest(
+		"_MENU_ macro is replaced by select menu in DOM",
+		null,
+		function () { return $('select', oSettings.anFeatures.l).length == 1 }
+	);
+	
+	oTest.fnTest(
+		"Default is put into DOM",
+		null,
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			var bReturn =
+				anChildren[0].nodeValue == "Show " &&
+				anChildren[2].nodeValue == " entries";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Menu length language can be defined - no _MENU_ macro",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sLengthMenu": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sLengthMenu == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Menu length language definition is in the DOM",
+		null,
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			return anChildren[0].nodeValue == "unit test";
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Menu length language can be defined - with _MENU_ macro",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sLengthMenu": "unit _MENU_ test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			var bReturn =
+				anChildren[0].nodeValue == "unit " &&
+				anChildren[2].nodeValue == " test";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnTest( 
+		"Only the _MENU_ macro",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sLengthMenu": "_MENU_"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			var bReturn =
+				anChildren.length == 1 &&
+				$('select', oSettings.anFeatures.l).length == 1;
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sProcessing.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sProcessing.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sProcessing.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,49 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "oLanguage.sProcessing" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData,
+		"bProcessing": true
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Processing language is 'Processing...' by default",
+		null,
+		function () { return oSettings.oLanguage.sProcessing == "Processing..."; }
+	);
+	
+	oTest.fnTest( 
+		"Processing language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_processing').innerHTML = "Processing..."; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Processing language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"bProcessing": true,
+				"oLanguage": {
+					"sProcessing": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sProcessing == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Processing language definition is in the DOM",
+		null,
+		function () { return document.getElementById('example_processing').innerHTML = "unit test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sSearch.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sSearch.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sSearch.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,65 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "oLanguage.sSearch" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Search language is 'Search:' by default",
+		null,
+		function () { return oSettings.oLanguage.sSearch == "Search:"; }
+	);
+	
+	oTest.fnTest( 
+		"Search language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_filter').childNodes[0].nodeValue
+		 	== "Search: "; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Search language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sSearch": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sSearch == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language definition is in the DOM",
+		null,
+		function () { return document.getElementById('example_filter').childNodes[0].nodeValue
+		 	== "unit test "; }
+	);
+	
+	
+	oTest.fnTest( 
+		"Blank search has a no (separator) inserted",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sSearch": ""
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return document.getElementById('example_filter').childNodes.length == 1; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sUrl.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sUrl.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sUrl.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,62 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "oLanguage.sUrl" );
+
+/* Note that we only test the internal storage of language information pulled form a file here
+ * as the other language tests will check it goes into the DOM correctly
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"sUrl is blank by default",
+		null,
+		function () { return oSettings.oLanguage.sUrl == ""; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Loading of German file loads language information",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sUrl": "../../../examples/examples_support/de_DE.txt"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var bReturn = 
+				oSettings.oLanguage.sProcessing == "Bitte warten..." &&
+				oSettings.oLanguage.sLengthMenu == "_MENU_ Einträge anzeigen" &&
+				oSettings.oLanguage.sZeroRecords == "Keine Einträge vorhanden." &&
+				oSettings.oLanguage.sInfo == "_START_ bis _END_ von _TOTAL_ Einträgen" &&
+				oSettings.oLanguage.sInfoEmpty == "0 bis 0 von 0 Einträgen" &&
+				oSettings.oLanguage.sInfoFiltered == "(gefiltert von _MAX_  Einträgen)" &&
+				oSettings.oLanguage.sInfoPostFix == "" &&
+				oSettings.oLanguage.sSearch == "Suchen" &&
+				oSettings.oLanguage.oPaginate.sFirst == "Erster" &&
+				oSettings.oLanguage.oPaginate.sPrevious == "Zurück" &&
+				oSettings.oLanguage.oPaginate.sNext == "Nächster" &&
+				oSettings.oLanguage.oPaginate.sLast == "Letzter";
+				
+			return bReturn;
+		}
+	);
+	
+	/* One DOM check just to ensure that they go into the DOM */
+	oTest.fnTest(
+		"Loaded language goes into the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "1 bis 10 von 57 Einträgen"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sZeroRecords.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sZeroRecords.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oLanguage.sZeroRecords.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,48 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "oLanguage.sZeroRecords" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Zero records language is 'No matching records found' by default",
+		null,
+		function () { return oSettings.oLanguage.sZeroRecords == "No matching records found"; }
+	);
+	
+	oTest.fnTest(
+		"Text is shown when empty table (after filtering)",
+		function () { oTable.fnFilter('nothinghere'); },
+		function () { return $('#example tbody tr td')[0].innerHTML == "No matching records found" }
+	);
+	
+	
+	
+	oTest.fnTest( 
+		"Zero records language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oLanguage": {
+					"sZeroRecords": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sZeroRecords == "unit test"; }
+	);
+	
+	oTest.fnTest(
+		"Text is shown when empty table (after filtering)",
+		function () { oTable.fnFilter('nothinghere2'); },
+		function () { return $('#example tbody tr td')[0].innerHTML == "unit test" }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oSearch.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oSearch.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/oSearch.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,108 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "oSearch" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Default values should be blank",
+		null,
+		function () {
+			var bReturn = oSettings.oPreviousSearch.sSearch == "" && 
+			              oSettings.oPreviousSearch.bEscapeRegex;
+			return bReturn;
+		}
+	);
+	
+	/* This test might be considered iffy since the full object isn't given, but it's reasonable to
+	 * expect DataTables to cope with this. It should just assumine regex false
+	 */
+	oTest.fnTest( 
+		"Search term only in object",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"oSearch": {
+					"sSearch": "Mozilla"
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Gecko"; }
+	);
+	
+	oTest.fnTest( 
+		"New search will kill old one",
+		function () {
+			oTable.fnFilter("Opera");
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Presto"; }
+	);
+	
+	oTest.fnTest( 
+		"Search plain text term and escape regex true",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"oSearch": {
+					"sSearch": "DS",
+					"bEscapeRegex": true
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Nintendo DS browser"; }
+	);
+	
+	oTest.fnTest( 
+		"Search plain text term and escape regex false",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"oSearch": {
+					"sSearch": "Opera",
+					"bEscapeRegex": false
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Presto"; }
+	);
+	
+	oTest.fnTest( 
+		"Search regex text term and escape regex true",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"oSearch": {
+					"sSearch": "1.*",
+					"bEscapeRegex": true
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	oTest.fnTest( 
+		"Search regex text term and escape regex false",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"oSearch": {
+					"sSearch": "1.*",
+					"bEscapeRegex": false
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Gecko"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/sAjaxSource.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/sAjaxSource.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/sAjaxSource.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,20 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "sAjaxSource" );
+
+/* Not interested in ajax source here other than to check it's default */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Server side is off by default",
+		null,
+		function () { return oSettings.sAjaxSource == null; }
+	);
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/sDom.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/sDom.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/sDom.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,262 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "sDom" );
+
+/* This is going to be brutal on the browser! There is a lot that can be tested here... */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Default DOM varaible",
+		null,
+		function () { return oSettings.sDomPositioning == "lfrtip"; }
+	);
+	
+	oTest.fnTest( 
+		"Default DOM in document",
+		null,
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nTable &&
+				nNodes[4] == nInfo &&
+				nNodes[5] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Check example 1 in code propagates",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"sDom": '<"wrapper"flipt>'
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.sDomPositioning == '<"wrapper"flipt>'; }
+	);
+	
+	oTest.fnTest( 
+		"Check example 1 in DOM",
+		null,
+		function () {
+			var jqNodes = $('#demo div, #demo table');
+			var nNodes = [];
+			
+			/* Strip the paging nodes */
+			for ( var i=0, iLen=jqNodes.length ; i<iLen ; i++ )
+			{
+				if ( jqNodes[i].getAttribute('id') != "example_previous" &&
+				     jqNodes[i].getAttribute('id') != "example_next" )
+				{
+					nNodes.push( jqNodes[i] );
+				}
+			}
+			
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			var nCustomWrapper = $('div.wrapper')[0];
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nCustomWrapper &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nLength &&
+				nNodes[4] == nInfo &&
+				nNodes[5] == nPaging &&
+				nNodes[6] == nTable;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Check example 2 in DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"sDom": '<lf<t>ip>'
+			} );
+		},
+		function () {
+			var jqNodes = $('#demo div, #demo table');
+			var nNodes = [];
+			var nCustomWrappers = []
+			
+			/* Strip the paging nodes */
+			for ( var i=0, iLen=jqNodes.length ; i<iLen ; i++ )
+			{
+				if ( jqNodes[i].getAttribute('id') != "example_previous" &&
+				     jqNodes[i].getAttribute('id') != "example_next" )
+				{
+					nNodes.push( jqNodes[i] );
+				}
+				
+				/* Only the two custom divs don't have class names */
+				if ( !jqNodes[i].getAttribute('class') )
+				{
+					nCustomWrappers.push( jqNodes[i] );
+				}
+			}
+			
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nCustomWrappers[0] &&
+				nNodes[2] == nLength &&
+				nNodes[3] == nFilter &&
+				nNodes[4] == nCustomWrappers[1] &&
+				nNodes[5] == nTable &&
+				nNodes[6] == nInfo &&
+				nNodes[7] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Check no length element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"sDom": 'frtip'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				null == nLength &&
+				nNodes[1] == nFilter &&
+				nNodes[2] == nTable &&
+				nNodes[3] == nInfo &&
+				nNodes[4] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Check no filter element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"sDom": 'lrtip'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				null == nFilter &&
+				nNodes[2] == nTable &&
+				nNodes[3] == nInfo &&
+				nNodes[4] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	/* Note we don't test for no table as this is not supported (and it would be fairly daft! */
+	
+	oTest.fnTest( 
+		"Check no info element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"sDom": 'lfrtp'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nTable &&
+				null == nInfo &&
+				nNodes[4] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"Check no paging element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"aaData": gaaData,
+				"sDom": 'lfrti'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nTable &&
+				nNodes[4] == nInfo &&
+				null == nPaging;
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/sPaginationType.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/sPaginationType.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/2_js/sPaginationType.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,125 @@
+// DATA_TEMPLATE: js_data
+oTest.fnStart( "sPaginationType" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"aaData": gaaData
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"Check two button paging is the default",
+		null,
+		function () { return oSettings.sPaginationType == "two_button"; }
+	);
+	
+	oTest.fnTest( 
+		"Check class is applied",
+		null,
+		function () { return $('#example_paginate').hasClass('paging_two_button'); }
+	);
+	
+	oTest.fnTest( 
+		"Two div elements are in the wrapper",
+		null,
+		function () { return $('#example_paginate div').length == 2; }
+	);
+	
+	oTest.fnTest( 
+		"We have the previous button",
+		null,
+		function () { return document.getElementById('example_previous'); }
+	);
+	
+	oTest.fnTest( 
+		"We have the next button",
+		null,
+		function () { return document.getElementById('example_next'); }
+	);
+	
+	oTest.fnTest( 
+		"Previous button is disabled",
+		null,
+		function () { return $('#example_previous').hasClass('paginate_disabled_previous'); }
+	);
+	
+	oTest.fnTest( 
+		"Next button is enabled",
+		null,
+		function () { return $('#example_next').hasClass('paginate_enabled_next'); }
+	);
+	
+	/* Don't test paging - that's done by the zero config test script. */
+	
+	
+	/* Two buttons paging */
+	oTest.fnTest( 
+		"Can enabled full numbers paging",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"aaData": gaaData,
+				"sPaginationType": "full_numbers"
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.sPaginationType == "full_numbers"; }
+	);
+	
+	oTest.fnTest( 
+		"Check full numbers class is applied",
+		null,
+		function () { return $('#example_paginate').hasClass('paging_full_numbers'); }
+	);
+	
+	
+	var nFirst, nPrevious, nNext, nLast;
+	oTest.fnTest( 
+		"Jump to last page",
+		function () {
+			nFirst = $('div.dataTables_paginate span.first');
+			nPrevious = $('div.dataTables_paginate span.previous');
+			nNext = $('div.dataTables_paginate span.next');
+			nLast = $('div.dataTables_paginate span.last');
+			nLast.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 51 to 57 of 57 entries";
+		}
+	);
+	
+	oTest.fnTest( 
+		"Go to two pages previous",
+		function () {
+			nPrevious.click();
+			nPrevious.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 31 to 40 of 57 entries";
+		}
+	);
+	
+	oTest.fnTest( 
+		"Next (second last) page",
+		function () {
+			nNext.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 41 to 50 of 57 entries";
+		}
+	);
+	
+	oTest.fnTest( 
+		"Jump to first page",
+		function () {
+			nFirst.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries";
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/_zero_config.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/_zero_config.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/_zero_config.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,440 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "Santiy checks for DataTables with data from JS" );
+
+oTest.fnTest( 
+	"jQuery.dataTable function",
+	null,
+	function () { return typeof jQuery().dataTable == "function"; }
+);
+
+oTest.fnTest(
+	"jQuery.dataTableSettings storage array",
+	null,
+	function () { return typeof jQuery().dataTableSettings == "object"; }
+);
+
+oTest.fnTest(
+	"jQuery.dataTableExt plugin object",
+	null,
+	function () { return typeof jQuery().dataTableExt == "object"; }
+);
+
+$(document).ready( function () {
+	var oInit = {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	};
+	$('#example').dataTable( oInit );
+	
+	/* Basic checks */
+	oTest.fnWaitTest( 
+		"Length changing div exists",
+		null,
+		function () { return document.getElementById('example_length') != null; }
+	);
+	
+	oTest.fnTest( 
+		"Filtering div exists",
+		null,
+		function () { return document.getElementById('example_filter') != null; }
+	);
+	
+	oTest.fnTest( 
+		"Information div exists",
+		null,
+		function () { return document.getElementById('example_info') != null; }
+	);
+	
+	oTest.fnTest( 
+		"Pagination div exists",
+		null,
+		function () { return document.getElementById('example_paginate') != null; }
+	);
+	
+	oTest.fnTest( 
+		"Processing div is off by default",
+		null,
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	oTest.fnWaitTest( 
+		"10 rows shown on the first page",
+		null,
+		function () { return $('#example tbody tr').length == 10; }
+	);
+	
+	oTest.fnTest( 
+		"Initial sort occured",
+		null,
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	/* Need to use the WaitTest for sorting due to the setTimeout datatables uses */
+	oTest.fnTest( 
+		"Sorting (first click) on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting (second click) on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting (third click) on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting (first click) on numeric column",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "-"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting (second click) on numeric column",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "522.1"; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting multi-column (first click)",
+		function () { 
+			$('#example thead th:eq(0)').click();
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } ); },
+		function () { var b = 
+			$('#example tbody td:eq(0)').html() == "Gecko" && 
+			$('#example tbody td:eq(1)').html() == "Camino 1.0"; return b; }
+	);
+	
+	oTest.fnTest( 
+		"Sorting multi-column - sorting second column only",
+		function () { 
+			$('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	/* Basic paging */
+	oTest.fnTest( 
+		"Paging to second page",
+		function () { $('#example_next').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "IE Mobile"; }
+	);
+	
+	oTest.fnTest( 
+		"Paging to first page",
+		function () { $('#example_previous').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnTest( 
+		"Attempting to page back beyond the first page",
+		function () { $('#example_previous').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	/* Changing length */
+	oTest.fnTest( 
+		"Changing table length to 25 records",
+		function () { $("select[name=example_length]").val('25').change(); },
+		function () { return $('#example tbody tr').length == 25; }
+	);
+	
+	oTest.fnTest( 
+		"Changing table length to 50 records",
+		function () { $("select[name=example_length]").val('50').change(); },
+		function () { return $('#example tbody tr').length == 50; }
+	);
+	
+	oTest.fnTest( 
+		"Changing table length to 100 records",
+		function () { $("select[name=example_length]").val('100').change(); },
+		function () { return $('#example tbody tr').length == 57; }
+	);
+	
+	oTest.fnTest( 
+		"Changing table length to 10 records",
+		function () { $("select[name=example_length]").val('10').change(); },
+		function () { return $('#example tbody tr').length == 10; }
+	);
+	
+	/*
+	 * Information element
+	 */
+	oTest.fnTest(
+		"Information on zero config",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information on second page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 11 to 20 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information on third page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 21 to 30 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information on last page",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 51 to 57 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information back on first page",
+		function () {
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information with 25 records",
+		function () { $("select[name=example_length]").val('25').change(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 25 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information with 25 records - second page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 26 to 50 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information with 100 records - first page",
+		function () {
+			$('#example_previous').click();
+			$("select[name=example_length]").val('100').change();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 57 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information back to 10 records",
+		function () {
+			$('#example_previous').click();
+			$("select[name=example_length]").val('10').change();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win'",
+		function () { $('#example_filter input').val("Win").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' second page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 11 to 20 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' last page",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 31 to 31 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' back to first page",
+		function () {
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' second page - second time",
+		function () {
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 11 to 20 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter increased to 'Win 98'",
+		function () { $('#example_filter input').val("Win 98").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 9 of 9 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter decreased to 'Win'",
+		function () { $('#example_filter input').val("Win").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter 'Win' second page - third time",
+		function () {
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 11 to 20 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Information with filter removed",
+		function () { $('#example_filter input').val("").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	/*
+	 * Filtering
+	 */
+	oTest.fnWaitTest(
+		"Filter 'W' - rows",
+		function () { 
+			/* Reset the table such that the old sorting doesn't mess things up */
+			oSession.fnRestore();
+			$('#example').dataTable( oInit );
+			$('#example_filter input').val("W").keyup(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Gecko"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'W' - info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 42 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Wi'",
+		function () { $('#example_filter input').val("Wi").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 32 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win'",
+		function () { $('#example_filter input').val("Win").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win' - sorting column 1",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "AOL browser (AOL desktop)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win' - sorting column 1 info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win' - sorting column 1 reverse",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win XP' - maintaing reverse sorting col 1",
+		function () { $('#example_filter input').val("Win XP").keyup(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Internet Explorer 7"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win XP' - sorting col 3",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "4"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win XP' - sorting col 3 - reversed",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "7"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'Win' - sorting col 3 - reversed info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 6 of 6 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'nothinghere'",
+		function () { $('#example_filter input').val("nothinghere").keyup(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 
+			"No matching records found"; }
+	);
+	
+	oTest.fnTest(
+		"Filter 'nothinghere' - info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 0 to 0 of 0 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Filter back to blank and 1st column sorting",
+		function () {
+			$('#example_filter input').val("").keyup();
+			$('#example thead th:eq(0)').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnTest(
+		"Prefixing a filter entry",
+		function () {
+			$('#example_filter input').val("Win").keyup();
+			$('#example_filter input').val("GeckoWin").keyup();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 0 to 0 of 0 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnTest(
+		"Prefixing a filter entry with space",
+		function () {
+			$('#example_filter input').val("Gecko Win").keyup();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 17 entries (filtered from 57 total entries)"; }
+	);
+	
+	
+	
+	
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aaSorting.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aaSorting.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aaSorting.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,198 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aaSorting" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Default sorting is single column",
+		null,
+		function () {
+			return oSettings.aaSorting.length == 1 && typeof oSettings.aaSorting[0] == 'object';
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Default sorting is first column asc",
+		null,
+		function () {
+			return oSettings.aaSorting[0].length == 3 && oSettings.aaSorting[0][0] == 0 &&
+				oSettings.aaSorting[0][1] == 'asc';
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting is applied",
+		null,
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Custom sorting on single string column asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Custom sorting on single string column desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Custom sorting on single int column asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "-"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Custom sorting on single int column desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string asc / string asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['0','asc'], ['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Camino 1.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string asc / string desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['0','asc'], ['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string desc / string asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['0','desc'], ['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "iPod Touch / iPhone"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string desc / string desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['0','desc'], ['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Safari 3.0"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string asc / int asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['0','asc'], ['3','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string asc / int desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['0','asc'], ['3','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "1.9"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string desc / int asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['0','desc'], ['3','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "125.5"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string desc / int desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['0','desc'], ['3','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "522.1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (3 column) - string asc / int asc / string asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSorting": [['0','asc'], ['3','asc'], ['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(7) td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aaSortingFixed.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aaSortingFixed.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aaSortingFixed.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,64 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aaSortingFixed" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"No fixed sorting by default",
+		null,
+		function () {
+			return oSettings.aaSortingFixed == null;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Fixed sorting on first column (string/asc) with user sorting on second column (string/asc)",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSortingFixed": [['0','asc']]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Camino 1.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Fixed sorting on first column (string/asc) with user sorting on second column (string/desc)",
+		function () {
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Fixed sorting on fourth column (int/asc) with user sorting on second column (string/asc)",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aaSortingFixed": [['3','asc']]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Fixed sorting on fourth column (int/asc) with user sorting on second column (string/desc)",
+		function () {
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "PSP browser"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bSearchable.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bSearchable.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bSearchable.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,76 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.bSeachable" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Columns are searchable by default",
+		function () { oTable.fnFilter("Camino"); },
+		function () {
+			if ( $('#example tbody tr:eq(0) td:eq(1)')[0] )
+				return $('#example tbody tr:eq(0) td:eq(1)').html().match(/Camino/);
+			else
+				return null;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Disabling sorting on a column removes it from the global filter",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "bSearchable": false },
+					null,
+					null,
+					null
+				]
+			} );
+			oSettings = oTable.fnSettings();
+			oTable.fnFilter("Camino");
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Disabled on one column has no effect on other columns",
+		function () { oTable.fnFilter("Webkit"); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Webkit"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Disable filtering on multiple columns",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					{ "bSearchable": false },
+					{ "bSearchable": false },
+					null,
+					null,
+					null
+				]
+			} );
+			oSettings = oTable.fnSettings();
+			oTable.fnFilter("Webkit");
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Filter on second disabled column",
+		function () { oTable.fnFilter("Camino"); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bSortable.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bSortable.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bSortable.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,109 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.bSortable" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"All columns are sortable by default",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Can disable sorting from one column",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "bSortable": false },
+					null,
+					null,
+					null
+				]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() != "All others"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Disabled column has no sorting class",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_asc") == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Other columns can still sort",
+		function () {
+			$('#example thead th:eq(4)').click();
+			$('#example thead th:eq(4)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == "X"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Disable sorting on multiple columns - no sorting classes",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "bSortable": false },
+					null,
+					{ "bSortable": false },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn = 
+				$('#example thead th:eq(1)').hasClass("sorting") ||
+				$('#example thead th:eq(3)').hasClass("sorting")
+			return bReturn == false;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting on disabled column 1 has no effect",
+		function () {
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() != "All others"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting on disabled column 2 has no effect",
+		function () {
+			$('#example thead th:eq(3)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() != "-"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Second sort on disabled column 2 has no effect",
+		function () {
+			$('#example thead th:eq(3)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() != "-"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Even with multiple disabled sorting columns other columns can still sort",
+		function () {
+			$('#example thead th:eq(4)').click();
+			$('#example thead th:eq(4)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == "X"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bUseRendered.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bUseRendered.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bUseRendered.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,148 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.bUseRendered" );
+
+/* bUseRendered is used to alter sorting data, if false then the original data is used for
+ * sorting rather than the rendered data
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var mTmp = 0;
+	
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+		"aoColumns": [
+			null,
+			{ "fnRender": function (a) {
+				if ( mTmp == 0 ) {
+					mTmp++;
+					return "aaa";
+				} else
+					return a.aData[a.iDataColumn];
+			} },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Default for bUseRendered is true - rendered data is used for sorting",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'aaa'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"When bUseRendered is false, original data is used for sorting",
+		function () {
+			mTmp = 0;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ 
+						"bUseRendered": false,
+						"fnRender": function (a) {
+							if ( mTmp == 0 ) {
+								mTmp++;
+								return "aaa";
+							} else {
+								return a.aData[a.iDataColumn];
+							}
+						}
+					},
+					null,
+					null,
+					null
+				]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'All others'; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"bUseRendered set to false on one columns and true (default) on two others",
+		function () {
+			mTmp = 0;
+			var mTmp2 = 0;
+			var mTmp3 = 0;
+			
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					{
+						"fnRender": function (a) {
+							if ( mTmp == 0 ) {
+								mTmp++;
+								return "aaa1";
+							} else {
+								return a.aData[a.iDataColumn];
+							}
+						}
+					},
+					{ 
+						"bUseRendered": false,
+						"fnRender": function (a) {
+							if ( mTmp2 == 0 ) {
+								mTmp2++;
+								return "aaa2";
+							} else {
+								return a.aData[a.iDataColumn];
+							}
+						}
+					},
+					{
+						"fnRender": function (a) {
+							if ( mTmp3 == 0 ) {
+								mTmp3++;
+								return "zzz3";
+							} else {
+								return a.aData[a.iDataColumn];
+							}
+						}
+					},
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 'aaa1'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column rendering - 2nd column sorting",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'All others'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column rendering - 3rd column sorting",
+		function () {
+			$('#example thead th:eq(2)').click();
+			$('#example thead th:eq(2)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(2)').html() == 'zzz3'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column rendering - 4th column sorting",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == '-'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column rendering - 5th column sorting",
+		function () { $('#example thead th:eq(4)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'A'; }
+	);
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bVisible.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bVisible.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.bVisible.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,124 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.bVisible" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"All columns are visible by default",
+		null,
+		function () { return $('#example tbody tr:eq(0) td').length == 5; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Can hide one column and it removes td column from DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "bVisible": false },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td').length == 4; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Can hide one column and it removes thead th column from DOM",
+		null,
+		function () { return $('#example thead tr:eq(0) th').length == 4; }
+	);
+	
+	oTest.fnWaitTest( 
+		"The correct thead column has been hidden",
+		null,
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "Platform(s)" &&
+				jqNodes[2].innerHTML == "Engine version" &&
+				jqNodes[3].innerHTML == "CSS grade";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"The correct tbody column has been hidden",
+		function () {
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } );
+		},
+		function () {
+			var jqNodes = $('#example tbody tr:eq(0) td');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Gecko" &&
+				jqNodes[1].innerHTML == "Gnome" &&
+				jqNodes[2].innerHTML == "1.8" &&
+				jqNodes[3].innerHTML == "A";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Can hide multiple columns and it removes td column from DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "bVisible": false },
+					{ "bVisible": false },
+					null,
+					{ "bVisible": false }
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td').length == 2; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multiple hide - removes thead th column from DOM",
+		null,
+		function () { return $('#example thead tr:eq(0) th').length == 2; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multiple hide - the correct thead columns have been hidden",
+		null,
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "Engine version"
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Multiple hide - the correct tbody columns have been hidden",
+		function () {
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } );
+		},
+		function () {
+			var jqNodes = $('#example tbody tr:eq(0) td');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Gecko" &&
+				jqNodes[1].innerHTML == "1"
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.fnRender.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.fnRender.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.fnRender.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,182 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.fnRender" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var mTmp = 0;
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+		"aoColumns": [
+			null,
+			{ "fnRender": function (a) {
+				mTmp++;
+				return a.aData[a.iDataColumn];
+			} },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Single column - fnRender is called once for each row",
+		null,
+		function () { return mTmp == 57; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Confirm that fnRender passes one argument (an object) with three parameters",
+		function () {
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( arguments.length != 1 || typeof a.iDataRow=='undefined' ||
+						 	typeof a.iDataColumn=='undefined' || typeof a.aData=='undefined' )
+						{
+							mTmp = false;
+						}
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnRender iDataColumn is row number",
+		function () {
+			var iCount = 0;
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( iCount != a.iDataRow )
+						{
+							mTmp = false;
+						}
+						iCount++;
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnRender iDataColumn is the column",
+		function () {
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( a.iDataColumn != 1 )
+						{
+							mTmp = false;
+						}
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnRender aData is data array of correct size",
+		function () {
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( a.aData.length != 5 )
+						{
+							mTmp = false;
+						}
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Passed back data is put into the DOM",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						return 'unittest';
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'unittest'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Passed back data is put into the DOM",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					null,
+					{ "fnRender": function (a) {
+						return 'unittest1';
+					} },
+					{ "fnRender": function (a) {
+						return 'unittest2';
+					} },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn = 
+				$('#example tbody tr:eq(0) td:eq(2)').html() == 'unittest1' &&
+				$('#example tbody tr:eq(0) td:eq(3)').html() == 'unittest2';
+			return bReturn; }
+	);
+	
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.iDataSort.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.iDataSort.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.iDataSort.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,90 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.iDataSort" );
+
+$(document).ready( function () {
+	/* Should know that sorting already works by default from other tests, so we can jump
+	 * right in here
+	 */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+		"aoColumns": [
+			null,
+			{ "iDataSort": 4 },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Sorting on first column is uneffected",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 'Gecko'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting on second column is the order of the fifth",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'A'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Reserve sorting on second column uses fifth column as well",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'X'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting on 5th column retains it's own sorting",
+		function () { $('#example thead th:eq(4)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'A'; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Use 2nd col for sorting 5th col and via-versa - no effect on first col sorting",
+		function () {
+			mTmp = 0;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "iDataSort": 4 },
+					null,
+					null,
+					{ "iDataSort": 1 }
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 'Gecko'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"2nd col sorting uses fifth col",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'A'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"2nd col sorting uses fifth col - reversed",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').html() == 'X'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"5th col sorting uses 2nd col",
+		function () { $('#example thead th:eq(4)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'All others'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"5th col sorting uses 2nd col - reversed",
+		function () { $('#example thead th:eq(4)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'Seamonkey 1.1'; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sClass.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sClass.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sClass.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,115 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.sClass" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"By default the test class hasn't been applied to the column (sanity!)",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(2)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - first row",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					null,
+					{ "sClass": 'unittest' },
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(1) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - third row",
+		null,
+		function () { return $('#example tbody tr:eq(3) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - last row",
+		null,
+		function () { return $('#example tbody tr:eq(9) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - has not applied to other columns - 1st",
+		null,
+		function () { return $('#example tbody tr:eq(3) td:eq(0)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - has not applied to other columns - 5th",
+		null,
+		function () { return $('#example tbody tr:eq(3) td:eq(4)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - seventh row - second page",
+		function () { $('#example_next').click(); },
+		function () { return $('#example tbody tr:eq(6) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - has not applied to header",
+		null,
+		function () { return $('#example thead tr:eq(3) th:eq(4)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - has not applied to footer",
+		null,
+		function () { return $('#example thead tr:eq(3) th:eq(4)').hasClass('unittest') == false; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Class defined for multiple columns - first row",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					{ "sClass": 'unittest2' },
+					null,
+					null,
+					{ "sClass": 'unittest1' },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn = 
+				$('#example tbody tr:eq(3) td:eq(0)').hasClass('unittest2') &&
+				$('#example tbody tr:eq(8) td:eq(3)').hasClass('unittest1');
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Class defined for multiple columns - has not applied to other columns - 5th 1",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').hasClass('unittest1') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Class defined for multiple columns - has not applied to other columns - 5th 2",
+		null,
+		function () { return $('#example tbody tr:eq(6) td:eq(4)').hasClass('unittest2') == false; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sName.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sName.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sName.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,28 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.sName" );
+
+/* This has no effect at all in DOM methods - so we just check that it has applied the name */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+		"aoColumns": [
+			null,
+			null,
+			null,
+			{ "sName": 'unit test' },
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Names are stored in the columns object",
+		null,
+		function () { return oSettings.aoColumns[3].sName =="unit test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sTitle.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sTitle.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sTitle.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,82 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.sTitle" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"If not given, then the columns titles are empty",
+		null,
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "Browser" &&
+				jqNodes[2].innerHTML == "Platform(s)" &&
+				jqNodes[3].innerHTML == "Engine version" &&
+				jqNodes[4].innerHTML == "CSS grade";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Can set a single column title - and others are read from DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "sTitle": 'unit test' },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "unit test" &&
+				jqNodes[2].innerHTML == "Platform(s)" &&
+				jqNodes[3].innerHTML == "Engine version" &&
+				jqNodes[4].innerHTML == "CSS grade";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Can set multiple column titles",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					{ "sTitle": 'unit test 1' },
+					null,
+					null,
+					{ "sTitle": 'unit test 2' }
+				]
+			} );
+		},
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "unit test 1" &&
+				jqNodes[2].innerHTML == "Platform(s)" &&
+				jqNodes[3].innerHTML == "Engine version" &&
+				jqNodes[4].innerHTML == "unit test 2";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sWidth.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sWidth.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoColumns.sWidth.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,87 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.sWidth" );
+
+/* NOTE - we need to disable the auto width for the majority of these test in order to preform 
+ * these tests as the auto width will convert the width to a px value. We can do 'non-exact' tests
+ * with auto width enabled however to ensure it scales columns as required
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+		"bAutoWidth": false,
+		"aoColumns": [
+			null,
+			{ "sWidth": '40%' },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"With auto width disabled the width for one column is appled",
+		null,
+		function () { return $('#example thead th:eq(1)')[0].style.width == "40%"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"With auto width disabled the width for one column is appled",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bAutoWidth": false,
+				"aoColumns": [
+					null,
+					null,
+					{ "sWidth": '20%' },
+					{ "sWidth": '30%' },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn =
+				$('#example thead th:eq(2)')[0].style.width == "20%" &&
+				$('#example thead th:eq(3)')[0].style.width == "30%";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"With auto width, it will make the smallest column the largest with percentage width given",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoColumns": [
+					null,
+					null,
+					null,
+					{ "sWidth": '40%' },
+					null
+				]
+			} );
+		},
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			
+			if ( a3>a0 && a3>a1 && a3>a2 && a3>a4 )
+				return true;
+			else
+				return false;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoSearchCols.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoSearchCols.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/aoSearchCols.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,119 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoSearchCols" );
+
+/* We could be here forever testing this one, so we test a limited subset on a couple of colums */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Default should be to have a empty colums array",
+		null,
+		function () {
+			var bReturn = 
+				oSettings.aoPreSearchCols[0].sSearch == 0 && oSettings.aoPreSearchCols[0].bEscapeRegex &&
+				oSettings.aoPreSearchCols[1].sSearch == 0 && oSettings.aoPreSearchCols[1].bEscapeRegex &&
+				oSettings.aoPreSearchCols[2].sSearch == 0 && oSettings.aoPreSearchCols[2].bEscapeRegex &&
+				oSettings.aoPreSearchCols[3].sSearch == 0 && oSettings.aoPreSearchCols[3].bEscapeRegex &&
+				oSettings.aoPreSearchCols[4].sSearch == 0 && oSettings.aoPreSearchCols[4].bEscapeRegex;
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Search on a single column - no regex statement given",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoSearchCols": [
+					null,
+					{ "sSearch": "Mozilla" },
+					null,
+					{ "sSearch": "1" },
+					null
+				]
+			} );
+		},
+		function () { return $('#example_info').html() == "Showing 1 to 9 of 9 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Search on two columns - no regex statement given",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoSearchCols": [
+					null,
+					{ "sSearch": "Mozilla" },
+					null,
+					{ "sSearch": "1.5" },
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "1.5"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Search on single column - escape regex false",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoSearchCols": [
+					{ "sSearch": ".*ML", "bEscapeRegex": false },
+					null,
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example_info').html() == "Showing 1 to 3 of 3 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Search on two columns - escape regex false on first, true on second",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoSearchCols": [
+					{ "sSearch": ".*ML", "bEscapeRegex": false },
+					{ "sSearch": "3.3", "bEscapeRegex": true },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Konqureror 3.3"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Search on two columns (no records) - escape regex false on first, true on second",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"aoSearchCols": [
+					{ "sSearch": ".*ML", "bEscapeRegex": false },
+					{ "sSearch": "Allan", "bEscapeRegex": true },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/asStripClasses.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/asStripClasses.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/asStripClasses.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,105 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "asStripClasses" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Default row striping is applied",
+		null,
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('odd') &&
+			       $('#example tbody tr:eq(1)').hasClass('even') &&
+			       $('#example tbody tr:eq(2)').hasClass('odd') &&
+			       $('#example tbody tr:eq(3)').hasClass('even');
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Row striping on the second page",
+		function () { $('#example_next').click(); },
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('odd') &&
+			       $('#example tbody tr:eq(1)').hasClass('even') &&
+			       $('#example tbody tr:eq(2)').hasClass('odd') &&
+			       $('#example tbody tr:eq(3)').hasClass('even');
+		}
+	);
+	
+	/* No striping */
+	oTest.fnWaitTest( 
+		"No row striping",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"asStripClasses": []
+			} );
+		},
+		function () {
+			if ( typeof $('#example tbody tr:eq(1)')[0] == 'undefined' )
+			{
+				/* Use the 'wait for' to allow this to become true */
+				return false;
+			}
+			return $('#example tbody tr:eq(0)')[0].className == "" &&
+			       $('#example tbody tr:eq(1)')[0].className == "" &&
+			       $('#example tbody tr:eq(2)')[0].className == "" &&
+			       $('#example tbody tr:eq(3)')[0].className == "";
+		}
+	);
+	
+	/* Custom striping */
+	oTest.fnWaitTest( 
+		"Custom striping [2]",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"asStripClasses": [ 'test1', 'test2' ]
+			} );
+		},
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('test1') &&
+			       $('#example tbody tr:eq(1)').hasClass('test2') &&
+			       $('#example tbody tr:eq(2)').hasClass('test1') &&
+			       $('#example tbody tr:eq(3)').hasClass('test2');
+		}
+	);
+	
+	
+	/* long array of striping */
+	oTest.fnWaitTest( 
+		"Custom striping [4]",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"asStripClasses": [ 'test1', 'test2', 'test3', 'test4' ]
+			} );
+		},
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('test1') &&
+			       $('#example tbody tr:eq(1)').hasClass('test2') &&
+			       $('#example tbody tr:eq(2)').hasClass('test3') &&
+			       $('#example tbody tr:eq(3)').hasClass('test4');
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Custom striping is restarted on second page [2]",
+		function () { $('#example_next').click(); },
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('test1') &&
+			       $('#example tbody tr:eq(1)').hasClass('test2') &&
+			       $('#example tbody tr:eq(2)').hasClass('test3') &&
+			       $('#example tbody tr:eq(3)').hasClass('test4');
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bAutoWidth.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bAutoWidth.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bAutoWidth.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,142 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bAutoWidth" );
+
+/* It's actually a little tricky to test this. We can't test absolute numbers because
+ * different browsers and different platforms will render the width of the columns slightly
+ * differently. However, we certainly can test the principle of what should happen (column 
+ * width doesn't change over pages)
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Auto width is enabled by default",
+		null,
+		function () { return oSettings.oFeatures.bAutoWidth; }
+	);
+	
+	oTest.fnWaitTest( 
+		"First column has a width assigned to it",
+		null,
+		function () { return $('#example thead th:eq(0)').attr('style').match(/width/i); }
+	);
+	
+	/*
+	This would seem like a better test - but there appear to be difficulties with tables
+	which are bigger (calculated) than there is actually room for. I suspect this is actually
+	a bug in datatables
+	oTest.fnWaitTest( 
+		"Check column widths on first page match second page",
+		null,
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			$('#example_next').click();
+			var b0 = anThs[0].offsetWidth;
+			var b1 = anThs[1].offsetWidth;
+			var b2 = anThs[2].offsetWidth;
+			var b3 = anThs[3].offsetWidth;
+			var b4 = anThs[4].offsetWidth;
+			console.log( a0, b0, a1, b1, a2, b2, a3, b3 );
+			if ( a0==b0 && a1==b1 && a2==b2 && a3==b3 )
+				return true;
+			else
+				return false;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check column widths on second page match thid page",
+		null,
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			$('#example_next').click();
+			var b0 = anThs[0].offsetWidth;
+			var b1 = anThs[1].offsetWidth;
+			var b2 = anThs[2].offsetWidth;
+			var b3 = anThs[3].offsetWidth;
+			var b4 = anThs[4].offsetWidth;
+			if ( a0==b0 && a1==b1 && a2==b2 && a3==b3 )
+				return true;
+			else
+				return false;
+		}
+	);
+	*/
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Auto width can be disabled",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bAutoWidth": false
+			} );
+	 		oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bAutoWidth == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"First column does not have a width assigned to it",
+		null,
+		function () { return $('#example thead th:eq(0)').attr('style') == null; }
+	);
+	
+	/*
+	oTest.fnWaitTest( 
+		"Check column widths on first page do not match second page",
+		null,
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			$('#example_next').click();
+			var b0 = anThs[0].offsetWidth;
+			var b1 = anThs[1].offsetWidth;
+			var b2 = anThs[2].offsetWidth;
+			var b3 = anThs[3].offsetWidth;
+			var b4 = anThs[4].offsetWidth;
+			if ( a0==b0 && a1==b1 && a2==b2 && a3==b3 )
+				return false;
+			else
+				return true;
+		}
+	);
+	*/
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Auto width enabled override",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bAutoWidth": true
+			} );
+	 		oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bAutoWidth; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bFilter.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bFilter.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bFilter.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,44 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bFilter" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Filtering div exists by default",
+		null,
+		function () { return document.getElementById('example_filter') != null; }
+	);
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Fltering can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bFilter": false
+			} );
+		},
+		function () { return document.getElementById('example_filter') == null; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Filtering enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bFilter": true
+			} );
+		},
+		function () { return document.getElementById('example_filter') != null; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bInfo.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bInfo.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bInfo.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,44 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bInfo" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Info div exists by default",
+		null,
+		function () { return document.getElementById('example_info') != null; }
+	);
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Info can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bInfo": false
+			} );
+		},
+		function () { return document.getElementById('example_info') == null; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Info enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bInfo": true
+			} );
+		},
+		function () { return document.getElementById('example_info') != null; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bLengthChange.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bLengthChange.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bLengthChange.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,75 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bLengthChange" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Length div exists by default",
+		null,
+		function () { return document.getElementById('example_length') != null; }
+	);
+	
+	oTest.fnWaitTest(
+		"Four default options",
+		null,
+		function () { return $("select[name=example_length] option").length == 4; }
+	);
+	
+	oTest.fnWaitTest(
+		"Default options",
+		null,
+		function () {
+			var opts = $("select[name='example_length'] option");
+			return opts[0].getAttribute('value') == 10 && opts[1].getAttribute('value') == 25 &&
+				opts[2].getAttribute('value') == 50 && opts[3].getAttribute('value') == 100;
+		}
+	);
+	
+	oTest.fnWaitTest(
+		"Info takes length into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Change length can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bLengthChange": false
+			} );
+		},
+		function () { return document.getElementById('example_length') == null; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information takes length disabled into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Length change enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bLengthChange": true
+			} );
+		},
+		function () { return document.getElementById('example_length') != null; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bPaginate.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bPaginate.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bPaginate.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,59 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bPaginate" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Pagiantion div exists by default",
+		null,
+		function () { return document.getElementById('example_paginate') != null; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information div takes paging into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Pagiantion can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bPaginate": false
+			} );
+		},
+		function () { return document.getElementById('example_paginate') == null; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information div takes paging disabled into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 57 of 57 entries"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Pagiantion enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bPaginate": true
+			} );
+		},
+		function () { return document.getElementById('example_paginate') != null; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bProcessing.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bProcessing.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bProcessing.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,103 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bProcessing" );
+
+/* It's actually a bit hard to set this one due to the fact that it will only be shown
+ * when DataTables is doing some kind of processing. The server-side processing is a bit
+ * better to test this than here - so we just the interal functions to enable it and check
+ * that it is available
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Processing is off by default",
+		null,
+		function () { return oSettings.oFeatures.bProcessing == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div is not in the DOM",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div cannot be shown",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div cannot be hidden",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, false ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Processing can be enabled",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bProcessing": true
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bProcessing == true; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div is in the DOM",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div is hidden by default",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing').style.visibility = "hidden"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div can be shown",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing').style.visibility = "visible"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div can be hidden",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, false ); },
+		function () { return document.getElementById('example_processing').style.visibility = "hidden"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Processing disabled override",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bProcessing": false
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bProcessing == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div is not in the DOM",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bServerSide.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bServerSide.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bServerSide.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,20 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bServerSide" );
+
+/* Not interested in server-side processing here other than to check that it is off */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Server side is off by default",
+		null,
+		function () { return oSettings.oFeatures.bServerSide == false; }
+	);
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bSort.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bSort.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bSort.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,99 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bSort" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Sorting is on by default",
+		null,
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting Asc by default class applied",
+		null,
+		function () { return $('#example thead th:eq(0)').hasClass("sorting_asc"); }
+	);
+	
+	oTest.fnWaitTest(
+		"Click on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting class removed from first column",
+		null,
+		function () { return $('#example thead th:eq(0)').hasClass("sorting_asc") != true; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting asc class applied to second column",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_asc"); }
+	);
+	
+	oTest.fnWaitTest(
+		"Reverse on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting acs class removed from second column",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_asc") != true; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting desc class applied to second column",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_desc"); }
+	);
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Pagiantion can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bSort": false
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "4"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Click on second column has no effect",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "4"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Reverse on second column has no effect",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "4"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Sorting enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bSort": true
+			} );
+		},
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bSortClasses.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bSortClasses.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/bSortClasses.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,132 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bSortClasses" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Sorting classes are applied by default",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting classes are applied to all required cells",
+		null,
+		function () { return $('#example tbody tr:eq(7) td:eq(0)').hasClass('sorting_1'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting classes are not applied to non-sorting columns",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_1') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting multi-column - add column 1",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2');
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting multi-column - add column 2",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(2)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3');
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting multi-column - add column 3",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(3)')[0], { 'shift': true } );
+		},
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3') &&
+						 $('#example tbody tr:eq(0) td:eq(3)').hasClass('sorting_3');
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Remove sorting classes on single column sort",
+		function () { 
+			$('#example thead th:eq(4)').click();
+		},
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') == false &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3') == false &&
+						 $('#example tbody tr:eq(0) td:eq(3)').hasClass('sorting_3') == false;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting class 1 was added",
+		null,
+		function () { return $('#example tbody tr:eq(1) td:eq(4)').hasClass('sorting_1'); }
+	);
+	
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Sorting classes can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bSortClasses": false
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting classes disabled - add column 1 - no effect",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') == false;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting classes disabled - add column 2 - no effect",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(2)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') == false &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3') == false;
+		}
+	);
+	
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Sorting classes enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bSortClasses": true
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1'); }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnDrawCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnDrawCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnDrawCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,85 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "fnDrawCallback" );
+
+/* Fairly boring function compared to the others! */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnWaitTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnDrawCallback == null; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"One argument passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnDrawCallback": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"That one argument is the settings object",
+		function () {
+			oSession.fnRestore();
+			
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnDrawCallback": function ( oSettings ) {
+					mPass = oSettings;
+				}
+			} );
+		},
+		function () { return oTable.fnSettings() == mPass; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback called once on first draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnDrawCallback": function ( ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback called once on each draw there after as well",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return mPass == 4; }
+	);
+	
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnHeaderCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnHeaderCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnHeaderCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,182 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "fnHeaderCallback" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnWaitTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnHeaderCallback == null; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Five arguments passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnHeaderCallback": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 5; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback called once per draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback called on paging (i.e. another draw)",
+		function () { $('#example_next').click(); },
+		function () { return mPass == 2; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback allows us to alter row information",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					nHead.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records";
+				}
+			} );
+		},
+		function () { return $('#example thead th:eq(0)').html() == "Displaying 10 records"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"iStart correct on first page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iStart != 0 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"iStart correct on second page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iStart == 10 )
+					{
+						mPass = true;
+					}
+				},
+				"fnInitComplete": function () {
+					$('#example_next').click();
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"iEnd correct on second page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iEnd == 20 )
+					{
+						mPass = true;
+					}
+				},
+				"fnInitComplete": function () {
+					$('#example_next').click();
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"aiDisplay length is full data when not filtered",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aiDisplay.length == 57 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnWaitTest( 
+		"aiDisplay length is 9 when filtering on 'Mozilla'",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aiDisplay.length == 9 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			oTable.fnFilter( "Mozilla" );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnInitComplete.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnInitComplete.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnInitComplete.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,83 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "fnInitComplete" );
+
+/* Fairly boring function compared to the others! */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnWaitTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnInitComplete == null; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"One argument passed (for Ajax!)",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnInitComplete": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 2; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"That one argument is the settings object",
+		function () {
+			oSession.fnRestore();
+			
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnInitComplete": function ( oSettings ) {
+					mPass = oSettings;
+				}
+			} );
+		},
+		function () { return oTable.fnSettings() == mPass; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"fnInitComplete called once on first draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnInitComplete": function ( ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnInitComplete never called there after",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return mPass == 1; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnRowCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnRowCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnRowCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,112 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "fnRowCallback" );
+
+/* Note - fnRowCallback MUST return the first arguments (modified or not) */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnWaitTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnRowCallback == null; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Four arguments passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnRowCallback": function ( nTr ) {
+					mPass = arguments.length;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass == 4; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback called once for each drawn row",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					mPass++;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass == 10; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback allows us to alter row information",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					$(nTr).addClass('unit_test');
+					return nTr;
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(1)').hasClass('unit_test'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Data array has length matching columns",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					if ( asData.length != 5 )
+						mPass = false;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Data array has length matching columns",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			var iCount = 0;
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					if ( iCount != iDrawIndex )
+						mPass = false;
+					iCount++;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnServerData.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnServerData.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/fnServerData.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,22 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "fnServerData" );
+
+/* Not testing anything beyond the default here. SSP will do that... */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnWaitTest( 
+		"Default should be $.getJSON",
+		null,
+		function () { return oSettings.fnServerData == $.getJSON; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/iDisplayLength.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/iDisplayLength.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/iDisplayLength.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,81 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "iDisplayLength" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Default length is ten",
+		null,
+		function () { return $('#example tbody tr').length == 10; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Select menu shows 10",
+		null,
+		function () { return $('#example_length select').val() == 10; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Set initial length to 25",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"iDisplayLength": 25
+			} );
+		},
+		function () { return $('#example tbody tr').length == 25; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Select menu shows 25",
+		null,
+		function () { return $('#example_length select').val() == 25; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Set initial length to 100",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"iDisplayLength": 100
+			} );
+		},
+		function () { return $('#example tbody tr').length == 57; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Select menu shows 25",
+		null,
+		function () { return $('#example_length select').val() == 100; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Set initial length to 23 (unknown select menu length)",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"iDisplayLength": 23
+			} );
+		},
+		function () { return $('#example tbody tr').length == 23; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Select menu shows 10 (since 23 is unknow)",
+		null,
+		function () { return $('#example_length select').val() == 10; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.oPaginate.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.oPaginate.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.oPaginate.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,84 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.oPaginate" );
+
+/* Note that the paging language information only has relevence in full numbers */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+		"sPaginationType": "full_numbers"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"oLanguage.oPaginate defaults",
+		null,
+		function () {
+			var bReturn = 
+				oSettings.oLanguage.oPaginate.sFirst == "First" &&
+				oSettings.oLanguage.oPaginate.sPrevious == "Previous" &&
+				oSettings.oLanguage.oPaginate.sNext == "Next" &&
+				oSettings.oLanguage.oPaginate.sLast == "Last";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"oLanguage.oPaginate defaults are in the DOM",
+		null,
+		function () {
+			var bReturn = 
+				$('#example_paginate .first').html() == "First" &&
+				$('#example_paginate .previous').html() == "Previous" &&
+				$('#example_paginate .next').html() == "Next" &&
+				$('#example_paginate .last').html() == "Last";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"oLanguage.oPaginate can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"sPaginationType": "full_numbers",
+				"oLanguage": {
+					"oPaginate": {
+						"sFirst":    "unit1",
+						"sPrevious": "test2",
+						"sNext":     "unit3",
+						"sLast":     "test4"
+					}
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var bReturn = 
+				oSettings.oLanguage.oPaginate.sFirst == "unit1" &&
+				oSettings.oLanguage.oPaginate.sPrevious == "test2" &&
+				oSettings.oLanguage.oPaginate.sNext == "unit3" &&
+				oSettings.oLanguage.oPaginate.sLast == "test4";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"oLanguage.oPaginate definitions are in the DOM",
+		null,
+		function () {
+			var bReturn = 
+				$('#example_paginate .first').html() == "unit1" &&
+				$('#example_paginate .previous').html() == "test2" &&
+				$('#example_paginate .next').html() == "unit3" &&
+				$('#example_paginate .last').html() == "test4";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sInfo.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sInfo.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sInfo.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,117 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sInfo" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Info language is 'Showing _START_ to _END_ of _TOTAL_ entries' by default",
+		null,
+		function () { return oSettings.oLanguage.sInfo == "Showing _START_ to _END_ of _TOTAL_ entries"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Info language can be defined - without any macros",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sInfo": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sInfo == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language definition is in the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "unit test"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Info language can be defined - with macro _START_ only",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sInfo": "unit _START_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 1 test"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Info language can be defined - with macro _END_ only",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sInfo": "unit _END_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 10 test"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Info language can be defined - with macro _TOTAL_ only",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sInfo": "unit _END_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 57 test"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Info language can be defined - with macros _START_ and _END_",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sInfo": "unit _START_ _END_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 1 10 test"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Info language can be defined - with macros _START_, _END_ and _TOTAL_",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sInfo": "unit _START_ _END_ _TOTAL_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 1 10 57 test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sInfoEmpty.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sInfoEmpty.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sInfoEmpty.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,79 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sInfoEmpty" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Info empty language is 'Showing 0 to 0 of 0 entries' by default",
+		function () { oTable.fnFilter("nothinghere"); },
+		function () { return oSettings.oLanguage.sInfoEmpty == "Showing 0 to 0 of 0 entries"; }
+	);
+	
+	oTest.fnTest( 
+		"Info empty language default is in the DOM",
+		null,
+		function () {
+			var bReturn = document.getElementById('example_info').innerHTML.replace( 
+				' '+oSettings.oLanguage.sInfoFiltered.replace( '_MAX_', '57' ), "" ) ==
+					"Showing 0 to 0 of 0 entries";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Info empty language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sInfoEmpty": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+			oTable.fnFilter("nothinghere");
+		},
+		function () { return oSettings.oLanguage.sInfoEmpty == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info empty language default is in the DOM",
+		null,
+		function () {
+			var bReturn = document.getElementById('example_info').innerHTML.replace( 
+				' '+oSettings.oLanguage.sInfoFiltered.replace( '_MAX_', '57' ), "" ) ==
+					"unit test";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Macro's not replaced",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sInfoEmpty": "unit _START_ _END_ _TOTAL_ test"
+				}
+			} );
+			oTable.fnFilter("nothinghere");
+		},
+		function () {
+			var bReturn = document.getElementById('example_info').innerHTML.replace( 
+				' '+oSettings.oLanguage.sInfoFiltered.replace( '_MAX_', '57' ), "" ) ==
+					"unit _START_ _END_ _TOTAL_ test";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sInfoPostFix.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sInfoPostFix.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sInfoPostFix.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,78 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sInfoPostFix" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Info post fix language is '' (blank) by default",
+		null,
+		function () { return oSettings.oLanguage.sInfoPostFix == ""; }
+	);
+	
+	oTest.fnTest( 
+		"Width no post fix, the basic info shows",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Info post fix language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sInfoPostFix": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sInfoPostFix == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info empty language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries unit test"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Macros have no effect in the post fix",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sInfoPostFix": "unit _START_ _END_ _TOTAL_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries unit _START_ _END_ _TOTAL_ test"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Post fix is applied after fintering info",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sInfoPostFix": "unit test"
+				}
+			} );
+			oTable.fnFilter("nothinghere");
+		},
+		function () { return document.getElementById('example_info').innerHTML = "Showing 0 to 0 of 0 entries unit (filtered from 57 total entries) test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sLengthMenu.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sLengthMenu.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sLengthMenu.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,106 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sLengthMenu" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Menu language is 'Show _MENU_ entries' by default",
+		null,
+		function () { return oSettings.oLanguage.sLengthMenu == "Show _MENU_ entries"; }
+	);
+	
+	oTest.fnTest(
+		"_MENU_ macro is replaced by select menu in DOM",
+		null,
+		function () { return $('select', oSettings.anFeatures.l).length == 1 }
+	);
+	
+	oTest.fnTest(
+		"Default is put into DOM",
+		null,
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			var bReturn =
+				anChildren[0].nodeValue == "Show " &&
+				anChildren[2].nodeValue == " entries";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Menu length language can be defined - no _MENU_ macro",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sLengthMenu": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sLengthMenu == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Menu length language definition is in the DOM",
+		null,
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			return anChildren[0].nodeValue == "unit test";
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Menu length language can be defined - with _MENU_ macro",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sLengthMenu": "unit _MENU_ test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			var bReturn =
+				anChildren[0].nodeValue == "unit " &&
+				anChildren[2].nodeValue == " test";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Only the _MENU_ macro",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sLengthMenu": "_MENU_"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			var bReturn =
+				anChildren.length == 1 &&
+				$('select', oSettings.anFeatures.l).length == 1;
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sProcessing.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sProcessing.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sProcessing.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,49 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sProcessing" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+		"bProcessing": true
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Processing language is 'Processing...' by default",
+		null,
+		function () { return oSettings.oLanguage.sProcessing == "Processing..."; }
+	);
+	
+	oTest.fnTest( 
+		"Processing language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_processing').innerHTML = "Processing..."; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Processing language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"bProcessing": true,
+				"oLanguage": {
+					"sProcessing": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sProcessing == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Processing language definition is in the DOM",
+		null,
+		function () { return document.getElementById('example_processing').innerHTML = "unit test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sSearch.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sSearch.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sSearch.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,65 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sSearch" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Search language is 'Search:' by default",
+		null,
+		function () { return oSettings.oLanguage.sSearch == "Search:"; }
+	);
+	
+	oTest.fnTest( 
+		"Search language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_filter').childNodes[0].nodeValue
+		 	== "Search: "; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Search language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sSearch": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sSearch == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language definition is in the DOM",
+		null,
+		function () { return document.getElementById('example_filter').childNodes[0].nodeValue
+		 	== "unit test "; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Blank search has a no space (separator) inserted",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sSearch": ""
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return document.getElementById('example_filter').childNodes.length == 1; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sUrl.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sUrl.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sUrl.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,62 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sUrl" );
+
+/* Note that we only test the internal storage of language information pulled form a file here
+ * as the other language tests will check it goes into the DOM correctly
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"sUrl is blank by default",
+		null,
+		function () { return oSettings.oLanguage.sUrl == ""; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Loading of German file loads language information",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sUrl": "../../../examples/examples_support/de_DE.txt"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var bReturn = 
+				oSettings.oLanguage.sProcessing == "Bitte warten..." &&
+				oSettings.oLanguage.sLengthMenu == "_MENU_ Einträge anzeigen" &&
+				oSettings.oLanguage.sZeroRecords == "Keine Einträge vorhanden." &&
+				oSettings.oLanguage.sInfo == "_START_ bis _END_ von _TOTAL_ Einträgen" &&
+				oSettings.oLanguage.sInfoEmpty == "0 bis 0 von 0 Einträgen" &&
+				oSettings.oLanguage.sInfoFiltered == "(gefiltert von _MAX_  Einträgen)" &&
+				oSettings.oLanguage.sInfoPostFix == "" &&
+				oSettings.oLanguage.sSearch == "Suchen" &&
+				oSettings.oLanguage.oPaginate.sFirst == "Erster" &&
+				oSettings.oLanguage.oPaginate.sPrevious == "Zurück" &&
+				oSettings.oLanguage.oPaginate.sNext == "Nächster" &&
+				oSettings.oLanguage.oPaginate.sLast == "Letzter";
+				
+			return bReturn;
+		}
+	);
+	
+	/* One DOM check just to ensure that they go into the DOM */
+	oTest.fnTest(
+		"Loaded language goes into the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "1 bis 10 von 57 Einträgen"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sZeroRecords.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sZeroRecords.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oLanguage.sZeroRecords.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,48 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sZeroRecords" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Zero records language is 'No matching records found' by default",
+		null,
+		function () { return oSettings.oLanguage.sZeroRecords == "No matching records found"; }
+	);
+	
+	oTest.fnTest(
+		"Text is shown when empty table (after filtering)",
+		function () { oTable.fnFilter('nothinghere'); },
+		function () { return $('#example tbody tr td')[0].innerHTML == "No matching records found" }
+	);
+	
+	
+	
+	oTest.fnWaitTest( 
+		"Zero records language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oLanguage": {
+					"sZeroRecords": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sZeroRecords == "unit test"; }
+	);
+	
+	oTest.fnTest(
+		"Text is shown when empty table (after filtering)",
+		function () { oTable.fnFilter('nothinghere2'); },
+		function () { return $('#example tbody tr td')[0].innerHTML == "unit test" }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oSearch.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oSearch.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/oSearch.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,108 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oSearch" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Default values should be blank",
+		null,
+		function () {
+			var bReturn = oSettings.oPreviousSearch.sSearch == "" && 
+			              oSettings.oPreviousSearch.bEscapeRegex;
+			return bReturn;
+		}
+	);
+	
+	/* This test might be considered iffy since the full object isn't given, but it's reasonable to
+	 * expect DataTables to cope with this. It should just assumine regex false
+	 */
+	oTest.fnWaitTest( 
+		"Search term only in object",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oSearch": {
+					"sSearch": "Mozilla"
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Gecko"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"New search will kill old one",
+		function () {
+			oTable.fnFilter("Opera");
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Presto"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Search plain text term and escape regex true",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oSearch": {
+					"sSearch": "DS",
+					"bEscapeRegex": true
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Nintendo DS browser"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Search plain text term and escape regex false",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oSearch": {
+					"sSearch": "Opera",
+					"bEscapeRegex": false
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Presto"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Search regex text term and escape regex true",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oSearch": {
+					"sSearch": "1.*",
+					"bEscapeRegex": true
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Search regex text term and escape regex false",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"oSearch": {
+					"sSearch": "1.*",
+					"bEscapeRegex": false
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "Gecko"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/sAjaxSource.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/sAjaxSource.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/sAjaxSource.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,22 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "sAjaxSource" );
+
+/* Sanitfy check really - all the other tests blast this */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Server side is off by default",
+		null,
+		function () { 
+			return oSettings.sAjaxSource == "../../../examples/examples_support/json_source.txt";
+		}
+	);
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/sDom.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/sDom.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/sDom.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,262 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "sDom" );
+
+/* This is going to be brutal on the browser! There is a lot that can be tested here... */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Default DOM varaible",
+		null,
+		function () { return oSettings.sDomPositioning == "lfrtip"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Default DOM in document",
+		null,
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nTable &&
+				nNodes[4] == nInfo &&
+				nNodes[5] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check example 1 in code propagates",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"sDom": '<"wrapper"flipt>'
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.sDomPositioning == '<"wrapper"flipt>'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Check example 1 in DOM",
+		null,
+		function () {
+			var jqNodes = $('#demo div, #demo table');
+			var nNodes = [];
+			
+			/* Strip the paging nodes */
+			for ( var i=0, iLen=jqNodes.length ; i<iLen ; i++ )
+			{
+				if ( jqNodes[i].getAttribute('id') != "example_previous" &&
+				     jqNodes[i].getAttribute('id') != "example_next" )
+				{
+					nNodes.push( jqNodes[i] );
+				}
+			}
+			
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			var nCustomWrapper = $('div.wrapper')[0];
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nCustomWrapper &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nLength &&
+				nNodes[4] == nInfo &&
+				nNodes[5] == nPaging &&
+				nNodes[6] == nTable;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check example 2 in DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"sDom": '<lf<t>ip>'
+			} );
+		},
+		function () {
+			var jqNodes = $('#demo div, #demo table');
+			var nNodes = [];
+			var nCustomWrappers = []
+			
+			/* Strip the paging nodes */
+			for ( var i=0, iLen=jqNodes.length ; i<iLen ; i++ )
+			{
+				if ( jqNodes[i].getAttribute('id') != "example_previous" &&
+				     jqNodes[i].getAttribute('id') != "example_next" )
+				{
+					nNodes.push( jqNodes[i] );
+				}
+				
+				/* Only the two custom divs don't have class names */
+				if ( !jqNodes[i].getAttribute('class') )
+				{
+					nCustomWrappers.push( jqNodes[i] );
+				}
+			}
+			
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nCustomWrappers[0] &&
+				nNodes[2] == nLength &&
+				nNodes[3] == nFilter &&
+				nNodes[4] == nCustomWrappers[1] &&
+				nNodes[5] == nTable &&
+				nNodes[6] == nInfo &&
+				nNodes[7] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check no length element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"sDom": 'frtip'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				null == nLength &&
+				nNodes[1] == nFilter &&
+				nNodes[2] == nTable &&
+				nNodes[3] == nInfo &&
+				nNodes[4] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check no filter element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"sDom": 'lrtip'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				null == nFilter &&
+				nNodes[2] == nTable &&
+				nNodes[3] == nInfo &&
+				nNodes[4] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	/* Note we don't test for no table as this is not supported (and it would be fairly daft! */
+	
+	oTest.fnWaitTest( 
+		"Check no info element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"sDom": 'lfrtp'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nTable &&
+				null == nInfo &&
+				nNodes[4] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check no paging element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"sDom": 'lfrti'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nTable &&
+				nNodes[4] == nInfo &&
+				null == nPaging;
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/sPaginationType.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/sPaginationType.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/3_ajax/sPaginationType.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,134 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "sPaginationType" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"sAjaxSource": "../../../examples/examples_support/json_source.txt"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Check two button paging is the default",
+		null,
+		function () { return oSettings.sPaginationType == "two_button"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Check class is applied",
+		null,
+		function () { return $('#example_paginate').hasClass('paging_two_button'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Two div elements are in the wrapper",
+		null,
+		function () { return $('#example_paginate div').length == 2; }
+	);
+	
+	oTest.fnWaitTest( 
+		"We have the previous button",
+		null,
+		function () { return document.getElementById('example_previous'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"We have the next button",
+		null,
+		function () { return document.getElementById('example_next'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Previous button is disabled",
+		null,
+		function () { return $('#example_previous').hasClass('paginate_disabled_previous'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Next button is enabled",
+		null,
+		function () { return $('#example_next').hasClass('paginate_enabled_next'); }
+	);
+	
+	/* Don't test paging - that's done by the zero config test script. */
+	
+	
+	/* Two buttons paging */
+	var bComplete = false;
+	oTest.fnWaitTest( 
+		"Can enabled full numbers paging",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"sAjaxSource": "../../../examples/examples_support/json_source.txt",
+				"sPaginationType": "full_numbers",
+				"fnInitComplete": function () {
+					bComplete = true;
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			if ( bComplete )
+				return oSettings.sPaginationType == "full_numbers";
+			else
+				return false;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check full numbers class is applied",
+		null,
+		function () { return $('#example_paginate').hasClass('paging_full_numbers'); }
+	);
+	
+	
+	var nFirst, nPrevious, nNext, nLast;
+	oTest.fnWaitTest( 
+		"Jump to last page",
+		function () {
+			nFirst = $('div.dataTables_paginate span.first');
+			nPrevious = $('div.dataTables_paginate span.previous');
+			nNext = $('div.dataTables_paginate span.next');
+			nLast = $('div.dataTables_paginate span.last');
+			nLast.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 51 to 57 of 57 entries";
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Go to two pages previous",
+		function () {
+			nPrevious.click();
+			nPrevious.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 31 to 40 of 57 entries";
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Next (second last) page",
+		function () {
+			nNext.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 41 to 50 of 57 entries";
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Jump to first page",
+		function () {
+			nFirst.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries";
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/_zero_config.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/_zero_config.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/_zero_config.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,424 @@
+// DATA_TEMPLATE: empty_table
+/*
+ * NOTE: There are some differences in this zero config script for server-side
+ * processing compared to the other data sources. The main reason for this is the
+ * difference in how the server-side processing does it's filtering. Also the
+ * sorting state is always reset on each draw.
+ */
+oTest.fnStart( "Santiy checks for DataTables with data from JS" );
+
+oTest.fnWaitTest( 
+	"jQuery.dataTable function",
+	null,
+	function () { return typeof jQuery().dataTable == "function"; }
+);
+
+oTest.fnWaitTest(
+	"jQuery.dataTableSettings storage array",
+	null,
+	function () { return typeof jQuery().dataTableSettings == "object"; }
+);
+
+oTest.fnWaitTest(
+	"jQuery.dataTableExt plugin object",
+	null,
+	function () { return typeof jQuery().dataTableExt == "object"; }
+);
+
+$(document).ready( function () {
+	$('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	
+	/* Basic checks */
+	oTest.fnWaitTest( 
+		"Length changing div exists",
+		null,
+		function () { return document.getElementById('example_length') != null; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Filtering div exists",
+		null,
+		function () { return document.getElementById('example_filter') != null; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Information div exists",
+		null,
+		function () { return document.getElementById('example_info') != null; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Pagination div exists",
+		null,
+		function () { return document.getElementById('example_paginate') != null; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div is off by default",
+		null,
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	oTest.fnWaitTest( 
+		"10 rows shown on the first page",
+		null,
+		function () { return $('#example tbody tr').length == 10; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Initial sort occured",
+		null,
+		function () { return $('#example tbody td:eq(0)').html() == "Gecko"; }
+	);
+	
+	/* Need to use the WaitTest for sorting due to the setTimeout datatables uses */
+	oTest.fnWaitTest( 
+		"Sorting (first click) on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting (second click) on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting (third click) on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting (first click) on numeric column",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "-"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting (second click) on numeric column",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "522.1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting multi-column (first click)",
+		function () { 
+			$('#example thead th:eq(0)').click();
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } ); },
+		function () { var b = 
+			$('#example tbody td:eq(0)').html() == "Gecko" && 
+			$('#example tbody td:eq(1)').html() == "Camino 1.0"; return b; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting multi-column - sorting first column only",
+		function () { 
+			$('#example thead th:eq(0)').click(); },
+		function () { var b = 
+			$('#example tbody td:eq(0)').html() == "Gecko" && 
+			$('#example tbody td:eq(1)').html() == "Firefox 1.0"; return b; }
+	);
+	
+	/* Basic paging */
+	oTest.fnWaitTest( 
+		"Paging to second page",
+		function () { $('#example_next').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "Mozilla 1.1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Paging to first page",
+		function () { $('#example_previous').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Attempting to page back beyond the first page",
+		function () { $('#example_previous').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	/* Changing length */
+	oTest.fnWaitTest( 
+		"Changing table length to 25 records",
+		function () { $("select[name=example_length]").val('25').change(); },
+		function () { return $('#example tbody tr').length == 25; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Changing table length to 50 records",
+		function () { $("select[name=example_length]").val('50').change(); },
+		function () { return $('#example tbody tr').length == 50; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Changing table length to 100 records",
+		function () { $("select[name=example_length]").val('100').change(); },
+		function () { return $('#example tbody tr').length == 57; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Changing table length to 10 records",
+		function () { $("select[name=example_length]").val('10').change(); },
+		function () { return $('#example tbody tr').length == 10; }
+	);
+	
+	/*
+	 * Information element
+	 */
+	oTest.fnWaitTest(
+		"Information on zero config",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information on second page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 11 to 20 of 57 entries"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information on third page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 21 to 30 of 57 entries"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information on last page",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 51 to 57 of 57 entries"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information back on first page",
+		function () {
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information with 25 records",
+		function () { $("select[name=example_length]").val('25').change(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 25 of 57 entries"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information with 25 records - second page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == "Showing 26 to 50 of 57 entries"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information with 100 records - first page",
+		function () {
+			$('#example_previous').click();
+			$("select[name=example_length]").val('100').change();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 57 of 57 entries"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information back to 10 records",
+		function () {
+			$('#example_previous').click();
+			$("select[name=example_length]").val('10').change();
+		},
+		function () { return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information with filter 'Win'",
+		function () { $('#example_filter input').val("Win").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information with filter 'Win' second page",
+		function () { $('#example_next').click(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 11 to 20 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information with filter 'Win' last page",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 31 to 31 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information with filter 'Win' back to first page",
+		function () {
+			$('#example_previous').click();
+			$('#example_previous').click();
+			$('#example_previous').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information with filter 'Win' second page - second time",
+		function () {
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 11 to 20 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information with filter increased to 'Win 98'",
+		function () { $('#example_filter input').val("Win 98").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 9 of 9 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information with filter decreased to 'Win'",
+		function () { $('#example_filter input').val("Win").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information with filter 'Win' second page - third time",
+		function () {
+			$('#example_next').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 11 to 20 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information with filter removed",
+		function () { $('#example_filter input').val("").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	/*
+	 * Filtering
+	 */
+	oTest.fnWaitTest(
+		"Filter 'W' - rows",
+		function () {
+			$('#example_filter input').val("W").keyup(); },
+		function () { return $('#example tbody tr:eq(4) td:eq(1)').html() == "Netscape 7.2"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Filter 'W' - info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 42 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Filter 'Wi'",
+		function () { $('#example_filter input').val("Wi").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 32 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Filter 'Win'",
+		function () { $('#example_filter input').val("Win").keyup(); },
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Filter 'Win' - sorting column 1",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "AOL browser (AOL desktop)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Filter 'Win' - sorting column 1 info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 31 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Filter 'Win' - sorting column 1 reverse",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Filter 'Win XP' - maintaing reverse sorting col 1",
+		function () { $('#example_filter input').val("Win XP").keyup(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Internet Explorer 7"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Filter 'Win XP' - sorting col 3",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "6"; }
+	);
+	
+	/* Note the filtering is different from the DOM since the server doesn't do
+	 * "smart filtering" like the client side does
+	 */
+	oTest.fnWaitTest(
+		"Filter 'Win XP' - sorting col 3 - reversed",
+		function () { $('#example thead th:eq(3)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "7"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Filter 'Win' - sorting col 3 - reversed info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 2 of 2 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Filter 'nothinghere'",
+		function () { $('#example_filter input').val("nothinghere").keyup(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == 
+			"No matching records found"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Filter 'nothinghere' - info",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 0 to 0 of 0 entries (filtered from 57 total entries)"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Filter back to blank and 1st column sorting",
+		function () {
+			$('#example_filter input').val("").keyup();
+			$('#example thead th:eq(0)').click();
+		},
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aaSorting.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aaSorting.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aaSorting.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,212 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aaSorting" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Default sorting is single column",
+		null,
+		function () {
+			return oSettings.aaSorting.length == 1 && typeof oSettings.aaSorting[0] == 'object';
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Default sorting is first column asc",
+		null,
+		function () {
+			return oSettings.aaSorting[0].length == 3 && oSettings.aaSorting[0][0] == 0 &&
+				oSettings.aaSorting[0][1] == 'asc';
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting is applied",
+		null,
+		function () { return $('#example tbody td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Custom sorting on single string column asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Custom sorting on single string column desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Custom sorting on single int column asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "-"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Custom sorting on single int column desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string asc / string asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['0','asc'], ['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Camino 1.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string asc / string desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['0','asc'], ['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string desc / string asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['0','desc'], ['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "iPod Touch / iPhone"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string desc / string desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['0','desc'], ['1','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Safari 3.0"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string asc / int asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['0','asc'], ['3','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string asc / int desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['0','asc'], ['3','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "1.9"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string desc / int asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['0','desc'], ['3','asc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "125.5"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (2 column) - string desc / int desc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['0','desc'], ['3','desc']]
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "522.1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multi-column sorting (3 column) - string asc / int asc / string asc",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSorting": [['0','asc'], ['3','asc'], ['1','asc']]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(7) td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aaSortingFixed.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aaSortingFixed.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aaSortingFixed.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,67 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aaSortingFixed" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"No fixed sorting by default",
+		null,
+		function () {
+			return oSettings.aaSortingFixed == null;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Fixed sorting on first column (string/asc) with user sorting on second column (string/asc)",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSortingFixed": [['0','asc']]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Camino 1.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Fixed sorting on first column (string/asc) with user sorting on second column (string/desc)",
+		function () {
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Fixed sorting on fourth column (int/asc) with user sorting on second column (string/asc)",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aaSortingFixed": [['3','asc']]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Fixed sorting on fourth column (int/asc) with user sorting on second column (string/desc)",
+		function () {
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "PSP browser"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bSearchable.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bSearchable.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bSearchable.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,25 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.bSeachable" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Columns are searchable by default",
+		function () { oTable.fnFilter("Camino"); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Camino 1.0"; }
+	);
+	
+	/* NOT ACTUALLY GOING TO TEST BSEARCHABLE HERE. Reason being is that it requires the server
+	 * side to alter it's processing, and this information about columns is not actually sent to
+	 * the server
+	 */
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bSortable.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bSortable.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bSortable.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,112 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.bSortable" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"All columns are sortable by default",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Can disable sorting from one column",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					{ "bSortable": false },
+					null,
+					null,
+					null
+				]
+			} );
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Disabled column has no sorting class",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_asc") == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Other columns can still sort",
+		function () {
+			$('#example thead th:eq(4)').click();
+			$('#example thead th:eq(4)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Internet Explorer 4.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Disable sorting on multiple columns - no sorting classes",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					{ "bSortable": false },
+					null,
+					{ "bSortable": false },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn = 
+				$('#example thead th:eq(1)').hasClass("sorting") ||
+				$('#example thead th:eq(3)').hasClass("sorting")
+			return bReturn == false;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting on disabled column 1 has no effect",
+		function () {
+			$('#example thead th:eq(1)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting on disabled column 2 has no effect",
+		function () {
+			$('#example thead th:eq(3)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Second sort on disabled column 2 has no effect",
+		function () {
+			$('#example thead th:eq(3)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Even with multiple disabled sorting columns other columns can still sort",
+		function () {
+			$('#example thead th:eq(4)').click();
+			$('#example thead th:eq(4)').click();
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Internet Explorer 4.0"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bUseRendered.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bUseRendered.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bUseRendered.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,43 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.bUseRendered" );
+
+/* bUseRendered is used to alter sorting data, if false then the original data is used for
+ * sorting rather than the rendered data
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var mTmp = 0;
+	
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+		"aoColumns": [
+			null,
+			{ "fnRender": function (a) {
+				if ( mTmp == 0 ) {
+					mTmp++;
+					return "aaa";
+				} else
+					return a.aData[a.iDataColumn];
+			} },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Default for bUseRendered is true - rendered data is used for sorting",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'aaa'; }
+	);
+	
+	/* Limited to what we can do here as the sorting is done on the server side. So stop here. */
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bVisible.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bVisible.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.bVisible.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,123 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.bVisible" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"All columns are visible by default",
+		null,
+		function () { return $('#example tbody tr:eq(0) td').length == 5; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Can hide one column and it removes td column from DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					{ "bVisible": false },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td').length == 4; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Can hide one column and it removes thead th column from DOM",
+		null,
+		function () { return $('#example thead tr:eq(0) th').length == 4; }
+	);
+	
+	oTest.fnWaitTest( 
+		"The correct thead column has been hidden",
+		null,
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "Platform(s)" &&
+				jqNodes[2].innerHTML == "Engine version" &&
+				jqNodes[3].innerHTML == "CSS grade";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"The correct tbody column has been hidden",
+		null,
+		function () {
+			var jqNodes = $('#example tbody tr:eq(0) td');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Gecko" &&
+				jqNodes[1].innerHTML == "Win 98+ / OSX.2+" &&
+				jqNodes[2].innerHTML == "1.7" &&
+				jqNodes[3].innerHTML == "A";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Can hide multiple columns and it removes td column from DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					{ "bVisible": false },
+					{ "bVisible": false },
+					null,
+					{ "bVisible": false }
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td').length == 2; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multiple hide - removes thead th column from DOM",
+		null,
+		function () { return $('#example thead tr:eq(0) th').length == 2; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Multiple hide - the correct thead columns have been hidden",
+		null,
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "Engine version"
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Multiple hide - the correct tbody columns have been hidden",
+		null,
+		function () {
+			var jqNodes = $('#example tbody tr:eq(0) td');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Gecko" &&
+				jqNodes[1].innerHTML == "1.7"
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.fnRender.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.fnRender.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.fnRender.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,189 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.fnRender" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var mTmp = 0;
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+		"aoColumns": [
+			null,
+			{ "fnRender": function (a) {
+				mTmp++;
+				return a.aData[a.iDataColumn];
+			} },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Single column - fnRender is called once for each row",
+		null,
+		function () { return mTmp == 10; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Confirm that fnRender passes one argument (an object) with three parameters",
+		function () {
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( arguments.length != 1 || typeof a.iDataRow=='undefined' ||
+						 	typeof a.iDataColumn=='undefined' || typeof a.aData=='undefined' )
+						{
+							mTmp = false;
+						}
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnRender iDataColumn is row number",
+		function () {
+			var iCount = 0;
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( iCount != a.iDataRow )
+						{
+							mTmp = false;
+						}
+						iCount++;
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnRender iDataColumn is the column",
+		function () {
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( a.iDataColumn != 1 )
+						{
+							mTmp = false;
+						}
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnRender aData is data array of correct size",
+		function () {
+			mTmp = true;
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						if ( a.aData.length != 5 )
+						{
+							mTmp = false;
+						}
+						return a.aData[a.iDataColumn];
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return mTmp; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Passed back data is put into the DOM",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					{ "fnRender": function (a) {
+						return 'unittest';
+					} },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == 'unittest'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Passed back data is put into the DOM",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					null,
+					{ "fnRender": function (a) {
+						return 'unittest1';
+					} },
+					{ "fnRender": function (a) {
+						return 'unittest2';
+					} },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn = 
+				$('#example tbody tr:eq(0) td:eq(2)').html() == 'unittest1' &&
+				$('#example tbody tr:eq(0) td:eq(3)').html() == 'unittest2';
+			return bReturn; }
+	);
+	
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sClass.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sClass.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sClass.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,118 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.sClass" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"By default the test class hasn't been applied to the column (sanity!)",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(2)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - first row",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					null,
+					{ "sClass": 'unittest' },
+					null,
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(1) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - third row",
+		null,
+		function () { return $('#example tbody tr:eq(3) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - last row",
+		null,
+		function () { return $('#example tbody tr:eq(9) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - has not applied to other columns - 1st",
+		null,
+		function () { return $('#example tbody tr:eq(3) td:eq(0)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - has not applied to other columns - 5th",
+		null,
+		function () { return $('#example tbody tr:eq(3) td:eq(4)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - seventh row - second page",
+		function () { $('#example_next').click(); },
+		function () { return $('#example tbody tr:eq(6) td:eq(2)').hasClass('unittest'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - has not applied to header",
+		null,
+		function () { return $('#example thead tr:eq(3) th:eq(4)').hasClass('unittest') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Add a class to a single column - has not applied to footer",
+		null,
+		function () { return $('#example thead tr:eq(3) th:eq(4)').hasClass('unittest') == false; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Class defined for multiple columns - first row",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					{ "sClass": 'unittest2' },
+					null,
+					null,
+					{ "sClass": 'unittest1' },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn = 
+				$('#example tbody tr:eq(3) td:eq(0)').hasClass('unittest2') &&
+				$('#example tbody tr:eq(8) td:eq(3)').hasClass('unittest1');
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Class defined for multiple columns - has not applied to other columns - 5th 1",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(4)').hasClass('unittest1') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Class defined for multiple columns - has not applied to other columns - 5th 2",
+		null,
+		function () { return $('#example tbody tr:eq(6) td:eq(4)').hasClass('unittest2') == false; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sName.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sName.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sName.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,29 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.sName" );
+
+/* This has no effect at all in DOM methods - so we just check that it has applied the name */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+		"aoColumns": [
+			null,
+			null,
+			null,
+			{ "sName": 'unit test' },
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Names are stored in the columns object",
+		null,
+		function () { return oSettings.aoColumns[3].sName =="unit test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sTitle.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sTitle.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sTitle.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,85 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.sTitle" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"If not given, then the columns titles are empty",
+		null,
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "Browser" &&
+				jqNodes[2].innerHTML == "Platform(s)" &&
+				jqNodes[3].innerHTML == "Engine version" &&
+				jqNodes[4].innerHTML == "CSS grade";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Can set a single column title - and others are read from DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					{ "sTitle": 'unit test' },
+					null,
+					null,
+					null
+				]
+			} );
+		},
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "unit test" &&
+				jqNodes[2].innerHTML == "Platform(s)" &&
+				jqNodes[3].innerHTML == "Engine version" &&
+				jqNodes[4].innerHTML == "CSS grade";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Can set multiple column titles",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					{ "sTitle": 'unit test 1' },
+					null,
+					null,
+					{ "sTitle": 'unit test 2' }
+				]
+			} );
+		},
+		function () {
+			var jqNodes = $('#example thead tr:eq(0) th');
+			var bReturn = 
+				jqNodes[0].innerHTML == "Rendering engine" &&
+				jqNodes[1].innerHTML == "unit test 1" &&
+				jqNodes[2].innerHTML == "Platform(s)" &&
+				jqNodes[3].innerHTML == "Engine version" &&
+				jqNodes[4].innerHTML == "unit test 2";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sWidth.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sWidth.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoColumns.sWidth.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,90 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoColumns.sWidth" );
+
+/* NOTE - we need to disable the auto width for the majority of these test in order to preform 
+ * these tests as the auto width will convert the width to a px value. We can do 'non-exact' tests
+ * with auto width enabled however to ensure it scales columns as required
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+		"bAutoWidth": false,
+		"aoColumns": [
+			null,
+			{ "sWidth": '40%' },
+			null,
+			null,
+			null
+		]
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"With auto width disabled the width for one column is appled",
+		null,
+		function () { return $('#example thead th:eq(1)')[0].style.width == "40%"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"With auto width disabled the width for one column is appled",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bAutoWidth": false,
+				"aoColumns": [
+					null,
+					null,
+					{ "sWidth": '20%' },
+					{ "sWidth": '30%' },
+					null
+				]
+			} );
+		},
+		function () {
+			var bReturn =
+				$('#example thead th:eq(2)')[0].style.width == "20%" &&
+				$('#example thead th:eq(3)')[0].style.width == "30%";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"With auto width, it will make the smallest column the largest with percentage width given",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"aoColumns": [
+					null,
+					null,
+					null,
+					{ "sWidth": '40%' },
+					null
+				]
+			} );
+		},
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			
+			if ( a3>a0 && a3>a1 && a3>a2 && a3>a4 )
+				return true;
+			else
+				return false;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoSearchCols.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoSearchCols.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/aoSearchCols.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,70 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "aoSearchCols" );
+
+/* We could be here forever testing this one, so we test a limited subset on a couple of colums */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing_filter_col.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Default should be to have a empty colums array",
+		null,
+		function () {
+			var bReturn = 
+				oSettings.aoPreSearchCols[0].sSearch == 0 && oSettings.aoPreSearchCols[0].bEscapeRegex &&
+				oSettings.aoPreSearchCols[1].sSearch == 0 && oSettings.aoPreSearchCols[1].bEscapeRegex &&
+				oSettings.aoPreSearchCols[2].sSearch == 0 && oSettings.aoPreSearchCols[2].bEscapeRegex &&
+				oSettings.aoPreSearchCols[3].sSearch == 0 && oSettings.aoPreSearchCols[3].bEscapeRegex &&
+				oSettings.aoPreSearchCols[4].sSearch == 0 && oSettings.aoPreSearchCols[4].bEscapeRegex;
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Search on a single column - no regex statement given",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing_filter_col.php",
+				"aoSearchCols": [
+					null,
+					{ "sSearch": "Mozilla" },
+					null,
+					{ "sSearch": "1" },
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Search on two columns - no regex statement given",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing_filter_col.php",
+				"aoSearchCols": [
+					null,
+					{ "sSearch": "Mozilla" },
+					null,
+					{ "sSearch": "1.5" },
+					null
+				]
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "1.5"; }
+	);
+	
+	/* No regex escape searches here - would need to be implemented on the server-side */
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/asStripClasses.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/asStripClasses.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/asStripClasses.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,109 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "asStripClasses" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Default row striping is applied",
+		null,
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('odd') &&
+			       $('#example tbody tr:eq(1)').hasClass('even') &&
+			       $('#example tbody tr:eq(2)').hasClass('odd') &&
+			       $('#example tbody tr:eq(3)').hasClass('even');
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Row striping on the second page",
+		function () { $('#example_next').click(); },
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('odd') &&
+			       $('#example tbody tr:eq(1)').hasClass('even') &&
+			       $('#example tbody tr:eq(2)').hasClass('odd') &&
+			       $('#example tbody tr:eq(3)').hasClass('even');
+		}
+	);
+	
+	/* No striping */
+	oTest.fnWaitTest( 
+		"No row striping",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"asStripClasses": []
+			} );
+		},
+		function () {
+			if ( typeof $('#example tbody tr:eq(1)')[0] == 'undefined' )
+			{
+				/* Use the 'wait for' to allow this to become true */
+				return false;
+			}
+			return $('#example tbody tr:eq(0)')[0].className == "" &&
+			       $('#example tbody tr:eq(1)')[0].className == "" &&
+			       $('#example tbody tr:eq(2)')[0].className == "" &&
+			       $('#example tbody tr:eq(3)')[0].className == "";
+		}
+	);
+	
+	/* Custom striping */
+	oTest.fnWaitTest( 
+		"Custom striping [2]",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"asStripClasses": [ 'test1', 'test2' ]
+			} );
+		},
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('test1') &&
+			       $('#example tbody tr:eq(1)').hasClass('test2') &&
+			       $('#example tbody tr:eq(2)').hasClass('test1') &&
+			       $('#example tbody tr:eq(3)').hasClass('test2');
+		}
+	);
+	
+	
+	/* long array of striping */
+	oTest.fnWaitTest( 
+		"Custom striping [4]",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"asStripClasses": [ 'test1', 'test2', 'test3', 'test4' ]
+			} );
+		},
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('test1') &&
+			       $('#example tbody tr:eq(1)').hasClass('test2') &&
+			       $('#example tbody tr:eq(2)').hasClass('test3') &&
+			       $('#example tbody tr:eq(3)').hasClass('test4');
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Custom striping is restarted on second page [2]",
+		function () { $('#example_next').click(); },
+		function () {
+			return $('#example tbody tr:eq(0)').hasClass('test1') &&
+			       $('#example tbody tr:eq(1)').hasClass('test2') &&
+			       $('#example tbody tr:eq(2)').hasClass('test3') &&
+			       $('#example tbody tr:eq(3)').hasClass('test4');
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bAutoWidth.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bAutoWidth.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bAutoWidth.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,145 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bAutoWidth" );
+
+/* It's actually a little tricky to test this. We can't test absolute numbers because
+ * different browsers and different platforms will render the width of the columns slightly
+ * differently. However, we certainly can test the principle of what should happen (column 
+ * width doesn't change over pages)
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Auto width is enabled by default",
+		null,
+		function () { return oSettings.oFeatures.bAutoWidth; }
+	);
+	
+	oTest.fnWaitTest( 
+		"First column has a width assigned to it",
+		null,
+		function () { return $('#example thead th:eq(0)').attr('style').match(/width/i); }
+	);
+	
+	/*
+	This would seem like a better test - but there appear to be difficulties with tables
+	which are bigger (calculated) than there is actually room for. I suspect this is actually
+	a bug in datatables
+	oTest.fnWaitTest( 
+		"Check column widths on first page match second page",
+		null,
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			$('#example_next').click();
+			var b0 = anThs[0].offsetWidth;
+			var b1 = anThs[1].offsetWidth;
+			var b2 = anThs[2].offsetWidth;
+			var b3 = anThs[3].offsetWidth;
+			var b4 = anThs[4].offsetWidth;
+			console.log( a0, b0, a1, b1, a2, b2, a3, b3 );
+			if ( a0==b0 && a1==b1 && a2==b2 && a3==b3 )
+				return true;
+			else
+				return false;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check column widths on second page match thid page",
+		null,
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			$('#example_next').click();
+			var b0 = anThs[0].offsetWidth;
+			var b1 = anThs[1].offsetWidth;
+			var b2 = anThs[2].offsetWidth;
+			var b3 = anThs[3].offsetWidth;
+			var b4 = anThs[4].offsetWidth;
+			if ( a0==b0 && a1==b1 && a2==b2 && a3==b3 )
+				return true;
+			else
+				return false;
+		}
+	);
+	*/
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Auto width can be disabled",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bAutoWidth": false
+			} );
+	 		oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bAutoWidth == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"First column does not have a width assigned to it",
+		null,
+		function () { return $('#example thead th:eq(0)').attr('style') == null; }
+	);
+	
+	/*
+	oTest.fnWaitTest( 
+		"Check column widths on first page do not match second page",
+		null,
+		function () {
+			var anThs = $('#example thead th');
+			var a0 = anThs[0].offsetWidth;
+			var a1 = anThs[1].offsetWidth;
+			var a2 = anThs[2].offsetWidth;
+			var a3 = anThs[3].offsetWidth;
+			var a4 = anThs[4].offsetWidth;
+			$('#example_next').click();
+			var b0 = anThs[0].offsetWidth;
+			var b1 = anThs[1].offsetWidth;
+			var b2 = anThs[2].offsetWidth;
+			var b3 = anThs[3].offsetWidth;
+			var b4 = anThs[4].offsetWidth;
+			if ( a0==b0 && a1==b1 && a2==b2 && a3==b3 )
+				return false;
+			else
+				return true;
+		}
+	);
+	*/
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Auto width enabled override",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bAutoWidth": true
+			} );
+	 		oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bAutoWidth; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bFilter.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bFilter.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bFilter.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,47 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bFilter" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Filtering div exists by default",
+		null,
+		function () { return document.getElementById('example_filter') != null; }
+	);
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Fltering can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bFilter": false
+			} );
+		},
+		function () { return document.getElementById('example_filter') == null; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Filtering enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bFilter": true
+			} );
+		},
+		function () { return document.getElementById('example_filter') != null; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bInfo.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bInfo.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bInfo.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,47 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bInfo" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Info div exists by default",
+		null,
+		function () { return document.getElementById('example_info') != null; }
+	);
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Info can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bInfo": false
+			} );
+		},
+		function () { return document.getElementById('example_info') == null; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Info enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bInfo": true
+			} );
+		},
+		function () { return document.getElementById('example_info') != null; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bLengthChange.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bLengthChange.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bLengthChange.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,78 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bLengthChange" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Length div exists by default",
+		null,
+		function () { return document.getElementById('example_length') != null; }
+	);
+	
+	oTest.fnWaitTest(
+		"Four default options",
+		null,
+		function () { return $("select[name=example_length] option").length == 4; }
+	);
+	
+	oTest.fnWaitTest(
+		"Default options",
+		null,
+		function () {
+			var opts = $("select[name='example_length'] option");
+			return opts[0].getAttribute('value') == 10 && opts[1].getAttribute('value') == 25 &&
+				opts[2].getAttribute('value') == 50 && opts[3].getAttribute('value') == 100;
+		}
+	);
+	
+	oTest.fnWaitTest(
+		"Info takes length into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Change length can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bLengthChange": false
+			} );
+		},
+		function () { return document.getElementById('example_length') == null; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information takes length disabled into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Length change enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bLengthChange": true
+			} );
+		},
+		function () { return document.getElementById('example_length') != null; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bPaginate.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bPaginate.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bPaginate.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,62 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bPaginate" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Pagiantion div exists by default",
+		null,
+		function () { return document.getElementById('example_paginate') != null; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information div takes paging into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 10 of 57 entries"; }
+	);
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Pagiantion can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bPaginate": false
+			} );
+		},
+		function () { return document.getElementById('example_paginate') == null; }
+	);
+	
+	oTest.fnWaitTest(
+		"Information div takes paging disabled into account",
+		null,
+		function () { return document.getElementById('example_info').innerHTML == 
+			"Showing 1 to 57 of 57 entries"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Pagiantion enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bPaginate": true
+			} );
+		},
+		function () { return document.getElementById('example_paginate') != null; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bProcessing.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bProcessing.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bProcessing.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,106 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bProcessing" );
+
+/* It's actually a bit hard to set this one due to the fact that it will only be shown
+ * when DataTables is doing some kind of processing. The server-side processing is a bit
+ * better to test this than here - so we just the interal functions to enable it and check
+ * that it is available
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Processing is off by default",
+		null,
+		function () { return oSettings.oFeatures.bProcessing == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div is not in the DOM",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div cannot be shown",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div cannot be hidden",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, false ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Processing can be enabled",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bProcessing": true
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bProcessing == true; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div is in the DOM",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div is hidden by default",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing').style.visibility = "hidden"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div can be shown",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing').style.visibility = "visible"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div can be hidden",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, false ); },
+		function () { return document.getElementById('example_processing').style.visibility = "hidden"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Processing disabled override",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bProcessing": false
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oFeatures.bProcessing == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Processing div is not in the DOM",
+		function () { oTable.oApi._fnProcessingDisplay( oSettings, true ); },
+		function () { return document.getElementById('example_processing') == null; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bServerSide.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bServerSide.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bServerSide.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,21 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bServerSide" );
+
+/* All the other scripts blast the ssp processing */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Server side can be set to on",
+		null,
+		function () { return oSettings.oFeatures.bServerSide == true; }
+	);
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bSort.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bSort.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bSort.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,102 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bSort" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Sorting is on by default",
+		null,
+		function () { return $('#example tbody td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting Asc by default class applied",
+		null,
+		function () { return $('#example thead th:eq(0)').hasClass("sorting_asc"); }
+	);
+	
+	oTest.fnWaitTest(
+		"Click on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "All others"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting class removed from first column",
+		null,
+		function () { return $('#example thead th:eq(0)').hasClass("sorting_asc") != true; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting asc class applied to second column",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_asc"); }
+	);
+	
+	oTest.fnWaitTest(
+		"Reverse on second column",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(1)').html() == "Seamonkey 1.1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting acs class removed from second column",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_asc") != true; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting desc class applied to second column",
+		null,
+		function () { return $('#example thead th:eq(1)').hasClass("sorting_desc"); }
+	);
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Pagiantion can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bSort": false
+			} );
+		},
+		function () { return $('#example tbody td:eq(3)').html() == "4"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Click on second column has no effect",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "4"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Reverse on second column has no effect",
+		function () { $('#example thead th:eq(1)').click(); },
+		function () { return $('#example tbody td:eq(3)').html() == "4"; }
+	);
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Sorting enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bSort": true
+			} );
+		},
+		function () { return $('#example tbody td:eq(1)').html() == "Firefox 1.0"; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bSortClasses.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bSortClasses.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/bSortClasses.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,135 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "bSortClasses" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Sorting classes are applied by default",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting classes are applied to all required cells",
+		null,
+		function () { return $('#example tbody tr:eq(7) td:eq(0)').hasClass('sorting_1'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting classes are not applied to non-sorting columns",
+		null,
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_1') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting multi-column - add column 1",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2');
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting multi-column - add column 2",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(2)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3');
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting multi-column - add column 3",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(3)')[0], { 'shift': true } );
+		},
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3') &&
+						 $('#example tbody tr:eq(0) td:eq(3)').hasClass('sorting_3');
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Remove sorting classes on single column sort",
+		function () { 
+			$('#example thead th:eq(4)').click();
+		},
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') == false &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3') == false &&
+						 $('#example tbody tr:eq(0) td:eq(3)').hasClass('sorting_3') == false;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting class 1 was added",
+		null,
+		function () { return $('#example tbody tr:eq(1) td:eq(4)').hasClass('sorting_1'); }
+	);
+	
+	
+	/* Check can disable */
+	oTest.fnWaitTest( 
+		"Sorting classes can be disabled",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bSortClasses": false
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting classes disabled - add column 1 - no effect",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(1)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') == false;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Sorting classes disabled - add column 2 - no effect",
+		function () { 
+			oDispacher.click( $('#example thead th:eq(2)')[0], { 'shift': true } ); },
+		function () {
+			return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1') == false &&
+						 $('#example tbody tr:eq(0) td:eq(1)').hasClass('sorting_2') == false &&
+						 $('#example tbody tr:eq(0) td:eq(2)').hasClass('sorting_3') == false;
+		}
+	);
+	
+	
+	/* Enable makes no difference */
+	oTest.fnWaitTest( 
+		"Sorting classes enabled override",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bSortClasses": true
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').hasClass('sorting_1'); }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnDrawCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnDrawCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnDrawCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,89 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "fnDrawCallback" );
+
+/* Fairly boring function compared to the others! */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnWaitTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnDrawCallback == null; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"One argument passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnDrawCallback": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"That one argument is the settings object",
+		function () {
+			oSession.fnRestore();
+			
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnDrawCallback": function ( oSettings ) {
+					mPass = oSettings;
+				}
+			} );
+		},
+		function () { return oTable.fnSettings() == mPass; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback called once on first draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnDrawCallback": function ( ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback called once on each draw there after as well",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return mPass > 1; }
+	);
+	
+	
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnHeaderCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnHeaderCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnHeaderCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,191 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "fnHeaderCallback" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnWaitTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnHeaderCallback == null; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Five arguments passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnHeaderCallback": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 5; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback called once per draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback called on paging (i.e. another draw)",
+		function () { $('#example_next').click(); },
+		function () { return mPass == 2; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback allows us to alter row information",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					nHead.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records";
+				}
+			} );
+		},
+		function () { return $('#example thead th:eq(0)').html() == "Displaying 10 records"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"iStart correct on first page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iStart != 0 )
+					{
+						mPass = false;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"iStart correct on second page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iStart == 0 )
+					{
+						mPass = true;
+					}
+				},
+				"fnInitComplete": function () {
+					$('#example_next').click();
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"iEnd correct on second page",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( iEnd == 10 )
+					{
+						mPass = true;
+					}
+				},
+				"fnInitComplete": function () {
+					$('#example_next').click();
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"aiDisplay length is full data when not filtered",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aiDisplay.length == 10 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnWaitTest( 
+		"aiDisplay length is 9 when filtering on 'Mozilla'",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = false;
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnHeaderCallback": function ( nHead, aasData, iStart, iEnd, aiDisplay ) {
+					if ( aiDisplay.length == 9 )
+					{
+						mPass = true;
+					}
+				}
+			} );
+			oTable.fnFilter( "Mozilla" );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnInitComplete.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnInitComplete.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnInitComplete.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,87 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "fnInitComplete" );
+
+/* Fairly boring function compared to the others! */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnWaitTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnInitComplete == null; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"One argument passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnInitComplete": function ( ) {
+					mPass = arguments.length;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"That one argument is the settings object",
+		function () {
+			oSession.fnRestore();
+			
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnInitComplete": function ( oSettings ) {
+					mPass = oSettings;
+				}
+			} );
+		},
+		function () { return oTable.fnSettings() == mPass; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"fnInitComplete called once on first draw",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnInitComplete": function ( ) {
+					mPass++;
+				}
+			} );
+		},
+		function () { return mPass == 1; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnInitComplete never called there after",
+		function () {
+			$('#example_next').click();
+			$('#example_next').click();
+			$('#example_next').click();
+		},
+		function () { return mPass == 1; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnRowCallback.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnRowCallback.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnRowCallback.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,118 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "fnRowCallback" );
+
+/* Note - fnRowCallback MUST return the first arguments (modified or not) */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnWaitTest( 
+		"Default should be null",
+		null,
+		function () { return oSettings.fnRowCallback == null; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Four arguments passed",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = -1;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnRowCallback": function ( nTr ) {
+					mPass = arguments.length;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass == 4; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback called once for each drawn row",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = 0;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					mPass++;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass == 10; }
+	);
+	
+	oTest.fnWaitTest( 
+		"fnRowCallback allows us to alter row information",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					$(nTr).addClass('unit_test');
+					return nTr;
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(1)').hasClass('unit_test'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Data array has length matching columns",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					if ( asData.length != 5 )
+						mPass = false;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Data array has length matching columns",
+		function () {
+			oSession.fnRestore();
+			
+			mPass = true;
+			var iCount = 0;
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"fnRowCallback": function ( nTr, asData, iDrawIndex, iDataIndex ) {
+					if ( iCount != iDrawIndex )
+						mPass = false;
+					iCount++;
+					return nTr;
+				}
+			} );
+		},
+		function () { return mPass; }
+	);
+	
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnServerData.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnServerData.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/fnServerData.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,23 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "fnServerData" );
+
+/* Not testing anything beyond the default here. SSP will do that... */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	var mPass;
+	
+	oTest.fnWaitTest( 
+		"Default should be $.getJSON",
+		null,
+		function () { return oSettings.fnServerData == $.getJSON; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/iDisplayLength.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/iDisplayLength.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/iDisplayLength.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,85 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "iDisplayLength" );
+
+$(document).ready( function () {
+	/* Check the default */
+	$('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	
+	oTest.fnWaitTest( 
+		"Default length is ten",
+		null,
+		function () { return $('#example tbody tr').length == 10; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Select menu shows 10",
+		null,
+		function () { return $('#example_length select').val() == 10; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Set initial length to 25",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"iDisplayLength": 25
+			} );
+		},
+		function () { return $('#example tbody tr').length == 25; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Select menu shows 25",
+		null,
+		function () { return $('#example_length select').val() == 25; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Set initial length to 100",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"iDisplayLength": 100
+			} );
+		},
+		function () { return $('#example tbody tr').length == 57; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Select menu shows 25",
+		null,
+		function () { return $('#example_length select').val() == 100; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Set initial length to 23 (unknown select menu length)",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"iDisplayLength": 23
+			} );
+		},
+		function () { return $('#example tbody tr').length == 23; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Select menu shows 10 (since 23 is unknow)",
+		null,
+		function () { return $('#example_length select').val() == 10; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.oPaginate.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.oPaginate.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.oPaginate.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,86 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.oPaginate" );
+
+/* Note that the paging language information only has relevence in full numbers */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+		"sPaginationType": "full_numbers"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"oLanguage.oPaginate defaults",
+		null,
+		function () {
+			var bReturn = 
+				oSettings.oLanguage.oPaginate.sFirst == "First" &&
+				oSettings.oLanguage.oPaginate.sPrevious == "Previous" &&
+				oSettings.oLanguage.oPaginate.sNext == "Next" &&
+				oSettings.oLanguage.oPaginate.sLast == "Last";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"oLanguage.oPaginate defaults are in the DOM",
+		null,
+		function () {
+			var bReturn = 
+				$('#example_paginate .first').html() == "First" &&
+				$('#example_paginate .previous').html() == "Previous" &&
+				$('#example_paginate .next').html() == "Next" &&
+				$('#example_paginate .last').html() == "Last";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"oLanguage.oPaginate can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"sPaginationType": "full_numbers",
+				"oLanguage": {
+					"oPaginate": {
+						"sFirst":    "unit1",
+						"sPrevious": "test2",
+						"sNext":     "unit3",
+						"sLast":     "test4"
+					}
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var bReturn = 
+				oSettings.oLanguage.oPaginate.sFirst == "unit1" &&
+				oSettings.oLanguage.oPaginate.sPrevious == "test2" &&
+				oSettings.oLanguage.oPaginate.sNext == "unit3" &&
+				oSettings.oLanguage.oPaginate.sLast == "test4";
+			return bReturn;
+		}
+	);
+	
+	oTest.fnTest( 
+		"oLanguage.oPaginate definitions are in the DOM",
+		null,
+		function () {
+			var bReturn = 
+				$('#example_paginate .first').html() == "unit1" &&
+				$('#example_paginate .previous').html() == "test2" &&
+				$('#example_paginate .next').html() == "unit3" &&
+				$('#example_paginate .last').html() == "test4";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sInfo.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sInfo.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sInfo.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,124 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sInfo" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Info language is 'Showing _START_ to _END_ of _TOTAL_ entries' by default",
+		null,
+		function () { return oSettings.oLanguage.sInfo == "Showing _START_ to _END_ of _TOTAL_ entries"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Info language can be defined - without any macros",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sInfo": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sInfo == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language definition is in the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "unit test"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Info language can be defined - with macro _START_ only",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sInfo": "unit _START_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 1 test"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Info language can be defined - with macro _END_ only",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sInfo": "unit _END_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 10 test"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Info language can be defined - with macro _TOTAL_ only",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sInfo": "unit _END_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 57 test"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Info language can be defined - with macros _START_ and _END_",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sInfo": "unit _START_ _END_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 1 10 test"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Info language can be defined - with macros _START_, _END_ and _TOTAL_",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sInfo": "unit _START_ _END_ _TOTAL_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "unit 1 10 57 test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sInfoEmpty.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sInfoEmpty.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sInfoEmpty.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,82 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sInfoEmpty" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Info empty language is 'Showing 0 to 0 of 0 entries' by default",
+		function () { oTable.fnFilter("nothinghere"); },
+		function () { return oSettings.oLanguage.sInfoEmpty == "Showing 0 to 0 of 0 entries"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Info empty language default is in the DOM",
+		null,
+		function () {
+			var bReturn = document.getElementById('example_info').innerHTML.replace( 
+				' '+oSettings.oLanguage.sInfoFiltered.replace( '_MAX_', '57' ), "" ) ==
+					"Showing 0 to 0 of 0 entries";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Info empty language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sInfoEmpty": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+			oTable.fnFilter("nothinghere");
+		},
+		function () { return oSettings.oLanguage.sInfoEmpty == "unit test"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Info empty language default is in the DOM",
+		null,
+		function () {
+			var bReturn = document.getElementById('example_info').innerHTML.replace( 
+				' '+oSettings.oLanguage.sInfoFiltered.replace( '_MAX_', '57' ), "" ) ==
+					"unit test";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Macro's not replaced",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sInfoEmpty": "unit _START_ _END_ _TOTAL_ test"
+				}
+			} );
+			oTable.fnFilter("nothinghere");
+		},
+		function () {
+			var bReturn = document.getElementById('example_info').innerHTML.replace( 
+				' '+oSettings.oLanguage.sInfoFiltered.replace( '_MAX_', '57' ), "" ) ==
+					"unit _START_ _END_ _TOTAL_ test";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sInfoPostFix.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sInfoPostFix.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sInfoPostFix.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,82 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sInfoPostFix" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Info post fix language is '' (blank) by default",
+		null,
+		function () { return oSettings.oLanguage.sInfoPostFix == ""; }
+	);
+	
+	oTest.fnTest( 
+		"Width no post fix, the basic info shows",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Info post fix language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sInfoPostFix": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sInfoPostFix == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info empty language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries unit test"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Macros have no effect in the post fix",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sInfoPostFix": "unit _START_ _END_ _TOTAL_ test"
+				}
+			} );
+		},
+		function () { return document.getElementById('example_info').innerHTML = "Showing 1 to 10 of 57 entries unit _START_ _END_ _TOTAL_ test"; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Post fix is applied after fintering info",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sInfoPostFix": "unit test"
+				}
+			} );
+			oTable.fnFilter("nothinghere");
+		},
+		function () { return document.getElementById('example_info').innerHTML = "Showing 0 to 0 of 0 entries unit (filtered from 57 total entries) test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sLengthMenu.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sLengthMenu.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sLengthMenu.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,110 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sLengthMenu" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Menu language is 'Show _MENU_ entries' by default",
+		null,
+		function () { return oSettings.oLanguage.sLengthMenu == "Show _MENU_ entries"; }
+	);
+	
+	oTest.fnTest(
+		"_MENU_ macro is replaced by select menu in DOM",
+		null,
+		function () { return $('select', oSettings.anFeatures.l).length == 1 }
+	);
+	
+	oTest.fnTest(
+		"Default is put into DOM",
+		null,
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			var bReturn =
+				anChildren[0].nodeValue == "Show " &&
+				anChildren[2].nodeValue == " entries";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Menu length language can be defined - no _MENU_ macro",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sLengthMenu": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sLengthMenu == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Menu length language definition is in the DOM",
+		null,
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			return anChildren[0].nodeValue == "unit test";
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Menu length language can be defined - with _MENU_ macro",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sLengthMenu": "unit _MENU_ test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			var bReturn =
+				anChildren[0].nodeValue == "unit " &&
+				anChildren[2].nodeValue == " test";
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Only the _MENU_ macro",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sLengthMenu": "_MENU_"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var anChildren = oSettings.anFeatures.l.childNodes;
+			var bReturn =
+				anChildren.length == 1 &&
+				$('select', oSettings.anFeatures.l).length == 1;
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sProcessing.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sProcessing.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sProcessing.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,51 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sProcessing" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+		"bProcessing": true
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Processing language is 'Processing...' by default",
+		null,
+		function () { return oSettings.oLanguage.sProcessing == "Processing..."; }
+	);
+	
+	oTest.fnTest( 
+		"Processing language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_processing').innerHTML = "Processing..."; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Processing language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"bProcessing": true,
+				"oLanguage": {
+					"sProcessing": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sProcessing == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Processing language definition is in the DOM",
+		null,
+		function () { return document.getElementById('example_processing').innerHTML = "unit test"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sSearch.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sSearch.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sSearch.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,68 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sSearch" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Search language is 'Search:' by default",
+		null,
+		function () { return oSettings.oLanguage.sSearch == "Search:"; }
+	);
+	
+	oTest.fnTest( 
+		"Search language default is in the DOM",
+		null,
+		function () { return document.getElementById('example_filter').childNodes[0].nodeValue
+		 	== "Search: "; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Search language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sSearch": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sSearch == "unit test"; }
+	);
+	
+	oTest.fnTest( 
+		"Info language definition is in the DOM",
+		null,
+		function () { return document.getElementById('example_filter').childNodes[0].nodeValue
+		 	== "unit test "; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Blank search has no space (separator) inserted",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sSearch": ""
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return document.getElementById('example_filter').childNodes.length == 1; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sUrl.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sUrl.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sUrl.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,64 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sUrl" );
+
+/* Note that we only test the internal storage of language information pulled form a file here
+ * as the other language tests will check it goes into the DOM correctly
+ */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnTest( 
+		"sUrl is blank by default",
+		null,
+		function () { return oSettings.oLanguage.sUrl == ""; }
+	);
+	
+	
+	oTest.fnWaitTest( 
+		"Loading of German file loads language information",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sUrl": "../../../examples/examples_support/de_DE.txt"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			var bReturn = 
+				oSettings.oLanguage.sProcessing == "Bitte warten..." &&
+				oSettings.oLanguage.sLengthMenu == "_MENU_ Einträge anzeigen" &&
+				oSettings.oLanguage.sZeroRecords == "Keine Einträge vorhanden." &&
+				oSettings.oLanguage.sInfo == "_START_ bis _END_ von _TOTAL_ Einträgen" &&
+				oSettings.oLanguage.sInfoEmpty == "0 bis 0 von 0 Einträgen" &&
+				oSettings.oLanguage.sInfoFiltered == "(gefiltert von _MAX_  Einträgen)" &&
+				oSettings.oLanguage.sInfoPostFix == "" &&
+				oSettings.oLanguage.sSearch == "Suchen" &&
+				oSettings.oLanguage.oPaginate.sFirst == "Erster" &&
+				oSettings.oLanguage.oPaginate.sPrevious == "Zurück" &&
+				oSettings.oLanguage.oPaginate.sNext == "Nächster" &&
+				oSettings.oLanguage.oPaginate.sLast == "Letzter";
+				
+			return bReturn;
+		}
+	);
+	
+	/* One DOM check just to ensure that they go into the DOM */
+	oTest.fnTest(
+		"Loaded language goes into the DOM",
+		null,
+		function () { return document.getElementById('example_info').innerHTML = "1 bis 10 von 57 Einträgen"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sZeroRecords.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sZeroRecords.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oLanguage.sZeroRecords.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,58 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oLanguage.sZeroRecords" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Zero records language is 'No matching records found' by default",
+		null,
+		function () { return oSettings.oLanguage.sZeroRecords == "No matching records found"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Text is shown when empty table (after filtering)",
+		function () { oTable.fnFilter('nothinghere'); },
+		function () {
+			if ( $('#example tbody tr td').length == 0 )
+				return false;
+			return $('#example tbody tr td')[0].innerHTML == "No matching records found";
+		}
+	);
+	
+	
+	
+	oTest.fnWaitTest( 
+		"Zero records language can be defined",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oLanguage": {
+					"sZeroRecords": "unit test"
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.oLanguage.sZeroRecords == "unit test"; }
+	);
+	
+	oTest.fnWaitTest(
+		"Text is shown when empty table (after filtering)",
+		function () { oTable.fnFilter('nothinghere2'); },
+		function () {
+			if ( $('#example tbody tr td').length == 0 )
+				return false;
+			return $('#example tbody tr td')[0].innerHTML == "unit test"
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oSearch.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oSearch.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/oSearch.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,100 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "oSearch" );
+
+/* Note with my server-side scripts the regex option has no effect - this just runs that down */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Default values should be blank",
+		null,
+		function () {
+			var bReturn = oSettings.oPreviousSearch.sSearch == "" && 
+			              oSettings.oPreviousSearch.bEscapeRegex;
+			return bReturn;
+		}
+	);
+	
+	/* This test might be considered iffy since the full object isn't given, but it's reasonable to
+	 * expect DataTables to cope with this. It should just assumine regex false
+	 */
+	oTest.fnWaitTest( 
+		"Search term only in object",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oSearch": {
+					"sSearch": "Mozilla"
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(3)').html() == "1"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"New search will kill old one",
+		function () {
+			oTable.fnFilter("Opera");
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Opera 7.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Search plain text term and escape regex true",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oSearch": {
+					"sSearch": "DS",
+					"bEscapeRegex": true
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Nintendo DS browser"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Search plain text term and escape regex false",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oSearch": {
+					"sSearch": "Opera",
+					"bEscapeRegex": false
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(1)').html() == "Opera 7.0"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Search regex text term and escape regex true",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"oSearch": {
+					"sSearch": "1.*",
+					"bEscapeRegex": true
+				}
+			} );
+		},
+		function () { return $('#example tbody tr:eq(0) td:eq(0)').html() == "No matching records found"; }
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/sAjaxSource.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/sAjaxSource.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/sAjaxSource.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,23 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "sAjaxSource" );
+
+/* Sanitfy check really - all the other tests blast this */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Server side is off by default",
+		null,
+		function () { 
+			return oSettings.sAjaxSource == "../../../examples/examples_support/server_processing.php";
+		}
+	);
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/sDom.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/sDom.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/sDom.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,269 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "sDom" );
+
+/* This is going to be brutal on the browser! There is a lot that can be tested here... */
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Default DOM varaible",
+		null,
+		function () { return oSettings.sDomPositioning == "lfrtip"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Default DOM in document",
+		null,
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nTable &&
+				nNodes[4] == nInfo &&
+				nNodes[5] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check example 1 in code propagates",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"sDom": '<"wrapper"flipt>'
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () { return oSettings.sDomPositioning == '<"wrapper"flipt>'; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Check example 1 in DOM",
+		null,
+		function () {
+			var jqNodes = $('#demo div, #demo table');
+			var nNodes = [];
+			
+			/* Strip the paging nodes */
+			for ( var i=0, iLen=jqNodes.length ; i<iLen ; i++ )
+			{
+				if ( jqNodes[i].getAttribute('id') != "example_previous" &&
+				     jqNodes[i].getAttribute('id') != "example_next" )
+				{
+					nNodes.push( jqNodes[i] );
+				}
+			}
+			
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			var nCustomWrapper = $('div.wrapper')[0];
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nCustomWrapper &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nLength &&
+				nNodes[4] == nInfo &&
+				nNodes[5] == nPaging &&
+				nNodes[6] == nTable;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check example 2 in DOM",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"sDom": '<lf<t>ip>'
+			} );
+		},
+		function () {
+			var jqNodes = $('#demo div, #demo table');
+			var nNodes = [];
+			var nCustomWrappers = []
+			
+			/* Strip the paging nodes */
+			for ( var i=0, iLen=jqNodes.length ; i<iLen ; i++ )
+			{
+				if ( jqNodes[i].getAttribute('id') != "example_previous" &&
+				     jqNodes[i].getAttribute('id') != "example_next" )
+				{
+					nNodes.push( jqNodes[i] );
+				}
+				
+				/* Only the two custom divs don't have class names */
+				if ( !jqNodes[i].getAttribute('class') )
+				{
+					nCustomWrappers.push( jqNodes[i] );
+				}
+			}
+			
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nCustomWrappers[0] &&
+				nNodes[2] == nLength &&
+				nNodes[3] == nFilter &&
+				nNodes[4] == nCustomWrappers[1] &&
+				nNodes[5] == nTable &&
+				nNodes[6] == nInfo &&
+				nNodes[7] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check no length element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"sDom": 'frtip'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				null == nLength &&
+				nNodes[1] == nFilter &&
+				nNodes[2] == nTable &&
+				nNodes[3] == nInfo &&
+				nNodes[4] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check no filter element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"sDom": 'lrtip'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				null == nFilter &&
+				nNodes[2] == nTable &&
+				nNodes[3] == nInfo &&
+				nNodes[4] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	/* Note we don't test for no table as this is not supported (and it would be fairly daft! */
+	
+	oTest.fnWaitTest( 
+		"Check no info element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"sDom": 'lfrtp'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nTable &&
+				null == nInfo &&
+				nNodes[4] == nPaging;
+			return bReturn;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check no paging element",
+		function () {
+			oSession.fnRestore();
+			$('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"sDom": 'lfrti'
+			} );
+		},
+		function () {
+			var nNodes = $('#demo div, #demo table');
+			var nWrapper = document.getElementById('example_wrapper');
+			var nLength = document.getElementById('example_length');
+			var nFilter = document.getElementById('example_filter');
+			var nInfo = document.getElementById('example_info');
+			var nPaging = document.getElementById('example_paginate');
+			var nTable = document.getElementById('example');
+			
+			var bReturn = 
+				nNodes[0] == nWrapper &&
+				nNodes[1] == nLength &&
+				nNodes[2] == nFilter &&
+				nNodes[3] == nTable &&
+				nNodes[4] == nInfo &&
+				null == nPaging;
+			return bReturn;
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/sPaginationType.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/sPaginationType.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/tests_onhold/4_server-side/sPaginationType.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,138 @@
+// DATA_TEMPLATE: empty_table
+oTest.fnStart( "sPaginationType" );
+
+$(document).ready( function () {
+	/* Check the default */
+	var oTable = $('#example').dataTable( {
+		"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php"
+	} );
+	var oSettings = oTable.fnSettings();
+	
+	oTest.fnWaitTest( 
+		"Check two button paging is the default",
+		null,
+		function () { return oSettings.sPaginationType == "two_button"; }
+	);
+	
+	oTest.fnWaitTest( 
+		"Check class is applied",
+		null,
+		function () { return $('#example_paginate').hasClass('paging_two_button'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Two div elements are in the wrapper",
+		null,
+		function () { return $('#example_paginate div').length == 2; }
+	);
+	
+	oTest.fnWaitTest( 
+		"We have the previous button",
+		null,
+		function () { return document.getElementById('example_previous'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"We have the next button",
+		null,
+		function () { return document.getElementById('example_next'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Previous button is disabled",
+		null,
+		function () { return $('#example_previous').hasClass('paginate_disabled_previous'); }
+	);
+	
+	oTest.fnWaitTest( 
+		"Next button is enabled",
+		null,
+		function () { return $('#example_next').hasClass('paginate_enabled_next'); }
+	);
+	
+	/* Don't test paging - that's done by the zero config test script. */
+	
+	
+	/* Two buttons paging */
+	var bComplete = false;
+	oTest.fnWaitTest( 
+		"Can enabled full numbers paging",
+		function () {
+			oSession.fnRestore();
+			oTable = $('#example').dataTable( {
+				"bServerSide": true,
+		"sAjaxSource": "../../../examples/examples_support/server_processing.php",
+				"sPaginationType": "full_numbers",
+				"fnInitComplete": function () {
+					setTimeout( function () {
+						bComplete = true;
+					}, 500 );
+				}
+			} );
+			oSettings = oTable.fnSettings();
+		},
+		function () {
+			if ( bComplete )
+				return oSettings.sPaginationType == "full_numbers";
+			else
+				return false;
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Check full numbers class is applied",
+		null,
+		function () { return $('#example_paginate').hasClass('paging_full_numbers'); }
+	);
+	
+	
+	var nFirst, nPrevious, nNext, nLast;
+	oTest.fnWaitTest( 
+		"Jump to last page",
+		function () {
+			nFirst = $('div.dataTables_paginate span.first');
+			nPrevious = $('div.dataTables_paginate span.previous');
+			nNext = $('div.dataTables_paginate span.next');
+			nLast = $('div.dataTables_paginate span.last');
+			nLast.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 51 to 57 of 57 entries";
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Go to two pages previous",
+		function () {
+			nPrevious.click();
+			nPrevious.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 31 to 40 of 57 entries";
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Next (second last) page",
+		function () {
+			nNext.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 41 to 50 of 57 entries";
+		}
+	);
+	
+	oTest.fnWaitTest( 
+		"Jump to first page",
+		function () {
+			nFirst.click();
+		},
+		function () {
+			return document.getElementById('example_info').innerHTML == "Showing 1 to 10 of 57 entries";
+		}
+	);
+	
+	
+	oTest.fnComplete();
+} );
\ No newline at end of file

Added: trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/unit_test.js
===================================================================
--- trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/unit_test.js	                        (rev 0)
+++ trunk/mapbender/http/extensions/dataTables-1.5/media/unit_testing/unit_test.js	2009-11-03 09:52:24 UTC (rev 4900)
@@ -0,0 +1,385 @@
+/*
+ * File:        unit_test.js
+ * Version:     0.0.1
+ * CVS:         $Id$
+ * Description: Unit test framework
+ * Author:      Allan Jardine (www.sprymedia.co.uk)
+ * Created:     Sun Mar  8 22:02:49 GMT 2009
+ * Modified:    $Date$ by $Author$
+ * Language:    Javascript
+ * License:     GPL v2 or BSD 3 point style
+ * Project:     DataTables
+ * Contact:     allan.jardine at sprymedia.co.uk
+ * 
+ * Copyright 2009 Allan Jardine, all rights reserved.
+ *
+ * Description:
+ * This is a javascript library suitable for use as a unit testing framework. Employing a queuing
+ * mechanisim to take account of async events in javascript, this library will communicates with
+ * a controller frame (to report individual test status).
+ * 
+ */
+
+
+var oTest = {
+	/* Block further tests from occuring - might be end of tests or due to async wait */
+	bBlock: false,
+	
+	/* Number of times to try retesting for a blocking test */
+	iReTestLimit: 20,
+	
+	/* Amount of time to wait between trying for an async test */
+	iReTestDelay: 100,
+	
+	/* End tests - external control */
+	bEnd: false,
+	
+	/* Internal variables */
+	_aoQueue: [],
+	_iReTest: 0,
+	_bFinished: false,
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Recommened public functions
+	 */
+	
+	/*
+	 * Function: fnTest
+	 * Purpose:  Add a test to the queue
+	 * Returns:  -
+	 * Inputs:   string:sMessage - name of the test
+	 *           function:fnTest - function which will be evaludated to get the test result
+	 */
+	"fnTest": function ( sMessage, fnSetup, fnTest )
+	{
+		this._aoQueue.push( {
+			"sMessage": sMessage,
+			"fnSetup": fnSetup,
+			"fnTest": fnTest,
+			"bPoll": false
+		} );
+		this._fnNext();
+	},
+	
+	/*
+	 * Function: fnWaitTest
+	 * Purpose:  Add a test to the queue which has a re-test cycle
+	 * Returns:  -
+	 * Inputs:   string:sMessage - name of the test
+	 *           function:fnTest - function which will be evaludated to get the test result
+	 */
+	"fnWaitTest": function ( sMessage, fnSetup, fnTest )
+	{
+		this._aoQueue.push( {
+			"sMessage": sMessage,
+			"fnSetup": fnSetup,
+			"fnTest": fnTest,
+			"bPoll": true
+		} );
+		this._fnNext();
+	},
+	
+	/*
+	 * Function: fnStart
+	 * Purpose:  Indicate that this is a new unit and what it is testing (message to end user)
+	 * Returns:  -
+	 * Inputs:   string:sMessage - message to give to the user about this unit
+	 */
+	"fnStart": function ( sMessage )
+	{
+		window.parent.controller.fnStartMessage( sMessage );
+	},
+	
+	/*
+	 * Function: fnComplete
+	 * Purpose:  Tell the controller that we are all done here
+	 * Returns:  -
+	 * Inputs:   -
+	 */
+	"fnComplete": function ()
+	{
+		this._bFinished = true;
+		this._fnNext();
+	},
+	
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Internal functions
+	 */
+	
+	
+	"_fnReTest": function ( oTestInfo )
+	{
+		var bResult = oTestInfo.fnTest( );
+		if ( bResult )
+		{
+			/* Test passed on retry */
+			this._fnResult( true );
+			this._fnNext();
+		}
+		else
+		{
+			if ( this._iReTest < this.iReTestLimit )
+			{
+				this._iReTest++;
+				setTimeout( function() {
+					oTest._fnReTest( oTestInfo );
+				}, this.iReTestDelay );
+			}
+			else
+			{
+				this._fnResult( false );
+			}
+		}
+	},
+	
+	"_fnNext": function ()
+	{
+		if ( this.bEnd )
+		{
+			return;
+		}
+		
+		if ( !this.bBlock && this._aoQueue.length > 0 )
+		{
+			var oNextTest = this._aoQueue.shift();
+			window.parent.controller.fnTestStart( oNextTest.sMessage );
+			this.bBlock = true;
+			
+			if ( typeof oNextTest.fnSetup == 'function' )
+			{
+				oNextTest.fnSetup( );
+			}
+			var bResult = oNextTest.fnTest( );
+			//bResult = false;
+			
+			if ( oNextTest.bPoll )
+			{
+				if ( bResult )
+				{
+					this._fnResult( true );
+					this._fnNext();
+				}
+				else
+				{
+					_iReTest = 0;
+					setTimeout( function() {
+						oTest._fnReTest( oNextTest );
+					}, this.iReTestDelay );
+				}
+			}
+			else
+			{
+				this._fnResult( bResult );
+				this._fnNext();
+			}
+		}
+		else if ( !this.bBlock && this._aoQueue.length == 0 && this._bFinished )
+		{
+			window.parent.controller.fnUnitComplete( );
+		}
+	},
+	
+	"_fnResult": function ( b )
+	{
+		window.parent.controller.fnTestResult( b );
+		this.bBlock = false;
+		if ( !b )
+		{
+			this.bEnd = true;
+		}
+	}
+};
+
+
+var oDispacher = {
+	"click": function ( nNode, oSpecial )
+	{
+		var evt = this.fnCreateEvent( 'click', nNode, oSpecial );
+		if ( nNode.dispatchEvent )
+			nNode.dispatchEvent(evt);
+		else
+			nNode.fireEvent('onclick', evt);
+	},
+	
+	"change": function ( nNode )
+	{
+		var evt = this.fnCreateEvent( 'change', nNode );
+		if ( nNode.dispatchEvent )
+		nNode.dispatchEvent(evt);
+		else
+			nNode.fireEvent('onchange', evt);
+	},
+	
+	
+	/*
+	 * Function: fnCreateEvent
+	 * Purpose:  Create an event oject based on the type to trigger an event - x-platform
+	 * Returns:  event:evt
+	 * Inputs:   string:sType - type of event
+	 *           node:nTarget - target node of the event
+	 */
+	fnCreateEvent: function( sType, nTarget, oSpecial )
+	{
+		var evt = null;
+		var oTargetPos = this._fnGetPos( nTarget );
+		var sTypeGroup = this._fnEventTypeGroup( sType );
+		if ( typeof oSpecial == 'undefined' )
+		{
+			oSpecial = {};
+		}
+		
+		var ctrlKey = false;
+		var altKey = false;
+		var shiftKey = (typeof oSpecial.shift != 'undefined') ? oSpecial.shift : false;
+		var metaKey = false;
+		var button = false;
+		
+		if ( document.createEvent )
+		{
+			switch ( sTypeGroup )
+			{
+				case 'mouse':
+					evt = document.createEvent( "MouseEvents" );
+					evt.initMouseEvent( sType, true, true, window, 0, oTargetPos[0], oTargetPos[1], 
+						oTargetPos[0], oTargetPos[1], ctrlKey, altKey, shiftKey, 
+						metaKey, button, null );
+					break;
+				
+				case 'html':
+					evt = document.createEvent( "HTMLEvents" );
+					evt.initEvent( sType, true, true );
+					break;
+					
+				case 'ui':
+					evt = document.createEvent( "UIEvents" );
+					evt.initUIEvent( sType, true, true, window, 0 );
+					break;
+				
+				default:
+					break;
+			}
+		}
+		else if ( document.createEventObject )
+		{
+			switch ( sTypeGroup )
+			{
+				case 'mouse':
+					evt = document.createEventObject();
+					evt.screenX = oTargetPos[0];
+					evt.screenX = oTargetPos[1];
+					evt.clientX = oTargetPos[0];
+					evt.clientY = oTargetPos[1];
+					evt.ctrlKey = ctrlKey;
+					evt.altKey = altKey;
+					evt.shiftKey = shiftKey;
+					evt.metaKey = metaKey;
+					evt.button = button;
+					evt.relatedTarget = null;
+					break;
+				
+				case 'html':
+					/* fall through to basic event object */
+					
+				case 'ui':
+					evt = document.createEventObject();
+					break;
+				
+				default:
+					break;
+			}
+		}
+		
+		return evt;
+	},
+	
+	/* 
+	 * Function: DesignCore.fnGetPos
+	 * Purpose:  Get the position of an element on the page
+	 * Returns:  array[ 0-int:left, 1-int:top ]
+	 * Inputs:   node:obj - node to analyse
+	 */
+	_fnGetPos: function ( obj ) 
+	{
+		var curleft = 0;
+		var curtop = 0;
+		
+		if (obj.offsetParent) 
+		{
+			curleft = obj.offsetLeft;
+			curtop = obj.offsetTop;
+			while (obj = obj.offsetParent ) 
+			{
+				curleft += obj.offsetLeft;
+				curtop += obj.offsetTop;
+			}
+		}
+		return [curleft,curtop];
+	},
+	
+	
+	/*
+	 * Function: _fnEventTypeGroup
+	 * Purpose:  Group the event types as per w3c groupings
+	 * Returns:  -
+	 * Inputs:   string:sType
+	 */
+	_fnEventTypeGroup: function ( sType )
+	{
+		switch ( sType )
+		{
+			case 'click':
+			case 'dblclick':
+			case 'mousedown':
+			case 'mousemove':
+			case 'mouseout':
+			case 'mouseover':
+			case 'mouseup':
+				return 'mouse';
+			
+			case 'change':
+			case 'focus':
+			case 'blur':
+			case 'select':
+			case 'submit':
+				return 'html';
+				
+			case 'keydown':
+			case 'keypress':
+			case 'keyup':
+			case 'load':
+			case 'unload':
+				return 'ui';
+			
+			default:
+				return 'custom';
+		}
+	}
+}
+
+
+var oSession = {
+	nTable: null,
+	
+	fnCache: function ()
+	{
+		this.nTable = document.getElementById('demo').cloneNode(true);
+	},
+	
+	fnRestore: function ()
+	{
+		var nDemo = document.getElementById('demo');
+		nDemo.innerHTML = "";
+		for ( var i=0, iLen=this.nTable.childNodes.length ; i<iLen ; i++ )
+		{
+			nDemo.appendChild( this.nTable.childNodes[0] );
+		}
+		this.fnCache();
+	}
+}
+
+$(document).ready( function () {
+	oSession.fnCache();
+} );



More information about the Mapbender_commits mailing list